# DEVLOG ## 2026-02-10 - Rust CLI/TUI rebuild (strict dependencies) ### Scope completed - Initialized a Rust project with strict dependency policy: `ratatui`, `crossterm`, `clap` only. - Added global `--seed` support for reproducible runs across TUI and headless commands. - Ported team/tactic/profile data from JavaScript into `src/data.rs`. - Implemented a std-only deterministic RNG in `src/utils.rs`. - Ported core simulation logic to Rust in `src/sim.rs`: - Single match minute loop with xG, tactics, fouls/cards, corners, offsides, saves. - 4-team league mode with fixtures and standings tie-breakers. - 4-team knockout mode with penalties and edge-case loop guard. - Implemented lifecycle state machine and bounded logs in `src/instance.rs`. - Built a ratatui dashboard/detail UI with keyboard controls in `src/app.rs` + `src/ui/*`. - Implemented CSV export in `src/export.rs` with manual escaping and CSV injection sanitization. - Added CLI commands: - `quick` (single match) - `list` (team listing) - `export` (CSV generation) ### Key controls in TUI - `n`: create Single Match instance - `l`: create 4-Team League instance - `o`: create 4-Team Knockout instance - `s`: start selected instance - `c`: clone selected instance - `d`: delete selected instance - `e`: export selected instance to CSV - `v` or `Enter`: toggle dashboard/detail - `1`, `2`, `4`, `0`: speed control (1x/2x/4x/instant) - `j`/`k` or arrow keys: select instance - `q`: quit ### Notes - No async runtime is used. - No external data files are required at runtime. - Team data is fully embedded in the binary. - CSV export format is mode-specific and generated with std I/O. ## 2026-02-10 - Team selection controls (manual + CPU auto-fill) ### Scope completed - Added interactive create modal in TUI for team slot configuration. - Added per-slot selection mode: - `Manual` team selection - `CPU auto-fill` - Kept deterministic behavior by resolving CPU team picks with the instance seed. - Added keyboard controls for modal flow: - `m` set manual, `p` set CPU - `[` / `]` or left/right to cycle manual teams - up/down to switch slot - Enter to create, Esc to cancel - Updated `quick` command to support optional `--home` / `--away`: - If missing, CPU auto-fills from remaining teams. - Same seed yields the same auto-filled teams and outcomes. ## 2026-02-10 - Live standings/bracket updates + possession surfacing ### Scope completed - Added explicit possession fields to match results and surfaced them in quick mode output. - Added possession row to single-match CSV export output. - Implemented live detail updates driven by simulation frames: - per-frame stats updates - per-frame competition panel updates - incremental history updates - Added live league standings snapshots after each fixture. - Added ASCII knockout tree bracket snapshots and updates after each semifinal/final. - Tuned detail view layout to allocate more space to stats/competition/history panels. ## 2026-02-10 - Fullscreen info modals for readability ### Scope completed - Added dedicated fullscreen overlay modals for: - Stats (`t`) - Standings/Bracket (`g`) - History (`h`) - Added modal scrolling controls (`j/k` or up/down) and close controls (`Esc` or `q`). - Simplified detail view to focus on scoreboard, logs, and instance info. - Added detail-panel hint bar to direct users to the new dedicated modals. ## 2026-02-10 - National team expansion ### Scope completed - Expanded team database to include 50+ national teams in addition to existing clubs. - Added national-team flag mappings, including `PRC China`. - Added tactic/formation profile mappings for the new national teams. - Verified with `list` and deterministic `quick` simulation using national teams. ## 2026-02-11 - Web mode with Actix and Rust-backed frontend ### Scope completed - Added `--web` launch mode to start an Actix server at `127.0.0.1:9009`. - Implemented web APIs for team listing and simulation lifecycle: - create/list/detail/start/clone/delete/export CSV - Reused Rust simulation engine and instance lifecycle for backend execution. - Rebuilt `index.html` and `data.js` as a modern web dashboard UI backed by Rust APIs. - Removed legacy client-side simulation engine from the browser path. ## 2026-02-11 - Open listen option for web mode ### Scope completed - Added `--listen-open` CLI argument for web mode. - Enforced `--listen-open` usage only when `--web` is present. - Updated web server bind address behavior: - default: `127.0.0.1:9009` - open listen: `0.0.0.0:9009` - Updated startup logs and README usage examples for LAN-accessible mode.