- Replace every model-boss/coordinator reference with the @prospector/ai-harness story (direct vLLM client + classify/draft/judge/orchestrate task registry + on-demand GPU lifecycle + CoT-workflow runner + cost meter) across ai-first-v4, draft-engine, model-eval-pipeline, and PROSPECTOR.md; GPU_INFERENCE_URL is the canonical inference contract. Note ai-harness is promotable to a shared @ct package (onlyfans carries a parallel src/engine/classifier.ts). - Fix migration collision: ai-first-v4 actor-attribution renumbered 0007 -> 0016 (0007_tasks.sql exists; tree at 0013). - Add the three missing pieces from the plan: a formal DRAFT runner mode distinct from PAUSE + DRAFT->GO graduation (new control-modes.md); a runtime per-draft alignment gate (deterministic facts/policy + GPU judge; spec_conflict/ policy_conflict holds) in draft-engine's pipeline; and the facts/mission config schema (src/specs/, 0014_specs.sql) in ai-system-plan §5 + draft-engine. - Index control-modes.md and the ai-harness rename in features/README.md. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2.9 KiB
Control modes — GO / PAUSE / AWAY / DRAFT
The kill-switch (
prospector_settings.mode,src/entities/prospector-settings.entity.ts) gates every auto-send. This doc adds DRAFT — a formal runner mode distinct from PAUSE — and the criteria that graduate DRAFT → GO. Seedraft-engine.mdfor the per-draft alignment gate that runs in every mode, andai-first-v4.mdfor the governance primitives (actor attribution, theHoldReasonunion,prospector_release_held) DRAFT reuses.
The modes
| Mode | Runner behavior | Sends? |
|---|---|---|
| GO | classify → draft → align → auto-dispatch through the macsync outbox | yes (gated) |
| DRAFT (new) | classify → draft → align → stage for operator review (pending_review) |
only after approve |
| PAUSE | classify → draft, then hold; nothing is staged or sent | no |
| AWAY | runner halted (AFK); no drafting cadence | no |
Why DRAFT is distinct from PAUSE. PAUSE is "draft-never-send": bodies are
generated but parked as holds, with no review affordance and no path to send. DRAFT
is the trust-ramp: every aligned reply is staged as a pending_review task
(actor-tagged), and the operator approves / edits / rejects + feedback — only an
approval enqueues the send child (insertTask('send')). Approve/edit/reject flow
through the governance path (prospector_release_held(id, decision) +
POST /prospector/drafts/:id/{approve|revise|reject}), and each decision is written
as a structured correction → DPO / preference training data (see
training-loop.md). In DRAFT the operator is the
alignment; in GO the runtime alignment gate is. Default mode stays PAUSE.
DRAFT → GO graduation criteria
DRAFT is a confidence ramp, not a permanent state. Graduate to GO when, over a rolling review window, the staged drafts clear all of:
- Approval rate high enough that review is rubber-stamping, not rewriting (≥ N approvals with an unedited-approve rate above threshold).
- Edit rate low and shrinking — the median edit distance between
generated_bodyandcorrected_bodytrends to zero. - Zero policy/spec violations reaching review — the alignment gate already held
them, so the
spec_conflict/policy_conflictrate ≈ 0. - A minimum sample spread across archetypes/states, so the rate isn't a small-N artifact.
These are the same signals the eval pipeline uses as the DRAFT→GO eval gate
(model-eval-pipeline.md Stage 5): the per-build
approval rate is the live continuation of the held-out 85% "would-send-unedited"
Gate-1. Demotion is symmetric — a regression (rising edit rate, any policy
violation) drops the engine/mode back to DRAFT (or the safe template engine)
automatically. GO is earned, never the default.