@tea-agent/loop-agent 0.39.0-next.23 → 0.39.0-next.24

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 (78) hide show
  1. package/CHANGELOG.md +1 -0
  2. package/dist/build-stamp.json +2 -2
  3. package/dist/executors/pi-event-serializer.js +42 -1
  4. package/dist/worker/console/static/assets/{abnfDiagram-N423BO3Z-tnlecWET.js → abnfDiagram-N423BO3Z-C4kVYweA.js} +1 -1
  5. package/dist/worker/console/static/assets/{arc-LVmtsShq.js → arc-Bj2M8iO5.js} +1 -1
  6. package/dist/worker/console/static/assets/{architectureDiagram-T3A2C74G-Bot2nhjX.js → architectureDiagram-T3A2C74G-CLlXe4-6.js} +1 -1
  7. package/dist/worker/console/static/assets/{blockDiagram-VBNYF7ZC-B8wcEMRC.js → blockDiagram-VBNYF7ZC-psEp5xH0.js} +1 -1
  8. package/dist/worker/console/static/assets/{c4Diagram-5PPSVZJV-Cj4_jsBk.js → c4Diagram-5PPSVZJV-DeKcOCGJ.js} +1 -1
  9. package/dist/worker/console/static/assets/channel-CPF4N7pf.js +1 -0
  10. package/dist/worker/console/static/assets/{chunk-2GRJ4B5K-indAMcNl.js → chunk-2GRJ4B5K-K0C744p1.js} +1 -1
  11. package/dist/worker/console/static/assets/{chunk-2Q5K7J3B-BoVy7yeK.js → chunk-2Q5K7J3B-xbNw4J9-.js} +1 -1
  12. package/dist/worker/console/static/assets/{chunk-5RXB4S5H-BluRngmE.js → chunk-5RXB4S5H-DjLaSDUO.js} +1 -1
  13. package/dist/worker/console/static/assets/{chunk-5VM5RSS4-DyBfxRXh.js → chunk-5VM5RSS4-CtiPlKel.js} +1 -1
  14. package/dist/worker/console/static/assets/{chunk-6Q2QTUOP-DEQqTXL2.js → chunk-6Q2QTUOP-DZtolir7.js} +1 -1
  15. package/dist/worker/console/static/assets/{chunk-GF5L2VYU-KUGA4ndX.js → chunk-GF5L2VYU-CPcdNeew.js} +1 -1
  16. package/dist/worker/console/static/assets/{chunk-JWPE2WC7-DfXKSh2I.js → chunk-JWPE2WC7-NgHc6V37.js} +1 -1
  17. package/dist/worker/console/static/assets/{chunk-KBJHAD2P-BSnwJm3J.js → chunk-KBJHAD2P-DQ_T-hg8.js} +1 -1
  18. package/dist/worker/console/static/assets/{chunk-RYQCIY6F-DeEfgdtO.js → chunk-RYQCIY6F-DgLsxcVP.js} +1 -1
  19. package/dist/worker/console/static/assets/{chunk-XXDRQBXY-avXbO4RW.js → chunk-XXDRQBXY-UrVoM9z1.js} +1 -1
  20. package/dist/worker/console/static/assets/classDiagram-JCYQIIEL-C2DwA_Y1.js +1 -0
  21. package/dist/worker/console/static/assets/classDiagram-v2-OCEON4UE-C2DwA_Y1.js +1 -0
  22. package/dist/worker/console/static/assets/{cose-bilkent-JH36ORCC-CpfsIlv4.js → cose-bilkent-JH36ORCC-CLkYvTb3.js} +1 -1
  23. package/dist/worker/console/static/assets/{cynefin-VYW2F7L2-Bspf3ng8.js → cynefin-VYW2F7L2-BwT_xKrE.js} +1 -1
  24. package/dist/worker/console/static/assets/{cynefinDiagram-MW4NZA55-BJGfcaVQ.js → cynefinDiagram-MW4NZA55-Bi9tuzif.js} +1 -1
  25. package/dist/worker/console/static/assets/{dagre-VZM6K2ZE-DvBTZtam.js → dagre-VZM6K2ZE-BCIqkWBV.js} +1 -1
  26. package/dist/worker/console/static/assets/{diagram-7IWD3JNH-BUJCj_7u.js → diagram-7IWD3JNH-Dip6l9_Z.js} +1 -1
  27. package/dist/worker/console/static/assets/{diagram-B4RE2ZJO-CrpLm_RP.js → diagram-B4RE2ZJO-B-xkh_wK.js} +1 -1
  28. package/dist/worker/console/static/assets/{diagram-LBJQPF4R-Dt5sd0fM.js → diagram-LBJQPF4R-DZO0kTt_.js} +1 -1
  29. package/dist/worker/console/static/assets/{diagram-Q27KOJAE-FE0WGVt3.js → diagram-Q27KOJAE-D6ZplNbZ.js} +1 -1
  30. package/dist/worker/console/static/assets/{diagram-UB23O5K3-C22W8Vsw.js → diagram-UB23O5K3-BPekbhoS.js} +1 -1
  31. package/dist/worker/console/static/assets/{ebnfDiagram-BXEA7PRR-Dug0ybod.js → ebnfDiagram-BXEA7PRR-BtmaJpK5.js} +1 -1
  32. package/dist/worker/console/static/assets/{erDiagram-JOGREHBK-Muy74GVP.js → erDiagram-JOGREHBK-6DS0Xc44.js} +1 -1
  33. package/dist/worker/console/static/assets/{flowDiagram-UKHOOZJN-Dg7DfZPD.js → flowDiagram-UKHOOZJN-CihnROSm.js} +1 -1
  34. package/dist/worker/console/static/assets/{ganttDiagram-PKOTCBZU-BgDMbjEX.js → ganttDiagram-PKOTCBZU-CZC4zOE2.js} +1 -1
  35. package/dist/worker/console/static/assets/{gitGraphDiagram-DS77QQ5N-CCwz0FDR.js → gitGraphDiagram-DS77QQ5N-Dq1fhzGN.js} +1 -1
  36. package/dist/worker/console/static/assets/{index-CnJwuIKx.js → index-DTZOKgAn.js} +62 -62
  37. package/dist/worker/console/static/assets/{infoDiagram-6WML65LV-DQfSRCnK.js → infoDiagram-6WML65LV-DlSl4BGx.js} +1 -1
  38. package/dist/worker/console/static/assets/{ishikawaDiagram-WSZJBQD7-DbP56Q0A.js → ishikawaDiagram-WSZJBQD7-snnzFl_U.js} +1 -1
  39. package/dist/worker/console/static/assets/{journeyDiagram-NVQOT4AX-DnU6-oGf.js → journeyDiagram-NVQOT4AX-BDE7qpMx.js} +1 -1
  40. package/dist/worker/console/static/assets/{kanban-definition-27J2QSJJ-D20nWOTw.js → kanban-definition-27J2QSJJ-CD2Ci04G.js} +1 -1
  41. package/dist/worker/console/static/assets/{linear-BF_t08wv.js → linear-DdnapKIH.js} +1 -1
  42. package/dist/worker/console/static/assets/{mermaid.core-DTwZdcUQ.js → mermaid.core-BVjAT9b8.js} +5 -5
  43. package/dist/worker/console/static/assets/{mindmap-definition-FAOFIHXS-CgABKTml.js → mindmap-definition-FAOFIHXS-D0yJk-zA.js} +1 -1
  44. package/dist/worker/console/static/assets/{pegDiagram-VL7TDLO6-KF8xVdyI.js → pegDiagram-VL7TDLO6-BVo9tFP-.js} +1 -1
  45. package/dist/worker/console/static/assets/{pieDiagram-7S7Q4E2Y-kdvBlmug.js → pieDiagram-7S7Q4E2Y-DnOV-mZ_.js} +1 -1
  46. package/dist/worker/console/static/assets/{quadrantDiagram-CIZ2JOQS-Dz_5Gx-J.js → quadrantDiagram-CIZ2JOQS-CzUJo58i.js} +1 -1
  47. package/dist/worker/console/static/assets/{railroadDiagram-AXF67PYL-CoUkUsjS.js → railroadDiagram-AXF67PYL-Bvikrolh.js} +1 -1
  48. package/dist/worker/console/static/assets/{requirementDiagram-LRYGKXZP-Cp0SKNOb.js → requirementDiagram-LRYGKXZP-DtaSVCap.js} +1 -1
  49. package/dist/worker/console/static/assets/{sankeyDiagram-W5VNT64P-nvgfxhl4.js → sankeyDiagram-W5VNT64P-C2c9A0wW.js} +1 -1
  50. package/dist/worker/console/static/assets/{sequenceDiagram-SI44F4Z6-DUyqpiIH.js → sequenceDiagram-SI44F4Z6-DmXJcU7r.js} +1 -1
  51. package/dist/worker/console/static/assets/{sizeCapture-X5ZJPWSS-FCodLTFq.js → sizeCapture-X5ZJPWSS-B4GUFW92.js} +1 -1
  52. package/dist/worker/console/static/assets/{stateDiagram-OKZ733FA-NVAbafR9.js → stateDiagram-OKZ733FA-Dsad2MXf.js} +1 -1
  53. package/dist/worker/console/static/assets/stateDiagram-v2-UEYNNEHI-B8FB_cNk.js +1 -0
  54. package/dist/worker/console/static/assets/{swimlanes-SLNWSIFB-H29rigTf.js → swimlanes-SLNWSIFB-DGq48Fbi.js} +2 -2
  55. package/dist/worker/console/static/assets/swimlanesDiagram-ULZ7WXOC-CrZYaWfx.js +8 -0
  56. package/dist/worker/console/static/assets/{timeline-definition-Z64GVDOM-CNFQjoyV.js → timeline-definition-Z64GVDOM-CSSi6OFf.js} +1 -1
  57. package/dist/worker/console/static/assets/{vennDiagram-T6HMQDX7-BWf8nCZL.js → vennDiagram-T6HMQDX7-BqyzPrWv.js} +1 -1
  58. package/dist/worker/console/static/assets/{wardleyDiagram-T6FBY63Y-D58QQyvD.js → wardleyDiagram-T6FBY63Y-DlznVb6S.js} +1 -1
  59. package/dist/worker/console/static/assets/{xychartDiagram-ELKLHX3M-DjF1qJhp.js → xychartDiagram-ELKLHX3M-CfBcgJ_K.js} +1 -1
  60. package/dist/worker/console/static/index.html +1 -1
  61. package/package.json +1 -1
  62. package/skills/analyze-product-requirements/SKILL.md +8 -5
  63. package/skills/analyze-product-requirements/references/acceptance-criteria.md +1 -1
  64. package/skills/analyze-product-requirements/references/clarification-and-knowledge.md +10 -6
  65. package/skills/analyze-product-requirements/references/example.md +50 -0
  66. package/skills/analyze-product-requirements/references/forward-test-cases.md +11 -7
  67. package/skills/analyze-product-requirements/references/kb-integration.md +5 -5
  68. package/skills/analyze-product-requirements/references/product-analysis-schema.md +8 -4
  69. package/skills/analyze-product-requirements/references/product-requirement-schema.md +2 -2
  70. package/skills/analyze-product-requirements/references/requirement-clarification-schema.md +1 -1
  71. package/skills/analyze-product-requirements/scripts/test-validators.mjs +11 -1
  72. package/skills/analyze-product-requirements/scripts/validate-product-analysis.mjs +20 -1
  73. package/skills/analyze-product-requirements/scripts/validate-requirement-clarification.mjs +9 -0
  74. package/dist/worker/console/static/assets/channel-Bor-DZxZ.js +0 -1
  75. package/dist/worker/console/static/assets/classDiagram-JCYQIIEL-Cztq0Lcf.js +0 -1
  76. package/dist/worker/console/static/assets/classDiagram-v2-OCEON4UE-Cztq0Lcf.js +0 -1
  77. package/dist/worker/console/static/assets/stateDiagram-v2-UEYNNEHI-j9D1xnHc.js +0 -1
  78. package/dist/worker/console/static/assets/swimlanesDiagram-ULZ7WXOC-DQ4huT5W.js +0 -8
