Collision Fix, RimWorld-Style Graphics Pass, Outside Queue, Kitchen Ergonomics
A large batch of rapid-fire follow-ups. Servers no longer stand on top of customers (a centralized Restaurant.serverStandingPointFor now picks a diagonal corner, never a seat — even an empty one); servers visibly carry the plate they're delivering; each recipe has distinct plate art; a vacated seat shows a dirty plate and a paid one shows money (both persisting after the customer object itself is gone); clean empty seats show a place setting. A full graphics fidelity pass brought floors, walls, and the exterior up toward RimWorld/Prison Architect style: wood-plank dining room vs. checker-tile kitchen vs. sidewalk/road outside, a decorative storefront facade and glass front door, a solid brick-coursed kitchen wall with a swinging double door, wood-textured tables, and chairs that rotate to face their table. Customers themselves now face whichever side of the table they're actually sitting on (front/back/profile pawn art) instead of one fixed silhouette. Customers arriving now form a real single-file queue on the sidewalk (capped there deliberately — never spilling into the road) instead of clustering wherever pathfinding happened to stop them. Cooks spawn in the kitchen; idle servers head to the door or the kitchen doorway instead of freezing in place; the pass sits right at the kitchen door as the pickup point.
Verified this session (see WORKLOG.md for full detail):
- Three separate deadlocks found by simulation, not code review, each from a small feature request that looked safe in isolation: a server waiting to hand out menus could permanently block a party member's approach to a different seat at the same table; an early queue design had arrivals walk backward through everyone ahead of them; capping the queue to the sidewalk exposed a latent bug where the queue's own front slot sat on the one cell every escorted party must cross to reach the dining room. All three fixed with the same idiom (release an agent's occupancy hold once it's genuinely just standing still, not mid-task) and covered by regression tests.
- A 600-simulated-second headless sweep (
sim._tickin a loop, checking every agent'sblockedTime) found zero agents stuck longer than 15 seconds after all three fixes, versus multiple agents stuck 40-50+ seconds before the last one. - A
NaN-producing field-order bug inSimulation's constructor was found, fixed, discovered to break 6 tests that had come to depend on it, and deliberately reverted with a flagged follow-up task rather than silently masked. - 32/32 automated tests pass, including 3 new regression tests for the deadlocks above and one for "a server's standing point is never a chair."
Historical note, kept for the record: the first pass at this backfill checked two plausible candidates, checkpoint-05-pawn-style-check.png and checkpoint-06-pawn-style-final.png, against actual pixels rather than filenames — checkpoint-05 turned out to be the pre-change "before" shot (same flat, pre-RimWorld icon style as checkpoint-04, Iteration 3's own screenshot) and checkpoint-06 a 100%-transparent blank capture (confirmed via the actual alpha channel, not by eye). Both were correctly ruled out at the time; the real match above was found in a later, finer-grained pass through the rest of progress/, not from either of those two.
