# V13-FE-034 — Idempotency retry contract

## Source / Assumption / Unknown / Decision Required

- Source: `frontend/src/shared/commands/idempotency.ts`, `frontend/src/shared/crud/useOptimisticCommand.ts`, and their characterization tests.
- Assumption: one `createRequest()` represents one user intent; every retry reuses that immutable request envelope.
- Unknown: each production command's server-side deduplication store, response replay contract, retention, and endpoint coverage.
- Decision Required: BE/QA approval of per-command idempotency persistence and duplicate-side-effect evidence.

## Existing contract verified

- UUID key is generated once per intent.
- `run()` sends the same `Idempotency-Key` on repeated execution.
- Optional `If-Match` is forwarded for optimistic concurrency.
- 409/412 sets the conflict state and pending state is cleared.
- Concurrent execution is rejected while a command is pending.

## Evidence

- `pnpm test -- src/shared/crud/tests/useOptimisticCommand.spec.ts`: 1 file / 2 tests passed in the FE regression run.
- Full FE regression: 49 files / 126 tests passed; typecheck passed.

## Outstanding

This proves the client boundary only. Server-side deduplication, replayed response equivalence, retention, and per-endpoint integration evidence remain outstanding. This Slice is `IN_PROGRESS`.