@@ -13,7 +13,7 @@
13
13
 
14
14
  需求分析优先查询设计系统、交互/文案规范、用户可见状态枚举、共享状态组件、权限可见性、错误语义和分页允许值。Controller、Service、Entity、Response、Remote、Web API 或 `interfaces.md` 等纯实现规范仅用于判断当前问题是否属于下游技术设计,不得据此扩写产品需求。
15
15
 
16
- 知识库状态已确定或用户确认跳过后,再按固定顺序预扫描 `<project-root>/ai_workspace/project-how-to`、`code-specification`、`project-business`,然后才进入常规代码搜索。目录缺失不阻断;命中内容作为项目资料事实记录,并按知识库、项目资料、代码现状之间的冲突规则处理。
16
+ 知识库状态已确定或用户确认跳过后,再按固定顺序预扫描 `<project-root>/ai_workspace/project-how-to`、`code-specification`、`project-business`,然后才进入常规代码搜索。目录缺失不阻断;命中内容统一记录为 `CODE-FACT-*` 条目并标注证据类别:项目规范,参与「输入↔规范一致性核对」。仓库规范文档(仓库级指令、README、设计系统、架构规范)同样记录为 `CODE-FACT-*` 并标注证据类别:项目规范。
17
17
 
18
18
  ## 结果状态
