soloforge 1.4.11 → 1.4.12

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 (60) hide show
  1. package/dist/adapters/claude_code/tools.d.ts +3 -0
  2. package/dist/adapters/claude_code/tools.d.ts.map +1 -1
  3. package/dist/adapters/claude_code/tools.js +119 -182
  4. package/dist/adapters/claude_code/tools.js.map +1 -1
  5. package/dist/engine/brainstorm_contract.d.ts +2 -0
  6. package/dist/engine/brainstorm_contract.d.ts.map +1 -1
  7. package/dist/engine/brainstorm_contract.js +11 -1
  8. package/dist/engine/brainstorm_contract.js.map +1 -1
  9. package/dist/engine/expand_pipeline.d.ts +121 -0
  10. package/dist/engine/expand_pipeline.d.ts.map +1 -0
  11. package/dist/engine/expand_pipeline.js +141 -0
  12. package/dist/engine/expand_pipeline.js.map +1 -0
  13. package/dist/engine/first_principles.d.ts +2 -0
  14. package/dist/engine/first_principles.d.ts.map +1 -1
  15. package/dist/engine/first_principles.js +14 -1
  16. package/dist/engine/first_principles.js.map +1 -1
  17. package/dist/engine/intent_expander.d.ts +3 -0
  18. package/dist/engine/intent_expander.d.ts.map +1 -1
  19. package/dist/engine/intent_expander.js +252 -306
  20. package/dist/engine/intent_expander.js.map +1 -1
  21. package/dist/engine/intent_route_scorer.d.ts +1 -1
  22. package/dist/engine/intent_route_scorer.d.ts.map +1 -1
  23. package/dist/engine/intent_route_scorer.js +18 -3
  24. package/dist/engine/intent_route_scorer.js.map +1 -1
  25. package/dist/engine/intent_router.d.ts +2 -2
  26. package/dist/engine/intent_router.d.ts.map +1 -1
  27. package/dist/engine/intent_router.js +28 -6
  28. package/dist/engine/intent_router.js.map +1 -1
  29. package/dist/engine/intent_signal_extractor.d.ts +1 -1
  30. package/dist/engine/intent_signal_extractor.d.ts.map +1 -1
  31. package/dist/engine/intent_signal_extractor.js +12 -0
  32. package/dist/engine/intent_signal_extractor.js.map +1 -1
  33. package/dist/engine/release_readiness_gate.d.ts.map +1 -1
  34. package/dist/engine/release_readiness_gate.js +38 -37
  35. package/dist/engine/release_readiness_gate.js.map +1 -1
  36. package/dist/engine/source_code_matcher.d.ts +53 -0
  37. package/dist/engine/source_code_matcher.d.ts.map +1 -0
  38. package/dist/engine/source_code_matcher.js +165 -0
  39. package/dist/engine/source_code_matcher.js.map +1 -0
  40. package/dist/engine/task_context.d.ts +5 -0
  41. package/dist/engine/task_context.d.ts.map +1 -1
  42. package/dist/engine/task_context.js +37 -5
  43. package/dist/engine/task_context.js.map +1 -1
  44. package/dist/engine/technology_decision.d.ts +2 -0
  45. package/dist/engine/technology_decision.d.ts.map +1 -1
  46. package/dist/engine/technology_decision.js +18 -1
  47. package/dist/engine/technology_decision.js.map +1 -1
  48. package/dist/engine/traceability.d.ts.map +1 -1
  49. package/dist/engine/traceability.js +4 -0
  50. package/dist/engine/traceability.js.map +1 -1
  51. package/dist/engine/workflow_contract_registry.d.ts.map +1 -1
  52. package/dist/engine/workflow_contract_registry.js +24 -0
  53. package/dist/engine/workflow_contract_registry.js.map +1 -1
  54. package/dist/knowledge/index_manager.d.ts +1 -0
  55. package/dist/knowledge/index_manager.d.ts.map +1 -1
  56. package/dist/knowledge/index_manager.js +15 -0
  57. package/dist/knowledge/index_manager.js.map +1 -1
  58. package/dist/types.d.ts +2 -0
  59. package/dist/types.d.ts.map +1 -1
  60. package/package.json +1 -1
@@ -172,6 +172,7 @@ export declare function checkDecisionSovereigntyGate(params: {
172
172
  reason_zh?: string;
173
173
  requires_human_gate?: boolean;
174
174
  not_applicable_with_reason?: string;
175
+ expected_schema?: Record<string, unknown>;
175
176
  }>;
176
177
  /**
177
178
  * 细节纪律门 — 复杂任务缺关键细节维度时阻断。
@@ -200,6 +201,7 @@ export declare function checkFirstPrinciplesGate(params: {
200
201
  reason_zh?: string;
201
202
  failures?: string[];
202
203
  not_applicable_with_reason?: string;
204
+ expected_schema?: Record<string, unknown>;
203
205
  }>;
204
206
  /**
205
207
  * 脑暴/方案探索门 — 不确定项需多方案+推荐理由+用户确认。
@@ -214,6 +216,7 @@ export declare function checkBrainstormGate(params: {
214
216
  reason_zh?: string;
215
217
  violations?: string[];
216
218
  not_applicable_with_reason?: string;
219
+ expected_schema?: Record<string, unknown>;
217
220
  }>;
218
221
  /**
219
222
  */
@@ -1 +1 @@
1
- {"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../../../src/adapters/claude_code/tools.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../../../src/adapters/claude_code/tools.ts"],"names":[],"mappings":"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"}
@@ -125,21 +125,38 @@ function decodeIndexedJsonString(value) {
125
125
  function parseContractObject(value, fieldName) {
126
126
  if (value === undefined || value === null)
127
127
  return {};
128
- const candidate = decodeIndexedJsonString(typeof value === "string"
129
- ? (() => {
130
- try {
131
- return JSON.parse(value);
132
- }
133
- catch {
134
- return undefined;
135
- }
136
- })()
137
- : value);
128
+ // 字符串 尝试 JSON 解析(可能被 MCP 客户端序列化为 JSON 字符串)
129
+ let parsed;
130
+ if (typeof value === "string") {
131
+ try {
132
+ parsed = JSON.parse(value);
133
+ }
134
+ catch (parseErr) {
135
+ return { error: `${fieldName} 的 JSON 解析失败: ${parseErr.message}。请检查 JSON 格式是否正确` };
136
+ }
137
+ }
138
+ else {
139
+ parsed = value;
140
+ }
141
+ const candidate = decodeIndexedJsonString(parsed);
138
142
  if (!candidate || typeof candidate !== "object" || Array.isArray(candidate)) {
139
- return { error: `${fieldName} 必须是对象或可解析为对象的 JSON 字符串` };
143
+ return { error: `${fieldName} 必须是 JSON 对象(当前类型: ${Array.isArray(candidate) ? "array" : typeof candidate})。期望格式请参考 expected_schema` };
140
144
  }
141
145
  return { value: candidate };
142
146
  }
147
+ /** 需要通过 parseContractObject 校验的契约字段列表 */
148
+ const CONTRACT_OBJECT_FIELDS = [
149
+ "architecture_decision_workshop", "decision_workshop",
150
+ "technology_decision_contract", "technology_decision_record",
151
+ "detail_discipline_contract", "provided_details",
152
+ "first_principles_frame", "brainstorm_session",
153
+ "design_artifact_pack", "ood_solid_summary",
154
+ "backend_implementation_work_package", "code_observability_work_package",
155
+ ];
156
+ /** 需要规范化的字段 */
157
+ const NORMALIZED_FIELDS = {
158
+ decision_workshop: "decision_workshop",
159
+ };
143
160
  // ── Zod Schema 定义 ──
144
161
  const ClassifySchema = {
145
162
  intent: z.string().describe("开发者意图描述"),
@@ -149,18 +166,18 @@ const ExpandSchema = {
149
166
  task_id: z.string().describe("sf_classify 返回的任务 ID"),
150
167
  clarification_answers: z.array(z.string()).optional().describe("对澄清问题的回答"),
151
168
  input_material_confirmations: z.array(z.string()).optional().describe("已确认安全的输入材料路径列表"),
152
- architecture_decision_workshop: z.unknown().optional().describe("架构设计前已讨论并确认的六域决策记录"),
153
- decision_workshop: z.unknown().optional().describe("通用决策研讨合同(技术选型/数据迁移/安全策略/部署/重构/第三方集成等)"),
154
- technology_decision_contract: z.unknown().optional().describe("技术决策主权契约,含选项、推荐、证据、回滚计划和 human_gate_evidence"),
155
- technology_decision_record: z.unknown().optional().describe("技术决策执行记录,记录已批准/已实现等显式决策状态"),
156
- detail_discipline_contract: z.unknown().optional().describe("细节纪律契约,声明必须覆盖的边界、失败路径、回滚和证据维度"),
157
- provided_details: z.unknown().optional().describe("细节纪律已提供证据,按 required_dimensions 映射为字符串数组"),
158
- first_principles_frame: z.unknown().optional().describe("高影响任务的第一性原理框架"),
159
- brainstorm_session: z.unknown().optional().describe("不确定项/方案选择的脑暴与方案探索会话"),
160
- design_artifact_pack: z.unknown().optional().describe("设计产物包路径映射或已复验状态"),
161
- ood_solid_summary: z.unknown().optional().describe("复杂编码任务的 OOD/SOLID 设计摘要"),
162
- backend_implementation_work_package: z.unknown().optional().describe("后端接口实现的工程工作包"),
163
- code_observability_work_package: z.unknown().optional().describe("代码可维护性与可观测性工作包"),
169
+ architecture_decision_workshop: z.record(z.unknown()).optional().describe("架构设计前六域决策记录。示例 {domains:[{domain:'backend',options:[{id:'opt-a',title:'...'}],recommended_option_id:'opt-a',user_confirmation_ref:'confirm:...'}],status:'confirmed'}"),
170
+ decision_workshop: z.record(z.unknown()).optional().describe("通用决策研讨合同。示例 {activated_packs:['delivery_validation'],domains:[{domain:'delivery_validation',options:[{id:'opt-a',title:'...'}],recommended_option_id:'opt-a',user_confirmation_ref:'confirm:...'}],status:'confirmed'}"),
171
+ technology_decision_contract: z.record(z.unknown()).optional().describe("技术决策主权契约。示例 {decision_id:'TECH-001',decision_scope:'architecture',options:[{option_id:'opt-a',title:'A',description:'...'}],recommended_option:'opt-a',rejected_options:[{option:'opt-b',reason:'...'}],evidence:[{claim:'...',supporting_facts:['...']}],falsification:['...'],failure_conditions:['...'],validation_plan:['...'],rollback_or_exit_plan:['...'],human_gate_required:true,human_gate_evidence:'confirm:...',executable_without_human:false}"),
172
+ technology_decision_record: z.record(z.unknown()).optional().describe("技术决策执行记录。示例 {decision_id:'TECH-001',selected_option:'opt-a',status:'approved',approved_by:'user',evidence_refs:['confirm:...']}"),
173
+ detail_discipline_contract: z.record(z.unknown()).optional().describe("细节纪律契约。示例 {contract_id:'detail-001',required_dimensions:['boundary','failure_path','rollback'],blocking_dimensions:['boundary'],status:'ready'}"),
174
+ provided_details: z.record(z.unknown()).optional().describe("细节纪律已提供证据。示例 {boundary:['只检查 readiness,不改代码'],failure_path:['unknown 时标记证据不足'],rollback:['无写入,无需回滚']}"),
175
+ first_principles_frame: z.record(z.unknown()).optional().describe("高影响任务第一性原理框架。示例 {fundamental_need:'...',known_facts:['...'],assumptions:['...'],candidate_solutions:[{solution_id:'s1',description:'...',complexity:'low'}],simplest_viable_solution:'s1',chosen_solution:'s1',falsification_questions:['...'],why_not_legacy_path:'...'}"),
176
+ brainstorm_session: z.record(z.unknown()).optional().describe("不确定项/方案选择会话。示例 {trigger:'uncertainty',options:[{option_id:'opt-a',title:'...',description:'...',pros:['...'],cons:['...']}],recommended_option_id:'opt-a',rejected_option_ids:['opt-b'],failure_conditions:['...'],brainstorm_status:'options_ready'}"),
177
+ design_artifact_pack: z.record(z.unknown()).optional().describe("设计产物包路径映射或复验状态。示例 {status:'implementation_ready',paths:{architecture_document:'docs/architecture/01-架构设计文档.md'},verification_refs:['verification:...']}"),
178
+ ood_solid_summary: z.record(z.unknown()).optional().describe("复杂编码任务 OOD/SOLID 摘要。示例 {status:'confirmed',responsibilities:['...'],interfaces:['...'],risks:['...'],evidence_refs:['...']}"),
179
+ backend_implementation_work_package: z.record(z.unknown()).optional().describe("后端接口实现工程工作包。示例 {status:'confirmed',api_boundary:['...'],transaction_boundary:['...'],error_contract:['...'],evidence_refs:['...']}"),
180
+ code_observability_work_package: z.record(z.unknown()).optional().describe("代码可维护性与可观测性工作包。示例 {status:'confirmed',logging_plan:['...'],comment_plan:['...'],sensitive_logging_policy:'redact',evidence_refs:['...']}"),
164
181
  };
165
182
  const VerifySchema = {
166
183
  task_id: z.string().describe("任务 ID"),
@@ -178,7 +195,7 @@ const LearnSchema = {
178
195
  };
179
196
  const StatusSchema = {
180
197
  task_id: z.string().optional().describe("任务 ID(不传则查当前任务)"),
181
- action: z.enum(["current", "recent", "resume", "cancel", "archive_stale"]).optional().describe("操作类型"),
198
+ action: z.enum(["current", "recent", "resume", "cancel", "archive_stale", "retry_expand"]).optional().describe("操作类型"),
182
199
  confirm: z.boolean().optional().describe("确认执行会写入状态的操作,例如 cancel/archive_stale/job_cancel"),
183
200
  authorized: z.boolean().optional().describe("confirm 的兼容别名"),
184
201
  job_id: z.string().optional().describe("Job ID(用于 job_status / job_resume / job_cancel)"),
@@ -607,7 +624,7 @@ export async function checkDecisionSovereigntyGate(params) {
607
624
  const decisionModule = await lazyTechnologyDecision();
608
625
  const validation = decisionModule.validateTechnologyDecision(decisionContract);
609
626
  if (!validation.valid) {
610
- return { allowed: false, reason_zh: `技术选型决策校验失败: ${validation.violations.join("; ")}` };
627
+ return { allowed: false, reason_zh: `技术选型决策校验失败: ${validation.violations.join("; ")}`, expected_schema: validation.expected_schema };
611
628
  }
612
629
  // 有决策记录时评估执行状态
613
630
  const decisionRecord = params.ctx.technology_decision_record;
@@ -672,7 +689,7 @@ export async function checkFirstPrinciplesGate(params) {
672
689
  const fpModule = await lazyFirstPrinciples();
673
690
  const validation = fpModule.validateFirstPrinciplesForHighImpact(fpFrame);
674
691
  if (!validation.passed) {
675
- return { allowed: false, reason_zh: `高影响任务缺第一性原理推理: ${validation.violations.join("; ")}`, failures: validation.violations };
692
+ return { allowed: false, reason_zh: `高影响任务缺第一性原理推理: ${validation.violations.join("; ")}`, failures: validation.violations, expected_schema: validation.expected_schema };
676
693
  }
677
694
  return { allowed: true };
678
695
  }
@@ -695,7 +712,7 @@ export async function checkBrainstormGate(params) {
695
712
  const brainstormModule = await lazyBrainstormContract();
696
713
  const validation = brainstormModule.validateBrainstormSession(brainstormSession);
697
714
  if (!validation.valid) {
698
- return { allowed: false, reason_zh: `方案探索不完整: ${validation.violations.join("; ")}`, violations: validation.violations };
715
+ return { allowed: false, reason_zh: `方案探索不完整: ${validation.violations.join("; ")}`, violations: validation.violations, expected_schema: validation.expected_schema };
699
716
  }
700
717
  // 脑暴推荐永远不能自动执行 — 需 Decision Sovereignty human gate
701
718
  const canAutoExec = brainstormModule.canBrainstormAutoExecute(brainstormSession);
@@ -1329,7 +1346,7 @@ export async function registerTools(server, deps) {
1329
1346
  }
1330
1347
  catch (err) {
1331
1348
  const errorNextTools = name === "sf_expand"
1332
- ? ["sf_status", "sf_debug", "sf_governance_report"]
1349
+ ? ["sf_expand", "sf_status", "sf_debug", "sf_governance_report"]
1333
1350
  : contract.default_next_tools;
1334
1351
  const errorForbiddenTools = name === "sf_expand"
1335
1352
  ? ["sf_verify", "sf_review", "sf_deliver", "sf_scaffold"]
@@ -1484,161 +1501,27 @@ export async function registerTools(server, deps) {
1484
1501
  if (!ctx || !ctx.classification) {
1485
1502
  return { result: { error: "任务不存在或尚未分类,请先调用 sf_classify" } };
1486
1503
  }
1487
- const existingArchitectureWorkshop = parseContractObject(ctx.architecture_decision_workshop, "architecture_decision_workshop");
1488
- if (existingArchitectureWorkshop.error) {
1489
- return { result: { error: existingArchitectureWorkshop.error, status: "invalid_input" } };
1490
- }
1491
- const existingDecisionWorkshop = parseContractObject(ctx.decision_workshop, "decision_workshop");
1492
- if (existingDecisionWorkshop.error) {
1493
- return { result: { error: existingDecisionWorkshop.error, status: "invalid_input" } };
1494
- }
1495
- const existingTechnologyDecisionContract = parseContractObject(ctx.technology_decision_contract, "technology_decision_contract");
1496
- if (existingTechnologyDecisionContract.error) {
1497
- return { result: { error: existingTechnologyDecisionContract.error, status: "invalid_input" } };
1498
- }
1499
- const existingTechnologyDecisionRecord = parseContractObject(ctx.technology_decision_record, "technology_decision_record");
1500
- if (existingTechnologyDecisionRecord.error) {
1501
- return { result: { error: existingTechnologyDecisionRecord.error, status: "invalid_input" } };
1502
- }
1503
- const existingDetailContract = parseContractObject(ctx.detail_discipline_contract, "detail_discipline_contract");
1504
- if (existingDetailContract.error) {
1505
- return { result: { error: existingDetailContract.error, status: "invalid_input" } };
1506
- }
1507
- const existingProvidedDetails = parseContractObject(ctx.provided_details, "provided_details");
1508
- if (existingProvidedDetails.error) {
1509
- return { result: { error: existingProvidedDetails.error, status: "invalid_input" } };
1510
- }
1511
- const existingFirstPrinciplesFrame = parseContractObject(ctx.first_principles_frame, "first_principles_frame");
1512
- if (existingFirstPrinciplesFrame.error) {
1513
- return { result: { error: existingFirstPrinciplesFrame.error, status: "invalid_input" } };
1514
- }
1515
- const existingBrainstormSession = parseContractObject(ctx.brainstorm_session, "brainstorm_session");
1516
- if (existingBrainstormSession.error) {
1517
- return { result: { error: existingBrainstormSession.error, status: "invalid_input" } };
1518
- }
1519
- const existingDesignArtifactPack = parseContractObject(ctx.design_artifact_pack, "design_artifact_pack");
1520
- if (existingDesignArtifactPack.error) {
1521
- return { result: { error: existingDesignArtifactPack.error, status: "invalid_input" } };
1522
- }
1523
- const existingOodSolidSummary = parseContractObject(ctx.ood_solid_summary, "ood_solid_summary");
1524
- if (existingOodSolidSummary.error) {
1525
- return { result: { error: existingOodSolidSummary.error, status: "invalid_input" } };
1526
- }
1527
- const existingBackendImplementationWorkPackage = parseContractObject(ctx.backend_implementation_work_package, "backend_implementation_work_package");
1528
- if (existingBackendImplementationWorkPackage.error) {
1529
- return { result: { error: existingBackendImplementationWorkPackage.error, status: "invalid_input" } };
1530
- }
1531
- const existingCodeObservabilityWorkPackage = parseContractObject(ctx.code_observability_work_package, "code_observability_work_package");
1532
- if (existingCodeObservabilityWorkPackage.error) {
1533
- return { result: { error: existingCodeObservabilityWorkPackage.error, status: "invalid_input" } };
1534
- }
1535
- if (existingArchitectureWorkshop.value)
1536
- ctx.architecture_decision_workshop = existingArchitectureWorkshop.value;
1537
- if (existingDecisionWorkshop.value) {
1538
- ctx.decision_workshop = (await lazyDecisionWorkshop()).normalizeDecisionWorkshopContract(existingDecisionWorkshop.value, args.task_id) ?? existingDecisionWorkshop.value;
1539
- }
1540
- if (existingTechnologyDecisionContract.value)
1541
- ctx.technology_decision_contract = existingTechnologyDecisionContract.value;
1542
- if (existingTechnologyDecisionRecord.value)
1543
- ctx.technology_decision_record = existingTechnologyDecisionRecord.value;
1544
- if (existingDetailContract.value)
1545
- ctx.detail_discipline_contract = existingDetailContract.value;
1546
- if (existingProvidedDetails.value)
1547
- ctx.provided_details = existingProvidedDetails.value;
1548
- if (existingFirstPrinciplesFrame.value)
1549
- ctx.first_principles_frame = existingFirstPrinciplesFrame.value;
1550
- if (existingBrainstormSession.value)
1551
- ctx.brainstorm_session = existingBrainstormSession.value;
1552
- if (existingDesignArtifactPack.value)
1553
- ctx.design_artifact_pack = existingDesignArtifactPack.value;
1554
- if (existingOodSolidSummary.value)
1555
- ctx.ood_solid_summary = existingOodSolidSummary.value;
1556
- if (existingBackendImplementationWorkPackage.value)
1557
- ctx.backend_implementation_work_package = existingBackendImplementationWorkPackage.value;
1558
- if (existingCodeObservabilityWorkPackage.value)
1559
- ctx.code_observability_work_package = existingCodeObservabilityWorkPackage.value;
1560
- if (args.architecture_decision_workshop) {
1561
- const parsed = parseContractObject(args.architecture_decision_workshop, "architecture_decision_workshop");
1562
- if (parsed.error)
1563
- return { result: { error: parsed.error, status: "invalid_input" } };
1564
- ctx.architecture_decision_workshop = parsed.value;
1565
- }
1566
- if (args.decision_workshop) {
1567
- const parsed = parseContractObject(args.decision_workshop, "decision_workshop");
1568
- if (parsed.error)
1569
- return { result: { error: parsed.error, status: "invalid_input" } };
1570
- ctx.decision_workshop = (await lazyDecisionWorkshop()).normalizeDecisionWorkshopContract(parsed.value, args.task_id) ?? parsed.value;
1571
- }
1572
- if (args.technology_decision_contract) {
1573
- const parsed = parseContractObject(args.technology_decision_contract, "technology_decision_contract");
1574
- if (parsed.error)
1575
- return { result: { error: parsed.error, status: "invalid_input" } };
1576
- ctx.technology_decision_contract = parsed.value;
1577
- }
1578
- if (args.technology_decision_record) {
1579
- const parsed = parseContractObject(args.technology_decision_record, "technology_decision_record");
1580
- if (parsed.error)
1581
- return { result: { error: parsed.error, status: "invalid_input" } };
1582
- ctx.technology_decision_record = parsed.value;
1583
- }
1584
- if (args.detail_discipline_contract) {
1585
- const parsed = parseContractObject(args.detail_discipline_contract, "detail_discipline_contract");
1586
- if (parsed.error)
1587
- return { result: { error: parsed.error, status: "invalid_input" } };
1588
- ctx.detail_discipline_contract = parsed.value;
1589
- }
1590
- if (args.provided_details) {
1591
- const parsed = parseContractObject(args.provided_details, "provided_details");
1592
- if (parsed.error)
1593
- return { result: { error: parsed.error, status: "invalid_input" } };
1594
- ctx.provided_details = parsed.value;
1595
- }
1596
- if (args.first_principles_frame) {
1597
- const parsed = parseContractObject(args.first_principles_frame, "first_principles_frame");
1598
- if (parsed.error)
1599
- return { result: { error: parsed.error, status: "invalid_input" } };
1600
- ctx.first_principles_frame = parsed.value;
1601
- }
1602
- if (args.brainstorm_session) {
1603
- const parsed = parseContractObject(args.brainstorm_session, "brainstorm_session");
1604
- if (parsed.error)
1605
- return { result: { error: parsed.error, status: "invalid_input" } };
1606
- ctx.brainstorm_session = parsed.value;
1607
- }
1608
- if (args.design_artifact_pack) {
1609
- const parsed = parseContractObject(args.design_artifact_pack, "design_artifact_pack");
1610
- if (parsed.error)
1611
- return { result: { error: parsed.error, status: "invalid_input" } };
1612
- ctx.design_artifact_pack = parsed.value;
1613
- }
1614
- if (args.ood_solid_summary) {
1615
- const parsed = parseContractObject(args.ood_solid_summary, "ood_solid_summary");
1616
- if (parsed.error)
1617
- return { result: { error: parsed.error, status: "invalid_input" } };
1618
- ctx.ood_solid_summary = parsed.value;
1619
- }
1620
- if (args.backend_implementation_work_package) {
1621
- const parsed = parseContractObject(args.backend_implementation_work_package, "backend_implementation_work_package");
1504
+ // 合并校验 + 应用:ctx 已存储值 → args 覆盖值,统一解析和规范化
1505
+ let needsSave = false;
1506
+ for (const field of CONTRACT_OBJECT_FIELDS) {
1507
+ // args 优先,其次 ctx 已存储值
1508
+ const raw = args[field] ?? ctx[field];
1509
+ if (!raw)
1510
+ continue;
1511
+ const parsed = parseContractObject(raw, field);
1622
1512
  if (parsed.error)
1623
1513
  return { result: { error: parsed.error, status: "invalid_input" } };
1624
- ctx.backend_implementation_work_package = parsed.value;
1514
+ if (parsed.value) {
1515
+ ctx[field] = field === "decision_workshop"
1516
+ ? ((await lazyDecisionWorkshop()).normalizeDecisionWorkshopContract(parsed.value, args.task_id) ?? parsed.value)
1517
+ : parsed.value;
1518
+ needsSave = true;
1519
+ }
1625
1520
  }
1626
- if (args.code_observability_work_package) {
1627
- const parsed = parseContractObject(args.code_observability_work_package, "code_observability_work_package");
1628
- if (parsed.error)
1629
- return { result: { error: parsed.error, status: "invalid_input" } };
1630
- ctx.code_observability_work_package = parsed.value;
1631
- }
1632
- if (args.architecture_decision_workshop || args.decision_workshop
1633
- || args.technology_decision_contract || args.technology_decision_record
1634
- || args.detail_discipline_contract || args.provided_details
1635
- || args.first_principles_frame || args.brainstorm_session
1636
- || args.design_artifact_pack
1637
- || args.ood_solid_summary || args.backend_implementation_work_package || args.code_observability_work_package) {
1521
+ if (needsSave)
1638
1522
  await taskContext.save(ctx);
1639
- }
1640
- // 状态守卫:classifying/expanding/clarifying expanding
1641
- if (ctx.status === "classifying" || ctx.status === "clarifying") {
1523
+ // 状态守卫:classifying/expanding/clarifying/failed → expanding
1524
+ if (ctx.status === "classifying" || ctx.status === "clarifying" || ctx.status === "failed") {
1642
1525
  await taskContext.updateStatus(args.task_id, "expanding");
1643
1526
  ctx.status = "expanding";
1644
1527
  }
@@ -1699,6 +1582,7 @@ export async function registerTools(server, deps) {
1699
1582
  plan_context: planContext,
1700
1583
  input_material_confirmations: args.input_material_confirmations,
1701
1584
  task_id: args.task_id,
1585
+ brainstorm_session: ctx.brainstorm_session ?? undefined,
1702
1586
  });
1703
1587
  }
1704
1588
  catch (expandErr) {
@@ -1960,7 +1844,8 @@ export async function registerTools(server, deps) {
1960
1844
  result: {
1961
1845
  error: decisionGate.reason_zh,
1962
1846
  status: "blocked",
1963
- recovery: decisionGate.requires_human_gate ? "请提供技术决策确认证据(human_gate_evidence)" : "技术选型决策校验失败,请提供 technology_decision_contract",
1847
+ expected_schema: decisionGate.expected_schema,
1848
+ recovery: decisionGate.requires_human_gate ? "请提供技术决策确认证据(human_gate_evidence)" : "技术选型决策校验失败,请按照 expected_schema 格式提供 technology_decision_contract",
1964
1849
  },
1965
1850
  };
1966
1851
  }
@@ -1987,8 +1872,9 @@ export async function registerTools(server, deps) {
1987
1872
  result: {
1988
1873
  error: fpGate.reason_zh,
1989
1874
  failures: fpGate.failures,
1875
+ expected_schema: fpGate.expected_schema,
1990
1876
  status: "blocked",
1991
- recovery: "高影响任务缺 first_principles_frame,请提供后重新 sf_expand",
1877
+ recovery: "高影响任务缺 first_principles_frame,请按照 expected_schema 格式提供后重新 sf_expand",
1992
1878
  },
1993
1879
  };
1994
1880
  }
@@ -2001,8 +1887,9 @@ export async function registerTools(server, deps) {
2001
1887
  result: {
2002
1888
  error: brainstormGate.reason_zh,
2003
1889
  violations: brainstormGate.violations,
1890
+ expected_schema: brainstormGate.expected_schema,
2004
1891
  status: "blocked",
2005
- recovery: "不确定项/方案选择缺 brainstorm_session,请提供后重新 sf_expand",
1892
+ recovery: "不确定项/方案选择缺 brainstorm_session,请按照 expected_schema 格式提供后重新 sf_expand",
2006
1893
  },
2007
1894
  };
2008
1895
  }
@@ -2318,6 +2205,40 @@ export async function registerTools(server, deps) {
2318
2205
  if (!decisionContract.passed) {
2319
2206
  advisories.decision_contract_advisory = decisionContract.advisory;
2320
2207
  }
2208
+ // 设置 plan_proposal_gate — sf_expand 成功后必须设置,否则 sf_verify 等写工具会被阻断
2209
+ {
2210
+ const { evaluatePlanProposalGate, inferPlanGateTaskType } = await import("../../engine/plan_proposal_gate.js");
2211
+ const routeForGate = expansion.workflow_trace?.route ?? expansionRoute ?? "code_change";
2212
+ const taskTypeForGate = inferPlanGateTaskType(ctx.intent);
2213
+ // 轻量路径(acceptance/review/read_only)自动通过
2214
+ const isLightweight = routeForGate === "acceptance" || routeForGate === "review"
2215
+ || routeForGate === "direct_answer" || routeForGate === "analysis";
2216
+ if (isLightweight) {
2217
+ await taskContext.setPlanProposalGate(args.task_id, {
2218
+ passed: true,
2219
+ plan_gate_status: "passed",
2220
+ required_level: "brief_plan",
2221
+ reason_zh: "轻量路径自动通过",
2222
+ violations: [],
2223
+ evidence_refs: [],
2224
+ blocked_actions: [],
2225
+ });
2226
+ }
2227
+ else {
2228
+ const gateResult = evaluatePlanProposalGate({
2229
+ task_id: args.task_id,
2230
+ task_type: taskTypeForGate,
2231
+ user_intent: ctx.intent,
2232
+ plan_level: "execution_plan",
2233
+ plan_summary_zh: ctx.intent.slice(0, 200),
2234
+ proposed_steps: [expansionRoute ?? "execute"],
2235
+ verification_plan: (expansion.acceptance?.automated ?? []).map((a) => a.description ?? String(a)),
2236
+ risks: [],
2237
+ evidence_refs: expansion.matched_knowledge ?? [],
2238
+ });
2239
+ await taskContext.setPlanProposalGate(args.task_id, gateResult);
2240
+ }
2241
+ }
2321
2242
  // 存储膨胀结果
2322
2243
  try {
2323
2244
  await taskContext.setExpansion(args.task_id, expansion);
@@ -3160,6 +3081,22 @@ export async function registerTools(server, deps) {
3160
3081
  result: { task_id: args.task_id, cancelled },
3161
3082
  };
3162
3083
  }
3084
+ case "retry_expand": {
3085
+ if (!args.task_id) {
3086
+ return {
3087
+ result: { error: "重试 expand 需要 task_id" },
3088
+ };
3089
+ }
3090
+ const retried = await taskContext.retryExpand(args.task_id);
3091
+ if (!retried) {
3092
+ return {
3093
+ result: { error: "任务不存在、非 failed 状态或缺少 classification,无法重试 expand", task_id: args.task_id },
3094
+ };
3095
+ }
3096
+ return {
3097
+ result: { task_id: args.task_id, retried: true, hint: "任务已恢复到 expanding 状态,可重新调用 sf_expand" },
3098
+ };
3099
+ }
3163
3100
  case "archive_stale": {
3164
3101
  const stale = await detectStaleCurrentTask(taskContext.getStateDir());
3165
3102
  const taskId = args.task_id ?? stale.task_id;