import type { Artifact, Board, Id, Job, Question, Track } from "./model.js"; export interface Handoff { from: Id; to: Id; artifact?: Id; /** an exit or loop declared on the source job */ kind: "artifact" | "exit" | "loop"; condition?: string; } /** Position of every job: explicit order, else description order; composites at their earliest task, tasks at their parent. */ export declare function orderMap(b: Board): Map; export declare function handoffs(b: Board): Handoff[]; export declare function columns(b: Board): Map; export interface CutRegion { id: string; /** human touchpoints this region starts after */ after: Id[]; /** where it hands off to */ ends: Id[]; inside: Id[]; tracks: Id[]; } /** * Three rules: * 1. cut at every human or outside touchpoint; * 2. cut at every machinery node a person hands into; * 3. cut at every join — a node fed from more than one region. */ export declare function cut(b: Board): { regions: CutRegion[]; shared: Id[]; }; export declare function missingAccount(j: Job): string[]; export declare function accountQuestions(j: Job): string[]; export type Severity = "error" | "warn" | "info"; export interface Finding { id: string; rule: "dangling-exit" | "loop-no-limit" | "parked-no-limit" | "watch-only" | "unread-artifact" | "shared-machinery" | "two-entrances" | "gate-no-owner" | "lever-no-door" | "orphan" | "account-missing" | "orphan-input" | "over-capacity" | "name-too-long" | "composite-unnamed" | "gate-swallowed" | "tool-unreachable" | "budget" | "machinery-at-top" | "no-tasks" | "tool-coverage" | "no-checks" | "handover" | "jargon"; severity: Severity; about: Id; message: string; } export declare function lint(b: Board): Finding[]; export declare function toolQuestions(b: Board): Question[]; /** Ops that turn the cut into composites: one draft job per region, its inside jobs re-parented. */ export declare function applyCut(b: Board): { ops: import("./ops.js").Op[]; questions: Question[]; }; /** Estimated subtotal only; missing/invalid inputs are explicitly retained. */ export declare function effort(b: Board, jobs: Job[]): { hours: number; unknownJobs: Id[]; }; /** A known subtotal can establish overload, but cannot establish spare capacity. */ export declare function loads(b: Board): { track: Id; hours: number; unknownJobs: Id[]; capacity?: number; over: boolean; }[]; export declare function trackOf(b: Board, id: Id): Track | undefined; /** What the board looks like from one role's chair: what I do, wait on, decide, hand off, and what is unresolved around me. */ export declare function hatBrief(b: Board, trackId: Id): string; export interface Scorecard { humanHours: number; agentHours: number; humanJobs: number; agentJobs: number; humanHoursUnknown: Id[]; agentHoursUnknown: Id[]; jobs: number; tasks: number; humanDecisions: number; ruleDecisions: number; unownedRules: number; unboundedWaits: number; danglingExits: number; unreachableTools: number; uncheckedOutputs: number; unconfirmed: number; } export declare function scorecard(b: Board): Scorecard; export interface Run { parent?: Id; track: Id; tasks: Id[]; blockers: string[]; } export declare function collectableRuns(b: Board): Run[]; export interface SemanticChange { job: Job; fields: { field: string; before: unknown; after: unknown; }[]; } export interface Diff { tracksChanged: { before: Track; after: Track | null; }[]; artifactsChanged: { before: Artifact | null; after: Artifact | null; }[]; contextChanged: { field: string; before: unknown; after: unknown; }[]; changed: SemanticChange[]; added: Job[]; removed: Job[]; moved: { job: Job; from: Id; to: Id; }[]; renamed: { job: Job; from: string; }[]; reparented: { job: Job; from?: Id; to?: Id; }[]; tracksAdded: Track[]; } export declare function diff(base: Board, scen: Board): Diff; export declare function focusBoard(b: Board, jobId: Id): Board; export declare function review(b: Board): string; export declare function issues(b: Board): string; /** The review as data, for the page. */ export declare function reviewData(b: Board): { title: string; goal: string | undefined; context: { langfuse?: import("./model.js").LangfuseConnection; agentProgress?: { state: "working" | "partial" | "ready"; summary: string; updatedAt: string; }; purpose?: string; improvement?: string; success?: string; outside?: string; forWhom?: "outside" | "inside" | "me"; shape?: "flow" | "project" | "service"; stakes?: string[]; mustNot?: string; scale?: string; where?: "code" | "people" | "drawn"; notes?: string; words?: string[]; stance?: "as-is" | "to-be"; } | undefined; implementation: { job: string; state: "unknown" | "planned" | "in-progress" | "implemented"; note: string | undefined; }[]; summary: string; facts: { icon: string; value: string; label: string; }[]; sections: { key: string; icon: string; title: string; why: string; items: { job: string; name: string; text: string; severity: Severity; }[]; }[]; first: { job: string; name: string; text: string; }[]; runs: { tasks: string[]; blockers: string[]; }[]; reflections: import("./reflect.js").Reflection[]; };