19
19
 
@@ -36,18 +36,18 @@
36
36
 
37
37
  ## 事实与优先级
38
38
 
39
- 每条有效结果使用 `KB-FACT-*`,记录规范事实、来源文档及定位、版本/生效状态、适用范围、需求影响和置信度。过期、适用范围不明、相互冲突或无法定位来源的结果不得作为已确认规范,只能记录为冲突或 unknown。
39
+ 每条有效结果使用 `KB-FACT-*`,记录规范事实、来源文档及定位、版本/生效状态、适用范围、需求影响、置信度和与输入关系(一致 | 补充 | 冲突)。事实条目使用单行格式:`- <KB|CODE>-FACT-<编号>:<事实>;来源:<文档/证据定位>;证据类别:<项目规范|代码现状>(仅 CODE-FACT);与输入关系:<一致|补充|冲突>`。标记为"冲突"的事实必须被 Product Analysis"待确认问题"的冲突条目引用。过期、适用范围不明、相互冲突或无法定位来源的结果不得作为已确认规范,只能记录为冲突或 unknown。
40
40
 
41
- 产品行为来源优先级:
41
+ 产品行为来源优先级(仅用于「输入↔规范一致性核对」与冲突澄清完成、用户裁决后的合成默认,不构成跳过澄清的依据):
42
42
 
43
43
  1. 用户已确认决策。
44
44
  2. 原始需求明确内容。
45
45
  3. 当前有效且适用于本项目的知识库规范。
46
46
  4. 模型推断或通用兜底。
47
47
 
48
- 知识库与用户决策、原始需求或另一份有效规范冲突时,保留证据并生成产品澄清问题,用户裁决前不得选边。知识库事实只能填补项目规范,不得发明业务范围、业务规则或用户意图。
48
+ "原始需求明确内容"不等于"无冲突":输入声明与有效规范(知识库、ai_workspace 项目资料、仓库规范文档)或代码现状冲突时,保留证据并生成产品澄清问题,用户裁决前不得按优先级静默采用输入或规范。知识库事实只能填补项目规范,不得发明业务范围、业务规则或用户意图。
49
49
 
50
- 分页允许值遵循:原始需求/用户确认 > 有效知识库分页规范 > 固定兜底 `10/20/50/100`。即使知识库命中 API 文档,也不得自动带入路径、方法、参数名、必填性、默认值、响应结构、错误码或 DTO。
50
+ 分页允许值与其他规则一样参与「输入↔规范一致性核对」:输入与有效知识库分页规范冲突(含集合差异、子集或超集)时进入澄清,用户裁决后以确认值为准;无冲突时遵循:原始需求/用户确认 > 有效知识库分页规范 > 固定兜底 `10/20/50/100`。即使知识库命中 API 文档,也不得自动带入路径、方法、参数名、必填性、默认值、响应结构、错误码或 DTO。
51
51
 
52
52
  ## 产物边界
53
53
 
@@ -18,7 +18,9 @@ Frontmatter 只允许以上五个字段,不得增加来源路径、项目根
18
18
 
19
19
  固定章节:原始需求、需求概述、业务目标、需求分析、外部事实。原始需求必须包含 `- 原始需求身份:inline:sha256:<64位小写十六进制>` 或 `- 原始需求身份:file:sha256:<64位小写十六进制>`,并保留准确原文;inline 摘要只绑定正文,file 摘要同时绑定规范化真实路径与正文,均使用 `scripts/compute-source-identity.mjs` 生成。不得把原始路径另写入 frontmatter。
20
20
 
21
- 需求分析包含明确需求、推断需求、待确认问题、初步非目标;外部事实包含知识库事实、代码库事实。“知识库事实”必须先记录 `executed-hit | executed-no-match | unavailable` 状态;每个新 requirement 都必须真实执行知识检索,不允许未执行状态。若 complete 流程最终仍记录 `unavailable`,必须同时记录 `- 用户处置:已确认跳过知识库`,否则不得生成本产物。有效事实使用 `KB-FACT-*`,包含规范事实、来源文档及定位、版本/生效状态、适用范围、需求影响和置信度。“代码库事实”继续使用 `CODE-FACT-*`。
21
+ 需求分析包含明确需求、推断需求、待确认问题、初步非目标;外部事实包含知识库事实、代码库事实。”知识库事实”必须先记录 `executed-hit | executed-no-match | unavailable` 状态;每个新 requirement 都必须真实执行知识检索,不允许未执行状态。若 complete 流程最终仍记录 `unavailable`,必须同时记录 `- 用户处置:已确认跳过知识库`,否则不得生成本产物。有效事实使用 `KB-FACT-*`,包含规范事实、来源文档及定位、版本/生效状态、适用范围、需求影响、置信度和与输入关系。”代码库事实”继续使用 `CODE-FACT-*`(ai_workspace 项目资料与仓库规范文档统一归入此节),除上述字段外必须标注证据类别(项目规范 | 代码现状)和与输入关系。
22
+
23
+ 事实条目强制使用单行格式:`- <KB|CODE>-FACT-<编号>:<事实>;来源:<文档/证据定位>;证据类别:<项目规范|代码现状>(仅 CODE-FACT 必填);与输入关系:<一致|补充|冲突>`。与输入关系为”冲突”的事实,其 ID 必须被”待确认问题”的冲突条目引用。
22
24
 
23
25
  按 scope 追加“初步前端用户故事/初步前端输出规范”或“初步后端用户故事/初步后端输出规范”。不得生成独立用户角色或验收标准汇总。
24
26
 
@@ -32,10 +34,12 @@ Frontmatter 只允许以上五个字段,不得增加来源路径、项目根
32
34
 
33
35
  状态变量、UI 状态、空数据、loading、error、disabled、错误文案和兜底行为必须优先采用 `kb-design-assist` 查明的当前有效项目规范,再核验设计系统、共享组件和同类实现;未查明时标为 unknown,不得把通用模式写成项目事实。影响产品行为或验收的 unknown 进入待确认问题;纯实现/代码落点 unknown 只保留在外部事实中。
34
36
 
35
- 后端分页:以原始需求/用户确认为准。输入已给出每页条数允许值时原样记录;未说明时优先使用 `kb-design-assist` 返回的当前有效分页规范,仍未查明才按默认集合 `10`、`20`、`50`、`100` 生成。不得因此把知识库/API 文档的路径、方法、参数名、必填性、默认值、响应、错误码或 DTO 自动带入。Validator 不解析或推断分页允许值集合;该规则由生成流程和 forward-test 核对。
37
+ 后端分页:每页条数允许值参与「输入↔规范一致性核对」。输入与有效分页规范冲突(含集合差异、子集或超集)时,该冲突必须进入待确认问题澄清,用户裁决后以确认值为准;输入未说明时优先使用 `kb-design-assist` 返回的当前有效分页规范,仍未查明才按默认集合 `10`、`20`、`50`、`100` 生成。不得因此把知识库/API 文档的路径、方法、参数名、必填性、默认值、响应、错误码或 DTO 自动带入。Validator 不解析或推断分页允许值集合;该规则由生成流程和 forward-test 核对。
36
38
 
37
39
  Product Analysis 只记录验收关注点,不得出现正式 `AC-FE-*`、`AC-BE-*` 或 Given/When/Then 块。
38
40
 
39
- 推断需求一律属于未确认产品内容。任何推断需求,以及原始需求、知识库、代码核验或分析过程中发现的含糊、缺失、冲突、多种合理解释或目标行为 unknown,都必须进入待确认问题并在后续逐题向用户澄清。纯代码位置、符号、复用点和实现方式不属于产品需求,继续留在代码库事实中。
41
+ 推断需求一律属于未确认产品内容。任何推断需求,以及原始需求、知识库、项目资料、仓库规范文档、代码核验或分析过程中发现的含糊、缺失、冲突、多种合理解释或目标行为 unknown,都必须进入待确认问题并在后续逐题向用户澄清。纯代码位置、符号、复用点和实现方式不属于产品需求,继续留在代码库事实中;纯实现/技术细节冲突只记录"与输入关系:冲突"的事实,不生成问题。
42
+
43
+ 「输入↔规范一致性核对」标记为"冲突"的条目必须进入待确认问题,采用如下结构:冲突描述(`输入声明:…` 与 `规范/代码声明:…` 成对列出)、`冲突来源:<KB-FACT-编号 | CODE-FACT-编号>`、影响范围(`common | frontend | backend | both`)与优先级(默认 P0)。冲突条目只陈述双方声明与来源,不得预选边;推荐职能由 Step 2 访谈轮承担。
40
44
 
