export type WorkflowSkipState = { rid: string; skippedGates: string[]; skipReason: string; skipAppliedAt: string; skipAppliedBy: string; callerKind: 'human' | 'llm' | 'script'; }; /** C0/C1 controls and DEL. A newline or escape in a printed field is a spoofed line. */ export declare function hasControlChars(value: string): boolean; /** * Read the skip-state for a rid, or `null` if no state file exists or * the file is malformed. The caller is expected to treat `null` as * "no skip applied; evaluate all gates normally". * * A NULL IS SILENCE, AND SILENCE MEANS "NO SKIP HONOURED". The shape check refuses * a record the write path could not have produced — an empty reason, or no gate * named — so a hand-planted file that satisfies field PRESENCE but not the write * rules lands here as `null` and the gates are evaluated. That is the safe * direction: the cost is a skip that stops applying, stated in the RD artifact, * not a bypass that starts applying. */ export declare function readSkipState(projectRoot: string, sessionId: string, rid: string): WorkflowSkipState | null; /** * Write (or overwrite) the skip-state for a rid. Returns the absolute * path to the file that was written. Caller is responsible for * surfacing this in the envelope as `persistedTo`. */ export declare function writeSkipState(projectRoot: string, sessionId: string, state: WorkflowSkipState): string; /** * Delete the skip-state file for a rid. Idempotent: missing file is * a no-op (returns false). Used by `peaks workflow unskip` (v2) and * by the rollback path of `applySkip` if the caller passes * `--dry-run` and we want to clean up any preview state. */ export declare function deleteSkipState(projectRoot: string, sessionId: string, rid: string): boolean;