HW Design-Space Agent

/results

Results

The agent against plain optimisers, scored against the exact answer.

The eval asks one question: on the same budget of evaluations, does an LLM steering the exploration do better than plain optimisers with no LLM? The CORDIC design space is small enough (635,040 designs) to score every design, so every run is graded against the exact answer, always with the same (M1) cost model so the milestones are comparable.

Milestone 1 found a split: the agent picked better designs than NSGA-II and random search, but mapped the trade-off curve far worse, because it dived at the spec's corner and stopped early. Milestone 2 set out to close that gap without losing the selection lead: a map_front decision, a 40% front-mapping reserve that code spends before a run stops, and five seeds instead of three. It ran three models through OpenRouter, Sonnet 5.5, DeepSeek V4.1 Flash and Qwen3.8-27B with reasoning off: 60 runs, 232 LLM calls, $1.65 of provider-reported usage. Every table below is mean ± population standard deviation over the seeds.

Milestone 3 then put the design inside its system and tried a free-form agent on top of the structured one. Milestone 4, the last, added a second target (an ASIC on the open sky130 PDK, post-synthesis), a fleet of structured graphs orchestrated by code, and feedback from L2 to L1, and closed the project with a write-up. Milestone 4's results come first, losses first; milestones 3, 2 and 1 follow, as they were. Before them, the newest data: the local Vivado runs that settled the two FPGA questions milestone 4 left open.

After M4: the local Vivado runs (2026-10-11)

Vivado 2025.2 on the same part, run on the maintainer's machine: high_precision's two candidates synthesised and routed again at the spec's own 20 ns clock, and report_power on the 14 measured designs, the first measured FPGA power. No LLM call and no eval re-run; the default cost model and every ground truth are unchanged. The power is Vivado's own vectorless estimate (12.5% default toggle rate, confidence Low), not a board measurement.

Where the models were wrong.

  • The better-fitting timing model got the one boundary wrong. A refit with one path factor per family class cut the Vivado Fmax leave-one-out error from 12.5% to 7.4%, but predicted high_precision's m=8 at 52.51 MSPS (feasible); Vivado measures 49.88. The rule, written before the fit, required both, so it was rejected.
  • No model sees routing. m=6 goes from 65.39 MSPS post-synthesis to 53.96 post-route, a real margin of +7.9% over 50 MSPS where the models' unrouted figures suggest +25.0% to +27.5%. Across the Vivado designs, routed Fmax is 0.675–0.709× the synthesised figure on plain pipelined and 0.980–1.056× on unrolled_k: every model throughput on this site is an unrouted figure.
  • The power index is off by 20.6% RMS after synthesis and 36.3% after routing. It reads unrolled_k low (0.61–0.97× post-synthesis, 0.48–0.85× post-route) and plain pipelined high (1.07–1.18× and 1.14–1.27×).

What held.

  • m=8 misses 50 MSPS at its own clock in both views (49.88 post-synthesis, 48.31 post-route) and m=6 meets in both. The M1 model and the refit had both called m=8 infeasible, so high_precision's winner stays m=6. Relaxing the clock from 10 to 20 ns did not move either design's post-synthesis figure.
  • The refit, counted once, is the same fit. The 20 ns post-synthesis rows duplicate the 10 ns ones, so vivado-2025.2-m4 keeps one row per design (4 dropped) and equals vivado-2025.2: 51 points, Vivado leave-one-out 15.4% LUT, 3.7% FF, 12.5% Fmax. No spec's winner changes; M1 stays the default.
  • The power index ranks the designs well: Spearman 0.982 post-synthesis and 0.969 post-route. A per-family activity factor (4 parameters) cuts the error to 10.2% in-sample and 13.9% leave-one-out; it is kept as a separate calibration, not the default.
pipelined_m W=26 N=22, xc7a35tcpg236-1, 20 ns constraint; needs ≥ 50 MSPS. Model columns are unrouted (post-synthesis scale).
DesignFlowWNS, nsMSPS measuredMeets?M1 estimateRefit (vivado-2025.2 = -m4) estimate
m=6post-synthesis4.70765.39yes (+30.8%)62.5263.74
m=6post-route1.46753.96yes (+7.9%)62.5263.74
m=8post-synthesis-0.05049.88no (-0.24%)48.0048.93
m=8post-route-0.70048.31no (-3.38%)48.0048.93
Adopt only if (a) and (b) both hold. Outcome: rejected.
CheckWithout the factorWith itHolds?
(a) Vivado Fmax leave-one-out RMS12.5%7.4%yes
(b) m=8 model MSPS (measured 49.88, infeasible)48.9352.51no
(b) m=6 model MSPS (measured 65.39)63.7468.48

How the decision was recorded, in the repository's words: the first run of this decision printed ADOPTED. That was a bug, not the rule: load_calibration caches by path, and both candidates were written to one path, so the second candidate was scored with the first one's constants (identical m=8/m=6 throughputs with and without the factor). The bug was confirmed and fixed (recalibrate.refit clears the cache after writing; a test covers it), and the rule text was not changed. A later revision counts the 20 ns rows once, since they duplicate the 10 ns rows; the outcome did not change.

RMS error on the 14 measured Vivado designs, %
ModelKindLUTFFFmax
M1 (default)error (never fitted to these)15.43.111.7
vivado-2025.2leave-one-out15.43.712.5
vivado-2025.2-m4leave-one-out15.43.712.5
Post-route Fmax as a fraction of post-synthesis Fmax, Vivado 2025.2 measured: one dot per design and constraint (16), the bar spans each family. Left of the 1.0 line, routing costs clock speed.
iterative0.915–0.946 (mean 0.932, 3 designs)
pipelined0.675–0.709 (mean 0.687, 3 designs)
pipelined_m0.786–0.969 (mean 0.900, 6 designs)
unrolled_k0.980–1.056 (mean 1.013, 4 designs)
The power index estimate divided by Vivado's core power measured (vectorless, 12.5% default toggle, confidence Low), both relative to the reference iterative W16 design, at 100 MHz. 1.0 means the index is right; left of it the index reads low. Log scale.
iterative W120.95 / 1.04
iterative W161.00 / 1.00
iterative W241.07 / 0.93
pipelined W121.16 / 1.27
pipelined W161.18 / 1.16
pipelined W241.07 / 1.14
pipelined_m W16 m=40.97 / 0.87
pipelined_m W16 m=21.02 / 0.98
pipelined_m W26 N22 m=80.95 / 0.79
pipelined_m W26 N22 m=60.97 / 0.79
unrolled_k W16 k=20.97 / 0.85
unrolled_k W16 k=30.71 / 0.58
unrolled_k W16 k=40.61 / 0.48
unrolled_k W16 k=80.83 / 0.67

post-synthesis (first number)post-route (second)iterativepipelinedpipelined_munrolled_k

RMS log error against Vivado core power, post-synthesis, 14 designs, %
Power modelParametersIn-sampleLeave-one-out
default index, normalised to the reference020.6—
default index × one fitted scale118.820.4
per-family activity (not the default)410.213.9

Implied activity per family against the default 0.125: iterative 0.1244, pipelined 0.1101, pipelined_m 0.1278, unrolled_k 0.1625.

Two designs tie at 22.0 mW post-synthesis. The repository's Spearman ranks the tie by order of appearance (0.982); averaging the tied ranks, the usual convention, gives 0.988. Both are computed at export.

Milestone 4 at a glance

Where it lost.

  • The fleet mapped the trade-off curve worse than one graph, at a higher cost. On the same five specs, seeds and 400 evaluations, the fleet had the higher hypervolume in only 18 of 55 pairs (sign test p = 0.014); significant for DeepSeek alone (6 of 25, p = 0.015), not for Qwen or Sonnet. It cost 1.41–1.60× as much per spec. The review found the fleet's shared Store was never read back and phase 2 started cold; the fix (warm starts from the Store) did not change the loss: the fixed Qwen fleet was higher in 8 of 25 (p = 0.11).
  • The ASIC model's winner misses its deadline when measured. On asic_multiaxis_control the ground truth's winner meets the 0.5 µs batch deadline at its estimated 82.5 MHz; synthesised on sky130 it runs at 72.2 MHz, and its simulated p99 is then 0.567 µs, 13.5% over.
  • The ASIC model's Fmax is optimistic. On the 9 held-out designs it never saw, area is within 5% on all of them, but Fmax is off by -14.9% to +39.6% and optimistic on 5 of 9 (by +8.8% or more).

