/** * Content Classifier — rule-routing decision tree for ADF migration. * * Classifies markdown elements into ADF sections (CONSTRAINTS, CONTEXT, ADVISORY) * with STAY/MIGRATE routing decisions. Uses deterministic heuristics, no LLM calls. */ import type { MarkdownSection, MarkdownElement } from './markdown-parser'; import type { AdfDocument } from './types'; export type RouteDecision = 'STAY' | 'MIGRATE'; export type AdfTargetSection = 'CONSTRAINTS' | 'CONTEXT' | 'ADVISORY'; export type WeightTag = 'load-bearing' | 'advisory'; /** Module path → lowercase trigger keywords for content-based routing. */ export type TriggerMap = Record; /** Optional overrides for classification heuristics. */ export interface ClassifierConfig { stayPatterns?: RegExp[]; headingRoutes?: Array<{ pattern: RegExp; module: string; }>; } export interface RoutingTrace { /** What headingToModule() returned before content-based fallback. */ headingModule: string; /** Set when a phrase-level QA override fired instead of keyword scoring. */ phraseOverride?: string; /** Per-module keyword match score from the triggerMap scoring pass. */ candidateScores: Record; } export interface ClassificationResult { decision: RouteDecision; targetSection: AdfTargetSection; targetModule: string; weight: WeightTag; reason: string; /** Populated when content-based routing ran. Opt-in observability for #46. */ routingTrace?: RoutingTrace; } export interface MigrationItem { element: MarkdownElement; sourceHeading: string; classification: ClassificationResult; } export interface MigrationPlan { items: MigrationItem[]; stayItems: MigrationItem[]; migrateItems: MigrationItem[]; targetModules: string[]; summary: { constraints: number; context: number; advisory: number; stay: number; total: number; }; } /** * Classify a single markdown element into an ADF routing decision. */ export declare function classifyElement(element: MarkdownElement, heading: string, triggerMap?: TriggerMap, config?: ClassifierConfig): ClassificationResult; /** * Check if two text items are duplicates using Jaccard similarity. * Threshold: 0.8 (80% word overlap = duplicate). */ export declare function isDuplicateItem(existing: string, candidate: string): boolean; /** * Build a complete migration plan from parsed markdown sections. * * If existingAdf is provided, uses Jaccard dedup to skip items already present. */ export declare function buildMigrationPlan(sections: MarkdownSection[], existingAdf?: AdfDocument, triggerMap?: TriggerMap, config?: ClassifierConfig): MigrationPlan; //# sourceMappingURL=content-classifier.d.ts.map