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 aSPEC.md— the kits,installer/andcompanion/), 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-freshbyte-gates it). - The value rollup —
docs/value.mdis 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-freshbyte-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.mdholds the nav slot, whiledocs/enforcement.mdanddocs/footprint.mdare its nav children, its drill-down pages. - The enforcement map —
docs/enforcement.mdis the class registry’s projection, moved by a class-registry change rather than by a content edit.check-enforcement-freshbyte-compares it (bash gate-sdk/bin/run-gates.sh --emit enforcement-map > docs/enforcement.md). Its siblingdocs/footprint.mdis 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 andtemplates/markdown and no SPEC body or script. It reads the worktree rather than the index, so no staging order binds its regen. Both aredocs/value.md’s inputs, so a red in either implies a rollup regen. - The trajectory projection —
docs/evidence-data.mdis the published evidence extractor’s output (bash gate-sdk/bin/run-gates.sh --emit trajectory > docs/evidence-data.md,check-trajectory-freshbyte-gates it). The gate is declared byscripts/check-trajectory-fresh.gate, whose# graph:manifest couples the page to the harvested state files; since the harvest reads real git history, itsgood/+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-freshand thetrajectoryarm govern this generated page, never the hand-authoredTRAJECTORY.mdruling record, which no gate byte-checks. - The install-evidence projection —
docs/install-evidence.mdis the install-evidence arm’s output (bash gate-sdk/bin/run-gates.sh --emit install-evidence > docs/install-evidence.md,check-install-evidence-freshbyte-gates it);scripts/gates.listis 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 itsgood/+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.mdis a root projection of the queue’s curated[roadmap:]tags (bash gate-sdk/bin/run-gates.sh --emit roadmap --write,check-roadmap-freshbyte-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.confis the one statement of what Checkwright is.bash gate-sdk/bin/run-gates.sh --emit product-statement --writerenders it into five sites. README.md’s and docs/index.md’sproduct-statementblocks take the markdown rendering. The plain rendering goes to thedescriptionfield ofdocs/_config.yml(every page’s default meta description), ofinstaller/package.json(npm’s listing, at the next release) and ofreserve/crates/Cargo.toml.check-product-statement-freshholds 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 inOPS.local.md. Thesite-healthworkflow’s About arm compares it daily withinstaller/package.json’s description and files the site-health issue on a difference.- The source holds two keys in the
key value…grammar,categoryandsummary, 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.--writerewrites 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 source holds two keys in the
- The toolkit support table —
docs/spec-toolkits.md’s marker block, one row per check proven incompanion/fixtures/or listed incompanion/native.list, one column percompanion/toolkits.listline:bash gate-sdk/bin/run-gates.sh --emit support-table --write(check-support-table-freshbyte-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’scouples=because a knob edit moves the graph artifact’s triggers (gate-sdk/SPEC.md §check-graph). Regenerate it withbash gate-sdk/bin/run-gates.sh --emit graph > docs/check-graph.html. The git hooks are no projection:--install-hooksplaces them untracked in the clone (gate-sdk/SPEC.md §install-hooks). - The agent-definition tiers — each
.claude/agents/*.mdmodel:line, and itseffort:line where the class binds one, is generated from itstier:andDELEGATION_KIT_TIER_MODEL:bash gate-sdk/bin/run-gates.sh --emit agent-tiers --write(check-agent-tier-explicitassertion B byte-gates it).