/**
 * Deterministic behavioral metrics over OTLP spans — pure arithmetic, no LLM.
 *
 * These are the model-independent multiplier: the four trace-quality signals a
 * tolerant analyzer (e.g. HALO) re-derives per run inside the model — token
 * growth, output decay, tool monoculture, missing self-verification — computed
 * here once, in TypeScript, with zero model judgment. A finding that falls out
 * of arithmetic is trivially model-agnostic and cannot hallucinate the trend.
 *
 * General, not trace-specific: the detectors key off token trajectories and
 * tool usage present in any agentic OTLP trace, not any one benchmark.
 */
import type { TraceAnalystSpan } from './types';
export type SuboptimalCode = 'monotonic-input-growth' | 'output-length-decay' | 'single-tool-dependency' | 'no-self-verification';
export interface SuboptimalSignal {
    code: SuboptimalCode;
    severity: 'high' | 'medium' | 'low';
    /** Human-readable claim, with the backing numbers inlined. */
    detail: string;
    /** The exact figures the detector fired on — auditable, no model in the loop. */
    evidence: Record<string, number | string | boolean>;
}
export interface BehavioralMetrics {
    llmCallCount: number;
    inputTokenTrajectory: number[];
    outputTokenTrajectory: number[];
    toolHistogram: Record<string, number>;
    totalToolCalls: number;
    distinctTools: number;
    /** distinct/total tool calls; 1.0 when there are no tool calls. */
    toolDiversityRatio: number;
    hasSelfVerification: boolean;
    signals: SuboptimalSignal[];
}
/**
 * Reduce a span list to behavioral metrics + fired suboptimality signals.
 * Pure + deterministic: same spans → same output, on any machine, no model.
 */
export declare function computeTraceMetrics(spans: readonly TraceAnalystSpan[]): BehavioralMetrics;
//# sourceMappingURL=behavioral-metrics.d.ts.map