@namewta/speculo 0.3.0 → 0.3.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (149) hide show
  1. package/README.md +1 -2
  2. package/dist/src/cli.js +40 -6
  3. package/dist/src/cli.js.map +1 -1
  4. package/dist/src/index.js +5 -0
  5. package/dist/src/index.js.map +1 -1
  6. package/dist/src/skills-mirror.d.ts +38 -0
  7. package/dist/src/skills-mirror.js +160 -0
  8. package/dist/src/skills-mirror.js.map +1 -0
  9. package/package.json +3 -2
  10. package/template/canonical/README.md +7 -1
  11. package/template/canonical/canonical-specdev-engineering-cognitive-mentor.md +2040 -0
  12. package/template/canonical/canonical-specdev-goal-plan.md +1379 -0
  13. package/template/canonical/canonical-specdev-grill-with-docs.md +848 -285
  14. package/template/canonical/canonical-specdev-spec.md +1061 -46
  15. package/template/canonical/canonical-specdev-tickets.md +1529 -175
  16. package/template/canonical/canonical-specdev-wayfinder.md +677 -107
  17. package/template/commands/git-repository-audit.md +682 -0
  18. package/template/workflows/specdev/A-archive-and-consolidate/A-archive-and-consolidate.md +69 -36
  19. package/template/workflows/specdev/A-archive-and-consolidate/archive-checklist.md +15 -0
  20. package/template/workflows/specdev/A-archive-and-consolidate/knowledge-promotion-rules.md +32 -0
  21. package/template/workflows/specdev/D-diagnose-bugs/D-diagnose-bugs.md +51 -51
  22. package/template/workflows/specdev/D-diagnose-bugs/diagnosis-template.md +64 -0
  23. package/template/workflows/specdev/E-engineering-cognitive-mentor/E-engineering-cognitive-mentor.md +252 -0
  24. package/template/workflows/specdev/E-engineering-cognitive-mentor/architecture-guidance.md +90 -0
  25. package/template/workflows/specdev/E-engineering-cognitive-mentor/bug-guidance.md +80 -0
  26. package/template/workflows/specdev/E-engineering-cognitive-mentor/codebase-guidance.md +107 -0
  27. package/template/workflows/specdev/E-engineering-cognitive-mentor/comprehension-and-closure.md +95 -0
  28. package/template/workflows/specdev/E-engineering-cognitive-mentor/domain-learning-guidance.md +62 -0
  29. package/template/workflows/specdev/E-engineering-cognitive-mentor/evidence-and-options.md +132 -0
  30. package/template/workflows/specdev/E-engineering-cognitive-mentor/interaction-protocol.md +116 -0
  31. package/template/workflows/specdev/E-engineering-cognitive-mentor/mentor-report-template.md +135 -0
  32. package/template/workflows/specdev/E-engineering-cognitive-mentor/mode-routing.md +47 -0
  33. package/template/workflows/specdev/E-engineering-cognitive-mentor/persistence-and-resume.md +147 -0
  34. package/template/workflows/specdev/E-engineering-cognitive-mentor/requirements-guidance.md +92 -0
  35. package/template/workflows/specdev/G-grill-with-docs/G-grill-with-docs.md +100 -30
  36. package/template/workflows/specdev/G-grill-with-docs/adr-format.md +22 -77
  37. package/template/workflows/specdev/G-grill-with-docs/context-format.md +27 -53
  38. package/template/workflows/specdev/G-grill-with-docs/domain-modeling-rules.md +6 -82
  39. package/template/workflows/specdev/G-grill-with-docs/grilling-protocol.md +32 -49
  40. package/template/workflows/specdev/G-grill-with-docs/log-format.md +16 -98
  41. package/template/workflows/specdev/I-implement/I-implement.md +168 -52
  42. package/template/workflows/specdev/I-implement/code-review-process.md +10 -76
  43. package/template/workflows/specdev/I-implement/codebase-design-glossary.md +12 -109
  44. package/template/workflows/specdev/I-implement/deepening.md +12 -32
  45. package/template/workflows/specdev/I-implement/design-it-twice.md +6 -41
  46. package/template/workflows/specdev/I-implement/evidence-template.md +69 -0
  47. package/template/workflows/specdev/I-implement/execution-preflight.md +20 -0
  48. package/template/workflows/specdev/I-implement/tdd-examples.md +10 -135
  49. package/template/workflows/specdev/I-implement/tdd-rules.md +12 -28
  50. package/template/workflows/specdev/I-init-setup/I-init-setup.md +81 -86
  51. package/template/workflows/specdev/I-init-setup/change-status-template.json +15 -0
  52. package/template/workflows/specdev/I-init-setup/config-template.json +26 -0
  53. package/template/workflows/specdev/I-init-setup/domain-layout-template.md +23 -0
  54. package/template/workflows/specdev/I-init-setup/status-labels-template.md +55 -0
  55. package/template/workflows/specdev/I-init-setup/status-template.json +7 -0
  56. package/template/workflows/specdev/I-init-setup/tracking-template.md +10 -0
  57. package/template/workflows/specdev/INDEX.md +165 -82
  58. package/template/workflows/specdev/P-goal-plan/P-goal-plan.md +108 -44
  59. package/template/workflows/specdev/P-goal-plan/completion-control.md +79 -0
  60. package/template/workflows/specdev/P-goal-plan/goal-plan-template.md +105 -0
  61. package/template/workflows/specdev/P-goal-plan/orchestration-protocol.md +115 -0
  62. package/template/workflows/specdev/P-goal-plan/planning-modes.md +70 -0
  63. package/template/workflows/specdev/R-review-architecture/R-review-architecture.md +103 -40
  64. package/template/workflows/specdev/R-review-architecture/architecture-review-report-template.html +58 -0
  65. package/template/workflows/specdev/R-review-architecture/architecture-review-template.md +68 -0
  66. package/template/workflows/specdev/R-review-architecture/proposal-to-ticket.md +11 -0
  67. package/template/workflows/specdev/S-spec/S-spec.md +103 -49
  68. package/template/workflows/specdev/S-spec/spec-readiness.md +16 -0
  69. package/template/workflows/specdev/S-spec/spec-template.md +95 -0
  70. package/template/workflows/specdev/T-tickets/T-tickets.md +146 -133
  71. package/template/workflows/specdev/T-tickets/decomposition-rules.md +56 -0
  72. package/template/workflows/specdev/T-tickets/ticket-readiness.md +45 -0
  73. package/template/workflows/specdev/T-tickets/ticket-template.md +124 -0
  74. package/template/workflows/specdev/T-tickets/tickets-map-template.md +52 -50
  75. package/template/workflows/specdev/T-triage/T-triage.md +32 -63
  76. package/template/workflows/specdev/T-triage/triage-template.md +29 -0
  77. package/template/workflows/specdev/W-wayfinder/W-wayfinder.md +88 -155
  78. package/template/workflows/specdev/W-wayfinder/investigation-ticket-template.md +50 -0
  79. package/template/workflows/specdev/W-wayfinder/wayfinder-map-template.md +46 -0
  80. package/template/workflows/specdev/_state/status.json +1 -1
  81. package/template/workflows/specdev/common/README.md +47 -0
  82. package/template/workflows/specdev/common/rules/artifact-contract.md +57 -0
  83. package/template/workflows/specdev/common/rules/code-commenting-rule.md +39 -0
  84. package/template/workflows/specdev/common/rules/deviation-control.md +43 -0
  85. package/template/workflows/specdev/common/rules/evidence-and-verification.md +57 -0
  86. package/template/workflows/specdev/common/rules/path-ownership.md +35 -0
  87. package/template/workflows/specdev/common/rules/path-reference-contract.md +116 -0
  88. package/template/workflows/specdev/common/rules/planning-principles.md +57 -0
  89. package/template/workflows/specdev/common/rules/readiness-and-depth.md +51 -0
  90. package/template/workflows/specdev/common/schemas/change-status.schema.json +170 -0
  91. package/template/workflows/specdev/common/schemas/config.schema.json +54 -0
  92. package/template/workflows/specdev/common/schemas/goal-plan.schema.json +21 -0
  93. package/template/workflows/specdev/common/schemas/spec.schema.json +16 -0
  94. package/template/workflows/specdev/common/schemas/status.schema.json +149 -0
  95. package/template/workflows/specdev/common/schemas/ticket.schema.json +130 -0
  96. package/template/workflows/specdev/common/schemas/tickets-map.schema.json +14 -0
  97. package/template/workflows/specdev/common/skills/dev-worktree/SKILL.md +28 -0
  98. package/template/workflows/specdev/common/skills/dev-worktree/references/create.md +30 -0
  99. package/template/workflows/specdev/common/skills/dev-worktree/references/finalize.md +16 -0
  100. package/template/workflows/specdev/common/skills/research/SKILL.md +43 -0
  101. package/template/workflows/specdev/common/tools/README.md +16 -0
  102. package/template/workflows/specdev/common/tools/validate-specdev.mjs +1155 -0
  103. package/template/canonical/canonical-teach.md +0 -301
  104. package/template/workflows/specdev/A-archive-and-consolidate/archive-rules.md +0 -49
  105. package/template/workflows/specdev/A-archive-and-consolidate/cleanup-rules.md +0 -80
  106. package/template/workflows/specdev/A-archive-and-consolidate/consolidation-rules.md +0 -122
  107. package/template/workflows/specdev/A-archive-and-consolidate/discrimination-guide.md +0 -96
  108. package/template/workflows/specdev/A-archive-and-consolidate/knowledge-graduation.md +0 -51
  109. package/template/workflows/specdev/D-diagnose-bugs/cleanup-postmortem.md +0 -37
  110. package/template/workflows/specdev/D-diagnose-bugs/feedback-loop-techniques.md +0 -84
  111. package/template/workflows/specdev/D-diagnose-bugs/hypothesis-format.md +0 -46
  112. package/template/workflows/specdev/D-diagnose-bugs/instrumentation-rules.md +0 -51
  113. package/template/workflows/specdev/I-init-setup/domain-layout.md +0 -55
  114. package/template/workflows/specdev/I-init-setup/status-labels.md +0 -53
  115. package/template/workflows/specdev/I-init-setup/tracking-convention.md +0 -52
  116. package/template/workflows/specdev/P-goal-plan/execution-sections.md +0 -126
  117. package/template/workflows/specdev/P-goal-plan/governance-sections.md +0 -103
  118. package/template/workflows/specdev/P-goal-plan/input-validation.md +0 -94
  119. package/template/workflows/specdev/P-goal-plan/lead-orchestration-protocol.md +0 -158
  120. package/template/workflows/specdev/P-goal-plan/quick-reference-table.md +0 -60
  121. package/template/workflows/specdev/P-goal-plan/vision-sections.md +0 -80
  122. package/template/workflows/specdev/R-review-architecture/exploration-guide.md +0 -103
  123. package/template/workflows/specdev/R-review-architecture/html-report-template.md +0 -124
  124. package/template/workflows/specdev/T-triage/artifact-templates.md +0 -122
  125. package/template/workflows/specdev/T-triage/intake-rules.md +0 -71
  126. package/template/workflows/specdev/T-triage/routing-rules.md +0 -70
  127. package/template/workflows/specdev/T-triage/understanding-rules.md +0 -102
  128. package/template/workflows/specdev/_state/adr/.gitkeep +0 -0
  129. package/template/workflows/specdev/_state/context/.gitkeep +0 -0
  130. package/template/workflows/specdev/_state/research/.gitkeep +0 -0
  131. package/template/workflows/specdev/common/dev-worktree/SKILL.md +0 -48
  132. package/template/workflows/specdev/common/dev-worktree/references/create.md +0 -63
  133. package/template/workflows/specdev/common/dev-worktree/references/finalize.md +0 -102
  134. package/template/workflows/specdev/common/handoff/SKILL.md +0 -42
  135. package/template/workflows/specdev/common/neat-freak/SKILL.md +0 -210
  136. package/template/workflows/specdev/common/neat-freak/references/agent-paths.md +0 -72
  137. package/template/workflows/specdev/common/neat-freak/references/governance.md +0 -88
  138. package/template/workflows/specdev/common/neat-freak/references/sync-matrix.md +0 -77
  139. package/template/workflows/specdev/common/neat-freak/references/verification.md +0 -92
  140. package/template/workflows/specdev/common/neat-freak/scripts/audit-inventory.sh +0 -106
  141. package/template/workflows/specdev/common/prototype/LOGIC.md +0 -89
  142. package/template/workflows/specdev/common/prototype/SKILL.md +0 -78
  143. package/template/workflows/specdev/common/prototype/UI.md +0 -120
  144. package/template/workflows/specdev/common/research/SKILL.md +0 -54
  145. package/template/workflows/specdev/common/resolving-merge-conflicts/SKILL.md +0 -14
  146. package/template/workflows/specdev/common/scripts/hitl-loop.template.sh +0 -41
  147. package/template/workflows/specdev/common/triage/AGENT-BRIEF.md +0 -204
  148. package/template/workflows/specdev/common/triage/OUT-OF-SCOPE.md +0 -104
  149. package/template/workflows/specdev/common/triage/SKILL.md +0 -112
