1 NEW REGRESSION (dispatch.spec.js, 12/12 tests — missing HUB_JWT_SECRET) on top of the 18th consecutive night of the known infra-outage plateau (752 failed / 860 passed / 140 skipped).

## Run identification
- Source: test_reports/nightly_20260727.json
- Marker: test_reports/nightly_marker.json → `date: 20260727`, `finished_at: 2026-07-27T23:26:17Z` = **2026-07-28 04:56:17 IST** — this is tonight's (2026-07-28 IST) run. The marker `date` field is UTC-run-start-stamped, not IST (known, longstanding labeling quirk, unfixed since 2026-07-04).
- Playwright stats: **1752 total, 860 passed (expected), 752 failed (unexpected), 140 skipped, 0 flaky.**

## REGRESSION — dispatch.spec.js (12/12 tests failing, NEW)
dispatch.spec.js was in the confirmed green set as recently as 2026-07-21→22 (previous nightly_summary_latest.md, line 43). Tonight all 12 dispatch tests fail with:
```
Error: HUB_JWT_SECRET not set in environment — source /root/360lm-web/.env before running these tests
```
Affected tests (each ×2 for desktop-chrome/android-chrome):
- select-courier (ADR-119) picks a serviceable courier with a valid JWT
- ndr worklist returns labeled mock data (ADR-118)
- proof photo upload -> sign -> view roundtrip, tampered/expired rejected
- new mock booking points are reachable through the adapter interface
- cheapest_within_sla rule picks the cheapest courier meeting the SLA, not the fastest
- mock /track tags events with the correct source per booking-point (not "manual" for every mock result)

This reads as an environment/config gap in the test runner (not sourcing `HUB_JWT_SECRET` before this spec), likely surfaced by recent dispatch/JWT work (commit 106469b "ADR-118: fix reconcile-correctness bugs", commit 537cf04 "DispatchWithAutomation Phase 0-3"). Needs the nightly runner's env sourcing fixed, or the spec needs an env-presence guard.

## Known plateau — 18th consecutive night, unchanged pattern
Failure signature and counts match the ongoing "server/DB/proxy partially unreachable during the ~00:15–05:00 IST window" plateau tracked since 2026-07-02, unchanged since 07-17→18 / 07-21→22 (per-file counts identical except dispatch above and rentveh below):

| Spec file | Failures |
|---|---|
| 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** | **12 (NEW — see above)** |
| 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/smoke 6 each, client 4, debug_tour/hr/rentveh 2 each — omitted above per 20-row cap, unchanged from prior nights except client dropped 4→4 and dispatch new.)

Sampled error signatures confirm the same family as prior nights: `toContainText` assertion failures (fundcustodian) and `page returns 200` / status-code mismatches (sales_billing) — consistent with the dev stack being partially unreachable during the run window, not independent app regressions.

## Notable resolved item
- **tour_pg.spec.js — 0 failures tonight.** The `matrix + 2-opt path for 14 stops` 502 regression (confirmed 2026-07-15→16, still present through 2026-07-17→18) does not appear in tonight's failure list. Watch 1-2 more nights before calling it durably fixed.

## Still-open, unchanged
- **rentveh.spec.js › SW cache version matches CACHE_VER in app** — still fails (stale `SW_VER` constant in the spec vs. shipped `sw.js`), routine test-maintenance item, not an app regression.

## Baseline
The trusted baseline remains the 2026-06-20 snapshot (0 failed) in `project_pwa_test_coverage.md` — this outage has never been re-baselined. `project_pwa_test_coverage.md` updated with tonight's entry and the new dispatch regression flagged for follow-up.
