Skip to content

docs(getff-freshness-widening): S0 — fold the trace umbrella's routed-onward residuals into the kickoff - #1279

Merged
artyhoo merged 1 commit into
stagingfrom
feat/getff-freshness-widening-s0-host
Aug 7, 2026
Merged

docs(getff-freshness-widening): S0 — fold the trace umbrella's routed-onward residuals into the kickoff#1279
artyhoo merged 1 commit into
stagingfrom
feat/getff-freshness-widening-s0-host

Conversation

@artyhoo

@artyhoo artyhoo commented Aug 7, 2026

Copy link
Copy Markdown
Owner

What

Stage S0 of getff-freshness-widening: the umbrella kickoff was authored before its upstream (getff-any-stack-trace) finished, and its own §0 re-plan rule obliges folding that umbrella's landed diffs + done.md residuals before S1 dispatch. Seven corrections, one file.

# Correction Evidence
D1 S4 said «js/rust parity»; done.md routed «cargo + go» here. Go lane added to scope. setup.d/47-go.sh, packages/core/backends/golangci/, PR #1236
D2 --refresh routed here by R1 §5.1, named in no stage → own stage S4b §1 binds one PR per stage; S4 already carries three lanes + fixture debt
D3 cargo rung-5 cascade named as its own S4 deliverable done.md routed-onward list, distinct item
D4 S5 said «RE-RUN» a protocol that never ran → «FIRST run», host-only, re-park over a warm run done.md: «RUN — PARKED … the RUN defers to the host»
D5 «byte-identity gate across ALL THREE copies» named a nonexistent mechanism deps-hash-check.test.ts:515-527 compares two files; grep -n plugin → 0 hits; third copy generated by scripts/generate-plugin-twins.sh via .husky/pre-commit:155-166
D6 fail-closed — no host-verify contract (exit 2) now §4, three commands each traced to a §2 «works» criterion
D7 fail-closed — no park contract → autonomous dispatch blocked now §5

Why this landed from the host, not the container

