# Repro: refund reports success, charge stays captured

> Helios billing · $48,200 Northwind seat expansion

- **App:** http://localhost:4173/helios.html
- **Captured:** 2026-09-10T12:25:00.013Z
- **Playhead:** 0.4.0
- **Footage:** 76.4s · 11 steps
- **Verdict:** publishable
- **Console errors:** 6

## Console

```
[error] [api] POST https://api.helios.dev/v1/refunds → 500 Internal Server Error
[error] TypeError: Cannot read properties of undefined (reading 'idempotencyKey')
[error] at RefundService.create (src/billing/refunds.ts:214:18)
[error] at BillingController.issueRefund (src/http/billing.ts:88:12)
[error] at async Object.handler (src/http/router.ts:41:20)
[pageerror] Cannot read properties of undefined (reading 'idempotencyKey')
```

## Steps

1. `0:01` **expect** `role=heading[name="Overview"]` — Step 1 — helios Ops
2. `0:14` **click** `role=link[name="Billing"]` — Step 2 — open Billing
3. `0:15` **expect** `role=heading[name="Recent charges"] >> nth=0` — Step 3 — recent charges
4. `0:21` **expect** `text="Northwind outstanding · $48,200" >> nth=0` — Step 4 — outstanding $48,200
5. `0:31` **click** `role=button[name="Refund Northwind Trading"]` — Step 5 — refund Northwind Trading
6. `0:35` **expect** `role=heading[name="Issue refund?"]` — Step 6 — confirm the refund
7. `0:44` **click** `role=button[name="Issue refund"]` — Step 7 — issue refund
8. `0:46` **wait** `text=refund.failed` — Step 8 — the webhook says failed
9. `0:54` **expect** `text="Northwind outstanding · $48,200" >> nth=0` — Step 9 — balance unchanged
10. `0:59` **expect** `text="Captured"` — Step 10 — still captured
11. `1:09` **wait** — Step 11 — hold on the evidence

## Artifacts

- `bug-report.md` — this file
- `out.mp4` — the repro, with clock, console feed, and this report as the closing card
- `capture/console.json` — raw console / pageerror records
- `verify/verdict.json` — signed checks against the delivered pixels
- `verify/contact-sheet.png` — annotated key frames

_Generated by Playhead. Re-compose from the capture bundle if the wording of this report changes — do not re-shoot._
