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,176 @@
1
+ /**
2
+ * 交付就绪报告 — 问题十二 (Delivery Readiness Gate)。
3
+ *
4
+ * 核心规则:
5
+ * - DeliveryReadinessReport 只判断 readiness,不隐式执行 commit/push/PR/deploy
6
+ * - delivery_allowed=true 不等于 delivery executed
7
+ * - 未验证不得 delivered
8
+ * - blocking human confirmation 存在时 delivery_allowed 必须为 false
9
+ */
10
+ /**
11
+ * 评估交付就绪状态。
12
+ * 只做判断,不执行任何交付动作。
13
+ */
14
+ export function evaluateDeliveryReadiness(taskId, verificationResult, guardFindings, scopeCheckPassed, leaseCheckPassed, privacyCheckPassed, artifactAcceptancePassed) {
15
+ const blockingFindings = [];
16
+ const warnings = [];
17
+ // 1. 验证结果检查
18
+ if (!verificationResult) {
19
+ blockingFindings.push({
20
+ rule: "verification_required",
21
+ message_zh: "无验证结果,不得交付",
22
+ });
23
+ }
24
+ else if (verificationResult.status !== "passed") {
25
+ blockingFindings.push({
26
+ rule: "verification_passed_required",
27
+ message_zh: `验证状态为 ${verificationResult.status},不是 passed,不得交付`,
28
+ });
29
+ }
30
+ else if (verificationResult.provenance !== "record_verification_execution") {
31
+ blockingFindings.push({
32
+ rule: "verification_provenance_required",
33
+ message_zh: `验证结果 provenance 为 "${verificationResult.provenance}",必须通过 recordVerificationExecution 录入,不得交付`,
34
+ });
35
+ }
36
+ else if (!verificationResult.evidence_ids || verificationResult.evidence_ids.length === 0) {
37
+ blockingFindings.push({
38
+ rule: "verification_evidence_required",
39
+ message_zh: "验证结果缺少 evidence_ids,不得交付",
40
+ });
41
+ }
42
+ else if (!verificationResult.total_commands || verificationResult.total_commands === 0) {
43
+ blockingFindings.push({
44
+ rule: "verification_commands_required",
45
+ message_zh: "验证结果 total_commands 为 0,不得交付",
46
+ });
47
+ }
48
+ else if (verificationResult.missing_commands && verificationResult.missing_commands.length > 0) {
49
+ blockingFindings.push({
50
+ rule: "verification_plan_coverage_required",
51
+ message_zh: `plan 命令未全覆盖,缺少: ${verificationResult.missing_commands.join(", ")},不得交付`,
52
+ });
53
+ }
54
+ else if (verificationResult.evidence_integrity_passed === false) {
55
+ blockingFindings.push({
56
+ rule: "verification_evidence_integrity_required",
57
+ message_zh: "证据格式校验未全部通过,不得交付",
58
+ });
59
+ }
60
+ // 2. Scope 检查
61
+ if (!scopeCheckPassed) {
62
+ blockingFindings.push({
63
+ rule: "scope_check",
64
+ message_zh: "范围检查未通过",
65
+ });
66
+ }
67
+ // 3. Lease 检查
68
+ if (!leaseCheckPassed) {
69
+ blockingFindings.push({
70
+ rule: "lease_check",
71
+ message_zh: "存在活跃 lease 冲突,不得交付",
72
+ });
73
+ }
74
+ // 4. 隐私检查
75
+ if (!privacyCheckPassed) {
76
+ blockingFindings.push({
77
+ rule: "privacy_check",
78
+ message_zh: "隐私检查未通过,存在未脱敏内容",
79
+ });
80
+ }
81
+ // 5. Artifact 检查
82
+ if (!artifactAcceptancePassed) {
83
+ blockingFindings.push({
84
+ rule: "artifact_acceptance",
85
+ message_zh: "产物验收未通过",
86
+ });
87
+ }
88
+ // 6. Guard 阻断检查
89
+ const blockedGuards = guardFindings.filter((f) => f.blocked);
90
+ for (const g of blockedGuards) {
91
+ blockingFindings.push({
92
+ rule: g.guard_id,
93
+ message_zh: g.reason_zh,
94
+ });
95
+ }
96
+ // 7. Guard warning
97
+ const warningGuards = guardFindings.filter((f) => !f.blocked && f.severity === "warning");
98
+ for (const g of warningGuards) {
99
+ warnings.push({
100
+ rule: g.guard_id,
101
+ message_zh: g.reason_zh,
102
+ });
103
+ }
104
+ // 判断就绪状态
105
+ let status;
106
+ const deliveryAllowed = blockingFindings.length === 0;
107
+ if (blockedGuards.some((g) => g.action === "require_human")) {
108
+ status = "manual_required";
109
+ }
110
+ else if (!deliveryAllowed) {
111
+ status = "blocked";
112
+ }
113
+ else if (warnings.length > 0) {
114
+ status = "ready";
115
+ }
116
+ else {
117
+ status = "ready";
118
+ }
119
+ return {
120
+ report_id: `dr-${taskId}-${Date.now()}`,
121
+ task_id: taskId,
122
+ delivery_readiness_status: status,
123
+ delivery_allowed: deliveryAllowed,
124
+ verification_result_id: verificationResult?.result_id,
125
+ scope_check_passed: scopeCheckPassed,
126
+ lease_check_passed: leaseCheckPassed,
127
+ privacy_check_passed: privacyCheckPassed,
128
+ artifact_acceptance_passed: artifactAcceptancePassed,
129
+ blocking_findings: blockingFindings,
130
+ warnings,
131
+ evaluated_at: new Date().toISOString(),
132
+ delivery_executed: false, // 就绪报告不触发执行
133
+ };
134
+ }
135
+ /**
136
+ * 创建交付执行记录。
137
+ * 必须由 sf_deliver 或手动触发,不能由 readiness 自动触发。
138
+ */
139
+ export function createDeliveryExecutionRecord(taskId, trigger, details) {
140
+ return {
141
+ execution_id: `de-${taskId}-${Date.now()}`,
142
+ task_id: taskId,
143
+ trigger,
144
+ commit_sha: details.commit_sha,
145
+ pr_url: details.pr_url,
146
+ changelog_entry: details.changelog_entry,
147
+ executed_at: new Date().toISOString(),
148
+ rolled_back: false,
149
+ };
150
+ }
151
+ /**
152
+ * 验证: delivery_readiness 不得触发 delivery_execution。
153
+ */
154
+ export function validateDeliverySeparation(report, executionRecord) {
155
+ const errors = [];
156
+ if (report.delivery_allowed && report.delivery_executed) {
157
+ errors.push({
158
+ error: "delivery_readiness 报告不应触发 delivery_execution",
159
+ severity: "hard_fail",
160
+ });
161
+ }
162
+ if (executionRecord && !report.delivery_allowed) {
163
+ errors.push({
164
+ error: "交付已执行但 delivery_readiness 未允许",
165
+ severity: "hard_fail",
166
+ });
167
+ }
168
+ if (executionRecord && executionRecord.trigger === undefined) {
169
+ errors.push({
170
+ error: "交付执行记录缺少显式触发来源",
171
+ severity: "hard_fail",
172
+ });
173
+ }
174
+ return errors;
175
+ }
176
+ //# sourceMappingURL=delivery_readiness.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delivery_readiness.js","sourceRoot":"","sources":["../../src/engine/delivery_readiness.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * 废弃契约注册表 — 问题二十 (Deprecated Contract)。
3
+ *
4
+ * 管理已废弃契约的生命周期,包括废弃原因、替代方案和迁移路径。
5
+ */
6
+ /** 废弃契约条目 */
7
+ export interface DeprecatedContractEntry {
8
+ /** 契约 ID */
9
+ contract_id: string;
10
+ /** 废弃原因 */
11
+ deprecation_reason: string;
12
+ /** 推荐替代契约 ID */
13
+ replacement_id: string | null;
14
+ /** 废弃时间戳 */
15
+ deprecated_at: string;
16
+ }
17
+ /**
18
+ * 列出所有废弃契约条目。
19
+ */
20
+ export declare function listDeprecatedContracts(): DeprecatedContractEntry[];
21
+ //# sourceMappingURL=deprecated_contract.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deprecated_contract.d.ts","sourceRoot":"","sources":["../../src/engine/deprecated_contract.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,aAAa;AACb,MAAM,WAAW,uBAAuB;IACtC,YAAY;IACZ,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW;IACX,kBAAkB,EAAE,MAAM,CAAC;IAC3B,gBAAgB;IAChB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,YAAY;IACZ,aAAa,EAAE,MAAM,CAAC;CACvB;AAMD;;GAEG;AACH,wBAAgB,uBAAuB,IAAI,uBAAuB,EAAE,CAEnE"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * 废弃契约注册表 — 问题二十 (Deprecated Contract)。
3
+ *
4
+ * 管理已废弃契约的生命周期,包括废弃原因、替代方案和迁移路径。
5
+ */
6
+ // ── 注册表 ──
7
+ const DEPRECATED_CONTRACTS = [];
8
+ /**
9
+ * 列出所有废弃契约条目。
10
+ */
11
+ export function listDeprecatedContracts() {
12
+ return DEPRECATED_CONTRACTS.map((e) => ({ ...e }));
13
+ }
14
+ //# sourceMappingURL=deprecated_contract.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deprecated_contract.js","sourceRoot":"","sources":["../../src/engine/deprecated_contract.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAgBH,YAAY;AAEZ,MAAM,oBAAoB,GAAuC,EAAE,CAAC;AAEpE;;GAEG;AACH,MAAM,UAAU,uBAAuB;IACrC,OAAO,oBAAoB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;AACrD,CAAC"}
@@ -0,0 +1,64 @@
1
+ /**
2
+ * 诊断码注册表 — 问题三十六 (Diagnostic Code Contract)。
3
+ *
4
+ * 核心规则:
5
+ * - 诊断码格式 SF-{AREA}-{NNNN},一旦发布不得复用
6
+ * - blocking/critical 事件没有诊断码不得输出
7
+ * - 每个 active code 必须有 title_zh、user_message_zh、recovery_hint_zh
8
+ * - deprecated/removed code 不得复用
9
+ */
10
+ export type DiagnosticSeverity = "blocking" | "critical" | "warning" | "advisory" | "info";
11
+ export type DiagnosticStatus = "active" | "deprecated" | "removed";
12
+ export type DiagnosticArea = "STATE" | "GUARD" | "VERIFY" | "DELIVER" | "FAILURE" | "DEGRADE" | "WORKSPACE" | "OBSERVE" | "DIAG" | "TEST" | "LANG" | "CONTRACT" | "PRIVACY" | "CMD";
13
+ export interface DiagnosticCodeEntry {
14
+ code: string;
15
+ area: DiagnosticArea;
16
+ severity: DiagnosticSeverity;
17
+ status: DiagnosticStatus;
18
+ title_zh: string;
19
+ user_message_zh: string;
20
+ recovery_hint_zh: string;
21
+ owner_component: string;
22
+ evidence_refs: string[];
23
+ replaced_by?: string;
24
+ }
25
+ export interface DiagnosticEvent {
26
+ code: string;
27
+ occurred_at: string;
28
+ context: Record<string, unknown>;
29
+ user_visible_message: string;
30
+ contract_id?: string;
31
+ task_id?: string;
32
+ }
33
+ /** 按 code 获取诊断码 */
34
+ export declare function getDiagnosticByCode(code: string): DiagnosticCodeEntry | undefined;
35
+ /** 列出所有诊断码 */
36
+ export declare function listAllDiagnostics(): DiagnosticCodeEntry[];
37
+ /** 按领域列出诊断码 */
38
+ export declare function listDiagnosticsByArea(area: DiagnosticArea): DiagnosticCodeEntry[];
39
+ /** 按 severity 列出诊断码 */
40
+ export declare function listDiagnosticsBySeverity(severity: DiagnosticSeverity): DiagnosticCodeEntry[];
41
+ /** 注册新诊断码(运行时) */
42
+ export declare function registerDiagnostic(entry: DiagnosticCodeEntry): {
43
+ success: boolean;
44
+ error?: string;
45
+ };
46
+ /** 创建诊断事件 */
47
+ export declare function createDiagnosticEvent(code: string, context?: Record<string, unknown>, contractId?: string, taskId?: string): DiagnosticEvent | null;
48
+ /** 验证所有 blocking/critical 事件必须有诊断码 */
49
+ export declare function validateDiagnosticCoverage(eventSeverities: Array<{
50
+ severity: DiagnosticSeverity;
51
+ has_code: boolean;
52
+ }>): Array<{
53
+ severity: DiagnosticSeverity;
54
+ error: string;
55
+ }>;
56
+ /** 重置注册表(测试用) */
57
+ export declare function resetDiagnosticRegistry(): void;
58
+ /** 获取诊断码统计 */
59
+ export declare function getDiagnosticStats(): {
60
+ total: number;
61
+ by_area: Record<string, number>;
62
+ by_severity: Record<string, number>;
63
+ };
64
+ //# sourceMappingURL=diagnostic_registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diagnostic_registry.d.ts","sourceRoot":"","sources":["../../src/engine/diagnostic_registry.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,MAAM,MAAM,kBAAkB,GAAG,UAAU,GAAG,UAAU,GAAG,SAAS,GAAG,UAAU,GAAG,MAAM,CAAC;AAC3F,MAAM,MAAM,gBAAgB,GAAG,QAAQ,GAAG,YAAY,GAAG,SAAS,CAAC;AACnE,MAAM,MAAM,cAAc,GACtB,OAAO,GACP,OAAO,GACP,QAAQ,GACR,SAAS,GACT,SAAS,GACT,SAAS,GACT,WAAW,GACX,SAAS,GACT,MAAM,GACN,MAAM,GACN,MAAM,GACN,UAAU,GACV,SAAS,GACT,KAAK,CAAC;AAEV,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,cAAc,CAAC;IACrB,QAAQ,EAAE,kBAAkB,CAAC;IAC7B,MAAM,EAAE,gBAAgB,CAAC;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,eAAe,EAAE,MAAM,CAAC;IACxB,gBAAgB,EAAE,MAAM,CAAC;IACzB,eAAe,EAAE,MAAM,CAAC;IACxB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,oBAAoB,EAAE,MAAM,CAAC;IAC7B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAgGD,mBAAmB;AACnB,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,mBAAmB,GAAG,SAAS,CAEjF;AAED,cAAc;AACd,wBAAgB,kBAAkB,IAAI,mBAAmB,EAAE,CAE1D;AAED,eAAe;AACf,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,cAAc,GAAG,mBAAmB,EAAE,CAEjF;AAED,uBAAuB;AACvB,wBAAgB,yBAAyB,CAAC,QAAQ,EAAE,kBAAkB,GAAG,mBAAmB,EAAE,CAE7F;AAED,kBAAkB;AAClB,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,mBAAmB,GAAG;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAanG;AAED,aAAa;AACb,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACjC,UAAU,CAAC,EAAE,MAAM,EACnB,MAAM,CAAC,EAAE,MAAM,GACd,eAAe,GAAG,IAAI,CAYxB;AAED,sCAAsC;AACtC,wBAAgB,0BAA0B,CAAC,eAAe,EAAE,KAAK,CAAC;IAAE,QAAQ,EAAE,kBAAkB,CAAC;IAAC,QAAQ,EAAE,OAAO,CAAA;CAAE,CAAC,GAAG,KAAK,CAAC;IAAE,QAAQ,EAAE,kBAAkB,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CAW9K;AAED,iBAAiB;AACjB,wBAAgB,uBAAuB,IAAI,IAAI,CAE9C;AAED,cAAc;AACd,wBAAgB,kBAAkB,IAAI;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,CAS5H"}
@@ -0,0 +1,176 @@
1
+ /**
2
+ * 诊断码注册表 — 问题三十六 (Diagnostic Code Contract)。
3
+ *
4
+ * 核心规则:
5
+ * - 诊断码格式 SF-{AREA}-{NNNN},一旦发布不得复用
6
+ * - blocking/critical 事件没有诊断码不得输出
7
+ * - 每个 active code 必须有 title_zh、user_message_zh、recovery_hint_zh
8
+ * - deprecated/removed code 不得复用
9
+ */
10
+ const BUILTIN_DIAGNOSTICS = [
11
+ // STATE 领域
12
+ { code: "SF-STATE-0001", area: "STATE", severity: "blocking", status: "active",
13
+ title_zh: "非法状态转移: failed → completed",
14
+ user_message_zh: "任务已失败,不能直接标记完成。需要人工确认恢复后重新验证。",
15
+ recovery_hint_zh: "检查失败原因,修复后重新执行验证流程。",
16
+ owner_component: "engine/task_context", evidence_refs: ["task_context状态机"] },
17
+ { code: "SF-STATE-0002", area: "STATE", severity: "blocking", status: "active",
18
+ title_zh: "非法状态转移: blocked → completed",
19
+ user_message_zh: "任务被阻断,不能直接标记完成。需要解除阻断条件。",
20
+ recovery_hint_zh: "检查阻断原因,解决阻断条件后重试。",
21
+ owner_component: "engine/task_context", evidence_refs: ["task_context状态机"] },
22
+ { code: "SF-STATE-0003", area: "STATE", severity: "blocking", status: "active",
23
+ title_zh: "非法状态转移: requires_human → completed",
24
+ user_message_zh: "任务需要人工确认,不能自动标记完成。",
25
+ recovery_hint_zh: "等待人工确认后继续。",
26
+ owner_component: "engine/task_context", evidence_refs: ["task_context状态机"] },
27
+ // GUARD 领域
28
+ { code: "SF-GUARD-0001", area: "GUARD", severity: "blocking", status: "active",
29
+ title_zh: "只读工作流写入业务源码",
30
+ user_message_zh: "当前工作流不允许写入业务源码,操作已阻断。",
31
+ recovery_hint_zh: "检查路由是否正确,或切换到允许写入的工作流。",
32
+ owner_component: "engine/enforcement_guard", evidence_refs: ["enforcement_guard写入护栏"] },
33
+ { code: "SF-GUARD-0002", area: "GUARD", severity: "blocking", status: "active",
34
+ title_zh: "超出 output artifact 范围写入",
35
+ user_message_zh: "source_extraction 工作流只能写入指定的 output artifact 路径。",
36
+ recovery_hint_zh: "确认输出路径是否在允许范围内。",
37
+ owner_component: "engine/enforcement_guard", evidence_refs: ["enforcement_guard范围护栏"] },
38
+ // VERIFY 领域
39
+ { code: "SF-VERIFY-0001", area: "VERIFY", severity: "critical", status: "active",
40
+ title_zh: "验证计划被当作验证证据",
41
+ user_message_zh: "检测到只有验证计划没有验证结果。计划不得替代真实执行。",
42
+ recovery_hint_zh: "执行验证命令获取真实结果。",
43
+ owner_component: "engine/verification_contract", evidence_refs: ["verification_contract分离"] },
44
+ { code: "SF-VERIFY-0002", area: "VERIFY", severity: "blocking", status: "active",
45
+ title_zh: "未验证但尝试交付",
46
+ user_message_zh: "任务未通过验证,不允许交付。",
47
+ recovery_hint_zh: "先完成验证流程,确保所有检查通过。",
48
+ owner_component: "engine/delivery_readiness", evidence_refs: ["delivery_readiness门控"] },
49
+ // FAILURE 领域
50
+ { code: "SF-FAILURE-0001", area: "FAILURE", severity: "critical", status: "active",
51
+ title_zh: "重试预算耗尽",
52
+ user_message_zh: "失败重试次数已达上限,需要人工介入。",
53
+ recovery_hint_zh: "检查错误根因,手动修复后重新执行。",
54
+ owner_component: "engine/recovery_policy", evidence_refs: ["recovery_policy预算"] },
55
+ { code: "SF-FAILURE-0002", area: "FAILURE", severity: "warning", status: "active",
56
+ title_zh: "外部副作用部分执行",
57
+ user_message_zh: "检测到外部副作用部分执行,已记录已发生动作。",
58
+ recovery_hint_zh: "检查已执行副作用,确认是否需要回滚。",
59
+ owner_component: "engine/recovery_policy", evidence_refs: ["recovery_policy副作用"] },
60
+ // DEGRADE 领域
61
+ { code: "SF-DEGRADE-0001", area: "DEGRADE", severity: "warning", status: "active",
62
+ title_zh: "验证器不可用,降级运行",
63
+ user_message_zh: "验证器不可用,当前为降级模式。结果未经验证。",
64
+ recovery_hint_zh: "等待验证器恢复后重新验证,或人工确认。",
65
+ owner_component: "engine/degradation", evidence_refs: ["degradation降级"] },
66
+ // WORKSPACE 领域
67
+ { code: "SF-WORKSPACE-0001", area: "WORKSPACE", severity: "blocking", status: "active",
68
+ title_zh: "并发写入冲突",
69
+ user_message_zh: "检测到其他任务正在写入相同文件范围,操作已阻断。",
70
+ recovery_hint_zh: "等待其他任务完成或人工协调写入顺序。",
71
+ owner_component: "engine/workspace_lease", evidence_refs: ["workspace_lease冲突"] },
72
+ // OBSERVE 领域
73
+ { code: "SF-OBSERVE-0001", area: "OBSERVE", severity: "warning", status: "active",
74
+ title_zh: "TaskContext 尝试存储敏感原文",
75
+ user_message_zh: "检测到尝试将敏感信息存入 TaskContext,已自动脱敏。",
76
+ recovery_hint_zh: "确认脱敏后的内容是否满足需求。",
77
+ owner_component: "engine/task_context", evidence_refs: ["task_context边界"] },
78
+ // CONTRACT 领域
79
+ { code: "SF-CONTRACT-0001", area: "CONTRACT", severity: "blocking", status: "active",
80
+ title_zh: "引用已废弃/已移除的契约",
81
+ user_message_zh: "工作流引用了已废弃或已移除的契约,操作已阻断。",
82
+ recovery_hint_zh: "迁移到替代契约或更新工作流配置。",
83
+ owner_component: "engine/contract_registry", evidence_refs: ["contract_registry门控"] },
84
+ // PRIVACY 领域
85
+ { code: "SF-PRIVACY-0001", area: "PRIVACY", severity: "blocking", status: "active",
86
+ title_zh: "命令输出包含敏感信息",
87
+ user_message_zh: "命令执行输出检测到敏感信息,已自动脱敏存储。",
88
+ recovery_hint_zh: "检查脱敏后内容,确认是否需要重新执行。",
89
+ owner_component: "engine/privacy_secret_contract", evidence_refs: ["privacy脱敏"] },
90
+ ];
91
+ let runtimeDiagnostics = null;
92
+ function getRegistry() {
93
+ if (!runtimeDiagnostics) {
94
+ runtimeDiagnostics = new Map();
95
+ for (const entry of BUILTIN_DIAGNOSTICS) {
96
+ runtimeDiagnostics.set(entry.code, { ...entry });
97
+ }
98
+ }
99
+ return runtimeDiagnostics;
100
+ }
101
+ /** 按 code 获取诊断码 */
102
+ export function getDiagnosticByCode(code) {
103
+ return getRegistry().get(code);
104
+ }
105
+ /** 列出所有诊断码 */
106
+ export function listAllDiagnostics() {
107
+ return [...getRegistry().values()];
108
+ }
109
+ /** 按领域列出诊断码 */
110
+ export function listDiagnosticsByArea(area) {
111
+ return [...getRegistry().values()].filter((d) => d.area === area);
112
+ }
113
+ /** 按 severity 列出诊断码 */
114
+ export function listDiagnosticsBySeverity(severity) {
115
+ return [...getRegistry().values()].filter((d) => d.severity === severity);
116
+ }
117
+ /** 注册新诊断码(运行时) */
118
+ export function registerDiagnostic(entry) {
119
+ const registry = getRegistry();
120
+ if (registry.has(entry.code)) {
121
+ return { success: false, error: `诊断码 ${entry.code} 已存在` };
122
+ }
123
+ if (!/^SF-[A-Z]+-\d{4}$/.test(entry.code)) {
124
+ return { success: false, error: `诊断码格式错误: ${entry.code},必须为 SF-{AREA}-{NNNN}` };
125
+ }
126
+ if (!entry.title_zh || !entry.user_message_zh || !entry.recovery_hint_zh) {
127
+ return { success: false, error: "诊断码必须有 title_zh、user_message_zh、recovery_hint_zh" };
128
+ }
129
+ registry.set(entry.code, { ...entry });
130
+ return { success: true };
131
+ }
132
+ /** 创建诊断事件 */
133
+ export function createDiagnosticEvent(code, context, contractId, taskId) {
134
+ const entry = getRegistry().get(code);
135
+ if (!entry)
136
+ return null;
137
+ if (entry.status === "deprecated" || entry.status === "removed")
138
+ return null;
139
+ return {
140
+ code,
141
+ occurred_at: new Date().toISOString(),
142
+ context: context ?? {},
143
+ user_visible_message: entry.user_message_zh,
144
+ contract_id: contractId,
145
+ task_id: taskId,
146
+ };
147
+ }
148
+ /** 验证所有 blocking/critical 事件必须有诊断码 */
149
+ export function validateDiagnosticCoverage(eventSeverities) {
150
+ const errors = [];
151
+ for (const event of eventSeverities) {
152
+ if ((event.severity === "blocking" || event.severity === "critical") && !event.has_code) {
153
+ errors.push({
154
+ severity: event.severity,
155
+ error: `${event.severity} 事件缺少诊断码`,
156
+ });
157
+ }
158
+ }
159
+ return errors;
160
+ }
161
+ /** 重置注册表(测试用) */
162
+ export function resetDiagnosticRegistry() {
163
+ runtimeDiagnostics = null;
164
+ }
165
+ /** 获取诊断码统计 */
166
+ export function getDiagnosticStats() {
167
+ const entries = [...getRegistry().values()];
168
+ const by_area = {};
169
+ const by_severity = {};
170
+ for (const e of entries) {
171
+ by_area[e.area] = (by_area[e.area] ?? 0) + 1;
172
+ by_severity[e.severity] = (by_severity[e.severity] ?? 0) + 1;
173
+ }
174
+ return { total: entries.length, by_area, by_severity };
175
+ }
176
+ //# sourceMappingURL=diagnostic_registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diagnostic_registry.js","sourceRoot":"","sources":["../../src/engine/diagnostic_registry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,84 @@
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 { type DiagnosticEvent } from "./diagnostic_registry.js";
10
+ export type GuardType = "write" | "state" | "knowledge_injection" | "execution" | "external_side_effect" | "prompt" | "delivery";
11
+ export type GuardAction = "block" | "warn" | "require_human" | "downgrade";
12
+ export interface EnforcementGuardEntry {
13
+ guard_id: string;
14
+ guard_type: GuardType;
15
+ enforced: boolean;
16
+ trigger_description: string;
17
+ block_condition: string;
18
+ allow_condition: string;
19
+ failure_behavior: GuardAction;
20
+ contract_id: string;
21
+ diagnostic_code: string;
22
+ human_gate?: string[];
23
+ required_context: string[];
24
+ }
25
+ export interface GuardFinding {
26
+ guard_id: string;
27
+ contract_id: string;
28
+ diagnostic_code: string;
29
+ severity: "hard_fail" | "warning" | "advisory";
30
+ action: GuardAction;
31
+ reason_zh: string;
32
+ blocked: boolean;
33
+ diagnostic_event: DiagnosticEvent | null;
34
+ }
35
+ export interface GuardEvaluationReport {
36
+ evaluated_at: string;
37
+ workflow_id: string;
38
+ route: string;
39
+ mutation_allowed: boolean;
40
+ evaluated_guards: string[];
41
+ allowed: string[];
42
+ blocked: GuardFinding[];
43
+ warnings: GuardFinding[];
44
+ human_required: GuardFinding[];
45
+ }
46
+ /** 列出所有护栏 */
47
+ export declare function listAllGuards(): EnforcementGuardEntry[];
48
+ /** 按类型列出护栏 */
49
+ export declare function listGuardsByType(type: GuardType): EnforcementGuardEntry[];
50
+ /** 注册新护栏(运行时) */
51
+ export declare function registerGuard(entry: EnforcementGuardEntry): {
52
+ success: boolean;
53
+ error?: string;
54
+ };
55
+ /**
56
+ * 评估写入护栏。
57
+ * 检查 route 和 target_path 是否违反写入规则。
58
+ */
59
+ export declare function evaluateWriteGuard(route: string, targetPath: string, outputArtifactPaths: string[], contractId: string): GuardFinding[];
60
+ /**
61
+ * 评估状态护栏。
62
+ * 检查状态转移是否合法。
63
+ */
64
+ export declare function evaluateStateGuard(currentStatus: string, targetStatus: string, contractId: string): GuardFinding[];
65
+ /**
66
+ * 生成完整护栏评估报告。
67
+ */
68
+ export declare function generateGuardEvaluationReport(workflowId: string, route: string, mutationAllowed: boolean, guardIds: string[]): GuardEvaluationReport;
69
+ /**
70
+ * 校验所有 guard 的 contract_id 是否存在于 Contract Registry。
71
+ */
72
+ export declare function validateGuardContractIds(contractExistsFn: (id: string) => boolean): Array<{
73
+ guard_id: string;
74
+ contract_id: string;
75
+ severity: "hard_fail";
76
+ }>;
77
+ /**
78
+ * 评估交付就绪护栏。
79
+ * 检查交付是否由 sf_deliver 显式触发,验证结果是否满足交付条件。
80
+ */
81
+ export declare function evaluateDeliveryReadinessGuard(verificationResult: import("./verification_contract.js").VerificationResult | undefined, verificationPlan: import("./verification_contract.js").VerificationPlan | undefined): GuardFinding[];
82
+ /** 重置注册表(测试用) */
83
+ export declare function resetGuardRegistry(): void;
84
+ //# sourceMappingURL=enforcement_guard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"enforcement_guard.d.ts","sourceRoot":"","sources":["../../src/engine/enforcement_guard.ts"],"names":[],"mappings":"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"}