crush
Identity
-
Names:
crush/sh.charm.crush. -
Native format:
crush-sqlite, sessions, messages, file versions and read-file state. -
Session ID:
sessions.id, no namespace. -
File history: The pinned writer records full versions, including external changes and preimages. Each version is a checkpoint. Successive integer
files.versionvalues for onesession_idandpathsupport exact net changes between those checkpoint IDs. The first version alone is not an addition. No tool cause or actor is inferred. Absolute paths use checkpoint PathRef objects withroot: null. -
Notes:
is_summary_messageidentifies compaction with unknown replaced extent. Messagemodel,providerand finish fields do not independently prove inference. Read transcript bycreated_at,rowid, file history by path/version/id, then current state. Messagecreated_atis milliseconds and is not copied to every embedded operation. Title, usage, cost and todos are snapshots.
Position basis
Use only positions established by the stated format and mapping evidence. Current-state rows without transcript positions form the snapshot tail, after all records with transcript positions. A protocol commit boundary takes precedence over physical EOF; uncommitted bytes are not a gap.
Destinations
crush: native facts without a standard field
Links
-
Entity keys and links: Unique
messages.idsupplies message identity. Native partdata.ididentifies a call; resultdata.tool_call_idjoins it only when unique.data.is_errorcontrols outcome.mcp_<server>_<tool>is a composite name, not exact provider identity. -
Lineage:
sessions.parent_session_idsupplies onlyrelatedUnknown. No child scope, fork, copy or root claim follows.
Usage
Select one report per native accounting identity only when this entry establishes that identity. Keep reports that cannot be joined to an accounting identity, or that overlap, as native evidence. Declare any incomplete semantic coverage. Schema defaults and placeholder zeros are not reported usage. Backend inclusion rules require evidence; do not infer them from a model name.Lane and unassigned facts
Facts without established session ownership use manifest_meta["sh.charm.crush/unassigned"] with the common shape. An export may retain these facts with any session subset, including an empty subset, but must not imply session ownership. State the selection policy in the export report.
Losses
Declare every applicable loss under ASR-157. Missing model rendering, accounting joins, lineage or exact context boundaries remain losses when this entry does not qualify them. Unknown ownership is not itself lost data. Use a documented vendor loss or report for omitted unassigned facts; do not create a new core category.Evidence
Basis: source-verified atcharmbracelet/crush commit ed15da4c46e0bdc3afae4842db54e7def7b9f15e (message, history/file.go, edit/write tools). Existing database and authored fixtures; no fresh native release capture. No package version is established.
Evidence applies only to the named formats and explicit mappings above. A real capture covers only the behavior that was exercised. A writer probe run without a model covers persistence, not model or tool execution. Authored tests do not qualify an agent version. Unlisted formats and link mappings remain unqualified.
Observations from 2026-10-27
observed, version 0.98.2: Crush 0.98.2 retained edit, shell-test, resume, review and child sessions in SQLite. Preserve complete row and part JSON in native.record or native.blob, not rowJson or partJson metadata. Ambiguous invocation IDs stay in tool_result.nativeCallId. Serialization bookkeeping belongs to the converter.
The ctx conversion produced 3 streams and 70 records, with 0 errors, 0 notices, 0 gaps and 0 unidentified inputs under validator-v0.1.2. These counts describe the selected output; an empty bundle qualifies no source format. No sanitized native fixture was retained for this observation.
Whole native records use native.record or native.blob, with JSON text columns preserved as strings. The exporter’s own bookkeeping for serialization, partitioning and message keys belongs in the exporter namespace (rs.ctx for ctx), not in a provider metadata destination. These runs add no evidence for unexercised approvals, lineage links, compaction boundaries or exact request context.