S0 was dispatched to aif (task 6cfa9c79). The worker did the full verification pass and independently confirmed every one of D1–D7 — then hit a hard wall: Claude Code refuses writes to .claude/** paths inside the container (every channel — Edit, Write, Bash heredoc; filesystem permissions are fine). It correctly parked rather than guessing or faking, and its reviewer independently verified the block and returned a Blocking verdict. Zero commits, clean tree.

Two things follow, both recorded in the kickoff's new §5:

  1. S2 hits the same wall — it must edit .claude/hooks/deps-hash-check.sh. It is not container-dispatchable as written; route it to a host session or pre-authorize the path.
  2. The task nonetheless reached status=done with manualReviewRequired=false despite a BLOCKER in its log and a Blocking review verdict. A park-flag watcher cannot be trusted as the only stall detector.

Verification (on this host)

bash scripts/host-verify.sh getff-freshness-widening        → 3/3 PASS, exit 0   (was exit 2)
grep -qi 'park it as a question' <kickoff>                  → present            (was absent)
npx vitest run packages/core/hooks/check-kickoff-traps.test.ts → 52/52
npx vitest run packages/core/principles/12-ai-laziness-traps.test.ts → 7/7
git status --porcelain                                      → exactly one file

Parked questions

None outstanding. The pre-registered park candidate — D5, the plugin-twin's real guarding mechanism — was resolved with evidence rather than parked: the twin is auto-generated (scripts/generate-plugin-twins.sh, wired at .husky/pre-commit:155-166), and its md5 delta from the source is exactly the injected # AUTO-GENERATED header — diff <(sed '2d' plugin/hooks/deps-hash-check) .claude/hooks/deps-hash-check.sh is empty. The hook header's «3-way guard» is therefore imprecise, not false: two mechanisms, not one gate.

Noted, deliberately not fixed here (one concern per PR): that pre-commit channel is author-side and skippable — a --no-verify commit, or a machine where make install-hooks never ran, leaves the twin stale. Real but out of this umbrella's scope.

§1.7 Skipped: dispatch-input correction only — this PR edits one kickoff.md under .claude/orchestrator-prompts/, a path outside the §4b discipline-bearing list (no rule, principle, template, skill, agent, CLAUDE.md or SSOT surface is touched); the change makes the kickoff match already-landed upstream state rather than introducing any new discipline.

Fidelity verdict

FIDELITY: skipped — no ## Provenance substrate is declared for this PR: the aif dispatch produced zero commits (hard-blocked on .claude/** writes) and the diff was authored on the host, so there is no container-produced work for a fidelity auditor to compare against the spec. The stage's own six acceptance criteria are quoted with their host output above.

…-onward residuals into the kickoff

The umbrella kickoff was authored before its upstream (getff-any-stack-trace)
finished; its own §0 re-plan rule obliges folding that umbrella's landed diffs
and done.md residuals before S1 dispatch. Seven corrections, one file:

- D1 go lane: S4 said "js/rust parity" while done.md routed "cargo + go" rung
  parity here. The go lane is live (setup.d/47-go.sh, backends/golangci, #1236).
- D2 --refresh: routed to this umbrella by R1 §5.1, previously named in no stage.
  Gets its own stage S4b rather than folding into S4 — §1 binds one PR per stage
  and S4 already carries three lanes plus the fixture debt. Explicit descope
  instruction if a landed trace diff already closed it.
- D3 cargo rung-5 delivery cascade: named as its own S4 deliverable instead of
  being folded into "mirror the agent-surface delivery".
- D4 S5: said "RE-RUN" a protocol that has never run — the trace umbrella PARKED
  it because a container cannot satisfy cold-start conditions #2/#3. Now reads
  "FIRST run", host-only, with an explicit re-park instruction over a warm run.
- D5 S2: "byte-identity gate across ALL THREE hook copies" named a mechanism that
  does not exist. deps-hash-check.test.ts:515-527 compares TWO files; the third
  copy is generated by scripts/generate-plugin-twins.sh via .husky/pre-commit and
  is never hand-edited. The header's "3-way guard" is one claim over two
  mechanisms; S2 now says which to edit and which regenerates.
- D6 (fail-closed): no host-verify contract. scripts/host-verify.sh exited 2.
  Added §4 with three commands, each traced to a §2 "works" criterion.
- D7 (fail-closed): no park-don't-guess contract, so autonomous dispatch was
  blocked. Added §5, plus the harness constraint discovered dispatching S0.

Also records that .claude/** writes are refused inside the aif container, which
makes S2 non-container-dispatchable as written — the same wall that blocked S0.

Verified on this host: host-verify 3/3 exit 0 (was exit 2); park grep present;
check-kickoff-traps 52/52; principle 12 7/7; diff touches exactly one file.

Prior-art: skipped — dispatch-input correction only, one kickoff.md edited to
match already-landed upstream state; no dependency, no code module, no capability.
@artyhoo
artyhoo merged commit 1b0968d into staging Aug 7, 2026
41 checks passed
@artyhoo
artyhoo deleted the feat/getff-freshness-widening-s0-host branch August 7, 2026 22:37
artyhoo added a commit that referenced this pull request Aug 8, 2026
…ty (#1287)

Dispatch input for stage S1 (spec §7.1). Stage gate met: S0 merged (#1279,
#1281). Scoped from the source, not from the umbrella's prose:

- The target is three rules-lock writers, enumerated not sampled:
  setup.d/45-python.sh:624, setup.d/46-cargo.sh:244, setup.d/47-go.sh:211.
  A wider `grep '"version": null'` also hits packages/core/research/**,
  packages/core/synthesizer/fixtures/** and detector fixtures — a DIFFERENT
  artefact class (research plans) where the null may be legitimate. The kickoff
  names that scope trap explicitly so the stage does not sweep them.
- RulesLock (packages/core/installer/types.ts:36-43) carries `ruleIds: string[]`
  — a flat array with NO per-rule field. "Provenance/tier per rule" is therefore
  an additive schema change, not a value fix, so §4 binds the capability-commit
  obligation (BFR consult + SSOT row + Prior-art trailer) rather than leaving it
  to be discovered mid-stage.

Two domain traps are recorded because both are the cheap wrong path here:
T-S1-A (substituting a variable at the three printf sites satisfies criterion 1
and fails the stage — criteria 2 and 4 cannot be met that way) and T-S1-B
(declaring lane parity by reading the four writers instead of asserting over
generated outputs; tests/install-sh/rules-lock-schema-parity.test.sh exists and
should be extended, not duplicated).

Container-dispatchable: the §2 allowlist covers setup.d/ + packages/core/ only,
avoiding the .claude/** write block that stopped the S0 dispatch (task 6cfa9c79).

Carries its own host-verify contract and park-don't-guess contract; the
pre-registered likely park is criterion 6's backward-compatibility policy for
schemaVersion, which has a consumer-visible consequence.

Prior-art: skipped — dispatch-input authoring only, one kickoff.md under
.claude/orchestrator-prompts/; no dependency, no code module, no capability.

Co-authored-by: Test <test@example.com>
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