--- issue: 096 title: "Backend: validateStatusTransition requires escrowState 'funded' never set on completed payments" severity: medium domain: Payment labels: [bug, backend, state-machine] status: open created: 2026-05-30 source: Full Codebase Audit 2026-05-30 --- # Backend: validateStatusTransition requires escrowState 'funded' never set on completed payments **Severity:** medium **Domain:** Payment **Labels:** bug, backend, state-machine ## Description `marketplaceController.ts:570-583` guards a status transition by querying for `{ status:'completed', escrowState:'funded' }`. The completion flow never sets `escrowState:'funded'`; it is set earlier (at funding time). A genuinely completed payment may not match this query, causing the guard to reject valid transitions. ## Options 1. Query by `status:'completed'` only (drop `escrowState:'funded'`). 2. Ensure the completion flow sets `escrowState:'funded'` consistently and keep the guard. 3. Match on a documented completed-payment predicate aligned with the actual write path. ## Recommendation Align the guard with what the completion flow actually writes — most safely query `status:'completed'` without the `escrowState` constraint, after confirming no false positives. ## Affected Files - `backend/src/services/marketplace/marketplaceController.ts:570-583` ## References - [Full Codebase Audit 2026-05-30](../09%20-%20Audits/Full%20Codebase%20Audit%20-%202026-05-30.md) — DEC-34