5 Oct. tools/cascade.js; results in build/cascade/ (git-ignored). Snapshot 8eb69bc7af, inputs hash a20dbd2c3316. Base: Track A (tools/ledger-benchmarks/2026-10-05-step34b-baseline.json). Nothing in the ledger moves.
Provisional. Dials still to come: the army rules (T-695's game-wide dials), the final character strengths, Soak effects (T-696), Hidden (T-699). The bar per army is "no worse than today": Track A's own score on that army's 11th-edition lists on this snapshot (World Eaters 67.54%, Tyranids 82.45%), never below 60%.
How it was run
Every combination of the dials below, laid over Track A, through the ledger page's own compute() (as tools/exam.js runs a setting: wCarry 0, post hooks after), scored as the exam scores an army: pairwise accuracy over S to D on each 11e list, the mean over the lists (World Eaters: Red Path, Tactical Sugar, Exalted; Tyranids: Auspex, Hivemind, Into the Hive Mind). The score of Track A matches exam.js to the bit on both armies. The control: the same combinations on scrambled letters, three seeds, each list's letters shuffled among the units that list grades, the same bar.
| Dial | Values |
|---|---|
| aircraftBoard | 0, 1 |
| smallPiece | 0, 0.2, 0.4 |
| attachChars | 0, 1 |
| r.first, r.cp, lands (the old fitted numbers) | 1 / 1.8 / 2.64; 1 / 1.4 / 1.88; 1 / 1.25 / 1.5 |
| β | 3, 6, 12 |
| typicalSize (rule mean, through tools/typical.js's post hook) | 0, 0.25, 0.5 |
| modeScarcity | 0, 0.2 |
| screen slots (T-677's World Eaters setting) | off, on |
| charEpic | 0, 0.5 |
| gradeBy (T-700, a post step) | perPoint (today), total (Value × points ÷ 100), half (Value × √(points ÷ 100)) |
| r.synapse (stage 2 only) | 1, 1.5, 2.18 |
The first sweep had cpOnce {0, 1}, charHome, charPsychic and charEpic at {0, 0.2} and no gradeBy (186,624 combinations, 62,208 computes, 24 minutes). The character measurement then came in final: only charEpic is kept, at {0, 0.5}. That sweep was finished and is kept (build/cascade/stage1-world-eaters-chars.json); the grid above was then run in full (it is the smaller one, so no slice was needed). The first sweep's numbers: 148,608 of 186,624 survive (80%), best 81.08% (with charHome 0.2), scrambled 0 survivors (best 62.7, 61.4, 58.0); cpOnce, charPsychic and charEpic 0.2 at exactly 50% among survivors (no effect on World Eaters).
Time: World Eaters 13 to 23 ms of wall time per compute on 3 processes (about 40 to 70 ms each), so 1.4 to 2.5 ms per combination with the post dials sharing a compute (9 per compute here); Tyranids 42 ms per compute, 4.7 ms per combination. Stage 1: 7,776 computes in 101 s. Stage 2: 19,764 computes in 14 minutes.
Stage 1: World Eaters (69,984 combinations)
| Survivors | Best | Track A here | |
|---|---|---|---|
| Real letters | 27,726 (40%) | 80.47% | 67.54% |
| Scrambled, seed 11 | 0 | 62.69% | 54.84% |
| Scrambled, seed 12 | 0 | 61.17% | 54.63% |
| Scrambled, seed 13 | 0 | 58.01% | 56.14% |
| Points alone (no ledger) | – | 45.90% (scrambled 51.2, 46.5, 49.4) | – |
The real search clearly beats the control: no scrambled combination reaches the bar, and the real best is 18 points above the best scrambled one. The search alone buys up to 8 points on scrambled letters (best against base: +7.8, +6.5, +1.9), against +12.9 on the real ones.
What survivors share (share of survivors at each value; every value is 1/2 or 1/3 of the grid):
| Dial | Survivors |
|---|---|
| screen | on 74.9%, off 25.1% (best off 74.4% against on 80.5%) |
| gradeBy | perPoint 66.0%, half 33.9%, total 0.0% (12 combinations, best 67.74%) |
| r.cp | 1.88 39.9%, 1.4 35.5%, 1 24.5% |
| attachChars | 1 56.2%, 0 43.8% |
| modeScarcity | 0.2 53.1%, 0 46.9% |
| smallPiece | 0 36.7%, 0.2 35.9%, 0.4 27.4% |
| lands, β, typicalSize, charEpic | within 3 points of even |
| aircraftBoard, r.first | exactly even: no effect on World Eaters (no aircraft; Fights First credited the same at every strength) |
gradeBy against points alone (T-700): ranked by points alone, World Eaters score 45.9% (below chance: the reviewers rate the cheap pieces higher). total reaches the bar 12 times (best 67.74%, scrambled best 59.7, 58.1, 56.7) and half 9,408 times (best 75.71%, scrambled 62.0, 59.7, 57.3); perPoint 18,306 (best 80.47%). Both beat points alone by 20 or more points, so the ledger carries the signal, but total is worse than today's per-point grading at every combination's best.
Top 20 (all perPoint; aircraftBoard and r.first don't move World Eaters, so each row stands for six):
| # | Score | aircraftBoard / r.first | smallPiece | attachChars | r.cp | lands | β | modeScarcity | screen | charEpic | typicalSize |
|---|---|---|---|---|---|---|---|---|---|---|---|
| 1–6 | 80.47 | any | 0.2 | 1 | 1.88 | 1.5 | 6 | 0.2 | on | 0 | 0 |
| 7–12 | 80.15 | any | 0.2 | 0 | 1.88 | 1 | 6 | 0 | on | 0 | 0 |
| 13–18 | 80.13 | any | 0 | 1 | 1.4 | 1.5 | 12 | 0.2 | on | 0 | 0 |
| 19–20 | 79.97 | aircraftBoard 0 | 0 | 1 | 1.88 | 1 | 12 | 0.2 | on | 0 | 0 |
Stage 2: Tyranids (the 27,726 survivors × r.synapse: 83,178 combinations)
Two readings of World Eaters' own dials (screen slots and modeScarcity, "World Eaters' own dials" in the brief):
| Game-wide (screen and modeScarcity apply to Tyranids too) | World Eaters only (Tyranids at off and 0) | |
|---|---|---|
| Survivors, real | 3,439 | 12,008 |
| Best, real | 84.99% (its World Eaters score 68.56%) | 85.08% (World Eaters 74.98%) |
| Scrambled survivors (seeds 11 / 12 / 13) | 0 / 0 / 0 | 0 / 0 / 0 |
| Scrambled best | 57.7 / 57.3 / 51.2 (Track A 55.4 / 51.6 / 45.3) | 57.7 / 54.2 / 50.1 |
| Best mean of the two armies | 78.44 (World Eaters 74.38, Tyranids 82.49) | 81.68 (World Eaters 79.81, Tyranids 83.55) |
| Points alone | 48.6% (scrambled 45.4, 46.0, 50.3) | the same |
The Tyranid control here scores the real World Eaters survivors on scrambled Tyranid letters (a chained control would need scrambled World Eaters survivors, and there are none).
What survivors share (game-wide reading; World Eaters-only beside where it differs):
| Dial | Survivors (game-wide) | World Eaters only |
|---|---|---|
| screen | off 100% (on: best 81.29%, under the bar) | on 63.2% (from World Eaters) |
| gradeBy | perPoint 100% (half best 81.11%, total 73.54%) | perPoint 98.4%, half 1.6% (188) |
| r.synapse | 2.18 52.5%, 1.5 47.3%, 1 0.3% | 1.5 52.5%, 2.18 47.2%, 1 0.2% |
| r.cp | 1.88 58.2%, 1.4 39.4%, 1 2.4% | 1.88 48.7%, 1.4 37.8%, 1 13.5% |
| smallPiece | 0 64.1%, 0.2 34.7%, 0.4 1.2% | 0 60.0%, 0.2 36.0%, 0.4 4.0% |
| β | 3 49.5%, 6 25.7%, 12 24.8% | 3 51.4% |
| r.first | 1.8 41.8%, 2.64 40.9%, 1 17.2% | the same shape |
| lands | 1.25 41.3%, 1.5 37.0%, 1 21.8% | 1.25 43.7% |
| aircraftBoard | 1 61.2% | 1 58.7% |
| attachChars | 0 57.1% (of 44% coming in) | 0 65.3% |
| typicalSize, modeScarcity, charEpic | near what came in | the same |
Top 5, game-wide (all perPoint, screen off, r.synapse 1.5, r.cp 1.88, β 3, attachChars 0, aircraftBoard 1): 84.99 (smallPiece 0.2, r.first 1.8, lands 1.25, typicalSize 0.5), 84.83 (typicalSize 0), 84.78 (r.first 2.64), 84.76 (typicalSize 0.25), 84.74 (r.first 1). The top 20 are in build/cascade/stage2-tyranids.json.
Reading it
- The cascade does what it should on these two armies: thousands survive on real letters, none on scrambled ones.
- The bar on World Eaters filters little (40% survive); the Tyranid bar does the work (3,439 or 12,008 of 83,178).
- Settled by both armies: per-point grading (total and half lose; total never beats today's grading), r.cp above 1, r.synapse above 1, smallPiece at most 0.2.
- Screen slots split the armies: World Eaters want them (75% of survivors), Tyranids lose with them game-wide. As a World Eaters-only setting they cost nothing on Tyranids and the best pair scores rise (mean 81.7 against 78.4).
- Prediction (written first): modeScarcity and screen slots common among survivors, survivors above about 72%. Screen: right on World Eaters. modeScarcity: only 53%, barely above even. Survivors above 72%: right (best 80.5%).
- Doubts: the best of 70,000 combinations is an optimistic number (on scrambled letters the search alone finds up to +8); three lists and 30 graded units on World Eaters; aircraftBoard and r.first are untested by World Eaters, so stage 1 doesn't constrain them; whether screen slots are a game-wide setting or a World Eaters one is Jordan's call.
Files: build/cascade/stage1-world-eaters.json, stage2-tyranids.json, stage2-tyranids-armyonly.json (each with every survivor's settings and scores), stage1-world-eaters-chars.json (the first sweep).