[0.22.0] - 2026-04-26
Added
- Claude parser emits
forkandcontinuationSessionRelationshipRecordrows (#112). Closes the deferred-work item from #77/#42: the Claude passive reader now populates the fullRelationshipTypelattice instead of onlyroot/subagent. Per-file evidence — in-logsessionIdmismatches against the on-disk filename, the first user line'sparentUuid, the first non-emptyversionfield, all in-file uuids, and/resume//continueslash-command markers — is collected during the existing parse pass and surfaced as a newevidence: ClaudeRelationshipEvidencefield onParseResult/ParseIncrementalResult. A/resumemarker emits a localcontinuationrow withrelatedSessionIdset to the resumed-from id; a new exportedreconcileClaudeSessionRelationships(inputs)helper takes per-file evidence from a multi-file pass and emits the cross-filefork/continuationrows that single-file parsers can't surface. Existingroot/subagentrows are stamped withsourceSessionId(foreign in-log id) andsourceVersionwhenever the file carries them. Reconciliation strategy is append, not mutate: a priorrootrow and a latercontinuation/forkrow for the same session id produce differentrelationshipIdHashvalues, so both rows coexist on disk and consumers prefer the more specific row when both are present. Re-ingesting a session is idempotent — the writer's existing dedup folds duplicates. NewParseOptions.fileSessionIdlets callers pin the canonical session id explicitly; when omitted butsessionPathis set, the parser derives it from the.jsonlbasename. - Codex parser populates
TurnRecord.fidelity(#84).parseCodexSessionandparseCodexSessionIncrementalnow stampfidelityon every emitted turn atgranularity: 'per-turn', mirroring the Claude parser. Coverage flags follow the rollout source:hasInputTokens/hasOutputTokens/hasReasoningTokens/hasCacheReadTokensflip totrueonly when atoken_countevent withtotal_token_usagearrived betweentask_startedandtask_complete; turns whose source omitted token counts now reportclass: 'partial'(the numericusagefields still default to 0, but the coverage flag is the honest signal).hasToolCalls/hasToolResultEvents/hasRawContentare capability flags — true even on tool-less turns.hasCacheCreateTokensandhasSessionRelationshipsstayfalse(Codex rollouts have no cache-create or parent-tracking concept yet — the latter waits on #42 / #63). Closes theunknown === 0requirement from #41 for Codex sessions. - OpenCode parser populates
TurnRecord.fidelity(#89, follow-up to #41 / #76).parseOpencodeSessionandparseOpencodeSessionIncrementalnow stampfidelityon every emitted turn atgranularity: 'per-turn'. Usage coverage flags (hasInputTokens,hasOutputTokens,hasReasoningTokens,hasCacheReadTokens,hasCacheCreateTokens) reflect presence on the upstreamtokensblock — folded across both the assistant message and anystep-finishparts that carry tokens — so a turn that never received cache fields reportshasCacheReadTokens: falseinstead of silently renderingcacheRead === 0. Capability flags (hasToolCalls,hasToolResultEvents,hasSessionRelationships,hasRawContent) are always true. Closes the "0 vs unknown" ambiguity for OpenCode insummarizeFidelityandhasMinimumFidelity.