/** * Mechanical-facts rendering for the maintenance subagent (011 §6). * * One canonical block: opening tag with version + joint signature, one * `[FACT]`/`[UNKNOWN]` line per signal, closing tag. The template side * renders its own `` header with the same signature, so * the model can compare the two heads (011 mismatch protocol). Every rendered * field (value/detail/threshold/skill name) passes through the optional * redactor and the delimiter/newline escaping before it leaves the session. */ import { type DriftReport } from '@lmzhen/dsh-evolution-core'; /** G3/3.3: what one footprint line reports about one registered store. */ export interface StoreFootprint { readonly id: string; readonly unit: string; /** The reading, when one exists; undefined renders as UNKNOWN instead of an invented zero. */ readonly used?: number | undefined; readonly bound: string; readonly lastSweep?: string | undefined; readonly removed?: number | undefined; /** Set for a `manual` store that did not run: stated, never implied. */ readonly skipped?: string | undefined; } export interface RenderFactsOptions { /** signals_version — changes whenever the signal set/thresholds change. */ signalsVersion: string; /** Joint signature: sha256(template-text + signal-definitions) — shared with MAINTAIN_PROMPT head. */ signature: string; /** G3/3.3: one reading per registered bounded store (STORE_LEDGER). Absent ⇒ no footprint lines at * all, so an older caller keeps the exact block it had; a store with no reading renders as UNKNOWN * and a manual-trigger store that did not run says so — "not done" must never read as "nothing to do". */ footprint?: readonly StoreFootprint[] | undefined; /** Optional redactor; defaults to core `redactSecrets`. */ redact?: ((text: string) => string) | undefined; } export declare function renderFacts(report: DriftReport, options: RenderFactsOptions): string; //# sourceMappingURL=render-facts.d.ts.map