Skip to Content

Working memory

A mesh accumulates two kinds of knowledge: what the graph says and what the people running it decided. The first is derived — gtmesh doctor, gtmesh topic status, gtmesh status and gtmesh next compute it fresh on every run. The second has to be written down, and where you write it decides whether a future session can still read it.

The five homes

Each file holds one lifecycle, and each has a budget it stays inside:

WhatWhereLifecycleBudget
Rules for this mesh, read every sessionOPERATOR.mdedited in place~200 lines
Settled decisions + hard-won learningsoperator/decisions.mdappended, newest first~400 lines
What happened in a sessionoperator/journal/YYYY-MM-DD.mdwritten once, read rarely~40 lines
The plan for one piece of workoperator/tasks/<slug>.mdkept after it lands
Work that’s planned but not starteda GitHub issue, or a task fileclosed when done

gtmesh init scaffolds all of them; gtmesh upgrade adds them to an existing mesh. They’re project-owned — yours to write in, never overwritten by an upgrade.

There is no status file. Anything a gtmesh verb can compute is left to the verb. Prose that restates the mesh’s state is stale as soon as the next command runs, and nothing tells you it went stale — that’s precisely how a single notes file grows past what a session can read.

The promotion test

Before writing anything down, ask in order:

  1. Can gtmesh doctor / topic status / status / the graph tell me this? → write nothing.
  2. Will it still be true in three months, and does it change how the operator works? → OPERATOR.md.
  3. Is it a decision or a learning, with a why, that a future session must not re-litigate? → operator/decisions.md.
  4. Will someone pick it up as work? → an issue (planned) or operator/tasks/<slug>.md (in flight).
  5. Otherwise it’s history → today’s operator/journal/YYYY-MM-DD.md.

Writing a decision

Keep entries short and prescriptive — state the action to take, hold Why to one line, and name a wrong path only where an agent would plausibly take it anyway:

### 2026-07-14 — Fold a demand cluster onto a source-less hub **Decision** — Mint the apex with `gtmesh page add --role hub`, then catalogue the cluster under it with `gtmesh topic fill`. **Why** — The demand rows carry no page of their own, so nothing has anything to hang from until the hub exists. **Consequence** — Owning a topic is two commands, and `topic status` reads *covered* immediately after.

A decision written as a list of things to avoid ages badly: the warnings outlive the context that made them make sense, and naming a wrong move plants it.

What goes in the journal

Git already holds the diff, so a day’s entry records what git can’t — what you chose and why, what you tried that failed, and a pointer to whatever carries the work on. One file per working day means an entry can never outgrow a read, and the directory sorts itself.

Coming from a NEXT-STEPS.md

Meshes scaffolded before this structure kept one root NEXT-STEPS.md. gtmesh doctor flags it, and the operator can split it for you in one pass — ask it to:

run the operator’s migrate-next-steps routine on this mesh

It inventories the file’s headings, classifies each by the promotion test, shows you the destination map for approval, writes the new homes, and removes NEXT-STEPS.md in a single commit. Nothing is moved without your sign-off.

Last updated on