import type { NormalizedBotFinding } from './bot-review-parser.js'; import type { CategorizedFinding } from './triage-types.js'; /** * Extract significant words from text (strip stopwords, lowercase). * * Retained as a public helper for downstream tooling (e.g., the deferred * `--no-dedup` debug flag, ad-hoc analysis scripts) even though * `deduplicateFindings` no longer uses it after mmnto-ai/totem#1666. */ export declare function extractKeywords(text: string): Set; /** * Jaccard similarity between two keyword sets. * * Retained alongside `extractKeywords` for the same reason — see that * function's note. */ export declare function jaccardSimilarity(a: Set, b: Set): number; /** * Deduplicate bot findings using deterministic comment-id identity * (mmnto-ai/totem#1666; strategy upstream-feedback item 024). * * Two findings with different `rootCommentId` are ALWAYS distinct, even * when their bodies are byte-identical and they anchor at the same * `(file, line)`. This forecloses the LC#80 R3 failure mode where six * GCA findings on `compiled-rules.json:598` (each anchored at the rule- * section start line) collapsed into one entry under the prior * proximity + Jaccard fuzzy-merge semantics. * * Cross-bot independence is now a feature, not a bug: when CR and GCA * independently flag the same `(file, line)`, both findings surface so * the consumer can read the cross-bot agreement as elevated-confidence * signal (per the strategy bot-nuance pattern). Today's previous * cross-bot merge silently masked exactly that signal. * * Synthesized review-body findings (`file === '(review body)'`, no * `rootCommentId`) fall back to a `(file, body)` Map key. Body-hash * collisions are negligible at this scale: the input space is per- * review-body line items only, and identical-body findings on that * pseudo-path are themselves duplicates. * * The `mergedWith` field on the output is left undefined under strict- * by-id semantics. Keeping the field on the schema (rather than * removing it) avoids forcing downstream display consumers into a * coordinated update; readers naturally skip the empty/undefined * surface. */ export declare function deduplicateFindings(findings: NormalizedBotFinding[]): CategorizedFinding[]; //# sourceMappingURL=triage-dedup.d.ts.map