feat(getff): the getff distribution package — npx getff init from an assembled tarball (U10 S1+S2) - #1613
Merged
Merged
Conversation
added 3 commits
September 5, 2026 04:39
… an assembled tarball (U10 S1+S2) packages/getff/ is a new workspace package published under the unscoped name `getff` (Decision 1, 2026-09-03): bin/getff (`init` → the shipped `setup`; --version; usage on anything else), package metadata, README, LICENSE, and a `files` allowlist naming the ten payload roots install.sh reads from PKG_ROOT. The payload is ASSEMBLED, never committed: scripts/build-getff-dist.sh copies the git-tracked payload into packages/getff/ (also at `prepack`) and writes MANIFEST.sha256; `--check` re-assembles into a temp dir and fails on any hash drift or on a payload root missing from `files` (freeze record §2 §0.5 shape — install.sh does not move; its 107 PKG_ROOT reads land unchanged). tests/consumer-matrix/getff-dist-cell.sh is the U10 gate: drift check → npm pack → npm i <tarball> into a fresh consumer → getff --version / unknown-command / manifest coverage → `getff init -y ts-server` → a planted OrderSchema.parse(req.body) under src/routes/ FAILS eslint with the R2 message, and a static-literal parse outside the boundary does not. Wired into audit-self.yml and ci-success.needs (principle 36). Opt-in paired-RED arms (GETFF_DIST_CELL_RED_ARMS=1) pack with one `files` entry removed per arm. Measured locally: 1108 manifest files, 1107 in the tarball (2.6 MB packed / 9.8 MB unpacked), the six nested fixture .gitignore files being npm's own exclusion; drift arm RED on an edited setup.d/lib.sh, files arm RED on a dropped `scripts/` entry, both GREEN after restore. Root lockfile gains the workspace link only. Prior-art: prior-art-evaluations.md#267 (npm `files` + `prepack` ADOPTED as the assembly seam; `bundleDependencies` REJECTED — it bundles node_modules trees, not the PKG_ROOT layout install.sh reads; in-repo precedents build-synth-bundle.sh --check + npm-tarball-cell.sh copied).
…r itself (fidelity round 2) Cold fidelity audit round 1 → REVISE, two MAJORs + one MINOR, all fixed here: - MAJOR: MANIFEST.sha256 lacked scripts/build-getff-dist.sh — the manifest was generated before the assembler was `git add`ed, so the self-shipping file was invisible to `git ls-files`. Regenerated after staging: the assembler is no longer in the payload at all (see next item), and the manifest now covers exactly what the tarball ships. - MAJOR: the whole `scripts/` tree (116 files, operator tooling) was shipped. PAYLOAD now names the six scripts the shipped setup.d/install.sh actually read from PKG_ROOT (check-ask-files, run-local-ci-sweep, create-worktree, worktree-node-modules, link-coordination, getff-work); PAYLOAD_TOP keeps `scripts` as the `files` root. - MINOR: `"private": false` stated explicitly in packages/getff/package.json. Cell: `GETFF_DIST_CELL_RED_ONLY=1` + `GETFF_DIST_CELL_RED_ENTRIES` run one paired-RED arm per invocation (the serial ten-arm run exceeds a single 10-minute agent call; CI still runs the main path only). Kickoff §3 amended to match: `lint-config` dropped from the package shape (never a PKG_ROOT read), scripts subset listed, plant reference fixed. Measured: 1053 manifest files, 1052 in the tarball (2.4 MB / 8.6 MB unpacked), cell GREEN with the planted R2 violation failing; ten single-entry arms RED (table in the PR body). Prior-art: skipped — fidelity round-2 fixes to the round-1 capability commit, no new capability
Merged
9 tasks
…al CI sweep The sweep-coverage metatest (install-sh battery shard A on #1613) named `bash tests/consumer-matrix/getff-dist-cell.sh` as a CI command the local sweep never runs. Same class as the three sibling cells already allowlisted: npm pack + npm i into a tmp consumer plus a real `getff init -y` — network, minutes, non-hermetic. Allowlist entry with rationale; no gate_table row (the sweep predicts CI, it does not run installers). Not a shipped file, so MANIFEST.sha256 is untouched. Prior-art: skipped — test allowlist entry, no new capability
artyhoo
added a commit
that referenced
this pull request
Sep 5, 2026
…eturns 0 on both branches (#1614) `setup` runs under `set -euo pipefail` and calls `companion_step` for every manifest row. In setup.d/engine.sh the ✓ and ⚠ branches both ended with `[ "$kind" = "mcp" ] && printf …`, so for every NON-mcp companion (superpowers, ast-grep — kind=cc-plugin/cli) the function's exit status was that of the failed `[ … ]` test: 1. Under -e the caller died right there: - fresh machine, claude CLI present → «✓ superpowers installed» then `setup` exits 1; - claude CLI absent (CI runners, Cursor-only machines) → «⚠ superpowers install failed — run manually: …» then `setup` exits 1 — despite the message promising to continue. Machines where superpowers was already installed took the early `return 0` («already present — skipping») and never saw it, which is why the one-click path looked fine locally. The getff-dist consumer-matrix cell (PR #1613) ran `getff init -y ts-server` on a bare CI runner and caught it: install.sh had completed, then the Companions step killed the run. Fix: the mcp-only log lines become `if … fi` blocks (status never leaks) and companion_step ends with an explicit `return 0` — a companion is optional by contract. Regression tests in tests/install-sh/engine.test.sh run companion_step under `set -e` for a cc-plugin whose install succeeds and one whose install fails; both RED on the previous engine.sh (verified), GREEN now; the ⚠ run-manually line is still asserted. Snapshot fingerprints unchanged (engine.sh runs from the package and is never copied into the consumer tree). Prior-art: skipped — bug fix in an existing shipped script, no new capability Co-authored-by: Test <test@example.com>
added 2 commits
September 5, 2026 05:25
…/engine.sh from #1614) Merge-forward of origin/staging brought the engine.sh fix (#1614) into the payload; the drift gate went RED on exactly that one line (`DRIFT … committed setup.d/engine.sh / fresh setup.d/engine.sh`) — the round-2 audit's note that merge-forwards need a regen in the same push, live-fired. 1053 files, one hash changed. Prior-art: skipped — generated drift artefact regen, no new capability
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
U10 stages S1+S2 of
npm-publish-getff-init/kickoff.md: thegetffdistribution package that makesnpx getff@latest init(spec D6) real, and the consumer-matrix cell that proves it.packages/getff/is a new workspace package (unscoped name per Decision 1) whose tarball lays its contents out exactly like the repository root, soinstall.sh's 107PKG_ROOT/…reads land unchanged (freeze record §2 §0.5). The payload is assembled, never committed —scripts/build-getff-dist.shcopies the git-tracked payload atprepackand writesMANIFEST.sha256;--checkis the drift gate.tests/consumer-matrix/getff-dist-cell.shis the U10 gate («npx getff init→ the first planted violation fails»), wired intoci-success.needs. Publish itself (S3) stays the operator's act and is NOT in this PR.Changes
packages/getff/package.json—getff0.1.0,bin: getff,files= the ten payload roots +bin/+MANIFEST.sha256,private: falsestated,prepack= check + assemble,engines.node >= 22, no dependencies.packages/getff/bin/getff— bash; resolves its own symlinked location;init→exec bash "$ROOT/setup" "$@";--version; usage + exit 2 on anything else. No network fetch (the clone-shim was rejected in the freeze record).packages/getff/README.md,LICENSE(copy of rootLICENSE.md),.gitignore(payload roots, explicit),.npmignore(so npm-packlist never reads the sibling.gitignore).packages/getff/MANIFEST.sha256— 1053 lines, the committed drift artefact (sixscripts/lines: exactly the files install.sh and setup.d read fromPKG_ROOT).scripts/build-getff-dist.sh—git ls-files-sourced assembly (tracked files only, T-U10-B) of the ten roots, withscripts/cut to the six installer-read files (the assembler itself is NOT shipped), manifest,--check(manifest diff +files-coverage check), bash 3.2-compatible, shellcheck-clean.tests/consumer-matrix/getff-dist-cell.sh— steps (1)-(5) + opt-in (6) paired-RED arms (GETFF_DIST_CELL_RED_ARMS=1;GETFF_DIST_CELL_RED_ONLY=1+GETFF_DIST_CELL_RED_ENTRIES=<entry>runs one arm alone); see Test plan..github/workflows/audit-self.yml— jobconsumer-matrix-getff-dist-cell+ci-success.needsentry with the#warning-nobody-readsrationale.Makefile—consumer-matrix-getff-disttarget;consumer-matrixruns it.package.json(root) —build:getff-dist,build:getff-dist:check;package-lock.json— the workspace link entries only (node_modules/getff+packages/getff).docs/meta-factory/prior-art-evaluations.md— entry research(aif-handoff-bridge): Sub-wave B — Variant B filesystem-watcher #267 (Verdict ADOPT: npmfiles+prepackadopted as the assembly seam,bundleDependenciesrejected in the rationale; 3 context7 phrasings cited)..claude/orchestrator-prompts/npm-publish-getff-init/kickoff.md— §3 amended after the round-1 audit flagged two KICKOFF-AMBIGUOUS items:packages/lint-configdropped from the tarball shape (zeroPKG_ROOTreads), thescripts/subset spelled out, the planted-violation reference pointed attests/consumer-matrix/pnpm-monorepo-cell.sh:200-202(no sourceable helper exists undertests/install-sh/).docs/meta-factory/getff-name-architecture-freeze.md— «BUILT 2026-09-05» status note above the «still open» items, saying how each was decided.Prior-art consult
Prior-art: prior-art-evaluations.md#267 (verdict ADOPT — npm
files+prepackadopted as the assembly seam;bundleDependenciesrejected in the rationale, it bundles node_modules trees, not the PKG_ROOT layout install.sh reads; in-repo precedents build-synth-bundle.sh --check + npm-tarball-cell.sh copied)Prior-art: prior-art-evaluations.md#267./npm/cli, 3 phrasings:files+prepackduring pack/publish;bundleDependencies+ workspace publish;binexecutable — results cited in research(aif-handoff-bridge): Sub-wave B — Variant B filesystem-watcher #267 and in the commit body.Test plan
bash scripts/build-getff-dist.sh && bash scripts/build-getff-dist.sh --check→✓ … in sync (1053 files); files covers every payload root(at the audited HEAD, clean checkout — the round-1 manifest had been generated before the assembler wasgit added and was RED; fixed in641e6f5282).setup.d/lib.sh→--checkexit 1:DRIFT … committed setup.d/lib.sh / fresh setup.d/lib.sh;git restore→ GREEN.scripts/fromfiles→--checkexit 1:files does not list these payload roots: scripts; restore → GREEN.FRAMEWORK_ROOT=<worktree> bash tests/consumer-matrix/getff-dist-cell.sh→ GREEN (output pasted below). First run RED on manifest coverage: npm-packlist drops nested.gitignorefiles (6 fixture files underpackages/core/) — recorded as npm's own exclusion alongsidenode_modules/trees and lock files, none read by install.sh.git add -n packages/getff→ 7 files (metadata only; the assembled payload is ignored).grep -c '^[0-9a-f]* scripts/' packages/getff/MANIFEST.sha256→ 6;grep -c build-getff-dist→ 0 (the assembler does not ship itself).npx vitest run principles/36-ci-needs-completeness.test.ts→ 7 passed;js-yamlparse of the workflow confirms the job and theneedsentry.shellcheck --exclude=SC2034,SC2016,SC2317on both new scripts → clean;bash -nclean.markdownlint-cli2on the touched docs → 0 errors. Formatting: only the shipped surface is prettier-enforced (scripts/format-shipped.shpathspecs);docs/meta-factory/*and the workflow are not prettier-clean at HEAD and were deliberately NOT reformatted wholesale (diff = the inserted lines only).filesarms — ten single-entry runs (GETFF_DIST_CELL_RED_ONLY=1 GETFF_DIST_CELL_RED_ENTRIES=<entry>), each packing with that entry removed and runninggetff initfrom the crippled tarball: 10/10 RED. Table in Review findings below.641e6f5282— two REDs, both real, both fixed without touching this PR's deliverables:consumer-matrix-getff-dist-cellRED at step (5):install.shcompleted, thensetup's Companions step died —setup.d/engine.sh:70«⚠ superpowers install failed — run manually» followed by exit 1 on the bare runner (noclaudeCLI). Root cause is a pre-existing bug in the shipped engine:companion_stepended with[ "$kind" = "mcp" ] && printf …, returning 1 for every non-mcp companion on BOTH the ✓ and ⚠ branches, sosetup -yunderset -edied on any fresh machine (masked on operator machines by the «already present — skipping» early return). This is the cell doing its job — the first consumer-facing defect it caught. Fixed as its own atomic PR fix(setup): a companion must never killsetup -y— companion_step returns 0 on both branches #1614 (899f49dd6b, +3 regression tests proven RED on the old code), then merge-forwarded here (66cf3b8508).install-sh battery (shard A)RED inrun-local-ci-sweep-coverage.test.sh: the new cell is a CI command the local sweep never runs → allowlisted as UNREACHABLE with rationale (9061a6d007), same class as the three sibling cells.setup.d/engine.shinside the payload → the drift gate went RED on exactly that line (DRIFT … committed setup.d/engine.sh / fresh setup.d/engine.sh) → manifest regenerated in the same push (1d4cad7756, one hash line). Watch-list W-1's «merge-forward without a manifest hunk» tell, live-fired and honoured.1d4cad7756: the new job passes step (5) on the bare runner and lands inci-success.Cell output (run 6, local, macOS, Node 24 / npm 11, HEAD
641e6f5282)Provenance
Stage PR: kickoff
.claude/orchestrator-prompts/npm-publish-getff-init/kickoff.md§3 S1+S2 (merged #16113d78158859) · baseorigin/staging@899f49dd6bafter merge-forward (wasb843d754a7) · substrate: in-session, host-side (operator route decision 2026-09-05; the aif instance holds no Claude profile) · model: Claude Fable 5.1 for build + a fresh cold seat for the fidelity audit · fidelity Round 1 REVISE (two MAJORs: stale manifest, wholescripts/shipped) → fixed in641e6f5282→ Round 2 GO (narrow delta, fresh cold seat) → head moved by merge-forward #1614 + manifest regen + sweep allowlist → Round 3 (narrow delta, git-conflict-merge-forward.md §9 case b).Review findings
Cold fidelity audits (
agents/fidelity-auditor.md, dialogue-blind seats given only the kickoff §3 S1+S2 / §4 / §6 and the diff).Round 1 — REVISE on
62c2dccbd0(two MAJORs, both with failure scenarios):packages/getff/MANIFEST.sha256omittedscripts/build-getff-dist.sh(generated before the assembler wasgit added);--checkexited 1 on a clean checkout, so the CI cell andprepackwould both have been RED at the audited SHA. Fixed in641e6f5282: manifest regenerated after staging.Failure-scenario: CI job
consumer-matrix-getff-dist-cellfails at step (1) andprepackrefuses to pack →ci-successRED; any «gate green» claim measured on the pre-git addworking tree, not the audited SHA.scripts/build-getff-dist.shshipped the wholescripts/tree (61 files incl.*.test.sh,triage-kernel-v2-bench/, the assembler itself) vs kickoff «scripts/shipped subset». Fixed: PAYLOAD spells the six files install.sh/setup.d read fromPKG_ROOT/scripts/(install.sh:1015-1016,:1024-1025,:1113-1118;setup.d/50-hooks.sh:68;setup.d/10-skills.sh:176;setup.d/85-worktree-scripts.sh:50-58); MANIFEST now carries 6scripts/lines and nobuild-getff-dist.sh.Failure-scenario: every PR touching a factory-only script (
ci-success-gate.sh,measure-*.sh,render-*.mjs,*.test.sh) flipsMANIFEST.sha256and REDs the getff cell on a change no consumer installs, pushing maintainers toward reflexive regeneration; the self-shipping assembler is the mechanism that produced the RED gate above.private: false→ added (packages/getff/package.json:4).prepackruns--check &&before build (stricter than the kickoff's build-only);bin/getff-h|--help|help|""exits 0 with usage (kickoff said exit 2 for anything else — help is kept as the one friendly exit); paired-RED arms are opt-in and skipbin/+MANIFEST.sha256(both load-bearing for the main cell path instead, see the table); Makefile / rootpackage.jsontargets,.npmignore, and the «BUILT» note are extra-but-harmless.641e6f5282(see Changes).Round 2 — GO on
641e6f5282(narrow delta, fresh cold seat): missing none · extra none · diverged none at MAJOR. Two notes-lane items, both recorded here rather than fixed:641e6f5282(«… + the assembler itself») reads as ifscripts/build-getff-dist.shwere shipped; it is NOT in PAYLOAD or MANIFEST (that was the point of the fix). The subject cannot be reworded on a pushed branch (no force-push); this line is the correction.718bc30e78, fix(pipeline): repoint stale preset markers — aif → project defaults, economy → GLM-5.3 SDK #1608), not only on the omitted assembler line. Merge-forwards are the path that edits payload files with no manifest hunk; CI step (1) andprepackcatch it fail-closed, so every merge-forward of this PR that touches a payload file needs ascripts/build-getff-dist.shregen in the same push.Round 3 — GO on
1d4cad7756(narrow delta after the head moved: merge-forward66cf3b8508whose second parent isorigin/staging= #1614, one allowlist line9061a6d007, one manifest hash line1d4cad7756; git-conflict-merge-forward.md §9 case b). Missing none · extra none at MAJOR · diverged none. No S1/S2 artefact changed in the delta. Notes lane: the allowlist line inscripts/run-local-ci-sweep-coverage.test.sh:109is not named by the kickoff but is the minimal accommodation of an existing repo gate to the kickoff-mandated CI job, proven required by paired-RED — not scope creep; the two*.test.shhits in the manifest are underpackages/core(shipped whole by design), pre-existing since round 2, not a W-2 reintroduction; round 2's evidence linebuild-getff-dist.sh:38pointed at the PAYLOAD comment header, the assignment is:42(cosmetic).Paired-RED
filesarms (ten single-entry runs, HEAD641e6f5282)Each arm copies the assembled package, deletes ONE
filesentry frompackage.json, packs with--ignore-scripts, installs the crippled tarball into a fresh fixture and runsgetff init -y ts-server. The gate is «the consumer path FAILS»; the evidence column is the first failing line frominit-fixture.log.install.shbash: <fixture>/node_modules/getff/install.sh: No such file or directorysetupgetff: shipped setup not found at <fixture>/node_modules/getff/setup — the package is incompletesetup.d/setuprefuses to run without itssetup.d/(message names the shippedsetuppath)agents/Aborting install: shipped artefacts failed Authoritative-for header verification.skills/Aborting install: shipped artefacts failed Authoritative-for header verification.templates/cp: <fixture>/node_modules/getff/templates/ts-server/eslint.config.mjs: No such file or directory.claude/cp: <fixture>/node_modules/getff/.claude/skills/template-audit: No such file or directory.prettierrc.jsoncp: <fixture>/node_modules/getff/.prettierrc.json: No such file or directorypackages/Aborting install: shipped artefacts failed Authoritative-for header verification.scripts/cp: <fixture>/node_modules/getff/scripts/check-ask-files.sh: No such file or directorybin/andMANIFEST.sha256are not arms (they are not payload roots —--check'sfiles-coverage arm covers the ten roots only). Both are load-bearing for the main cell path instead: droppingbin/fails step (4)test -x node_modules/.bin/getff(tests/consumer-matrix/getff-dist-cell.sh:102), droppingMANIFEST.sha256fails the step (4) must-exist list and the manifest-coverage read from the installed package (:113,:130). The arms are opt-in locally, not run by CI (each takes 1-2 minutes; CI runs the main path only).Watch-list
build-getff-dist.sh --checkexits 0 at the audited SHAprepackfail-closed on an untouched consumer surfacepackages/getff/MANIFEST.sha256(noscripts/build-getff-dist.shline)DRIFT:on a clean checkout; a commit that adds/edits any payload file without aMANIFEST.sha256hunk in the same commitscripts/shipped subset» — PAYLOAD spells the installer-read filesscripts/build-getff-dist.sh:37(barescripts)*.test.sh,triage-kernel-v2-bench/,measure-*, orbuild-getff-dist.shline back inMANIFEST.sha256;grep -c ' scripts/'≫ 6files entry / arm / evidencetable, or afilesentry added later with no RED /UNVALIDATED-by-this-cellrowinstall.sh,setup,setup.d/in a later round of this PRbin/getffnever fetches over the networkcurl,git clone,npx, or a registry URL appearing inpackages/getff/bin/getffRound 1: W-1 REINTRODUCED (packages/getff/MANIFEST.sha256) · W-2 REINTRODUCED (scripts/build-getff-dist.sh:37) · W-3 N/A · W-4 CLEAN · W-5 CLEAN
Round 2: W-1 CLEAN (--check EXIT=0, 1053 files) · W-2 CLEAN (scripts/build-getff-dist.sh:38, 6 scripts/ lines in MANIFEST) · W-3 N/A (no PR body yet) · W-4 CLEAN (3-dot diff on install.sh/setup/setup.d empty) · W-5 CLEAN (bin/getff:56
exec bash "$ROOT/setup", no fetch)Round 3: W-1 CLEAN (--check EXIT=0, 1053 files; MANIFEST.sha256:1034 engine.sh hash == shasum at HEAD — the merge-forward regen landed in the same push) · W-2 CLEAN (6 scripts/ lines, no build-getff-dist line; the two
*.test.shhits are packages/core, pre-existing) · W-3 CLEAN (PR #1613 body## Review findingscarries the 10-row files/arm/evidence table = the 10 payload roots offiles[];bin/+MANIFEST.sha256dispositioned as main-path load-bearing, citations getff-dist-cell.sh:102/:113/:130 verified) · W-4 CLEAN (3-dot difforigin/staging...1d4cad7756 -- install.sh setup setup.dempty; engine.sh hunk is staging's #1614 arriving via merge 66cf3b8, 2nd parent == origin/staging) · W-5 CLEAN (bin/getff unchanged in delta; grep hits are :4 usage commentnpx getff initand :41 docs URL text; :56exec bash "$ROOT/setup" "$@")Fidelity verdict
FIDELITY: GO
Basis: .claude/orchestrator-prompts/npm-publish-getff-init/kickoff.md#§3 (S1+S2), #§4, #§6
Round: 3
Audited-SHA: 1d4cad7
Evidence: packages/getff/MANIFEST.sha256:1034 — the
setup.d/engine.shhash equalsshasum -a 256 setup.d/engine.shat HEAD;bash scripts/build-getff-dist.sh --check→ «✓ packages/getff/MANIFEST.sha256 in sync with the repo root (1053 files);filescovers every payload root», EXIT=0;git diff origin/staging...1d4cad7756 --name-only -- install.sh setup setup.d→ empty;grep -c ' scripts/' packages/getff/MANIFEST.sha256→ 6; scripts/run-local-ci-sweep-coverage.test.sh:109 — the getff-dist-cell UNREACHABLE row, paired-RED (pre-commit version of the test at HEAD → EXIT=1 namingbash tests/consumer-matrix/getff-dist-cell.sh; HEAD version → PASS=9 FAIL=0). Narrow delta round after the round-2 GO on 641e6f5 (itself after the round-1 REVISE on 62c2dcc); this block replaces both.Parked questions
@getff/corepublish + version coupling: deferred to U9 with the rename (freeze §1); the beta publishesgetffonly.§1.7 Self-discipline check (REQUIRED if PR touches discipline-bearing files)
§1.7 Forward-check applied
Disciplines checked: ci-tool-pinning.md — the new job pins
actions/checkoutandactions/setup-nodeby SHA (.github/workflows/audit-self.yml:1919,:1922) and installs no unpinned tool; no-paid-llm-in-ci.md — the cell is bash + npm + eslint, zero API calls (tests/consumer-matrix/getff-dist-cell.sh:1); build-first-reuse-default.md + CLAUDE.md build-vs-reuse gate — SSOT consult + context7 ≥3 phrasings before the capability commit, recorded as entry #267 (docs/meta-factory/prior-art-evaluations.md:340) and thePrior-art:trailer; attention-is-not-a-mechanism.md §1 — the gate is a deterministic CI cell inci-success.needs(.github/workflows/audit-self.yml:2000), not a warning; principle 36 (packages/core/principles/36-ci-needs-completeness.test.ts:69) passes with the new job; destination-environment-verification.md §4 — the cell's gate discriminates (drift arm and files arm each proven RED then GREEN,scripts/build-getff-dist.sh:91,:73).§1.7 Backward-check applied
Class of the change = «a shipped artefact assembled from other tracked files with a committed drift artefact». Surfaces swept:
scripts/build-synth-bundle.sh:85(the precedent — same--checkshape, unchanged);tests/consumer-matrix/npm-tarball-cell.sh:16(the R1 method the new cell copies — unchanged, still assertspackages/coreon its own);Makefile:34(theconsumer-matrixaggregate now runs three cells);.github/workflows/audit-self.yml:1962(ci-success.needsmirror — the new job added, principle 36 green);docs/meta-factory/getff-name-architecture-freeze.md:76(«still open» list — annotated as decided, not silently left stale);tests/install-sh/snapshot.shbaselines — the consumer install payload is untouched by this PR (the package is additive;SNAPSHOT_MODE=compareis unaffected because nothing under the shipped surface changed);INSTALL-FOR-AI.md(599/600 lines) — deliberately untouched, the entry-point sentence already exists atREADME.md:10.