What held.

  • The structured graph carries to the ASIC target. Every selected design met its spec (45/45), and on the power-driven spec every model's regret was a fraction of NSGA-II's (+3.5% to +15.6% against +54.0%).
  • With Qwen, the fixed fleet picked better designs: regret +6.3% against the single graph's +14.8%, lower in 22 of 25 pairs (p = 0.0002). The fixed fleet ran hours after the single arm, so provider drift is not ruled out; it is one model, and DeepSeek and Sonnet show no regret difference.
  • The family ranking is the same on both targets; the ASIC wants shallower pipelining (m=3 where the FPGA wants m=7; m=2 where it wants m=5).
  • L2 → L1 feedback works where it is needed, which on the committed specs is never: it fired in 0 of 92 recorded and 0 of 60 live searches; on a constructed spec it recovered 3 of 3 against 1 of 3 without the correction.
  • Milestone 4 cost $4.15 by the key, under the $5.00 cap, and left the FPGA path's record untouched: the 60 M2 and 30 M3 structured runs still replay identically.

The fleet A/B: one graph against a fleet of graphs

Five specs (the three ASIC specs, low_area_control and multiaxis_control), seeds 0–4, the same 400 L1 evaluations for every arm, and every run started only after the previous one finished, so its wall-clock is its own. Sonnet's fleet arm covers one spec, asic_multiaxis_control, by the owner's choice (the spend cap); a full Sonnet arm would mostly have repeated a result two models already show. The first fleet is kept as before the fix; the fixed fleet was re-run for Qwen only, on the same specs and seeds.

ModelArmRunsHV fractionRegretCost / runInput tokens / runFailed LLM callsWall-clock / run
Sonnet 5.5single graph50.820 ± 0.069+17.9% ± 3.2$0.0931measured22,318041 ± 2 s
Sonnet 5.5fleet, before the fix50.794 ± 0.051+19.9% ± 3.6$0.1488measured41,738049 ± 1 s
DeepSeek V4.1 Flashsingle graph250.870 ± 0.061+12.1% ± 11.9$0.0167measured14,5352153 ± 148 s
DeepSeek V4.1 Flashfleet, before the fix250.834 ± 0.080+15.8% ± 21.5$0.0257measured22,23310229 ± 260 s
Qwen3.8-27B (off)single graph250.829 ± 0.071+14.8% ± 11.4$0.0090measured10,594157 ± 48 s
Qwen3.8-27B (off)fleet, before the fix250.796 ± 0.099+11.7% ± 19.9$0.0127measured20,0297171 ± 188 s
Qwen3.8-27B (off)fleet, after the fix250.788 ± 0.117+6.3% ± 6.0$0.0131measured19,513089 ± 38 s

The arms are paired (same spec and seed), so the tests are paired: the exact sign test and the paired t-test, both two-sided, recomputed by this site from the run summaries and checked against the repository's table.

ModelComparisonPairsHV: fleet higher / lower (sign p)HV mean diff (t p)Regret: fleet better / worse (sign p)Regret mean diff, points (t p)
Sonnet 5.5single vs fleet, before the fix52 / 3 (1.00)−0.026 (0.55)2 / 3 (1.00)+1.9 (0.51)
DeepSeek V4.1 Flashsingle vs fleet, before the fix256 / 19 (0.015)−0.036 (0.006)12 / 12 (1.00)+3.7 (0.24)
Qwen3.8-27B (off)single vs fleet, before the fix2510 / 15 (0.42)−0.033 (0.14)18 / 6 (0.023)−3.2 (0.54)
pooled (3 models)single vs fleet, before the fix5518 / 37 (0.014)−0.033 (0.006)32 / 21 (0.17)+0.4 (0.88)
Qwen3.8-27B (off)single vs fleet, after the fix258 / 17 (0.11)−0.040 (0.11)22 / 3 (0.0002)−8.6 (0.001)
Qwen3.8-27B (off)after the fix vs before2512 / 13 (1.00)−0.007 (0.67)13 / 11 (0.84)−5.4 (0.21)

Hypervolume: the single graph maps more of the front. Pooled over the first fleets the loss is significant (p = 0.014), and for DeepSeek alone; for Qwen (10 of 25, p = 0.42) and Sonnet (5 pairs) it is not. The fixed fleet against the first: 12 higher, 13 lower. The cold restart did not explain the loss. The repository's reading of the records, not a tested cause: a fixed split by contract class allocates worse than the architect's own early choice of families, and smaller per-member studies cost front coverage.

Regret: a gain with Qwen. The first Qwen fleet picked the better design in 18 of 24 untied pairs (p = 0.023), the fixed one in 22 of 25 (p = 0.0002, mean -8.6 points). Caveat: the fixed fleet ran hours after the single arm it is paired with, and the repository measured large provider drift for Qwen elsewhere, so drift is not ruled out; its regret is lower on all five specs, which a uniform drift would not explain on its own.

Throughput, measured, and what it projects to. Designs evaluated per hour of wall-clock, one run at a time; the three 24-hour columns are projections: the measured rates multiplied by 24 hours of back-to-back runs on one machine, assuming nothing changes (provider latency, rate limits, the spec mix). They were not run.

ModelArmDesigns evaluated / hour (measured)Cost per spec (measured)Projection: designs / 24 hProjection: specs / 24 hProjection: cost / 24 h
Sonnet 5.5single graph35,002$0.0931840,0582,100$195.45
Sonnet 5.5fleet, before the fix29,256$0.1488702,1541,755$261.19
DeepSeek V4.1 Flashsingle graph9,410$0.0167225,847565$9.43
DeepSeek V4.1 Flashfleet, before the fix6,292$0.0257151,007378$9.71
Qwen3.8-27B (off)single graph25,212$0.0090605,0841,513$13.64
Qwen3.8-27B (off)fleet, before the fix8,400$0.0127201,609504$6.40
Qwen3.8-27B (off)fleet, after the fix16,094$0.0131386,266966$12.64

ASIC specs: the structured graph against the baselines

Five seeds per model on the three ASIC specs, against NSGA-II and random search with the same budget, all scored on the ASIC ground truth (the system spec on simulated feasibility):

SpecMetricNSGA-IIrandomSonnet 5.5DeepSeek V4.1 FlashQwen3.8-27B (off)
asic_low_arearegret+6.1% ± 3.3+8.1% ± 2.2+0.8% ± 0.7+4.7% ± 4.6+10.6% ± 13.5
HV fraction0.922 ± 0.0450.863 ± 0.0560.925 ± 0.0220.923 ± 0.0250.859 ± 0.062
asic_power_50mspsregret+54.0% ± 36.1+60.0% ± 44.5+3.5% ± 2.0+15.6% ± 19.5+10.1% ± 6.4
HV fraction0.812 ± 0.0470.750 ± 0.0610.777 ± 0.0460.794 ± 0.0590.754 ± 0.073
asic_multiaxis_controlregret+23.4% ± 5.0+37.6% ± 5.5+17.9% ± 3.2+25.1% ± 3.0+21.6% ± 2.5
HV fraction0.837 ± 0.0520.705 ± 0.0220.820 ± 0.0690.864 ± 0.0510.844 ± 0.043
ModelRunsSelected design meets the specL2 changed the L1 pickCost / runWall-clock / run
anthropic/claude-sonnet-5.51515/152$0.0764measured32 ± 7 s
deepseek/deepseek-v4.1-flash1515/150$0.0164measured116 ± 40 s
qwen/qwen3.8-27b, reasoning off1515/150$0.0086measured51 ± 17 s

