225 KiB
Campaign OVERHAUL v2 — S5 consumers, material, and closeout packet
Status: OWNER VISUAL GATE FAIL #473: exterior building sections disappear.
S5-c1 through S5-c5 plus #470/#469 landed, but prior provisional graphical
coverage did not establish complete exterior shells. Section 42 contracts the
narrow detail-active opaque coverage repair. C1c's returned test/doc correction
is frozen uncommitted pending review; geometry/membership witness, full-lane
closure, connected/performance C2 and owner G4 remain.
Branch: claude/campaign-w-retail-frame-walk.
Gate: G4 remains unpassed. Nothing merges to main before G4.
This packet decomposes plan S5 into bounded chunks. The lead writes each contract, one bounded OpenAI implementation agent changes only that contract, the lead verifies every retail claim against the named pseudo-C and the paired executable/PDB, and independent sequential OpenAI review lenses run before landing. Per the owner's 2026-09-04 overrides, no remaining campaign step uses Claude Code, Anthropic models, or Anthropic credentials, and a chunk may receive at most ten review passes. Each code finding still receives a bounded contract; documentation-only findings may be corrected directly by the lead. The chunk stops before an eleventh review. Every surviving deviation is entered or corrected in the divergence register in the same implementation commit.
1. Current boundary after S4
S4-c3b is landed and the lead G3 matrix is a provisional PASS; owner inspection and the owner-only G3 rows remain. S5 must not reopen the green walk, portal depth, or two-FIFO alpha ports without new evidence.
The landscape half is already present and exact:
WalkLandscape.CheckBlocks/LandCellCheckportLScape::draw_check_blocks @0x00505F80andLScape::landcell_check @0x005050A0;WalkVisibilityMathowns the portedget_clip_height/block_checkmath;WalkFrameDriver.VisitedLandscapeCellIdsis populated by the same one walk that emits the retail-ordered terrain/object stream.
S5-c1 therefore changes the consumers and deletes the competing fallback. It does not rewrite the landscape calculation.
2. Retail facts for S5-c1 (lead-verified 2026-09-04)
The executable is C:\Users\erikn\Downloads\acclient.exe. Its CodeView record
is GUID {9E847E2F-777C-4BD9-886C-22256BB87F32}, age 1, matching
refs/acclient.pdb.
2.1 ShouldDrawParticles is distance AND the cell virtual
Named pseudo-C at CPhysicsObj::ShouldDrawParticles @0x0050FE60 reads:
if examination: true
if CYpt > degrade_distance: false
if cell == null: false
if cell->IsInView() == 0: false
true
The paired bytes are the same: fld [ecx+0x24], fcomp [esp+4], the x87
test ah,0x41 gate, null-check of [ecx+0x90], then the virtual call through
vtable slot +0x68. ParticleEmitter::UpdateParticles @0x0051D180 calls that
function at 0x0051D1A1; false enters the SetNoDraw(1) / degraded_out=1
arm, while true clears that state and updates/emits particles.
Preserve the existing x87-compatible comparison, including inclusive equality,
unordered admission, raw negative/zero/NaN/infinity authored distances, and the
deliberate AP-116 range multiplier (Retail=1, default Extended=2).
2.2 outdoor and indoor cells have different IsInView semantics
CLandCell::IsInView @0x00532CB0returns the 32-bit field at+0x104. The paired body is exactlymov eax,[ecx+0x104]; ret. Landscape drawing stamps that field, so particle update consumes the previous completed render frame's landscape answer.CEnvCell::IsInViewis the PDB-vtable slot at0x007C8D00, pointing to the ICF-folded body0x005269F0. The paired body is exactlymov eax,1; ret. Thus an indoor cell with a non-null owner is alwaysPARTIALLY_INSIDEfor the update-time check; its particle drawing remains separately controlled by the cell walk.
AC cell identity already has a production-pinned discriminator:
low = cellId & 0xFFFF; outdoor land cells have 0 < low < 0x0100, EnvCells
have low >= 0x0100, and zero is no cell.
2.3 point lights do not consume the camera walk
Retail collects point lights from the DBObj-load/flush-bounded resident
CEnvCell::visible_cell_table, not from the current camera portal flood.
Current LightManager.BuildPointLightSnapshot(playerWorldPos) likewise uses
the resident registry. RuntimeWorldFrameEnvironmentPreparation's
ObserveDrawableCells / ClearDrawableCells methods are now no-ops, while
AP-85 still describes the deleted last-frame filter. The methods and the stale
claim are tombstones, not behavior.
2.4 the null-root terrain reconstruction is not a retail answer
In-world retail has a viewer-cell root. acdream's null-root path is the AD-21
streaming-gap/debug safety draw. TerrainModernRenderer.CollectVisibleCells
manufactures 64 land-cell ids per retained landblock from camera-frustum AABBs
and publishes them through TerrainVisibleCellIds. That is the only remaining
AP-117 reconstruction. A safety draw with no walk product must publish no
outdoor IsInView answer; it must not invent one.
3. S5-c1 contract — typed IsInView consumers and fallback deletion
3.1 C1 — publish the landscape half explicitly
Extend the borrowed RetailPViewFrameResult with the exact landscape land-cell
set from WalkFrameDriver.VisitedLandscapeCellIds. Keep DrawableCells for
EnvCell shell preparation and keep the existing union VisibleCells only for
diagnostics that compare the two products. Do not re-filter, re-walk, sort, or
derive the landscape set from projection/entity ids.
Rename the particle handoff to make the type visible in the API, for example
MarkVisibleLandscapeCells. It accepts only outdoor land-cell ids and copies
them into the controller's building frame. Passing zero or an EnvCell id is a
contract violation, not something to silently reinterpret.
The completed frame remains the sole retained owner. AbortFrame preserves
the prior completed product, CompleteFrame publishes the new product, and
Reset removes both generations. The update thread continues to call Apply
before the next render, preserving retail's previous-frame timing.
3.2 C2 — evaluate the correct virtual by cell family
Change ParticleSystem.ApplyRetailView so a world-policy emitter is eligible
only when all of the following are true:
hasCompletedView
ownerCellId != 0
(owner is EnvCell OR exact completed landscape set contains ownerCellId)
retail x87-compatible distance predicate
EnvCell means low >= 0x0100; landscape means 0 < low < 0x0100.
Examination and dedicated-pass policies keep their existing bypass. This is an
update/degrade correction only: do not alter emitter-own-cell draw membership,
per-cell particle turns, cone admission, queue routing, alpha order, lifetime,
or tick order.
A completed null-root safety frame has an empty landscape set. EnvCell owners
still see their constant virtual result; outdoor owners fail closed. Login and
portal-space frames still carry hasCompletedView=false and reject ordinary
world-policy emitters.
3.3 C3 — delete AP-117's remaining reconstruction
Delete the complete TerrainModernRenderer.CollectVisibleCells route,
including _visibleCellIds, VisibleCellIds, BeginVisibilityFrame,
IWorldScenePassExecutor.TerrainVisibleCellIds, the null-root publication in
WorldSceneRenderer, and the reconstruction-only tests. The flat terrain draw
itself remains; only its fabricated visibility side channel goes.
After this deletion, AP-117 is retired: the walk path publishes the ported landscape product, and frames without that product publish none. Update AD-21 in the same commit so it no longer claims the login screen shows live sky and states that the safety draw cannot publish cell visibility.
3.4 C4 — delete the dead point-light feedback seam
Delete ObserveDrawableCells and ClearDrawableCells from
IWorldRenderFrameBuilder, IWorldFrameEnvironmentPreparation, their runtime
implementations, all calls, fakes, and tests. Keep point-light snapshot
selection exactly resident-registry based. Correct AP-85 in the same commit to
the code that actually remains: one resident, player-nearest 128-cap pool
instead of retail's separate 7-dynamic/40-static pools and DBObj-granular
residency. AP-68's owner-approved always-lit-interior policy is unchanged.
3.5 Explicit non-changes
S5-c1 must not change:
WalkLandscape,WalkVisibilityMath, block/cell order, landscape event order, terrain draws, membership, portal flood, depth, alpha, shaders, RHI, DAT/package code, or streaming ownership;- point-light capacity, sort anchor, curves, cell/object selection, or AP-68;
- directional-shadow selection (S5-c2 owns that consumer and its retained topology/per-frame visibility design);
- building degrade/complete-body selection (later S5 chunk);
- translucent-detail material combine/AP-232 (later S5 chunk);
- Facility probe and broader cleanup inventory (later S5 cleanup chunk).
No graphical client is launched from the implementation or review worktree.
4. Allowed files
Production changes are limited to the directly affected files:
src/AcDream.Core/Vfx/ParticleSystem.cs;src/AcDream.App/Rendering/Vfx/ParticleVisibilityController.cs;src/AcDream.App/Rendering/RetailPViewRenderer.cs;src/AcDream.App/Rendering/WorldSceneRenderer.cs;src/AcDream.App/Rendering/WorldScenePassExecutor.cs;src/AcDream.App/Rendering/WorldRenderFrameBuilder.cs;src/AcDream.App/Rendering/TerrainModernRenderer.cs;- comment-only truth correction in
WalkFrameDriver.csif required.
Tests may change in the directly affected Core/App VFX, renderer, frame-builder,
and terrain-visibility files, plus compile-fallout fakes for the deleted
interfaces. Documentation is limited to this packet, the plan ledger,
acdream-architecture.md, oh1-construction-landscape-contract.md, and the
divergence register. If implementation requires another production owner or a
new deviation, stop and return the fact before expanding scope.
5. Tests and mutation evidence
Extend production-facing tests to prove:
- an outdoor emitter is admitted only by the exact completed landscape set;
- an EnvCell emitter remains update-eligible at authored range even when no indoor cell is in that set;
- zero cell and no completed world view reject both cell families;
- inclusive/unordered/raw-distance behavior and AP-116 Retail/Extended multipliers remain unchanged;
WorldSceneRendererhands onlyRetailPViewFrameResult's landscape set to the particle owner, never the EnvCell set or diagnostic union;- abort/complete/reset preserve the previous-frame transaction;
- no production
CollectVisibleCells,TerrainVisibleCellIds,ObserveDrawableCells, orClearDrawableCellssymbol remains; - point-light snapshots still include resident lights regardless of the removed feedback set;
- the warmed production particle-view path allocates 0 managed bytes.
Every new pin gets a real sabotage and exact first failure in the implementer commit body. At minimum mutate independently and restore exactly:
- make EnvCell eligibility depend on set membership;
- make outdoor eligibility constant true;
- feed the union instead of the landscape set at the renderer call site;
- restore one
CollectVisibleCellsproduction symbol; - restore one
ObserveDrawableCellsproduction symbol; - invert or exclude the inclusive authored-distance boundary.
6. Automated return and reviews
Implementer return:
git diff --check;- Release solution build, 0 warnings / 0 errors;
- focused Core VFX and App particle/frame/renderer/terrain tests;
- the real warmed 0-B particle-view pin;
- official hermetic lane;
- InstalledDat lane with exactly the documented global failure/skip set and no new failure;
- one clean commit, exact files/counts, and all mutation first failures.
Sequential review 1 — retail fidelity: re-check the named pseudo-C and paired bytes above, the CEnvCell vtable/ICF identity, previous-frame timing, cell-id discriminator, and every preserved x87/AP-116 edge. Review 2 — architecture, production, and gate honesty: prove one retained product, typed call-site reachability, no reconstructed/null-root answer, no point-light behavior change, reset/abort/lifecycle correctness, 0-B steady state, allowed scope, all register prose, all gate counts, and at least three mutation claims. A failed lens receives one bounded fix contract; a third fix round stops the chunk.
7. Remaining S5 decomposition after c1
- S5-c2: exact landscape visibility consumption by directional-shadow caster selection without creating a second set or rebuilding retained topology on every camera-only change.
- S5-c3: retail
DrawBuildingdegrade selection and complete-body null gate. - S5-c4: translucent detail single-stage framebuffer equivalence; retire AP-232.
- S5-c5: delete Facility probes, production
PortalVisibilityBuilderresidue, obsolete fallbacks/flags/tests/claims; add architecture guards. - S5 closeout: full automated/lifecycle/performance program, G4 owner matrix,
documentation closeout, then and only then merge to
main.
8. Pre-review gate correction — retired-row count
The first official hermetic lane is retained as a failed artifact: 16,759 of
16,760 tests passed. The only failure is
WalkStaticStreamPopulatorTests.WorldAlphaCyptDocumentationAndRegister_PinPerCellTruthAndThreeResiduals:
its literal expected 162 active AP rows, while this chunk correctly retires
AP-117 and leaves 161. This is a coupled documentation-test correction, not a
renderer finding and not a review fix round.
The bounded correction may change only
tests/AcDream.App.Tests/Rendering/Walk/WalkStaticStreamPopulatorTests.cs,
replacing the stale active-row count with 161. Do not add a fabricated register
row and do not change the three AP-241/AP-242/AP-243 assertions. Run the exact
failed test first, then a fresh official hermetic lane under a new artifact
name and the required InstalledDat lane. Preserve the original failed artifact
and record both identities in the implementer return.
9. S5-c1 implementation result — 2026-09-04
The bounded implementation publishes WalkFrameDriver.VisitedLandscapeCellIds
as the typed landscape product, retains it transactionally in the particle
visibility owner, and applies the retail cell-family virtual: membership for
land cells, constant true for non-null EnvCells. The null-root terrain
reconstruction and the dead point-light drawable-cell feedback chain are
deleted. AP-117 is retired; AP-85 and AD-21 now describe the surviving code.
The real warmed allocation pin initially exposed that enumerating the retained
SortedSet<int> of world-simulation handles allocated on every Apply. The
owner is now a sorted List<int> maintained at lifecycle mutation time, so the
production Apply loop preserves stable handle order and measures 0 B without
changing queue, router, draw, or particle tick behavior. This is an
implementation-mechanism correction, not a retail behavior deviation.
Focused returns before the official lanes: Core VFX 111/111, App particle /
frame / renderer / terrain 146/146, and the real warmed production allocation
pin 1/1 at 0 B. Release built with 0 warnings / 0 errors. The first official
hermetic artifact, artifacts/s5-c1-hermetic-20260904, is deliberately
preserved at 16,759/16,760: its sole failure was the stale 162-row test literal
after AP-117's retirement. Section 8 authorized only that coupled test
correction; the exact failed pin then passed 1/1 with the truthful 161-row
header and physical count. The one-shot corrected official lane at
artifacts/s5-c1-hermetic-corrected-20260904 then passed 16,760/16,760,
0 skipped, across 14 assemblies. The inclusive InstalledDat lane at
artifacts/s5-c1-installed-20260904 produced the documented global set:
385 passed, 10 failed, 1 skipped. The failures are TowerAscent, the two
#383 layout sweeps, #458 Oh_doorway_still_first_frame_diff, and the six
AlphaFlushCounts_* transcript Facts; the skip is
Sweep_the_lookin_gate_decodes_against_the_street_fixture. No new failure or
skip identity appeared.
Independent mutation ledger (each mutation restored exactly before the next):
- EnvCell eligibility made set-dependent:
ApplyRetailView_UsesLandscapeMembershipButEnvCellConstantVirtualfirst failedAssert.True, expected true / actual false, atParticleSystemTests.cs:553. - Outdoor eligibility made constant true: the same test first failed
Assert.False, expected false / actual true, atParticleSystemTests.cs:559. - Renderer fed the diagnostic union:
PViewWorld_PublishesOnlyLandscapeCellsToParticleVisibilityfirst failed the HashSet equality atWorldSceneRendererTests.cs:279, expected[16842755], actual[16843008, 16842755]. - A production
CollectVisibleCellssymbol was restored:Production_source_has_no_reconstructed_particle_visibility_feedbackfirst failed atTerrainParticleCellVisibilityTests.cs:37, namingTerrainModernRenderer.cs. - A production
ObserveDrawableCellssymbol was restored: the same source guard first failed at line 37, namingWorldRenderFrameBuilder.cs. - The inclusive boundary was changed from
<=to<:ApplyRetailView_UsesOwnerVisibilityAndInclusiveAuthoredDistancefirst failedAssert.True, expected true / actual false, atParticleSystemTests.cs:519.
10. Sequential review 1 — retail lens and fix round 1
The retail lens found no behavioral retail-fidelity defect. It independently
matched the paired executable/PDB identity and bytes for
ShouldDrawParticles, UpdateParticles, both cell-family virtuals, the
previous-completed-frame transaction, the low-word discriminator, examination
bypass, x87 distance edges, AP-116, the exact landscape handoff, and unchanged
particle draw/queue/tick behavior. The lens returned FAIL on comment truth only:
ParticleVisibilityController.UseWorldViewstill says an outdoor fallback can publish the authoritative product, although S5-c1 deleted it.WalkFrameDriver.CopyVisibleCellsTostill calls the diagnostics union the completeCObjCell::IsInViewanswer and says particles, lights, and shadows consume it. Particles now consume only the landscape half, EnvCell particle eligibility is constant true, point lights use the resident registry, and directional shadows remain S5-c2.ParticleSystemcalls the sorted-list lifecycle insertion/removal cost binary even though only the insertion search is binary and list shifts / removal are linear. Its adjacent blanketO(log E)lifecycle sentence must remain scoped to theSortedSetindexes rather than the new list.
Fix round 1 is comment-only. It may change exactly
ParticleVisibilityController.cs, WalkFrameDriver.cs, and
ParticleSystem.cs, plus this packet's result section. Do not change behavior,
tests, register rows, architecture prose, or any other file. Correct the three
descriptions to the surviving ownership/cost model, run git diff --check and
the same focused retail-review classes (47 Core particle tests, 38 App
visibility/terrain/frame/renderer tests, and 3 AP-116 settings/live-object
tests), commit once, then return to a narrow retail comment-truth re-review.
The production/gate-honesty lens remains undispatched until that re-review
passes. A third fix round still stops the chunk.
10.1 Fix-round-1 implementation result
The three stale descriptions are corrected without behavior or assertion
changes. CopyVisibleCellsTo describes a diagnostic union and names the
distinct particle, point-light, and future directional-shadow consumers.
ParticleSystem scopes the logarithmic lifecycle statement to its SortedSet
indexes and records the sorted list's binary-search plus linear-shift insertion
and linear search/compaction removal costs. Focused gate results: Core
ParticleSystemTests 47/47, App visibility/terrain/frame/renderer 38/38, and
AP-116 settings/live-object 3/3; git diff --check is clean. The first narrow
re-review found the UseWorldView result sentence still misstated null-root
transaction state; fix round 2 below supersedes that sentence.
11. Retail narrow re-review — fix round 2 (last allowed)
The narrow retail re-review passed the four-file scope, behavior/test/register
invariance, diagnostic-union wording, sorted-list cost wording, diff check, and
the focused 47 + 41 tests. It found one remaining MINOR comment-truth error:
ParticleVisibilityController.UseWorldView and §10.1 say the null-root safety
draw omits/excludes the completed product. Production begins visibility before
root resolution and calls UseWorldView for every non-login built frame, so a
null-root safety frame completes hasCompletedView=true with an empty landscape
set. Login/portal frames carry hasCompletedView=false. This distinction is
already the bound §3 behavior: null-root invents no fallback cells.
Fix round 2 is the last allowed round and is prose-only. It may change exactly
the UseWorldView XML comment in ParticleVisibilityController.cs and this
packet's result prose. State that non-login world frames participate in the
completed transaction; the retail walk publishes its exact landscape set when
present, while null-root completes an empty set without reconstruction. Do not
change code behavior, tests, register/architecture prose, or any other file.
Run git diff --check, Core particle 47/47, and the combined App/AP-116 41/41;
commit once and return to the same narrow retail lens. Any further finding that
would require a third fix round stops S5-c1 and is written up.
11.1 Fix-round-2 implementation result
UseWorldView now states the production transaction exactly: every non-login
world frame participates; a PView walk contributes its exact landscape set,
while a null-root safety frame completes hasCompletedView=true with an empty
set and no reconstructed fallback. Login and portal-space frames retain
hasCompletedView=false. No behavior or assertion changed. Core particle tests
passed 47/47, the combined App visibility/terrain/frame/renderer plus AP-116
lane passed 41/41, and git diff --check is clean.
12. Owner-authorized documentation/evidence exception — 2026-09-04
The final production/gate-honesty lens found no production-code or test defect but returned FAIL after fix round 2 on two correction-worthy truth gaps:
- architecture and AD-21 say null-root publishes no cell-visibility answer,
while production completes
hasCompletedView=truewith an empty landscape set; and - the official lane summaries identify dirty bases, but the packet does not
independently bind those dirty source deltas to implementation commit
9aadc917a.
Per the campaign rule, S5-c1 stopped and the campaign branch recorded that stop
at efb075619. The owner then explicitly authorized a
documentation/evidence-only exception: "correct docs and continue." The
stop and both failed-lens results remain in history.
The exception is bounded to:
- truth-correcting the null-root sentence in
docs/architecture/acdream-architecture.md; - truth-correcting AD-21 in
docs/architecture/retail-divergence-register.md; - recording this exception and its evidence in this packet; and
- updating only the S5-c1/S5 ledger rows in
docs/plans/2026-09-01-campaign-overhaul-world-solidity.md.
No production code, tests, other register row, architecture section, or prior artifact may change. The correction must state that every non-login world frame participates, a walk contributes its exact landscape set, and null-root completes an empty set without reconstruction; login/portal remain false.
After the documentation correction is committed, create fresh official evidence from that clean exact commit (not a dirty pre-commit tree):
artifacts/s5-c1-exception-hermetic-20260904— hermetic lane;artifacts/s5-c1-exception-installed-20260904— InstalledDat lane.
Both summaries must record the correction commit and WorktreeDirty=false;
their manifests must verify completely. The older dirty-base artifacts remain
preserved as historical evidence but are superseded for landing provenance.
One narrow independent production/gate-honesty re-review verifies only the
authorized documentation diff, exact clean artifact identity/counts/hashes,
and absence of code/test changes. PASS permits landing and the graphical gate;
any behavioral change or further correction-worthy finding stops again.
12.1 Exception implementation result — clean evidence complete
The authorized documentation correction aligns the architecture and AD-21
with production's existing transaction without changing code or tests: every
non-login normal-world frame participates, the walk contributes its exact
landscape set when present, and null-root completes
hasCompletedView=true with an empty set and no reconstruction; login and
portal-space retain hasCompletedView=false.
The pre-exception official artifacts remain preserved as historical evidence,
including their dirty-base identities. They do not become clean commit-bound
evidence by prose assertion. Both replacement lanes ran from exact correction
commit d6592d3ac56bc400bfdaab7cff59306319b5b96d with
WorktreeDirty=false and now supersede the older dirty artifacts for landing
provenance:
artifacts/s5-c1-exception-hermetic-20260904— PASS, 16,760 passed, 0 failed, 0 skipped across 14 assemblies. Its 32-entry SHA-256 manifest verifies with zero missing or mismatched files.artifacts/s5-c1-exception-installed-20260904— 385 passed, the same 10 documented failures, and the same 1 documented skip across 14 assemblies. Its 30-entry SHA-256 manifest verifies with zero missing or mismatched files.Compare-Objectover every non-passing TRX identity against the historical inclusive artifact returned zero differences.
The first clean InstalledDat invocation omitted
ACDREAM_RUN_INSTALLED_DAT_TESTS=1; 97 live-DAT tests therefore self-skipped
with their explicit opt-in message. That invalid evidence is preserved at
artifacts/s5-c1-exception-installed-invalid-missing-env-20260904
(291 passed / 8 failed / 97 skipped) and is not used for acceptance. The
canonical invocation pinned both ACDREAM_RUN_INSTALLED_DAT_TESTS=1 and
ACDREAM_DAT_DIR=C:\\Turbine\\Asheron's Call; it produced the exact documented
identity above without a product change or product retry.
Production and tests remain byte-identical to the authorized contract parent. The plan ledger therefore advances to clean evidence complete, with only the narrow independent production/gate-honesty review pending before landing and the graphical gate.
13. S5-c1 landing and lead graphical gate — 2026-09-04
S5-c1 is LANDED. The mandatory stop remains in campaign history at
efb075619; the owner-authorized continuation was not used to rewrite it.
Reviewed scratch commits 9aadc917a → afaebcad6 → 74a2e4c48 →
ed8200664 → a28384d80 → b7a7eb9e2 → d6592d3ac → b2d56f9e3
map to campaign commits 94a6b5ef3 → 282fe87fb → 4d1110812 →
3f17c9131 → 6bbb9e117 → 36569c0b0 → ad115141a → 1718832e2.
The integrated tree is byte-identical to reviewed scratch tip b2d56f9e3.
The one narrow independent exception re-review returned PASS with no
finding. It verified the exact four-document authorized scope, the corrected
architecture/AD-21 transaction, no src/ or tests/ diff, both clean summary
identities and counts, hermetic 32/32 plus InstalledDat 30/30 manifest
verification, zero non-passing-identity difference from the historical
inclusive InstalledDat artifact, and honest exclusion of the missing-opt-in
attempt.
Fresh campaign verification at 1718832e2: Release solution build PASS with
0 warnings / 0 errors; Core VFX 111/111; focused particle-visibility/frame
38/38; warmed production particle-view allocation plus AP-116 settings/live
object 4/4. The worktree was clean before launch.
The lead graphical gate is PROVISIONAL PASS pending owner inspection.
Before launch, ACE was listening on UDP 9000 as PID 13340 and neither acdream
nor retail client was running. One Release client ran
tools/overhaul-selfgate/route-portal-haze.txt from clean 1718832e2, exited
0, confirmed graceful logout, and left no client process. Evidence root:
logs/selfgate-20260904-171137-s5c1-particle-visibility.
All ten PNGs were captured:
artifacts/screenshots/h00-before.png;- Facility sequence:
h01-arrive-0ms.png,h02-arrive-400ms.png,h03-arrive-1000ms.png,h04-arrive-2000ms.png,h05-arrive-4000ms.png; - Holtburg sequence:
h11-arrive-0ms.png,h12-arrive-400ms.png,h13-arrive-1000ms.png,h14-arrive-2000ms.png.
Lead inspection: both arrival sequences show the authored magenta
materialization particles at 400 ms, the particle effect clears normally by
the later frames, and Facility/Holtburg geometry and actors remain intact with
no obvious visibility regression. This is not owner acceptance. G4 remains
unpassed, nothing may merge to main, and S5-c2 is next.
14. S5-c2 contract — exact landscape visibility for the opt-in shadow pack
14.1 Retail and deviation boundary (lead-verified 2026-09-04)
This chunk ports one retail input, not a retail shadow-map algorithm. Retail has no cascaded real-time directional shadow map; acdream's selected atmospheric pack is the explicit IA-24 deviation. Pack-off remains the retail path and must not build, select, upload, or draw directional-shadow work.
The retail input is the completed landscape in_view product:
- named
LScape::draw_check_blocks @0x00505F80writes a non-OUTSIDEblock result and callsLScape::landcell_check @0x005050A0; the latter stamps eachCLandCell::in_viewfrom the same portal-view interval walk; - named
CLandCell::IsInView @0x00532CB0returns that field at+0x104; - the paired Sept-2013 executable is SHA-256
006FFEADC5D679C871497112A5BD1F87714D0E273E2166BAE5052DDE369297B1. Its CodeView GUID{9E847E2F-777C-4BD9-886C-22256BB87F32}, age 1, matches the PDB, and its relevant bytes are8B 81 04 01 00 00 C3at0x00532CB0;landcell_checkbegins55 8B EC 83 EC 1C 53 56at0x005050A0. The ICF body used by theCEnvCell::IsInViewvtable remainsB8 01 00 00 00 C3at0x005269F0.
Because the directional-shadow prepass runs after enhanced-world preparation but before the current frame's PView walk, it consumes the previous successfully completed landscape product, exactly as S5-c1's retained owner already exposes to update-time consumers. An aborted frame preserves that product; completion replaces it; reset removes it. A first/login/portal-space frame has no completed world view. A completed null-root safety frame has an empty set and may not manufacture a resident/frustum fallback.
IA-24 must be amended in the implementation commit to state this selection adaptation plainly: the opt-in non-retail shadow map borrows retail's prior completed landscape visibility and exact S2 object membership. That amendment does not make the shadow map retail behavior and does not authorize a new fallback or a pack-off change.
14.2 C1 — borrow the one completed visibility product
Publish a typed one-frame RetailLandscapeVisibilityFrame (name may vary only
to fit existing conventions) from the existing completed visibility owner. It
contains:
- the exact completed
HashSet<uint>/IReadOnlySet<uint>by reference, with no copy, union, sort, reconstruction, or second retained set; and - the completed-world-view flag needed to distinguish an authoritative empty answer from no answer.
WorldRenderFrameBuilder captures that borrowed fact before the current frame
can complete and attaches it to WorldRenderFrame as a pack-only input. The
reference remains valid through the shadow prepass and is not retained after
the prepared world is consumed/cancelled. Do not rename the product into a
current-camera claim: on camera-only movement it is deliberately one completed
frame behind.
The membership side of the selector borrows S2's existing
ShadowObjectRegistry.TryGetRetailCellArray; do not copy the registry rows
into the frame and do not add a render-owned cell dictionary. A narrow typed
read seam over that owner is allowed so tests need not construct PhysicsEngine.
14.3 C2 — exact terrain and object selection
Build one reusable, allocation-free per-frame selection over the retained shadow topology:
- If
HasCompletedWorldViewis false, select zero terrain commands and zero world casters. An authoritative empty landscape set also selects zero. - A loaded terrain slot is selected iff at least one of its authored 8x8
outdoor land-cell ids occurs in the exact completed set. Scan the borrowed
set/slot facts directly; no visible-landblock
HashSetis permitted. - A non-building caster is selected iff its non-empty retail CELLARRAY from
TryGetRetailCellArray(LocalEntityId)contains at least one outdoor land cell in the exact completed set. A missing/empty registry product fails closed.ParentCellId,EffectCellId, render bounds, origin cell, resident landblock, and camera frustum are not substitutes. - Building shells are intentionally absent from
ShadowObjectRegistryin retail's building channel. Select a shell by its exact outdoor placement cell,RenderSourceMetadata.EffectCellId; do not test its EnvCellBuildingShellAnchorCellId. Zero/non-land placement fails closed. - Multi-cell objects select once, stable retained caster order is preserved, and a visibility-only change does not touch membership, render-scene registration, caster classification, material classification, mesh lookup, or transform-journal ownership.
Reusable bool/generation-mark arrays keyed by existing caster/terrain slots
are selection scratch, not a second visibility answer, and are allowed.
Another HashSet<uint>, dictionary keyed by cell, LINQ materialization, or
per-frame collection allocation is not.
14.4 C3 — project visibility without rebuilding retained topology
DirectionalShadowCasterFrame.BuildSequence and the prepared
material/mesh-topology DirectionalShadowPreparedDraws.BuildSequence remain
keyed only by their existing scene/mesh/fade topology inputs. A camera-only
visibility change must leave both sequences unchanged and report zero topology
classification/mesh-resolution work.
Project the selection into reusable active draw products instead. For world
draws, arbitrary selected/unselected instances inside one prepared material
group must be represented exactly. A permitted implementation keeps the
retained transform array and emits allocation-free contiguous selected runs
with adjusted BaseInstance/InstanceCount, duplicating the already-classified
batch metadata for split runs. Equivalent retained-index/mask machinery is
acceptable only if GPU tests prove unselected instances cannot reach the
depth map. Merely changing one group's prefix count while leaving interleaved
unselected instances addressable is incorrect.
The active command/batch/run product gets its own per-frame selection sequence
for GPU publication. Rebuilding or re-uploading that bounded indirect product
is not a topology rebuild; re-running TryBegin classification, mesh lookup,
or changing the topology build sequence is. Preserve the one N.5 transform
address space and all existing dynamic-transform journal/replay semantics.
Terrain may rebuild its bounded indirect command list from selected retained
slots each frame, but must not rebuild/upload terrain geometry or slot
topology.
Diagnostics must distinguish resident/prepared topology counts from active selected caster/instance/command counts. Existing celestial direction, cascade fit/quality, day/night/indoor/portal gates, cutout/translucency/fade, foliage wind, transform churn, and two-frame topology-deferral policy remain unchanged.
14.5 Allowed files and explicit non-changes
Production changes are limited to the directly affected owners:
Rendering/Vfx/ParticleVisibilityController.cs;Rendering/WorldRenderFrameBuilder.csand composition compile fallout;Rendering/Scene/DirectionalShadowCasterFrame.cs(selection only; existing topology admission and revision semantics stay fixed);Rendering/Wb/WbDrawDispatcher.DirectionalShadows.cs;Rendering/TerrainModernRenderer.DirectionalShadows.cs;Rendering/DirectionalSunShadowRenderer.cs;- the built-in and declared directional-shadow pack graphs.
Tests may change only in the corresponding frame-builder, visibility,
directional-shadow caster/prepared/GPU/terrain/pack test files and compile-
fallout fakes. Documentation is limited to this packet, the S5 ledger row,
the architecture statement if its shared visibility-owner wording requires a
truth correction, and IA-24. If exact selection requires a production owner
outside this list, a shader/pipeline-layout change, a new divergence, or any
change to ShadowObjectRegistry, stop and return the fact before expanding.
Do not change WalkLandscape, PView ordering/products, terrain/world ordinary
draws, S2 membership mutation, render-scene indices, streaming, portal/depth/
alpha, particle/light behavior, shadow source/quality/cascade math, shader ABI,
RHI contracts, DAT/package formats, or any pack-off pixels/work. No graphical
client is launched from implementation or review worktrees.
14.6 Tests, mutations, automated return, and reviews
Production-facing tests must prove:
- the frame builder borrows the exact prior completed set reference and flag; current Begin does not turn it into a current-camera product;
- complete/abort/reset and first/login/portal/null-root cases have the stated transaction semantics;
- exact CELLARRAY intersection selects multi-cell outdoor static, dynamic, and child casters once, while missing membership and ParentCell-only impostors fail closed;
- a building shell selects by outdoor
EffectCellId, not its EnvCell anchor; - terrain selects only loaded slots reached by exact land cells;
- alternating visible/invisible instances in one material group produce only the correct active instance ranges and stable order;
- camera-only visibility changes alter active output while both retained topology build sequences, classification counts, mesh lookups, geometry, and dynamic-transform mappings remain unchanged;
- topology rebuild, transform journal refresh, fade/mesh-availability retry, generation reset, and the existing two-frame deferral still converge;
- built-in and declared packs consume the same typed selector; pack-off does no shadow work;
- the warmed production selection path allocates 0 managed bytes and retained scratch remains streaming-bounded.
At minimum sabotage and restore exactly: replace CELLARRAY with ParentCell;
select all resident terrain; use building anchor instead of effect cell; admit
missing membership; feed current building scratch instead of the completed
product; change a visibility-only frame so it advances the retained topology
sequence; and collapse an alternating group into a prefix InstanceCount.
Record each exact first failure in the implementer commit body.
Implementer return: git diff --check; Release solution build 0W/0E; focused
visibility/frame/shadow caster/prepared/GPU/terrain/pack tests; the real warmed
0-B pin; official hermetic lane; inclusive InstalledDat lane with exactly the
documented global failure/skip identities; one clean commit and exact file/
count/mutation report.
Sequential review 1 — retail/deviation fidelity: re-check §14.1 against the named decomp and paired executable/PDB, prior-completed timing, CELLARRAY and building-channel sources, IA-24 truth, and pack-off non-participation. Sequential review 2 — architecture/GPU/gate honesty: one borrowed set, no cell reconstruction, arbitrary-instance correctness, no topology rebuild on camera motion, transform/GPU flight safety, 0-B steady state, lifecycle/deferral, allowed scope, counts, and at least three mutation claims. A failed lens gets one bounded fix contract; a third fix round stops and is written up.
14.7 S5-c2 implementation result — clean evidence complete; fix round 1 implemented
The bounded implementation is complete for review. The selected atmospheric pack now borrows the existing visibility controller's exact prior-completed set and completed-view flag by reference. The frame captures that fact before the current transaction begins and borrows S2's retained CELLARRAY owner through a typed read-only adapter. No second visibility set, cell index, or fallback was added.
The retained caster and terrain products now have separate active-selection
projections. Ordinary casters intersect their non-empty retail CELLARRAY with
the completed landscape set; building shells use outdoor EffectCellId;
missing membership and no/empty completed views fail closed. The established
outdoor family remains low != 0 && low < 0x0100 (including 0x41), while a
terrain slot scans only its authored 1..64 cells. Arbitrary selected instances
inside one material command are emitted as exact contiguous
BaseInstance/InstanceCount runs. Active indirect publication advances its
own sequence; caster, prepared-draw, and terrain topology sequences remain
unchanged on visibility-only frames. Terrain snapshot publication also marks
an aborted build invalid so the next frame retries rather than accepting a
partially written snapshot.
Built-in and declared directional-shadow graphs call the same typed selector and pass the same prior product into terrain selection. The existing production pack-off integration remains unchanged and proves no active pack runtime, shadow resource, or shadow work. IA-24 now states the prior-view/S2 selection adaptation and keeps the shadow map explicitly non-retail.
Pre-commit automated evidence:
- Release solution build: PASS, 0 warnings / 0 errors.
- focused visibility/frame/caster/prepared/GPU/terrain/built-in/declared/ pack-off/long-cycle lane: 137 passed, 0 failed, 0 skipped;
- warmed production selection: caster selector, arbitrary-run projection, and terrain projection each measured 0 managed bytes while retained scratch and topology build sequences stayed stable;
git diff --check: PASS.
The required mutations were each built, run against the named production pin, and restored exactly. Their actual first failures were:
- CELLARRAY →
ParentCellId:PriorLandscapeSelection_UsesExactCellArrayAndBuildingEffectCell, firstAssert.Equalexpected[201, 202, 203, 205], actual[204, 205]. - Select every resident terrain range:
PriorLandscapeSelection_ScansExactAuthoredEightByEightCells, firstAssert.Singlefound 3 commands. - Building anchor → placement effect cell:
PriorLandscapeSelection_UsesExactCellArrayAndBuildingEffectCell, firstAssert.Equalexpected[201, 202, 203, 205], actual[201, 202, 203, 206]. - Admit missing membership:
the same caster pin's first
Assert.Equalexpected[201, 202, 203, 205], actual[201, 202, 203, 204, 205]. - Publish current building scratch instead of the completed product:
BorrowedLandscapeFrame_TracksOnlyCompletedTransactionsByReference, firstAssert.TrueexpectedHasCompletedWorldView=true, actualfalseafter the completed empty frame. - Advance retained caster topology during selection:
PriorLandscapeSelection_UsesExactCellArrayAndBuildingEffectCell, first topologyAssert.EqualexpectedBuildSequence=1, actual2. - Collapse alternating selection into one prefix instance count:
AlternatingCasterSelection_EmitsExactContiguousInstanceRuns, first active-command-countAssert.Equalexpected 3, actual 1.
The bounded implementation is commit
603d4bbb05ebc3e840b5d6e66a20a4c9d3cecc8a. All three official summaries
name that exact commit and record WorktreeDirty=false; their existing
SHA-256 manifests verify without a missing or mismatched file:
artifacts/s5-c2-hermetic-20260904— 16,768 passed, 0 failed, 0 skipped; manifest 32/32 present and matching.artifacts/s5-c2-installed-20260904— the first, deliberately preserved broader run used the literalLane=InstalledDatfilter and produced 468 passed, 10 failed, 1 skipped; manifest 30/30 present and matching. It is valid additional evidence, but it is not renamed or presented as the canonical comparison.artifacts/s5-c2-installed-canonical-20260904— the distinct canonical comparison used the same accepted S5-c1 project filter,Lane=InstalledDat&Purpose!=Diagnostic, and produced 385 passed, 10 failed, 1 skipped; manifest 30/30 present and matching.
Both S5-c2 InstalledDat artifacts contain the same 11 nonpassing TRX
identities as the accepted S5-c1 canonical artifact. The broad-versus-S5-c1
and canonical-versus-S5-c1 Compare-Object comparisons each returned zero
differences. Their different passing totals remain explicit because the two
intentional filters are not interchangeable.
Sequential retail/deviation review returned PASS without a production correction. Sequential architecture/GPU/gate-honesty review found the code, architecture, GPU-flight safety, lifecycle, allocation, and implementation scope otherwise passing, but returned FAIL because this result and the campaign plan still described clean evidence as pending and named only the broader InstalledDat run. Fix round 1 changes only those two evidence/status documents and is implemented pending narrow re-review. The stationary three-buffer per-frame publication is real, explicitly permitted by §14.4, and bounded by Vulkan's two-flight retirement fence; it is a performance note, not a correction and not the #350 mechanism.
15. S5-c2 production-review fix round 1 — evidence provenance only
Retail/deviation review passed the exact implementation commit
603d4bbb05ebc3e840b5d6e66a20a4c9d3cecc8a without a correction. The
subsequent architecture/GPU/gate-honesty review found no production-code,
test, lifecycle, allocation, GPU-flight, or scope defect. It returned FAIL on
one documentation-only truth gap: §14.7 and the plan still say clean evidence
is pending and name only the first, broader InstalledDat run, while two clean
InstalledDat artifacts now exist with different intentional filters.
This is fix round 1. It is bounded to evidence provenance and status text:
- Change §14.7's heading and tail from pending/future tense to the exact clean
results already on disk. Name the implementation commit and
WorktreeDirty=false. - Record the hermetic artifact
artifacts/s5-c2-hermetic-20260904: 16,768 passed, 0 failed, 0 skipped; SHA-256 manifest 32/32 present and matching. - Preserve and explain the first InstalledDat artifact rather than hiding,
renaming, replacing, or calling it canonical:
artifacts/s5-c2-installed-20260904ran the literal filterLane=InstalledDatand produced 468 passed, 10 failed, 1 skipped; manifest 30/30 present and matching. - Name the distinct canonical comparison artifact
artifacts/s5-c2-installed-canonical-20260904. It ran the same accepted project filter used by S5-c1,Lane=InstalledDat&Purpose!=Diagnostic, and produced 385 passed, 10 failed, 1 skipped; manifest 30/30 present and matching. - State that both S5-c2 InstalledDat artifacts have the same 11 nonpassing
identities as the accepted S5-c1 canonical artifact and that both exact
Compare-Objectcomparisons returned no differences. Do not collapse the two passing counts into one claim. - Record both sequential review outcomes honestly: retail PASS; production FAIL on this evidence-text defect only, with code/architecture/GPU-flight otherwise passing. The stationary three-buffer per-frame publication is real, explicitly permitted by §14.4, and bounded by Vulkan's two-flight retirement fence; it is a performance note, not a correction or #350 mechanism.
- Update only the S5-c2/S5 status text in the campaign plan to say fix round 1 is documentation-only and implemented/pending narrow re-review. Do not mark the chunk landed, review-closed, self-gated, or user-accepted.
Allowed files are exactly this packet and
docs/plans/2026-09-01-campaign-overhaul-world-solidity.md. No source, test,
register, architecture, artifact, manifest, filter, or client change is
authorized. Do not rerun a lane or launch the graphical client. Return one
clean docs-only commit, git diff --check, exact file/count report, and prove
every named artifact/manifest/count/filter directly from its existing files.
One narrow independent production/gate-honesty re-review then checks only the two corrected documents against the three clean artifact directories and the two recorded review verdicts. A new correction-worthy finding would be fix round 2; a third fix round still stops S5-c2 and is written up.
16. S5-c2 review closeout, landing, and lead graphical A/B — 2026-09-04
The narrow independent production/gate-honesty re-review returned PASS with no finding. It checked the two-document fix-round scope, all three clean artifact directories and manifests, both InstalledDat filters and counts, the two unchanged nonpassing-identity comparisons, and the recorded sequential review verdicts. No production or test file changed in fix round 1.
The reviewed scratch stack maps to the campaign branch as follows:
- implementation
603d4bbb05e->a4de2efc4; - lead fix-round contract
0025bb2c097->048027e71; - evidence/status correction
521f5edda54->ef819eedf.
The integrated campaign tree at ef819eedf is byte-identical to reviewed
scratch tip 521f5edda54. Fresh campaign verification passed: Release solution
build 0 warnings / 0 errors and the affected 137-test lane 137/137. The
official clean evidence remains §14.7's hermetic 16,768/16,768, broader
InstalledDat 468 pass / 10 documented fail / 1 skip, and canonical
InstalledDat 385 pass / the same 10 documented fail / 1 skip, with all
manifests and nonpassing identities verified.
The first graphical run at
logs/selfgate-20260904-182320-s5c2-shadow-selection captured all seven
transition PNGs and reached its checkpoint without a fatal log entry, but its
route omitted close-client. GLFW exposes no main-window handle to the runner,
so the runner's graceful external close could not succeed. The owner was away
from the computer and explicitly directed the lead to close it; after the
graceful path was exhausted, the lead terminated only the verified campaign
PID. This run is retained as visual evidence but its teardown is FAIL, not
the valid c2 gate.
The lead then added an out-of-tree A/B route with an in-client close-client
step and built exact parent 5c106bcdf in detached worktree
s5-c2-ab-parent (Release 0 warnings / 0 errors). Before each run ACE was UP on
UDP 9000 as PID 13340 and no graphical client was running. Exact evidence:
- parent:
s5-c2-ab-parent/logs/selfgate-20260904-183815-s5c2-parent-shadow-ab; - candidate:
logs/selfgate-20260904-183925-s5c2-candidate-shadow-abat cleanef819eedf.
Both runs produced all seven PNGs, exited 0, logged graceful logout confirmed, left no client process, and contained no fatal/unhandled/device-lost/validation match. Candidate metadata shows exact active selection rather than retained topology fallback: 2,500 selected casters on the first high frame and 3,087 after re-enable, with four cascades and 26 draws; pack-off reports zero pack work. Terrain, buildings, actors, UI, weather transitions, resize, and pack off/on recovery remain present. The lead verdict for S5-c2's own scope is PROVISIONAL PASS pending owner inspection.
The A/B also proves a conspicuous darkening on atmospheric re-enable is
pre-existing: exact parent and candidate both reproduce it. The receiver
shaders switch outdoor directional lighting from authored
-uLights[0].dirAndRange to uShadowLightDirectionAndSource whenever the
shadow flag becomes nonzero; the shadow-strength weight does not blend that
lighting-direction change. This is not an S5-c2 regression, but it is not
silently accepted as a solid-renderer result: issue #469 records it and IA-24
now names the gate-visible discontinuity. It must be resolved or explicitly
owner-accepted before G4. S5-c3 is next; G4 remains unpassed and nothing may
merge to main.
17. S5-c3 contract — exact building degrade selection and complete-body gate
This chunk is deliberately bounded to the building part-0 path named by S5.
It replaces the capture-specific fixed +0.99 selection, preserves the
selected GfxObj identity separately from its optional drawing BSP, draws that
selected shell, and makes the three already-authored Config preferences live.
It does not add generic entity LOD, change S5-c1 particle visibility, change
S5-c2 shadow selection, or implement the fixed-function material work reserved
for c4.
17.1 Lead-verified retail and paired-binary facts
The paired executable is C:\Users\erikn\Downloads\acclient.exe, SHA-256
006FFEADC5D679C871497112A5BD1F87714D0E273E2166BAE5052DDE369297B1.
Its CodeView record remains GUID {9E847E2F-777C-4BD9-886C-22256BB87F32},
age 1, matching refs/acclient.pdb. Fresh read-only Ghidra output was checked
against the named pseudo-C. Exact function byte ranges are:
| Function | VA / file offset / length | SHA-256 |
|---|---|---|
SceneTool::UpdateFPSCounter |
0x0043E510 / 0x0003E510 / 176 |
4B49B883F2F03284F08BAF70716F2AFFAA6591EAD4142D8D5A68879F79CA9DA2 |
CPhysicsPart::Draw |
0x0050D7A0 / 0x0010D7A0 / 192 |
965E1E6208DF662EE3466AA455CFF57BBDEA8AA3751E4DE2F5FD30C3842661FA |
CPhysicsPart::UpdateViewerDistance |
0x0050E030 / 0x0010E030 / 384 |
30F0EEA8829728497E1D00E0D9737DF9EB112CC6643A24ED6150F1350D29D49D |
GfxObjDegradeInfo::get_degrade |
0x0051E4B0 / 0x0011E4B0 / 400 |
E0FE4A2BC79F108985B84DDBA44460B8B80809AE81088779D02C2FEF6CCDD8B7 |
Render::SetDegradeLevelInternal |
0x0054C3C0 / 0x0014C3C0 / 240 |
9A59895EC901ABA75584EA5B059222C00CC9CF2B7AF54F5FB7C2A2CF444D83E4 |
Render::CalcDegLevel |
0x0054CAF0 / 0x0014CAF0 / 736 |
607DC8B8DBAAB9498C163241CE535E14751378A7EC06DFFD724BB68910C7BB08 |
RenderDeviceD3D::DrawBuilding |
0x0059F2A0 / 0x0019F2A0 / 177 |
0FEC14C65D32DACEA0344A9F347937A2588CE3D14694AC658607BDFE5ACDE125 |
RenderDeviceD3D::DrawBuilding @0x0059F2A0 always publishes the building's
outdoor portal list and calls UpdateViewerDistance(parts[0]). Its complete
body is gated only by
parts[0]->gfxobj[parts[0]->deg_level] != nullptr. Inside that gate retail
sets building/detail state, calls FlushAlphaList(0f), calls
CPhysicsPart::Draw(part0, 1) for the portal-only walk, sets the building
flag, calls CPhysicsPart::Draw(part0, 0) for the selected shell, clears the
flag, and clears detail state. A non-null selected GfxObj whose drawing_bsp
is null therefore still crosses the alpha barrier and draws its shell; only
the portal-only sub-walk naturally emits nothing. The current acdream
if (bsp is null) return conflates those facts and is wrong.
CPhysicsPart::Draw @0x0050D7A0 normalizes its local level to zero when the
part has no degrade descriptor or its stored level is outside the loaded Gfx
array, then indexes gfxobj[level]. A null selected GfxObj returns; a non-null
one reaches DrawMesh. UpdateViewerDistance @0x0050E030 measures from the
viewer to the base GfxObj's sort center after component-wise part scale, stores
CYpt and heading, selects level zero/mode one for a missing ladder or the
player, otherwise calls get_degrade(CYpt / gfxobj_scale.z), and calculates a
draw frame only when the selected GfxObj is non-null.
GfxObjDegradeInfo::get_degrade @0x0051E4B0 uses
max(0, abs(distance) - Render::s_rDegradeDistance). With automatic degrades
enabled it uses Render::deg_mul; otherwise it uses
Render::s_rUserSuppliedDegradeBias. For a nonnegative multiplier the strict
threshold is ideal - (ideal - max) * multiplier; for a negative multiplier
it is ideal + (ideal - min) * multiplier. The first strict effective < threshold match wins; equality advances; no match selects the last level.
degrades_disabled forces level zero and that level's mode; a forced level is
clamped to the last slot. This chunk has no production force-level or global
disable control, but its pure selector must keep those two explicit inputs so
the retail branches are pinned and no future caller must fork the algorithm.
The binary statics are s_rDegradeDistance=50, max_framerate=20,
min_framerate=8, ideal_framerate=10, auto_update_deg_mul=1, manual bias
0, and initial deg_mul=0. The Config UI's authored defaults are separately
automatic=false, bias=0, distance=50; production follows the persisted UI
preference, not a capture's transient multiplier.
SceneTool::UpdateFPSCounter @0x0043E510 sums the prior 20 frame-duration
slots, publishes FPS as zero when the sum is not strictly greater than
0.000199999995f, otherwise publishes 20/sum, then shifts the history and
inserts the just-finished duration. Preserve this retail one-sample ordering,
the 20-slot warmup contents, and single-precision behavior.
Render::CalcDegLevel @0x0054CAF0 first shifts its 30-slot candidate history.
With automatic degrades off it stores the unchanged current automatic
multiplier and returns. With automatic degrades on it evaluates retail's exact
five-weight piecewise formula from current FPS and the 8/10/20 rates, adds the
current multiplier, clamps to [-1,+1], and calls
SetDegradeLevelInternal(candidate) only after all 30 prior history slots are
within the strict retail abs(slot-candidate) < 0.01 band; it finally stores
the resulting current multiplier. Port this body as one testable pure routine
from the named function and paired bytes. A proportional controller, moving
average substitute, time-based debounce, modern clamp, or reordered history
is not equivalent.
Render::SetDegradeLevelInternal @0x0054C3C0 also derives retail object,
particle, static-light, and dynamic-light budgets. S5-c3 changes only the
building consumer of deg_mul: TS-15, AP-116, and AP-85 already own the
surviving non-building LOD, particle-range, and light-pool differences and
must be amended in the same implementation commit to name that uncoupled
adaptive-budget fact. Do not perturb those already-landed policies here.
Finally, CBuildingObj::makeBuilding @0x006B53A0 calls
InitPartArrayObject(model, 1). That path accepts either a direct GfxObj or a
Setup, but DrawBuilding still uses only parts[0]. A Setup-backed building
therefore resolves the existing SetupMesh.Flatten/Resting placement part
zero and its transform; it never flattens every Setup part into the building
shell draw. The installed-DAT census below contains no Setup building, so this
branch is a synthetic structural pin, not an installed-population claim.
17.2 Installed-DAT population pin
The lead scanned the installed land/cell/portal DATs through the legal
DatCollection reader before this contract. Record and reproduce these exact
facts in an InstalledDat test or an existing InstalledDat census surface:
- 1,639 landblocks contain 6,979 building instances across 398 distinct models;
- all 6,979 installed building models are direct GfxObjs; zero are Setup or another type;
- all 6,979 resolve part-zero GfxObj data; none are missing;
- 6,760 instances have degrade ladders, containing 27,859 level slots across 350 distinct ladder models;
- every one of those 6,760 ladders has exactly one zero-id slot and it is the final slot; no nonzero slot is missing and all 21,099 nonzero slots have a drawing BSP;
- level-count histogram: 2→196, 3→216, 4→4,964, 5→1,341, 6→43;
- there are no duplicate building-anchor groups.
Thus the complete-body null-selected-Gfx path is real and widespread, while the non-null-Gfx/null-BSP path requires a synthetic pin even though its retail behavior is unambiguous. Do not “repair” the authored final zero slots, clamp to the last nonzero slot, or use BSP presence as a body-existence proxy.
17.3 One typed selection, one shared degrade owner
Replace BSP-only selection with one value that carries at least the selected
GfxObj id, nullable drawing BSP, degrade level, and degrade mode. The base
direct-Gfx path carries its own GfxObj id even with no ladder. Ladder entries
carry the authored GfxObj id and mode as well as min/ideal/max and the optional
BSP. A selected GfxObj id of zero is the exact complete-body failure. A
nonzero id with null BSP is an admitted complete body with no portal walk.
HasGeometry, the fixed DefaultDegradeMultiplier=0.99, and the erroneous
default distance 100 are deleted, not retained as fallback truths.
Create one renderer-lifetime degrade owner, passed/borrowed through normal composition: no static mutable global, service locator, duplicate UI mirror, or second ticker. It owns the 20 frame-time slots, 30 candidate slots, current automatic multiplier, exact rolling FPS, and the current persisted settings view. It advances exactly once per accepted graphical render callback using that callback's real delta; world replacement/portal travel does not recreate or double-tick it. Settings changes are observed on the next frame:
- automatic=false → building selection and the FPS panel's DEG field use the
persisted manual
GraphicsPerformancebias; - automatic=true → they use the exact current automatic multiplier;
- both modes use the persisted
DegradeDistance; - the FPS panel's FPS field borrows this same retail rolling-FPS value, not a second cadence, while its authored show/hide option remains unchanged.
The controller must define and pin initial/warmup behavior, zero and tiny deltas, NaN/infinity input, settings toggle transitions, and exact float ordering. It may fail closed or sanitize only where the retail x87 comparison would do so identically; any modern safety divergence must receive a register row in this same commit. No allocation is permitted after warmup.
17.4 Exact building body, portal, and selected-shell execution
At DrawBuilding entry retain the unconditional BLD transcript event and
portal-list publication. Then select part zero once and use that same immutable
selection for every downstream action:
- selected GfxObj id zero: return after entry publication; no alpha barrier, portal walk, look-in draw, or shell;
- selected id nonzero: emit the existing alpha barrier first;
- if the selection's BSP is non-null, run the existing pass-1/pass-2 portal walk through each active view; if null, emit no portal work but continue;
- submit the shell after the portal walk using exactly the selected GfxObj id.
Thread the typed selection through OnBuildingShellTurn and the production
world/populator/dispatcher seam. Do not mutate the retained
RenderProjectionRecord, rebuild retained topology, clone a record per frame,
or silently keep the base shell's MeshRefs. Classification must preserve
the retained building's scene/lifecycle identity, root transform, material/
surface overrides, detail state, effect/anchor membership, and picking facts,
while replacing the part-zero GfxObj with the selected one. Direct-Gfx models
use identity part transform. Setup models use exactly the precomputed part-zero
placement/default-scale transform, and portal projection, sort-center distance,
and shell submission must agree on the same composed part-zero frame.
The building path submits exactly one selected part-zero mesh. If its render mesh is not resident, request/load that selected id through the existing asynchronous mesh seam and draw no shell for that frame; never fall back to the base GfxObj, block on DAT access, or query DAT from the renderer. Retry on the following frame through existing residency behavior. Zero retained shell records during a streaming boundary remains an empty shell turn; multiple matching retained shell records for one committed building is a fail-loud ownership error. No new dictionary, cell scan, or linear model search may run per building per frame.
17.5 Config and deviation truth
Render_AutomaticDegrades, Render_GraphicsPerformance, and
Render_DegradeDistance become live rows and must no longer receive
storeOnly:true or cite AP-198. Update the exact Config dim-set test and all
comments/counts that pin it. AP-198 narrows from its current residual set by
those three rows; do not disturb the already-live landscape-radius and
building-detail controls. Keep AD-78's count and description mechanically
consistent with the actual controller test.
Narrow TS-15 explicitly to non-building parts. Amend AP-85 to say its fixed
one-list light cap is not driven by SetDegradeLevelInternal's multiplier,
and AP-116 to say the explicit Retail/Extended particle-range choice is not
the adaptive multiplier's object/particle distance budget. Those existing
rows cover every intentionally uncoupled SetDegradeLevelInternal consumer;
add no duplicate row. If implementation discovers another surviving
deviation, add or correct its row in the same commit. The active-row total
must change only if a row is actually added or retired; narrowing does not
change it.
17.6 Allowed scope and explicit nonchanges
Allowed production scope is the existing building walk/factory/registry,
frame-driver world-data/populator/dispatcher classification seam, the one
renderer/frame-root composition seam needed for the shared controller, the
FPS retained-UI binding, DisplaySettings comments, and the Config row
dimming flags. One focused App-layer controller file may be added. Tests may
change only for those surfaces, the exact retail math, installed census,
composition identity, residency retry, lifecycle, and allocation. The only
authorized documentation file in the implementation commit is
docs/architecture/retail-divergence-register.md.
Do not change portal admission, BSP traversal, alpha FIFO routing, material blend/state, particle update/range, point-light selection, terrain/shadow selection, streaming radii, generic entity/scenery/creature LOD, DAT reader, RHI/shaders, login/network/runtime gameplay, self-gate scripts, artifacts, or this packet/plan. Do not add a base-shell fallback. No graphical client is launched by the implementer.
17.7 Required automated proof, mutations, and return
Focused tests must prove at minimum:
- direct base Gfx and ladder selections carry exact id/BSP/level/mode;
- positive and negative multiplier arms, strict threshold equality, last slot, disable, forced-level clamp, scaled sort-center/CYpt, zero/negative/ NaN/infinity inputs match a literal independent retail oracle;
- the prior-20 FPS ordering and the complete 30-slot
CalcDegLevelformula, stability gate, clamp, manual arm, warmup, and settings transitions match fixed expected sequences—not implementation self-comparison; - zero selected Gfx emits BLD only; nonzero/null-BSP emits BLD → alpha barrier → selected shell with no portal events; nonzero/BSP preserves BLD → barrier → portal passes/look-ins → selected shell;
- a far selected LOD changes the submitted GfxObj id while all retained ownership, transform, surface/detail, effect-cell, picking, and ordering facts remain exact; no base fallback occurs while the selected mesh is unavailable, and the same selection appears after residency succeeds;
- a synthetic Setup building draws only transformed part zero and uses the identical composed transform for distance, portal clip, and shell;
- Config's three rows are live-colored, persist exact values, and the one composed controller instance is borrowed by both renderer and FPS panel;
- publish/retire/revisit/reset and first/login/portal/null-root frames neither duplicate nor recreate the controller and leave existing building lifecycle behavior intact;
- the installed census equals §17.2 exactly; and
- the warmed selection/controller/classification path allocates 0 managed bytes and does not advance retained topology or materialize records.
Sabotage and restore at least these exact mutations, recording each first
failing test/assertion in the implementation commit body: use BSP-null as the
complete-body gate; clamp the final zero slot to the prior nonzero slot; use
the base GfxObj for shell submission; change strict < to <=; feed the
manual bias while automatic is enabled; update FPS after inserting the current
sample; allow one stable history slot instead of all 30; fall back to base when
the selected mesh is unavailable; and recreate the shared owner for the FPS
binding. Include an allocation sabotage that constructs or clones per
building and prove the 0-B pin catches it.
Implementer return: git diff --check; Release solution build 0W/0E; focused
building/walk/driver/dispatcher/settings/UI/composition tests; exact math and
0-B lanes; official hermetic lane; inclusive InstalledDat lane with the
campaign's accepted exclusions and explicit documented global identities;
one clean commit; exact file/count/mutation report; no client run.
Sequential review 1 — retail/deviation fidelity: re-check every §17.1 byte/ named fact, the §17.2 census, selection math, FPS/auto controller, complete- body gate/order, Setup part zero, selected shell, Config/register truth, and all mutations. Sequential review 2 — architecture/production/gate honesty: one shared owner/tick, one typed selection, no retained mutation/base fallback/ renderer DAT read/topology rebuild, async residency, transform/material/ lifecycle identity, allocation, allowed scope, build/lane provenance, and at least three reproduced sabotage claims. Reviews run sequentially. A failed lens gets one bounded fix contract. Under the owner override, S5-c3 may use at most ten review passes and stops before an eleventh; documentation-only findings may be corrected directly by the lead.
18. S5-c3 fix round 1 — x87 store schedule and register truth
The first sequential OpenAI retail/deviation review returned FAIL on the uncommitted scratch implementation: one MAJOR exact-arithmetic defect and one MINOR pre-existing register-truth defect. Everything else in §17 passed. This is the first bounded fix round; it does not reopen selection ownership, building traversal, residency, Config wiring, or any S5-c1/S5-c2 behavior.
The reviewer independently re-confirmed the executable SHA, CodeView GUID/age, all seven §17.1 byte-range hashes, the named-decomp semantics, the complete §17.2 census, the complete-body order, Setup part zero, selected-shell identity and surface preservation, no base fallback, scope, lifecycle wiring, the other register edits, and every required mutation. Its clean focused return was 64/64, and the scratch state was restored exactly.
18.1 F1 — preserve retail's x87/store boundaries
The candidate currently rounds arithmetic too early in three places. Repair only these exact boundaries, allocation-free:
SceneTool::UpdateFPSCounter @0x0043E510sums the 20 stored single-precision frame durations in x87 precision and divides before narrowing once at the published FPS store. Accumulating into a C#floatis not equivalent. Use a wider accumulator that exactly sums the 20 binary32 inputs, perform the division wide, then narrow once tofloat. Restore retail's physical history direction: shift old slots0..18to1..19, then store the just-finished binary32 duration at slot 0. The prior-20-before-insert order remains unchanged.Render::CalcDegLevel @0x0054CAF0evaluates its five membership weights, weighted numerator/denominator, addition, and clamp in x87 precision except at the explicit binary32 stores visible in the named function. Re-express the pure calculation with wide intermediates fed by the exact binary32 constants (-0.150000006f,-0.02f,0.01f,0.1f) and narrow only at retail's candidate store. The stability comparison promotes each binary32 history slot and candidate and compares against the executable's qword0.01, not0.01f. Keep the existing shift-before-evaluate and final current-multiplier store order.GfxObjDegradeInfo::get_degrade @0x0051E4B0stores the effective distance afterabs(distance)-DegradeDistance, but evaluates each positive/negative threshold in x87 precision and compares the stored binary32 effective value against that wide threshold. Do not round the threshold tofloatbefore the strict comparison. Disable/force precedence, strict<, equality advance, final slot, modes, and NaN/infinity behavior stay unchanged.
Add bit-exact independent assertions for all three proven witnesses:
- FPS history
[0.001f, 0.005f] × 10publishes bits0x43A6AAAB(333.333344f), not the candidate's0x43A6AAAC; CalculateCandidate(14f, 0f)publishes bits0x3BB2BC0A, not0x3BB2BC0B;- with ideal/max
24f/48f, multiplier0.0020020019728690386f, and effective distance24.04804801940918f(0x41C06267), retail's wide threshold remains strictly greater and selects the first level.
Also pin the qword stability edge directly and the slot direction without
reflection-only self-comparison. Each of these changes needs a named mutation
and actual first failing assertion: restore float FPS accumulation; restore
float CalcDeg intermediates or 0.01f; restore a rounded selector threshold;
reverse the FPS slot direction. Restore every mutation before return.
18.2 F2 — correct AP-198's already-live landscape radius
AP-198 is stale independently of this chunk: Render_LandscapeDrawDistance
already feeds RuntimeSettingsController's live far radius, and the Config
controller maps its persisted default 8 to the selected Medium entry. Remove
that control from AP-198, change every six-row statement to five, and delete
the obsolete no-highlight sub-note. Keep the actual Config dim set at 16/27;
S5-c3 still changes only Automatic Degrades, Graphics Performance, and Degrade
Distance from store-only to live. No row is added or retired, so active table
counts do not change. Add or update a truth pin that fails on the old six-row
wording or the obsolete no-highlight statement.
18.3 Scope, return, and review order
Production edits are limited to BuildingDegradeController.cs and
Walk/WalkBuilding.cs. Test edits are limited to their existing focused test
files plus the existing Config/register truth pin if required. The only
documentation edit in the implementation remains
docs/architecture/retail-divergence-register.md. Do not change controller
ownership/tick placement, selection/result shapes, building factory or
transforms, portal walk/order, shell classification, residency, materials,
surface overrides, UI wiring, RHI/shaders, DAT readers, or any other register
row. No graphical client.
Return the exact changed-file list; git diff --check; Release solution build
0W/0E; the bit-exact math/selector/controller and Config/register focused
lanes; the original S5-c3 focused lane; official hermetic lane; inclusive
InstalledDat lane with exactly the documented global identities; and the new
mutation ledger. Do not commit—the lead owns the reviewed landing commit under
the owner's OpenAI-only process override.
The same OpenAI retail lens narrowly re-reviews F1/F2 and regression evidence first. Only its PASS unlocks the sequential OpenAI architecture/production/ gate-honesty review over the entire S5-c3 stack. Each further code finding receives its own bounded contract; S5-c3 stops before an eleventh review pass. Documentation-only findings may be corrected directly by the lead.
19. S5-c3 fix round 2 — CalcDegLevel's four intermediate stores
OpenAI retail review pass 2/10 returned FAIL on one remaining MAJOR F1
defect. Fix round 1 otherwise passed: the FPS witness is 0x43A6AAAB, the
14-FPS candidate is 0x3BB2BC0A, the selector boundary stays at level zero,
the qword 0.01 edge and physical FPS slot direction pass, and AP-198 now
states the exact five-row residual while AD-78 is corrected to 16/27. The reviewer
also re-confirmed the paired executable/PDB identity, clean allowed scope,
the exact installed census, and the official evidence identities.
19.1 R2-F1 — reproduce every executable-visible numerator store
The remaining defect is only
BuildingDegradeController.CalculateCandidate. Its combined
float weightedNumerator narrows once after all five terms. The paired
Render::CalcDegLevel @0x0054CAF0 bytes instead store the evolving numerator
to binary32 four times: after w0 at 0x0054CC14, after the negative w1 term
at 0x0054CC61, after the zero-weight w2 term at 0x0054CCA6, and after the
positive w3 term at 0x0054CCEB. Retail then promotes that fourth stored
value, adds the w4 term wide at 0x0054CD3F, divides wide, adds/clamps wide,
and narrows only at the final candidate store.
Implement that literal schedule allocation-free. Each of the first four
stages must be an explicit float store followed by promotion for the next
stage; do not algebraically combine, reassociate, or eliminate the +0*w2
store. Feed every term with the existing exact binary32 coefficient. Keep the
five membership weights, denominator, history/stability behavior, clamp,
exceptional-value behavior, and every other fix-round-1 change untouched.
Add an independent bit-exact assertion:
CalculateCandidate(16.25f, 0f)must publish0x3CA3D70A; the current combined store publishes0x3CA3D70B.
Sabotage by recombining the five terms into one store and record this witness as the first failure, then restore it. Re-run the three §18 witnesses, qword edge, FPS slot-direction pin, complete controller/selector lane, original S5-c3 focused surface, allocation lane, official hermetic lane, and inclusive InstalledDat lane with the same documented nonpassing identities.
19.2 Scope and review order
Production scope is exactly
src/AcDream.App/Rendering/BuildingDegradeController.cs; test scope is exactly
tests/AcDream.App.Tests/Rendering/BuildingDegradeControllerTests.cs. No
other production, test, register, packet, plan, UI, renderer, RHI, shader, DAT,
or lifecycle behavior changes. No graphical client and no commit; the lead
owns landing.
Return the exact two-file diff, git diff --check, Release solution build
0W/0E, every lane above, and the mutation's first failure. The same OpenAI
retail lens performs narrow review pass 3/10 over §19 first. Only its PASS
unlocks the sequential full architecture/production/gate-honesty review.
20. S5-c3 fix round 3 — ladder ownership, retry rearm, and tick proof
OpenAI retail review pass 3/10 returned PASS after independently pairing the exact executable and PDB and confirming the literal four-store CalcDeg schedule. The sequential OpenAI architecture/production/gate-honesty review pass 4/10 returned FAIL on two production lifecycle defects and one non-discriminating test. Typed selection, complete-body gating/order, selected transform and surface borrowing, Config wiring, exact installed census, allocation-free controller/selector/classifier paths, and the restored retail math witnesses otherwise passed. This bounded round does not reopen retail selection math or rendering policy.
20.1 R3-A — own every nonzero building ladder mesh
Selected non-base degrade meshes are requested through
WbMeshAdapter.EnsureLoaded, but asynchronous publication is admitted only
while ObjectMeshManager sees an ownership reference. Landblock registration
owns retained base MeshRefs and prepared EnvCell geometry, not the nonzero
GfxObj IDs in building degrade ladders. A selected ladder ID can therefore
remain permanently non-drawable unless an unrelated owner happens to hold it.
Carry the unique nonzero ladder GfxObj IDs derived from the worker-built
EnvCellLandblockBuild.WalkBuildings through the existing landblock
publication/lifetime transaction as ordinary mesh ownership, distinct
from prepared EnvCell IDs. Requirements:
- exclude the retail zero sentinel and deduplicate ladder IDs, including any
overlap with retained base
MeshRefs; - acquire them through the existing
IncrementRefCount/ordinary desired and held path before readiness can complete; do not treat them as prepared EnvCell pins and do not acquire them from the per-frame classifier; - balance ownership across initial publication, Far-to-Near promotion, Near-to-Far retirement, full unload, replacement, partial publication failure, reset, and same-location revisit, without duplicate increments;
- preserve selected-only submission: an unavailable selected mesh remains a skipped shell, never a resident-base fallback; and
- keep the carrier precomputed/immutable and the frame walk allocation-free.
Add a production-path proof using the real ObjectMeshManager and
WbMeshAdapter, without direct ObjectRenderData injection: a non-base
selected ladder dependency becomes owned, its valid prepared result reaches
upload/publication, and a later frame can submit it. Add focused lifecycle
proofs for balanced release, cancellation/partial failure, reset, and revisit.
Sabotage by dropping ladder dependency publication and by dropping one release
edge; record the first failing assertions and restore both mutations.
20.2 R3-B — rearm mesh-miss requests at the real walk-frame boundary
WbDrawDispatcher clears _missRequested only from the legacy flat/entity
dispatch boundary. Normal PView walk frames use BeginWalkPartFrame, so a
once-missed selected ID remains suppressed across later frames and after
cancellation, eviction, or revisit.
Clear _missRequested once at the successful BeginWalkPartFrame boundary,
after its double-open guard has accepted the new frame. Preserve
_missLogged as the once-per-lifetime diagnostic set. Prove that the same ID
requested twice in one frame emits one preparation request, the next accepted
frame can request it again, and cancellation/eviction/revisit converge without
an unbounded request-dedup set. Sabotage by deleting the frame-boundary clear
and record the first failure, then restore it.
20.3 R3-C — make exactly-once tick and ordering discriminating
The production orchestrator contains one accepted-frame degrade tick, but its
test uses constant 0.05 samples and checks only eventual 20 FPS; duplicating
the production tick survives that proof.
Strengthen the orchestrator lane with an independent call-count and order
recorder: each accepted nonzero-area render frame ticks the one shared owner
exactly once, a zero-area/rejected frame ticks zero times, and the tick occurs
before BeginFrame and downstream walk work. Use a nonuniform, hard-coded
duration sequence with exact expected published FPS bits so a duplicate or
shifted sample changes the result. Sabotage by duplicating the tick and
independently moving it after BeginFrame; both mutations must fail at named
assertions and then be restored.
20.4 Lead-owned documentation corrections
The lead may directly repair the Config controller prose to describe the three now-live degrade controls; pin AP-198's five residual rows; correct the Config dim set and AD-78 count to 16/27; change both portal-gate diagnostic effective- distance calculations to use the selected distance 50 rather than 100; and add a Config-test aggregate pin that exactly 16 rows remain store-only.
20.5 Scope, return, and review order
Production scope is limited to the worker-built ladder dependency carrier,
the landblock publication receipt and ordinary/prepared ownership split through
GpuWorldState/LandblockSpawnAdapter, the successful walk-frame boundary,
and the existing render orchestrator seam needed for a discriminating order
test. Tests may extend the corresponding focused build, publication,
dispatcher, classifier, and orchestrator suites. Do not change retail degrade
math, selector thresholds, complete-body logic, transforms, surfaces,
fallback policy, RHI/shaders, DAT readers, or unrelated lifecycle owners. No
client, commit, campaign-doc edit, or subagent; the lead owns those actions.
Return the exact changed-file list, git diff --check, Release solution build
0W/0E, the focused ownership/lifecycle/retry/order lanes, all prior S5-c3
math/selection/census/allocation lanes, official hermetic lane, inclusive
InstalledDat lane with every documented nonpassing identity, and the five
required mutation failures. The same OpenAI production lens performs narrow
review pass 5/10 over §20 and the full corrected stack. Its PASS, together
with retail pass 3, unlocks lead integration and the clean-HEAD graphical
self-gate; any further code finding receives another bounded contract, with a
hard stop before review pass 11.
21. S5-c3 review closeout, landing, and lead graphical gate — 2026-09-04
OpenAI production narrow re-review pass 5/10 returned PASS with no finding. The reviewer independently reproduced all five §20 mutations, named the first failed assertion for each, restored all 41 changed paths byte-for-byte, and re-ran Release plus focused ownership/publication evidence. OpenAI retail pass 3/10 remains the independent paired-executable/PDB verdict for the exact x87 schedule and building-selection semantics.
The reviewed scratch implementation is
01e5a15d0b4efc73882634899bf5af500168fafe; it landed on the campaign branch as
c673f767e968a85a898b4a3aebb03781060efe06. Fix round 3 now:
- carries every unique nonzero ladder GfxObj as ordinary landblock-lifetime ownership, distinct from prepared EnvCell ownership, with balanced publication, replacement, retirement, failure, reset, and revisit edges;
- clears only
_missRequestedat each successfulBeginWalkPartFrame, after the double-open guard, so a miss deduplicates within one frame and rearms on the next; and - proves one degrade tick per accepted nonzero-area frame, zero on a rejected
zero-area frame, before
BeginFrame, using nonuniform samples.
Fresh clean-HEAD campaign evidence at c673f767e:
- Release solution build: 0 warnings / 0 errors;
- exact focused campaign lane: 101/101;
- official hermetic artifact
artifacts/s5-c3-campaign-hermetic-20260904: 16,811/16,811, zero fail/skip,WorktreeDirty=false, exact commit/branch, manifest 30/30; - inclusive InstalledDat artifact
artifacts/s5-c3-campaign-installed-inclusive-20260904: 469 pass / the same documented 10 fail / 1 skip,WorktreeDirty=false, exact commit/branch, manifest 30/30. The nonpassing identities are unchanged: TowerAscent, the main-game/chat-input and invisible-widget fixture drifts, Oh doorway first- frame drift, and the six documented AlphaFlushCounts; the sweep look-in gate remains the one documented skip.
Before the lead launch, ACE was UP on UDP 9000 as PID 13340 and no acdream or retail graphical client was running. Exactly one Release self-gate command ran and closed its own client gracefully:
logs/selfgate-20260904-223345-s5c3-building-degrade
It produced 00-login.png, 01-cathedral-stairs.png,
02-facility-stairs.png, 03-holtburg-house.png, and
04-holtburg-terrain-leak.png, exited 0, confirmed graceful logout, logged no
fatal/unhandled/device-lost error, and left no client process. Cathedral,
Facility, Holtburg shell geometry, and the terrace hill are intact. The c3
selected-building scope is therefore PROVISIONAL PASS pending owner
inspection.
The Holtburg screenshot is not a controlled old/new pixel comparison: the old
frame is retail/off at 1760x990 while this run starts with the persisted High
atmospheric pack at 1024x768, and neither records the exact camera eye. Static
DAT inspection nevertheless disproves a c3 part-zero explanation: cell
0xA9B4013F's 16 props are independent EnvCell statics and ordinary cell
records never receive buildingSelection.
That audit found a separate pre-existing production defect: ordered draws use
an absolute shared-arena transform base with the ordinary shader's locally
based alpha/selection/light sidecars and omit the active atmospheric receiver
pipeline/bindings. It exists at least at S4-c2 252886e84, is filed as #470,
and must be repaired before renderer-solid/G4. S5-c4 is next; #469/#470, c5,
the closeout program, and G4 remain. Nothing merges to main before G4.
22. S5-c4 contract — exact one-pass detail material and ordered production closure
This chunk replaces the acdream-only base-plus-mesh_detail replay with the
single fragment retail emits when the hardware single-pass detail path is
available. It applies to detail-active building and EnvCell subsets in every
current world submission path: classic grouped, walk-ordered, immediate alpha,
deferred alpha, and EnvCell opaque/transparent replay. One source subset must
produce one physical draw and one (rgb, alpha) result while retaining that
subset's existing queue position, blend family, alpha-test/depth state, cull,
geometry, transform, material overrides, fog policy, sampler, and mip chain.
The production audit found that the walk-ordered path currently uploads
building detail categories and forces them into solo runs but issues only the
base draw. That omission is filed as #471 and is part of this chunk: the new
one-pass detail result must be armed on that existing base draw. Do not add a
blended overlay after the run. An overlay would preserve AP-232, create a new
terrain/StreamMark flush obligation, and remain unlike retail.
22.1 Lead-verified retail and paired-binary facts
The paired executable is C:\Turbine\Asheron's Call\acclient.exe, SHA-256
006FFEADC5D679C871497112A5BD1F87714D0E273E2166BAE5052DDE369297B1.
Its CodeView identity remains GUID {9E847E2F-777C-4BD9-886C-22256BB87F32},
age 1, matching the named PDB. The named pseudo-C and fresh paired-executable
disassembly agree on these exact ranges:
| Fact | VA range / length | SHA-256 |
|---|---|---|
SetSurface detail stages |
0x0059C4D0..0x0059C5B5 / 229 |
090E24BE542E9DA4F77B547D091F5C2E676109495919BEA70027AD2B89E11426 |
SetSurface blend/alpha/depth state |
0x0059C6C5..0x0059C866 / 417 |
1F077DA1BB09FBAC0EAF7522E125C716AAF499DFA8763DD3DDF29CCC6A76C382 |
RenderMeshSubset single-pass arm |
0x0059CA10..0x0059CAF0 / 224 |
64A988D4B1611CEEA6DE135FF52CDF30FE1AFDAAFF5E3B76751FFA7FC833CC53 |
DrawMesh detail/alpha routing |
0x0059D4A0..0x0059D5A5 / 261 |
20B1E5D1E90C9E19C62047AF521F817CF6700B5FEA68CE78C7404CD238862CB3 |
Named anchors are D3DPolyRender::SetSurface @0x0059C4D0
(acclient_2013_pseudo_c.txt lines 425083–425303),
RenderMeshSubset @0x0059CA10 (lines 425382–425450),
DrawMesh @0x0059D4A0, RenderDeviceD3D::DrawEnvCell @0x0059F170, and
DrawBuilding @0x0059F2A0. The live capability result remains the VM2 CDB
record in 2026-08-22-vm2-retail-detail-path-cdb.md: retail takes the
single-pass path, not its fallback.
Let B be the sampled base RGB, D the active diffuse/lighting RGB, a the
active diffuse/material alpha, and Q=(q,qA) the sampled detail texel. At
0x0059C51C/52B/53A/549 retail programs:
- stage 0 colour
C0 = B * D; - stage 0 alpha
PREMODULATE(DIFFUSE,DIFFUSE), whose visible stage-0 result isabut whose stage-1CURRENTalpha is premultiplied by the next texture,a*qA; - stage 1 colour
BLENDCURRENTALPHA(TEXTURE,CURRENT); and - stage 1 alpha
MODULATE(TEXTURE,CURRENT).
Therefore the exact pre-fog fragment is:
w = a * qA
C = q * w + (B * D) * (1 - w)
X = a * qA * qA
The square in X is mandatory. Base texture alpha does not participate in the
detail-active final alpha. Fog is applied to C after the combine wherever
the subset's fixed-function policy enables fog; it never changes X.
SetBlendFunction @0x005A2B90 writes one colour/alpha factor set, so the
framebuffer equations for destination F are:
| Raw family | Result RGB | Result alpha |
|---|---|---|
| Alpha | C*X + F.rgb*(1-X) |
X*X + F.a*(1-X) |
| Alpha + Additive | C*X + F.rgb |
X*X + F.a |
| Additive without Alpha | C + F.rgb |
X + F.a |
| InverseAlpha | C*(1-X) + F.rgb*X |
X*(1-X) + F.a*X |
| InverseAlpha + Additive | C*(1-X) + F.rgb |
X*(1-X) + F.a |
| pure CLIP survivor | C + F.rgb*(1-X) |
X + F.a*(1-X) |
Pure CLIP rejects iff X < r, with r=100/255 for paletted and r=200/255
for DDS/non-paletted input; equality survives. CLIP combined with an
Alpha/Additive/Inverse family keeps that family's factors and applies the same
test. The later TRANSLUCENT branch at 0x0059C767..0x0059C7A6 then matters:
ordinary T and T|Alpha are straight-alpha; T|Additive and
T|InverseAlpha retain their respective family unless the skip arm applies;
every T|CLIP combination is forced to straight-alpha and CLIP is disabled.
Do not replace that table with a universal straight-alpha assumption.
a is the active material alpha, including authored
1-Surface.Translucency on a Translucent surface and the current object/part
fade multiplier. The lead's installed Surface census found 261/261
Translucent-flagged surfaces carry nonzero authored translucency, including
real 0.25, 0.5, 0.75, and 1.0 values. Treating a as always one is disproven.
Current prepared Wb payloads discard that scalar while the decoded base image
bakes it into base alpha; because retail detail excludes base alpha, it cannot
be recovered from the sampled texel. The implementation must carry authored
surface opacity explicitly from extraction through the prepared payload and
GPU batch data, multiply it by the existing live instance opacity, and use the
product as a. Guessing from texture alpha, querying DAT from the renderer, or
using base.a is forbidden.
22.2 One draw, one material result
Implement the combine in the ordinary and atmospheric world-mesh fragment
families, sharing one source include or otherwise proving their arithmetic
textually and numerically identical. The base texture remains the batch-owned
array sample. A detail-active exact command supplies the category texture slot
and tiling in the existing push fields; zero tiling is the unarmed value. The
per-draw GPU batch record supplies authored surface opacity. The vertex stage
passes that scalar without interpolation; the fragment multiplies it by the
existing instance-opacity varying to obtain a.
The prepared contract must gain the scalar without ambiguity:
MeshExtractorcomputes it from the resolved sourceSurfacefor ordinary GfxObj and CellStruct batches using the existingOpacityFromSurfaceTranslucencyrule;TextureBatchData, its deterministic serializer, andObjectRenderBatchpreserve it exactly;- this is a prepared-payload schema change, so advance the bake-tool recipe identity and update every recipe/round-trip/compatibility pin in the same commit; an old recipe must be rejected clearly, never misread; and
- the GPU batch ABI carries it explicitly with layout/stride tests for both built-in shader families. Do not introduce a renderer-side surface table, per-frame dictionary, or DAT lookup.
For a detail-active fragment, compute (C,X) before the current discard/fog
tail. Alpha testing uses X, not sampled base alpha. For detail-off fragments,
preserve the current byte-for-byte logical path: base-alpha discard/reference,
RGB lighting/fog, and base.a * instanceOpacity output alpha. The debug-light
mode remains a deliberate diagnostic bypass and must not sample detail.
At each production draw site:
- arm detail only when the existing Building Detail Textures option is on, the correct category binding is resident, tiling is nonzero, and the exact command/subset belongs to the building or EnvCell detail category;
- set the detail slot/tiling and draw that source subset exactly once through its original base pipeline family;
- preserve its original queue position, blend, depth test/write/reference, alpha test, cull, geometry, draw-id offset, absolute transform base, local sidecars, selected building GfxObj, palette/original-texture override, lighting, fog enable, and atmospheric receiver choice; and
- restore neutral detail push fields before the next non-detail draw.
Delete every now-unreachable RetailDetail/RetailDetailTransparent pipeline,
GpuBlendMode.RetailDetail, DrawBuildingDetailRangeRhi-style replay helper,
mesh_detail.vert/.frag, compiled SPIR-V entries, manifest entries, and stale
two-draw comments/tests. Keep CPU detail-category ownership only where it still
selects exact eligible commands. Do not delete or weaken the building-detail
setting, category textures, repeat/linear sampler, full mip chain, S4's two
FIFO queues, AD-120 immediate placement, AP-238 token granularity, AP-239 raw
mask residual, or AP-240 ordinary-GfxObj ClipMap placement.
The ordered-path repair for #471 is a one-pass arm on the existing solo base
run. It adds no second draw and therefore leaves WalkFrameDriver's
opaque/no-blended-overlay StreamMark terrain-flush premise true. Tests must
prove that premise rather than adding a compensating terrain flush.
22.3 Audited policy table and explicit nonchanges
Add one data-driven policy test/table spanning Building and EnvCell × Opaque,
Alpha, Additive, InverseAlpha, paletted CLIP, and DDS CLIP × detail on/off. For
each row pin physical draw count, source order/FIFO, pipeline blend/depth/alpha
test/reference, detail arm, emitted (C,X), and framebuffer result on a
nontrivial destination. Add raw Translucent combinations sufficient to pin
the later override described in §22.1. Existing AP-238/AP-239/AP-240 facts
remain visible in the table instead of being silently relabelled exact.
This chunk does not change FIFO classification/token granularity, portal or terrain ordering, building-degrade selection, visibility/membership, directional-shadow caster selection, #469's lighting-direction transition, or #470's general ordered atmospheric sidecar/receiver defect. It must implement the same material arithmetic in the atmospheric shader so the later #470 repair cannot expose a second result. No graphical client is launched by the implementer.
Allowed production scope is the prepared mesh batch/extractor/serializer and
bake-recipe identity; world GPU batch ABI and built-in ordinary/atmospheric
mesh shaders; Wb/EnvCell detail draw/pipeline ownership; shader compiler
outputs/manifest; and the smallest render-pack ABI pins required by those
shader changes. Tests may change for those surfaces, deterministic prepared
round trips, state/pixel equations, command transcripts, allocation, shader
ABI, and package compatibility. The only authorized documentation file in the
implementation commit is
docs/architecture/retail-divergence-register.md: strike AP-232 with the exact
new mechanism/evidence and amend counts; add or correct a row in the same
commit for every discovered surviving deviation. Do not edit this packet,
the plan, issues, architecture prose, scripts, or generated evidence reports.
22.4 Required proof, mutations, and return
Focused proof must include at least:
- independent CPU fixtures over nontrivial base/detail RGBA, diffuse colour,
authored opacity, live fade, fog, destination RGBA, and every §22.1 state;
they must distinguish
a*qA²froma*qA,base.a*a*qA², and today's two draws; - pure/paletted/DDS CLIP values immediately below, equal to, and above the
final-
Xreference plusTranslucent|CLIP's disabled-test override; - extraction and prepared serialization round trips for opacity 1, 0.75, 0.5, 0.25, and 0, a bumped recipe identity, deterministic bytes, and clear rejection of recipe 8 by the recipe-9 build;
- GPU ABI pins proving the batch scalar reaches both ordinary and atmospheric fragments, detail-off never samples the category texture, and debug-light mode stays independent;
- real Wb classic, walk-ordered, immediate-alpha, and delayed-alpha command recordings proving one detail-active subset draw, original pipeline state, exact slot/tiling/material alpha, no replay, and no stale detail arm on an adjacent ordinary draw;
- real EnvCell opaque, Alpha, Additive, and both CLIP-reference recordings with the same one-draw/state/order proof;
- production ordered sequence ordinary → opaque building detail → ClipMap building detail → ordinary with exact one-draw adjacency and no added terrain flush, closing #471;
- active/inactive atmospheric receiver shader/pipeline recordings proving identical material equations while leaving #470's separate general repair boundary explicit;
- setting-off and unavailable-category identity, selected-surface override, sampler/mip, fog-after-combine, draw-id/transform-prefix, cull, and lifecycle/reset/revisit preservation; and
- warmed extraction-free draw/classification paths at 0 managed bytes after warmup, with no per-frame material lookup/table/allocation.
Sabotage and restore at least these mutations, recording the first failing
test/assertion for each in the implementation commit body: change X to
a*qA; multiply X by base alpha; test CLIP against base alpha or 0.05;
restore any second detail draw; bind straight alpha instead of the original
subset family; omit the walk-ordered detail arm; omit the atmospheric combine;
drop authored opacity during prepared serialization; and leave the detail push
fields armed for the following ordinary draw. Include one allocation sabotage
that builds a per-frame surface map and prove the 0-B pin catches it.
Implementer return: one clean commit; exact changed-file and line-count list;
all mutation first failures; git diff --check; Release solution build 0W/0E;
shader compilation plus manifest/SPIR-V validation; focused content/serializer,
renderer/state/pixel/command/allocation suites; official hermetic lane; and an
inclusive InstalledDat lane with every accepted nonpassing identity named. If
the package recipe changes, also return the exact deterministic bake command,
artifact identity/size, and compatibility result. No client run.
Sequential review 1 — retail/material/deviation fidelity: re-check the named and paired bytes, PREMODULATE semantics, squared alpha, every framebuffer and CLIP/Translucent row, authored opacity provenance, fog placement, AP-232 retirement, AP-238/239/240 preservation, and all retail-facing mutations. Sequential review 2 — architecture/production/gate honesty: one physical draw, all five production paths including #471, prepared-schema compatibility, no renderer DAT lookup or per-frame map, shader/pack ABI, state/order/reset, allocation, build/lane/artifact provenance, and at least three independently reproduced sabotages. Reviews run sequentially. Every code finding receives a bounded fix contract and narrow re-review; documentation-only findings may be corrected directly by the lead. At most ten c4 review passes may run; stop before an eleventh. Nothing lands or launches graphically until both lenses pass.
23. S5-c4 fix round 1 — production SetSurface state reaches the one-pass draw
23.1 Review result and independently re-verified retail boundary
Retail/material review pass 1/10 returned FAIL on clean implementation tip
91fb80de6e0f536819100890ebc218169070aadc. The shared one-pass material
equation is correct, but three production-state gaps make several §22 rows
model-only rather than rendered truth:
- production collapses raw
Additive,Alpha|Additive, andInvAlpha|Additiveinto oneTranslucencyKind.Additive/ VulkanSRCALPHA,ONEpipeline. Retail instead usesONE,ONE,SRCALPHA,ONE, andINVSRCALPHA,ONErespectively. EnvCell additionally chooses its rawIsAdditivebucket before the already-resolved translucent override and owns no inverse pipeline, so both ordinary inverse alpha andTranslucent|ClipMap|Additivecan reach the wrong base state; - building/Wb commands never set push
ParamB, so a detail-active ClipMap fragment falls back to0.05rather than retail's final-Xreference of100/255for paletted input or200/255for DDS/non-paletted input. The command also lacks the state needed for ClipMap combined with another blend family; and - both one-pass fragment families always apply fog, although retail disables fixed-function fog whenever the raw Additive bit is present, including a row whose later Translucent branch changes its blend family.
The existing RetailDetailTextureContractTests policy table did not expose
these failures: it omitted Additive-without-Alpha and
InverseAlpha-with-Additive, computed framebuffer results only through a CPU
oracle, and returned expected pipeline values without invoking extraction or a
production draw owner. EnvCellAlphaDrawSourceTests also synthesized
IsAdditive from the collapsed TranslucencyKind, unlike real extraction.
The lead independently re-read named
D3DPolyRender::SetSurface @0x0059C4D0 lines 425083–425303 and re-hashed the
paired executable and all four §22 ranges. The executable remains SHA-256
006FFEADC5D679C871497112A5BD1F87714D0E273E2166BAE5052DDE369297B1; the
four range hashes remain exactly those in §22.1. Paired bytes and named
pseudo-C agree:
- the Alpha arm selects
SRCALPHA,(Additive ? ONE : INVSRCALPHA); - the neither-Alpha-nor-InvAlpha arm selects
ONE,(Additive ? ONE : ZERO); - the InvAlpha arm selects
INVSRCALPHA,(Additive ? ONE : SRCALPHA); - ClipMap enables
GREATER_EQUALwith the palette/DDS reference while retaining a pre-existing blend family, except that a pure ClipMap suppliesONE,INVSRCALPHA; - the later Translucent branch forces every
Translucent|ClipMapcombination to straight alpha and disables its alpha test, but otherwise retains an established Additive or InvAlpha family; and - the raw Additive bit disables fixed-function fog independent of that later blend override.
For the review's nontrivial §22 fixture, X=0.11532 and
C=(0.3534682,0.2330118,0.5438054). Against
F.rgb=(0.17,0.37,0.71), retail raw Additive produces
(0.5234682,0.6030118,1.2538054), while the collapsed current pipeline
produces approximately (0.21076195,0.39687092,0.77271164);
InverseAlpha+Additive produces approximately
(0.48270625,0.57614088,1.19109376). The current 0.05 Wb ClipMap fallback
also lets X=0.11532 survive where retail rejects it at both real references.
The installed portal Surface census contains real Additive-only and
Alpha+Additive families, so the distinction is not synthetic.
23.2 Bounded production repair
Carry one immutable, deterministic resolved SetSurface material state from
the resolved source Surface at extraction time through TextureBatchData,
recipe-9 serialization, ObjectRenderBatch, grouping/ordered-command data, and
the exact Wb/EnvCell draw command. It must distinguish at least:
- opaque; straight alpha; alpha-additive (
SRCALPHA,ONE); raw additive (ONE,ONE); inverse alpha (INVSRCALPHA,SRCALPHA); inverse-additive (INVSRCALPHA,ONE); and pure ClipMap (ONE,INVSRCALPHA); - alpha test disabled, paletted
100/255, or DDS/non-paletted200/255; and - fixed-function fog enabled versus raw-Additive-disabled.
Resolve the complete precedence once from raw Surface.Type, actual texture
presence/palette class, and the later Translucent rule. Do not infer it later
from TranslucencyKind, IsAdditive, sampled alpha, texture-table identity,
or a renderer-side DAT lookup. TranslucencyKind remains the existing
queue/list-membership classification; the new state must not change the two
FIFO queues, AP-239 raw-mask residual, AP-240 ordinary-Gfx ClipMap placement,
or terrain/portal ordering.
For a detail-active Wb or EnvCell command, select the pipeline for that
resolved family, including new ONE,ONE and INVSRCALPHA,ONE Vulkan variants;
arm ParamB with the resolved final-X alpha-test reference when enabled; and
bypass post-combine fog exactly when the resolved state says raw Additive
disabled it. One explicit existing deviation remains binding: a pure-ClipMap
ordinary-Gfx/building Wb command keeps AP-240's immediate opaque/A2C pipeline
and placement while gaining the correct final-X ParamB; only EnvCell uses
retail's pure-ClipMap ONE,INVSRCALPHA pipeline. EnvCell must otherwise use
the resolved family rather than raw IsAdditive precedence and must have a
real inverse path. Combined ClipMap
families retain their blend factors and use the same final-X comparison;
the Translucent+ClipMap override uses straight alpha with the test disabled.
The ordinary and atmospheric shaders must implement the same fog decision.
Keep the §22.2 detail-off fragment arithmetic and its existing production
selection unchanged. If the smallest implementation cannot restrict a newly
exact state transition to the detail-active path without altering detail-off
rendering, stop and return the exact call/data reason rather than silently
expanding this fix round. Any now-proven detail-off raw-state mismatch that
therefore remains must receive a precise active deviation-register row in the
same implementation commit. AP-232 may retire only the old two-draw overlay
and the exact detail-active mechanism actually proved; remove its current
overclaim of complete framebuffer/ClipMap closure and none residual unless
the production evidence truly supports those words.
Do not change the correct shared w=a*qA, C, or X=a*qA*qA equations;
authored/live opacity multiplication; one-draw placement; #471's ordered arm;
geometry, transform, local sidecars, cull, selection, lighting, sampler/mips,
or debug-light bypass. Do not repair #469 or #470 here. Do not add a surface
dictionary, per-frame map/allocation, DAT query, second draw, overlay, terrain
flush, queue kind, or new ordering owner. Recipe identity remains 9 unless the
serialized byte shape must change incompatibly; if it does, advance the recipe
and every migration/compatibility pin together and return a fresh deterministic
bake.
Allowed production scope is the §22 prepared material chain and serializer;
the smallest exact material-state type; Wb/EnvCell batch/group/ordered data and
pipeline selection; GPU blend enum/mapping and required pipeline variants;
ordinary/atmospheric fragment state input; compiled SPIR-V and manifest; and
the directly affected render-pack validator/ABI. Tests may change only for
those production surfaces. The only documentation allowed in the
implementation commit is
docs/architecture/retail-divergence-register.md, including every required
correction/new row. Do not edit this packet, plan, issues, handoff, evidence,
or unrelated architecture prose.
23.3 Discriminating proof and mutation return
Replace the model-only claim with production extractor-to-command recordings for both Building/Wb and EnvCell, detail on and off, covering at minimum:
- Opaque, Alpha,
Alpha|Additive, Additive without Alpha, InvAlpha, andInvAlpha|Additive; - each applicable family with ClipMap, with both paletted and DDS reference
classes and final
Ximmediately below/equal/above the reference; Translucent,Translucent|Additive,Translucent|InvAlpha, and at leastTranslucent|ClipMap|Additive, proving the late override and independent fog disable; and- ordinary versus atmospheric selection with an adjacent non-detail command, proving no stale blend/reference/fog state.
Each detail-active row must prove one physical draw, source FIFO/order,
concrete production pipeline blend factors, depth write/test, alpha-test
enable/reference in push data, detail slot/tiling, emitted (C,X), fog choice,
and framebuffer result on the §23.1 destination. Each detail-off row must prove
the current logical path was not changed. Use a real extracted fixture or the
same production construction seam extraction uses; do not set IsAdditive or
the resolved state from the expected TranslucencyKind in the fixture.
Round-trip and equality tests must prove every new state bit survives prepared
serialization and reaches both ObjectRenderBatch consumers.
Apply and independently restore at least these additional mutations, recording the first failure in the fix commit body:
- collapse raw Additive back to
SRCALPHA,ONE; - collapse InverseAlpha+Additive to either existing additive pipeline;
- remove EnvCell's inverse-family selection;
- restore raw
IsAdditiveprecedence over the Translucent+ClipMap override; - zero Wb
ParamBfor a paletted row and separately substitute0.05for a DDS row; - remove alpha testing from an Alpha+ClipMap combined row;
- always fog a raw-Additive row; and
- disable fog from a non-Additive row.
The original ten §22 mutations remain green and restored. Return one clean fix
commit atop 91fb80de6; exact file/line counts; git diff --check; Release
solution 0W/0E; shader compilation and manifest/SPIR-V validation; focused
content/serialization, production renderer/state/pixel/command/allocation and
GPU mapping suites; the official hermetic lane; and inclusive InstalledDat
with every accepted nonpassing identity named. No client launch.
Retail/material narrow re-review is pass 2/10 and must independently reproduce the raw-state mappings, CLIP reference, fog rule, register truth, and at least three new mutations. Only after it passes may the full production/gate-honesty lens run. Nothing lands or launches graphically before both lenses pass.
24. S5-c4 fix round 2 — alpha-tested blend families write depth
24.1 Retail/material re-review pass 2/10
Retail/material re-review of clean fix-round-1 tip
70751ef0e81200282323c0b08c6c52f40036ecd9 returned FAIL on one
production state and one documentation-only correction. The reviewer and lead
independently reproduced the code finding against the named retail decomp and
paired executable:
D3DPolyRender::SetSurface @0x0059C4D0first selects the framebuffer blend family. Its ClipMap arm at0x0059C724..0x0059C761retains an already-selected blend family, except for the pure-ClipONE,INVSRCALPHAcase, and enablesGREATER_EQUALalpha testing with the palette/DDS reference;- after the later Translucent override, the normal depth-state arm at
0x0059C7EE..0x0059C801selects depth-write1whenever alpha testing is still enabled or blending is disabled, otherwise depth-write0; SetSurface @0x0059C85E..0x0059C866passes that byte toRenderDeviceD3D::SetDepthBufferMode @0x005A2D10; the callee at0x005A2D4B..0x005A2D6Estores the third argument asm_State.DepthWriteEnableand programs D3D render state0x0E; and- therefore Alpha+Clip, Alpha+Additive+Clip, raw Additive+Clip,
InvAlpha+Clip, and InvAlpha+Additive+Clip all retain their blend factors and
alpha reference with depth writes ON. The corresponding non-Clip blended
rows write no depth.
Translucent|ClipMapis also depth-write off because retail's late override disables its alpha test. Opaque and pure Clip remain depth-write on.
Fix round 1 instead creates all five blended Wb pipeline families with
depthWrite:false in WbDrawDispatcher.Rhi.cs and selects only by blend
family; EnvCell repeats the same collapse. Its three production-transcript
oracles also encode the false rule that only Opaque/pure Clip writes depth.
The result has the right blend, final-X cutoff, fog decision, and single-draw
position, but accepted blended+Clip fragments do not populate depth as retail
does.
Everything else audited in fix round 1 passed: the shared PREMODULATE RGB and
X=a*qA*qA result; 100/255 versus 200/255 final-X references; raw-Additive fog
suppression; Translucent precedence; actual texture/palette provenance;
recipe-10 state packing; Wb/EnvCell ordered state and reset; detail-off
invariance; and AP-238/AP-239/AP-240/AP-244 preservation. Clean exact-tip
evidence was also verified: focused App 242, Content 92, and Launcher 8 tests;
hermetic 16,959/16,959; inclusive InstalledDat 469 pass / the same documented
10 fail / 1 skip; and byte-identical 3/8-worker recipe-10 bakes with SHA-256
0D3194A3B834DC1E0DCF67647402723B30BD758A268B8E909EC737369B911FA7.
The register header in the fix commit says 160 active AP rows even though the
physical table and existing recount establish 161, and its AP-232 correction
temporarily overclaims exact combined-Clip state despite this depth mismatch.
24.2 Bounded production repair
On top of 70751ef0e, add/select a depth-write-ON variant of every blended
SetSurface family used by a detail-active alpha-tested command:
- Wb
StraightAlpha,AlphaAdditive, rawAdditive,InverseAlpha, andInverseAdditive, across both backbuffer/offscreen sample counts and the ordinary/atmospheric receiver pipeline sets; and - the same five families in EnvCell.
Select the depth-writing variant from the already-carried
RetailSetSurfaceMaterialState.AlphaTestEnabled, not from raw Clip bits,
TranslucencyKind, queue identity, a DAT lookup, or a second state owner. A
blend family with alpha testing disabled keeps its existing depth-write-OFF
pipeline. Preserve Wb pure Clip on AP-240's opaque/A2C pipeline and EnvCell pure
Clip on its existing ONE,INVSRCALPHA, depth-write-ON pipeline. Preserve the
late Translucent|ClipMap override on straight alpha, test disabled, depth
write off. Depth compare remains the existing world compare; this round changes
only the write-enable bit.
Do not change extraction, raw-state resolution, recipe-10 bytes, grouping or
FIFO membership, draw count/order, ParamB, detail slot/tiling, fog flag,
shared material equations, shader discard/equality behavior, geometry,
transforms, local sidecars, cull, lighting, sampler/mips, #469, or #470. Do not
add a per-frame allocation, map, DAT query, second draw, or overlay. Dispose
every new pipeline in all ordinary/atmospheric and sample-count owners, with
the existing partial-construction rollback behavior intact.
Correct the AP header to the physical 161-row count and narrow the AP-232
correction so it does not claim combined-Clip depth exactness until this fix is
present. No new deviation row is needed: this is a required correction, while
AP-240 and AP-244 remain the disclosed placement/detail-off residuals. The only
documentation permitted in the implementation commit remains
docs/architecture/retail-divergence-register.md.
Allowed production scope is Wb/EnvCell pipeline-set construction, exact material-pipeline selection and disposal. Tests may change only for the directly affected production pipeline/state transcripts. No shader/SPIR-V, prepared-data, recipe, queue, routing, or unrelated documentation change is authorized; if one proves necessary, stop and return the exact reason.
24.3 Discriminating proof and review return
Correct the three false depth-write oracles and prove actual production pipeline descriptors, not a parallel policy model, for both Wb and EnvCell:
- all five blended families with ClipMap/paletted or DDS alpha testing select their exact blend factors, existing cutoff, and depth-write ON;
- the same five families without alpha testing select the same factors and depth-write OFF;
Translucent|ClipMapselects straight alpha, test disabled, depth-write OFF;- Wb pure Clip still selects its opaque/A2C, depth-write-ON AP-240 path, while
EnvCell pure Clip still selects premultiplied
ONE,INVSRCALPHA, depth-write ON; and - ordinary versus atmospheric Wb and an adjacent non-detail command select the same write rule without stale pipeline/reference/fog state.
Apply and independently restore at least these mutations, recording each first discriminating failure in the fix commit body:
- collapse one Wb blended+Clip row back to its depth-write-OFF variant;
- collapse a different EnvCell blended+Clip family to depth-write off;
- incorrectly select depth-write ON for the corresponding non-Clip blend; and
- incorrectly make the late
Translucent|ClipMapoverride write depth.
Return one clean fix-round-2 commit atop 70751ef0e; exact file/line counts;
git diff --check; Release solution 0W/0E; focused Wb/EnvCell material,
pipeline-descriptor, ordered/atmospheric, disposal/rollback, allocation, shader
invariance, and register-count tests; official hermetic lane; and inclusive
InstalledDat with every accepted nonpassing identity named. The recipe remains
10, so no fresh bake is required unless an unauthorized prepared-data change
is discovered. No graphical client launch.
Retail/material narrow re-review is pass 3/10 and must independently reproduce the depth-write rule from the paired binary, inspect real production pipeline descriptors, verify AP truth, and reproduce at least three new mutations. Only after it passes may the full production/gate-honesty lens run over the complete S5-c4 stack. Nothing lands or launches graphically before both lenses pass.
25. S5-c4 fix round 3 — restore classic/private detail-off state
25.1 Full production review pass 4/10
Retail/material re-review pass 3/10 returned PASS on clean fix-round-2 tip
472dc4fb7fd246a6efe6ed4ed20ffc26419c9ffa. It independently re-derived the
Clip/depth-write rule from named D3DPolyRender::SetSurface @0x0059C4D0 and
paired bytes, inspected all ordinary/atmospheric Wb and EnvCell pipeline
descriptors, reproduced three mutations, and found no retail/material issue.
The subsequent full production/gate-honesty review returned FAIL on one P2
regression and no other code finding. Before c4,
DrawImmediateTransparentRhi always bound pipelines.AlphaBlend for the
classic grouped path's non-detail transparent commands and coalesced adjacent
non-detail commands without a blend-family split. C4 instead binds
PipelineForBlend(pipelines, blend) and adds Translucency equality to that
run boundary. This changes detail-disabled/unavailable Additive and InvAlpha
compositing and splits a previously coalesced run.
This is reachable production behavior, not a dead compatibility arm:
PrivateEntityViewportRenderer.Draw calls the classic dispatcher without a
collecting world-alpha queue, which reaches
ExecuteClassifiedGroups -> SubmitRhi -> DrawImmediateTransparentRhi.
The reviewer drove that exact path with detail disabled and one ordinary
instance. Additive expected wb-mesh-alpha-1x but recorded
wb-mesh-additive-1x; InvAlpha expected wb-mesh-alpha-1x but recorded
wb-mesh-inverse-1x. Each case issued exactly one physical MDI. Temporarily
changing only the false arm back to pipelines.AlphaBlend made both witnesses
pass, and the reviewer restored the worktree byte-exactly afterward.
The rest of the complete-stack audit passed: opacity and immutable material
state reach recipe-10 publication and every consumer; the 16-byte GPU batch
ABI, shared shaders, one-pass equations, overlay deletion, #471 ordered arm,
all five depth-write pairs, disposal/rollback, allocation, migration and
artifact provenance are sound. Restored focused suites passed App 265/265,
Content 92/92, and Launcher 8/8. The exact-tip hermetic artifact is
16,964/16,964 with manifest 32/32; InstalledDat is the unchanged documented
469 pass / 10 accepted fail / 1 accepted skip with manifest 30/30. The scratch
worktree returned clean at 472dc4fb7.
The review also corrected the chunk boundary: c4 necessarily repairs the
receiver half of #470 by selecting the frame-aware atmospheric ordered
pipeline and binding its receiver resources. That is valid support for the
required atmospheric one-pass path and must remain. #470 stays open because
mesh_modern.vert still uses the absolute transform index for locally based
alpha/selection/light/detail sidecars. Describe #470 as narrowed at landing;
do not claim c4 left all of it untouched or closed it.
25.2 Bounded production repair
On top of 472dc4fb7, restore the pre-c4 detail-off behavior in
DrawImmediateTransparentRhi only:
- when the current command has no active detail material, bind
pipelines.AlphaBlendregardless of itsTranslucencyKindor carried raw SetSurface state; - restore the prior coalescing rule for consecutive non-detail transparent
commands: do not split a run merely because
TranslucencyKindchanges; when detail is enabled, the next detail-bearing command remains a boundary; - keep each detail-active command on the exact
PipelineForMaterial(pipelines, materialState, pipelines.Opaque)result, armed once on its existing physical draw, with neutral push state restored afterward; and - preserve cull-run splitting inside
DrawIndirectRangeRhi; this repair restores only the outer material-run boundary that c4 changed.
Do not generalize this into a detail-off retail correction. AP-244 remains the truthful disclosure for the existing detail-off Wb/EnvCell collapses. Do not change deferred-alpha submission, ordered-stream submission, EnvCell, extraction, recipe 10, GPU batch ABI, shaders/SPIR-V/manifest, blend enums or pipeline construction, alpha-test/depth/fog/reference state, queue membership, FIFO order, transforms/sidecars, lighting, allocation ownership, #469, or the remaining #470 sidecar-index repair. In particular, retain c4's frame-aware ordered receiver selection/bindings.
Allowed production change: only
src/AcDream.App/Rendering/Wb/WbDrawDispatcher.Rhi.cs. Tests may change only
in the directly affected existing Wb production-transcript suite. No register
change is expected because this restores the disclosed prior behavior; if a
new deviation or wider production dependency is discovered, stop and return
the exact fact before expanding scope. No packet, plan, issue, architecture,
package, artifact, or evidence file is changed by the implementer.
25.3 Discriminating proof and return
Add permanent tests through the actual classic production path, without a collecting alpha queue:
- with detail disabled, one Additive and one InvAlpha ordinary instance each
bind
wb-mesh-alpha-1xand issue exactly one physical MDI; - with the detail category unavailable, the same two rows retain that result;
- adjacent same-cull Alpha -> Additive -> InvAlpha detail-off commands remain one outer material run/MDI range rather than three blend-family runs;
- detail enabled with an eligible command still selects its exact carried detail-active material pipeline and arms slot/tiling/reference/fog once;
- non-detail -> detail -> non-detail adjacency does not leak detail state and preserves the two required boundaries; and
- existing deferred-alpha, ordered ordinary/atmospheric, EnvCell, depth-pair, disposal/rollback, allocation, shader/ABI and recipe-10 pins remain green.
Apply and independently restore these mutations, recording the first failing test/assertion for each:
- restore
PipelineForBlend(pipelines, blend)on the non-detail arm; - restore the
TranslucencyKindequality run split while leaving the pipeline arm correct; and - force the detail-active command onto
pipelines.AlphaBlend.
Return one clean fix-round-3 commit atop 472dc4fb7; exact changed-file and
line counts; mutation first failures; both git diff --check forms; Release
solution build 0W/0E; focused classic/private material and complete affected
Wb/EnvCell/ordered/content/launcher suites; exact-tip clean official hermetic
and inclusive InstalledDat artifacts with manifests and every accepted
nonpassing identity named. Recipe 10 is unchanged, so no bake is required. No
graphical client launch.
Because this repair restores a production-only frozen detail-off path and changes no retail/material fact, the next review is the narrow production/ gate-honesty pass 5/10 over this finding and its non-change boundary; no new retail lens is required. A PASS unlocks landing the complete c4 stack and its lead graphical gate. A FAIL receives another bounded contract within the owner-authorized ten-pass limit. Nothing lands or launches before that result.
26. S5-c4 landing, review closeout, and lead graphical gate — 2026-09-05
S5-c4 is LANDED + REVIEW-CLOSED. The reviewed scratch stack maps to the campaign branch as follows:
- one-pass detail material
91fb80de6->75664805f; - resolved SetSurface material state
70751ef0e->15ed57a1e; - alpha-tested blended depth-write variants
472dc4fb7->d5cfd1c91; and - classic/private detail-off restoration
db8136448->03a108ffa.
Retail/material pass 3/10 returned PASS after independently checking the named decomp, paired executable/PDB bytes, all five blend families, Clip references, Translucent override, fog, depth-write rule, real descriptors, register truth, and three mutations. Full production pass 4/10 found only §25's reachable classic/private detail-off regression. Fix round 3 changed exactly one production method plus its real-path transcript tests. Narrow production pass 5/10 reproduced all three mutations and returned PASS with no finding. C4's frame-aware ordered receiver selection/binding is retained; #470 is narrowed, not closed, because the ordinary shader's local-sidecar index is still wrong.
The campaign src/tests tree at 03a108ffa is byte-identical to reviewed
scratch db8136448. Fresh campaign verification passed: Release solution build
0 warnings / 0 errors; focused App material/ordered/EnvCell/shader suite
245/245; focused Content extraction/serialization/package suite 71/71. The
authoritative scratch artifacts remain exact, clean db8136448: hermetic
16,971/16,971 with manifest 32/32; InstalledDat 469 pass / the unchanged ten
accepted failures / one accepted skip with manifest 32/32.
Because the existing self-gate package was recipe 8, the lead did not launch
against stale prepared content or overwrite it. A separate full recipe-10 bake
from the campaign Release binary completed in 30.8 seconds with zero failures:
2,237,865 keys, 786,891 physical blobs, 597,482,264 bytes, SHA-256
4E0FA6C589ECE12E13099A56385077964961EC52F888BC9161C6F5D34829B59B.
It is
artifacts/s5-c4-recipe10-full-20260905/acdream.pak; header format 2 / recipe
10, TOC count 2,237,865. The gate session points only at this separate package.
The lead graphical gate is PROVISIONAL PASS pending owner inspection.
Before launch, ACE was listening on UDP 9000 as ACE.Server.exe PID 13340;
neither acdream nor retail client was running; the campaign worktree was clean;
and the Release build above was green. Exactly one Release client ran
tools/overhaul-selfgate/route-g3.txt with Building Detail Textures enabled
and the High atmospheric pack. It exited 0 through the route's own
close-client, logged graceful logout confirmed, and left no client process.
The log contains no fatal, unhandled, device-lost, or validation failure.
Evidence root:
logs/selfgate-20260905-020703-s5c4-onepass-detail.
All 13 requested 1024x768 PNGs were produced:
artifacts/screenshots/00-login.png;artifacts/screenshots/01-cathedral-stairs.png;artifacts/screenshots/02-facility-stairs.png;artifacts/screenshots/03-holtburg-house.png;artifacts/screenshots/04-holtburg-terrain-leak.png;artifacts/screenshots/05-cathedral-south-0106.png;artifacts/screenshots/06-cathedral-south-0104.png;artifacts/screenshots/07-cathedral-stairs-0107.png;artifacts/screenshots/08-cathedral-stairs-0112.png;artifacts/screenshots/09-cathedral-terrace-edge.png;artifacts/screenshots/10-facility-015E.png;artifacts/screenshots/11-facility-015F.png; andartifacts/screenshots/12-nanto-falls.png.
Lead inspection finds detailed cathedral, Facility, Holtburg, terrain, and
waterfall surfaces present; the player and expected shells/slabs/props remain
whole; and no new double-draw ghost, alpha/depth inversion, stale detail arm,
terrain bleed, or missing waterfall is visible. The separate known #469
lighting transition and #470 local-sidecar defect remain G4 blockers and are
not waived by this scope gate. #471 is closed by the ordered one-pass arm.
Nothing has merged to main.
27. S5-#470 contract — split shared transform and local sidecar indices
27.1 Lead-verified production boundary
This is a modern Vulkan ownership/indexing repair, not a new retail algorithm. No AC-specific material, lighting, visibility, or ordering fact changes. The named-retail facts already carried by the existing light/opacity/selection ports remain untouched; the paired retail binary has no analogue for acdream's shared Vulkan frame-ring layout.
The production defect is exact and bounded:
PrepareOrderedStreamwrites this stream's transforms throughWriteWorldTransformSection, which appends them to the shared directional-shadow/world transform arena and returns a possibly nonzerotransformBaseInstance.WriteIndirectCommandsadds that prefix to every indirect command'sBaseInstance, andDrawOrderedRangepublishes the same prefix inGpuPushConstants.TextureIndexB.- The alpha, selection-lighting, per-instance light-set, indoor, detail, and dormant clip-slot sections are separate ring sections whose descriptor offsets already point at element zero for this ordered submission.
mesh_atmospheric.verttherefore correctly names two indices: absolutetransformIndex = gl_BaseInstanceARB + gl_InstanceID, and localinstanceIndex = transformIndex - int(uTextureIndexB). It reads only the transform with the former and every live per-instance sidecar with the latter.mesh_modern.vertinstead uses the absolute value asinstanceIndexfor both domains. Any nonzero transform prefix therefore reads beyond or into unrelated local sidecar elements. This affects the ordinary ordered path; S5-c4 already repaired and proved atmospheric receiver selection/binding.
The batch array is a third, already-correct domain indexed by
uDrawIDOffset + gl_DrawIDARB; the global-light array is indexed by values
stored in the local light-set sidecar. The clip-slot buffer is still bound and
written but no world shader reads it after S3; do not reintroduce a clip read
or use its dead payload to justify wider work.
27.2 Bounded production repair
Make mesh_modern.vert use the same explicit split as
mesh_atmospheric.vert:
- add/read the existing push member as
uniform uint uTextureIndexB; - compute absolute
transformIndexfrom base-instance plus instance-id; - compute local
instanceIndexby subtractinguTextureIndexB; - index
Instances[]only withtransformIndex; and - index alpha, selection lighting, indoor, the eight-entry light-set, and
detail category only with
instanceIndex.
Correct the two shaders' comments so they describe the shared-transform/local- sidecar ownership rather than claiming that every buffer uses an identical index. Recompile the committed shader set and update only the generated SPIR-V and manifest/hash pins that the source change requires.
Do not change PrepareOrderedStream, ring-allocation ownership, descriptor
offsets, indirect command construction, push-constant ABI/size/offsets,
pipeline choice, atmospheric receiver binding, render-pack policy, SetSurface
state, detail equations, alpha queues/FIFO order, walk stages, batching, cull,
depth, blend, fog, transforms, sidecar contents, texture/batch indices,
geometry, DAT/package recipe, #469 lighting direction, or any unrelated
renderer. Do not add a second data owner, copy the local sidecars into the
shared transform arena, zero the transform prefix, special-case atmospheric
mode, or add a per-frame allocation. No divergence-register row is expected:
this restores intended production indexing without changing retail-visible
policy. If any wider production change proves necessary, stop and return the
exact dependency before expanding scope.
Allowed production scope is the ordinary vertex shader plus regenerated shader outputs. Tests may add the smallest production-path recording and offscreen proof needed below. The implementer changes no packet, plan, issue, architecture, package, gate artifact, or campaign memory file.
27.3 Discriminating proof and review return
Add permanent proof that fails on the pre-fix shader and exercises the real ordered preparation/draw seam:
- deliberately consume enough shared frame-ring transform space before
PrepareOrderedStreamthat its transform prefix is nonzero; - record two ordered instances with deliberately distinct transform, alpha, selection-lighting, light-set, indoor, and detail values;
- assert the uploaded indirect commands carry the nonzero absolute
BaseInstance, the push block carries that exact prefix, and each local sidecar descriptor section still begins at its own element zero; - compile/inspect the production ordinary SPIR-V and prove the source/ABI has one absolute transform lookup and local lookup for every live sidecar;
- add an offscreen pixel witness through the production ordinary shader at a nonzero transform prefix. Its two instances must encode distinguishable sidecar-driven output so using the absolute index for either domain changes the readback; a source-string-only or parallel-policy oracle is not this witness; and
- prove active and inactive directional-shadow receiver states still select and bind the same ordinary/atmospheric pipelines as before.
Apply and independently restore at least these mutations, recording the first discriminating failure for each in the commit body:
- make the transform lookup use local
instanceIndex; - make at least one live local sidecar lookup use absolute
transformIndex; - omit or zero the pushed transform prefix while keeping the shader split;
- force the inactive receiver state onto the atmospheric pipeline, then force the active receiver state onto the ordinary pipeline; and
- point the offscreen witness at a copied/test shader instead of the committed production ordinary SPIR-V.
Return one clean implementation commit atop this contract; exact changed-file
and line counts; all mutation first failures; both git diff --check forms;
Release solution build with zero warnings/errors; focused ordered-stream,
receiver, shader ABI/manifest/SPIR-V, offscreen, allocation, material, and
render-pack tests; official hermetic lane; and inclusive InstalledDat with all
accepted nonpassing identities named. Recipe 10 and prepared content are
unchanged, so no bake is required. No graphical client launch.
Review stays sequential. Retail/behavior pass 1/10 first verifies that no retail-visible algorithm or state changed, the existing named-retail sidecar meanings remain intact, and the proof actually distinguishes both index domains. Only after PASS does production/gate-honesty pass 2/10 inspect the complete data/descriptor/push/SPIR-V path, reproduce at least three mutations, and rule on gate sufficiency. A failed pass receives a bounded fix contract; the owner-authorized ceiling is ten review passes. Nothing lands or launches graphically before both lenses pass.
28. S5-#470 fix round 1 — keep the hardware witness out of the portable lane
28.1 Retail/behavior review pass 1/10
Review of clean implementation 51f974da4f2262e6afdd336774326f29fb2aec33
returned FAIL on one blocking gate-portability defect and found no renderer,
retail-behavior, shader, descriptor, or proof-mechanism defect.
The production repair is correct: the ordinary shader uses the absolute
base-instance domain only for Instances[], subtracts the exact pushed prefix
for all five live local sidecar bindings, preserves draw-ID batch indexing and
global-light indirection, and regenerates the committed module exactly. The
reviewer reproduced the compiled SHA-256
6194193764616BC88BF967D1FDC2BEA5F6F2D1EC2EF94FD492922137503F56E4,
ran the production headless Vulkan witness successfully, and independently
restored mutations to both index domains. The named-retail sidecar meanings
and paired-binary anchors are unchanged.
The defect is test placement. MeshModernSharedIndexOffscreenTests is an
ordinary untagged Fact, so tools/run-release-gate.ps1 includes it in the
complete portable Release lane. It unconditionally needs a Vulkan loader,
1.3-capable physical device/graphics queue, and coherent host-visible readback
memory. The reviewer forced a nonexistent ICD and reproduced a hard
vkCreateInstance ErrorIncompatibleDriver, not a skip. GitHub's
complete-release Windows runner installs none of those prerequisites; only
the existing linux-vulkan job installs lavapipe. Consequently the local
16,975-pass artifact is hardware-conditioned and cannot be credited as a
portable hermetic gate until the witness has an explicit capability lane.
28.2 Bounded evidence-lane repair
Keep every byte of the renderer, GLSL, SPIR-V, manifest, command-recording proof, SPIR-V structural proof, and hardware witness logic unchanged. Change only its ownership and execution:
- mark the offscreen witness with one explicit
Lane=Vulkantrait; - exclude
Lane=Vulkanin the default filter oftools/run-release-gate.ps1, alongside the existing platform/capability lanes, so a machine with no Vulkan loader/device can run the truthful portable gate; - split the existing
linux-vulkantest step into the platform-independent Vulkan tests (FullyQualifiedName~...Gpu.Vk&Lane!=Vulkan) and a separately namedLane=Vulkanstep after lavapipe installation. The latter must run the real offscreen test and fail on absence or render/readback mismatch; do not turn missing capability into a pass; and - update
docs/release-gate.mdnarrowly to name the Vulkan lane, its required capability, its portable exclusion, the existing lavapipe CI owner, and the exact local command for running it.
Add a small contract test that reads the real test source, portable-gate script, and headless-portability workflow and fails if any of the three sides drift: the hardware witness loses its trait, the portable filter admits it, or the lavapipe job stops invoking it explicitly. This test itself stays portable and must not initialize Vulkan.
No product source, shader/generated output, test project option, recipe,
package, register, issue, plan, campaign packet beyond this lead-owned section,
or unrelated workflow/tool/doc changes are permitted. No dynamic success on
missing hardware, broad Gpu.Vk exclusion, OS-name proxy, environment-only
hidden gate, duplicated pixel oracle, copied shader, or second witness. No
graphical client launch.
28.3 Proof and narrow re-review
Apply and restore these mutations, recording the first failure in the fix commit body:
- remove the witness's
Lane=Vulkantrait; - remove
Lane!=Vulkanfrom the portable Release filter; - remove or weaken the explicit lavapipe
Lane=Vulkaninvocation; and - point the dedicated invocation at a class/name filter that could miss the trait-owned witness.
Return one clean fix-round-1 commit atop 51f974da4; exact changed-file and
line counts; all mutation first failures; both diff-check forms; the portable
contract test; the explicitly filtered Lane=Vulkan test on the current
physical device; Release solution build 0W/0E; a new clean official portable
hermetic artifact (the Vulkan witness excluded); and inclusive InstalledDat
with every accepted nonpassing identity named. The original exact-tip
hardware result remains supporting evidence, but the fixed exact tip must run
the dedicated lane again. No bake or graphical gate.
Because pass 1 found no renderer or retail-behavior defect, the next review is a narrow retail/gate-honesty re-review pass 2/10 of this one finding. It must reproduce at least mutations 1–3, prove the ordinary portable suite no longer depends on Vulkan, and prove the dedicated local and lavapipe routes cannot silently omit or pass the hardware witness. A PASS unlocks the full production review as pass 3/10; a FAIL receives another bounded contract within the ten- pass ceiling. Nothing lands or launches before both sequential lenses pass.
29. S5-#470 fix round 2 — make the pixel readback host-visible
29.1 Review result through pass 3/10
Fix-round-1 scratch tip 2cad9c84c7508f714823d2bd44199071ac8d74f7
passed the narrow retail/gate-honesty re-review at pass 2/10. The reviewer
proved the five-file change was evidence-only, ran the portable
Gpu.Vk&Lane!=Vulkan set successfully with an invalid ICD, ran the exact
Lane=Vulkan witness successfully on the current AMD device, proved the same
dedicated lane fails rather than skips with an invalid ICD, and reproduced the
trait, portable-filter, and dedicated-workflow mutations. The renderer, GLSL,
SPIR-V, manifest, and witness body remained byte-identical to implementation
51f974da4.
Full production/gate-honesty review pass 3/10 then returned FAIL on one P2
test-harness synchronization defect only. It found no renderer, descriptor-
domain, shader, lane-ownership, allocation, or production-path defect. In
MeshModernSharedIndexOffscreenTests.ReadBack, the image-to-buffer copy is
followed by command-buffer completion, QueueWaitIdle, mapping, and a CPU
read, but there is no device memory dependency from the transfer write to the
host read. Host-coherent memory removes the need for invalidation; it does not
make a transfer write available/visible to the host. Queue-idle/fence
completion likewise does not replace that dependency. The locally passing
pixel witness may therefore read stale data on another conformant device.
The review independently restored both shader index-domain mutations and the
lane-trait mutation, regenerated exact ordinary shader SHA-256
6194193764616BC88BF967D1FDC2BEA5F6F2D1EC2EF94FD492922137503F56E4,
passed the restored focused portable set 363/363, the dedicated witness 1/1,
the invalid-ICD portable structural/ownership set 2/2, and a Release build at
0 warnings / 0 errors. Both official manifests verify 30/30. The exact
hermetic artifact is 16,975/0/0. The exact InstalledDat artifact used the
canonical-inclusive filter Lane=InstalledDat&Purpose!=Diagnostic and is
386 passed / the unchanged 10 accepted failures / 1 accepted skip; it is not
the broader diagnostic-inclusive 469-pass lane.
29.2 Bounded harness-only repair
Change only the offscreen witness and its smallest test-side proof. Immediately
after CmdCopyImageToBuffer and before EndCommandBuffer, record one
CmdPipelineBarrier2 whose actual BufferMemoryBarrier2 covers the readback
buffer and exact copied byte range:
- source stage
CopyBit, source accessTransferWriteBit; - destination stage
HostBit, destination accessHostReadBit; - both queue-family indices
QueueFamilyIgnored; - offset zero and size equal to the mapped/copied byte count; and
- the exact readback buffer handle.
Keep QueueWaitIdle, the host-visible/coherent allocation, map/unmap, copy
geometry, render submission, pixel oracle, physical-device selection, and
cleanup unchanged. Do not add an invalidate call to coherent memory, a second
submission/fence, a staging owner, a production RHI helper, a device-specific
workaround, or a skip/pass on unavailable Vulkan. Do not change renderer
source, GLSL, SPIR-V, manifests, lane ownership, workflow, release-gate tool or
documentation, package/recipe, issue/register policy, or graphical behavior.
Add a portable, no-Vulkan-initialization guard over the live readback path. It must inspect the actual barrier descriptor and prove every stage/access, queue-family, buffer, offset, and size value above, and it must prove the live command order is copy -> that barrier -> end/submit. A source-only assertion that can be satisfied by an unused lookalike descriptor is insufficient.
29.3 Fix return and narrow production re-review
Apply and restore at least these mutations, recording the first discriminating failure for each in the fix commit body:
- remove the post-copy host-read barrier from the live readback path;
- change either side of the dependency (for example
TransferWriteBittoTransferReadBit, orHostReadBittoHostWriteBit); and - move the otherwise-correct barrier before
CmdCopyImageToBuffer.
Return one clean fix-round-2 commit atop 2cad9c84; exact changed-file and
line counts; mutation first failures; both diff checks; the portable
descriptor/order guard; the exact dedicated Lane=Vulkan witness on the
current device; focused structural, recording, receiver, lane-ownership, and
Vulkan-portable tests; Release solution build 0W/0E; a clean exact-tip
portable hermetic artifact; and canonical-inclusive InstalledDat with all ten
accepted failures and the one accepted skip named. No bake or graphical
client launch.
Because pass 3 found no production renderer or retail-behavior defect, only a narrow production/gate-honesty re-review runs next as pass 4/10. It must inspect the live recorded dependency and order, reproduce mutations 1–3, rerun the dedicated witness, verify the prior index-domain and lane-ownership proofs remain intact, and verify exact clean artifact provenance. A PASS unlocks landing and the pinned graphical A/B. A FAIL receives the next bounded contract within the owner-authorized ten-pass ceiling. Nothing lands or launches before PASS.
30. S5-#470 landing, review closeout, and lead graphical A/B — 2026-09-05
S5 issue #470 is LANDED + REVIEW-CLOSED. Reviewed scratch implementation
51f974da4, evidence-lane fix 2cad9c84, and readback-barrier fix
98c004aa7 map to campaign commits 15a796c3a, 7506e5f14, and
b333edb4f. Lead contracts are campaign 67a8bc21f, 011ab1c18, and
56837f547; fixed-pose gate route commit is 19b44e5e3.
Retail/behavior pass 1/10 found no renderer or retail-policy defect and found the hardware witness incorrectly owned by the portable lane. The evidence- lane repair then passed narrow pass 2/10. Full production pass 3/10 verified the complete transform/sidecar/descriptor/push/SPIR-V path but found one P2 in the witness: coherent memory plus queue idle did not replace a transfer-write to host-read dependency. Fix round 2 added that exact live buffer barrier and a portable descriptor/order guard. Narrow production pass 4/10 returned PASS with no remaining finding, independently reproduced all three barrier mutations, ran the physical pixel witness, and confirmed every renderer/shader/lane byte outside the bounded stack stayed unchanged.
Exact reviewed evidence at scratch 98c004aa7:
- Release solution build 0 warnings / 0 errors;
- portable Vulkan set 228/228, ordered/receiver set 41/41, and physical
Lane=Vulkanwitness 1/1; - reviewer-focused Vulkan/transform/ordered/receiver set 258/258 and the restored witness 1/1;
artifacts/s5-470-fix2-hermetic-clean-98c004aa7: 16,976 passed / 0 failed / 0 skipped, exact clean tip, manifest 30/30; andartifacts/s5-470-fix2-installeddat-inclusive-clean-98c004aa7: canonicalLane=InstalledDat&Purpose!=Diagnostic, 386 passed / the unchanged 10 accepted failures / 1 accepted skip, exact clean tip, manifest 30/30.
Fresh campaign verification after integration: src, tests, workflow,
release-gate tool/doc, GLSL, generated SPIR-V, and shader manifest were
byte-identical to reviewed scratch; Release built at 0 warnings / 0 errors;
and the combined transform/sidecar, barrier, lane, ordered-stream, and receiver
set passed 48/48. No recipe or bake changed.
The lead graphical gate is PROVISIONAL PASS pending owner inspection. The
first launch attempt at
logs/selfgate-20260905-032058-s5-470-pinned-shadow-ab failed before the route
and produced zero PNGs because the default session named a stale recipe-8
package while the build requires recipe 10. It exited with the managed-
exception code, left no client, and is excluded from renderer acceptance.
The corrected one-run gate used the already verified recipe-10 package
artifacts/s5-c4-recipe10-full-20260905/acdream.pak, SHA-256
4E0FA6C589ECE12E13099A56385077964961EC52F888BC9161C6F5D34829B59B.
Before launch, Release was green, the campaign tree at 19b44e5e3 was clean,
ACE listened on UDP 9000 as PID 13340, and neither acdream nor retail client
was running. tools/overhaul-selfgate/route-s5-470-shadow-ab.txt established
the framebuffer and camera before acceptance, then captured retail/off -> High
-> retail/off without movement or resize. The run exited 0, confirmed graceful
logout, and left no client:
logs/selfgate-20260905-032132-s5-470-pinned-shadow-ab-r1/artifacts/screenshots/s5-470-retail-before.png;logs/selfgate-20260905-032132-s5-470-pinned-shadow-ab-r1/artifacts/screenshots/s5-470-high.png;logs/selfgate-20260905-032132-s5-470-pinned-shadow-ab-r1/artifacts/screenshots/s5-470-retail-after.png.
Lead inspection finds the player and ordinary scene geometry present in all
three frames with no disappearing/corrupted static, transform displacement,
alpha/selection/detail sidecar corruption, or failure to restore the retail
frame. High retains the separately registered #469 lighting-direction shift;
that known blocker is neither waived nor attributed to #470. #470 changes no
retail-visible policy and requires no divergence-register row. Next is #469,
then S5-c5, closeout, and G4. Nothing has merged to main.
31. S5-#469 contract — keep retail world lighting stable across the opt-in shadow gate
31.1 Lead-recovered retail and binary boundary
Issue #469 is not an ambiguous art-direction choice. Retail owns exactly one
outdoor directional-light channel, authored by SkyTimeOfDay; the atmospheric
pack's visible sun/moon choice is an acdream-only shadow-projection input and
must not replace that lighting channel.
The lead re-read the named retail decomp and its verbatim type header before writing this contract:
SkyTimeOfDaycontainsdir_bright,dir_heading,dir_pitch, anddir_color(acclient.hlines 53124–53137).SkyDesc::GetLighting @0x00500A80interpolates those fields between the two surrounding authored time-of-day records, constructs one directional vector, and returns one directional colour.LScape::set_landscape_lighting @0x005054D0copies that vector and colour toLScape::sunlightand thenRender::world_lights.sunlight; it has no shadow- gate or celestial-mesh selection input.PrimD3DRender::UpdateLightsInternal @0x0059AED0, specifically0x0059B4ED–0x0059B5CE, derives the D3D sunlight colour and direction from that sameRender::world_lights.sunlight. It does not replace the direction when any drawing feature is enabled or disabled.
The paired executable was independently verified again with
tools/pdb-extract/check_exe_pdb.py: C:\Users\erikn\Downloads\acclient.exe
is PE32 v11.4186, whole-file SHA-256
006FFEADC5D679C871497112A5BD1F87714D0E273E2166BAE5052DDE369297B1, CodeView
GUID {9E847E2F-777C-4BD9-886C-22256BB87F32}, age 1, and matches
C:\Users\erikn\source\repos\acdream\refs\acclient.pdb. Exact function-range
SHA-256 anchors are:
| Function | File range | Bytes | SHA-256 |
|---|---|---|---|
SkyDesc::GetLighting |
0x00100A80..0x00100CDF |
608 | 9D82E8EDDBD66C52DBD3F08D07D661482DB545C4F513E81AB4F16E4EDF410188 |
LScape::set_landscape_lighting |
0x001054D0..0x0010565F |
400 | DF3FD816845AE0F6E2423442A325CE43A44A8204E1B857D7674BBB8F4640D0CB |
PrimD3DRender::UpdateLightsInternal |
0x0019AED0..0x0019B5DF |
1,808 | E18FD7AD9A8EB819AB9602D25DE5D1BB99FADD1D439B35140E443EB1E0437F84 |
This agrees with the pre-existing static source study
docs/research/2026-08-22-dereth-celestial-shadow-sources.md: celestial meshes
supply only the opt-in shadow direction; colour and energy remain retail's
single authored channel; existing retail scene lighting remains driven by
SkyStateProvider.
The current atmospheric receiver shaders violate that declared boundary.
When shadow flag bit 0 is clear they use the plain pipeline's authored
-uLights[].dirAndRange.xyz; when it is set they abruptly use normalized
uShadowLightDirectionAndSource.xyz. Shadow strength is blended later, so this
binary vertex-light switch produces the whole-world relight captured in both
the exact parent and S5-c2 candidate A/Bs. It is not absent shadow work and it
is not caused by S5-c2.
31.2 Bounded production repair and IA-24 correction
Restore one stable lighting owner in both atmospheric vertex receivers:
mesh_atmospheric.vertcomputes every outdoor directional-lightLdirwith the exact plain-mesh expression-uLights[i].dirAndRange.xyzin every shadow-gate state. Preserve its unnormalized value and its per-light loop.terrain_atmospheric.vertcomputessurfaceToLightwith the exact plain- terrain expression-uLights[0].dirAndRange.xyzin every shadow-gate state. PreserveMIN_FACTOR, authored colour/energy, and the split directional varying used by the fragment receiver.- Delete the obsolete
shadowGatedOffbranches and replace their comments with the retail ownership above. - Keep
uShadowLightDirectionAndSourceunchanged for cascade projection, receiver depth/bias/PCF, and atmospheric volumetrics. The optional shadows may therefore be geometrically directed at the selected visible celestial source while the receiver's base lighting remains the authored retail direction. That separation is deliberate and was already the original IA-24 research boundary. - Recompile the committed shader set and update only the generated atmospheric vertex SPIR-V and manifest/hash entries required by those source changes.
- Amend IA-24 in the same implementation commit: remove its statement that
receiver lighting switches to the celestial direction while shadows render;
state instead that authored
uLightsremains the sole base-light direction in every gate state, while the selected celestial source drives only the opt-in shadow/volumetric projection. Explicitly record the possible visual light/shadow-angle separation as the cost of preserving retail lighting and eliminating the binary relight. This is the required deviation-register update; add no second row.
Do not change SceneLighting, SkyStateProvider, the celestial-source
resolver or its sun/moon priority, shadow strength/fades, cascade matrices,
shadow caster selection, receiver binding/descriptor ABI, fragment shadow
lookup, PCF/bias, volumetric policy, render-pack selection, plain shaders,
materials, fog, tone mapping, colour/energy, terrain MIN_FACTOR, indoor
lighting, point/spot lights, visibility, geometry, package recipe, or any
unrelated renderer. Do not normalize the authored direction, blend the two
directions, invent another runtime state owner, hide the switch behind a
threshold, or add per-frame work/allocation. If any wider production change is
needed, stop and return the exact dependency before expanding scope.
Allowed production scope is the two atmospheric vertex shader sources, their regenerated SPIR-V/manifest pins, and the IA-24 row. Tests may add only the smallest structural and real-shader proof below. The implementer changes no packet, plan, issue, package, gate artifact, architecture text outside IA-24, or campaign memory.
31.3 Discriminating proof, mutations, and return
Permanent proof must establish both halves of the boundary rather than merely matching a copied CPU formula:
- compile and inspect the committed production atmospheric vertex SPIR-V and
prove mesh and terrain take their diffuse-light direction only from the
corresponding authored
uLightsmember, with the exact unnormalized plain- shader expressions and no shadow-flag/celestial-direction selection; - exercise the committed production atmospheric receiver shaders in a real
offscreen Vulkan pixel witness for both mesh and terrain. Holding authored
light/material/geometry constant while toggling only shadow flag and
celestial direction must leave the unshadowed base directional-light result
invariant; choose inputs for which the pre-fix branch gives a different
pixel. The witness is explicitly
Lane=Vulkan, uses the existing dedicated lavapipe/local lane, and fails rather than skips when that lane lacks Vulkan; - prove the committed fragment receiver and volumetric shaders still consume
uShadowLightDirectionAndSourcefor opt-in shadow projection/bias/visibility, so the repair cannot silently disable or redirect shadows; - prove active and inactive receiver states still select/bind the same atmospheric/plain pipelines and descriptors as before;
- pin that neither plain shader source/SPIR-V nor any pipeline-selection or renderer source changed from the contract parent; and
- read the live IA-24 row and fail if it again claims celestial direction owns base receiver lighting or omits the explicit light/shadow separation.
Apply and independently restore at least these mutations, recording the first discriminating failure for each in the implementation commit body:
- restore the shadow-flag/celestial-direction branch in
mesh_atmospheric.vert; - restore it in
terrain_atmospheric.vert; - normalize either authored vertex-light direction;
- redirect a fragment shadow/volumetric use from the celestial source to the authored light, or remove its celestial-source read; and
- restore IA-24's old assertion that pack-active base lighting follows the celestial source.
Return one clean implementation commit atop this contract; exact changed-file
and line counts; all mutation first failures; both git diff --check forms;
exact shader compiler command and generated hashes; the dedicated physical
Lane=Vulkan result; focused atmospheric shader/receiver/manifest/source-
resolver tests; Release solution build with zero warnings/errors; official
hermetic lane; and canonical-inclusive InstalledDat with every accepted
nonpassing identity named. Recipe 10 and prepared content are unchanged, so no
bake is required. No graphical client launch.
Review is sequential. Retail/deviation pass 1/10 first verifies the three named-retail functions and paired bytes, the stable authored-light rule, IA-24 truth, pack-off preservation, and that the pixel/structural tests actually fail on both old branches. Only after PASS does production/gate-honesty pass 2/10 inspect the complete source-to-SPIR-V-to-pipeline path, run the real Vulkan witness, reproduce at least mutations 1–4, and rule on portable/dedicated-lane ownership and full gate sufficiency. A failed pass receives one bounded fix contract. The owner-authorized ceiling is ten review passes. Nothing lands or launches graphically before both lenses pass.
After landing, the lead repeats the exact fixed-pose retail/off -> High -> retail/off plus dusk transition used to file #469, with Release green, a clean tree, UDP/client preflight, one background command, and graceful self-owned shutdown. PASS requires no whole-world base-light jump as shadow work gates, while pack-active shadow direction/visibility still changes and the final retail frame restores. Record exact PNG paths; the result remains provisional until owner inspection.
32. S5-#469 landing, review closeout, and graphical transition — 2026-09-05
S5 issue #469 is LANDED + REVIEW-CLOSED. Contract 809887524; reviewed
scratch implementation c09b6cf0f; campaign implementation 94ddde69a; fixed-
pose route 62efc72cb.
The implementation removes the binary shadow-gate/celestial-direction branch
from both atmospheric vertex receivers. Mesh now always uses the exact
unnormalized -uLights[i].dirAndRange.xyz; terrain always uses the exact
unnormalized -uLights[0].dirAndRange.xyz. Fragment receiver shadow
projection/bias/PCF and atmospheric volumetrics continue to use the selected
celestial direction. IA-24 was amended in the same implementation commit to
record that ownership and its possible light/shadow-angle separation.
Retail/deviation review pass 1/10 returned PASS with no findings after
independently verifying SkyDesc::GetLighting,
LScape::set_landscape_lighting, and
PrimD3DRender::UpdateLightsInternal against the matching 2013 executable/PDB
and reproducing both old receiver branches plus the old IA-24 assertion.
Production/gate-honesty pass 2/10 returned PASS with no findings after
inspecting the complete source -> compiler -> SPIR-V -> pipeline/descriptor ->
pixel/readback path, independently reproducing all four code mutations, and
proving the dedicated Vulkan lane fails rather than skips without a driver.
Exact reviewed scratch evidence at c09b6cf0f:
- compiled 23/23 shader pairs; mesh vertex SPIR-V SHA-256
AB642649B055A564B49C088BEAC9601593508CAB69778B71719C66C9A812CD3Cand terrain vertex SPIR-V SHA-2567DE30E426401F637A28C1F1F8D69D1A465462AD7A5CEE1927FAE7E1BA5355B1F; - Release solution build 0 warnings / 0 errors;
- implementer-focused 64/64 and reviewer-focused 126/126;
- physical
Lane=Vulkan2/2, including the committed production mesh+terrain lighting witness; artifacts/s5-469-hermetic-c09b6cf0f: 16,983 passed / 0 failed / 0 skipped, exact clean tip, manifest 32/32; andartifacts/s5-469-installeddat-c09b6cf0f: canonicalLane=InstalledDat&Purpose!=Diagnostic, 386 passed / the unchanged ten accepted failures / one accepted skip, exact clean tip, manifest 30/30.
The lead independently rechecked the executable/PDB identity and all three
function-range hashes, inspected the production/test diff, reproduced the
generated hashes, and verified both artifact manifests with zero bad entries.
Fresh campaign verification after integration: Release 0 warnings / 0 errors;
focused atmospheric/receiver/manifest/source-resolver set 82/82; physical
Lane=Vulkan 2/2. Recipe 10 and prepared content are unchanged.
The lead graphical transition is PROVISIONAL PASS pending owner inspection
at clean 62efc72cb. Before launch, ACE listened on UDP 9000 as PID 13340 and
neither acdream nor retail client was running. One route used the verified
recipe-10 session, established authored time, 1024 x 768 framebuffer, and
camera before acceptance, then held pose/camera/framebuffer fixed across
retail/off -> High -> retail/off -> High and advanced the authored light once
for the final High frame. Run
logs/selfgate-20260905-040449-s5-469-lighting-transition-r1 produced five
PNGs, exited 0, confirmed graceful logout, emitted no fatal/validation match,
left no client, and left ACE running:
artifacts/screenshots/s5-469-noon-retail-before.png;artifacts/screenshots/s5-469-noon-high.png;artifacts/screenshots/s5-469-noon-retail-after.png;artifacts/screenshots/s5-469-noon-high-repeat.png; andartifacts/screenshots/s5-469-dusk-high.png.
Both High noon metadata rows prove active shadow work: 2,500 selected casters,
four cascades, 26 pack draws, no failure, and directional-shadow strengths
0.5429/0.5300. The dusk High row is likewise active and whole: 2,500 casters,
four cascades, 26 draws, strength 0.5760. Lead original-resolution inspection
finds the terrain, buildings, foliage, local player, equipment, and ordinary
sidecars present in every frame. The former near-black binary whole-world
relight is gone; the retail-before/after frames restore, while High retains its
expected shadows and post-processing. This closes #469; no new divergence row
is required beyond the truthful IA-24 amendment. Next is S5-c5, then closeout
and G4. Nothing has merged to main.
33. S5-c5 contract — delete the superseded visibility/probe apparatus and pin the final graph
This is a deletion-and-architecture chunk. It changes no retail draw decision,
no membership result, no event order, no alpha route, no material state, and no
shader. The retained production authority is the already-reviewed
RetailFrameWalk/WalkFrameDriver path. The work removes the independently
compiled research path and output-only diagnostics that can otherwise be
mistaken for production owners.
33.1 Lead-verified boundary
The named Sept-2013 retail decomp has one normal-world call chain:
SmartBox::RenderNormalMode @0x00453AA0callsLScape::draw;LScape::draw @0x00506330reaches the retained PView path;PView::DrawCells @0x005A4840owns the landscape/cell-pass boundary; andPView::DrawInside @0x005A5860constructs and draws the one PView graph.
These anchors were re-read in
docs/research/named-retail/acclient_2013_pseudo_c.txt at lines
92635/92683, 267912, 432709/432719, and 433793/433819. The paired executable
was re-hashed before this contract:
C:\Users\erikn\Downloads\acclient.exe, SHA-256
006FFEADC5D679C871497112A5BD1F87714D0E273E2166BAE5052DDE369297B1,
paired with refs/acclient.pdb, SHA-256
B1AA774B458C7EFDED9F3BB7E1B18B31A508514D6F2089800629B1B51C154925
(the already-verified CodeView identity is
{9E847E2F-777C-4BD9-886C-22256BB87F32}, age 1). The first 64 bytes at the
four executable anchors hash respectively to
B69DF08F6B30118463B6148A09CEAF2D47F640303039912224DB4D29FCB93FC7,
9319B607C0505D0656935719C27E9F7C00B5281574643614A367C02C88EA7CC3,
16E12B476CDABE0F7CD0B1380A31EF194B00901A76D5AFB295CD0C30B4DB36CC,
and
DE6E16EC73EDFC04632E2C7A059AB26519099391637318805EF15AB6DBA682C4.
Current-source reachability was also checked independently. Outside its own
file, production contains no construction or call of
PortalVisibilityBuilder, PortalVisibilityFrame, IndoorDrawPlan, or
ViewconeCuller. The only surviving PortalVisibilityFrame production uses
are the dead ClipFrameAssembler.Assemble overload and
IndoorDrawPlan.ShellPass; both are called only by tests. The live assembler
entry points are BeginWalkFrame and ReassembleOutsideViewFromWalk.
RetailFrameWalk alone retains the interior/outdoor WalkPView objects, and
RetailPViewRenderer alone retains the RetailFrameWalk/WalkFrameDriver
frame owner.
Therefore this chunk is not a new retail port. Its retail claim is narrower: deleting an unreachable competing implementation cannot alter the one live walk. If a compile repair would change a live walk, draw, queue, material, or shader method, stop and return that fact instead of widening this contract.
33.2 C1 — remove the independently compiled portal-BFS research path
Delete these production artifacts outright:
Rendering/PortalVisibilityBuilder.cs, includingPortalVisibilityFrameandExteriorPortalSeed;Rendering/IndoorDrawPlan.cs, includingCellDrawEntry;Rendering/ViewconeCuller.cs; and- the
ClipFrameAssembler.Assemble(ClipFrame, PortalVisibilityFrame, ...)overload and its builder-only comments.
Keep LoadedCell, CellVisibility, PortalView/CellView,
PortalProjection, ClipPlaneSet, ClipFrame, BeginWalkFrame, and
ReassembleOutsideViewFromWalk: the current walk, portal fan, and preparation
paths still consume those primitives. Rewrite their stale comments to name the
walk rather than the deleted builder; comments must not imply the synthetic
outdoor node performs a second portal flood.
Delete old-builder-only tests rather than keeping a second implementation alive
as test code. This includes the dedicated builder/robustness/flood-replay,
IndoorDrawPlan, ViewconeCullerReuse, and TowerAscentReplay files, plus the
builder-only cases in mixed files. Preserve the first two live
ClipFrameAssemblerTests (BeginWalkFrame outdoor/interior reset) and every
WalkOutsideViewReassemblyTests case by driving BeginWalkFrame directly.
OutdoorCellNodeTests keeps its construction invariant and drops only the
deleted-builder assertion. A currently live CELLARRAY/walk assertion may be
moved to a focused file if it is unique; do not retain a builder dependency to
save a redundant diagnostic test.
33.3 C2 — remove obsolete renderer probes and their hidden frame cost
Delete the complete Facility stair family named by the plan:
RenderingDiagnostics.ProbeFacilityStairsEnabledand the environment read;WbDrawDispatcher.FacilityStairProbe.cs;- all Facility/cathedral signature, classifier, ordered-stream, upload, and
submission probe fields/methods/call sites in
RetailPViewRenderer,WalkPView,WalkProductionWorldData,WalkStaticStreamPopulator, andWbDrawDispatcher.OrderedStream/WalkClassify; and - the probe-only
WalkProductionWorldData.StaticBucketContainsmethod and[walk-membership]print. KeepUnregisteredRenderMembershipCountitself and its exact tests: it remains a cheap invariant/result, not a logging owner.
The remaining renderer flags explicitly documented as throwaway, relic, or closed-investigation probes are deleted in the same sweep:
ProbeIndoorWalkEnabled,ProbeIndoorLookupEnabled,ProbeIndoorUploadEnabled,ProbeIndoorXformEnabled,ProbeIndoorCullEnabled, and theirIndoorAllcascade;ProbeVisibilityEnabled/EmitVisandProbeEnvCellEnabled;ProbeFlapEnabled,ProbePvInputEnabled,ProbeGlStateEnabled,ProbeClipRouteEnabled, andProbePortalChurnEnabled;ProbeIndoorLightEnabled/EmitIndoorLight; andProbeSeamDrawEnabled/SeamDrawTargetCellsand their parse/format helpers.
Remove every production output branch and scratch field used only by those
flags, including the [flap*], [pv-input], [render-sig], [vis],
[gl-state*], [clip-route*], [indoor-*], [envcells], [light],
[seam-*], and [facility-*] families. WorldRenderDiagnostics keeps its
terrain timing/publication responsibility but loses the dead raw-GL reader,
state/scissor records, and the obsolete render-probe methods.
WorldSceneDiagnosticsController keeps collision/debug-fact publication but
loses the two probe-only interface methods and the post-world GL sample.
Delete the corresponding tests and docs/launch-options.md rows. Historical
research/capture documents remain historical evidence and are not rewritten.
Comments in still-live production code may describe a historical capture, but
must not cite a deleted runtime flag or claim a deleted probe remains callable.
The retained diagnostics are explicit nonchanges:
RenderingDiagnostics.LightDebugMode, ShouldRenderIndoor,
FrameProfEnabled, and DumpWalkTranscriptEnabled. In particular,
ACDREAM_DUMP_WALK_TRANSCRIPT is the plan's one retained, typed, print-only
retail-conformance flag; c5 must not remove or weaken its existing pins.
Physics/audio/streaming probes outside the renderer cleanup inventory are also
out of scope.
33.4 C3 — make architecture and register prose match the landed renderer
Update docs/architecture/acdream-architecture.md so it states that the old
builder is deleted, not merely callerless. Replace the stale three-item
“known non-retail order” paragraph with the landed S3/S4 facts: per-landcell
terrain and sort-cell turns, outside-view/latch-gated clear+seals, and the two
bounded CLIP/ALPHA FIFO lists drained at exact barriers. Name the still-live
AP-238 through AP-243 residuals without resurrecting the superseded model.
Update docs/architecture/worldbuilder-inventory.md to remove the deleted
[walk-membership]/Facility flag claim while retaining the
UnregisteredRenderMembershipCount invariant and its AD-116 meaning. Amend
AD-116 accordingly in retail-divergence-register.md. Retire AP-19 in the
same commit because its only implementation, the deleted builder's 1 cm
epsilon, no longer exists; do not reuse its id. AP-238–AP-243 remain active.
Remove stale current claims from docs/launch-options.md; do not erase old
research or the superseded ledger history.
33.5 C4 — architecture guards
Add one focused compiled/source architecture test file with these discriminating guards:
- the App assembly contains no
PortalVisibilityBuilder,PortalVisibilityFrame,ExteriorPortalSeed,IndoorDrawPlan,CellDrawEntry, orViewconeCullertype; - only
RetailFrameWalkdeclaresWalkPViewfields and onlyRetailPViewRendererdeclares aRetailFrameWalkfield; the renderer owns exactly one such field; - the frame-time walk/renderer/submitter owner types have no raw
DatCollection/IDatReaderWriterfield, property, parameter, or return dependency. Construction-time DAT adapters such asWalkBuildingFactoryremain outside this frame-time list; - no consumer reconstructs a second portal visibility result: production source has no banned old type/symbol and no call/new edge to a second graph builder;
WbDrawDispatcher.OrderedStream.cscontains noSort,OrderBy, or equivalent cross-stream reorder; existing merge-run tests continue to prove adjacent-only, order-preserving batching across semantic boundaries; and- production source contains none of the deleted probe symbols or environment names listed in §33.3, while the retained walk transcript symbol is still present and its flag-off and transcript-conformance tests still run.
The guards may read repository source where absence itself is the contract,
but paths are resolved from the solution root and comparisons are explicit.
Do not use brittle line numbers or broad words such as probe/visibility
that would outlaw retained production concepts.
Required mutations, each restored exactly before return:
- restore one deleted old type name: guard 1/4 fails;
- restore
ACDREAM_PROBE_FACILITY_STAIRS: guard 6 fails; - add a second
RetailFrameWalkowner field: guard 2 fails; - add
OrderBytoWbDrawDispatcher.OrderedStream.cs: guard 5 fails; and - add an
IDatReaderWriterparameter to a listed frame-time owner: guard 3 fails.
33.6 Scope, gates, return, and reviews
Production edits are limited to the deleted/residual files and direct probe or
compile-fallout sites named in §§33.2–33.3. Test edits are limited to deleting
old research tests, preserving/adapting the named live tests, simplifying
direct probe-constructor fixtures, and adding the architecture guard.
Documentation edits are limited to this packet, the plan ledger,
docs/launch-options.md, the two architecture documents, the divergence
register, and Current memory. No shader, prepared-content, wire, physics,
membership, walk-order, material, or queue behavior change is allowed. If a
deletion exposes a live dependency outside these bounds, stop and report it.
Return one implementation commit with every documentation/register change in the same commit as the deletion. Required evidence:
git diff --checkand a Release solution build with zero warnings/errors;- focused architecture, walk transcript,
BeginWalkFrame, outside-view, ordered-stream, membership, terrain diagnostics, and directly affected suites; - official hermetic and canonical InstalledDat lanes, with exact pass/fail/skip identities and SHA manifests;
- source/type absence searches for every deleted family; and
- all five mutation transcripts.
Review is sequential. Lens 1 checks retail/deletion faithfulness, retained walk primitives, AP-19/AD-116/register truth, and absence of a second graph. Lens 2 checks production reachability, hidden-cost removal, architecture-test non-vacuity, order/DAT boundaries, allowed scope, and gate provenance. A failed lens gets one bounded fix contract. Review stops only after pass 10.
After review and campaign landing, the lead runs a fresh Release/focused gate, checks tree/ACE/client state, and performs one graphical smoke route over an outdoor town, Facility stairs, and one interior/portal transition. It must exit gracefully, leave no client, emit no deleted probe prefix, and record exact PNG paths. Visual status remains provisional until the owner inspects it.
34. S5-c5 fix round 1 contract — static owner fields must not evade the final graph guard
Production/gate-honesty review pass 2/10 found one MINOR test-only defect and
no production behavior finding. WalkFrameOwners_AreUnique builds its shared
field flags from BindingFlags.Instance but omits BindingFlags.Static.
Consequently, a static WalkPView field outside RetailFrameWalk, or a static
RetailFrameWalk field outside RetailPViewRenderer, can create a second
owner while the §33.5 guard remains green. The implementation itself contains
no such field; this is a non-vacuity hole in the permanent architecture proof.
34.1 Bounded correction
Edit only
tests/AcDream.App.Tests/Rendering/Walk/WalkRendererArchitectureGuardTests.cs:
- include both
BindingFlags.InstanceandBindingFlags.Staticin the field scan shared by theWalkPViewandRetailFrameWalkowner assertions; - keep
DeclaredOnly, public/non-public coverage, the exact two-PView count, the exactRetailFrameWalkdeclaring owner, andAssert.Singleunchanged; and - do not replace the compiled reflection proof with a source-word count or a narrower naming convention.
No production, renderer, walk, queue, material, shader, prepared-content, membership, launch-option, architecture, or register edit is authorized. This test-only correction creates no retail deviation, so it creates no register row.
34.2 Discriminating proof and return
Run both mutations separately and restore each exactly:
- add a static
WalkPViewfield to any App type other thanRetailFrameWalk;WalkFrameOwners_AreUniquemust first fail on the wrong declaring owner and/or count; and - add a static
RetailFrameWalkfield to any App type other thanRetailPViewRenderer; the same test must first fail on the second owner.
Return one fix commit with clean git diff --check, a zero-warning Release
solution build, the architecture guard plus the complete §33 focused set, and
fresh clean-tip hermetic and canonical InstalledDat evidence (the latter with
ACDREAM_RUN_INSTALLED_DAT_TESTS=1 and the explicit installed-DAT directory).
The InstalledDat nonpassing identities must remain the accepted nine failures
plus one look-in skip. Production/gate-honesty review then resumes as pass
3/10; the already-passed retail/deletion lens is not repeated because this
round changes no production or retail claim.
35. S5-c5 landing, review closeout, and lead graphical smoke — 2026-09-05
CLOSED AND LANDED; GRAPHICAL PASS IS PROVISIONAL PENDING OWNER
INSPECTION. The reviewed implementation stack in s5-c5-openai-impl is
36bea55f337c010683263a2eb315514c47121e9f ->
2886091aa92f62ceec8c16d4fd5b2dd6056eb5b8 ->
158656f0df3edd5e28ac3a9ed743f4c435e321f9. It maps to the campaign stack
bf53e2ad6 -> e625dc4e6 -> 1b7ee4e58 on top of contract
b77989c32. The final campaign commit is
1b7ee4e58100b27a55063e0bd462f54c589b1d7e.
The deletion removes the callerless portal-BFS research graph and its tests,
the complete Facility-stair instrumentation family, the obsolete renderer
probe/output branches and hidden scratch, and the raw-GL diagnostic reader.
The live RetailFrameWalk/WalkFrameDriver, BeginWalkFrame, outside-view
reassembly, two FIFO lists/router/material/shader paths, typed walk transcript,
frame profiler, terrain diagnostics, and
UnregisteredRenderMembershipCount remain. Architecture and inventory now
state one production graph; AP-19 is retired, AD-116 is amended, and
AP-238--AP-243 remain active.
Sequential review closed in three passes. Retail/deletion pass 1/10 returned
PASS with no finding after independently rechecking the named functions and
the paired binary/PDB identity. Production/gate-honesty pass 2/10 found one
MINOR test-only non-vacuity hole: the unique-owner reflection scan omitted
static fields. Fix round 1 added BindingFlags.Static. The lead reproduced
both required static-owner mutations and their intended first failures, then
restored them exactly. Production re-review pass 3/10 returned PASS with no
remaining finding; the production source tree was unchanged by the fix.
Exact reviewed-tip evidence is hermetic 16,921 passed / 0 failed / 0 skipped, canonical InstalledDat 368 passed / the accepted nine failures / one accepted look-in skip, and both manifests 30/30. Fresh campaign-tip verification passed Release at 0 warnings / 0 errors, App focused 146/146, and Core focused 8/8. The campaign tree was clean before the graphical gate.
The first smoke attempt is excluded as environment preflight evidence. It
opened the default machine-local acdream.pak, rejected recipe 8 against the
recipe-10 client, emitted no PNG, exited with the .NET unhandled-exception code,
and left no client. Log:
logs/selfgate-20260905-051948-s5-c5-landed. No renderer assertion was
reached. The lead then ran the repository's validated transactional bake to a
new path, leaving the recipe-8 package untouched. Recipe-10 output:
2,237,865 keys, zero failures, 597,482,264 bytes, SHA-256
4E0FA6C589ECE12E13099A56385077964961EC52F888BC9161C6F5D34829B59B.
The one corrected smoke run began with ACE listening on UDP 9000, zero client
processes, a clean campaign tree, and the already-green Release binary. It ran
tools/overhaul-selfgate/route.txt once against the new package, exited 0,
confirmed graceful logout, and left zero client processes. The log contains no
crash, invariant failure, device-loss/screenshot failure, or deleted probe
prefix. Exact evidence root:
logs/selfgate-20260905-052130-s5-c5-landed-v10. PNGs:
artifacts/screenshots/00-login.png;artifacts/screenshots/01-cathedral-stairs.png;artifacts/screenshots/02-facility-stairs.png;artifacts/screenshots/03-holtburg-house.png; andartifacts/screenshots/04-holtburg-terrain-leak.png.
Lead original-resolution inspection and comparison with
logs/selfgate-20260905-020703-s5c4-onepass-detail found the same intact
cathedral, Facility, house-portal, and outdoor-terrain geometry; only authored
time/weather changed. Verdict: PASS, provisional until the owner inspects
the PNGs. S5-c5 is closed. S5 automated/performance closeout and G4 remain;
never merge to main before G4.
36. S5 closeout C1 contract — offline correctness and evidence map
Base is clean campaign commit
29c05e48c8379678603efb8715f86ede04c775ea. This is an evidence-only
closeout chunk: it changes no production, test, fixture, register, shader,
prepared package, or gate script. One OpenAI implementer runs the bounded
matrix below and returns artifacts plus an exact coverage map; the lead
independently verifies every count, nonpassing identity, manifest, and claimed
fixture. The lead alone writes and commits the result.
- Run
tools/run-release-gate.ps1once to a new, absent artifact directory with the plan's literal filterLane!=InstalledDat&Lane!=Linux&Lane!=Manual&Lane!=Timing&Lane!=Live&Lane!=PreparedPackage. Do not silently substitute the narrower ordinary release-gate default. A nonpassing test is evidence to classify, not permission to retry or edit. - Run one canonical InstalledDat artifact with
ACDREAM_RUN_INSTALLED_DAT_TESTS=1, explicit installed DAT directory, andLane=InstalledDat&Purpose!=Diagnostic. Preserve the accepted nine failures plus one look-in skip only if the exact identities match c5; any new or missing identity is a finding. - Produce an exact test-to-requirement map for the focused App, Content,
Core, Runtime, and Launcher coverage; all committed OH walk/parts/
alpha-depth fixtures;
BeginWalkFrame/outside-view reassembly; per-cell geometry and membership; FIFO/barrier/order; material; building degrade; visibility consumers; reset/abort/dispose; architecture guards; and real warmed allocation pins. Reuse already-executed tests from items 1--2 where their TRX identity proves coverage; run only a genuinely missing focused class once. - Identify the existing executable witness, if any, for the plan's “two deterministic geometry/membership runs with equal hashes” requirement. Run it exactly twice from the same clean commit and compare its declared product hash. A hash of source files, TRX files, logs, or the prepared pak is not this witness. If no current gate emits a canonical runtime geometry/membership product hash, stop this item and report that contract gap; do not invent a surrogate or modify code without a new lead contract.
- Verify
git diff --check, exact HEAD/branch, zero tracked or untracked source change, and every artifact SHA manifest. No graphical client launch, connected route, package rebake, commit, cleanup, retry, or mutation is authorized in C1.
Return the exact commands, artifact paths, pass/fail/skip counts and identities, manifest verification, fixture list and the requirement map. The retail/transcript lens reviews fixture completeness and whether the purported deterministic witness proves the retail products. Only after that PASS does the production/gate-honesty lens review filters, provenance, manifests, negative results, and absence of retries. Any missing witness becomes a separately contracted narrow harness chunk; otherwise C1 closes and C2 runs the connected lifecycle/performance program.
37. S5 closeout C1 result and C1a narrow harness contract — 2026-09-05
37.1 C1 result: the offline matrix is green and two evidence gaps are real
Section 36's code base was 29c05e48c8379678603efb8715f86ede04c775ea;
the executed clean contract tip was
aa51cb88b00c843f87aa48047f9f3ce939755909. One OpenAI implementer ran each
official gate exactly once, with no retry, edit, client launch, package bake,
surrogate witness, or cleanup:
& tools/run-release-gate.ps1 `
-ArtifactsDirectory artifacts/s5-closeout-c1-hermetic-aa51cb88b `
-TestFilter 'Lane!=InstalledDat&Lane!=Linux&Lane!=Manual&Lane!=Timing&Lane!=Live&Lane!=PreparedPackage'
$env:ACDREAM_RUN_INSTALLED_DAT_TESTS='1'
$env:ACDREAM_DAT_DIR='C:\Users\erikn\Documents\Asheron''s Call'
& tools/run-release-gate.ps1 `
-ArtifactsDirectory artifacts/s5-closeout-c1-installeddat-aa51cb88b `
-SkipRestore -SkipBuild `
-TestFilter 'Lane=InstalledDat&Purpose!=Diagnostic'
The two temporary environment variables were removed after the second gate.
- literal hermetic artifact
artifacts/s5-closeout-c1-hermetic-aa51cb88b: Release build 0 warnings / 0 errors, 16,942 passed / 0 failed / 0 skipped, manifest 32/32; - canonical InstalledDat artifact
artifacts/s5-closeout-c1-installeddat-aa51cb88b: 368 passed / the accepted nine failures / one accepted look-in skip, manifest 30/30.
The nonpassing identities match S5-c5 exactly. The skip is
WalkLookInGateSweepTests.Sweep_the_lookin_gate_decodes_against_the_street_fixture.
The failures are
WalkTraceConformanceTests.AlphaFlushCounts_CathedralArrival_MatchesRetailFrame2,
WalkTraceConformanceTests.AlphaFlushCounts_CathedralLeak_MatchesRetailFrame2,
WalkTraceConformanceTests.AlphaFlushCounts_CathedralStairArch_MatchesRetailFrame2,
WalkTraceConformanceTests.AlphaFlushCounts_FoundryDeep_MatchesRetailFrame2,
WalkTraceConformanceTests.AlphaFlushCounts_HoltburgDoorwayStill_MatchesRetailFrame2,
WalkTraceConformanceTests.AlphaFlushCounts_TerraceEdge_MatchesRetailFrame2,
WalkTraceConformanceTests.Oh_doorway_still_first_frame_diff,
LayoutImporterInvisibleSweepTests.EveryAuthoredInvisibleWidget_StartsHiddenAcrossAllLayouts,
and
LayoutImporterMediaBearingChildSweepTests.MainGameUiAndChatInput_MediaBearingChildrenNowBuildAsRealWidgets.
The two summary JSON files identify the exact HEAD/branch, report
WorktreeDirty=false, and their SHA manifests independently re-verify.
The TRX map covers the focused App, Content, Core, Runtime, and Launcher
requirements, including BeginWalkFrame, outside-view reassembly, retail
membership, FIFO/barrier/order, material, degrade, visibility consumers,
reset/abort/dispose, architecture guards, and the real warmed-allocation pins.
It also proved two missing witnesses rather than hiding them:
cathedral-stair-arch.walk.logis the only committed OH walk transcript with no test consumer. Its.alphadepthsibling is consumed, but that is a different product and cannot stand in for the walk transcript.- No executable gate hashes a canonical runtime geometry product together with the committed retail membership product. The existing installed-DAT CellStruct hash covers counts/metadata rather than vertex/index values, transforms, or membership; the scene digest is synthetic; and the existing retail comparator uses test-assembled terrain and copied publication dispatch. Equal source, package, log, or TRX hashes are not substitutes.
These are test-harness gaps, not evidence of a renderer behavior defect. C1 therefore closes as an honest offline inventory and C1a below is the required narrow correction before connected/performance C2.
37.2 C1a scope: consume the sixth walk fixture
Edit only the following walk tests for this half:
- add
(OhRoot, "cathedral-stair-arch.walk")toWalkOracleTraceTests.AllFixtures, so the ordinary complete-frame parser contract consumes the checked-in walk log; and - add a dedicated installed-DAT conformance test shaped like
Oh_foundry_deep_reproduces_every_complete_frame_exactlyinWalkTraceConformanceTests. Replay every complete marked stair-arch frame and compare the complete eight-kindSignature8exactly. A row inStill_fixture_first_frame_reproduces_exactlyis insufficient because that theory checks onlyframes[1]. Do not compare only event counts or borrow the alpha-depth transcript.
The new row must load the existing committed file. Do not recapture, rewrite, normalize, or manufacture a fixture. If the production replay cannot reproduce the row under the same adapter used by the other OH rows, return the exact first divergence as a finding; do not weaken the signature.
37.3 C1a scope: canonical runtime geometry/membership product witness
Add one InstalledDat App test class, plus at most one test-only data adapter if
the class cannot remain readable. Production source, fixtures, package files,
gate scripts, shaders, and register documents are out of scope. Each of two
independent runs inside the test must open a fresh installed DatCollection
and construct fresh extraction, physics, and membership owners. Use canonical
cathedral landblock 0xF418FFFF with origin (0xF4,0x18), real region height
data, complete EnvCells, and independent interior statics.
Build through the real LandblockBuildFactory.Build. A test-only
IPreparedCollisionSource may translate installed GfxObj, Setup, EnvCell, and
CellStruct records through the existing FlatCollisionAssetBuilder
flattening methods, but it may not compute membership. Read actual ordered
EnvCell shell geometry through DatPreparedAssetSource.Read with the same
PreparedAssetRequest.EnvCellGeometry product consumed by
ObjectMeshManager; read every referenced Setup/GfxObj product through the
same production extractor, including ordered Setup part placements. Publish
membership through the real no-window production sequence on
LandblockPhysicsContentBuilder: BuildTerrainSurface, PublishPreparedCells,
CacheBuildings, CachePreparedObjects, PhysicsEngine.AddLandblock, then
PublishStaticCollision. The test must not copy this branch dispatch or call
ShadowObjectRegistry.Register* to construct the expected membership.
Serialize a version-tagged binary product with explicit lengths and raw IEEE float bits, then SHA-256 it. The product must include:
- geometry identities; every emitted vertex position, normal, and UV; every
index; semantic subset order and
SourceSurfaceIndex,RawSurfaceType,RetailSurfaceMask, andIsCellShell; ordered Setup part ids and full transforms; and the actual placed cell/static transforms; - for every published owner, its
RetailCellArrayRoute, its ordered CELLARRAY fromTryGetRetailCellArray, and every ordered per-cellRetailPartEntryfromGetRetailPartEntriesInCell:EntityId,PartIndex,GfxObjId,CellId, andClipPlanesRequired.
Canonicalize only outer maps whose production semantics are unordered.
CELLARRAY order, Setup-part order, subset order, index order, publication
order, and per-cell entry order remain exact. Assert real shell geometry for
cell 0xF4180104 with nonzero vertices/subsets/indices. Assert the
production-built cathedral ramp Setup 0x020009A2 exists and that its seven
parts produce 21 entries across the exact ordered CELLARRAY
[0xF4180112, 0xF4180113, 0xF4180009], all with
ClipPlanesRequired=true. Assert at least one multi-cell product and one
BoundingBox route. Return the per-domain counts plus geometry, membership,
and combined hashes.
Two fresh in-test runs must produce the same three hashes and exact counts. The focused test must also be run in two fresh test processes at the same clean commit, and its labeled digest/count output must agree. Equality only proves determinism, so pin the clean installed-DAT combined hash and the exact cathedral semantic facts above as correctness witnesses. If installed DAT identity differs from the campaign's accepted corpus, fail explicitly rather than refreshing the golden silently.
The retail meaning remains the already-landed S2 contract: whole-part-array
CELLARRAY calculation and ordered part insertion, anchored by named retail
CPhysicsObj::AddPartToShadowCells (0x00510e00),
CPhysicsObj::add_shadows_to_cells (0x00514ae0),
CObjCell::find_cell_list (0x0052b4e0), and CELLARRAY::add_cell
(0x006b4ff0). C1a changes no AC algorithm.
37.4 Required discrimination, gates, and return
Before committing, run and restore these mutations one at a time, recording the exact first failing assertion:
- change one serialized vertex float bit while preserving counts;
- swap two real subset indices while preserving counts;
- reverse two real ordered CELLARRAY cells or Setup parts before publication;
- flip the cathedral ramp's real
ClipPlanesRequiredvalue; and - redirect the new stair-arch row to a nonexistent fixture.
Each product mutation must be reached by the canonical corpus and must fail
the pinned product proof, not merely a self-comparison. Restore every file
byte-for-byte and prove git diff --check clean. Return one test-only commit,
the exact changed-file list, all mutation transcripts, a zero-warning Release
solution build, the new fixture-consumer and product-hash focused tests, then
fresh official literal hermetic and canonical InstalledDat artifacts with
verified manifests and exact nonpassing identities. Any production edit,
fixture edit, hash-field omission, copied membership construction, new
nonpassing identity, or inability to form a non-vacuous real product stops the
chunk and returns a finding. No graphical client is authorized for C1a.
Review is sequential. Retail/transcript pass 1 checks the exact committed
fixture, Signature8, named-retail product/order meaning, field completeness,
and golden discrimination. Production/gate-honesty pass 2 checks fresh-owner
independence, real factory/mesh/publication reachability, absence of copied
registration dispatch, canonicalization boundaries, InstalledDat lane
provenance, manifest truth, and allowed scope. A failed lens gets one bounded
fix contract; review stops only after pass 10. After C1a lands, C2 runs the
connected lifecycle/performance closeout and G4 follows.
38. S5 closeout C1a stopped result — one observer defect and one unrecoverable static fact
38.1 The contracted exact transcript gate stopped before landing
The OpenAI implementer worked in the clean scratch worktree
s5-closeout-harness at contract base
4237a6b2b3d4e51ec0948257e2ff6f951b08c97c. The ordinary parser consumer for
cathedral-stair-arch.walk.log passed, and a draft of the independent
geometry/membership digest formed a real product, but the required every-frame
Signature8 comparison failed. Section 37.4 says that inability to reproduce
the committed fixture stops the whole chunk. The implementer therefore made no
commit, ran no official gate or mutation, changed no production source or
fixture, launched no client, and restored the scratch worktree clean at the
contract base. The draft product hash is not evidence and is deliberately not
landed or quoted as a golden.
All four complete marked frames have the same exact alignment:
- retail tokens: 2,158; replay tokens: 2,158; LCS: 2,156;
- tokens 0 through 374 agree;
- replay inserts
LC:e2290001andSC:e2290001at replay positions 375–376; - retail contains a second consecutive
EC:f4180106at retail position 2,126 and another at 2,141; replay emits one at each site.
Per-frame WalkLandscapeDatBuilder.SetViewer, one discarded same-pose warmup,
and both together produce the identical edit script in every frame. This is
not stale viewer state, a first-frame-only effect, or a broad sequence shift.
38.2 The two missing EC tokens are a test-recorder defect, not renderer behavior
Retail PView::DrawCells (0x005A4840) reads a flood cell's live view count at
0x005A4AA9 and loops setup_view plus RenderDeviceD3D::DrawEnvCell at
0x005A4AB1–0x005A4ACC; the paired bytes contain the 47 4B 75 E8 loop. Its
object/OC pass remains once per cell at 0x005A4ADE–0x005A4B1A.
The InstalledDat test recorder instead calls
WalkTraceReplayContext.AppendFloodTurns, which emits one EC per cell. Its
own class comment already names this known limit and says S5 must remove it.
Production is already correct: WalkFrameDriver.EmitFloodTurns captures each
cell's route and prints one EC per SliceCount, then keeps one object turn per
cell. The eventual test-only correction is bounded: while the callback still
owns the live flood state, read each cell's TopView.ViewCount, emit that many
EC tokens in reverse-cell order, then one OC per cell. It must not change
production or weaken Signature8.
38.3 The e229 cause cannot be recovered statically
The named retail decomp and paired executable prove two distinct no-LC
causes inside LScape::draw_check_blocks (0x00505F80): the
land_blocks slot is null at 0x00506184, or a resident block's
Render::block_check call at 0x005061DF returns OUTSIDE. The paired bytes
at the latter site are E8 6C 7A 04 00 (call 0x0054DC50) followed by
85 C0 74 0E. WalkLandscape.CheckBlocks has the same control-flow shape.
The replay test builder eagerly installs every extant DAT block in its 51 × 51
grid. Production WalkLandscapeAssembler deliberately leaves unstreamed slots
null. The walk transcript records only submitted LC/SC turns; it does not
record retail residency or rejected block checks. Therefore absence of
LC:e2290001 cannot distinguish the two retail causes from static evidence.
The block is a one-cell coarse ring-18 block, so AD-118's measured D3D/x87
edge-plane boundary is the strongest hypothesis, but applying that row without
the missing residency/verdict fact would be speculation. No production
visibility change, KnownFailure, fixture normalization, or new divergence
row is authorized.
The retail lens reverified the paired binary: executable SHA-256
006FFEADC5D679C871497112A5BD1F87714D0E273E2166BAE5052DDE369297B1, CodeView
GUID {9E847E2F-777C-4BD9-886C-22256BB87F32}, age 1.
38.4 Exact owner capture that unblocks C1a
Issue #472 owns the stop. Reuse
tools/walk-oracle/oh/oh-capture-blockset.cdb.template and
oh-capture-blockcheck.cdb.template, changing the filtered DID to
0xE229FFFF, at the exact first complete-frame pose from the committed
fixture:
P f4180114 421e545d 4187e406 4336c9e1 3f800000 b71e18af 30947ee4 348114b1
Keep the output as
cathedral-stair-arch-e229.blockset.log and
cathedral-stair-arch-e229.blockcheck.log beside the other OH captures. The
blockset must prove whether retail has a resident e229 slot. If it is resident,
the filtered capture must record every active-view interval vector, the z slab,
and each block_check verdict. A null slot contracts a replay-residency harness
correction; resident plus OUTSIDE contracts the test-recorder correction and
classifies the remaining difference under AD-118. Any different result gets a
new bounded contract from the observed facts.
This is the campaign's explicit “retail fact cannot be recovered statically”
stop condition. C1a, connected/performance C2, and G4 do not proceed until the
capture exists. Nothing has merged to main.
39. Owner capture and C1b projection diagnostic contract — 2026-09-05
39.1 New evidence removes the capture blocker, but does not yet close #472
The owner returned to the requested stairwell and authorized capture. Preflight:
ACE UDP 9000/PID 13340, paired retail PID 29732, no AcDream.App or existing cdb.
The live executable SHA and CodeView GUID/age match §38.3. The lead captured
one complete frame with full 2,601-slot residency, all seven e229 block-check
input/return sets, active screen vertices and edge planes, CY, projection
globals, and the full eight-kind walk transcript. Capture:
oh-capture/cathedral-stair-arch-e229.combined-r1.log, SHA-256
9E493F8ACE8CA2E939333BB8B755C218F8115658EE423F5439FCA45C3FBBA9CB.
The matching .cdb script is preserved beside it. The initial combined attempt
used incorrect newline escaping and is retained in the working artifact
directory, excluded from conformance evidence. Every attach exited 0 through
bc *, log close, and qd; no debugger remained, and the owner's retail
client was left running.
The valid frame starts at:
P f4180114 421e02f8 4188aa39 4337407b 3f7d4959 be14b29f 00000000 00000000.
It is the same stairwell with seven exit views, but is NOT the historical
fixture's exact pose. Retail slot 399 contains e229ffff, side 1, z slab
bits bf800000..43890000 (-1..274). All seven block checks return OUTSIDE;
no e229 LC or SC occurs. This proves residency plus rejection for this captured
pose, not the cause of the old fixture's disagreement.
Marker timing matters: RenderNormalMode's entry breakpoint prints the prior Render::viewer_pos, before update_viewpoint installs this frame's viewer. All seven r1 block checks carry y bits 4188aa3a, matching the terminating F2 P rather than F1's 4188aa39. Pair F1 events with F2 pose for the actual capture comparison. The older stair fixture must also be checked with events(N) and pose(N+1); the final marker pose remains present in the raw log even though the ordinary parser discards the unfinished final frame. Section 38.4's use of F1 P as the exact original event pose was therefore too strong. Do not alter the original fixture to hide this association.
A further one-frame oh-capture/cathedral-stair-arch-e229.projection-mode.log
reveals the important missing fact: newmethod @0081efe8 == 1.
Named Render::copy_view @0054dfc0 branches at 0054e4e5 and calls
PrimD3DRender::ScreenToViewTransform @0059aa40 at 0054e50f in that mode.
This reads actual viewport dimensions, ViewToClipMatrix, and inverse
WorldToViewMatrix. The existing test WalkTraceReplayContext.RetailRayCaster
instead implements the other, legacy branch. Its forward projection puts
the center at (512,360), while its rays put it at (511.5,359.5). Its claim
that the branches are equal is false. Production already uses matrix-based
rays; no production behavior change is authorized.
Captured viewport is 1024x720, aspect bits 3fb60b61, FOV bits 3f98104b, near/far bits 3dcccccd/457a0000. Row-major LH ViewToClipMatrix words:
3f854304 00000000 00000000 00000000
00000000 3fbd8723 00000000 00000000
00000000 00000000 3f8000d2 3f800000
00000000 00000000 bdccce1d 00000000
The six legacy projection globals are doubles; r1 captures all 64 bits and confirms the previous nominal values. Treat neither those constants nor AD-118's old x87 explanation as proof of the active path. AD-118 and #458's attribution need re-evaluation after the experiment below.
39.2 C1b — bounded diagnostic implementation
One OpenAI implementer works in s5-closeout-harness, fast-forwarded to this
contract commit. Allowed test edits: WalkTraceReplay.cs and at most one
new WalkProjectionDiagnosticTests.cs. No production, existing fixture,
existing conformance expectation, KnownFailure, or default constructor
behavior changes. No graphical launch, package bake, broad gate, or commit
by the implementer.
Add an explicit opt-in test-context construction path using the captured D3D projection and named ScreenToViewTransform rule. Derive a coherent LH world-to-view matrix from each supplied pose (right, up, forward rows/columns as confirmed against the captured matrix); invert it for rays as retail does. Use the same projection for forward screen mapping. Do not subtract a half-pixel from production TransformToScreen or tune an epsilon. The baseline constructor remains byte-for-byte behaviorally unchanged for comparison.
Required diagnostics (tag InstalledDat/Purpose=Diagnostic and retain output):
- At center, corners, and interior points, screen -> ray -> screen must return the original coordinate within a justified float-rounding bound. Restoring the legacy ray formula must fail at center by about half a pixel.
- Drive real RetailFrameWalk and the existing DAT builder for the new capture and all four complete historical stair-arch frames under both baseline and matrix-corrected test contexts. Use the actual captured projection and label its application to older frames as a same-configuration hypothesis. Compare the prior same-frame pose association and the retail-correct next-marker association separately; include the final marker's raw pose without manufacturing a fifth complete event frame.
- At OnLandscapeViews, read actual live root views and print screen points, raw edge planes, CY, e229 slot/slab, four corner intervals and per-view BlockCheck results. Compare that diagnostic admission with real WalkLandscape.InView, CellInView, LC and SC after the frame.
- For the experimental transcript observer only, read TopView.ViewCount while callbacks own the live flood; emit EC per view and OC once per cell in the normal reverse-cell order. Preserve the current shared Recorder unchanged. Compare complete Signature8 sequences and report full aligned mismatches, never equal counts as a substitute.
- Repeat the exact transcript comparison for existing OH fixtures, especially Holtburg doorway (#458), to distinguish a real correction from trading one boundary discrepancy for another. This is diagnostic evidence, not an automatic change to accepted failure identities.
Build only the affected Release test project and run these focused diagnostics. Record commands, exact input/output and limitations in the artifact directory. A result that does not resolve the old fixture must be reported honestly; do not widen into renderer math or silently accept a new failure. The lead writes the subsequent correction contract from the measured result; then the normal sequential retail and production reviews apply. C1a's product hash and test closure, C2, and G4 remain; no merge to main.
40. C1b result and C1c permanent replay correction contract — 2026-09-05
40.1 Measured result: both purported precision boundaries are harness defects
The frozen §39 diagnostic uses only the two authorized test files in
s5-closeout-harness, based on 3f5ca9ff4; it is not a production change
or an official closeout gate. Exact commands, limitations and artifact hashes:
s5-c1b-projection-diagnostic.txt. Final artifact:
s5-closeout-harness/artifacts/s5-c1b-projection-3f5ca9ff4/walk-diagnostic-final.trx,
SHA-256 8E14F9BFFCAF57047D0990185FAB393170CEC962024C035C01422C4DC266B00E.
The lead inspected the observer, literal Signature8 comparison, LCS alignment, raw captured/candidate intervals, and final admission; independently counted all 100 rows from the complete TRX, and re-hashed both production DLL copies. The final focused run passed 2/2. The first diagnostic failure is preserved: its outdoor-camera setup wrongly required a cell in the interior dictionary; the nullable outdoor-camera repair changed only the diagnostic.
| Comparison | Exact |
|---|---|
| Matrix projection + correct next-marker pose | 25/25 |
| Matrix projection across both pose associations | 49/50 |
| Legacy projection across both pose associations | 26/50 |
The 25 correct-pose rows are all four complete frames of each of the six OH walk fixtures, plus the new complete capture. Each is a full ordered eight-kind equality, not count equality. The historical stair gives 2158/2158 for all four frames, with resident e229 now Outside at the actual walk and no LC/SC. The doorway gives 1185/1185 for all four; its frame 1 still differs if deliberately paired with the stale same-marker pose. The cathedral-leak's missing fe180001 pair also disappears. The new capture gives 2367/2367 and reproduces all seven e229 OUTSIDE decisions, though its tokens alone happen to match both projection variants.
Corrected screen/ray/screen maximum error is 0.000110485424 pixel; the legacy center maps to (512.5008,360.5003). The new captured-matrix planes retain ordinary float-rounding differences from retail; no claim of bit-identical D3D/x87 math is made. Applying this captured projection to old fixtures remains a labeled same-configuration hypothesis, now supported by their exact transcripts. It does not justify altering a different capture's configuration.
These results disprove AD-118's x87-only explanation for #458 and the proposed application of that explanation to #472. Do not preserve those failures by changing production, relaxing visibility, or accepting a new divergence. Permanent correction and review are still owed before closing the issues.
Preflight correction: retail PID 29732 remained running throughout. A mixed
PowerShell table hid its fields after the UDP row; the lead's temporary
“no client” report was wrong. Serialize endpoint/process records independently
or as explicit JSON. No client was launched or closed. Only the test assembly
was rebuilt with --no-dependencies (and explicitly
/p:BuildProjectReferences=false for the final build); the referenced
AcDream.App.dll copies remained SHA-256
90BB90521F8F46B3887234F9D560E33616F108492693AA7597AEE0850E87FA76.
ACE remains UDP 9000/PID 13340. Do not build production or launch another
graphical client beside the owner's running client.
40.2 C1c scope — permanent test-only correction
One OpenAI implementer uses the existing scratch, fast-forwarding this documentation contract without discarding the frozen diagnostic edits. Preserve §39 artifacts. No production, shader, package, captured-log, gate script, or geometry-witness change is allowed. This chunk closes the walk half of §37; its geometry/membership witness remains the next bounded chunk.
Allowed code files: WalkTraceReplay.cs, WalkOracleTrace.cs, WalkOracleTraceTests.cs, WalkTraceConformanceTests.cs and its existing partial siblings solely for necessary recorder/pose call-site changes. The diagnostic class may be removed or reduced to a narrowly useful diagnostic; at most one focused hermetic projection-test class may be added. All are under tests/AcDream.App.Tests/Rendering/Walk/. Allowed documentation: this packet's result section, docs/ISSUES.md #458/#472, and AD-118 in docs/architecture/retail-divergence-register.md. Lead owns the ledger/Current.
-
Make the proven coherent matrix projection/ray pair the ordinary replay path for this captured 1024x720 configuration. Cite named Render::copy_view @0054dfc0 and ScreenToViewTransform @0059aa40 and the captured newmethod/matrix evidence. Keep forward and inverse transforms coherent; do not subtract a half pixel, adjust epsilon, or claim that the legacy formula is equivalent. A legacy implementation may remain ONLY as an explicit negative test/diagnostic, never as a production fallback. Verify the configured matrix words against the captured fixture, not only a second copy of hardcoded constants.
-
Preserve the literal marker pose and event stream in the parser. Expose an explicit rendered/replay pose from the NEXT frame marker's P record, including the final raw marker; do not manufacture its incomplete frame. No pose selection may try both choices and accept whichever happens to pass. Migrate pose-stamped conformance consumers to the correct association; unposed fixture parsing remains supported. Add a synthetic moving-pose pin proving final-marker association and no silent same-marker fallback.
-
Correct the shared Recorder/AppendFloodTurns to read each real cell's live TopView.ViewCount at the callback that still owns the flood. Emit EC per live view in reverse-cell order, then OC once per cell in reverse-cell order. Borrow the actual cell map; no production event or driver changes. Retail anchors are PView::DrawCells @005a4ab1–005a4acc and @005a4ade–005a4b1a. Keep the oracle's EC/OC literal, never derived from DC.
-
Add the sixth stair walk to AllFixtures and permanent exact Signature8 equality over ALL four complete frames of ALL six OH walk logs, plus the new one-frame capture. Reuse the ordinary shared context/recorder, not a shadow test-only implementation with different semantics. Pin stair multi-view multiplicity and the absence of LC/SC:e2290001. Remove #458's KnownFailure trait only when its ordinary exact row passes. Existing FW0 comparisons and unrelated accepted failure identities must not be weakened or silently removed; a new mismatch is a finding.
-
Correct obsolete source/test comments and the #458/#472/AD-118 current claims. Preserve the history as explicitly superseded, not current truth. Retire AD-118 for the disproven fixture failure once the permanent proof passes; this does not promise universal bit-identical floating-point projection. No new production divergence is introduced.
40.3 Discrimination, review and gates
Permanent hermetic tests cover center/corners/interior round trips with a justified <=0.001 pixel bound for the declared finite inputs, the captured matrix binding, and explicit next-marker parsing. InstalledDat proof compares every literal event in the 25 complete frames using the real shared recorder.
Apply and restore separately, with the first exact failure recorded:
- restore the legacy ray formula while retaining matrix forward projection;
- restore one EC per cell (the stair multi-view row must fail);
- use the same-marker pose (the moving parser pin and doorway frame 1 must fail);
- alter a captured matrix coefficient while leaving the binding fixture intact;
- redirect the sixth fixture consumer to a nonexistent path.
Preserve every original capture byte and unrelated test expectation. Return the full scoped diff, test-assembly-only Release result, focused hermetic and InstalledDat conformance results, mutation first failures and restoration proof, exact source/artifact hashes, and git diff --check. While retail is running, only --no-dependencies --no-restore /p:BuildProjectReferences=false test builds are permitted, with referenced production DLL hashes checked before/after; no graphical launch or production build. The implementer returns uncommitted work; the lead commits.
Sequential retail/transcript review first verifies branch, projection, frame-marker timing, live EC multiplicity, unchanged literal fixtures and full-sequence proof against named retail and paired bytes. After PASS, production/gate-honesty review checks default-path use, parser behavior, mutations, scope, provenance and unrelated test preservation. A finding gets a bounded fix and narrow re-review; the owner's ceiling is ten review passes.
After both reviews pass, the lead commits, runs the ordinary Release and canonical conformance closure when no client is running, verifies the same nonpassing identities except the intentionally retired #458 row, and keeps the ledger current. Geometry/membership witness, final full-lane evidence, C2 and G4 remain. No merge to main.
41. Owner visual gate FAIL — exterior building sections missing (#473)
41.1 Observed result and exact session
On 2026-09-05 the owner authorized a manual graphical gate. Fresh explicit
JSON preflight found ACE UDP9000/PID13340 and no retail, AcDream or debugger.
A complete Release solution build at clean02219318a finished exit0, 0W/0E.
One client PID18836 launched at05:22:31Z using the verified recipe10 package
acdream-v10-s5-c5.pak, SHA256
4E0FA6C589ECE12E13099A56385077964961EC52F888BC9161C6F5D34829B59B.
App.dll SHA256:
0EE6E74174C1E33168EA17A1DF2B592A996F3D77009F0D5A35A451E9A21DDB26.
Build, logs and launch provenance: logs/owner-gate-20260905-02219318a/.
There is no automated movement or shutdown script.
OWNER FAIL: exterior buildings in Holtburg and cathedral are broken;
Facility Hub interiors seem correct. Original owner PNG (unaltered copy):
owner-gate-20260905-holtburg-fail.png. It visibly contains incomplete
roof/wall sections. World-reveal logs report completed ready/visible worlds
at Holtburg, cathedral and Facility, but that is readiness evidence only.
Likewise the exact walk-event replay does not prove mesh/subset completeness.
No PASS or G4 acceptance is inferred. The renderer must be repaired and the
owner must re-gate; no merge to main.
41.2 Bounded read-only diagnosis, before a repair contract
Freeze the uncommitted §40 C1c return in s5-closeout-harness (9 test/doc files; manifest artifacts/s5-c1c-02219318a/README.txt); do not discard or mix the renderer defect into it. C1c reviews/landing and C1 geometry/C2 closeout wait behind this owner failure.
The lead and at most two OpenAI contributors may inspect current source, history, existing tests/captures/logs, installed DATs/package and the named retail decomp plus paired binary. Trace the actual exterior-building path: DAT/Setup/GfxObj geometry and source-part order -> prepared records -> live shell/degrade choice -> classification/subset/transform/index ranges -> ordered command and shader state. Compare it with the working EnvCell path. Distinguish missing construction from admission, part/degrade selection, batch index/range errors and depth/cull/material state. Verify every claimed retail rule in named source and paired bytes. A hypothesis is not a finding until an exact reachable code/data witness supports it.
No source/test mutation, production build, package bake, graphical launch, debugger attach or user-client input/closure is authorized by this diagnostic step. Read-only lightweight inspection continues beside owner PID18836; do not run a heavy corpus/performance gate during the user's inspection. Return the concrete first divergence and smallest discriminating test/reproduction needed. Lead then writes/commits the bounded repair contract, one OpenAI implementer repairs it, sequential retail and production lenses review, and the lead verifies/commits/re-gates after graceful client closure. Any genuine unrecoverable static retail fact is reported rather than guessed. Owner's ten-review ceiling remains; documentation-only corrections are direct.
42. #473 repair contract — solid detail alpha must not become sample coverage
42.1 First reachable defect and lead verification
Diagnosis at ec8edb157 found a concrete pipeline error introduced by S5-c4's
one-pass detail conversion. Both current fragment families emit retail's
X = a * qA * qA through the shared detail include. Wb's detail-active
PipelineForMaterial nevertheless returns the quality-selected opaque/A2C
pipeline for RetailSetSurfaceBlend.Opaque. Both the actual walk-ordered
caller and classic grouped opaque caller reach it. EnvCell's opaque pipeline
already has A2C disabled. VulkanGpuPipeline enables hardware A2C exactly when
the descriptor requests it and SampleCount > 1.
The owner's exact log records High quality, 4x MSAA, AlphaToCoverage=True, and detail category 1 resolving 05001787 -> 06006D58. The lead independently read all 65,536 installed A8R8G8B8 texels: alpha min24/max46, hence opaque final X is 0.0088581315..0.0325413303. Raw detail bytes SHA256: 925A4E7CE87B8F5582A723BCD5DE4299ADD526DC7DDE7C54D8F1D882ACD175C7. That detail alpha is not solid-surface coverage. Feeding it to A2C creates an unintended coverage reduction; exact per-sample behavior remains the GPU gate's responsibility, not a claim derived from a recording test.
Lead re-read named D3DPolyRender::SetSurface @0059C4D0: detail stages at
0059C51C/52B/53A/549 retain the squared final alpha; ordinary opaque selects
ONE/ZERO, no alpha blend or alpha test (0059C6E9..0059C6F9), with the existing
depth write. This is not permission to replace the fragment alpha by 1 or
change the blend arithmetic. Direct PE re-hashing against the same paired
006FFEADC5D679C871497112A5BD1F87714D0E273E2166BAE5052DDE369297B1 executable
reproduced every relevant section-22 range: SetSurface stages229 bytes
090E24BE542E9DA4F77B547D091F5C2E676109495919BEA70027AD2B89E11426;
material state417 bytes
1F077DA1BB09FBAC0EAF7522E125C716AAF499DFA8763DD3DDF29CCC6A76C382;
RenderMeshSubset single-pass224 bytes
64A988D4B1611CEEA6DE135FF52CDF30FE1AFDAAFF5E3B76751FFA7FC833CC53.
The superseded two-draw port-note pseudocode is not this repair's oracle.
Independent exclusions: all 52 GfxObjs across A9B4/F418 building base and nonzero ladder levels contain zero raw-2 polygons, so UN-4's known legacy side handling is not a demonstrated explanation here. All 32 nonbase surface arrays match their slot-zero array. Fresh canonical extraction and recipe10 package full serialized bytes match for sampled C17/A2B/BC3: 135/143/98 vertices, respectively; SHA256 166091DD4A07B3DA4322D0A663AE81FCBBF3AB3B6A2E7C18A228F3E247AFCC08, AF482C163FBEB5A85A239A8DF8D0190CD37C1787527040BB710B20252D3EB227, B1288B8DC53460B220075864AE6507BA5CE9880FCF1851FBD14828CEE32FDE21. These sampled payload checks are not an all-mesh GPU completeness claim.
42.2 Bounded implementation and permanent discriminator
One OpenAI implementer changes the shared detail-active material selection:
RetailSetSurfaceBlend.Opaque => pipelines.Opaque. Preserve pure Clip's
opaquePipeline arm (the separately disclosed AP-240), all detail-off
quality-selected pipelines, every blended family, fragment C/X, texture
sampling, depth/cull, command order/count, geometry, LOD, prepared recipe and
alpha queue. No shader edit, rebake, generic culling repair, or C1c change.
Correct the existing real PrepareThenDraw ordinary/detail-opaque/detail-Clip/ ordinary assertion: only the detail-opaque command binds non-A2C. Cover 1x and actual 4x, ordinary and atmospheric families, with exact pipeline descriptors, draw order/count, depth state and detail push fields. Add a classic-grouped real submission regression for the same shared selection; verify detail unavailable/disabled and quality A2C=false remain unchanged. Use existing fixtures and focused test files, not a test-only replacement of PipelineForMaterial. A mutation restoring the old one-line Opaque arm must fail the relevant ordered and classic tests; restore and re-run green. Existing pure Clip/AP-240 and blended-detail tests remain unchanged in meaning.
Update #473, register a filed-and-code-retired AP-245 row in the same fix commit, and append exact results here. The new row records the defect and its correction without pretending GPU/owner acceptance. AP-240 and AP-244 remain active. Correct source comments only where this edit makes them stale. Return all changes uncommitted for the lead. Do not touch frozen s5-closeout-harness or its nine-file C1c result. No unrelated refactoring.
42.3 Reviews, build and honest graphical gate
At 2026-09-05T07:48:08+02:00 explicit JSON preflight found zero AcDream, retail or debugger processes and ACE UDP9000 PID13340. PID18836 had exited; its log ends with graceful logout requested/confirmed. The lead did not close or control the owner's session. Check again before every build/launch; never build beside a running client. Release builds and focused tests are now authorized under this repair step. Do not launch a client as implementer.
Sequential independent OpenAI retail then production/gate-honesty review; a finding gets only a bounded fix and narrow re-review, maximum ten passes. Lead independently verifies the code, discriminating tests and paired facts, commits the reviewed change and runs a green Release build before one owned graphical run per background command. Use the same recipe10 package, 4x MSAA, A2C=true and detail ON: do not hide the bug by globally disabling detail/A2C.
The previous provisional images were insufficient: c5 03-holtburg-house.png is INSIDE, c5 04-holtburg-terrain-leak.png faces away toward a hillside, and c4 09-cathedral-terrace-edge.png does not frame the complete exterior. Their blanket intact-shell claims are superseded, not evidence against owner FAIL. The new gate must frame complete Holtburg and cathedral exteriors from more than one side and at near/far distances, and check the working Facility interior as a control. Record exact poses/settings/binary, PNG paths and PASS/FAIL; close only the lead's own session gracefully. Lead PASS remains provisional until the owner re-gates. Keep #473 open if rendered sections remain missing, even if the narrow tests pass. No merge main; C1c and all remaining closeout/G4 obligations resume only after this failure is handled.