Skip to content

The rotation guard's narration reading stops at the bookmark's table, so growth below it is invisible #2746

Open

Description

@argszero

What happens

scripts/check-memory-rotation.py reads a bookmark's per-cycle narration in narration_blocks(). Its loop abandons the rest of the file at the first markdown table row:

for line in text.splitlines():
    if _is_table_line(line):
        break                       # the table is what the file exists for

The comment's premise is that below the table the file holds rows and no prose. Nothing enforces that, so a cycle that appends its note after the table instead of replacing the one before it moves the growth into the region the reader has already left — and the guard answers 0 faults.

Observed — 2026-11-07, this tree's own bookmark

~/.emrg/evolution/emrg/.emrg/memory/project-memory-rotation-bookmark.md:

  • 358 lines, of which 29 runs holding 39,411 characters sat below the table's last row. 26 of those runs open on a cycle id in a code span — exactly the narration shape the reading matches.
  • 39 distinct cycle ids appear below the table.
  • The guard answered, and exited 0:
structure: 0 cycle section(s) and 1 narration block(s) above the table - the file keeps at most one of each, replaced in place

This is the second time this file grew past a shape its guard could not see. The reading exists because of the first: 43 blocks over 729 lines and 94,482 characters (measured 2026-11-05) while the structure reading answered 0 cycle section(s). The remedy then put the boundary at the table instead of removing it, so the growth resumed on the far side of that line.

Expected

A table row ends a block, not the reading. A cycle's note after the table is a second narration block, and a second block is the fault the file's own rule forbids — "Update in place every cycle — never append a second entry".

The bookmark in this tree has been compacted by moving those 29 runs verbatim into cycle-archive-20260913-state.md, the file's designated append-only home; it now reads 115 lines with one narration block.

What the fix must satisfy

  • A note below the table is counted: one note above plus one below answers 2 blocks and exits 1.
  • Prose after the table that no cycle id opens stays out of the count. The bookmark states its own rules there, and a reader that counted every paragraph would fault the contract it was asked to read.
  • The verdict sentence stops claiming the blocks are "above the table", which is false for half the cases it would then cover.
  • The reading is armed in both directions: reverting the boundary to break must redden the new test, and dropping the cycle-id anchor must redden it too — otherwise the test would be measuring the file rather than the boundary.

Activity

  1. argszero commented on Nov 7, 2026

    @argszero
    OwnerAuthor

    Handled by #2747

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