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*).