soloforge 1.3.4 → 1.3.5

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 (96) hide show
  1. package/README.md +12 -5
  2. package/dist/adapters/claude_code/tools.d.ts.map +1 -1
  3. package/dist/adapters/claude_code/tools.js +80 -44
  4. package/dist/adapters/claude_code/tools.js.map +1 -1
  5. package/dist/adapters/shared/workflow_template.js +1 -1
  6. package/dist/bin/soloforge.d.ts.map +1 -1
  7. package/dist/bin/soloforge.js +83 -1
  8. package/dist/bin/soloforge.js.map +1 -1
  9. package/dist/engine/backend_implementation_contract.d.ts +1 -1
  10. package/dist/engine/backend_implementation_contract.d.ts.map +1 -1
  11. package/dist/engine/backend_implementation_contract.js +22 -0
  12. package/dist/engine/backend_implementation_contract.js.map +1 -1
  13. package/dist/engine/brainstorm_contract.d.ts +1 -1
  14. package/dist/engine/brainstorm_contract.js +1 -1
  15. package/dist/engine/code_maintainability_observability_contract.d.ts +1 -1
  16. package/dist/engine/code_maintainability_observability_contract.d.ts.map +1 -1
  17. package/dist/engine/code_maintainability_observability_contract.js +241 -3
  18. package/dist/engine/code_maintainability_observability_contract.js.map +1 -1
  19. package/dist/engine/contract_registry.js +1 -1
  20. package/dist/engine/diagnostic_registry.d.ts +1 -0
  21. package/dist/engine/diagnostic_registry.d.ts.map +1 -1
  22. package/dist/engine/diagnostic_registry.js +6 -0
  23. package/dist/engine/diagnostic_registry.js.map +1 -1
  24. package/dist/engine/dual_layer_mechanism_registry.js +1 -1
  25. package/dist/engine/extension_scenario_registry.js +4 -4
  26. package/dist/engine/extension_scenario_registry.js.map +1 -1
  27. package/dist/engine/foundation_scenario_runners.d.ts.map +1 -1
  28. package/dist/engine/foundation_scenario_runners.js +4 -2
  29. package/dist/engine/foundation_scenario_runners.js.map +1 -1
  30. package/dist/engine/historical_issue_mechanization_matrix.d.ts +28 -0
  31. package/dist/engine/historical_issue_mechanization_matrix.d.ts.map +1 -0
  32. package/dist/engine/historical_issue_mechanization_matrix.js +134 -0
  33. package/dist/engine/historical_issue_mechanization_matrix.js.map +1 -0
  34. package/dist/engine/implementation_roadmap_registry.d.ts.map +1 -1
  35. package/dist/engine/implementation_roadmap_registry.js +70 -13
  36. package/dist/engine/implementation_roadmap_registry.js.map +1 -1
  37. package/dist/engine/intent_expander.d.ts.map +1 -1
  38. package/dist/engine/intent_expander.js +151 -1
  39. package/dist/engine/intent_expander.js.map +1 -1
  40. package/dist/engine/next_action_planner.d.ts.map +1 -1
  41. package/dist/engine/next_action_planner.js +72 -4
  42. package/dist/engine/next_action_planner.js.map +1 -1
  43. package/dist/engine/project_knowledge_contract.d.ts +58 -0
  44. package/dist/engine/project_knowledge_contract.d.ts.map +1 -0
  45. package/dist/engine/project_knowledge_contract.js +298 -0
  46. package/dist/engine/project_knowledge_contract.js.map +1 -0
  47. package/dist/engine/project_knowledge_system_regression_matrix.d.ts +27 -0
  48. package/dist/engine/project_knowledge_system_regression_matrix.d.ts.map +1 -0
  49. package/dist/engine/project_knowledge_system_regression_matrix.js +295 -0
  50. package/dist/engine/project_knowledge_system_regression_matrix.js.map +1 -0
  51. package/dist/engine/release_issue_scenario_registry.d.ts.map +1 -1
  52. package/dist/engine/release_issue_scenario_registry.js +297 -102
  53. package/dist/engine/release_issue_scenario_registry.js.map +1 -1
  54. package/dist/engine/release_readiness_gate.d.ts +1 -0
  55. package/dist/engine/release_readiness_gate.d.ts.map +1 -1
  56. package/dist/engine/release_readiness_gate.js +384 -5
  57. package/dist/engine/release_readiness_gate.js.map +1 -1
  58. package/dist/engine/technology_decision.js +5 -5
  59. package/dist/engine/technology_decision.js.map +1 -1
  60. package/dist/engine/template_asset_contract_registry.d.ts.map +1 -1
  61. package/dist/engine/template_asset_contract_registry.js +6 -5
  62. package/dist/engine/template_asset_contract_registry.js.map +1 -1
  63. package/dist/engine/verifier.js +1 -1
  64. package/dist/engine/verifier.js.map +1 -1
  65. package/dist/engine/workflow_navigation_contract.d.ts +10 -0
  66. package/dist/engine/workflow_navigation_contract.d.ts.map +1 -1
  67. package/dist/knowledge/loader.d.ts +3 -1
  68. package/dist/knowledge/loader.d.ts.map +1 -1
  69. package/dist/knowledge/loader.js +2 -2
  70. package/dist/knowledge/loader.js.map +1 -1
  71. package/dist/types.d.ts +19 -0
  72. package/dist/types.d.ts.map +1 -1
  73. package/package.json +1 -1
  74. package/templates/knowledge/acceptance_templates//351/200/232/347/224/250/350/264/250/351/207/217/351/252/214/346/224/266/346/270/205/345/215/225.md +1 -1
  75. package/templates/knowledge/acceptance_templates//351/207/215/346/236/204/346/226/271/346/241/210/346/250/241/347/211/210.md +1 -1
  76. package/templates/knowledge/domain//346/224/257/344/273/230/350/247/204/345/210/231.md +1 -1
  77. package/templates/knowledge/procedures//346/225/260/346/215/256/345/272/223/350/277/201/347/247/273/346/265/201/347/250/213.md +1 -1
  78. package/templates/knowledge/procedures//351/203/250/347/275/262/345/217/221/345/270/203/346/265/201/347/250/213.md +1 -1
  79. package/templates/knowledge/procedures//351/207/215/346/236/204/346/265/201/346/260/264/347/272/277.md +1 -1
  80. package/templates/knowledge/review_rules//344/272/244/344/273/230/345/256/214/345/244/207/346/200/247/345/256/241/346/237/245/350/247/204/345/210/231.md +1 -1
  81. package/templates/knowledge/review_rules//350/264/250/351/207/217/345/256/241/346/237/245/350/247/204/345/210/231.md +3 -3
  82. package/templates/knowledge/rules//344/273/243/347/240/201/346/263/250/351/207/212/344/270/216/346/227/245/345/277/227/345/245/221/347/272/246/350/247/204/345/210/231.md +32 -3
  83. package/templates/knowledge/rules//346/240/270/345/277/203/344/275/223/351/252/214/345/216/237/345/210/231.md +1 -1
  84. package/templates/knowledge/rules//346/240/270/345/277/203/345/267/245/347/250/213/346/211/247/350/241/214/345/216/237/345/210/231.md +2 -2
  85. package/templates/knowledge/rules//346/274/224/350/277/233/345/233/236/345/275/222/351/227/250/346/216/247/350/247/204/345/210/231.md +1 -1
  86. package/templates/patterns/Git/346/223/215/344/275/234/350/247/204/350/214/203.md +1 -1
  87. package/templates/scaffolds/react/Form.tsx.hbs +11 -3
  88. package/templates/scaffolds/react/List.tsx.hbs +11 -3
  89. package/templates/scaffolds/react/Page.tsx.hbs +1 -1
  90. package/templates/scaffolds/react/types.ts.hbs +4 -1
  91. package/templates/scaffolds/spring-boot/Controller.java.hbs +18 -4
  92. package/templates/scaffolds/spring-boot/DTO.java.hbs +4 -1
  93. package/templates/scaffolds/spring-boot/Entity.java.hbs +8 -3
  94. package/templates/scaffolds/spring-boot/Mapper.java.hbs +4 -1
  95. package/templates/scaffolds/spring-boot/ServiceImpl.java.hbs +34 -10
  96. package/templates/scaffolds/spring-boot/ServiceTest.java.hbs +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project_knowledge_system_regression_matrix.js","sourceRoot":"","sources":["../../src/engine/project_knowledge_system_regression_matrix.ts"],"names":[],"mappings":"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"}
