diff --git a/docs/research/2026-09-01-overhaul/478-480-readonly-diagnosis.md b/docs/research/2026-09-01-overhaul/478-480-readonly-diagnosis.md index dd0ad6610..856e875fb 100644 --- a/docs/research/2026-09-01-overhaul/478-480-readonly-diagnosis.md +++ b/docs/research/2026-09-01-overhaul/478-480-readonly-diagnosis.md @@ -132,3 +132,33 @@ Before the next unattended run, the existing self-gate runner was narrowly hardened to refuse either client and explicitly use WindowStyle Hidden. It already uses a real hidden Vulkan window through exact-framebuffer mode. No route/rendering behavior, graphics profile or quality was changed. + +### Selection-order follow-up while checkpoint observation is implemented + +Read-only, base6c3ffd79e (production1e376c244). Current +LightManager.MaxGlobalLights is **128**, not64. BuildPointLightSnapshot keeps +qualifying registration order until overflow; only overflow sorts the global +list. SelectForCell then takes the first eight dynamics unconditionally and +uses any remaining slots for statics. Thus a below-128 snapshot with many +dynamics can select distant earlier registrations before nearby later ones. +This is a reachable path, NOT yet an observed cause of Town Network darkness. + +Lead read named Render::insert_light0054D1B0 and add_dynamic_light0054D420, +then reran check_exe_pdb.py on the paired Turbine executable: MATCH, +GUID9e847e2f-777c-4bd9-886c-22256bb87f32/age1. PE-section mapping gives: + +| VA / raw offset / bytes | SHA256 | +| --- | --- | +| 0054D1B0 / 0014D1B0 / 551 | B429FD860D9E55D9EB39BF177F50DEFCEABA1407C033609867972767D36698EA | +| 0054D420 / 0014D420 / 47 | 23607C447F5BBC78190964132055D169C7F46763559DB2B31E40FBA20F118B91 | + +Native insert_light enters its distance-comparison loop whenever count>0, +before testing count against capacity at0054D26F. The x87 comparison/test +sequence includes D898D8000000/DFE0/F6C405/7B07; the insertion position is +therefore not deferred until overflow. add_dynamic_light loads the distinct +dynamic cap from0081EC98 and calls insert_light at0054D446 +(E865FDFFFF →0054D1B0). Retail's ranking input in this routine is the supplied +frame origin with player/cell offset, before combining LIGHTINFO.offset; +do not casually equate it with the final light position in a future port. +Neither a nearest-eight-only patch nor a pool redesign is authorized here. +Wait for the actual consumed-light checkpoint; AP-16/AP-35/AP-85 remain open.