Evaluation Benchmarks

8 domain-specific benchmarks for evaluating commodity intelligence agents, with 5 baselines ranging from a scheduled rule-based system to an oracle with perfect foresight.

Status (2026-05-26): Three pre-registered v1.1 benchmarks complete. OOS Replay: 50.0% (n=110). Skill-Retention: 81.7% (n=60). Persona-Align: null confirmed (p=0.70). Two exploratory benchmarks at reduced scale: Mem-Utility: null (−0.064, n=25, not pre-registered). MultiTurn-Persona: underpowered (+0.173, p=0.109, n=7, not pre-registered). Total v1.1 cost: $20.51 ($0.51 over $20 cap) — see cost amendment.

Results (populates after first run)
Persona Divergence
Skill Pass Rate
Memory Utility
OOS Dir. Accuracy

Benchmark Suite Overview

#BenchmarknPrimary MetricStatusCadence
1OTM-Persona-Alignresponse_divergence_cosinescheduledWeekly
2OTM-Skill-Retentionplan_inclusionscheduledWeekly
3OTM-Mem-Utilitymemory_utilityscheduledBi-weekly
4OTM-OOS-Replaydirectional_accuracyscheduledMonthly
5OTM-LongCtx200accuracyv1.1
6OTM-MultiTurn-Persona7convergence_deltav1.1 ✓
7OTM-DistShift50robustness_scorev1.1
8OTM-Mem-Ablation200reward_deltav1.1

v1.0 Benchmarks — Detailed

OTM-Persona-Align

What this measures

Tests the strongest architectural claim: that persona vectors produce meaningfully different behavior. 100 queries spanning the agent's domain are run twice — once seeded at the execution_oriented anchor, once at analysis_oriented. Measures cosine distance between response embeddings and Jaccard distance between skill sets called.

Baseline: Same queries with fixed 50/50 persona (should give near-zero divergence).

Statistical method: Mean ± bootstrap CI over 5 seeds (42–46).

Result: Pre-registered NULL confirmed. Persona divergence ratio 1.003× baseline (p=0.23, Wilcoxon). Two persona-conditioned responses are no more different from each other than two neutral-neutral runs. Skill selection Jaccard ≈ 0.10 (agent) vs 0.11 (baseline) — effectively identical. Our pre-registered protocol predicted this as the most likely v0.1 outcome: in-prompt persona injection does not cause the LLM to condition on a 64-d float vector. v0.2 activation steering (residual-stream injection) is the hypothesized mechanism for deeper conditioning.

Re-verification (2026-05-24): After fixing the planner stop-condition bug, the persona benchmark was re-run with the corrected planner (49 queries × 4 persona modes = 196 agent runs). Both persona modes now execute multi-step plans (2-5 steps with real BQ data retrieval), eliminating the earlier confound of structurally identical minimal executions. The null result holds. This confirms the finding is genuine — the persona module's effect on planner behavior is not detectable through embedding-space cosine divergence at v0.1's in-prompt injection point. The issue is architectural, not a measurement artifact.

v1.1 Re-run (2026-05-25): Re-ran with data fixes (NO_DATA routing, dtype coercion) and corrected cost tracking. Result: null confirmed — divergence ratio 1.001× baseline (p=0.70, Wilcoxon). 196 agent runs, n=49 comparisons. Skill Jaccard: 0.047 (agent) vs 0.040 (baseline). Cost with full tracking: $1.77 (vs v1.0 reported $0.31 skill-only = 5.7× correction). Data fixes do not alter the persona null finding. v1.1 result JSON.

Note on n=49: The benchmark runs 49 distinct queries × 4 persona modes (2 anchored + 2 neutral baseline) = 196 total agent runs. Divergence is computed per query pair, yielding n=49 paired comparisons for the Wilcoxon test. The description above references “100 queries” as the design target; actual implementation uses 49 unique queries from the domain probe set.

OTM-Skill-Retention

What this measures

Tests whether the planner routes queries to the correct skill. 60 canonical probes (3 per skill, 20 skills, 7 categories) are run through the full agent. For each probe, we check whether the expected skill appears anywhere in the generated plan (plan inclusion). Secondary metrics include strict positional top-1 (first step) and top-3 accuracy.

