fix #FA4-D6-D7,SF-8: revert three of FA4's four dimming un-dims (IgnoreFellowshipRequests, FellowshipAutoAcceptRequests, FellowshipShareLoot)

The corrected plan D6 (docs/plans/2026-08-11-fellowship-allegiance-campaign.md)
established that retail's client reads neither IgnoreFellowshipRequests nor
FellowshipAutoAcceptRequests on the fellowship-invite path -- both are pure
server-side filters with no client consumer, exactly like the two
allegiance bits they were always meant to parallel. Their claimed consumer
(RetailUiRuntime.TryAutoRespondToFellowshipInvite) is deleted in a sibling
commit this fix round. Both rows revert from Live to StoreOnly.

Mechanism review SF-8 additionally found FellowshipShareLoot's claimed
consumer -- "a second live checkbox surface on the fellowship page" -- is
not a consumer at all: nothing in acdream reads the stored value back
(FormatStatsText uses snapshot.ShareXp only; the 0x00A2 Create builder
carries shareXP alone), and the live-DAT dump confirms its checkbox is a
child of the NOT-in-fellowship frame -- invisible whenever you actually
have a fellowship to loot-share within. A second EDITOR of a value is not
a CONSUMER of it under AD-78's own "drives nothing observable client-side"
definition. FellowshipShareLoot reverts too.

Only FellowshipShareXP survives as genuinely live -- the Create-flow click
reads it directly as the sent shareXP wire bit. Net: 35 (pre-FA4) -> FA4
shipped 31 -> fix round reverts three -> 34 of 50 dimmed / 16 live, ONE
net un-dim from the pre-FA4 baseline, not four. Updated the class doc's
derivation table, the conformance test's ExpectedStoreOnlyIds set, and the
31/19 count assertions to 34/16.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
Erik 2026-08-12 07:33:42 +02:00
parent df00030697
commit 300d8189f6
2 changed files with 82 additions and 31 deletions

View file

@ -698,19 +698,28 @@ public sealed class CharacterOptionsPageControllerTests
// ── AD-78 caption dimming (user-directed, 2026-08-11, gate 2) ───────────
/// <summary>
/// The exact 31 <see cref="CharacterOptionId"/> values this slice dims
/// The exact 34 <see cref="CharacterOptionId"/> values this slice dims
/// (<see cref="RowSpec.StoreOnly"/> == true), transcribed independently
/// of <c>CharacterOptionsPageController.Groups</c> from the derivation
/// table in that class's own doc comment. <b>Wiring a future consumer
/// for any of these means removing it from this literal set AND
/// flipping its <c>Groups</c> table entry from <c>StoreOnly</c> to
/// <c>Live</c> consciously — leaving either one stale fails this
/// test.</b> Campaign FA slice FA4, D7 removed four ids from this set —
/// test.</b>
///
/// <para>
/// Campaign FA slice FA4, D7 originally removed four ids from this set.
/// The FA4 FIX ROUND (2026-08-12) put THREE of them back:
/// <c>IgnoreFellowshipRequests</c>/<c>FellowshipAutoAcceptRequests</c>
/// (the fellowship-invite auto-decline/auto-accept, D6) and
/// <c>FellowshipShareXP</c>/<c>FellowshipShareLoot</c> (the fellowship
/// page's Create flow / D5 display / second checkbox surface) all
/// gained real acdream-side consumers.
/// (D6's correction — retail's client reads neither bit on the invite
/// path; the client-side auto-respond interceptor that was their
/// claimed consumer is deleted) and <c>FellowshipShareLoot</c>
/// (mechanism SF-8 — its claimed "second checkbox surface" consumer
/// never actually READS the stored value back). Only
/// <c>FellowshipShareXP</c> survives as a genuine live row (the
/// fellowship Create flow reads it as the sent <c>shareXP</c> bit).
/// Net: 35 (pre-FA4) → 34 (post-fix-round), one net un-dim.
/// </para>
/// </summary>
private static readonly HashSet<CharacterOptionId> ExpectedStoreOnlyIds =
[
@ -729,9 +738,12 @@ public sealed class CharacterOptionsPageControllerTests
CharacterOptionId.FilterLanguage,
CharacterOptionId.ShowHelm,
CharacterOptionId.ShowCloak,
// Group 3 (Grouping) — 2 of 6 (FA4, D7: the other four — see class doc)
// Group 3 (Grouping) — 5 of 6 (fix round: only FellowshipShareXP stays live — see class doc)
CharacterOptionId.IgnoreAllegianceRequests,
CharacterOptionId.IgnoreFellowshipRequests,
CharacterOptionId.DisplayAllegianceLogonNotifications,
CharacterOptionId.FellowshipShareLoot,
CharacterOptionId.FellowshipAutoAcceptRequests,
// Group 4 (Other Players) — 10 of 11
CharacterOptionId.AcceptLootPermits,
CharacterOptionId.UseDeception,
@ -762,8 +774,8 @@ public sealed class CharacterOptionsPageControllerTests
.ToHashSet();
Assert.Equal(ExpectedStoreOnlyIds, actualStoreOnly);
Assert.Equal(31, actualStoreOnly.Count);
Assert.Equal(19, 50 - actualStoreOnly.Count); // the 19 live rows (FA4, D7: +4)
Assert.Equal(34, actualStoreOnly.Count);
Assert.Equal(16, 50 - actualStoreOnly.Count); // the 16 live rows (fix round: net +1 from pre-FA4 baseline)
}
[Fact]