# Launcher throttle handoff

Date: 2026-08-21
Branch: `impl/launcher-throttle`

## Owner policy

New managed ChatGPT conversation launches are a browser-risk operation, not worker concurrency.

- exactly one new conversation launch may be in flight at a time;
- launch starts are spaced by randomized 9–12 second gaps;
- existing/bound conversations do not consume this launch throttle;
- managed/open conversation capacity is a separate safety ceiling and must not default to 4 globally;
- ChatGPT rate/usage-limit UI must be recognized explicitly, following the existing Ask-GPT cap detector semantics;
- when ChatGPT provides a reset clock time, that time is authoritative for launch cooldown;
- without an explicit reset time, use a conservative five-minute launch cooldown;
- launch timestamp/cooldown state must survive extension background wake/reload;
- no LibreWolf restart is required to build or qualify this branch.

## Implementation

- `apps/extension/src/launch-throttle.ts`
  - serialized launch reservation helper;
  - 9–12s jitter;
  - persistent cooldown calculations;
  - explicit reset-time precedence;
  - conservative 5m fallback.
- `apps/extension/src/background.ts`
  - fixed `AsyncSemaphore(1)` for new conversation launch operations;
  - throttle applies only when no managed binding already exists;
  - recognized `RATE_LIMITED` content failures update durable cooldown.
- `apps/extension/src/storage.ts`
  - durable `launchThrottle` state;
  - old known global default `maxManagedWorkers=4` migrates to 64;
  - managed-conversation ceiling supports up to 256;
  - concurrent launch setting is normalized to 1.
- `apps/extension/static/options.html` / `src/options.ts`
  - concurrent launches shown as fixed 1;
  - explains 9–12s spacing and longer rate-limit cooldown;
  - managed conversation safety ceiling remains independently configurable.
- `packages/chatgpt-web-adapter/src/index.ts`
  - Ask-GPT-style usage/rate-limit recognition around composer/dialog;
  - explicit reset clock parsing;
  - `HostRateLimitedError` distinct from generic host UI drift.

## Qualification

Executed remotely on `debian2` only.

- `pnpm install --frozen-lockfile`: PASS
- `pnpm gate`: PASS
- extension package build: PASS
- `web-ext lint --source-dir dist/firefox --output=json`: PASS
  - errors: 0
  - warnings: 0
  - notices: 0
- `git diff --check`: PASS

No workstation tests were run. LibreWolf was not restarted or reloaded.

## Integration note

This branch was cut from `main` at `980d1b2`. The active Execution Continuity root must reconcile it with the separate mid-turn-steering/convergence work rather than overwrite either side. The launcher throttle governs only `conversation.create`; mid-turn steering and existing conversation sends are independent operations.
