What happens
On a satellite fresh from init, with the published CLI and nothing else:
mkdir my-project && cd my-project && git init -q
npx -y @beyondnet/evolith-cli@1.3.2 init --name my-project --yes
npx -y @beyondnet/evolith-cli@1.3.2 gate evaluate --phase discovery
# ■ Error: ENOENT: no such file or directory, scandir '/work/my-project/reference/governance/sdlc/gates'
# exit 1
phase advance --from discovery --to design fails the same way. With --core ../evolith pointing at a clone of this repository, both commands run and exit 2 with the real gate verdict (six missing Discovery artifacts). Measured 2026-09-20 in a clean node:20 container; the full run is in docs/evidence/phase-gate-capture.md.
Why
The tarball ships rulesets/sdlc/phase-gates.rules.json and rulesets/sdlc/artifact-registry.json at the package's own paths, but not reference/governance/sdlc/gates/gate-f1.json … gate-f5.json. PhaseGateValidatorService (src/packages/core-domain/src/application/validators/phase-gate-validator.service.ts) composes <core>/reference/governance/sdlc/gates and <core>/src/rulesets/sdlc/artifact-registry.json, and findCorePath — after walking up for a gates tree and then for a corpus — falls back to the satellite itself. The phase-gates.rules.json fallback is never reached because the gate registry throws on the missing directory first.
GT-705 fixed exactly this for the MCP package (bundled both trees, one resolver: caller → EVOLITH_CORE_PATH → walk up → bundled corpus). The CLI package was not part of that change. sdlc gate-status has no --core at all (GT-461 sub-finding).
What closes it
Board row: GT-714 in gap-tracking.md · catalog: gap-reference-catalog.md#gt-714. Files: src/sdk/cli/package.json (files), src/sdk/cli/scripts/copy-rulesets.js, the validator above, check-install-smoke.mjs, .harness/scripts/generate-readme-demo.mjs.
🤖 Generated with Claude Code
What happens
On a satellite fresh from
init, with the published CLI and nothing else:phase advance --from discovery --to designfails the same way. With--core ../evolithpointing at a clone of this repository, both commands run and exit2with the real gate verdict (six missing Discovery artifacts). Measured 2026-09-20 in a cleannode:20container; the full run is indocs/evidence/phase-gate-capture.md.Why
The tarball ships
rulesets/sdlc/phase-gates.rules.jsonandrulesets/sdlc/artifact-registry.jsonat the package's own paths, but notreference/governance/sdlc/gates/gate-f1.json … gate-f5.json.PhaseGateValidatorService(src/packages/core-domain/src/application/validators/phase-gate-validator.service.ts) composes<core>/reference/governance/sdlc/gatesand<core>/src/rulesets/sdlc/artifact-registry.json, andfindCorePath— after walking up for a gates tree and then for a corpus — falls back to the satellite itself. Thephase-gates.rules.jsonfallback is never reached because the gate registry throws on the missing directory first.GT-705 fixed exactly this for the MCP package (bundled both trees, one resolver: caller →
EVOLITH_CORE_PATH→ walk up → bundled corpus). The CLI package was not part of that change.sdlc gate-statushas no--coreat all (GT-461 sub-finding).What closes it
PhaseGateValidatorServicefalls back to the bundled trees through the same resolver chain GT-705 built — no path composed off the satellite.sdlc gate-statusresolves the Core the same way.src/sdk/cli/scripts/check-install-smoke.mjsrunsgate evaluate --phase discoveryfrom the packed tarball in an empty directory and assertsexit 2with sixPG-1-EVIDENCE-*rows — observed red against the current package first.--core, and the caption sentence about the tarball goes away.Board row:
GT-714in gap-tracking.md · catalog: gap-reference-catalog.md#gt-714. Files:src/sdk/cli/package.json(files),src/sdk/cli/scripts/copy-rulesets.js, the validator above,check-install-smoke.mjs,.harness/scripts/generate-readme-demo.mjs.🤖 Generated with Claude Code