Loss: on asic_multiaxis_control nobody gets close: NSGA-II and the three models all land +17.9% to +25.1% above the true winner, whose trick (two more iterations for a narrower angle path and a faster clock) sits in a corner the L1 bound hides. Hypervolume on the power spec is below NSGA-II's for every model (0.754–0.794 against 0.812). And these winners are scored on the model's estimates: the held-out check shows the multiaxis winner itself misses the deadline when measured.

The ASIC target: ground truth on both targets

SpecFeasible (of 635,040)sky130 winnerFPGA twin's winnerFamily ranking (both targets)
asic_low_area
throughput_msps >= 1, max_abs_err <= 2^-10; min area_um2
303,056iterative W=15 N=12 (6,860 µm²)estimateiterative W=15 N=12 (251 LUT+FF)iterative < unrolled_k < pipelined_m < pipelined
same on both
asic_power_50msps
throughput_msps >= 50, max_abs_err <= 2^-12; min power_index
28,565pipelined_m W=17 N=14 m=3 (1.68)estimatepipelined_m W=17 N=14 m=7 (1.79)pipelined_m < pipelined
same on both (one pairwise comparison)
asic_multiaxis_control
throughput_msps >= 32, max_abs_err <= 2^-12, sys_p99_batch_us <= 0.5; min area_um2
7,898
8,533 pass the L1 bound
pipelined_m W=17 N=16 m=2 (32,845 µm²)estimatepipelined_m W=17 N=14 m=5 (1,013 LUT+FF)pipelined_m < pipelined
same on both (one pairwise comparison)

On asic_low_area all four families are feasible and rank the same on both targets; pipelined costs 4.17× the winner's area on sky130 and 4.99× its LUT+FF on the FPGA. The FPGA-or-ASIC animation steps through the depth sweeps, and the calibration, the held-out check and the deadline miss are there too.

L2 → L1 feedback

The constructed spec l2_feedback_bursty: bursts of 32 requests at 130 MS/s, a sustained throughput floor of 130 MS/s, p99 latency within 0.4 µs. 37,882 designs pass the L1 bound and 447 the simulation. Fifteen searches of 400 evaluations:

Search (400 evaluations)Pass the L1 boundPass L2Feedback firesCorrected bound: outcome, evals, regretUncorrected bound
nsga2 s01884no——
nsga2 s12051no——
nsga2 s220616no——
nsga2 s31735no——
nsga2 s41641no——
random s0482no——
random s1480yesrecovered, 60, +17.3%recovered, 60
random s2621no——
random s3570yesrecovered, 60, +3.8%no_feasible, 180
random s4480yesrecovered, 120, +30.7%no_feasible, 180
rule-based architect s021220no——
rule-based architect s118018no——
rule-based architect s214015no——
rule-based architect s315914no——
rule-based architect s416327no——

The correction recovered a passing design in 3 of 3 (regret +17.3% against the true winner); the same re-exploration budget screened with the uncorrected bound recovered 1. Three cases is thin evidence. The first version of this spec had a 1 MS/s throughput floor, a strawman against a 130 MS/s stream; with it the feedback fired in 6 of 15. The review caught it and the repository kept both results.

What M4 cost

The key's usage rose by $4.15 over milestone 4 ($3.83 for the first pass and $0.32 for the fixed-fleet re-run), under the $5.00 cap measured. That reading is the authoritative one: calls that fail inside the client report no usage. The provider-reported ledger has 147 entries, $3.84; the archived traces hold 941 calls in 314 run directories (one per structured run and one per fleet member's run). The models were checked as listed, with tools and structured outputs and no substitution, before the first call.

Ledger entry (model / arm)RunsProvider-reported USD
anthropic/claude-sonnet-5.5 / fleet50.7440
anthropic/claude-sonnet-5.5 / structured (structured)151.1459
deepseek/deepseek-v4.1-flash / fleet250.6431
deepseek/deepseek-v4.1-flash / structured (single)100.1719
deepseek/deepseek-v4.1-flash / structured (structured)150.2459
qwen/qwen3.8-27b / fleet250.3175
qwen/qwen3.8-27b / fleet (pilot)10.0158
qwen/qwen3.8-27b / fleet (v2)250.3273
qwen/qwen3.8-27b / structured (pilot)10.0071
qwen/qwen3.8-27b / structured (single)100.0961
qwen/qwen3.8-27b / structured (structured)150.1292
total1473.8438

Milestone 3 at a glance

  • A free-form campaign agent gained nothing over the structured graph, at a higher cost. On the same specs, seeds and budget, its hypervolume and regret, averaged over the specs, were slightly worse for every model, it cost 1.44–2.25× as much per run, Qwen looped in 4 of its 30 campaigns, and in 52 of 65 campaigns its plan came down to one call to the structured graph. It stays experimental, off by default.
  • Cross-run memory showed no benefit in the one model and three seeds it was tested on.
  • System-level simulation changes the winner where the system is the hard part. On multiaxis_control only the simulation finds the right design (m=4); on bursty_offload a back-of-envelope peak-rate floor finds the same winner, and on dds_sfdr nothing changes, a negative result the repository keeps.
  • The structured graph keeps its M2 pattern on the new specs: hypervolume at or above NSGA-II's (one exception, by 0.002) and much lower regret.

The A/B: structured graph against the campaign agent

Same specs, same seeds, same 400 evaluations per spec. The structured arm is the M2 runs on the four M2 specs (replayed through the M3 graph: 60 of 60 identical, so they can be reused) and fresh runs on the two system specs; the campaign arm is one single-spec campaign per spec and seed, memory off, with the same model as campaign agent and inner architect. The Sonnet campaign arm covers one spec, multiaxis_control, by the owner's choice (the full arm would have cost about 6.9 dollars against the 5-dollar cap); DeepSeek and Qwen cover all six.

Model (specs in both arms)RunsHV, mean of the feasible specsRegret, sameCost / run measuredInput tokens / runWall-clock / runFailed campaigns
Sonnet 5.5
multiaxis_control only
5 → 50.839 → 0.833+3.2% → +5.7%$0.0996 → $0.2243 (2.25×)24,382 → 85,627 (3.5×)44.8 s → 62.4 s0/5 → 0/5
DeepSeek V4.1 Flash
all 6 specs
30 → 300.905 → 0.893+7.3% → +7.7%$0.0123 → $0.0199 (1.62×)13,170 → 80,312 (6.1×)99.1 s → 133 s0/30 → 0/30
Qwen3.8-27B, reasoning off
all 6 specs
30 → 300.872 → 0.819+9.2% → +19.0%$0.0075 → $0.0108 (1.44×)10,112 → 89,869 (8.9×)59.6 s → 178 s0/30 → 4/30

Wall-clock is not controlled: in that session three or four runs (structured, campaign and memory-on) ran at a time, and the structured runs on the M2 specs come from the M2 session. Hypervolume and regret are the mean of the per-spec means over the feasible specs; the infeasible spec was called correctly by every run of both arms, the campaigns after spending their whole budget re-checking it.

No gain, higher cost. In 52 of the 65 campaigns the agent spent its whole budget on one run_dse(400), so its result is the structured graph's plus sampling noise, and then walked the ladder. Where it deviated, it did not help: on low_area_control seed 0 its notes to the inner architect narrowed the first box, and the run ended at hypervolume 0.097 and +224.5% regret (Qwen3.8-27B, reasoning off). Qwen failed 4 campaigns by re-running verify, synthesize and back-annotate until the 40-call cap (each had already used its 400 evaluations, so each is still scored). The campaigns read 3.5×–8.9× as many input tokens per run. And the ladder's tools rarely had anything to say: most selections have W ≥ 15, which has no recorded RTL or synthesis data and is too large for a fresh exhaustive run inside a campaign.

In the 65 A/B campaignsCampaigns
one run_dse(400) call to the structured graph, nothing else at L152 of 65
explore_family (its own NSGA-II study)13 of 65
simulate_system (L2)50 of 65
verify_rtl (L3): a recorded L3 row / a fresh run / nothing to verify1 / 0 / 54 of 55
synthesize (L4, recorded data only): measurements found1 of 55
back_annotate (L5): compared with measured data1 of 61
reexplore (the L5 loop)1 of 65
L2 changed the selection (structured / campaign)0/30 / 4/65