41
- `no-clarification-required` 只允许在“推断需求”包含独立一行 `- 无未确认的推断需求。` 且“待确认问题”包含独立一行 `- 无待确认问题。` 时使用;待确认问题可另写理由,但不得出现问题标记、优先级、问句或其他未确认产品内容。`ready-for-clarification` 至少包含一个带优先级或问号的问题。
45
+ `no-clarification-required` 只允许在”推断需求”包含独立一行 `- 无未确认的推断需求。` 且”待确认问题”包含独立一行 `- 无待确认问题。` 时使用;待确认问题可另写理由和一行 `- 一致性核对:…未发现冲突条目。`,但不得出现问题标记、优先级、问句或其他未确认产品内容;存在任何”与输入关系:冲突”的事实不得使用本状态。`ready-for-clarification` 至少包含一个带优先级或问号的问题。
@@ -16,7 +16,7 @@ Frontmatter 只允许以上五个字段,不得增加来源路径、项目根
16
16
 
17
17
  固定章节:需求概述、业务目标、需求范围、业务规则、决策追溯。需求范围包含“已确认范围”和“非目标”。`pending` 与 `complete` 均禁止“默认假设”章节。`pending` 文档另含“未决事项”;`complete` 文档禁止“未决事项”。不得生成独立用户角色、验收标准汇总、前后端契约、Open Questions、测试建议或独立边界 case 章节。
18
18
 
19
- Product Requirement 只描述目标产品行为,不承载知识检索或代码侦察记录。不得包含 `KB-FACT-*`、`CODE-FACT-*`、知识库/仓库文件路径、代码级类/函数/组件符号、模块调用关系、数据表名、证据位置、当前实现过程或实现算法。产品层的页面或组件名称仍可用于描述用户可见输出。当前有效知识库规范只能在不与用户决策或原始需求冲突时转换为项目既定的产品规则;代码库事实只可在经用户确认或被原始需求明确要求后转换为不含实现细节的产品规则。原始证据保留在 Product Analysis 或 Clarification。
19
+ Product Requirement 只描述目标产品行为,不承载知识检索或代码侦察记录。不得包含 `KB-FACT-*`、`CODE-FACT-*`、知识库/仓库文件路径、代码级类/函数/组件符号、模块调用关系、数据表名、证据位置、当前实现过程或实现算法。产品层的页面或组件名称仍可用于描述用户可见输出。当前有效知识库规范在不与用户决策或原始需求冲突时可转换为项目既定的产品规则;与输入冲突时必须先经澄清、由用户裁决,裁决后方可转换。代码库事实只可在经用户确认或被原始需求明确要求后转换为不含实现细节的产品规则。原始证据保留在 Product Analysis 或 Clarification。
20
20
 
21
21
  机器校验至少拦截:`KB-FACT-*`、`CODE-FACT-*`、常见仓库路径(如 `src/`)、`*Controller/*Service/*Repository/*Handler/*Middleware` 符号,以及“证据位置”。其余实现泄漏仍按本契约人工遵守。知识库/仓库 API 技术惯例仅可在分析与澄清中查证;写入本产物的参数名、必填性、默认值必须来自原始需求或用户确认。
22
22
 
@@ -30,7 +30,7 @@ Product Requirement 只描述目标产品行为,不承载知识检索或代码
30
30
 
31
31
  状态变量、UI 状态、空数据、loading、error、disabled、错误文案和兜底行为必须遵循 `kb-design-assist` 或项目资料查明的当前有效规范,保留项目真实枚举、共享组件、文案和交互方式;影响产品行为的 unknown 未澄清前不得 complete,纯实现/代码落点 unknown 不进入本产物。
32
32
 
33
- 后端分页允许值按“原始需求/用户确认 > 当前有效知识库分页规范 > 默认集合 `10`、`20`、`50`、`100`”确定。参数名、必填性、默认值和其他 API 契约必须来自原始需求或用户确认,不得从知识库/API 文档自动带入。Validator 不解析或推断分页允许值集合;该规则由生成流程和 forward-test 核对。
33
+ 后端分页允许值在澄清完成后按”用户确认/原始需求 > 当前有效知识库分页规范 > 默认集合 `10`、`20`、`50`、`100`”确定;输入与有效分页规范冲突(含集合差异、子集或超集)必须先经澄清、由用户裁决,未裁决不得 complete。参数名、必填性、默认值和其他 API 契约必须来自原始需求或用户确认,不得从知识库/API 文档自动带入。Validator 不解析或推断分页允许值集合;该规则由生成流程和 forward-test 核对。
34
34
 
35
35
  正式 `AC-FE-*` 或 `AC-BE-*` 作为四级标题嵌入对应输出规范。故事的验收标准引用必须与该规范中的 AC 完全一致;AC 遵循 `acceptance-criteria.md`。
36
36
  每个 AC ID 在整个 Product Requirement 中必须全局唯一,不得在不同故事或不同输出规范中复用。
@@ -53,7 +53,7 @@ Frontmatter 只允许以上六个字段,不得增加来源路径、项目根
53
53
 
54
54
  Clarification 与 Product Requirement 的状态必须一致:`pending` 只能配对 `pending`,`complete` 只能配对 `complete`。`--allow-pending` 只允许校验前一种内部中间状态;不带参数的交付校验只接受后一种。无需澄清的精简结构只能直接生成 complete,不存在 pending 精简结构。
55
55
 
56
- 原始需求已经明确的产品行为作为 `source-requirement` 事实直接合并,不生成 `Q-*`、`DEC-Q-*` 或 `confirmed/user` 伪记录。代码事实用于查证现状,不作为产品决策来源;实现事实 unknown 不生成澄清问题。
56
+ 原始需求已经明确、与有效规范及代码现状核对一致且不存在冲突的产品行为作为 `source-requirement` 事实直接合并,不生成 `Q-*`、`DEC-Q-*` 或 `confirmed/user` 伪记录;输入与有效规范或代码现状冲突时不得免澄清。代码事实用于查证现状,不作为产品决策来源;实现事实 unknown 不生成澄清问题。
57
57
 