v1.0 protocol: Single-turn skill selection. Multi-turn retention decay deferred to v0.2.

Baseline: Random chance of 1 target skill in a 3.4-step plan from 20 skills = 15.7%. Observed: 5.2× baseline.

Protocol amendment (2026-05-23): Primary metric changed from top-1 accuracy to plan inclusion after identifying three measurement bugs. Initial run reported 23.3% top-1 (initial result JSON); post-fix rerun: 78.3% plan inclusion. See SKILL_RETENTION_PROTOCOL.md for full amendment.

Re-verification (2026-05-24): After planner stop-condition fix, re-ran all 60 probes. Result: 81.7% plan inclusion (CI: 71.7%–91.7%). 14/20 skills at 100%. Top-3: 55%, Top-1: 21.7%. Mean plan length: 3.4 steps. Weakest: fetch_inventory_baseline (0%), sense_tank_state (0%) — planner substitutes fetch_tank_features for both. Full results: JSON.

v1.1 Re-run (2026-05-25): Re-ran with data fixes (NO_DATA routing, dtype coercion) and corrected cost tracking. Result: 81.7% plan inclusion (identical to v1.0). Top-3: 58.3% (+3.3pp), Top-1: 21.7% (same). Mean plan length: 3.3 steps. Cost with full tracking: $1.65 (vs v1.0 reported $0.20 skill-only). Confirms data fixes do not affect skill selection. v1.1 result JSON.

OTM-Mem-Utility (Exploratory)

What this measures

Counterfactual evaluation: queries run with full memory retrieval, then the same queries with memory disabled (NoopMemoryManager). Response quality compared via LLM-as-judge (Claude Haiku rates both on 0–5, blind, order randomized). Memory utility = mean(with_memory) − mean(without_memory).

Positive utility means memory retrieval improved outcomes; negative means it hurt. Reports per-query delta plus overall.

Status: Exploratory. Not pre-registered. Executed at n=25 (designed scale: 500). Results reported for transparency but statistically underpowered for subcategory analysis.

v1.1 Result (n=25, seed=42, $1.39): Memory utility: −0.064 (95% CI: −0.276 to +0.128). Mean score with memory: 3.77/5.0. Mean score without memory: 3.83/5.0. The CI crosses zero — the 4-tier memory system does not produce a statistically detectable improvement. Per-category results (n=5 each) have extremely wide CIs and are not statistically interpretable. Full-scale execution at n≥200 scoped for v1.2. Result JSON.

OTM-MultiTurn-Persona (Exploratory)

What this measures

Multi-turn sessions (5 turns each) testing whether persona modes produce increasingly distinct behavior across turns. Each conversation runs under two opposing persona modes (execution_oriented vs analysis_oriented) with the same agent instance persisting. Measures Jaccard skill divergence at turns 1–2 (early) vs 4–5 (late). Convergence delta = late divergence − early divergence.

Status: Exploratory. Not pre-registered. Executed at n=7 sequences (designed scale: 100). At this sample size, the benchmark lacks statistical power to reliably distinguish signal from noise.

v1.1 Result (n=7 sequences, seed=42, $2.57): Convergence delta: +0.173 (95% CI: −0.064 to +0.378). Mean early divergence: 0.162. Mean late divergence: 0.335. Wilcoxon p=0.1094 — not statistically significant. The positive direction is noted but cannot be distinguished from chance at n=7. No conclusions about persona convergence should be drawn from this run. Confirmatory run at n≥20 with pre-registered protocol scoped for v1.2. Result JSON.

OTM-OOS-Replay

What this measures

The headline benchmark. Walk day-by-day through 2025-05-01 onward (~250 trading days). For each day t: set query_ts = t, ask the agent "what's the call for tomorrow?", record recommendation, compare against actual next-day move.

Reports directional accuracy, not just Sharpe. Depends critically on the Category B causal filter — all memory retrieval has query_ts plumbed through.

Cadence: Monthly — heavy run; full replay takes hours.