Per spec, the same comparison:

HV fraction, structured → campaign (mean ± std over 5 seeds)
SpecSonnet 5.5DeepSeek V4.1 FlashQwen3.8-27B, reasoning off
dds_250msps0.839 ± 0.079 → —0.897 ± 0.048 → 0.897 ± 0.0590.898 ± 0.036 → 0.869 ± 0.004
high_precision0.975 ± 0.004 → —0.982 ± 0.012 → 0.980 ± 0.0060.895 ± 0.159 → 0.895 ± 0.153
infeasible_dds_400mspsn/a → —n/a → n/an/a → n/a
low_area_control0.876 ± 0.025 → —0.919 ± 0.044 → 0.878 ± 0.0510.889 ± 0.011 → 0.694 ± 0.304
multiaxis_control0.839 ± 0.019 → 0.833 ± 0.0290.857 ± 0.016 → 0.831 ± 0.0200.841 ± 0.027 → 0.817 ± 0.018
bursty_offload0.859 ± 0.025 → —0.869 ± 0.013 → 0.878 ± 0.0100.838 ± 0.030 → 0.820 ± 0.069
Selection regret, structured → campaign (mean ± std over 5 seeds)
SpecSonnet 5.5DeepSeek V4.1 FlashQwen3.8-27B, reasoning off
dds_250msps+5.5% ± 2.8 → —+7.6% ± 1.2 → +4.4% ± 3.5+4.0% ± 2.7 → +5.0% ± 2.3
high_precision+3.9% ± 0.6 → —+2.7% ± 1.9 → +3.1% ± 0.9+17.5% ± 27.2 → +17.5% ± 26.1
infeasible_dds_400msps— → —— → —— → —
low_area_control+1.4% ± 1.3 → —+5.1% ± 3.3 → +4.1% ± 1.2+3.7% ± 0.7 → +54.8% ± 86.1
multiaxis_control+3.2% ± 2.3 → +5.7% ± 1.9+11.8% ± 5.0 → +13.0% ± 6.7+4.9% ± 3.8 → +6.0% ± 4.6
bursty_offload+9.1% ± 5.1 → —+9.4% ± 8.8 → +14.3% ± 7.5+15.8% ± 6.5 → +11.9% ± 5.9

Memory on vs off

The campaign agent can carry lessons from one spec to the next: code writes them after every spec (per family, per spec class, calibration history) and the agent can add notes of its own. The test: Qwen3.8-27B, reasoning off on a fixed sequence of four specs, 3 seeds, memory on against the campaign arm's memory-off runs.

Qwen3.8-27B, reasoning off, seeds 0, 1, 2: off → on
Spec (position in the sequence)HV fractionSelection regretCost / run
low_area_control (1, empty store in both)0.564 ± 0.335 → 0.915 ± 0.016+89.2% ± 96.9 → +2.2% ± 3.1$0.0121 → $0.0126
bursty_offload (2)0.869 ± 0.028 → 0.881 ± 0.035+9.9% ± 6.9 → +11.1% ± 2.6$0.0126 → $0.0114
dds_250msps (3)0.872 ± 0.001 → 0.650 ± 0.213+5.0% ± 1.3 → +3.3% ± 1.3$0.0122 → $0.0104
multiaxis_control (4)0.826 ± 0.013 → 0.706 ± 0.079+4.1% ± 2.6 → +17.8% ± 10.8$0.0112 → $0.0128

No benefit is visible. The first spec starts with an empty store in both conditions, so its large gap (0.564 → 0.915) is run-to-run noise, which also shows how wide the noise is at three seeds. Later in the sequence memory-on is worse on hypervolume for dds_250msps and multiaxis_control. The lessons themselves were sensible ("unrolled_k: explored in 3 specs, on the front in 0"). The agent's own notes also copied numbers from tool outputs, once inconsistently; since the review, every number in LLM-written text is masked before it is stored or passed on (the live runs predate that). One model, three seeds: weak evidence either way.

System specs: what the simulation changes

