/* RFC-1027: registers remediation.catalog.generate and remediation.hint.validate commands. The generate command emits docs/remediation-catalog.generated.yaml from REMEDIATION_CATALOG. The validate command cross-references catalog keys with validator rules[] declarations. Do not implement catalog or validation logic here — see remediation-catalog-generate.ts and remediation-hint-validate.ts. RFC-1027: initial implementation. RFC-1210: closed-loop signal ingest to bounded missions (RFC-1210) RFC-1231: step 1 — rename supportsAllSites to acceptsAllFlag Mechanical sweep: the field only ever gated --all argv acceptance; fan-out follows the parsed selector. Guard renamed assertAllSitesAllowed -> assertAllFlagAccepted, message updated. 417 declaration sites + type surfaces (KernelCommandMetadata, ForgeCommandMetadata) in one atomic pass. RFC-1248: VITE-CLIENT-DEP-02 lazy-import gate + SCAN-02 validator reads-root existence check (RFC-1248) */ import type { ModuleExport } from "@warpgogol/werkstatt-shared/kernel"; export async function createRemediationModule(): Promise { const { runRemediationCatalogGenerate } = await import("./remediation-catalog-generate.ts"); const { runRemediationHintValidate } = await import("./remediation-hint-validate.ts"); const { runRemediationSignalIngest } = await import("./remediation-signal-ingest.ts"); return { name: "remediation", version: "0.1.0", declarations: [], commands: [ { name: "remediation.catalog.generate", coverage: "operator" as const, modulePath: "packages/werkstatt-engine/src/remediation/remediation.module.ts", description: "Emit docs/remediation-catalog.generated.yaml from REMEDIATION_CATALOG, " + "cross-referencing validator rules[] declarations to identify uncovered ruleIds (RFC-1027).", scope: "workspace", mutatesState: true, writes: ["docs/remediation-catalog.generated.yaml"], cacheable: false, generates: [ { path: "docs/remediation-catalog.generated.yaml", phase: "build.post", }, ], flags: {}, execute: runRemediationCatalogGenerate, }, { name: "remediation.hint.validate", modulePath: "packages/werkstatt-engine/src/remediation/remediation.module.ts", description: "Validate that all validator diagnostics include remediation hints — " + "either via REMEDIATION_CATALOG or fixHint. In --mode strict, missing hints " + "are blocking errors (REMEDIATION-01). In --mode warning (default), they are warnings (RFC-1027).", scope: "workspace", mutatesState: false, cacheable: false, contract: "remediation", rules: ["REMEDIATION-01", "REMEDIATION-02"], flags: { mode: { kind: "string", description: "Validation mode: 'warning' (default) or 'strict'.", }, }, execute: runRemediationHintValidate, }, { name: "remediation.signal.ingest", coverage: "operator" as const, modulePath: "packages/werkstatt-engine/src/remediation/remediation.module.ts", description: "Normalize and route a remediation signal (RFC-1210): --source is gated against the site's remediation.signalSources allowlist (SIG-02 blocking), unknown --class rejected (SIG-01), then dedup + daily rate cap decide between auto-mission | action-pack | suppressed-autonomy-off | deduped | rate-capped. Auto-missions open via the internal openRemediationMission step composing mission.open — there is intentionally no remediation.mission.open command. Required flags: --site, --class, --source.", scope: "workspace", acceptsAllFlag: false, mutatesState: true, generates: [], contract: "remediation-signal", rules: ["SIG-00", "SIG-01", "SIG-02", "SIG-03", "SIG-04", "SIG-05"], flags: { site: { kind: "string", required: true, description: "Sternsystem id the signal targets.", }, class: { kind: "string", required: true, description: "Remediation class key from the closed REMEDIATION_CLASSES catalog.", }, source: { kind: "string", required: true, description: "Invoker id — must be in the site's remediation.signalSources allowlist.", }, "detected-by": { kind: "string", description: "Detector kind: signoz-alert | fleet-probe | check-runner | validator | manual (default).", }, evidence: { kind: "string", description: "Evidence reference (path/url) or JSON array of references.", }, }, reads: [ "../systems-cache/{system}/system-state.yaml", "../systems-cache/{system}/operations/remediation-signals.jsonl", "missions/*/mission.yaml", ], writes: [ "../systems-cache/{system}/operations/remediation-signals.jsonl", "../systems-cache/{system}/bordbuch/events.ndjson", "missions/**", ], cacheable: false, execute: runRemediationSignalIngest, }, ], pipelines: [], }; }