@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.
- package/README.md +1 -2
- package/dist/src/cli.js +40 -6
- package/dist/src/cli.js.map +1 -1
- package/dist/src/index.js +5 -0
- package/dist/src/index.js.map +1 -1
- package/dist/src/skills-mirror.d.ts +38 -0
- package/dist/src/skills-mirror.js +160 -0
- package/dist/src/skills-mirror.js.map +1 -0
- package/package.json +3 -2
- package/template/canonical/README.md +7 -1
- package/template/canonical/canonical-specdev-engineering-cognitive-mentor.md +2040 -0
- package/template/canonical/canonical-specdev-goal-plan.md +1379 -0
- package/template/canonical/canonical-specdev-grill-with-docs.md +848 -285
- package/template/canonical/canonical-specdev-spec.md +1061 -46
- package/template/canonical/canonical-specdev-tickets.md +1529 -175
- package/template/canonical/canonical-specdev-wayfinder.md +677 -107
- package/template/commands/git-repository-audit.md +682 -0
- package/template/workflows/specdev/A-archive-and-consolidate/A-archive-and-consolidate.md +69 -36
- package/template/workflows/specdev/A-archive-and-consolidate/archive-checklist.md +15 -0
- package/template/workflows/specdev/A-archive-and-consolidate/knowledge-promotion-rules.md +32 -0
- package/template/workflows/specdev/D-diagnose-bugs/D-diagnose-bugs.md +51 -51
- package/template/workflows/specdev/D-diagnose-bugs/diagnosis-template.md +64 -0
- package/template/workflows/specdev/E-engineering-cognitive-mentor/E-engineering-cognitive-mentor.md +252 -0
- package/template/workflows/specdev/E-engineering-cognitive-mentor/architecture-guidance.md +90 -0
- package/template/workflows/specdev/E-engineering-cognitive-mentor/bug-guidance.md +80 -0
- package/template/workflows/specdev/E-engineering-cognitive-mentor/codebase-guidance.md +107 -0
- package/template/workflows/specdev/E-engineering-cognitive-mentor/comprehension-and-closure.md +95 -0
- package/template/workflows/specdev/E-engineering-cognitive-mentor/domain-learning-guidance.md +62 -0
- package/template/workflows/specdev/E-engineering-cognitive-mentor/evidence-and-options.md +132 -0
- package/template/workflows/specdev/E-engineering-cognitive-mentor/interaction-protocol.md +116 -0
- package/template/workflows/specdev/E-engineering-cognitive-mentor/mentor-report-template.md +135 -0
- package/template/workflows/specdev/E-engineering-cognitive-mentor/mode-routing.md +47 -0
- package/template/workflows/specdev/E-engineering-cognitive-mentor/persistence-and-resume.md +147 -0
- package/template/workflows/specdev/E-engineering-cognitive-mentor/requirements-guidance.md +92 -0
- package/template/workflows/specdev/G-grill-with-docs/G-grill-with-docs.md +100 -30
- package/template/workflows/specdev/G-grill-with-docs/adr-format.md +22 -77
- package/template/workflows/specdev/G-grill-with-docs/context-format.md +27 -53
- package/template/workflows/specdev/G-grill-with-docs/domain-modeling-rules.md +6 -82
- package/template/workflows/specdev/G-grill-with-docs/grilling-protocol.md +32 -49
- package/template/workflows/specdev/G-grill-with-docs/log-format.md +16 -98
- package/template/workflows/specdev/I-implement/I-implement.md +168 -52
- package/template/workflows/specdev/I-implement/code-review-process.md +10 -76
- package/template/workflows/specdev/I-implement/codebase-design-glossary.md +12 -109
- package/template/workflows/specdev/I-implement/deepening.md +12 -32
- package/template/workflows/specdev/I-implement/design-it-twice.md +6 -41
- package/template/workflows/specdev/I-implement/evidence-template.md +69 -0
- package/template/workflows/specdev/I-implement/execution-preflight.md +20 -0
- package/template/workflows/specdev/I-implement/tdd-examples.md +10 -135
- package/template/workflows/specdev/I-implement/tdd-rules.md +12 -28
- package/template/workflows/specdev/I-init-setup/I-init-setup.md +81 -86
- package/template/workflows/specdev/I-init-setup/change-status-template.json +15 -0
- package/template/workflows/specdev/I-init-setup/config-template.json +26 -0
- package/template/workflows/specdev/I-init-setup/domain-layout-template.md +23 -0
- package/template/workflows/specdev/I-init-setup/status-labels-template.md +55 -0
- package/template/workflows/specdev/I-init-setup/status-template.json +7 -0
- package/template/workflows/specdev/I-init-setup/tracking-template.md +10 -0
- package/template/workflows/specdev/INDEX.md +165 -82
- package/template/workflows/specdev/P-goal-plan/P-goal-plan.md +108 -44
- package/template/workflows/specdev/P-goal-plan/completion-control.md +79 -0
- package/template/workflows/specdev/P-goal-plan/goal-plan-template.md +105 -0
- package/template/workflows/specdev/P-goal-plan/orchestration-protocol.md +115 -0
- package/template/workflows/specdev/P-goal-plan/planning-modes.md +70 -0
- package/template/workflows/specdev/R-review-architecture/R-review-architecture.md +103 -40
- package/template/workflows/specdev/R-review-architecture/architecture-review-report-template.html +58 -0
- package/template/workflows/specdev/R-review-architecture/architecture-review-template.md +68 -0
- package/template/workflows/specdev/R-review-architecture/proposal-to-ticket.md +11 -0
- package/template/workflows/specdev/S-spec/S-spec.md +103 -49
- package/template/workflows/specdev/S-spec/spec-readiness.md +16 -0
- package/template/workflows/specdev/S-spec/spec-template.md +95 -0
- package/template/workflows/specdev/T-tickets/T-tickets.md +146 -133
- package/template/workflows/specdev/T-tickets/decomposition-rules.md +56 -0
- package/template/workflows/specdev/T-tickets/ticket-readiness.md +45 -0
- package/template/workflows/specdev/T-tickets/ticket-template.md +124 -0
- package/template/workflows/specdev/T-tickets/tickets-map-template.md +52 -50
- package/template/workflows/specdev/T-triage/T-triage.md +32 -63
- package/template/workflows/specdev/T-triage/triage-template.md +29 -0
- package/template/workflows/specdev/W-wayfinder/W-wayfinder.md +88 -155
- package/template/workflows/specdev/W-wayfinder/investigation-ticket-template.md +50 -0
- package/template/workflows/specdev/W-wayfinder/wayfinder-map-template.md +46 -0
- package/template/workflows/specdev/_state/status.json +1 -1
- package/template/workflows/specdev/common/README.md +47 -0
- package/template/workflows/specdev/common/rules/artifact-contract.md +57 -0
- package/template/workflows/specdev/common/rules/code-commenting-rule.md +39 -0
- package/template/workflows/specdev/common/rules/deviation-control.md +43 -0
- package/template/workflows/specdev/common/rules/evidence-and-verification.md +57 -0
- package/template/workflows/specdev/common/rules/path-ownership.md +35 -0
- package/template/workflows/specdev/common/rules/path-reference-contract.md +116 -0
- package/template/workflows/specdev/common/rules/planning-principles.md +57 -0
- package/template/workflows/specdev/common/rules/readiness-and-depth.md +51 -0
- package/template/workflows/specdev/common/schemas/change-status.schema.json +170 -0
- package/template/workflows/specdev/common/schemas/config.schema.json +54 -0
- package/template/workflows/specdev/common/schemas/goal-plan.schema.json +21 -0
- package/template/workflows/specdev/common/schemas/spec.schema.json +16 -0
- package/template/workflows/specdev/common/schemas/status.schema.json +149 -0
- package/template/workflows/specdev/common/schemas/ticket.schema.json +130 -0
- package/template/workflows/specdev/common/schemas/tickets-map.schema.json +14 -0
- package/template/workflows/specdev/common/skills/dev-worktree/SKILL.md +28 -0
- package/template/workflows/specdev/common/skills/dev-worktree/references/create.md +30 -0
- package/template/workflows/specdev/common/skills/dev-worktree/references/finalize.md +16 -0
- package/template/workflows/specdev/common/skills/research/SKILL.md +43 -0
- package/template/workflows/specdev/common/tools/README.md +16 -0
- package/template/workflows/specdev/common/tools/validate-specdev.mjs +1155 -0
- package/template/canonical/canonical-teach.md +0 -301
- package/template/workflows/specdev/A-archive-and-consolidate/archive-rules.md +0 -49
- package/template/workflows/specdev/A-archive-and-consolidate/cleanup-rules.md +0 -80
- package/template/workflows/specdev/A-archive-and-consolidate/consolidation-rules.md +0 -122
- package/template/workflows/specdev/A-archive-and-consolidate/discrimination-guide.md +0 -96
- package/template/workflows/specdev/A-archive-and-consolidate/knowledge-graduation.md +0 -51
- package/template/workflows/specdev/D-diagnose-bugs/cleanup-postmortem.md +0 -37
- package/template/workflows/specdev/D-diagnose-bugs/feedback-loop-techniques.md +0 -84
- package/template/workflows/specdev/D-diagnose-bugs/hypothesis-format.md +0 -46
- package/template/workflows/specdev/D-diagnose-bugs/instrumentation-rules.md +0 -51
- package/template/workflows/specdev/I-init-setup/domain-layout.md +0 -55
- package/template/workflows/specdev/I-init-setup/status-labels.md +0 -53
- package/template/workflows/specdev/I-init-setup/tracking-convention.md +0 -52
- package/template/workflows/specdev/P-goal-plan/execution-sections.md +0 -126
- package/template/workflows/specdev/P-goal-plan/governance-sections.md +0 -103
- package/template/workflows/specdev/P-goal-plan/input-validation.md +0 -94
- package/template/workflows/specdev/P-goal-plan/lead-orchestration-protocol.md +0 -158
- package/template/workflows/specdev/P-goal-plan/quick-reference-table.md +0 -60
- package/template/workflows/specdev/P-goal-plan/vision-sections.md +0 -80
- package/template/workflows/specdev/R-review-architecture/exploration-guide.md +0 -103
- package/template/workflows/specdev/R-review-architecture/html-report-template.md +0 -124
- package/template/workflows/specdev/T-triage/artifact-templates.md +0 -122
- package/template/workflows/specdev/T-triage/intake-rules.md +0 -71
- package/template/workflows/specdev/T-triage/routing-rules.md +0 -70
- package/template/workflows/specdev/T-triage/understanding-rules.md +0 -102
- package/template/workflows/specdev/_state/adr/.gitkeep +0 -0
- package/template/workflows/specdev/_state/context/.gitkeep +0 -0
- package/template/workflows/specdev/_state/research/.gitkeep +0 -0
- package/template/workflows/specdev/common/dev-worktree/SKILL.md +0 -48
- package/template/workflows/specdev/common/dev-worktree/references/create.md +0 -63
- package/template/workflows/specdev/common/dev-worktree/references/finalize.md +0 -102
- package/template/workflows/specdev/common/handoff/SKILL.md +0 -42
- package/template/workflows/specdev/common/neat-freak/SKILL.md +0 -210
- package/template/workflows/specdev/common/neat-freak/references/agent-paths.md +0 -72
- package/template/workflows/specdev/common/neat-freak/references/governance.md +0 -88
- package/template/workflows/specdev/common/neat-freak/references/sync-matrix.md +0 -77
- package/template/workflows/specdev/common/neat-freak/references/verification.md +0 -92
- package/template/workflows/specdev/common/neat-freak/scripts/audit-inventory.sh +0 -106
- package/template/workflows/specdev/common/prototype/LOGIC.md +0 -89
- package/template/workflows/specdev/common/prototype/SKILL.md +0 -78
- package/template/workflows/specdev/common/prototype/UI.md +0 -120
- package/template/workflows/specdev/common/research/SKILL.md +0 -54
- package/template/workflows/specdev/common/resolving-merge-conflicts/SKILL.md +0 -14
- package/template/workflows/specdev/common/scripts/hitl-loop.template.sh +0 -41
- package/template/workflows/specdev/common/triage/AGENT-BRIEF.md +0 -204
- package/template/workflows/specdev/common/triage/OUT-OF-SCOPE.md +0 -104
- package/template/workflows/specdev/common/triage/SKILL.md +0 -112
|
@@ -1,198 +1,768 @@
|
|
|
1
1
|
# 寻路
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
## 网页平台运行约定
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
本文是可独立上传的单文件能力快照,不依赖 Speculo CLI 的根别名或源目录。执行时统一采用以下逻辑布局:
|
|
6
6
|
|
|
7
|
-
|
|
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
|
-
|
|
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
|
-
|
|
26
|
+
模板:
|
|
16
27
|
|
|
17
|
-
|
|
28
|
+
- 下方 `<investigation-ticket-template>` 标签
|
|
29
|
+
- 下方 `<wayfinder-map-template>` 标签
|
|
18
30
|
|
|
19
|
-
##
|
|
31
|
+
## 何时运行
|
|
20
32
|
|
|
21
|
-
|
|
33
|
+
- 路径未知,无法安全写出 Ready Spec 或 Ticket;
|
|
34
|
+
- 需要跨多个领域、技术栈或外部系统调查;
|
|
35
|
+
- 调查量超出单个上下文,适合并行研究;
|
|
36
|
+
- 存在多个相互依赖的高影响未知项;
|
|
37
|
+
- 需要在若干候选方案中先获得事实证据再做决定。
|
|
22
38
|
|
|
23
|
-
|
|
39
|
+
若问题只是一个可在当前上下文通过短暂只读探索回答的事实,不创建 Wayfinder Map。
|
|
24
40
|
|
|
25
|
-
|
|
41
|
+
## 流程
|
|
26
42
|
|
|
27
|
-
###
|
|
43
|
+
### 1. 定义目标与未知项
|
|
28
44
|
|
|
29
|
-
|
|
45
|
+
写明最终目标、已知边界、当前不能决定的事项和“为什么这些未知项阻塞规划”。未知项分为:
|
|
30
46
|
|
|
31
|
-
|
|
32
|
-
|
|
47
|
+
- **research**:答案可由代码、文档、实验或外部来源证实;
|
|
48
|
+
- **decision**:事实已足够,但需要用户或架构 owner 做取舍;
|
|
49
|
+
- **validation**:已有方案,需要实验验证关键可行性或风险;
|
|
50
|
+
- **mapping**:需要建立调用链、数据流、依赖图或影响面。
|
|
33
51
|
|
|
34
|
-
|
|
52
|
+
低影响实现细节不创建调查 Ticket。
|
|
35
53
|
|
|
36
|
-
|
|
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
|
-
|
|
66
|
+
调查者开始前原子地更新 `specdev/status.json` 的 `claimed_investigations`:
|
|
45
67
|
|
|
46
|
-
-
|
|
68
|
+
- 未领取且依赖满足 → 设置 owner、session 和 claimed 时间;
|
|
69
|
+
- 已领取 → 跳过并选择其他可用 Ticket;
|
|
70
|
+
- 超过配置的 claim 超时且无进展 → 允许在记录原因后回收;
|
|
71
|
+
- 完成或释放后从领取集合移除,并同步共享地图。
|
|
47
72
|
|
|
48
|
-
|
|
73
|
+
并行调查使用独立上下文;不要复制所有调查历史,只读取共享地图、当前调查 Ticket、相关上游工件和必要代码事实。
|
|
49
74
|
|
|
50
|
-
|
|
75
|
+
### 4. 执行调查
|
|
51
76
|
|
|
52
|
-
|
|
77
|
+
调查默认只读。允许:
|
|
53
78
|
|
|
54
|
-
|
|
55
|
-
|
|
79
|
+
- 代码搜索与静态分析;
|
|
80
|
+
- 文档、规范和官方来源研究;
|
|
81
|
+
- 可撤销的临时实验、最小原型或插桩;
|
|
82
|
+
- 性能测量、调用点扫描、schema 对比或兼容性验证。
|
|
56
83
|
|
|
57
|
-
|
|
84
|
+
外部研究使用 下方 `<research>` 标签。
|
|
58
85
|
|
|
59
|
-
|
|
86
|
+
禁止:
|
|
60
87
|
|
|
61
|
-
|
|
62
|
-
|
|
88
|
+
- 顺手实现产品功能;
|
|
89
|
+
- 提交未经审查的实验代码;
|
|
90
|
+
- 将原型视为最终架构;
|
|
91
|
+
- 在没有证据时把建议写成事实;
|
|
92
|
+
- 无停止条件地持续研究。
|
|
63
93
|
|
|
64
|
-
|
|
94
|
+
### 5. 记录结果与影响
|
|
65
95
|
|
|
66
|
-
|
|
96
|
+
每个调查结果区分:
|
|
67
97
|
|
|
68
|
-
|
|
98
|
+
- 官方或规范事实;
|
|
99
|
+
- 当前代码事实;
|
|
100
|
+
- 实验结果;
|
|
101
|
+
- 推断;
|
|
102
|
+
- 建议;
|
|
103
|
+
- 用户或 owner 决策。
|
|
69
104
|
|
|
70
|
-
|
|
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
|
-
|
|
112
|
+
调查完成、阻塞或释放时,同步调查 Ticket、调查 Evidence、共享地图和领取状态,并返回 investigation ID、状态及三份工件的完整路径。
|
|
75
113
|
|
|
76
|
-
|
|
114
|
+
状态使用 `open | claimed | confirmed | disproved | decision-needed | unresolved | superseded | cancelled`。
|
|
77
115
|
|
|
78
|
-
|
|
116
|
+
### 6. 收敛与退出
|
|
79
117
|
|
|
80
|
-
|
|
81
|
-
```
|
|
118
|
+
当剩余未知项不再阻止目标、行为、架构、风险或验证决策时停止。根据结果进入:
|
|
82
119
|
|
|
83
|
-
|
|
120
|
+
- 需要产品或架构取舍 → “设计访谈能力”;
|
|
121
|
+
- 外部行为已清楚 → “编写 Spec 阶段”;
|
|
122
|
+
- Spec 已 Ready 且只是实现拆分未知 → “拆分 Tickets 阶段”;
|
|
123
|
+
- Bug 根因路径已收敛 → “Bug 诊断阶段”;
|
|
124
|
+
- 仍存在高影响未知项 → 保持 blocked,并明确下一调查或用户决策。
|
|
84
125
|
|
|
85
|
-
|
|
126
|
+
长期有效且经实现验证的研究,只有在归档时由 “归档与沉淀阶段” 提升。
|
|
86
127
|
|
|
87
|
-
|
|
128
|
+
## 完成标准
|
|
88
129
|
|
|
89
|
-
|
|
130
|
+
- 共享地图、调查 Ticket 和领取状态一致;
|
|
131
|
+
- 每个调查只关闭一个高影响未知项;
|
|
132
|
+
- 结论区分事实、实验、推断、建议和决定;
|
|
133
|
+
- 来源、版本、置信度和停止条件可追踪;
|
|
134
|
+
- 并行调查没有重复领取或互相覆盖;
|
|
135
|
+
- 调查状态及 Ticket、Evidence、共享地图路径已返回;
|
|
136
|
+
- 没有把产品实现藏在调查中;
|
|
137
|
+
- 已明确下一 work 或阻塞决策。
|
|
90
138
|
|
|
91
|
-
##
|
|
139
|
+
## 子文件引用
|
|
140
|
+
|
|
141
|
+
- 调查 Ticket 模板:下方 `<investigation-ticket-template>` 标签
|
|
142
|
+
- 共享地图模板:下方 `<wayfinder-map-template>` 标签
|
|
92
143
|
|
|
93
|
-
|
|
144
|
+
---
|
|
94
145
|
|
|
95
|
-
|
|
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
|
-
|
|
150
|
+
<investigation-ticket-template>
|
|
103
151
|
|
|
104
|
-
|
|
152
|
+
## 产物 YAML 头部
|
|
105
153
|
|
|
106
|
-
|
|
154
|
+
生成该工件时,将以下字段写在文档开头的 YAML frontmatter 中:
|
|
107
155
|
|
|
108
|
-
|
|
109
|
-
-
|
|
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
|
-
|
|
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
|
-
|
|
179
|
+
## 2. 已知事实与假设
|
|
120
180
|
|
|
121
|
-
|
|
181
|
+
### 已知事实
|
|
122
182
|
|
|
123
|
-
|
|
183
|
+
### 待验证假设
|
|
124
184
|
|
|
125
|
-
|
|
185
|
+
## 3. 调查契约
|
|
126
186
|
|
|
127
|
-
|
|
187
|
+
- **允许的代码探索:** `project/relative/path/**`
|
|
188
|
+
- **允许的实验:**
|
|
189
|
+
- **禁止的产品实现:**
|
|
190
|
+
- **来源优先级:**
|
|
191
|
+
- **停止条件:**
|
|
192
|
+
- **时间或资源边界:**
|
|
128
193
|
|
|
129
|
-
|
|
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
|
-
|
|
207
|
+
</investigation-ticket-template>
|
|
134
208
|
|
|
135
|
-
|
|
209
|
+
<wayfinder-map-template>
|
|
136
210
|
|
|
137
|
-
|
|
211
|
+
## 产物 YAML 头部
|
|
138
212
|
|
|
139
|
-
|
|
213
|
+
生成该工件时,将以下字段写在文档开头的 YAML frontmatter 中:
|
|
140
214
|
|
|
141
|
-
|
|
215
|
+
```yaml
|
|
216
|
+
artifact: wayfinder-map
|
|
217
|
+
change: <YYYY-MM-DD-topic>
|
|
218
|
+
status: active
|
|
219
|
+
```
|
|
142
220
|
|
|
143
|
-
|
|
221
|
+
# Wayfinder Map: <目标>
|
|
144
222
|
|
|
145
|
-
|
|
223
|
+
- **共享地图:** `specdev/changes/{change}/wayfinder-map.md`
|
|
224
|
+
- **调查目录:** `specdev/changes/{change}/investigation/`
|
|
225
|
+
- **领取状态:** `specdev/status.json`
|
|
146
226
|
|
|
147
|
-
|
|
227
|
+
## 1. 最终目标与当前边界
|
|
148
228
|
|
|
149
|
-
|
|
229
|
+
## 2. 调查清单
|
|
150
230
|
|
|
151
|
-
|
|
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
|
-
|
|
237
|
+
```text
|
|
238
|
+
INV-01
|
|
239
|
+
├─→ INV-02
|
|
240
|
+
└─→ INV-03
|
|
241
|
+
```
|
|
156
242
|
|
|
157
|
-
|
|
243
|
+
## 4. 并行与领取规则
|
|
158
244
|
|
|
159
|
-
|
|
245
|
+
- 最大并发来自 `specdev/config.json`。
|
|
246
|
+
- 当前领取集合以 `specdev/status.json` 为权威。
|
|
247
|
+
- 同一调查 Ticket 只能有一个 owner/session。
|
|
248
|
+
- 共享地图是状态投影,领取变更后必须同步。
|
|
160
249
|
|
|
161
|
-
|
|
250
|
+
## 5. 决策收敛
|
|
162
251
|
|
|
163
|
-
|
|
252
|
+
| 未知项 | 当前结论 | 置信度 | 消费工件 | 是否仍阻塞 |
|
|
253
|
+
|---|---|---|---|---|
|
|
164
254
|
|
|
165
|
-
|
|
255
|
+
## 6. 停止条件
|
|
166
256
|
|
|
167
|
-
|
|
257
|
+
- [ ] 所有高影响未知项已 confirmed、disproved,或明确转为用户/owner 决策。
|
|
258
|
+
- [ ] 可以形成 Ready Spec、Ticket、诊断契约或架构决策。
|
|
259
|
+
- [ ] 没有把产品实现留在调查 Ticket 中。
|
|
260
|
+
- [ ] 所有 claim 已释放或转为明确 blocked。
|
|
168
261
|
|
|
169
|
-
|
|
262
|
+
</wayfinder-map-template>
|
|
170
263
|
|
|
171
|
-
|
|
264
|
+
<research>
|
|
172
265
|
|
|
173
|
-
|
|
266
|
+
# SpecDev Research
|
|
174
267
|
|
|
175
|
-
|
|
268
|
+
## 触发
|
|
176
269
|
|
|
177
|
-
|
|
178
|
-
- 「已做出的决策」中的关键结论摘要
|
|
179
|
-
- 剩余的任何**尚未明确**项——它们是否阻碍行动,还是可作为实现细节处理
|
|
180
|
-
- 建议的下一步行动(移交实现、开始执行、或重新划定目标)
|
|
270
|
+
当外部 API、库版本、协议、法规、产品能力或最佳实践会改变设计/实现决策,且当前材料不足时使用。
|
|
181
271
|
|
|
182
|
-
|
|
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
|
-
|
|
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
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
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>
|