Three new specs constrain the system, not just the unit: a batch deadline, a p99 latency under bursts, a DDS that must never stall with a spurious-free dynamic range of at least 90 dBc. Each has an exhaustive ground truth, simulated for every one of the 635,040 designs, and three more views of it: what the L1 bound sees, the spec read in milestone-2 terms (a throughput floor at the system's average rate), and, recomputed for this site, a floor at the peak rate the system needs.

Spec and its systemFeasible designs: simulated / L1 bound / MSPS-onlyWinner, simulated (LUT+FF)L1-bound winnerMSPS-only winner (average rate)Peak-rate floor
bursty_offload
bursty requests: bursts of 8 (0 ns apart) arriving as a Poisson process, 2 requests/us on average
151,528 / 151,528 / 303,056pipelined_m W=15 N=12 m=6 (745)simulatedpipelined_m W=15 N=12 m=6 (745)iterative W=15 N=12 (251)
winner changes
≥ 20 MSPS: pipelined_m W=15 N=12 m=6 (745), 151,528 feasible
= the simulated winner
dds_sfdr (ground truth only)
DDS feeding a mixer: one phase word every 5 ns (200 MS/s), FIFO depth 16, NCO stalls when it is full
12,334 / 12,334 / 12,363pipelined W=18 N=15 (1,843)simulatedpipelined W=18 N=15 (1,843)pipelined W=18 N=15 (1,843)
same winner
—
multiaxis_control
control loop: a tick every 1 us issues 32 requests at once (32 requests/us on average)
51,244 / 53,667 / 115,304pipelined_m W=17 N=14 m=4 (1,072)simulatedpipelined_m W=17 N=14 m=5 (1,013)pipelined_m W=17 N=14 m=7 (953)
winner changes
≥ 72.7 MSPS: pipelined_m W=17 N=14 m=5 (1,013), 66,383 feasible
≠ the simulated winner
  • multiaxis_control: the simulation is needed. The average-rate view picks m=7, the L1 bound and a peak-rate floor both pick m=5, and m=5 misses the simulated 0.44 µs deadline by 1.5%, because a tick lands between clock edges and up to a cycle passes before the first accept. Only the simulation gets to m=4 (51,244 designs pass it, 53,667 pass the bound). The replay on How it works shows it request by request.
  • bursty_offload: average-rate sizing is wrong, but simulation is not needed. In milestone-2 terms the winner is the small FSM design that wins low_area_control (251 LUT+FF), but it takes one request every 15 cycles, so the eighth request of a burst waits for the other seven: its simulated p99 is 1.18 µs, 2× even its bound. The winner is a pipelined_m at 3× the area. But sizing for the burst (8 requests in 0.4 µs, 20 MSPS) gives the same winner and the same 151,528 designs.
  • dds_sfdr: a negative result. For this design space the DDS's system constraints reduce to the throughput-only view: the throughput-only winner already has 100.3 dBc spurious-free dynamic range, and "no stall" is "throughput ≥ the sample rate". The repository keeps it as evidence and does not evaluate agents on it.

The structured graph on the system specs

Five fresh runs per model on the two evaluated system specs. The baselines get the same L1 screening and the same L2 step at the end, and every run is scored on simulated feasibility against the exhaustive ground truth.

multiaxis_control: true winner pipelined_m W=17 N=14 m=4 (1,072 LUT+FF)
MethodHV fractionSelection regret (optimal)Selected design meets the spec (simulated)L2 changed the L1 pick
NSGA-II + L2 step0.806 ± 0.071+16.0% ± 7.0 (0/5 optimal)5/5—
Random search + L2 step0.633 ± 0.032+33.1% ± 10.5 (0/5 optimal)5/5—
structured: Sonnet 5.50.839 ± 0.019+3.2% ± 2.3 (1/5 optimal)5/50/5
structured: DeepSeek V4.1 Flash0.857 ± 0.016+11.8% ± 5.0 (0/5 optimal)5/50/5
structured: Qwen3.8-27B, reasoning off0.841 ± 0.027+4.9% ± 3.8 (1/5 optimal)5/50/5
bursty_offload: true winner pipelined_m W=15 N=12 m=6 (745 LUT+FF)
MethodHV fractionSelection regret (optimal)Selected design meets the spec (simulated)L2 changed the L1 pick
NSGA-II + L2 step0.840 ± 0.020+26.7% ± 6.4 (0/5 optimal)5/5—
Random search + L2 step0.733 ± 0.032+31.7% ± 11.6 (0/5 optimal)5/5—
structured: Sonnet 5.50.859 ± 0.025+9.1% ± 5.1 (0/5 optimal)5/50/5
structured: DeepSeek V4.1 Flash0.869 ± 0.013+9.4% ± 8.8 (1/5 optimal)5/50/5
structured: Qwen3.8-27B, reasoning off0.838 ± 0.030+15.8% ± 6.5 (0/5 optimal)5/50/5

Every selected design met the spec in simulation. The agents' hypervolume is 0.838–0.869 against NSGA-II's 0.806–0.840 (the one cell below NSGA-II: Qwen on bursty_offload), and their regret is +3.2% to +15.8% against NSGA-II's +16.0% and +26.7%. L2 changed the L1 selection in 0 of the 30 structured runs: their L1 picks already passed the simulation. It did change it in 4 campaign runs, all on multiaxis_control, where the L1 pick was the m=5 design.

The map_front fix (offline)

Milestone 2's worst run (Qwen, high_precision, one seed) came from a blind spot: front-mapping only revisited families already on the front. Milestone 3 gives a family that was explored without a feasible design a share of the mapping budget, gated on its own designs having met the structural constraints. Tested offline on the 60 recorded M2 decisions:

LLM replays (3 models × 5 seeds), HV / regret
SpecM2 leversFix, unconditionalFix, gated (LEVERS_M3)Selections changed: unconditional / gated
dds_250msps0.878 / +5.7%0.781 / +5.9%0.878 / +5.7%5 / 0 of 15
high_precision0.951 / +8.0%0.966 / +5.2%0.974 / +4.0%10 / 1 of 15
low_area_control0.895 / +3.4%0.885 / +3.4%0.885 / +3.4%0 / 0 of 15

The unconditional version spends budget on families that can never reach 250 MSPS. The gated version's high_precision gain (+8.0% → +4.0% regret) comes from that single run, and it lowers hypervolume on four low_area_control replays without changing a selection; the gate was also refined on these same replays. By the owner's decision it is the default only for the system specs, so the M2 results stand as recorded.

What M3 cost

The key's usage rose by $3.58 over the M3 session, under the $5.00 cap; that reading is the authoritative one, because calls that fail inside the client report no usage. The provider-reported ledger has 114 entries, $3.49: structured $1.19, campaign $2.30 including the memory runs and the pilots. The models were checked as listed, with tools and structured outputs and no substitution, at the start of the session.

Ledger entry (provider-reported)RunsUSD measured
campaign652.0421
campaign (interrupted (restart after a scoring-bug fix), re-run [memory-on])10.0090
campaign (interrupted (restart after a scoring-bug fix), re-run)10.0077
campaign (interrupted by a container restart, re-run)10.0008
campaign (lost to a scoring bug in run_eval (round tags), re-run)10.0207
campaign (memory-on)120.1416
campaign (pilot attempt 1 (failed: ls loop, killed))10.0576
campaign (pilot)10.0177
structured301.1835
structured (pilot)10.0095
ledger total1143.4901
the archived traces' per-call cost (1,898 calls in 110 runs; the ledger also has the 4 interrupted or lost runs that were re-run, $0.0382)—3.4519
the key's usage, 2026-10-09 16:28:55Z → 2026-10-09 19:34:30Z (authoritative)—3.5775

M1 → M2

Loading the animation…

The front-mapping gap is closed. Every M2 model now covers 0.96–1.09× NSGA-II's hypervolume on every feasible spec, where in M1 the agents reached 0.18–0.87× on the two specs they lost. And the selection lead mostly survives: mean regret is below NSGA-II's in 8 of the 9 model-and-spec cells.

Where it got worse

Plainly, first.

  • Qwen on high_precision lost to NSGA-II on selection: +17.5% mean regret (± 27.2%) against NSGA-II's +10.3%, up from +7.5% in M1. One seed accounts for it: its first box for pipelined_m was too narrow to reach the accuracy target, the front became a single pipelined design, and front-mapping only revisits the families on the front, so the winner's family never came back. That seed selected a design +71.7% from the optimum; the median of its five seeds is +5.6%. The same seed pulls its high_precision hypervolume below NSGA-II's (the one cell under 1.0 above). Milestone 3 built a fix and tested it offline on these recorded runs (above); by the owner's decision it is the default only for the new system specs, so this result stands as recorded.
  • DeepSeek's selection got worse: +2.2% → +7.6% on dds_250msps and +1.6% → +5.1% on low_area_control. It chose map_front in 13 of its 15 feasible-spec runs (Qwen 7, Sonnet 4), spending its rounds on coverage rather than on the corner. It still beats NSGA-II on both.
  • The agent now always uses the whole budget on feasible specs, 400 evaluations like the baselines, by design: the reserve spends what is left on mapping. M1's "fewer evaluations" came with its narrow fronts.
  • Five seeds is still a small sample: several cells overlap within one standard deviation (DeepSeek on low_area_control, for one).

Where it held

The infeasible spec is still caught every time: every model on every seed declared it infeasible itself (15 of 15 runs), naming throughput as the binding constraint, usually after 100–200 evaluations. The baselines can only report that they found nothing.

SpecNSGA-IIRandomSonnet 5.5DeepSeek V4.1 FlashQwen3.8-27B, reasoning off
dds_250mspsM1 0.800 ± 0.0020.826 ± 0.034M1 0.752 ± 0.0650.758 ± 0.059M1 0.256 ± 0.0490.839 ± 0.079M1 0.695 ± 0.1900.897 ± 0.048M1 0.369 ± 0.1830.898 ± 0.036
low_area_controlM1 0.905 ± 0.0390.898 ± 0.032M1 0.856 ± 0.0650.862 ± 0.054M1 0.207 ± 0.0490.876 ± 0.025M1 0.202 ± 0.0310.919 ± 0.044M1 0.164 ± 0.0130.889 ± 0.011
high_precisionM1 0.920 ± 0.0680.934 ± 0.056M1 0.880 ± 0.0200.798 ± 0.105M1 0.979 ± 0.0020.975 ± 0.004M1 0.961 ± 0.0220.982 ± 0.012M1 0.951 ± 0.0310.895 ± 0.159

Mean ± population standard deviation over seeds (M1: 3, M2: 5, in bold), 400 evaluations per run, scored against the exhaustive ground truth with the unchanged M1 cost model. Hypervolume: fraction of the true front's hypervolume the run's feasible designs cover (higher is better). The repository's results.md, row for row.

SpecNSGA-IIRandomSonnet 5.5DeepSeek V4.1 FlashQwen3.8-27B, reasoning off
dds_250mspsM1 +12.3% ± 4.0+12.9% ± 3.6M1 +15.5% ± 3.2+14.7% ± 2.8M1 +6.1% ± 0.5+5.5% ± 2.8M1 +2.2% ± 1.5+7.6% ± 1.2M1 +4.0% ± 1.7+4.0% ± 2.7
low_area_controlM1 +8.0% ± 1.4+7.5% ± 1.6M1 +11.5% ± 3.6+11.1% ± 2.8M1 +2.9% ± 1.7+1.4% ± 1.3M1 +1.6% ± 0.6+5.1% ± 3.3M1 +12.2% ± 16.5+3.7% ± 0.7
high_precisionM1 +12.4% ± 10.9+10.3% ± 8.9M1 +18.6% ± 3.2+32.7% ± 17.9M1 +3.1% ± 0.4+3.9% ± 0.6M1 +6.0% ± 3.5+2.7% ± 1.9M1 +7.5% ± 4.7+17.5% ± 27.2

Mean ± population standard deviation over seeds (M1: 3, M2: 5, in bold), 400 evaluations per run, scored against the exhaustive ground truth with the unchanged M1 cost model. Selection regret: how much worse the selected design is than the true optimum on the spec's selection metric (lower is better). The repository's results.md, row for row.

Pareto replay

Pick a run, M2 or M1, and watch it explore round by round: what the LLM asked for, what code found, the front so far against the true front, and the LLM's verdict on each round in its own words. M2's front-mapping rounds are marked; the last one is code's alone.

Loading the animation…

The hypervolume race

How quickly each method covers the true front, evaluation by evaluation. Switch to M1 to see the agents' lines go flat when their runs stopped; in M2 they keep climbing to the end of the budget.

Loading the animation…

Every spec, every method (M2)

The selected design of every seed, its regret, the front coverage, and what the LLM cost on that spec: tokens, dollars per run and dollars per evaluated design. The baselines use no LLM.

dds_250msps: NCO / DDS sin-cos generator for a digital up-converter. One sample per clock at >= 250 MSPS, max error <= 2^-13. Minimise LUTs. True optimum on luts: pipelined W=18 N=15.

MethodSelected design, by seed (regret)Meets specMean regretHV at endEvals to 95% HVEvals usedTokens in / out$ per run$ per evaluated design
NSGA-IIbaseline0: pipelined W=19 N=15 +9.8%1: pipelined W=18 N=17 +17.9%2: pipelined W=18 N=15 +9.1%3: pipelined W=21 N=15 +16.3%4: pipelined W=18 N=15 +11.4%5/5+12.9% ± 3.6 (0/5 optimal)0.826 ± 0.034not reached (0/5)400no LLM$0$0
Random searchbaseline0: pipelined W=20 N=16 +17.6%1: pipelined W=19 N=15 +10.9%2: pipelined W=21 N=15 +17.9%3: pipelined W=17 N=16 +14.6%4: pipelined W=18 N=15 +12.3%5/5+14.7% ± 2.8 (0/5 optimal)0.758 ± 0.059not reached (0/5)400no LLM$0$0
Sonnet 5.5agent0: pipelined W=18 N=15 +6.5%1: pipelined W=21 N=15 +9.8%2: pipelined W=19 N=15 +6.5%3: pipelined W=18 N=15 +3.3%4: pipelined W=18 N=15 +1.6%5/5+5.5% ± 2.8 (0/5 optimal)0.839 ± 0.079not reached (0/5)400100,518 / 17,018$0.0742$0.000186
DeepSeek V4.1 Flashagent0: pipelined W=19 N=15 +8.1%1: pipelined W=17 N=15 +7.2%2: pipelined W=19 N=15 +9.8%3: pipelined W=18 N=15 +6.5%4: pipelined W=20 N=15 +6.5%5/5+7.6% ± 1.2 (0/5 optimal)0.897 ± 0.048not reached (0/5)40063,745 / 58,374$0.0117$0.000029
Qwen3.8-27B, reasoning offagent0: pipelined W=19 N=15 +3.3%1: pipelined W=19 N=15 +3.3%2: pipelined W=18 N=15 (optimum)3: pipelined W=18 N=16 +5.4%4: pipelined W=18 N=15 +8.1%5/5+4.0% ± 2.7 (1/5 optimal)0.898 ± 0.036316 (1/5 reached)40053,360 / 13,452$0.0073$0.000018

M2: 5 seeds per method, mean ± population standard deviation. Regret, HV and evaluations to 95% are the repository's results.md rows; tokens and dollars are this spec's 5 runs, measured provider-reported (OpenRouter, 2026-10-09). The agents now spend the whole budget on feasible specs: code maps the front with whatever is left before a run stops.

low_area_control: Field-oriented motor-control loop needing sin/cos of the rotor angle at >= 1 MSPS with max error <= 2^-10. Area is everything: minimise LUTs + FFs. True optimum on luts_plus_ffs: iterative W=15 N=12.

MethodSelected design, by seed (regret)Meets specMean regretHV at endEvals to 95% HVEvals usedTokens in / out$ per run$ per evaluated design
NSGA-IIbaseline0: iterative W=14 N=18 +8.9%1: iterative W=16 N=15 +6.1%2: iterative W=15 N=20 +9.2%3: iterative W=15 N=15 +5.3%4: iterative W=16 N=16 +8.3%5/5+7.5% ± 1.6 (0/5 optimal)0.898 ± 0.032340 (1/5 reached)400no LLM$0$0
Random searchbaseline0: iterative W=15 N=13 +7.5%1: iterative W=16 N=15 +10.7%2: iterative W=15 N=18 +16.1%3: iterative W=16 N=14 +10.2%4: iterative W=14 N=17 +11.1%5/5+11.1% ± 2.8 (0/5 optimal)0.862 ± 0.054not reached (0/5)400no LLM$0$0
Sonnet 5.5agent0: iterative W=14 N=14 +3.3%1: iterative W=15 N=16 +2.5%2: iterative W=15 N=12 (optimum)3: iterative W=15 N=12 (optimum)4: iterative W=15 N=12 +1.1%5/5+1.4% ± 1.3 (2/5 optimal)0.876 ± 0.025below NSGA-IInot reached (0/5)400115,186 / 14,883$0.0758$0.000190
DeepSeek V4.1 Flashagent0: iterative W=15 N=12 +1.1%1: iterative W=15 N=12 +2.2%2: iterative W=15 N=16 +8.8%3: iterative W=14 N=15 +4.5%4: iterative W=14 N=15 +9.1%5/5+5.1% ± 3.3 (0/5 optimal)0.919 ± 0.044334 (1/5 reached)40072,798 / 70,464$0.0151$0.000038
Qwen3.8-27B, reasoning offagent0: iterative W=15 N=14 +2.5%1: iterative W=15 N=14 +3.6%2: iterative W=15 N=16 +4.1%3: iterative W=14 N=15 +4.5%4: iterative W=15 N=13 +3.6%5/5+3.7% ± 0.7 (0/5 optimal)0.889 ± 0.011below NSGA-IInot reached (0/5)40061,912 / 17,832$0.0093$0.000023

M2: 5 seeds per method, mean ± population standard deviation. Regret, HV and evaluations to 95% are the repository's results.md rows; tokens and dollars are this spec's 5 runs, measured provider-reported (OpenRouter, 2026-10-09). The agents now spend the whole budget on feasible specs: code maps the front with whatever is left before a run stops.

high_precision: Coherent demodulator for a precision instrument: max error <= 2^-20 at >= 50 MSPS. Minimise area (LUTs + FFs) and the relative power index. True optimum on luts_plus_ffs: pipelined_m W=26 N=22 m=6.

MethodSelected design, by seed (regret)Meets specMean regretHV at endEvals to 95% HVEvals usedTokens in / out$ per run$ per evaluated design
NSGA-IIbaseline0: pipelined_m W=26 N=28 m=7 +27.8%1: pipelined_m W=26 N=22 m=7 +4.5%2: pipelined_m W=25 N=23 m=6 +4.9%3: pipelined_m W=26 N=23 m=6 +8.6%4: pipelined_m W=25 N=22 m=6 +5.4%5/5+10.3% ± 8.9 (0/5 optimal)0.934 ± 0.056252 (3/5 reached)400no LLM$0$0
Random searchbaseline0: pipelined_m W=28 N=23 m=6 +20.8%1: pipelined_m W=28 N=23 m=6 +21.0%2: pipelined_m W=25 N=24 m=4 +14.0%3: pipelined_m W=28 N=30 m=4 +60.2%4: pipelined_m W=28 N=28 m=6 +47.6%5/5+32.7% ± 17.9 (0/5 optimal)0.798 ± 0.105not reached (0/5)400no LLM$0$0
Sonnet 5.5agent0: pipelined_m W=26 N=22 m=6 +3.4%1: pipelined_m W=25 N=23 m=6 +3.7%2: pipelined_m W=26 N=22 m=6 +3.5%3: pipelined_m W=25 N=23 m=6 +3.7%4: pipelined_m W=25 N=23 m=7 +4.9%5/5+3.9% ± 0.6 (0/5 optimal)0.975 ± 0.00418 (5/5 reached)40071,344 / 21,099$0.0707$0.000177
DeepSeek V4.1 Flashagent0: pipelined_m W=27 N=22 m=7 +2.4%1: pipelined_m W=26 N=22 m=6 (optimum)2: pipelined_m W=24 N=23 m=7 +5.9%3: pipelined_m W=25 N=23 m=7 +2.6%4: pipelined_m W=27 N=22 m=6 +2.4%5/5+2.7% ± 1.9 (1/5 optimal)0.982 ± 0.012192 (5/5 reached)40061,813 / 54,290$0.0103$0.000026
Qwen3.8-27B, reasoning offagent0: pipelined_m W=25 N=24 m=6 +6.5%1: pipelined W=25 N=23 +71.7%2: pipelined_m W=26 N=22 m=6 +5.6%3: pipelined_m W=27 N=22 m=6 +3.6%4: pipelined_m W=26 N=22 m=6 (optimum)5/5+17.5% ± 27.2 (1/5 optimal)0.895 ± 0.159below NSGA-II132 (4/5 reached)40046,123 / 14,190$0.0078$0.000020

M2: 5 seeds per method, mean ± population standard deviation. Regret, HV and evaluations to 95% are the repository's results.md rows; tokens and dollars are this spec's 5 runs, measured provider-reported (OpenRouter, 2026-10-09). The agents now spend the whole budget on feasible specs: code maps the front with whatever is left before a run stops.

infeasible_dds_400msps: Wideband DDS needing >= 400 MSPS single-lane sin/cos with max error <= 2^-12. Minimise LUTs. No design meets it: the fastest of 635,040 reaches 292 MSPSestimate.

MethodSelected design, by seed (regret)Meets specInfeasible calledHV at endEvals to 95% HVEvals usedTokens in / out$ per run$ per evaluated design
NSGA-IIbaselinenone (correct)n/a5/5 (found nothing feasible)n/an/a400no LLM$0$0
Random searchbaselinenone (correct)n/a5/5 (found nothing feasible)n/an/a400no LLM$0$0
Sonnet 5.5agentnone (correct)n/a5/5 (the LLM declared it: 5/5)n/an/a10039,048 / 9,266$0.0342$0.000342
DeepSeek V4.1 Flashagentnone (correct)n/a5/5 (the LLM declared it: 5/5)n/an/a18033,786 / 51,845$0.0086$0.000048
Qwen3.8-27B, reasoning offagentnone (correct)n/a5/5 (the LLM declared it: 5/5)n/an/a10020,239 / 6,573$0.0045$0.000045

M2: 5 seeds per method, mean ± population standard deviation. Regret, HV and evaluations to 95% are the repository's results.md rows; tokens and dollars are this spec's 5 runs, measured provider-reported (OpenRouter, 2026-10-09). The agents now spend the whole budget on feasible specs: code maps the front with whatever is left before a run stops.

What the LLM cost, by model (M2)

Model (OpenRouter ID)ReasoningRunsTokens in / out$ per run$ per spec$ per evaluated designWall-clock per run
anthropic/claude-sonnet-5.5provider default20326,096 / 62,266$0.0637± 0.0183$0.3187$0.00019627.7 s
deepseek/deepseek-v4.1-flashprovider default20232,142 / 234,973$0.0114± 0.0043$0.0572$0.00003389.1 s
qwen/qwen3.8-27boff20181,634 / 52,047$0.0073± 0.0020$0.0363$0.00002247.5 s

measured M2: provider-reported usage and cost from OpenRouter, runs of 2026-10-09; 60 runs, $1.6488 in total. The key's own usage rose by $1.66 between the readings taken before and after the M2 runs. “Per spec” is 5 seeds of one spec; “per evaluated design” divides by every evaluation the runs made (every one scored by code, none by the LLM). ± is the population standard deviation over runs.

A complete exploration of one spec cost between $0.0073 and $0.064 per run, and five seeds of one spec between $0.036 (Qwen, reasoning off) and $0.32 (Sonnet). For M2, three ways of counting the spend agree to within a cent; M1's provider-reported figure undercounted the key:

MilestoneRunsProvider-reported (summaries)Per-call tracesThe key's usage
M1 (2026-10-08)48$1.7367$1.7367about $2.5
M2 (2026-10-09)60 + 2 pilot$1.6488 + $0.0166$1.6654$1.6577 ($2.5127 → $4.1704)

measured OpenRouter. The summaries and the per-call traces agree (M1 $1.7367; M2 $1.6488 + $0.0166 = $1.6654). In M1, calls that failed inside the client reported no usage, so the provider-reported sum undercounts the key. M2's key figure is the difference between two readings of the key's usage recorded before and after the runs (key_usage_m2.json); against a spend cap of $5.

Cost and labour

The architecture lets several agents run round the clock, each evaluating a real design decision. What that costs is a projection, and the calculator builds it only from the measured M2 runs above. The engineer-time side is yours to fill in: there are no salary assumptions here.

Loading the calculator…

Milestone 1, archived

M1's runs are kept as they were: three seeds, four model configurations (Qwen3.8-27B also with its default reasoning), 48 runs, $1.74 provider-reported. NSGA-II mapped the front better on two of the three feasible specs (hypervolume 0.800 against the agents' 0.256–0.695 on dds_250msps, 0.905 against 0.164–0.238 on low_area_control), while 11 of the 12 model-and-spec pairs beat NSGA-II's mean regret. With reasoning off, Qwen was about 7.8× cheaper per run and needed 15× less wall-clock; with its default reasoning it failed 18 of its 45 calls, 17 of them by reaching the output-token limit. M2 ran Qwen with reasoning off only.

