NO NEW REGRESSIONS — 19th consecutive night of the known infra-outage plateau (754 failed / 863 passed / 142 skipped / 1 flaky); dispatch.spec.js failures grew 12→14 purely because new tests landed on the already-tracked missing-HUB_JWT_SECRET env gap, not a fresh defect.

## Run identification
- Source: test_reports/nightly_20260728.json
- Marker: test_reports/nightly_marker.json → `date: 20260728`, `finished_at: 2026-07-28T23:24:26Z` = **2026-07-29 04:54:26 IST** — this is tonight's (2026-07-29 IST) run. The marker `date` field is UTC-run-start-stamped, not IST (known, longstanding labeling quirk, unfixed since 2026-07-04).

## Totals
**1760 total, 863 passed, 754 failed, 142 skipped, 1 flaky**

Baseline for comparison: test_reports/nightly_20260727.json (2026-07-27→28 IST) — 1752 total, 860 passed, 752 failed, 140 skipped, 0 flaky (see `project_pwa_test_coverage.md`).

## Failures by spec file (tonight)

| File | Failed |
|---|---|
| fundcustodian.spec.js | 154 |
| sales_billing.spec.js | 78 |
| vendors.spec.js | 74 |
| upi_pay.spec.js | 68 |
| customers.spec.js | 50 |
| custodian.spec.js | 40 |
| recce_client.spec.js | 32 |
| recce.spec.js | 32 |
| sales.spec.js | 32 |
| safe_bottom.spec.js | 28 |
| stores.spec.js | 26 |
| counters.spec.js | 18 |
| yagya-portfolio.spec.js | 18 |
| contacts.spec.js | 14 |
| dispatch.spec.js | 14 |
| finance.spec.js | 10 |
| installation.spec.js | 10 |
| tour_planner.spec.js | 10 |
| hub.spec.js | 8 |
| oc_admin.spec.js | 8 |
| vrs.spec.js | 8 |
| admin.spec.js | 6 |
| smoke.spec.js | 6 |
| client.spec.js | 4 |
| debug_tour.spec.js | 2 |
| hr.spec.js | 2 |
| rentveh.spec.js | 2 |

Every file above matches the established plateau exactly (byte-identical failure counts to 07-27→28) **except dispatch.spec.js**, which grew 12 → 14 failures plus 1 new flaky test.

## dispatch.spec.js detail (the only file that changed)

All 14 failures throw the same pre-existing error:
`Error: HUB_JWT_SECRET not set in environment — source /root/360lm-web/.env before running these tests`

Failing titles tonight (includes newly-added tests hitting the same env gap, not new distinct failure modes):
- booking kill-switch: live creds do not imply live booking (2026-07-28 YEMO rollout)
- select-courier (ADR-119) picks a serviceable courier with a valid JWT
- ndr worklist returns labeled mock data when mock, or an honest not-yet-implemented flag when live (ADR-118)
- wallet-balance endpoint returns a numeric balance (mock or live)
- proof photo upload -> sign -> view roundtrip, tampered/expired rejected
- new mock booking points are reachable through the adapter interface
- mock /track tags events with the correct source per booking-point (not "manual" for every mock result)

New flaky (not a failure — passed on retry):
- parses a real order-booking row via claude_oauth, no timeout, all 7 fields present — first attempt: `expect(received).toContain(expected)` mismatch on a phone number (`"8048052963"` not found in expected value); retry passed.

## Verdict detail

No regressions. The +2 failed / +1 flaky / +8 total / +3 passed deltas vs 07-27→28 are fully explained by new dispatch tests landing on the already-tracked `HUB_JWT_SECRET` nightly-runner env gap (open action item, now unresolved for a 2nd night) — not new independent breakage. All 26 other failing files are byte-identical in count to the prior night's plateau. Action item unchanged: fix `HUB_JWT_SECRET` sourcing for dispatch.spec.js in the nightly runner.

Full previous-night context: test_reports/nightly_summary_20260727.md.