@@ -1 +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;AA+hDD,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"}
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;AA+vDD,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"}
@@ -67,121 +67,314 @@ function confirmDecisionWorkshopFromResponse(expResult) {
67
67
  /**
68
68
  * 发布问题全量场景定义。
69
69
  */
70
+ /** 架构研讨场景的完整技术决策契约,确保证据门禁和决策主权门禁都能通过 */
71
+ function makeTechnologyDecisionContract(taskId) {
72
+ return {
73
+ decision_id: `td-${taskId}`,
74
+ decision_scope: "system_architecture",
75
+ options: [
76
+ { option_id: "microservices", description: "微服务架构", pros: ["独立部署"], cons: ["运维复杂"], risk_level: "medium" },
77
+ { option_id: "monolith", description: "单体架构", pros: ["简单"], cons: ["扩展受限"], risk_level: "low" },
78
+ ],
79
+ recommended_option: "microservices",
80
+ evidence: ["技术选型评估", "团队经验评估"],
81
+ falsification: ["性能测试不达标"],
82
+ failure_conditions: ["交付延迟超过2周"],
83
+ human_gate_required: true,
84
+ executable_without_human: false,
85
+ human_gate_evidence: "用户确认技术选型",
86
+ };
87
+ }
88
+ /** 架构研讨场景的第一性原理帧,确保高影响意图通过第一性原理门禁 */
89
+ function makeFirstPrinciplesFrame(taskId) {
90
+ return {
91
+ problem_id: `fp-${taskId}`,
92
+ user_goal: "为新系统生成架构设计文档",
93
+ fundamental_need: "系统化的架构设计,支撑后续开发",
94
+ known_facts: ["项目为新系统", "需要架构设计文档", "涉及微服务架构选型"],
95
+ assumptions: ["团队具备微服务开发经验", "基础设施支持容器化部署"],
96
+ non_negotiable_constraints: ["必须支持水平扩展", "技术栈基于 TypeScript"],
97
+ candidate_solutions: ["微服务架构", "单体模块化架构"],
98
+ simplest_viable_solution: "单体模块化架构",
99
+ falsification_questions: ["性能测试是否满足要求", "团队规模是否支撑微服务运维"],
100
+ chosen_solution: "微服务架构",
101
+ why_not_legacy_path: "遗留方案无法满足水平扩展需求",
102
+ first_principles_status: "verified",
103
+ };
104
+ }
105
+ /** 为架构研讨场景注入技术决策契约和第一性原理帧,确保证据门禁、决策主权门禁和第一性原理门禁都能通过 */
106
+ async function injectTechDecisionForWorkshop(harness, taskId) {
107
+ const ctx = await harness.taskContext.load(taskId);
108
+ if (!ctx)
109
+ return null;
110
+ ctx.technology_decision_contract = makeTechnologyDecisionContract(taskId);
111
+ ctx.first_principles_frame = makeFirstPrinciplesFrame(taskId);
112
+ await harness.taskContext.save(ctx);
113
+ return ctx;
114
+ }
70
115
  const RELEASE_ISSUE_SCENARIOS = [
71
- // ── 问题六十一: 通用决策研讨机制(单元级) ──
72
- // 场景 1: existing_system 无证据blocked (单元级)
116
+ // ── 问题六十一: 架构决策研讨 — 真实 sf_classify→sf_expand 主链路 ──
117
+ // 场景 1: greenfield 架构设计完整闭环:阻断 → 全部确认 → 放行
73
118
  {
74
- scenario_id: "release-scenario-architecture-workshop-existing-system",
119
+ scenario_id: "release-scenario-architecture-workshop-greenfield",
75
120
  covering_problem: "problem-61",
76
- test_files: ["tests/adapters/architecture_design_workshop_mainpath.test.ts"],
77
- production_entrypoint: "architecture_decision_workshop.createArchitectureDecisionWorkshop + evaluateArchitectureDecisionWorkshop",
78
- expected_outcome: "existing_system prerequisite_evidence_refs gate.allowed=false,blocking_findings 包含 '现状分析'",
121
+ test_files: ["tests/engine/architecture_decision_workshop.test.ts"],
122
+ production_entrypoint: "sf_classify sf_expand → confirm all → sf_expand",
123
+ expected_outcome: "greenfield 架构设计: sf_expand 阻断(六域未确认) 全部确认+输出确认 → 二次 sf_expand 放行",
79
124
  runner: async () => {
80
- const { createArchitectureDecisionWorkshop, evaluateArchitectureDecisionWorkshop } = await import("./architecture_decision_workshop.js");
81
- const contract = createArchitectureDecisionWorkshop("release-issue-existing", "existing_system");
82
- const gate = evaluateArchitectureDecisionWorkshop(contract);
83
- const hasEvidenceFinding = gate.blocking_findings.some((f) => f.includes("现状分析"));
84
- if (!hasEvidenceFinding)
85
- return { scenario_id: "release-scenario-architecture-workshop-existing-system", status: "fail", error: `expected finding '现状分析', got: ${gate.blocking_findings.join(";")}` };
86
- return {
87
- scenario_id: "release-scenario-architecture-workshop-existing-system",
88
- status: gate.allowed === false ? "pass" : "fail",
89
- evidence: `existing_system evidence: allowed=${gate.allowed} status=${gate.status} findings=${gate.blocking_findings.length}`,
90
- production_trace: { tool_entrypoint: "architecture_decision_workshop", diagnostic_codes: [gate.status], gates_consumed: ["expander"] },
91
- };
125
+ const { createToolHarness } = await import("./release_tool_harness.js");
126
+ const harness = await createToolHarness();
127
+ try {
128
+ const clsRaw = await harness.callTool("sf_classify", { intent: "为新系统生成架构设计文档" });
129
+ const cls = harness.parseResult(clsRaw);
130
+ const taskId = cls.task_id;
131
+ if (!taskId)
132
+ return { scenario_id: "release-scenario-architecture-workshop-greenfield", status: "fail", error: "sf_classify 未返回 task_id" };
133
+ if (!await injectTechDecisionForWorkshop(harness, taskId))
134
+ return { scenario_id: "release-scenario-architecture-workshop-greenfield", status: "fail", error: "task context load failed" };
135
+ const exp1Raw = await harness.callTool("sf_expand", { task_id: taskId });
136
+ const exp1 = harness.parseResult(exp1Raw);
137
+ if (exp1.status !== "awaiting_confirmation")
138
+ return { scenario_id: "release-scenario-architecture-workshop-greenfield", status: "fail", error: `expected awaiting_confirmation, got status=${exp1.status}` };
139
+ const workshop = exp1.architecture_decision_workshop;
140
+ if (!workshop)
141
+ return { scenario_id: "release-scenario-architecture-workshop-greenfield", status: "fail", error: "sf_expand 未返回 architecture_decision_workshop" };
142
+ const domainCount = Object.keys(workshop.domains ?? {}).length;
143
+ if (domainCount < 6)
144
+ return { scenario_id: "release-scenario-architecture-workshop-greenfield", status: "fail", error: `expected >=6 domains, got ${domainCount}` };
145
+ // 全部域确认 + document_output_confirmation_ref
146
+ for (const key of Object.keys(workshop.domains ?? {})) {
147
+ workshop.domains[key].status = "confirmed";
148
+ workshop.domains[key].user_confirmation_ref = `confirm:${key}`;
149
+ }
150
+ workshop.document_output_confirmation_ref = "confirm:output";
151
+ const exp2Raw = await harness.callTool("sf_expand", { task_id: taskId, architecture_decision_workshop: workshop });
152
+ const exp2 = harness.parseResult(exp2Raw);
153
+ if (exp2.status === "awaiting_confirmation" || exp2.status === "blocked")
154
+ return { scenario_id: "release-scenario-architecture-workshop-greenfield", status: "fail", error: `second expand still blocked: status=${exp2.status}, error=${exp2.error ?? "none"}` };
155
+ const trace = await harness.collectTrace();
156
+ return {
157
+ scenario_id: "release-scenario-architecture-workshop-greenfield",
158
+ status: "pass",
159
+ evidence: `sf_classify→sf_expand(awaiting_confirmation,workshop=true,domains=${domainCount})→all confirm→sf_expand(pass)`,
160
+ production_trace: trace,
161
+ };
162
+ }
163
+ finally {
164
+ harness.cleanup();
165
+ }
92
166
  },
93
167
  },
94
- // 场景 2: greenfield 六域全部 missing → blocked (单元级)
168
+ // 场景 2: existing_system 架构设计被阻断;补充确认+证据后放行
95
169
  {
96
- scenario_id: "release-scenario-architecture-workshop-greenfield",
170
+ scenario_id: "release-scenario-architecture-workshop-existing-system",
97
171
  covering_problem: "problem-61",
98
- test_files: ["tests/engine/architecture_decision_workshop.test.ts"],
99
- production_entrypoint: "architecture_decision_workshop.createArchitectureDecisionWorkshop + evaluateArchitectureDecisionWorkshop",
100
- expected_outcome: "greenfield 初始状态六域全部 missing,gate.allowed=false",
172
+ test_files: ["tests/adapters/architecture_design_workshop_mainpath.test.ts"],
173
+ production_entrypoint: "sf_classify sf_expand → confirm workshop with evidence → sf_expand",
174
+ expected_outcome: "existing_system 架构设计 sf_expand 返回 workshop + awaiting_confirmation;补入确认和证据后放行",
101
175
  runner: async () => {
102
- const { createArchitectureDecisionWorkshop, evaluateArchitectureDecisionWorkshop, ARCHITECTURE_DECISION_DOMAINS } = await import("./architecture_decision_workshop.js");
103
- const contract = createArchitectureDecisionWorkshop("release-issue-greenfield", "new_system");
104
- const gate = evaluateArchitectureDecisionWorkshop(contract);
105
- if (gate.missing_domains.length !== ARCHITECTURE_DECISION_DOMAINS.length)
106
- return { scenario_id: "release-scenario-architecture-workshop-greenfield", status: "fail", error: `expected ${ARCHITECTURE_DECISION_DOMAINS.length} missing domains, got ${gate.missing_domains.length}` };
107
- return {
108
- scenario_id: "release-scenario-architecture-workshop-greenfield",
109
- status: gate.allowed === false ? "pass" : "fail",
110
- evidence: `greenfield: missing=${gate.missing_domains.length}/${ARCHITECTURE_DECISION_DOMAINS.length} allowed=${gate.allowed}`,
111
- production_trace: { tool_entrypoint: "architecture_decision_workshop", diagnostic_codes: [gate.status, `missing:${gate.missing_domains.length}`], gates_consumed: ["expander"] },
112
- };
176
+ const { createToolHarness } = await import("./release_tool_harness.js");
177
+ const harness = await createToolHarness({ copyKnowledge: true });
178
+ try {
179
+ const fs = await import("node:fs");
180
+ const srcDir = `${harness.tmpDir}/src`;
181
+ fs.mkdirSync(srcDir, { recursive: true });
182
+ fs.writeFileSync(`${srcDir}/index.ts`, "export {}");
183
+ fs.writeFileSync(`${harness.tmpDir}/package.json`, '{"name":"existing"}');
184
+ const clsRaw = await harness.callTool("sf_classify", { intent: "基于现有系统进行架构设计" });
185
+ const cls = harness.parseResult(clsRaw);
186
+ const taskId = cls.task_id;
187
+ if (!taskId)
188
+ return { scenario_id: "release-scenario-architecture-workshop-existing-system", status: "fail", error: "sf_classify 未返回 task_id" };
189
+ // 提供完整技术决策契约,确保证据门禁和决策主权门禁通过
190
+ if (!await injectTechDecisionForWorkshop(harness, taskId))
191
+ return { scenario_id: "release-scenario-architecture-workshop-existing-system", status: "fail", error: "task context load failed" };
192
+ const exp1Raw = await harness.callTool("sf_expand", { task_id: taskId });
193
+ const exp1 = harness.parseResult(exp1Raw);
194
+ if (exp1.status !== "awaiting_confirmation")
195
+ return { scenario_id: "release-scenario-architecture-workshop-existing-system", status: "fail", error: `expected awaiting_confirmation, got status=${exp1.status}` };
196
+ const workshop = exp1.architecture_decision_workshop;
197
+ if (!workshop)
198
+ return { scenario_id: "release-scenario-architecture-workshop-existing-system", status: "fail", error: "sf_expand 未返回 architecture_decision_workshop" };
199
+ // 全部域确认 + 补齐前置证据
200
+ for (const key of Object.keys(workshop.domains ?? {})) {
201
+ workshop.domains[key].status = "confirmed";
202
+ workshop.domains[key].user_confirmation_ref = `confirm:${key}`;
203
+ }
204
+ workshop.prerequisite_evidence_refs = ["现状分析报告", "差距分析文档"];
205
+ workshop.document_output_confirmation_ref = "confirm:output";
206
+ const exp2Raw = await harness.callTool("sf_expand", { task_id: taskId, architecture_decision_workshop: workshop });
207
+ const exp2 = harness.parseResult(exp2Raw);
208
+ if ((exp2.status === "awaiting_confirmation" || exp2.status === "blocked") && exp2.architecture_decision_workshop)
209
+ return { scenario_id: "release-scenario-architecture-workshop-existing-system", status: "fail", error: `second expand still blocked: ${JSON.stringify(exp2.blocking_findings ?? []).slice(0, 200)}` };
210
+ const trace = await harness.collectTrace();
211
+ return {
212
+ scenario_id: "release-scenario-architecture-workshop-existing-system",
213
+ status: "pass",
214
+ evidence: `sf_classify→sf_expand(awaiting_confirmation,workshop=true,domains=${Object.keys(workshop.domains ?? {}).length})→confirm all+evidence→sf_expand(${exp2.status ?? "pass"})`,
215
+ production_trace: trace,
216
+ };
217
+ }
218
+ finally {
219
+ harness.cleanup();
220
+ }
113
221
  },
114
222
  },
115
- // 场景 3: 部分确认 → 仍 blocked (单元级)
223
+ // 场景 3: 部分域确认 → 仍 blocked
116
224
  {
117
225
  scenario_id: "release-scenario-architecture-workshop-confirmation-block",
118
226
  covering_problem: "problem-61",
119
227
  test_files: ["tests/adapters/architecture_design_workshop_mainpath.test.ts"],
120
- production_entrypoint: "architecture_decision_workshop.createArchitectureDecisionWorkshop + evaluateArchitectureDecisionWorkshop",
121
- expected_outcome: "部分确认 1 域 + document_output 确认后仍 blocked,仅 1 域 confirmed",
228
+ production_entrypoint: "sf_classify sf_expand → partial confirm → sf_expand",
229
+ expected_outcome: "部分域确认后仍 blocked,返回 next_domain;全部确认后放行",
122
230
  runner: async () => {
123
- const { createArchitectureDecisionWorkshop, evaluateArchitectureDecisionWorkshop, ARCHITECTURE_DECISION_DOMAINS } = await import("./architecture_decision_workshop.js");
124
- const contract = createArchitectureDecisionWorkshop("release-issue-confirm-block", "new_system");
125
- contract.domains["business_process"].status = "confirmed";
126
- contract.domains["business_process"].user_confirmation_ref = "用户确认1";
127
- contract.document_output_confirmation_ref = "用户确认输出";
128
- const gate = evaluateArchitectureDecisionWorkshop(contract);
129
- const confirmedCount = ARCHITECTURE_DECISION_DOMAINS.length - gate.missing_domains.length;
130
- if (confirmedCount !== 1)
131
- return { scenario_id: "release-scenario-architecture-workshop-confirmation-block", status: "fail", error: `expected 1 confirmed domain, got ${confirmedCount}` };
132
- if (gate.allowed)
133
- return { scenario_id: "release-scenario-architecture-workshop-confirmation-block", status: "fail", error: "expected blocked but got allowed=true" };
134
- return {
135
- scenario_id: "release-scenario-architecture-workshop-confirmation-block",
136
- status: "pass",
137
- evidence: `confirmed=${confirmedCount} missing=${gate.missing_domains.length} allowed=${gate.allowed}`,
138
- production_trace: { tool_entrypoint: "architecture_decision_workshop", diagnostic_codes: [gate.status, `confirmed:${confirmedCount}`], gates_consumed: ["expander"] },
139
- };
231
+ const { createToolHarness } = await import("./release_tool_harness.js");
232
+ const harness = await createToolHarness();
233
+ try {
234
+ const clsRaw = await harness.callTool("sf_classify", { intent: "为新项目进行架构设计" });
235
+ const cls = harness.parseResult(clsRaw);
236
+ const taskId = cls.task_id;
237
+ if (!taskId)
238
+ return { scenario_id: "release-scenario-architecture-workshop-confirmation-block", status: "fail", error: "sf_classify 未返回 task_id" };
239
+ // 提供完整技术决策契约,确保证据门禁和决策主权门禁通过
240
+ if (!await injectTechDecisionForWorkshop(harness, taskId))
241
+ return { scenario_id: "release-scenario-architecture-workshop-confirmation-block", status: "fail", error: "task context load failed" };
242
+ const exp1Raw = await harness.callTool("sf_expand", { task_id: taskId });
243
+ const exp1 = harness.parseResult(exp1Raw);
244
+ if (exp1.status !== "awaiting_confirmation")
245
+ return { scenario_id: "release-scenario-architecture-workshop-confirmation-block", status: "fail", error: `expected awaiting_confirmation, got status=${exp1.status}` };
246
+ const workshop = exp1.architecture_decision_workshop;
247
+ if (!workshop)
248
+ return { scenario_id: "release-scenario-architecture-workshop-confirmation-block", status: "fail", error: "sf_expand 未返回 architecture_decision_workshop" };
249
+ // 只确认第一个域
250
+ const domainKeys = Object.keys(workshop.domains ?? {});
251
+ const confirmedCount = Math.min(1, domainKeys.length);
252
+ for (let i = 0; i < confirmedCount; i++) {
253
+ workshop.domains[domainKeys[i]].status = "confirmed";
254
+ workshop.domains[domainKeys[i]].user_confirmation_ref = `confirm:${domainKeys[i]}`;
255
+ }
256
+ workshop.document_output_confirmation_ref = "confirm:output";
257
+ const exp2Raw = await harness.callTool("sf_expand", { task_id: taskId, architecture_decision_workshop: workshop });
258
+ const exp2 = harness.parseResult(exp2Raw);
259
+ if (exp2.status !== "awaiting_confirmation")
260
+ return { scenario_id: "release-scenario-architecture-workshop-confirmation-block", status: "fail", error: `expected still awaiting_confirmation after partial confirm (${confirmedCount}/${domainKeys.length}), got status=${exp2.status}` };
261
+ // 全部确认后必须放行
262
+ for (const key of domainKeys) {
263
+ workshop.domains[key].status = "confirmed";
264
+ workshop.domains[key].user_confirmation_ref = `confirm:${key}`;
265
+ }
266
+ const exp3Raw = await harness.callTool("sf_expand", { task_id: taskId, architecture_decision_workshop: workshop });
267
+ const exp3 = harness.parseResult(exp3Raw);
268
+ const trace = await harness.collectTrace();
269
+ return {
270
+ scenario_id: "release-scenario-architecture-workshop-confirmation-block",
271
+ status: (exp3.status !== "awaiting_confirmation" && exp3.status !== "blocked") ? "pass" : "fail",
272
+ evidence: `sf_classify→sf_expand(awaiting_confirmation,workshop=true,domains=${domainKeys.length})→partial(${confirmedCount}/${domainKeys.length})→sf_expand(awaiting_confirmation)→all confirm→sf_expand(${exp3.status ?? "pass"})`,
273
+ production_trace: trace,
274
+ };
275
+ }
276
+ finally {
277
+ harness.cleanup();
278
+ }
140
279
  },
141
280
  },
142
- // 场景 4: 低风险不触发研讨 (单元级)
281
+ // 场景 4: 低风险不触发架构研讨
143
282
  {
144
283
  scenario_id: "release-scenario-architecture-workshop-low-risk-skip",
145
284
  covering_problem: "problem-61",
146
285
  test_files: ["tests/engine/architecture_decision_workshop.test.ts"],
147
- production_entrypoint: "architecture_decision_workshop.requiresArchitectureDecisionWorkshop",
148
- expected_outcome: "低风险 bugfix 不触发研讨 (false),高风险 architecture_design 触发 (true)",
286
+ production_entrypoint: "sf_classify → sf_expand",
287
+ expected_outcome: "低风险修改 sf_expand 不创建 architecture_decision_workshop,不 awaiting_confirmation",
149
288
  runner: async () => {
150
- const { requiresArchitectureDecisionWorkshop } = await import("./architecture_decision_workshop.js");
151
- const lowRisk = requiresArchitectureDecisionWorkshop(undefined, "修复登录按钮颜色不正确");
152
- const highRisk = requiresArchitectureDecisionWorkshop("architecture_design", "重新设计系统架构");
153
- if (lowRisk !== false)
154
- return { scenario_id: "release-scenario-architecture-workshop-low-risk-skip", status: "fail", error: `expected lowRisk=false, got ${lowRisk}` };
155
- if (highRisk !== true)
156
- return { scenario_id: "release-scenario-architecture-workshop-low-risk-skip", status: "fail", error: `expected highRisk=true, got ${highRisk}` };
157
- return {
158
- scenario_id: "release-scenario-architecture-workshop-low-risk-skip",
159
- status: "pass",
160
- evidence: `low=${lowRisk} high=${highRisk}`,
161
- production_trace: { tool_entrypoint: "requiresArchitectureDecisionWorkshop", diagnostic_codes: [`low:${lowRisk}`, `high:${highRisk}`], gates_consumed: ["router"] },
162
- };
289
+ const { createToolHarness } = await import("./release_tool_harness.js");
290
+ const harness = await createToolHarness();
291
+ try {
292
+ const clsRaw = await harness.callTool("sf_classify", { intent: "修复按钮文字拼写错误" });
293
+ const cls = harness.parseResult(clsRaw);
294
+ const taskId = cls.task_id;
295
+ if (!taskId)
296
+ return { scenario_id: "release-scenario-architecture-workshop-low-risk-skip", status: "fail", error: "sf_classify 未返回 task_id" };
297
+ const expRaw = await harness.callTool("sf_expand", { task_id: taskId });
298
+ const exp = harness.parseResult(expRaw);
299
+ if (exp.architecture_decision_workshop)
300
+ return { scenario_id: "release-scenario-architecture-workshop-low-risk-skip", status: "fail", error: "low-risk intent should not create architecture_decision_workshop" };
301
+ if (exp.status === "awaiting_confirmation")
302
+ return { scenario_id: "release-scenario-architecture-workshop-low-risk-skip", status: "fail", error: "low-risk intent should not be awaiting_confirmation" };
303
+ const trace = await harness.collectTrace();
304
+ if (trace.diagnostic_codes.length === 0) {
305
+ trace.diagnostic_codes = [`route:${cls.route_decision?.route ?? "unknown"}`, `expand_status:${exp.status ?? "ok"}`];
306
+ }
307
+ return {
308
+ scenario_id: "release-scenario-architecture-workshop-low-risk-skip",
309
+ status: "pass",
310
+ evidence: `sf_classify→sf_expand(workshop=false,route=${cls.route_decision?.route},status=${exp.status}) 低风险跳过架构研讨`,
311
+ production_trace: trace,
312
+ };
313
+ }
314
+ finally {
315
+ harness.cleanup();
316
+ }
163
317
  },
164
318
  },
165
- // 场景 5: rework_required 域出现在 missing (单元级)
319
+ // 场景 5: rework_required 域阻断设计生成
166
320
  {
167
321
  scenario_id: "release-scenario-architecture-workshop-rework",
168
322
  covering_problem: "problem-61",
169
323
  test_files: [],
170
- production_entrypoint: "architecture_decision_workshop.createArchitectureDecisionWorkshop + evaluateArchitectureDecisionWorkshop",
171
- expected_outcome: "rework_required 域出现在 missing_domains ",
324
+ production_entrypoint: "sf_classify sf_expand → inject rework_required → sf_expand",
325
+ expected_outcome: "rework_required 域仍出现在 missing/阻断中,不进入正式设计生成;修正为 confirmed 后放行",
172
326
  runner: async () => {
173
- const { createArchitectureDecisionWorkshop, evaluateArchitectureDecisionWorkshop } = await import("./architecture_decision_workshop.js");
174
- const contract = createArchitectureDecisionWorkshop("release-issue-rework", "new_system");
175
- contract.domains["backend_architecture"].status = "rework_required";
176
- const gate = evaluateArchitectureDecisionWorkshop(contract);
177
- if (!gate.missing_domains.includes("backend_architecture"))
178
- return { scenario_id: "release-scenario-architecture-workshop-rework", status: "fail", error: `backend_architecture not in missing: ${gate.missing_domains.join(",")}` };
179
- return {
180
- scenario_id: "release-scenario-architecture-workshop-rework",
181
- status: "pass",
182
- evidence: `rework domain in missing=${gate.missing_domains.join(",")}`,
183
- production_trace: { tool_entrypoint: "architecture_decision_workshop", diagnostic_codes: ["rework_required", gate.status], gates_consumed: ["expander"] },
184
- };
327
+ const { createToolHarness } = await import("./release_tool_harness.js");
328
+ const harness = await createToolHarness();
329
+ try {
330
+ const clsRaw = await harness.callTool("sf_classify", { intent: "为新系统生成架构设计文档" });
331
+ const cls = harness.parseResult(clsRaw);
332
+ const taskId = cls.task_id;
333
+ if (!taskId)
334
+ return { scenario_id: "release-scenario-architecture-workshop-rework", status: "fail", error: "sf_classify 未返回 task_id" };
335
+ // 提供完整技术决策契约,确保证据门禁和决策主权门禁通过
336
+ if (!await injectTechDecisionForWorkshop(harness, taskId))
337
+ return { scenario_id: "release-scenario-architecture-workshop-rework", status: "fail", error: "task context load failed" };
338
+ const exp1Raw = await harness.callTool("sf_expand", { task_id: taskId });
339
+ const exp1 = harness.parseResult(exp1Raw);
340
+ if (exp1.status !== "awaiting_confirmation")
341
+ return { scenario_id: "release-scenario-architecture-workshop-rework", status: "fail", error: `expected awaiting_confirmation, got status=${exp1.status}` };
342
+ const workshop = exp1.architecture_decision_workshop;
343
+ if (!workshop)
344
+ return { scenario_id: "release-scenario-architecture-workshop-rework", status: "fail", error: "sf_expand 未返回 architecture_decision_workshop" };
345
+ const domainKeys = Object.keys(workshop.domains ?? {});
346
+ // 确认大部分域,但将一个域设为 rework_required
347
+ const reworkKey = domainKeys.find(k => k === "backend_architecture") ?? domainKeys[0];
348
+ for (const key of domainKeys) {
349
+ if (key === reworkKey) {
350
+ workshop.domains[key].status = "rework_required";
351
+ }
352
+ else {
353
+ workshop.domains[key].status = "confirmed";
354
+ workshop.domains[key].user_confirmation_ref = `confirm:${key}`;
355
+ }
356
+ }
357
+ workshop.document_output_confirmation_ref = "confirm:output";
358
+ const exp2Raw = await harness.callTool("sf_expand", { task_id: taskId, architecture_decision_workshop: workshop });
359
+ const exp2 = harness.parseResult(exp2Raw);
360
+ if (exp2.status !== "awaiting_confirmation")
361
+ return { scenario_id: "release-scenario-architecture-workshop-rework", status: "fail", error: `expected still awaiting_confirmation with rework_required, got status=${exp2.status}` };
362
+ // 修正 rework 域为 confirmed
363
+ workshop.domains[reworkKey].status = "confirmed";
364
+ workshop.domains[reworkKey].user_confirmation_ref = `confirm:${reworkKey}`;
365
+ const exp3Raw = await harness.callTool("sf_expand", { task_id: taskId, architecture_decision_workshop: workshop });
366
+ const exp3 = harness.parseResult(exp3Raw);
367
+ const trace = await harness.collectTrace();
368
+ return {
369
+ scenario_id: "release-scenario-architecture-workshop-rework",
370
+ status: (exp3.status !== "awaiting_confirmation" && exp3.status !== "blocked") ? "pass" : "fail",
371
+ evidence: `sf_classify→sf_expand(awaiting_confirmation,workshop=true,domains=${domainKeys.length})→${reworkKey}=rework_required→sf_expand(awaiting_confirmation)→fix→sf_expand(${exp3.status ?? "pass"})`,
372
+ production_trace: trace,
373
+ };
374
+ }
375
+ finally {
376
+ harness.cleanup();
377
+ }
185
378
  },
186
379
  },
187
380
  // ── 问题六十一: 非架构通用决策研讨真实 MCP 工具链 ──
@@ -763,7 +956,7 @@ const RELEASE_ISSUE_SCENARIOS = [
763
956
  scenario_id: "release-scenario-template-contract-api-field-table",
764
957
  status: "pass",
765
958
  evidence: `${contracts.length} contracts all have ${requiredFields.length} required fields`,
766
- production_trace: { tool_entrypoint: "buildTemplateAssetContracts", diagnostic_codes: [`contracts:${contracts.length}`], gates_consumed: ["contract_gate"] },
959
+ production_trace: { tool_entrypoint: "buildTemplateAssetContracts", diagnostic_codes: [`contracts:${contracts.length}`], gates_consumed: ["contract_gate", "engine_contract"] },
767
960
  };
768
961
  },
769
962
  },
