v0.7.9.1 — the engine was right twice; the screen was not

Gitea#22: the Division map drew every westbound train in the wrong half of
its Mainline card. `regionOfTransit` counts from the end a train entered,
which is what the collision rules ask; the map wanted "which printed box,
left to right" and used the same number, so an eastbound train came out
right by luck and a westbound one came out mirrored. It cost a collision —
Train 3 was cleared to follow T5 and ran into TX17, which the picture had
drawn ahead of T5 rather than behind it. One mirror in `view.ts`, at the
boundary the map is drawn from; the collision rules are untouched.

Gitea#21: a second tank car would not come off at a refinery, and "Blocked
— why nothing is moving" answered by describing the refinery's green box.
The real answer was Train 3's printed rule — the Express works one freight
car per location — so the refusal was correct and the panel sent the player
to spend a Freight Agent action that could not have helped. No rule
changed. The panel now names the budget, asking the reducer's own
predicate so its words cannot drift from the rule.

Both were replayed from the saves attached to the issues and verified in
the exact position each report names. The map fix is proved by mutation:
reverting the mirror fails two tests, and making the renderer ignore the
region fails a third. Every existing region test ran eastbound, where the
mirror is the identity, which is why the bug survived them.

891 tests pass, up from 884.

Closes #21
Closes #22

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01E3Qk7uresKCHksdZajXCLg
This commit is contained in:
Jesse.Markowitz
2026-09-07 11:41:23 -04:00
co-authored by Claude Opus 5
parent 6058f6c17e
commit 7ade60e21f
11 changed files with 412 additions and 21 deletions
+38 -8
View File
@@ -43,13 +43,21 @@ Not items. Things that are true of every change, and that have gone wrong when s
- **Keep `CHANGELOG.md` current in the same change.** Commit messages stay high level; the
reasoning, the measurements and the things that turned out to be wrong live there.
30. **Close each Gitea issue by hand, with a comment naming the commit that fixed it** and, where the
fix was not what the report implied, the ruling that decided it. Auto-closing leaves an issue with
no record of which commit or which release answered it. Done for every issue closed so far: #2,
#6, #8, #9 and #10 from v0.7.1; #3, #14, #15, #17 and #18 from v0.7.2 — including #15's REVERSAL
on review (the placement is legal; what was confirmed is that no train crosses the gap) and #14's
list of the ten unbuilt cards, so they do not vanish with the issue. The token and the API calls
are in the workspace's `AGENTS.local.md`.
30. **Close a Gitea issue with `Closes #<n>` in the commit — not by hand** (Jesse, 2026-08-30).
Gitea records the linking commit itself when it auto-closes, so a manual close adds nothing but a
step, and the same rule is what the workspace `AGENTS.md` already prescribes.
**What auto-closing does NOT carry is a RULING, and that still has to be written by hand.** When
the fix was not what the report implied, comment on the issue before it closes, saying what was
decided and why. That is the half worth keeping: Gitea#15 was REVERSED on review — the placement
is legal, and what was actually confirmed is that no train crosses the gap — and Gitea#14's
comment lists the ten unbuilt cards so they do not vanish along with the issue. A bare
`Closes #<n>` would have lost both.
This item said the opposite until 2026-08-30 ("close each issue by hand… auto-closing leaves no
record"), which was written from how the issues closed in v0.7.1 and v0.7.2 rather than from a
decision. The token and the API calls, for reading issues and for leaving a ruling, are in the
workspace's `AGENTS.local.md`.
37. **The wrapper release sequence, unchanged since 0.7.2 and worth following exactly.** Tag the app,
fetch the tag into the wrapper's submodule, bump `current.ts` **in place** (the outgoing `up` has
@@ -1721,11 +1729,33 @@ re-verified turn out to have been re-verified against a premise rather than agai
Closed items, kept because several are the only record of a ruling or a lesson. Newest first within
each group.
### Shipped through v0.7.9, from the queue
### Shipped through v0.7.9.1, from the queue
Closed items, newest first. Kept because several of them are the only record of a ruling or a lesson;
the numbers stay so cross-references above and below still resolve.
89. ~~**The map drew westbound trains in the wrong half of a Mainline card.**~~ — done 2026-09-07 in
v0.7.9.1, Gitea#22. `regionOfTransit` counts from the end a train ENTERED, which is what the
collision rules want; the map wanted "which printed box, left to right" and used the same number,
so every westbound card came out mirrored. It cost a collision: the Superintendent cleared Train 3
to follow T5 and it ran into TX17, which the picture had drawn ahead of T5 instead of behind it.
**Worth knowing:** the engine was right and only the picture lied, so the fix is one mirror in
`view.ts` at the drawing boundary — and every existing region test ran eastbound, where the mirror
is the identity, which is exactly why it survived them. The same shape as the mirrored consist row
at the Whistle Post (seed 270861860): a number meaning "distance run" used where the screen means
"place". **Ask of any new Frame field whether it is a distance or a position.**
90. ~~**The Blocked panel explained a refusal by describing something else entirely.**~~ — done
2026-09-07 in v0.7.9.1, Gitea#21. A second tank car would not come off at a refinery; the panel
said the refinery's green box was empty. The real answer was Train 3's printed rule — the Express
may work one freight car per location — so the refusal was correct and the panel sent the player
to spend a Freight Agent action that could not have helped. **The ruling: no rule changed, only
what the screen says about it.** The panel asks the reducer's own `freightBudgetLeft` through a
new exported `freightRuleSpentHere`, so its words cannot drift from the rule. **Worth knowing:**
a panel that answers the wrong question is worse than one that stays silent, because it looks
like an answer — and a rule that only lives on a card tooltip is invisible at the moment a player
notices a button is missing.
43. ~~**"Waiting on" said nobody while the game was stopped on the Superintendent.**~~ — done
2026-08-30 in v0.7.9. `Frame.actor` carried `clock.currentActor`, null for the whole Mainline
Phase, so all three interruptions (clearance, Yard Office, Red Flag) reported that the Division