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:
parentRunIdpoints at the run of the agent that started it, the tagtrack=subagentmarks it, and the config keysubagent.spawnToolUseIdis the id of the spawning tool call, which is also theidof thattool_callevent in the parent run. The parent’s files hold the main loop only; itsllm_callmetadata 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-sdk1.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’smodelUsageexactly (verified live through agent-client). The call’s reported cost stays on the parent (costIncludesSubagents=true); a sub-agent run has cost 0 withcostAvailable=false. Verified with CLI 2.1.292 andclaude-code-sdk1.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
CodexRolloutstoCodexSessionParser.parse; the single-fileparseis 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, headlesscodex exec, non-forked children at depth 1; rollouts from 0.147.0 parse - Recording an execution once.
RunRecorder.recordOnceandCodexRunRecorder.recordOncerecord 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.recordPhaseis unchanged and unguarded - Cost of a later prompt in a multi-prompt Claude Code session. Claude Code reports
total_cost_usd,modelUsageandduration_api_msas the session’s running total.SessionLogParser.withSessionBaseline(current, previous)returns a capture carrying the query’s own delta, keeps the running total insessionCost(), and recordscostBasis=session_delta. The caller applies it;parseis unchanged - Values that change meaning (schema version stays 1; the header line of
events.jsonlandanalysis.jsonlnow carriesproducerandproducerVersion, and a header withoutproducerVersionwas written by 1.10.1 or earlier): a Claude CodeRunRecorderclosed withoutfinish()recordsCRASHEDinstead ofFINISHED; 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 inturnsandturnIndex; onestep_costper tool call plus one per message without a tool call; CodexinputTokensexcludes cached input (subtractcacheReadTokensfrom an older value); Grok, Codex and Junietool_call.durationMsis -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.jsonhastags.track == "subagent", and only those. Do not exclude onparentRunIdalone - 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-sdkstays at 1.7.0 andgemini-cli-sdkat 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 resumeandapp-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-sdk1.5.1 → 1.7.0 forclaude-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) andgemini-cli-sdk0.29.2 → 0.30.0 forgemini-cli-capture - No source change and no schema change;
journal-coreand 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:JunieSessionParserparses Junie’s durable session trace (both the plain-CLI and the Agent Client Protocol shapes),JuniePhaseCapture,JunieRunRecorder,JunieToolUseRecord/JunieToolClassifier,JunieStopReasonsandJunieModelCost/JunieJournalStepsfollow the pattern of the other adapters - No existing module changed;
journal-coreand 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,StepCostEventand the trace’sstep_costline. Extended-thinking tokens are read from the wire (usage.output_tokens_details.thinking_tokens) instead of estimated from character counts - A vendor-neutral
StopReasonenum (NATURAL_DONE,TOOL_USE,MAX_TURNS,MAX_TOKENS,REFUSAL,ERROR,CANCELLED,UNKNOWN) withisTruncatedRun(), andmaxTurnsrecorded 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-captureandantigravity-cli-capture, turn each CLI’s durable JSONL stream into orderedToolCallEventandStepCostEventrecords with stable tool-call identities - Grok capture parses the ACP-shaped
streaming-jsonoutput, pairingtool_callandtool_call_updatebytoolCallIdand 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 fromend.total_cost_usdis retained and attributed evenly across captured tool steps - Codex capture parses durable rollout JSONL and deliberately classifies the nested
payload.inputcall rather than the outerexecfunction name that Codex records for most tool invocations, assigning semantic names such asSearch,Read,Inspect,Test,Build, andGit. The classifier is conservative around shell syntax: aliases, shell functions, quoted operators, and work hidden behind an interpreter fall back toShell, with raw input and command retained for later reclassification - Antigravity capture pairs active and terminal updates by
step_index, handles bothDONEandERRORsteps, 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=falsewith anunreportedsource - 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-coreand 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 includesresources/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
cyclonedxclassifier. - Capture-module POMs now declare their actual Java 21 runtime requirement;
journal-coreremains 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-loudRunRecorder,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 onevents.jsonlandanalysis.jsonl(loaders skip it) - Cost-metering fix: headline
LLMCallEvent.tokenUsageis now the cost-bearing Σ-per-turn-by-type aggregate (incl. cache) instead of the last-ResultMessagesnapshot, 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-sdkdependency and imports to itsio.github.markpollackcoordinates
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.