Add tools/threat_report.py (action item 7)

Reads recipes/ships/modules/world.toml and reports per-item threat
values, module contributions, hull-only and fitted ship threats
(default_modules), producer:consumer ratio tables, and belt
feasibility against the single-belt cap.

Implements the agreed design semantics: per-unit threat (recipe threat
divided by output amount), the scrap-fallback rule, and fixpoint
resolution through reprocessing-only items. Running it against the
current configs surfaced two ThreatCostCalculator deviations, recorded
as new action items: multi-output recipes are double-priced (no
per-unit division), and items downstream of reprocessing-only items
never resolve, underestimating capital hull threat.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DyCu8vwChKMbLJQ3xosYEN
This commit is contained in:
2026-07-03 16:47:40 +02:00
parent 3aefc05118
commit b9e70ba83a
3 changed files with 265 additions and 10 deletions

View File

@@ -341,10 +341,11 @@ prints per-item threat values and producer:consumer ratio tables.
### Numbers — first pass
Computed with a recursive threat calculator (to be ported to
`tools/threat_report.py`, see the action items in
`progression_design.md`); quantities and durations tuned so fitted
ships land on the threat-cost ladder and the ratio curve is realized.
Computed with a recursive threat calculator (now available as
`tools/threat_report.py`, which reads the real config files — it
verifies these numbers once the v2 tree lands in the configs);
quantities and durations tuned so fitted ships land on the threat-cost
ladder and the ratio curve is realized.
**Economy constants:** `scrap_per_threat = 0.25` (1 scrap per 4 threat
destroyed — a cruiser kill drops ~59 scrap). Reprocessing: 4 scrap per