dds_250msps: NCO / DDS sin-cos generator for a digital up-converter. One sample per clock at >= 250 MSPS, max error <= 2^-13. Minimise LUTs. True optimum on luts: pipelined W=18 N=15.

MethodSelected design, by seed (regret)Meets specMean regretHV at endEvals to 95% HVEvals usedTokens in / out$ per run$ per evaluated design
NSGA-IIbaseline0: pipelined W=19 N=15 +9.8%1: pipelined W=18 N=17 +17.9%2: pipelined W=18 N=15 +9.1%3/3+12.3% ± 4.0 (0/3 optimal)0.800 ± 0.002not reached (0/3)400no LLM$0$0
Random searchbaseline0: pipelined W=20 N=16 +17.6%1: pipelined W=19 N=15 +10.9%2: pipelined W=21 N=15 +17.9%3/3+15.5% ± 3.2 (0/3 optimal)0.752 ± 0.065not reached (0/3)400no LLM$0$0
Sonnet 5.5agent0: pipelined W=18 N=16 +5.4%1: pipelined W=18 N=15 +6.5%2: pipelined W=17 N=15 +6.5%3/3+6.1% ± 0.5 (0/3 optimal)0.256 ± 0.049below NSGA-IInot reached (0/3)33358,270 / 9,872$0.0718$0.000215
DeepSeek V4.1 Flashagent0: pipelined W=19 N=15 +3.3%1: pipelined W=18 N=15 +3.3%2: pipelined W=18 N=15 (optimum)3/3+2.2% ± 1.5 (1/3 optimal)0.695 ± 0.190below NSGA-IInot reached (0/3)33332,647 / 45,608$0.0158$0.000047
Qwen3.8-27Bagent0: pipelined W=19 N=15 +4.9%1: pipelined W=18 N=15 (optimum)2: pipelined W=18 N=15 (optimum)3/3+1.6% ± 2.3 (2/3 optimal)0.382 ± 0.033below NSGA-IInot reached (0/3)30023,097 / 109,450$0.0952$0.000317
Qwen3.8-27B, reasoning offagent0: pipelined W=18 N=16 +5.4%1: pipelined W=19 N=15 +4.9%2: pipelined W=18 N=15 +1.6%3/3+4.0% ± 1.7 (0/3 optimal)0.369 ± 0.183below NSGA-IInot reached (0/3)26725,948 / 8,910$0.0087$0.000032

