import { wordJaccard } from "audit-tools/shared"; import type { CrossLensDedupeResult } from "audit-tools/shared"; import type { Finding, RemediationBlock } from "../state/types.js"; export { wordJaccard }; export type CrossLensDedupResult = CrossLensDedupeResult; /** * Remediate's DRAW of the shared cross-lens dedup core (`crossLensDedupe`): the * auto-apply block-machine policy — a HARD category gate (never collapse two * different-category fixes, OBL-C003-DEDUP), the exact-identity short-circuit * (drift-plan R2), CLONE survivors so the caller's Finding objects are never * mutated (INV-remediate-state-05), no grounding merge / no file sort, break on an * absorbed i-slot, and a structured merge log. The returned `mergeMap` feeds * `fixupBlocksAfterDedup`. */ export declare function deduplicateCrossLensFindings(findings: Finding[]): CrossLensDedupResult; /** * Rewrite absorbed finding ids to their dedupe survivor AND enforce single-block * ownership: after fixup, every finding id appears in exactly ONE block's items. * * Rewriting alone leaves a survivor absorbed from another lens's block in BOTH * blocks (its own, plus the absorbed finding's), which made block ownership * ill-defined — dispatch scoping and the coverage ledger each saw the finding * twice. Ownership is first-wins in block order (the same pinned semantic as * `blockIdsByFinding`), later occurrences are dropped, and a block whose items * all merged away is dropped whole — an empty block has nothing to dispatch and * would only distort scheduling. */ export declare function fixupBlocksAfterDedup(blocks: RemediationBlock[], mergeMap: Map): RemediationBlock[]; //# sourceMappingURL=crossLensDedup.d.ts.map