fix(beta-ai-docs-agnosticism): S1 Phase -1 BLOCKERs — false upgrade claim + unregistered parity gate - #1329
Merged
Merged
Conversation
…laim + unregistered parity gate Phase -1 cold review of the S1 diff (744bb06) returned REVISE with two BLOCKERs. Both were reproduced independently before fixing. B1 — the documented upgrade path does not exist. AI-USAGE-GUIDE.md and the first-steps SSOT both promised `--refresh --profile env` deepens a `core` install. Measured on a real consumer: it exits 0 and delivers nothing. Root cause is deliberate — install.sh:1074-1077 gates the tier-home arm on presence («refresh must not create it on core») and `arch` is in no refresh loop (install.sh:669,671). So the docs are wrong, not the installer, and the fix is the docs. The same false claim is upstream at INSTALL-FOR-AI.md, where measurement shows it is worse than a flat falsehood: `--refresh --profile factory` DOES deliver the AIF suite (the F7 arm honours --profile) while tier-home.md and arch still do not, so a consumer gets a silently half-upgraded project at exit 0. Fixed there too — leaving it would have left two shipped docs contradicting each other, which is the exact defect class this umbrella exists to close. Verified path is a plain deeper-profile re-run: `--profile env` → tier-home YES, arch YES, core artefact md5s unchanged. B2 — first-steps-parity.test.ts was registered in no runner at all (`git grep first-steps` over .github/, .husky/, scripts/, package.json → zero hits), while principle 09 already asserted the parity is «gated by» it. Its only runner was the S1 kickoff host-verify block, which stops executing once the stage closes — #hope-as-gate per attention-is-not-a-mechanism.md §1. Registered by NAME in two channels (CI beside its sibling fence test, and run-local-ci-sweep.sh for the earlier developer-time channel). Registered by name rather than by an `audit-self/` directory scope on purpose: a directory sweep would also pull in two unrelated unregistered tests, which is scope this umbrella did not ask for. Verified: first-steps-parity 9/9 · principle 09 37/37 · run-audit.sh «non-PORTABLE findings (none)», rules-autoload 28 rules · actionlint clean. Prior-art: skipped — defect fix against a merged stage, no new capability; the parity and fence capabilities already exist and are unchanged here.
…s after the B1 doc fix The byte-identical battery fingerprints `.ai-factory/AI-USAGE-GUIDE.md`, so correcting the false upgrade claim in that shipped doc moved its hash in 11 of 15 baselines (shard C: «Result: 4 pass / 11 fail», every diff a single line for that one path). Regenerated with SNAPSHOT_MODE=capture, not hand-edited. The regeneration was checked for swept-in drift before committing: across all 11 files the diff is 11 added / 11 removed lines and every one of them is `.ai-factory/AI-USAGE-GUIDE.md` — no other payload path moved. SNAPSHOT_MODE=compare then returns 15 pass / 0 fail. Prior-art: skipped — snapshot regeneration after a shipped-doc edit, no new capability and no behavioural change to the installer itself.
artyhoo
added a commit
that referenced
this pull request
Aug 9, 2026
…re-review measured false (#1332) The re-review of #1329 returned REVISE: B2 CLOSED, zero regressions, but B1 only partially closed — the replacement sentence had itself gone false. #1329 wrote «`--refresh` never deepens an install, so `--refresh --profile env` on a `core` project is a no-op that still exits 0». That was true against its base (8d092f1) and false by the time it merged: #1327 landed ~20 minutes earlier and added a worktree-scripts refresh arm at install.sh:1001-1005 with NO profile check, while its delivery site documents `PROFILE=core → skip` (setup.d/85-worktree-scripts.sh:19-22). Re-measured against staging on a core consumer: `--refresh --profile env` → exit 0, tier-home NO, arch NO, but create-worktree.sh, worktree-node-modules.sh, link-coordination.sh and getff-work.sh all ARRIVE. Not a no-op. The claim is now stated so it holds whichever way the underlying defect is resolved: `--refresh` re-delivers fixes to what you already have and does NOT reliably deepen an install — no «never», no «no-op». The ungated arm is surfaced in INSTALL-FOR-AI.md as what a consumer actually observes, and attributed to beta-delivery-ux rather than fixed here (different umbrella; gating it is that umbrella's call). Also corrected, all measured rather than copied: - «core artefacts stay byte-identical» → every pre-existing core file IS byte-identical except .prettierignore, whose managed block gains the newly-shipped paths (verified by md5 manifest across a core→env deepening). - Stale line citations from the merge-forward: the F7 gate is install.sh:678, not 669-671 (that range is the core skills loop); the tier-home presence gate moved to install.sh:1090-1093. Verified: first-steps-parity 9/9 · principle 09 37/37 · SSOT parses · run-audit.sh «non-PORTABLE findings (none)» · baselines regenerated (11 added / 11 removed, all the one AI-USAGE-GUIDE.md path) · SNAPSHOT_MODE=compare 15/15. Prior-art: skipped — corrects a factual claim in shipped docs, no new capability. Co-authored-by: Test <test@example.com>
This was referenced Aug 9, 2026
Merged
10 tasks
artyhoo
added a commit
that referenced
this pull request
Aug 17, 2026
…ll slugs (#1312, #1334) (#1412) ## Summary `do_refresh` had drifted from the install arm in **both** directions, and the two directions are the two issues this PR closes. #1312: three skill slugs shipped on install but reached no refresh loop — `arch` (in none at all), `claude-glm-executor-handoff` (factory install loop only), and `rule-tests`, which the refresh header **announced** and then skipped because its payload lives under `.claude/skills/`, not `skills/`. #1334: the worktree-scripts arm carried no profile check at all, so any `--refresh` on a `core` project delivered four `env+` artefacts — the inverse defect, and one that makes «what does `core` contain» unanswerable from `--profile` alone. Both are the same seam, so both get the same resolution: **every depth-gated refresh arm now uses the delivery site's own profile predicate OR presence-on-disk** (presence = prior opt-in, the brownfield upgrade path), and the per-tier slug lists collapse into one shared constant each so the two arms cannot drift again. ## Changes - **`setup.d/lib.sh:58-60`** — `GETFF_SKILLS_CORE` / `_ENV` / `_FACTORY`: the slug lists as an SSOT read by both arms. Issue #1312's own suggested direction #1; the three drifts it measured were three copies of one list, not three bugs. - **`setup.d/10-skills.sh:113/127/133`** — the install arm reads the constants; its `▶ Contour surface` / `▶ AIF operator suite` announcements render from them too. - **`install.sh:684-701`** — the refresh arm reads the same constants, in three loops with three gates: core unconditional, env+ (`env|factory|WITH_AIF_SUITE` OR presence), factory (`factory|WITH_AIF_SUITE` OR presence). `arch`, `pipeline` and `claude-glm-executor-handoff` are refreshed for the first time; `rule-tests` moves here from the plain-copy loop, where its source path could never resolve. - **`install.sh:643`** — the plain-copy header renders from `_PLAIN_SKILLS`, so it can no longer announce a slug the loop does not carry (#1312's honest-signals half). - **`install.sh:1030`** — the worktree-scripts arm gains the gate it never had (#1334). Presence probe is `scripts/create-worktree.sh`: the cluster's load-bearing entry point, present in every version of it, and the four ship together by construction — so a consumer who opted in before `getff-work.sh` joined the cluster still receives it. - **`install.sh:1128`** — tier-home moves from presence-ONLY to the same uniform gate. Without it, `--refresh --profile env` would deepen some arms and not others: the «each arm decides for itself» state `INSTALL-FOR-AI.md` previously had to describe in a paragraph. Named in #1334's own arm table as part of this decision. - **`tests/install-sh/consumer-upgrade-path.test.sh:447-612`** — TESTs 8-11, the behavioural gates: core refresh delivers no deeper artefact (#1334), a bare `--refresh` keeps an already-opted-in factory payload fresh (#1312), the `▶ Skills` header cannot announce what the run does not touch, and `--refresh --profile env` DOES deliver — which is the paired-negative for TEST 8's absence claim (same paths, same tree, present as soon as the profile says so). - **`tests/install-sh/refresh-covers-full-delivery.test.sh:296-345`** — extends the existing parity gate (added by #1327 for the same worktree cluster) rather than adding a parallel one: both arms must READ every tier constant, and neither may carry a literal-slug `for _skill in` loop (a fourth copy). Two paired-negative arms. - **`INSTALL-FOR-AI.md:152/160-166/444`** — re-measured. The old text documented both defects as consumer-observable behaviour; leaving it would have made the shipped doc lie in the opposite direction. ## Prior-art consult - [x] Not a capability commit per [CLAUDE.md «What is a capability commit?»](../CLAUDE.md) — no new dependency, no new file (all four touched files existed), nothing under `packages/`. Commit carries the escape-hatch trailer with rationale. - [x] No new capability area surfaced: the fix reuses the gate shape already in this function (`install.sh:621` agents arm, F7 skills arm) and the parity-test precedent from #1327. - [x] n/a — no SSOT entry matched or needed. - [x] n/a — no new capability area, so no context7 pass claimed. ## Test plan - [x] `bash tests/install-sh/consumer-upgrade-path.test.sh` — RED baseline before the fix: `PASS=37 FAIL=7` (the four worktree scripts leaking onto a core refresh ×2 arms; `arch`, `rule-tests`, `claude-glm-executor-handoff` stale after a bare refresh; the announced-then-skipped `rule-tests`; `arch`/`pipeline`/`tier-home` missing under `--refresh --profile env`). After: **`PASS=44 FAIL=0`**. - [x] `bash tests/install-sh/refresh-covers-full-delivery.test.sh` — before: `PASS=9 FAIL=2`; after: **`PASS=13 FAIL=0`** (both new checks plus their negatives). - [x] `SNAPSHOT_MODE=compare bash tests/install-sh/snapshot.sh` — exit 0, baselines unchanged (the install arm ships the same bytes; only its source of names moved). - [x] Full `tests/install-sh/*.test.sh` battery — see the run summary in the review findings section. - [x] `shellcheck --exclude=SC2034,SC2016,SC2317 setup.d/*.sh install.sh` — exit 0 (CI's exact invocation, `.github/workflows/audit-self.yml:804`). - [x] Manual smoke: `--profile core` install → bare `--refresh` → `--refresh --profile core` → `--refresh --profile env`, asserting the depth boundary at each step (this is TESTs 8/11 run end-to-end against real installs, not a mocked harness). ## Provenance n/a — issue-driven fix, not a stage PR. Base: `staging` @ `049b35e851`. In-session (no aif substrate). ## Review findings n/a — see Test plan for the RED→GREEN evidence. ## Fidelity verdict FIDELITY: skipped — issue-driven bug fix with no kickoff or spec stage behind it; the acceptance contract is the two issue bodies (#1312, #1334) plus the paired-negative gates listed in the Test plan. ## Parked questions n/a ### §1.7 Forward-check applied Checked against the disciplines this diff touches. [`dual-implementation-discipline.md §7`](../.claude/rules/dual-implementation-discipline.md) (single source of truth): the two hand-maintained slug lists collapse to `setup.d/lib.sh:58-60`, read by `setup.d/10-skills.sh:113` and `install.sh:684` — the duplication that drifted three times is gone rather than re-asserted. [`attention-is-not-a-mechanism.md §1`](../.claude/rules/attention-is-not-a-mechanism.md): every claim in this PR lands on a deterministic channel — the depth boundary on `tests/install-sh/consumer-upgrade-path.test.sh:447`, the announce↔deliver honesty on `:554`, the SSOT-consumption invariant on `tests/install-sh/refresh-covers-full-delivery.test.sh:296`; none of them is «a reviewer will read the diff». [`no-paid-llm-in-ci.md`](../.claude/rules/no-paid-llm-in-ci.md): the new gates are bash + real installs, zero API calls. [`effort-worthiness.md §1`](../.claude/rules/effort-worthiness.md): `build-and-verify` contour — a reversible installer change verified live against real consumer trees, no research-grade round. [`evidence-regeneration.md`](../.claude/rules/evidence-regeneration.md): `INSTALL-FOR-AI.md:160` was a dated measurement of the old behaviour, so it was re-measured (2026-08-17) instead of silently inherited. ### §1.7 Backward-check applied Swept every profile-gated install layer for its refresh counterpart, not just the two the issues named: `setup.d/20-agents.sh:39` (suite agents) → gated arm exists at `install.sh:621`; `setup.d/20-agents.sh:70` (skill-context) → gated arm exists at `install.sh:1146`; `setup.d/30-templates.sh:108` (tier-home) → was presence-only, unified here; `setup.d/85-worktree-scripts.sh:34` (worktree cluster) → the #1334 defect, fixed here; **`setup.d/55-runtime-bridge-vendor.sh:65` (factory vendor payload) → has NO refresh arm at all** — a pre-existing #1312-class gap, outside both issues' scope, so it is recorded in `INSTALL-FOR-AI.md:166` as install-only rather than silently fixed in this PR. Also swept for stale claims about the changed behaviour: `grep -rln "create-worktree\|getff-work.sh" tests/` → only the file updated here; `grep -rn 'for _skill in' setup.d install.sh` → no literal-slug loop survives (now asserted); `INSTALL-FOR-AI.md:152/160-166/444` were the only prose stating the old semantics, and #1329's weakened claim (repaired in #1332) still holds under the new behaviour. Closes #1312 Closes #1334
6 tasks
artyhoo
added a commit
that referenced
this pull request
Sep 2, 2026
…merge (#1569) (#1570) ## Summary Closes the `beta-ai-docs-agnosticism` umbrella. S4 merged as #1569 (squash `1d382d4783`) and was the last stage, so this adds the `done.md` closure marker — the load-bearing Layer-C3 signal `priority-score.sh` reads as `basis=done-md` (`docs/meta-factory/operational-conventions.md` §1, umbrella closure convention). One new file, no code, no behaviour change. ## Changes - **`.claude/orchestrator-prompts/beta-ai-docs-agnosticism/done.md`** (new, 79 lines) — the closure marker, plus two things worth carrying out of the umbrella: - **A stage table with the REAL head branch names.** S2 and S3 ran through the aif runtime, which mints `feature/<slug>-<id>` and exposes no branch override in `dispatch.ts` or `harvest.ts`. The meta-launch Stage-2→3 entry gate greps the kickoff's *predicted* names, so `gh pr list --search "is:merged head:beta-c-s2-skills-probe base:staging"` returns `[]` for both stages even though both landed. The marker says so explicitly, so the next reader does not re-run that grep and conclude the stages never merged. Landing was verified by substance: `git merge-base --is-ancestor 7534fd9 origin/staging` and the same for `ee0ccfe593`. - **The owner-parked residue**, copied out of the three stage PRs' `## Parked questions` sections rather than left to rot there: S3's `aif-version` fork and the `claims-conformance-auditor` skip-list follow-up, S2's drifted `tier-home.md` citation and census boundary, and S4's two maintainer-only Context7 legs, its Phase-2 flip proposal, and the three couplings that still need a gate in files those stages were not permitted to touch. Also synced to the coordination canon at `~/.claude-coordination/rules-as-tests-aif/beta-ai-docs-agnosticism/done.md` (`/dispatcher` §2.8). That path is machine-local and not part of this diff. ## Umbrella stages | Stage | PR | Squash | |---|---|---| | S1 — AGENTS.md layer + AI Usage Guide (C1) | #1311 | `744bb06e35` | | S1b — Phase -1 BLOCKER fixes | #1329 | `501af27ea5` | | S1c — refresh-claim repair | #1332 | `ebb974afde` | | S2 — skills agnosticism probe (C3) | #1552 | `ee0ccfe593` | | S3 — self-generating docs sweep (C5) | #1550 | `7534fd9a48` | | S4 — discoverability (C4) | #1569 | `1d382d4783` | ## Verification ``` $ git ls-files -s .claude/orchestrator-prompts/beta-ai-docs-agnosticism/done.md 100644 0435de2 0 .claude/orchestrator-prompts/beta-ai-docs-agnosticism/done.md ``` Mode `100644`, not `120000` — the coordination hook adopts new untracked files under that directory and replaces them with symlinks within about two minutes, so the file was written and staged in one step and the mode checked afterwards. ``` $ wc -l .claude/orchestrator-prompts/beta-ai-docs-agnosticism/done.md 79 ``` Under the 600-line markdown gate. `markdownlint-cli2` at pre-commit: `Summary: 0 error(s)`. Pre-push gates green on the push of this branch. ## Prior-art consult - [x] Not a capability commit — one markdown file, no dependency, nothing under `packages/`. The commit carries `Prior-art: skipped — closure marker for a completed umbrella, no capability and no code.` - [x] No new capability area surfaced; no SSOT entry needed. S4's own capability entry is row **264**, added in #1569. ## Test plan - [x] `git ls-files -s` confirms mode 100644 - [x] `markdownlint-cli2` green at pre-commit - [x] Pre-push gate battery green - [x] Every PR number and squash SHA in the table read from `gh pr view --json mergeCommit`, not from memory ## Provenance n/a — not a stage PR. This is the closure marker written by the session that merged the umbrella's final stage, per the umbrella closure convention. ## Review findings n/a — docs-only closure marker. Its factual content (six PR numbers, six squash SHAs, six head branch names) was read from `gh pr view --json number,title,mergedAt,mergeCommit,headRefName` for each PR, and the two ancestry claims from `git merge-base --is-ancestor`. ## Fidelity verdict FIDELITY: skipped — closure marker for an already-merged umbrella; no kickoff governs it, no deliverable to audit against, and the diff is one new markdown file with no code and no behaviour change. ## Parked questions n/a — this PR resolves nothing and decides nothing. The umbrella's open items are recorded IN the new file as owner-parked residue, deliberately carried forward rather than closed. ## §1.7 Self-discipline check ### §1.7 Skipped: mechanical closure marker for a merged umbrella — one new markdown file under .claude/orchestrator-prompts/, no discipline rule introduced or extended, no rules/principles/EXECUTION-PLAN/prior-art/CLAUDE.md path touched, and no behaviour change anywhere in the tree.
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
The mandatory Phase -1 cold review of S1 (#1311) returned REVISE with 2 BLOCKERs. This PR closes both. It is the §7 REVISE route of the umbrella's meta-launch, not new scope — Stage 2 (S2 ∥ S3) stays halted until Phase -1 is re-run against this diff.
The review was run per meta-launch §7: an in-session cold sub-agent given only
git show 744bb06e35+ the S1 kickoff §4 acceptance list, with the PR body withheld. It confirmed it never opened #1311. Acceptance came back 7/9 verified by running, 2/9 INCONCLUSIVE, 0/9 failed, with declared coverage of 24 of 38 files — the two BLOCKERs below were then reproduced independently by the orchestrator before anything was edited.B1 — the documented upgrade path does not exist
AI-USAGE-GUIDE.mdandfirst-steps.source.jsonboth promised: «Already on core? Upgrade in place with--refresh --profile env: the deeper payload arrives.»Measured on a real temp consumer:
tier-home.md.claude/skills/arch/--profile core(baseline)--refresh --profile env(as documented)--profile env(plain re-run)Core artefact md5s were byte-identical across the successful upgrade, so the second half of the claim held; only the mechanism was wrong.
The installer behaviour is deliberate, so the docs are the defect:
install.sh:1074-1077gates the tier-home arm on presence with the comment «refresh must not create it on core», andarchappears in neitherdo_refreshskill loop (install.sh:669,671).This blocked Stage 2 because the following steps of that same sequence tell the consumer to
lsand then open.ai-factory/tier-home.md— a dead end — and becausefirst-steps.source.jsonis the SSOT the B-D5 amendment obliges umbrella B's BS2 to vendor onto the public site.Fixed upstream too, and it was worse there
The same claim pre-exists at
INSTALL-FOR-AI.md(S1 copied it forward). Measurement showed a subtler failure:--refresh --profile factorydoes deliver the AIF suite — the F7 arm honours--profile— whiletier-home.mdandarchstill do not. A consumer following that line gets a silently half-upgraded project at exit 0, which reads as success.Fixing only the guide would have left two shipped docs contradicting each other, which is the precise defect class this umbrella exists to close, so both were corrected to the verified plain deeper-profile re-run.
B2 — the parity gate was registered in nothing
Control, same PR's sibling test:
audit-self.yml:499. Its only runner was the S1 kickoff'shost-verifyblock, which stops executing the moment the stage closes — whilepackages/core/principles/09-doc-authority-hierarchy.ts:116already asserted the parity is «gated by» that file.#hope-as-gateper attention-is-not-a-mechanism.md §1.Registered by name in two channels —
.github/workflows/audit-self.ymlbeside its sibling, andscripts/run-local-ci-sweep.shfor the earlier developer-time channel (invariant 4: CI is the last resort). By name rather than via anaudit-self/directory scope on purpose: a directory sweep would also pull in two unrelated unregistered tests (hooks-tree-guard.test.ts,run-bash-mutation.test.ts), which is scope this umbrella did not ask for. That choice resolves the reviewer's DECISION-NEEDED D-2 without taking either horn.packages/core/hooks/pre-push.tswas deliberately not touched — the enforcement layer is maintainer-owned per the Artifact Ownership Contract.The registration was proven to fire, not just to exist
SWEEP_DIFF_OVERRIDE=packages/core/audit-self/first-steps-parity.test.ts bash scripts/run-local-ci-sweep.sh→[sweep] PASS first-steps-parity.Read the tier + degradation SSOT→Read the tier SSOT) →Tests 1 failed | 8 passed, diff- "read-tier-home :: Read the tier + degradation SSOT" / + "read-tier-home :: Read the tier SSOT". Reverted; tree restored byte-identical.Verification
first-steps-parity9/9 · principle 09 37/37 ·run-audit.sh→ «non-PORTABLE findings (none)»,rules-autoload28 rules ·actionlintclean on the edited workflow · markdownlint 0 errors · Prettier clean.Pre-existing red, not from this diff:
npm --prefix packages/core run test:hooksfails (tsx-resolution / dup-detect / priority-score). Reproduced on a cleanstagingcheckout with 11 failures before this branch existed; none of the failing files reference any file in this diff (grep→ 0 hits each).§1.7 Forward-check applied
Checked against the disciplines governing this change class. attention-is-not-a-mechanism §1 is the rule B2 violates and this PR satisfies: the fix is a deterministic gate at two channels rather than a named agent or a warning, and its firing was demonstrated (
first-steps-parity.test.tsred arm above), because a registration whose red arm is never exercised is the same#hope-as-gateone level up. no-paid-llm-in-ci §1: the added workflow step isnpx vitest, zero API calls, and it reuses the existingnpm ci --prefix packages/coreat.github/workflows/audit-self.yml:165rather than adding an install. ci-tool-pinning §1 Rule A/B: no new tool install is introduced on anyrun:line, so neither pin rule is engaged. doc-authority-hierarchy §2-§3: no authority header changes —AI-USAGE-GUIDE.md:3-9andINSTALL-FOR-AI.mdkeep theirs, and principle 09 is green at 37/37. CLAUDE.md PR strategy: the 5 MAJOR / 2 MINOR from the same review are surfaced, not fixed here.§1.7 Backward-check applied
Two sibling sweeps were run over the change's classes rather than over this diff.
Class «shipped doc claiming
--refreshdeepens an install» —grep -rn -- "--refresh"acrosspackages/core/templates/,INSTALL-FOR-AI.md,INSTALL.md,README.mdfiltered fordeeper|deepen|upgrade in place|payload arrivesreturns exactly 4 lines: the 3 corrected sites (AI-USAGE-GUIDE.md:99,first-steps.source.json:83,INSTALL-FOR-AI.md:152) plusINSTALL-FOR-AI.md:162, which states the converse («a deeper install survives a shallower refresh») and is consistent with the presence-gating, so it is correct as written. SWEPT-CLEAN — no fourth copy of the false claim survives.Class «test under
packages/core/audit-self/with no runner» — each file was checked against.github/,.husky/,scripts/, bothpackage.jsons. In the vitest peer group:audit-ai-docs.test.ts1 runner,md-line-gate.test.ts1,first-steps-parity.test.ts2 after this PR (was 0), andhooks-tree-guard.test.ts0 ·run-bash-mutation.test.ts0 —GAP-FOUND, the same defect class as B2, pre-existing and outside this umbrella, surfaced here rather than swept in (this is precisely the scope growth the by-name registration avoids). The*.shentries reporting 0 are not the same class: they are shipped consumer-side scripts that run on the consumer's machine, not framework CI gates.Not addressed here (surfaced, not fixed)
The review also returned 5 MAJOR and 2 MINOR, all outside these two BLOCKERs and none of them regressions from this diff — most notably
setup.d/lib.sh:241-254never converging a destination that holds two of our fences, andinstall.sh:594,1105still telling the consumer thatAGENTS.mdwas not touched after S1 made it co-owned. They are recorded in the meta-launch state log for an explicit routing call rather than folded in here (CLAUDE.md PR strategy: no drive-by scope expansion).Fidelity verdict
FIDELITY: GO
Basis: .claude/orchestrator-prompts/beta-ai-docs-agnosticism-meta-launch/kickoff.md §7 (the REVISE route this PR executes) + the two BLOCKERs of the Phase -1 review of 744bb06
Round: 2
Audited-SHA: 750af3f
Evidence: packages/core/templates/shared/AI-USAGE-GUIDE.md:97 — the
envinstall step now names the plain deeper-profile re-run, and the--refreshsentence states the measured limit rather than the reverse; the claim was re-measured on a temp consumer before being written (--refresh --profile env→ tier-home NO / arch NO at exit 0;--profile env→ both YES, core md5s unchanged). packages/core/templates/shared/first-steps.source.json:83 — the SSOT half carries the same corrected action, and itsevidencefield now cites install.sh:1076 plus the measurement, so the render and its source cannot drift apart on this step. INSTALL-FOR-AI.md:152 — the upstream copy of the same claim, corrected with the sharper finding that--refresh --profile factorydeepens PARTIALLY (AIF suite yes, tier-home and arch no), which is why the instruction is now a plain deeper-profile re-run for every depth. .github/workflows/audit-self.yml:178 and scripts/run-local-ci-sweep.sh:60 — the parity gate registered by name in two channels; proven live rather than assumed,[sweep] PASS first-steps-parityon selection andTests 1 failed | 8 passedon a seeded retitle, then reverted to a byte-identical tree. Gates re-run at this SHA: first-steps-parity 9/9, principle 09 37/37, run-audit.sh «non-PORTABLE findings (none)» with rules-autoload at 28 rules, actionlint clean. Round 2 adds the snapshot regeneration the round-1 CI surfaced (shard C, «Result: 4 pass / 11 fail», every diff the single.ai-factory/AI-USAGE-GUIDE.mdline that the B1 fix moved): tests/install-sh/baselines/ts-server/greenfield.fingerprint:1 and its 10 siblings were regenerated with SNAPSHOT_MODE=capture and audited for swept-in drift — 11 added / 11 removed lines, all of them that one path — after which SNAPSHOT_MODE=compare returns 15 pass / 0 fail.Provenance
Stage S1 follow-up of umbrella
beta-ai-docs-agnosticism. Reviewed-SHA744bb06e35. Meta-launch:.claude/orchestrator-prompts/beta-ai-docs-agnosticism-meta-launch/kickoff.md§7. Basestaging@8d092f1f64.Prior-art: skipped — defect fix against a merged stage, no new capability; the parity and fence capabilities already exist and are unchanged here.