From 2f49cb243f78065bb1cde490d932834d663bd179 Mon Sep 17 00:00:00 2001 From: Davide Cappellini Date: Fri, 21 Aug 2026 23:26:31 +0200 Subject: [PATCH] =?UTF-8?q?docs(SAC=5FLSTM=5FBot):=20campaign-v1=20noteboo?= =?UTF-8?q?k=20=E2=80=94=20locked=20config=20+=20story=20so=20far=20(#56)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- SAC_LSTM_Bot/docs/campaign_notebook.md | 72 ++++++++++++++++++++++++++ 1 file changed, 72 insertions(+) create mode 100644 SAC_LSTM_Bot/docs/campaign_notebook.md diff --git a/SAC_LSTM_Bot/docs/campaign_notebook.md b/SAC_LSTM_Bot/docs/campaign_notebook.md new file mode 100644 index 0000000..3d28a70 --- /dev/null +++ b/SAC_LSTM_Bot/docs/campaign_notebook.md @@ -0,0 +1,72 @@ +# Campaign Notebook — campaign-v1 (SAC_LSTM_Bot) + +Overnight training campaign on branch `research/goto-controller`. +Companion tickets: config+launch = **#56**, morning verdict = **#57**, map = **#53**. +Monitoring contract: observability inventory in **#55 comment 461** (9 signals, thresholds, four-way discrimination). + +## Locked config (campaign-v1) + +Launch command (tmux session `sac_campaign`, stdout teed to `campaign_stdout.log`): + +```bash +SAC_OPPONENTS='Corners:3,Crazy:2,RamFire:1,Target:1,SacTwin:1' \ +SAC_EVAL_OPPONENT=Corners \ +SAC_TOTAL_ROUNDS=2000 \ +SAC_CHUNK_SIZE=10 \ +SAC_EVAL_INTERVAL=2 \ +SAC_EVAL_ROUNDS=10 \ +SAC_MAX_CRASHES=5 \ +SACLSTM_HIDDEN_SIZE=256 \ +SACLSTM_BATCH_SIZE=16 \ +SACLSTM_UTD_RATIO=1 \ +SACLSTM_SAVE_INTERVAL=20 \ +./sac_train.sh 2>&1 | tee -a campaign_stdout.log +``` + +| Knob | Value | Source / rationale | +|------|-------|--------------------| +| `SAC_OPPONENTS` | `Corners:3,Crazy:2,RamFire:1,Target:1,SacTwin:1` | Working recommendation kept. Twin pinned at **1 not 2**: #54 showed mirror battles end early ⇒ fewer transitions per chunk; weight 2 would starve the replay buffer. | +| `SAC_EVAL_OPPONENT` | `Corners` | Pinned explicitly (= first pool entry default, #54 note) — removes reorder footgun. | +| `SAC_TOTAL_ROUNDS` | `2000` | Sized so the **wall-clock ceiling binds first** (~100–150 rounds/h observed incl. evals ⇒ ~13–20 h of headroom). | +| `SAC_CHUNK_SIZE` | `10` | Harness default. | +| `SAC_EVAL_INTERVAL` | `2` | Harness default — eval every ~20 rounds ≈ every ~10 min. | +| `SAC_EVAL_ROUNDS` | `10` | Harness default. | +| `SAC_MAX_CRASHES` | `5` | Harness self-abort; monitor intervenes earlier at ≥3 consecutive crashes (#55). | +| `SACLSTM_HIDDEN_SIZE` | `256` | Module default (`network.nim`); real capacity vs #49 smoke's 32; under `MaxHidden`=512 cap. | +| `SACLSTM_BATCH_SIZE` | `16` | Module default (`integration.nim`). | +| `SACLSTM_UTD_RATIO` | `1` | Module default. | +| `SACLSTM_SAVE_INTERVAL` | `20` | **Deviation** from default 500: #54 proved the shutdown save never reaches disk in harness context — only mid-battle interval saves persist; 10–20 fired reliably, 50 did not in twin chunks. 20 = top of proven range, least IO. | +| *(not pinned)* | module defaults | `LR_ACTOR/LR_CRITIC/LR_ALPHA=3e-4`, `GAMMA=0.99`, `TAU=0.005`, `TARGET_ENTROPY=-4.0`, `BUFFER_CAPACITY=500000`, `BURN_IN=8`, `TRAIN_WINDOW=16`. | + +**Budget**: generous wall-clock **ceiling, not a deadline** — **T+12 h** from launch. While HEALTHY per #55 discrimination rules the run continues; a monitor kills the tmux session at the ceiling or on an intervene threshold. + +**Fresh start**: pre-campaign `weights/` held #49-smoke 32-hidden checkpoints, incompatible with hidden=256. Archived to `weights_smoke49_backup/`; baseline re-established by a 10-round bootstrap battle vs Corners (also created the seed for `make_twin.sh`). + +## Phase log + +- **2026-08-21 ~23:30** — Config locked (this file), claim posted on #56 (comment 471). Smoke weights archived. +- **2026-08-21 ~23:4x** — Bootstrap battle vs Corners done; baseline checkpoint + `best_score.txt` written; twin regenerated via `./make_twin.sh` from the campaign-v1 baseline. +- **2026-08-21 ~23:5x** — Launched tmux `sac_campaign`. First-health-check: see *Incidents & checks* below. + +## Decision-issue index + +| Issue | What it decided | +|-------|-----------------| +| #37–#48 | Bot built: skeleton, state, actions, rewards, LSTM network, weights, SAC+LSTM training, integration. | +| #49 | Training harness + smoke run (toy hyperparams: hidden 32). | +| #54 | Mirror-twin sparring partner; SAVE_INTERVAL ≤20 rule; eval opponent = first pool entry. | +| #55 | 9-signal observability inventory; CRASHED/STALLED/SLOW-LEARNER/HEALTHY discriminators; monitor thresholds. | +| #56 | This campaign: locked config + launch (this notebook). | +| #57 | Morning verdict — consumes this notebook + logs. | + +## Incidents & checks + +*(appended during the run)* + +### Launch health check (first chunks) + +Pending — filled right after launch. + +## Results + +*(filled by #57 / morning session)*