Packages
relayburn@2.0.0(tag:relayburn-v2.0.0)@relayburn/sdk@2.0.0(tag:sdk-v2.0.0)@relayburn/mcp@2.0.0(tag:mcp-v2.0.0)@relayburn/cli-darwin-arm64@2.0.0(tag:cli-darwin-arm64-v2.0.0)@relayburn/cli-darwin-x64@2.0.0(tag:cli-darwin-x64-v2.0.0)@relayburn/cli-linux-arm64-gnu@2.0.0(tag:cli-linux-arm64-gnu-v2.0.0)@relayburn/cli-linux-x64-gnu@2.0.0(tag:cli-linux-x64-gnu-v2.0.0)@relayburn/sdk-darwin-arm64@2.0.0(tag:sdk-darwin-arm64-v2.0.0)@relayburn/sdk-darwin-x64@2.0.0(tag:sdk-darwin-x64-v2.0.0)@relayburn/sdk-linux-arm64-gnu@2.0.0(tag:sdk-linux-arm64-gnu-v2.0.0)@relayburn/sdk-linux-x64-gnu@2.0.0(tag:sdk-linux-x64-gnu-v2.0.0)
Release Notes
relayburn-sdk(Rust): default ledger home moves from~/.relayburnto~/.agentworkforce/burnso the Rust 2.0 port and the TS 1.x package can coexist on disk during the #249 cutover.RELAYBURN_HOME(and the per-DB path overrides) continue to override the path; TS 1.x users on~/.relayburnare unaffected. Rust-port testers with data under the old path canmv ~/.relayburn ~/.agentworkforce/burnto carry it over (formats are not compatible — Rust treats any non-2.0 layout as empty and requires aburn ingestre-population).relayburn-cli(Rust): wire opencodeHarnessAdapterviapending_stamp::adapter_staticfactory; registered inRUNTIME_ADAPTERS. (#248 D7)relayburn-cli(Rust): wireburn run <harness>driver + claude adapter (eager unit-struct inEAGER_ADAPTERS);afterExitingest folds into[burn] claude ingest: ...summary line. (#248 D5)relayburn-cli(Rust): wireburn ingest(no-flag scan,--watchpoll loop,--hook claude --quiet) andburn mcp-serverstdio subcommand exposingburn__sessionCost; closes #210. (#248 D8)relayburn-cli(Rust): wire codexHarnessAdapterviapending_stamp::adapter_staticfactory; registered inRUNTIME_ADAPTERS. (#248 D6)relayburn-cli(Rust): wireburn compareas a presenter overrelayburn_sdk::analyze::comparebuilding blocks (build_compare_table+ the per-turn fidelity gate), matching the TS CLI flag set (positional comma-separated model list,--include-partial/--fidelity/--since/--project/--session/--min-sample/--csv/--no-archive) and producing byte-equivalent stdout for the cli-goldencompare/compare-jsoninvocations. (#248 D3)relayburn-cli(Rust): portburn overheadandburn overhead trimas thin presenters overrelayburn_sdk::overhead/::overhead_trim. Output (human +--json) is byte-equivalent with the TS CLI. (#248 D2)relayburn-cli(Rust): wireburn stateas a typed clap subcommand withstatus(default),rebuild,prune, andresetverbs overrelayburn-sdk.state statusreports per-table row counts inburn.sqlite, the row count incontent.sqlite, thearchive_stateschema/last-built/last-rebuild fields, and the resolved retention config;--jsonemits the structuredStateStatuspayload.state rebuild {index,content,archive,all}drivesLedger::rebuild_derivable;state prunedrivesLedger::prune_content_older_than.state resetand standalonestate rebuild classifyare stubbed pending a follow-up. (#248 D4)relayburn-cli(Rust): wireburn summaryandburn hotspotsas thin presenters overrelayburn-sdk, matching the TS CLI's flag set and stdout byte-for-byte (default +--json). Un-ignores the four matching golden invocations. (#248 D1)relayburn-sdk-node(Rust): napi-rs bindings skeleton —#[napi]shims for every public verb inrelayburn-sdk(summary,sessionCost,overhead,overheadTrim,hotspots,search,exportLedger,exportStamps, asyncingest, plusledgerOpen), with u64 token counts surfaced as JSBigInt, ISO-8601 timestamps asString, async verbs returningPromise<T>, and a typedBurnErrormapping for SDK failures. (#247)relayburn-cli(Rust): introduce the harness substrate —HarnessAdaptertrait, lazy compile-timephfregistry (lookup/list_harness_names), and the sharedpending_stamp::adapterfactory codex + opencode will reuse. Adapter slots in the registry are reserved but empty pending the Wave 2 PRs (#248-d/e/f).relayburn-sdkre-exportsstart_watch_loop,WatchController,write_pending_stamp,PendingStampHarness, and friends so the CLI doesn't have to reach into private SDK modules. (#248)relayburn-cli(Rust): scaffold the clap v4 derive root with global--json/--ledger-path/--no-colorflags, eight stub subcommands (summary,hotspots,overhead,compare,run,state,ingest,mcp-server), and sharedrender::{table,json,error}helpers. Stubs exit1with anot yet implementedmessage (or a{"error": …}envelope under--json); Wave 2 fan-out PRs replace each stub with a thin presenter overrelayburn-sdk. (#248 part a)relayburn-cli(Rust): add the CLI golden-output test rig — synthetic fixture ledger undertests/fixtures/cli-golden/, a node script that captures TS-CLI stdout/stderr across 16 invocations (summary / hotspots / overhead / overhead-trim / compare / state-status in TTY +--json, plus help text for ingest / run / mcp-server / top-level), andcrates/relayburn-cli/tests/golden.rs— aBURN_GOLDEN=1-gated diff runner Wave 2 PRs flip on per-command viaenabled: trueininvocations.json. (#248)@relayburn/sdk(npm 2.x): scaffold thepackages/sdk-node/umbrella + four per-platform packages (@relayburn/sdk-{darwin-arm64,darwin-x64,linux-arm64-gnu,linux-x64-gnu}) resolved viaoptionalDependencies. Adds the napi-rs build matrix in.github/workflows/napi-build.yml, an esbuild bundle smoke test, and a deep-equal conformance test gate against the TS 1.x SDK across the six verbs (ingest,summary,sessionCost,overhead,overheadTrim,hotspots). Conformance test is skipped untilcrates/relayburn-sdk-nodelands its bindings (#247 part a). (#247 part b)relayburn-ingest(Rust): port the per-process gap-warning state machine (gapmodule —record_session_gap,emit_gap_warning,count_tool_call_gaps,reset_ingest_gap_warnings,set_ingest_gap_writer) andreingest_missing_content(reingestmodule). Suppression mirrors the TS surface: one warning per fresh affected session, silent on steady-state, re-fires after the affected set decays back to empty.relayburn-ledgeraddsLedger::list_user_turn_session_idsto power thereingest_missing_contentskip filter alongsidelist_content_session_ids. (#278)relayburn-analyze(Rust): port the behavioral-pattern detectors (patternsmodule).detect_patternsruns retry-loop, failure-run, cancellation-run, compaction-loss, edit-revert, OpenCode skill-recall-dup, OpenCode skill-pruning-protection, OpenCode system-prompt-tax, and edit-heavy detectors against an ordered turn stream, with optional content-sidecar / tool-result-event / user-turn enrichment. Public surface:detect_patterns,DetectPatternsOptions; per-pattern result structs are re-exported fromfindings(RetryLoop,FailureRun,CancellationRun,CompactionLoss,EditRevertCycle,SkillRecallDup,SkillPruningProtection,SystemPromptTax,EditHeavySession,SessionPatternSummary,PatternsResult,PatternEventSource). (#275)relayburn-analyze(Rust): port the tool-output-bloat detector — Signal A'sBASH_MAX_OUTPUT_LENGTHstatic-config check (with~/.claude/settings.json+<cwd>/.claude/settings.jsonloader) and Signal B's cross-harness observed-bloat aggregation, plus theWasteFindingadapter. Public surface mirrors@relayburn/analyze:BASH_MAX_OUTPUT_ENV_KEY,DEFAULT_BLOAT_TOKEN_THRESHOLD,detect_observed_bloat,detect_static_config_bloat,detect_tool_output_bloat,load_claude_settings,project_claude_settings_path,user_claude_settings_path,tool_output_bloat_to_finding. (#271)relayburn-ingest(Rust): port the standalone primitives —pending_stamps(binary-compatible with the TS@relayburn/ingestwire format),walk(walk_jsonl/walk_opencode_sessions),watch_loop(tokio::time::interval-drivenWatchControllerwith graceful stop), and the typedcursorsmodule layered on the SQLite ledger's cursor blob. Public verb surface (ingest_all, per-harness verbs,reingest_missing_content) is wired; per-harness orchestration follow-ups deferred to dedicated sub-issues. (#245)relayburn-analyze(Rust): port the ghost-surface detector —ghost_surfaceandghost_surface_inputsmodules with Claude / Codex / OpenCode adapters, slash-command miners, the per-source-scoped orchestrator, and theWasteFindingenvelope adapter. Findings sort deterministically by(cost desc, sizeTokens desc, path)and dedup against the OpenCode catalog-bloat detector viacountedByCatalogBloat. (#273)relayburn-analyze(Rust): port thecompareaggregator —build_compare_tablefor the in-memory(model, activity)rollup with per-cell turn / edit / one-shot / priced / cost / cache-hit / median-retries metrics, pluscompare_from_archivesourced from the SQLite ledger viaLedger::query_turns. Public surface:CompareCell,CompareTable,CompareTotals,CompareOptions,CompareCategory,DEFAULT_MIN_SAMPLE,compare_from_archive,CompareFromArchiveResult. (#269)relayburn-analyze(Rust): portsubagent_treeandclaude_mdmodules.build_subagent_tree/aggregate_subagent_type_statswalk per-session subagent invocations (relationship-row substrate with legacysubagentfallback) and roll up self/cumulative cost.parse_claude_md/attribute_claude_md/build_trim_recommendations/render_unified_diff_for_recommendationproduce CLAUDE.md section attribution and trim diffs whose unified-diff format stays byte-aligned with the TS implementation. (#272)relayburn-analyze(Rust): port thehotspotsaggregator —attribute_hotspotscomposes the per-tool sized / even-split attribution loop (paying-turn rate, sibling-cap on initial cost, proportional cacheRead allocation on persistence, source-aware reasoning viacost_for_turn) with theaggregate_by_file/aggregate_by_bash/aggregate_by_bash_verb/aggregate_by_subagentrollups. Public surface mirrors@relayburn/analyze:attribute_hotspots,aggregate_by_file,aggregate_by_bash,aggregate_by_bash_verb,aggregate_by_subagent,AttributionMethod,BashAggregation,BashVerbAggregation,FileAggregation,HotspotsOptions,HotspotsResult,SessionTotals,SubagentAggregation,ToolAttribution. Per-row USD totals match the TS implementation within 1e-9. (#274)
Package Changelogs
relayburn
Changed
relayburnnow prefers the prebuilt Rustburnbinary from per-platform@relayburn/cli-<platform>packages, with@relayburn/clikept as a fallback for unsupported or missing native packages.
@relayburn/sdk
- Initial scaffolding: umbrella package layout (
@relayburn/sdk) +
per-platform packages (@relayburn/sdk-{darwin-arm64,darwin-x64,linux-arm64-gnu,linux-x64-gnu})
resolved viaoptionalDependencies, TS facade re-exporting the napi-rs
binding, conformance scaffold against the TS 1.x SDK, esbuild bundle
smoke test. (#247 part b) - Shape conformance with TS
@relayburn/sdk@1.x:Ledger.open()returns
aPromise<Ledger>instance,sessionCost()emitstotalUSD
(screaming USD), every read verb isasync(Promise<T>),
IngestOptionsis{ sessionId, harness, ledgerHome },topand
minSampleaccept plainnumber, andonLogcallbacks are accepted
on every read verb's options (silently dropped at the napi boundary
until the SDK wires fallback logging). Addssearch,exportLedger,
exportStamps,BurnErrorCode,OverheadFileKind, and
HotspotsGroupByas 2.x extensions over the 1.x surface. (#247 part c) - Umbrella facade now coerces napi-rs
BigIntreturn values toNumber
for safe-range integers ([Number.MIN_SAFE_INTEGER, Number.MAX_SAFE_INTEGER]), matching the TS 1.x runtime shape; values
outside that range stayBigIntto avoid silent precision loss. - Conformance suite is now wired into CI:
napi buildwrites its outputs
(.node,binding.cjs,binding.d.ts) intosrc/so the generated
loader's local-file branch resolves; the suite seeds a deterministic
ledger viatests/fixtures/cli-golden/scripts/build-ledger.mjsand
flipsRELAYBURN_SDK_NAPI_BUILT=1to enable thedeepStrictEqualgate
against TS@relayburn/sdk@1.x. (#247 part d)
@relayburn/mcp
Changed
- Drop
@relayburn/{reader, ledger, analyze}from MCP entirely;@relayburn/sdkis now the only@relayburn/*package edge.