soloforge 1.2.19 → 1.2.20

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (102) hide show
  1. package/dist/adapters/claude_code/tools.d.ts.map +1 -1
  2. package/dist/adapters/claude_code/tools.js +159 -1
  3. package/dist/adapters/claude_code/tools.js.map +1 -1
  4. package/dist/adapters/trae/trae_config.d.ts +1 -1
  5. package/dist/adapters/trae/trae_config.d.ts.map +1 -1
  6. package/dist/adapters/trae/trae_config.js +1 -1
  7. package/dist/adapters/trae/trae_config.js.map +1 -1
  8. package/dist/engine/audit_pool.d.ts.map +1 -1
  9. package/dist/engine/audit_pool.js +1 -0
  10. package/dist/engine/audit_pool.js.map +1 -1
  11. package/dist/engine/contract_registry.d.ts +113 -0
  12. package/dist/engine/contract_registry.d.ts.map +1 -0
  13. package/dist/engine/contract_registry.js +1159 -0
  14. package/dist/engine/contract_registry.js.map +1 -0
  15. package/dist/engine/contract_state_store.d.ts +67 -0
  16. package/dist/engine/contract_state_store.d.ts.map +1 -0
  17. package/dist/engine/contract_state_store.js +167 -0
  18. package/dist/engine/contract_state_store.js.map +1 -0
  19. package/dist/engine/debugger.d.ts.map +1 -1
  20. package/dist/engine/debugger.js +30 -1
  21. package/dist/engine/debugger.js.map +1 -1
  22. package/dist/engine/degradation.d.ts +58 -0
  23. package/dist/engine/degradation.d.ts.map +1 -0
  24. package/dist/engine/degradation.js +74 -0
  25. package/dist/engine/degradation.js.map +1 -0
  26. package/dist/engine/delivery_readiness.d.ts +66 -0
  27. package/dist/engine/delivery_readiness.d.ts.map +1 -0
  28. package/dist/engine/delivery_readiness.js +176 -0
  29. package/dist/engine/delivery_readiness.js.map +1 -0
  30. package/dist/engine/deprecated_contract.d.ts +21 -0
  31. package/dist/engine/deprecated_contract.d.ts.map +1 -0
  32. package/dist/engine/deprecated_contract.js +14 -0
  33. package/dist/engine/deprecated_contract.js.map +1 -0
  34. package/dist/engine/diagnostic_registry.d.ts +64 -0
  35. package/dist/engine/diagnostic_registry.d.ts.map +1 -0
  36. package/dist/engine/diagnostic_registry.js +176 -0
  37. package/dist/engine/diagnostic_registry.js.map +1 -0
  38. package/dist/engine/enforcement_guard.d.ts +84 -0
  39. package/dist/engine/enforcement_guard.d.ts.map +1 -0
  40. package/dist/engine/enforcement_guard.js +305 -0
  41. package/dist/engine/enforcement_guard.js.map +1 -0
  42. package/dist/engine/failure_report.d.ts +74 -0
  43. package/dist/engine/failure_report.d.ts.map +1 -0
  44. package/dist/engine/failure_report.js +143 -0
  45. package/dist/engine/failure_report.js.map +1 -0
  46. package/dist/engine/governance_report.d.ts +9 -1
  47. package/dist/engine/governance_report.d.ts.map +1 -1
  48. package/dist/engine/governance_report.js +16 -2
  49. package/dist/engine/governance_report.js.map +1 -1
  50. package/dist/engine/implementation_roadmap_registry.d.ts +1 -1
  51. package/dist/engine/implementation_roadmap_registry.d.ts.map +1 -1
  52. package/dist/engine/implementation_roadmap_registry.js +32 -24
  53. package/dist/engine/implementation_roadmap_registry.js.map +1 -1
  54. package/dist/engine/knowledge_lifecycle.d.ts +23 -0
  55. package/dist/engine/knowledge_lifecycle.d.ts.map +1 -0
  56. package/dist/engine/knowledge_lifecycle.js +13 -0
  57. package/dist/engine/knowledge_lifecycle.js.map +1 -0
  58. package/dist/engine/language_policy.d.ts +21 -0
  59. package/dist/engine/language_policy.d.ts.map +1 -0
  60. package/dist/engine/language_policy.js +18 -0
  61. package/dist/engine/language_policy.js.map +1 -0
  62. package/dist/engine/language_policy_contract.d.ts +52 -0
  63. package/dist/engine/language_policy_contract.d.ts.map +1 -0
  64. package/dist/engine/language_policy_contract.js +78 -0
  65. package/dist/engine/language_policy_contract.js.map +1 -0
  66. package/dist/engine/mechanism_family_registry.d.ts +48 -0
  67. package/dist/engine/mechanism_family_registry.d.ts.map +1 -0
  68. package/dist/engine/mechanism_family_registry.js +197 -0
  69. package/dist/engine/mechanism_family_registry.js.map +1 -0
  70. package/dist/engine/policy_drift_detector.d.ts +20 -0
  71. package/dist/engine/policy_drift_detector.d.ts.map +1 -1
  72. package/dist/engine/policy_drift_detector.js +79 -0
  73. package/dist/engine/policy_drift_detector.js.map +1 -1
  74. package/dist/engine/retention_policy.d.ts +46 -0
  75. package/dist/engine/retention_policy.d.ts.map +1 -0
  76. package/dist/engine/retention_policy.js +124 -0
  77. package/dist/engine/retention_policy.js.map +1 -0
  78. package/dist/engine/state_update_bypass.d.ts +19 -0
  79. package/dist/engine/state_update_bypass.d.ts.map +1 -0
  80. package/dist/engine/state_update_bypass.js +17 -0
  81. package/dist/engine/state_update_bypass.js.map +1 -0
  82. package/dist/engine/task_context.d.ts.map +1 -1
  83. package/dist/engine/task_context.js +8 -0
  84. package/dist/engine/task_context.js.map +1 -1
  85. package/dist/engine/test_strategy.d.ts +58 -0
  86. package/dist/engine/test_strategy.d.ts.map +1 -0
  87. package/dist/engine/test_strategy.js +93 -0
  88. package/dist/engine/test_strategy.js.map +1 -0
  89. package/dist/engine/tool_invocation_contract_registry.d.ts.map +1 -1
  90. package/dist/engine/tool_invocation_contract_registry.js +11 -1
  91. package/dist/engine/tool_invocation_contract_registry.js.map +1 -1
  92. package/dist/engine/verification_contract.d.ts +132 -0
  93. package/dist/engine/verification_contract.d.ts.map +1 -0
  94. package/dist/engine/verification_contract.js +296 -0
  95. package/dist/engine/verification_contract.js.map +1 -0
  96. package/dist/engine/workspace_lease.d.ts +69 -0
  97. package/dist/engine/workspace_lease.d.ts.map +1 -0
  98. package/dist/engine/workspace_lease.js +153 -0
  99. package/dist/engine/workspace_lease.js.map +1 -0
  100. package/dist/types.d.ts +13 -1
  101. package/dist/types.d.ts.map +1 -1
  102. package/package.json +3 -2
