Skip to content

Commit e0857dc

Browse files
PipFowerakerclaude
andcommitted
refactor(balance): unify EE-9/EE-10 onto the calibrator's harness; regen on calibrated base
Correction round (PR #642): the earlier work branched a stale origin/main (58a5a17, pre-calibration). Rebased onto true main (4a0f4ae calibration + ef06ec1 #641 L5 finance). Harness unification (fixes the two-month-runners smell): - Extracted the calibrator's run loop (test_l1_month_sweep.gd _run/_answer_windows) VERBATIM into l1_month_driver.gd — one shared driver. Parity verified: the calibrator's regenerated docs/balance/L1_sweep_runs.csv is BYTE-IDENTICAL to the tracked calibration copy, so the extraction is outcome-neutral and the calibration table stands unchanged. - test_l1_month_sweep.gd now delegates to the driver (LegacyPolicyAdapter); its policies + reporting are untouched. Deleted the parallel month_runner.gd. - reactive_adapter.gd bridges reactive policies (ReactivePolicy) to the driver, with the opening-prefix override seam for EE-10. - Renamed the reactive policy loan_desperation -> loan_desperation_reactive to avoid colliding with the calibrator's loan_desperation. Regenerated ALL data on calibrated constants (runs now last months, so strategy expresses): - Policy headline (docs/balance/POLICY_SWEEP.md): safety_lean 18.5 mo best, passive 14.0 (== calibrator do_nothing, cross-harness anchor), fundraise_first 14.0 beats loan_desperation_reactive 13.0, capability_rush 6.0 worst. T9 floor HOLDS for all reactive standard lines (measured, not gated). - Desperation solver: the lever does NOT pay — firing earlier/more is monotonically worse (lever@always -2.5 mo) and converts doom deaths into ledger deaths (1 -> 12). fundraise_first now uses the L5 raise-as-campaign flow (seek/accept offer, pay_bills). - Opening book v0: winners over-index on money-in (fundraise_small +1.56, apply_grant); losers on hire_capability_researcher (-2.11), take_loan, desperation_lever — cross-validating the solver. Doc caveats rewritten to the true base. Full suite green (quick 365 / sim 93 / integration 14). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
1 parent 3b0cb67 commit e0857dc

18 files changed

Lines changed: 1148 additions & 1316 deletions

docs/balance/DESPERATION_SOLVER.md

Lines changed: 15 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,23 @@
1-
# Desperation-Lever Solver — does the lever ever pay?
1+
# Desperation-Lever Solver (EE-9 / DQ-25) — does the lever ever pay?
22

3-
> **CAVEAT — regenerate post-migration.** Balance constants predate the nine-stream doom
4-
> migration (DQ-21); with doom currently sub-month-lethal (~4-10 day-ticks to 100), the
5-
> lever's -10 doom buys only a tick or two before its 3-turn governance fuse. The SOLVER is
6-
> the durable deliverable; re-run once doom is retuned. Regenerate: see footer.
3+
> **Base:** dials-1-4 calibration (`L1_CALIBRATION_2026-07-14.md`) — doom starts 20, ledger
4+
> teeth live (Finding A fix), per-bill caps + slow-bleed rollover. **CAVEAT:** still pre
5+
> nine-stream migration (DQ-21); re-run post-migration before the DQ-25 beat locks anything in.
76
8-
EE-9 solver-bot: baseline `fundraise_first` vs the same policy + one injected rule 'pull `desperation_lever` when doom >= threshold'. 12 seeds each. Isolates the lever's effect on survival + death cause.
7+
EE-9 solver-bot: baseline `fundraise_first` vs the same policy + ONE injected rule 'pull `desperation_lever` when doom >= threshold' (plus an every-month and a double-dose variant). 12 seeds each, shared month driver. The survival delta is attributable to the lever alone.
98

10-
| Variant | median turns | mean turns | min | max | Δ median vs baseline | doom-surface deaths | ledger-root deaths |
11-
|---|---|---|---|---|---|---|---|
12-
| baseline (no lever) | 7.0 | 7.1 | 4 | 10 | +0.0 | 12 | 0 |
13-
| lever@always | 4.0 | 4.6 | 2 | 8 | -3.0 | 3 | 9 |
14-
| lever@60 | 7.0 | 7.1 | 4 | 10 | +0.0 | 12 | 0 |
15-
| lever@70 | 7.0 | 7.1 | 4 | 10 | +0.0 | 12 | 0 |
16-
| lever@80 | 7.0 | 7.1 | 4 | 10 | +0.0 | 12 | 0 |
17-
| lever@90 | 7.0 | 7.1 | 4 | 10 | +0.0 | 12 | 0 |
9+
| Variant | median months | mean | min | max | delta median vs baseline | doom-root deaths | ledger-root deaths | survived-to-cap(60) |
10+
|---|---|---|---|---|---|---|---|---|
11+
| baseline (no lever) | 14.0 | 17.2 | 11 | 55 | +0.0 | 11 | 1 | 0 |
12+
| lever@always | 11.5 | 11.9 | 9 | 16 | -2.5 | 0 | 12 | 0 |
13+
| lever@40 | 12.0 | 15.0 | 10 | 50 | -2.0 | 2 | 10 | 0 |
14+
| lever@60 | 13.0 | 16.7 | 12 | 53 | -1.0 | 1 | 11 | 0 |
15+
| lever@80 | 14.0 | 17.5 | 12 | 56 | +0.0 | 10 | 2 | 0 |
16+
| lever@2x60 | 13.0 | 16.3 | 11 | 55 | -1.0 | 1 | 11 | 0 |
1817

1918
## Verdict — does the lever pay?
2019

21-
- **The lever does NOT pay (current constants)** — no variant beats the no-lever baseline on median survival (best delta +0.0 turns). Even pulled pre-emptively at month 0, one -10 doom shave is swamped by how hot doom runs (~7-turn/50-point climb), and it plants the secret governance liability for nothing. Under these constants the lever is a trap. **Expected to change post-migration** — re-run then; the DQ-25 beat should use retuned numbers.
22-
- **Reachability finding (design smell):** the `lever@N` doom-threshold variants are IDENTICAL to baseline because the lever is a PLAN-PHASE (strategic) action, its trigger is only re-checked at a month boundary, and runs die mid-month-0 before doom-at-a-plan-phase ever reaches the threshold. A 'desperation' lever you can only reach when NOT yet desperate (at plan time) is a reachability gap — only `lever@always` (pull at month 0 unconditionally) actually fires. Flag for DQ-25: should the lever be a response-window verb (instant speed) rather than a plan action?
23-
- **Death-cause shift** — where the lever fires (`lever@always`), watch doom-surface deaths convert to ledger-root deaths: that conversion IS the mechanic's signature (buy doom now, pay governance later), legible in the two rightmost columns.
20+
- **The lever is NEUTRAL at the median** (best variant `lever@80`, +0.0 months). Check the min/max and death-cause columns for distribution effects the median hides — a lever that trades tail risk for mode survival can be worth shipping even at zero median delta.
21+
- **Threshold reachability** — doom starts 20 and climbs ~4-6/month on a passive line, so plan-phase thresholds 40/60/80 now genuinely fire mid-run (unlike the pre-calibration world, where runs died sub-month and no plan-phase doom trigger was ever reached). Residual DQ-25 flavour question: a 'desperation' verb might belong at window speed, not plan speed.
2422

2523
_Regenerate: `"$GODOT" --headless -s res://addons/gut/gut_cmdln.gd -gdir=res://tests/manual -gselect=test_desperation_solver.gd -gexit` (from `godot/`)._

docs/balance/L1_MONTH_SWEEP.md

Lines changed: 0 additions & 60 deletions
This file was deleted.

docs/balance/OPENING_BOOK_v0.md

Lines changed: 50 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -1,83 +1,68 @@
1-
# Opening Book v0 — mined opening meta
1+
# Opening Book v0 (EE-10) — mined opening meta
22

3-
> **CAVEAT — shallow book, by design; regenerate post-migration.** Current constants make
4-
> doom sub-month-lethal (~4-10 day-ticks to 100), so runs die inside month 0 and the
5-
> 'opening prefix' is effectively the FIRST PLAN-MONTH's action mix today, not a 6-month
6-
> line. The miner is the durable deliverable: post-migration, raise `OPENING_MONTHS` and
7-
> re-run for a true multi-month opening book. One command — see footer.
3+
> **Base:** dials-1-4 calibration (`L1_CALIBRATION_2026-07-14.md`) — runs last months, so the
4+
> 6-month random prefix is a real opening line, not a single doomed month. **CAVEAT:** constants
5+
> still predate the nine-stream doom migration (DQ-21) and the dial-5 Attention pass; the MINER
6+
> is the durable deliverable — re-mine post-migration (one command, footer).
87
9-
Auto-generated by `godot/tests/manual/test_opening_book_miner.gd`. 160 random openings x 4 engine seeds = 640 runs; opening = up to 6 random legal actions/month for the first 6 month(s), then fixed continuation `fundraise_first`. Ranked by mean day-ticks survived.
8+
Auto-generated by `godot/tests/manual/test_opening_book_miner.gd`. 96 random openings x 3 engine seeds = 288 runs; opening = 6 random legal action picks/month for the first 6 months (AP-trimmed to ~3), then fixed continuation `fundraise_first`; censor cap 30 months. Ranked by mean months survived.
109

1110
## What do good openings share?
1211

13-
Per-opening average count of each action in the TOP decile vs BOTTOM decile (by mean survival), most over-represented in winners first:
12+
Mean per-opening count of each action in the TOP decile vs BOTTOM decile (by mean months), most over-represented in winners first:
1413

15-
| Action | avg in top decile | avg in bottom decile | Δ (top bottom) |
14+
| Action | avg in top decile | avg in bottom decile | delta (top - bottom) |
1615
|---|---|---|---|
17-
| hire_safety_researcher | 1.31 | 0.25 | +1.06 |
18-
| fundraise_big | 0.44 | 0.13 | +0.31 |
19-
| fundraise_small | 0.38 | 0.19 | +0.19 |
20-
| funding_strings | 0.50 | 0.38 | +0.13 |
21-
| audit_safety | 0.25 | 0.13 | +0.13 |
22-
| publish_paper | 0.38 | 0.31 | +0.06 |
23-
| buy_compute | 0.44 | 0.38 | +0.06 |
24-
| apply_grant | 0.38 | 0.31 | +0.06 |
25-
| hire_capability_researcher | 0.38 | 0.44 | -0.06 |
26-
| order_supplies | 0.31 | 0.38 | -0.06 |
27-
| take_loan | 0.19 | 0.25 | -0.06 |
28-
| safety_research | 0.13 | 0.19 | -0.06 |
29-
| team_building | 0.13 | 0.25 | -0.13 |
30-
| network | 0.06 | 0.31 | -0.25 |
31-
| media_campaign | 0.06 | 0.38 | -0.31 |
32-
| capability_research | 0.38 | 0.81 | -0.44 |
33-
| desperation_lever | 0.31 | 0.94 | -0.63 |
16+
| fundraise_small | 3.44 | 1.89 | +1.56 |
17+
| apply_grant | 3.11 | 2.00 | +1.11 |
18+
| capability_research | 3.11 | 2.11 | +1.00 |
19+
| order_supplies | 2.67 | 1.67 | +1.00 |
20+
| funding_strings | 2.11 | 1.33 | +0.78 |
21+
| audit_safety | 2.56 | 1.89 | +0.67 |
22+
| media_campaign | 2.67 | 2.00 | +0.67 |
23+
| publish_paper | 2.67 | 2.22 | +0.44 |
24+
| fundraise_big | 1.67 | 1.33 | +0.33 |
25+
| team_building | 2.00 | 1.67 | +0.33 |
26+
| hire_safety_researcher | 1.78 | 2.22 | -0.44 |
27+
| desperation_lever | 2.00 | 2.56 | -0.56 |
28+
| buy_compute | 1.00 | 1.89 | -0.89 |
29+
| network | 1.44 | 2.44 | -1.00 |
30+
| take_loan | 1.33 | 2.78 | -1.44 |
31+
| safety_research | 1.67 | 3.11 | -1.44 |
32+
| hire_capability_researcher | 0.78 | 2.89 | -2.11 |
3433

3534
## Top-decile openings
3635

37-
| opening | mean turns | mean final doom | mean cash | dominant actions |
36+
| opening | mean months | mean final doom | mean cash@m6 | dominant actions |
3837
|---|---|---|---|---|
39-
| #66 | 11.0 | 97.9 | $132k | hire_safety_researcher×1, network×1, desperation_lever×1 |
40-
| #113 | 10.8 | 100.0 | $177k | apply_grant×1, hire_safety_researcher×1, funding_strings×1 |
41-
| #47 | 10.8 | 100.0 | $177k | hire_safety_researcher×2, fundraise_big×2, funding_strings×1 |
42-
| #149 | 10.8 | 100.0 | $175k | hire_safety_researcher×3, funding_strings×1, order_supplies×1 |
43-
| #146 | 10.8 | 100.0 | $173k | capability_research×1, hire_safety_researcher×1, fundraise_big×1 |
44-
| #104 | 10.8 | 100.0 | $173k | fundraise_small×1, apply_grant×1, hire_safety_researcher×1 |
45-
| #129 | 10.8 | 100.0 | $171k | fundraise_small×3, order_supplies×1, hire_safety_researcher×1 |
46-
| #85 | 10.8 | 100.0 | $177k | funding_strings×1, capability_research×1, hire_safety_researcher×1 |
47-
| #51 | 10.3 | 100.0 | $97k | audit_safety×2, hire_safety_researcher×2, buy_compute×1 |
48-
| #4 | 10.3 | 100.0 | $97k | audit_safety×1, hire_safety_researcher×1, fundraise_big×1 |
49-
| #21 | 10.3 | 100.0 | $137k | hire_safety_researcher×1, apply_grant×1, publish_paper×1 |
50-
| #45 | 10.3 | 100.0 | $137k | funding_strings×2, hire_safety_researcher×1, apply_grant×1 |
51-
| #39 | 10.3 | 100.0 | $137k | publish_paper×3, hire_safety_researcher×1, audit_safety×1 |
52-
| #114 | 10.0 | 100.0 | $49k | hire_safety_researcher×2, hire_capability_researcher×2, desperation_lever×1 |
53-
| #9 | 10.0 | 100.0 | $38k | buy_compute×2, hire_safety_researcher×2, order_supplies×1 |
54-
| #62 | 8.3 | 100.0 | $359k | fundraise_big×2, fundraise_small×1, apply_grant×1 |
38+
| #70 | 28.3 | 72.9 | $10k | capability_researchx6, apply_grantx4, team_buildingx4 |
39+
| #48 | 23.7 | 100.0 | $382k | fundraise_smallx5, funding_stringsx4, audit_safetyx3 |
40+
| #23 | 22.7 | 100.0 | $55k | funding_stringsx5, fundraise_smallx4, audit_safetyx4 |
41+
| #88 | 21.7 | 100.0 | $376k | apply_grantx7, fundraise_smallx4, publish_paperx4 |
42+
| #81 | 20.3 | 100.0 | $65k | capability_researchx5, funding_stringsx4, order_suppliesx4 |
43+
| #41 | 20.0 | 100.0 | $9k | media_campaignx6, publish_paperx4, audit_safetyx3 |
44+
| #31 | 19.7 | 100.0 | $88k | order_suppliesx5, fundraise_smallx4, networkx3 |
45+
| #27 | 19.3 | 100.0 | $153k | fundraise_smallx5, publish_paperx4, team_buildingx4 |
46+
| #49 | 19.3 | 100.0 | $49k | apply_grantx5, audit_safetyx5, fundraise_smallx4 |
5547

5648
## Bottom-decile openings
5749

58-
| opening | mean turns | mean final doom | mean cash | dominant actions |
50+
| opening | mean months | mean final doom | mean cash@m6 | dominant actions |
5951
|---|---|---|---|---|
60-
| #80 | 4.3 | 100.0 | $121k | funding_strings×2, fundraise_small×1, buy_compute×1 |
61-
| #153 | 4.0 | 82.6 | $220k | desperation_lever×1, team_building×1, funding_strings×1 |
62-
| #67 | 4.0 | 82.6 | $188k | order_supplies×2, desperation_lever×1, capability_research×1 |
63-
| #93 | 4.0 | 82.6 | $190k | network×2, desperation_lever×1, publish_paper×1 |
64-
| #95 | 4.0 | 82.6 | $190k | capability_research×2, desperation_lever×1, take_loan×1 |
65-
| #6 | 4.0 | 82.6 | $160k | desperation_lever×1, media_campaign×1, fundraise_big×1 |
66-
| #143 | 4.0 | 82.6 | $270k | funding_strings×2, desperation_lever×2, network×1 |
67-
| #70 | 4.0 | 82.6 | $190k | capability_research×3, desperation_lever×1, media_campaign×1 |
68-
| #71 | 4.0 | 82.6 | $180k | team_building×2, desperation_lever×1, apply_grant×1 |
69-
| #105 | 4.0 | 82.6 | $160k | publish_paper×2, desperation_lever×1, media_campaign×1 |
70-
| #137 | 4.0 | 82.6 | $190k | apply_grant×2, capability_research×2, desperation_lever×1 |
71-
| #107 | 4.0 | 82.6 | $188k | capability_research×2, order_supplies×2, desperation_lever×1 |
72-
| #34 | 4.0 | 82.6 | $140k | buy_compute×2, publish_paper×1, desperation_lever×1 |
73-
| #126 | 4.0 | 100.0 | $149k | hire_capability_researcher×3, take_loan×1, audit_safety×1 |
74-
| #61 | 4.0 | 82.6 | $190k | safety_research×2, desperation_lever×1, capability_research×1 |
75-
| #16 | 4.0 | 82.6 | $160k | order_supplies×2, media_campaign×1, fundraise_big×1 |
52+
| #34 | 7.7 | 100.0 | $41k | buy_computex4, safety_researchx4, publish_paperx3 |
53+
| #68 | 7.7 | 100.0 | $228k | safety_researchx6, take_loanx5, buy_computex4 |
54+
| #44 | 7.0 | 100.0 | $157k | hire_safety_researcherx6, hire_capability_researcherx4, safety_researchx3 |
55+
| #63 | 7.0 | 100.0 | $-4k | audit_safetyx4, networkx4, desperation_leverx4 |
56+
| #22 | 6.3 | 100.0 | $180k | team_buildingx5, networkx4, hire_safety_researcherx4 |
57+
| #32 | 6.3 | 100.0 | $20k | safety_researchx6, audit_safetyx5, take_loanx4 |
58+
| #37 | 6.0 | 100.0 | $24k | capability_researchx5, networkx4, hire_capability_researcherx4 |
59+
| #42 | 5.7 | 100.0 | $64k | safety_researchx4, fundraise_smallx4, team_buildingx3 |
60+
| #13 | 5.3 | 83.2 | $18k | hire_capability_researcherx5, publish_paperx4, hire_safety_researcherx4 |
7661

77-
## Reading (pre-migration)
62+
## Reading
7863

79-
- **Winning openings over-index on:** `hire_safety_researcher`, `fundraise_big`, `fundraise_small`. **Losing openings over-index on:** `desperation_lever`, `capability_research`, `media_campaign`.
80-
- **Cross-validated with the desperation-lever solver:** `desperation_lever` is the single strongest LOSER signal here, and the solver independently shows pulling it early converts a ~turn-7 doom death into a ~turn-4 ledger death. Two instruments, same verdict: early desperation levers are a trap under current constants. Openings that instead spend the opening on doom-down / safety-capacity work (hire_safety_researcher, audit_safety, publish_paper) survive longest; capability/compute openings die soonest.
81-
- **Beam/hill-climb refinement:** deferred as next step — pre-migration the fitness surface is a cliff (everything dies month 0), so a climb has nothing to climb. Documented for the post-migration re-run, where a beam over the surviving top-decile prefixes becomes worthwhile.
64+
- **Winning openings over-index on:** `fundraise_small`, `apply_grant`, `capability_research`. **Losing openings over-index on:** `hire_capability_researcher`, `safety_research`, `take_loan`.
65+
- **Cross-check the desperation solver** (`DESPERATION_SOLVER.md`): if `desperation_lever` ranks as a loser signal here AND the solver shows negative deltas, two independent instruments agree the early lever is a trap; if they diverge, the opening context (what else the prefix bought) is doing the work — a real DQ-25 input either way.
66+
- **Beam/hill-climb refinement (next step):** the fitness surface now has a gradient (mean months vary across openings), so a beam over the top-decile prefixes — mutate one month's picks, keep improvements — is worthwhile. Deferred from v0 to keep this run cheap; the adapter's plan_override seam is the entry point.
8267

83-
_Regenerate: `"$GODOT" --headless -s res://addons/gut/gut_cmdln.gd -gdir=res://tests/manual -gselect=test_opening_book_miner.gd -gexit` (from `godot/`). Raw rows: `docs/balance/opening_book_v0.csv`._
68+
_Mined 288 runs in 480s. Regenerate: `"$GODOT" --headless -s res://addons/gut/gut_cmdln.gd -gdir=res://tests/manual -gselect=test_opening_book_miner.gd -gexit` (from `godot/`). Raw rows: `docs/balance/opening_book_v0.csv`._

0 commit comments

Comments
 (0)