@@ -779,11 +972,13 @@ const RELEASE_ISSUE_SCENARIOS = [
779
972
  const report = auditContractCoverage(process.cwd());
780
973
  if (report.unregistered_files.length > 0)
781
974
  return { scenario_id: "release-scenario-template-contract-authority-binding", status: "fail", error: `unregistered: ${report.unregistered_files.join(", ")}` };
975
+ if (!report.consumption_evidence_verified)
976
+ return { scenario_id: "release-scenario-template-contract-authority-binding", status: "fail", error: `consumption evidence invalid: ${report.consumption_evidence_failures.join("; ")}` };
782
977
  return {
783
978
  scenario_id: "release-scenario-template-contract-authority-binding",
784
979
  status: "pass",
785
- evidence: `${report.total_contracts} contracts, 0 unregistered`,
786
- production_trace: { tool_entrypoint: "auditContractCoverage", diagnostic_codes: [`total:${report.total_contracts}`, `unregistered:${report.unregistered_files.length}`], gates_consumed: ["contract_gate"] },
980
+ evidence: `${report.total_contracts} contracts, 0 unregistered, consumption evidence verified`,
981
+ production_trace: { tool_entrypoint: "auditContractCoverage", diagnostic_codes: [`total:${report.total_contracts}`, `unregistered:${report.unregistered_files.length}`, "consumption-evidence:verified"], gates_consumed: ["contract_gate", "engine_contract"] },
787
982
  };
788
983
  },
