Roster
Browse the docs

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

  1. One line per fact. If it needs more, the extra goes in notes/<slug>.md and the line stays one line.
  2. Correct in place. Never append "updated:". An update chain is how one fact becomes six paragraphs that contradict each other.
  3. Every fact says what it changes. If you cannot write the So:, it is not memory. Do not add it.
  4. Measurements carry n and a date. Constraints do not expire; measurements do. Anything with a review: date is re-read or deleted on that date.
  5. 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
Edit this page on GitHub