@@ -0,0 +1,305 @@
1
+ /**
2
+ * 强制护栏注册表 — 问题十一 (Enforcement Guard)。
3
+ *
4
+ * 覆盖七类护栏: write、state、knowledge_injection、execution、
5
+ * external_side_effect、prompt、delivery。
6
+ * 护栏 finding 必须绑定 contract_id + diagnostic_code。
7
+ * 只有 contract state=enforced 且 hard_fail_allowed=true 时才能 hard fail。
8
+ */
9
+ import { getDiagnosticByCode, createDiagnosticEvent } from "./diagnostic_registry.js";
10
+ import { canContractHardFail } from "./contract_registry.js";
11
+ const BUILTIN_GUARDS = [
12
+ {
13
+ guard_id: "guard-write-readonly",
14
+ guard_type: "write",
15
+ enforced: true,
16
+ trigger_description: "只读工作流写入业务源码",
17
+ block_condition: "route=skip_chat/direct_answer/read_only_analysis 且写入目标为业务源码",
18
+ allow_condition: "route 允许写入",
19
+ failure_behavior: "block",
20
+ contract_id: "command_execution_contract",
21
+ diagnostic_code: "SF-GUARD-0001",
22
+ required_context: ["route", "target_path"],
23
+ },
24
+ {
25
+ guard_id: "guard-write-scope",
26
+ guard_type: "write",
27
+ enforced: true,
28
+ trigger_description: "超出 output artifact 范围写入",
29
+ block_condition: "source_extraction 写入非 output artifact 路径",
30
+ allow_condition: "写入路径在 output artifact 范围内",
31
+ failure_behavior: "block",
32
+ contract_id: "artifact_contract",
33
+ diagnostic_code: "SF-GUARD-0002",
34
+ required_context: ["route", "target_path", "output_artifact_paths"],
35
+ },
36
+ {
37
+ guard_id: "guard-state-pseudo-promotion",
38
+ guard_type: "state",
39
+ enforced: true,
40
+ trigger_description: "非法状态转移: 终态/阻断态 → completed",
41
+ block_condition: "failed/blocked/requires_human → completed",
42
+ allow_condition: "合法状态转移路径",
43
+ failure_behavior: "block",
44
+ contract_id: "task_context_contract",
45
+ diagnostic_code: "SF-STATE-0001",
46
+ required_context: ["current_status", "target_status"],
47
+ },
48
+ {
49
+ guard_id: "guard-delivery-explicit",
50
+ guard_type: "delivery",
51
+ enforced: true,
52
+ trigger_description: "交付未显式触发",
53
+ block_condition: "delivery_readiness 自动触发 commit/push/PR/deploy",
54
+ allow_condition: "交付动作由 sf_deliver 显式触发",
55
+ failure_behavior: "block",
56
+ contract_id: "artifact_contract",
57
+ diagnostic_code: "SF-VERIFY-0002",
58
+ required_context: ["delivery_trigger"],
59
+ },
60
+ {
61
+ guard_id: "guard-knowledge-injectable",
62
+ guard_type: "knowledge_injection",
63
+ enforced: true,
64
+ trigger_description: "非 injectable 知识进入 prompt",
65
+ block_condition: "draft/quarantine/deprecated 知识被注入",
66
+ allow_condition: "知识状态为 active 且 injectable",
67
+ failure_behavior: "block",
68
+ contract_id: "knowledge_injection_contract",
69
+ diagnostic_code: "SF-GUARD-0001",
70
+ required_context: ["knowledge_state", "knowledge_lifecycle"],
71
+ },
72
+ {
73
+ guard_id: "guard-execution-destructive",
74
+ guard_type: "execution",
75
+ enforced: true,
76
+ trigger_description: "破坏性命令未确认",
77
+ block_condition: "destructive 命令无人工确认",
78
+ allow_condition: "命令经人工确认或有明确策略",
79
+ failure_behavior: "require_human",
80
+ contract_id: "command_execution_contract",
81
+ diagnostic_code: "SF-GUARD-0001",
82
+ required_context: ["command", "risk_level"],
83
+ },
84
+ {
85
+ guard_id: "guard-external-side-effect",
86
+ guard_type: "external_side_effect",
87
+ enforced: true,
88
+ trigger_description: "外部副作用未记录",
89
+ block_condition: "git push/PR/deploy/数据库迁移 无 evidence",
90
+ allow_condition: "副作用有完整 evidence 记录",
91
+ failure_behavior: "block",
92
+ contract_id: "delivery_readiness_contract",
93
+ diagnostic_code: "SF-FAILURE-0002",
94
+ required_context: ["action_type", "evidence"],
95
+ },
96
+ {
97
+ guard_id: "guard-prompt-auth",
98
+ guard_type: "prompt",
99
+ enforced: true,
100
+ trigger_description: "Prompt 授权超过 workflow contract",
101
+ block_condition: "prompt 包含超出 workflow 的权限",
102
+ allow_condition: "prompt 权限在 workflow 范围内",
103
+ failure_behavior: "block",
104
+ contract_id: "workflow_contract",
105
+ diagnostic_code: "SF-GUARD-0001",
106
+ required_context: ["workflow_id", "prompt_permissions"],
107
+ },
108
+ ];
109
+ let runtimeGuards = null;
110
+ function getRegistry() {
111
+ if (!runtimeGuards) {
112
+ runtimeGuards = new Map();
113
+ for (const entry of BUILTIN_GUARDS) {
114
+ runtimeGuards.set(entry.guard_id, { ...entry });
115
+ }
116
+ }
117
+ return runtimeGuards;
118
+ }
119
+ /** 列出所有护栏 */
120
+ export function listAllGuards() {
121
+ return [...getRegistry().values()];
122
+ }
123
+ /** 按类型列出护栏 */
124
+ export function listGuardsByType(type) {
125
+ return [...getRegistry().values()].filter((g) => g.guard_type === type);
126
+ }
127
+ /** 注册新护栏(运行时) */
128
+ export function registerGuard(entry) {
129
+ const registry = getRegistry();
130
+ if (registry.has(entry.guard_id)) {
131
+ return { success: false, error: `护栏 ${entry.guard_id} 已存在` };
132
+ }
133
+ if (!getDiagnosticByCode(entry.diagnostic_code)) {
134
+ return { success: false, error: `诊断码 ${entry.diagnostic_code} 不存在` };
135
+ }
136
+ registry.set(entry.guard_id, { ...entry });
137
+ return { success: true };
138
+ }
139
+ /**
140
+ * 评估写入护栏。
141
+ * 检查 route 和 target_path 是否违反写入规则。
142
+ */
143
+ export function evaluateWriteGuard(route, targetPath, outputArtifactPaths, contractId) {
144
+ const findings = [];
145
+ const read_only_routes = ["skip_chat", "direct_answer", "read_only_analysis"];
146
+ // 只读工作流写入检查
147
+ if (read_only_routes.some((r) => route.includes(r))) {
148
+ const guard = getRegistry().get("guard-write-readonly");
149
+ if (guard && guard.enforced) {
150
+ const canHardFail = canContractHardFail(guard.contract_id);
151
+ findings.push({
152
+ guard_id: guard.guard_id,
153
+ contract_id: guard.contract_id,
154
+ diagnostic_code: guard.diagnostic_code,
155
+ severity: canHardFail ? "hard_fail" : "warning",
156
+ action: guard.failure_behavior,
157
+ reason_zh: `只读路由 ${route} 不允许写入 ${targetPath}`,
158
+ blocked: canHardFail,
159
+ diagnostic_event: createDiagnosticEvent(guard.diagnostic_code, { route, targetPath }, contractId),
160
+ });
161
+ }
162
+ }
163
+ // scope 检查(source_extraction 超范围)
164
+ if (route.includes("source_extraction") && outputArtifactPaths.length > 0) {
165
+ if (!outputArtifactPaths.some((p) => targetPath.startsWith(p))) {
166
+ const guard = getRegistry().get("guard-write-scope");
167
+ if (guard && guard.enforced) {
168
+ const canHardFail = canContractHardFail(guard.contract_id);
169
+ findings.push({
170
+ guard_id: guard.guard_id,
171
+ contract_id: guard.contract_id,
172
+ diagnostic_code: guard.diagnostic_code,
173
+ severity: canHardFail ? "hard_fail" : "warning",
174
+ action: guard.failure_behavior,
175
+ reason_zh: `source_extraction 只能写入 output artifact 路径,不能写入 ${targetPath}`,
176
+ blocked: canHardFail,
177
+ diagnostic_event: createDiagnosticEvent(guard.diagnostic_code, { route, targetPath }, contractId),
178
+ });
179
+ }
180
+ }
181
+ }
182
+ return findings;
183
+ }
184
+ /**
185
+ * 评估状态护栏。
186
+ * 检查状态转移是否合法。
187
+ */
188
+ export function evaluateStateGuard(currentStatus, targetStatus, contractId) {
189
+ const findings = [];
190
+ const BLOCKED_FROM = ["failed", "blocked", "requires_human"];
191
+ const BLOCKED_TO = "completed";
192
+ if (BLOCKED_FROM.includes(currentStatus) && targetStatus === BLOCKED_TO) {
193
+ const guard = getRegistry().get("guard-state-pseudo-promotion");
194
+ if (guard && guard.enforced) {
195
+ const canHardFail = canContractHardFail(guard.contract_id);
196
+ findings.push({
197
+ guard_id: guard.guard_id,
198
+ contract_id: guard.contract_id,
199
+ diagnostic_code: guard.diagnostic_code,
200
+ severity: canHardFail ? "hard_fail" : "warning",
201
+ action: guard.failure_behavior,
202
+ reason_zh: `非法状态转移: ${currentStatus} → completed`,
203
+ blocked: canHardFail,
204
+ diagnostic_event: createDiagnosticEvent(guard.diagnostic_code, { currentStatus, targetStatus }, contractId),
205
+ });
206
+ }
207
+ }
208
+ return findings;
209
+ }
210
+ /**
211
+ * 生成完整护栏评估报告。
212
+ */
213
+ export function generateGuardEvaluationReport(workflowId, route, mutationAllowed, guardIds) {
214
+ const allowed = [];
215
+ const blocked = [];
216
+ const warnings = [];
217
+ const humanRequired = [];
218
+ for (const guardId of guardIds) {
219
+ const guard = getRegistry().get(guardId);
220
+ if (!guard)
221
+ continue;
222
+ if (!guard.enforced) {
223
+ allowed.push(guardId);
224
+ continue;
225
+ }
226
+ // 简化评估: 如果 mutation 不允许且 guard 是写入类型,则阻断
227
+ if (!mutationAllowed && guard.guard_type === "write") {
228
+ const canHardFail = canContractHardFail(guard.contract_id);
229
+ const finding = {
230
+ guard_id: guard.guard_id,
231
+ contract_id: guard.contract_id,
232
+ diagnostic_code: guard.diagnostic_code,
233
+ severity: canHardFail ? "hard_fail" : "warning",
234
+ action: guard.failure_behavior,
235
+ reason_zh: guard.trigger_description,
236
+ blocked: canHardFail,
237
+ diagnostic_event: createDiagnosticEvent(guard.diagnostic_code, { workflowId, route }),
238
+ };
239
+ blocked.push(finding);
240
+ }
241
+ else {
242
+ allowed.push(guardId);
243
+ }
244
+ }
245
+ return {
246
+ evaluated_at: new Date().toISOString(),
247
+ workflow_id: workflowId,
248
+ route,
249
+ mutation_allowed: mutationAllowed,
250
+ evaluated_guards: guardIds,
251
+ allowed,
252
+ blocked,
253
+ warnings,
254
+ human_required: humanRequired,
255
+ };
256
+ }
257
+ /**
258
+ * 校验所有 guard 的 contract_id 是否存在于 Contract Registry。
259
+ */
260
+ export function validateGuardContractIds(contractExistsFn) {
261
+ const findings = [];
262
+ for (const guard of getRegistry().values()) {
263
+ if (!contractExistsFn(guard.contract_id)) {
264
+ findings.push({
265
+ guard_id: guard.guard_id,
266
+ contract_id: guard.contract_id,
267
+ severity: "hard_fail",
268
+ });
269
+ }
270
+ }
271
+ return findings;
272
+ }
273
+ /**
274
+ * 评估交付就绪护栏。
275
+ * 检查交付是否由 sf_deliver 显式触发,验证结果是否满足交付条件。
276
+ */
277
+ export function evaluateDeliveryReadinessGuard(verificationResult, verificationPlan) {
278
+ const findings = [];
279
+ // guard-delivery-explicit: 交付必须由 sf_deliver 显式触发
280
+ const guard = getRegistry().get("guard-delivery-explicit");
281
+ if (guard && guard.enforced) {
282
+ // 如果验证结果不存在或是 plan_only,给出警告
283
+ if (!verificationResult || verificationResult.status === "not_executed") {
284
+ const canHardFail = canContractHardFail(guard.contract_id);
285
+ findings.push({
286
+ guard_id: guard.guard_id,
287
+ contract_id: guard.contract_id,
288
+ diagnostic_code: guard.diagnostic_code,
289
+ severity: canHardFail ? "hard_fail" : "warning",
290
+ action: guard.failure_behavior,
291
+ reason_zh: verificationResult
292
+ ? `验证结果状态为 ${verificationResult.status},未通过真实执行验证`
293
+ : "无验证结果,不得交付",
294
+ blocked: canHardFail,
295
+ diagnostic_event: createDiagnosticEvent(guard.diagnostic_code, { verification_status: verificationResult?.status ?? "missing" }, guard.contract_id),
296
+ });
297
+ }
298
+ }
299
+ return findings;
300
+ }
301
+ /** 重置注册表(测试用) */
302
+ export function resetGuardRegistry() {
303
+ runtimeGuards = null;
304
+ }
305
+ //# sourceMappingURL=enforcement_guard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"enforcement_guard.js","sourceRoot":"","sources":["../../src/engine/enforcement_guard.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,74 @@
1
+ /**
2
+ * 失败报告 — 问题十三 (Failure / Recovery Policy)。
3
+ *
4
+ * 核心规则:
5
+ * - 失败必须分类为明确 FailureClass
6
+ * - deterministic 不无限重试
7
+ * - scope_insufficient 不静默扩大
8
+ * - external_side_effect 部分成功必须记录已发生动作
9
+ * - retry 必须有预算、原因和新证据
10
+ * - unknown failure 不标记 completed
11
+ */
12
+ import { type DiagnosticEvent } from "./diagnostic_registry.js";
13
+ export type FailureClass = "deterministic" | "fixable" | "scope_insufficient" | "external_side_effect" | "state_inconsistent" | "human_required" | "unknown";
14
+ export type RecoveryAction = "retry" | "escalate" | "expand_scope" | "require_human" | "rollback" | "abort";
15
+ export interface FailureReport {
16
+ failure_id: string;
17
+ task_id: string;
18
+ contract_id?: string;
19
+ failure_class: FailureClass;
20
+ /** 脱敏后的摘要,不含 raw output */
21
+ redacted_summary: string;
22
+ /** 稳定内容哈希,用于去重和追溯 */
23
+ error_output_hash: string;
24
+ /** 原始输出不保留,只存 evidence ref */
25
+ evidence_ref?: string;
26
+ retry_count: number;
27
+ retry_budget: number;
28
+ retry_remaining: number;
29
+ occurred_at: string;
30
+ actions_taken: string[];
31
+ external_side_effects?: string[];
32
+ diagnostic_event: DiagnosticEvent | null;
33
+ }
34
+ export interface RecoveryPolicy {
35
+ policy_id: string;
36
+ failure_class: FailureClass;
37
+ max_retries: number;
38
+ action: RecoveryAction;
39
+ requires_new_evidence: boolean;
40
+ requires_human_confirmation: boolean;
41
+ diagnostic_code: string;
42
+ }
43
+ export interface RecoveryAttempt {
44
+ attempt_id: string;
45
+ failure_id: string;
46
+ policy_id: string;
47
+ action: RecoveryAction;
48
+ new_evidence_ids: string[];
49
+ result: "success" | "failure" | "in_progress";
50
+ attempted_at: string;
51
+ }
52
+ /** 按 FailureClass 获取恢复策略 */
53
+ export declare function getRecoveryPolicy(failureClass: FailureClass): RecoveryPolicy | undefined;
54
+ /** 列出所有恢复策略 */
55
+ export declare function listRecoveryPolicies(): RecoveryPolicy[];
56
+ /** 检查是否包含敏感内容 */
57
+ export declare function containsSensitiveContent(content: string): boolean;
58
+ /** 创建失败报告(含自检: 脱敏后仍含敏感内容时强制二次脱敏) */
59
+ export declare function createFailureReport(taskId: string, failureClass: FailureClass, errorOutput: string, retryCount: number, retryBudget: number, contractId?: string, externalSideEffects?: string[]): FailureReport;
60
+ /**
61
+ * 判断是否允许重试。
62
+ * - deterministic 不允许
63
+ * - 超预算不允许
64
+ * - human_required 不允许
65
+ */
66
+ export declare function canRetry(failureClass: FailureClass, retryCount: number, retryBudget: number): boolean;
67
+ /**
68
+ * 验证失败处理规则。
69
+ */
70
+ export declare function validateFailureHandling(report: FailureReport): Array<{
71
+ error: string;
72
+ severity: "hard_fail" | "warning";
73
+ }>;
74
+ //# sourceMappingURL=failure_report.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"failure_report.d.ts","sourceRoot":"","sources":["../../src/engine/failure_report.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAyB,KAAK,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAGvF,MAAM,MAAM,YAAY,GACpB,eAAe,GACf,SAAS,GACT,oBAAoB,GACpB,sBAAsB,GACtB,oBAAoB,GACpB,gBAAgB,GAChB,SAAS,CAAC;AAEd,MAAM,MAAM,cAAc,GAAG,OAAO,GAAG,UAAU,GAAG,cAAc,GAAG,eAAe,GAAG,UAAU,GAAG,OAAO,CAAC;AAE5G,MAAM,WAAW,aAAa;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,YAAY,CAAC;IAC5B,2BAA2B;IAC3B,gBAAgB,EAAE,MAAM,CAAC;IACzB,qBAAqB;IACrB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,8BAA8B;IAC9B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,MAAM,CAAC;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,qBAAqB,CAAC,EAAE,MAAM,EAAE,CAAC;IACjC,gBAAgB,EAAE,eAAe,GAAG,IAAI,CAAC;CAC1C;AAED,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,YAAY,CAAC;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,cAAc,CAAC;IACvB,qBAAqB,EAAE,OAAO,CAAC;IAC/B,2BAA2B,EAAE,OAAO,CAAC;IACrC,eAAe,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,eAAe;IAC9B,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,cAAc,CAAC;IACvB,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,MAAM,EAAE,SAAS,GAAG,SAAS,GAAG,aAAa,CAAC;IAC9C,YAAY,EAAE,MAAM,CAAC;CACtB;AAoBD,4BAA4B;AAC5B,wBAAgB,iBAAiB,CAAC,YAAY,EAAE,YAAY,GAAG,cAAc,GAAG,SAAS,CAExF;AAED,eAAe;AACf,wBAAgB,oBAAoB,IAAI,cAAc,EAAE,CAEvD;AAiCD,iBAAiB;AACjB,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAEjE;AAED,oCAAoC;AACpC,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,MAAM,EACd,YAAY,EAAE,YAAY,EAC1B,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,MAAM,EACnB,UAAU,CAAC,EAAE,MAAM,EACnB,mBAAmB,CAAC,EAAE,MAAM,EAAE,GAC7B,aAAa,CAkCf;AAED;;;;;GAKG;AACH,wBAAgB,QAAQ,CAAC,YAAY,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAKrG;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,aAAa,GAAG,KAAK,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,WAAW,GAAG,SAAS,CAAA;CAAE,CAAC,CAiC1H"}
@@ -0,0 +1,143 @@
1
+ /**
2
+ * 失败报告 — 问题十三 (Failure / Recovery Policy)。
3
+ *
4
+ * 核心规则:
5
+ * - 失败必须分类为明确 FailureClass
6
+ * - deterministic 不无限重试
7
+ * - scope_insufficient 不静默扩大
8
+ * - external_side_effect 部分成功必须记录已发生动作
9
+ * - retry 必须有预算、原因和新证据
10
+ * - unknown failure 不标记 completed
11
+ */
12
+ import { createDiagnosticEvent } from "./diagnostic_registry.js";
13
+ import { createHash } from "node:crypto";
14
+ // 内置恢复策略
15
+ const BUILTIN_RECOVERY_POLICIES = [
16
+ { policy_id: "rp-deterministic", failure_class: "deterministic", max_retries: 0, action: "escalate",
17
+ requires_new_evidence: true, requires_human_confirmation: true, diagnostic_code: "SF-FAILURE-0001" },
18
+ { policy_id: "rp-fixable", failure_class: "fixable", max_retries: 3, action: "retry",
19
+ requires_new_evidence: true, requires_human_confirmation: false, diagnostic_code: "SF-FAILURE-0001" },
20
+ { policy_id: "rp-scope-insufficient", failure_class: "scope_insufficient", max_retries: 1, action: "require_human",
21
+ requires_new_evidence: true, requires_human_confirmation: true, diagnostic_code: "SF-FAILURE-0001" },
22
+ { policy_id: "rp-external-side-effect", failure_class: "external_side_effect", max_retries: 0, action: "rollback",
23
+ requires_new_evidence: true, requires_human_confirmation: true, diagnostic_code: "SF-FAILURE-0002" },
24
+ { policy_id: "rp-state-inconsistent", failure_class: "state_inconsistent", max_retries: 0, action: "abort",
25
+ requires_new_evidence: true, requires_human_confirmation: true, diagnostic_code: "SF-STATE-0001" },
26
+ { policy_id: "rp-human-required", failure_class: "human_required", max_retries: 0, action: "require_human",
27
+ requires_new_evidence: false, requires_human_confirmation: true, diagnostic_code: "SF-FAILURE-0001" },
28
+ { policy_id: "rp-unknown", failure_class: "unknown", max_retries: 0, action: "escalate",
29
+ requires_new_evidence: true, requires_human_confirmation: true, diagnostic_code: "SF-FAILURE-0001" },
30
+ ];
31
+ /** 按 FailureClass 获取恢复策略 */
32
+ export function getRecoveryPolicy(failureClass) {
33
+ return BUILTIN_RECOVERY_POLICIES.find((p) => p.failure_class === failureClass);
34
+ }
35
+ /** 列出所有恢复策略 */
36
+ export function listRecoveryPolicies() {
37
+ return [...BUILTIN_RECOVERY_POLICIES];
38
+ }
39
+ // 敏感内容模式 — raw output/secret/PII
40
+ const SENSITIVE_PATTERNS = [
41
+ /sk-[a-zA-Z0-9]{20,}/, // API key
42
+ /\b\d{11}\b/, // 手机号
43
+ /password\s*[:=]\s*\S+/i, // password=
44
+ /secret\s*[:=]\s*\S+/i, // secret=
45
+ /api_key\s*[:=]\s*\S+/i, // api_key=
46
+ /token\s*[:=]\s*\S+/i, // token=
47
+ /raw_stdout/i, // raw stdout 标记
48
+ /raw_stderr/i, // raw stderr 标记
49
+ ];
50
+ /** 脱敏: 全局替换所有敏感内容,返回 redacted summary */
51
+ function redactErrorOutput(raw) {
52
+ let result = raw;
53
+ // 全局替换所有敏感模式(使用 replaceAll 语义,确保多次出现都处理)
54
+ for (const pattern of SENSITIVE_PATTERNS) {
55
+ result = result.replace(new RegExp(pattern.source, pattern.flags.includes("g") ? pattern.flags : pattern.flags + "g"), "[REDACTED]");
56
+ }
57
+ // 截断防止大段输出
58
+ if (result.length > 200) {
59
+ result = result.substring(0, 200) + "...[truncated]";
60
+ }
61
+ return result;
62
+ }
63
+ /** 稳定内容哈希 */
64
+ function stableHash(content) {
65
+ return createHash("sha256").update(content).digest("hex").substring(0, 16);
66
+ }
67
+ /** 检查是否包含敏感内容 */
68
+ export function containsSensitiveContent(content) {
69
+ return SENSITIVE_PATTERNS.some((p) => p.test(content));
70
+ }
71
+ /** 创建失败报告(含自检: 脱敏后仍含敏感内容时强制二次脱敏) */
72
+ export function createFailureReport(taskId, failureClass, errorOutput, retryCount, retryBudget, contractId, externalSideEffects) {
73
+ const policy = getRecoveryPolicy(failureClass);
74
+ const diagCode = policy?.diagnostic_code ?? "SF-FAILURE-0001";
75
+ const diagEvent = createDiagnosticEvent(diagCode, { failure_class: failureClass, retry_count: retryCount }, contractId, taskId);
76
+ const hash = stableHash(errorOutput);
77
+ let redacted = redactErrorOutput(errorOutput);
78
+ // 自检: 脱敏后仍含敏感内容时强制替换为占位符
79
+ if (containsSensitiveContent(redacted)) {
80
+ redacted = "[内容已全部脱敏,原始输出不可展示]";
81
+ }
82
+ return {
83
+ failure_id: `fr-${taskId}-${hash}`,
84
+ task_id: taskId,
85
+ contract_id: contractId,
86
+ failure_class: failureClass,
87
+ redacted_summary: redacted,
88
+ error_output_hash: hash,
89
+ evidence_ref: undefined,
90
+ retry_count: retryCount,
91
+ retry_budget: retryBudget,
92
+ retry_remaining: Math.max(0, retryBudget - retryCount),
93
+ occurred_at: new Date().toISOString(),
94
+ actions_taken: [],
95
+ external_side_effects: externalSideEffects,
96
+ diagnostic_event: diagEvent,
97
+ };
98
+ }
99
+ /**
100
+ * 判断是否允许重试。
101
+ * - deterministic 不允许
102
+ * - 超预算不允许
103
+ * - human_required 不允许
104
+ */
105
+ export function canRetry(failureClass, retryCount, retryBudget) {
106
+ if (failureClass === "deterministic" || failureClass === "human_required" || failureClass === "unknown") {
107
+ return false;
108
+ }
109
+ return retryCount < retryBudget;
110
+ }
111
+ /**
112
+ * 验证失败处理规则。
113
+ */
114
+ export function validateFailureHandling(report) {
115
+ const errors = [];
116
+ if (report.failure_class === "deterministic" && report.retry_count > 0) {
117
+ errors.push({
118
+ error: `deterministic 失败不应重试,但已重试 ${report.retry_count} 次`,
119
+ severity: "hard_fail",
120
+ });
121
+ }
122
+ if (report.failure_class === "external_side_effect" && !report.external_side_effects) {
123
+ errors.push({
124
+ error: "external_side_effect 失败必须记录已发生动作",
125
+ severity: "hard_fail",
126
+ });
127
+ }
128
+ if (report.retry_remaining < 0) {
129
+ errors.push({
130
+ error: `重试次数超过预算: ${report.retry_count}/${report.retry_budget}`,
131
+ severity: "hard_fail",
132
+ });
133
+ }
134
+ // 红线: redacted_summary 不得包含敏感原文
135
+ if (containsSensitiveContent(report.redacted_summary)) {
136
+ errors.push({
137
+ error: "FailureReport redacted_summary 仍包含敏感内容(secret/PII/raw output)",
138
+ severity: "hard_fail",
139
+ });
140
+ }
141
+ return errors;
142
+ }
143
+ //# sourceMappingURL=failure_report.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"failure_report.js","sourceRoot":"","sources":["../../src/engine/failure_report.ts"],"names":[],"mappings":"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"}
@@ -10,6 +10,7 @@ import type { DualLayerGovernanceFinding } from "../types.js";
10
10
  import { type OutputArtifact, type ArtifactGovernanceFinding } from "./artifact_contract_registry.js";
