diff --git a/docs/plans/2026-09-01-campaign-overhaul-world-solidity.md b/docs/plans/2026-09-01-campaign-overhaul-world-solidity.md index 92e1ced3..04927fc6 100644 --- a/docs/plans/2026-09-01-campaign-overhaul-world-solidity.md +++ b/docs/plans/2026-09-01-campaign-overhaul-world-solidity.md @@ -674,7 +674,7 @@ Update immediately when a slice changes state. Chat is not the ledger. | S1 | `acf17246`, `b681717c`, `0840d5fb`, `e2543d0e`, `8c6563ca` (+ pin test) | G1 PASS 2026-09-02 | revert newest-first; then restore `acdream.recipe7.pak` over `acdream.pak` in the dev DAT dir (the recipe-8 consumer rejects a recipe-7 pak, and vice versa) | | S2 | `059b8883`, `5a2792d6`, `707d2803`, `afbd2410`, `75ea269d`, `c94a1a40`, `f6b4584b` | G2 PASSED 2026-09-03 (owner-confirmed after the chunk-6 haze fix; terrain punch carried to S4) | revert newest-first `c94a1a40` → `059b8883`; the registry's retail product and the walk's borrowed views go together — do not revert a middle chunk alone | | S3 | chunk 2: `be9b4c1f`, `2f5373c7`, `434a7df2`; chunk 3: `4ee2866a`, `651badc2`, `e10765aa`, `896c63fe`, `74ac7aa2`; chunk 1: `02a82881`, `be81475c`, `88c70072` | G3 | chunk 3: revert newest-first `74ac7aa2` → `4ee2866a` as one unit (the per-cell terrain, the slot key, the deferred batching and the per-frame diagnostic go together); chunk 2: revert newest-first `434a7df2` → `be9b4c1f` (the counter, the leaf split and the flag deletion go together) | -| S4 | — | G3 | OPEN 2026-09-03 night. Packet `docs/research/2026-09-01-overhaul/s4-depth-alpha-packet.md`: §1 records that S3 chunk 2 already delivered S4's chunk-1 latch/gate/seal scope (the latch owner, the gated flush→stamp→clear→seal block, the counted seals); what remains of chunk 1 is small and dispatched as **S4-c1** (`s4-c1.js`, worktree `s4-c1-impl` at `6385f4411`, contract = packet §6): C0 the far-punch constant — `portal_depth.vert` carries `0.99999988` = bits `0x3F7FFFFE`, retail's is `0x3F7FFFEF` (15 ULPs nearer; the depth spec's "wrong constant" row was right; lead bit check 2026-09-03) → retail's exact bits + a source pin; C1 the ±12 local-input reject at both portal-polygon producers (Ghidra table row 0x59BCD6–0x59BD28); C2 the portal-depth color-state register row (ColorWrite off vs retail's zero-alpha blend, identical output); C3 the depth truth-table Theory, the cross-frame latch test, look-ins isolated from the root latch. Chunk 2 = the two-FIFO alpha-list cutover (packet §3); chunk 3 = deletions (packet §4). G3 is S4's owner gate; the lead's S3-state G3 pre-run (20/20 frames, in the S3 row) is the baseline to diff against. | **S4-c1 ROUND 0 = `c7ab5b6d8` (Sonnet), THREE LENSES FAIL (2026-09-03 21:00–21:20):** one BLOCKING defect seen by all three — the ±12 guard's quantifier is inverted (rejects on ANY vertex on ANY plane; retail's PDB-paired bytes at 0x59BCD6–0x59BD66 reject only when EVERY vertex lies on the SAME plane) — and the LEAD's §6 paraphrase carried the same inversion (corrected in §6; lesson saved to memory: quote the decomp predicate, never paraphrase it). The production lens's DAT scan: 2,889 portal polygons carry a ±12 vertex and 2,163 EXIT polygons lie ENTIRELY on a ±12 plane — so the guard is very likely retail's never-sealed 'panel' mechanism (the #456/#465 family), which makes the PM/PC depth-event transcript comparison against the four alphadepth captures the chunk's real gate (never run in round 0). Also: the register-test gate is vacuous (no test reads the register), the manifest comment's ULP direction is inverted. C0 (retail's exact far-punch bits, verified at the binary), C2 (AD-119) and C3 (three new truth-table/latch pins, nine mutation texts) verified. FIX ROUND 1 = S4 packet §7 (`s4-c1-fix1.js`, dispatched 21:20): the four per-plane predicates at both producers with five-case T2, the seal count order, the automated PM/PC gate over the captures (a diverging pose is tagged KnownFailure and written up, never weakened), comment truth. **S4-c2 CONTRACT DRAFTED** (packet §8, 2026-09-03 21:50): two FIFO lists of 3000, the spec §4 router as one pure function, the four flush sites (the sort-cell EXIT valve as a new walk event kind), `FlushFartherThan`/AP-34/every viewer distance deleted, and the AM/FL transcript gate over the five captures (10,556 `AM` lines, all `clip=0`; `FL` by site 13,705/309/18/23) as the proof; dispatched only after c1 lands. **S4-c1 FIX ROUND 1 = `2bd353234` (Sonnet, 295 tool calls), THREE LENSES 2026-09-03 22:07–23:00: retail-faithful PASS, production PASS, gate-honesty FAIL.** Confirmed at the bytes: the four per-plane accumulators at both producers, the count-after-guard order, the PM/PC gate's reading of retail's lines; five transcript poses pass (cathedral-arrival, cathedral-leak, foundry-deep, holtburg-doorway-still) with terrace-edge tagged KnownFailure. Findings, all on that one row plus one pin gap: (blocking) the KnownFailure write-up claims the PC sequence matches — false and never evaluated (the PM assert throws first); (major ×2) the divergence is a harness initial-condition choice — seed `portalsDrawnCount` from the fixture's first observed counter and the row turns green while the two-pass priming retires; (major) T2's five cases do not discriminate 'every vertex on SOME plane' from retail's 'every vertex on the SAME plane'; (minor ×4) stale seal-path summaries, an unobservable mutation named in the F2 pin's comment, doc-comment DAT figures an independent scan does not fully reproduce, a vacuous 'register tests' gate claim. The lead's own replay of the gate at `2bd353234` with the new `cathedral-stair-arch` capture added as a sixth Fact PASSES (its seed value is 8). **FIX ROUND 2 = packet §9 (the LAST round; dispatched 23:10):** seed the counter from the fixture (one pass), compare and print both sequences together, the discriminating ±12 case, the sixth pose, comment truth. **FIX ROUND 2 = `9ba8f013e` (Sonnet; on the two cherry-picked capture commits), THREE LENSES 2026-09-03 23:10–23:38: retail PASS (byte evidence: `portalsDrawnCount` has exactly one increment site 0x59BD74 and one reset site 0x5A489E under `view_count > 0`, `forceClear` has no writer; the discriminating case is admitted by retail's four per-plane accumulators), production PASS (round-2 src diff = comment text only; no pin weakened; gates reproduce on a fresh Release build), gate-honesty FAIL on comment truth only (the terrace-edge Fact's comment claimed a PC match that seeding, not the pre-fix state, produced; the stair-arch comment states a rejection count the PM/PC tuple cannot observe; a DAT-scan comment cites a pin that does not pin). All six transcript poses PASS (terrace-edge's KnownFailure removed; seed values 0/0/1/2/2/8). **S4-c1 LANDED 2026-09-03 23:38–23:40** as `d1e3e64f6` + `5de42a12f` + `323f5a334` (cherry-picks of rounds 0–2) + `766f9e749` (the LEAD corrected the four flagged sentences — a third implementer round is barred by §5; code unchanged; owner to review). Landing gates: Release 0 warnings; six transcript Facts 6/6; hermetic 6,833/6,833; InstalledDat 249 pass / 4 known (#383 ×2, TowerAscent, #458) / 1 skip. Landing self-gates: route.txt four poses `logs/selfgate-20260903-234934-s4c1-landed-route2` (Facility panels present, mean RGB (79,20,25)); capture poses `logs/selfgate-20260903-234030-s4c1-landed-g3b` and `…-235044-s4c1-landed-g3b2` — frames 13/14/16 in band, **frame 15 (holtburg-doorway) shows an empty plane under fog TWICE** where the S3-state run `logs/selfgate-20260903-165634-g3b` showed the village. Lead read 2026-09-04: the server snapped the requested y 13.39→17.39 in every run; the CLIENT then seated the player in the house-interior cell `0xA9B4013F` at (134.07, 17.36) in both landed runs versus the outdoor cell `0xA9B40029` at (133.60, 17.39) in the S3-state run (0.46 m apart on the doorway threshold), so the frame roots from the interior cell with the eye outside — a placement/membership boundary at the doorway, not a draw change; S4-c1 touched no placement code. A pre-S4 control at `6575cfcee` (`s3-review-fix/logs/selfgate-20260904-042324-pre-s4-g3b`) produced 0 frames: the login reveal at `0xA9B40176` never went visible (#462 class) and the process exited 0xE0434352 after the graceful logout (#461 class) → INCONCLUSIVE; the A/B re-run (landed tip twice + pre-S4 once) is owed before any further self-gate is trusted at that pose. **S4-c2 DISPATCH 2026-09-03 23:41 DIED** on the account's session limit / credit exhaustion with no commit; worktree `s4-c2-impl` reset clean at `766f9e749`. Session handed to a new account 2026-09-04 morning; ACE was NOT running at hand-over (no UDP 9000 listener), so every connected gate waits on the owner starting it. +| S4 | — | G3 | OPEN 2026-09-03 night. Packet `docs/research/2026-09-01-overhaul/s4-depth-alpha-packet.md`: §1 records that S3 chunk 2 already delivered S4's chunk-1 latch/gate/seal scope (the latch owner, the gated flush→stamp→clear→seal block, the counted seals); what remains of chunk 1 is small and dispatched as **S4-c1** (`s4-c1.js`, worktree `s4-c1-impl` at `6385f4411`, contract = packet §6): C0 the far-punch constant — `portal_depth.vert` carries `0.99999988` = bits `0x3F7FFFFE`, retail's is `0x3F7FFFEF` (15 ULPs nearer; the depth spec's "wrong constant" row was right; lead bit check 2026-09-03) → retail's exact bits + a source pin; C1 the ±12 local-input reject at both portal-polygon producers (Ghidra table row 0x59BCD6–0x59BD28); C2 the portal-depth color-state register row (ColorWrite off vs retail's zero-alpha blend, identical output); C3 the depth truth-table Theory, the cross-frame latch test, look-ins isolated from the root latch. Chunk 2 = the two-FIFO alpha-list cutover (packet §3); chunk 3 = deletions (packet §4). G3 is S4's owner gate; the lead's S3-state G3 pre-run (20/20 frames, in the S3 row) is the baseline to diff against. | **S4-c1 ROUND 0 = `c7ab5b6d8` (Sonnet), THREE LENSES FAIL (2026-09-03 21:00–21:20):** one BLOCKING defect seen by all three — the ±12 guard's quantifier is inverted (rejects on ANY vertex on ANY plane; retail's PDB-paired bytes at 0x59BCD6–0x59BD66 reject only when EVERY vertex lies on the SAME plane) — and the LEAD's §6 paraphrase carried the same inversion (corrected in §6; lesson saved to memory: quote the decomp predicate, never paraphrase it). The production lens's DAT scan: 2,889 portal polygons carry a ±12 vertex and 2,163 EXIT polygons lie ENTIRELY on a ±12 plane — so the guard is very likely retail's never-sealed 'panel' mechanism (the #456/#465 family), which makes the PM/PC depth-event transcript comparison against the four alphadepth captures the chunk's real gate (never run in round 0). Also: the register-test gate is vacuous (no test reads the register), the manifest comment's ULP direction is inverted. C0 (retail's exact far-punch bits, verified at the binary), C2 (AD-119) and C3 (three new truth-table/latch pins, nine mutation texts) verified. FIX ROUND 1 = S4 packet §7 (`s4-c1-fix1.js`, dispatched 21:20): the four per-plane predicates at both producers with five-case T2, the seal count order, the automated PM/PC gate over the captures (a diverging pose is tagged KnownFailure and written up, never weakened), comment truth. **S4-c2 CONTRACT DRAFTED** (packet §8, 2026-09-03 21:50): two FIFO lists of 3000, the spec §4 router as one pure function, the four flush sites (the sort-cell EXIT valve as a new walk event kind), `FlushFartherThan`/AP-34/every viewer distance deleted, and the AM/FL transcript gate over the five captures (10,556 `AM` lines, all `clip=0`; `FL` by site 13,705/309/18/23) as the proof; dispatched only after c1 lands. **S4-c1 FIX ROUND 1 = `2bd353234` (Sonnet, 295 tool calls), THREE LENSES 2026-09-03 22:07–23:00: retail-faithful PASS, production PASS, gate-honesty FAIL.** Confirmed at the bytes: the four per-plane accumulators at both producers, the count-after-guard order, the PM/PC gate's reading of retail's lines; five transcript poses pass (cathedral-arrival, cathedral-leak, foundry-deep, holtburg-doorway-still) with terrace-edge tagged KnownFailure. Findings, all on that one row plus one pin gap: (blocking) the KnownFailure write-up claims the PC sequence matches — false and never evaluated (the PM assert throws first); (major ×2) the divergence is a harness initial-condition choice — seed `portalsDrawnCount` from the fixture's first observed counter and the row turns green while the two-pass priming retires; (major) T2's five cases do not discriminate 'every vertex on SOME plane' from retail's 'every vertex on the SAME plane'; (minor ×4) stale seal-path summaries, an unobservable mutation named in the F2 pin's comment, doc-comment DAT figures an independent scan does not fully reproduce, a vacuous 'register tests' gate claim. The lead's own replay of the gate at `2bd353234` with the new `cathedral-stair-arch` capture added as a sixth Fact PASSES (its seed value is 8). **FIX ROUND 2 = packet §9 (the LAST round; dispatched 23:10):** seed the counter from the fixture (one pass), compare and print both sequences together, the discriminating ±12 case, the sixth pose, comment truth. **FIX ROUND 2 = `9ba8f013e` (Sonnet; on the two cherry-picked capture commits), THREE LENSES 2026-09-03 23:10–23:38: retail PASS (byte evidence: `portalsDrawnCount` has exactly one increment site 0x59BD74 and one reset site 0x5A489E under `view_count > 0`, `forceClear` has no writer; the discriminating case is admitted by retail's four per-plane accumulators), production PASS (round-2 src diff = comment text only; no pin weakened; gates reproduce on a fresh Release build), gate-honesty FAIL on comment truth only (the terrace-edge Fact's comment claimed a PC match that seeding, not the pre-fix state, produced; the stair-arch comment states a rejection count the PM/PC tuple cannot observe; a DAT-scan comment cites a pin that does not pin). All six transcript poses PASS (terrace-edge's KnownFailure removed; seed values 0/0/1/2/2/8). **S4-c1 LANDED 2026-09-03 23:38–23:40** as `d1e3e64f6` + `5de42a12f` + `323f5a334` (cherry-picks of rounds 0–2) + `766f9e749` (the LEAD corrected the four flagged sentences — a third implementer round is barred by §5; code unchanged; owner to review). Landing gates: Release 0 warnings; six transcript Facts 6/6; hermetic 6,833/6,833; InstalledDat 249 pass / 4 known (#383 ×2, TowerAscent, #458) / 1 skip. Landing self-gates: route.txt four poses `logs/selfgate-20260903-234934-s4c1-landed-route2` (Facility panels present, mean RGB (79,20,25)); capture poses `logs/selfgate-20260903-234030-s4c1-landed-g3b` and `…-235044-s4c1-landed-g3b2` — frames 13/14/16 in band, **frame 15 (holtburg-doorway) shows an empty plane under fog TWICE** where the S3-state run `logs/selfgate-20260903-165634-g3b` showed the village. Lead read 2026-09-04: the server snapped the requested y 13.39→17.39 in every run; the CLIENT then seated the player in the house-interior cell `0xA9B4013F` at (134.07, 17.36) in both landed runs versus the outdoor cell `0xA9B40029` at (133.60, 17.39) in the S3-state run (0.46 m apart on the doorway threshold), so the frame roots from the interior cell with the eye outside — a placement/membership boundary at the doorway, not a draw change; S4-c1 touched no placement code. A pre-S4 control at `6575cfcee` (`s3-review-fix/logs/selfgate-20260904-042324-pre-s4-g3b`) produced 0 frames: the login reveal at `0xA9B40176` never went visible (#462 class) and the process exited 0xE0434352 after the graceful logout (#461 class) → INCONCLUSIVE; the A/B re-run (landed tip twice + pre-S4 once) is owed before any further self-gate is trusted at that pose. **S4-c2 DISPATCH 2026-09-03 23:41 DIED** on the account's session limit / credit exhaustion with no commit; worktree `s4-c2-impl` reset clean at `766f9e749`. Session handed to a new account 2026-09-04 morning; ACE was NOT running at hand-over (no UDP 9000 listener), so every connected gate waits on the owner starting it. **HAND-OFF 2026-09-04 morning:** `docs/research/2026-09-01-overhaul/2026-09-04-s4-handoff.md` (read order, landed state, the S4-c2 implementer dispatched ~08:35 into `s4-c2-impl`, the #464 RenderDoc plan, the Holtburg doorway A/B, owner-owed items, tooling gotchas, paste-prompt). | S5 | — | G4 | fill | --- diff --git a/docs/research/2026-09-01-overhaul/2026-09-04-s4-handoff.md b/docs/research/2026-09-01-overhaul/2026-09-04-s4-handoff.md new file mode 100644 index 00000000..51b89952 --- /dev/null +++ b/docs/research/2026-09-01-overhaul/2026-09-04-s4-handoff.md @@ -0,0 +1,379 @@ +# Campaign OVERHAUL v2 — hand-off at S4 chunk 2 (2026-09-04 morning) + +Written by the lead session that took over after the 2026-09-03 session ran +out of account credits. Everything below is on disk under the Windows user +`erikn`; a fresh Claude account on this machine can read all of it. + +## 0. Read order for the new lead + +1. `CLAUDE.md` in the worktree (project rules; the grep-named-decomp-first + workflow; no workarounds; every new pin needs a mutation check). +2. `docs/plans/2026-09-01-campaign-overhaul-world-solidity.md` — the plan. + §5 working model, §9 slices, §10 scene matrix, **§13 ledger = live state** + (the S3 and S4 rows are long; read their tails). +3. `claude-memory/project_overhaul_campaign.md` (junction of + `C:\Users\erikn\.claude\projects\C--Users-erikn-source-repos-acdream\memory\`) + — the campaign digest, "Current" heading; then `MEMORY.md` for the + feedback memories it links (`feedback_quote_decomp_predicates`, + `feedback_every_new_pin_must_be_shown_to_fail`, + `feedback_skip_ab_before_theorizing`, `feedback_agent_worktree_base`, + `feedback_soak_numbers_need_same_session_type`). +4. `docs/research/2026-09-01-overhaul/s4-depth-alpha-packet.md` — S4's + packet: §1–§4 what remains of S4, **§8 = the S4-c2 contract**, §6/§7/§9 = + chunk 1's contract and its two fix rounds. +5. `docs/ISSUES.md` — #464 (long; the whole investigation), #460–#463, + #465–#467. +6. `docs/research/2026-09-01-overhaul/s3-walk-ownership-map.md` — S3's + packet (chunk contracts, review rounds; §6b = the retail capture record). +7. `docs/research/2026-09-01-overhaul/oh-capture/README.md` — the six retail + capture poses and their logs (walk / parts / alphadepth / pmverts / + blockcheck). +8. The previous sessions' transcripts, if you need the reasoning behind a + decision (grep, never read whole): + `C:\Users\erikn\.claude\projects\C--Users-erikn-source-repos-acdream--claude-worktrees-peaceful-blackburn-5333f0\f3ae8d4c-4f29-4329-8629-7252bd2bf4c2.jsonl` + (2026-09-02 15:20 → 2026-09-04 04:29, the S1–S4-c1 session) and this + session's under + `C:\Users\erikn\.claude\projects\C--Users-erikn-source-repos-acdream--claude-worktrees-eloquent-hugle-42119e\`. + +## 1. Where the work lives + +| Item | Value | +|---|---| +| Worktree | `C:\Users\erikn\source\repos\acdream\.claude\worktrees\peaceful-blackburn-5333f0` | +| Branch | `claude/campaign-w-retail-frame-walk`, tip `4c6fb8fa6` (docs) on `766f9e749` (code), clean | +| Base | `origin/main` `e102fb36` (2026-08-29); the branch carries all of Campaign FW + OVERHAUL, ~270 commits; **nothing merges to main before G4** | +| Dev pak | `%USERPROFILE%\Documents\Asheron's Call\acdream.pak`, bake recipe 8 (`acdream.recipe7.pak` kept beside it) | +| Release binary | `src\AcDream.App\bin\Release\net10.0\AcDream.App.exe` built at `766f9e749` | +| ACE | `127.0.0.1:9000`, `testaccount` / `testpassword`, character `+Acdream`. **Was NOT running at hand-over** (no UDP 9000 listener). Only the owner starts it. | +| Retail client for captures | `C:\Users\erikn\Downloads\acclient.exe` (2013 v11.4186, pairs with `refs/acclient.pdb`); the Turbine folder's exe is the 2015 build and does NOT pair | + +Scratch worktrees (all detached; keep or remove as you like): + +| Worktree | At | Purpose | +|---|---|---| +| `s4-c2-impl` | `766f9e749` | S4 chunk 2 implementer's worktree (see §3) | +| `s4-c1-impl` | `9ba8f013e` | chunk 1's rounds (landed; removable) | +| `s3-review-fix` | `6575cfcee` | pre-S4 A/B control build (route-g3b.txt copied in, dirty) | +| `s2-final-ab` | `78068b2c` | S2-final binary for same-session perf A/B soaks (keep) | +| `464-ab` | `0b9e9b64a` | env-gated draw-skip A/B build used to localize #464 | +| `mouselook-verb` | `c43fb4ace` | the `mouselook` automation verb (cherry-picked to the branch; removable) | + +Binding rules the owner set (do not relax): never `git reset --hard`, +`git checkout --`, `git clean`, bare `git stash`; never kill a client the +owner started; never launch a client while one is running; never more than +five agents per step; a chunk needing a THIRD fix round stops and is written +up in the ledger; self-passed gates stay provisional until the owner looks; +every deviation gets a register row in the same commit. + +## 2. What has landed (with the proof) + +- **S1 Geometry — CLOSED, G1 owner-passed 2026-09-02.** Exact CellStruct side + and subset construction (`D3DPolyRender::ConstructMesh` @0x0059DFA0), + recipe 8, AP-234 retired. +- **S2 World graph — CLOSED, G2 owner-passed 2026-09-03.** + `ShadowObjectRegistry` is the ONLY render-membership owner (one flood per + registration feeds collision rows AND the retail render product); render-only + statics register from both publishers; particle emitters draw by their own + cell (`add_particle_shadow_to_cell` @0x00514a70) — that fixed the missing + portal-arrival haze. +- **S3 Walk — CLOSED 2026-09-03 (`ea76a3803`).** Chunk 2: the interior turn's + landscape flush / stamp advance / gated Z clear / exit seals run only under + `outside_view.view_count > 0`, the clear gated by retail's persistent + `portalsDrawnCount`. Chunk 3: terrain drawn per land cell in retail's + DrawBlock interleave (this removed the Holtburg house-through-hill + fragments by ORDER alone). Chunk 1: the print-only walk transcript + (`ACDREAM_DUMP_WALK_TRANSCRIPT=1`) + the offline eight-kind conformance gate + over the captures. Chunk 4 + hygiene chunk H: every acdream-only clip rule, + the per-view sky/weather loops, the scissor and terrain-clip stacks and the + six cathedral probes deleted. Slice review fix round: punch fans clipped by + their OWN view (slice/view alignment bug), the seal pin through the real + producer, dead per-cell clip machinery deleted. Owner's S3 double-check: + every pose PASS except the cathedral stairwell zoomed out (→ #464). +- **S4 chunk 1 — LANDED 2026-09-03 23:40** as `d1e3e64f6` + `5de42a12f` + + `323f5a334` (rounds 0–2 cherry-picked) + `766f9e749` (four comment + sentences corrected by the lead, code unchanged — the plan bars a third + implementer round; **the owner has not reviewed that correction yet**). + Content: retail's far-punch depth bits `0x3F7FFFEF` in `portal_depth.vert` + (ours was `0x3F7FFFFE`, 15 ULPs off); the ±12 local-input portal-polygon + reject with retail's REAL quantifier (reject only when EVERY vertex lies on + ONE plane among x=±12 / y=±12; bytes 0x59BCD6–0x59BD66; the lead's first + paraphrase inverted it — see `feedback_quote_decomp_predicates`); the seal + count-after-guard order; the AD-119 register row (ColorWrite off vs retail's + zero-alpha blend); and the automated **PM/PC depth-event transcript gate** + (`tests/AcDream.App.Tests/Rendering/Walk/WalkTraceConformanceTests.AlphaDepthTranscript.cs` + + `WalkAlphaDepthTrace.cs`) replaying all SIX retail `*.alphadepth.log` + captures with `portalsDrawnCount` seeded from each fixture's first counter + (seeds 0/0/1/2/2/8) — 6/6 PASS. Round-2 lenses: retail PASS (byte evidence: + one increment site 0x59BD74, one reset site 0x5A489E, `forceClear` has no + writer), production PASS, gate-honesty FAIL on comment truth only. Landing + gates: Release 0 warnings; hermetic App lane 6,833/6,833; InstalledDat lane + 249 pass / 4 known (#383 ×2, TowerAscent, #458) / 1 skip. + +Retail axioms (owner-confirmed, never "fix"): the exterior slab through the +cathedral stair chamber (2013 + EoR clients show it); the zoomed-out FRONT +view from the stairwell showing the hall arches and sky; #458's doorway +far-block admission is a 0.5 % edge-plane precision boundary (AD-118). + +## 3. In flight: S4 chunk 2 (the alpha lists) + +**Contract:** packet §8, verbatim. One production behavior change: replace +the single distance-sorted `RetailAlphaQueue` with retail's two append-order +lists (CLIP and ALPHA, 3000 each; `D3DPolyRender::AddMeshToAlphaList` +@0x0059C230), route every delayed subset through ONE pure router implementing +the OH1 alpha spec's `DrawMesh` branch table (spec §4 rows 1–5; delay mask +`0x0E` @0x00820D88, `MultiPassAlpha` false @0x0081EF96, constructed subset +mask spec §2), flush at retail's four sites (`DrawBuilding` 0f = the existing +`AlphaBarrier`; `DrawBlock` 0.75 = a NEW leaf event at the sort-cell EXIT; +`PView::DrawCells` 0f = `LandscapeFlush`; `RenderNormalMode` 0f = pass end) +under `FlushAlphaList` @0x0059D2E0's threshold rule (quote the comparison +from the bytes), delete `FlushFartherThan` / `RetailAlphaOrdering.ComputeViewerDistance` +/ every viewer distance on the submit path, retire register row AP-34 in the +same commit, capacity overflow DROPS the subset. Proof = extend the transcript +gate from PM/PC to AM/FL over all six captures (per flush: site, threshold, +drained count PER LIST). + +**Dispatch state:** this session dispatched one Sonnet implementer (plain +Agent tool, not the Workflow tool) at ~08:35 local on 2026-09-04 into +`s4-c2-impl` (detached at `766f9e749`). It commits ONCE on top of that HEAD +when done. **To find its state:** + +```bash +git -C C:/Users/erikn/source/repos/acdream/.claude/worktrees/s4-c2-impl log --oneline -3 +git -C C:/Users/erikn/source/repos/acdream/.claude/worktrees/s4-c2-impl status --short +``` + +- A commit above `766f9e749` → the implementer finished. Its report is lost + with the session; reconstruct it from the commit body (it was told to paste + every mutation-check failing assertion and every gate's real output line + there). Proceed to the review round below. +- No commit, dirty tree → it was cut off mid-way. Read the diff; either + finish it yourself against §8 or discard the worktree's changes (it is a + disposable detached worktree; `git worktree remove --force` + re-add) and + re-dispatch from §8. Do not stash. +- No commit, clean tree → it never started editing; re-dispatch. + +The previous session's Workflow script for this chunk (prompt text identical +to §8, one implementer + three sequential lenses) is at +`C:\Users\erikn\.claude\projects\C--Users-erikn-source-repos-acdream--claude-worktrees-peaceful-blackburn-5333f0\f3ae8d4c-4f29-4329-8629-7252bd2bf4c2\workflows\scripts\s4-c2.js` +— reusable via `Workflow({scriptPath})` only if the owner has opted into +workflows in your session; otherwise use the Agent tool. + +**Review round (the §5 model):** two lenses (retail-faithful: every +predicate quoted against `docs/research/named-retail/acclient_2013_pseudo_c.txt` +and the paired binary at raw = VA − 0x400000; production/gate-honesty: no +distance left on the alpha path, AP-34 retired, no per-frame allocation, every +claimed gate reproduced read-only, at least three mutation checks re-performed, +no KnownFailure without a written divergence in packet §9). The LEAD verifies +every finding against the source before acting (`feedback_verify_subagent_claims_against_source`). +Lenses on `model:'opus'` were 529-overloaded for ~90 min on 2026-09-03; the +session model worked as a lens. Max two fix rounds, then the ledger. + +**Landing:** cherry-pick the chunk commit(s) onto the campaign branch; Release +build; the six transcript Facts; hermetic lane +(`--filter "Lane!=InstalledDat&Lane!=PreparedPackage&Lane!=Live&Lane!=Manual&Lane!=Timing&Lane!=Windows&Lane!=Linux&Lane!=SystemFont&Purpose!=Diagnostic&Status!=KnownFailure"`); +InstalledDat lane (`ACDREAM_RUN_INSTALLED_DAT_TESTS=1`, +`ACDREAM_DAT_DIR="C:/Users/erikn/Documents/Asheron's Call"`, +`--filter "Lane=InstalledDat"`, expect exactly the four known failures); +shader classes; the validation-on self-gate at the S3-closed poses diffed +against the S3-closed run; a stationary-phase soak A/B against the S4-c1 +binary (removing the sort must not regress; judge `stationary` only — #463). +Then the §13 S4 row and the memory digest. + +**After chunk 2:** S4-c3 = deletions (packet §4); then G3 (S4's owner gate: +the §10 scene matrix + the capture poses; the lead's G3 pre-run of 2026-09-03 +is the baseline, 20/20 provisional, owner passed all but the cathedral); then +S5 (consumers, material/degrade exact ports, delete every inventoried +fallback/probe, closeout); then G4 and the merge to main. + +## 4. Open investigation: #464 (the cathedral stairwell arch) + +Read `docs/ISSUES.md` #464 in full first. Compressed state: + +- **Pinned pose (owner, 2026-09-03 22:04):** + `/teleloc F4180113 39.502899 19.832422 180.976700 1 0 0 0`, default camera + distance, tilted slightly UP. Scripted reproduction: + `tools/overhaul-selfgate/route-464-tilt3.txt`, frame `01-neg160` + (eye z 182.61, pitch −4°) = ARTIFACT; frame `02-neg240` (eye z 182.32) = + clean. Run: `logs/selfgate-20260903-225434-464-tilt3`. Owner's acdream + screenshot and retail screenshot are in the issue's history; the retail + capture at this pose is `oh-capture/cathedral-stair-arch.{walk,alphadepth,pmverts}.log` + (retail shows a SOLID far face above the arch). +- **Symptom:** above and around the bottom arch the hall's interior (cut-off + columns, vault, an unsealed pink quad) draws where retail shows solid wall. +- **Proven EQUAL to retail at this pose:** camera cell and eye (four probe + rounds, `ACDREAM_PROBE_FLAP=1` + `ACDREAM_PROBE_FACILITY_STAIRS=1`: root + 0x114, eye inside, sweep uncontacted); the read-only decomp investigation + (`464-camera-investigation.md`: eleven sweep/root differences, each + unreachable here); the admission set (retail's walk log = our cells/groups/ + order exactly); the punch/seal EVENT stream (16 `PM mode=1` punches, 8 + seals, counter 8 — the PM/PC gate PASSES at this pose); the punch VERTICES + (retail `pmverts` capture vs our dump: 16 attempts, vertex-identical; retail + rejects 12/16 by its ±12 rule, so do we); clip-plane overflow (none, 3–5 + edges per view); the delayed-alpha draws (skipping ALL of them = identical + frame; the piers are opaque); the interior Z clear (skipping it = identical + frame); the degrade level (`GfxObjDegradeInfo::get_degrade` @0x0051e4b0 + gives level 0 in both clients at 20 m). +- **Source localized 2026-09-03 23:19 by env-gated draw skips (worktree + `464-ab`, `AB_SKIP_BLDS=F418000A`):** skipping the HALL BUILDING'S SHELL + (model `0x01001FB3`, building `F418000A`) removes the hanging pieces and the + frame matches retail. Skipping cell f3180105, the far-block shells + f3170034/f317003d, cell f4180104, the tower shell 0x01001FB7, corridor cell + 0x109, or ALL hall cells does NOT (with 0x109 or the hall skipped the pieces + persist over SKY). So the pieces are the hall shell's own geometry above/ + beside the corridor that cell 0x109's vault (emitPos=True, z 187.2–190.7) + should hide, and 0x109 contributes nothing to those pixels in our frame. +- **The remaining question, three candidates:** (1) 0x109's vault polygons + are never drawn at those pixels (the walk or the exit-view clip drops them + where retail keeps them); (2) they are drawn but the shell is nearer in + depth than believed; (3) the bound depth state at the shell draw is not the + declared Test/Write/Less (`EnvCellRenderer.Rhi.cs:113` vs + `WbDrawDispatcher.Rhi.cs:343`). Also unproven: that retail hides the pieces + at the SAME eye (the capture eye is 182.79 level; the artifact band is + ~182.6 at −4° and gone 0.29 m lower). +- **Next step, the lead's own job, no owner needed once ACE is up: a + RenderDoc pixel history on the scripted artifact frame.** RenderDoc is NOT + installed (`renderdoccmd` absent). Plan: install RenderDoc (Vulkan capture + is supported); launch the client under `renderdoccmd capture` with the same + arguments the self-gate runner uses (`--session-config + tools/overhaul-selfgate/session.json`, `ACDREAM_SELFGATE_PASS=testpassword`, + `ACDREAM_UI_PROBE_SCRIPT=`, artifact dir env); when the + route reaches frame `01-neg160` trigger a capture through RenderDoc's + target-control API (python `renderdoc` module: `CreateTargetControl` → + `TriggerCapture(1)`; the route's `sleep` before the screenshot gives the + window) — or add a `sleep` and trigger by wall clock; then open the `.rdc` + with the python module (`OpenCaptureFile` → `OpenCapture` → + `ReplayController.PixelHistory(texture, x, y, ...)`) at a pixel above the + arch (in the 1760×990 frame the pieces sit in the upper-middle band; pick + from `464-tilt3-01-neg160.png`). The history lists every draw touching the + pixel with its depth value and pass/fail. Candidate (1) shows as no draw + from 0x109 at all; (2) as a 0x109 draw that failed the depth test against + the shell's value; (3) as a shell draw with a depth state other than Less + or with writes off. Map draw IDs back to cells via the walk transcript + (`ACDREAM_DUMP_WALK_TRANSCRIPT=1`) or RenderDoc's debug markers if present. + Fallback without RenderDoc: a per-frame probe printing which of 0x109's + polygons `0x0`/`0x1` survive admission/clip and the depth the shell writes + (about a day). Owner alternative: a retail tilt sweep through the band at + the pinned pose. +- **Fix rule:** whatever the cause, the fix must follow a quoted retail rule + from the decomp, not a patch at the symptom; if anything deviates it gets a + register row. #464 blocks G3 (zoom is a named criterion of the cathedral + matrix row). It is scheduled AHEAD of S4-c2's landing gate but does not + block S4-c2's implementation. When fixed, promote the two #464 replays + (sweep stops on the pier; walk from root 0x114 floods 114/113/112) into + InstalledDat pins. +- **Related, not #464:** #467 (character runs in place at the corridor mouth; + movement/collision; outside the campaign); the "running down the stairs" + artifact is a transient of #464 (`logs/selfgate-20260903-211930-464-run` + frame 22). +- **Post-campaign:** #465 panel fill (paint unreachable interior portal + polygons opaque to beat retail's seam leak) — deferred until G4, retail + mode off, registered, A/B sweep acceptance. Never start it mid-campaign. + +## 5. Open question: the Holtburg doorway frame (before trusting any self-gate there) + +`tools/overhaul-selfgate/route-g3b.txt` frame 15 (`holtburg-doorway`, +`/teleloc A9B4013F 133.603592 13.391837 96.330009 …`): the landed build's runs +`logs/selfgate-20260903-234030-s4c1-landed-g3b` and `…-235044-s4c1-landed-g3b2` +both show an empty plane under fog instead of the village; the S3-state run +`logs/selfgate-20260903-165634-g3b` shows the village. Log read: the server +snaps y 13.39→17.39 in every run; the CLIENT then seated the player in the +house-interior cell `0xA9B4013F` at (134.07, 17.36) in the new runs versus the +outdoor cell `0xA9B40029` at (133.60, 17.39) in the old one (0.46 m apart on +the threshold) → the frame roots indoors with the eye outside. Read as a +placement boundary at the doorway, not a draw change (chunk 1 touched no +placement code). The pre-S4 control (`s3-review-fix/logs/selfgate-20260904-042324-pre-s4-g3b`, +build at `6575cfcee`) produced 0 frames: the login reveal at 0xA9B40176 never +went visible (#462 class) and the process exited 0xE0434352 after the graceful +logout (#461 class). **Owed:** with ACE up, run route-g3b on the landed tip +twice and on the pre-S4 build once +(`pwsh -File tools/overhaul-selfgate/run-selfgate.ps1 -Label -Route ./tools/overhaul-selfgate/route-g3b.txt` +from the respective worktree; it refuses to start beside any AcDream.App; +runs are logged under `logs/selfgate--