Skip to content

Intake early-exit taxonomy: let /rad-research refute a request before it becomes a plan #94

Description

@seanrreid

Context

Source: Cloudflare/Astro issue-triage post + withastro/triagebot-action.

/rad-research is a straight line: load the spec → confirm the read → ask clarifying questions → derive a slug → write the artifact → summarize. There is no step that can conclude the request should not be worked on. Every intake is presumed to be real, actionable work, so the cheapest possible refutation ("this is intended behavior", "there isn't enough here to act on") can only happen after the two most expensive steps: writing a plan and occupying the architect's approval gate.

Astro spends its cheapest states on refutation. Of their 11-label state machine, four exist purely to exit early:

  • triage: not actionable — not a bug report (terminal)
  • triage: needs reproduction — incomplete details (re-enterable)
  • triage: unable to reproduce — agent could not reproduce (re-enterable)
  • triage: skipped — environment/version unsupported (terminal)

And their four-phase skill (reproduce → diagnose → verify → fix) isolates verify — "how to distinguish bugs from intended behavior" — as its own subagent, for an explicitly stated reason: it

"prevents the frequent LLM bias toward forcing a solution when a bug might not actually exist."

That bias is not specific to triage. A planning agent handed a request will produce a plan; nothing in RAD's intake is structurally positioned to say "no plan is warranted here."

This also gives #92 the consumer it says is missing. #92 observes that the research artifact's Status: header has no consumer. A disposition vocabulary is exactly that consumer.

Proposal

Give the research artifact an enumerated Disposition: header written by /rad-research, and a deterministic downstream check that honors it.

Vocabulary (small, frozen, RAD-flavored — not a copy of Astro's triage labels):

Disposition Meaning Downstream
actionable a plan is warranted /rad-plan proceeds (today's only behavior)
not-actionable the described behavior is intended, already covered, or out of the project's scope /rad-plan refuses; artifact records the evidence
insufficient-context the request cannot be scoped without specific missing information /rad-plan refuses; artifact lists exactly what is missing
superseded an existing plan/feature already covers it /rad-plan refuses; artifact names the covering feature

/rad-research gains a refutation step before writing the artifact whose only job is to try to establish a non-actionable disposition — citing evidence from the codebase (a test pinning the behavior, a doc stating it, an existing plan). Absence of evidence yields actionable: the check is fail-open toward doing the work, because refusing real work is the worse error at intake.

The enforcement is a deterministic script (scripts/check-disposition.sh), not prose in the command file, so /rad-plan cannot be talked past it.

Hard constraints

  • Fail-open toward actionable. A missing, malformed, or absent Disposition: header means actionable — this is additive and must not break existing artifacts or block any workflow that runs today.
  • Non-actionable is a refusal to auto-proceed, never a lock. An explicit operator override (documented flag) always exists; RAD does not let an agent's judgment veto a human's intent. Overrides are recorded.
  • The refutation step must cite a concrete artifact (file:line, test name, existing plan path) for any non-actionable disposition. An uncited refusal is invalid and degrades to actionable.
  • No new gate. This sits upstream of Gate 1 and changes no approval authority.

Files in scope

  • .claude/commands/team/rad-research.md (refutation step + Disposition: in the artifact template)
  • scripts/check-disposition.sh + scripts/test-check-disposition.sh (new)
  • .claude/commands/team/rad-plan.md, .claude/commands/team/rad-adopt.md (consume the check)
  • docs/daily-workflow.md

Suggested wave structure

  • Wave 1 — Vocabulary + check script: Disposition: header, check-disposition.sh with the fail-open default and the override path. Validate: artifact with no header → exit 0 (actionable); unknown value → exit 0 with a warning, never a hard fail; non-actionable without a citation → treated as actionable; override flag → exit 0 and prints what was overridden.
  • Wave 2 — Research refutation step + plan-side consumption. Validate: a request already pinned by an existing test lands not-actionable with the test cited; a vague request lands insufficient-context listing the missing items; /rad-plan on a non-actionable artifact refuses with the citation and the override instruction; every existing artifact in .agents/research/ still plans cleanly.

Acceptance criteria

Related

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or requesttriage:backlogIndependent, one-plan-sized; pick up between arcs

    Projects

    No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions