You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
the rotation guard cannot see the bookmark's per-cycle prose, so 43 narration blocks accumulated unseen #2720
The rotation guard reports the bookmark's structure and cannot see most of what grows there, so the file it guards reached 729 lines and 94,482 characters while the guard printed structure: 0 cycle section(s) above the table and exited 0.
What is measured today
scripts/check-memory-rotation.py reads the bookmark (§1.5 step 0) and reports, among other things, a structure reading: cycle_sections() collects lines matching ^##\s+Cycle\b, and structure_faults() reports a fault when there are two or more. That reading is right about what it measures, and it was built for a real incident (eight ## Cycle sections over 359 lines).
What it does not measure
The same file accumulates a second kind of growth, which carries no heading at all: a prose paragraph per cycle, each opening with that cycle's id in a code span, e.g.
`cyc20261028-164545` read **`aitokenpool`** — the least recently read of this cycle's changed set …
Measured while preparing this issue: the bookmark held 43 such blocks, from cyc20261027-213412 to cyc20261103-172124, above its table — 729 lines and 94,482 characters for a file whose contract is one line per registered project. Every one of them was invisible to the structure reading, because none is a ## Cycle heading.
Why it matters
The file states its own rule: one line per project, updated in place, never appended. A cycle that edits the bookmark reads the prose above the table, and 94 KB of per-cycle narration is paid on every such edit while nothing reads it back. The guard's green is the reason it went unnoticed: the measurement said the file's structure was the contract's.
What must hold for this to be finished
The guard counts the prose blocks above the table that open with a cycle id in a code span, and reports more than one as a structure fault — in the same fault list the section reading already uses, so the rows are still measured and the exit code is 1, never 2.
One such block, or none, is not a fault: a minimal bookmark and a bookmark carrying its current cycle's note are both the contract's shape.
Contract prose is not narration, and a cycle id mentioned mid-sentence inside a prose block does not make that block narration — only a block whose first line opens with the code span does.
A test pins both directions on fixtures, and reddens when the check is removed.
The host-side counterpart is the guard command itself: uv run --no-sync python3 scripts/check-memory-rotation.py.
Activity
argszero commentedon Nov 5, 2026
Handled by #2721