From 8bd75ba312c6577bd1b60143d208408449dd08b1 Mon Sep 17 00:00:00 2001 From: Erik Date: Fri, 4 Sep 2026 14:04:27 +0200 Subject: [PATCH] docs(overhaul): bound final S4 c3a fix --- .../s4-depth-alpha-packet.md | 73 +++++++++++++++++++ 1 file changed, 73 insertions(+) diff --git a/docs/research/2026-09-01-overhaul/s4-depth-alpha-packet.md b/docs/research/2026-09-01-overhaul/s4-depth-alpha-packet.md index 8d77ea00..daf84a59 100644 --- a/docs/research/2026-09-01-overhaul/s4-depth-alpha-packet.md +++ b/docs/research/2026-09-01-overhaul/s4-depth-alpha-packet.md @@ -1629,3 +1629,76 @@ release guide's ordinary `Status!=KnownFailure` filter and honestly returned because it excluded TowerAscent, #458, and the six count rows. It was not retried or rewritten: the separate inclusive artifact above is the required documented-set gate. No graphical client was launched. + +## 20. S4-c3a fix round 2 — retain authored metadata without a surface (lead, 2026-09-04; LAST ROUND) + +The §19 retail re-review returned **FAIL** on candidate `eea5793d2`. The exact +authored-center formula, the paired-byte argument, all installed September +2013 content, and every original c3a invariant passed. One universal contract +edge did not: after `ReadParticleGfxInfo` successfully decodes a real GfxObj, +`ResolveParticleGfxInfo` replaces the complete result with +`ParticleGfxInfo.Default` whenever `SurfaceId == 0`. That discards the real +GfxObj's `SortCenter`, axes, bounds-derived visual center, and degrade mode. +Retail `CPhysicsPart::UpdateViewerDistance @ 0x0050E030` reads GfxObj +`sort_center` independently of surface/material presence. Packet §19.1 also +explicitly permits a zero authored center only for synthetic/default +billboards with no GfxObj. The existing production-path fixture supplied a +synthetic in-memory Surface and therefore did not exercise the bad branch. + +The lens scanned the installed domain: 2,051 emitter records reference 360 +distinct GfxObjs and every one has a nonzero first Surface DID. That lowers +current installed exposure to zero but does not make the implementation or +its universal claim correct. The same lens found one evidence-only wording +error: the in-memory `NoopDatReaderWriter` fixture is GfxObj-backed and drives +the real production path, but is not “real DAT-backed.” + +### 20.1 F1 — decoded GfxObj metadata survives `SurfaceId == 0` + +When a real GfxObj decodes successfully, preserve its complete +`ParticleGfxInfo` regardless of Surface presence. Acquire a texture slot only +when `SurfaceId != 0`; otherwise return the decoded record unchanged with its +unassigned slot. A missing/unreadable GfxObj or a descriptor with no GfxObj +may still use `ParticleGfxInfo.Default`. Do not synthesize a surface, change +procedural/untextured draw behavior, alter material/additive routing, or +special-case installed DIDs. + +Extend the existing production-path GfxObj-backed CYpt fixture with a +no-surface row (or a separate equally real-path row): nonzero authored +SortCenter; vertex AABB center different from it; non-unit size and nonidentity +orientation; no Surface entry/DID. It must prove the same authored distance +and object/particle merge order while retaining the existing untextured visual +fallback. Restoring `SurfaceId == 0 ? ParticleGfxInfo.Default : ...` must first +fail a named authored-distance or cross-source-order assertion. Correct the +fixture comment to “production-path GfxObj-backed synthetic DAT records”; do +not call it installed or real DAT-backed. + +### 20.2 Final-round production audit before return + +This is c3a's second and last fix round. Before commit, re-read every §19 F2 +path rather than relying only on the existing green tests: preparation must +hold no source payload; `Append` must reserve once; false and exception paths +must roll back the same tail exactly once; a rejected first-use source must +remain registered for reset; accepted tokens must remain stable; the first +3,000 candidates per list must be the only retained candidates; later row-2 +immediate duplicates must still draw; flush/end/abort and next-preparation +cleanup must converge; the retained capacity and byte diagnostics must remain +bounded; the real warmed merge must remain 0 B. If that source audit exposes +any defect, fix and pin it inside this same round and record it explicitly in +the result—there is no later repair round. + +### 20.3 Scope and return + +Production edits are limited to `ParticleRenderer.cs`. Test edits are limited +to `Walk/WalkFrameDriverTests.cs`; this packet and the S4-c3a plan-ledger row +record the result. No other file changes without lead approval. AP-241/242/243, +queue/router/pipeline/shader/manifest/package behavior, and all installed +content remain unchanged. + +Return one fix commit on top of `eea5793d2`: targeted no-surface positive and +mutation; the complete §19 95-test focused lane; AP boundary/count pin; both +real 0-B pins; shader/manifest lane; Release 0W/0E; `git diff --check`; honest +changed-file list and source-audit statement. The retail lens re-reviews the +no-surface branch and evidence wording first. Only PASS unlocks the sequential +production/gate-honesty lens over the complete c3a stack. Any further code, +test, register, or evidence correction would be a third fix round: stop the +chunk and write it up; do not land or graphically gate it.