Published copy. Evidence paths refer to the repository branch insights/generator-benchmark.
Insights Goal B: generator benchmark (2026-09-07)
Question: is the SQL generator the lever? Same code, same prompts, same fixture, same sealed holdout and scorer for every arm; only the generator model varies.
Arms that ran: glm-5.2, glm-5.3. Arms unavailable: claude-fable-5-1, claude-opus-5, claude-sonnet-5.
Decision
Answer: with the arms that could run, no. No arm halves first-turn errors or lifts precision above 70%, and every difference against the control sits inside or beside the control's own run-to-run spread. The two arms that ran were served by the same reported model (glm-5.3), so this benchmark measured request-configuration noise, not a second generator. Whether a different generator family (claude-fable-5-1, claude-opus-5, claude-sonnet-5) changes the planner failure class is still untested: those arms had no credential. The planner failure class stays the largest first-turn cause in every arm; it is about 31 of 100 first turns in the control.
Rule: an arm wins if it halves first-turn errors, or lifts precision above 70% with the lower paired bound above the control, and the gain exceeds the control noise floor.
glm-5.3: verdict NO. Halves first-turn errors: no (first-turn errors changed by 4.0 per 100, positive means more errors; the control noise spread is 3.0). Precision above 70% with the lower paired bound above the control: no (precision changed by 2.0% points; the control noise spread is 9.0%; paired difference interval 2.3% [-5.1% to 10.3%]).
Arms
The provider returned model identifier glm-5.3 for every glm-5.2 request on the zai coding endpoint during the freeze probe, both smokes and every run. The standard zai endpoint refuses this account (no balance), so a served glm-5.2 is not reachable. Arms 1 and 2 are therefore two request configurations served by the same reported model.
#
arm
provider
model requested
model returned by the provider
thinking
sampling
status
reason
1
glm-5.2
zai
glm-5.2
glm-5.3 (1456 calls)
disabled
T=0, seed=42: temperature and seed sent and accepted; thinking disabled requested
available
2
glm-5.3
zai
glm-5.3
glm-5.3 (1471 calls)
disabled
T=0, seed=42: temperature and seed sent and accepted; thinking disabled requested
available
3
claude-fable-5-1
anthropic
claude-fable-5-1
not probed
adaptive_low
T=0, seed=42: temperature and seed are not supported by the Messages API for this model family; not sent
unavailable
No ANTHROPIC_API_KEY in the private credential setup (.envrc.local, process environment, ~/.config). Claude Code setup and OAuth tokens are not API keys and were not used.
4
claude-opus-5
anthropic
claude-opus-5
not probed
disabled
T=0, seed=42: temperature and seed are not supported by the Messages API for this model family; not sent
unavailable
No ANTHROPIC_API_KEY in the private credential setup (.envrc.local, process environment, ~/.config). Claude Code setup and OAuth tokens are not API keys and were not used.
5
claude-sonnet-5
anthropic
claude-sonnet-5
not probed
disabled
T=0, seed=42: temperature and seed are not supported by the Messages API for this model family; not sent
unavailable
No ANTHROPIC_API_KEY in the private credential setup (.envrc.local, process environment, ~/.config). Claude Code setup and OAuth tokens are not API keys and were not used.
Noise floor (control arm against itself)
The control arm ran 3 times on identical code. 172 of 250 cases had the same outcome in every repeat; 78 did not. Stable cases by outcome: comparison_unverified 8, correct_completed 17, refusal_unverified 11, silent_wrong 12, task_error 124.
A difference between arms smaller than a metric's spread (max minus min across the control repeats) is not a finding.
metric
mean
min
max
spread (noise floor)
first_turn_execution_errors
55.67
54.00
57.00
3.00
correct_first_turns
15.00
14.00
16.00
2.00
answer_precision
50.81%
45.95%
54.93%
8.98%
silent_wrong
34.33
31.00
40.00
9.00
correct_completed
35.33
33.00
39.00
6.00
refusals
14.00
11.00
17.00
6.00
comparison_unverified
13.00
10.00
15.00
5.00
full_conversation_successes
2.33
2.00
3.00
1.00
Per-arm results
Denominators are fixed: 100 supported first turns, 250 attempts, 50 conversations. Refusals, blocked and comparison-unverified answers earn no completion credit.
Reference only, not an arm: goal-3 original e479e81 (single E5 run, different code; reference only) scored first-turn errors 60/100, correct first turns 14/100, precision 53.7% (36/67), silent wrong 31/250, full conversations 1/50.
Headline metrics per arm: bar = mean across repeats, whisker = min to max. First-turn errors and correct first turns are per 100 supported first turns; precision is per answered attempt; silent wrong is per 250 attempts.Table view
metric
glm-5.2 mean [min to max]
glm-5.3 mean [min to max]
glm-5.3 vs control, paired difference [95% CI]
First-turn execution errors / 100
55.7 [54.0 to 57.0]
59.7 [56.0 to 62.0]
4.0 [-0.7 to 8.3]
Correct first turns / 100
15.0 [14.0 to 16.0]
14.3 [13.0 to 16.0]
-0.7 [-3.3 to 2.3]
Precision = correct / (correct + silent wrong)
50.8% [45.9% to 54.9%]
52.8% [49.1% to 55.3%]
2.3% [-5.1% to 10.3%]
Silent wrong / 250
34.3 [31.0 to 40.0]
30.7 [29.0 to 34.0]
-3.7 [-10.7 to 3.0]
Correct completed / 250
35.3 [33.0 to 39.0]
34.7 [28.0 to 42.0]
not a paired metric
Refusals / 250
14.0 [11.0 to 17.0]
13.0 [12.0 to 14.0]
not a paired metric
Blocked by parent / 250
0.0 [0.0 to 0.0]
0.0 [0.0 to 0.0]
not a paired metric
Comparison unverified / 250
13.0 [10.0 to 15.0]
12.3 [10.0 to 15.0]
not a paired metric
Unnecessary clarification / 250
0.0 [0.0 to 0.0]
0.0 [0.0 to 0.0]
not a paired metric
Full conversation success / 50
2.3 [2.0 to 3.0]
2.7 [2.0 to 4.0]
0.3 [-0.7 to 1.7]
Jobs at deadline / 250
0.0 [0.0 to 0.0]
0.0 [0.0 to 0.0]
not a paired metric
First-turn execution errors by cause (per 100 supported first turns)
Causes follow the goal-3 classification of the persisted terminal record and the retained generated SQL. Provider or transport failures are listed separately and are counted.
cause
glm-5.2 mean [min to max]
glm-5.3 mean [min to max]
Generated SQL lacked schema qualification
7.0 [6.0 to 8.0]
8.3 [6.0 to 10.0]
Generated schema reference was wrong or absent
9.7 [8.0 to 13.0]
14.0 [12.0 to 16.0]
Generation returned no usable query
0.7 [0.0 to 1.0]
1.3 [0.0 to 2.0]
Planner returned no usable source SQL
31.0 [28.0 to 35.0]
28.7 [27.0 to 31.0]
Required merge key was missing
4.7 [3.0 to 7.0]
6.0 [4.0 to 7.0]
Terminal boundary needs review
1.3 [1.0 to 2.0]
1.0 [1.0 to 1.0]
Validation boundary needs review
1.3 [1.0 to 2.0]
0.3 [0.0 to 1.0]
Total first-turn execution errors
55.7 [54.0 to 57.0]
59.7 [56.0 to 62.0]
Regressions versus the control (stable cases only)
A case counts as lost only if it was correct in all control repeats and wrong or error in all candidate repeats. Gained cases follow the mirror rule.
arm
stable correct in control
lost
correct to wrong
correct to error
mixed wrong/error
stable wrong or error in control
gained correct
glm-5.3
17
0
0
0
0
164
0
Cost and latency per arm
Latency is per SQL-generator provider call, measured inside the isolated server. Live-model latency is advisory: host load and provider responses are not controlled. Cost is list price times the tokens the provider reported, summed over one 250-attempt run; it covers the SQL-generator calls only.
Per-call generation latency per arm, all completed calls of all repeats pooled. Box p25 to p75, line = median, whiskers p5 to p95.Cost per 250-attempt run (list price, SQL-generator calls) against precision. Small dots are single repeats; the large dot is the mean of repeats.Table view
arm
calls per run
failed calls per run
p50 ms
p95 ms
input tokens per run
output tokens per run
reasoning tokens per run
list price in/out per 1M
cost per 250 attempts (USD)
glm-5.2
485 [476 to 492]
0 [0 to 0]
5362 [5170 to 5577]
10109 [9652 to 10652]
3689078 [3665204 to 3701821]
141303 [134396 to 145893]
59354 [54532 to 62615]
$1.40 / $4.40
5.786 [5.723 to 5.824]
glm-5.3
491 [489 to 492]
0 [0 to 1]
5307 [5088 to 5561]
10607 [10130 to 10962]
3726734 [3710575 to 3748945]
143361 [142287 to 144163]
60266 [59411 to 61039]
$1.40 / $4.40
5.848 [5.827 to 5.883]
claude-fable-5-1
not run
$10.00 / $50.00
n/a
claude-opus-5
not run
$5.00 / $25.00
n/a
claude-sonnet-5
not run
$2.00 / $10.00
n/a
Per-family outcome matrix
Each cell is the mean count across repeats of correct / silent wrong / task error attempts in that intent family, out of the family's attempts.
Per-family mean counts per arm (darker = larger share of the family's attempts). Columns per arm: correct, silent wrong, task error. Denominator: the family's attempts (shown in the tooltip).Table view
intent family
glm-5.2
glm-5.3
activity_deadline_before_creation
0.0 / 0.0 / 5.0 of 5
1.3 / 0.7 / 3.0 of 5
activity_duration_missing_due_time
2.7 / 0.3 / 2.0 of 5
2.7 / 0.0 / 2.3 of 5
all_commission_unknown
0.0 / 0.3 / 4.7 of 5
0.0 / 0.0 / 5.0 of 5
booked_without_settled_history
0.0 / 0.0 / 5.0 of 5
0.0 / 0.0 / 5.0 of 5
campaign_and_web_referral
3.0 / 0.0 / 0.0 of 5
3.0 / 0.3 / 0.0 of 5
corporate_registration_without_trade
3.0 / 0.7 / 0.0 of 5
3.0 / 0.7 / 0.0 of 5
customer_referrals_with_reward_event
5.0 / 0.0 / 0.0 of 5
5.0 / 0.0 / 0.0 of 5
deadline_actual_date_disagreement
0.0 / 0.0 / 0.0 of 5
0.0 / 0.0 / 0.0 of 5
deal_assignment_override
1.7 / 2.0 / 0.7 of 5
0.7 / 1.0 / 3.0 of 5
deal_person_organization_conflict
0.7 / 0.7 / 3.7 of 5
0.7 / 0.3 / 4.0 of 5
deal_stage_timestamp_order
0.7 / 0.0 / 4.3 of 5
0.0 / 0.0 / 5.0 of 5
deleted_booking_live_account
0.0 / 0.3 / 4.7 of 5
0.0 / 0.0 / 5.0 of 5
different_sales_ownership
0.0 / 0.0 / 5.0 of 5
0.0 / 0.3 / 4.7 of 5
first_booked_before_first_broker
0.0 / 0.0 / 5.0 of 5
0.0 / 0.0 / 5.0 of 5
funnel_incomplete_contact
0.0 / 4.7 / 0.0 of 5
0.3 / 4.7 / 0.0 of 5
fx_missing_on_settled
0.0 / 0.3 / 4.7 of 5
0.0 / 0.3 / 4.7 of 5
invoice_before_settlement
0.0 / 0.0 / 5.0 of 5
0.0 / 0.0 / 5.0 of 5
known_external_person_qualification
0.0 / 2.7 / 2.3 of 5
0.0 / 3.3 / 1.7 of 5
known_zero_booked_commission
1.7 / 0.3 / 0.0 of 5
1.3 / 1.7 / 0.0 of 5
london_signup_month_edge
0.0 / 0.0 / 0.0 of 5
0.0 / 0.0 / 0.0 of 5
marketing_registration_gap
0.0 / 0.3 / 3.3 of 5
0.0 / 0.0 / 4.0 of 5
multi_broker_activation
0.0 / 0.0 / 5.0 of 5
0.0 / 0.0 / 5.0 of 5
negative_realized_commission
1.3 / 0.7 / 0.3 of 5
1.7 / 0.7 / 0.0 of 5
note_author_deal_owner_difference
0.0 / 1.0 / 4.0 of 5
0.0 / 0.3 / 4.3 of 5
notified_without_verification
0.0 / 0.0 / 5.0 of 5
0.0 / 0.0 / 5.0 of 5
org_contact_without_website
0.7 / 2.0 / 2.0 of 5
0.7 / 1.7 / 2.7 of 5
organization_client_type_multiple
0.0 / 0.0 / 4.3 of 5
0.0 / 0.0 / 5.0 of 5
organization_employee_data_gap
0.0 / 0.7 / 4.3 of 5
0.3 / 1.0 / 3.3 of 5
organization_erp_multiple
0.0 / 0.0 / 4.7 of 5
0.0 / 0.3 / 4.7 of 5
organization_hedging_multiple
0.0 / 0.0 / 5.0 of 5
0.0 / 0.0 / 5.0 of 5
organization_introducer_link
0.0 / 0.7 / 4.0 of 5
0.7 / 0.0 / 4.3 of 5
organization_wallet_share_unknown
0.0 / 0.3 / 4.0 of 5
0.0 / 0.0 / 4.3 of 5
outdated_still_activated
0.0 / 0.0 / 5.0 of 5
0.0 / 0.3 / 4.7 of 5
overdue_expected_close
1.3 / 0.0 / 3.7 of 5
1.3 / 0.3 / 3.3 of 5
partner_paid_and_unpaid_statements
1.3 / 2.3 / 0.0 of 5
2.7 / 1.0 / 0.0 of 5
person_communication_preferences
2.0 / 0.7 / 1.7 of 5
1.3 / 1.0 / 2.0 of 5
person_multi_frequency_declarations
0.0 / 0.3 / 4.7 of 5
0.0 / 0.0 / 5.0 of 5
person_note_pinned_exclusively
0.0 / 0.0 / 4.7 of 5
0.0 / 0.0 / 5.0 of 5
person_organization_owner_gap
0.7 / 1.3 / 3.0 of 5
0.0 / 1.0 / 4.0 of 5
prebillable_eligible_stats
0.0 / 0.3 / 4.7 of 5
0.0 / 0.3 / 4.7 of 5
private_declared_currency_overlap
0.0 / 0.3 / 4.7 of 5
0.0 / 0.3 / 4.7 of 5
professional_zero_rate_referrals
0.0 / 4.7 / 0.3 of 5
0.0 / 4.0 / 1.0 of 5
qualified_without_deal_stage
1.3 / 0.0 / 3.7 of 5
0.3 / 0.0 / 4.3 of 5
quote_conversion_valid_link
0.3 / 1.3 / 3.3 of 5
0.0 / 2.0 / 3.0 of 5
quote_days_before_activation
0.7 / 0.3 / 4.0 of 5
1.0 / 0.0 / 4.0 of 5
quote_only_system_activity
1.0 / 0.7 / 3.3 of 5
0.3 / 0.3 / 3.7 of 5
trade_sell_not_declared
0.0 / 0.0 / 5.0 of 5
0.0 / 0.0 / 5.0 of 5
unknown_sti_with_broker
0.0 / 1.3 / 3.7 of 5
0.0 / 1.0 / 4.0 of 5
verified_after_registration
4.7 / 0.3 / 0.0 of 5
4.0 / 1.0 / 0.0 of 5
verified_private_rejected_registration
1.7 / 2.3 / 0.0 of 5
2.3 / 0.7 / 0.0 of 5
Method
Code: revision ff3e669e469d on branch insights/generator-benchmark; application manifest 079f40338beef66d (1687 files), frozen from Git blobs into an isolated snapshot before any run.
Fixture: insights_goal3_fixture (frozen goal-3 fixture, data hash 986553e1a09dc997); control-39 correction not applied.
Clock: 2026-09-06T12:00:00Z through libfaketime 0.9.13, Europe/London calendar, real monotonic time.
Protocol: 3 repeats per arm, 2 workers, arms and repeats sequential, provider deadline 25 s, sampling requested temperature 0 and seed 42, thinking disabled where the provider allows it. Nothing was rerun to improve a number.
Method files re-hashed before every run: bench runtime c84016f8b3f188b0, adapters 9102631df82189ac, arm registry 248304f344725cc3. Three sealed fixture-method files differ from the goal-3 E5 seal (control-39 correction); the fixture database they describe is unchanged.
Frozen at 2026-09-07T16:40:34.388160+00:00 on devbox (16 CPUs, load [0.95, 0.66, 0.56]). Other interactive sessions ran on the host; load averages are in every run receipt.
Noise floor frozen at 2026-09-07T18:11:04.085909+00:00 before any candidate arm ran.
Unverified
Arms 3 to 5 (Claude Fable 5.1, Claude Opus 5, Claude Sonnet 5) did not run: the private credential setup holds no Anthropic API key. Their adapter is implemented and unit-tested against a fake client only; no live Anthropic call was made.
The provider reports glm-5.3 for glm-5.2 requests. Whether goal-3 and Goal A runs (which recorded only the requested model) were served by glm-5.2 or glm-5.3 cannot be established from their records.
Thinking-disabled was requested and accepted by the zai coding endpoint, but the provider reported reasoning tokens on the benchmark calls (glm-5.2: about 59,354 reasoning tokens per run, about 122 per call; glm-5.3: about 60,266 reasoning tokens per run, about 123 per call). The setting is not honoured on this endpoint for glm-5.3; the reasoning tokens are counted in cost and latency.
Temperature 0 and seed 42 were sent and accepted by zai; the control's own run-to-run spread shows they do not make the provider deterministic.
Live latency and cost are advisory: other sessions ran on the host, and list prices are the published rates on the day, not the account's billed rate.
The corrected control-39 fixture was not used; five holdout expected answers change under it.
docs/evidence/insights-goal-b-2026-09-07/noise-floor.json: per-case agreement and metric spread of the control repeats.
docs/evidence/insights-goal-b-2026-09-07/arms/<arm>/repeat-<n>/: compact attempt records, provider traces (with the model id the provider returned per call), admission, run receipt with load averages.
docs/evidence/insights-goal-b-2026-09-07/results/<arm>.json and results/comparison.json: every number in this report.
docs/evidence/insights-goal-b-2026-09-07/smoke/<arm>/: five development questions per arm, retained separately.
docs/bi/benchmark.md: how to run one arm, add a model and render the report.