789
984
  },
@@ -808,7 +1003,7 @@ const RELEASE_ISSUE_SCENARIOS = [
808
1003
  scenario_id: "release-scenario-template-contract-existing-doc-upgrade",
809
1004
  status: "pass",
810
1005
  evidence: `${activeCount} active, ${contracts.length - activeCount} non-active`,
811
- production_trace: { tool_entrypoint: "buildTemplateAssetContracts", diagnostic_codes: [`active:${activeCount}`, `total:${contracts.length}`], gates_consumed: ["contract_gate"] },
1006
+ production_trace: { tool_entrypoint: "buildTemplateAssetContracts", diagnostic_codes: [`active:${activeCount}`, `total:${contracts.length}`], gates_consumed: ["contract_gate", "engine_contract"] },
812
1007
  };
813
1008
  },
814
1009
  },
@@ -838,7 +1033,7 @@ const RELEASE_ISSUE_SCENARIOS = [
838
1033
  scenario_id: "release-scenario-template-contract-conflict",
839
1034
  status: "pass",
840
1035
  evidence: `${contracts.length} contracts, 0 decision conflicts`,
841
- production_trace: { tool_entrypoint: "getContractDecision", diagnostic_codes: [`contracts:${contracts.length}`, `conflicts:${conflicts}`], gates_consumed: ["contract_gate"] },
1036
+ production_trace: { tool_entrypoint: "getContractDecision", diagnostic_codes: [`contracts:${contracts.length}`, `conflicts:${conflicts}`], gates_consumed: ["contract_gate", "engine_contract"] },
842
1037
  };
843
1038
  },
844
1039
  },
@@ -863,7 +1058,7 @@ const RELEASE_ISSUE_SCENARIOS = [
863
1058
  scenario_id: "release-scenario-template-contract-draft-skip",
864
1059
  status: "pass",
865
1060
  evidence: `${nonActive.length} non-active, 0 leaked to syncable`,
866
- production_trace: { tool_entrypoint: "getSyncableAssetPaths", diagnostic_codes: [`nonActive:${nonActive.length}`, `syncable:${syncable.size}`], gates_consumed: ["contract_gate"] },
1061
+ production_trace: { tool_entrypoint: "getSyncableAssetPaths", diagnostic_codes: [`nonActive:${nonActive.length}`, `syncable:${syncable.size}`], gates_consumed: ["contract_gate", "engine_contract"] },
867
1062
  };
868
1063
  },
869
1064
  },
@@ -1028,7 +1223,7 @@ const RELEASE_ISSUE_SCENARIOS = [
1028
1223
  scenario_id: "release-scenario-template-visibility-fresh-init",
1029
1224
  status: "pass",
1030
1225
  evidence: `${report.total} assets, ${report.pass} pass, 0 visibility fail`,
1031
- production_trace: { tool_entrypoint: "observeAllConsumption", diagnostic_codes: [`total:${report.total}`, `pass:${report.pass}`], gates_consumed: ["contract_gate"] },
1226
+ production_trace: { tool_entrypoint: "observeAllConsumption", diagnostic_codes: [`total:${report.total}`, `pass:${report.pass}`], gates_consumed: ["contract_gate", "engine_contract"] },
1032
1227
  };
1033
1228
  },
1034
1229
  },
@@ -1049,7 +1244,7 @@ const RELEASE_ISSUE_SCENARIOS = [
1049
1244
  scenario_id: "release-scenario-template-visibility-internal-leak",
1050
1245
  status: "pass",
1051
1246
  evidence: "all internal_runtime denied",
1052
- production_trace: { tool_entrypoint: "observeAllConsumption", diagnostic_codes: ["all_denied"], gates_consumed: ["contract_gate"] },
1247
+ production_trace: { tool_entrypoint: "observeAllConsumption", diagnostic_codes: ["all_denied"], gates_consumed: ["contract_gate", "engine_contract"] },
1053
1248
  };
1054
1249
  },
1055
1250
  },
@@ -1075,7 +1270,7 @@ const RELEASE_ISSUE_SCENARIOS = [
1075
1270
  scenario_id: "release-scenario-template-visibility-builtin-fallback",
1076
1271
  status: "pass",
1077
1272
  evidence: `syncable=${syncable.length} copied=${result.copied}`,
1078
- production_trace: { tool_entrypoint: "copyKnowledgeToProject", diagnostic_codes: [`syncable:${syncable.length}`, `copied:${result.copied}`], gates_consumed: ["sync_templates", "init"] },
1273
+ production_trace: { tool_entrypoint: "copyKnowledgeToProject", diagnostic_codes: [`syncable:${syncable.length}`, `copied:${result.copied}`], gates_consumed: ["sync_templates", "init", "engine_contract"] },
1079
1274
  };
1080
1275
  }
1081
1276
  finally {
@@ -1164,7 +1359,7 @@ const RELEASE_ISSUE_SCENARIOS = [
1164
1359
  scenario_id: "release-scenario-template-visibility-user-visible-terms",
1165
1360
  status: "pass",
1166
1361
  evidence: `${userVisible.length} user_visible assets, 0 internal term violations`,
1167
- production_trace: { tool_entrypoint: "buildTemplateAssetContracts", diagnostic_codes: [`userVisible:${userVisible.length}`, `violations:0`], gates_consumed: ["contract_gate"] },
1362
+ production_trace: { tool_entrypoint: "buildTemplateAssetContracts", diagnostic_codes: [`userVisible:${userVisible.length}`, `violations:0`], gates_consumed: ["contract_gate", "engine_contract"] },
1168
1363
  };
1169
1364
  },
1170
1365
  },
@@ -1315,7 +1510,7 @@ const RELEASE_ISSUE_SCENARIOS = [
1315
1510
  scenario_id: "release-scenario-code-observability-payment-status-no-log",
1316
1511
  status: blocked ? "pass" : "fail",
1317
1512
  evidence: blocked ? "hard_fail: 支付写操作无日志被检测到" : "未检测到支付写操作无日志",
1318
- production_trace: { tool_entrypoint: "reviewMissingLogs", diagnostic_codes: [blocked ? "hard_fail" : "missed"], gates_consumed: ["sf_review"] },
1513
+ production_trace: { tool_entrypoint: "reviewMissingLogs", diagnostic_codes: [blocked ? "hard_fail" : "missed"], gates_consumed: ["sf_review", "engine_contract"] },
1319
1514
  };
1320
1515
  },
1321
1516
  },
@@ -1339,7 +1534,7 @@ const RELEASE_ISSUE_SCENARIOS = [
1339
1534
  scenario_id: "release-scenario-code-observability-permission-denied-no-log",
1340
1535
  status: blocked ? "pass" : "fail",
1341
1536
  evidence: blocked ? "hard_fail: 权限拒绝无日志被检测到" : "未检测到权限拒绝无日志",
1342
- production_trace: { tool_entrypoint: "reviewMissingLogs", diagnostic_codes: [blocked ? "hard_fail" : "missed"], gates_consumed: ["sf_review"] },
1537
+ production_trace: { tool_entrypoint: "reviewMissingLogs", diagnostic_codes: [blocked ? "hard_fail" : "missed"], gates_consumed: ["sf_review", "engine_contract"] },
1343
1538
  };
1344
1539
  },
1345
1540
  },
@@ -1365,7 +1560,7 @@ const RELEASE_ISSUE_SCENARIOS = [
1365
1560
  scenario_id: "release-scenario-code-observability-catch-swallow",
1366
1561
  status: blocked ? "pass" : "fail",
1367
1562
  evidence: blocked ? "hard_fail: catch 吞异常被检测到" : "未检测到 catch 吞异常",
1368
- production_trace: { tool_entrypoint: "reviewMissingLogs", diagnostic_codes: [blocked ? "hard_fail" : "missed"], gates_consumed: ["sf_review"] },
1563
+ production_trace: { tool_entrypoint: "reviewMissingLogs", diagnostic_codes: [blocked ? "hard_fail" : "missed"], gates_consumed: ["sf_review", "engine_contract"] },
1369
1564
  };
1370
1565
  },
1371
1566
  },
@@ -1387,7 +1582,7 @@ const RELEASE_ISSUE_SCENARIOS = [
1387
1582
  scenario_id: "release-scenario-code-observability-sensitive-log",
1388
1583
  status: blocked ? "pass" : "fail",
1389
1584
  evidence: blocked ? `hard_fail: 敏感信息泄漏被检测到 (${findings.length} findings)` : "未检测到敏感信息泄漏",
1390
- production_trace: { tool_entrypoint: "detectSensitiveLogs", diagnostic_codes: [blocked ? "hard_fail" : "missed"], gates_consumed: ["sf_review"] },
1585
+ production_trace: { tool_entrypoint: "detectSensitiveLogs", diagnostic_codes: [blocked ? "hard_fail" : "missed"], gates_consumed: ["sf_review", "engine_contract"] },
1391
1586
  };
1392
1587
  },
1393
1588
  },
@@ -1421,7 +1616,7 @@ public BigDecimal calculateSubsidy(Order order) {
1421
1616
  scenario_id: "release-scenario-code-observability-complex-rule-no-comment",
1422
1617
  status: detected ? "pass" : "fail",
1423
1618
  evidence: detected ? "warning: 无注释复杂逻辑被检测到" : "未检测到无注释复杂逻辑",
1424
- production_trace: { tool_entrypoint: "reviewCommentQuality", diagnostic_codes: [detected ? "warning" : "missed"], gates_consumed: ["sf_review"] },
1619
+ production_trace: { tool_entrypoint: "reviewCommentQuality", diagnostic_codes: [detected ? "warning" : "missed"], gates_consumed: ["sf_review", "engine_contract"] },
1425
1620
  };
1426
1621
  },
1427
1622
  },
@@ -1482,7 +1677,7 @@ public BigDecimal calculateSubsidy(Order order) {
1482
1677
  scenario_id: "release-scenario-code-observability-project-logger-detected",
1483
1678
  status: ok ? "pass" : "fail",
1484
1679
  evidence: ok ? `检测: ${javaLogger.type}, ${pinoLogger.type}, ${nestjsLogger.type}` : `检测失败: ${javaLogger.type}, ${pinoLogger.type}, ${nestjsLogger.type}`,
1485
- production_trace: { tool_entrypoint: "detectProjectLogger", diagnostic_codes: [javaLogger.type, pinoLogger.type, nestjsLogger.type], gates_consumed: ["sf_expand"] },
1680
+ production_trace: { tool_entrypoint: "detectProjectLogger", diagnostic_codes: [javaLogger.type, pinoLogger.type, nestjsLogger.type], gates_consumed: ["sf_expand", "engine_contract"] },
1486
1681
  };
1487
1682
  },
1488
1683
  },
@@ -1507,7 +1702,7 @@ public BigDecimal calculateSubsidy(Order order) {
1507
1702
  scenario_id: "release-scenario-code-observability-migration-audit-log",
1508
1703
  status: blocked ? "pass" : "fail",
1509
1704
  evidence: blocked ? "hard_fail: 迁移脚本无审计日志被检测到" : "未检测到迁移脚本无审计日志",
1510
- production_trace: { tool_entrypoint: "reviewMissingLogs", diagnostic_codes: [blocked ? "hard_fail" : "missed"], gates_consumed: ["sf_review"] },
1705
+ production_trace: { tool_entrypoint: "reviewMissingLogs", diagnostic_codes: [blocked ? "hard_fail" : "missed"], gates_consumed: ["sf_review", "engine_contract"] },
1511
1706
  };
1512
1707
  },
1513
1708
  },