You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
SpecForge's intake interview state machine (src/infra/specforge-conductor.ts, intake_interview stage) keeps reporting intake incomplete even after the operator has answered every question it asks. The agent then asks the next intake question, which is also already answered, and the loop continues. This turns urgent bugfixes into ceremony and effectively renders SpecForge un-skippable for time-sensitive work.
Repro (live, 2026-05-25)
Operator was triaging an urgent memory reranker bugfix (#418). SpecForge interview sequence:
Greenfield or brownfield? → brownfield ✓
Problem statement? → "Memory recall is finding exact identity-property answers, but reranking/answer selection can demote them below broader, less relevant identity or diagnostic memories." ✓
Repo/service that owns the reranker? → DEV ✓
Success test? → "What's my favorite color?" returns "mossy oak green" with the exact memory as top evidence ✓
Fix urgency? → today ✓ (operator also created urgent task 18711e62-5ea9-4771-ab4e-5b786b6a82df)
Out of scope? → operator said "no idea"; agent helpfully set the safe boundary: "reranking/answer selection only, not a broad memory-index rebuild" ✓
Operator asked: "OK does that get us out of SpecForge?"
Argent's response: "Not yet. SpecForge still says we're in intake_interview, not approved execution. It thinks these are still missing: problem statement, success criteria, constraints/deadline, scope, non-scope, and technical context. Annoyingly, we've said most of that conversationally, but SpecForge hasn't captured it cleanly."
Operator: "OMG. This is a BUG."
The agent then tried to escape via the family-dev handoff path; that hit a routing failure ("forge isn't allowed to spawn"); the agent fell back to a background subagent on the allowed default model; that subagent spawned a session key but did zero useful work and had to be cancelled; the agent then handed the fix off to a Claude Code instance entirely.
Root cause hypothesis
The intake_interview stage's "what's still missing" check is computing missing-field-set independently from the conversation messages — it's pattern-matching against the structured intake schema (problem statement, success criteria, etc.) but not extracting those fields from the agent's conversational captures. The fields exist in the dialog; the state machine just can't see them.
Possible failures:
No NL extraction step between the operator's free-text answers and the structured intake fields. The conductor expects fields to arrive in a structured payload (e.g. via a specforge.intake.update tool call) but the agent is summarizing answers in chat instead of dispatching that call.
Tool emission misalignment — agent has been instructed (or implicitly trained) to acknowledge intake captures conversationally instead of by calling the structured-update tool every turn.
Stage advance gate too strict — even with partial structured updates, the gate requires all 6 fields populated simultaneously rather than progressively unlocking on each completion.
src/infra/specforge-conductor.ts:282, 408, 426, 472 all reference the intake_interview stage; that's where the inspection should start.
Why this is a high-priority bug
It turns urgent bugfixes into ceremony — the exact opposite of what the operator wants from SpecForge
The operator's escape valve (handoff to background subagent → handoff to Claude) is high-friction and depends on the operator knowing the workflow
The agent is honest about the problem ("we've said most of that conversationally, but SpecForge hasn't captured it cleanly") but has no escape hatch other than "tell me to override"
Suggested next steps
Diagnostic first: add per-turn logging to the intake_interview stage so the operator can see which fields the state machine thinks are missing and what conversational content the conductor tried to extract them from
Add a force-advance escape hatch — specforge.override(stage) or specforge.dismiss() — that the operator can invoke directly so urgent bugfixes don't get blocked on state-machine completionism
Make conversational captures count: when the agent's text contains a recognizable answer (e.g., "the urgency is today"), the conductor should accept it as the intake field even without an explicit structured update
Tone-of-voice rule: if the operator says "this is a bug" mid-intake, dismiss the intake state and treat the conversation as a regular bug report
Filed as a follow-up to the memory reranker bug (#418) — that fix shipped via the Claude Code handoff path despite SpecForge, not through it.
Summary
SpecForge's intake interview state machine (
src/infra/specforge-conductor.ts,intake_interviewstage) keeps reporting intake incomplete even after the operator has answered every question it asks. The agent then asks the next intake question, which is also already answered, and the loop continues. This turns urgent bugfixes into ceremony and effectively renders SpecForge un-skippable for time-sensitive work.Repro (live, 2026-05-25)
Operator was triaging an urgent memory reranker bugfix (#418). SpecForge interview sequence:
18711e62-5ea9-4771-ab4e-5b786b6a82df)Operator asked: "OK does that get us out of SpecForge?"
Argent's response: "Not yet. SpecForge still says we're in intake_interview, not approved execution. It thinks these are still missing: problem statement, success criteria, constraints/deadline, scope, non-scope, and technical context. Annoyingly, we've said most of that conversationally, but SpecForge hasn't captured it cleanly."
Operator: "OMG. This is a BUG."
The agent then tried to escape via the family-dev handoff path; that hit a routing failure ("forge isn't allowed to spawn"); the agent fell back to a background subagent on the allowed default model; that subagent spawned a session key but did zero useful work and had to be cancelled; the agent then handed the fix off to a Claude Code instance entirely.
Root cause hypothesis
The
intake_interviewstage's "what's still missing" check is computing missing-field-set independently from the conversation messages — it's pattern-matching against the structured intake schema (problem statement, success criteria, etc.) but not extracting those fields from the agent's conversational captures. The fields exist in the dialog; the state machine just can't see them.Possible failures:
specforge.intake.updatetool call) but the agent is summarizing answers in chat instead of dispatching that call.src/infra/specforge-conductor.ts:282, 408, 426, 472all reference theintake_interviewstage; that's where the inspection should start.Why this is a high-priority bug
Suggested next steps
intake_interviewstage so the operator can see which fields the state machine thinks are missing and what conversational content the conductor tried to extract them fromspecforge.override(stage)orspecforge.dismiss()— that the operator can invoke directly so urgent bugfixes don't get blocked on state-machine completionismFiled as a follow-up to the memory reranker bug (#418) — that fix shipped via the Claude Code handoff path despite SpecForge, not through it.