import type { Board } from "./model.js"; /** * What the interview has settled, and what it has not. * * A conversation that starts again should not start over. Closure is therefore a fact on the board, * not something the model has to remember from a transcript: it survives a reload, a new device and a * conversation nobody can read back. Each closure is recorded against a basis — a snapshot of the very * thing it was about — so when a ninth role appears the closure lapses on its own. Nobody keeps a tick * honest by hand, and nothing silently stays settled after the ground moved. */ export declare const LEDGER_CLASSES: readonly ["brief", "roles", "jobs", "handoffs", "exceptions"]; export type LedgerClass = (typeof LEDGER_CLASSES)[number]; export interface Settlement { settled: boolean; /** who said so: the person's word, or Staves' judgment. A tick nobody gave never reads as theirs. */ by: "human" | "staves"; quote?: string; at?: string; basis?: string; } export interface LedgerItem { class: LedgerClass; state: "untouched" | "open" | "closed"; /** 0 nothing here, 1 named but with gaps the board can name, 2 nothing outstanding. Never a score. */ depth: 0 | 1 | 2; /** the gap itself, in the fewest words that are still true; absent at depth 2 */ gap?: string; by?: Settlement["by"]; quote?: string; at?: string; /** closed once, then the ground moved: the interviewer can say why it is open again */ lapsed?: boolean; /** what the board holds for this class right now, in the fewest words that are still true */ summary: string; } /** The shape of one class, as the thing a closure is a claim about. Change it and the claim lapses. */ export declare function settlementBasis(b: Board, cls: LedgerClass): string; /** * Whether a class is mostly staves' own inference rather than anything the person supplied. * * This exists to stop the board certifying itself. Staves may draft, and staves may close a class with * judgment — but not both at once. If it drafted the roles and then closed "roles", the readiness count * would report green on work nobody ever confirmed, and the number would be worth nothing. Whoever * supplied the content, only the person can close a class they did not describe. * * Absent provenance reads as the person's: everything described before provenance was recorded was. */ export declare function mostlyInferred(b: Board, cls: LedgerClass): boolean; /** The ledger as the conversation should see it: derived from the board, never a second source of truth. */ export declare function ledger(b: Board): LedgerItem[]; /** The five lines the interviewer is given, so it stops re-asking what is already answered. */ export declare function ledgerLine(b: Board): string;