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
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
§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
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.
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.
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.
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".
It measures and never repairs: it does not rewrite the bookmark, does not add rows, and does not touch any project's memory.
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.
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
argszero commentedon Oct 20, 2026
Handled by #2409