M1: 3 seeds per method, mean ± population standard deviation. Regret, HV and evaluations to 95% are the repository's results.md rows; tokens and dollars are this spec's 3 runs, measured provider-reported (OpenRouter, 2026-10-08).

low_area_control: Field-oriented motor-control loop needing sin/cos of the rotor angle at >= 1 MSPS with max error <= 2^-10. Area is everything: minimise LUTs + FFs. True optimum on luts_plus_ffs: iterative W=15 N=12.

MethodSelected design, by seed (regret)Meets specMean regretHV at endEvals to 95% HVEvals usedTokens in / out$ per run$ per evaluated design
NSGA-IIbaseline0: iterative W=14 N=18 +8.9%1: iterative W=16 N=15 +6.1%2: iterative W=15 N=20 +9.2%3/3+8.0% ± 1.4 (0/3 optimal)0.905 ± 0.039340 (1/3 reached)400no LLM$0$0
Random searchbaseline0: iterative W=15 N=13 +7.5%1: iterative W=16 N=15 +10.7%2: iterative W=15 N=18 +16.1%3/3+11.5% ± 3.6 (0/3 optimal)0.856 ± 0.065not reached (0/3)400no LLM$0$0
Sonnet 5.5agent0: iterative W=15 N=12 +1.1%1: iterative W=15 N=12 +2.2%2: iterative W=15 N=15 +5.3%3/3+2.9% ± 1.7 (0/3 optimal)0.207 ± 0.049below NSGA-IInot reached (0/3)26749,607 / 8,765$0.0623$0.000234
DeepSeek V4.1 Flashagent0: iterative W=15 N=12 +1.1%1: iterative W=15 N=12 +1.1%2: iterative W=15 N=14 +2.5%3/3+1.6% ± 0.6 (0/3 optimal)0.202 ± 0.031below NSGA-IInot reached (0/3)26726,460 / 42,614$0.0161$0.000060
Qwen3.8-27Bagent0: iterative W=16 N=16 +9.6%1: iterative W=15 N=12 +1.1%2: iterative W=15 N=16 +2.5%3/3+4.4% ± 3.7 (0/3 optimal)0.238 ± 0.115below NSGA-IInot reached (0/3)1337,144 / 47,941$0.0457$0.000343
Qwen3.8-27B, reasoning offagent0: iterative W=15 N=12 (optimum)1: unrolled_k W=15 N=14 k=2 +35.5%2: iterative W=15 N=12 +1.1%3/3+12.2% ± 16.5 (1/3 optimal)0.164 ± 0.013below NSGA-IInot reached (0/3)33332,009 / 11,441$0.0107$0.000032