Result (full 250-day run, n=237, seed=42): Directional accuracy 54.4% (95% CI: [48.1%, 60.8%]). CI crosses 50% — not statistically significant at 95% confidence. Sharpe ratio: 1.37. Cumulative P&L: 6,301 bps; max drawdown: 2,623 bps. Cost: estimated $9–15 (see cost amendment).

v1.1 Result (compressed run, n=110, seed=42): Directional accuracy 50.0% (95% CI: [40.9%, 60.0%]). Sharpe: 1.05. P&L: 1,513 bps; drawdown: 1,204 bps. Cost: $13.13 ($0.12/day with full LLM cost tracking). Sample size reduced from 237 to 110 days due to API budget constraint ($0.12/day × 237 days ≈ $28, exceeding available budget); full 250-day re-run deferred to v1.2.

Same-window comparison (May–Oct 2025, n=110): v1.0 accuracy on these same 110 trading days was 47.5%; v1.1 accuracy was 50.0% — a +2.5pp improvement, within the pre-registered 1–5pp expectation. The headline v1.0 figure (54.4%) covers the full 237-day window including Nov–Apr months not evaluated in v1.1.

v1.0 → v1.1 comparison (same period, May–Oct 2025):

Monthv1.0v1.1Δ
2025-0540.0%45.0%+5.0pp
2025-0663.2%63.2%0.0pp
2025-0752.4%47.6%−4.8pp
2025-0825.0%45.0%+20.0pp
2025-0952.4%47.6%−4.8pp
2025-1052.4%55.6% (n=9)+3.2pp
Total47.5%50.0%+2.5pp

Scope amendment: Budget constraints required compressing from 237 to 120 days. Run terminated at 110 days ($13.13 of $15 cost cap). Nov 2025–Apr 2026 not evaluated in v1.1. Pre-registered expectation was 1–5pp improvement; observed +2.5pp over the comparable period confirms the data-availability fixes had the expected modest effect.

v1.0 per-month breakdown (full 237-day run):

MonthAccuracyN
2025-0540.0%20
2025-0663.2%19
2025-0752.4%21
2025-0825.0%20
2025-0952.4%21
2025-1052.4%21
2025-1168.8%16
2025-1255.0%20
2026-0163.2%19
2026-0255.6%18
2026-0368.2%22
2026-0460.0%20

Confidence calibration: Mean confidence when correct = 0.538; when wrong = 0.539. At full scale the confidence calibration is flat — the agent does not know when it is right. The 30-day smoke showed slight calibration (0.547 vs 0.472) that did not persist at n=237.

Interpretation. The 54.4% accuracy is above the 50% coin-flip baseline and above the 52.9% majority-class baseline, but the CI crossing 50% means we cannot reject the null hypothesis of random performance. This is consistent with pre-registered expectations: the regime classifier achieves 65.4% in-sample, but composite signal dilution from near-chance components was predicted to yield 52–58% OOS. The result falls squarely within that range.

Notable: accuracy varies significantly by month (25.0% in Aug 2025 to 68.8% in Nov 2025), suggesting regime-dependent performance. The agent performs better in trending markets and worse in range-bound/volatile periods — consistent with a momentum-based regime classifier.

Audit trail: v1 → v2 fix cycle. The initial smoke test (v1) produced 57.1% accuracy, but diagnosis revealed every prediction was made on empty data. Three planner bugs were identified and fixed:

  1. _should_stop used naive substring matching — any single failure triggered abort
  2. query_goii returned SUCCESS with null data (changed to NO_DATA status)
  3. _resolve_args couldn't parse the planner's $stepN.field reference formats

See v1 result (data-starved) | v2 full 250-day result.

Cost: v1.0: Estimated $9–15 total for 237 days (~$0.04–0.06/day, see cost amendment). v1.1: $13.13 for 110 days ($0.12/day with full LLM cost tracking).

Baselines