@@ -1,198 +1,768 @@
1
1
  # 寻路
2
2
 
3
- > **配套上传建议**:本能力跨引用「设计访谈(带文档)」的访谈协议与领域建模规程。若在网页 AI 平台使用,建议同时上传 `canonical-specdev-grill-with-docs.md`。仓库:https://github.com/NAMEWTA/Speculo
3
+ ## 网页平台运行约定
4
4
 
5
- 一个模糊的想法出现了 —— 太大而无法放入单个 agent 会话,且笼罩在迷雾中:从当前状态到**目标**的路径尚不可见。寻路(Wayfinding)就是找到那条路,而非冲向目标。此 work 在变更目录中绘制路径作为一张**共享地图**,然后逐个处理其 tickets,直到路径变得清晰。
5
+ 本文是可独立上传的单文件能力快照,不依赖 Speculo CLI 的根别名或源目录。执行时统一采用以下逻辑布局:
6
6
 
7
- 目标因工作而异,命名目标是绘制地图的第一步 —— 它塑造每个 ticket。目标可能是一份待移交和迭代的 spec、一个在规划开始前需锁定的决策、或是一个原地完成的变更(如数据结构迁移)。地图是领域无关的 —— 工程工作、课程内容,任何符合此形态的内容都可以。
7
+ - 项目根下的 `specdev/` 是状态区;全局配置与状态分别为 `specdev/config.json` `specdev/status.json`。
8
+ - 当前 change 位于 `specdev/changes/{change}/`,其中 `{change}` 使用 `YYYY-MM-DD-<kebab-topic>`。
9
+ - 当前 change 的设计、规划和证据工件都写入该目录;永久 ADR、领域上下文和研究分别写入 `specdev/adr/`、`specdev/context/` 和 `specdev/research/`。
10
+ - `specdev/config.json` 或 `specdev/status.json` 不存在时,分别按下方 `<config-template>` 和 `<status-template>` 标签创建;新建 change 时按下方 `<change-status-template>` 标签创建 `.status.json`。对应 schema 用于结构核对。
11
+ - 项目代码与测试始终使用项目根相对路径;不写机器绝对路径。工件之间使用上述逻辑路径,不使用 Speculo 的运行时路径标签。
12
+ - 如果网页平台不能直接写项目文件,则按目标文件名输出完整内容,并在答复中明确应保存的位置;不得把“无法写文件”伪装成已经持久化。
13
+ - 若本地项目提供 Speculo Node 校验器,可运行它补充结构校验;纯网页环境按本文内联的 schema、Ready 清单和完成标准逐项核对,并明确记录未运行的自动校验。
14
+ - 提交、推送、合并、部署、发布、归档移动和不可逆迁移仍需用户明确授权。
8
15
 