M1: 3 seeds per method, mean ± population standard deviation. Regret, HV and evaluations to 95% are the repository's results.md rows; tokens and dollars are this spec's 3 runs, measured provider-reported (OpenRouter, 2026-10-08).

high_precision: Coherent demodulator for a precision instrument: max error <= 2^-20 at >= 50 MSPS. Minimise area (LUTs + FFs) and the relative power index. True optimum on luts_plus_ffs: pipelined_m W=26 N=22 m=6.

MethodSelected design, by seed (regret)Meets specMean regretHV at endEvals to 95% HVEvals usedTokens in / out$ per run$ per evaluated design
NSGA-IIbaseline0: pipelined_m W=26 N=28 m=7 +27.8%1: pipelined_m W=26 N=22 m=7 +4.5%2: pipelined_m W=25 N=23 m=6 +4.9%3/3+12.4% ± 10.9 (0/3 optimal)0.920 ± 0.068197 (2/3 reached)400no LLM$0$0
Random searchbaseline0: pipelined_m W=28 N=23 m=6 +20.8%1: pipelined_m W=28 N=23 m=6 +21.0%2: pipelined_m W=25 N=24 m=4 +14.0%3/3+18.6% ± 3.2 (0/3 optimal)0.880 ± 0.020not reached (0/3)400no LLM$0$0
Sonnet 5.5agent0: pipelined_m W=26 N=22 m=7 +3.4%1: pipelined_m W=25 N=23 m=6 +2.6%2: pipelined_m W=26 N=22 m=7 +3.4%3/3+3.1% ± 0.4 (0/3 optimal)0.979 ± 0.0024 (3/3 reached)26743,697 / 11,923$0.0689$0.000258
DeepSeek V4.1 Flashagent0: pipelined_m W=25 N=23 m=6 +4.9%1: pipelined_m W=26 N=22 m=6 +2.3%2: pipelined_m W=28 N=22 m=6 +10.6%3/3+6.0% ± 3.5 (0/3 optimal)0.961 ± 0.02279 (2/3 reached)23317,847 / 47,870$0.0169$0.000073
Qwen3.8-27Bagent0: pipelined_m W=24 N=23 m=4 +12.4%1: pipelined_m W=24 N=23 m=7 +5.9%2: pipelined_m W=26 N=24 m=7 +9.1%3/3+9.1% ± 2.7 (0/3 optimal)0.940 ± 0.01745 (1/3 reached)16712,737 / 74,601$0.0507$0.000304
Qwen3.8-27B, reasoning offagent0: pipelined_m W=26 N=22 m=4 +8.8%1: pipelined_m W=26 N=22 m=4 +12.5%2: pipelined_m W=26 N=22 m=7 +1.2%3/3+7.5% ± 4.7 (0/3 optimal)0.951 ± 0.0314 (1/3 reached)23319,645 / 10,851$0.0093$0.000040

M1: 3 seeds per method, mean ± population standard deviation. Regret, HV and evaluations to 95% are the repository's results.md rows; tokens and dollars are this spec's 3 runs, measured provider-reported (OpenRouter, 2026-10-08).

infeasible_dds_400msps: Wideband DDS needing >= 400 MSPS single-lane sin/cos with max error <= 2^-12. Minimise LUTs. No design meets it: the fastest of 635,040 reaches 292 MSPSestimate.

MethodSelected design, by seed (regret)Meets specInfeasible calledHV at endEvals to 95% HVEvals usedTokens in / out$ per run$ per evaluated design
NSGA-IIbaselinenone (correct)n/a3/3 (found nothing feasible)n/an/a400no LLM$0$0
Random searchbaselinenone (correct)n/a3/3 (found nothing feasible)n/an/a400no LLM$0$0
Sonnet 5.5agentnone (correct)n/a3/3 (the LLM declared it: 3/3)n/an/a10022,444 / 6,039$0.0351$0.000351
DeepSeek V4.1 Flashagentnone (correct)n/a3/3 (the LLM declared it: 3/3)n/an/a20016,120 / 23,306$0.0099$0.000050
Qwen3.8-27Bagentnone (correct)n/a3/3 (the LLM declared it: 3/3)n/an/a13313,911 / 72,374$0.0585$0.000439
Qwen3.8-27B, reasoning offagentnone (correct)n/a3/3 (the LLM declared it: 3/3)n/an/a10011,715 / 4,542$0.0034$0.000034

M1: 3 seeds per method, mean ± population standard deviation. Regret, HV and evaluations to 95% are the repository's results.md rows; tokens and dollars are this spec's 3 runs, measured provider-reported (OpenRouter, 2026-10-08).

Model (OpenRouter ID)ReasoningRunsTokens in / out$ per run$ per spec$ per evaluated designWall-clock per run
anthropic/claude-sonnet-5.5provider default12174,018 / 36,599$0.0595± 0.0187$0.1785$0.00024627.7 s
deepseek/deepseek-v4.1-flashprovider default1293,074 / 159,398$0.0147± 0.0063$0.0441$0.000057102 s
qwen/qwen3.8-27bprovider default1256,889 / 304,366$0.0625± 0.0311$0.1876$0.000341720 s
qwen/qwen3.8-27boff1289,317 / 35,744$0.0080± 0.0034$0.0240$0.00003448.1 s

measured M1: provider-reported usage and cost from OpenRouter, runs of 2026-10-08; 48 runs, $1.7367 in total. That undercounts: calls that failed inside the client carry no usage, and the key's usage was about $2.5. “Per spec” is 3 seeds of one spec; “per evaluated design” divides by every evaluation the runs made (every one scored by code, none by the LLM). ± is the population standard deviation over runs.

The repository's own tables are in eval/results.md; every row this page shows is checked against it when the site's data is built.