memory_final's gate crashed in all 13 scenarios at the first frame of play, R3D_ARENA_CHECK=1 reading 0xDD in ludic.ui's nd_take: a node the pool keeps had come from the frame's scratch. Two holes: - a call to a generic (ui_kept(list, n)) names the generic, and the analysis knows only its instances (ui_kept$UiNode), so the callee looked unknown - and an unknown callee was taken to keep nothing. A generic's call now reaches every instance, and an unknown callee keeps everything it is handed, but for a short list of intrinsics known to keep nothing; view() shares its list's storage. - a push's growth into a parameter's list was LOCAL whenever the list was not seen kept, though a parameter may be a state's list. A site is LOCAL now only when its class is neither ESC nor HEAP. examples/lang/arena_pool.ludic is the shape (a pool keeping records across frames through a generic push): built with --arena it prints '7 3498' poisoned on every reset and with the arena off, in ludic-dev test. On the valley every ludic.ui pool site is kept; 5480 sites local, 6431 kept. Also, from ECS: a record's field defaults are stored into it when it is made, a global's initializer is kept, and a component's own functions are frame roots (they run while its page is open). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
8 MiB
8 MiB
| The file is too large to be shown. |