CI
The battery (gistory#14 mount spec)
One job, four independent legs, any of which can land first:
- run: npm ci # hermetic, exact-pinned devDeps
- run: npm test # the node:test spine
- run: npm run check # lint + packs + packstruct --deep
- run: npx crashtest run # baseline-gated adversarial lane (labs/crashledger.json)
Both lanes are deterministic end to end: fixed seeds, fixed batches, committed baselines. A fork cannot walk the seed.
The docs lane (.github/workflows/docs.yml)
npx jekyll build # ruby/jekyll half
npx --yes [email protected] --strict # post-render SEO layer, fails closed
npx pagefind --site dist # index LAST, over the final injected html
The engine refuses an SSG source tree (point it at the built output, not the checkout), unknown flags fail loudly (v1.1.0 contract), and pagefind indexes over the freestruct-injected html, never the bare build.
Ferry receipts (the mount’s own tree)
monoforge-staging rides gistory’s monoforge-ferry.yml: fetch the
sha-gated lock archive, converge a delta, self-test the unpacked tool
(node test/run.mjs - the stamp/doctor/lock-refusal battery), gate the
re-derived overlay with a second fresh unpack, and no-op commit when main
already carries the converged tree. Run the same four receipts locally
before pushing a UI or template change; the ferry lanes are the mount’s
smoke test.