fix(chat): FA1 -- 8 fellowship WeenieError ids confirmed absent from retail, not missing

The FA1 contract asked to "add the 8 missing fellowship entries lane B
lists" (0x0417-0x041C, 0x04DB, 0x04DC). Re-ran this table's own binary-
sweep methodology specifically for these 8 ids rather than inventing
text for them: a full-text grep of the 1.4M-line
acclient_2013_pseudo_c.txt found ZERO comparisons/case-labels against any
of the 8 anywhere in the retail client, and a manual walk of
HandleFailureEvent's own case-label sequence confirmed the switch goes
straight from case 0x416/0x41d (skipping 0x417-0x41c) and from case
0x4da/0x4dd (skipping 0x4db/0x4dc).

Conclusion: retail's Sept-2013 client has no display text for any of
these 8 ids -- they are intentionally absent from this table, not
overlooked. This contradicts the FA1 contract's premise but not lane B's
own text, which only claimed the ids were "missing" from the table (true)
and that two of them (0x0417, 0x04DB) are on ACE's live send paths (also
true) -- it never claimed retail has text for them. Two of the ids are
therefore live-but-silent gaps against a real ACE server, and acdream's
current no-display behavior for them is ALREADY retail-faithful. Adding
invented English would be exactly the class of mistake SHOULD-FIX 4
(the no-default-case rule this table's Resolve() already implements)
exists to prevent.

Documents the finding at both table gaps and adds a conformance test
(Resolve_FellowshipIdsAbsentFromHandleFailureEvent_ReturnsNoText) proving
all 8 resolve to null text, matching the existing
Format_0x051D_ReturnsNull_NoRetailCaseExists precedent.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
Erik 2026-08-12 00:13:25 +02:00
parent 6bedbc4772
commit 5f9aa16f43
2 changed files with 59 additions and 0 deletions

View file

@ -365,4 +365,30 @@ public sealed class WeenieErrorMessagesTests
Assert.Equal("A drudge fails to affect you because $s cannot affect anyone!", text);
Assert.Equal(RetailLogTextType.Magic, type);
}
// ── Campaign FA slice FA1 (2026-08-11): the 8 "missing" fellowship ids ──
//
// Same class of proof as Format_0x051D_ReturnsNull_NoRetailCaseExists
// above: independently re-ran this file's own binary-sweep methodology
// (a full-text grep of acclient_2013_pseudo_c.txt for every
// literal/case-label comparison against these 8 ids, plus a manual
// walk of HandleFailureEvent's own case-label sequence around each)
// and found NO case for any of them anywhere in the Sept-2013 client.
// These are intentionally absent from the table, not overlooked —
// adding invented text for them would itself be the SHOULD-FIX-4 class
// of bug this table exists to avoid.
[Theory]
[InlineData(0x0417u)] // FellowshipIgnoringRequests — ACE sends this live; retail still shows nothing
[InlineData(0x0418u)] // FellowshipSquelched — ACE never sends it
[InlineData(0x0419u)] // FellowshipMaxDistanceExceeded — ACE never sends it
[InlineData(0x041Au)] // FellowshipMember — ACE never sends it
[InlineData(0x041Bu)] // FellowshipIllegalLevel — ACE never sends it
[InlineData(0x041Cu)] // FellowshipRecruitBusy — ACE never sends it (busy is a plain chat line instead)
[InlineData(0x04DBu)] // FellowshipDeclined — ACE sends this live; retail still shows nothing
[InlineData(0x04DCu)] // FellowshipTimeout — ACE never sends it
public void Resolve_FellowshipIdsAbsentFromHandleFailureEvent_ReturnsNoText(uint code)
{
var (text, _) = WeenieErrorMessages.Resolve(code, param: null);
Assert.Null(text);
}
}