Skip to content

emrg: the §1.5 step-0 rotation reading has no command, so each cycle hand-writes it — and name-keyed probes have reported 12 changed projects where 2 were #2408

Closed

Description

@argszero

What is missing

§1.5 of the evolution prompt makes every cycle answer one question before it reads anything: which registered projects' memory moved since that project's bookmark, and what is the newest file. Step 0 is the step that is never skipped. Nothing in this repository performs that reading today: scripts/check-memory-index.py measures an index against the two numbers of the index rule, and no script reads ~/.emrg/projects.yml together with the bookmark at all.

So every cycle hand-writes the probe, in a bash heredoc, and it has been wrong in a way that reads as a clean answer twice:

  • A probe keyed by projects.yml's name field cannot resolve every bookmark row. The bookmark keys rows by what disambiguates them, and two of this host's 31 rows are written as paths (gitlab/shaoaq/aitokenpool, gitlab/shaoaq/mem) because two projects are both named aitokenpool. A name-keyed probe reported 12 of 31 projects as "changed or unvisited" in this cycle's first pass, of which 10 were artefacts of the keying: the rows were there, keyed another way. The bookmark's own note says so — "A reader that keys rows by bare name reports the GitLab one as 'no bookmark' every cycle".
  • The shell comparison is the second trap, and it fails silently in one direction. find <dir> -newermt '<stamp>' parses a space-separated stamp and answers 0 files for the T form — so a probe that writes the ISO form reports "nothing changed" for every project, for ever. The bookmark carries that measurement as a rule for the same reason.

A hand-written probe also cannot say the thing that decides the reading: whether every registered project has a row at all, and whether every row belongs to a project. Without that, a project can drop out of the rotation for ever and no cycle would notice.

What a fix must satisfy

  1. One command answers step 0 for every registered project, and prints the subject it read (the projects.yml, the bookmark, the number of projects and rows) before any verdict — the convention every guard in this repository follows.
  2. It resolves all three key forms the bookmark uses, not one: a bare project name; a name with a parenthetical disambiguator (aitokenpool (github), resolved by matching the hint against the project's path); and a path-suffix key (gitlab/shaoaq/mem, resolved against the project's trailing path segments). A row it cannot resolve is a finding, not a silent skip.
  3. A project with no row is reported as never visited (it is read, per §1.5), and a row matching no project is reported as an orphan. Both are exit 1, because both are a fault in the coverage the bookmark exists to guarantee.
  4. The time comparison is made in the tool, between an os.stat mtime and the parsed stamp — never by handing the stamp to find. A stamp that does not parse (%Y-%m-%d %H:%M:%S) is unmeasurable, exit 2, never "nothing changed".
  5. It measures and never repairs: it does not rewrite the bookmark, does not add rows, and does not touch any project's memory.
  6. A tree that carries no projects.yml or no bookmark answers exit 2 with the reason named — a reading that could not be taken is not a clean reading.
  7. Tests cover both states of each boundary, built from the constants rather than from literals: a file one second after the stamp is changed and a file at the stamp is not; a path that exists but carries no memory root; a path that is gone; the three key forms; an unparseable stamp; and the two exit-1 coverage faults.

Activity

  1. argszero commented on Oct 20, 2026

    @argszero
    OwnerAuthor

    Handled by #2409

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