Skip to content

Development Log

Rolling record of implementation decisions, changes, and lessons learned across all phases of Stochastic Warfare development.

Phases

Phase Focus Status Log
0 Project Scaffolding Complete phase-0.md
1 Terrain & Environment Foundation Complete phase-1.md
2 Entity System & Movement Complete phase-2.md
3 Detection & Intelligence Complete phase-3.md
4 Combat Resolution & Morale Complete phase-4.md
5 C2 Infrastructure Complete phase-5.md
6 Logistics & Supply Complete phase-6.md
7 Engagement Validation Complete phase-7.md
8 AI & Planning Complete phase-8.md
9 Simulation Orchestration Complete phase-9.md
10 Campaign Validation Complete phase-10.md
11 Core Fidelity Fixes Complete phase-11.md
12 Deep Systems Rework Complete phase-12.md
13 Performance Optimization Complete phase-13.md
14 Tooling & Developer Experience Complete phase-14.md
15 Real-World Terrain & Data Pipeline Complete phase-15.md
16 Electronic Warfare Complete phase-16.md
17 Space & Satellite Domain Complete phase-17.md
18 NBC/CBRN Effects Complete phase-18.md
19 Doctrinal AI Schools Complete phase-19.md
20 WW2 Era Complete phase-20.md
21 WW1 Era Complete phase-21.md
22 Napoleonic Era Complete phase-22.md
23 Ancient & Medieval Era Complete phase-23.md
24 Unconventional & Prohibited Warfare Complete phase-24.md
25 Engine Wiring & Integration Sprint Complete phase-25.md
26 Core Polish & Configuration Complete phase-26.md
27 Combat System Completeness Complete phase-27.md
28 Modern Era Data Package Complete phase-28.md
28.5 Directed Energy Weapons Complete phase-28.5.md
29 Historical Era Data Expansion Complete phase-29.md
30 Scenario & Campaign Library Complete phase-30.md
31 Documentation Site (GitHub Pages) Complete phase-31.md
32 API & Service Foundation Complete phase-32.md
33 Frontend Foundation & Scenario Browser Complete phase-33.md
34 Run Results & Analysis Dashboard Complete phase-34.md
35 Tactical Map & Spatial Visualization Complete phase-35.md
36 Scenario Tweaker & Polish Complete phase-36.md
37 Integration Fixes & E2E Validation Complete phase-37.md
38 Map & Chart Enhancements Complete phase-38.md
39 Quality, Performance & Packaging Complete phase-39.md
40 Battle Loop Foundation Complete phase-40.md
41 Combat Depth Complete phase-41.md
42 Tactical Behavior Complete phase-42.md
43 Domain-Specific Resolution Complete phase-43.md
44 Environmental & Subsystem Integration Complete phase-44.md
45 Mathematical Model Audit & Hardening Complete phase-45.md
46 Scenario Data Cleanup & Expansion Complete phase-46.md
47 Full Recalibration & Validation Complete phase-47.md
48 Block 5 Deficit Resolution Complete phase-48.md
49 Calibration Schema Hardening Complete phase-49.md
50 Combat Fidelity Polish Complete phase-50.md
51 Naval Combat Completeness Complete phase-51.md
52 Environmental Continuity Complete phase-52.md
53 C2 & AI Completeness Complete phase-53.md
54 Era-Specific & Domain Sub-Engine Wiring Complete phase-54.md
55 Resolution & Scenario Migration Complete phase-55.md
56 Performance & Logistics Complete phase-56.md
57 Full Validation & Regression Complete phase-57.md
58 Structural Verification & Core Combat Wiring Complete phase-58.md
59 Atmospheric & Ground Environment Wiring Complete phase-59.md
60 Obscurants, Fire, & Visual Environment Complete phase-60.md
61 Maritime, Acoustic, & EM Environment Complete phase-61.md
62 Human Factors, CBRN, & Air Combat Environment Complete phase-62.md
63 Cross-Module Feedback Loops Complete phase-63.md
64 C2 Friction & Command Delay Complete phase-64.md
65 Space & EW Sub-Engine Activation Complete phase-65.md
66 Unconventional, Naval, & Cleanup Complete phase-66.md
67 Integration Validation & Recalibration Complete phase-67.md
Block 8: Consequence Enforcement & Scenario Expansion
68 Consequence Enforcement Complete phase-68.md
69 C2 Depth Complete phase-69.md
70 Performance Optimization Complete phase-70.md
71 Missile & Carrier Ops Completion Complete phase-71.md
72 Checkpoint & State Completeness Complete phase-72.md
73 Historical Scenario Correctness Complete phase-73.md
74 Combat Engine Unit Tests Complete phase-74.md
75 Simulation Core & Domain Unit Tests Complete phase-75.md
76 API Robustness Complete phase-76.md
77 Frontend Accessibility Complete phase-77.md
78 P2 Environment Wiring Complete phase-78.md
79 CI/CD & Packaging Complete phase-79.md
80 API & Frontend Sync Complete phase-80.md
81 Recalibration & Validation Complete phase-81.md
82 Block 8 Postmortem & Documentation Complete phase-82.md
Block 9: Performance at Scale
83 Profiling Infrastructure Complete phase-83.md
84 Spatial Culling & Scan Scheduling Complete phase-84.md
85 LOD & Aggregation Complete phase-85.md
86 Engagement & Calibration Optimization Complete phase-86.md
87 Expanded Numba JIT Complete phase-87.md
88 SoA Data Layer Complete phase-88.md
89 Per-Side Parallelism Complete phase-89.md
90 Validation & Benchmarking Complete phase-90.md
91 Scenario Recalibration & Regression Complete phase-91.md
Block 10: UI Depth & Engine Exposure
92 API Analytics & Frame Enrichment Complete phase-92.md
93 Results Dashboard Depth Complete phase-93.md
94 Tactical Map Enrichment Complete phase-94.md
95 Calibration & Scenario Editor Depth Complete phase-95.md
96 Analysis & Event Interaction Complete phase-96.md
97 Data Catalog & Block 10 Validation Complete phase-97.md

