export type TaskState = | "IDLE" | "SNAPSHOT" | "DIAGNOSE" | "PLAN" | "WAIT_APPROVAL" | "IMPLEMENT" | "VERIFY" | "REPORT" | "DONE" | "BLOCKED"; export type WorkstreamCategory = | "debug-build" | "installer" | "audit" | "local-fix" | "ci" | "deploy" | "backend-port" | "coding" | "unknown"; export interface TaskStateSnapshot { state: TaskState; currentWorkstream: WorkstreamCategory; approvedWorkstreams: WorkstreamCategory[]; lastReason?: string; } export interface DriftDecision { drift: boolean; blocked: boolean; reason: string; nextState: TaskState; } const ALLOWED_TRANSITIONS: Record = { IDLE: ["SNAPSHOT", "BLOCKED"], SNAPSHOT: ["DIAGNOSE", "BLOCKED"], DIAGNOSE: ["PLAN", "IMPLEMENT", "BLOCKED"], PLAN: ["WAIT_APPROVAL", "IMPLEMENT", "BLOCKED"], WAIT_APPROVAL: ["IMPLEMENT", "BLOCKED", "DONE"], IMPLEMENT: ["VERIFY", "BLOCKED"], VERIFY: ["REPORT", "IMPLEMENT", "BLOCKED"], REPORT: ["DONE", "BLOCKED"], DONE: ["IDLE", "BLOCKED"], BLOCKED: ["SNAPSHOT", "DONE"], }; export function createTaskState(currentWorkstream: WorkstreamCategory = "unknown"): TaskStateSnapshot { return { state: "IDLE", currentWorkstream, approvedWorkstreams: [currentWorkstream], }; } export function transitionTaskState(snapshot: TaskStateSnapshot, nextState: TaskState, reason?: string): TaskStateSnapshot { if (!ALLOWED_TRANSITIONS[snapshot.state].includes(nextState)) { return { ...snapshot, state: "BLOCKED", lastReason: `Invalid state transition: ${snapshot.state} -> ${nextState}`, }; } return { ...snapshot, state: nextState, lastReason: reason || snapshot.lastReason, }; } export function approveWorkstream(snapshot: TaskStateSnapshot, workstream: WorkstreamCategory): TaskStateSnapshot { if (snapshot.approvedWorkstreams.includes(workstream)) return snapshot; return { ...snapshot, approvedWorkstreams: [...snapshot.approvedWorkstreams, workstream], }; } export function detectDrift(snapshot: TaskStateSnapshot, proposed: WorkstreamCategory): DriftDecision { if (proposed === snapshot.currentWorkstream) { return { drift: false, blocked: false, reason: "Same workstream.", nextState: snapshot.state, }; } if (snapshot.approvedWorkstreams.includes(proposed)) { return { drift: false, blocked: false, reason: "Workstream explicitly approved.", nextState: snapshot.state, }; } return { drift: true, blocked: true, reason: `Task drift detected: current workstream '${snapshot.currentWorkstream}' vs proposed '${proposed}'. Approval required before switching.`, nextState: "BLOCKED", }; }