Real-app watch proof

AI-assisted; verified with the tests and tools listed above.

Both commits run their own server and fresh database, using the browser at 1280x800 in the light theme. The replay recording creates a synthetic thread. No live pull request is changed.

The injector changes the host response boundary only for the synthetic PR, adds a CLI passthrough to the real MCP tool session, and shortens the watch sweep interval from two minutes to six seconds. It does not change watch decision logic. Detail reports closed after the driver changes the phase file; activity throws a controlled failure. Fingerprint polling is disabled for that synthetic reference.

Place the scenario and start-app.ts in scripts/scenarios of a runner checkout. Set T3_WATCH_PROOF_INJECTOR to the absolute location of inject.py. Set T3_SCENARIO_APP_DIR to a base or head checkout with dependencies installed, and run from scripts:

E2E_TELEMETRY_DISABLED=1 T3CODE_DEV_SEED=0 vp exec e2e run scenarios/closed-watch-activity-failure.e2e.ts --target web --output .e2e/proof

Run sequentially on base b3fdf2b10fb92e5dbc71a83381c602a8a464bbca and head eefcaf1fb7d7b01b86cadd400bdd89abf596f1d9.

The scenario records the watch-armed state, waits for a successful closed-detail read and failed activity read, then captures a byte-identical screenshot pair at least 500 ms apart. Its only assertion checks the closed/stopped notification. Base fails that assertion while visibly still watching; head passes it and ends the watch.
