Skip to content

the rotation guard cannot see the bookmark's per-cycle prose, so 43 narration blocks accumulated unseen #2720

Closed

Description

@argszero

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

  1. argszero commented on Nov 5, 2026

    @argszero
    OwnerAuthor

    Handled by #2721

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions