/** * Freeze-time assertion grounding (#16): the LLM proposes intent-based checks, and everything frozen * is verified against the observed evidence — a hallucinated check is dropped, so replay stays * deterministic (invariant #4). */ import type { LlmClient } from "../ports.js"; import type { Assertion, Evidence } from "../types.js"; /** * Ground the frozen scenario's assertions in what actually happened, not what the LLM * guessed — it would propose `navigated` even on a SPA that never navigates, making every * replay fail. Always check requests; add `navigated` only if the run truly navigated; * keep a proposed `request-status` ONLY if a captured request actually matches it (so a * hallucinated check can't fail every replay). `expect` (LLM-judged) is frozen only when * `semantic` is set — otherwise the freeze stays deterministic (invariant #4). * `benign` is the product's noise list (mirror of `RunScenarioOptions.benign`) — a marked * endpoint's failure never disqualifies a check. */ export declare function deriveAssertions(proposed: Assertion[] | undefined, evidence: Evidence, semantic: boolean, benign?: readonly string[], /** Reports each dropped proposal with why — a drop changed what the freeze checks, so the * trace surfaces it as a `gate` event instead of silence (spec/core/trace.md). */ onDrop?: (proposed: Assertion, reason: string) => void): Assertion[]; /** * #16 — at the end of discover, ask the LLM to propose intent-grounded assertions so the freeze * carries meaningful checks beyond the default network guard ("passed but wrong"). The proposal is * grounded by `deriveAssertions`, so a hallucinated check is dropped and replay stays deterministic. */ export declare function proposeAssertions(llm: LlmClient, intent: string, evidence: Evidence, semantic: boolean): Promise;