Emission owned by the state store: the log line is written by the same code path as the durable write, right after commit — a line exists iff the change hit disk, so the trail can't drift; callers pass the cause
Format: JSON lines with a fixed envelope (ts, agent, event, task_id, cause) plus per-event fields; dotted event taxonomy, names never reused
Correlation from day one: task_id minted at unit-of-work start and threaded through every event it causes
Diagnostic, never load-bearing: nothing derives state from logs — same rule that keeps Matrix history non-authoritative
Implementation plan once merged: a small StateStore retrofit PR (emit state.transition, intent.*, boot.reconcile, schema.migrate with a cause parameter threaded through the existing API), and the gate.* events land with the step-2 control-loop work.
Addresses #3 — this doc PR is the plan gate; implementation follows only after it merges.
Conventions added to A9, per our discussion:
- **Scope**: all durable mutations — transitions, intent begin/commit/abort, gate open/approve/reject, boot reconciliation, schema migrations
- **Emission owned by the state store**: the log line is written by the same code path as the durable write, right after commit — a line exists iff the change hit disk, so the trail can't drift; callers pass the `cause`
- **Format**: JSON lines with a fixed envelope (`ts`, `agent`, `event`, `task_id`, `cause`) plus per-event fields; dotted event taxonomy, names never reused
- **Correlation from day one**: `task_id` minted at unit-of-work start and threaded through every event it causes
- **Diagnostic, never load-bearing**: nothing derives state from logs — same rule that keeps Matrix history non-authoritative
Implementation plan once merged: a small StateStore retrofit PR (emit `state.transition`, `intent.*`, `boot.reconcile`, `schema.migrate` with a `cause` parameter threaded through the existing API), and the `gate.*` events land with the step-2 control-loop work.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Every durable mutation emits one JSON-lines event, emitted by the
state store itself immediately after the commit returns, with a fixed
envelope (ts, agent, event, task_id correlation ID, cause) and a
dotted event taxonomy covering transitions, intents, gates, boot
reconciliation, and migrations. Logs stay diagnostic-only, never
load-bearing.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Addresses #3 — this doc PR is the plan gate; implementation follows only after it merges.
Conventions added to A9, per our discussion:
causets,agent,event,task_id,cause) plus per-event fields; dotted event taxonomy, names never reusedtask_idminted at unit-of-work start and threaded through every event it causesImplementation plan once merged: a small StateStore retrofit PR (emit
state.transition,intent.*,boot.reconcile,schema.migratewith acauseparameter threaded through the existing API), and thegate.*events land with the step-2 control-loop work.🤖 Generated with Claude Code