Measurement tools

September 18, 2026 ยท View on GitHub

Read the consolidated results first. This directory contains measurement code; runtime code lives in src/.

One source of published numbers

results/index.json registers the two current v12 three-arm studies and preserves the historical v11 reference matrix, Claude regression and Codex smoke separately. Each entry has immutable results, a structural audit and SHA-256 hashes. Cost estimates are frozen with their historical basis. bun run bench:report verifies hashes and rebuilds docs/BENCHMARKS.md, docs/benchmark-report.html, docs/benchmark-results.json and the benchmark block of the root README.md without inference. It retains unknown costs and narrower later studies rather than selecting best percentages. A folder named final does not confer validity. bun run bench:screenshots renders the HTML figures into docs/assets/benchmarks/ with a local headless Chrome; set YOSHI_CHROME when the browser is not in a default location.

New runs do not replace these numbers automatically. Before registering a run: finish every planned trial; preserve failures and missing usage; run the protocol and fixture audit; record model, policy, source/fixture hashes and price basis; and explain whether it replaces a reference matrix or adds a separate study. Never pool different models, task definitions, policies or smoke/regression runs.

Explicit real-provider runs

These commands incur actual model usage and require the existing authenticated CLI and Gateway key. Choose a fresh output directory each time. They are not part of bun test or bun run bench:report.

# Claude reference workload. Frozen local source/research fixtures must exist.
bun run bench:claude --out .yoshi/runs/claude-example \
  --arms baseline,jev-context --trials 1 \
  --scenarios operations,agent-reports,evidence,history --judge-timeout-ms 45000
bun run bench:audit .yoshi/runs/claude-example
bun run bench:claude:report .yoshi/runs/claude-example .yoshi/runs/claude-example/report

# Codex uses the selected Claude manifest and the same frozen fixture workspace.
bun run codex:bench --out .yoshi/runs/codex-example --trials 1 \
  --fixtures .yoshi/focused-v11-validation-2026-09-17
bun run codex:report .yoshi/runs/codex-example .yoshi/runs/codex-example/report

Codex reporting also audits preserved envelopes and fixture hashes. Per-run reports stay inside their run directory. Both report tools require an explicit run, so an omitted argument cannot silently publish a superseded experiment.

The source snapshot is .yoshi/references/jev-eval-agent; reviewed historical fixtures are .yoshi/history-study/webmcp. bench:prepare prepares the source reference; history:prepare TRANSCRIPT DESTINATION extracts reviewed Claude history. Codex's selected fixture manifest also refers to an isolated temporary workspace: if it no longer exists, prepare a new Claude fixture run and pass its manifest directory. Do not replace a missing historical fixture with synthetic data under the same study name.

Diagnostic and historical tools

CommandPurpose
bun run codex:profileLocal historical character-distribution audit, not token savings
bun run jev:calibrate --phase development --out .yoshi/runs/calibrationEarlier tool-only classification experiment, not calibration of the current conversation policy
bun run jev:report DEVELOPMENT HELDOUT OUTPUTHistorical classification report
bun run summaryMixed runtime log accounting; no baseline means no savings claim

Earlier methodology and results are in docs/archive. Old raw directories were relocated into .yoshi/archive/; its index.json maps original paths to current locations. Historical manifests and source snapshots retain their original provenance strings. The four selected raw studies and live fixture directories stay at their original paths so current reproduction and audits continue to work.

Sticky lifecycle and native comparison

The jev-sticky arm uses the current arrival lifecycle. jev-context explicitly selects the historical snapshot lifecycle. The native arm forwards the original history with Anthropic's clear_tool_uses_20250919 strategy (two tool uses kept, 1,000-token minimum clearing); it never uses Jev. The common relay records input_transformations, native context_management, cache creation/read usage and actual model identity. No missing cost or reasoning field is inferred.

session is a real Claude Code loop alternating four fixture reads and four local archive writes. Every arm gets a separate output directory. The existing exact JSON oracle grades required identifiers; the input fixture hash check remains mandatory. --padding-chars adds a disclosed synthetic irrelevant system archive to exercise long-context behavior; it is not a natural long project.

# Small-session diagnostic: deliberately bypass the production gate.
bun run bench:claude --out .yoshi/runs/sticky-session \
  --arms baseline,jev-sticky,native --trials 1 --scenarios session \
  --min-context-tokens 0 --native-trigger 1000 --judge-timeout-ms 45000
bun run bench:audit .yoshi/runs/sticky-session

# Production size gate, with explicit synthetic context padding.
bun run bench:claude --out .yoshi/runs/sticky-long \
  --arms baseline,jev-sticky,native --trials 1 --scenarios session \
  --padding-chars 190000 --judge-timeout-ms 45000

# Strict signed-thinking check: mismatch is an error, never silently dropped.
bun run bench:claude --out .yoshi/runs/sticky-fable \
  --arms baseline,jev-sticky,native --trials 1 --scenarios evidence \
  --model claude-fable-5-1 --effort high --strict-thinking true \
  --min-context-tokens 0 --native-trigger 1000 --judge-timeout-ms 45000

The audit verifies source-preserving authorized edits and compares every unchanged original prefix against the previous forwarded prefix. It also checks that sticky mode never enables thinking drops. Prefix comparisons with zero removals are vacuous for omission replay; report removal counts alongside them. Zero reported thinking drops proves transport acceptance only when the strict run includes signed blocks and actual prior omissions, and never proves the model used its reasoning. Each run freezes source hashes in its manifest. Keep all failed and invalid diagnostic runs, with their disposition, in the separate validation report.