| name | capture |
| description | Write a faithful, append-only minute for an AI session — intent, decisions, changed files, open threads, and a transcript pointer. Use when filing a session into a bureau workspace (e.g. via bureau:file-session), or when the user asks to record/minute the current session. |
Capture — session → minute
A minute is the faithful, low-authority record of one session: what was attempted,
what was decided, what changed, what's still open. It is the raw material the canon is later
compiled from, and the provenance every cabinet claim points back to. It is append-only —
write this session's entry; never edit another session's.
Where it goes
<workspace>/logbook/<YYYY>/<MM>/<safe-session-id>.md (workspace name from bureau.json,
default bureau). Sanitize the session id first — keep only [A-Za-z0-9_-], drop
everything else (no /, no ..); fall back to unknown if empty. The raw session id is
untrusted and must never reach a filesystem path. If a mechanical SessionEnd stub already
exists at that path, enrich it in place: re-emit a clean frontmatter block (preserve
meaning, not the stub's raw bytes), then replace the body.
Entry schema
Frontmatter is the press's SIMPLE parser — it does NOT strip quotes and does NOT do YAML
escaping. So titles are unquoted, every rendered value is a single safe line, and no value
contains ", a newline, or [ ] |. The one exception is transcript: — a bureau-internal
field consumed by bureau (not rendered as a clean value by the press), stored as a
JSON-escaped string so an arbitrary path is safe.
---
title: session <safe-session-id> · <YYYY-MM-DD>
updated: <YYYY-MM-DD>
status: logbook
session: <safe-session-id>
transcript: "<transcript path, JSON-escaped if present, else empty>"
---
## [<ISO-8601>] session <id8> — <one-line summary>
**Intent.** What this session set out to do (1–2 sentences).
**Decisions.**
- <decision> — implies dossier **<Page name>** (link with `[[Page]]` only if it already exists)
**Changes.**
- <path or artifact> (new | updated | removed) — <why>
**Open threads.**
- <unresolved question / next step>
**Source.** transcript `<path>`
Rules
- Faithful over polished. Record what actually happened, including dead ends and
reversals — the logbook is history, not a press release.
- Decisions name their target — but don't ship dangling links. Name the dossier a
decision implies. Use a
[[link]] ONLY if that page already exists; otherwise write the
page name as plain text. bureau:compile creates the page and wires the provenance later.
- No canon writes. Capture NEVER edits dossiers. Distillation into the SSOT is a
separate, deliberate step (
bureau:compile).
- Safe, unique title. Use the FULL sanitized session id in the title —
session <safe-session-id> · <date> — so two sessions whose ids share a prefix can't
collide into a duplicate title (the press rejects duplicate titles). Unquoted, free of
" / [ ] |. The <id8> short form is fine inside the body heading, not the title.
- One session, one file. Don't merge sessions; don't rewrite earlier entries.
What this is NOT
Not a summary of the codebase, not a to-do list, not the truth. It is the minutes of one
meeting. Truth is adjudicated later, in the cabinets, under consistency checks.
Examples
Context: A working session is wrapping up; the agent has full context.
user: "bureau:file-session"
assistant: "Filing this session. Logbook entry at logbook/2026/06/.md — Intent: harden the capture script; Decisions: drop git from the hook (implies dossier **Capture design**); Changes: scripts/capture-stub.mjs; Open: none. I named the dossier in plain text since it doesn't exist yet — compile will create and link it."
The rich entry is written in-session where context is live; a not-yet-existing target is plain text, not a dangling [[link]].
Context: The SessionEnd hook already wrote a mechanical stub for this session.
user: "Record what we did this session into the logbook."
assistant: "A stub exists for this session, so I'll enrich it in place — re-deriving a clean sanitized frontmatter block and replacing the body with the full Intent/Decisions/Changes/Open entry."
Enrichment preserves meaning, not the stub's raw bytes; other sessions' entries are never touched.
Scope note
This skill covers ONLY the logbook-capture protocol — turning one session into one faithful,
append-only minute. It does not distil entries into dossiers (that is
bureau:compile), does not render or open the gazette (that is bureau:inspect), and does
not check consistency (that is bureau:lint).
Consumed by:
- the
bureau:file-session command (writes the rich entry interactively, in-session);
- the
SessionEnd hook → scripts/capture-stub.mjs (writes the mechanical stub this skill
later enriches).