Money stops being a flat `coin` and becomes copper, stored as a single int, formatted only at the display edge. The approved model (1g = 100s = 10,000c, store everything in copper) said money should stay an inventory item under one `copper` id. It can't. §6 is what kills it: `give_item(x)` adds exactly 1 and carries no quantity, and `gifts_given` is a global one-shot keyed by item id — so a single `copper` id would be givable once, for one copper, for the whole campaign. So the purse is one int on GameState, and the three denominations are content items that exist only to let a bounded move name a unit — give_item(gold) is +10,000c. Three ids, not three buckets: the change-making problem never arises because there is only ever one number. A quantity arg on the move was rejected — it hands the model an unbounded integer to invent, which is the §2 line. Currency routes to the purse and never enters `inventory`, so it can't appear in an inventory grid by construction. No filter needed. Prices remain content and remain M8. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01QYa9u7Kdxv5gX4AnwWexy8
/docs — cross-cutting docs
Anything affecting both client and api, plus planning and roadmap. Side-specific docs live in /api/docs and /client/docs.
Put here:
roadmap.md— phases, POC scope, what's nextadr/— Architecture Decision Records- Shared contracts — canon log schema, tag syntax, retry policy (§11, §12)
- Anything spanning the HTTP boundary
The charter itself — CLAUDE.md — stays at the repo root. It is the source of truth; these docs elaborate, they do not override it.