fix(render): repair particle CYpt preparation

Retain the GfxObj-authored SortCenter independently from the rendered AABB center and use its scaled, oriented world point for billboard/mode-2-5 CYpt. Keep the visual center unchanged.

Reserve prepared source payload only at Append, roll back the exact tail once on false or exception, cap retained preparation at 3000 CLIP plus 3000 ALPHA, preserve immediate duplicates, account the bounded scratch, and correct the static-record ordering comment. The lead-authorized plan edit records candidate 44e2bc227b's retail FAIL and this section 19 result.

Gates: Release solution build 0 warnings/0 errors; focused particle/driver/queue/order/bounds 95/95; register boundary/count 1/1; real allocations 2/2 at 0 B; shader/manifest 32/32; one-shot hermetic 16751/16751; InstalledDat 385 pass/10 documented fail/1 skip; diff-check pass. No graphical client.

Mutations: rendered pos first failed distance expected 40 actual 116; AABB center expected 40 actual 116; dropped size expected 40 actual 65; dropped orientation expected 40 actual 160; eager reservation first failed Assert.Empty with one payload; omitted false rollback first failed Assert.Single with two payloads; omitted exception rollback first failed Assert.Empty with one payload; removed caps first failed prepared count expected 6000 actual 6002.

Evidence note: the first ordinary InstalledDat filter produced 385 pass/2 expected fail/1 skip but excluded the eight required KnownFailure rows; the separate inclusive no-retry artifact produced the exact documented 10-failure set. Initial test fixture compilation/analyzer setup failures are recorded in packet section 19.5.

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
Erik 2026-09-04 13:57:19 +02:00
parent 8e0c6fb145
commit 01674bcc78
7 changed files with 727 additions and 32 deletions

View file

@ -1546,3 +1546,86 @@ unchanged S4-c2 behavior first. Only a retail PASS unlocks the sequential
production/gate-honesty lens over the entire c3a stack, with special attention
to F2. A failed re-review gets the one remaining bounded fix round; a further
finding after that would require a third round and stops the chunk.
### 19.5 Fix-round-1 implementation result (Sonnet, 2026-09-04)
**IMPLEMENTED — RETAIL RE-REVIEW REQUIRED.** This fix commit retains the
GfxObj-authored `SortCenter` separately from the rendered AABB-derived
`CenterOffset`. Billboard/mode-25 CYpt now uses the authored point after the
particle's scale and orientation, while the captured draw center remains the
existing visual center. The prepared-cell seam now reserves source payload
only from `Append`, rolls back the exact tail once on either a false return or
an exception, retains at most the first 3,000 CLIP and 3,000 ALPHA candidates,
and accounts for the bounded scratch list in its retained-byte diagnostic.
The row-2 immediate duplicate remains independent of delayed retention. The
static-record comment now describes the later ordinary-cell combined CYpt
sort.
The lead separately authorized one plan-ledger edit so the S4-c3a row records
candidate `44e2bc227b`'s retail FAIL and this §19 fix result. That file is
ledger currency only; it does not widen production scope. AP-241/AP-242/AP-243,
the active physical count of 162, both retail queues and their capacities,
router decisions, FIFO order, CLIP-then-ALPHA drain, row-5 immediate state,
pipelines, shaders, manifest, Content model, serializer, package format,
building shells, EnvCells, and PView behavior remain unchanged.
Automated return:
- `dotnet build AcDream.slnx -c Release --no-restore --nologo` — PASS, 0
warnings / 0 errors.
- focused `ParticleRendererRouteTests|WalkFrameDriverTests|RetailAlphaQueueTests|RetailParticleGeometryClassifierTests`
lane — PASS, 95/95, 0 skipped.
- `WorldAlphaCyptDocumentationAndRegister_PinPerCellTruthAndThreeResiduals`
— PASS, 1/1; all three residual rows remain unique inside the AP section and
the physical count remains 162.
- real warmed `ProductionCellObjectParticleMerge_WarmedPathAllocatesZeroBytes|ProductionImmediateMesh_WarmedDrawImmediateParticleSubmissionRhiDoesNotAllocate`
lane — PASS, 2/2; both production-path pins observed 0 managed bytes.
- `VulkanShaderDescriptorContractTests|VulkanShaderManifestTests|RenderPackSpirvValidatorTests`
— PASS, 32/32, 0 skipped.
- official one-shot 14-assembly hermetic gate — PASS, 16,751 passed / 0
skipped / 0 failed. Evidence:
`%TEMP%/acdream-s4-c3a-fix1-20260904-2215`.
- InstalledDat with explicit `C:\Turbine\Asheron's Call` and the documented
ordinary set plus TowerAscent, #458 `Oh_doorway_still_first_frame_diff`, and
the six retained `AlphaFlushCounts_*` — 385 passed / 10 expected failed / 1
skipped. The failures are exactly TowerAscent, the two #383 layout sweeps,
#458, and the six count rows; no new failure appeared. Evidence:
`%TEMP%/acdream-s4-c3a-fix1-installed-inclusive-20260904-2222`.
- `git diff --check` — PASS (only the repository's LF-to-CRLF working-copy
notices).
Mutation ledger (each mutation was applied alone, its named test was run once,
and the production source was restored before the next mutation):
1. Use rendered `pos` for billboard CYpt: `CellTurn_GfxObjBillboardUsesScaledOrientedAuthoredSortCenterButKeepsVisualCenter`
first failed its distance assertion, expected `40`, actual `116`.
2. Use the AABB-derived `CenterOffset`: the same test first failed its distance
assertion, expected `40`, actual `116`.
3. Drop particle size from authored SortCenter: the same test first failed its
distance assertion, expected `40`, actual `65`.
4. Drop particle orientation from authored SortCenter: the same test first
failed its distance assertion, expected `40`, actual `160`.
5. Restore eager source-payload reservation during preparation:
`PreparedCellAlpha_ImmediateExceptionAfterDelayedCandidateDoesNotReservePayload`
first failed `Assert.Empty`; the collection contained one
`DeferredParticleDraw`.
6. Omit rollback after `TryAppend` returns false:
`PreparedCellAlpha_AcceptsStableTokenAndRollsBackRejectedTailOnAbort` first
failed `Assert.Single`; the collection contained two payloads.
7. Omit rollback after `TryAppend` throws:
`PreparedCellAlpha_AppendExceptionRollsBackExactTailToken` first failed
`Assert.Empty`; the collection contained one payload.
8. Remove the two per-list preparation caps:
`PreparedCellAlpha_CapsBothListsAndRejectStormRetainsNoPayloadOrUnboundedScratch`
first failed the prepared-count assertion, expected `6000`, actual `6002`.
Before the return matrix, fixture construction exposed and corrected two
test-only setup issues: missing `DatReaderWriter.Lib`/`Types` imports plus a
nonexistent vector comparer caused the first compile attempt to fail, and
xUnit2013 rejected two count-shaped assertions. Neither failure reached a
production positive assertion. The first InstalledDat invocation used the
release guide's ordinary `Status!=KnownFailure` filter and honestly returned
385 passed / 2 expected failed / 1 skipped; that was incomplete §18.6 evidence
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.