Skip to content

fix: resolve Blizzard roster class names and skip unusable members - #38

Merged
Erilla merged 2 commits into
mainfrom
fix/blizzard-roster-class-names
Aug 10, 2026
Merged

fix: resolve Blizzard roster class names and skip unusable members#38
Erilla merged 2 commits into
mainfrom
fix/blizzard-roster-class-names

Conversation

@Erilla

@Erilla Erilla commented Aug 10, 2026

Copy link
Copy Markdown
Owner

shurkle reached the sweep this time — cap reserved 300, fingerprintDurationMs=1155, 2 requests used — and then failed upstream_schema_changed.

Verified against the live Blizzard API (credentials injected by railway run, never printed):

member.character keys: faction, id, key, level, name, playable_class, playable_race, realm
playable_class keys: id, key          ← no "name"
members missing playable_class.name: 393 of 393

The guild roster does not carry class names; they come from the static playable-class index. normalizedRosterCharacter required playable_class.name, so every member became null, members.every(m => m !== null) rejected the roster, and the sweep raised non-retryable schema_drift. No guilded root could ever have been swept.

The unit test passed because its fixture invented playable_class: { name: "Mage" }. That fixture is now the real shape, { id: 8 }, and the test asserts the name is resolved.

  • Class names are resolved once per process from /data/wow/playable-class/index (namespace=static-<region>), accounted through the same observer, so it is one extra request per sweep, not per member. An inline playable_class.name is still accepted if Blizzard ever sends one.
  • A member the key space cannot represent is now skipped rather than fatal — the same treatment Raider.IO claimed characters already get, whose test comment warns that "one out-of-scope claimed character could turn every search for that player into a permanent schema-drift failure". The roster path repeated exactly that mistake.
  • A missing members array remains structural drift.

Both roster tests were red with blizzard_schema_drift before the change.

🤖 Generated with Claude Code

https://claude.ai/code/session_01Qh8Zb2HnaxebWrRLUMoAiv

Erilla and others added 2 commits August 10, 2026 21:33
Raider.IO answers 403 profile_is_private when a guessed user name belongs
to someone whose profile is private. Every non-404 failure was classified
transient, so this permanent answer was retried five times and then failed
the run as upstream_unavailable — "Character data is temporarily
unavailable." for any character whose ownership is not public and whose
name matches a private Raider.IO user.

Classify 403 as a distinct forbidden failure and treat it like not_found
when resolving a profile guess: an invisible profile yields no
relationships, which is not an outage. Character and claimed-character
requests keep their present behaviour for a 403.

Confirmed against the live endpoint, which returns 403 for
/api/user/view-characters?name=shurkle.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Qh8Zb2HnaxebWrRLUMoAiv
Blizzard's guild roster carries playable_class as {id, key} with no name.
The normalizer required a name, so every member normalized to null,
members.every() rejected the roster, and the sweep died with
non-retryable schema drift. Verified against the live endpoint: 393 of 393
members in the measured guild lack playable_class.name. The unit fixture
had invented a name, so the suite passed on a shape Blizzard never sends.
No guilded root could ever have been swept.

Resolve names once per process from the static playable-class index,
accounted as one request per sweep, and keep accepting an inline name if
Blizzard ever sends one.

Also skip a member the key space cannot represent rather than failing the
roster, the same treatment Raider.IO claimed characters already get: one
unusable member should not abandon a whole sweep.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Qh8Zb2HnaxebWrRLUMoAiv
@Erilla
Erilla merged commit 6108d2f into main Aug 10, 2026
2 checks passed
@Erilla
Erilla deleted the fix/blizzard-roster-class-names branch August 10, 2026 21:17
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant