soloforge 1.3.1 → 1.3.2

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 (118) hide show
  1. package/README.md +6 -3
  2. package/dist/adapters/claude_code/claude_md.d.ts.map +1 -1
  3. package/dist/adapters/claude_code/claude_md.js +4 -0
  4. package/dist/adapters/claude_code/claude_md.js.map +1 -1
  5. package/dist/adapters/claude_code/tools.d.ts +10 -10
  6. package/dist/adapters/claude_code/tools.d.ts.map +1 -1
  7. package/dist/adapters/claude_code/tools.js +317 -18
  8. package/dist/adapters/claude_code/tools.js.map +1 -1
  9. package/dist/adapters/shared/workflow_template.d.ts +26 -0
  10. package/dist/adapters/shared/workflow_template.d.ts.map +1 -1
  11. package/dist/adapters/shared/workflow_template.js +139 -46
  12. package/dist/adapters/shared/workflow_template.js.map +1 -1
  13. package/dist/bin/soloforge.d.ts.map +1 -1
  14. package/dist/bin/soloforge.js +85 -53
  15. package/dist/bin/soloforge.js.map +1 -1
  16. package/dist/engine/asset_manifest.d.ts +7 -1
  17. package/dist/engine/asset_manifest.d.ts.map +1 -1
  18. package/dist/engine/asset_manifest.js +28 -18
  19. package/dist/engine/asset_manifest.js.map +1 -1
  20. package/dist/engine/consumable_asset_registry.d.ts.map +1 -1
  21. package/dist/engine/consumable_asset_registry.js +26 -0
  22. package/dist/engine/consumable_asset_registry.js.map +1 -1
  23. package/dist/engine/consumption_trace_store.d.ts +8 -8
  24. package/dist/engine/consumption_trace_store.d.ts.map +1 -1
  25. package/dist/engine/consumption_trace_store.js +11 -7
  26. package/dist/engine/consumption_trace_store.js.map +1 -1
  27. package/dist/engine/decision_workshop.d.ts +160 -0
  28. package/dist/engine/decision_workshop.d.ts.map +1 -0
  29. package/dist/engine/decision_workshop.js +279 -0
  30. package/dist/engine/decision_workshop.js.map +1 -0
  31. package/dist/engine/dual_layer_mechanism_registry.d.ts.map +1 -1
  32. package/dist/engine/dual_layer_mechanism_registry.js +176 -2
  33. package/dist/engine/dual_layer_mechanism_registry.js.map +1 -1
  34. package/dist/engine/explicit_asset_registry.d.ts +30 -0
  35. package/dist/engine/explicit_asset_registry.d.ts.map +1 -0
  36. package/dist/engine/explicit_asset_registry.js +3508 -0
  37. package/dist/engine/explicit_asset_registry.js.map +1 -0
  38. package/dist/engine/implementation_roadmap_registry.d.ts +2 -2
  39. package/dist/engine/implementation_roadmap_registry.d.ts.map +1 -1
  40. package/dist/engine/implementation_roadmap_registry.js +44 -16
  41. package/dist/engine/implementation_roadmap_registry.js.map +1 -1
  42. package/dist/engine/intent_expander.d.ts.map +1 -1
  43. package/dist/engine/intent_expander.js +46 -2
  44. package/dist/engine/intent_expander.js.map +1 -1
  45. package/dist/engine/intent_router.d.ts +1 -1
  46. package/dist/engine/intent_router.d.ts.map +1 -1
  47. package/dist/engine/intent_router.js +2 -1
  48. package/dist/engine/intent_router.js.map +1 -1
  49. package/dist/engine/knowledge_injection_boundary.d.ts +3 -0
  50. package/dist/engine/knowledge_injection_boundary.d.ts.map +1 -1
  51. package/dist/engine/knowledge_injection_boundary.js +48 -5
  52. package/dist/engine/knowledge_injection_boundary.js.map +1 -1
  53. package/dist/engine/mechanism_contract_registry.d.ts +1 -1
  54. package/dist/engine/mechanism_contract_registry.d.ts.map +1 -1
  55. package/dist/engine/mechanism_contract_registry.js +74 -2
  56. package/dist/engine/mechanism_contract_registry.js.map +1 -1
  57. package/dist/engine/observed_consumption.d.ts +54 -0
  58. package/dist/engine/observed_consumption.d.ts.map +1 -0
  59. package/dist/engine/observed_consumption.js +377 -0
  60. package/dist/engine/observed_consumption.js.map +1 -0
  61. package/dist/engine/release_issue_scenario_registry.d.ts +64 -0
  62. package/dist/engine/release_issue_scenario_registry.d.ts.map +1 -0
  63. package/dist/engine/release_issue_scenario_registry.js +1349 -0
  64. package/dist/engine/release_issue_scenario_registry.js.map +1 -0
  65. package/dist/engine/release_readiness_gate.d.ts +1 -1
  66. package/dist/engine/release_readiness_gate.d.ts.map +1 -1
  67. package/dist/engine/release_readiness_gate.js +574 -46
  68. package/dist/engine/release_readiness_gate.js.map +1 -1
  69. package/dist/engine/release_tool_harness.d.ts +71 -0
  70. package/dist/engine/release_tool_harness.d.ts.map +1 -0
  71. package/dist/engine/release_tool_harness.js +161 -0
  72. package/dist/engine/release_tool_harness.js.map +1 -0
  73. package/dist/engine/scaffolder.d.ts.map +1 -1
  74. package/dist/engine/scaffolder.js +144 -7
  75. package/dist/engine/scaffolder.js.map +1 -1
  76. package/dist/engine/standard_asset_contract.d.ts +75 -0
  77. package/dist/engine/standard_asset_contract.d.ts.map +1 -0
  78. package/dist/engine/standard_asset_contract.js +388 -0
  79. package/dist/engine/standard_asset_contract.js.map +1 -0
  80. package/dist/engine/standard_asset_coverage.d.ts +45 -0
  81. package/dist/engine/standard_asset_coverage.d.ts.map +1 -0
  82. package/dist/engine/standard_asset_coverage.js +220 -0
  83. package/dist/engine/standard_asset_coverage.js.map +1 -0
  84. package/dist/engine/template_asset_contract_registry.d.ts +162 -0
  85. package/dist/engine/template_asset_contract_registry.d.ts.map +1 -0
  86. package/dist/engine/template_asset_contract_registry.js +598 -0
  87. package/dist/engine/template_asset_contract_registry.js.map +1 -0
  88. package/dist/engine/template_asset_visibility.d.ts +109 -0
  89. package/dist/engine/template_asset_visibility.d.ts.map +1 -0
  90. package/dist/engine/template_asset_visibility.js +321 -0
  91. package/dist/engine/template_asset_visibility.js.map +1 -0
  92. package/dist/engine/template_init_sync.d.ts +68 -0
  93. package/dist/engine/template_init_sync.d.ts.map +1 -0
  94. package/dist/engine/template_init_sync.js +218 -0
  95. package/dist/engine/template_init_sync.js.map +1 -0
  96. package/dist/engine/template_manifest_io.d.ts +10 -0
  97. package/dist/engine/template_manifest_io.d.ts.map +1 -1
  98. package/dist/engine/template_manifest_io.js +63 -30
  99. package/dist/engine/template_manifest_io.js.map +1 -1
  100. package/dist/engine/template_mechanism_auditor.d.ts +3 -1
  101. package/dist/engine/template_mechanism_auditor.d.ts.map +1 -1
  102. package/dist/engine/template_mechanism_auditor.js +27 -24
  103. package/dist/engine/template_mechanism_auditor.js.map +1 -1
  104. package/dist/engine/tool_invocation_contract_registry.d.ts.map +1 -1
  105. package/dist/engine/tool_invocation_contract_registry.js +11 -1
  106. package/dist/engine/tool_invocation_contract_registry.js.map +1 -1
  107. package/dist/knowledge/index_manager.d.ts +20 -0
  108. package/dist/knowledge/index_manager.d.ts.map +1 -1
  109. package/dist/knowledge/index_manager.js +234 -3
  110. package/dist/knowledge/index_manager.js.map +1 -1
  111. package/dist/types.d.ts +36 -1
  112. package/dist/types.d.ts.map +1 -1
  113. package/package.json +2 -2
  114. package/templates/knowledge/rules//346/240/207/345/207/206/350/265/204/344/272/247/350/246/206/347/233/226/350/247/204/345/210/231.md +29 -0
  115. package/templates/knowledge/rules//346/250/241/346/235/277/350/265/204/344/272/247/345/217/257/350/247/201/346/200/247/350/247/204/345/210/231.md +27 -0
  116. package/templates/knowledge/rules//347/224/250/346/210/267/345/217/215/351/246/210/345/245/221/347/272/246/350/247/204/345/210/231.md +62 -1
  117. package/templates/knowledge/rules//351/200/232/347/224/250/345/206/263/347/255/226/347/240/224/350/256/250/350/247/204/345/210/231.md +30 -0
  118. package/templates/knowledge/rules//351/252/214/346/224/266/346/250/241/346/235/277/350/276/223/345/207/272/345/245/221/347/272/246/350/247/204/345/210/231.md +50 -0
@@ -0,0 +1,377 @@
1
+ /**
2
+ * 逐资产运行时消费证据 — 由真实生产入口函数执行产生 trace。
3
+ *
4
+ * 调用真实生产模块(template_init_sync、template_manifest_io、scaffolder、
5
+ * intent_expander、claude_md、index_manager),收集 consumption_trace_store 中的 trace,
6
+ * 验证每个注册资产都有对应 consume_category 要求的真实 consumer trace。
7
+ *
8
+ * mainline 资产: 按 mainline_consumer 字段映射到真实 trace consumer,
9
+ * 而非统一使用 category 级别检查。
10
+ *
11
+ * 禁止:从合同声明字段直接复制 selected/pass。
12
+ * 禁止:以"文件存在"或"export 存在"作为消费证据。
13
+ * 禁止:自行遍历文件后伪写 consumer="verified_consumer" 的模拟证据。
14
+ * 禁止:用 contract_gate 为未运行资产补"消费通过"逻辑。
15
+ * 禁止:有任意 trace 即 pass 的宽松分支。
16
+ */
17
+ import path from "node:path";
18
+ import fs from "node:fs";
19
+ import os from "node:os";
20
+ import { getConsumptionTraces, clearConsumptionTraces, getTraceCounts, } from "./consumption_trace_store.js";
21
+ import { buildTemplateAssetContracts, getContractDecision, clearContractCache, } from "./template_asset_contract_registry.js";
22
+ /**
23
+ * mainline_consumer 字段 → 合法的真实 trace consumer(单精确匹配)。
24
+ *
25
+ * 每个 mainline 资产只能由对应入口函数产生的 trace 验证,
26
+ * trace 必须携带 declared_consumer 与合同 mainline_consumer 精确对应。
27
+ * 禁止跨入口替代:不得用 init/knowledge_index 代替专项消费者。
28
+ */
29
+ const MAINLINE_CONSUMER_TRACE_MAP = {
30
+ "soloforge.copyGlobalPatterns": "init",
31
+ "intent_expander.loadBuiltinByPipeline": "expander",
32
+ "intent_expander.queryKnowledgeForRoute": "expander",
33
+ "claude_md.generateClaudeMd": "adapter_prompt",
34
+ "scaffolder.generateScaffold": "scaffold",
35
+ "knowledge_asset_consumer.consumeForRouter": "knowledge_index",
36
+ "knowledge_config_loader.loadKnowledgeConfig": "knowledge_index",
37
+ "knowledge_manager.addKnowledge": "knowledge_index",
38
+ "template_mechanism_auditor": "knowledge_index",
39
+ "code_reviewer.classifyFindingsByTrust": "knowledge_index",
40
+ };
41
+ /** consume_category → 必须由这些 consumer 之一产生真实 trace(非 mainline 类别) */
42
+ const REQUIRED_CONSUMERS = {
43
+ copy_only: ["init", "sync_templates"],
44
+ scaffold_only: ["scaffold"],
45
+ internal_runtime: [], // 由合同门禁拒绝验证
46
+ audit_only: [], // 由合同门禁拒绝验证
47
+ };
48
+ /**
49
+ * 运行真实 init scenario: 调用共享模板同步模块。
50
+ */
51
+ async function runRealInitScenario(rootDir, tmpDir) {
52
+ const { copyKnowledgeToProject, copyPatternsToGlobal } = await import("./template_init_sync.js");
53
+ await copyKnowledgeToProject(rootDir, tmpDir);
54
+ const globalDir = path.join(tmpDir, ".soloforge", "patterns");
55
+ await copyPatternsToGlobal(rootDir, globalDir);
56
+ }
57
+ /**
58
+ * 运行真实 sync-templates scenario: 调用 buildTemplateManifestWithStats。
59
+ */
60
+ async function runRealSyncScenario(rootDir) {
61
+ const { buildTemplateManifestWithStats } = await import("./template_manifest_io.js");
62
+ const templatesDir = path.join(rootDir, "templates");
63
+ if (!fs.existsSync(templatesDir))
64
+ return;
65
+ buildTemplateManifestWithStats(templatesDir, "0.0.0");
66
+ }
67
+ /**
68
+ * 运行真实 scaffold scenario: 调用 generateScaffold。
69
+ */
70
+ async function runRealScaffoldScenario(rootDir) {
71
+ const { generateScaffold } = await import("./scaffolder.js");
72
+ try {
73
+ await generateScaffold({
74
+ intent: "新建订单模块",
75
+ classification: { task_type: "new_feature", risk: "low", complexity: "medium", ambiguity: "none", affected_repos: [], mode: "autonomous", strategy: "full_pipeline" },
76
+ config: { tech_stack: { backend: { framework: "spring" }, frontend: { framework: "react" } } },
77
+ projectPath: rootDir,
78
+ });
79
+ }
80
+ catch {
81
+ // scaffold 可能因缺少模板目录而失败,不影响 trace 收集
82
+ }
83
+ }
84
+ /**
85
+ * 运行真实 adapter prompt scenario: 调用 generateClaudeMd。
86
+ * generateClaudeMd 内部调用 listConsumableAssetsByConsumer 并记录 adapter_prompt trace。
87
+ */
88
+ async function runRealAdapterPromptScenario() {
89
+ const { generateClaudeMd } = await import("../adapters/claude_code/claude_md.js");
90
+ const config = {
91
+ name: "observe-scenario",
92
+ tech_stack: {
93
+ backend: { lang: "java", framework: "spring-boot", version: "3.x" },
94
+ frontend: { lang: "ts", framework: "react", version: "18" },
95
+ },
96
+ product_profile: "saas",
97
+ repos: [],
98
+ build_commands: {
99
+ backend: { build: "mvn compile", test: "mvn test", full: "mvn verify" },
100
+ frontend: { build: "npm run build", test: "npm test", full: "npm run build && npm test" },
101
+ },
102
+ scope: { backend: ["src/"], frontend: ["src/"] },
103
+ };
104
+ generateClaudeMd(config);
105
+ }
106
+ /**
107
+ * 运行真实 expander scenario: 调用 expand()。
108
+ * expand 内部调用 listConsumableAssetsByConsumer("intent_expander") 并记录 expander trace。
109
+ */
110
+ async function runRealExpanderScenario(rootDir, tmpDir) {
111
+ const { KnowledgeIndexManager } = await import("../knowledge/index_manager.js");
112
+ const { expand } = await import("./intent_expander.js");
113
+ const config = {
114
+ name: "observe-scenario",
115
+ tech_stack: {
116
+ backend: { lang: "java", framework: "spring-boot", version: "3.x" },
117
+ frontend: { lang: "ts", framework: "react", version: "18" },
118
+ },
119
+ product_profile: "saas",
120
+ repos: [],
121
+ build_commands: {
122
+ backend: { build: "mvn compile", test: "mvn test", full: "mvn verify" },
123
+ frontend: { build: "npm run build", test: "npm test", full: "npm run build && npm test" },
124
+ },
125
+ scope: { backend: ["src/"], frontend: ["src/"] },
126
+ _projectPath: tmpDir,
127
+ };
128
+ const kim = new KnowledgeIndexManager(config, { watch: false });
129
+ try {
130
+ await kim.build();
131
+ await expand({
132
+ intent: "修复按钮文字拼写错误",
133
+ classification: {
134
+ task_type: "code_change",
135
+ risk: "low",
136
+ complexity: "low",
137
+ ambiguity: "none",
138
+ affected_repos: [],
139
+ mode: "autonomous",
140
+ strategy: "quick_fix",
141
+ },
142
+ projectPath: tmpDir,
143
+ config,
144
+ knowledgeIndex: kim,
145
+ });
146
+ }
147
+ catch {
148
+ // expand 可能因缺少完整上下文而失败,trace 在失败前已记录
149
+ }
150
+ finally {
151
+ await kim.close();
152
+ }
153
+ }
154
+ /**
155
+ * 生成全量逐资产运行时消费观察报告。
156
+ *
157
+ * 运行真实生产入口函数,收集 trace,与权威合同注册表交叉验证。
158
+ * mainline 资产按 mainline_consumer 映射到真实 trace consumer;
159
+ * 其他类别按 consume_category 要求特定 consumer 的真实 trace。
160
+ */
161
+ export async function observeAllConsumption(rootDir, _techStack) {
162
+ clearContractCache();
163
+ clearConsumptionTraces();
164
+ const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), "soloforge-obs-"));
165
+ const contracts = buildTemplateAssetContracts(rootDir);
166
+ try {
167
+ await runRealInitScenario(rootDir, tmpDir);
168
+ await runRealSyncScenario(rootDir);
169
+ await runRealScaffoldScenario(rootDir);
170
+ await runRealAdapterPromptScenario();
171
+ await runRealExpanderScenario(rootDir, tmpDir);
172
+ }
173
+ finally {
174
+ fs.rmSync(tmpDir, { recursive: true, force: true });
175
+ }
176
+ // 收集所有 trace,按 asset_path 聚合
177
+ const traces = getConsumptionTraces();
178
+ const traceByPath = new Map();
179
+ for (const t of traces) {
180
+ if (t.asset_path) {
181
+ const arr = traceByPath.get(t.asset_path) ?? [];
182
+ arr.push(t);
183
+ traceByPath.set(t.asset_path, arr);
184
+ }
185
+ }
186
+ // 与权威合同交叉验证
187
+ const observations = [];
188
+ const failures = [];
189
+ let passCount = 0;
190
+ let failCount = 0;
191
+ let syncedCount = 0;
192
+ let indexedCount = 0;
193
+ let injectedCount = 0;
194
+ let blockedCount = 0;
195
+ let skippedInternal = 0;
196
+ let skippedUnregistered = 0;
197
+ for (const contract of contracts) {
198
+ const assetTraces = traceByPath.get(contract.path) ?? [];
199
+ const rv = contract.runtime_visibility;
200
+ // internal_runtime/audit_only: 必须验证合同门禁正确拒绝
201
+ if (contract.consume_category === "internal_runtime" || contract.consume_category === "audit_only") {
202
+ const decision = getContractDecision(contract.path);
203
+ const correctlyDenied = decision.decision === "denied";
204
+ if (!correctlyDenied) {
205
+ failCount++;
206
+ blockedCount++;
207
+ const reason = `${contract.path}: ${contract.consume_category} 资产未被正确拒绝(decision=${decision.decision})`;
208
+ failures.push(reason);
209
+ observations.push({
210
+ asset_path: contract.path,
211
+ contract_id: contract.asset_id,
212
+ consume_category: contract.consume_category,
213
+ runtime_visibility: rv,
214
+ entry_point: "contract_gate",
215
+ contract_decision: decision.decision,
216
+ trace_count: assetTraces.length,
217
+ validation_result: "fail",
218
+ failure_reason: reason,
219
+ });
220
+ }
221
+ else {
222
+ skippedInternal++;
223
+ blockedCount++;
224
+ observations.push({
225
+ asset_path: contract.path,
226
+ contract_id: contract.asset_id,
227
+ consume_category: contract.consume_category,
228
+ runtime_visibility: rv,
229
+ entry_point: "contract_gate",
230
+ contract_decision: "denied",
231
+ trace_count: assetTraces.length,
232
+ validation_result: "pass",
233
+ });
234
+ }
235
+ continue;
236
+ }
237
+ // mainline: trace 的 declared_consumer 必须与合同 mainline_consumer 精确匹配
238
+ if (contract.consume_category === "mainline") {
239
+ const expectedConsumer = MAINLINE_CONSUMER_TRACE_MAP[contract.mainline_consumer];
240
+ if (!expectedConsumer) {
241
+ failCount++;
242
+ const reason = `${contract.path}: mainline_consumer="${contract.mainline_consumer}" 无真实 trace consumer 映射`;
243
+ failures.push(reason);
244
+ observations.push({
245
+ asset_path: contract.path,
246
+ contract_id: contract.asset_id,
247
+ consume_category: contract.consume_category,
248
+ runtime_visibility: rv,
249
+ entry_point: "none",
250
+ contract_decision: "unregistered",
251
+ trace_count: assetTraces.length,
252
+ validation_result: "fail",
253
+ failure_reason: reason,
254
+ });
255
+ continue;
256
+ }
257
+ // 精确匹配: declared_consumer === mainline_consumer 且 consumer 类型正确
258
+ const validTrace = assetTraces.find(t => t.consumer === expectedConsumer && t.declared_consumer === contract.mainline_consumer);
259
+ if (!validTrace) {
260
+ failCount++;
261
+ const actualConsumers = assetTraces.map(t => `${t.consumer}(declared=${t.declared_consumer ?? "none"})`);
262
+ const reason = `${contract.path}: 无精确消费 trace(mainline_consumer=${contract.mainline_consumer},需 consumer=${expectedConsumer} declared_consumer=${contract.mainline_consumer},实际 [${actualConsumers.join(", ")}])`;
263
+ failures.push(reason);
264
+ observations.push({
265
+ asset_path: contract.path,
266
+ contract_id: contract.asset_id,
267
+ consume_category: contract.consume_category,
268
+ runtime_visibility: rv,
269
+ entry_point: actualConsumers[0] ?? "none",
270
+ contract_decision: "unregistered",
271
+ trace_count: assetTraces.length,
272
+ validation_result: "fail",
273
+ failure_reason: reason,
274
+ });
275
+ continue;
276
+ }
277
+ passCount++;
278
+ // 按 runtime_visibility 分类计数
279
+ if (rv === "injectable")
280
+ injectedCount++;
281
+ else if (rv === "index_only")
282
+ indexedCount++;
283
+ observations.push({
284
+ asset_path: contract.path,
285
+ contract_id: contract.asset_id,
286
+ consume_category: contract.consume_category,
287
+ runtime_visibility: rv,
288
+ entry_point: validTrace.consumer,
289
+ contract_decision: validTrace.contract_decision ?? "allowed",
290
+ trace_count: assetTraces.length,
291
+ validation_result: "pass",
292
+ });
293
+ continue;
294
+ }
295
+ // 其他类别: 按 REQUIRED_CONSUMERS 查找
296
+ const requiredConsumers = REQUIRED_CONSUMERS[contract.consume_category];
297
+ if (!requiredConsumers || requiredConsumers.length === 0) {
298
+ passCount++;
299
+ // 按 runtime_visibility 分类计数
300
+ if (rv === "injectable")
301
+ injectedCount++;
302
+ else if (rv === "index_only")
303
+ indexedCount++;
304
+ else if (rv === "internal_only" || rv === "scaffold_only")
305
+ blockedCount++;
306
+ observations.push({
307
+ asset_path: contract.path,
308
+ contract_id: contract.asset_id,
309
+ consume_category: contract.consume_category,
310
+ runtime_visibility: rv,
311
+ entry_point: "none_required",
312
+ contract_decision: "allowed",
313
+ trace_count: assetTraces.length,
314
+ validation_result: "pass",
315
+ });
316
+ continue;
317
+ }
318
+ const validTrace = assetTraces.find(t => requiredConsumers.includes(t.consumer));
319
+ if (!validTrace) {
320
+ failCount++;
321
+ const reason = `${contract.path}: 无合法消费 trace(consume_category=${contract.consume_category},需 ${requiredConsumers.join("|")},实际 consumer=[${assetTraces.map(t => t.consumer).join(",")}])`;
322
+ failures.push(reason);
323
+ observations.push({
324
+ asset_path: contract.path,
325
+ contract_id: contract.asset_id,
326
+ consume_category: contract.consume_category,
327
+ runtime_visibility: rv,
328
+ entry_point: assetTraces[0]?.consumer ?? "none",
329
+ contract_decision: "unregistered",
330
+ trace_count: assetTraces.length,
331
+ validation_result: "fail",
332
+ failure_reason: reason,
333
+ });
334
+ continue;
335
+ }
336
+ passCount++;
337
+ // copy_only 资产由 init/sync 入口消费
338
+ if (contract.consume_category === "copy_only")
339
+ syncedCount++;
340
+ else if (rv === "injectable")
341
+ injectedCount++;
342
+ else if (rv === "index_only")
343
+ indexedCount++;
344
+ observations.push({
345
+ asset_path: contract.path,
346
+ contract_id: contract.asset_id,
347
+ consume_category: contract.consume_category,
348
+ runtime_visibility: rv,
349
+ entry_point: validTrace.consumer,
350
+ contract_decision: validTrace.contract_decision ?? "allowed",
351
+ trace_count: assetTraces.length,
352
+ validation_result: "pass",
353
+ });
354
+ }
355
+ // 检查未注册文件
356
+ const registeredPaths = new Set(contracts.map(c => c.path));
357
+ for (const [assetPath, tArr] of traceByPath) {
358
+ if (!registeredPaths.has(assetPath) && tArr.some(t => t.contract_decision === "unregistered")) {
359
+ skippedUnregistered++;
360
+ }
361
+ }
362
+ return {
363
+ total: observations.length,
364
+ pass: passCount,
365
+ fail: failCount,
366
+ synced: syncedCount,
367
+ indexed: indexedCount,
368
+ injected: injectedCount,
369
+ blocked: blockedCount,
370
+ skipped_internal: skippedInternal,
371
+ skipped_unregistered: skippedUnregistered,
372
+ observations,
373
+ failures,
374
+ trace_counts: getTraceCounts(),
375
+ };
376
+ }
377
+ //# sourceMappingURL=observed_consumption.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"observed_consumption.js","sourceRoot":"","sources":["../../src/engine/observed_consumption.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,64 @@
1
+ /**
2
+ * 发布问题场景注册表 — 结构化场景定义 + 真实生产入口执行证据。
3
+ *
4
+ * R11: 所有 MCP 工具链场景使用 ToolInvocationObservation 记录。
5
+ * 确认通过 sf_expand 的 decision_workshop / architecture_decision_workshop 输入,
6
+ * 不再直接修改 TaskContext 确认研讨域。
7
+ */
8
+ export interface ScenarioExecutionResult {
9
+ scenario_id: string;
10
+ status: "pass" | "fail";
11
+ evidence?: string;
12
+ error?: string;
13
+ duration_ms?: number;
14
+ /** 真实入口 trace: 由 ToolInvocationObservation 生成 */
15
+ production_trace?: {
16
+ tool_entrypoint: string;
17
+ diagnostic_codes: string[];
18
+ gates_consumed: string[];
19
+ };
20
+ behavioral_proof?: {
21
+ task_id: string;
22
+ blocked_task_id?: string;
23
+ delivered_task_id?: string;
24
+ contract_blocked?: boolean;
25
+ repair_directive_cleared?: boolean;
26
+ artifact_status?: string;
27
+ acceptance_confirmation_ref?: string;
28
+ delivery_succeeded?: boolean;
29
+ };
30
+ }
31
+ export interface ScenarioEntry {
32
+ scenario_id: string;
33
+ covering_problem: string;
34
+ test_files: string[];
35
+ /** 真实生产入口标识 */
36
+ production_entrypoint: string;
37
+ /** 明确的预期结果描述 */
38
+ expected_outcome: string;
39
+ /** 执行函数: 运行真实生产逻辑产生执行证据 */
40
+ runner: () => Promise<ScenarioExecutionResult>;
41
+ }
42
+ /** 获取全量场景定义 */
43
+ export declare function getReleaseIssueScenarios(): ScenarioEntry[];
44
+ /**
45
+ * 验证 发布问题场景覆盖:
46
+ * - 所有场景必须有 runner + production_entrypoint + expected_outcome
47
+ * - 所有引用测试文件的场景: 测试文件必须存在
48
+ * - 返回结构化验证结果
49
+ */
50
+ export declare function validateReleaseIssueScenarios(rootDir: string): {
51
+ valid: boolean;
52
+ missing_tests: string[];
53
+ missing_runners: string[];
54
+ missing_entrypoints: string[];
55
+ tautology_suspects: string[];
56
+ scenario_count: number;
57
+ covered_problems: string[];
58
+ };
59
+ /**
60
+ * 运行所有场景,收集执行证据。
61
+ * 每个场景必须有 runner,无 runner 视为 fail。
62
+ */
63
+ export declare function executeReleaseIssueScenarios(): Promise<ScenarioExecutionResult[]>;
64
+ //# sourceMappingURL=release_issue_scenario_registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"release_issue_scenario_registry.d.ts","sourceRoot":"","sources":["../../src/engine/release_issue_scenario_registry.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAMH,MAAM,WAAW,uBAAuB;IACtC,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC;IACxB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,iDAAiD;IACjD,gBAAgB,CAAC,EAAE;QACjB,eAAe,EAAE,MAAM,CAAC;QACxB,gBAAgB,EAAE,MAAM,EAAE,CAAC;QAC3B,cAAc,EAAE,MAAM,EAAE,CAAC;KAC1B,CAAC;IACF,gBAAgB,CAAC,EAAE;QACjB,OAAO,EAAE,MAAM,CAAC;QAChB,eAAe,CAAC,EAAE,MAAM,CAAC;QACzB,iBAAiB,CAAC,EAAE,MAAM,CAAC;QAC3B,gBAAgB,CAAC,EAAE,OAAO,CAAC;QAC3B,wBAAwB,CAAC,EAAE,OAAO,CAAC;QACnC,eAAe,CAAC,EAAE,MAAM,CAAC;QACzB,2BAA2B,CAAC,EAAE,MAAM,CAAC;QACrC,kBAAkB,CAAC,EAAE,OAAO,CAAC;KAC9B,CAAC;CACH;AAED,MAAM,WAAW,aAAa;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,gBAAgB,EAAE,MAAM,CAAC;IACzB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,eAAe;IACf,qBAAqB,EAAE,MAAM,CAAC;IAC9B,gBAAgB;IAChB,gBAAgB,EAAE,MAAM,CAAC;IACzB,2BAA2B;IAC3B,MAAM,EAAE,MAAM,OAAO,CAAC,uBAAuB,CAAC,CAAC;CAChD;AAyzCD,eAAe;AACf,wBAAgB,wBAAwB,IAAI,aAAa,EAAE,CAE1D;AAED;;;;;GAKG;AACH,wBAAgB,6BAA6B,CAC3C,OAAO,EAAE,MAAM,GACd;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,aAAa,EAAE,MAAM,EAAE,CAAC;IAAC,eAAe,EAAE,MAAM,EAAE,CAAC;IAAC,mBAAmB,EAAE,MAAM,EAAE,CAAC;IAAC,kBAAkB,EAAE,MAAM,EAAE,CAAC;IAAC,cAAc,EAAE,MAAM,CAAC;IAAC,gBAAgB,EAAE,MAAM,EAAE,CAAA;CAAE,CAqCzL;AAED;;;GAGG;AACH,wBAAsB,4BAA4B,IAAI,OAAO,CAAC,uBAAuB,EAAE,CAAC,CAavF"}