9
- ## 规划,而非执行
16
+ Wayfinder 用于“尚不知道怎样安全形成 Spec 或实现路线”的场景。它保留共享地图、多会话领取、研究型 Ticket 和决策型 Ticket 的能力,但禁止把产品实现伪装成调查。
10
17
 
11
- Wayfinder 默认进行**规划**:每个 ticket 解决一个决策,当地图完成时路径就清晰了 —— 在某人动手做事之前没有任何剩余的决策。想要直接动手做事的冲动通常就是信号,表明你已经到达地图的边缘,是时候移交了。一项工作可以通过其「说明」章节覆盖此行为 —— 将执行带入地图本身 —— 但如果没有明确说明,产出决策,而非可交付成果。
18
+ ## 产物
12
19
 
13
- ## 用名称引用
20
+ - 共享地图:`specdev/changes/{change}/wayfinder-map.md`
21
+ - 调查 Ticket 目录:`specdev/changes/{change}/investigation/`
22
+ - 单个调查 Ticket:`specdev/changes/{change}/investigation/{investigation-id}.md`
23
+ - 调查 Evidence:`specdev/changes/{change}/investigation/evidence/`
24
+ - 全局领取状态:`specdev/status.json` 中当前 change 的 `claimed_investigations`
14
25
 
15
- 每张地图和每个 ticket 都有其**名称** —— 即其标题或标识。在人类阅读的所有内容中 —— 叙述、地图的「已做出的决策」 —— 使用名称引用它,绝不使用裸 ID、编号或 slug。一堵 `#42, #43, #44` 的墙是难以阅读的;名称可以一目了然。引用标记不会消失 —— 名称包裹着其引用 —— 但它们在名称*内部*,绝不是名称的替代品。
26
+ 模板:
16
27
 
17
- 在本地 markdown 地图中,使用 Markdown 链接 `[ticket 标题](#ticket-标题)` 进行引用。已解决的 tickets 在地图的「已做出的决策」中以 `- [ticket 标题] —— 答案概括` 形式索引。
28
+ - 下方 `<investigation-ticket-template>` 标签
29
+ - 下方 `<wayfinder-map-template>` 标签
18
30
 
19
- ## 地图
31
+ ## 何时运行
20
32
 
21
- 地图是变更目录下的单个 markdown 文件 map.md,是规范的产物。其 tickets 是地图内的 task list items(`- [ ]` 格式)。如果工作范围跨多个变更,地图位于主变更目录下。
33
+ - 路径未知,无法安全写出 Ready Spec Ticket;
34
+ - 需要跨多个领域、技术栈或外部系统调查;
35
+ - 调查量超出单个上下文,适合并行研究;
36
+ - 存在多个相互依赖的高影响未知项;
37
+ - 需要在若干候选方案中先获得事实证据再做决定。
22
38
 
23
- 地图是一个**索引**,而非存储。它列出已做出的决策并指向持有其详细信息的 tickets;一个决策只存在于一个地方 —— 其 ticket —— 因此地图从不重述,仅概括并链接。
39
+ 若问题只是一个可在当前上下文通过短暂只读探索回答的事实,不创建 Wayfinder Map。
24
40
 
25
- **地图物理结构:** 地图文件本身是 markdown 文件。Tickets 是地图文件内的编号 task list items,而非外部 issues。每个 ticket 拥有一个独立的 markdown 小节,包含标题、类型标签、问题和答案。状态通过 checkbox 标记追踪(`- [ ]` 开放,`- [x]` 已解决)。阻塞、领取与前沿的定义见下方「Tickets」节。
41
+ ## 流程
26
42
 
27
- ### 地图正文
43
+ ### 1. 定义目标与未知项
28
44
 
29
- 整个地图的低分辨率视图,每个会话加载一次。开放的 tickets **不**在此处列出 —— 它们直接作为地图文件中的未勾选小节存在。
45
+ 写明最终目标、已知边界、当前不能决定的事项和“为什么这些未知项阻塞规划”。未知项分为:
30
46
 
