benchbook
↑↓ navigate↵ openDocs · Wiki · Contract
GitHub
DocsIn practiceLogs

Logs

Logs

One chronological, append-only file recording what happened to the wiki and when.

It looks trivial and it carries a surprising amount of weight, because it answers a question nothing else does: what was I doing, and when? Indexes tell you what exists. Pages tell you what’s true. Only the log tells you the shape of the last three months.


Format

## [YYYY-MM-DD] <op> | Subject

One to three lines. Roughly forty words maximum.

Newest entries append at the bottom. Five valid operations, and no others:

OpWhen
ingestExternal material was processed into the wiki
createA page was created
lintA maintenance pass ran
queryA significant question was answered
skillA skill was run

The consistent prefix is deliberate — it makes the log parseable with ordinary shell tools:

grep "^## \[" log.md | tail -10

Ten seconds, no tooling, and you know what’s been happening. That property is worth protecting; it’s why the format is rigid.


Why query belongs here

Four of the five operations change files, so git already records them. query doesn’t — you asked something, got an answer, and nothing on disk changed.

That makes queries the one class of event git genuinely cannot reconstruct, and therefore the one with the strongest claim on a log entry. A question you needed answered is real information about what you were working on.

It also pairs with a habit worth building: if a query produced a substantial answer, file it as a page. Otherwise you’ll ask it again in four months, pay for it again, and possibly get a different answer.


What does not go here

This is the part that took a failure to learn, and it’s the most transferable thing in this document.

There is deliberately no update operation.

update existed originally. It was the escape hatch: anything not clearly one of the other four became an update. An audit found 17 of 26 recent entries were update, averaging 139 words against a 1–3 line spec — and most duplicated text already written onto a project page in the same session. The log was growing roughly ten times faster than intended and had stopped being fast to skim, which was its only job.

Removing the operation forced every one of those events somewhere better:

The eventWhere it belongsWhy not the log
Project progress, decisions, build narrativethat project’s own ## Log sectionyou’d look for it on the project page, not by date
Infrastructure or entity state changethat entity’s ## Change Historythe entity page is the single source for its own state

The resulting heuristic, which generalises well beyond this system:

If an event seems to need a long log entry, that’s the signal it belongs on a page instead — with at most a one-line pointer from the log.


Three logs, not one

Worth being explicit, because the naming collides:

LogScopeOrder
The global logWiki-structural eventsNewest at bottom
A project’s ## LogThat project’s progress and decisionsNewest at bottom
An entity’s ## Change HistoryThat thing’s state changesNewest at top

The ordering inconsistency is intentional. The global log and project logs are read as timelines, front to back. A change history is read top-down to answer “what changed most recently,” so the newest entry goes where your eye lands first.


Archival

When the global log passes a length threshold, the oldest entries move to a dated archive file until it’s back under a working size. Entries are never deleted — only relocated.

This is one of exactly two write operations the lint pass is permitted to perform, and like the other one it only moves things. See 11 — Keeping It Honest.


Next: 09 — Projects.