/**
 * What a project's milestone dates prove about its schedule — and nothing more.
 *
 * The tempting version of this file computes "on track / at risk". It cannot be
 * written honestly against this data. Probed live against a real workspace:
 *
 *   health: null            projectUpdates: []
 *   startDate: null         targetDate: null
 *   scopeHistory: []        completedScopeHistory: []
 *
 * "Behind schedule" needs either start+target dates to interpolate an expected
 * progress line, or a history series to extrapolate a finish date. Both are
 * absent, so any on-track/at-risk chip would be invented — and a confident wrong
 * answer on a status card is worse than a blank one, because it is unfalsifiable
 * from the card itself.
 *
 * So every verdict here is arithmetic on a stored date or a count:
 *
 *   overdue        a milestone's targetDate has passed and it is unfinished
 *   due-soon       the next one lands within DUE_SOON_DAYS
 *   untracked      milestones exist but nothing is filed against any of them,
 *                  so their progress is not measurable
 *   scheduled      dated milestones ahead, none due soon, work is filed
 *   no-dates       milestones exist, none carries a date
 *   none           the project declares no milestones
 *
 * `declared` relays Linear's OWN health when a human has posted one. It is
 * passed through and attributed, never synthesized — if the user starts posting
 * project updates, their answer wins over anything derived here.
 */
import type { LinearMilestone } from './linear-project-counts.js';
/** How far ahead counts as "due soon" — one sprint's notice. */
export declare const DUE_SOON_DAYS = 14;
/** A verdict about the schedule, as a tagged union so `--json` stays stable. */
export type ProjectVerdict = {
    kind: 'declared';
    health: string;
} | {
    kind: 'overdue';
    milestone: string;
    days: number;
} | {
    kind: 'due-soon';
    milestone: string;
    days: number;
} | {
    kind: 'untracked';
    milestones: number;
} | {
    kind: 'scheduled';
    milestone: string;
    days: number;
} | {
    kind: 'no-dates';
    milestones: number;
} | {
    kind: 'none';
};
/** Whole days from `nowMs` to a `YYYY-MM-DD` date, compared at LOCAL midnight. */
export declare function daysUntil(targetDate: string, nowMs: number): number | undefined;
/**
 * Decide what the dates prove. Precedence is time-sensitivity first:
 *
 *   declared > overdue > due-soon > untracked > no-dates > scheduled
 *
 * An overdue milestone outranks an approaching one, and both outrank the
 * observation that nothing is filed — a deadline moves, that observation does
 * not. `declared` overrides everything, because a human said it.
 */
export declare function scheduleVerdict(milestones: LinearMilestone[], nowMs: number, declaredHealth?: string | null): ProjectVerdict;
/** One line for the card. Returns undefined for `none` — an empty row says nothing. */
export declare function formatVerdict(v: ProjectVerdict): {
    text: string;
    warn: boolean;
} | undefined;
