/**
 * sanity/release-coverage.ts
 *
 * Pure partitioning of a content release into the populations that matter for
 * observability — kept free of any Sanity-client import so it can be unit
 * tested in isolation (mirrors the perspective-ref pure-core pattern).
 *
 * The perspective diff in {@link SanityDocFetcher.identifyAffectedDocs} only
 * compares the canonical docs reachable from in-scope tasks, so its
 * `ReleaseImpact` cannot, by construction, see a release edit to a doc no task
 * references. These helpers take the wider `sanity::partOfRelease` footprint
 * and report what the canonical-scoped diff leaves invisible.
 */
import type { ReleaseImpact } from "../_vendor/ailf-core/index.d.ts";
/**
 * The three populations a content release splits the documentation world into,
 * relative to the in-scope task corpus's canonical documents.
 */
export interface ReleaseCoverage {
    /** Release-edited docs that ARE canonical docs of an in-scope task — evaluated. */
    coveredAffected: string[];
    /** Release-edited docs NOT referenced by any in-scope task — modified but unmeasured. */
    uncovered: string[];
    /** In-scope canonical docs the release left untouched. */
    unaffected: string[];
}
/**
 * Slugs in the full release footprint (`sanity::partOfRelease`) that are not
 * canonical docs of any in-scope task. Sorted and deduped for stable output.
 *
 * Note: the footprint is the set of articles with a version in the release —
 * i.e. added/modified docs. Docs *removed* by the release outside the
 * canonical set are not observable through the release perspective (they are
 * absent from it), so they are out of scope for this signal; the apply-loop
 * concern is unmeasured *edits*, which this captures.
 */
export declare function computeUncoveredDocs(releaseFootprintSlugs: Iterable<string>, canonicalSlugs: Iterable<string>): string[];
/**
 * Partition a release into the three observability populations.
 *
 * `coveredAffected` and `unaffected` are read straight from the
 * canonical-scoped {@link ReleaseImpact} (added+modified, and unchanged);
 * `uncovered` is the set difference of the full footprint against the
 * canonical set.
 */
export declare function computeReleaseCoverage(releaseImpact: Pick<ReleaseImpact, "added" | "modified" | "unchanged">, releaseFootprintSlugs: Iterable<string>, canonicalSlugs: Iterable<string>): ReleaseCoverage;
