Skip to main content

1.11.0 (2026-10-07)

  • Sub-agents as runs of their own, for Claude Code and Codex. A sub-agent is recorded as a linked run in the same experiment: parentRunId points at the run of the agent that started it, the tag track=subagent marks it, and the config key subagent.spawnToolUseId is the id of the spawning tool call, which is also the id of that tool_call event in the parent run. The parent’s files hold the main loop only; its llm_call metadata lists the sub-agent runs (subagents) and the spawns for which no record arrived (subagentsWithoutTrack). No record type gained a field and no enum gained a value
  • Claude Code: sub-agent messages arrive on the CLI’s own stream marked with parent_tool_use_id. Complete capture needs the CLI started with --forward-subagent-text (CLIOptions.forwardSubagentText, claude-code-sdk 1.6.0 and later); without it a sub-agent’s prompt, tool calls, results and tool-turn usage are captured but not its text, thinking, or text-only turns and their usage. With the flag, input and cache tokens over the parent and its sub-agent runs equal the call’s modelUsage exactly (verified live through agent-client). The call’s reported cost stays on the parent (costIncludesSubagents=true); a sub-agent run has cost 0 with costAvailable=false. Verified with CLI 2.1.292 and claude-code-sdk 1.7.0 to depth 2
  • Codex: a sub-agent is its own thread and rollout file. The caller collects the root and child rollouts (agent-client’s harvester does) and passes them as CodexRollouts to CodexSessionParser.parse; the single-file parse is unchanged. Codex writes no thread-terminal status, so a child’s status is the last observed turn outcome (subagent.statusMeaning=last_observed_turn). No cost for any thread; each run’s tokens are its own file’s. Verified with CLI 0.160.1, headless codex exec, non-forked children at depth 1; rollouts from 0.147.0 parse
  • Recording an execution once. RunRecorder.recordOnce and CodexRunRecorder.recordOnce record an execution at most once per experiment and storage root: the run carries the execution’s key (capture.sourceKind, capture.sourceKey), the recorder checks stored run records before writing, so the guard holds across a restart. The same source again writes nothing and returns the earlier run; an earlier recording that has not ended, or ended with an error, fails explicitly. recordPhase is unchanged and unguarded
  • Cost of a later prompt in a multi-prompt Claude Code session. Claude Code reports total_cost_usd, modelUsage and duration_api_ms as the session’s running total. SessionLogParser.withSessionBaseline(current, previous) returns a capture carrying the query’s own delta, keeps the running total in sessionCost(), and records costBasis=session_delta. The caller applies it; parse is unchanged
  • Values that change meaning (schema version stays 1; the header line of events.jsonl and analysis.jsonl now carries producer and producerVersion, and a header without producerVersion was written by 1.10.1 or earlier): a Claude Code RunRecorder closed without finish() records CRASHED instead of FINISHED; Claude Code input and cache tokens are counted once per message instead of once per stream line; output tokens come from the result message; one turn per message in turns and turnIndex; one step_cost per tool call plus one per message without a tool call; Codex inputTokens excludes cached input (subtract cacheReadTokens from an older value); Grok, Codex and Junie tool_call.durationMs is -1 when not measured
  • Run lifecycle and readers. Only finish() records a completed Claude Code recorder run; the recorder ends the run before throwing a lost-derived-events error. A file with a newer schema version than the reader knows is refused with an error naming both versions. TokenUsage.total() no longer adds thinking tokens on top of output tokens; cacheHitRatio() is cache reads over input plus cache reads; effectiveInputTokens() is deprecated
  • Reading the files from another language: exclude run directories whose run.json has tags.track == "subagent", and only those. Do not exclude on parentRunId alone
  • Dependencies. Jackson 2.22.2 → 2.22.3 and, on Claude capture’s transitive Jackson 3 path, 3.2.2 → 3.2.3, clearing CVE-2026-89407, CVE-2026-89425, CVE-2026-91776 and CVE-2026-91777 (1.10.1 pins the affected versions). claude-code-sdk stays at 1.7.0 and gemini-cli-sdk at 0.30.0. Published module POMs now inline the licence and project metadata. 675 tests pass
  • Not captured: sub-agents of Junie, Antigravity, Grok and Gemini; Codex exec resume and app-server; Claude Code transcript-file import; permission decisions; Codex reasoning text; a per-sub-agent cost. See the sub-agent capture guide and the release notes

