nanoclaw

Identity

  • Names: dev.nanoclaw; short alias nanoclaw.
  • Native format: nanoclaw-session-sqlite, central data/v2.db and data/v2-sessions/<agent_group_id>/<id>/{inbound.db,outbound.db}. Host and container own different IO stores.
  • Session ID: sessions.id, no namespace. Group directories are locators, not session or subagent identities.
  • Notes: Inbound/outbound roles are display roles, not model authorship or proof of a prompt. Keep model content absent. Source-session fields can identify agent-origin messages; scheduled task kinds identify harness injection. Operation/edit/reaction payloads do not prove successful execution. These stores lack model/tool/usage/cost evidence. Questions identify association, not consumption; remove marked secret answers from every projection. Missing stores and unavailable backing transcripts need declared losses.

Position basis

  • Entity keys and order: messages_in.id and messages_out.id identify messages. Serialize inbound then outbound, each by seq,id, then catalog/state snapshots. Even/odd allocation prevents collisions but does not establish common chronology. All mutable IO projections use snapshot assembly; the first outbound context predecessor is unknown.
Use only positions established by the stated format and mapping evidence. Current-state rows without transcript positions form the snapshot tail. A protocol commit boundary takes precedence over physical EOF; uncommitted bytes are not a gap.

Destinations

nanoclaw: native facts without a standard field

  • Links: messages_in.source_session_id supplies an originating session. Channel-scoped content.senderId or content.author.userId can identify participants. Catalog messaging_group_id joins messaging_groups.id only when route channel_type/platform_id matches. Only chat-SDK content.id supplies platform message identity. delivered.message_out_id joins messages_out.id; platform_message_id supplies the delivery ID. Outgoing ask_question.questionId joins inbound content.questionId only when unambiguous.
  • Backing sessions and lineage: session_state key continuation:claude or continuation:codex names the backing native session/thread for executedBy. Legacy sdk_session_id alone does not identify its provider. Neither binding proves whole-stream mirror authority. No parent, child, copy or root follows from group membership.

Usage

Select one report per native accounting identity only when this entry establishes that identity. Keep unjoinable or overlapping reports as native evidence. Declare incomplete semantic coverage. Schema defaults and placeholder zeros are not reported usage. Rules for what a backend includes in its usage counts require evidence; do not infer them from a model name.

Lane and unassigned facts

Facts without established session ownership use manifest _meta["dev.nanoclaw/unassigned"] with the common shape. Selection 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. For omitted unassigned facts, use a documented vendor loss or report; do not create a new core category.

Evidence

Basis: source-verified: nanocoai/nanoclaw 2.2.0, commit f0d35831d38c6c566295d07505809b7c37337e56. Native catalog, migration and IO probes use synthetic content and make no model calls. Container writers used an in-memory substitute for testing; disk locking and mounts are not qualified. Evidence applies only to the named formats and explicit mappings above. A real capture covers only exercised behavior. A no-model writer probe covers persistence, not model or tool execution. Authored tests do not qualify an agent version. Unlisted formats and link mappings remain unqualified.