Faces cut into loose piles collapse outward instead of draining column by column (t93)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-10-28 22:06:48 -04:00
co-authored by Claude Opus 5.5
parent 6ac5f463aa
commit 84dd8b8d0a
11 changed files with 271 additions and 9 deletions
+53
View File
@@ -5,6 +5,59 @@ note or request it was for, what changed, the files touched, the tests run, and
open or not verified. Keep each entry short; the git history has the details.
## 2026-10-28: t93 reopened, vacuum-cut faces drain in columns (Codex)
- Read AGENTS, the t93 task/log and 807217b; inspected both new owner screenshots.
The remaining reproduced cause is straight-down movement taking priority over outward
fall: an exposed edge stays a descending column, blocking the next column's diagonal
exits. This is a movement/scan-order bottleneck, not lost wakes in this reproduction.
`setCell` wakes the cut; worker wakes merge each checkerboard pass. A radius-6 vacuum,
one call per tick into a settled 60-grain RSTONE heap, leaves a 39-grain cliff; after
120 ticks it is still 18, with exactly the same series when all chunks are forced awake.
RSTONE already has STICK=1. Inline and actual Node helpers agree, bot near or far.
- Added outward downward movement only for a falling exposed vertical face backed by
supported powder. Retain one downward step per tick, occupancy, parts, barriers and
burning-grain guard. Resting heaps do not enter this path. `POWDER_FAN` goes to workers
and is disabled during the existing legacy worldgen settle to preserve all seed hashes.
Rejected a horizontal-step experiment (forced-awake creep) and a broad falling-edge
rule (spread free-falling blocks too far); no old test expectation was changed.
- New shared `test/pile-cut.js`: two 60-grain triangular heaps, 600 settling ticks,
stone and stone/copper ore/iron ore/dirt, then actual radius-6 vacuum strokes.
New Node suite passes 40 checks: cuts inline/2 helpers, near/far bot, conservation,
exact inline/helper material bytes, initially stable heaps and 600 forced-awake
stable ticks afterward. Browser suite uses isolated HTTP, real NVIDIA Blackwell GPU,
real frame loop and two helpers with confirmed dispatch (small fixture forces dispatch).
Verdict is recorded at exactly tick 180. Control with face spreading disabled:
cliff stone/mixed 33/32 at cut end, 14/13 at 120, 8/5 at 180; browser assertion fails.
Fixed browser reaches <=2 by 120 and passes at 180. Earlier Node red run fails eight
collapse checks (its mixed fixture included clay); existing clay collapse checks pass.
- Full `python3 test/run_all.py --browser`: ALL PASSED, 34 headless + 9 browser suites,
including collapse 17, threads 12, vacuum 40, gameplay 361 and browser vacuum 1.
Log: `/tmp/t93b-all-browser.log`. No existing test was weakened. Browser regression
is included in the suite runner. Original seed hashes and liquid-sinking checks pass.
- Saved and inspected `shots/t93b-before.png` (control at cut end) and
`shots/t93b-after.png` (fixed after 180 ticks): vertical cut faces become slopes.
Fixed series: `shots/t93b-time-{0,60,120,180}.png`; matching control series:
`shots/t93b-control-time-{0,60,120,180}.png`. Browser control log:
`/tmp/t93b-browser-matching-control.log`. Small initial browser passes stayed inline
despite a pool existing; final regression requires actual `simPool.activeMax > 0`.
- Requested idle profile, real GPU, no concurrent tests:
`python3 tools/perf.py --scenes settled,heat --looks pixel --zooms 6 --compare tools/perf-after-t88.json`.
Rule-disabled control -> final total ms/tick: settled 1.9855 -> 2.0226 (+1.9%),
heat 2.7027 -> 2.7734 (+2.6%). Against historical t88: +12.0%/+5.7%.
Movement ms/tick 0.9639 -> 0.9818 / 1.3481 -> 1.3885; unchanged heat work also
varies 0.9412 -> 0.9593 / 1.2724 -> 1.3019. End awake counts identical, 425/494.
These timings show small run-to-run differences, not exact equality; historical settled
time remains over the profiler's 10% comparison threshold. Evidence:
`/tmp/t93b-idle-control.json`, `/tmp/t93b-idle-final.json`, `/tmp/t93b-idle-summary.log`.
An earlier control profile overlapped headless checks and was excluded from this comparison.
- Files: `src/sim/cells.js`, `src/sim/workers.js`, `src/sim/worldgen.js`,
`test/pile-cut.js`, `test/t_vacuum_collapse.js`, `test/t_vacuum_collapse.py`,
`test/run_all.py`, `docs/DESIGN.md`, `docs/TESTING.md`, generated project map,
t93 task and this log. No commit. Owner playtesting of their larger worlds remains open.
## 2026-10-28: t92 keep pass-through, restore original loose-grain behaviour (Codex)
- Read the 7293787 then dadf62a t92 history and original drill in 90f2d3f. Restored the