/** * Manifest stability — stop real findings silently vanishing between reruns. * * Intent extraction is LLM-driven and non-deterministic: three same-day * islandlink runs (2026-07-20/21) extracted 18 → 17 → 16 flows, and the one * real bug (run A's SetupIntent-retrieval 500) was absent from run C's claim * set with no trace. Two mechanisms fix this: * * 1. Manifest reuse: on an unchanged repo (content fingerprint match) the * prior confirmed manifest is reused, making the claim set deterministic * across reruns. `--refresh-manifest` forces re-extraction. * 2. Claims diff: every run compares its claim set against the previous * run's and reports "dropped since last run" — so when the manifest DOES * legitimately change, a vanished claim is visible instead of silent. * * Capsule: assay-claim-set-stability. */ import type { IntentManifest } from './intent-types.js'; /** * Content hash over the indexed file set: sorted relative paths, each with a * sha256 of its bytes. Any file added, removed, or edited changes the digest. */ export declare function computeCodebaseFingerprint(rootPath: string, fileTree: string[]): Promise; export interface ManifestReuseDecision { reuse: boolean; reason: string; } /** * Reuse the saved manifest only when it demonstrably matches the current * codebase. Reuse must never mask real drift: a changed repo, a manifest * saved before fingerprinting existed, or an explicit refresh request all * force re-extraction. */ export declare function decideManifestReuse(saved: IntentManifest | null, currentFingerprint: string, refreshRequested: boolean): ManifestReuseDecision; export interface PriorClaimRecord { claim: string; verdict: string; flow: string; } export interface ClaimsDiff { priorTotal: number; currentTotal: number; dropped: PriorClaimRecord[]; added: string[]; } /** * Text-based diff: claim IDs are flow-index- and evidence-dependent, so * identity across runs is the claim text. Exact after whitespace * normalization — an LLM rephrasing counts as dropped+added, which the * report shows side by side. */ export declare function diffClaimSets(prior: PriorClaimRecord[], currentClaimTexts: string[]): ClaimsDiff; /** * Pull prior claim records out of a previous run's assessment-summary.json. * Defensive: any shape mismatch yields an empty list (first run, corrupt * file, older format). */ export declare function extractPriorClaims(summary: unknown): PriorClaimRecord[]; /** * Markdown section appended to bug-report.md. Dropped claims are the alarm: * a claim that carried a FAIL/PARTIAL last run and did not regenerate is a * finding that would otherwise vanish without trace. */ export declare function renderClaimsDiffSection(diff: ClaimsDiff, manifestReused: boolean): string;