@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
|
@@ -0,0 +1,1379 @@
|
|
|
1
|
+
# 目标规划
|
|
2
|
+
|
|
3
|
+
## 网页平台运行约定
|
|
4
|
+
|
|
5
|
+
本文是可独立上传的单文件能力快照,不依赖 Speculo CLI 的根别名或源目录。执行时统一采用以下逻辑布局:
|
|
6
|
+
|
|
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
|
+
- 提交、推送、合并、部署、发布、归档移动和不可逆迁移仍需用户明确授权。
|
|
15
|
+
|
|
16
|
+
Goal Plan 只解决单个 Ticket 无法独立决定的事情:跨 Ticket 顺序、并发、共享所有权、里程碑 Gate、集成验证、迁移与发布顺序、偏差升级和恢复。它不是 Ticket 的放大版,也不按固定章节数量衡量质量。
|
|
17
|
+
|
|
18
|
+
产物写入 `specdev/changes/{change}/goal-plan.md`。
|
|
19
|
+
|
|
20
|
+
## 何时运行
|
|
21
|
+
|
|
22
|
+
满足任一条件时运行:
|
|
23
|
+
|
|
24
|
+
- 多个 Ticket 可以或需要并行;
|
|
25
|
+
- 存在 shared path、共享合同、集中 owner 或 Lead/Subagent;
|
|
26
|
+
- 存在 Deep Ticket、expand-contract、数据迁移、兼容窗口或不可逆步骤;
|
|
27
|
+
- 存在多个里程碑、外部审批、发布窗口、参考符合性或高事故半径;
|
|
28
|
+
- Ticket DAG 虽不大,但关键路径、汇合点或恢复策略不能仅由 `specdev/changes/{change}/tickets-map.md` 安全表达;
|
|
29
|
+
- 用户明确要求正式跨 Ticket Plan。
|
|
30
|
+
|
|
31
|
+
少量、线性、低风险且路径不冲突的 Ready Tickets 可以跳过本 work,直接由 “实现阶段” 按 Tickets Map 执行。
|
|
32
|
+
|
|
33
|
+
## 输入
|
|
34
|
+
|
|
35
|
+
必须读取:
|
|
36
|
+
|
|
37
|
+
- `specdev/changes/{change}/spec.md`
|
|
38
|
+
- `specdev/changes/{change}/tickets-map.md`
|
|
39
|
+
- `specdev/changes/{change}/ticket/`
|
|
40
|
+
- `specdev/config.json`
|
|
41
|
+
|
|
42
|
+
按存在情况读取:
|
|
43
|
+
|
|
44
|
+
- `specdev/changes/{change}/ADR.md`
|
|
45
|
+
- `specdev/changes/{change}/CONTEXT.md`
|
|
46
|
+
- `specdev/changes/{change}/LOG.md`
|
|
47
|
+
- `specdev/adr/`
|
|
48
|
+
- `specdev/context/`
|
|
49
|
+
- 用户提供的合同、标准、参考实现、环境限制、发布窗口与批准策略。
|
|
50
|
+
|
|
51
|
+
Spec 或 Tickets Map 不存在时,返回 “编写 Spec 阶段” 或 “拆分 Tickets 阶段”,不得在 Goal Plan 中临时补造上游工件。
|
|
52
|
+
|
|
53
|
+
## 流程
|
|
54
|
+
|
|
55
|
+
### 1. 验证上游与选择规划模式
|
|
56
|
+
|
|
57
|
+
加载 下方 `<planning-modes>` 标签:
|
|
58
|
+
|
|
59
|
+
1. 验证 Spec Ready、Ticket Ready、合同覆盖、DAG、路径所有权和 Deep Ticket 完整性;
|
|
60
|
+
2. 只读探索会影响调度的代码事实和项目约束;
|
|
61
|
+
3. 识别 coordination、migration、high-assurance、reference-conformance 等可组合模式;
|
|
62
|
+
4. 只对无法发现且会改变 Gate、Wave、owner、迁移或批准点的问题向用户提问;
|
|
63
|
+
5. 不熟悉的外部标准或依赖使用 下方 `<research>` 标签。
|
|
64
|
+
|
|
65
|
+
任何硬停止问题都必须退回拥有该决策的上游工件,不得用 Goal Plan 覆盖。
|
|
66
|
+
|
|
67
|
+
### 2. 构建跨 Ticket 执行模型
|
|
68
|
+
|
|
69
|
+
加载 下方 `<orchestration-protocol>` 标签:
|
|
70
|
+
|
|
71
|
+
1. 从 Ticket frontmatter 构建 DAG 和关键路径;
|
|
72
|
+
2. 将 Ready 且项目写路径不相交的 Ticket 分配到 Wave;
|
|
73
|
+
3. 为 shared path、共享合同和集中变更指定唯一 owner;
|
|
74
|
+
4. 为行为闭环、合同稳定、迁移完成、发布就绪等关键状态定义 Gate;
|
|
75
|
+
5. 明确 expand → migrate → contract、Evidence 返回和集成规则;并行写代码时使用 下方 `<dev-worktree>` 标签;
|
|
76
|
+
6. 将每个 Ticket 需要的执行上下文压缩成派单载荷,不复制整个历史对话。
|
|
77
|
+
|
|
78
|
+
### 3. 定义整体完成、证据与恢复
|
|
79
|
+
|
|
80
|
+
加载 下方 `<completion-control>` 标签:
|
|
81
|
+
|
|
82
|
+
1. 将整体目标、非目标和权威来源压缩为一个可审查摘要;
|
|
83
|
+
2. 定义整体 Definition of Done 和每个 Gate 的关闭证据;
|
|
84
|
+
3. 固化跨 Ticket 不可协商约束;
|
|
85
|
+
4. 定义偏差等级、暂停范围、批准人和恢复动作;
|
|
86
|
+
5. 定义进度回报、Evidence 汇总、残余风险和回滚要求。
|
|
87
|
+
|
|
88
|
+
### 4. 写入自适应 Goal Plan
|
|
89
|
+
|
|
90
|
+
使用 下方 `<goal-plan-template>` 标签 写入 `specdev/changes/{change}/goal-plan.md`。
|
|
91
|
+
|
|
92
|
+
模板包含六个职责区,但只保留适用内容:
|
|
93
|
+
|
|
94
|
+
1. Outcome and Authority;
|
|
95
|
+
2. Execution Graph;
|
|
96
|
+
3. Gates and Completion Evidence;
|
|
97
|
+
4. Execution and Integration Protocol;
|
|
98
|
+
5. Constraints, Risk and Recovery;
|
|
99
|
+
6. Progress and Decisions。
|
|
100
|
+
|
|
101
|
+
Ticket 较多时在 Execution Graph 内增加速查表;不创建独立的第二套状态来源。
|
|
102
|
+
|
|
103
|
+
### 5. 同步与验证
|
|
104
|
+
|
|
105
|
+
1. 将 Wave、Gate 和 owner 投影同步到 `specdev/changes/{change}/tickets-map.md`;
|
|
106
|
+
2. 对照 下方 `<goal-plan-schema>` 标签;
|
|
107
|
+
3. 运行:
|
|
108
|
+
|
|
109
|
+
> **结构校验:** 本地项目若已安装 Speculo,使用其 Node 校验器检查当前 change;
|
|
110
|
+
> 纯网页环境逐项核对本文内联的 schema、Ready 清单和完成标准,并记录自动校验未运行。
|
|
111
|
+
|
|
112
|
+
4. 更新 `specdev/status.json` 与 `specdev/changes/{change}/.status.json`;
|
|
113
|
+
5. 向用户汇报模式、关键路径、Wave、Gate、shared owner、迁移策略、主要风险和 Ready 状态;
|
|
114
|
+
6. 未经用户要求,不自动进入实现。
|
|
115
|
+
|
|
116
|
+
## 决策完备标准
|
|
117
|
+
|
|
118
|
+
Goal Plan 必须让执行 Lead 或实现者无需重新决定:
|
|
119
|
+
|
|
120
|
+
- 跨 Ticket 先后、并发 Wave 和关键汇合点;
|
|
121
|
+
- shared path 与共享合同的 owner;
|
|
122
|
+
- Gate 开启、关闭和证据;
|
|
123
|
+
- 迁移、兼容、收缩、发布和回滚顺序;
|
|
124
|
+
- Agent 派单上下文、Evidence 返回和集成规则;
|
|
125
|
+
- 偏差等级、暂停范围和批准路径。
|
|
126
|
+
|
|
127
|
+
Goal Plan 不应重复:
|
|
128
|
+
|
|
129
|
+
- Ticket 的完整局部执行路线;
|
|
130
|
+
- 每个 Ticket 的全部文件预测;
|
|
131
|
+
- 每条局部验收 checklist;
|
|
132
|
+
- Spec 中的完整用户故事和产品背景。
|
|
133
|
+
|
|
134
|
+
## 完成标准
|
|
135
|
+
|
|
136
|
+
- `specdev/changes/{change}/goal-plan.md` 已写入且只包含适用内容;
|
|
137
|
+
- 所有计划内 Ticket Ready,DAG 无环,合同覆盖明确;
|
|
138
|
+
- Wave、Gate、owner、集成、偏差和恢复可执行;
|
|
139
|
+
- Tickets Map 投影已同步;
|
|
140
|
+
- 无未批准高影响假设或硬停止问题;
|
|
141
|
+
- 结构校验无 error;纯网页环境的人工核对结果已记录;
|
|
142
|
+
- 用户收到摘要和下一步选择。
|
|
143
|
+
|
|
144
|
+
## 子文件引用
|
|
145
|
+
|
|
146
|
+
- 规划模式与输入门禁:下方 `<planning-modes>` 标签
|
|
147
|
+
- DAG、Wave、Gate 与 Lead 编排:下方 `<orchestration-protocol>` 标签
|
|
148
|
+
- 完成、证据、偏差与恢复:下方 `<completion-control>` 标签
|
|
149
|
+
- Goal Plan 模板:下方 `<goal-plan-template>` 标签
|
|
150
|
+
- 并行 Ticket worktree:下方 `<dev-worktree>` 标签
|
|
151
|
+
|
|
152
|
+
---
|
|
153
|
+
|
|
154
|
+
## 参考内容
|
|
155
|
+
|
|
156
|
+
以下内容均已内联。主流程提到标签时,直接使用对应标签中的完整规则、模板或 schema。
|
|
157
|
+
|
|
158
|
+
<planning-modes>
|
|
159
|
+
|
|
160
|
+
# Goal Plan 规划模式与输入门禁
|
|
161
|
+
|
|
162
|
+
本文件由 “目标规划阶段” 在上游验证和模式选择时加载。
|
|
163
|
+
|
|
164
|
+
## 1. 必需输入门禁
|
|
165
|
+
|
|
166
|
+
- [ ] `specdev/changes/{change}/spec.md` 设置 `ready_for_tickets: true`,或存在用户明确批准的等价权威目标。
|
|
167
|
+
- [ ] `specdev/changes/{change}/tickets-map.md` 与全部 Ticket 一致。
|
|
168
|
+
- [ ] 所有计划执行的 Ticket 设置 `ready: true`。
|
|
169
|
+
- [ ] Ticket ID、具体 `specdev/changes/{change}/ticket/NN-<ticket-name>.md` 和 Map 行一致。
|
|
170
|
+
- [ ] `blocked_by` 引用存在,DAG 无环。
|
|
171
|
+
- [ ] Spec 验收合同全部 covered,或 deferred 项有批准、原因和后续归属。
|
|
172
|
+
- [ ] 可能并行的 Ticket 项目写路径不相交,或已有 shared owner 与排序方案。
|
|
173
|
+
- [ ] Deep Ticket 具备迁移、兼容、监控、回滚、收缩条件和批准点。
|
|
174
|
+
- [ ] Ticket 与 Spec、ADR、代码事实不存在未处理冲突。
|
|
175
|
+
|
|
176
|
+
## 2. 硬停止
|
|
177
|
+
|
|
178
|
+
出现以下任一情况时停止:
|
|
179
|
+
|
|
180
|
+
- 任一计划内 Ticket 未 Ready;
|
|
181
|
+
- DAG 有环、缺失引用或依赖仅代表偏好;
|
|
182
|
+
- 合同 uncovered 且未批准 deferred;
|
|
183
|
+
- 并行候选写路径相交且无 owner 或顺序;
|
|
184
|
+
- Ticket 改写了 Spec 的外部行为、范围或验收;
|
|
185
|
+
- Ticket 与 `specdev/changes/{change}/ADR.md` 的已接受决策冲突;
|
|
186
|
+
- Deep Ticket 缺少关键迁移或恢复信息;
|
|
187
|
+
- 当前代码事实使 Ticket 的核心行为、接口或验证不可执行;
|
|
188
|
+
- 必需外部合同或参考权威不可获得。
|
|
189
|
+
|
|
190
|
+
按 下方 `<artifact-contract>` 标签 和 下方 `<deviation-control>` 标签 返回真正拥有该决策的工件。
|
|
191
|
+
|
|
192
|
+
## 3. 可组合模式
|
|
193
|
+
|
|
194
|
+
### coordination
|
|
195
|
+
|
|
196
|
+
适用于多 Wave、扇出/汇合、shared path 或 Lead/Subagent。重点是 DAG、owner、Evidence 返回、集成和状态同步。
|
|
197
|
+
|
|
198
|
+
### migration
|
|
199
|
+
|
|
200
|
+
适用于 expand-contract、数据迁移、协议迁移或兼容窗口。重点是扩展、分批迁移、收缩条件、数据核对、监控和回滚。
|
|
201
|
+
|
|
202
|
+
### high-assurance
|
|
203
|
+
|
|
204
|
+
适用于安全、隐私、资金、数据完整性、法规或不可逆操作。重点是独立审查、人工批准、Evidence 完整性和失败恢复。
|
|
205
|
+
|
|
206
|
+
### reference-conformance
|
|
207
|
+
|
|
208
|
+
适用于外部合同、标准、官方实现或指定兼容行为。重点是来源版本、符合性矩阵和冲突裁决。
|
|
209
|
+
|
|
210
|
+
### release-coordination
|
|
211
|
+
|
|
212
|
+
适用于发布窗口、跨团队依赖、部署顺序或运营交接。重点是环境前置条件、Gate、观察期和回退。
|
|
213
|
+
|
|
214
|
+
模式可以组合。仅有线性低风险 Ticket 时不应为了形式生成重型 Goal Plan。
|
|
215
|
+
|
|
216
|
+
## 4. 模式摘要
|
|
217
|
+
|
|
218
|
+
写入 `specdev/changes/{change}/goal-plan.md` 前形成:
|
|
219
|
+
|
|
220
|
+
```text
|
|
221
|
+
modes=<mode-list>
|
|
222
|
+
tickets=<count>
|
|
223
|
+
critical_path=<ticket-list>
|
|
224
|
+
parallel_capacity=<n>
|
|
225
|
+
shared_owners=<owner-map>
|
|
226
|
+
gates=<gate-list>
|
|
227
|
+
hard_stops=<none-or-list>
|
|
228
|
+
adopted_assumptions=<low-impact-only>
|
|
229
|
+
```
|
|
230
|
+
|
|
231
|
+
</planning-modes>
|
|
232
|
+
|
|
233
|
+
<orchestration-protocol>
|
|
234
|
+
|
|
235
|
+
# Goal Plan 编排协议
|
|
236
|
+
|
|
237
|
+
本文件定义 DAG、Wave、Gate、路径所有权、Lead/Subagent、worktree、Evidence 返回和集成规则。
|
|
238
|
+
|
|
239
|
+
## 1. DAG 与关键路径
|
|
240
|
+
|
|
241
|
+
- 依赖权威来自 `specdev/changes/{change}/ticket/NN-<ticket-name>.md` frontmatter 的 `blocked_by`;
|
|
242
|
+
- `specdev/changes/{change}/tickets-map.md` 是投影,不是第二套依赖真相;
|
|
243
|
+
- 计算根节点、扇出、汇合点、关键路径、共享合同 owner 和最终收缩点;
|
|
244
|
+
- 依赖只表示真实开始条件,不表示偏好、人员交接或“最好先做”;
|
|
245
|
+
- 无法独立保持可验证状态的迁移批次必须有隔离集成策略和最终集成 Gate。
|
|
246
|
+
|
|
247
|
+
## 2. Wave
|
|
248
|
+
|
|
249
|
+
Wave 内 Ticket 必须同时满足:
|
|
250
|
+
|
|
251
|
+
- `ready: true`;
|
|
252
|
+
- 所有依赖已完成并有 Evidence;
|
|
253
|
+
- 项目写路径不相交;
|
|
254
|
+
- shared path 已由 owner 稳定;
|
|
255
|
+
- 适用 Gate 已打开;
|
|
256
|
+
- 基线和外部合同版本一致。
|
|
257
|
+
|
|
258
|
+
最大并发从 `specdev/config.json` 读取。并发上限是资源约束,不是强制填满的目标。
|
|
259
|
+
|
|
260
|
+
## 3. Gate
|
|
261
|
+
|
|
262
|
+
Gate 由可验证状态定义,不用“完成若干 Ticket”作为唯一条件。每个 Gate 必须写明:
|
|
263
|
+
|
|
264
|
+
- 业务或工程状态;
|
|
265
|
+
- 开启条件;
|
|
266
|
+
- 关闭证据;
|
|
267
|
+
- 阻塞范围;
|
|
268
|
+
- owner 与批准人;
|
|
269
|
+
- 失败时恢复动作。
|
|
270
|
+
|
|
271
|
+
常见 Gate 包括共享合同稳定、首条垂直路径通过、迁移完成、旧调用点归零、发布就绪和观察期结束。名称按项目语义自定义。
|
|
272
|
+
|
|
273
|
+
## 4. Shared path 与共享合同
|
|
274
|
+
|
|
275
|
+
规则遵循 下方 `<path-ownership>` 标签:
|
|
276
|
+
|
|
277
|
+
1. 由专用 owner Ticket 或 Lead 修改共享路径;
|
|
278
|
+
2. 形成可验证稳定基线;
|
|
279
|
+
3. 下游消费者在新基线上重新运行 preflight;
|
|
280
|
+
4. 才允许扇出并行;
|
|
281
|
+
5. 共享契约需要变化时暂停消费者并修订上游,不通过多个 Agent 同时修改解决。
|
|
282
|
+
|
|
283
|
+
## 5. Expand-contract
|
|
284
|
+
|
|
285
|
+
标准顺序:
|
|
286
|
+
|
|
287
|
+
1. **expand**:新旧形式并存,既有调用者继续工作;
|
|
288
|
+
2. **migrate**:按可独立验证的影响范围分批迁移;
|
|
289
|
+
3. **observe**:扫描旧调用点、旧数据或旧协议使用量;
|
|
290
|
+
4. **contract**:收缩条件有证据后删除旧形式;
|
|
291
|
+
5. **verify**:运行兼容、数据、回归、监控和回滚检查。
|
|
292
|
+
|
|
293
|
+
收缩不得仅以“所有迁移 Ticket 已完成”为依据。
|
|
294
|
+
|
|
295
|
+
## 6. Lead/Subagent
|
|
296
|
+
|
|
297
|
+
Lead 负责基线、DAG、Wave、shared owner、Gate、Evidence 汇总和集成;不抢做已派发 Ticket 的实现。
|
|
298
|
+
|
|
299
|
+
并行写代码且配置允许时,Lead 为每个 Ticket 调用 下方 `<dev-worktree>` 标签:
|
|
300
|
+
|
|
301
|
+
- 所有并行 Ticket 固定同一 `base_sha`,每个 Ticket 使用独立分支和 `workspace_ref`;
|
|
302
|
+
- Lead 创建、恢复、集成和清理;Worker 只把状态推进到 `review`;
|
|
303
|
+
- 只读调查和顺序执行不为形式创建 worktree。
|
|
304
|
+
|
|
305
|
+
每个 Agent 的最小读取顺序:
|
|
306
|
+
|
|
307
|
+
1. “实现阶段”;
|
|
308
|
+
2. `specdev/changes/{change}/ticket/NN-<ticket-name>.md`;
|
|
309
|
+
3. `specdev/changes/{change}/goal-plan.md` 中适用的 Wave、Gate 和硬约束;
|
|
310
|
+
4. `specdev/changes/{change}/spec.md` 中相关合同;
|
|
311
|
+
5. `specdev/changes/{change}/ADR.md` 和 `specdev/changes/{change}/CONTEXT.md` 中相关条目;
|
|
312
|
+
6. 项目级 Agent 指令和当前代码事实。
|
|
313
|
+
|
|
314
|
+
不把完整历史对话、全部 Ticket 或无关研究塞入 Agent 上下文。
|
|
315
|
+
|
|
316
|
+
## 7. 派单载荷
|
|
317
|
+
|
|
318
|
+
派单必须包含:
|
|
319
|
+
|
|
320
|
+
- Ticket ID 与 `specdev/changes/{change}/ticket/NN-<ticket-name>.md`;
|
|
321
|
+
- 基线 SHA、分支和 `workspace_ref`;
|
|
322
|
+
- 项目写、只读和 shared 路径;
|
|
323
|
+
- 已完成依赖及其 Evidence;
|
|
324
|
+
- 合同 ID;
|
|
325
|
+
- 适用 Wave、Gate 和跨 Ticket 约束;
|
|
326
|
+
- 必须执行的验证矩阵;
|
|
327
|
+
- 偏差升级方式和禁止修改事项。
|
|
328
|
+
|
|
329
|
+
## 8. Evidence 返回与集成
|
|
330
|
+
|
|
331
|
+
Agent 完成或阻塞时:
|
|
332
|
+
|
|
333
|
+
1. 写入 `specdev/changes/{change}/evidence/T-NN.md`;
|
|
334
|
+
2. 同步 Ticket、Tickets Map、Goal Plan 和 change 状态;
|
|
335
|
+
3. 向 Lead 返回 Ticket ID 与状态、Evidence 完整路径、`workspace_ref`、commit 或 PR 引用,以及仅在用户界面交互受影响时由 Lead 执行的待办 E2E。
|
|
336
|
+
|
|
337
|
+
Lead 集成时:
|
|
338
|
+
|
|
339
|
+
1. 读取 Ticket、Evidence、Goal Plan 和对应代码引用;
|
|
340
|
+
2. 检查路径授权;
|
|
341
|
+
3. 复跑定向验证;
|
|
342
|
+
4. 合并或应用变更;
|
|
343
|
+
5. 运行受影响回归;
|
|
344
|
+
6. 仅当用户界面交互受影响时,由 Lead 运行最小 E2E;
|
|
345
|
+
7. 按 dev-worktree Skill 更新或清理 worktree;
|
|
346
|
+
8. 同步 Ticket、Map、Evidence 和 Goal Plan;
|
|
347
|
+
9. 检查 Gate 是否可关闭。
|
|
348
|
+
|
|
349
|
+
逻辑冲突返回契约和 owner 解决,不机械选择某一侧版本。
|
|
350
|
+
|
|
351
|
+
</orchestration-protocol>
|
|
352
|
+
|
|
353
|
+
<completion-control>
|
|
354
|
+
|
|
355
|
+
# Goal Plan 完成、证据与恢复控制
|
|
356
|
+
|
|
357
|
+
## 1. Outcome and Authority
|
|
358
|
+
|
|
359
|
+
Goal Plan 用紧凑摘要表达:
|
|
360
|
+
|
|
361
|
+
- 业务或用户目标;
|
|
362
|
+
- 目标受众或运营角色;
|
|
363
|
+
- 所有计划 Ticket 完成后的可观察终态;
|
|
364
|
+
- 关键约束;
|
|
365
|
+
- 明确非目标;
|
|
366
|
+
- 权威来源和冲突规则。
|
|
367
|
+
|
|
368
|
+
不复制 `specdev/changes/{change}/spec.md` 的完整用户故事。
|
|
369
|
+
|
|
370
|
+
## 2. 整体 Definition of Done
|
|
371
|
+
|
|
372
|
+
整体完成至少覆盖:
|
|
373
|
+
|
|
374
|
+
- 所有计划内 Ticket 完成,cancelled 或 deferred 项有批准;
|
|
375
|
+
- 所有 Spec 验收合同和外部符合性要求有 Evidence;
|
|
376
|
+
- 项目类型检查、静态检查、测试、lint、构建和适用 CI 完成;仅 UI 交互受影响时由 Lead 完成 E2E;
|
|
377
|
+
- 迁移、兼容、调用点清零、监控、回滚和不可逆批准完成;
|
|
378
|
+
- 无未批准偏差和未处置高风险残余问题;
|
|
379
|
+
- Ticket、Map、Goal Plan、Evidence 和状态一致。
|
|
380
|
+
|
|
381
|
+
## 3. Gate 关闭仪式
|
|
382
|
+
|
|
383
|
+
每个 Gate 关闭时:
|
|
384
|
+
|
|
385
|
+
1. 汇总覆盖的 `specdev/changes/{change}/evidence/T-NN.md`;
|
|
386
|
+
2. 检查对应合同和参考符合性;
|
|
387
|
+
3. 检查共享接口、数据、兼容、迁移和调用点;
|
|
388
|
+
4. 运行里程碑级验证;仅 UI 交互受影响时由 Lead 运行最小 E2E;
|
|
389
|
+
5. 审查失败分类、偏差、残余风险和恢复能力;
|
|
390
|
+
6. 获取适用人工批准;
|
|
391
|
+
7. 同步 `specdev/changes/{change}/goal-plan.md`、`specdev/changes/{change}/tickets-map.md` 和状态工件。
|
|
392
|
+
|
|
393
|
+
## 4. 不可协商约束
|
|
394
|
+
|
|
395
|
+
只记录跨多个 Ticket 且不可由实现者改变的规则,例如数据完整性、wire format 兼容、旧协议收缩条件、shared owner、安全要求、发布窗口、回滚演练和批准点。
|
|
396
|
+
|
|
397
|
+
来源必须指向:
|
|
398
|
+
|
|
399
|
+
- `specdev/changes/{change}/spec.md`;
|
|
400
|
+
- `specdev/changes/{change}/ADR.md`;
|
|
401
|
+
- 具体 `specdev/changes/{change}/ticket/NN-<ticket-name>.md`;
|
|
402
|
+
- 外部 Url 标签;
|
|
403
|
+
- `specdev/config.json`。
|
|
404
|
+
|
|
405
|
+
## 5. 偏差与暂停
|
|
406
|
+
|
|
407
|
+
偏差等级和处理遵循 下方 `<deviation-control>` 标签。
|
|
408
|
+
|
|
409
|
+
跨 Ticket 偏差还必须明确:
|
|
410
|
+
|
|
411
|
+
- 暂停哪些 Wave 或 Ticket;
|
|
412
|
+
- 哪个 Gate 重新打开;
|
|
413
|
+
- 哪些 Agent 需要重新基线;
|
|
414
|
+
- 哪些 Evidence 失效;
|
|
415
|
+
- 重新开始的条件。
|
|
416
|
+
|
|
417
|
+
## 6. 风险与恢复
|
|
418
|
+
|
|
419
|
+
每个高风险项写明:触发信号、事故半径、预防措施、检测方式、恢复动作、owner 和批准点。迁移或发布计划必须给出回滚不可行时的前向恢复方案。
|
|
420
|
+
|
|
421
|
+
## 7. 进度与决策回报
|
|
422
|
+
|
|
423
|
+
使用可核验状态,不使用主观百分比:
|
|
424
|
+
|
|
425
|
+
```text
|
|
426
|
+
WAVE_STATUS wave=<n> ready=<ids> active=<ids> done=<ids> blocked=<ids>
|
|
427
|
+
GATE_STATUS gate=<name> state=open|closed evidence=<paths> risks=<summary>
|
|
428
|
+
TICKET_STATUS id=<id> state=<state> evidence=<path> deviation=<none|id>
|
|
429
|
+
BLOCKER id=<id> owner=<owner> needed=<decision-or-input> impact=<scope>
|
|
430
|
+
DECISION id=<id> owner=<owner> status=pending|approved|rejected impact=<scope>
|
|
431
|
+
```
|
|
432
|
+
|
|
433
|
+
具体路径必须以本文约定的逻辑路径形式填写。
|
|
434
|
+
|
|
435
|
+
</completion-control>
|
|
436
|
+
|
|
437
|
+
<goal-plan-template>
|
|
438
|
+
|
|
439
|
+
## 产物 YAML 头部
|
|
440
|
+
|
|
441
|
+
生成该工件时,将以下字段写在文档开头的 YAML frontmatter 中:
|
|
442
|
+
|
|
443
|
+
```yaml
|
|
444
|
+
schema_version: 3
|
|
445
|
+
artifact: goal-plan
|
|
446
|
+
change: <YYYY-MM-DD-topic>
|
|
447
|
+
status: draft
|
|
448
|
+
modes: [coordination]
|
|
449
|
+
ready_for_execution: false
|
|
450
|
+
```
|
|
451
|
+
|
|
452
|
+
# Goal Plan: <标题>
|
|
453
|
+
|
|
454
|
+
- **Goal Plan:** `specdev/changes/{change}/goal-plan.md`
|
|
455
|
+
- **Spec:** `specdev/changes/{change}/spec.md`
|
|
456
|
+
- **Tickets Map:** `specdev/changes/{change}/tickets-map.md`
|
|
457
|
+
- **Ticket 目录:** `specdev/changes/{change}/ticket/`
|
|
458
|
+
- **Evidence 目录:** `specdev/changes/{change}/evidence/`
|
|
459
|
+
|
|
460
|
+
## 1. Outcome and Authority
|
|
461
|
+
|
|
462
|
+
### Outcome
|
|
463
|
+
|
|
464
|
+
### Non-goals
|
|
465
|
+
|
|
466
|
+
### Authoritative Inputs
|
|
467
|
+
|
|
468
|
+
| 优先级 | 来源 | 负责内容 | 冲突处理 |
|
|
469
|
+
|---|---|---|---|
|
|
470
|
+
| 1 | 用户最新明确决定 | 产品取舍与批准 | 更新真正拥有该决策的工件 |
|
|
471
|
+
| 2 | `specdev/changes/{change}/ADR.md` | 已接受架构决策 | 通过新决策替代 |
|
|
472
|
+
| 3 | `specdev/changes/{change}/spec.md` | 外部行为、范围与验收 | 下游不得改写 |
|
|
473
|
+
| 4 | `specdev/changes/{change}/ticket/NN-<ticket-name>.md` | 单 Ticket 契约 | Goal Plan 只编排 |
|
|
474
|
+
| 5 | 当前代码事实 | 现状与可行性 | 冲突时触发偏差 |
|
|
475
|
+
|
|
476
|
+
## 2. Execution Graph
|
|
477
|
+
|
|
478
|
+
### DAG and Critical Path
|
|
479
|
+
|
|
480
|
+
```text
|
|
481
|
+
...
|
|
482
|
+
```
|
|
483
|
+
|
|
484
|
+
### Waves and Ownership
|
|
485
|
+
|
|
486
|
+
| Wave | Ticket | 前置条件 | 项目写路径 | Shared owner | 集成点 |
|
|
487
|
+
|---|---|---|---|---|---|
|
|
488
|
+
|
|
489
|
+
### Ticket Quick Reference
|
|
490
|
+
|
|
491
|
+
<!-- Ticket 较多或执行者需要时添加;数据从 Ticket 与 Tickets Map 提取。 -->
|
|
492
|
+
|
|
493
|
+
| ID | Ticket | 行为产出 | Depth/Risk | Dependencies | Wave/Gate | Owner | Evidence |
|
|
494
|
+
|---|---|---|---|---|---|---|---|
|
|
495
|
+
| T-01 | `specdev/changes/{change}/ticket/01-<name>.md` | ... | standard/medium | — | W0/G0 | lead | `specdev/changes/{change}/evidence/T-01.md` |
|
|
496
|
+
|
|
497
|
+
## 3. Gates and Completion Evidence
|
|
498
|
+
|
|
499
|
+
### Overall Definition of Done
|
|
500
|
+
|
|
501
|
+
### Gates
|
|
502
|
+
|
|
503
|
+
| Gate | 开启条件 | 关闭证据 | 阻塞范围 | Owner/批准人 | 失败恢复 |
|
|
504
|
+
|---|---|---|---|---|---|
|
|
505
|
+
|
|
506
|
+
### Contract and Reference Coverage
|
|
507
|
+
|
|
508
|
+
| 合同或参考要求 | 覆盖 Ticket | 验证接缝 | Evidence | 状态 |
|
|
509
|
+
|---|---|---|---|---|
|
|
510
|
+
|
|
511
|
+
## 4. Execution and Integration Protocol
|
|
512
|
+
|
|
513
|
+
### Dispatch Payload
|
|
514
|
+
|
|
515
|
+
并行写代码时记录统一 `base_sha`,并为每个 Ticket 指定分支、`workspace_ref` 和 worktree owner。
|
|
516
|
+
|
|
517
|
+
### Ticket Execution
|
|
518
|
+
|
|
519
|
+
引用 “实现阶段” 和对应 `specdev/changes/{change}/ticket/NN-<ticket-name>.md`,不复制 Ticket 全文。
|
|
520
|
+
|
|
521
|
+
### Evidence Return and Integration
|
|
522
|
+
|
|
523
|
+
Worker 将 Ticket 推进到 `review`,返回 Ticket ID 与状态、Evidence 路径、`workspace_ref`、commit 或 PR 引用,以及条件性 Lead E2E;Lead 负责集成、回归和 worktree 收尾。
|
|
524
|
+
|
|
525
|
+
## 5. Constraints, Risk and Recovery
|
|
526
|
+
|
|
527
|
+
### Non-negotiable Constraints
|
|
528
|
+
|
|
529
|
+
### Migration or Release Sequence
|
|
530
|
+
|
|
531
|
+
### Risks, Monitoring and Recovery
|
|
532
|
+
|
|
533
|
+
### Deviation Control
|
|
534
|
+
|
|
535
|
+
遵循 下方 `<deviation-control>` 标签。
|
|
536
|
+
|
|
537
|
+
## 6. Progress and Decisions
|
|
538
|
+
|
|
539
|
+
### Current Status
|
|
540
|
+
|
|
541
|
+
### Pending Decisions and Blockers
|
|
542
|
+
|
|
543
|
+
### Reporting Format
|
|
544
|
+
|
|
545
|
+
## Assumptions
|
|
546
|
+
|
|
547
|
+
仅记录低影响、可逆且有验证方式的假设。高影响假设存在时,`ready_for_execution` 必须为 `false`。
|
|
548
|
+
|
|
549
|
+
</goal-plan-template>
|
|
550
|
+
|
|
551
|
+
<artifact-contract>
|
|
552
|
+
|
|
553
|
+
# 工件职责与权威裁决
|
|
554
|
+
|
|
555
|
+
SpecDev 通过分层工件避免同一决策被多个模型反复重做。每个工件只承担自己的权威边界。
|
|
556
|
+
|
|
557
|
+
## 1. 工件职责
|
|
558
|
+
|
|
559
|
+
| 工件 | 具体位置 | 必须决定 | 不应决定 |
|
|
560
|
+
|---|---|---|---|
|
|
561
|
+
| 分诊 | `specdev/changes/{change}/triage.md` | 请求类别、影响、风险、缺失输入和下一 work | 详细实现方案 |
|
|
562
|
+
| 诊断 | `specdev/changes/{change}/diagnosis.md` | 复现、证据、根因、修复不变量和回归契约 | 未经验证的修复实现 |
|
|
563
|
+
| 设计日志 | `specdev/changes/{change}/LOG.md` | 讨论轨迹、确认、延后、替代与废弃结论 | 当前架构权威摘要 |
|
|
564
|
+
| 领域上下文 | `specdev/changes/{change}/CONTEXT.md` | 当前领域术语、语义和稳定不变量 | 临时会议记录 |
|
|
565
|
+
| 架构决策 | `specdev/changes/{change}/ADR.md` | 已接受架构决策、原因、后果和替代关系 | 尚未决定的方案集合 |
|
|
566
|
+
| Spec | `specdev/changes/{change}/spec.md` | 用户问题、外部行为、范围、验收合同、非功能要求和已锁定实现约束 | 文件级施工步骤 |
|
|
567
|
+
| Ticket | `specdev/changes/{change}/ticket/NN-<ticket-name>.md` | 单一垂直切片的行为、决策、范围、路径所有权、执行路线和验证证据 | 跨 Ticket 里程碑治理 |
|
|
568
|
+
| Tickets Map | `specdev/changes/{change}/tickets-map.md` | 依赖 DAG、合同覆盖、Ready 投影、并行候选和路径冲突 | 单 Ticket 的完整实现契约 |
|
|
569
|
+
| Goal Plan | `specdev/changes/{change}/goal-plan.md` | 跨 Ticket 调度、Gate、共享所有权、迁移顺序、集成和偏差治理 | 复制 Ticket 全文 |
|
|
570
|
+
| Evidence | `specdev/changes/{change}/evidence/T-NN.md` | 实际修改、命令、结果、验收映射、偏差、风险和提交引用 | 新的产品或架构决策 |
|
|
571
|
+
|
|
572
|
+
## 2. 权威顺序
|
|
573
|
+
|
|
574
|
+
同一事项冲突时按下列顺序裁决:
|
|
575
|
+
|
|
576
|
+
1. 用户最新明确决定;
|
|
577
|
+
2. 当前已接受架构决策:`specdev/changes/{change}/ADR.md`;
|
|
578
|
+
3. 当前外部行为权威:`specdev/changes/{change}/spec.md`;
|
|
579
|
+
4. 当前 Ticket 契约:`specdev/changes/{change}/ticket/NN-<ticket-name>.md`;
|
|
580
|
+
5. 当前跨 Ticket 编排:`specdev/changes/{change}/goal-plan.md`;
|
|
581
|
+
6. 当前代码与运行事实;
|
|
582
|
+
7. 旧计划、旧日志和未经确认的推断。
|
|
583
|
+
|
|
584
|
+
代码事实可以证明计划已过时,但不能静默改写用户目标或已接受契约。出现这种情况时,按 下方 `<deviation-control>` 标签 退回相应工件修订。
|
|
585
|
+
|
|
586
|
+
## 3. 来源追踪
|
|
587
|
+
|
|
588
|
+
高影响条目应带来源标识:
|
|
589
|
+
|
|
590
|
+
- `USER-DECISION:<date-or-summary>`;
|
|
591
|
+
- `ADR-###`;
|
|
592
|
+
- `US-###` 或 `AC-###`;
|
|
593
|
+
- `CODE:project/relative/path`;
|
|
594
|
+
- `RESEARCH:<Url>https://example.com/source</Url>`;
|
|
595
|
+
- `DIAG-###`。
|
|
596
|
+
|
|
597
|
+
来源追踪解释“为什么这样决定”,不要求为普通描述逐句加标签。
|
|
598
|
+
|
|
599
|
+
## 4. 冲突处理
|
|
600
|
+
|
|
601
|
+
1. 指明冲突事项和双方来源;
|
|
602
|
+
2. 判断冲突属于事实过时、产品取舍、架构取舍、Ticket 范围还是调度问题;
|
|
603
|
+
3. 按本规则的权威顺序提出裁决;
|
|
604
|
+
4. 若改变外部行为、公共契约、数据、安全、范围、迁移或验收,必须获得用户或指定批准人决定;
|
|
605
|
+
5. 更新真正拥有该决策的工件;
|
|
606
|
+
6. 在 `specdev/changes/{change}/LOG.md` 保留被替代结论和原因;
|
|
607
|
+
7. 重新执行结构校验;纯网页环境按本文的内联规则人工核对。
|
|
608
|
+
|
|
609
|
+
不得仅在下游工件中覆盖上游权威。
|
|
610
|
+
|
|
611
|
+
</artifact-contract>
|
|
612
|
+
|
|
613
|
+
<path-ownership>
|
|
614
|
+
|
|
615
|
+
# 路径所有权与并发规则
|
|
616
|
+
|
|
617
|
+
路径所有权是并行执行的硬边界,不是文件预测清单。
|
|
618
|
+
|
|
619
|
+
## 1. 四类路径
|
|
620
|
+
|
|
621
|
+
- `expected_changes`:预计修改的项目路径,仅用于导航;每项写成项目根相对路径。
|
|
622
|
+
- `writable_paths`:实现者获准修改的项目路径或 glob,是硬约束。
|
|
623
|
+
- `read_only_paths`:建立上下文但不得修改的项目路径。
|
|
624
|
+
- `shared_paths`:多个 Ticket 可能需要修改的项目路径,必须指定唯一 owner。
|
|
625
|
+
|
|
626
|
+
示例:
|
|
627
|
+
|
|
628
|
+
```yaml
|
|
629
|
+
expected_changes: ["src/auth/session.ts"]
|
|
630
|
+
writable_paths: ["src/auth/**"]
|
|
631
|
+
read_only_paths: ["src/users/**"]
|
|
632
|
+
shared_paths: ["package.json"]
|
|
633
|
+
```
|
|
634
|
+
|
|
635
|
+
## 2. 所有权规则
|
|
636
|
+
|
|
637
|
+
1. 可能并行的 Ticket,其 `writable_paths` 不得相交。
|
|
638
|
+
2. glob 与具体路径按覆盖关系判断,不得只比较字符串。
|
|
639
|
+
3. 根依赖清单、锁文件、根导出、共享 schema、迁移索引、全局路由和跨 Ticket 合同文件默认视为 shared。
|
|
640
|
+
4. shared path 只能由 Lead 或专用 owner Ticket 修改;消费者 Ticket 只读。
|
|
641
|
+
5. 需要越界时先停止,按 下方 `<deviation-control>` 标签 提出 ownership change;不得先改后报。
|
|
642
|
+
6. 前置 Ticket 改变目录结构后,后续 Ticket 开始前重新解析项目路径;若授权范围语义未改变,可只更新导航路径。
|
|
643
|
+
7. 不得把“最后解决合并冲突”当作所有权方案。
|
|
644
|
+
|
|
645
|
+
## 3. Worktree 与分支
|
|
646
|
+
|
|
647
|
+
并行写代码的 Ready Ticket 使用隔离 worktree;只读调查和顺序执行默认共用当前工作区。Worktree 防止工作区污染,路径所有权防止逻辑冲突,两者不能互相替代。
|
|
648
|
+
|
|
649
|
+
生命周期由 Lead 按 下方 `<dev-worktree>` 标签 管理,编排规则位于 下方 `<orchestration-protocol>` 标签。
|
|
650
|
+
|
|
651
|
+
</path-ownership>
|
|
652
|
+
|
|
653
|
+
<evidence-and-verification>
|
|
654
|
+
|
|
655
|
+
# 证据与验证规范
|
|
656
|
+
|
|
657
|
+
验证回答“怎样证明行为已经正确发生”,Evidence 回答“实际运行了什么、结果是什么、仍有什么风险”。
|
|
658
|
+
|
|
659
|
+
## 1. 验证矩阵
|
|
660
|
+
|
|
661
|
+
每一行绑定一个行为、合同或风险:
|
|
662
|
+
|
|
663
|
+
| 行为或风险 | 验证接缝 | 方法或命令 | 预期结果 | Evidence |
|
|
664
|
+
|---|---|---|---|---|
|
|
665
|
+
| 正常路径 | 公共接口 | 项目定向测试 | 指定外部行为成立 | `specdev/changes/{change}/evidence/T-NN.md` |
|
|
666
|
+
| 无效输入 | schema 或公共接口 | 定向失败测试 | 稳定错误行为成立 | `specdev/changes/{change}/evidence/T-NN.md` |
|
|
667
|
+
| 回归 | 现有测试套件 | 项目回归命令 | 相关既有行为保持 | `specdev/changes/{change}/evidence/T-NN.md` |
|
|
668
|
+
|
|
669
|
+
命令引用项目脚本时,项目文件路径使用项目根相对路径,例如 `package.json` 或 `Makefile`。
|
|
670
|
+
|
|
671
|
+
## 2. 最小充分验证
|
|
672
|
+
|
|
673
|
+
选择最接近目标行为的稳定接缝:
|
|
674
|
+
|
|
675
|
+
1. 公共接口或契约集成测试;
|
|
676
|
+
2. 稳定接缝上的单元测试;
|
|
677
|
+
3. 类型检查、静态分析、lint 和构建;
|
|
678
|
+
4. 可重复手动步骤、截图或查询结果;
|
|
679
|
+
5. 代码阅读推断。
|
|
680
|
+
|
|
681
|
+
E2E 仅在变更影响用户界面交互时加入验证矩阵,并且只由 Lead 在集成阶段执行。Worker 只记录场景、预期结果和待执行状态。API、CLI、后端、库或数据变更默认使用其稳定接缝,不追加 E2E。
|
|
682
|
+
|
|
683
|
+
低层证据不能替代明确要求的用户行为证据。高风险迁移还需要 dry-run、调用点扫描、数据核对、监控信号或回滚演练。
|
|
684
|
+
|
|
685
|
+
## 3. 失败分类
|
|
686
|
+
|
|
687
|
+
每个失败必须分类为:
|
|
688
|
+
|
|
689
|
+
- 本 Ticket 引入的新失败;
|
|
690
|
+
- 基线已存在的失败;
|
|
691
|
+
- 环境、权限或基础设施失败;
|
|
692
|
+
- 验证本身无效或无法观察目标行为。
|
|
693
|
+
|
|
694
|
+
不得通过跳过测试、放宽断言、吞错、删除用例或把命令移出验证矩阵来制造绿色。
|
|
695
|
+
|
|
696
|
+
## 4. Evidence 最低内容
|
|
697
|
+
|
|
698
|
+
每个完成 Ticket 在 `specdev/changes/{change}/evidence/T-NN.md` 记录:
|
|
699
|
+
|
|
700
|
+
- 基线、分支或 worktree;
|
|
701
|
+
- 实际修改的项目路径;
|
|
702
|
+
- 每条命令、退出状态和结果摘要;
|
|
703
|
+
- 每条验收合同的证据映射;
|
|
704
|
+
- 未运行项与原因;
|
|
705
|
+
- 新失败、既有失败和环境失败;
|
|
706
|
+
- 偏差及批准;
|
|
707
|
+
- 残余风险;
|
|
708
|
+
- worktree、提交或 PR 引用;
|
|
709
|
+
- 最终结论。
|
|
710
|
+
|
|
711
|
+
无法运行关键验证、存在未批准偏差或 Evidence 不完整时,Ticket 不得标为 `done`。
|
|
712
|
+
|
|
713
|
+
</evidence-and-verification>
|
|
714
|
+
|
|
715
|
+
<deviation-control>
|
|
716
|
+
|
|
717
|
+
# 偏差控制
|
|
718
|
+
|
|
719
|
+
偏差是“当前事实或实现需要偏离已批准工件”的显式事件。偏差不是普通进度说明,也不能作为先改后补文档的许可证。
|
|
720
|
+
|
|
721
|
+
## 1. 偏差等级
|
|
722
|
+
|
|
723
|
+
- **local**:只改变局部实现,不改变 Ticket 的行为、范围、公共契约、路径所有权或验证;记录到 Evidence 后可继续。
|
|
724
|
+
- **ticket**:改变 Ticket 的执行路线、可写范围、局部契约或验收映射,但不改变 Spec;必须停止相关修改、更新 Ticket 并获得 owner 或 Lead 批准。
|
|
725
|
+
- **spec**:改变外部行为、范围、用户故事、验收合同或非功能要求;必须返回 “编写 Spec 阶段”。
|
|
726
|
+
- **architecture**:改变已接受架构决策或公共架构约束;必须返回 “设计访谈能力” 并更新 `specdev/changes/{change}/ADR.md`。
|
|
727
|
+
- **release**:改变迁移、兼容窗口、发布门禁、回滚或不可逆批准点;必须停止并获得明确人工批准。
|
|
728
|
+
|
|
729
|
+
## 2. 触发条件
|
|
730
|
+
|
|
731
|
+
以下任一情况必须建立偏差:
|
|
732
|
+
|
|
733
|
+
- 当前代码事实使批准路线不可行;
|
|
734
|
+
- 需要修改 Ticket 未授权的项目路径;
|
|
735
|
+
- 需要修改 shared path,但当前实现者不是 owner;
|
|
736
|
+
- 验证接缝无法证明验收合同;
|
|
737
|
+
- 发现新的安全、数据、兼容、性能或迁移风险;
|
|
738
|
+
- 依赖、合同或外部参考权威已变化;
|
|
739
|
+
- 实际行为将与 Spec 或 ADR 不一致。
|
|
740
|
+
|
|
741
|
+
## 3. 偏差记录
|
|
742
|
+
|
|
743
|
+
偏差记录写入对应 Evidence:`specdev/changes/{change}/evidence/T-NN.md`,并至少包含:
|
|
744
|
+
|
|
745
|
+
- 偏差 ID 与等级;
|
|
746
|
+
- 触发事实和证据;
|
|
747
|
+
- 受影响工件与路径;
|
|
748
|
+
- 继续、回退、修订或拆分的选项;
|
|
749
|
+
- 推荐方案和风险;
|
|
750
|
+
- 批准人、批准时间和批准范围;
|
|
751
|
+
- 最终处理结果。
|
|
752
|
+
|
|
753
|
+
需要改变上层工件时,Evidence 只记录事件;真正的权威变更必须写回对应 Spec、Ticket、ADR 或 Goal Plan。
|
|
754
|
+
|
|
755
|
+
## 4. 停止规则
|
|
756
|
+
|
|
757
|
+
- 未批准的 ticket、spec、architecture 或 release 偏差不得继续实现。
|
|
758
|
+
- 不得通过扩大 `writable_paths`、删除测试、降低断言或把风险改写成“已知限制”来绕过停止。
|
|
759
|
+
- 偏差影响并发 Agent 时,Lead 必须暂停受影响 Wave,重新计算路径所有权、依赖和 Gate。
|
|
760
|
+
|
|
761
|
+
</deviation-control>
|
|
762
|
+
|
|
763
|
+
<research>
|
|
764
|
+
|
|
765
|
+
# SpecDev Research
|
|
766
|
+
|
|
767
|
+
## 触发
|
|
768
|
+
|
|
769
|
+
当外部 API、库版本、协议、法规、产品能力或最佳实践会改变设计/实现决策,且当前材料不足时使用。
|
|
770
|
+
|
|
771
|
+
## 流程
|
|
772
|
+
|
|
773
|
+
1. 写清楚要支持的具体决策和停止条件。
|
|
774
|
+
2. 优先官方文档、规范、源代码、论文或维护者材料;技术问题优先一手来源。
|
|
775
|
+
3. 核对版本、发布日期、适用环境和已知限制。
|
|
776
|
+
4. 区分:来源明确事实、代码库事实、推断、建议。
|
|
777
|
+
5. 对关键结论至少交叉验证;来源冲突时并列呈现,不强行调和。
|
|
778
|
+
6. 记录摘要、证据、置信度、对 ADR/Spec/Ticket 的影响和仍未知项。
|
|
779
|
+
7. 长期有效且经实现验证后才可由 Archive 提升到永久 research。
|
|
780
|
+
|
|
781
|
+
## 输出模板
|
|
782
|
+
|
|
783
|
+
```markdown
|
|
784
|
+
# Research: <问题>
|
|
785
|
+
- 决策用途:
|
|
786
|
+
- 范围/版本:
|
|
787
|
+
- 停止条件:
|
|
788
|
+
|
|
789
|
+
## Findings
|
|
790
|
+
### R-001
|
|
791
|
+
- 结论:
|
|
792
|
+
- 类型:官方事实 / 代码事实 / 推断 / 建议
|
|
793
|
+
- 来源:
|
|
794
|
+
- 置信度:high / medium / low
|
|
795
|
+
- 适用限制:
|
|
796
|
+
- 对工件影响:
|
|
797
|
+
|
|
798
|
+
## Conflicts and Unknowns
|
|
799
|
+
## Recommendation
|
|
800
|
+
```
|
|
801
|
+
|
|
802
|
+
不得长篇复制受版权保护的来源;使用短引文和自己的准确摘要。
|
|
803
|
+
|
|
804
|
+
</research>
|
|
805
|
+
|
|
806
|
+
<dev-worktree>
|
|
807
|
+
|
|
808
|
+
# SpecDev Dev Worktree
|
|
809
|
+
|
|
810
|
+
## 适用范围
|
|
811
|
+
|
|
812
|
+
- 仅用于并行写代码且路径所有权不冲突的 Ready Ticket。
|
|
813
|
+
- 只读调查和顺序执行默认共用当前工作区。
|
|
814
|
+
- Lead 管理创建、集成和清理;Worker 只实现、验证并返回 Evidence。
|
|
815
|
+
- 平台原生 worktree 优先;不可用时使用 Git worktree。
|
|
816
|
+
|
|
817
|
+
## 生命周期
|
|
818
|
+
|
|
819
|
+
1. 创建或恢复时加载 下方 `<dev-worktree-create>` 标签。
|
|
820
|
+
2. Worker 完成后将记录从 `active` 更新为 `review`,返回 Ticket 状态、Evidence 路径、`workspace_ref`、commit 或 PR 引用,以及条件性 Lead E2E。
|
|
821
|
+
3. Lead 集成或清理时加载 下方 `<dev-worktree-finalize>` 标签。
|
|
822
|
+
|
|
823
|
+
状态依次为 `planned → active → review → integrated → removed`;失败进入 `blocked`。记录写入 `specdev/changes/{change}/.status.json` 的 `worktrees`。
|
|
824
|
+
|
|
825
|
+
## 边界
|
|
826
|
+
|
|
827
|
+
- 每个并行 Ticket 使用独立 worktree、分支和相同 `base_sha`。
|
|
828
|
+
- 持久状态只保存 `workspace_ref`,不保存机器绝对路径。
|
|
829
|
+
- E2E 仅由 Lead 在集成阶段执行,且仅适用于用户界面交互受影响的变更。
|
|
830
|
+
- 合并、推送、PR、删除分支或 worktree 仍需用户授权。
|
|
831
|
+
|
|
832
|
+
</dev-worktree>
|
|
833
|
+
|
|
834
|
+
<dev-worktree-create>
|
|
835
|
+
|
|
836
|
+
# 创建或恢复 Ticket Worktree
|
|
837
|
+
|
|
838
|
+
## 前置
|
|
839
|
+
|
|
840
|
+
- Ticket `ready: true`,依赖完成,写路径无冲突。
|
|
841
|
+
- `specdev/config.json` 中 `git.worktree_for_parallel: true`。
|
|
842
|
+
- Lead 已固定所有并行 Ticket 共用的 `base_sha`。
|
|
843
|
+
|
|
844
|
+
## 创建
|
|
845
|
+
|
|
846
|
+
1. 若 `specdev/changes/{change}/.status.json` 的 `worktrees` 已有该 Ticket 的 `active` 或 `review` 记录,解析 `workspace_ref` 并验证分支、`base_sha` 和工作区状态;一致则恢复。
|
|
847
|
+
2. 否则优先调用平台原生 worktree 能力;不可用时从 `base_sha` 执行 `git worktree add -b <ticket-branch> <physical-path> <base-sha>`。物理路径必须位于主工作树之外。
|
|
848
|
+
3. 分支使用 `speculo/<change>/<ticket-id>`;现有分支或目标路径未能匹配记录时停止。
|
|
849
|
+
4. 安装项目所需依赖,运行最小基线检查。E2E 不属于 Worker 基线。
|
|
850
|
+
5. 写入 `worktrees`:
|
|
851
|
+
|
|
852
|
+
```json
|
|
853
|
+
{
|
|
854
|
+
"ticket_id": "T-01",
|
|
855
|
+
"owner": "<worker>",
|
|
856
|
+
"provider": "native",
|
|
857
|
+
"base_sha": "<sha>",
|
|
858
|
+
"branch": "speculo/<change>/T-01",
|
|
859
|
+
"workspace_ref": "<provider-opaque-or-project-relative-ref>",
|
|
860
|
+
"status": "active",
|
|
861
|
+
"updated_at": "<ISO-8601>"
|
|
862
|
+
}
|
|
863
|
+
```
|
|
864
|
+
|
|
865
|
+
完成条件:工作区可定位、基线可用、状态记录与实际分支一致。失败时设为 `blocked` 并保留现场。
|
|
866
|
+
|
|
867
|
+
</dev-worktree-create>
|
|
868
|
+
|
|
869
|
+
<dev-worktree-finalize>
|
|
870
|
+
|
|
871
|
+
# 集成与清理 Ticket Worktree
|
|
872
|
+
|
|
873
|
+
## Lead 集成
|
|
874
|
+
|
|
875
|
+
1. 确认记录为 `review`,读取 Worker Evidence,实际修改未越过路径契约。
|
|
876
|
+
2. 在目标集成基线上应用变更并运行受影响的定向与回归验证。
|
|
877
|
+
3. 仅当变更影响用户界面交互时,由 Lead 运行验收所需的最小 E2E;Worker 只提供场景和预期结果。
|
|
878
|
+
4. 验证通过后将记录更新为 `integrated`;冲突或失败时设为 `blocked` 并保留 worktree。
|
|
879
|
+
|
|
880
|
+
## 清理
|
|
881
|
+
|
|
882
|
+
1. 取得用户对删除 worktree 和分支的授权。
|
|
883
|
+
2. 从主工作树或平台管理入口移除已集成 worktree。
|
|
884
|
+
3. 确认 worktree 不再注册后删除对应分支,并将状态更新为 `removed`。
|
|
885
|
+
|
|
886
|
+
PR 或暂缓集成时保留 worktree。清理失败时停止;仅在用户明确要求时使用强制删除。
|
|
887
|
+
|
|
888
|
+
</dev-worktree-finalize>
|
|
889
|
+
|
|
890
|
+
<config-template>
|
|
891
|
+
|
|
892
|
+
```json
|
|
893
|
+
{
|
|
894
|
+
"schema_version": 3,
|
|
895
|
+
"interaction_language": "zh-CN",
|
|
896
|
+
"artifact_language": "zh-CN",
|
|
897
|
+
"git": {
|
|
898
|
+
"auto_commit": false,
|
|
899
|
+
"default_branch": null,
|
|
900
|
+
"worktree_for_parallel": true
|
|
901
|
+
},
|
|
902
|
+
"execution": {
|
|
903
|
+
"max_parallel": 3,
|
|
904
|
+
"deep_ticket_human_approval": true,
|
|
905
|
+
"shared_path_owner": "lead"
|
|
906
|
+
},
|
|
907
|
+
"verification": {
|
|
908
|
+
"test": null,
|
|
909
|
+
"typecheck": null,
|
|
910
|
+
"lint": null,
|
|
911
|
+
"build": null
|
|
912
|
+
},
|
|
913
|
+
"planning": {
|
|
914
|
+
"default_depth": "standard",
|
|
915
|
+
"require_ready_gate": true,
|
|
916
|
+
"require_evidence": true
|
|
917
|
+
}
|
|
918
|
+
}
|
|
919
|
+
```
|
|
920
|
+
|
|
921
|
+
</config-template>
|
|
922
|
+
|
|
923
|
+
<config-schema>
|
|
924
|
+
|
|
925
|
+
```json
|
|
926
|
+
{
|
|
927
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
928
|
+
"$id": "urn:speculo:specdev:config:v3",
|
|
929
|
+
"title": "SpecDev Configuration",
|
|
930
|
+
"type": "object",
|
|
931
|
+
"required": ["schema_version", "interaction_language", "artifact_language", "git", "execution", "verification", "planning"],
|
|
932
|
+
"properties": {
|
|
933
|
+
"schema_version": {"const": 3},
|
|
934
|
+
"interaction_language": {"type": "string", "minLength": 1},
|
|
935
|
+
"artifact_language": {"type": "string", "minLength": 1},
|
|
936
|
+
"git": {
|
|
937
|
+
"type": "object",
|
|
938
|
+
"required": ["auto_commit", "default_branch", "worktree_for_parallel"],
|
|
939
|
+
"properties": {
|
|
940
|
+
"auto_commit": {"type": "boolean"},
|
|
941
|
+
"default_branch": {"type": ["string", "null"]},
|
|
942
|
+
"worktree_for_parallel": {"type": "boolean"}
|
|
943
|
+
},
|
|
944
|
+
"additionalProperties": true
|
|
945
|
+
},
|
|
946
|
+
"execution": {
|
|
947
|
+
"type": "object",
|
|
948
|
+
"required": ["max_parallel", "deep_ticket_human_approval", "shared_path_owner"],
|
|
949
|
+
"properties": {
|
|
950
|
+
"max_parallel": {"type": "integer", "minimum": 1},
|
|
951
|
+
"deep_ticket_human_approval": {"type": "boolean"},
|
|
952
|
+
"shared_path_owner": {"type": "string", "minLength": 1}
|
|
953
|
+
},
|
|
954
|
+
"additionalProperties": true
|
|
955
|
+
},
|
|
956
|
+
"verification": {
|
|
957
|
+
"type": "object",
|
|
958
|
+
"required": ["test", "typecheck", "lint", "build"],
|
|
959
|
+
"properties": {
|
|
960
|
+
"test": {"type": ["string", "null"]},
|
|
961
|
+
"typecheck": {"type": ["string", "null"]},
|
|
962
|
+
"lint": {"type": ["string", "null"]},
|
|
963
|
+
"build": {"type": ["string", "null"]}
|
|
964
|
+
},
|
|
965
|
+
"additionalProperties": true
|
|
966
|
+
},
|
|
967
|
+
"planning": {
|
|
968
|
+
"type": "object",
|
|
969
|
+
"required": ["default_depth", "require_ready_gate", "require_evidence"],
|
|
970
|
+
"properties": {
|
|
971
|
+
"default_depth": {"enum": ["lite", "standard", "deep"]},
|
|
972
|
+
"require_ready_gate": {"type": "boolean"},
|
|
973
|
+
"require_evidence": {"type": "boolean"}
|
|
974
|
+
},
|
|
975
|
+
"additionalProperties": true
|
|
976
|
+
}
|
|
977
|
+
},
|
|
978
|
+
"additionalProperties": true
|
|
979
|
+
}
|
|
980
|
+
```
|
|
981
|
+
|
|
982
|
+
</config-schema>
|
|
983
|
+
|
|
984
|
+
<status-template>
|
|
985
|
+
|
|
986
|
+
```json
|
|
987
|
+
{
|
|
988
|
+
"schema_version": 3,
|
|
989
|
+
"workflow": "specdev",
|
|
990
|
+
"active": [],
|
|
991
|
+
"work_history": [],
|
|
992
|
+
"completed": []
|
|
993
|
+
}
|
|
994
|
+
```
|
|
995
|
+
|
|
996
|
+
</status-template>
|
|
997
|
+
|
|
998
|
+
<status-schema>
|
|
999
|
+
|
|
1000
|
+
```json
|
|
1001
|
+
{
|
|
1002
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
1003
|
+
"$id": "urn:speculo:specdev:status:v3",
|
|
1004
|
+
"title": "SpecDev Global Status",
|
|
1005
|
+
"type": "object",
|
|
1006
|
+
"required": [
|
|
1007
|
+
"schema_version",
|
|
1008
|
+
"workflow",
|
|
1009
|
+
"active",
|
|
1010
|
+
"work_history",
|
|
1011
|
+
"completed"
|
|
1012
|
+
],
|
|
1013
|
+
"properties": {
|
|
1014
|
+
"schema_version": {
|
|
1015
|
+
"const": 3
|
|
1016
|
+
},
|
|
1017
|
+
"workflow": {
|
|
1018
|
+
"const": "specdev"
|
|
1019
|
+
},
|
|
1020
|
+
"active": {
|
|
1021
|
+
"type": "array",
|
|
1022
|
+
"items": {
|
|
1023
|
+
"type": "object",
|
|
1024
|
+
"required": [
|
|
1025
|
+
"change",
|
|
1026
|
+
"current_work",
|
|
1027
|
+
"works_run",
|
|
1028
|
+
"result"
|
|
1029
|
+
],
|
|
1030
|
+
"properties": {
|
|
1031
|
+
"change": {
|
|
1032
|
+
"type": "string"
|
|
1033
|
+
},
|
|
1034
|
+
"current_work": {
|
|
1035
|
+
"type": [
|
|
1036
|
+
"string",
|
|
1037
|
+
"null"
|
|
1038
|
+
]
|
|
1039
|
+
},
|
|
1040
|
+
"works_run": {
|
|
1041
|
+
"type": "array",
|
|
1042
|
+
"items": {
|
|
1043
|
+
"type": "string"
|
|
1044
|
+
}
|
|
1045
|
+
},
|
|
1046
|
+
"result": {
|
|
1047
|
+
"type": [
|
|
1048
|
+
"string",
|
|
1049
|
+
"null"
|
|
1050
|
+
]
|
|
1051
|
+
},
|
|
1052
|
+
"claimed_investigations": {
|
|
1053
|
+
"type": "array",
|
|
1054
|
+
"items": {
|
|
1055
|
+
"type": "object",
|
|
1056
|
+
"required": [
|
|
1057
|
+
"id",
|
|
1058
|
+
"owner",
|
|
1059
|
+
"claimed_at"
|
|
1060
|
+
],
|
|
1061
|
+
"properties": {
|
|
1062
|
+
"id": {
|
|
1063
|
+
"type": "string"
|
|
1064
|
+
},
|
|
1065
|
+
"owner": {
|
|
1066
|
+
"type": "string"
|
|
1067
|
+
},
|
|
1068
|
+
"session": {
|
|
1069
|
+
"type": [
|
|
1070
|
+
"string",
|
|
1071
|
+
"null"
|
|
1072
|
+
]
|
|
1073
|
+
},
|
|
1074
|
+
"claimed_at": {
|
|
1075
|
+
"type": "string"
|
|
1076
|
+
}
|
|
1077
|
+
},
|
|
1078
|
+
"additionalProperties": true
|
|
1079
|
+
}
|
|
1080
|
+
}
|
|
1081
|
+
},
|
|
1082
|
+
"additionalProperties": true
|
|
1083
|
+
}
|
|
1084
|
+
},
|
|
1085
|
+
"work_history": {
|
|
1086
|
+
"type": "array",
|
|
1087
|
+
"items": {
|
|
1088
|
+
"type": "object",
|
|
1089
|
+
"required": [
|
|
1090
|
+
"change",
|
|
1091
|
+
"work_id",
|
|
1092
|
+
"started_at",
|
|
1093
|
+
"completed_at",
|
|
1094
|
+
"result"
|
|
1095
|
+
],
|
|
1096
|
+
"properties": {
|
|
1097
|
+
"change": {
|
|
1098
|
+
"type": "string"
|
|
1099
|
+
},
|
|
1100
|
+
"work_id": {
|
|
1101
|
+
"type": "string",
|
|
1102
|
+
"pattern": "^specdev/"
|
|
1103
|
+
},
|
|
1104
|
+
"started_at": {
|
|
1105
|
+
"type": "string"
|
|
1106
|
+
},
|
|
1107
|
+
"completed_at": {
|
|
1108
|
+
"type": [
|
|
1109
|
+
"string",
|
|
1110
|
+
"null"
|
|
1111
|
+
]
|
|
1112
|
+
},
|
|
1113
|
+
"result": {
|
|
1114
|
+
"type": [
|
|
1115
|
+
"string",
|
|
1116
|
+
"null"
|
|
1117
|
+
]
|
|
1118
|
+
}
|
|
1119
|
+
},
|
|
1120
|
+
"additionalProperties": true
|
|
1121
|
+
}
|
|
1122
|
+
},
|
|
1123
|
+
"completed": {
|
|
1124
|
+
"type": "array",
|
|
1125
|
+
"items": {
|
|
1126
|
+
"type": "object",
|
|
1127
|
+
"required": [
|
|
1128
|
+
"change",
|
|
1129
|
+
"archived_at",
|
|
1130
|
+
"archive_path"
|
|
1131
|
+
],
|
|
1132
|
+
"properties": {
|
|
1133
|
+
"change": {
|
|
1134
|
+
"type": "string"
|
|
1135
|
+
},
|
|
1136
|
+
"archived_at": {
|
|
1137
|
+
"type": "string"
|
|
1138
|
+
},
|
|
1139
|
+
"archive_path": {
|
|
1140
|
+
"type": "string",
|
|
1141
|
+
"pattern": "^specdev/archive/[0-9]{4}-[0-9]{2}/.+/$"
|
|
1142
|
+
}
|
|
1143
|
+
},
|
|
1144
|
+
"additionalProperties": true
|
|
1145
|
+
}
|
|
1146
|
+
}
|
|
1147
|
+
},
|
|
1148
|
+
"additionalProperties": true
|
|
1149
|
+
}
|
|
1150
|
+
```
|
|
1151
|
+
|
|
1152
|
+
</status-schema>
|
|
1153
|
+
|
|
1154
|
+
<change-status-template>
|
|
1155
|
+
|
|
1156
|
+
```json
|
|
1157
|
+
{
|
|
1158
|
+
"schema_version": 3,
|
|
1159
|
+
"artifact": "change-status",
|
|
1160
|
+
"change": "<YYYY-MM-DD-topic>",
|
|
1161
|
+
"change_status": "active",
|
|
1162
|
+
"current_work": null,
|
|
1163
|
+
"created_at": "<ISO-8601>",
|
|
1164
|
+
"updated_at": "<ISO-8601>",
|
|
1165
|
+
"completed_at": null,
|
|
1166
|
+
"archived": false,
|
|
1167
|
+
"archive_path": null,
|
|
1168
|
+
"blockers": [],
|
|
1169
|
+
"deviations": [],
|
|
1170
|
+
"worktrees": []
|
|
1171
|
+
}
|
|
1172
|
+
```
|
|
1173
|
+
|
|
1174
|
+
</change-status-template>
|
|
1175
|
+
|
|
1176
|
+
<change-status-schema>
|
|
1177
|
+
|
|
1178
|
+
```json
|
|
1179
|
+
{
|
|
1180
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
1181
|
+
"$id": "urn:speculo:specdev:change-status:v3",
|
|
1182
|
+
"title": "SpecDev Change Status",
|
|
1183
|
+
"type": "object",
|
|
1184
|
+
"required": [
|
|
1185
|
+
"schema_version",
|
|
1186
|
+
"artifact",
|
|
1187
|
+
"change",
|
|
1188
|
+
"change_status",
|
|
1189
|
+
"current_work",
|
|
1190
|
+
"created_at",
|
|
1191
|
+
"updated_at",
|
|
1192
|
+
"completed_at",
|
|
1193
|
+
"archived",
|
|
1194
|
+
"archive_path",
|
|
1195
|
+
"blockers",
|
|
1196
|
+
"deviations"
|
|
1197
|
+
],
|
|
1198
|
+
"properties": {
|
|
1199
|
+
"schema_version": {
|
|
1200
|
+
"const": 3
|
|
1201
|
+
},
|
|
1202
|
+
"artifact": {
|
|
1203
|
+
"const": "change-status"
|
|
1204
|
+
},
|
|
1205
|
+
"change": {
|
|
1206
|
+
"type": "string",
|
|
1207
|
+
"pattern": "^[0-9]{4}-[0-9]{2}-[0-9]{2}-[a-z0-9]+(?:-[a-z0-9]+)*$"
|
|
1208
|
+
},
|
|
1209
|
+
"change_status": {
|
|
1210
|
+
"enum": [
|
|
1211
|
+
"active",
|
|
1212
|
+
"blocked",
|
|
1213
|
+
"completed",
|
|
1214
|
+
"archived"
|
|
1215
|
+
]
|
|
1216
|
+
},
|
|
1217
|
+
"current_work": {
|
|
1218
|
+
"type": [
|
|
1219
|
+
"string",
|
|
1220
|
+
"null"
|
|
1221
|
+
]
|
|
1222
|
+
},
|
|
1223
|
+
"created_at": {
|
|
1224
|
+
"type": "string",
|
|
1225
|
+
"minLength": 1
|
|
1226
|
+
},
|
|
1227
|
+
"updated_at": {
|
|
1228
|
+
"type": "string",
|
|
1229
|
+
"minLength": 1
|
|
1230
|
+
},
|
|
1231
|
+
"completed_at": {
|
|
1232
|
+
"type": [
|
|
1233
|
+
"string",
|
|
1234
|
+
"null"
|
|
1235
|
+
]
|
|
1236
|
+
},
|
|
1237
|
+
"archived": {
|
|
1238
|
+
"type": "boolean"
|
|
1239
|
+
},
|
|
1240
|
+
"archive_path": {
|
|
1241
|
+
"anyOf": [
|
|
1242
|
+
{
|
|
1243
|
+
"type": "null"
|
|
1244
|
+
},
|
|
1245
|
+
{
|
|
1246
|
+
"type": "string",
|
|
1247
|
+
"pattern": "^specdev/archive/[0-9]{4}-[0-9]{2}/.+/$"
|
|
1248
|
+
}
|
|
1249
|
+
]
|
|
1250
|
+
},
|
|
1251
|
+
"blockers": {
|
|
1252
|
+
"type": "array",
|
|
1253
|
+
"items": {
|
|
1254
|
+
"type": "string"
|
|
1255
|
+
}
|
|
1256
|
+
},
|
|
1257
|
+
"deviations": {
|
|
1258
|
+
"type": "array",
|
|
1259
|
+
"items": {
|
|
1260
|
+
"type": "string"
|
|
1261
|
+
}
|
|
1262
|
+
},
|
|
1263
|
+
"worktrees": {
|
|
1264
|
+
"type": "array",
|
|
1265
|
+
"items": {
|
|
1266
|
+
"type": "object",
|
|
1267
|
+
"required": [
|
|
1268
|
+
"ticket_id",
|
|
1269
|
+
"owner",
|
|
1270
|
+
"provider",
|
|
1271
|
+
"base_sha",
|
|
1272
|
+
"branch",
|
|
1273
|
+
"workspace_ref",
|
|
1274
|
+
"status",
|
|
1275
|
+
"updated_at"
|
|
1276
|
+
],
|
|
1277
|
+
"properties": {
|
|
1278
|
+
"ticket_id": {
|
|
1279
|
+
"type": "string",
|
|
1280
|
+
"pattern": "^T-[0-9]{2,}$"
|
|
1281
|
+
},
|
|
1282
|
+
"owner": {
|
|
1283
|
+
"type": "string",
|
|
1284
|
+
"minLength": 1
|
|
1285
|
+
},
|
|
1286
|
+
"provider": {
|
|
1287
|
+
"enum": [
|
|
1288
|
+
"native",
|
|
1289
|
+
"git",
|
|
1290
|
+
"external"
|
|
1291
|
+
]
|
|
1292
|
+
},
|
|
1293
|
+
"base_sha": {
|
|
1294
|
+
"type": "string",
|
|
1295
|
+
"minLength": 1
|
|
1296
|
+
},
|
|
1297
|
+
"branch": {
|
|
1298
|
+
"type": "string",
|
|
1299
|
+
"minLength": 1
|
|
1300
|
+
},
|
|
1301
|
+
"workspace_ref": {
|
|
1302
|
+
"type": "string",
|
|
1303
|
+
"minLength": 1,
|
|
1304
|
+
"pattern": "^(?!/)(?![A-Za-z]:[\\\\/]).+"
|
|
1305
|
+
},
|
|
1306
|
+
"status": {
|
|
1307
|
+
"enum": [
|
|
1308
|
+
"planned",
|
|
1309
|
+
"active",
|
|
1310
|
+
"review",
|
|
1311
|
+
"integrated",
|
|
1312
|
+
"removed",
|
|
1313
|
+
"blocked"
|
|
1314
|
+
]
|
|
1315
|
+
},
|
|
1316
|
+
"updated_at": {
|
|
1317
|
+
"type": "string",
|
|
1318
|
+
"minLength": 1
|
|
1319
|
+
}
|
|
1320
|
+
},
|
|
1321
|
+
"additionalProperties": true
|
|
1322
|
+
}
|
|
1323
|
+
}
|
|
1324
|
+
},
|
|
1325
|
+
"allOf": [
|
|
1326
|
+
{
|
|
1327
|
+
"if": {
|
|
1328
|
+
"properties": {
|
|
1329
|
+
"change_status": {
|
|
1330
|
+
"const": "archived"
|
|
1331
|
+
}
|
|
1332
|
+
}
|
|
1333
|
+
},
|
|
1334
|
+
"then": {
|
|
1335
|
+
"properties": {
|
|
1336
|
+
"archived": {
|
|
1337
|
+
"const": true
|
|
1338
|
+
},
|
|
1339
|
+
"archive_path": {
|
|
1340
|
+
"type": "string",
|
|
1341
|
+
"pattern": "^specdev/archive/[0-9]{4}-[0-9]{2}/.+/$"
|
|
1342
|
+
}
|
|
1343
|
+
}
|
|
1344
|
+
}
|
|
1345
|
+
}
|
|
1346
|
+
],
|
|
1347
|
+
"additionalProperties": true
|
|
1348
|
+
}
|
|
1349
|
+
```
|
|
1350
|
+
|
|
1351
|
+
</change-status-schema>
|
|
1352
|
+
|
|
1353
|
+
<goal-plan-schema>
|
|
1354
|
+
|
|
1355
|
+
```json
|
|
1356
|
+
{
|
|
1357
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
1358
|
+
"$id": "urn:speculo:specdev:goal-plan:v3",
|
|
1359
|
+
"title": "SpecDev Goal Plan Frontmatter",
|
|
1360
|
+
"type": "object",
|
|
1361
|
+
"required": ["schema_version", "artifact", "change", "status", "modes", "ready_for_execution"],
|
|
1362
|
+
"properties": {
|
|
1363
|
+
"schema_version": {"const": 3},
|
|
1364
|
+
"artifact": {"const": "goal-plan"},
|
|
1365
|
+
"change": {"type": "string", "minLength": 1},
|
|
1366
|
+
"status": {"enum": ["draft", "ready", "in_progress", "completed", "blocked"]},
|
|
1367
|
+
"modes": {
|
|
1368
|
+
"type": "array",
|
|
1369
|
+
"items": {"enum": ["coordination", "migration", "high-assurance", "reference-conformance", "release-coordination"]},
|
|
1370
|
+
"minItems": 1,
|
|
1371
|
+
"uniqueItems": true
|
|
1372
|
+
},
|
|
1373
|
+
"ready_for_execution": {"type": "boolean"}
|
|
1374
|
+
},
|
|
1375
|
+
"additionalProperties": true
|
|
1376
|
+
}
|
|
1377
|
+
```
|
|
1378
|
+
|
|
1379
|
+
</goal-plan-schema>
|