Generated projections and their freshness gates

This page holds the roster of docs surfaces that are generated and byte-gated for freshness, each with its trigger and its gate.

Several docs surfaces are generated and byte-gated for freshness; each gate’s red output names its own regen command, so the command need not stay resident to be recoverable. A projection’s trigger is its gate’s trigger= (else couples=) and never a row’s prose. bash gate-sdk/bin/run-gates.sh --for <path> answers it for any path; --projection-witness, the projection_witness validate suite, holds it to what the gate reads.

  • The on-site SPEC mirror (docs/<dir>/SPEC.md, docs/<dir>/README.md, docs/doctrine-kit/DOCTRINE.md, for every top-level directory holding a SPEC.md — the kits, installer/ and companion/), with every resolvable section citation in a SPEC or the doctrine rendered as a link (canon-kit/SPEC.md §The reference-link grammar): bash gate-sdk/bin/run-gates.sh --emit docs-mirror --write (check-docs-mirror-fresh byte-gates it).
  • The value rollup — docs/value.md is hand-framed prose around one generated marker block that joins the enforcement-map’s per-kit class counts to the footprint’s per-kit token cost: bash gate-sdk/bin/run-gates.sh --emit value-rollup --write (check-value-rollup-fresh byte-gates the block, the byte-fresh projection of the same arm without --write). The join reads the two emitters live, never the committed detail pages, so a stale page cannot poison the rollup; it reads them as structured values rather than rendered markdown, so the class taxonomy and the per-kit figures arrive as data and no heading or table row is ever re-parsed. The enforcement page owns the taxonomy. Its section order is the hardest-to-softest column order; the cost columns are the footprint’s per-kit token figure alone, its ~<t>t, and an absent tier an em dash; the totals row reuses the footprint’s pre-summed totals rather than re-summing them; the kit axis follows the footprint roster, then any enforcement-only label (a surface under no kit) groups as (consumer). This is a consumer docs ruling. The join axis and column choice live here, never in a kit. docs/value.md holds the nav slot, while docs/enforcement.md and docs/footprint.md are its nav children, its drill-down pages.
  • The enforcement map — docs/enforcement.md is the class registry’s projection, moved by a class-registry change rather than by a content edit. check-enforcement-fresh byte-compares it (bash gate-sdk/bin/run-gates.sh --emit enforcement-map > docs/enforcement.md). Its sibling docs/footprint.md is the per-kit token cost (bash gate-sdk/bin/run-gates.sh --emit footprint > docs/footprint.md, the emitter having ported to a non-gate arm the runner resolves config for). Its measured set is narrower than “any kit file”, and that misreading is the standing mistake here: context-kit/SPEC.md §bin/footprint owns the set, which holds injected blocks and templates/ markdown and no SPEC body or script. It reads the worktree rather than the index, so no staging order binds its regen. Both are docs/value.md’s inputs, so a red in either implies a rollup regen.
  • The trajectory projection — docs/evidence-data.md is the published evidence extractor’s output (bash gate-sdk/bin/run-gates.sh --emit trajectory > docs/evidence-data.md, check-trajectory-fresh byte-gates it). The gate is declared by scripts/check-trajectory-fresh.gate, whose # graph: manifest couples the page to the harvested state files; since the harvest reads real git history, its good/+bad/ pair supplies a synthetic emission as a second argument. Regen commit: drift-kit/SPEC.md §The published-evidence extractor. The name collides and the two surfaces are unrelated: check-trajectory-fresh and the trajectory arm govern this generated page, never the hand-authored TRAJECTORY.md ruling record, which no gate byte-checks.
  • The install-evidence projection — docs/install-evidence.md is the install-evidence arm’s output (bash gate-sdk/bin/run-gates.sh --emit install-evidence > docs/install-evidence.md, check-install-evidence-fresh byte-gates it); scripts/gates.list is the classifier the per-gate block sorts a red’s gate name against (drift-kit/SPEC.md §The install-evidence projection). Its gate is inert everywhere but the observing machine, by construction: the record is gitignored, so in CI, in a fresh clone and in an adopter’s tree there is nothing to re-emit from and the gate reports a counted zero. For the same reason its good/+bad/ pair supplies a synthetic emission as a second argument, the trajectory gate’s shape. The page is committed carrying published zeros from the first build rather than held back until an install exists, so the freshness gate has a target and the roster row above it names a file that is there.
  • The roadmap projection — ROADMAP.md is a root projection of the queue’s curated [roadmap:] tags (bash gate-sdk/bin/run-gates.sh --emit roadmap --write, check-roadmap-fresh byte-gates its marker block). Never hand-edited, and never regenerated by the whole-file redirect the trajectory projection takes: the arm emits only the block, so a redirect destroys the prose above it.
  • The product statement — scripts/product-statement.conf is the one statement of what Checkwright is. bash gate-sdk/bin/run-gates.sh --emit product-statement --write renders it into five sites. README.md’s and docs/index.md’s product-statement blocks take the markdown rendering. The plain rendering goes to the description field of docs/_config.yml (every page’s default meta description), of installer/package.json (npm’s listing, at the next release) and of reserve/crates/Cargo.toml. check-product-statement-fresh holds all five. The repository’s GitHub About is the sixth copy and is out of a gate’s reach. It is set by hand, after the account-selection step in OPS.local.md. The site-health workflow’s About arm compares it daily with installer/package.json’s description and files the site-health issue on a difference.
    • The source holds two keys in the key value… grammar, category and summary, each exactly once and no other. A value may carry *…* emphasis and no other markdown. A backtick, a bracket, an angle bracket, a pipe or a control character is refused, so the plain rendering loses nothing.
    • The renderings. Markdown is **<category>** <summary>, written between the <!-- product-statement:begin --> and <!-- product-statement:end --> lines with a blank line inside each marker. Plain is <category> <summary> with every * dropped, written as the field’s double-quoted string with " and \ escaped. A site’s extension selects its rendering. --write rewrites each site’s block or field and touches nothing else, and it writes no site until every site has placed its own.
    • The gate compares in process with the arm’s rendering, one finding per stale site. It exits 2 on an unreadable source or site, on a missing, repeated or unknown key, or on a refused character. It also exits 2 when a site’s block or field is absent or occurs twice. Its positional form is check-product-statement-fresh [source site…].
    • Out of reach. npm’s description trails the tree until the next publish, and crates.io carries the reservation’s until it is republished, so no arm compares either.
  • The toolkit support table — docs/spec-toolkits.md’s marker block, one row per check proven in companion/fixtures/ or listed in companion/native.list, one column per companion/toolkits.list line: bash gate-sdk/bin/run-gates.sh --emit support-table --write (check-support-table-fresh byte-gates it; companion/SPEC.md §The support table owns the rows).
  • The graph artifact — docs/check-graph.html, held fresh by one gate. Kit config sits in that gate’s couples= because a knob edit moves the graph artifact’s triggers (gate-sdk/SPEC.md §check-graph). Regenerate it with bash gate-sdk/bin/run-gates.sh --emit graph > docs/check-graph.html. The git hooks are no projection: --install-hooks places them untracked in the clone (gate-sdk/SPEC.md §install-hooks).
  • The agent-definition tiers — each .claude/agents/*.md model: line, and its effort: line where the class binds one, is generated from its tier: and DELEGATION_KIT_TIER_MODEL: bash gate-sdk/bin/run-gates.sh --emit agent-tiers --write (check-agent-tier-explicit assertion B byte-gates it).