11
11
  import { type ConfigResolutionReport, type ConfigEvidenceEntry, type ConfigPrecedenceGovernanceFinding } from "./config_precedence_contract.js";
12
12
  import { type CorePrinciplesReport } from "./core_engineering_principles.js";
13
+ import { type ContractGovernanceFinding } from "./contract_registry.js";
13
14
  export interface PolicySummary {
14
15
  policy_id: string;
15
16
  escape_count: number;
@@ -63,6 +64,13 @@ export interface GovernanceReport {
63
64
  findings: string[];
64
65
  }>;
65
66
  };
67
+ contract_governance?: {
68
+ total_contracts: number;
69
+ hard_fail_count: number;
70
+ warning_count: number;
71
+ advisory_count: number;
72
+ findings: ContractGovernanceFinding[];
73
+ };
66
74
  }
67
75
  /**
68
76
  * 生成治理健康报告。
@@ -88,5 +96,5 @@ export interface GovernanceReport {
88
96
  * @param options - 报告选项,包含审计池和能力状态存储
89
97
  * @returns 治理报告,包含任务统计、逃逸分析和降级建议
90
98
  */
91
- export declare function generateReport(auditStats: AuditPoolStats, auditItems: AuditItem[], escapeReports: EscapeReport[], escapeStats: EscapeReportStats, decisions: ActionDecision[], now?: Date, sampleDecisions?: SamplingDecision[], dualLayerFindings?: DualLayerGovernanceFinding[], dualLayerMechanismCount?: number, artifacts?: OutputArtifact[], configReports?: ConfigResolutionReport[], configEntries?: ConfigEvidenceEntry[], corePrinciples?: CorePrinciplesReport[]): GovernanceReport;
99
+ export declare function generateReport(auditStats: AuditPoolStats, auditItems: AuditItem[], escapeReports: EscapeReport[], escapeStats: EscapeReportStats, decisions: ActionDecision[], now?: Date, sampleDecisions?: SamplingDecision[], dualLayerFindings?: DualLayerGovernanceFinding[], dualLayerMechanismCount?: number, artifacts?: OutputArtifact[], configReports?: ConfigResolutionReport[], configEntries?: ConfigEvidenceEntry[], corePrinciples?: CorePrinciplesReport[], contractFindings?: ContractGovernanceFinding[], totalRegistryContracts?: number): GovernanceReport;
92
100
  //# sourceMappingURL=governance_report.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"governance_report.d.ts","sourceRoot":"","sources":["../../src/engine/governance_report.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"governance_report.d.ts","sourceRoot":"","sources":["../../src/engine/governance_report.ts"],"names":[],"mappings":"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"}
