#!/usr/bin/env node /** * Bench harness — runs analyzers over seeded corpus fixtures and computes * precision, recall, and F1 against labeled ground truth. * * Spec 11 R2 * * Usage: * pnpm bench # Run all corpus analyzers * pnpm bench --sweep # Sweep mode: vary thresholds and report curves * pnpm bench --json # Output machine-readable JSON only */ import type { Violation } from '../types.js'; interface ExpectedEntry { file: string; rule: string; symbol?: string; severity?: string; reason?: string; } interface MatchResult { expected: ExpectedEntry; matched: boolean; actualViolation?: Violation; } export interface RuleMetrics { rule: string; truePositives: number; falsePositives: number; falseNegatives: number; precision: number; recall: number; f1: number; knownMisses: number; recoveredMisses: number; trueRecall: number; trueF1: number; } export interface AnalyzerMetrics { truePositives: number; falsePositives: number; falseNegatives: number; precision: number; /** Effective recall — computed against reconciled ground truth (excl. known misses). Gates regressions. */ recall: number; /** Effective F1 — from precision + effective recall. */ f1: number; /** True recall — computed against full ground truth (incl. known misses). Measures distance from done. */ trueRecall: number; /** True F1 — from precision + true recall. */ trueF1: number; /** Count of ground-truth violations that are known misses (not detected by the analyzer). */ knownMisses: number; /** Count of known-miss entries that WERE detected — a limitation was fixed. */ recoveredMisses: number; /** Per-rule metrics — precision/recall/F1 for each rule within the analyzer. */ ruleMetrics: RuleMetrics[]; nearMissResults: Array<{ file: string; violations: number; passed: boolean; }>; details: MatchResult[]; knownMissDetails: MatchResult[]; warnings: string[]; /** Count of violations that violate the hook contract (empty file path or line 0). Must always be zero. */ hookContractViolations: number; } export interface BenchReport { timestamp: string; summary: { totalAnalyzers: number; passed: number; failed: number; totalKnownMisses: number; microAvgPrecision: number; microAvgRecall: number; microAvgF1: number; microAvgTrueRecall: number; microAvgTrueF1: number; }; analyzers: Record; baselineComparison?: { regressions: string[]; improvements: string[]; }; } /** * Run the full bench harness and return the report. * Exported so tests can assert bench results programmatically. */ export declare function runBench(): Promise; export {}; //# sourceMappingURL=runBench.d.ts.map