Skip to content

fix(beta-ai-docs-agnosticism): S1 Phase -1 BLOCKERs — false upgrade claim + unregistered parity gate - #1329

Merged
artyhoo merged 2 commits into
stagingfrom
beta-c-s1b-phase-minus1-fixes
Aug 9, 2026
Merged

fix(beta-ai-docs-agnosticism): S1 Phase -1 BLOCKERs — false upgrade claim + unregistered parity gate#1329
artyhoo merged 2 commits into
stagingfrom
beta-c-s1b-phase-minus1-fixes

Conversation

@artyhoo

@artyhoo artyhoo commented Aug 9, 2026

Copy link
Copy Markdown
Owner

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.md and first-steps.source.json both promised: «Already on core? Upgrade in place with --refresh --profile env: the deeper payload arrives.»

Measured on a real temp consumer:

command exit tier-home.md .claude/skills/arch/
--profile core (baseline) 0 NO NO
--refresh --profile env (as documented) 0 NO NO
--profile env (plain re-run) 0 YES YES

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-1077 gates the tier-home arm on presence with the comment «refresh must not create it on core», and arch appears in neither do_refresh skill loop (install.sh:669,671).

This blocked Stage 2 because the following steps of that same sequence tell the consumer to ls and then open .ai-factory/tier-home.md — a dead end — and because first-steps.source.json is 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 factory does deliver the AIF suite — the F7 arm honours --profile — while tier-home.md and arch still 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

git grep -n "first-steps" origin/staging -- .github/ .husky/ scripts/ package.json packages/core/package.json
→ exit=1, zero matches

Control, same PR's sibling test: audit-self.yml:499. Its only runner was the S1 kickoff's host-verify block, which stops executing the moment the stage closes — while packages/core/principles/09-doc-authority-hierarchy.ts:116 already asserted the parity is «gated by» that file. #hope-as-gate per attention-is-not-a-mechanism.md §1.

Registered by name in two channels — .github/workflows/audit-self.yml beside its sibling, and scripts/run-local-ci-sweep.sh for the earlier developer-time channel (invariant 4: CI is the last resort). By name rather than via an audit-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.ts was deliberately not touched — the enforcement layer is maintainer-owned per the Artifact Ownership Contract.

The registration was proven to fire, not just to exist

  • Selection: SWEEP_DIFF_OVERRIDE=packages/core/audit-self/first-steps-parity.test.ts bash scripts/run-local-ci-sweep.sh[sweep] PASS first-steps-parity.
  • Red arm: retitling one step in the render (Read the tier + degradation SSOTRead 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-parity 9/9 · principle 09 37/37 · run-audit.sh → «non-PORTABLE findings (none)», rules-autoload 28 rules · actionlint clean on the edited workflow · markdownlint 0 errors · Prettier clean.

Pre-existing red, not from this diff: npm --prefix packages/core run test:hooks fails (tsx-resolution / dup-detect / priority-score). Reproduced on a clean staging checkout 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.ts red arm above), because a registration whose red arm is never exercised is the same #hope-as-gate one level up. no-paid-llm-in-ci §1: the added workflow step is npx vitest, zero API calls, and it reuses the existing npm ci --prefix packages/core at .github/workflows/audit-self.yml:165 rather than adding an install. ci-tool-pinning §1 Rule A/B: no new tool install is introduced on any run: line, so neither pin rule is engaged. doc-authority-hierarchy §2-§3: no authority header changes — AI-USAGE-GUIDE.md:3-9 and INSTALL-FOR-AI.md keep 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 --refresh deepens an install»grep -rn -- "--refresh" across packages/core/templates/, INSTALL-FOR-AI.md, INSTALL.md, README.md filtered for deeper|deepen|upgrade in place|payload arrives returns exactly 4 lines: the 3 corrected sites (AI-USAGE-GUIDE.md:99, first-steps.source.json:83, INSTALL-FOR-AI.md:152) plus INSTALL-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/, both package.jsons. In the vitest peer group: audit-ai-docs.test.ts 1 runner, md-line-gate.test.ts 1, first-steps-parity.test.ts 2 after this PR (was 0), and hooks-tree-guard.test.ts 0 · run-bash-mutation.test.ts 0GAP-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 *.sh entries 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-254 never converging a destination that holds two of our fences, and install.sh:594,1105 still telling the consumer that AGENTS.md was 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 env install step now names the plain deeper-profile re-run, and the --refresh sentence 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 its evidence field 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 factory deepens 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-parity on selection and Tests 1 failed | 8 passed on 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.md line 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-SHA 744bb06e35. Meta-launch: .claude/orchestrator-prompts/beta-ai-docs-agnosticism-meta-launch/kickoff.md §7. Base staging @ 8d092f1f64.

Prior-art: skipped — defect fix against a merged stage, no new capability; the parity and fence capabilities already exist and are unchanged here.

…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
artyhoo merged commit 501af27 into staging Aug 9, 2026
85 of 88 checks passed
@artyhoo
artyhoo deleted the beta-c-s1b-phase-minus1-fixes branch August 9, 2026 08:33
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>
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
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.
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