Awarding, removing and restoring XP is the GM's (#924) #934

Merged
claude-bot merged 3 commits from fix/924-xp-gm-only into main 2026-09-29 13:39:43 +00:00
Collaborator

Closes #924.

  • Server: create_xp, delete_xp and restore_xp now use require_gm. A player could award, remove or restore XP before.
  • Page: Party.jsx's XpAndGold takes a gm prop. Award XP and XP's Remove show for a GM only.
  • Tests:
    • test_loot.py checks that a player gets 403 on all three.
    • Party.test.jsx checks that a player sees neither control.
    • After merging main, test_loot.py and test_quest_details_api.py pass (31).
  • Changelog: changelog.d/924-xp-gm-only.changed.md.

🤖 Generated with Claude Code

Closes #924. - **Server:** `create_xp`, `delete_xp` and `restore_xp` now use `require_gm`. A player could award, remove or restore XP before. - **Page:** `Party.jsx`'s `XpAndGold` takes a `gm` prop. **Award XP** and XP's **Remove** show for a GM only. - **Tests:** - `test_loot.py` checks that a player gets 403 on all three. - `Party.test.jsx` checks that a player sees neither control. - After merging main, `test_loot.py` and `test_quest_details_api.py` pass (31). - Changelog: `changelog.d/924-xp-gm-only.changed.md`. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
players_can_add_loot let players award, remove and restore XP as well as
add items and gold. Per the owner's D241, XP is the GMs': its create,
delete and restore routes require a GM, and the party page offers Award
XP and XP's Remove only to a GM. Items and gold keep the setting.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Merge remote-tracking branch 'origin/main' into fix/924-xp-gm-only
All checks were successful
CI / Feedback site tests (pull_request) Successful in 49s
CI / Backend lint (ruff) (pull_request) Successful in 52s
CI / Summarisation accuracy eval harness (stub provider) (pull_request) Successful in 1m53s
CI / Bot tests and audit (pull_request) Successful in 2m11s
CI / Does this change touch the recording path? (pull_request) Successful in 25s
CI / Synthetic session harness (no GPU, no LLM) (pull_request) Has been skipped
CI / Bot/backend version sync (pull_request) Successful in 39s
CI / Docker image build (pull_request) Successful in 5m58s
CI / Backend migration, tests, and audit (pull_request) Successful in 20m28s
CI / Frontend tests, audit, and build (pull_request) Successful in 35m18s
CI / End-to-end journeys (desktop, phone, keyboard-only) (pull_request) Successful in 31m28s
e3355238cf
Sign in to join this conversation.
No description provided.