/** * SeoCitationGate — the deterministic, offline, pre-hub citation gate * (spec-20260715-ultimate-seo-suite, Sprint 10; ADR-3, * arch-20260715-ultimate-seo-agents-skills-architecture.md:279-295). * * Pure and total: no LLM, no egress, no filesystem, no clock. Imports * nothing beyond `./types.js`. Partitions findings by whether their * `citationUrl` is a well-formed primary-source URL — uncited findings are * dropped and NEVER reach the hub (Sprint 11) or a human. * * Naming note (see the sprint briefing §0): the contract (sc-10-3) spells * the method `filter`; the architecture and generatorNotes call it `apply`. * Both are provided — `filter` is an alias of the same implementation. */ import type { SeoFinding } from "./types.js"; /** Mirrors `SeoConfigSchema.blockThreshold` (config/schema.ts:697). */ export type SeoBlockThreshold = "never" | "any-uncited" | "critical-uncited"; export type CitationGateResult = { /** Findings with a well-formed primary-source citationUrl — the ONLY findings emitted downstream. */ cited: SeoFinding[]; /** Findings with an empty/malformed citationUrl — never reach the hub. */ dropped: SeoFinding[]; /** Fail-closed exit-2 signal, derived from `dropped` per `threshold`. */ blocked: boolean; }; export declare class SeoCitationGate { /** * Partitions `findings` into `cited`/`dropped` by citationUrl * well-formedness, then derives `blocked` from `threshold`. Pure and * total: identical input always yields identical output. */ apply(findings: SeoFinding[], threshold: SeoBlockThreshold): CitationGateResult; /** Alias of `apply` — satisfies the contract's literal `.filter(...)` wording (sc-10-3). */ filter: (findings: SeoFinding[], threshold: SeoBlockThreshold) => CitationGateResult; } //# sourceMappingURL=citation-gate.d.ts.map