BaselineDescription
B0 (Scheduled)Fixed daily schedule: fetch → model → signal. No planning, memory, or persona. Equivalent to base pipeline.
B1 (Single-Skill)Always selects the single most commonly used skill. Tests whether planning adds value over a default action.
B2 (Prompted Claude)Claude Sonnet with skill descriptions in system prompt but no memory, persona, or reward. Tests value of agent framework over raw LLM.
B3 (Fine-tuned Qwen)Qwen 2.5 7B fine-tuned via DPO on collected trajectories. Tests value of domain-specific fine-tuning.
B4 (Oracle)Perfect foresight — selects skills based on knowledge of future outcomes. Upper bound.

Common Output Schema

Every benchmark writes a JSON file conforming to this schema. The site renders from these files:

{
  "benchmark_id": "OTM-Persona-Align",
  "version": "v1.0",
  "run_id": "2026-05-21T14:30:00Z",
  "completed_at": "2026-05-21T14:42:15Z",
  "agent_version": "v0.2.0-oos-clean",
  "n_samples": 50,
  "seeds": [42, 43, 44, 45, 46],
  "metrics": {
    "primary": {
      "name": "response_divergence_cosine",
      "value": 0.62,
      "ci_low": 0.55,
      "ci_high": 0.68,
      "n": 50
    }
  },
  "baselines": [
    {"name": "fixed_50_50_mode", "primary_value": 0.08}
  ],
  "notes": "First production run.",
  "data_filter": "non-OOS window (date < 2025-05-01)"
}

Existing Model Results

These are the pipeline model results — the foundation the benchmarks will evaluate the agent layer against.

Stage 1: SAR Pipeline (Cushing Hub)

MetricValueCriterionStatus
Hub-state-day records309> 0PASS
EIA direction accuracy52.8%> 50%PASS
Signal stability (avg Δ)0.173< 2.0PASS
Kalman convergence0.066 → 0.045DecreasingPASS

Stage 2: ML Models (Walk-Forward)

ModelAccuracyBaselineΔn
Regime Classifier65.35%52.9%+12.4 pp329
Spread Forecaster51.4%50.0%+1.4 pp321
EIA Surprise51.52%50.0%+1.5 pp297

Stage 3: Strategy Investigation

Initial backtest (v1 naive tightness-delta signal): Sharpe −0.10. Root cause analysis identified 5 problems — signal not connected to ML models, threshold too low, no confidence gating, no risk controls. Strategy v2 implements walk-forward ML composite with regime weighting, confidence gating (0.58 threshold), and 5% drawdown stop. v2 results pending BQ execution.

Cost Tracking Amendment (2026-05-25)

All cost figures in v1.0 benchmark results captured only skill execution costs (BigQuery queries at ~$0.0001/query), not the LLM costs for plan generation, re-planning, and response synthesis. Three Anthropic API call sites were uninstrumented:

  1. Planner.generate_plan() — Claude Sonnet call per agent turn
  2. Planner.replan() — 0–3 additional calls per turn on skill failure
  3. Agent._llm_response() — Claude Sonnet call for response generation

Fix: Instrumented all three call sites with token-based cost estimation using published Anthropic pricing (Sonnet: $3/$15 per M input/output tokens, Haiku: $0.80/$4). Unknown model IDs now produce a warning and fall back to Sonnet pricing.

Corrected estimates:

Benchmarkv1.0 reported (skill only)Corrected estimate (full)
OOS Replay (110 days v1.1)$0.04$13.13 (v1.1 measured)
Persona-Align (196 runs)$0.31$1.77 (v1.1 measured)
Skill-Retention (60 probes)$0.20$1.65 (v1.1 measured)
Mem-Utility (25 queries)$1.39 (v1.1)
MultiTurn-Persona (7 sequences)$2.57 (v1.1)
Total$0.55$20.51 (v1.1 measured)

v1.1 benchmark suite total cost: $20.51 ($0.51 over committed $20 API credit cap). Cost composition: three pre-registered benchmarks $16.55 (OOS $13.13, Skill-Retention $1.65, Persona-Align $1.77), two exploratory benchmarks $3.96 (Mem-Utility $1.39, MultiTurn-Persona $2.57). Within originally budgeted $150–200 envelope by an order of magnitude.