import type { WorkflowTodoLifecycle } from "../workflows/runner.js"; /** * What a decided gate owes the Todo it was mirrored onto: the note that says * what was decided, and the settling of the mirrored approval row itself. * * The row matters because a gate has two doors. Decided on the Todo, the row * settles first and the run is told afterwards. Decided on the run — from the * inspector, from MCP, from an operator-only gate the Todo surface will not * offer — nothing used to settle it, so the Todo kept showing a decision that * had already been made, and the reconciler withheld its trust auto-close on a * gate nobody was still waiting for. * * Both doors now end here, and the settle is idempotent by construction: it * writes only a PENDING row whose ref names this very gate. That is also why it * uses the raw row write rather than the notifying one — the notifying door * wakes the mirror-back listener, which would re-enter the run decision this * settle was triggered by. */ /** `workflow-x` run `run_y` · gate `node_z` — the same trail on every gate note. */ export declare function gateTrail(input: { workflowId: string; runId: string; nodeId: string; }): string; /** The rejecter's own words, quoted so the next run's first phase reads feedback * and not a paraphrase of it. */ export declare function quoted(feedback: string): string; type GateDecision = Parameters[0]; export declare function recordApprovalDecision(input: GateDecision): void; export {}; //# sourceMappingURL=workflow-todo-gate.d.ts.map