The existing test varied the move name and the denomination together, so a name-only or denom-only key would have passed it too. Two assertions nail it: give_item(gold)+give_item(silver) kills a name-only key, and give_item(gold)+accept_item(gold) kills a denom-only key. The spec now records the per-reply ceiling as a decision rather than an accident, and flags the pre-existing non-currency duplicate-tag path as open. 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.