---
issue: 004
title: "POST /api/disputes/:id/resolve (dashboard) does not trigger escrow release — only updates Dispute model"
severity: critical
domain: Dispute
labels: [bug, backend, escrow, major]
status: resolved
resolved: 2026-05-29
fix: "DisputeService.resolveDispute now calls releaseHoldResolve(purchaseRequestId) after saving, clearing escrow hold and unblocking payment release"
created: 2026-05-29
source: Doc vs Code Audit 2026-05-29
---

# 🔴 POST /api/disputes/:id/resolve (dashboard) does not trigger escrow release — only updates Dispute model

**Severity:** critical
**Domain:** Dispute
**Labels:** bug, backend, escrow, major

## Description

The API claims resolveDispute 'triggers refund/release/split escrow action.' DisputeService.resolveDispute only updates the Dispute document. The separate POST /api/disputes/:purchaseRequestId/resolve (releaseHold router) is required to actually unblock escrow. Due to the route shadowing bug, the correct handler may never be reached.

## Current Behavior

DisputeService.resolveDispute only updates the Dispute document. Escrow remains blocked until a separate correct API call is made to the releaseHold router.

## Expected Behavior

Dispute resolution should atomically update the Dispute record AND release/refund the escrow as indicated by the action field.

## Affected Files

- `backend/src/services/disputeService.ts`
- `backend/src/controllers/disputeController.ts`

## References

- [Doc vs Code Audit Report](../09%20-%20Audits/Doc%20vs%20Code%20Audit%20Report%20-%202026-05-29.md)
