Skip to content

feat(aidd-orchestrator): add an interactive SDLC mode - #967

Merged
blafourcade merged 14 commits into
nextfrom
fix/sdlc-manual
Oct 7, 2026
Merged

blafourcade merged 14 commits into
nextfrom
fix/sdlc-manual

Conversation

@blafourcade

@blafourcade blafourcade commented Oct 7, 2026 •

Copy link
Copy Markdown
Contributor

🎯 What & why

aidd-orchestrator:01-sdlc exposed 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 auto unless interactive is the request's first whole word; interactive then pauses on the contract, on the plan, and on the outcome, dispatches only the steps that produce those three in interactive, and runs the rest in auto. 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:

  • Frame's spec and Check's review had no committer, so neither artifact reached the branch. Each zone now commits what it wrote.
  • The journey requirement and the planning-ready test rested on the agent's judgement. Both are now decided by text the zone can read.
  • In 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.
  • A finding carried onto the request as a note tripped that same stop, because nothing ordered the two rules. The reopening rule now runs first.

🧪 How to verify

  • 64 decision edges of the orchestration, each covered by an observed run.
  • 44 headless runs in one campaign, then 29 more on the reviewed text, grouped to measure dispersion rather than presence. Zero dispersion inside every group. Evidence under aidd_docs/tasks/2026_09/2026_09_17_sdlc-interactive-mode/.
  • Every text change that resolved an ambiguity was re-read by three independent readers, and none answered that the text did not decide.
  • Two Codex runs, one per mode, same issue (fix(cli): setup --scope user --plugins throws an uncaught UserScopePluginModeError instead of rendering a validation error #891) from the same commit, with a person answering the three gates. That is the only part a headless run cannot do: it would have to invent the approval. Recorded in codex-run.md, including that the gates added no quality on that issue.

⚠️ Heads-up

  • Two of feat(aidd-orchestrator): add an interactive SDLC mode #910's criteria are deliberately out of this change. Its own example of interactive intent, "run the SDLC interactively", lands in 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.
  • Documentation of both modes and their default is in: the description, both catalogs, the plugin table and the README row, which names the word a request carries so a reader meets the word they can type.
  • Two clauses still rest on the reader's judgement — whether a refused outcome goes to Deliver or to Frame, and whether a reworded finding is the same finding. 03-check.md leaves the same distinction open for its own three routes.
  • All run evidence resolves providers from the installed build, not from this checkout.

🔗 Linked issue

Closes #910

✅ I certify

  • I DO CERTIFY I READ EACH LINE OF THE PULL REQUEST BECAUSE I AM A SOFTWARE ENGINEER, NOT A AI PUPPY.

🤖 Generated with Claude Code

blafourcade and others added 11 commits October 1, 2026 10:39
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 and others added 3 commits October 7, 2026 07:37
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
blafourcade marked this pull request as ready for review October 7, 2026 11:07
@blafourcade
blafourcade requested a review from a team as a code owner October 7, 2026 11:07
@blafourcade
blafourcade merged commit c5ac56b into next Oct 7, 2026
25 checks passed
@aidd-bot aidd-bot Bot mentioned this pull request Oct 16, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant