Memory
The grammar, the five rules, and why deleting is the maintenance.
A staff member's memory is markdown in its own repository. There is no database, deliberately: an agent writes markdown well and writes to a schema badly.
The two files
memory/INDEX.md one line per fact. Read in full at every boot.
memory/notes/*.md the argument behind a fact. Read only when that fact is in play.That split is the whole design. Boot context here went from about 52,000 words to about 10,000 today by making it, and the saving repeats on every run forever.
The grammar
- **`<slug>`** · [<will|measured|derived>] <the fact, one line>. **So:** <what it changes>. · [note](notes/<slug>.md)roster lint enforces it, and the portal parses it. Provenance and the note link are optional.
The slug, the fact and the So: are not.
Provenance is one of three things: a human ruled it, it was measured, or it was derived.
A [measured] fact without an n fails lint, because a number without a sample size is a
rumour.
The five rules
- One line per fact. If it needs more, the extra goes in
notes/<slug>.mdand the line stays one line. - Correct in place. Never append "updated:". An update chain is how one fact becomes six paragraphs that contradict each other.
- Every fact says what it changes. If you cannot write the
So:, it is not memory. Do not add it. - Measurements carry
nand a date. Constraints do not expire; measurements do. Anything with areview:date is re-read or deleted on that date. - Deleting is the maintenance. Cut every line that no longer changes a decision, and log the cut. A memory that only grows is a memory nobody reads.
Rule 5 is the one that gets skipped and the one that matters. Everything else degrades slowly; this one degrades the boot cost of every future run.
Budgets
Prose is advice, and an index nobody prunes grows past what a run can usefully read. So
roster lint warns past three budgets:
| Budget | Default | Rule |
|---|---|---|
| One fact's line | 400 characters | too-long, naming the fact |
memory/INDEX.md |
24KB | index-too-big, naming the three longest facts |
log/decisions.md |
24KB | decisions-too-big: roll older entries into log/decisions/<YYYY-MM>.md |
Change them under memory: in org.yaml, or per staff member in
staff.yaml. The daily prompt tells a staff member to check its sizes at
hand-off and make pruning that run's job when it is over.
What does not go in memory
- Why something was decided. That is
log/decisions.md, and it is not boot context. - How a thing works. That is a draft or a strategy document.
- An idea not yet acted on. That is one line in
strategy/ideas.md, and it becomes an issue only when it needs a ruling. - What is outstanding. That is the pinned status issue.
Nothing is copied between them. Four places, four jobs, and a fact that appears in two of them will disagree with itself within a month.
Checking it
Health, per staff member, has a Memory problems section. Each finding has a button that opens an issue in that staff member's own repository asking them to fix it, which is usually the right move: they wrote it, and an issue on their tracker is a thing that wakes them.
It catches: a missing So:, a duplicate slug, a note nothing links to, a link to a note that
does not exist, an over-long line, a [measured] fact with no n, an "updated:" chain, and an
index or decision log over its budget.
The same checks, for a terminal or for CI:
roster lint # everyone
roster lint cto # one staff member