Skip to content

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
artyhoo merged 1 commit into
stagingfrom
worktree-sdprime-rev6
Aug 7, 2026
Merged

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
artyhoo merged 1 commit into
stagingfrom
worktree-sdprime-rev6

Conversation

@artyhoo

@artyhoo artyhoo commented Aug 7, 2026

Copy link
Copy Markdown
Owner

Summary

Records the operator's resolution of the S-D′ kickoff's §5 PARKED DECISION-NEEDED (verdict
2026-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 merged dependency, 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 6

  • Header rev marker — records what moved and that the §5 blocker is lifted.
  • §1 item 3: PARKED → DESCOPED. The four Phase -1 findings stay verbatim as the record of
    why; 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.
  • §4 T2 re-scoped, not deleted. ADR-8's A/B baseline leaves with the arm, but S-D′ keeps its
    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.
  • §5 flipped to RESOLVED. The fork text is kept verbatim — a resolution is only auditable
    next to the alternative it declined.
  • §5 INCONCLUSIVE — CLOSED, with evidence (below).
  • §6 (new): the S-K stub.

.claude/orchestrator-prompts/arch-v2-context-pipeline/kickoff.md — the stub made real rather
than promised: an S-K row in the stage table, the S-D′ row updated (Implements drops 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:

  • the kickoff ships as the description field inside the POST /tasks request body —
    packages/runtime-bridge/src/AifHandoffBackend.ts:231-239;
  • the id exists only in that call's response:249,
    const taskId = (createResult as { id: string }).id;
  • the only post-create mutation is PUT /tasks/{id} {paused:false} (:260); the sole other write
    is a best-effort DELETE rollback on failure (:263). No request edits description after
    creation
    — 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/api was not audited for whether a paused task's description is editable after
creation. 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, in
the entire §3 region (lines 165-264 at rev 5), only the #optout-as-reflex note about
install-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, no
    file under packages/.
  • No new capability area → no SSOT entry; no existing entry matched → no Last reviewed touch.
  • context7 N/A per build-first-reuse-default.md §3
    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.sh on both edited kickoffs → EXIT 0 each
    (§4 T-enumeration intact; the S-D′ §4 edit preserves the Active traps line and both
    T-SDP-* definitions).
  • markdownlint — 0 errors on both files.
  • 600-line markdown gate — S-D′ 384, umbrella 536.
  • Pre-commit + pre-push ran clean (no --no-verify).
  • The AifHandoffBackend.ts line citations verified against the file at origin/staging, and
    the «only post-create mutation» claim verified by enumerating every _rest( call rather
    than 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:

  1. §4 T2 was re-scoped, not removed. The literal reading of «descope the A/B» would delete the
    T2 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.
  2. The umbrella kickoff was edited — a second file, beyond the literal «S-D′ kickoff rev-6».
    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 strategy is 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 to
    staging
    → only then dispatch. This PR dispatches nothing, and S-D′ remains gated on S-E, so
    #dispatch-before-staging cannot fire. The rev-6 text must reach staging before anyone acts on
    the descope — which is exactly what merging this PR does.
  • .claude/rules/attention-is-not-a-mechanism.md:15 — the descope is not «the executor will
    notice 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 carries
    its 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's
    tracked-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.sh returned nine files. This is the second time in
two 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's Implements
    column (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 the
    P13 row (:363) still describe S-D′ as running under ADR-8's protocol with the rev-4
    deviation. 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 #4 rather 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 in
    passing: :243 («No ADR-8 baseline rows — S-D captures those») was already stale before
    this 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 a Metered? column. ADR-8 still
    exists; 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):

Verified to have nothing to sweep (2): .claude/skills/dispatcher/SKILL.md and install.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.

…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
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant