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.
- package/dist/adapters/claude_code/tools.d.ts.map +1 -1
- package/dist/adapters/claude_code/tools.js +159 -1
- package/dist/adapters/claude_code/tools.js.map +1 -1
- package/dist/adapters/trae/trae_config.d.ts +1 -1
- package/dist/adapters/trae/trae_config.d.ts.map +1 -1
- package/dist/adapters/trae/trae_config.js +1 -1
- package/dist/adapters/trae/trae_config.js.map +1 -1
- package/dist/engine/audit_pool.d.ts.map +1 -1
- package/dist/engine/audit_pool.js +1 -0
- package/dist/engine/audit_pool.js.map +1 -1
- package/dist/engine/contract_registry.d.ts +113 -0
- package/dist/engine/contract_registry.d.ts.map +1 -0
- package/dist/engine/contract_registry.js +1159 -0
- package/dist/engine/contract_registry.js.map +1 -0
- package/dist/engine/contract_state_store.d.ts +67 -0
- package/dist/engine/contract_state_store.d.ts.map +1 -0
- package/dist/engine/contract_state_store.js +167 -0
- package/dist/engine/contract_state_store.js.map +1 -0
- package/dist/engine/debugger.d.ts.map +1 -1
- package/dist/engine/debugger.js +30 -1
- package/dist/engine/debugger.js.map +1 -1
- package/dist/engine/degradation.d.ts +58 -0
- package/dist/engine/degradation.d.ts.map +1 -0
- package/dist/engine/degradation.js +74 -0
- package/dist/engine/degradation.js.map +1 -0
- package/dist/engine/delivery_readiness.d.ts +66 -0
- package/dist/engine/delivery_readiness.d.ts.map +1 -0
- package/dist/engine/delivery_readiness.js +176 -0
- package/dist/engine/delivery_readiness.js.map +1 -0
- package/dist/engine/deprecated_contract.d.ts +21 -0
- package/dist/engine/deprecated_contract.d.ts.map +1 -0
- package/dist/engine/deprecated_contract.js +14 -0
- package/dist/engine/deprecated_contract.js.map +1 -0
- package/dist/engine/diagnostic_registry.d.ts +64 -0
- package/dist/engine/diagnostic_registry.d.ts.map +1 -0
- package/dist/engine/diagnostic_registry.js +176 -0
- package/dist/engine/diagnostic_registry.js.map +1 -0
- package/dist/engine/enforcement_guard.d.ts +84 -0
- package/dist/engine/enforcement_guard.d.ts.map +1 -0
- package/dist/engine/enforcement_guard.js +305 -0
- package/dist/engine/enforcement_guard.js.map +1 -0
- package/dist/engine/failure_report.d.ts +74 -0
- package/dist/engine/failure_report.d.ts.map +1 -0
- package/dist/engine/failure_report.js +143 -0
- package/dist/engine/failure_report.js.map +1 -0
- package/dist/engine/governance_report.d.ts +9 -1
- package/dist/engine/governance_report.d.ts.map +1 -1
- package/dist/engine/governance_report.js +16 -2
- package/dist/engine/governance_report.js.map +1 -1
- package/dist/engine/implementation_roadmap_registry.d.ts +1 -1
- package/dist/engine/implementation_roadmap_registry.d.ts.map +1 -1
- package/dist/engine/implementation_roadmap_registry.js +32 -24
- package/dist/engine/implementation_roadmap_registry.js.map +1 -1
- package/dist/engine/knowledge_lifecycle.d.ts +23 -0
- package/dist/engine/knowledge_lifecycle.d.ts.map +1 -0
- package/dist/engine/knowledge_lifecycle.js +13 -0
- package/dist/engine/knowledge_lifecycle.js.map +1 -0
- package/dist/engine/language_policy.d.ts +21 -0
- package/dist/engine/language_policy.d.ts.map +1 -0
- package/dist/engine/language_policy.js +18 -0
- package/dist/engine/language_policy.js.map +1 -0
- package/dist/engine/language_policy_contract.d.ts +52 -0
- package/dist/engine/language_policy_contract.d.ts.map +1 -0
- package/dist/engine/language_policy_contract.js +78 -0
- package/dist/engine/language_policy_contract.js.map +1 -0
- package/dist/engine/mechanism_family_registry.d.ts +48 -0
- package/dist/engine/mechanism_family_registry.d.ts.map +1 -0
- package/dist/engine/mechanism_family_registry.js +197 -0
- package/dist/engine/mechanism_family_registry.js.map +1 -0
- package/dist/engine/policy_drift_detector.d.ts +20 -0
- package/dist/engine/policy_drift_detector.d.ts.map +1 -1
- package/dist/engine/policy_drift_detector.js +79 -0
- package/dist/engine/policy_drift_detector.js.map +1 -1
- package/dist/engine/retention_policy.d.ts +46 -0
- package/dist/engine/retention_policy.d.ts.map +1 -0
- package/dist/engine/retention_policy.js +124 -0
- package/dist/engine/retention_policy.js.map +1 -0
- package/dist/engine/state_update_bypass.d.ts +19 -0
- package/dist/engine/state_update_bypass.d.ts.map +1 -0
- package/dist/engine/state_update_bypass.js +17 -0
- package/dist/engine/state_update_bypass.js.map +1 -0
- package/dist/engine/task_context.d.ts.map +1 -1
- package/dist/engine/task_context.js +8 -0
- package/dist/engine/task_context.js.map +1 -1
- package/dist/engine/test_strategy.d.ts +58 -0
- package/dist/engine/test_strategy.d.ts.map +1 -0
- package/dist/engine/test_strategy.js +93 -0
- package/dist/engine/test_strategy.js.map +1 -0
- package/dist/engine/tool_invocation_contract_registry.d.ts.map +1 -1
- package/dist/engine/tool_invocation_contract_registry.js +11 -1
- package/dist/engine/tool_invocation_contract_registry.js.map +1 -1
- package/dist/engine/verification_contract.d.ts +132 -0
- package/dist/engine/verification_contract.d.ts.map +1 -0
- package/dist/engine/verification_contract.js +296 -0
- package/dist/engine/verification_contract.js.map +1 -0
- package/dist/engine/workspace_lease.d.ts +69 -0
- package/dist/engine/workspace_lease.d.ts.map +1 -0
- package/dist/engine/workspace_lease.js +153 -0
- package/dist/engine/workspace_lease.js.map +1 -0
- package/dist/types.d.ts +13 -1
- package/dist/types.d.ts.map +1 -1
- 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":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACjE,OAAO,KAAK,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAC1E,OAAO,KAAK,EAAE,cAAc,EAAc,MAAM,gCAAgC,CAAC;AACjF,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAC1D,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,aAAa,CAAC;AAC9D,OAAO,EAA6B,KAAK,cAAc,EAAE,KAAK,yBAAyB,EAAE,MAAM,iCAAiC,CAAC;AACjI,OAAO,EAA4B,KAAK,sBAAsB,EAAE,KAAK,mBAAmB,EAAE,KAAK,iCAAiC,EAAE,MAAM,iCAAiC,CAAC;AAC1K,OAAO,EAAE,KAAK,oBAAoB,EAAE,MAAM,kCAAkC,CAAC;
|
|
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
|