/** * What the runtime refuses to install. * * `senpi validate` reports these same problems, but reporting is advisory: nothing stops an * operator installing a recipe validate would refuse. This closes that from the other side — at * the one boundary where refusing is free of consequence. * * ## Why install and not boot * * Refusing an install affects only the thing being installed: the gateway answers an error and * everything already running is untouched. The boot loop is not like that — it starts runtimes in * a single `try` whose `catch` stops every runtime already started, so a throw there takes the box * down. A boot-time refusal would convert "one bad recipe trades" into "one bad recipe stops every * other strategy", which is strictly worse than the problem. Boot-side enforcement waits for the * per-entry degrade the supervised-scanner mount already uses. * * ## What it refuses, and what it deliberately does not * * Only conditions that make the recipe **inert or unsafe on every tick**, never a matter of taste: * an entry action with no reachable margin source declines every signal it ever sees; one with no * guardrails trades with no daily-loss or drawdown ceiling; a declared scanner file that does not * exist can never start. Warnings stay warnings — this gate is not `--strict`, because an install * refusal an operator disagrees with is how a safety check gets routed around. * * Measured before it was enforced: none of the 124 deployed instances trips any of these. */ import type { Finding } from "./types.js"; export interface InstallGateResult { ok: boolean; /** The findings that blocked, in report order. Empty when `ok`. */ blocking: Finding[]; /** Ready to hand to the gateway's error responder. Present exactly when blocked. */ message?: string; } /** * Decide whether a parsed recipe may be installed. * * Takes findings rather than a config so the caller owns how they were produced, and so this stays * a pure decision over data — the same findings the CLI would print. */ export declare function checkInstallGate(findings: Finding[]): InstallGateResult; /** The codes this gate blocks on. Exported so a test can assert the list, not infer it. */ export declare const INSTALL_BLOCKING_CODES: readonly string[]; //# sourceMappingURL=install-gate.d.ts.map