/** * 项目探针规则 — 把"项目独有的硬规则"从 L2(注入) 提升为 L0/L1(确定性探针)。 * * 职责边界: * - 负责:ProbeRule/ProbeHit/ProbeLoadResult 类型 + loadProjectProbeRules(拒绝式加载) * - 不负责:探针执行(probe_executor.ts)、gate 接入(executors_probe.ts / gate_engine.buildProbeGate) * * 被谁调用:gate_engine.buildProbeGate、doctor 服务(checkProbes) * 调用谁:node:fs、node:path、gray-matter * * 数据流:knowledgeDir(.soloforge/knowledge/)→ 逐 .md 文件读 frontmatter → 校验 → ProbeRule[] + ProbeLoadResult(errors) * 持久化:无 * * 纯净最终态原则: * - 拒绝式加载:无 verification_layer / layer 非法 / probe 与 layer 不配对 / probe_path 越界或缺失 → 记入 errors(非 warnings),绝不默认 L2。 * - status 门:只有显式 status: active 且无 superseded_by 的条目执法;缺 status/非法 status 记入 errors,显式非 active 静默退出(生命周期,非错误)。 * - builtin 自验:带 selftest_sample 的规则加载期对样本跑 pattern(与执行器同款 gm 语义),编译失败或命中 0 处拒载——正则写错的静默假执法在加载期暴露。 * - 路径穿越防护:probe_path 解析后必须落在 knowledgeDir 内。 * - L2/L3 规则不在此加载,分别由语义审查和人工确认处理;携带 probe 字段视为配置错误。 */ import { type KnowledgeProbeKind } from "../../shared/contracts/knowledge_verification_policy.js"; /** L0/L1 探针类型 */ export type ProbeKind = KnowledgeProbeKind; /** 解析后的项目探针规则(仅 L0/L1) */ export interface ProbeRule { /** 规则 ID(来自 frontmatter name,PROJ- 前缀,与内置 by-id 去重) */ id: string; /** 触发关键词(L0/L1 探针按 domain 跑,triggers 仅供参考/诊断) */ triggers: string[]; /** 严重程度:hard_gate=阻断 / advisory=告警 */ severity: "hard_gate" | "advisory"; description: string; message: string; /** 探针类型 */ probe_kind: ProbeKind; /** 探针载荷:builtin=正则源 / semgrep·rego·property=探针文件绝对路径 */ probe_payload: string; verification_layer: "L0" | "L1"; /** 适用能力域(buildProbeGate 按 stage 过滤用) */ domain: string[]; /** 源文件(诊断/定位) */ source_file: string; } /** 探针命中 */ export interface ProbeHit { rule_id: string; file: string; line?: number; message: string; severity: "hard_gate" | "advisory"; } /** 加载结果:rules 仅含合法 L0/L1;errors 含所有配置错误(不静默丢弃) */ export interface ProbeLoadResult { rules: ProbeRule[]; errors: string[]; } /** * 从 .soloforge/knowledge/ 加载所有 L0/L1 项目探针规则。 * L2/L3 规则不返回(走注入/确认);任何配置错误记入 errors(供 doctor/gate 暴露)。 * * @param projectRoot 项目根目录 */ export declare function loadProjectProbeRules(projectRoot: string): ProbeLoadResult;