31
- ```markdown
32
- # 地图:<工作名称>
47
+ - **research**:答案可由代码、文档、实验或外部来源证实;
48
+ - **decision**:事实已足够,但需要用户或架构 owner 做取舍;
49
+ - **validation**:已有方案,需要实验验证关键可行性或风险;
50
+ - **mapping**:需要建立调用链、数据流、依赖图或影响面。
33
51
 
34
- ## 目的地
52
+ 低影响实现细节不创建调查 Ticket。
35
53
 
36
- <到达此地图终点时的样子 —— 此工作正在寻路的 spec、决策或变更。一到两行;每个会话在挑选 ticket 之前以其为定位。>
54
+ ### 2. 建立共享地图
37
55
 
38
- ## 说明
56
+ 使用 下方 `<wayfinder-map-template>` 标签 写入 `specdev/changes/{change}/wayfinder-map.md`:
39
57
 
40
- <领域;每个会话应咨询的技能;此工作的常设偏好>
58
+ - 每个 Ticket 只关闭一个高影响未知项;
59
+ - 写明依赖、owner、领取状态、停止条件和结果消费方;
60
+ - 构建调查 DAG,避免多个调查重复回答同一问题;
61
+ - 标记可并行调查和必须串行的决策点;
62
+ - 定义整体停止条件,不以“所有可能问题都研究完”为目标。
41
63
 
42
- ## 已做出的决策
64
+ ### 3. 领取与并行
43
65
 
44
- <!-- 索引 —— 每个已关闭 ticket 一行:足以判断相关性,然后跳转到对应小节查看详细信息 -->
66
+ 调查者开始前原子地更新 `specdev/status.json` `claimed_investigations`:
45
67
 
46
- - [<已关闭 ticket 标题>](#ticket-标题) —— <答案的一句话概括>
68
+ - 未领取且依赖满足 设置 owner、session 和 claimed 时间;
69
+ - 已领取 → 跳过并选择其他可用 Ticket;
70
+ - 超过配置的 claim 超时且无进展 → 允许在记录原因后回收;
71
+ - 完成或释放后从领取集合移除,并同步共享地图。
47
72
 
48
- ## 尚未明确
73
+ 并行调查使用独立上下文;不要复制所有调查历史,只读取共享地图、当前调查 Ticket、相关上游工件和必要代码事实。
49
74
 
50
- <!-- 参见"战争迷雾":范围内但你尚无法做成 ticket 的迷雾;随着前沿推进而升级 -->
75
+ ### 4. 执行调查
51
76
 
52
- ## 超出范围
77
+ 调查默认只读。允许:
53
78
 
54
- <!-- 参见"超出范围":被裁定在目标之外的工作;已关闭,永不升级 -->
55
- ```
79
+ - 代码搜索与静态分析;
80
+ - 文档、规范和官方来源研究;
81
+ - 可撤销的临时实验、最小原型或插桩;
82
+ - 性能测量、调用点扫描、schema 对比或兼容性验证。
56
83
 
57
- ### Tickets
84
+ 外部研究使用 下方 `<research>` 标签。
58
85
 
59
- 每个 ticket 是地图文件内的一个小节,其正文是问题,大小适配一个 100K token 的 agent 会话。Tickets 按创建顺序编号。
86
+ 禁止:
60
87
 
61
- ```markdown
62
- ## <编号>. <Ticket 标题> `[<类型>]` `[<HITL|AFK>]`
88
+ - 顺手实现产品功能;
89
+ - 提交未经审查的实验代码;
90
+ - 将原型视为最终架构;
91
+ - 在没有证据时把建议写成事实;
92
+ - 无停止条件地持续研究。
63
93
 
64
- **类型:** <research | prototype | grilling | task>
94
+ ### 5. 记录结果与影响
65
95
 
66
- **交互模式:** <HITL | AFK> —— <简要说明为何是此模式>
96
+ 每个调查结果区分:
67
97
 
68
- **状态:** < - [ ] 开放 | - [x] 已解决 >
98
+ - 官方或规范事实;
99
+ - 当前代码事实;
100
+ - 实验结果;
101
+ - 推断;
102
+ - 建议;
103
+ - 用户或 owner 决策。
69
104
 
70
- **被阻塞于:** <阻塞此 ticket 的 ticket 标题列表,或"无 —— 可立即开始">
105
+ 写明来源、版本、置信度、适用范围、反例、仍未知项和对以下工件的影响:
71
106
 
72
- ### 问题
107
+ - `specdev/changes/{change}/spec.md`;
108
+ - `specdev/changes/{change}/ADR.md`;
109
+ - `specdev/changes/{change}/ticket/NN-<ticket-name>.md`;
110
+ - `specdev/changes/{change}/diagnosis.md`。
73
111
 
74
- <此 ticket 要解决的决策或调查>
112
+ 调查完成、阻塞或释放时,同步调查 Ticket、调查 Evidence、共享地图和领取状态,并返回 investigation ID、状态及三份工件的完整路径。
75
113
 
76
- ### 答案
114
+ 状态使用 `open | claimed | confirmed | disproved | decision-needed | unresolved | superseded | cancelled`。
77
115
 
78
- <!-- 解决时填写 —— 答案的完整记录。以下仅在 ticket 已解决时出现:-->
116
+ ### 6. 收敛与退出
79
117
 
80
- <解决此 ticket 时记录的内容。对于 research:发现的摘要和链接资产。对于 prototype:原型的描述和链接。对于 grilling:访谈达成的共识。对于 task:已完成的工作和结果性事实。>
81
- ```
118
+ 当剩余未知项不再阻止目标、行为、架构、风险或验证决策时停止。根据结果进入:
82
119
 
