docs(overhaul): prove replay projection cause and contract permanent correction

This commit is contained in:
Erik 2026-09-05 07:13:43 +02:00
parent 3f5ca9ff4f
commit 02219318a0
5 changed files with 235 additions and 7 deletions

View file

@ -41,8 +41,8 @@ remain closed. See
## #472 — Stair-arch walk fixture cannot distinguish retail e229 residency from block rejection ## #472 — Stair-arch walk fixture cannot distinguish retail e229 residency from block rejection
**Status:** OPEN — blocks Campaign OVERHAUL v2 S5 closeout C1a and G4; one **Status:** IN-PROGRESS — capture complete; §40's diagnostic resolves the
targeted owner retail capture is required. mismatch. Permanent default replay correction and review remain before closure.
**Severity:** EVIDENCE BLOCKER (no production renderer defect established) **Severity:** EVIDENCE BLOCKER (no production renderer defect established)
**Component:** InstalledDat walk-conformance harness / retail capture corpus **Component:** InstalledDat walk-conformance harness / retail capture corpus
@ -84,6 +84,14 @@ Do not call the old mismatch an accepted x87 boundary until that experiment
is complete. Evidence: `oh-capture/cathedral-stair-arch-e229.combined-r1.log` is complete. Evidence: `oh-capture/cathedral-stair-arch-e229.combined-r1.log`
and `cathedral-stair-arch-e229.projection-mode.log`. and `cathedral-stair-arch-e229.projection-mode.log`.
**2026-09-05 diagnostic result:** corrected matrix projection/rays, explicit
next-marker pose, and per-live-view EC recording reproduce all four stair
frames exactly (2158/2158), with e229 Outside and no LC/SC. All six OH walk
fixtures plus the new capture are exact (25/25 complete frames). The historical
capture/acceptance paragraphs above are superseded; this is a replay-harness
defect, not an accepted x87 renderer divergence. Packet §40 contracts the
permanent correction, regression tests and reviews. #472 is not closed yet.
## #471 — Production walk-ordered building detail was classified but never rendered ## #471 — Production walk-ordered building detail was classified but never rendered
@ -448,7 +456,11 @@ so this class is caught on every gate, not only when the lead remembers the env
## #458 — Walk admits land block `a9c9` at holtburg-doorway-still that retail does not draw ## #458 — Walk admits land block `a9c9` at holtburg-doorway-still that retail does not draw
**Status:** RESOLVED 2026-09-03 — a PRECISION BOUNDARY, not a walk defect (register row AD-118; the KnownFailure row is kept on purpose — see the resolution below). Found 2026-09-03 by the S3 chunk 1 eight-kind transcript conformance (the gate's first real walk catch). **Status:** REOPENED 2026-09-05 — the former x87-only attribution below is
disproven by S5 packet §40's diagnostic. Corrected matrix rays/projection and
next-marker pose reproduce all four doorway frames exactly (1185/1185).
Permanent default replay correction, KnownFailure removal and review remain.
The 2026-09-03 investigation/resolution below is retained as superseded history.
**Severity:** MEDIUM (retail-order exactness; one far land cell drawn that retail skips — no known visible artifact) **Severity:** MEDIUM (retail-order exactness; one far land cell drawn that retail skips — no known visible artifact)
**Component:** `WalkLandscape.CheckBlocks` / `LandCellCheck` block-level visibility at a LOD-ring boundary **Component:** `WalkLandscape.CheckBlocks` / `LandCellCheck` block-level visibility at a LOD-ring boundary

View file

@ -216,7 +216,7 @@ readiness/requeue adaptation. See
| AD-102 | **Filed 2026-08-15 at Campaign CC slice CC4 (the Heritage page's Viamontian button and the Town page's Sanamar button).** Retail gates BOTH controls behind `CPlayerSystem::AccountHasThroneOfDestiny`: `gmCGHeritagePage::ListenToElementMessage @ 0x00483860` shows `MakeToDWarningDialog` instead of selecting Viamontian (element `0x100003c3`) for a non-ToD account, and `gmCGTownPage::ListenToElementMessage @ 0x0047c480` does the same for Sanamar (element `0x1000040b`, `startArea` index 3 — also the reason `CharGenState::RandomizeStartArea`'s ToD-aware `RandInt(3 or 4)` bound exists). acdream's `ChargenOptions` (CC1) carries no account/DLC-ownership signal anywhere in the model, so both controls ship WITHOUT the gate — every installed heritage/town in `Options.HeritagesById`/`Options.StarterAreas` is always selectable, matching what a ToD-owning account would see. | `src/AcDream.App/UI/Layout/CharacterCreationHeritagePage.cs` (`HeritageByButtonId[0x100003C3u]`); `src/AcDream.App/UI/Layout/CharacterCreationTownPage.cs` (`StartAreaByButtonId[0x1000040Bu]`, `Randomize`) | ACE's server-side `CharacterCreate` handler never checks ToD ownership either (the field is purely a retail-client UI gate), so accepting the selection unconditionally never produces a request the emulator would reject; adding an account-ownership model to CC1's DAT-only `ChargenOptions` is out of this slice's scope and would need its own design (where does the "ToD owned" bit come from — account service, launcher config, a new env flag?). | None observable against ACE. A future retail-parity gate that specifically checks "does a non-ToD account get warned off Viamontian/Sanamar" will fail until an account-ownership signal exists to gate on. | `gmCGHeritagePage::ListenToElementMessage @ 0x00483860`; `gmCGTownPage::ListenToElementMessage @ 0x0047c480`; `gmCGTownPage::SetTown @ 0x0047c360`; `CharGenState::RandomizeStartArea` (DoRandom case 4, `RandInt(hasToD ? 4 : 3)`) | | AD-102 | **Filed 2026-08-15 at Campaign CC slice CC4 (the Heritage page's Viamontian button and the Town page's Sanamar button).** Retail gates BOTH controls behind `CPlayerSystem::AccountHasThroneOfDestiny`: `gmCGHeritagePage::ListenToElementMessage @ 0x00483860` shows `MakeToDWarningDialog` instead of selecting Viamontian (element `0x100003c3`) for a non-ToD account, and `gmCGTownPage::ListenToElementMessage @ 0x0047c480` does the same for Sanamar (element `0x1000040b`, `startArea` index 3 — also the reason `CharGenState::RandomizeStartArea`'s ToD-aware `RandInt(3 or 4)` bound exists). acdream's `ChargenOptions` (CC1) carries no account/DLC-ownership signal anywhere in the model, so both controls ship WITHOUT the gate — every installed heritage/town in `Options.HeritagesById`/`Options.StarterAreas` is always selectable, matching what a ToD-owning account would see. | `src/AcDream.App/UI/Layout/CharacterCreationHeritagePage.cs` (`HeritageByButtonId[0x100003C3u]`); `src/AcDream.App/UI/Layout/CharacterCreationTownPage.cs` (`StartAreaByButtonId[0x1000040Bu]`, `Randomize`) | ACE's server-side `CharacterCreate` handler never checks ToD ownership either (the field is purely a retail-client UI gate), so accepting the selection unconditionally never produces a request the emulator would reject; adding an account-ownership model to CC1's DAT-only `ChargenOptions` is out of this slice's scope and would need its own design (where does the "ToD owned" bit come from — account service, launcher config, a new env flag?). | None observable against ACE. A future retail-parity gate that specifically checks "does a non-ToD account get warned off Viamontian/Sanamar" will fail until an account-ownership signal exists to gate on. | `gmCGHeritagePage::ListenToElementMessage @ 0x00483860`; `gmCGTownPage::ListenToElementMessage @ 0x0047c480`; `gmCGTownPage::SetTown @ 0x0047c360`; `CharGenState::RandomizeStartArea` (DoRandom case 4, `RandInt(hasToD ? 4 : 3)`) |
| AD-99 | **Filed 2026-08-15 at Campaign LA gate round 2 finding 1 (character-select Exit button).** On a confirmed Exit, acdream closes the client through the existing graceful window-close path (`d.Window.Close`, the same seam `GameplayInputCommandController`'s in-world Escape fallback already uses) instead of retail's real post-confirm behavior: `RecvNotice_CloseDialog`'s case-1 arm queues UI mode `0x10000009`, which `gmEpilogueUI::Register` claims — a brief epilogue/farewell screen — before the process actually terminates. The confirmation dialog itself (`MakeConfirmExitDialog`, its exact `ID_CharacterManagement_ConfirmExit` text, and the `m_confirmExitDialogContext != 0` re-entry guard) IS ported faithfully; only the post-confirm destination differs, the same shape as AD-74's Options-panel exit. | `src/AcDream.App/UI/Layout/CharacterManagementUiController.cs` (`RequestExit`); `src/AcDream.App/UI/RetailUiRuntime.cs` (`CharacterSelectionRuntimeBindings.RequestExit`); `src/AcDream.App/Composition/InteractionRetainedUiComposition.cs` (`d.Window.Close` binding) | acdream has no `gmEpilogueUI` port (out of scope this round); reusing the ONE existing graceful-shutdown seam keeps `disconnected`/`exited` status events firing through `GameWindow.OnClosing``CompleteShutdown` rather than inventing a second shutdown path, per explicit direction for this finding. | A user confirming Exit sees the window close immediately instead of retail's brief epilogue screen; a future feature wanting to reproduce that screen (or an intermediate "logged off, returned to character select" state) has no seam yet — same gap class as AD-44. | `gmCharacterManagementUI::MakeConfirmExitDialog @0x004ed250`; `RecvNotice_CloseDialog @0x004ed760` case 1; `gmEpilogueUI::Register(0x10000009)` @0x0047a680; `gmCharacterManagementUI::OnAction @0x004ed410` (Escape key, unported — button-only this round) | | AD-99 | **Filed 2026-08-15 at Campaign LA gate round 2 finding 1 (character-select Exit button).** On a confirmed Exit, acdream closes the client through the existing graceful window-close path (`d.Window.Close`, the same seam `GameplayInputCommandController`'s in-world Escape fallback already uses) instead of retail's real post-confirm behavior: `RecvNotice_CloseDialog`'s case-1 arm queues UI mode `0x10000009`, which `gmEpilogueUI::Register` claims — a brief epilogue/farewell screen — before the process actually terminates. The confirmation dialog itself (`MakeConfirmExitDialog`, its exact `ID_CharacterManagement_ConfirmExit` text, and the `m_confirmExitDialogContext != 0` re-entry guard) IS ported faithfully; only the post-confirm destination differs, the same shape as AD-74's Options-panel exit. | `src/AcDream.App/UI/Layout/CharacterManagementUiController.cs` (`RequestExit`); `src/AcDream.App/UI/RetailUiRuntime.cs` (`CharacterSelectionRuntimeBindings.RequestExit`); `src/AcDream.App/Composition/InteractionRetainedUiComposition.cs` (`d.Window.Close` binding) | acdream has no `gmEpilogueUI` port (out of scope this round); reusing the ONE existing graceful-shutdown seam keeps `disconnected`/`exited` status events firing through `GameWindow.OnClosing``CompleteShutdown` rather than inventing a second shutdown path, per explicit direction for this finding. | A user confirming Exit sees the window close immediately instead of retail's brief epilogue screen; a future feature wanting to reproduce that screen (or an intermediate "logged off, returned to character select" state) has no seam yet — same gap class as AD-44. | `gmCharacterManagementUI::MakeConfirmExitDialog @0x004ed250`; `RecvNotice_CloseDialog @0x004ed760` case 1; `gmEpilogueUI::Register(0x10000009)` @0x0047a680; `gmCharacterManagementUI::OnAction @0x004ed410` (Escape key, unported — button-only this round) |
| AD-113 | **Filed 2026-08-25 at Campaign CT slice CT-GF1 (client-wide retained-UI ancestor clip).** Porting retail's `UIRegion::DrawHere @0x0069FA30` ancestor-clip intersection (an element's screen rect is intersected against the FULL inherited clip-rect chain and the subtree is skipped when the intersection is empty — the `var_24` gate @0x0069FB8E) as `UiElement.ClipsChildren`'s new client-wide default (true, threaded through the pre-existing `UiRenderContext.PushClip`/`PopClip`) needed one deliberate opt-out: retail spawns a menu's dropdown popup as a SEPARATE top-level region (`UIElement_Menu::MakePopup`), clipped only by the screen, while acdream's `UiMenu` draws its popup INLINE from the owning button in a second traversal (`OnDrawOverlay`, pre-existing, "regardless of this element's position in the tree" by its own doc comment). Without an escape, the new ancestor clip would wrongly cut off a popup that legitimately extends outside its own (possibly short) owning window — e.g. a channel dropdown opened upward past a short chat window's top edge. `UiElement.ExpandsClipForPopup` (default false) resets the accumulated clip to the full CANVAS rect (0,0,ScreenSize) — SCREEN-clipped, not truly unbounded, matching retail's own popup region (`UIElement_Menu::MakePopup` spawns a top-level region bounded by the screen) — for exactly the `OnDrawOverlay` call of an opted-in element (`UiRenderContext.PushClipUnbounded`, sharing the existing clip stack; corrected from an earlier `null`/unbounded clip at the CT-GF1 fix round); `UiMenu` overrides it true, paired with `ClipsChildren => false` so its own out-of-bounds `OnHitTest` union (the popup occupies `ly < 0` or `ly >= Height` depending on open direction) stays reachable through the same early-bounds gate that now defaults on for every other element. | `src/AcDream.App/UI/UiElement.cs` (`ClipsChildren`, `ExpandsClipForPopup`, `DrawOverlays`); `src/AcDream.App/UI/UiRenderContext.cs` (`PushClipUnbounded`); `src/AcDream.App/UI/UiMenu.cs` (the two overrides) | The popup is the ONLY overlay-drawing widget in the tree today (grep-confirmed: exactly one `OnDrawOverlay` override client-wide), and it already renders on top of the whole UI by construction (the overlay pass beats even rect backgrounds), so exempting it from the ancestor clip matches its existing "regardless of tree position" contract rather than introducing new behavior. | A future `OnDrawOverlay` override that is NOT a screen-anchored popup (e.g. an in-place highlight meant to stay window-clipped) would silently escape every ancestor's clip if it left `ExpandsClipForPopup` at its default; the opt-in default direction makes that the exception rather than the rule, but a widget that WANTS window-clipped overlay content has no dedicated seam beyond simply not overriding the escape. | `UIRegion::DrawHere @0x0069FA30`; `UIElement_Menu::MakePopup`; the register's own AP-201 retirement note (the FIRST `ClipsChildren`/`PushClip` port, for `UiScrollablePanel`'s viewport) | | AD-113 | **Filed 2026-08-25 at Campaign CT slice CT-GF1 (client-wide retained-UI ancestor clip).** Porting retail's `UIRegion::DrawHere @0x0069FA30` ancestor-clip intersection (an element's screen rect is intersected against the FULL inherited clip-rect chain and the subtree is skipped when the intersection is empty — the `var_24` gate @0x0069FB8E) as `UiElement.ClipsChildren`'s new client-wide default (true, threaded through the pre-existing `UiRenderContext.PushClip`/`PopClip`) needed one deliberate opt-out: retail spawns a menu's dropdown popup as a SEPARATE top-level region (`UIElement_Menu::MakePopup`), clipped only by the screen, while acdream's `UiMenu` draws its popup INLINE from the owning button in a second traversal (`OnDrawOverlay`, pre-existing, "regardless of this element's position in the tree" by its own doc comment). Without an escape, the new ancestor clip would wrongly cut off a popup that legitimately extends outside its own (possibly short) owning window — e.g. a channel dropdown opened upward past a short chat window's top edge. `UiElement.ExpandsClipForPopup` (default false) resets the accumulated clip to the full CANVAS rect (0,0,ScreenSize) — SCREEN-clipped, not truly unbounded, matching retail's own popup region (`UIElement_Menu::MakePopup` spawns a top-level region bounded by the screen) — for exactly the `OnDrawOverlay` call of an opted-in element (`UiRenderContext.PushClipUnbounded`, sharing the existing clip stack; corrected from an earlier `null`/unbounded clip at the CT-GF1 fix round); `UiMenu` overrides it true, paired with `ClipsChildren => false` so its own out-of-bounds `OnHitTest` union (the popup occupies `ly < 0` or `ly >= Height` depending on open direction) stays reachable through the same early-bounds gate that now defaults on for every other element. | `src/AcDream.App/UI/UiElement.cs` (`ClipsChildren`, `ExpandsClipForPopup`, `DrawOverlays`); `src/AcDream.App/UI/UiRenderContext.cs` (`PushClipUnbounded`); `src/AcDream.App/UI/UiMenu.cs` (the two overrides) | The popup is the ONLY overlay-drawing widget in the tree today (grep-confirmed: exactly one `OnDrawOverlay` override client-wide), and it already renders on top of the whole UI by construction (the overlay pass beats even rect backgrounds), so exempting it from the ancestor clip matches its existing "regardless of tree position" contract rather than introducing new behavior. | A future `OnDrawOverlay` override that is NOT a screen-anchored popup (e.g. an in-place highlight meant to stay window-clipped) would silently escape every ancestor's clip if it left `ExpandsClipForPopup` at its default; the opt-in default direction makes that the exception rather than the rule, but a widget that WANTS window-clipped overlay content has no dedicated seam beyond simply not overriding the escape. | `UIRegion::DrawHere @0x0069FA30`; `UIElement_Menu::MakePopup`; the register's own AP-201 retirement note (the FIRST `ClipsChildren`/`PushClip` port, for `UiScrollablePanel`'s viewport) |
| AD-118 | **ATTRIBUTION REOPENED 2026-09-05 (#472, S5 packet §39): live `newmethod=1` selects matrix-based rays while the replay implements the legacy branch. The earlier x87-only explanation below is not established until the mixed-projection harness defect is isolated; no production change or new accepted failure is implied.** **Filed 2026-09-03 at Campaign OVERHAUL v2 S3 (docs/ISSUES.md #458, resolved).** The walk's portal-view EDGE PLANES are built from acdream's own float projection (`WalkCopyView` on `IWalkRayCaster`'s unprojected rays; the replay context's `Matrix4x4` view-proj), while retail builds them in `Render::copy_view @0x0054dfc0` from D3D-transformed screen points under x87 arithmetic. The planes agree to about 0.5 % (measured live at the Holtburg doorway: the fourth door-edge plane's clip height at the ring-21 block `a9c9` is 300.4/310.2 m in retail vs 298.8/308.5 m here — a slope ratio of 0.05104 vs 0.05042, roughly 0.35 px of projected door-vertex position at 720p), which is invisible everywhere except at a block/cell corner that sits within that margin of a plane: there `Render::block_check`'s four-corner unanimity test can flip PartiallyInside↔Outside for a far LOD block (one corner inside for us, outside for retail), admitting or skipping a whole distant land block retail decides the other way. | `src/AcDream.App/Rendering/Walk/WalkCopyView.cs` (per-edge plane build); `src/AcDream.App/Rendering/Walk/WalkVisibilityMath.cs` (`FillClipHeights`, `CornerPlaneCheck`, `BlockCheck`); `tests/AcDream.App.Tests/Rendering/Walk/WalkTraceReplay.cs` (the replay's projection) | Bit-exact agreement would require reproducing D3D's x87 vertex transform and `copy_view`'s exact rounding order; the algorithm, sentinels, loop shape, z slab padding and verdict logic are all ported verbatim and reproduce three of four capture poses exactly at the eight-kind transcript level. | A land block at ≥ 20 rings whose corner lies within ~0.5 % of a doorway edge plane may be drawn where retail skips it (or vice versa) — one far, low-LOD block, no known visible artifact; the `WalkTraceConformanceTests.Oh_doorway_still_first_frame_diff` row stays `KnownFailure` as the standing example. | `Render::copy_view @0x0054dfc0`; `Render::get_clip_height @0x0054cff0`; `Render::block_check @0x0054dc50`; `LScape::draw_check_blocks @0x00505f80` (the `if (esi_3 != 0)` residency gate and the per-view `block_check` call @0x005061df); captures `docs/research/2026-09-01-overhaul/oh-capture/holtburg-doorway-still.blockcheck.log` / `.blockset.log` | | AD-118 | **DIAGNOSTICALLY DISPROVEN 2026-09-05; permanent test correction/review pending (S5 packet §40).** The observed #458 doorway and #472 stair differences came from the replay's legacy rays paired with a different forward projection; frame-entry pose timing also mattered. Captured newmethod=1 selects the matrix branch. The corrected matrix plus next-marker pose reproduces all 25 complete OH/capture frames exactly; the old x87-only attribution is superseded. | `tests/AcDream.App.Tests/Rendering/Walk/WalkTraceReplay.cs`; `WalkOracleTrace.cs`; shared conformance Recorder | No production deviation has been established by these fixtures. Retire this row's acceptance rationale with C1c's permanent discriminating proof; ordinary floating-point differences are not permission to accept a transcript mismatch. | #458's KnownFailure remains only until the permanent default replay row passes; no new failure accepted. The historical evidence remains in docs/ISSUES.md, explicitly superseded. | `Render::copy_view @0054dfc0`; `PrimD3DRender::ScreenToViewTransform @0059aa40`; `SmartBox::RenderNormalMode @00453aa0`; packet §§3940; `s5-c1b-projection-diagnostic.txt` |
--- ---

View file

@ -696,7 +696,7 @@ Update immediately when a slice changes state. Chat is not the ledger.
| S5-#470 | **LANDED + REVIEW-CLOSED 2026-09-05; LEAD GRAPHICAL A/B PROVISIONAL PASS.** Campaign implementation stack `15a796c3a` -> `7506e5f14` -> `b333edb4f`; route `19b44e5e3`; reviewed scratch `51f974da4` -> `2cad9c84` -> `98c004aa7`; packet §§2730. | G4 UNPASSED | Retail/behavior pass 2/10 and production pass 4/10 closed the two evidence-only findings. Fresh campaign Release 0W/0E and focused 48/48; exact scratch hermetic 16,976/16,976 and canonical InstalledDat 386/10/1, manifests 30/30. Pinned gate `logs/selfgate-20260905-032132-s5-470-pinned-shadow-ab-r1`: retail/off -> High -> retail/off, 3/3 PNGs, exit 0, graceful, no client; visual PASS provisional. The stale recipe-8 pre-route launch is excluded and recorded in §30. | | S5-#470 | **LANDED + REVIEW-CLOSED 2026-09-05; LEAD GRAPHICAL A/B PROVISIONAL PASS.** Campaign implementation stack `15a796c3a` -> `7506e5f14` -> `b333edb4f`; route `19b44e5e3`; reviewed scratch `51f974da4` -> `2cad9c84` -> `98c004aa7`; packet §§2730. | G4 UNPASSED | Retail/behavior pass 2/10 and production pass 4/10 closed the two evidence-only findings. Fresh campaign Release 0W/0E and focused 48/48; exact scratch hermetic 16,976/16,976 and canonical InstalledDat 386/10/1, manifests 30/30. Pinned gate `logs/selfgate-20260905-032132-s5-470-pinned-shadow-ab-r1`: retail/off -> High -> retail/off, 3/3 PNGs, exit 0, graceful, no client; visual PASS provisional. The stale recipe-8 pre-route launch is excluded and recorded in §30. |
| S5-#469 | **LANDED + REVIEW-CLOSED 2026-09-05; LEAD GRAPHICAL TRANSITION PROVISIONAL PASS.** Contract `809887524`; reviewed scratch `c09b6cf0f`; campaign implementation `94ddde69a`; route `62efc72cb`; packet §§3132. | G4 UNPASSED | Retail/deviation pass 1/10 and production pass 2/10 both PASS with no finding. The two atmospheric vertex receivers keep retail's authored unnormalized `uLights` direction across every shadow gate; celestial direction remains for opt-in shadow/volumetric projection; IA-24 corrected in the same commit. Exact scratch: Release 0W/0E, focused 126/126, Vulkan 2/2, hermetic 16,983/16,983, InstalledDat 386/10/1. Fresh campaign Release 0W/0E, focused 82/82, Vulkan 2/2. Gate `logs/selfgate-20260905-040449-s5-469-lighting-transition-r1`: five PNGs, active 2,500-caster/four-cascade High rows, no near-black relight, exit 0/graceful, no client; visual PASS provisional. | | S5-#469 | **LANDED + REVIEW-CLOSED 2026-09-05; LEAD GRAPHICAL TRANSITION PROVISIONAL PASS.** Contract `809887524`; reviewed scratch `c09b6cf0f`; campaign implementation `94ddde69a`; route `62efc72cb`; packet §§3132. | G4 UNPASSED | Retail/deviation pass 1/10 and production pass 2/10 both PASS with no finding. The two atmospheric vertex receivers keep retail's authored unnormalized `uLights` direction across every shadow gate; celestial direction remains for opt-in shadow/volumetric projection; IA-24 corrected in the same commit. Exact scratch: Release 0W/0E, focused 126/126, Vulkan 2/2, hermetic 16,983/16,983, InstalledDat 386/10/1. Fresh campaign Release 0W/0E, focused 82/82, Vulkan 2/2. Gate `logs/selfgate-20260905-040449-s5-469-lighting-transition-r1`: five PNGs, active 2,500-caster/four-cascade High rows, no near-black relight, exit 0/graceful, no client; visual PASS provisional. |
| S5-c5 | **CLOSED + LANDED 2026-09-05; LEAD GRAPHICAL SMOKE PROVISIONAL PASS.** Contract `b77989c32`; campaign `bf53e2ad6` -> `e625dc4e6` -> `1b7ee4e58`; reviewed scratch tip `158656f0d`; packet §§3335. | G4 UNPASSED | Retail/deletion pass 1/10 PASS. Production pass 2/10 found one static-field hole in the owner guard; fix round 1 reproduced both static-owner mutations, and production pass 3/10 PASS. Exact scratch hermetic 16,921/16,921, canonical InstalledDat 368/9/1, manifests 30/30. Fresh campaign Release 0W/0E, App 146/146, Core 8/8. A stale recipe-8 preflight is excluded; a non-destructive recipe-10 bake produced 2,237,865 keys with zero failures. Corrected gate `logs/selfgate-20260905-052130-s5-c5-landed-v10`: five PNGs, exit 0/graceful, no fatal/deleted-prefix match, no client left; geometry matches S5-c4, visual PASS provisional. | | S5-c5 | **CLOSED + LANDED 2026-09-05; LEAD GRAPHICAL SMOKE PROVISIONAL PASS.** Contract `b77989c32`; campaign `bf53e2ad6` -> `e625dc4e6` -> `1b7ee4e58`; reviewed scratch tip `158656f0d`; packet §§3335. | G4 UNPASSED | Retail/deletion pass 1/10 PASS. Production pass 2/10 found one static-field hole in the owner guard; fix round 1 reproduced both static-owner mutations, and production pass 3/10 PASS. Exact scratch hermetic 16,921/16,921, canonical InstalledDat 368/9/1, manifests 30/30. Fresh campaign Release 0W/0E, App 146/146, Core 8/8. A stale recipe-8 preflight is excluded; a non-destructive recipe-10 bake produced 2,237,865 keys with zero failures. Corrected gate `logs/selfgate-20260905-052130-s5-c5-landed-v10`: five PNGs, exit 0/graceful, no fatal/deleted-prefix match, no client left; geometry matches S5-c4, visual PASS provisional. |
| S5 | **IN FLIGHT: owner capture completed; C1b projection diagnostic contracted.** c1c5 plus #470/#469 landed, review-closed, and provisionally self-gated; C1 offline evidence complete; C1a remains stopped pending diagnostic result. | G4 | Packet §§7 and 1239 bind. New capture proves e229 resident+rejected at the current stairwell pose; follow-up `newmethod=1` exposes test replay's wrong legacy ray branch. C1b compares coherent captured-matrix projection/rays with baseline and all OH transcripts, without production or default-test changes. Then close C1a's recorder/geometry-hash witnesses, C2 and G4. Never merge main before G4. | | S5 | **IN FLIGHT: C1b diagnostic complete; C1c permanent replay correction contracted.** c1c5 plus #470/#469 landed, review-closed, and provisionally self-gated; C1 offline evidence complete. | G4 | Packet §§7 and 1240 bind. Corrected matrix projection + next-marker pose + live-view EC recording match all 25 complete OH/capture frames exactly; #458/#472 and AD-118's former x87 attribution are disproven as harness defects. C1c makes the proven correction permanent with mutations and sequential reviews; then C1a geometry/membership hash, full-lane closeout, C2 and G4. No production code changed in the diagnostic. Never merge main before G4. |
--- ---

View file

@ -0,0 +1,65 @@
S5 closeout C1b projection diagnostic evidence
Contract/source identity: HEAD 3f5ca9ff4f392169138e7438f441795e640325cb, branch codex/s5-closeout-harness
Date: 2026-09-05
Safety/provenance
- The owner's retail acclient PID 29732 remained running. No graphical client was launched.
- Only the test assembly was built. Both referenced production AcDream.App.dll copies were SHA-256
90BB90521F8F46B3887234F9D560E33616F108492693AA7597AEE0850E87FA76 before and after.
- No production source, fixture, shared assertion, status, or gate was changed. No commit was created.
Commands and exact outcomes
1. Test-project build used before the initial diagnostic:
dotnet build tests/AcDream.App.Tests/AcDream.App.Tests.csproj -c Release --no-restore --no-dependencies -v:minimal
AcDream.App.Tests.dll built; Build succeeded; 0 Warning(s), 0 Error(s); 00:00:08.31.
2. Standalone round-trip witness:
dotnet test tests/AcDream.App.Tests/AcDream.App.Tests.csproj -c Release --no-build --filter "FullyQualifiedName~WalkProjectionDiagnosticTests.Captured_matrix" --results-directory artifacts/s5-c1b-projection-3f5ca9ff4 --logger "trx;LogFileName=roundtrip.trx" --logger "console;verbosity=detailed"
Passed 1/1 in 0.8824 s. Maximum corrected round-trip error was 0.000110485424 pixel.
Legacy center through the captured projection was (512.5008,360.5003).
Artifact: roundtrip.trx
SHA-256: C89C808F3333A88A0F5B951A89EB02758AED779B481CFA5BA16FA7E84B038212
3. Retained initial diagnostic, before the nullable outdoor-camera correction:
dotnet test tests/AcDream.App.Tests/AcDream.App.Tests.csproj -c Release --no-build --filter "FullyQualifiedName~WalkProjectionDiagnosticTests.Captured_and_historical" --results-directory artifacts/s5-c1b-projection-3f5ca9ff4 --logger "trx;LogFileName=walk-diagnostic.trx" --logger "console;verbosity=detailed"
Failed 0/1 after 2.1381 s at terrace-edge: the diagnostic incorrectly required outdoor cell
f418000b in the interior-cell dictionary. All output before that harness failure is retained.
Artifact: walk-diagnostic.trx
SHA-256: E22C1DD24527C16CD637B069266A0676CBAD36AB3E78EDF4BBF3C8615F33507F
4. Test-assembly-only rebuild after correcting nullable outdoor camera and target lookup:
dotnet build tests/AcDream.App.Tests/AcDream.App.Tests.csproj -c Release --no-restore --no-dependencies /p:BuildProjectReferences=false -v:minimal
AcDream.App.Tests.dll built; Build succeeded; 0 Warning(s), 0 Error(s); 00:00:06.69.
Production AcDream.App.dll SHA-256 was unchanged before/after at both source and test output paths:
90BB90521F8F46B3887234F9D560E33616F108492693AA7597AEE0850E87FA76.
5. Final complete focused diagnostic:
dotnet test tests/AcDream.App.Tests/AcDream.App.Tests.csproj -c Release --no-build --filter "FullyQualifiedName~WalkProjectionDiagnosticTests" --results-directory artifacts/s5-c1b-projection-3f5ca9ff4 --logger "trx;LogFileName=walk-diagnostic-final.trx" --logger "console;verbosity=minimal"
Passed 2/2, failed 0, skipped 0, duration 2 s.
Artifact: walk-diagnostic-final.trx
SHA-256: 8E14F9BFFCAF57047D0990185FAB393170CEC962024C035C01422C4DC266B00E
Measured result
- The final TRX retains 100 labeled full-sequence LCS comparisons: both projections, both marker
pairings, the new capture, four complete frames for each historical OH fixture, and every edit.
- Captured-matrix + retail-correct next-marker pairing was exact in all 25/25 comparisons.
- Captured-matrix was exact in 49/50 comparisons across both pairings. Its only mismatch was #458
frame 1 under the known-wrong same-marker pairing: inserted LC/SC a9c90001.
- Legacy was exact in 26/50 comparisons. It inserted LC/SC e2290001 in every historical stair
frame, inserted LC/SC a9c90001 for #458, and omitted LC/SC fe180001 for cathedral-leak.
- On the historical stair, captured-matrix changes e229 from PartiallyInside/LC=true/SC=true to
Outside/CellInView[0]=Outside/LC=false/SC=false for all four frames under both pose associations.
- For the new capture's correct F1-events/F2-pose comparison, e229 is present at slot 399,
ring 18, side 1, slab bf800000..43890000; all seven per-view BlockCheck verdicts are Outside;
final InView and CellInView[0] are Outside; LC=false and SC=false. Raw points, edge planes, CY,
four interval vectors, verdicts, and nearest-edge margins are retained in the final TRX.
Limitations
- Applying the captured D3D projection to historical captures is explicitly labeled a
same-configuration hypothesis; those captures did not independently dump their matrix words.
- This is an InstalledDat replay diagnostic, not a connected/runtime geometry publication witness.
- The new capture's Signature8 happens to be exact under both ray implementations; its raw
e229 admission verdict therefore does not alone discriminate the projection paths. The raw
inputs can be compared; historical-frame equality and round-trip tests provide discrimination.
- No accepted conformance expectation or default replay constructor behavior was changed.

View file

@ -1,8 +1,8 @@
# Campaign OVERHAUL v2 — S5 consumers, material, and closeout packet # Campaign OVERHAUL v2 — S5 consumers, material, and closeout packet
**Status:** S5-c1 through S5-c5 plus #470/#469 LANDED + REVIEW-CLOSED with lead **Status:** S5-c1 through S5-c5 plus #470/#469 LANDED + REVIEW-CLOSED with lead
graphical gates PROVISIONAL PASS; closeout C1 passed; C1a is STOPPED on the graphical gates PROVISIONAL PASS; closeout C1 passed; C1b diagnostic reproduces
retail-live fact in #472 now captured; C1b projection diagnostic is contracted; all 25 complete OH/capture frames; C1c permanent replay correction is contracted;
connected/performance C2 and G4 remain. connected/performance C2 and G4 remain.
**Branch:** `claude/campaign-w-retail-frame-walk`. **Branch:** `claude/campaign-w-retail-frame-walk`.
**Gate:** G4 remains unpassed. Nothing merges to `main` before G4. **Gate:** G4 remains unpassed. Nothing merges to `main` before G4.
@ -3703,3 +3703,154 @@ 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 the subsequent correction contract from the measured result; then the normal
sequential retail and production reviews apply. C1a's product hash and test sequential retail and production reviews apply. C1a's product hash and test
closure, C2, and G4 remain; no merge to main. 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.
1. 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.
2. 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.
3. 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 @005a4ab1005a4acc and
@005a4ade005a4b1a. Keep the oracle's EC/OC literal, never derived from DC.
4. 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.
5. 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.