docs(arch-v2): S-D′ kickoff rev 6 — §5 resolved to Option A, ADR-8's A/B arm re-homed to S-K - #1251
Merged
Merged
Conversation
…A/B arm re-homed to S-K Operator verdict 2026-08-07 on the §5 PARKED DECISION-NEEDED: Option A. The ADR-8 A/B experiment is descoped from S-D′; the stage ships subtraction maps + review-seat agent definitions + the #234 annotation, and a PR with no evaluation arm is now conformant rather than incomplete. Edits: - Header rev marker -> REV 6, stating what moved and that the §5 blocker is lifted (the two-gate S-E + S-H dependency is untouched and still binds; S-E has not merged). - §1 item 3: PARKED -> DESCOPED. The four Phase -1 findings stay as the record of WHY; the binding instructions to the executor are inverted from "held" to "absence is not a shortfall". - §4 T2: re-scoped. ADR-8's baseline left with the arm, but S-D′'s OWN before/after baseline is still in scope and still subject to "captured, not described" -- now citing the pre-prune snapshot per the header INPUT CONDITION landed in #1250. - §5: heading and framing flipped to RESOLVED; the fork text kept verbatim as the record of what was decided against what alternative. - §5 INCONCLUSIVE: CLOSED, with evidence. aif creates the task id AFTER the prompt is composed -- the kickoff ships as `description` inside POST /tasks (AifHandoffBackend.ts:231-239) and the id exists only in that response (:249); the only post-create mutation is PUT {paused:false} (:260), the sole other write a best-effort DELETE rollback (:263). A parity-selected arm therefore cannot live in the dispatch prompt without a two-phase redesign -- independent grounds for Option A. Caveat carried: verified client-side only; packages/api not audited for description-editability of a paused task. - §6 (new): S-K stub. Entry criteria = the four unchanged findings + the task-id finding; the three surfaces it needs (ledger schema, dispatcher SKILL.md, install.sh skip-list) named as the reason it could not live in S-D′; inherits the INPUT CONDITION; depends on S-D′ merged. - Umbrella kickoff: S-K stub row added, S-D′ row updated (Implements ADR-8 -> ADR-1), and the "ADR-8 is NOT orphaned" paragraph extended with the second recorded deviation and the new host. Recorded rather than quietly ignored: Option A's own text instructed rewriting out a §3 sentence ("a PR that ships maps with no executable A/B arm fails the stage's purpose") that DOES NOT EXIST in this file. Verified by exhaustive grep, not by reading §3 -- the §3 region carries only the #optout-as-reflex note about install-fingerprint snapshots. The A/B framing lived in §1 item 3 and §4 T2, which is what this rev actually edits. The discrepancy is annotated inline in §5 so the next reader does not re-hunt for it. Prior-art: skipped — records an operator decision into an existing kickoff, no new capability
This was referenced Aug 7, 2026
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.
Summary
Records the operator's resolution of the S-D′ kickoff's
§5 PARKED DECISION-NEEDED(verdict2026-08-07): Option A — the ADR-8 A/B arm is descoped from S-D′. Follow-up to #1250, which
recorded the sibling verdicts on S-H forks #1 and #2.
The stage's first cold Phase -1 returned STOP and parked this fork; rev 6 lifts that blocker.
S-D′ still cannot start — but now for exactly one reason instead of two: the two-gate
S-E + S-H mergeddependency, of which S-H is merged (#1239 + #1249) and S-E is not.Changes
.claude/orchestrator-prompts/arch-v2-context-pipeline-s-d-prime/kickoff.md→ rev 6why; the executor instructions invert from «held with it» to «their absence is conformant,
not a shortfall». The stage now ships deliverables 1, 2 and 4.
own before/after baseline, which stays subject to «captured, not described» — and now cites
the pre-prune billing-projection snapshot per the INPUT CONDITION landed in docs(arch-v2): record operator verdicts on S-H DECISION-NEEDED #1 and #2 #1250. Deleting T2
outright would have dropped a live obligation along with the descoped one.
next to the alternative it declined.
.claude/orchestrator-prompts/arch-v2-context-pipeline/kickoff.md— the stub made real ratherthan promised: an
S-Krow in the stage table, theS-D′row updated (Implementsdrops ADR-8 →ADR-1), and the «ADR-8 is NOT orphaned» paragraph extended with the second recorded deviation
and the new host. A stage that exists only inside another stage's parked section is not
discoverable by
/pipeline; this is what makes the descope operational rather than narrative.The INCONCLUSIVE, closed
The open question was whether aif creates the task id before or after the dispatch prompt is
composed. Option B needed «before»; the answer is after:
descriptionfield inside thePOST /tasksrequest body —packages/runtime-bridge/src/AifHandoffBackend.ts:231-239;:249,const taskId = (createResult as { id: string }).id;PUT /tasks/{id} {paused:false}(:260); the sole other writeis a best-effort
DELETErollback on failure (:263). No request editsdescriptionaftercreation — confirmed by enumerating every
_rest(call in the file (:132,:231,:260,:263, plus the private helper at:336), not by reading the happy path.So a parity-selected arm cannot live in the dispatch prompt without a two-phase dispatch redesign —
independent grounds for Option A, beyond the four findings already recorded.
Caveat carried into the artefact, because it bounds the claim: verified client-side only.
packages/apiwas not audited for whether a paused task'sdescriptionis editable aftercreation. If it is, a two-phase dispatch gets cheaper — that is an entry question for S-K, and it
does not reopen S-D′.
Discrepancy found while executing the instruction — recorded, not silently absorbed
Option A's own text instructs that §3's «a PR that ships maps with no executable A/B arm fails the
stage's purpose» must be rewritten out. That sentence does not exist — not in §3, not
anywhere in the file.
Established by exhaustive grep rather than by reading §3:
grep -nE 'A/B|ADR-8|experiment|ledger|arm|purpose|evaluation'over the whole kickoff returns, inthe entire §3 region (lines 165-264 at rev 5), only the
#optout-as-reflexnote aboutinstall-fingerprint snapshots — nothing tying the stage's purpose to an executable arm. The A/B
framing lived in §1 item 3 and §4 T2, and those are what rev 6 edits.
Option A's consequence is therefore satisfied by construction. The discrepancy is annotated inline
in §5 so the next reader does not re-hunt for a phantom line — an instruction pointing at absent
text is a defect in the fork's own statement, and the cheapest place to catch it is the file it
misdescribes.
Prior-art consult
Prior-art:trailer present — escape-hatch form. Not a capability commit: no dependency, nofile under
packages/.Last reviewedtouch.tooling caveat — library API docs, not this problem class.
Test plan
npx vitest run packages/core/principles/— 36 files / 348 passed, 1 skipped.bash .claude/hooks/check-kickoff-traps.shon both edited kickoffs → EXIT 0 each(§4 T-enumeration intact; the S-D′ §4 edit preserves the
Active trapsline and bothT-SDP-*definitions).--no-verify).AifHandoffBackend.tsline citations verified against the file atorigin/staging, andthe «only post-create mutation» claim verified by enumerating every
_rest(call ratherthan sampling.
Provenance
n/a — not a stage PR: this executes no kickoff and produces no stage deliverable; it records an operator decision into two existing kickoffs.
Review findings
Self-review only, stated as such. The verdict and its grounds are operator-authored; this PR is
placement, wording and one verification.
Two judgment calls worth flagging rather than burying:
§4 T2was re-scoped, not removed. The literal reading of «descope the A/B» would delete theT2 clause naming the ADR-8 baseline. That would also delete the «captured, not described»
obligation on S-D′'s own before/after, which survives Option A and is precisely what docs(arch-v2): record operator verdicts on S-H DECISION-NEEDED #1 and #2 #1250's
INPUT CONDITION exists to feed. Splitting the clause is the reading that keeps both facts true.
Justification: the operator's package names «add the follow-on stage stub» as part of this PR,
and a stage stubbed only inside a parked section of another stage's kickoff is invisible to
/pipeline. Flagged because it is a scope judgment, not an instruction I was given verbatim —CLAUDE.md
PR strategyis the rule I am reading myself against here.Residual uncertainty, one item: the stage letter S-K. Letters A-I are taken (incl. S-D′), and I
picked the next free one rather than S-J to avoid a J/I misread in dispatch strings. That is a
naming preference with no evidence behind it — rename freely if the umbrella has a convention I did
not find.
Fidelity verdict
FIDELITY: skipped — not a stage PR: no kickoff is being executed and no stage deliverable is produced; this records one operator verdict into two existing kickoffs, with the one factual claim (task id postdates the dispatch prompt) verified against source and quoted with file:line.
§1.7 Forward-check applied
.claude/rules/kickoff-staging-placement.md:28— the binding sequence is author → merge tostaging→ only then dispatch. This PR dispatches nothing, and S-D′ remains gated on S-E, so#dispatch-before-stagingcannot fire. The rev-6 text must reachstagingbefore anyone acts onthe descope — which is exactly what merging this PR does.
.claude/rules/attention-is-not-a-mechanism.md:15— the descope is not «the executor willnotice the arm is gone»: §1 item 3 states the inverted instruction explicitly, §4 T2 states which
half survives, and §6 names the destination. Each is a written instruction at the point of use,
not a reader's inference.
.claude/rules/ai-laziness-traps.md:56(T3),:159(T20) — the one new factual claim carriesits file:line and was verified by enumerating every
_rest(call, not by reading the happy path.The phantom-§3-line discrepancy is reported with the command that established it.
.claude/rules/no-paid-llm-in-ci.md:20— nothing added to CI..claude/rules/doc-authority-hierarchy.md:15— kickoffs stay header-exempt per §2'stracked-but-exempt carve-out; no authority claim is added or moved.
§1.7 Backward-check applied
Class of this change = a descope that moves a deliverable off a stage, where the moved thing is
referenced from other surfaces.
Disclosure — my drafted sweep was wrong, and the probe caught it. Again. The draft enumerated
five surfaces from recall and missed four real ones; running
grep -rln 'ADR-8' docs/ .claude/ install.shreturned nine files. This is the second time intwo PRs that the mechanical enumeration overturned a recalled one
(ai-laziness-traps.md T21 —
#backward-check-restates-not-sweeps). The sweep below is the command's output.Swept by this diff (2):
.claude/orchestrator-prompts/arch-v2-context-pipeline-s-d-prime/kickoff.md— header, §1 item 3,§4 T2, §5, new §6: all five sites that carried the arm.
.claude/orchestrator-prompts/arch-v2-context-pipeline/kickoff.md— the S-D′ row'sImplementscolumn (ADR-8 → ADR-1), the new S-K row, and the «ADR-8 is NOT orphaned» paragraph, which would
otherwise still assert S-D′ as the host. Not the file the instruction named — the surface a
restatement-shaped check would have missed.
GAP-FOUND, routed not edited (2):
docs/superpowers/specs/2026-08-06-pipeline-token-economy-design.md— §1.5 (:111-122) and theP13 row (
:363) still describe S-D′ as running under ADR-8's protocol with the rev-4deviation. A second recorded deviation is a spec-level act on a round-capped, operator-owned
document — the same boundary the S-H addendum respected when it routed spec findings through
DECISION-NEEDED #4rather than editing. Exact sites named so the gap is actionable..claude/orchestrator-prompts/arch-v2-context-pipeline/calibration.md— the live ledger.:43(«Item 2 — ADR-8 window + owner») and:52(the load-bearing baseline-capture boundary)still record the pre-descope owner. Deliberately not edited here: §6 names «the umbrella's
ledger-schema section» as a surface S-K needs, and re-owning the ledger mid-PR is the
scope-crossing Option B was rejected for.
NOT SWEPT, by ownership — and verified to need nothing (3):
.claude/orchestrator-prompts/arch-v2-context-pipeline-s-b/kickoff.md(:109,:121,:194,:243) — closed stage; its kickoff is the historical record of what S-B was asked. Note inpassing:
:243(«No ADR-8 baseline rows — S-D captures those») was already stale beforethis PR, since S-D is CLOSED-NULL. Pre-existing, not created here, and not mine to rewrite.
.claude/orchestrator-prompts/arch-v2-context-pipeline-s-c/kickoff.md(:11,:58,:175,:227) — reads ADR-8 for why metered seats matter and defines aMetered?column. ADR-8 stillexists; only the A/B's host moved. Nothing to sweep.
docs/meta-factory/research-patches/2026-07-31-l2-channel-verdict.md(:8,:16,:18-19) —append-only research patch; its ADR-8 references are
Metered? (ADR-8)column semantics,untouched by a host change.
NOT SWEPT, correction already recorded elsewhere (1):
docs/meta-factory/research-patches/2026-08-07-s-h-turn-attribution-p3d-p11.md:100-101— forkfeat: audit fixes Phase 1+2+3 (R2/R11 drift, manifest SSOT, depcruise integration) #1's Option B names «ADR-8's 20-dispatch window» as one of two baseline consumers. Under §5-A
that consumer moves to S-K. The patch is append-only and read-only for later sessions, so the
correction lives in the consuming artefact instead: docs(arch-v2): record operator verdicts on S-H DECISION-NEEDED #1 and #2 #1250 put it in the S-D′ kickoff's INPUT
CONDITION footnote («one consumer, not two»), and §6 here gives S-K the same inherited condition.
Verified to have nothing to sweep (2):
.claude/skills/dispatcher/SKILL.mdandinstall.sh—grep -c 'ADR-8\|parity(task-id)'→ 0 on both. The A/B was never implemented on either surface;that unimplementability is finding (iv) and half the reason for Option A. Both are named in §6 as
surfaces S-K will need.
Two surfaces are left with named, routed gaps (the spec and the ledger); every other surface is
swept, verified empty, or corrected in its consumer.