1.10.1 (2026-09-17)

  • Maintenance release aligning the capture adapters with the SDK releases AgentWorks BOM 1.21.0 manages: claude-code-sdk 1.5.1 → 1.7.0 for claude-code-capture (1.7.0 destroys the Claude CLI process tree before closing its streams, so a cancelled run no longer leaves the CLI alive) and gemini-cli-sdk 0.29.2 → 0.30.0 for gemini-cli-capture
  • No source change and no schema change; journal-core and every capture record are unchanged from 1.10.0. Each artifact carries its consumer-rooted CycloneDX SBOM as a signed attachment. 523 tests pass

1.10.0 (2026-08-27)

  • One new module, junie-cli-capture, records trajectories from the Junie CLI: JunieSessionParser parses Junie’s durable session trace (both the plain-CLI and the Agent Client Protocol shapes), JuniePhaseCapture, JunieRunRecorder, JunieToolUseRecord / JunieToolClassifier, JunieStopReasons and JunieModelCost / JunieJournalSteps follow the pattern of the other adapters
  • No existing module changed; journal-core and the five existing capture adapters are unchanged from 1.9.0

1.9.0 (2026-08-25)

  • Closes four capture gaps where a value the provider already reported was discarded at parse time. All changes are additive; every extended record keeps a back-compatible constructor
  • Per-step records now carry the full five-field token vector (input, output, thinking, cache creation, cache read) on JournalStep, StepCostEvent and the trace’s step_cost line. Extended-thinking tokens are read from the wire (usage.output_tokens_details.thinking_tokens) instead of estimated from character counts
  • A vendor-neutral StopReason enum (NATURAL_DONE, TOOL_USE, MAX_TURNS, MAX_TOKENS, REFUSAL, ERROR, CANCELLED, UNKNOWN) with isTruncatedRun(), and maxTurns recorded alongside it, so a run cut off at its turn limit can be told from one that finished
  • See the 1.9.0 release notes for the full list

1.8.0 (2026-08-22)

  • Three new tool-trajectory capture adapters, grok-cli-capture, codex-cli-capture and antigravity-cli-capture, turn each CLI’s durable JSONL stream into ordered ToolCallEvent and StepCostEvent records with stable tool-call identities
  • Grok capture parses the ACP-shaped streaming-json output, pairing tool_call and tool_call_update by toolCallId and preserving both the reported tool name and the ACP semantic kind. The stream has no durable turn-to-tool cost join, so the real session total from end.total_cost_usd is retained and attributed evenly across captured tool steps
  • Codex capture parses durable rollout JSONL and deliberately classifies the nested payload.input call rather than the outer exec function name that Codex records for most tool invocations, assigning semantic names such as Search, Read, Inspect, Test, Build, and Git. The classifier is conservative around shell syntax: aliases, shell functions, quoted operators, and work hidden behind an interpreter fall back to Shell, with raw input and command retained for later reclassification
  • Antigravity capture pairs active and terminal updates by step_index, handles both DONE and ERROR steps, records parameters, output or error text, duration, and terminal token usage, and derives stable identities from conversation and step positions
  • Codex and Antigravity report no monetary cost in these streams, so cost records are zero-valued and explicitly marked costAvailable=false with an unreported source
  • Gemini CLI capture remains turn-level and provides no tool trajectory, so Gemini is not part of this release’s multi-CLI tool-trajectory claim
  • The Claude Code SDK dependency moves from 1.4.0 to 1.5.0
  • Additive on the existing event and trace contracts. journal-core and the three new capture modules target Java 17; the Claude Code and Gemini CLI capture modules still require Java 21 for their vendor SDKs. 488 tests pass across the seven-module reactor

