From 3871bc7b8ae22e042cc02730aa05e8c1f5032504 Mon Sep 17 00:00:00 2001 From: "@permadeath.com" Date: Wed, 19 Aug 2026 17:26:37 -0400 Subject: [PATCH] docs(unit-rules): tick off the attribution goal --- TODO.md | 28 ++++++++++++++++++++++++---- 1 file changed, 24 insertions(+), 4 deletions(-) diff --git a/TODO.md b/TODO.md index 0f2e5d4..21c44ab 100644 --- a/TODO.md +++ b/TODO.md @@ -419,10 +419,30 @@ not obvious from any one of them. - [ ] **Turn a post-match `.mul` into a repair list.** The difference between the design and its condition, per location: armour points, structure, the slots that were shot out. helm holds both sides already. -- [ ] **Say where a unit's value went.** Which term lost it - plate, frame, - a weapon, cooling. `BvBreakdown` carries the two ratings; attributing a - loss wants the terms under them, which `defensive`/`offensive` already - compute and do not yet report. +- [x] **Say where a unit's value went.** Which term lost it - plate, frame, + a weapon, cooling. `helm_bv::attribute` takes two conditions and reports + the terms that moved between them, worst loss first, in battle value + points rather than in their own units. `helm force --why` + prints it and `Design#attribution` is the same thing in a browser. + + The terms do not add up to the figure by themselves - each half is a sum + through a factor, and damage moves both - so the split needs a + convention: an additive term is valued at the factor the machine ended + up with, and a factor against the subtotal it started from. That is the + one split with no cross term left over, and it is what lets a page draw + a bar per term and have the bars sum to the drop beside them. + + A Griffin GRF-1N that came out of a match at 694 from 1272 reports -310 + to its weapons, -257 to its plate and -12 to its frame, which is a + repair list in the order it matters. + + Two things the sweep found. Wrecking a torso or a leg moves the *speed* + factor and not the movement factor, because what it destroys is jump + jets: 1,159 designs of 4,294 against 306. And a test over the damaged + oracle rows alone never exercised either, so a split that valued a + factor at the wrong moment passed it - the sweep over the library is + what closes that, and both wrong splits were tried on purpose to see the + guard fire. - [ ] **Verify a post-match file and show it back.** The upload check above, run on the way out rather than the way in. -- 2.51.2