import type { RunIndexEntry } from "./run-index.js"; /** Additive accounting for retained attempts. Null means no estimate, never an invented zero. */ export interface StudyCosts { estimatedTotalUsd: number | null; runEstimatedUsd: number | null; analysisEstimatedUsd: number | null; /** Runs with missing or partial participant/desktop estimates. */ incompleteRunEstimates: number; analysisAttempts: number; analysisDispatchedAttempts: number; analysisNotDispatchedAttempts: number; /** Dispatched or potentially dispatched attempts without a complete price. */ analysisUnpricedAttempts: number; /** A dispatch marker/claim survives, but there is no usable final accounting. */ analysisUnresolvedAttempts: number; /** No retained history, legacy report-only usage, or unreadable/conflicting accounting. */ analysisHistoryUncertainRuns: number; } export interface StudyCostRow { runId: string; costs: StudyCosts; warnings: string[]; } export declare function emptyStudyCosts(): StudyCosts; export declare function addStudyCosts(into: StudyCosts, next: StudyCosts): void; /** A read-only, bounded accounting pass. Never validates findings, dispatches, repairs or writes. */ export declare function readStudyCosts(cwd: string, entry: RunIndexEntry): Promise;