/** * Autopilot Ken's verdict contract. * * In autopilot mode Ken never talks to the user — he auto-reviews GG Coder's * work and replies with exactly one of four machine-parseable verdicts. The * first non-empty line carries the keyword; anything after is the payload. * * PROMPT * * * ALL_CLEAR * * IGNORE * * HUMAN * * * ALL_CLEAR and IGNORE both stop the cycle with nothing left to do, but they * mean different things to the UI: ALL_CLEAR is a verdict on real work ("GG * Coder built/changed something and it checks out") and renders a one-line Ken * marker. IGNORE means the turn was never worth reviewing in the first place * (small talk, a question, an ack, a mechanical operation with no code * changes) — it renders NOTHING, not even a marker, so trivial turns don't * spam the transcript with a Ken bubble that adds no information. * * Parsing is forgiving and safe-by-default: any reply we can't confidently map * to PROMPT, ALL_CLEAR, or IGNORE becomes a HUMAN stop, never a blind loop. * * Recovery order for prose-then-keyword drift (Ken writing commentary before * the verdict despite the contract): bare trailing ALL_CLEAR/IGNORE → buried * HUMAN → buried line-start PROMPT (uppercase, line-start only, so prose like * "prompt the user" can never match). HUMAN wins over PROMPT when both appear * — recovering a stop is always safe, recovering an action must lose ties. */ export type AutopilotVerdict = { kind: "prompt"; body: string; } | { kind: "all_clear"; } | { kind: "ignore"; } | { kind: "human"; reason: string; }; /** * Parse Autopilot Ken's raw reply into a verdict. Never throws. */ export declare function parseAutopilotVerdict(reply: string): AutopilotVerdict; //# sourceMappingURL=autopilot-verdict.d.ts.map