1.7.0 (2026-08-18)

  • Standalone consumers now resolve CVE-clear Jackson floors without an external BOM: Jackson 2.21.6 for all three modules and Jackson 3.1.6 on Claude capture’s transitive Jackson 3 path. Agent Journal’s source and stored formats continue to use Jackson 2; this is not a Jackson 3 migration.
  • Every binary and source JAR now includes META-INF/LICENSE, and every Javadoc JAR includes resources/LICENSE. The BSL 1.1 terms are unchanged.
  • The parent artifact publishes an aggregate CycloneDX 1.6 JSON SBOM for all three modules under the cyclonedx classifier.
  • Capture-module POMs now declare their actual Java 21 runtime requirement; journal-core remains Java 17.
  • Snapshot publishing now runs the full test suite, and shared build/release workflows are pinned to an immutable commit.
  • No API, event-schema, or trace-format change: both journal streams remain schema version 1 and portable traces remain schema version 2. All 482 tests pass.

1.6.0 (2026-07-01)

  • First-class journal-capture primitives (slice 1): PhaseCapture.stepCosts(), JournalSteps.fromEvents(), production fail-loud RunRecorder, JournalStorage.persistsDerivedEvents(), per-turn usage in the immutable log
  • A1: AttributionMethod.EVEN_SPLIT, a coarse fallback when per-turn tokens are unavailable
  • A5: per-file {"@type":"header","schemaVersion":1} line on events.jsonl and analysis.jsonl (loaders skip it)
  • Cost-metering fix: headline LLMCallEvent.tokenUsage is now the cost-bearing Σ-per-turn-by-type aggregate (incl. cache) instead of the last-ResultMessage snapshot, which under-counted ~2× on long runs; same field, corrected value, no schema change
  • Designed as an additive change to the capture contract; 482 tests green. No cross-version reader test was run. Ships in agentworks-bom 1.13.0

1.5.0 (2026-06-17)

  • docs: fix TraceContentMode import path (moved to journal.trace in capture-fidelity R2)
  • R2.10 emission: wire StepCostEvent into analysis.jsonl from capture
  • Stage R2.9: Implement computeJudgeAgreement (judge<->human calibration)
  • Stage R2.6: Per-step goal/outcome channel (StepOutcomeEvent)
  • Stage R2.10: DerivedEvent hierarchy + StepCostEvent + analysis.jsonl sidecar
  • Stage R2.8: First-class Gemini capture (gemini-cli-capture module)
  • Stage R2.7: Move portable TraceWriter into journal-core
  • Stage R2.5a: Delineate sub-agent spawns (interiors are out-of-stream)
  • Stage R2.4: Emit derived step_cost lines into the trace (epic gate)
  • Stage R2.3b: Per-step cost attribution + JournalStep
  • Stage R2.3a: Stable step identity for events (fixes subjectId fragility)
  • Stage R2.2: Per-turn usage capture (TurnUsage + ModelCost from rawJson)
  • Stage R2.1: Consume rawJson: verbatim raw trace line (rawMode=NONE|FULL)
  • Stage R2.0: Bump claude-code-sdk to 1.4.0 (unblocks rawJson consumption)
  • CI: enforce OWASP CVE gate via reusable security-scan workflow
  • Add OWASP dependency-check CVE gate (-Powasp) + Trivy security-scan script
  • docs: version pins to 1.4.0

1.4.0 (2026-06-06)

  • Fix CI: build on Java 21 to match claude-code-sdk artifact class version
  • Steps 1.1-1.2: TraceWriter v2 content capture with TraceContentMode

1.3.0 (2026-06-04)

  • Include tool inputs in TraceWriter JSONL and escape control characters

1.2.0 (2026-05-19)

  • Add feedback event type, eval subjects, and feedback service

1.1.0 (2026-05-15)

  • Update claude-code-sdk dependency to released 1.1.0
  • Skip tests on snapshot publish; CI handles test validation
  • Update the claude-code-sdk dependency and imports to its io.github.markpollack coordinates

1.0.1 (2026-04-30)

  • Bump version to 1.0.1-SNAPSHOT
  • Open JournalEvent to external implementations; add registerEventType API
  • Update README: released version 0.9.0
  • Fix release workflow: add contents write permission for git tagging

0.9.0 (2026-03-29)

  • Initial release.