# Mid-turn ChatGPT Steering

Status: implementation complete; isolated qualification complete; live LibreWolf proof pending extension activation.
Date: 2026-08-21
Branch: `impl/midturn-steering`

## Objective

Add a real ordinary-ChatGPT-UI steering path that can deliver orchestrator checkpoint/corrective messages while a managed worker conversation is still generating, instead of waiting for `idle`.

This supports the agreed continuity control loop:

1. approximately every 20–21 minutes, or on a material root correction, create a durable steering intent;
2. worker receives a checkpoint asking it to report commits/completed/current/remaining work/blockers/contracts to `/root`;
3. worker then continues working to completion;
4. root reviews reports against the larger plan and may steer again.

## Implemented

- protocol command `conversation.steer` with `checkpoint | corrective` reason;
- MCP tool `worker.steer`;
- deterministic command ID derived from caller idempotency key, so retries own one executor command;
- server precondition that the durable managed conversation is `generating`;
- extension command-journal handling with the same ambiguous-submission fail-closed rule as ordinary sends;
- content-script `steer` action;
- DOM adapter `submitSteering`;
- steering explicitly requires active generation;
- ordinary prompt submission still refuses active generation;
- steering uses the semantic ordinary ChatGPT send control only;
- steering never clicks Stop or Retry;
- after clicking Send, adapter requires observable composer acceptance/clearing before reporting success;
- if acceptance cannot be proven, command fails closed and is not blindly resent after an ambiguous restart boundary.

## Safety / semantics

The executor does not stop generation to make space for steering. If ChatGPT does not expose a safe enabled ordinary send control during generation, the steering operation fails closed. Scheduler/root remains responsible for retaining/retrying/coalescing the durable intent.

No private ChatGPT backend API is used.

`worker.steer` is immediate transport, not the timer scheduler itself. The 20–21 minute jitter, 15-minute routine anti-spam floor, idle bypass, corrective-steering exception, and checkpoint report generation remain backend scheduler/root policy owned by the Execution Continuity convergence work.

## Automated qualification

On `debian2`:

- full `pnpm gate`: PASS after steering implementation;
- protocol steering schema test: PASS;
- ChatGPT adapter steering tests: PASS, including no Stop click;
- MCP deterministic steering command tests: PASS;
- Gecko/LibreWolf-format extension lint with `--warnings-as-errors`: 0 errors, 0 notices, 0 warnings.

## Remaining live proof

The currently running LibreWolf profile still has the previously loaded extension build. Activating this new extension code requires a LibreWolf extension reload/restart. Do not restart or navigate the user's active LibreWolf without explicit authorization.

Once authorized, live proof should:

1. activate the new XPI;
2. choose a managed conversation that is visibly `generating`;
3. invoke `worker.steer` with a unique idempotency key and a benign checkpoint prompt;
4. prove the prompt is accepted through the ordinary ChatGPT UI without Stop/Retry;
5. verify command result + journal + continued generation/turn behavior;
6. observe whether the steering message actually resets/extends the upstream turn timer, recording empirical evidence separately from the current assumption.
