docs(overhaul): S4-c2 production/gate lens FAIL recorded; fix round 1 addendum §11.1 (A1–A8)

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
Erik 2026-09-04 06:21:06 +02:00
parent 92f08721e2
commit 3e76f71d5b
2 changed files with 20 additions and 1 deletions

File diff suppressed because one or more lines are too long

View file

@ -497,3 +497,22 @@ sites, the register, and the gate's CI value — the list/router/flush core stan
**Lenses after the round:** retail-faithful (narrowed to M1/M3/M6's decomp claims and the router inputs) and production/gate-honesty (the six live Sites Facts, the valve pin, the immediate-draw paths' allocation, the register). A third round stops the chunk (plan §5). **Lenses after the round:** retail-faithful (narrowed to M1/M3/M6's decomp claims and the router inputs) and production/gate-honesty (the six live Sites Facts, the valve pin, the immediate-draw paths' allocation, the register). A third round stops the chunk (plan §5).
### 11.1 Addendum — production/gate-honesty lens (reported 2026-09-04 ~10:45, VERDICT FAIL; all four claimed gates reproduced; four mutation checks re-performed; lead verified A1 and A2 at the source)
**A1 (MAJOR) — a third `FlushLandscapeAlpha` caller the gate never sees, mislabelled.** `RetailPViewRenderer.cs:485`: `if (ctx.RootCell.IsOutdoorNode) passes.FlushLandscapeAlpha();` — the #132 outdoor-root drain after `DrawDynamicsLast`, before `DrawUnattachedSceneParticles(ctx, outdoorCells:false)`. It flushes under the `LandscapeFlush` label (`PView::DrawCells` @0x005a4872), but that retail flush runs ONLY inside `outside_view.view_count > 0` on the INTERIOR PView; an outdoor root has no such call (terrace-edge's capture: zero `005a4877` FL lines). Retail's outdoor-root drains are DrawBlock's 0.75 valve per cell and `SmartBox::RenderNormalMode`'s `FlushAlphaList(0f)` @0x00453b8b at the pass end — which acdream already performs in `RetailAlphaQueue.EndFrame`. Fix: delete the :485 call if (verify and quote) `EndFrame`'s RenderNormalMode flush runs after `DrawUnattachedSceneParticles` and before any further opaque world draw (then #132's "drain after the finished opaque world" invariant is kept by the pass-end flush alone, and the interior unattached emitters join the same final drain as retail); if some opaque draw intervenes, keep ONE drain but label it `RenderNormalMode`, move it after those draws, and file a register row for the relocation. Pin at the renderer level (not the driver gate): an outdoor-root `DrawInside` produces flush sites `[DrawBuilding×N, RenderNormalMode]` and never `LandscapeFlush`; mutation text.
**A2 (MAJOR) — register id collision.** AP-236 was filed AND retired on main by #132 (`e102fb363`; `docs/ISSUES.md:19978` "register AP-236 retired in the same commit"). Ids are never reused. Renumber the chunk's AP-236 → the next free id and AP-237 → the one after (the register's highest live id is AP-235; verify by grep over `^| ~*AP-` before choosing), fix the dangling `register row AP-236b` citation at `RetailAlphaMeshRouter.cs:101`, keep `~~AP-34~~` struck through per the convention (M8c), and recount the "## 3. Approximation (AP) — N active rows" header honestly (it reads 161 while the live count is 157/158 — state the real number).
**A3 (MAJOR) — the unreachability enumeration at `WbDrawDispatcher.cs:2474` is wrong.** `MaskFromTranslucencyKind` returns only 0x08 / 0x00 / 0x02; it never sets 0x01 and never returns 0x04; 0x08 and 0x00 are filtered upstream by `IsOpaque`, so the only reachable mask there is 0x02. Rewrite the comment to the truth (with M1 the throw is gone anyway; the comment must describe what CAN reach the router and why each row is or is not reachable).
**A4 (MINOR) — `ApplyScratchRetention(observedClip + observedAlpha, observedClip + observedAlpha)`** at `RetailAlphaQueue.cs:330` and `:408` passes the ENTRY count as `observedSourceCount`, so `_sources`/`_sourceDrawOffsets` never shrink (HEAD~1 passed the real source count). Capture `_sources.Count` before `Clear()` and pass it.
**A5 (MINOR) — text truth.** `WalkStaticStreamPopulatorTests.cs:554` banner still says "same viewer distance"; §10's inline sequences are off by one (foundry-deep `×10` should be `×11` for its 12 DrawBuilding entries; holtburg-doorway-still `×5` should be `×6` for 13); the commit body's "6 cases" for the hand-traced Theory is 5, and the 2250 mutation's first failing assertion is `RetailAlphaQueueTests.cs:197` (`PendingCount`), not `:198`. The new commit body states each mutation's ACTUAL first failing assertion.
**A6 (MINOR) — `WalkAlphaDepthTrace` parses `new=` into `AmEvents[i].IsNew` and never uses it.** Either use it (after M4: with per-append `new = true` a comparison is meaningless — say so) or drop the column and its comment; no dead parse presented as evidence.
**A7 (MINOR) — `RetailAlphaMeshRouterTests.cs:159-166` "independent oracle" is the same if-chain restated.** Replace `IndependentReferenceRoute` with a hand-written expected-decision TABLE transcribed from spec §4 (one literal row per (mask, sky, detail, multipass, hasAlpha) cell, no control flow), or delete the word "independent" and the sentence "each of the five rows' conditions was flipped in turn and this test failed every time" unless every flip's failing text is in the commit body.
**A8 (NOTE, no action)** — the non-deferring particle path keeps `ParticleSubmissionOrdering.Sort` (`ParticleRenderer.Rhi.cs:298`); it is outside the queue and pre-existing. M1's immediate draws for rows 1/5 must not add a sort (retail's immediate `RenderMeshSubset` draws in mesh order).
**Gate additions for this round:** the renderer-level A1 pin; the register grep proving no id collision (`grep -c "^| ~*AP-<new>"` == 1 for each new id). Allowed files unchanged except `RetailPViewRenderer.cs` (A1) and its tests.