docs(overhaul): bound final S4 c3a fix

This commit is contained in:
Erik 2026-09-04 14:04:27 +02:00
parent 01674bcc78
commit 8bd75ba312

View file

@ -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 because it excluded TowerAscent, #458, and the six count rows. It was not
retried or rewritten: the separate inclusive artifact above is the required retried or rewritten: the separate inclusive artifact above is the required
documented-set gate. No graphical client was launched. 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.