Story: Make the local checks faster
Table of Contents
This page documents a story in Sprint 27. It captures the goal, current status, acceptance criteria, and the tasks that compose it.
1. Goal
The local gate stops spending most of its time on work the branch did not touch, so it is cheap enough to run per change. The measurements and the four proposed changes are in the captures filed with this story: the two drift checks at 436s of the 785s non-heavy total, the site page check at 115-900s, the corpus that fifteen checks each re-parse, and the serial heavy tier.
2. Status
| Field | Value |
|---|---|
| State | DONE |
| Parent sprint | Sprint 27 |
| Now | Nothing. |
| Waiting on | Nothing. |
| Next | Nothing. |
| Last touched | 2026-10-13 |
3. Acceptance
- A one-component branch runs the non-heavy checks well under half the present time.
4. Tasks
| Task | State | Start | End | Description |
|---|---|---|---|---|
| Scaffold story: Make the local checks faster | DONE | 2026-10-13 | 2026-10-13 | Story scaffolding rides this task: documents, sprint wiring, and the scaffold PR. Close it before merging that PR. |
| Publish only the changed site pages | DONE | 2026-10-13 | Initial task for: Make the local checks faster | |
| Scope the drift check to the models a branch changed | DONE | 2026-10-13 | component-drift regenerates all 21 registry components on every branch, 239.9s of the 785s non-heavy total, even when the branch changed one component's models. | |
| Scope the drift sweep to the components a branch changed | DONE | 2026-10-13 | drift-sweep renders all 23 catalogue components into a temporary root on every branch, 195.9s of the 785s non-heavy total, though only the components whose models changed can produce the files the sweep judges. |
5. Decisions
- Render only what the branch changed, in both drift checks. The gate measures a branch's own changes; pre-existing drift in an untouched component belongs to that component's clean-up, which the hourly validation covers. Both checks select on the modeling directory and render the whole corpus when the change reaches the generator, a template or the registry, or changes no model at all.
- Publish only the pages the branch changed. The mtime rule republished the
corpus on a fresh checkout, because a checkout gives every source a new
mtime. The org-id map is still rebuilt every run: skipping it behind
--no-indexturned a stale map into a false failure on the first link to a page added since the last scan. - The non-heavy total falls from 785s to roughly 255s on a one-component
branch:
component-drift239.9s to ~11s,drift-sweep195.9s to ~1s andsite-page114.9s to ~8s. A cold site cache no longer times out at 900s.
6. Out of scope
- The long tail and the heavy tier, left as captures: the corpus that fifteen checks each re-parse (The local checks each parse the model corpus in their own process) and the suites the heavy checks run serially (The heavy checks run their suites serially and recreate the database unconditionally).
7. Result
The acceptance holds: the three biggest checks now measure the branch instead of the tree, so a one-component branch runs the non-heavy checks in about a third of the former time.