83
- 每个 ticket 携带一个类型标签 —— 以下之一:`research`、`prototype`、`grilling`、`task`(参见下方 [Ticket 类型](#ticket-类型))。
120
+ - 需要产品或架构取舍 “设计访谈能力”;
121
+ - 外部行为已清楚 → “编写 Spec 阶段”;
122
+ - Spec 已 Ready 且只是实现拆分未知 → “拆分 Tickets 阶段”;
123
+ - Bug 根因路径已收敛 → “Bug 诊断阶段”;
124
+ - 仍存在高影响未知项 → 保持 blocked,并明确下一调查或用户决策。
84
125
 
85
- **领取机制:** 一个会话通过将其名称追加到 `specdev/status.json` 的当前 change 的 `active` 条目中的 `claimed_tickets` 数组来**领取**一个 ticket,在开始任何工作**之前**领取,以便并发会话跳过它。该记录*就是*领取标记:一个开放、未被领取的 ticket 是未被领取的。
126
+ 长期有效且经实现验证的研究,只有在归档时由 “归档与沉淀阶段” 提升。
86
127
 
87
- **阻塞关系:** 使用 ticket 标题在"被阻塞于"字段中声明依赖。这很关键,因为它使前沿在地图文件中*可视化*呈现 —— 人类无需额外工具就能看到哪些可以开始。当一个 ticket 的所有阻塞 tickets 都已勾选(已解决)时,该 ticket 是**未被阻塞的**;**前沿**是开放(未勾选)、未被阻塞、未被领取的 tickets —— 即已知的边界。
128
+ ## 完成标准
88
129
 
89
- **答案:** 不是正文的一部分 —— 它在解决时写入 ticket 的"答案"小节(参见[遍历地图](#遍历地图))。解决 ticket 时创建的资产从 ticket 小节链接,而非粘贴进去。如果资产是文件,放置在变更目录下,从 ticket 链接。
130
+ - 共享地图、调查 Ticket 和领取状态一致;
131
+ - 每个调查只关闭一个高影响未知项;
132
+ - 结论区分事实、实验、推断、建议和决定;
133
+ - 来源、版本、置信度和停止条件可追踪;
134
+ - 并行调查没有重复领取或互相覆盖;
135
+ - 调查状态及 Ticket、Evidence、共享地图路径已返回;
136
+ - 没有把产品实现藏在调查中;
137
+ - 已明确下一 work 或阻塞决策。
90
138
 
91
- ## Ticket 类型
139
+ ## 子文件引用
140
+
141
+ - 调查 Ticket 模板:下方 `<investigation-ticket-template>` 标签
142
+ - 共享地图模板:下方 `<wayfinder-map-template>` 标签
92
143
 
93
- 每个 ticket 要么是 **HITL** —— 人在回路中,与一个代表自己发言的人类*一起*工作 —— 要么是 **AFK**,由 agent 独立驱动。HITL ticket 只能通过实时交流来解决;agent 绝不代替人类一方发言(一个自问自答的质询 agent 已经破坏了这一点)。
144
+ ---
94
145
 
95
- - **Research**(AFK):调用 common/research skill 启动后台 Agent 针对一手来源调查问题,在 ticket 的答案中链接研究产出文件。当需要当前工作目录之外的知识时使用。
96
- - **Prototype**(HITL):调用 common/prototype skill 制作一个廉价、粗糙、具体的产物来提高讨论的保真度 —— 大纲、粗略尝试、桩代码、或 UI/逻辑代码。将原型链接为资产。当"它应该是什么样子"或"它应该怎样表现"是关键问题时使用。
97
- - **Grilling**(HITL):通过设计访谈(G-grill-with-docs)的访谈协议逐个问题进行对话。同时使用其领域建模规程维护领域模型。默认情况 —— 当不确定类型时选此。
98
- - **Task**(HITL 或 AFK):在*决策*能够做出之前必须完成的手动工作 —— 没有需要决定、原型化或研究的内容,但讨论被阻塞直到完成。注册服务以便判断其 API、开通访问权限、移动数据以便看到其形态。这是唯一一个*执行*而非决策的类型 —— 它通过为决策解除阻塞来赢得其位置,而非通过交付目标。Agent 在可能的情况下独立驱动(AFK);否则它交给人类一份精确的清单(HITL)。当工作完成时解决;答案记录已完成的工作以及后续 tickets 依赖的任何结果性事实(凭据位置、新 URL、行数)。
146
+ ## 参考内容
99
147
 
100
- ## 战争迷雾
148
+ 以下内容均已内联。主流程提到标签时,直接使用对应标签中的完整规则、模板或 schema。
101
149
 
102
- 地图是*刻意*不完整的:不要绘制你还看不到的内容。在活跃的 tickets 之外是**战争迷雾** —— 你能感觉到即将到来但尚无法确定的决策和调查的模糊视野,因为它们依赖于尚未解决的问题。解决一个 ticket 会清除它前方的迷雾,将任何现在可以明确的内容升级为新的 tickets —— 逐个进行,直到通往目标的路径清晰且没有剩余 tickets。
150
+ <investigation-ticket-template>
103
151
 
104
- 地图的**尚未明确**章节记录这些模糊视野:待定的问题、后续重新审视的区域。它是朝向目标*方向*的未发现前沿 —— 此处的所有内容都在范围内,只是不够清晰以做成 ticket。根据视野允许的范围,尽可能松散或完整地书写;它同时也是协作者阅读工作方向的路标。
152
+ ## 产物 YAML 头部
105
153
 
106
- **迷雾还是 ticket?** 判断标准是你是否现在就能精确地陈述问题 —— 而不是你现在是否能回答它。
154
+ 生成该工件时,将以下字段写在文档开头的 YAML frontmatter 中:
107
155
 
108
- - **做成 ticket 当** 问题已经清晰 —— 即使它被阻塞,你尚不能行动。你能写出明确的"问题"段落。
109
- - **尚未明确当** 你还无法如此精确地表述它。不要将迷雾预先切成 ticket 大小的碎片:它比 ticket 更粗糙,一个补丁可能在当前沿到达时升级为多个 tickets,或零个。
156
+ ```yaml
157
+ artifact: investigation-ticket
158
+ id: INV-01
159
+ type: research
160
+ status: open
161
+ blocked_by: []
162
+ owner: unassigned
163
+ claimed_by: null
164
+ claimed_at: null
165
+ ```
110
166
 
111
- **尚未明确**排除已决策的内容(「已做出的决策」)、已有的活跃 ticket 以及超出范围的内容(下一节)。
167
+ # Investigation INV-01: <问题>
112
168
 
113
- ## 超出范围
169
+ - **调查文件:** `specdev/changes/{change}/investigation/INV-01-<name>.md`
170
+ - **共享地图:** `specdev/changes/{change}/wayfinder-map.md`
171
+ - **Evidence:** `specdev/changes/{change}/investigation/evidence/INV-01.md`
114
172
 
115
- 迷雾只会向目标方向*聚集*。目标确定了范围,因此目标之外的工作是**超出范围**的 —— 它不是迷雾,也不属于**尚未明确**。它在地图上拥有自己的**超出范围**章节:你已自觉排除在*此*工作之外的工作。是范围而非清晰度让它落入此处。
173
+ ## 1. 决策用途
116
174
 
117
- 超出范围的工作永不升级 —— 前沿停在目标处 —— 因此只有在目标被重新划定后才会重新考虑,且以一个全新的工作而非恢复旧工作的形式出现。
175
+ - 要回答或决定什么:
176
+ - 为什么阻塞规划:
177
+ - 结果由哪个工件消费:
118
178
 
119
- 将某物裁定为超出范围是一个范围界定行为,而非路径上的一步。当已有的一个 ticket 被发现位于目标之外 —— 绘制地图时范围划分错误,或因某个解决方案而暴露 —— **关闭它**(勾选 checkbox),并在**超出范围**章节留下一行:概括加上为何超出范围,链接已关闭的 ticket。它不会出现在**已做出的决策**中,该节记录实际走过的路径 —— 范围边界不是路径上的一步。
179
+ ## 2. 已知事实与假设
120
180
 
121
- ## 调用方式
181
+ ### 已知事实
122
182
 
123
- 两种模式。无论哪种,**每个会话绝不解决超过一个 ticket。**
183
+ ### 待验证假设
124
184
 
125
- ### 绘制地图
185
+ ## 3. 调查契约
126
186
 
127
- 用户带着模糊的想法调用。
187
+ - **允许的代码探索:** `project/relative/path/**`
188
+ - **允许的实验:**
189
+ - **禁止的产品实现:**
190
+ - **来源优先级:**
191
+ - **停止条件:**
192
+ - **时间或资源边界:**
128
193
 
129
- 1. **命名目标。** 运行一次设计访谈(G-grill-with-docs)会话,以确定此地图正在寻路的目标 —— spec、决策或变更。目标确定了范围,因此先确定它。使用其访谈协议进行访谈,使用其领域建模规程维护领域模型。
194
+ ## 4. 结果
130
195
 
131
- **完成标准**:目标已命名,范围边界已确定。
196
+ - **状态:** confirmed / disproved / decision-needed / unresolved / superseded
197
+ - **结论:**
198
+ - **证据:**
199
+ - **置信度:** high / medium / low
200
+ - **适用范围与版本:**
201
+ - **反例或限制:**
202
+ - **对 Spec 的影响:** 无 / `specdev/changes/{change}/spec.md`
203
+ - **对 ADR 的影响:** 无 / `specdev/changes/{change}/ADR.md`
204
+ - **对 Ticket 的影响:** 无 / `specdev/changes/{change}/ticket/NN-<ticket-name>.md`
205
+ - **下一步:**
132
206
 
133
- 2. **绘制前沿。** 再次质询,这次**广度优先**:在整个空间上扩展而非深入任何一条线索,揭示开放的决策和现在可以迈出的第一步。如果此过程没有浮现任何迷雾 —— 通往目标的路径已经清晰,整个旅程足够小到放入一个会话 —— 你不需要地图。停下来询问用户他们希望如何继续。
207
+ </investigation-ticket-template>
134
208
 
135
- **完成标准**:前沿的开放决策和第一步已浮现;迷雾部分已识别并草拟。
209
+ <wayfinder-map-template>
136
210
 
137
- 3. **创建地图**:写入变更目录下的 map.md,填写「目的地」和「说明」,「已做出的决策」为空,迷雾草拟进**尚未明确**。
211
+ ## 产物 YAML 头部
138
212
 
139
- **完成标准**:地图文件已创建,目的地、说明、尚未明确、超出范围均已填写。
213
+ 生成该工件时,将以下字段写在文档开头的 YAML frontmatter 中:
140
214
 
141
- 4. **创建你现在能明确的 tickets** 作为地图文件内的小节 —— 然后在**第二遍**中连接阻塞边(tickets 需要首先有标题才能相互引用)。连接关系将它们排序为前沿和被阻塞;你尚无法明确的都在迷雾中 —— **尚未明确**章节。
215
+ ```yaml
216
+ artifact: wayfinder-map
217
+ change: <YYYY-MM-DD-topic>
218
+ status: active
219
+ ```
142
220
 
143
- **完成标准**:所有可明确的 tickets 已创建并连接阻塞边;迷雾已归入尚未明确。
221
+ # Wayfinder Map: <目标>
144
222
 
145
- 5. **停止** —— 绘制地图是一个会话的工作;不要同时解决 tickets。
223
+ - **共享地图:** `specdev/changes/{change}/wayfinder-map.md`
224
+ - **调查目录:** `specdev/changes/{change}/investigation/`
225
+ - **领取状态:** `specdev/status.json`
146
226
 
147
- ### 遍历地图
227
+ ## 1. 最终目标与当前边界
148
228
 
149
- 用户带着一张地图(变更目录或 map.md 路径)调用。Ticket 是**可选的** —— 不提供时,你选择下一个决策,而非用户。
229
+ ## 2. 调查清单
150
230
 
151
- 1. **加载地图** —— 低分辨率视图(目的地、说明、已做出的决策、尚未明确、超出范围),而非每个 ticket 的完整正文。
231
+ | ID | Type | 问题 | 为什么高影响 | Blocked By | Owner/Claim | 状态 | Result |
232
+ |---|---|---|---|---|---|---|---|
233
+ | INV-01 | research | ... | ... | — | unassigned | open | `specdev/changes/{change}/investigation/INV-01-<name>.md` |
152
234
 
153
- **完成标准**:地图的低分辨率视图已加载,当前状态已理解。
235
+ ## 3. 调查 DAG
154
236
 
155
- 2. **选择 ticket。** 如果用户指定了一个,使用它。否则按顺序选择第一个前沿 ticket。**领取它**(规则见上方「Tickets」节)。
237
+ ```text
238
+ INV-01
239
+ ├─→ INV-02
240
+ └─→ INV-03
241
+ ```
156
242
 
157
- **完成标准**:一个前沿 ticket 已被选中并领取。
243
+ ## 4. 并行与领取规则
158
244
 
159
- 3. **解决它** —— **按需缩放**:按需拉取任何相关或已关闭 ticket 的完整正文;调用「说明」中指定的技能。根据 ticket 类型选择解决方式:**research** 调用 common/research skill;**grilling** 使用设计访谈(G-grill-with-docs);**prototype** 调用 common/prototype skill;**task** 按问题描述执行。查阅设计访谈的领域建模规程维护领域模型。
245
+ - 最大并发来自 `specdev/config.json`。
246
+ - 当前领取集合以 `specdev/status.json` 为权威。
247
+ - 同一调查 Ticket 只能有一个 owner/session。
248
+ - 共享地图是状态投影,领取变更后必须同步。
160
249
 
161
- **完成标准**:ticket 的问题已解决,答案已记录。
250
+ ## 5. 决策收敛
162
251
 
163
- 4. **记录解决方案:** ticket 的"答案"小节中填写答案,将 checkbox `- [ ]` 改为 `- [x]`,在地图的「已做出的决策」中**追加一条上下文指针**:`- [ticket 标题] —— 答案的一句话概括`。从 `claimed_tickets` 中移除该 ticket(规则见上方「Tickets」节)。
252
+ | 未知项 | 当前结论 | 置信度 | 消费工件 | 是否仍阻塞 |
253
+ |---|---|---|---|---|
164
254
 
165
- **完成标准**:ticket checkbox 已勾选,「已做出的决策」已更新,领取标记已清除。
255
+ ## 6. 停止条件
166
256
 
167
- 5. **添加新浮现的 tickets** 作为地图文件内新的小节(先创建再连接阻塞边);升级答案使任何变得可明确的迷雾,从**尚未明确**中清除每个已升级的补丁,使其仅以其新 ticket 的形式存在。如果答案揭示某个 ticket —— 这个或其他 —— 位于目标之外,**将其裁定为超出范围**而非在路径上解决它。如果该决策使地图的其他部分无效,更新或删除这些 tickets(勾选并注明无效原因)。
257
+ - [ ] 所有高影响未知项已 confirmed、disproved,或明确转为用户/owner 决策。
258
+ - [ ] 可以形成 Ready Spec、Ticket、诊断契约或架构决策。
259
+ - [ ] 没有把产品实现留在调查 Ticket 中。
260
+ - [ ] 所有 claim 已释放或转为明确 blocked。
168
261
 
169
- **完成标准**:新浮现的 tickets 已添加,迷雾已升级或清除,超出范围的 tickets 已裁定。
262
+ </wayfinder-map-template>
170
263
 
171
- 用户可以并行运行未被阻塞的 tickets,因此需预期其他会话会并发编辑地图文件和 status.json。
264
+ <research>
172
265
 
173
- ### 完成
266
+ # SpecDev Research
174
267
 
175
- 当所有 tickets 已关闭(勾选)、迷雾已清空(尚未明确为空或仅剩无法继续分解的模糊项)、且通往目标的路径已清晰时,地图完成。向用户汇报:
268
+ ## 触发
176
269
 
177
- - 目的地是否已可抵达——路径上的每个步骤是否都已有明确的 ticket 或决策
178
- - 「已做出的决策」中的关键结论摘要
179
- - 剩余的任何**尚未明确**项——它们是否阻碍行动,还是可作为实现细节处理
180
- - 建议的下一步行动(移交实现、开始执行、或重新划定目标)
270
+ 当外部 API、库版本、协议、法规、产品能力或最佳实践会改变设计/实现决策,且当前材料不足时使用。
181
271
 
182
- **完成标准**:前沿已清空——无开放 tickets、无残留迷雾、通往目标的路径清晰。完成汇报已向用户呈现。
272
+ ## 流程
183
273
 
184
- ---
274
+ 1. 写清楚要支持的具体决策和停止条件。
275
+ 2. 优先官方文档、规范、源代码、论文或维护者材料;技术问题优先一手来源。
276
+ 3. 核对版本、发布日期、适用环境和已知限制。
277
+ 4. 区分:来源明确事实、代码库事实、推断、建议。
278
+ 5. 对关键结论至少交叉验证;来源冲突时并列呈现,不强行调和。
279
+ 6. 记录摘要、证据、置信度、对 ADR/Spec/Ticket 的影响和仍未知项。
280
+ 7. 长期有效且经实现验证后才可由 Archive 提升到永久 research。
185
281
 
186
- ## 子文件引用
282
+ ## 输出模板
187
283
 
188
- 本入口为单文件 work,所有内容均已内联。以下引用供 work 内各阶段加载(跨 workflow,不内联——建议配套上传设计访谈 canonical 文档):
284
+ ```markdown
285
+ # Research: <问题>
286
+ - 决策用途:
287
+ - 范围/版本:
288
+ - 停止条件:
289
+
290
+ ## Findings
291
+ ### R-001
292
+ - 结论:
293
+ - 类型:官方事实 / 代码事实 / 推断 / 建议
294
+ - 来源:
295
+ - 置信度:high / medium / low
296
+ - 适用限制:
297
+ - 对工件影响:
298
+
299
+ ## Conflicts and Unknowns
300
+ ## Recommendation
301
+ ```
189
302
 
190
- | 文件 | 触发条件 |
191
- |------|----------|
192
- | 设计访谈(G-grill-with-docs)主入口 | 需要访谈以命名目标或解决 grilling 类型 ticket |
193
- | 设计访谈的访谈协议(grilling-protocol) | 进入具体访谈——一次一问,决策树遍历 |
194
- | 设计访谈的领域建模规程(domain-modeling-rules) | 维护领域模型——术语精炼、决策记录 |
195
- | 变更目录下的 map.md | 地图持久化文件 |
303
+ 不得长篇复制受版权保护的来源;使用短引文和自己的准确摘要。
304
+
305
+ </research>
306
+
307
+ <config-template>
308
+
309
+ ```json
310
+ {
311
+ "schema_version": 3,
312
+ "interaction_language": "zh-CN",
313
+ "artifact_language": "zh-CN",
314
+ "git": {
315
+ "auto_commit": false,
316
+ "default_branch": null,
317
+ "worktree_for_parallel": true
318
+ },
319
+ "execution": {
320
+ "max_parallel": 3,
321
+ "deep_ticket_human_approval": true,
322
+ "shared_path_owner": "lead"
323
+ },
324
+ "verification": {
325
+ "test": null,
326
+ "typecheck": null,
327
+ "lint": null,
328
+ "build": null
329
+ },
330
+ "planning": {
331
+ "default_depth": "standard",
332
+ "require_ready_gate": true,
333
+ "require_evidence": true
334
+ }
335
+ }
336
+ ```
337
+
338
+ </config-template>
339
+
340
+ <config-schema>
341
+
342
+ ```json
343
+ {
344
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
345
+ "$id": "urn:speculo:specdev:config:v3",
346
+ "title": "SpecDev Configuration",
347
+ "type": "object",
348
+ "required": ["schema_version", "interaction_language", "artifact_language", "git", "execution", "verification", "planning"],
349
+ "properties": {
350
+ "schema_version": {"const": 3},
351
+ "interaction_language": {"type": "string", "minLength": 1},
352
+ "artifact_language": {"type": "string", "minLength": 1},
353
+ "git": {
354
+ "type": "object",
355
+ "required": ["auto_commit", "default_branch", "worktree_for_parallel"],
356
+ "properties": {
357
+ "auto_commit": {"type": "boolean"},
358
+ "default_branch": {"type": ["string", "null"]},
359
+ "worktree_for_parallel": {"type": "boolean"}
360
+ },
361
+ "additionalProperties": true
362
+ },
363
+ "execution": {
364
+ "type": "object",
365
+ "required": ["max_parallel", "deep_ticket_human_approval", "shared_path_owner"],
366
+ "properties": {
367
+ "max_parallel": {"type": "integer", "minimum": 1},
368
+ "deep_ticket_human_approval": {"type": "boolean"},
369
+ "shared_path_owner": {"type": "string", "minLength": 1}
370
+ },
371
+ "additionalProperties": true
372
+ },
373
+ "verification": {
374
+ "type": "object",
375
+ "required": ["test", "typecheck", "lint", "build"],
376
+ "properties": {
377
+ "test": {"type": ["string", "null"]},
378
+ "typecheck": {"type": ["string", "null"]},
379
+ "lint": {"type": ["string", "null"]},
380
+ "build": {"type": ["string", "null"]}
381
+ },
382
+ "additionalProperties": true
383
+ },
384
+ "planning": {
385
+ "type": "object",
386
+ "required": ["default_depth", "require_ready_gate", "require_evidence"],
387
+ "properties": {
388
+ "default_depth": {"enum": ["lite", "standard", "deep"]},
389
+ "require_ready_gate": {"type": "boolean"},
390
+ "require_evidence": {"type": "boolean"}
391
+ },
392
+ "additionalProperties": true
393
+ }
394
+ },
395
+ "additionalProperties": true
396
+ }
397
+ ```
398
+
399
+ </config-schema>
400
+
401
+ <status-template>
402
+
403
+ ```json
404
+ {
405
+ "schema_version": 3,
406
+ "workflow": "specdev",
407
+ "active": [],
408
+ "work_history": [],
409
+ "completed": []
410
+ }
411
+ ```
412
+
413
+ </status-template>
414
+
415
+ <status-schema>
416
+
417
+ ```json
418
+ {
419
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
420
+ "$id": "urn:speculo:specdev:status:v3",
421
+ "title": "SpecDev Global Status",
422
+ "type": "object",
423
+ "required": [
424
+ "schema_version",
425
+ "workflow",
426
+ "active",
427
+ "work_history",
428
+ "completed"
429
+ ],
430
+ "properties": {
431
+ "schema_version": {
432
+ "const": 3
433
+ },
434
+ "workflow": {
435
+ "const": "specdev"
436
+ },
437
+ "active": {
438
+ "type": "array",
439
+ "items": {
440
+ "type": "object",
441
+ "required": [
442
+ "change",
443
+ "current_work",
444
+ "works_run",
445
+ "result"
446
+ ],
447
+ "properties": {
448
+ "change": {
449
+ "type": "string"
450
+ },
451
+ "current_work": {
452
+ "type": [
453
+ "string",
454
+ "null"
455
+ ]
456
+ },
457
+ "works_run": {
458
+ "type": "array",
459
+ "items": {
460
+ "type": "string"
461
+ }
462
+ },
463
+ "result": {
464
+ "type": [
465
+ "string",
466
+ "null"
467
+ ]
468
+ },
469
+ "claimed_investigations": {
470
+ "type": "array",
471
+ "items": {
472
+ "type": "object",
473
+ "required": [
474
+ "id",
475
+ "owner",
476
+ "claimed_at"
477
+ ],
478
+ "properties": {
479
+ "id": {
480
+ "type": "string"
481
+ },
482
+ "owner": {
483
+ "type": "string"
484
+ },
485
+ "session": {
486
+ "type": [
487
+ "string",
488
+ "null"
489
+ ]
490
+ },
491
+ "claimed_at": {
492
+ "type": "string"
493
+ }
494
+ },
495
+ "additionalProperties": true
496
+ }
497
+ }
498
+ },
499
+ "additionalProperties": true
500
+ }
501
+ },
502
+ "work_history": {
503
+ "type": "array",
504
+ "items": {
505
+ "type": "object",
506
+ "required": [
507
+ "change",
508
+ "work_id",
509
+ "started_at",
510
+ "completed_at",
511
+ "result"
512
+ ],
513
+ "properties": {
514
+ "change": {
515
+ "type": "string"
516
+ },
517
+ "work_id": {
518
+ "type": "string",
519
+ "pattern": "^specdev/"
520
+ },
521
+ "started_at": {
522
+ "type": "string"
523
+ },
524
+ "completed_at": {
525
+ "type": [
526
+ "string",
527
+ "null"
528
+ ]
529
+ },
530
+ "result": {
531
+ "type": [
532
+ "string",
533
+ "null"
534
+ ]
535
+ }
536
+ },
537
+ "additionalProperties": true
538
+ }
539
+ },
540
+ "completed": {
541
+ "type": "array",
542
+ "items": {
543
+ "type": "object",
544
+ "required": [
545
+ "change",
546
+ "archived_at",
547
+ "archive_path"
548
+ ],
549
+ "properties": {
550
+ "change": {
551
+ "type": "string"
552
+ },
553
+ "archived_at": {
554
+ "type": "string"
555
+ },
556
+ "archive_path": {
557
+ "type": "string",
558
+ "pattern": "^specdev/archive/[0-9]{4}-[0-9]{2}/.+/$"
559
+ }
560
+ },
561
+ "additionalProperties": true
562
+ }
563
+ }
564
+ },
565
+ "additionalProperties": true
566
+ }
567
+ ```
568
+
569
+ </status-schema>
570
+
571
+ <change-status-template>
572
+
573
+ ```json
574
+ {
575
+ "schema_version": 3,
576
+ "artifact": "change-status",
577
+ "change": "<YYYY-MM-DD-topic>",
578
+ "change_status": "active",
579
+ "current_work": null,
580
+ "created_at": "<ISO-8601>",
581
+ "updated_at": "<ISO-8601>",
582
+ "completed_at": null,
583
+ "archived": false,
584
+ "archive_path": null,
585
+ "blockers": [],
586
+ "deviations": [],
587
+ "worktrees": []
588
+ }
589
+ ```
590
+
591
+ </change-status-template>
592
+
593
+ <change-status-schema>
594
+
595
+ ```json
596
+ {
597
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
598
+ "$id": "urn:speculo:specdev:change-status:v3",
599
+ "title": "SpecDev Change Status",
600
+ "type": "object",
601
+ "required": [
602
+ "schema_version",
603
+ "artifact",
604
+ "change",
605
+ "change_status",
606
+ "current_work",
607
+ "created_at",
608
+ "updated_at",
609
+ "completed_at",
610
+ "archived",
611
+ "archive_path",
612
+ "blockers",
613
+ "deviations"
614
+ ],
615
+ "properties": {
616
+ "schema_version": {
617
+ "const": 3
618
+ },
619
+ "artifact": {
620
+ "const": "change-status"
621
+ },
622
+ "change": {
623
+ "type": "string",
624
+ "pattern": "^[0-9]{4}-[0-9]{2}-[0-9]{2}-[a-z0-9]+(?:-[a-z0-9]+)*$"
625
+ },
626
+ "change_status": {
627
+ "enum": [
628
+ "active",
629
+ "blocked",
630
+ "completed",
631
+ "archived"
632
+ ]
633
+ },
634
+ "current_work": {
635
+ "type": [
636
+ "string",
637
+ "null"
638
+ ]
639
+ },
640
+ "created_at": {
641
+ "type": "string",
642
+ "minLength": 1
643
+ },
644
+ "updated_at": {
645
+ "type": "string",
646
+ "minLength": 1
647
+ },
648
+ "completed_at": {
649
+ "type": [
650
+ "string",
651
+ "null"
652
+ ]
653
+ },
654
+ "archived": {
655
+ "type": "boolean"
656
+ },
657
+ "archive_path": {
658
+ "anyOf": [
659
+ {
660
+ "type": "null"
661
+ },
662
+ {
663
+ "type": "string",
664
+ "pattern": "^specdev/archive/[0-9]{4}-[0-9]{2}/.+/$"
665
+ }
666
+ ]
667
+ },
668
+ "blockers": {
669
+ "type": "array",
670
+ "items": {
671
+ "type": "string"
672
+ }
673
+ },
674
+ "deviations": {
675
+ "type": "array",
676
+ "items": {
677
+ "type": "string"
678
+ }
679
+ },
680
+ "worktrees": {
681
+ "type": "array",
682
+ "items": {
683
+ "type": "object",
684
+ "required": [
685
+ "ticket_id",
686
+ "owner",
687
+ "provider",
688
+ "base_sha",
689
+ "branch",
690
+ "workspace_ref",
691
+ "status",
692
+ "updated_at"
693
+ ],
694
+ "properties": {
695
+ "ticket_id": {
696
+ "type": "string",
697
+ "pattern": "^T-[0-9]{2,}$"
698
+ },
699
+ "owner": {
700
+ "type": "string",
701
+ "minLength": 1
702
+ },
703
+ "provider": {
704
+ "enum": [
705
+ "native",
706
+ "git",
707
+ "external"
708
+ ]
709
+ },
710
+ "base_sha": {
711
+ "type": "string",
712
+ "minLength": 1
713
+ },
714
+ "branch": {
715
+ "type": "string",
716
+ "minLength": 1
717
+ },
718
+ "workspace_ref": {
719
+ "type": "string",
720
+ "minLength": 1,
721
+ "pattern": "^(?!/)(?![A-Za-z]:[\\\\/]).+"
722
+ },
723
+ "status": {
724
+ "enum": [
725
+ "planned",
726
+ "active",
727
+ "review",
728
+ "integrated",
729
+ "removed",
730
+ "blocked"
731
+ ]
732
+ },
733
+ "updated_at": {
734
+ "type": "string",
735
+ "minLength": 1
736
+ }
737
+ },
738
+ "additionalProperties": true
739
+ }
740
+ }
741
+ },
742
+ "allOf": [
743
+ {
744
+ "if": {
745
+ "properties": {
746
+ "change_status": {
747
+ "const": "archived"
748
+ }
749
+ }
750
+ },
751
+ "then": {
752
+ "properties": {
753
+ "archived": {
754
+ "const": true
755
+ },
756
+ "archive_path": {
757
+ "type": "string",
758
+ "pattern": "^specdev/archive/[0-9]{4}-[0-9]{2}/.+/$"
759
+ }
760
+ }
761
+ }
762
+ }
763
+ ],
764
+ "additionalProperties": true
765
+ }
766
+ ```
196
767
 
197
- 状态追踪:
198
- - `specdev/status.json` —— `active` 条目中的 `claimed_tickets` 数组记录当前领取的 ticket
768
+ </change-status-schema>