/** * vocabulary. * * Why a bounded enum (not a free-form string): * - a free-form `stage` recreates the `note` field, which already * exists and did not solve visibility. * - the watch surface renders a stage label inline (`role 30% * (5s ago) [planning]`); an unbounded vocabulary would let typos * and near-duplicates spread across the swarm. * - the LLM-side runner can validate the stage at write time * (`setStage` rejects unknown values with `INVALID_STAGE`). * * The enum is intentionally small and stable. Adding a new stage is a * deliberate code change (this file + the `setStage` validation) so a * future user cannot accidentally flood the watch with `awaiting-coffee` * or `idk`. * * `null` is NOT a stage — it is the absence of a stage. Records that * have not yet been promoted carry `stage: null`; the watch surface * renders no marker. */ export declare const STAGE_LABELS: readonly ["intake", "planning", "gathering", "analyzing", "writing", "testing", "reviewing", "finalizing"]; export type StageLabel = (typeof STAGE_LABELS)[number]; export declare const DEFAULT_STAGE_LABELS: readonly StageLabel[]; export declare function isStageLabel(value: unknown): value is StageLabel; export declare function normalizeStage(value: string | null | undefined): StageLabel | null;