Skip to content

Releases: AngelVRodC/tare

the failure detective

Choose a tag to compare

@AngelVRodC AngelVRodC released this 20 Sep 14:35

Two questions were missing from a cost meter: what keeps breaking, and is what I configured even loadable. v0.5.0 answers both from the same transcripts and config files — no network, nothing leaves the machine, zero dependencies.

tare failures streams the Claude Code corpus once and detects three patterns no existing command shows: a retry loop (≥3 consecutive is_error results on an identical tool+payload within one session), the same call erroring across ≥2 sessions, and error/failure rollups per attributed skill / plugin / MCP server. The denial partition holds exactly as in corruption (denied + failures == errors); a denial still feeds the patterns — a denied call cost the turn it sits in. Payload identity is a key-sorted digest under UseNumber, so two calls are the same only when their input truly is.

tare doctor checks the configuration the harness loads, for both harnesses, via the tools two-adapter precedent: one command: "doctor" JSON contract, one renderer, no interface, no registry. Static passes: SKILL.md frontmatter (missing/unterminated block, name-vs-directory mismatch, missing description, malformed allowed-tools), plugin manifests (claude-only — the OpenCode run omits the block with a warning, because absence is not health), and MCP config from every source the harnesses actually read, including ~/.claude.json user and project scopes; project wins collisions, and the collision is warned. command_not_found resolves against this process's PATH and says so in the same breath. The join that gives the command its point: configured-but-never-observed servers (a floor, not a verdict — the window may simply predate them) and observed-but-unconfigured names (a name-based join miss; on OpenCode the denominator is tool_sessions, since the schema cannot separate an MCP call from a built-in).

The tare skill (1.2.0) closes the loop the CLI deliberately leaves open: detect → attribute → propose. Root-cause judgment stays with the driving agent — tare names no third-party tool and fixes no harness; the user authorizes both.

Everything older stands: the five prior commands, both report gates (TestReportReproducible, TestReportMarkdownVariesOnlyByTimestamp), bufio.Reader streaming, and absent-is-not-zero. go build, go vet, gofmt, go test ./... green at the tag.

192 tests, zero dependencies, stdlib only.

the honest ruler

Choose a tag to compare

@AngelVRodC AngelVRodC released this 08 Sep 04:04

Five measured defects fixed — every one found by weighing the corpus, not by reading release notes.

The headline: attachment bytes now measure the attachment, not the envelope. v0.3.0 counted each attachment record's whole JSONL line — uuid, timestamps, cwd, even a duplicated rendered field. Measured over 25,888 attachment events: 1.44× aggregate inflation, 30.5% of what tare reported was record envelope, not context. Worst type: output_style at 12.9×. v0.4.0 measures the attachment object's own payload. On the same corpus the total drops from 92.9 MB to 64.4 MB.

Also fixed:

  • skill_listing per-skill keys — the parser cut bullets at the first colon, so plugin-namespaced skills (desplega:brainstorm, frontend:*, …) never matched and their bytes landed on the plain-named skill above them. 60% of skill-listing bytes sat on the wrong key (sdd-verify reported 5.17 MB; truth: 21.7 kB). Now matched by longest prefix against the declared names.
  • Cache-read cost — the 0.1× weight was a constant, but Claude Fable 5.1 / Mythos 5.1 price cache reads at 0.025×. Session-model dollar totals stay pinned to the measured bill; only the intra-session split was wrong, 4× over-weighting cache reads on the 3rd-most-common model in the corpus.
  • instructions attachments (the CLAUDE.md/AGENTS.md chain — the largest keyed-opportunity attachment type) now attribute per file path under a new instruction_file dimension.
  • deferred_tools_record — the initial full tool catalogue — now attributes by entries[].name under mcp_tool, closing the asymmetry with its _delta sibling.

Meaning shift, said out loud: every attachment share printed before this release was measured in the inflated unit. They are superseded, not diffable. The README's example report is regenerated with v0.4.0: attachments measure 64.4 MB / 19.3% of the corpus where v0.3.0's ruler said 24.8%.

Bonus: this release's research also checked Anthropic's "~100 tokens per Skill" claim against measured corpus data. It holds — median ~60 estimated tokens per skill per listing (p90 ~72), whole listing ~7.5k tokens, re-injections 1.1% of listing bytes. Analysis in thoughts/angel/research/2026-09-07-skill-token-claim-check.md.

190 tests, zero dependencies, stdlib only. TestReportReproducible, TestValidateRejects and TestReportMarkdownVariesOnlyByTimestamp all green.

the plugin byte rollup

Choose a tag to compare

@AngelVRodC AngelVRodC released this 07 Sep 23:36

tare tools now answers the question issue #10 asked: how much context a plugin returns, not just which server. Plus the schema/money/window work from #12, which was merged after v0.2.0 but never released.

