From 57dbb0b095b399cab253c280e320bf1ff3a79580 Mon Sep 17 00:00:00 2001 From: "did:web:projective-bichuwa.test.pds.did.bot" Date: Tue, 27 Oct 2026 18:23:07 +0000 Subject: [PATCH] docs(training): audit the hardcoded decision numbers Records what this pass made movable, what is still hand-authored, and what is deliberately a rule rather than a weight. Co-Authored-By: Claude Code Change-Id: I5c33e226093f7266f7a7bb4fff97324571d2ed70 --- plan/training.md | 54 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) diff --git a/plan/training.md b/plan/training.md index 0997df34..59d5c7d7 100644 --- a/plan/training.md +++ b/plan/training.md @@ -39,6 +39,17 @@ parameters. That is one overnight run. object of that file. Missing, malformed, or naming a feature that does not exist is fatal and says which; the flag rides along in the harness's `--bot` command string +- [x] **The coordinator's scalars are a file.** `switchingCost`, `effective` + and `finish` are read from `--coordinator-weights` and written to the + weights sidecar, so a fit can move them alongside `M`. The defaults are + unchanged, and the target terms are now the same scale as feature + weights. +- [ ] **Fit the coordinator scalars.** The file is the interface; the objective + is a separate fit from `M` because these terms act on the joint + assignment rather than on one candidate. +- [ ] **Fit the tactic-selection weights.** `TacticWeights` is file-loadable + and still hand-authored. Its basis is small enough to fit once the + situation rows are recorded at a useful rate. - [ ] Train at zero noise. Weights fitted with noise active learn to be noise-robust, which silently changes the policy - [ ] Difficulty parameters in an outer loop, fitted to a target win rate @@ -2581,3 +2592,46 @@ generated from. - [ ] Record a self-play corpus at head with `--explore`, and re-take every figure in this section on it. Until then the two never-priced columns have one measurement each and it is from a corpus nobody would choose + +## Hardcoded numbers, audited + +A pass over the decision code for constants that decide play outside the feature +basis. The rule used: a number belongs in a fit when it prices a trade; a number +that defines a rule, a unit or a feature's domain does not. + +**Made movable by this pass** + +- `focus_damage` was a `Doctrine` constant of 0.75. It is now a catalogued + feature and a weight in `M`, governed by lenses. +- `switchingCost` was `SWITCHING_COST`. It is now a field of + `CoordinatorWeights`, loaded with `--coordinator-weights`. +- `effective` and `finish`, the two target terms in `Doctrine`, were 1.0 and + 0.5. They are now fields of the same file. + +**Still hand-authored, and next in line** + +- `TacticWeights`: one weight on `is_our_opening`, every other tactic feature at + zero. The file format exists and `--tactic-weights` loads it; no fit writes it + yet. The situation rows are recorded, so this is a fitting job rather than a + plumbing one. +- The spotter and screen choices: prefer a `SCOUT`, then lowest BV, then lowest + id; a screen prefers a non-scout. These are selection policies, not linear + terms. Making them learnable means a small ranker over the candidates, not + one more column. +- The focus selector: highest battle value per point of health left, ties on id. + A learned version is a target-ranking model; it is a policy, not a weight. + +**Deliberately not weights** + +- `FAR` and `SCATTERED` are normalisation domains for the situation features. + Changing them changes what the number means, and a weight already absorbs + scale. +- `COHESION` defines when a formation stops existing. It is a rule about force + structure, not a price. +- LOS, to-hit, movement costs and heat are MegaMek's rules. The bot reads them + and does not get to price them. +- The objective threshold and the preservation response come from the host or + the scenario. `mission_kills` has no threshold yet; that is a missing rule, + not a missing weight. +- `explore`'s temperature is a training parameter and already a flag. It is + sampled around, not scored with. -- knotmirror 0.0.1