Post-MVP Refinement Index

Known limitations and deferred improvements logged during implementation. Review these after MVP is functional.

Phase Item Section
0 Checkpoint format longevity (pickle fragility) (resolved Phase 57 — JSON serialization with NumpyEncoder, legacy pickle fallback) phase-0.md — Open Questions
3 Track-to-target association needs nearest-neighbor gating (resolved Phase 11b) phase-3.md — Known Limitations
3 Environment data threading (caller responsibility) (accepted limitation — explicit coupling is simpler than implicit dependency injection) phase-3.md — Known Limitations
3 Passive sonar bearing is placeholder (random, not geometric) (resolved Phase 11b) phase-3.md — Known Limitations
3 No sensor FOV filtering against observer heading (resolved Phase 11b) phase-3.md — Known Limitations
3 Single-scan detection (no dwell/integration gain) (resolved Phase 11b) phase-3.md — Known Limitations
3 Test coverage gap (296→334 vs planned 455; backfilled C2-facing APIs) (resolved — 8,000+ tests across 57 phases massively exceed original target) phase-3.md — Known Limitations
4 Ballistic trajectory uses simplified drag (no Mach-dependent Cd) (resolved Phase 11a) phase-4.md — Known Limitations
4 DeMarre penetration approximation (no obliquity, composite, reactive armor) (resolved Phase 11a) phase-4.md — Known Limitations
4 HEAT penetration is range-independent (accepted limitation — physically correct for shaped charge jets) phase-4.md — Known Limitations
4 Submarine evasion simplified probability model (resolved Phase 12c) phase-4.md — Known Limitations
4 Mine trigger model lacks detailed ship signature interaction (resolved Phase 12c) phase-4.md — Known Limitations
4 Carrier ops deck management abstracted (no individual spot tracking) (accepted limitation — below simulation granularity) phase-4.md — Known Limitations
4 Morale Markov is discrete-time (not continuous-time) (resolved Phase 12d) phase-4.md — Known Limitations
4 PSYOP model is simplified effectiveness roll (resolved Phase 12d) phase-4.md — Known Limitations
4 Naval damage control lacks compartment flooding model (resolved Phase 12c) phase-4.md — Known Limitations
4 Air combat lacks detailed flight dynamics / energy-maneuverability (resolved Phase 12c) phase-4.md — Known Limitations
4 Environment→combat coupling partial: air_combat, air_defense, naval_surface, indirect_fire lack env coupling (resolved Phase 11a) phase-4.md — Known Limitations
5 No multi-hop propagation (single hop issuer→recipient only) (resolved Phase 12a) phase-5.md — Known Limitations
5 No terrain-based LOS check for communications (resolved Phase 52c — diffraction model + exempt types + has_los bug fix) phase-5.md — Known Limitations
5 Simplified FSCL (east-west line, not arbitrary polyline) (resolved Phase 12a) phase-5.md — Known Limitations
5 No ATO planning cycle (structures only, generation deferred to Phase 9/Future) (resolved Phase 12a) phase-5.md — Known Limitations
5 No JTAC/FAC observer model for CAS (resolved Phase 12a) phase-5.md — Known Limitations
5 Messenger comm type has no terrain traversal or intercept risk (accepted limitation — courier engine handles Napoleonic era; modern MESSENGER is niche) phase-5.md — Known Limitations
6 No supply optimization solver (pull-based nearest depot only) (resolved Phase 12b) phase-6.md — Known Limitations
6 No multi-echelon supply chain (direct depot-to-unit) (resolved Phase 12b) phase-6.md — Known Limitations
6 Simplified transport vulnerability (no escort effects) (resolved Phase 12b) phase-6.md — Known Limitations
6 Medical M/M/c queueing approximate (exponential service) (resolved Phase 12b) phase-6.md — Known Limitations
6 Engineering times deterministic (no stochastic variation) (resolved Phase 11c) phase-6.md — Known Limitations
6 No fuel gating on movement (tracked but not enforced) (resolved Phase 11c) phase-6.md — Known Limitations
6 Blockade effectiveness simplified (flat per-ship probability) (resolved Phase 51d — DisruptionEngine wired, blockade queries in campaign.py) phase-6.md — Known Limitations
6 Captured supply efficiency flat 50% (no compatibility check) (dormant capability — implemented and tested but no game mechanic triggers depot capture; reserved for future campaign planning work) phase-6.md — Known Limitations
6 No local water procurement (always from rear depots) (accepted limitation — below simulation granularity) phase-6.md — Known Limitations
6 No ammunition production (scenario-defined depots only) (accepted limitation — scenarios define initial supply levels) phase-6.md — Known Limitations
6 VLS non-reloadable-at-sea enforcement deferred to naval combat integration (resolved Phase 56d — exhaustion enforced, port reload deferred) phase-6.md — Known Limitations
7 73 Easting exchange_ratio = inf (detection asymmetry prevents blue losses) (resolved Phase 30 — calibration tuning: visibility 800m, red engagement 1500m, thermal_contrast 1.5) phase-7.md — Known Limitations
7 No fire rate limiting (units fire once per tick regardless of ROF) (resolved Phase 11a) phase-7.md — Known Limitations
7 Uniform target_size_modifier (applies to both sides equally) (resolved Phase 11a) phase-7.md — Known Limitations
7 No wave attack modeling (all units advance simultaneously) (resolved Phase 11c) phase-7.md — Known Limitations
7 Pre-scripted behavior only (no tactical AI, deferred to Phase 8) (resolved Phase 8 — OODA FSM, commander personalities, doctrine templates, MDMP) phase-7.md — Known Limitations
7 Falklands simplified — Sheffield attack only, no San Carlos raids (resolved Phase 30 — added San Carlos air raids + Goose Green ground scenarios) phase-7.md — Known Limitations
7 Synthetic terrain (programmatic heightmaps, not real topographic data) (resolved Phase 15 — real-world terrain pipeline) phase-7.md — Known Limitations
7 No logistics in validation scenarios (short engagements) (accepted limitation — deliberately short engagements) phase-7.md — Known Limitations
7 No C2 propagation in validation (direct behavior, no order chain) (accepted limitation — deliberately short engagements) phase-7.md — Known Limitations
7 Simplified force compositions (representative samples, not complete OOB) (resolved Phase 30 — expanded 73 Easting OOB, diverse modern/historical scenarios) phase-7.md — Known Limitations
8 Named doctrinal schools (Clausewitzian AI, Sun Tzu AI) deferred to Future Phases (resolved Phase 19) phase-8.md — Known Limitations
8 COA wargaming is analytical (Lanchester), not full nested simulation (accepted limitation — Lanchester captures key force-ratio dynamics) phase-8.md — Known Limitations
8 No terrain-specific COA generation (e.g., no river crossing planning detail) (accepted limitation — COA operates at force-ratio level) phase-8.md — Known Limitations
8 Implied task tables are simplified (not full FM 5-0 comprehensive list) (accepted limitation — captures key task categories) phase-8.md — Known Limitations
8 No multi-echelon simultaneous planning (each commander plans independently) (accepted limitation — by design; avoids coordination complexity) phase-8.md — Known Limitations
8 Estimates update periodically, not reactively to every event (accepted limitation — event-driven updates not needed at current tick resolution) phase-8.md — Known Limitations
8 Stratagems are opportunity-evaluated, not proactively planned in COA (accepted limitation — by design; see Phase 53c wiring) phase-8.md — Known Limitations
8 Brigade echelon decision hardcodes echelon_level=9 in result (cosmetic) (resolved Phase 11d) phase-8.md — Known Limitations
9 No force aggregation/disaggregation — all units at individual resolution (resolved Phase 13 postmortem) phase-9.md — Known Limitations
9 Single-threaded simulation loop (required for deterministic PRNG replay) (accepted limitation — required for deterministic reproducibility) phase-9.md — Known Limitations
9 No auto-resolve — every engagement runs full tactical resolution (resolved Phase 13a-6) phase-9.md — Known Limitations
9 Simplified strategic movement (no detailed operational pathfinding) (accepted limitation — campaign-scale abstraction) phase-9.md — Known Limitations
9 Fixed reinforcement schedule (no Poisson/stochastic arrivals) (accepted limitation — scenario-defined determinism) phase-9.md — Known Limitations
9 No naval campaign management (structurally supported but untested) (resolved — 6 naval scenarios run through CampaignManager with 23+ dedicated tests) phase-9.md — Known Limitations
9 Synthetic terrain only (programmatic heightmaps, not real topographic data) (resolved Phase 15 — real-world terrain pipeline) phase-9.md — Known Limitations
9 LOS cache is per-tick only (cleared each tick after movement) (resolved Phase 13 postmortem — selective invalidation wired) phase-9.md — Known Limitations
9 No weather evolution mid-campaign beyond WeatherEngine.step() (resolved — WeatherEngine.update() implements full Markov transitions, diurnal temperature, O-U wind; called every tick) phase-9.md — Known Limitations
9 Viewshed vectorization deferred (lower priority) (resolved Phase 13a-5) phase-9.md — Known Limitations
9 STRtree for infrastructure spatial queries still deferred (resolved Phase 13a-2) phase-9.md — Known Limitations
10 No fire rate limiting — units fire once per tick regardless of ROF (inherited) (resolved Phase 11a — fire rate cooldown) phase-10.md — Known Limitations
10 No wave attack modeling — all red units advance simultaneously (inherited) (resolved Phase 11c — wave attack mechanics) phase-10.md — Known Limitations
10 Campaign AI decisions coarse — OODA at echelon timing, may not produce tactical posture changes in short runs (accepted limitation — OODA timing is by design) phase-10.md — Known Limitations
10 Simplified force compositions — representative samples, not complete historical OOB (resolved Phase 30 — expanded OOBs, diverse modern/historical scenarios) phase-10.md — Known Limitations
10 Synthetic terrain — programmatic heightmaps, not real topographic data (resolved Phase 15 — real-world terrain pipeline) phase-10.md — Known Limitations
9/10 (duplicate of Phase 9 fixed reinforcement entry above — consolidated)
10 No force aggregation/disaggregation — all units individually tracked (resolved Phase 13 postmortem) phase-10.md — Known Limitations
10 AI expectation matching approximate — string-based posture detection (accepted limitation — sufficient for posture change validation) phase-10.md — Known Limitations
10 Campaign metrics proxy territory control via survival fraction not spatial (accepted limitation — survival fraction captures campaign outcomes) phase-10.md — Known Limitations
11 Fuel gating not wired to stockpile in battle.py (resolved Phase 12b) phase-11.md — Known Limitations
11 Wave assignments are manual (no AI auto-assignment) (accepted limitation — explicit is better than implicit) phase-11.md — Known Limitations
11 Integration gain caps at 4 scans (resolved Phase 26c — configurable max_integration_scans) phase-11.md — Known Limitations
11 Armor type YAML data missing (resolved Phase 26c — armor_type field + 6 YAML files) phase-11.md — Known Limitations
16 EW engines not yet wired into simulation engine tick loop (resolved Phase 25c) phase-16.md — Known Limitations
16 No DRFM detailed waveform modeling (simplified effectiveness parameter) (accepted limitation — captures key jamming effects without specialist depth) phase-16.md — Known Limitations
16 TDOA geolocation uses simplified centroid-shift algorithm (accepted limitation — captures geolocation accuracy without DSP complexity) phase-16.md — Known Limitations
16 No cooperative jamming between multiple platforms (accepted limitation — single-jammer model captures key dynamics) phase-16.md — Known Limitations
16 Campaign-level EW validation deferred (component-level only) (resolved — EW wired into engine tick loop Phase 25c; 4 scenarios with ew_config exercise campaign-level EW) phase-16.md — Known Limitations
17 Simplified Keplerian orbits (no SGP4/TLE, no atmospheric drag for LEO decay) (accepted limitation — captures pass timing and coverage gaps) phase-17.md — Known Limitations
17 No detailed satellite bus modeling (power, thermal, attitude control) (accepted limitation — below simulation granularity) phase-17.md — Known Limitations
17 No space-based SIGINT integration with Phase 16 SIGINT engine (resolved Phase 52d — inverse-variance weighted fusion in engine.py tick loop) phase-17.md — Known Limitations
17 Debris cascade model is statistical (no individual fragment tracking) (accepted limitation — below simulation granularity) phase-17.md — Known Limitations
17 No satellite maneuvering or station-keeping fuel limits (accepted limitation — captures orbital mechanics without propulsion modeling) phase-17.md — Known Limitations
17 No space weather effects (solar flares, radiation belt variations) (accepted limitation — below simulation granularity) phase-17.md — Known Limitations
17 EMEnvironment GPS accuracy is not per-side (uses worst-case aggregation) (accepted limitation — worst-case aggregation is conservative) phase-17.md — Postmortem
16/17 ScenarioLoader doesn't auto-wire EWEngine or SpaceEngine from YAML (resolved Phase 25a) phase-17.md — Postmortem
16/17/18 ScenarioLoader doesn't auto-wire CBRNEngine from YAML (resolved Phase 25a) phase-18.md — Postmortem
18 mopp_speed_factor parameter exists in movement engine but never passed from battle loop (resolved Phase 25c) phase-18.md — Postmortem
18 Hardcoded terrain channeling thresholds in dispersal (5m valley/ridge, 50m offset) (resolved Phase 26b — DispersalConfig fields) phase-18.md — Postmortem
18 Hardcoded fallback weather defaults in CBRN engine (wind=2.0, temp=20°C, cloud=0.5) (resolved Phase 26b — CBRNConfig fields) phase-18.md — Postmortem
18 No automatic puff aging/cleanup mechanism in dispersal engine (resolved Phase 26c — cleanup_aged_puffs() + max_puff_age_s) phase-18.md — Postmortem
19 CommanderEngine not wired into SimulationContext (resolved Phase 25d) phase-19.md — Known Limitations
19 battle.py passes assessment=None to decide() (resolved Phase 25b) phase-19.md — Known Limitations
16/17/18/19 ScenarioLoader doesn't auto-wire SchoolRegistry from YAML (resolved Phase 25a) phase-19.md — Known Limitations
19 get_coa_score_weight_overrides() hook not called in battle loop (resolved Phase 25b) / get_stratagem_affinity() still deferred (resolved Phase 53c — called in DECIDE phase with school affinity weights) phase-19.md — Postmortem
19 CommanderPersonality.school_id field defined but never read — schools assigned via SchoolRegistry instead (resolved Phase 53c — auto-assigns via SchoolRegistry in _apply_commander_assignments()) phase-19.md — Postmortem
20 Convoy engine does not model individual escort positions (abstract effectiveness parameter) (accepted limitation — campaign-scale abstraction) phase-20.md — Known Limitations
20 Strategic bombing target regeneration is linear (no industrial interdependency graph) (accepted limitation — captures key targeting dynamics) phase-20.md — Known Limitations
20 Fighter escort in strategic bombing is probability modifier, not full air combat sub-simulation (accepted limitation — campaign-scale abstraction) phase-20.md — Known Limitations
16/17/18/19/20 ScenarioLoader doesn't auto-wire era-specific engines from YAML (resolved Phase 25a) phase-20.md — Postmortem
21 Barrage drift is purely random walk — no systematic correction for observer feedback (resolved Phase 27d — observer correction) phase-21.md — Known Limitations
21 Gas warfare engine does not model gas mask don time delay (units gain instant protection) (resolved Phase 27d — compute_exposure_during_don + get_effective_mopp_level) phase-21.md — Known Limitations
21 Trench system has no wire-cutting mechanic (wire is a query attribute only, not a movement blocker) (accepted limitation — wire as defensive query attribute is sufficient) phase-21.md — Known Limitations
16/17/18/19/20/21 ScenarioLoader doesn't auto-wire WW1 engines from YAML (resolved Phase 25a) phase-21.md — Known Limitations
21 Gas warfare wind direction tolerance (60°) hardcoded — should be configurable in GasWarfareConfig (resolved Phase 26b — GasWarfareConfig.max_wind_angle_deg) phase-21.md — Postmortem
21 Barrage/gas engines use hardcoded fallback RNG seed (42) when no RNG injected (resolved Phase 26a — rng required on all 23 engines) phase-21.md — Postmortem
16/17/18/19/20/21/22 ScenarioLoader doesn't auto-wire Napoleonic engines from YAML (resolved Phase 25a) phase-22.md — Known Limitations
22 Cavalry charge ignores terrain effects (speed not modified by slope or obstacles) (resolved Phase 27d — compute_cavalry_terrain_modifier) phase-22.md — Known Limitations
22 No frontage/depth in melee — simplified to force ratio × formation modifier (resolved Phase 27d — compute_frontage_constraint) phase-22.md — Known Limitations
22 Foraging ambush casualty rate hardcoded at 10% — should be configurable in ForagingConfig (resolved Phase 26b — ForagingConfig.ambush_casualty_rate) phase-22.md — Known Limitations
22 Volley/melee/cavalry/courier/foraging engines use hardcoded fallback RNG seed (42) when no RNG injected (resolved Phase 26a — rng required on all 23 engines) phase-22.md — Known Limitations
16/17/18/19/20/21/22/23 ScenarioLoader doesn't auto-wire Ancient/Medieval engines from YAML (resolved Phase 25a) phase-23.md — Postmortem
28.5 DEWEngagementEvent has zero subscribers in production code (events published but never consumed) (closed Phase 37 — SimulationRecorder subscribes to base Event) phase-28.5.md — Postmortem
28.5 dew_engine not used in simulation/engine.py or simulation/battle.py tick loops (wired in scenario only) (resolved Phase 37 — battle.py routes DEW via route_engagement) phase-28.5.md — Postmortem
28.5 No scenario YAML references dew_config (engine can be created but no scenarios exercise it) (resolved — taiwan_strait scenario uses dew_config) phase-28.5.md — Postmortem
28.5 ADUnitType.DEW not handled in air defense engagement logic (enum exists but no routing) (accepted limitation — DEW routes via weapon category, functionally complete) phase-28.5.md — Postmortem
28.5 route_engagement() not called from battle.py (uses execute_engagement directly) — DEW routing untested in loop (resolved Phase 37 — battle.py calls route_engagement for all engagements) phase-28.5.md — Postmortem
32 config_overrides accepted and stored but not applied to engine (calibration_overrides not injected before ScenarioLoader.load) (resolved Phase 37 — deep merge before load) phase-32.md — Postmortem
32 GET /api/meta/terrain-types returns hardcoded list instead of deriving from TerrainConfig or data (resolved Phase 39d — uses LandCover enum) phase-32.md — Postmortem
34 useBatchProgress hook has no dedicated test file (resolved Phase 39a — 4 dedicated tests) phase-34.md — Postmortem
34 RunDetailPage tests don't cover cancelled/error run states (resolved Phase 39a — 2 tests) phase-34.md — Postmortem
34 Analysis API responses untyped (Record<string, unknown>) — compare/sweep return free-form dicts (resolved Phase 39a — typed CompareResult/SweepResult) phase-34.md — Postmortem
34 Hardcoded morale state names and event type strings in eventProcessing.ts (resolved Phase 39a — exported constants ENGAGEMENT_EVENTS, MORALE_EVENTS) phase-34.md — Postmortem
34 Force time series reconstruction assumes no reinforcements (only counts destructions) (resolved Phase 37 — handles ReinforcementArrivedEvent) phase-34.md — Postmortem
35 Frame data uses compact keys in storage but API expands to full names — slight redundancy (accepted limitation — cosmetic, no impact on functionality) phase-35.md — Known Limitations
35 terrain_json and frames_json stored as TEXT blobs — no indexing, large runs may produce 2MB+ frames (accepted limitation — sufficient for current scenario sizes) phase-35.md — Known Limitations
35 useViewportControls hook has no dedicated test file (exercised indirectly via TacticalMap) (resolved Phase 39a — 4 dedicated tests) phase-35.md — Known Limitations
35 Only ForceStrengthChart shows the tick sync marker line — other charts don't (resolved Phase 38c — all 4 charts show tick sync + bidirectional click) phase-35.md — Known Limitations
35 Frame capture interval is not configurable (resolved Phase 39b — RunSubmitRequest.frame_interval) phase-35.md — Known Limitations
35 No keyboard shortcuts for playback (deferred to Phase 36) (accepted limitation — cosmetic) phase-35.md — Known Limitations
37 8 legacy-format scenarios can't load through API (missing campaign schema fields) (resolved Phase 55b — scenario migration) phase-37.md — Known Limitations
37 DEW hit in battle loop always results in destruction (no partial damage/disable) (resolved Phase 51c — dew_disable_threshold) phase-37.md — Known Limitations
38 Plotly charts don't use plotly_dark template when dark mode is active (cosmetic) (accepted limitation — cosmetic) phase-38.md — Known Limitations
38 No separate dark terrain color palette (elevation shading brightness modulation covers the need) (accepted limitation — cosmetic; brightness modulation covers the need) phase-38.md — Known Limitations
40 No fire-on-move accuracy penalty (only deployed weapon skip) (resolved Phase 48a — speed-based crew_skill degradation, up to 50% at max speed) phase-40.md — Known Limitations
40 Posture doesn't affect movement speed (resolved Phase 50a — DUG_IN/FORTIFIED=0x, DEFENSIVE=0.5x, 2-tick un-dig transition) phase-40.md — Known Limitations
41 Cover from buildings/fortifications additive with terrain cover (potential double-count) (resolved — code uses max() not addition; highest cover source wins, max 0.85) phase-41.md — Known Limitations
42 Suwalki Gap and Taiwan Strait stall at max_ticks — need additional victory conditions (resolved Phase 55a — closing range guard + OPERATIONAL engagement detection + calibration tuning) phase-42.md — Known Limitations
42 Rally radius (500m) and friendly count threshold hardcoded, not configurable (resolved Phase 48b — uses RoutConfig.cascade_radius_m) phase-42.md — Known Limitations
42 No per-scenario ROE configuration in existing scenario YAMLs (resolved Phase 48c — roe_level added to Srebrenica, Hybrid Gray Zone) phase-42.md — Known Limitations
47 Naval engines are phantom references (4 engines referenced in _route_naval_engagement() don't exist) (resolved Phase 51a — all naval engines instantiated) phase-47.md — Known Remaining Issues
47 _check_morale_collapsed ignores cond.params (reads global config only) (resolved Phase 48a — reads cond.params.threshold) phase-47.md — Postmortem
47 Hardcoded naval Pk values in _route_naval_engagement() (torpedo_pk=0.4, attacker_pk=0.7) (resolved Phase 48a — NavalEngagementConfig) phase-47.md — Postmortem
47 Some historical scenarios win via time_expired rather than decisive combat (resolved Phase 55a — closing range guard + OPERATIONAL engagement detection) phase-47.md — Known Remaining Issues
48 advance_speed calibration key dead data — 7 historical scenarios declare it, no Python code reads it (resolved Phase 49b — removed from all scenarios) phase-48.md — Postmortem
48 dig_in_ticks consumed by battle.py but zero scenarios use it — untested calibration point (resolved Phase 49c — exercised in test) phase-48.md — Postmortem
48 wave_interval_s consumed by battle.py but zero scenarios use it — untested calibration point (resolved Phase 49c — exercised in test) phase-48.md — Postmortem
48 target_selection_mode consumed by battle.py, always defaults to threat-scored, no scenario overrides (resolved Phase 49c — exercised in test) phase-48.md — Postmortem
48 roe_level only in 2 of ~37 scenarios; other candidates (COIN, peacekeeping) missing (resolved Phase 49c — expanded coverage) phase-48.md — Postmortem
48 Morale config weights (cohesion, leadership, suppression, transition_cooldown) consumed by scenario_runner but never tuned (resolved Phase 49c — exercised in test) phase-48.md — Postmortem
48 victory_weights consumed by engine.py but no scenario uses it — composite victory scoring untested (resolved Phase 49c — exercised in test) phase-48.md — Postmortem
48 4 SEAD/IADS/Escalation params unresolvedsead_effectiveness (resolved Phase 53e — wired into apply_sead_damage), iads_degradation_rate (resolved Phase 53e — wired into IadsConfig), sead_arm_effectiveness (resolved Phase 55c-3 — ARM vs non-radar differentiation in iads.py), drone_provocation_prob (resolved Phase 55c-4 — escalation trigger in engine.py) phase-48.md — Postmortem
48 Resolution switching causes long-range battles to resolve via time_expired instead of combat (resolved Phase 55a — closing range guard + OPERATIONAL engagement detection) phase-48.md — Postmortem
51 Naval posture detection modifiers not implemented (resolved Phase 56e — detection range multipliers per posture) phase-51.md — Known Limitations
51 Blockade throughput reduction not integrated into supply_network.py route costs (resolved Phase 56g — SEA route condition degradation) phase-51.md — Known Limitations
51 No scenarios exercise VLS magazine_capacity or mine encounters end-to-end (accepted limitation — structurally wired; unit tests verify code paths) phase-51.md — Known Limitations
48 Calibration audit test lists advance_speed in _EXTERNAL_KEYS but it's not consumed — false pass (resolved Phase 49b — schema-based validation) phase-48.md — Postmortem
48 calibration_overrides is free-form dict[str, Any] — no schema validation, mistyped keys pass silently (resolved Phase 49a — typed CalibrationSchema pydantic model) phase-48.md — Postmortem
53 sead_arm_effectiveness defined on IadsConfig but never consumed in any code path (resolved Phase 55c-3 — ARM vs non-radar differentiation in iads.py) phase-53.md — Postmortem
53 drone_provocation_prob in CalibrationSchema but never consumed by any engine (resolved Phase 55c-4 — escalation trigger in engine.py) phase-53.md — Postmortem
54 GasWarfareEngine instantiated in scenario.py but zero call sites in battle/engine/campaign (resolved Phase 55c-1 — MOPP query in battle.py WW1 barrage path) phase-54.md — Postmortem
54 seeker_fov_deg dead YAML field (resolved Phase 55c-2 — FOV cone check in battle.py guided munition path) phase-54.md — Postmortem
55 Gas casualty modifier has hardcoded floor (0.1) and scaling (0.8) (resolved Phase 56f — CalibrationSchema fields) phase-55.md — Postmortem
58 apply_casualties / degrade_equipment unwired — methods exist on Unit but not called from battle.py. Behavioral application deferred to calibration phase that accounts for progressive unit degradation. phase-58.md — Known Limitations
58 Fuel consumption unwired — fuel gate (check) works but fuel depletion (consumption) commented out in battle.py movement loop. Rate needs per-vehicle-type calibration and resolution-aware scaling. phase-58.md — Known Limitations
58 Air routing uses hardcoded Pk values (missile_pk=0.5, weapon_pk=0.4, interceptor_pk=0.4) — should read from weapon definitions when scenarios enable enable_air_routing: true. phase-58.md — Known Limitations
59 Ice crossing pathfinding — frozen water bodies not traversable (requires pathfinding graph changes to add temporary edges) phase-59.md — Deferrals
59 Vegetation height LOS blocking — tall vegetation (>2m) should block ground-level LOS (requires DDA raycaster modification) phase-59.md — Deferrals
59 Bridge capacity enforcement — units lack weight field, so capacity_tons gate cannot be applied phase-59.md — Deferrals
59 Ford crossing routing — river ford traversal requires pathfinding integration phase-59.md — Deferrals
59 Road snow degradation — _ROAD_SPEED_FACTORS hardcoded table needs per-snow-depth refactoring phase-59.md — Deferrals
60 Fire spread cellular automaton (wind-biased spread between cells) — fire zone creation wired, spread deferred to calibration phase-60.md — Deferrals
60 environment_config scenario YAML — pre-placed smoke/fog zones and season overrides phase-60.md — Deferrals
60 Burned zone concealment reduction — BurnedZone.concealment_reduction=0.5 exists but not consumed in detection phase-60.md — Deferrals
60 Fire damage application to units — units_in_fire() called/logged, burn damage not applied phase-60.md — Deferrals
60 Road surface dust suppression — dust generation doesn't distinguish paved roads phase-60.md — Deferrals
60 Artificial illumination / flares — no flare deployment mechanic exists phase-60.md — Deferrals
61 CarrierOpsEngine full battle loop wiring — instantiated but CAP/sortie/recovery needs air sortie dispatch phase-61.md — Deferrals
61 Beaufort > 6 helicopter deck landing abort — no helicopter-carrier recovery tracking phase-61.md — Deferrals
61 Beaufort > 7 carrier flight ops suspension — requires CarrierOpsEngine battle loop integration phase-61.md — Deferrals
61 Landing craft 10% casualty risk at Beaufort > 5 — no landing craft type detection phase-61.md — Deferrals
61 Sea spray/salt fog maritime obscurant — needs ObscurantsEngine integration phase-61.md — Deferrals
61 SHF/EHF rain attenuation for comms — needs per-equipment frequency tracking phase-61.md — Deferrals
61 Ionospheric storm effects on HF — needs space weather events phase-61.md — Deferrals
61 Hull natural period per ship class — hardcoded 10s/12s, should come from YAML phase-61.md — Deferrals
62 Dehydration/water consumption — needs water supply tracking in logistics phase-62.md — Deferrals
62 Environmental fatigue acceleration — temperature-driven fatigue needs fatigue accumulation wiring phase-62.md — Deferrals
62 MOPP comms → C2 effectiveness full chain — voice clarity → order execution phase-62.md — Deferrals
62 Turbulence → gun accuracy — no turbulence model in WeatherEngine phase-62.md — Deferrals
62 Wind shear (altitude-dependent wind) — needs new wind profile model phase-62.md — Deferrals
62 Surface roughness → CBRN mixing height — needs per-terrain roughness data phase-62.md — Deferrals
63 MissileEngine per-tick update — launch ships but flight-to-impact resolution deferred phase-63.md — Deferrals
63 MissileDefenseEngine intercept — requires missile-as-contact detection phase-63.md — Deferrals
63 Formal DEGRADED unit status — threshold logging only, no enum value or auto Pk/movement penalties phase-63.md — Deferrals
63 FOW confidence-weighted assessment — uses simple contact count, not confidence mapping phase-63.md — Deferrals
63 RTD to HEALTHY — restores to MINOR_WOUND only, full rehabilitation deferred phase-63.md — Deferrals
63 Logistics event feedback — SupplyDelivered/RouteInterdicted/ConvoyDestroyed events unsubscribed phase-63.md — Deferrals
64 CommandEngine full hierarchy wiring — authority check skipped when command_engine=None phase-64.md — D1
64 Order delay enforcement queue — delay computed but not enforced phase-64.md — D2
64 Misinterpretation parameter modification — logged but order params unchanged phase-64.md — D3
64 Planning result injection — auto-advances without COA/wargaming results phase-64.md — D4
64 ATO entry consumption — sorties_today never incremented after air engagement phase-64.md — D5
64 Stratagem duration and expiry — active stratagems never expire phase-64.md — D6
64 Deception effect on enemy AI — no false force disposition in FOW phase-64.md — D7
64 Hardcoded echelon_level=5 for all units in DECIDE handler phase-64.md — D8
64 Hardcoded mission_type=0 (ATTACK) for all orders phase-64.md — D9
64 Economy-of-force/feint unit selection by list position phase-64.md — D10
64 PropagationConfig private attribute mutation from battle.py phase-64.md — D11
66 Guerrilla retreat movement — disengage evaluated but unit doesn't physically relocate phase-66.md — D1
66 Population center spatial lookup — falls back to 0.0 density when population_engine absent phase-66.md — D2
66 IED auto-emplacement by insurgent AI — only pre-placed IEDs supported phase-66.md — D3
66 Mine sweeping hardcoded to CONTACT type only phase-66.md — D4
66 AmphibiousAssaultEngine — full beach assault state machine deferred (needs scenario infrastructure) phase-66.md — D5
66 ConditionsEngine replacing EMEnvironment — conditions_facade added alongside, migration deferred phase-66.md — D6
66 P4 dead code (shadow_azimuth, solar/lunar, deep_channel_depth) — allowlisted not removed phase-66.md — D7
66 Data link range degradation — binary gate only, gradual C2 loss deferred phase-66.md — D8
66 Propulsion altitude performance — cruise_altitude_m not wired to altitude-dependent Pk phase-66.md — D9
66 SimulationContext TODO cleanup — cosmetic, deferred phase-66.md — D10
85 Aggregation engine.py wiring deferred — automatic LOD-tier-based aggregate/disaggregate in campaign tick not wired phase-85.md — Accepted Limitations
85 1000-unit performance benchmark not validated — no 1000-unit scenario exists yet phase-85.md — Accepted Limitations
88 SoA morale/engagement integration structural only — arrays available but not driving batch computation yet phase-88.md — Known Limitations
88 sync_positions_to_units() exists but unused — movement updates Unit objects directly phase-88.md — Known Limitations
88 max_range extraction requires unit_weapons dict — not always available phase-88.md — Known Limitations

Conventions

  • Each phase file is a living document — updated as work happens, not just at the end.
  • Sections within a phase: Summary, What Was Built, Design Decisions, Deviations from Plan, Issues & Fixes, Open Questions, Known Limitations, Lessons Learned.
  • When a decision in one phase affects another, note it and cross-reference.
  • Known Limitations / Post-MVP Refinements: every phase should document deliberate simplifications. The index table above aggregates them for easy review.
  • Post-MVP phases (11+): Same devlog conventions apply. Create phase-{N}.md when work begins. Update the table above from "Planned" → "In Progress" → "Complete" with link. New limitations discovered during post-MVP work must be added to both the phase devlog AND the refinement index above, AND the deficit-to-phase mapping in development-phases-post-mvp.md.
  • Deficit resolution: When a post-MVP phase resolves a deficit from the index above, mark it with a strikethrough and note which phase resolved it. Update the deficit-to-phase mapping in development-phases-post-mvp.md accordingly.