Skip to content

Quality

Eval results

The latest results per model, from evals/RESULTS.md.

Generated by aa eval from evals/results/*.json (docs/EVALS.md §4). Each table is the latest run of one model on one suite. Weak results are shown, not hidden.

Datasets: 30 generated businesses (evals/generator, 10 archetypes × 3 variants) with planted events, distractors and data-quality issues. Retrieval recall@8 and the injection suite run separately (bun run --filter @agentic-analytics/retrieval eval:retrieval, bunx vitest run packages/core/test/injection.test.ts).

The engine’s detection and ranking rules (M11, M13a) were tuned on these same 30 datasets, so every full and smoke score here is optimistic for unseen data. The held-out generated set (10 reseeded businesses and two archetypes no rule was written against, docs/specs/accuracy.md §9) is scored only by release runs (aa eval --suite heldout); the smoke suite includes one of its datasets as a CI check (smoke runs before 2026-10-22 had three datasets, now four). Of the Groq tables, the three single-model smoke runs (gpt-oss-120b, gpt-oss-20b, qwen3.8-27b alone) predate the M13a engine changes (seasonal guard, ranking, driver split, grouping dimensions). The “planner, extractor, judge” smoke run used the M13a engine, before the merge’s representative-rule fix (a template with no measured change keeps its priority), which changes nothing per dataset on the offline baseline. Its full run (2026-10-20/21, over two nights) used the engine just before the M14a fixes (#44–#49) and the scoring before code-quality fix 9: it is the before of the M14a before/after, and the after run follows. A run with unfinished jobs is partial: its rates count those jobs as misses and its pass column reads n/a. A nightly run is carried over two passes (aa eval --passes 2, scripts/eval-daily.sh): a job the first night’s quota stopped runs again the next night, and the run is partial only if jobs are still unfinished after that. The ten v3 datasets changed on 2026-10-22 (code-quality fix 11b: their noise blip moved from 2025-12 to 2025-11, off the planted December peak): v3 rows of runs before that date used the old data.

Baseline: a scripted heuristic (keyword extractor, rule-based planner and word-overlap judge), not a language model. Its rules were written knowing the generator’s document templates (e.g. it treats a sentence with “after” and “pausing” as a stated cause), so its cause-grade and action scores are optimistic. It checks the harness end to end; it is not evidence of model quality.

30 datasets · 120 s · 23100 tokens

Usage: no provider calls (scripted model)

MetricResultv0.1 barPass
Jobs completed100.0%100%yes
Number mismatches00yes
Planted recall@596.0%≥ 80%yes
Driver accuracy100.0%≥ 90%yes
Cause grade accuracy100.0%≥ 80%yes
Distractor FP rate0.0%≤ 10%yes
Quality-issue recall100.0%≥ 90%yes
Citation precision100.0%≥ 95%yes
Definition adherence100.0%100%yes
Recommendation grounding100.0%100%yes
Recommendation relevance100.0%≥ 70%yes
Per dataset
DatasetDonePlanted foundDistractors reportedQuality foundFindingsTime
coffee_roaster-v1yes1/1none2/254.1 s
coffee_roaster-v2yes2/2none1/155.0 s
coffee_roaster-v3yes2/2none1/156.0 s
printing_shop-v1yes1/1none2/232.2 s
printing_shop-v2yes2/2none1/153.7 s
printing_shop-v3yes2/2none1/154.3 s
clinic-v1yes1/1none2/252.9 s
clinic-v2yes2/2none1/154.1 s
clinic-v3yes2/2none1/154.7 s
online_store-v1yes1/1none2/243.1 s
online_store-v2yes2/2none1/154.5 s
online_store-v3yes2/2none1/155.4 s
distributor-v1yes1/1none2/252.3 s
distributor-v2yes1/2none1/153.3 s
distributor-v3yes2/2none1/153.4 s
restaurant-v1yes1/1none2/253.8 s
restaurant-v2yes2/2none1/155.0 s
restaurant-v3yes2/2none1/156.7 s
saas-v1yes1/1none2/253.7 s
saas-v2yes2/2none1/154.4 s
saas-v3yes2/2none1/155.2 s
logistics-v1yes1/1none2/253.2 s
logistics-v2yes2/2none1/154.6 s
logistics-v3yes2/2none1/155.6 s
construction_supplier-v1yes1/1none2/253.0 s
construction_supplier-v2yes2/2none1/153.6 s
construction_supplier-v3yes2/2none1/154.3 s
agency-v1yes1/1none2/251.9 s
agency-v2yes1/2none1/152.6 s
agency-v3yes2/2none1/153.7 s

configured (small-model mode) · full suite · 2026-10-19

Section titled “configured (small-model mode) · full suite · 2026-10-19”

History, not a headline: the first scheduled nightly pass (cron, 2026-10-19 22:00 UTC), under the old one-night rule. 21 of 30 jobs finished; then Groq’s free tier (200k tokens a day for the qwen/qwen3.8-27b planner) stopped the rest with RATE_LIMITED, so the rates count those jobs as misses. Same Groq roles as the smoke run (planner qwen/qwen3.8-27b, extractor openai/gpt-oss-120b, judge openai/gpt-oss-20b), small-model mode. Since #37 a nightly run spans two nights and is labelled partial only if jobs are still unfinished after the second; this pass is kept as the record that led to that change.

30 datasets · 2012 s · 801284 tokens

Usage: n/a (tokens per call not recorded for this run)

Served by: extractor → openai-compatible:groq:openai/gpt-oss-120b (448 calls, 335 cached); judge → openai-compatible:groq:openai/gpt-oss-20b (92 calls, 79 cached); planner → openai-compatible:groq:qwen/qwen3.8-27b (131 calls, 47 cached, 31 failed)

MetricResultv0.1 barPass
Jobs completed70.0%100%no
Number mismatches00n/a (partial run)
Planted recall@548.0%≥ 80%n/a (partial run)
Driver accuracy100.0%≥ 90%n/a (partial run)
Cause grade accuracy70.8%≥ 80%n/a (partial run)
Distractor FP rate0.0%≤ 10%n/a (partial run)
Quality-issue recall70.0%≥ 90%n/a (partial run)
Citation precision100.0%≥ 95%n/a (partial run)
Definition adherence100.0%100%n/a (partial run)
Recommendation grounding100.0%100%n/a (partial run)
Recommendation relevance38.1%≥ 70%n/a (partial run)
Per dataset
DatasetDonePlanted foundDistractors reportedQuality foundFindingsTime
coffee_roaster-v1yes1/1none2/2340.0 s
coffee_roaster-v2yes2/2none1/137.0 s
coffee_roaster-v3yes1/2none1/135.9 s
printing_shop-v1yes1/1none2/234.1 s
printing_shop-v2yes1/2none1/136.1 s
printing_shop-v3yes1/2none1/135.4 s
clinic-v1yes1/1none2/234.4 s
clinic-v2yes1/2none1/138.0 s
clinic-v3yes1/2none1/1329.6 s
online_store-v1yes1/1none2/23133.2 s
online_store-v2yes1/2none1/13186.6 s
online_store-v3yes1/2none1/1390.1 s
distributor-v1yes1/1none2/23100.4 s
distributor-v2yes1/2none1/13164.8 s
distributor-v3yes1/2none1/1393.8 s
restaurant-v1yes1/1none2/23148.7 s
restaurant-v2yes2/2none1/13155.5 s
restaurant-v3yes1/2none1/1361.4 s
saas-v1yes1/1none2/23184.4 s
saas-v2yes2/2none1/134.9 s
saas-v3yes1/2none1/13123.6 s
logistics-v1no (RATE_LIMITED: DECIDE failed: every route is rate-limited: op)0/1none0/20160.8 s
logistics-v2no (RATE_LIMITED: EXPLAIN failed: every route is rate-limited: o)0/2none0/106.1 s
logistics-v3no (RATE_LIMITED: EXPLAIN failed: every route is rate-limited: o)0/2none0/1010.6 s
construction_supplier-v1no (RATE_LIMITED: EXPLAIN failed: every route is rate-limited: o)0/1none0/202.7 s
construction_supplier-v2no (RATE_LIMITED: EXPLAIN failed: every route is rate-limited: o)0/2none0/1010.6 s
construction_supplier-v3no (RATE_LIMITED: EXPLAIN failed: every route is rate-limited: o)0/2none0/10118.6 s
agency-v1no (RATE_LIMITED: EXPLAIN failed: every route is rate-limited: o)0/1none0/2012.9 s
agency-v2no (RATE_LIMITED: EXPLAIN failed: every route is rate-limited: o)0/2none0/1069.0 s
agency-v3no (RATE_LIMITED: EXPLAIN failed: every route is rate-limited: o)0/2none0/1062.2 s

openai-compatible:groq:qwen/qwen3.8-27b planner, gpt-oss-120b extractor, gpt-oss-20b judge (small-model mode) · full suite · 2026-10-21

Section titled “openai-compatible:groq:qwen/qwen3.8-27b planner, gpt-oss-120b extractor, gpt-oss-20b judge (small-model mode) · full suite · 2026-10-21”

The before of the M14a real-model before/after: run over two nights (2026-10-20 and 2026-10-21) on the engine before the M14a fixes (#44–#49), and scored with the scoring of that time (before code-quality fix 9). The next nightly runs measure the merged fixes.

Passes: 2026-10-20, 2026-10-21 (2 of up to 2; every job finished).

30 datasets · 1681 s · 1007951 tokens

Usage: n/a (tokens per call not recorded for this run)

Served by: extractor → openai-compatible:groq:openai/gpt-oss-120b (540 calls, 467 cached); judge → openai-compatible:groq:openai/gpt-oss-20b (120 calls, 111 cached); planner → openai-compatible:groq:qwen/qwen3.8-27b (177 calls, 96 cached, 35 failed)

MetricResultv0.1 barPass
Jobs completed100.0%100%yes
Number mismatches00yes
Planted recall@568.0%≥ 80%no
Driver accuracy100.0%≥ 90%yes
Cause grade accuracy67.6%≥ 80%no
Distractor FP rate0.0%≤ 10%yes
Quality-issue recall100.0%≥ 90%yes
Citation precision100.0%≥ 95%yes
Definition adherence96.7%100%no
Recommendation grounding100.0%100%yes
Recommendation relevance30.0%≥ 70%no
Per dataset
DatasetDonePlanted foundDistractors reportedQuality foundFindingsTime
coffee_roaster-v1yes1/1none2/234.5 s
coffee_roaster-v2yes2/2none1/137.0 s
coffee_roaster-v3yes1/2none1/135.7 s
printing_shop-v1yes1/1none2/234.0 s
printing_shop-v2yes1/2none1/135.9 s
printing_shop-v3yes1/2none1/135.3 s
clinic-v1yes1/1none2/234.4 s
clinic-v2yes1/2none1/137.8 s
clinic-v3yes1/2none1/135.2 s
online_store-v1yes1/1none2/234.5 s
online_store-v2yes1/2none1/1311.1 s
online_store-v3yes1/2none1/138.4 s
distributor-v1yes1/1none2/232.8 s
distributor-v2yes1/2none1/135.0 s
distributor-v3yes1/2none1/1370.2 s
restaurant-v1yes1/1none2/233.7 s
restaurant-v2yes2/2none1/1336.7 s
restaurant-v3yes1/2none1/137.4 s
saas-v1yes1/1none2/23137.7 s
saas-v2yes2/2none1/134.9 s
saas-v3yes1/2none1/136.5 s
logistics-v1yes1/1none2/2376.8 s
logistics-v2yes2/2none1/13119.5 s
logistics-v3yes1/2none1/13190.8 s
construction_supplier-v1yes1/1none2/23215.3 s
construction_supplier-v2yes1/2none1/13248.0 s
construction_supplier-v3yes1/2none1/13176.8 s
agency-v1yes1/1none2/23206.1 s
agency-v2yes1/2none1/1389.6 s
agency-v3yes1/2none1/138.9 s

openai-compatible:groq:openai/gpt-oss-120b (small-model mode) · smoke suite · 2026-10-16

Section titled “openai-compatible:groq:openai/gpt-oss-120b (small-model mode) · smoke suite · 2026-10-16”

Groq free tier. The daily token quota (200k/day) ran out after the first job, so two jobs failed with a rate-limit error; rerun when the quota resets. Its one completed job was scored before the metric-concept mapping and its report was not kept, so that row may undercount (the run predates —keep-reports).

3 datasets · 192 s · 30752 tokens

Usage: n/a (tokens per call not recorded for this run)

MetricResultv0.1 barPass
Jobs completed33.3%100%no
Number mismatches00n/a (partial run)
Planted recall@50.0%≥ 80%n/a (partial run)
Driver accuracyn/a≥ 90%n/a (partial run)
Cause grade accuracyn/a≥ 80%n/a (partial run)
Distractor FP rate0.0%≤ 10%n/a (partial run)
Quality-issue recall50.0%≥ 90%n/a (partial run)
Citation precisionn/a≥ 95%n/a (partial run)
Definition adherence100.0%100%n/a (partial run)
Recommendation grounding100.0%100%n/a (partial run)
Recommendation relevance0.0%≥ 70%n/a (partial run)
Per dataset
DatasetDonePlanted foundDistractors reportedQuality foundFindingsTime
coffee_roaster-v1yes0/1none2/23151.0 s
restaurant-v3no (PROVIDER: EXPLAIN failed: Rate limit reached for model `open)0/2none0/1037.0 s
saas-v2no (PROVIDER: EXPLAIN failed: Rate limit reached for model `open)0/2none0/103.9 s

openai-compatible:groq:openai/gpt-oss-20b (small-model mode) · smoke suite · 2026-10-16

Section titled “openai-compatible:groq:openai/gpt-oss-20b (small-model mode) · smoke suite · 2026-10-16”

Groq free tier. Run before DECIDE degraded gracefully on invalid output: two jobs failed at DECIDE on Groq’s own JSON validation (fixed since; rerun pending quota). Rescored from the kept report with the final scoring.

3 datasets · 703 s · 91087 tokens

Usage: n/a (tokens per call not recorded for this run)

MetricResultv0.1 barPass
Jobs completed33.3%100%no
Number mismatches00n/a (partial run)
Planted recall@50.0%≥ 80%n/a (partial run)
Driver accuracy0.0%≥ 90%n/a (partial run)
Cause grade accuracy100.0%≥ 80%n/a (partial run)
Distractor FP rate0.0%≤ 10%n/a (partial run)
Quality-issue recall50.0%≥ 90%n/a (partial run)
Citation precision100.0%≥ 95%n/a (partial run)
Definition adherence100.0%100%n/a (partial run)
Recommendation groundingn/a100%n/a (partial run)
Recommendation relevance0.0%≥ 70%n/a (partial run)
Per dataset
DatasetDonePlanted foundDistractors reportedQuality foundFindingsTime
coffee_roaster-v1yes1/1none2/23279.7 s
restaurant-v3no (PROVIDER: DECIDE failed: Failed to validate JSON. Please adj)0/2none0/10216.9 s
saas-v2no (PROVIDER: DECIDE failed: Failed to validate JSON. Please adj)0/2none0/10206.5 s

openai-compatible:groq:qwen/qwen3.8-27b (small-model mode) · smoke suite · 2026-10-16

Section titled “openai-compatible:groq:qwen/qwen3.8-27b (small-model mode) · smoke suite · 2026-10-16”

Groq free tier, small-model mode. The model drafted metrics on the Costs sheet, so the planted ×1000 cost typo surfaced as the top finding (an engine gap recorded in STATE). Rescored from the kept reports after the review fix that stopped Costs-sheet sums counting as revenue.

3 datasets · 1174 s · 100559 tokens

Usage: n/a (tokens per call not recorded for this run)

MetricResultv0.1 barPass
Jobs completed100.0%100%yes
Number mismatches00yes
Planted recall@50.0%≥ 80%no
Driver accuracy0.0%≥ 90%no
Cause grade accuracy50.0%≥ 80%no
Distractor FP rate0.0%≤ 10%yes
Quality-issue recall100.0%≥ 90%yes
Citation precision100.0%≥ 95%yes
Definition adherence100.0%100%yes
Recommendation grounding100.0%100%yes
Recommendation relevance0.0%≥ 70%no
Per dataset
DatasetDonePlanted foundDistractors reportedQuality foundFindingsTime
coffee_roaster-v1yes1/1none2/23359.7 s
restaurant-v3yes1/2none1/13359.7 s
saas-v2yes0/2none1/13454.1 s

openai-compatible:groq:qwen/qwen3.8-27b planner, gpt-oss-120b extractor, gpt-oss-20b judge (small-model mode) · smoke suite · 2026-10-16

Section titled “openai-compatible:groq:qwen/qwen3.8-27b planner, gpt-oss-120b extractor, gpt-oss-20b judge (small-model mode) · smoke suite · 2026-10-16”

Groq free tier, every role on Groq (planner qwen/qwen3.8-27b, extractor openai/gpt-oss-120b, judge openai/gpt-oss-20b), small-model mode, run with —model configured. All 3 jobs finished. The free judges tried first (Gemma 4 on Google AI Studio, OpenRouter free, Mistral) were dropped: overloaded (503/429, 44–127 s per call) or rate-limited on the first request. Bars missed: cause grade 75% (< 80%) and recommendation relevance 66.7% (< 70%).

3 datasets · 37 s · 97619 tokens

Usage: n/a (tokens per call not recorded for this run)

Served by: extractor → openai-compatible:groq:openai/gpt-oss-120b (54 calls, 54 cached); judge → openai-compatible:groq:openai/gpt-oss-20b (15 calls, 13 cached); planner → openai-compatible:groq:qwen/qwen3.8-27b (15 calls, 14 cached)

MetricResultv0.1 barPass
Jobs completed100.0%100%yes
Number mismatches00yes
Planted recall@580.0%≥ 80%yes
Driver accuracy100.0%≥ 90%yes
Cause grade accuracy75.0%≥ 80%no
Distractor FP rate0.0%≤ 10%yes
Quality-issue recall100.0%≥ 90%yes
Citation precision100.0%≥ 95%yes
Definition adherence100.0%100%yes
Recommendation grounding100.0%100%yes
Recommendation relevance66.7%≥ 70%no
Per dataset
DatasetDonePlanted foundDistractors reportedQuality foundFindingsTime
coffee_roaster-v1yes1/1none2/235.7 s
restaurant-v3yes1/2none1/1310.5 s
saas-v2yes2/2none1/1320.9 s

Public datasets run as they are published (evals/real/README.md): bun run eval:real:fetch downloads them and checks every SHA-256, bun run eval:real runs the engine and scores each report against the answer files in evals/real/answers/. Each check reads only report.json, and its expected numbers come from SQL written in the answer file. A failed check is an engine gap, listed in docs/progress/STATE.md; checks are not tuned to pass.

baseline · real public data · 2026-10-23

Section titled “baseline · real public data · 2026-10-23”

Baseline: the scripted heuristic, no language model. On real files it drafts metrics with the deterministic fallbacks (or uses the answer file’s confirmed definitions) and finds changes with the analysis library; it writes no causes from documents (there are none). Each check reads report.json; its expected numbers come from the SQL in evals/real/answers/.

Hotel booking demand datasets (Data in Brief (Elsevier), CC BY 4.0)

Section titled “Hotel booking demand datasets (Data in Brief (Elsevier), CC BY 4.0)”

Antonio, N., de Almeida, A., & Nunes, L. (2019). Hotel booking demand datasets. Data in Brief, 22, 41–49. https://doi.org/10.1016/j.dib.2018.11.126. File read: hotel-bookings.csv (SHA-256 3b22c26428ec…). Completed in 26.2 s · 4/6 checks pass.

CheckPassWhat the report shows
C1: The job completes on 119,390 bookings with the published padding and “NULL” text left inyesreport with 5 findings, 3 data-quality items
C2: Every number re-computes (no mismatch, re-derivation mismatch or definition violation)yes107 numbers recomputed before the report shipped (a mismatch would have stopped the job), 0 claims dropped for breaking a definition
C3: The summer peak: August is the top month of room revenue in 2015, 2016 and 2017 (G2)yes2015 peak 2015-08; 2016 peak 2016-08; 2017 peak 2017-08; 3/3 values equal SQL
C4: The autumn fall is not reported as news: bookings in November are below October in both years (G2)no1 of 5 findings: F2 2015-10→2015-11 (contribution.v1)
C5: Missing values: Children is NA in 4 bookings (G1)yesQ3 missing_value: 4 rows (N624), SQL 4; cites rows 40602, 40669, 40681…
C6: The extreme ADR: 5,400 in one city-hotel booking against a median of 99.9 (G1), a likely decimal-point slipnonot reported (kinds reported: unparseable_value, unit_error, missing_value)

Metrics: room_revenue, room_nights, bookings, cancellation_rate. Data-quality kinds: unparseable_value, unit_error, missing_value. Findings: trend_break: revenue 2017-04 → 2017-05 (contribution.v1); anomaly: bookings 2015-10 → 2015-11 (contribution.v1); anomaly: room_nights 2015-10 → 2015-11 (contribution.v1); improvement: revenue[customertype=Group] 2016-08 → 2017-08 (period_change.v1); improvement: revenue 2017-08 (trend.v1).

Warehouse and Retail Sales (Montgomery County, Maryland), 2017–2020 (Montgomery County, MD (Department of Liquor Control, on data.montgomerycountymd.gov), Public domain)

Section titled “Warehouse and Retail Sales (Montgomery County, Maryland), 2017–2020 (Montgomery County, MD (Department of Liquor Control, on data.montgomerycountymd.gov), Public domain)”

Source: Montgomery County, MD. Warehouse and Retail Sales, data.montgomerycountymd.gov/d/v76h-r7br (Public Domain). File read: montgomery-warehouse-sales.csv (SHA-256 b1f5450e132c…). Completed in 141.7 s · 2/2 checks pass.

CheckPassWhat the report shows
C1: The job completes on a file with a split year and month and three money-like measuresyesreport with 0 findings, 3 data-quality items
C2: Every number re-computes (no mismatch, re-derivation mismatch or definition violation)yes2 numbers recomputed before the report shipped (a mismatch would have stopped the job), 0 claims dropped for breaking a definition

Metrics: none. Data-quality kinds: unparseable_value, missing_id, missing_value. Findings: none.

Electronic card transactions, September 2026 (Stats NZ (Tatauranga Aotearoa), CC BY 4.0)

Section titled “Electronic card transactions, September 2026 (Stats NZ (Tatauranga Aotearoa), CC BY 4.0)”

This work is based on Stats NZ’s data (Electronic card transactions: September 2026) which are licensed by Stats NZ for reuse under the Creative Commons Attribution 4.0 International licence. File read: nz-card-spend-by-industry.csv (SHA-256 63ff45be4c78…). Completed in 6.7 s · 5/5 checks pass.

CheckPassWhat the report shows
C1: The job completes on the official CSV layout (Period as year.month, e.g. 2002.10)yesreport with 4 findings, 1 data-quality item
C2: Every number re-computes (no mismatch, re-derivation mismatch or definition violation)yes380 numbers recomputed before the report shipped (a mismatch would have stopped the job), 0 claims dropped for breaking a definition
C3: The December peak: December is the top month of 2023, 2024 and 2025 (G1)yes2023 peak 2023-12; 2024 peak 2024-12; 2025 peak 2025-12; 3/3 values equal SQL
C4: The regular January fall is not reported as news (G4: January is below December in 24 of 24 years)yesnone
C5: Suppressed values: Data_value is blank for 2000-01 to 2002-09 (G3: 264 lines)yesQ1 missing_value: 264 rows (N403), SQL 264; cites rows 2, 3, 4…

Metrics: card_spend. Data-quality kinds: missing_value. Findings: anomaly: card_spend 2020-03 → 2020-04 (contribution.v1); anomaly: card_spend 2020-04 → 2020-05 (contribution.v1); trend_break: card_spend 2016-09 → 2016-10 (contribution.v1); improvement: card_spend 2026-09 (trend.v1).

Online Retail II (UCI Machine Learning Repository, CC BY 4.0)

Section titled “Online Retail II (UCI Machine Learning Repository, CC BY 4.0)”

Chen, D. (2012). Online Retail II [Dataset]. UCI Machine Learning Repository. https://doi.org/10.24432/C5CG6D. File read: online_retail_II.sample10.csv (SHA-256 6d8dff8c0bff…). Completed in 13.9 s · 7/7 checks pass.

CheckPassWhat the report shows
C1: The job completes on a real 105,797-line fileyesreport with 2 findings, 3 data-quality items
C2: Every number re-computes (no mismatch, re-derivation mismatch or definition violation)yes32 numbers recomputed before the report shipped (a mismatch would have stopped the job), 0 claims dropped for breaking a definition
C3: Cancellations: invoice numbers starting with C (G1: 2,089 lines, 816 invoices)yesQ1 prefixed_id: 2089 rows (N120), SQL 2089; cites rows 58, 117, 118…
C4: Negative quantities (G1: 2,431 lines)yesQ2 negative_quantity: 2431 rows (N121), SQL 2431; cites rows 58, 117, 118…
C5: Missing customer IDs (G1: 21,051 lines)yesQ3 missing_id: 21051 rows (N122), SQL 21051; cites rows 156, 157, 158…
C6: The Nov–Dec peak: November is the top month of 2010 and 2011 (G2)yes2010 peak 2010-11; 2011 peak 2011-11; 3/3 values equal SQL
C7: No finding about December 2011, a partial month (G3: the data ends 2011-12-09)yesno finding at 2011-12

Metrics: revenue, orders. Data-quality kinds: prefixed_id, negative_quantity, missing_id. Findings: improvement: revenue 2011-11 (trend.v1); anomaly: orders 2010-11 → 2010-12 (anomaly.v1).

Today’s engine on the M14 measuring tools (docs/plans/m14.md PR 8), published as it is, gaps included. Every run here is offline and scripted (2026-10-22, no language model), each run through scripts/heavy.sh: the scripted baseline for the engine, and canned FakeModel answers built from the answer keys for ablation arms A and B. So these are harness checks: they show the tools measure what they should, not what a model does, and nothing here says the engine adds accuracy. The real-model runs are DEFERRED to the nightly runs (below).

Golden v1 is the dev split of three real datasets’ golden sets (Online Retail II, NZ card spend, hotel bookings; 23 items, 3 traps). EIA-861M is DEFERRED (its host doesn’t answer from this machine), so golden v1 has three datasets until it runs. Held-out golden items are scored only in release runs (M21), and the held-out generated set is not part of this report. Golden items are agent-reviewed, not maintainer-reviewed.

RunCommandResult
Golden v1, scripted (dev split)bun run eval -- --suite golden --model baseline (bun run eval:golden is the same run: the model defaults to baseline)7/23 items pass: hotel bookings 2/8, NZ card spend 3/7, Online Retail II 2/8. Counted toward the bars: 7/20 numeric and categorical, 0/3 traps. 7 of the 8 items read from the report (facts and drivers) pass; the baseline answers no follow-up question, so all 15 ask items (traps included) are misses
Consistency on smoke, scriptedbun run eval -- --suite smoke --repeat 5 --model baseline4/4 jobs agree in all 5 runs on every measure (numbers, findings, driver, cause grade, action), 0 disagreements; the cache is n/a (no provider calls). It checks the repeat harness: the scripted engine is deterministic
Ablation on smoke, scriptedbun run eval:ablation -- --arms A,B,C --suite smokePlanted recall@5: A 40%, B 60%, C 100% (5 tasks over 3 datasets). C − A 0.600 [0.200, 1.000]; C − B 0.400 [0.000, 0.800]; B − A 0.200 [−0.600, 1.000]
Ablation on golden v1, scriptedbun run eval:ablation -- --arms A,B,C --suite goldenNumeric accuracy: A 8/16, B 0/16, C 6/16; traps: A 0/3, B 3/3, C 0/3 (23 tasks). C − A −0.217 [−0.478, 0.043]; C − B 0.174 [−0.087, 0.435]; B − A −0.391 [−0.652, −0.087]

Each difference is paired by task, with its 95% interval from the paired bootstrap (10,000 resamples, fixed seed 20261022, docs/specs/accuracy.md §5). The canned answers decide these numbers: arm A answers every other numeric item right by design, and arm B replays each item’s answer SQL, which reads the raw file with read_csv, so the locked sandbox refuses every one (SQL_REFUSED: the containment working) and arm B ends in a refusal. Arm A saw a sample of each file (the cut is stated below with its numbers).

Not run here (DEFERRED to the nightly runs, docs/progress/STATE.md “Deferred checks”): golden v1 on the configured Groq routes (bun run eval:real:fetch && bun run eval -- --suite golden --model configured); consistency over 5 runs on smoke with the configured model, cache off (bun run eval -- --suite smoke --repeat 5 --model configured); the ablation on a free model (bun run eval:ablation -- --arms A,B,C --suite smoke --model openai-compatible:groq:openai/gpt-oss-120b and the same with --suite golden); EIA-861M’s pinning and golden set.

Gaps (docs/progress/STATE.md “Known gaps carried forward”): hotel bookings C4 and C6 in the real tier; retail golden item G7 (no driver on anomaly findings); the held-out generated set’s drop (recall@5 75.0% against 96.0% on the development 30); the post-ship citation judge, deferred to M21.

Golden v1: baseline · dev split · 2026-10-22

Section titled “Golden v1: baseline · dev split · 2026-10-22”

Items are agent-reviewed, not maintainer-reviewed. An item counts toward the bars only when its independent re-derivation agreed. The baseline is the scripted heuristic with no language model: it answers no follow-up question, so every ask item (traps included) is a miss, never n/a.

Job completed in 25.6 s · 2/8 items pass · counted toward the bars: 2/7 numeric and categorical, 0/1 traps; 0 not counted.

ItemKindSourcePassExpectedGotQuestion
G1numericfactyes1809324.751809324.7500000042What was room revenue (ADR × nights, bookings not cancelled) for arrivals in August 2016, both hotels together (EUR)?
G2numericfactyes1970181.61970181.6000000036What was room revenue (ADR × nights, bookings not cancelled) for arrivals in August 2017, the last month in the data, both hotels together (EUR)?
G3numericaskno41.73no answer (FakeModel has no scripted response for role=planner promptHash=24a1546f: Answer the question.)What share of the city hotel’s bookings, in percent, were cancelled (all arrival dates)?
G4categoricalasknoNon Refundno answer (FakeModel has no scripted response for role=planner promptHash=0307b5ac: Answer the question.)Which deposit type has the highest cancellation rate, both hotels and all arrival dates together?
G5numericaskno118669.91no answer (FakeModel has no scripted response for role=planner promptHash=4df2b94d: Answer the question.)By how much did room revenue (ADR × nights, bookings not cancelled), both hotels together, change from April 2017 to May 2017 arrivals (May minus April, EUR)?
G6numericaskno81.98no answer (FakeModel has no scripted response for role=planner promptHash=d5bd2436: Answer the question.)What share of all bookings, in percent, came through the travel agent and tour operator channel (TA/TO), cancelled bookings included?
G7categoricalasknoResort Hotelno answer (FakeModel has no scripted response for role=planner promptHash=39ada550: Answer the question.)Which hotel had more room revenue (ADR × nights, bookings not cancelled) for arrivals in August 2016, the resort hotel or the city hotel?
G8trapasknorefusalno answer (FakeModel has no scripted response for role=planner promptHash=b1d0731f: Answer the question.)What was the gross operating profit margin of the two hotels in 2016?

Job completed in 5.3 s · 3/7 items pass · counted toward the bars: 3/6 numeric and categorical, 0/1 traps; 0 not counted.

ItemKindSourcePassExpectedGotQuestion
G1numericfactyes11321.611321.6What was total card spending, all industry groups together, in December 2025 (NZD million)?
G2numericfactyes9190.79190.7What was total card spending, all industry groups together, in September 2026, the latest month (NZD million)?
G3categoricaldriveryesDurablesDurablesWhich industry group contributed the largest decrease in NZD to the fall in card spending from March to April 2020?
G4numericaskno-3803.7no answer (FakeModel has no scripted response for role=planner promptHash=86b3b549: Answer the question.)By how much did total card spending, all industry groups together, change from March 2020 to April 2020 (NZD million)?
G5numericaskno29.015no answer (FakeModel has no scripted response for role=planner promptHash=acc46eaf: Answer the question.)What share of 2025 card spending, in percent, was in the Consumables industry group?
G6numericaskno1.25no answer (FakeModel has no scripted response for role=planner promptHash=e17aab3b: Answer the question.)By what percentage was total card spending, all industry groups together, in September 2026 above September 2025, the same month a year earlier?
G7trapasknorefusalno answer (FakeModel has no scripted response for role=planner promptHash=0020d93a: Answer the question.)What was the average value of a card transaction in 2025?

Job completed in 11.8 s · 2/8 items pass · counted toward the bars: 2/7 numeric and categorical, 0/1 traps; 0 not counted.

ItemKindSourcePassExpectedGotQuestion
G1numericfactyes140447.11140447.10999999937What were net sales (quantity × price over all lines, cancellations, postage, fees and manual adjustments included) in November 2010?
G2numericfactyes201201How many distinct invoices (cancellation invoices included) were there in December 2010?
G3numericaskno145480.93no answer (FakeModel has no scripted response for role=planner promptHash=8881ba09: Answer the question.)What were net sales (quantity × price over all lines, cancellations, postage, fees and manual adjustments included) in the best-selling month of 2011?
G4numericaskno37570.84no answer (FakeModel has no scripted response for role=planner promptHash=c3216eac: Answer the question.)By how much did net sales (quantity × price over all lines, cancellations, postage, fees and manual adjustments included) change from October 2011 to November 2011?
G5numericaskno13.7no answer (FakeModel has no scripted response for role=planner promptHash=3d621d90: Answer the question.)What share of 2010 net sales, in percent, came from the ten customers with the highest 2010 net sales? Lines with no customer ID stay in the total.
G6numericaskno3.58no answer (FakeModel has no scripted response for role=planner promptHash=024601a7: Answer the question.)By what percentage were November 2011 net sales (quantity × price over all lines, cancellations, postage, fees and manual adjustments included) above November 2010, the same month a year earlier?
G7categoricaldrivernoUnited Kingdomno driverWhich country accounted for most of the fall in invoices from November to December 2010?
G8trapasknorefusalno answer (FakeModel has no scripted response for role=planner promptHash=9a70101b: Answer the question.)What was the gross margin on 2011 sales?

Consistency: baseline · smoke suite · 5 runs · 2026-10-22

Section titled “Consistency: baseline · smoke suite · 5 runs · 2026-10-22”

Response cache: n/a (scripted model, no provider calls). Datasets: coffee_roaster-v1, restaurant-v3, saas-v2, tool_hire-v1.

  • Run 1: 4/4 jobs finished, 0 provider calls (0 cached)
  • Run 2: 4/4 jobs finished, 0 provider calls (0 cached)
  • Run 3: 4/4 jobs finished, 0 provider calls (0 cached)
  • Run 4: 4/4 jobs finished, 0 provider calls (0 cached)
  • Run 5: 4/4 jobs finished, 0 provider calls (0 cached)
MeasureJobs where every run agreesBar (§4.7, over 5 runs)Pass
(a) numbers: every fact value identical4/4 (100.0%)100%yes
(b) findings: the same top-5 findings4/4 (100.0%)95%yes
(c) driver: the same top driver per finding4/4 (100.0%)95%yes
(d) cause grade: the same grade per finding4/4 (100.0%)90%yes
(e) action: the same top recommendation scenario4/4 (100.0%)90%yes

None: every run agreed on every measure.

Harness check, not an engine-vs-model comparison. Arms A and B gave canned FakeModel answers built from the answer keys, and arm C ran the scripted planner; the numbers show the harness works, not what a model does.

Jobs: coffee_roaster-v1, restaurant-v3, saas-v2. Context window for arm A: 32768 tokens.

MeasureA (model alone)B (model + SQL)C (the engine)
Planted recall@5 (with driver)40% (2/5)60% (3/5)100% (5/5)
Driver accuracy0% (0/3)100% (3/3)100% (3/3)
Distractor FP rate60% (3/5)0% (0/5)0% (0/5)
Tokens in / out30 / 1560 / 301570 / 785
Time (s)0.10.414.5

Arm A saw a sample. coffee_roaster-v1: The input is cut to fit the model’s context window: t_t1 (sales.xlsx#Orders) shows rows 1–843 of 11564. Answers about the whole data rest on this sample. restaurant-v3: The input is cut to fit the model’s context window: t_t1 (sales.xlsx#Orders) shows rows 1–907 of 31389. Answers about the whole data rest on this sample. saas-v2: The input is cut to fit the model’s context window: t_t1 (orders.csv) shows rows 1–896 of 14628. Answers about the whole data rest on this sample.

Paired differenceTasksMean95% intervalAdds accuracy?
C − A50.600[0.200, 1.000]interval above 0, but canned answers: no claim
C − B50.400[0.000, 0.800]not shown (interval includes 0 or is below)
B − A50.200[-0.600, 1.000]not shown (interval includes 0 or is below)

Bootstrap: 10,000 paired resamples, fixed seed (accuracy.md §5).

ArmJobTaskScoreGot
Ccoffee_roaster-v1P11found at rank 1
Acoffee_roaster-v1P10found at rank 1, wrong driver
Bcoffee_roaster-v1P11found at rank 1
Crestaurant-v3P11found at rank 1
Crestaurant-v3P31found at rank 2
Arestaurant-v3P10found at rank 1, wrong driver
Arestaurant-v3P31found at rank 2
Brestaurant-v3P11found at rank 1
Brestaurant-v3P30not found
Csaas-v2P11found at rank 1
Csaas-v2P21found at rank 2
Asaas-v2P10found at rank 1, wrong driver
Asaas-v2P21found at rank 2
Bsaas-v2P11found at rank 1
Bsaas-v2P20not found

Harness check, not an engine-vs-model comparison. Arms A and B gave canned FakeModel answers built from the answer keys, and arm C ran the scripted planner; the numbers show the harness works, not what a model does.

Jobs: hotel-bookings, nz-card-spend, online-retail-ii. Context window for arm A: 32768 tokens.

MeasureA (model alone)B (model + SQL)C (the engine)
Numeric accuracy50% (8/16)0% (0/16)38% (6/16)
Categorical accuracy100% (4/4)0% (0/4)25% (1/4)
Trap pass rate0% (0/3)100% (3/3)0% (0/3)
Unsupported-number rate47% (9/19)n/a (0 of 0)—
… without source cells53% (10/19)n/a (0 of 0)—
Citation validity (SQL re-run)—n/a (0 of 0)—
Tokens in / out230 / 115460 / 230380 / 190
Time (s)7.71.642.6

Arm A saw a sample. hotel-bookings: The input is cut to fit the model’s context window: t_t1 (hotel-bookings.csv) shows rows 1–394 of 119390. Answers about the whole data rest on this sample. nz-card-spend: The input is cut to fit the model’s context window: t_t1 (nz-card-spend-by-industry.csv) shows rows 1–476 of 2568. Answers about the whole data rest on this sample. online-retail-ii: The input is cut to fit the model’s context window: t_t1 (online_retail_II.sample10.csv) shows rows 1–603 of 105797. Answers about the whole data rest on this sample.

The unsupported-number support set is the golden answers, arm C’s facts for the same job and the source cells of the columns each item names; the second row leaves the cells out. It is wider than “the data or the golden set”, which favours arms A and B.

Paired differenceTasksMean95% intervalAdds accuracy?
C − A23-0.217[-0.478, 0.043]not shown (interval includes 0 or is below)
C − B230.174[-0.087, 0.435]not shown (interval includes 0 or is below)
B − A23-0.391[-0.652, -0.087]not shown (interval includes 0 or is below)

Bootstrap: 10,000 paired resamples, fixed seed (accuracy.md §5).

ArmJobTaskScoreGot
Chotel-bookingsG111809324.7500000042
Chotel-bookingsG211970181.6000000036
Chotel-bookingsG30no answer
Chotel-bookingsG40no answer
Chotel-bookingsG50no answer
Chotel-bookingsG60no answer
Chotel-bookingsG70no answer
Chotel-bookingsG80no answer
Ahotel-bookingsG111,809,324.75
Ahotel-bookingsG202,167,200
Ahotel-bookingsG3141.73
Ahotel-bookingsG41Non Refund
Ahotel-bookingsG51118,669.91
Ahotel-bookingsG6090
Ahotel-bookingsG71Resort Hotel
Ahotel-bookingsG80answered: It will be about 512,000.
Bhotel-bookingsG10refused: SQL_REFUSED
Bhotel-bookingsG20refused: SQL_REFUSED
Bhotel-bookingsG30refused: SQL_REFUSED
Bhotel-bookingsG40refused: SQL_REFUSED
Bhotel-bookingsG50refused: SQL_REFUSED
Bhotel-bookingsG60refused: SQL_REFUSED
Bhotel-bookingsG70refused: SQL_REFUSED
Bhotel-bookingsG81refused: no column answers it (SQL_REFUSED)
Cnz-card-spendG1111321.6
Cnz-card-spendG219190.7
Cnz-card-spendG31Durables
Cnz-card-spendG40no answer
Cnz-card-spendG50no answer
Cnz-card-spendG60no answer
Cnz-card-spendG70no answer
Anz-card-spendG1111,321.6
Anz-card-spendG2010,110
Anz-card-spendG31Durables
Anz-card-spendG40-4,184
Anz-card-spendG5129.02
Anz-card-spendG601
Anz-card-spendG70answered: It will be about 512,000.
Bnz-card-spendG10refused: SQL_REFUSED
Bnz-card-spendG20refused: SQL_REFUSED
Bnz-card-spendG30refused: SQL_REFUSED
Bnz-card-spendG40refused: SQL_REFUSED
Bnz-card-spendG50refused: SQL_REFUSED
Bnz-card-spendG60refused: SQL_REFUSED
Bnz-card-spendG71refused: no column answers it (SQL_REFUSED)
Conline-retail-iiG11140447.10999999937
Conline-retail-iiG21201
Conline-retail-iiG30no answer
Conline-retail-iiG40no answer
Conline-retail-iiG50no answer
Conline-retail-iiG60no answer
Conline-retail-iiG70no driver
Conline-retail-iiG80no answer
Aonline-retail-iiG11140,447.11
Aonline-retail-iiG20221
Aonline-retail-iiG31145,480.93
Aonline-retail-iiG4041,328
Aonline-retail-iiG5113.7
Aonline-retail-iiG604
Aonline-retail-iiG71United Kingdom
Aonline-retail-iiG80answered: It will be about 512,000.
Bonline-retail-iiG10refused: SQL_REFUSED
Bonline-retail-iiG20refused: SQL_REFUSED
Bonline-retail-iiG30refused: SQL_REFUSED
Bonline-retail-iiG40refused: SQL_REFUSED
Bonline-retail-iiG50refused: SQL_REFUSED
Bonline-retail-iiG60refused: SQL_REFUSED
Bonline-retail-iiG70refused: SQL_REFUSED
Bonline-retail-iiG81refused: no column answers it (SQL_REFUSED)