[Frontend] Let a GM pin which character a player was running for a past session #422

Open
opened 2026-08-26 16:59:24 +00:00 by claude-bot · 0 comments
Contributor

Follow-up to #330, folded into the UX overhaul rather than bolted onto the existing campaign page.

What exists already

#330 shipped the whole backend for per-session character overrides:

  • session_character_overrides (PK (session_id, user_id), character_id FK CASCADE)
  • PUT /api/sessions/{session_id}/character-overrides/{user_id} — GM only, body {"character_id": uuid | null}, null clears the override
  • campaign_character_service.set_session_override / session_overrides
  • resolve_speakers(..., session_id=...) applies the override, so attribution uses the pinned character

All of it is tested. Nothing in the frontend calls it, so today an override can only be set through the API.

Why it matters

Without an override, correcting a member's character to reflect a mid-campaign swap rewrites the past. Reprocessing an old recording — which #421 and #397 both make possible — relabels session 5 with the character that player runs now. The GM's only recourse is to leave the stale character in place, which breaks every session after the swap instead.

Why it belongs in the UX overhaul

It is a small control with no obvious home. It is session-scoped and GM-only, so it does not belong on the campaign member list where the rest of the character UI lives; it needs to sit wherever the redesign puts per-session GM administration, next to transcript approval and reprocessing. Adding it to the current page would mean building it twice.

Acceptance criteria

  • A GM can see, per session, which character each member was running
  • A GM can pin a different character for that session, and clear the pin
  • Only members with more than one character need surfacing — the single-character case has nothing to choose
  • It is discoverable from wherever a GM reprocesses or approves a session, since that is when the wrong character becomes visible
Follow-up to #330, folded into the UX overhaul rather than bolted onto the existing campaign page. ## What exists already #330 shipped the whole backend for per-session character overrides: - `session_character_overrides` (PK `(session_id, user_id)`, `character_id` FK CASCADE) - `PUT /api/sessions/{session_id}/character-overrides/{user_id}` — GM only, body `{"character_id": uuid | null}`, null clears the override - `campaign_character_service.set_session_override` / `session_overrides` - `resolve_speakers(..., session_id=...)` applies the override, so attribution uses the pinned character All of it is tested. **Nothing in the frontend calls it**, so today an override can only be set through the API. ## Why it matters Without an override, correcting a member's character to reflect a mid-campaign swap rewrites the past. Reprocessing an old recording — which #421 and #397 both make possible — relabels session 5 with the character that player runs *now*. The GM's only recourse is to leave the stale character in place, which breaks every session after the swap instead. ## Why it belongs in the UX overhaul It is a small control with no obvious home. It is session-scoped and GM-only, so it does not belong on the campaign member list where the rest of the character UI lives; it needs to sit wherever the redesign puts per-session GM administration, next to transcript approval and reprocessing. Adding it to the current page would mean building it twice. ## Acceptance criteria - [ ] A GM can see, per session, which character each member was running - [ ] A GM can pin a different character for that session, and clear the pin - [ ] Only members with more than one character need surfacing — the single-character case has nothing to choose - [ ] It is discoverable from wherever a GM reprocesses or approves a session, since that is when the wrong character becomes visible
Sign in to join this conversation.
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
rbrooks/Quest-Board#422
No description provided.