Problem
Async notifications only fire while BatchExecutionMonitor is mounted (i.e. while the user is on /execution?batch=…). BatchExecutionMonitor is the sole dispatcher of batch.completed/blocker.created, and gate.run.failed has the same constraint on /proof. Navigate away and a batch that finishes in the background produces no notification — in-app or browser. Since the entire value of browser notifications is being alerted while not watching, this materially undercuts the feature.
This is already acknowledged as a known limitation in CLAUDE.md.
Evidence
web-ui/src/components/execution/BatchExecutionMonitor.tsx:108-155 — sole dispatcher of batch.completed/blocker.created, only active on the execution page
Fix (pick one)
- Preferred: a cross-page background poller (mounted in
NotificationProvider / root layout) that watches active batches and emits notifications regardless of current route.
- Minimum: document the limitation clearly in release notes / UI copy so users don't expect background alerts.
Acceptance criteria
Source: release-readiness audit 2026-06-13 (frontend agent).
Problem
Async notifications only fire while
BatchExecutionMonitoris mounted (i.e. while the user is on/execution?batch=…).BatchExecutionMonitoris the sole dispatcher ofbatch.completed/blocker.created, andgate.run.failedhas the same constraint on/proof. Navigate away and a batch that finishes in the background produces no notification — in-app or browser. Since the entire value of browser notifications is being alerted while not watching, this materially undercuts the feature.This is already acknowledged as a known limitation in CLAUDE.md.
Evidence
web-ui/src/components/execution/BatchExecutionMonitor.tsx:108-155— sole dispatcher ofbatch.completed/blocker.created, only active on the execution pageFix (pick one)
NotificationProvider/ root layout) that watches active batches and emits notifications regardless of current route.Acceptance criteria
Source: release-readiness audit 2026-06-13 (frontend agent).