58
58
  `complete` 要求:
59
59
 
@@ -58,6 +58,7 @@ analysis_status: no-clarification-required
58
58
  - 无未确认的推断需求。
59
59
  ### 4.3 待确认问题
60
60
  - 无待确认问题。
61
+ - 一致性核对:已逐条比对知识库、ai_workspace、仓库规范与代码现状,未发现冲突条目。
61
62
  - 理由:范围、权限和结果已经明确。
62
63
  ### 4.4 初步非目标
63
64
  - 不修改头像。
@@ -277,7 +278,7 @@ expectPass("valid V4 analysis", analysisValidator, [analysisPath, "--target", "f
277
278
  expectFail("analysis target mismatch", analysisValidator, [analysisPath, "--target", "backend"], "does not match");
278
279
  expectFail("analysis rejects extra frontmatter fields", analysisValidator, [variant("analysis-extra-frontmatter.md", analysis.replace("analysis_status: no-clarification-required", "analysis_status: no-clarification-required\nsource_path: /private/customer/prd.md"))], "unsupported field source_path");
279
280
  expectFail("analysis requires source identity", analysisValidator, [variant("analysis-no-source-identity.md", analysis.replace(`- 原始需求身份:${sourceIdentity}\n`, ""))], "原始需求身份");
280
- const analysisWithKnowledgeHit = analysis.replace("- 检索状态:executed-no-match。", "- 检索状态:executed-hit。\n- KB-FACT-001:采用项目统一空状态组件;来源为当前有效设计系统。");
281
+ const analysisWithKnowledgeHit = analysis.replace("- 检索状态:executed-no-match。", "- 检索状态:executed-hit。\n- KB-FACT-001:采用项目统一空状态组件;来源为当前有效设计系统;与输入关系:补充。");
281
282
  writeFileSync(analysisPath, analysisWithKnowledgeHit);
282
283
  expectPass("analysis accepts executed-hit with KB fact", analysisValidator, [analysisPath, "--target", "frontend"]);
283
284
  writeFileSync(analysisPath, analysis);
@@ -290,6 +291,11 @@ const analysisWithKnowledgeUnavailable = analysis.replace("- 检索状态:exec
290
291
  writeFileSync(analysisPath, analysisWithKnowledgeUnavailable);
291
292
  expectPass("analysis unavailable accepts user skip confirmation", analysisValidator, [analysisPath, "--target", "frontend"]);
292
293
  writeFileSync(analysisPath, analysis);
294
+ expectFail("analysis fact must declare 与输入关系", analysisValidator, [variant("analysis-fact-no-relation.md", analysis.replace("- 检索状态:executed-no-match。", "- 检索状态:executed-hit。\n- KB-FACT-001:采用项目统一空状态组件;来源为当前有效设计系统。"))], "must declare 与输入关系");
295
+ expectFail("analysis CODE-FACT must declare 证据类别", analysisValidator, [variant("analysis-code-fact-no-evidence-class.md", analysis.replace("- 未提供代码仓库。", "- CODE-FACT-001:昵称校验已在表单层实现;证据位置:表单校验;与输入关系:一致。"))], "must declare 证据类别");
296
+ expectFail("analysis conflict fact must be referenced by 待确认问题", analysisValidator, [variant("analysis-conflict-unreferenced.md", analysis.replace("- 检索状态:executed-no-match。", "- 检索状态:executed-hit。\n- KB-FACT-001:昵称允许 1–30 字符;来源:昵称规范 §2;与输入关系:冲突。"))], "not referenced by 待确认问题");
297
+ expectFail("no-clarification analysis rejects conflict facts", analysisValidator, [variant("analysis-conflict-no-clarification.md", analysis.replace("- 检索状态:executed-no-match。", "- 检索状态:executed-hit。\n- KB-FACT-001:昵称允许 1–30 字符;来源:昵称规范 §2;与输入关系:冲突。\n- P0:昵称长度冲突;冲突描述:输入声明「2–20 字符」vs 规范声明「1–30 字符」;冲突来源:KB-FACT-001;影响范围:frontend。"))], "cannot contain facts marked 与输入关系:冲突");
298
+ expectFail("no-clarification analysis requires 一致性核对 conclusion", analysisValidator, [variant("analysis-no-check-line.md", analysis.replace("- 一致性核对:已逐条比对知识库、ai_workspace、仓库规范与代码现状,未发现冲突条目。\n", ""))], "must record a 一致性核对 line");
293
299
  expectFail("analysis rejects formal AC", analysisValidator, [variant("analysis-ac.md", analysis.replace("验收关注点:", "验收关注点:AC-FE-001 "))], "must use acceptance concerns");
294
300
  expectFail("analysis requires matching spec", analysisValidator, [variant("analysis-no-spec.md", analysis.replace("### FE-US-001 修改昵称\n- 页面/组件", "### FE-US-002 修改昵称\n- 页面/组件"))], "missing output specification");
295
301
  expectFail("analysis rejects standalone roles", analysisValidator, [variant("analysis-roles.md", analysis.replace("## 4. 需求分析", "## 用户角色\n- 已登录用户。\n## 4. 需求分析"))], "must not contain standalone");
@@ -488,6 +494,10 @@ expectPass("complete question clarification with DEC markers", clarificationVali
488
494
  expectFail("complete clarification rejects unformed final decision", clarificationValidator, [analysisPath, variant("clarification-unformed-decision.md", completeQuestionClarification.replace("- 最终决策:保存成功后展示项目统一成功提示", "- 最终决策:未形成")), requirementPath], "must contain a formed final decision");
489
495
  expectPass("requirement with DEC markers", requirementValidator, [requirementPath, "--target", "frontend"]);
490
496
  expectFail("complete clarification requires shared-understanding marker", clarificationValidator, [analysisPath, variant("clarification-no-shared.md", completeQuestionClarification.replace("- 共同理解:已确认\n", "")), requirementPath], "共同理解:已确认");
497
+ const conflictReadyAnalysis = readyAnalysis
498
+ .replace("- P1:保存成功后使用哪种反馈?", "- P0:昵称长度冲突;冲突描述:输入声明「2–20 字符」vs 规范声明「1–30 字符」;冲突来源:KB-FACT-001;影响范围:frontend。")
499
+ .replace("- 检索状态:executed-no-match。", "- 检索状态:executed-hit。\n- KB-FACT-001:昵称允许 1–30 字符;来源:昵称规范 §2;与输入关系:冲突。");
500
+ expectFail("complete clarification must cover PA conflict facts", clarificationValidator, [variant("conflict-analysis-uncovered.md", conflictReadyAnalysis), clarificationPath, requirementPath], "must be covered by a Q-* record");
491
501
  expectFail("analysis frontend output requires page route", analysisValidator, [variant("analysis-no-route.md", analysis.replace("- 页面路由:/account/profile\n", "")), "--target", "frontend"], "missing field 页面路由");
492
502
  expectFail("analysis route must be a product path", analysisValidator, [variant("analysis-bad-route.md", analysis.replace("- 页面路由:/account/profile", "- 页面路由:ProfileRoute 组件")), "--target", "frontend"], "must start with /");
493
503
  const embeddedRouteAnalysis = analysis.replace("- 页面路由:/account/profile", "- 页面路由:不适用;嵌入 /account/profile 页面");
@@ -54,11 +54,30 @@ const inferenceLines = contentLines(inferences);
54
54
  const questionLines = contentLines(questions);
55
55
  const noInferenceSentinel = /^-\s*无未确认的推断需求[。.]?$/.test(inferenceLines[0] ?? "");
56
56
  const noQuestionSentinel = /^-\s*无待确认问题[。.]?$/.test(questionLines[0] ?? "");
57
- const unexpectedQuestionLines = questionLines.slice(1).filter((line) => !/^-\s*理由[::]\s*\S/.test(line));
57
+ const unexpectedQuestionLines = questionLines.slice(1).filter((line) => !/^-\s*理由[::]\s*\S/.test(line) && !/^-\s*一致性核对[::]\s*\S/.test(line));
58
58
  if (status === "no-clarification-required" && (!noInferenceSentinel || inferenceLines.length !== 1)) errors.push("no-clarification-required analysis must declare no unconfirmed inferred requirements.");
59
59
  if (status === "no-clarification-required" && (!noQuestionSentinel || unexpectedQuestionLines.length)) errors.push("no-clarification-required analysis must declare no pending questions.");
60
60
  if (status === "no-clarification-required" && /(?:\bQ-\d{3,}\b|\bBR-\d{3,}\b|\bP[012]\b|[??])/.test(questions)) errors.push("no-clarification-required analysis cannot contain question markers, priorities, branches, or question sentences.");
61
61
  if (status === "ready-for-clarification" && !/(?:\bP[012]\b|[??])/.test(questions)) errors.push("ready-for-clarification analysis must contain at least one prioritized or explicit question.");
62
+ // 「输入↔规范一致性核对」检查:事实行格式、冲突标记与待确认问题引用
63
+ const factLines = facts.split(/\r?\n/).filter((line) => /^[ \t]*-[ \t]*(?:KB|CODE)-FACT-\d+\b/.test(line));
64
+ for (const line of factLines) {
65
+ const id = line.match(/\b(?:KB|CODE)-FACT-\d+\b/)?.[0];
66
+ if (!/与输入关系[::]\s*(?:一致|补充|冲突)/.test(line)) errors.push(`${id} must declare 与输入关系:一致|补充|冲突.`);
67
+ if (/^[ \t]*-[ \t]*CODE-FACT-\d+\b/.test(line) && !/证据类别[::]\s*(?:项目规范|代码现状)/.test(line)) errors.push(`${id} must declare 证据类别:项目规范|代码现状.`);
68
+ }
69
+ const conflictFactIds = factLines.filter((line) => /与输入关系[::]\s*冲突/.test(line)).map((line) => line.match(/\b(?:KB|CODE)-FACT-\d+\b/)?.[0]);
70
+ for (const id of conflictFactIds) {
71
+ if (!questions.includes(id)) errors.push(`${id} is marked 与输入关系:冲突 but is not referenced by 待确认问题.`);
72
+ }
73
+ const citedConflictIds = [...(questions.match(/冲突来源[::][^\n]*/g) ?? [])].flatMap((line) => line.match(/\b(?:KB|CODE)-FACT-\d+\b/g) ?? []);
74
+ for (const id of citedConflictIds) {
75
+ if (!conflictFactIds.includes(id)) errors.push(`${id} cited as 冲突来源 but its fact is not marked 与输入关系:冲突.`);
76
+ }
77
+ if (status === "no-clarification-required") {
78
+ if (conflictFactIds.length > 0) errors.push("no-clarification-required analysis cannot contain facts marked 与输入关系:冲突.");
79
+ if (!/^[ \t]*-[ \t]*一致性核对[::][^\n]*未发现冲突条目/m.test(questions)) errors.push("no-clarification-required analysis must record a 一致性核对 line stating no conflicts found.");
80
+ }
62
81
  if (/\bAC-(?:FE|BE)-\d{3,}\b|^Given[::]|^When[::]|^Then[::]/m.test(text)) errors.push("Product Analysis must use acceptance concerns, not formal AC IDs or Given/When/Then blocks.");
63
82
  if (/^##\s+(?:\d+[.、]?\s*)?(?:用户角色|初步验收标准汇总)\s*$/m.test(text)) errors.push("Product Analysis must not contain standalone 用户角色 or 初步验收标准汇总 sections.");
64
83
 
@@ -104,6 +104,15 @@ if (!questionBlocks.length) {
104
104
  if (status === "complete" && !/^[ \t]*-[ \t]*共同理解[::][ \t]*已确认\s*$/m.test(section(clarification.text, 2, "决策索引") ?? "")) {
105
105
  errors.push("Complete question-based clarification must record 共同理解:已确认 in 决策索引.");
106
106
  }
107
+ // 「输入↔规范一致性核对」闭环:PA 待确认问题的冲突事实必须被 Q-* 覆盖
108
+ const analysisAnalysis = section(analysis.text, 2, "需求分析") ?? "";
109
+ const paQuestions = section(analysisAnalysis, 3, "待确认问题") ?? "";
110
+ const paConflictIds = [...(paQuestions.match(/冲突来源[::][^\n]*/g) ?? [])].flatMap((line) => line.match(/\b(?:KB|CODE)-FACT-\d+\b/g) ?? []);
111
+ for (const id of [...new Set(paConflictIds)]) {
112
+ const covering = questionBlocks.filter((block) => block.text.includes(id));
113
+ if (!covering.length) errors.push(`${id} referenced by Product Analysis pending questions must be covered by a Q-* record.`);
114
+ else if (status === "complete" && !covering.some((block) => (field(block.text, "状态") ?? "") === "confirmed")) errors.push(`${id} must be confirmed by an explicit user answer before clarification can be complete.`);
115
+ }
107
116
  }
108
117
 
109
118
  printResult("Requirement Clarification", clarification.path, errors);
@@ -1 +0,0 @@
1
- import{ag as o,ah as n}from"./mermaid.core-DTwZdcUQ.js";const t=(a,r)=>o.lang.round(n.parse(a)[r]);export{t as c};
@@ -1 +0,0 @@
1
- import{s as a,c as s,a as e,C as t}from"./chunk-GF5L2VYU-KUGA4ndX.js";import{_ as i}from"./mermaid.core-DTwZdcUQ.js";import"./chunk-5VM5RSS4-DyBfxRXh.js";import"./chunk-XXDRQBXY-avXbO4RW.js";import"./chunk-KBJHAD2P-BSnwJm3J.js";import"./chunk-2GRJ4B5K-indAMcNl.js";import"./index-CnJwuIKx.js";var n={parser:e,get db(){return new t},renderer:s,styles:a,init:i(r=>{r.class||(r.class={}),r.class.arrowMarkerAbsolute=r.arrowMarkerAbsolute},"init")};export{n as diagram};
@@ -1 +0,0 @@
1
- import{s as a,c as s,a as e,C as t}from"./chunk-GF5L2VYU-KUGA4ndX.js";import{_ as i}from"./mermaid.core-DTwZdcUQ.js";import"./chunk-5VM5RSS4-DyBfxRXh.js";import"./chunk-XXDRQBXY-avXbO4RW.js";import"./chunk-KBJHAD2P-BSnwJm3J.js";import"./chunk-2GRJ4B5K-indAMcNl.js";import"./index-CnJwuIKx.js";var n={parser:e,get db(){return new t},renderer:s,styles:a,init:i(r=>{r.class||(r.class={}),r.class.arrowMarkerAbsolute=r.arrowMarkerAbsolute},"init")};export{n as diagram};
@@ -1 +0,0 @@
1
- import{s as r,b as e,a,S as s}from"./chunk-5RXB4S5H-BluRngmE.js";import{_ as i}from"./mermaid.core-DTwZdcUQ.js";import"./chunk-XXDRQBXY-avXbO4RW.js";import"./chunk-KBJHAD2P-BSnwJm3J.js";import"./chunk-2GRJ4B5K-indAMcNl.js";import"./index-CnJwuIKx.js";var u={parser:a,get db(){return new s(2)},renderer:e,styles:r,init:i(t=>{t.state||(t.state={}),t.state.arrowMarkerAbsolute=t.arrowMarkerAbsolute},"init")};export{u as diagram};
@@ -1,8 +0,0 @@
1
- import{c as r,s as e}from"./flowDiagram-UKHOOZJN-Dg7DfZPD.js";import{_ as a}from"./mermaid.core-DTwZdcUQ.js";import"./chunk-5VM5RSS4-DyBfxRXh.js";import"./chunk-XXDRQBXY-avXbO4RW.js";import"./chunk-KBJHAD2P-BSnwJm3J.js";import"./chunk-2GRJ4B5K-indAMcNl.js";import"./channel-Bor-DZxZ.js";import"./index-CnJwuIKx.js";var o=a(t=>`${e(t)}
2
- .swimlane.cluster rect {
3
- stroke: ${t.clusterBorder} !important;
4
- }
5
- [data-look="neo"].cluster rect {
6
- filter: none;
7
- }
8
- `,"getStyles"),s=o,n=r({defaultLayout:"swimlane",styles:s});export{n as diagram};