From bf8f5b70a9b01dc07362f4716edb05fa123ca405 Mon Sep 17 00:00:00 2001 From: Erik Date: Tue, 25 Aug 2026 09:58:47 +0200 Subject: [PATCH] =?UTF-8?q?docs(AS):=20AS4=20fix=20round=20=E2=80=94=20ora?= =?UTF-8?q?cle=20corrections=20(D1),=20gate=20carry-note=20(D2),=20record?= =?UTF-8?q?=20fixes=20(D3);=20file=20#442?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The AS4 dual-lens review approved the port as exact and required a docs-only fix round: - Ground truth §2b row 1: the Society gate is PRESENCE of Int 281 (AppraisalProfile::InqInt @0x005B3830 returns found/not-found), not value!=0; the color rule is same-bit-first (@0x004b49fd/@0x004b4a49/ @0x004b4a8b) so a multi-bit local player still resolves green on a match; the ??? arm precedes the Radiant Blood test. - Ruling R5 corrected: the row model carries CreatureAppraisalValueStyle but ResolveColor is a deliberate no-op until AP-110's FontInfo-list residual lands — the Society green/red is model-only and invisible at the connected gate; AS6's script must not gate on row colors. - Ledger: AS4 land 4ade9b04; true full-solution hermetic count is 15,528 (the AS4 commit body's 15,410 was a mis-report; the review re-ran and reconciled 15,483 + 45 new = 15,528). - #442 filed: pre-existing parallel-load flake in the shadow-caster zero-allocation pin, surfaced by the review's full-solution run; isolation evidence recorded; unrelated to Campaign AS. Co-Authored-By: Claude Fable 5 --- docs/ISSUES.md | 18 ++++++++++++++++++ ...2026-08-25-assess-window-parity-campaign.md | 2 +- .../2026-08-25-campaign-as-ground-truth.md | 11 ++++++++--- 3 files changed, 27 insertions(+), 4 deletions(-) diff --git a/docs/ISSUES.md b/docs/ISSUES.md index 894b7613..7db802e7 100644 --- a/docs/ISSUES.md +++ b/docs/ISSUES.md @@ -24,6 +24,24 @@ What does NOT go here: - Every session: scan OPEN issues at start; promote/close anything we touched during the session before ending. - Promoting to a Phase: mark as `DONE (promoted to Phase X)` + commit SHA where the Phase entry landed. +## #442 — Flake: DirectionalShadowCasterFrameTests.WarmDenseChangedFrames_AllocateZeroAndReadNoSceneRecords fails intermittently under full parallel suite load + +**Status:** OPEN. +**Component:** rendering tests / zero-allocation pins. +**Filed:** 2026-08-25 (surfaced by the Campaign AS AS4 Opus review's full-solution run; unrelated to AS4 — the slice touches no rendering code). + +A `GC.GetAllocatedBytesForCurrentThread()` zero-allocation assertion in +`tests/AcDream.App.Tests/Rendering/DirectionalShadowCasterFrameTests.cs` +trips intermittently under parallel load — same class as the known +`RuntimeCollisionReportingStateTests.WarmedSteadyContactRefreshDoesNotAllocate` +flake (full-solution parallel load only) and #439's headroom family. +Review isolation evidence (Release): alone (15-test class) passes; App +hermetic lane run 1 = 6,252/1 failed, run 2 (same command) = 6,253/0. +Last touched by `d78ce100` (a render commit). Candidate fixes when picked +up: the established `Lane=Timing` quarantine per `docs/release-gate.md` +(do NOT chase individually), or a warmed re-measure loop like other +zero-alloc pins use. Do not weaken the assertion itself without measuring. + ## #441 — Death return to lifestone: stuck in portal once; arrived once with world not ready (missing doors/portals) **Status:** OPEN (intermittent — did not reproduce under probes 2026-08-24). diff --git a/docs/plans/2026-08-25-assess-window-parity-campaign.md b/docs/plans/2026-08-25-assess-window-parity-campaign.md index 4acc57cb..6dd8763d 100644 --- a/docs/plans/2026-08-25-assess-window-parity-campaign.md +++ b/docs/plans/2026-08-25-assess-window-parity-campaign.md @@ -139,7 +139,7 @@ round → narrow re-review → REVIEW-CLOSED. | AS1 | **DONE 2026-08-25** | (docs commit) | 3-agent research; ground-truth doc committed | | AS2 | **REVIEW-CLOSED 2026-08-25** | `f8a22589` / `cc5290af` | port exact per dual-lens review; 6 findings (docs/test/refactor) fixed; +AD-114 (animated paperdoll), +AD-115 (title clear-vs-stale), PK bits promoted to `PublicWeenieFlags`; carried follow-up chip: 3 more Core PK-bit copies | | AS3 | **REVIEW-CLOSED 2026-08-25** | `1616cd3d` (no fix round) | APPROVE first pass — trio/legend/monster-path exact by offset-level decomp verification; R3 flattening theory disproven at source; ratings adjudication: pre-AS3 code already retail-exact. 5 NITs: 12 (legend-order comment), 11 (stronger refresh test) fold into AS4; 14/15 done in the close commit; 13 (geometry-keyed test helper) noted | -| AS4 | pending chip-session quiesce | — | AS4 also carries AS3 NITs 11+12 and the AP-110 narrowing | +| AS4 | fix round (docs-only) applied, re-review pending | `4ade9b04` + docs fix commit | port exact per dual-lens review (presence-gate adjudicated FOR the implementer at `InqInt @0x005B3830`; Time-in-Dereth = pre-existing `RetailDurationText @0x00565E10` port, correct reuse); fix round was oracle-doc corrections + records only, NO code change. True full-solution hermetic count 15,528 (the commit's 15,410 was a mis-report). **AS6 carry-note: the Society green/red colorIdx is MODEL-ONLY (ResolveColor no-op pending AP-110 FontInfo residual) — the gate script must NOT gate on row colors.** Pre-existing parallel-load flake surfaced (shadow-caster zero-alloc pin) — filed in ISSUES, unrelated to AS4 | | AS4 | pending AS3 review-close | — | | | AS5 | pending AS4 review-close | — | | | AS6 | pending AS5 review-close | — | | diff --git a/docs/research/2026-08-25-campaign-as-ground-truth.md b/docs/research/2026-08-25-campaign-as-ground-truth.md index 6fc952fc..2b09c667 100644 --- a/docs/research/2026-08-25-campaign-as-ground-truth.md +++ b/docs/research/2026-08-25-campaign-as-ground-truth.md @@ -84,7 +84,7 @@ Literals: `"%d"` @0x794344/0x7A0184; `"*%d"` @0x7B110C; `u"???"` @0x7B0F34; | # | Gate | Label | Value | Color | |---|---|---|---|---| -| 1 | Int 281 Faction1Bits ≠ 0 | `Society:` | society name (+` ~ ` band): bit1→"Celestial Hand"+Int 287, bit2→"Eldrytch Web"+Int 288, bit4→"Radiant Blood"+Int 289, none→`???`. Bands: 1–100 Initiate, 101–300 Adept, 301–600 Knight, 601–1000 Lord, 1001–1500 Master; outside bands → name alone | vs LOCAL player's Faction1Bits (`InqInt 0x119` on own qualities): same → 1 (green), different faction → 2 (red), local none → 0 | +| 1 | **PRESENCE of Int 281** Faction1Bits — `AppraisalProfile::InqInt @0x005B3830` returns found/not-found, NOT value≠0 (AS4-review adjudicated); present-and-zero → `Society: ???` | `Society:` | society name (+` ~ ` band): bit1→"Celestial Hand"+Int 287, bit2→"Eldrytch Web"+Int 288, then the `???` arm, THEN bit4→"Radiant Blood"+Int 289 (retail's odd test order); unrecognized→`???`. Bands: 1–100 Initiate, 101–300 Adept, 301–600 Knight, 601–1000 Lord, 1001–1500 Master; outside bands → name alone | vs LOCAL player's Faction1Bits, SAME-BIT-FIRST (`@0x004b49fd/@0x004b4a49/@0x004b4a8b`): local carries the target's bit → 1 (green) even when local also carries other bits; else local carries any other society bit → 2 (red); else 0 | | 2 | Int 30 ≥ 1 | allegiance rows | Str 21 MonarchsTitle absent → `Alleg. Monarch:` + `%d Follower`/`%d Followers` (Int 35, clamp ≥0). Str 21 present, Str 35 PatronsTitle absent → `Monarch:`+Str21. Both present, equal → one row `Monarch/Patron:`. Different → two rows `Monarch:` / `Patron:` | 0 | | 3 | any of 9 AL > 0 | spacer, then `Head/Chest/Groin`, `Bicep/Wrist/Hand`, `Thigh/Shin/Foot` | per part `"%d"`, or `"*%d"` with (value−9999) when ≥9999 (unenchantable sentinel); value cell = `"AL: %s/%s/%s"`. Nine dwords in order head, chest, groin(=Abdomen), bicep(=UpperArm), wrist(=LowerArm), hand, thigh(=UpperLeg), shin(=LowerLeg), foot | 0 | | 4 | Int 307\|313\|314 > 0 | spacer, then `Dmg/CritDmg` | `Rating: %d/%d` ← (307 DamageRating, 314 CritDamageRating); 313 gates only | 0 | @@ -231,8 +231,13 @@ auto-fail. Guid-not-found → `Flags=0, Success=0` only. @0x004B3FF0`'s clean version of the SAME logic: one spacer before the first ratings row, one trailing spacer if any rating row was emitted. - **R5 (colorIdx RGBA):** authored in LayoutDesc 0x2100006B text attrs - (0x1B/0x1D). The row mechanism already supports authored color styles - (enchant bit styles pinned); reuse it, never hardcode RGBA. + (0x1B/0x1D). CORRECTED at the AS4 review: the row model CARRIES the + style (`CreatureAppraisalValueStyle`), but `ResolveColor` is a + deliberate no-op — every row renders the authored default color until + AP-110's "creature FontInfo-list selection" residual lands. Compute the + semantic state, never hardcode RGBA; the Society green/red is therefore + MODEL-ONLY today and INVISIBLE at the connected gate (the AS6 script + must not gate on it). - **R6 (literals):** the header/extras labels are code literals in retail — match them as literals (consistent with the item report), with DAT lookups only where retail does them (gender/heritage EnumMappers, title