@@ -44,7 +44,7 @@ function deepCopySummary(summary) {
44
44
  * @param options - 报告选项,包含审计池和能力状态存储
45
45
  * @returns 治理报告,包含任务统计、逃逸分析和降级建议
46
46
  */
47
- export function generateReport(auditStats, auditItems, escapeReports, escapeStats, decisions, now, sampleDecisions, dualLayerFindings, dualLayerMechanismCount, artifacts, configReports, configEntries, corePrinciples) {
47
+ export function generateReport(auditStats, auditItems, escapeReports, escapeStats, decisions, now, sampleDecisions, dualLayerFindings, dualLayerMechanismCount, artifacts, configReports, configEntries, corePrinciples, contractFindings, totalRegistryContracts) {
48
48
  console.error("[soloForge] 治理报告: 生成治理健康报告");
49
49
  const nonFPReports = escapeReports.filter((r) => r.failure_type !== "false_positive");
50
50
  const fpReports = escapeReports.filter((r) => r.failure_type === "false_positive");
@@ -132,7 +132,7 @@ export function generateReport(auditStats, auditItems, escapeReports, escapeStat
132
132
  findings: cpFindings,
133
133
  };
134
134
  }
135
- // 核心原则治理
135
+ // 核心原则治理
136
136
  if (corePrinciples && corePrinciples.length > 0)
137
137
  console.error("[soloForge] 治理报告: 检查核心原则遵循性,报告数=" + corePrinciples.length);
138
138
  let corePrinciplesGovernance;
@@ -149,6 +149,19 @@ export function generateReport(auditStats, auditItems, escapeReports, escapeStat
149
149
  })),