tools: plugin byte rollup (#13, fixes #10)

  • New plugin dimension in the tools envelope: per-plugin byte volume, recovered from mcp__plugin_<plugin>_<server>__<tool> names that mcpServer already parses — no dependence on the absent attributionPlugin field (#7). Bytes only; tokens/dollars per plugin remain unavailable until that field exists.
  • Plugin names resolve against enabledPlugins in ~/.claude/settings.json (user scope only): <plugin>@<marketplace> entries are stripped to the plugin name, and disabled plugins still count as name authorities — the list is a name authority, not an enabled filter.
  • plugin_<plugin>_<server> splits by longest-first match (the same rule the OpenCode adapter documents), so plugin names containing _ resolve correctly.
  • Names the authority cannot resolve aggregate into one plugin (unresolved) row with a single warning. An absent or malformed settings file omits the dimension and warns — never a zero row.
  • No new flags; the plugin table is never truncated; existing tool/mcp_server rows and schema_version are unchanged.

schema_version, microdollars, window (#12)

  • schema_version on the envelope; all money as integer microdollars instead of floats.
  • Lexical --since/--until window flags with loud validation; events filtered through the window with corpus-wide joins and warnings.

Fixes since v0.2.0

  • fix(transcript): stop counting Workflow journals as transcripts; key the journal classifier on type.
  • fix(attribute): an absent attribution field is reported as unmeasured, not zero.
  • fix(corruption): policy denials split out of the error count.

Verification

  • 176 tests green, gofmt clean, go vet clean, still zero dependencies.
  • Envelope minus the new dimension is byte-identical to the v0.2.0-era baseline on a frozen corpus; tools --json is byte-identical across runs.
  • Full trail in the SDD artifacts for plugin-byte-rollup (explore → proposal → design → spec → tasks → apply → verify → archive).

v0.2.0 — the portable skill

Choose a tag to compare

@AngelVRodC AngelVRodC released this 07 Sep 15:42

tare reads the agent transcripts already sitting on your disk and reports what
your installed tooling actually costs you in context: per-tool byte volume,
per-skill / plugin / MCP attribution, token re-billing, and corruption
detection.

What is new since v0.1.0

  • The portable skill. .agents/skills/tare/SKILL.md + references/ teach an
    agent to drive the CLI end to end — probe which corpus exists, pick commands,
    respect the reading-order cliffs, and turn results into actionables without
    overclaiming value from cost data. A tracked .claude/skills/tare symlink
    makes it discoverable by Claude Code too.
  • Install the skill:
    npx skills add AngelVRodC/tare --skill tare (installs a copy — re-run after
    upgrading), or follow the copy-paste block in the README.
  • CLAUDE.md is now a real @AGENTS.md import — the tracked symlink form was
    write-broken (anthropics/claude-code#66559); AGENTS.md stays canonical.
  • Internal refactor: narrowed builders (seeTime), single-purpose MCP-name
    helpers (mcpServer/openCodeServer), writeCorpus with padding replaces
    writeScalars, underHome consolidates the default-dir logic.

No behaviour, flags, or output changes; no new dependencies.

Install

go install github.com/AngelVRodC/tare@v0.2.0

Go 1.27 or later. --harness opencode also needs the sqlite3 binary on PATH —
a local binary tare shells out to, not a Go module compiled in.

Zero dependencies

go list -m all returns one line: the module itself. No network: no pricing
API, no telemetry, no update check. Transcript content never leaves the machine.

Every metric carries a derivation — measured or estimated — and a metric the
harness never recorded is omitted and named in a warning, never reported as a
zero.

v0.1.0

Choose a tag to compare

@AngelVRodC AngelVRodC released this 07 Sep 01:51

tare reads the agent transcripts already sitting on your disk and reports what
your installed tooling actually costs you in context: per-tool byte volume,
per-skill / plugin / MCP attribution, token re-billing, and corruption
detection.

The premise is that the vendor's OTel export redacts third-party plugin and
skill names to "third-party" and user MCP servers to "custom", while the
un-redacted attribution sits in the local transcript. Reading it is the product.

Two harnesses

  • Claude Code — ~/.claude/projects/**/*.jsonl, feeds all five commands.
  • OpenCode — ~/.local/share/opencode/opencode.db, feeds tools.

Harness-agnostic by design. No harness vendor will ever measure a competitor,
so a second working adapter was the release gate.

Commands

scan, tools, attribute, corruption, report.

Install

go install github.com/AngelVRodC/tare@v0.1.0

Go 1.27 or later. --harness opencode also needs the sqlite3 binary on PATH —
a local binary tare shells out to, not a Go module compiled in.

Zero dependencies

go list -m all returns one line: the module itself. A tool arguing that your
tooling costs more than it returns ships with no dependencies or it argues
against itself. No network: no pricing API, no telemetry, no update check.
Transcript content never leaves the machine.

Every metric carries a derivation — measured or estimated — and a metric the
harness never recorded is omitted and named in a warning, never reported as a
zero.