v0.7.4 — Red Flags hold a train out of your Limits (Gitea#19)
"If played, asked FLAG EAST or FLAG WEST. That stops all trains from entering your limits from that direction (i.e. Flag East holds westbound trains). You can do this if you see a problem or wish to complete switching." REPLACES the old rule outright, per Jesse's call. Red Flags used to be played on a stopped train out on the Mainline and protected it from a rear-ender: offered 4,212 times and played 4 across 600 games, a mechanic nobody used, and ABS Signals already does that job better. The flag is now planted on one side of your own district and holds the next train arriving from that side. SPENT ON THE TRAIN IT STOPS. One card, one train, so there is no lifting action to build, nothing to forget, and a flag cannot quietly strangle the Division. The held train loses one Mainline Phase and comes in on the next — it buys a Stage to clear the lead, which is what "wish to complete switching" asks for. PLAYABLE OUT OF PHASE, which is the other half of the issue: when an arrival would certainly collide and the district's owner holds the card, the phase breaks in and asks. Offered ONLY to somebody holding one — a prompt with a single button is not a choice, and it would leak that a collision is coming. The danger is read from §8.3's own two triggers rather than restated, so the prompt cannot offer a flag against a collision that will not happen. Built on the decision union Gitea#5 introduced: this adds a `redFlag` case and nothing else structural. THE BOT STILL NEVER PLAYS IT, AND I MEASURED RATHER THAN ASSUMED. It now takes the out-of-phase prompt unconditionally — the engine has already established the danger, so there is nothing left to judge — and over 200 solitaire games `redFlagsSet` fires ZERO times. The prompt needs an arrival that would collide (0.14 per game, about one game in seven) to coincide with holding the card from a three-card hand out of 121. So the anomaly exemption in sim.test.ts stays, but its comment no longer claims the bot is unwilling: it is measuring deck luck. What is left to fix is the half of the card a human would use, planting a flag on purpose to buy switching time, and TODO.md now says that instead of the old finding. A BUG WORTH RECORDING, because the next interruption will meet it too: the flag was originally taken down in a `reduce` case, which never fires for an event advance.ts emits — the phase driver mutates state and then describes it. The flag stayed up and held every train that came. test/events.test.ts's unreduced-event registry is what makes that class of mistake visible, and `redFlagSpent` is on it deliberately now, with the reasoning. 858 tests pass. Closes #19 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01EAgJSmeV8zrMh55Mj85ESb
This commit is contained in:
co-authored by
Claude Opus 5
parent
228027637b
commit
19a6a47ab6
@@ -414,21 +414,23 @@ The replay viewer, the save format, and how a game gets shared.
|
||||
|
||||
## Bot Performance
|
||||
|
||||
- [ ] **THE BOT WILL NOT PLAY RED FLAGS, and the reachability canary now says so.** Measured over
|
||||
600 games (2026-08-26): `maneuver.redFlags` is OFFERED **4,212 times**, first in game 5 — the
|
||||
rule is live and constantly available — and the bot PLAYS it **4 times**, first in game 252.
|
||||
It is exempted by name in `sim.test.ts`'s anomaly test alongside `flyingSwitch`, and deleting
|
||||
that line is what proves this fixed.
|
||||
- [ ] **THE BOT NEVER PLAYS RED FLAGS — and since Gitea#19 that is deck luck, not unwillingness.**
|
||||
**Re-measured 2026-08-29, after the card was redesigned: `redFlagsSet` fires ZERO times in 200
|
||||
solitaire games.** The old measurement (600 games: OFFERED 4,212 times, PLAYED 4) described a
|
||||
bot that declined a card it was constantly handed. That bot is gone.
|
||||
|
||||
Two changes compounded to make it rarer without breaking anything: Gitea#14 took Red Flags from
|
||||
5 copies to the sheet's 3, and Gitea#3 shortened most crossings to a single Stage, so the
|
||||
window in which a train is STANDING on a Mainline card — the only place the card may be played
|
||||
— is now usually one Stage wide.
|
||||
Gitea#19 replaced the rule outright: a flag is planted on one side of your own Limits and holds
|
||||
the next train from that direction, and it can be played out of phase when the engine breaks in
|
||||
with "COLLISION RISK! FLAG AGAINST T2?". The bot takes that prompt **unconditionally** — the
|
||||
engine only raises it when an arrival is certainly about to collide, so there is nothing left
|
||||
to judge. It still never plays one, because the prompt needs two things to coincide: an arrival
|
||||
that would collide (0.14 collisions per game, about one game in seven) AND the district's owner
|
||||
holding a Red Flags card at that moment, from a three-card hand drawn out of 121.
|
||||
|
||||
|
||||
What the developer bot can and cannot yet do, measured. Every revenue figure below measured before
|
||||
v0.4.7 is low by roughly half a point — see the stub-industry entry — and the rebalance pass should
|
||||
not read that drop as a deck problem.
|
||||
**What is left to fix is the OTHER half of the card**, and it is the half a human would use:
|
||||
planting a flag on purpose to buy a Stage for switching. That needs the bot to know it wants
|
||||
time, which it has no notion of today. Until then the anomaly canary in `sim.test.ts` is
|
||||
measuring deck luck rather than reachability, and its comment now says so.
|
||||
|
||||
- [ ] **THE BOT DOES NOT KNOW TO BRING AN EXPEDITED TRAIN BACK TO THE STATION — new in v0.4.9.**
|
||||
The `expediteFault` mechanic (§7, Q3) charges 1 Revenue every Mainline Phase an expedited train
|
||||
|
||||
Reference in New Issue
Block a user