From 9f3e3263743aa49bfdc81be0d72c0e0546d1b8dc Mon Sep 17 00:00:00 2001 From: Erik Date: Tue, 25 Aug 2026 10:30:53 +0200 Subject: [PATCH] =?UTF-8?q?fix(ui):=20Campaign=20AS=20AS5=20fix=20round=20?= =?UTF-8?q?=E2=80=94=20"retires=20AP-109"=20corrected=20to=20"narrows"=20a?= =?UTF-8?q?t=206=20sites?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The AS5 review verified the port exhaustively (170/170 strings, 20 dispatch arms, 17 bounds tests, both call sites) and found one docs-class defect: five code comments plus the plan slice text claimed AP-109 was RETIRED while the register correctly keeps the row ACTIVE-narrowed (CT4 FormatXp GetNumberFormatA approximation sliver survives). Comment-only edits; compile-checked; no behavior change. Co-Authored-By: Claude Fable 5 --- docs/plans/2026-08-25-assess-window-parity-campaign.md | 9 ++++++--- src/AcDream.App/UI/Layout/AllegianceRankTitleTable.cs | 2 +- src/AcDream.App/UI/Layout/CharacterIdentityText.cs | 2 +- src/AcDream.App/UI/Layout/CharacterSheetProvider.cs | 2 +- .../UI/Layout/AppraisalUiControllerTests.cs | 2 +- .../UI/Layout/CharacterSheetProviderTests.cs | 2 +- 6 files changed, 11 insertions(+), 8 deletions(-) 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 627dc790..ad1f0874 100644 --- a/docs/plans/2026-08-25-assess-window-parity-campaign.md +++ b/docs/plans/2026-08-25-assess-window-parity-campaign.md @@ -118,8 +118,11 @@ a ruling requires a plan-doc amendment, not an implementer judgment call. reused, Penumbraen aliases Shadowbound, Olthoi excluded by the unsigned range check) + `AllegianceData::GetFullName @0x005B6950`; wire the examination title bar (rank from `props.GetInt(0x1E)`, ruling R8) AND - the character panel's name line (closing AP-109's residual). Register: - retire AP-109 in this commit. + the character panel's name line (closing AP-109's rank-prefix residual). + Register: NARROW AP-109 in this commit (CORRECTED at the AS5 review — + retiring would have deleted a live open item: CT4's FormatXp + `GetNumberFormatA` approximation sliver survives as the row's sole + remaining item, so the row stays active-narrowed). - **AS6 — connected gate script (Fable).** User-driven script `docs/research/2026-08-25-campaign-as-test-script.md`; two-client where needed (allegiance/fellowship/PK lines, deception-failure rendering); @@ -140,5 +143,5 @@ round → narrow re-review → REVIEW-CLOSED. | 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 | **REVIEW-CLOSED 2026-08-25** | `4ade9b04` / `bf8f5b70` (docs-only fix) | 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) — #442, unrelated to AS4 | -| AS5 | dispatched 2026-08-25 | — | | +| AS5 | fix round applied, re-review pending | `8f8c0c3a` + comment-fix commit | the campaign's most rigorously verified slice: 170/170 title strings confirmed (164 mechanical diff, 6 PE byte-decoded from the PDB-paired binary), all 20 dispatch arms, all 17 bounds tests, both call sites re-derived; zero behavioral findings. Fix round = "retires AP-109" → "narrows" at 5 comment sites + the plan (the FormatXp sliver keeps the row active) | | AS6 | pending AS5 review-close | — | | diff --git a/src/AcDream.App/UI/Layout/AllegianceRankTitleTable.cs b/src/AcDream.App/UI/Layout/AllegianceRankTitleTable.cs index 7b92545e..ad3c2c18 100644 --- a/src/AcDream.App/UI/Layout/AllegianceRankTitleTable.cs +++ b/src/AcDream.App/UI/Layout/AllegianceRankTitleTable.cs @@ -1,7 +1,7 @@ namespace AcDream.App.UI.Layout; /// -/// Campaign AS slice AS5 (2026-08-25, retires register row AP-109): the +/// Campaign AS slice AS5 (2026-08-25, narrows register row AP-109 — its FormatXp sliver survives): the /// retail allegiance rank-title table and its name-composition wrapper. /// /// Dispatch — AllegianceSystem::GetTitle @0x005B8DD0. diff --git a/src/AcDream.App/UI/Layout/CharacterIdentityText.cs b/src/AcDream.App/UI/Layout/CharacterIdentityText.cs index 1632d933..7511ba44 100644 --- a/src/AcDream.App/UI/Layout/CharacterIdentityText.cs +++ b/src/AcDream.App/UI/Layout/CharacterIdentityText.cs @@ -13,7 +13,7 @@ namespace AcDream.App.UI.Layout; /// /// /// Name-line ruling (CT4, 2026-08-24; CLOSED at Campaign AS slice AS5, -/// 2026-08-25 — retires AP-109). Retail's NAME line +/// 2026-08-25 — narrows AP-109; its FormatXp sliver survives). Retail's NAME line /// (AllegianceData::GetFullName @0x005b6950) prefixes an allegiance /// RANK title ("<RankTitle> <Name>", same space separator, PE-read /// @data_794098) when AllegianceSystem::GetTitle(rank, heritage, gender) diff --git a/src/AcDream.App/UI/Layout/CharacterSheetProvider.cs b/src/AcDream.App/UI/Layout/CharacterSheetProvider.cs index bec44426..a938e8dc 100644 --- a/src/AcDream.App/UI/Layout/CharacterSheetProvider.cs +++ b/src/AcDream.App/UI/Layout/CharacterSheetProvider.cs @@ -164,7 +164,7 @@ public sealed class CharacterSheetProvider return new CharacterSheet { - // Campaign AS slice AS5 (retires AP-109): retail's NAME line + // Campaign AS slice AS5 (narrows AP-109 — its FormatXp sliver survives): retail's NAME line // (gmStatManagementUI::UpdateCharacterInfo @0x004F0770, // @0x004f0807-@0x004f0895) prefixes AllegianceData::GetFullName // @0x005B6950's rank title exactly like the examination window's diff --git a/tests/AcDream.App.Tests/UI/Layout/AppraisalUiControllerTests.cs b/tests/AcDream.App.Tests/UI/Layout/AppraisalUiControllerTests.cs index d70c862a..b496b206 100644 --- a/tests/AcDream.App.Tests/UI/Layout/AppraisalUiControllerTests.cs +++ b/tests/AcDream.App.Tests/UI/Layout/AppraisalUiControllerTests.cs @@ -461,7 +461,7 @@ public sealed class AppraisalUiControllerTests // ── Campaign AS slice AS5: title-bar allegiance rank-title prefix ───── // Ground truth: docs/research/2026-08-25-campaign-as-ground-truth.md - // §2a's title-bar row, gap G9, ruling R8. Retires register row AP-109. + // §2a's title-bar row, gap G9, ruling R8. Closes AP-109's rank-prefix residual (the row survives, narrowed to its FormatXp sliver). [Fact] public void CharacterResponse_TitleBarPrefixesAllegianceRankTitle() diff --git a/tests/AcDream.App.Tests/UI/Layout/CharacterSheetProviderTests.cs b/tests/AcDream.App.Tests/UI/Layout/CharacterSheetProviderTests.cs index efef3164..9697deae 100644 --- a/tests/AcDream.App.Tests/UI/Layout/CharacterSheetProviderTests.cs +++ b/tests/AcDream.App.Tests/UI/Layout/CharacterSheetProviderTests.cs @@ -105,7 +105,7 @@ public sealed class CharacterSheetProviderTests } // ── Campaign AS slice AS5: name-line allegiance rank-title prefix ────── - // Retires register row AP-109. Same GetFullName port + rank-property id + // Closes AP-109's rank-prefix residual (row survives, narrowed). Same GetFullName port + rank-property id // (props.GetInt(0x1E)) as the examination window's title bar // (AppraisalUiControllerTests.CharacterResponse_TitleBarPrefixes*).