/**
 * The two confined project reads every deterministic probe is built on.
 *
 * Both preserve a distinction the checks above them depend on and cannot
 * recover once lost: a settings file that is MISSING is a different finding
 * from one that is present and unreadable, and a JSON file that will not parse
 * is a different finding from one that is not there. Collapsing either into
 * "absent" is how a health run reports a clean project that it simply could
 * not read.
 * @module health/deterministic-inputs
 */
import type { SyncReadDependencies } from "../sync/config-sync.js";
import type { HealthConfigState } from "./project-probes.js";
import type { RulesetReader } from "./ruleset-inspection.js";
/**
 * Read config while preserving missing vs malformed state.
 * @param projectRoot - Canonical host project root
 * @returns Whether the settings file is present, readable, and its contents
 */
export declare function loadConfigState(projectRoot: string): Promise<HealthConfigState>;
/**
 * Confined JSON/path readers for the shared sync planner.
 * @param projectRoot - Canonical host project root
 * @returns Readers that never escape the project root
 */
export declare function safeSyncReads(projectRoot: string): SyncReadDependencies;
/**
 * Share one ruleset read between the probes that both need it.
 *
 * Two checks now compare against the same live rulesets — one against Lisa's
 * template, one against the project's declarations — and reading them twice
 * would double a bounded N+1 of GitHub calls inside one shared deadline for an
 * answer that cannot differ between them. A rejection is shared too, on
 * purpose: both probes should report the same source as unread rather than
 * disagree about whether it could be reached.
 * @param reader - The underlying reader
 * @returns A reader that calls through at most once per repository
 */
export declare function shareRulesetReader(reader: RulesetReader): RulesetReader;
//# sourceMappingURL=deterministic-inputs.d.ts.map