150
150
  };
151
151
  }
152
+ // 契约治理汇总
153
+ if (contractFindings && contractFindings.length > 0)
154
+ console.error("[soloForge] 治理报告: 检查契约治理,发现数=" + contractFindings.length);
155
+ let contractGovernance;
156
+ if (contractFindings) {
157
+ contractGovernance = {
158
+ total_contracts: totalRegistryContracts ?? new Set(contractFindings.map((f) => f.contract_id)).size,
159
+ hard_fail_count: contractFindings.filter((f) => f.severity === "hard_fail").length,
160
+ warning_count: contractFindings.filter((f) => f.severity === "warning").length,
161
+ advisory_count: contractFindings.filter((f) => f.severity === "advisory").length,
162
+ findings: [...contractFindings],
163
+ };
164
+ }
152
165
  return {
153
166
  generated_at: (now ?? new Date()).toISOString(),
154
167
  total_tasks: auditStats.total,
@@ -164,6 +177,7 @@ export function generateReport(auditStats, auditItems, escapeReports, escapeStat
164
177
  artifact_governance: artifactGovernance,
165
178
  config_precedence_governance: configPrecedenceGovernance,
166
179
  core_principles_governance: corePrinciplesGovernance,
180
+ contract_governance: contractGovernance,
167
181
  };
168
182
  }
169
183
  //# sourceMappingURL=governance_report.js.map