Merge RB-18 — key IdempotencyStore on caller plus idem key

BIO-018: the store was a process-global dictionary keyed on the client-supplied
Idempotency-Key alone, so one caller could replay another caller's key and
receive their cached response. The key is now scoped with the caller SubjectId.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

# Conflicts:
#	docs/project/refactor-backlog-setup/refactor-backlog/99-backlog.md
#	libs/shared/docs/behaviour-spec.mdx
This commit is contained in:
eho
2026-08-27 18:33:12 +02:00
5 changed files with 181 additions and 38 deletions
+2 -1
View File
@@ -21,7 +21,7 @@ tested where._
Every bullet below is a real test name from the suite — an `it()` title (frontend) or a test
method name (backend), read as a sentence. Nothing here is hand-written prose: this page
**is** the suite, reshaped for a business reader. 460 frontend behaviours across
9 contexts; 236 backend behaviours across 41 test
9 contexts; 237 backend behaviours across 41 test
classes.
## Frontend (by context)
@@ -1064,6 +1064,7 @@ classes.
- Replaying the same idempotency key returns the same reference not a new one
- Different idempotency keys are independent submissions
- A caller replaying another callers idempotency key does not get their cached result
- A rejected submission replays the same rejection not a retry
### IntakeRuleTests