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<string>;
/**
 * Jaccard similarity between two keyword sets.
 *
 * Retained alongside `extractKeywords` for the same reason — see that
 * function's note.
 */
export declare function jaccardSimilarity(a: Set<string>, b: Set<string>): 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