openhands

Identity

  • Names: openhands / dev.all-hands.openhands.
  • Native format: openhands-events, immutable events/event-<ordinal>-<id>.json and rewritten base_state.json. Legacy event trees have no semantic qualification here.
  • Session ID: base_state.id, otherwise the SDK’s native conversation directory key. Current SDK UUIDs need no namespace. Legacy local-ID scope is unqualified.
  • Entity keys: Event id; tool_call.id and tool_call_id; llm_response_id identifies a model response. Duplicate event IDs prevent unique tree resolution. MessageEvent.sender is an actor address, not a child SessionRef.
  • Compaction: Condensation.forgotten_event_ids names individual entries and all their context projections. SDK summary_event supplies <condensation-id>-summary for prior summaries. summary_offset indexes the post-forgetting LLMConvertible view, including system prompts; translate it to an available context boundary. Missing targets mean unknown extent, not invented IDs.
  • Notes: Structured observations remain raw when tool-specific to_llm_content was not persisted. Keep numeric signals raw. SystemPromptEvent supplies instructions. Known hook_event_type values map hook events; pause/interrupt does not prove termination. State stats.usage_to_metrics.<bucket>.token_usages[].response_id joins one inference; latency uses response_latencies[].response_id. Duplicate ledger copies stay native, and unkeyed costs[] never join by position. Metrics.model_name is requested configuration. Accumulated counters are session summaries with unknown child inclusion. Omit secret_registry from every retained representation.

Position basis

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

openhands: native facts without a standard field

  • Tree and links: SDK 1.42.1 EventLog._effective_parent_id treats missing/null parent_id as the previous event and __root__ as START. Resolve audit-only ancestors to their context projections. llm_response_id, or an unambiguous call-ID join, groups responses. base_state.leaf_event_id supplies the head in a tail snapshot. No inter-session parent, subagent, copy or root rule is qualified.

Usage

Select unique response_id token reports from stats.usage_to_metrics and update the matching inference once. Duplicate reports across buckets stay native. Costs without response IDs remain aggregate native evidence; neither array position nor equal values join them. Declare incomplete coverage where the selected reports omit 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.all-hands.openhands/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: OpenHands SDK 1.42.1, commit 98338ff37aea6627777b9978963ab727f51e4f40; native no-model ConversationState/EventLog capture and authored semantic fixtures. The capture covers persistence, not live tools or inference. 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.

Observations from 2026-10-27

observed, version CLI 1.16.0; SDK 1.21.0: OpenHands CLI 1.16.0 with SDK 1.21.0 retained two headless sessions with file and shell tools. This evidence applies to SDK conversation events. It does not qualify legacy conversation layouts or condensation. Preserve native event objects in native.record or native.blob. The ctx conversion produced 2 streams and 56 records, with 0 errors, 2 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 to a provider metadata destination. These runs add no evidence for approvals, lineage links, compaction boundaries or exact request context that they did not exercise.