/**
 * Jank Decision Tree builder (Spark Plan 10)
 *
 * Walks each candidate frame through a deterministic decision tree
 * anchored on FrameTimeline `jank_type` (Spark #16 ground truth) and
 * produces a `JankDecisionTreeContract`. Routing is fully driven by
 * structured inputs — no LLM prompting required. The agent is then free
 * to layer narrative on top of the routing path, but cannot conflate
 * AppDeadline / SurfaceFlinger / DisplayHAL conclusions with other
 * jank_type values.
 *
 * The function takes a JankFrameInput[] which the caller derives from
 * actual_frame_timeline_slice + thread_state aggregations (Plan 11
 * dependency).
 */
import { type FrameTimelineJankType, type JankDecisionTreeContract } from '../types/sparkContracts';
export interface JankFrameInput {
    frameId: number | string;
    startNs: number;
    endNs: number;
    jankType: FrameTimelineJankType | null;
    /** Time the UI thread spent runnable but not running, in ns. */
    uiRunnableNs?: number;
    /** Time blocked on lock contention. */
    lockBlockedNs?: number;
    /** Time blocked on IO. */
    ioBlockedNs?: number;
    /** Time blocked on binder. */
    binderBlockedNs?: number;
    /** Optional skill ids that contributed evidence. */
    evidenceSkills?: string[];
}
/**
 * Build a JankDecisionTreeContract from a list of frame inputs.
 * Frames missing FrameTimeline jank_type land in `unclassifiedFrames`
 * rather than being routed to a fabricated branch (ground-truth gate).
 */
export declare function buildJankDecisionTree(frames: JankFrameInput[]): JankDecisionTreeContract;
//# sourceMappingURL=jankDecisionTree.d.ts.map