Repository navigation
feat(aidd-orchestrator): add an interactive SDLC mode - #967
Merged
Merged
Conversation
It ran autonomously or not at all. A refactor kept the autonomy and dropped the rest, so a person who wanted to see the contract, the plan and the verdict before anything shipped had no way to ask. `interactive` beside the source now stops the run at each artifact that can still be corrected, and a refusal there is a finding routed back to the zone that owns it. `auto` stays the default and is unchanged. The pauses are the orchestrator's own behaviour, written once in its router: no called skill changes. The planning step already carried both branches and switches on what the router declares. Check gains one rule, because the flow could not reach a person at all when a strict checker never cleared: a finding that recurs after a pass acted on it stops being routed and becomes the user's to decide. The ship recipe committed and then asked for a request on a branch nothing had pushed. It passes the commit skill its push option now. Verified by eighty-five headless runs over sixty-four decision edges, then forty-four more measuring dispersion rather than presence. Twelve defects in the router's own paragraph were found and closed, five of them only by running it. What the runs could not settle is recorded beside the plan. Co-Authored-By: Claude Opus 5 <[email protected]> AIDD-Session-Id: bf713ca4-3c1b-491d-ac0a-4d4533330b5c
…ate becomes reachable Four defects the case battery surfaced in zones the interactive mode did not own. Each left the mode promising something the flow could not keep. Frame's spec and Check's review had no committer, so a request could open without the contract it was built from or the review that cleared it. Each zone now commits what it wrote before handing over. Whether an end to end journey was required rested on a file no zone reference points at, so a run that obeyed the reading rule skipped it. The project's testing memory decides, and nothing else does. `planning-ready` decided whether a spec is written, and therefore how often a person is consulted, with no test behind it. Three tests now hold it: the source names the artifact to change, states the observable outcome, and leaves open no decision that changes what is built. The request gate read `no actionable finding`, and a strict checker always had one, so two earlier runs looped four times each and never reached it. Once the review has cleared, only a finding that contradicts the contract reopens a zone; any other is carried onto the request as a note. A pass budget was rejected: the number would be arbitrary and indefensible. Eleven headless runs, one per claim and one per branch of each claim. The direct branch held on the same request that twenty earlier runs had settled there, so the third test is not stricter than the flow it describes. Co-Authored-By: Claude Opus 5 <[email protected]> AIDD-Session-Id: bf713ca4-3c1b-491d-ac0a-4d4533330b5c
The mode sentence names one condition instead of four, the stop rule moves next to the zone reading it, and the diagram carries each zone's pause so the flow and the prose cannot drift apart. The onboard tier note no longer names a skill from another plugin; it states the rule any autonomous skill follows. Co-Authored-By: Claude Opus 5 <[email protected]> AIDD-Session-Id: bf713ca4-3c1b-491d-ac0a-4d4533330b5c
…not judged The planning-ready test becomes its own sentence, so a zone can answer it instead of inferring it from a clause. The journey runs when the plan calls for one and never otherwise, which moves the decision to the artifact that can state it. Co-Authored-By: Claude Opus 5 <[email protected]> AIDD-Session-Id: bf713ca4-3c1b-491d-ac0a-4d4533330b5c
The two sentences governing a recurring finding both claimed it: a cosmetic finding a pass had already acted on was a non-blocking note under one and a blocking stop under the other. Three independent readers answered that the text did not decide. The reopening rule now runs first, and the recurrence rule speaks of a finding that would be routed a second time, so a note never reaches it. Four readers re-traced both paths on the corrected text and none answered undecidable. Co-Authored-By: Claude Opus 5 <[email protected]> AIDD-Session-Id: bf713ca4-3c1b-491d-ac0a-4d4533330b5c
A Codex run of the interactive flow answered two of its three gates with "approved, with corrections". The text had no reading for that: a correction is a finding against the artifact, so the letter of it sent a one-line fix back through the zone and presented the artifact again. The run advanced instead, which is the useful behaviour and not what the text said. Three readers traced the three answers a pause can get — approved, approved with corrections, refused — and none answered undecidable. The run itself, including the three gates exercised with a person at them, is recorded beside the batch. Co-Authored-By: Claude Opus 5 <[email protected]> AIDD-Session-Id: bf713ca4-3c1b-491d-ac0a-4d4533330b5c
The interactive gates had never been executed, only read: a headless run cannot answer them without inventing the approval the gate exists to collect. Two Codex runs close that, one per mode, on the same issue from the same commit. Both reached the same fix. The gates added no quality on it, and the person at the first one made it worse, so the comparison is recorded as measured rather than as the result the design expected. Co-Authored-By: Claude Opus 5 <[email protected]> AIDD-Session-Id: bf713ca4-3c1b-491d-ac0a-4d4533330b5c
#910 asks that documentation explain both modes and their default, and the review had stripped every mention. The description, the plugin table and the README row say autonomous or supervised, and the catalogs follow from the description. The word a request carries stays `interactive`, which the argument hint already names. The README row names it too, so the word a reader meets is the word they can type. Co-Authored-By: Claude Opus 5 <[email protected]> AIDD-Session-Id: bf713ca4-3c1b-491d-ac0a-4d4533330b5c
`## Behavior` had grown from 84 words to 313, almost all of it the mode: nine sentences, each one a run that failed without it. Compressing them would have traded a proven case for a shorter page — an earlier pass already lost the plural in "every wait a step takes" that way and let brainstorm skip its own pause. So they move whole into `references/mode.md`, a section per mode, and the router keeps the dispatch alone at 77 words. One redundancy went with the structure: inside a section named Interactive, "dispatch in interactive" says nothing. Three readers starting from SKILL.md alone found the reference and applied it: the five mode cases, the three pauses in order, the zero pauses of auto with its three exceptions, and where a refused outcome routes. Co-Authored-By: Claude Opus 5 <[email protected]> AIDD-Session-Id: bf713ca4-3c1b-491d-ac0a-4d4533330b5c
Four paragraphs of run-earned sentences read as prose when every one of them is a constraint to check. They become bulleted rules under Behavior, Auto, Interactive and Refusal, so a reader meets one rule at a time. Two rules went in the process. "Dispatch only the steps … and run the rest as `## Auto` says" pointed at a section of its own file, which reads as nothing: it now says that everything else runs without pausing. And the opening pair, naming the three pauses then saying to present and wait, was one rule written twice. Five readers confirm the format did not turn rules into a procedure: the five mode cases, the three pauses in order, no bullet contradicting another, an approval carrying a correction, and — step by step — that clarifying and formalizing are the contract pause rather than two more, while implementing and repairing pause for nothing. Co-Authored-By: Claude Opus 5 <[email protected]> AIDD-Session-Id: bf713ca4-3c1b-491d-ac0a-4d4533330b5c
blafourcade
force-pushed
the
fix/sdlc-manual
branch
from
October 7, 2026 05:20
dcddc97 to
9f27a90
Compare
A supervised run whose source is not planning-ready waited four times, not three. Nothing said the contract pauses once: "only the steps that produce those three pause, clarifying and formalizing included" counts per step, "that artifact's pause" counts per artifact, and three readers walking that path answered four. Adding the spec sentence back only moved one of three — it was never what held the count. Two rules replace four. The count is now an invariant: three pauses, one per artifact, the producing steps sharing it. And the pause is on the finished artifact, so clarification questions are part of producing the contract rather than pauses of their own, and the formalized spec is what gets presented. The exceptions move above both modes, where they always belonged: as a rule of `auto` alone they contradicted "everything else runs without pausing" the moment Check withheld a twice-routed finding in a supervised run. Thirteen readers across the two paths: three on the clarify-then-spec walk, three on the contradiction, three confirming it closed, and the last three answering that nothing is left undecided — the first of the series to say so. Co-Authored-By: Claude Opus 5 <[email protected]> AIDD-Session-Id: bf713ca4-3c1b-491d-ac0a-4d4533330b5c
Eight sentences in one paragraph, three of them added by this branch, and two routings living in two files with nothing saying they were different things: a checker finding routes by what it is about, a refusal the user gives at a pause routes by artifact. A reader had to infer that from the word "finding" meaning two things. The zone now reads as rules under Behavior, Findings and Handoff, and Findings opens by saying which of the two it governs and where the other one lives. Three readers crossed the two on four cases — an implementation finding before the review clears, a contract refusal at the outcome pause, a contract contradiction after it cleared, and a plan refusal. All four landed in the same zone for all three readers, each through the right file, and none found the two routings in conflict. Co-Authored-By: Claude Opus 5 <[email protected]> Claude-Session: https://claude.ai/code/session_01VE16AxC1V9wAMGmGgefe4z AIDD-Session-Id: bf713ca4-3c1b-491d-ac0a-4d4533330b5c
…ring it Every earlier run was headless, so the three gates were only read: a headless run cannot answer a pause without inventing the approval the pause exists to collect. This one stopped at each pause, reported what it presented, and continued from a real answer — approve, approve with a correction, refuse, refuse again. The source was deliberately not planning-ready, so the clarify then formalize path ran. That path had never been counted: every headless interactive run used a planning-ready source and went through Frame directly, which is why the pause counting defect survived 38 of them and surfaced only when asked about. Five pauses on three artifacts, two step waits correctly held not to be pauses, ten commits, seventeen tests green, no pull request. The run also volunteered two faults of its own conduct — probe files outside the sandbox, and a mutation measured against a reverted tree — neither of which the reviewer had caught. Co-Authored-By: Claude Opus 5 <[email protected]> Claude-Session: https://claude.ai/code/session_01VE16AxC1V9wAMGmGgefe4z AIDD-Session-Id: bf713ca4-3c1b-491d-ac0a-4d4533330b5c
blafourcade
marked this pull request as ready for review
October 7, 2026 11:07
This was referenced Oct 7, 2026
Merged
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
🎯 What & why
aidd-orchestrator:01-sdlcexposed only an autonomous contract. #910 is the product decision to bring back a supervised path without interrupting the pipeline: autonomous stays the default, and a caller can ask for three decision gates instead.🛠️ How it works
One paragraph in the router. The mode is
autounlessinteractiveis the request's first whole word;interactivethen pauses on the contract, on the plan, and on the outcome, dispatches only the steps that produce those three ininteractive, and runs the rest inauto. A refusal at a pause is a finding routed by artifact, never by its kind. No skill downstream changed.Four defects found while proving it, each fixed where it belonged:
auto, a finding that recurred after a pass acted on it looped forever. It is now a decision that requires user authority, bounded by severity rather than by a pass counter.🧪 How to verify
aidd_docs/tasks/2026_09/2026_09_17_sdlc-interactive-mode/.codex-run.md, including that the gates added no quality on that issue.auto: the mode word must be the request's first whole word, and the keyword form is the one chosen while building this, so the issue's phrasing is what needs updating rather than the rule. Telemetry represents neither a pause nor a resumption, and would need a record type plus something to emit it.03-check.mdleaves the same distinction open for its own three routes.🔗 Linked issue
Closes #910
✅ I certify
🤖 Generated with Claude Code