/**
 * Named lifecycle bands. Shared by the annotation freshness surface
 * today and available to other temporal-lifecycle policies that opt
 * into banded classification.
 */
export type LifecycleBand = "fresh" | "aging" | "stale" | "expired";
/**
 * Multipliers of `ttlMs` that mark the upper edge of each band. The
 * default schedule:
 *
 *   • `fresh`   — `age < 1.0 × ttl`
 *   • `aging`   — `age < 1.5 × ttl`
 *   • `stale`   — `age < 3.0 × ttl`
 *   • `expired` — `age ≥ 3.0 × ttl`
 *
 * Override individual thresholds; missing entries fall back to the
 * defaults. Setting a smaller value than the previous band's
 * threshold is allowed but produces an unreachable band.
 */
export interface LifecycleBandThresholds {
    /** Upper edge of the `fresh` band, as a multiple of `ttlMs`. Default `1.0`. */
    fresh?: number;
    /** Upper edge of the `aging` band, as a multiple of `ttlMs`. Default `1.5`. */
    aging?: number;
    /** Upper edge of the `stale` band, as a multiple of `ttlMs`. Default `3.0`. */
    stale?: number;
}
export declare const DEFAULT_LIFECYCLE_THRESHOLDS: Required<LifecycleBandThresholds>;
/**
 * Classify an age into a named band given a TTL.
 *
 * Pure function. Edge cases:
 *
 * - **Negative age** (future-dated items): classifies as `fresh`.
 * - **`NaN` age** (parse failure or `now - undefined`): classifies as
 *   `fresh` — the safer default, since `expired` is filtered by the
 *   visual treatment.
 * - **`+Infinity` age**: classifies as `expired`. Monotonic in age —
 *   "older than any finite TTL multiple" should be the oldest band.
 * - **Non-finite / non-positive TTL**: classifies as `fresh`, since
 *   there's no meaningful interval to age against. Callers that need
 *   stricter handling should gate `ttlMs` before calling.
 */
export declare function bandFromAge(ageMs: number, ttlMs: number, thresholds?: LifecycleBandThresholds): LifecycleBand;
