# Lane C — Browser executor / ChatGPT Web adapter progress

Branch: `impl/continuity-c-executor`
Baseline: `9b1c43b3ce64f9e7486325bf8ee027d9df2a2e54`
Worker: `/root/continuity-c-executor`

## Scope

Own `apps/extension/**`, `packages/chatgpt-web-adapter/**`, corresponding tests, and this progress record for the Execution Continuity program. Scheduler/domain persistence remains backend-owned.

## 2026-08-21 — Lane complete

- [x] Read `docs/specs/execution-continuity-auto-resume.md`.
- [x] Read `docs/plans/execution-continuity-auto-resume.md`.
- [x] Read `skills/durable-continuation-output/SKILL.md`; confirmed it is output-only and does not absorb executor policy.
- [x] Created fresh isolated worktree from the exact authoritative baseline. Shared dirty checkout was not modified.
- [x] Implemented continuous/coalesced ChatGPT lifecycle observation with MutationObserver plus bounded reconciliation, navigation/tab reconciliation, and reconnect re-inspection of live managed tabs.
- [x] Hardened exactly-once prompt submission: durable pre-submit journal phase, ambiguous-restart no-resend behavior, submitted no-resend behavior, and a 15-second submission-readiness bound independent of a long backend command deadline.
- [x] Added semantic browser issue classification for delivery timeout, usage/rate limits, safety restrictions, confirmations/authentication, network errors, and generic product errors.
- [x] `Message delivery timed out. Please try again.` is a dedicated recoverable execution-boundary signal. The adapter never clicks ChatGPT Retry; a backend-issued fresh `continue` goes through the ordinary composer/send path. Repeated timeout tests prove Retry remains untouched.
- [x] Added bounded latest-assistant-turn output evidence for backend continuation reconciliation: idle-only final tail, maximum 16,384 characters, truncation flag, semantic assistant-message selection, no arbitrary transcript persistence.
- [x] Added toolbar popup and managed-tab Shadow DOM overlay for Execution Continuity with keyboard/focus support, responsive layout, accessible status regions, dark-mode compatibility, explicit Stop confirmation, and local-only overlay visibility preference.
- [x] UI status and controls consume backend-authoritative continuity views. Cached views are display-only; controls are disabled when disconnected, before an authoritative view arrives, or after terminal disposition.
- [x] Added authenticated executor-WebSocket operator request/result bridge for Pause, Continue Now, Stop/cancel, and Auto Resume policy changes. UI does not optimistic-update backend state and validates request/result worker identity.
- [x] Updated Firefox/Chromium builds to modern targets (`firefox142`, `chrome142`), packaged popup assets, and retained narrow manifest permissions.
- [x] Adapter tests: **15/15 passing**.
- [x] Extension tests: **13/13 passing**, including control-frame fail-closed parsing, UI authoritative-state projection, submission journal recovery, and package manifest checks.
- [x] Extension TypeScript typecheck passes.
- [x] Firefox package validation: `web-ext lint --warnings-as-errors` = **0 errors, 0 warnings, 0 notices**.
- [x] Firefox and Chromium archives package successfully.
- [x] Chromium buildbox qualification: Chromium `150.0.7871.181` on `debian1` loaded the unpacked MV3 artifact; generated browser preferences recorded extension ID `cmaifccfcofdomopkkikhngleepeghck` at the expected unpacked path.
- [x] Repository-wide `pnpm gate` passes: all workspace typechecks, builds, and test suites are green.
- [x] `git diff --check` passes.

## Integration convergence required from shared protocol/backend

Lane A completed before the late browser convergence seams were added. Lane C deliberately did **not** edit Lane A-owned `packages/protocol/**`; instead it implements strict structural compatibility in the owned extension until root integration adds the schemas. The integration branch must define and validate these exact responsibilities:

1. Extend `conversation.state` with optional bounded output evidence:
   - `assistantOutputTail?: string | null`, max 16,384 characters;
   - `assistantOutputTruncated?: boolean`.
2. Authenticated executor client frame `operator.action` carrying `requestId`, `workerId`, one of `pause | continue_now | cancel | set_auto_resume`, optional `enabled` for policy changes, and an idempotency key.
3. Server `operator.result` frame carrying the matching request/worker identity, authoritative success/error, and optionally the refreshed continuity view.
4. Server `worker.continuity` push with backend-authoritative worker disposition/policy/attempt/progress state.
5. Backend must parse/reconcile assistant output evidence and own all continuation scheduling, suppression, pause, terminal, dependency, and human-wait semantics.

Lane C fails closed if these backend control frames are unavailable; it does not create a second scheduler or policy authority.

## Qualification limitations owned by convergence/integration

- Full multi-turn Firefox/Chromium Execution Continuity E2E cannot be truthfully run from this isolated lane until the shared protocol/backend accepts the output-evidence and operator/continuity frames above.
- The available `debian1/2/3` buildboxes do not currently expose a Firefox binary. Firefox package correctness is therefore proven here by build/package tests and strict `web-ext` lint; live Firefox end-to-end qualification remains a convergence gate. Chromium unpacked-load qualification was completed on `debian1`.

## Handoff

Lane C source is ready for convergence. Root should merge/cherry-pick this branch alongside the backend/protocol lane that supplies the shared frames above, then run the plan's integrated multi-turn Firefox/Chromium scenarios.
