@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,84 +1,1099 @@
|
|
|
1
1
|
# 编写 Spec
|
|
2
2
|
|
|
3
|
-
|
|
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
|
+
本 work 以“综合已有上下文”为主,不启动宽泛访谈。它保留原有的代码库探索、领域词汇、ADR 约束、测试接缝设计和用户确认能力,但将确认限制为真正影响外部行为或验证的高价值问题。
|
|
17
|
+
|
|
18
|
+
Spec 决定“为什么、为谁、系统应表现为何”。它可以锁定影响公共接口、数据、兼容、安全或验收的实现约束,但不写逐文件施工计划。
|
|
19
|
+
|
|
20
|
+
## 输入
|
|
21
|
+
|
|
22
|
+
按存在情况读取:
|
|
23
|
+
|
|
24
|
+
- `specdev/changes/{change}/source-issue.md`
|
|
25
|
+
- `specdev/changes/{change}/triage.md`
|
|
26
|
+
- `specdev/changes/{change}/diagnosis.md`
|
|
27
|
+
- `specdev/changes/{change}/LOG.md`
|
|
28
|
+
- `specdev/changes/{change}/CONTEXT.md`
|
|
29
|
+
- `specdev/changes/{change}/ADR.md`
|
|
30
|
+
- `specdev/context/`
|
|
31
|
+
- `specdev/adr/`
|
|
32
|
+
- 当前代码、测试、接口、schema、配置和运行事实。
|
|
33
|
+
|
|
34
|
+
不存在的可选工件静默跳过,不得把缺失内容当作已确认事实。
|
|
4
35
|
|
|
5
36
|
## 流程
|
|
6
37
|
|
|
7
|
-
### 1.
|
|
38
|
+
### 1. Grounding 与事实探索
|
|
8
39
|
|
|
9
|
-
|
|
40
|
+
1. 汇总用户目标、受众、问题、限制和已有决定;
|
|
41
|
+
2. 只读探索相关代码、测试、配置、schema 和相邻实现;
|
|
42
|
+
3. 使用 `specdev/changes/{change}/CONTEXT.md` 与 `specdev/context/` 的术语,不自创冲突名称;
|
|
43
|
+
4. 使用 `specdev/changes/{change}/ADR.md` 与 `specdev/adr/` 的已接受决策;
|
|
44
|
+
5. 按 下方 `<planning-principles>` 标签 区分可发现事实、高影响偏好和低影响实现细节;
|
|
45
|
+
6. 按 下方 `<artifact-contract>` 标签 处理冲突;
|
|
46
|
+
7. 外部依赖、标准或版本行为不清楚时使用 下方 `<research>` 标签。
|
|
10
47
|
|
|
11
|
-
|
|
48
|
+
广泛的产品或架构取舍仍未确定时,返回 “设计访谈能力”;不要在 Spec 中用猜测补齐。
|
|
12
49
|
|
|
13
|
-
|
|
50
|
+
### 2. 定义问题、用户和成功
|
|
14
51
|
|
|
15
|
-
|
|
52
|
+
从用户或调用者视角写明:
|
|
16
53
|
|
|
17
|
-
|
|
54
|
+
- 当前问题与影响;
|
|
55
|
+
- 目标用户、调用者或运营角色;
|
|
56
|
+
- 主要场景和现有痛点;
|
|
57
|
+
- 成功状态与可观察结果;
|
|
58
|
+
- 明确非目标。
|
|
18
59
|
|
|
19
|
-
|
|
60
|
+
目标不能只写“新增模块”“修改接口”或“完成 Ticket”。
|
|
20
61
|
|
|
21
|
-
###
|
|
62
|
+
### 3. 定义外部行为与范围
|
|
22
63
|
|
|
23
|
-
|
|
64
|
+
写明:
|
|
24
65
|
|
|
25
|
-
|
|
66
|
+
- 解决方案摘要;
|
|
67
|
+
- 正常路径;
|
|
68
|
+
- 边界和失败路径;
|
|
69
|
+
- 稳定错误行为;
|
|
70
|
+
- 状态转换和不变量;
|
|
71
|
+
- IN、REUSE、OUT;
|
|
72
|
+
- 需要保持的既有行为;
|
|
73
|
+
- 公共接口、数据、安全、迁移和运维影响。
|
|
26
74
|
|
|
27
|
-
|
|
28
|
-
- 使用尽可能高层的接缝。UI 测试 > API 测试 > 单元测试,按此优先级选择。
|
|
29
|
-
- 如果需要新接缝,在尽可能高的层级提出。代码库中的接缝越少越好 —— 理想数量是 1 个。
|
|
30
|
-
- 每个接缝描述:接缝位置(什么模块/组件)、接缝类型(E2E、API、单元)、何时触发、如何验证。
|
|
75
|
+
局部文件组织、辅助函数和逐行实现不进入 Spec。
|
|
31
76
|
|
|
32
|
-
|
|
33
|
-
- 接缝层级是否合适?(太高可能遗漏细节,太低可能过于脆弱)
|
|
34
|
-
- 是否有遗漏的接缝?
|
|
35
|
-
- 现有接缝是否已足够,无需新增?
|
|
77
|
+
### 4. 设计验证接缝
|
|
36
78
|
|
|
37
|
-
|
|
79
|
+
优先复用现有稳定接缝。通常优先顺序是用户端到端行为、公共 API 或 CLI、事件或集成接缝、稳定单元接缝;实际层级由风险和项目先例决定,不机械追求最高层测试。
|
|
38
80
|
|
|
39
|
-
|
|
81
|
+
每个接缝写明:
|
|
40
82
|
|
|
41
|
-
|
|
83
|
+
- 入口位置和类型;
|
|
84
|
+
- 触发方式;
|
|
85
|
+
- 可观察结果;
|
|
86
|
+
- 覆盖哪些验收合同;
|
|
87
|
+
- 现有测试先例或命令。
|
|
42
88
|
|
|
43
|
-
|
|
89
|
+
若接缝选择会显著改变可测试性、事故半径或实现范围,向用户做一次聚焦确认;接缝可由代码和已有测试明确推导时,直接采用并记录依据,不为形式提问。
|
|
44
90
|
|
|
45
|
-
|
|
91
|
+
证据规则见 下方 `<evidence-and-verification>` 标签。
|
|
46
92
|
|
|
47
|
-
|
|
93
|
+
### 5. 编写 Spec
|
|
48
94
|
|
|
49
|
-
|
|
95
|
+
使用 下方 `<spec-template>` 标签 写入 `specdev/changes/{change}/spec.md`。
|
|
50
96
|
|
|
51
|
-
|
|
97
|
+
稳定编号:
|
|
52
98
|
|
|
53
|
-
|
|
99
|
+
- `US-###`:用户故事;
|
|
100
|
+
- `AC-###`:验收合同;
|
|
101
|
+
- `NFR-###`:非功能要求;
|
|
102
|
+
- `DEC-###`:已锁定实现约束;
|
|
103
|
+
- `OOS-###`:明确超出范围。
|
|
54
104
|
|
|
55
|
-
|
|
56
|
-
- 主要流程(happy path)—— 用户最常走的路径
|
|
57
|
-
- 边界情况 —— 空数据、极限值、并发操作
|
|
58
|
-
- 错误处理 —— 用户犯错时发生什么
|
|
59
|
-
- 权限与角色 —— 不同角色的不同体验
|
|
60
|
-
- 状态转换 —— 数据从创建到归档的每个状态变化
|
|
105
|
+
不得虚构错误码、性能阈值、schema、迁移政策、法规或合规要求。项目代码证据使用项目根相对路径。
|
|
61
106
|
|
|
62
|
-
|
|
107
|
+
### 6. Readiness Review
|
|
63
108
|
|
|
64
|
-
|
|
109
|
+
加载 下方 `<spec-readiness>` 标签 检查 `specdev/changes/{change}/spec.md`。
|
|
65
110
|
|
|
66
|
-
|
|
111
|
+
任何会改变以下内容的未决问题都会使 `ready_for_tickets: false`:
|
|
67
112
|
|
|
68
|
-
|
|
113
|
+
- 外部行为和范围;
|
|
114
|
+
- 公共接口或数据;
|
|
115
|
+
- 安全、隐私、资金或数据完整性;
|
|
116
|
+
- 兼容、迁移和发布约束;
|
|
117
|
+
- 验收合同或验证接缝。
|
|
69
118
|
|
|
70
|
-
|
|
119
|
+
低影响、可逆实现默认值可以作为显式假设,但必须有验证方式。
|
|
71
120
|
|
|
72
|
-
|
|
121
|
+
### 7. 发布与路由
|
|
122
|
+
|
|
123
|
+
1. 对照 下方 `<spec-schema>` 标签;
|
|
124
|
+
2. 运行:
|
|
125
|
+
|
|
126
|
+
> **结构校验:** 本地项目若已安装 Speculo,使用其 Node 校验器检查当前 change;
|
|
127
|
+
> 纯网页环境逐项核对本文内联的 schema、Ready 清单和完成标准,并记录自动校验未运行。
|
|
128
|
+
|
|
129
|
+
3. 更新 `specdev/status.json` 与 `specdev/changes/{change}/.status.json`;
|
|
130
|
+
4. 汇报主要用户故事、验收合同、范围、验证接缝、风险和 Ready 状态;
|
|
131
|
+
5. 返回 `specdev/changes/{change}/spec.md`、Ready 状态及下一 Work 的完整路径;
|
|
132
|
+
6. 只有用户请求或工作流显式串联时,进入 “拆分 Tickets 阶段”。
|
|
73
133
|
|
|
74
|
-
|
|
134
|
+
## 完成标准
|
|
75
135
|
|
|
76
|
-
|
|
136
|
+
- `specdev/changes/{change}/spec.md` 已按模板写入;
|
|
137
|
+
- 问题、目标用户、外部行为、范围和非目标明确;
|
|
138
|
+
- 用户故事覆盖主要、边界、错误、角色和状态场景;
|
|
139
|
+
- 每个验收合同可观察、可判定并绑定验证接缝;
|
|
140
|
+
- 公共接口、数据、兼容、安全和迁移已决定或明确不适用;
|
|
141
|
+
- 高影响未决问题与 `ready_for_tickets` 一致;
|
|
142
|
+
- 不包含逐文件施工计划;
|
|
143
|
+
- Spec、Ready 状态和下一 Work 路径已返回;
|
|
144
|
+
- 状态和用户摘要已更新。
|
|
77
145
|
|
|
78
146
|
## 子文件引用
|
|
79
147
|
|
|
80
|
-
|
|
148
|
+
- Spec 模板:下方 `<spec-template>` 标签
|
|
149
|
+
- Ready 检查:下方 `<spec-readiness>` 标签
|
|
150
|
+
|
|
151
|
+
---
|
|
152
|
+
|
|
153
|
+
## 参考内容
|
|
154
|
+
|
|
155
|
+
以下内容均已内联。主流程提到标签时,直接使用对应标签中的完整规则、模板或 schema。
|
|
156
|
+
|
|
157
|
+
<spec-readiness>
|
|
158
|
+
|
|
159
|
+
# Spec Readiness
|
|
160
|
+
|
|
161
|
+
本检查适用于 `specdev/changes/{change}/spec.md`。
|
|
162
|
+
|
|
163
|
+
- [ ] 问题、目标用户和成功标准从用户或调用者视角可理解。
|
|
164
|
+
- [ ] 主要、边界、错误、角色和状态场景足以生成垂直切片。
|
|
165
|
+
- [ ] 每个用户故事至少被一个验收合同覆盖。
|
|
166
|
+
- [ ] 每个验收合同可观察、可判定且有验证接缝。
|
|
167
|
+
- [ ] IN、REUSE、OUT 无冲突。
|
|
168
|
+
- [ ] 公共接口、数据、兼容、安全、迁移和发布影响已决定或明确不适用。
|
|
169
|
+
- [ ] 已锁定实现约束有来源,没有把偏好伪装成事实。
|
|
170
|
+
- [ ] 高影响未决问题为零。
|
|
171
|
+
- [ ] 低影响假设可逆且有验证方式。
|
|
172
|
+
- [ ] 项目路径引用使用项目根相对路径,内部工件使用本文约定的逻辑路径。
|
|
173
|
+
- [ ] Spec 不包含逐文件施工清单或容易过时的行号承诺。
|
|
174
|
+
- [ ] `ready_for_tickets: true` 与实际内容一致。
|
|
175
|
+
|
|
176
|
+
</spec-readiness>
|
|
177
|
+
|
|
178
|
+
<spec-template>
|
|
179
|
+
|
|
180
|
+
## 产物 YAML 头部
|
|
181
|
+
|
|
182
|
+
生成该工件时,将以下字段写在文档开头的 YAML frontmatter 中:
|
|
183
|
+
|
|
184
|
+
```yaml
|
|
185
|
+
schema_version: 3
|
|
186
|
+
artifact: spec
|
|
187
|
+
change: <YYYY-MM-DD-topic>
|
|
188
|
+
status: draft
|
|
189
|
+
ready_for_tickets: false
|
|
190
|
+
sources:
|
|
191
|
+
- USER-DECISION:<summary>
|
|
192
|
+
```
|
|
193
|
+
|
|
194
|
+
# Spec: <标题>
|
|
195
|
+
|
|
196
|
+
- **Spec:** `specdev/changes/{change}/spec.md`
|
|
197
|
+
- **当前 ADR:** `specdev/changes/{change}/ADR.md`
|
|
198
|
+
- **当前领域上下文:** `specdev/changes/{change}/CONTEXT.md`
|
|
199
|
+
|
|
200
|
+
## 1. 问题与目标
|
|
201
|
+
|
|
202
|
+
### 问题陈述
|
|
203
|
+
|
|
204
|
+
### 目标用户与场景
|
|
205
|
+
|
|
206
|
+
### 成功标准
|
|
207
|
+
|
|
208
|
+
### 非目标
|
|
209
|
+
|
|
210
|
+
## 2. 解决方案与外部行为
|
|
211
|
+
|
|
212
|
+
### 解决方案摘要
|
|
213
|
+
|
|
214
|
+
### 主要流程
|
|
215
|
+
|
|
216
|
+
### 边界、失败与稳定错误行为
|
|
217
|
+
|
|
218
|
+
### 状态转换与不变量
|
|
219
|
+
|
|
220
|
+
## 3. 用户故事
|
|
221
|
+
|
|
222
|
+
- **US-001**:作为 <角色>,我希望 <能力>,以便 <收益>。
|
|
223
|
+
|
|
224
|
+
## 4. 验收合同
|
|
225
|
+
|
|
226
|
+
| ID | 前置条件 | 动作或事件 | 可观察结果 | 验证接缝 |
|
|
227
|
+
|---|---|---|---|---|
|
|
228
|
+
| AC-001 | ... | ... | ... | ... |
|
|
229
|
+
|
|
230
|
+
## 5. 范围
|
|
231
|
+
|
|
232
|
+
### IN
|
|
233
|
+
|
|
234
|
+
### REUSE
|
|
235
|
+
|
|
236
|
+
### OUT
|
|
237
|
+
|
|
238
|
+
- **OOS-001**:<不做什么及原因>。
|
|
239
|
+
|
|
240
|
+
## 6. 已锁定实现约束
|
|
241
|
+
|
|
242
|
+
- **DEC-001**:<只写影响公共接口、数据、不变量、兼容、安全或验证的决策>。来源:`ADR-###`。
|
|
243
|
+
|
|
244
|
+
## 7. 数据、接口与兼容
|
|
245
|
+
|
|
246
|
+
- **公共接口变化:** 无 / ...
|
|
247
|
+
- **数据模型与持久化:** 无 / ...
|
|
248
|
+
- **兼容要求:** 无 / ...
|
|
249
|
+
- **迁移要求:** 无 / ...
|
|
250
|
+
- **发布或运维影响:** 无 / ...
|
|
251
|
+
|
|
252
|
+
## 8. 非功能要求
|
|
253
|
+
|
|
254
|
+
- **NFR-001 安全与隐私:**
|
|
255
|
+
- **NFR-002 性能与容量:**
|
|
256
|
+
- **NFR-003 可用性与可靠性:**
|
|
257
|
+
- **NFR-004 可观测性与运营:**
|
|
258
|
+
|
|
259
|
+
不适用的维度写“不适用:原因”。
|
|
260
|
+
|
|
261
|
+
## 9. 验证策略
|
|
262
|
+
|
|
263
|
+
| 接缝 | 层级 | 覆盖合同 | 现有先例或命令 | Evidence 类型 |
|
|
264
|
+
|---|---|---|---|---|
|
|
265
|
+
|
|
266
|
+
项目测试先例可引用项目相对路径,例如 `tests/example.test.ts`。
|
|
267
|
+
|
|
268
|
+
## 10. 风险、假设与未决问题
|
|
269
|
+
|
|
270
|
+
### 风险
|
|
271
|
+
|
|
272
|
+
### 已采用的低影响假设
|
|
273
|
+
|
|
274
|
+
### 未决问题
|
|
275
|
+
|
|
276
|
+
无。
|
|
277
|
+
|
|
278
|
+
存在高影响未决问题时,`ready_for_tickets` 必须为 `false`。
|
|
279
|
+
|
|
280
|
+
</spec-template>
|
|
281
|
+
|
|
282
|
+
<planning-principles>
|
|
283
|
+
|
|
284
|
+
# 规划原则
|
|
285
|
+
|
|
286
|
+
SpecDev 的规划目标是“决策完备、细节最小充分、能够验证”,不是把每个任务写成逐行施工脚本。
|
|
287
|
+
|
|
288
|
+
## 1. 先探索,后提问
|
|
289
|
+
|
|
290
|
+
先读取相关入口、配置、schema、类型、测试、相邻实现、当前工件和历史决策。未知项分为:
|
|
291
|
+
|
|
292
|
+
- **可发现事实**:通过只读探索解决,不询问用户;
|
|
293
|
+
- **高影响偏好或取舍**:无法从仓库推导,且会改变行为、架构、风险、范围、迁移或验收时才询问;
|
|
294
|
+
- **低影响实现细节**:由实现者遵循现有惯例决定。
|
|
295
|
+
|
|
296
|
+
外部事实研究使用 下方 `<research>` 标签。
|
|
297
|
+
|
|
298
|
+
## 2. 决策完备
|
|
299
|
+
|
|
300
|
+
一个 Plan 或 Ticket 达到以下状态才可执行:
|
|
301
|
+
|
|
302
|
+
- 目标和成功标准明确;
|
|
303
|
+
- IN、REUSE、OUT 与不变量明确;
|
|
304
|
+
- 公共接口、数据和兼容策略已锁定或明确不变化;
|
|
305
|
+
- 失败行为和关键边界有结论;
|
|
306
|
+
- 依赖、路径所有权和批准点明确;
|
|
307
|
+
- 验证方式和 Evidence 位置明确;
|
|
308
|
+
- 不存在会改变上述内容的高影响未决问题。
|
|
309
|
+
|
|
310
|
+
决策完备不要求逐文件穷举、逐函数步骤、逐行代码、重复代码库事实或虚构未来路径。
|
|
311
|
+
|
|
312
|
+
## 3. 最小充分细节
|
|
313
|
+
|
|
314
|
+
- 局部、低风险、沿用现有模式的切片使用 Lite。
|
|
315
|
+
- 多文件或跨层垂直切片使用 Standard。
|
|
316
|
+
- 公共契约、迁移、安全、不可逆操作、共享核心路径或复杂协作使用 Deep。
|
|
317
|
+
|
|
318
|
+
详细条件位于 下方 `<readiness-and-depth>` 标签。
|
|
319
|
+
|
|
320
|
+
## 4. 计划与执行分离
|
|
321
|
+
|
|
322
|
+
规划阶段可以读取、搜索、静态分析和执行只读或非修改性验证,不实现产品代码。执行阶段不重新决定已锁定的产品和架构事项。计划与代码事实冲突时,按 下方 `<deviation-control>` 标签 退回修订。
|
|
323
|
+
|
|
324
|
+
## 5. 以可验证目标委托
|
|
325
|
+
|
|
326
|
+
每个交付物至少有一种可重复证据:测试、类型检查、lint、构建、API 示例、截图对比、迁移 dry-run、查询结果或手动步骤。验证绑定外部行为或稳定接缝,不把私有实现细节当作唯一证据。
|
|
327
|
+
|
|
328
|
+
## 6. 委托而非微操
|
|
329
|
+
|
|
330
|
+
Ticket 告诉执行者:做什么、为什么、不能改变什么、按什么顺序形成安全落点、怎样证明。执行者决定:在现有代码惯例内怎样组织局部实现。只有高风险或非显然的接口、迁移和顺序需要写入执行路线。
|
|
331
|
+
|
|
332
|
+
## 7. 分层规划
|
|
333
|
+
|
|
334
|
+
- Spec 决定外部行为。
|
|
335
|
+
- Ticket 是决策完备的微型执行计划。
|
|
336
|
+
- Tickets Map 决定依赖和覆盖投影。
|
|
337
|
+
- Goal Plan 只在协调复杂度需要时决定跨 Ticket 编排。
|
|
338
|
+
- Implement 在既定契约内完成代码和 Evidence。
|
|
339
|
+
|
|
340
|
+
职责细节见 下方 `<artifact-contract>` 标签。
|
|
341
|
+
|
|
342
|
+
</planning-principles>
|
|
343
|
+
|
|
344
|
+
<artifact-contract>
|
|
345
|
+
|
|
346
|
+
# 工件职责与权威裁决
|
|
347
|
+
|
|
348
|
+
SpecDev 通过分层工件避免同一决策被多个模型反复重做。每个工件只承担自己的权威边界。
|
|
349
|
+
|
|
350
|
+
## 1. 工件职责
|
|
351
|
+
|
|
352
|
+
| 工件 | 具体位置 | 必须决定 | 不应决定 |
|
|
353
|
+
|---|---|---|---|
|
|
354
|
+
| 分诊 | `specdev/changes/{change}/triage.md` | 请求类别、影响、风险、缺失输入和下一 work | 详细实现方案 |
|
|
355
|
+
| 诊断 | `specdev/changes/{change}/diagnosis.md` | 复现、证据、根因、修复不变量和回归契约 | 未经验证的修复实现 |
|
|
356
|
+
| 设计日志 | `specdev/changes/{change}/LOG.md` | 讨论轨迹、确认、延后、替代与废弃结论 | 当前架构权威摘要 |
|
|
357
|
+
| 领域上下文 | `specdev/changes/{change}/CONTEXT.md` | 当前领域术语、语义和稳定不变量 | 临时会议记录 |
|
|
358
|
+
| 架构决策 | `specdev/changes/{change}/ADR.md` | 已接受架构决策、原因、后果和替代关系 | 尚未决定的方案集合 |
|
|
359
|
+
| Spec | `specdev/changes/{change}/spec.md` | 用户问题、外部行为、范围、验收合同、非功能要求和已锁定实现约束 | 文件级施工步骤 |
|
|
360
|
+
| Ticket | `specdev/changes/{change}/ticket/NN-<ticket-name>.md` | 单一垂直切片的行为、决策、范围、路径所有权、执行路线和验证证据 | 跨 Ticket 里程碑治理 |
|
|
361
|
+
| Tickets Map | `specdev/changes/{change}/tickets-map.md` | 依赖 DAG、合同覆盖、Ready 投影、并行候选和路径冲突 | 单 Ticket 的完整实现契约 |
|
|
362
|
+
| Goal Plan | `specdev/changes/{change}/goal-plan.md` | 跨 Ticket 调度、Gate、共享所有权、迁移顺序、集成和偏差治理 | 复制 Ticket 全文 |
|
|
363
|
+
| Evidence | `specdev/changes/{change}/evidence/T-NN.md` | 实际修改、命令、结果、验收映射、偏差、风险和提交引用 | 新的产品或架构决策 |
|
|
364
|
+
|
|
365
|
+
## 2. 权威顺序
|
|
366
|
+
|
|
367
|
+
同一事项冲突时按下列顺序裁决:
|
|
368
|
+
|
|
369
|
+
1. 用户最新明确决定;
|
|
370
|
+
2. 当前已接受架构决策:`specdev/changes/{change}/ADR.md`;
|
|
371
|
+
3. 当前外部行为权威:`specdev/changes/{change}/spec.md`;
|
|
372
|
+
4. 当前 Ticket 契约:`specdev/changes/{change}/ticket/NN-<ticket-name>.md`;
|
|
373
|
+
5. 当前跨 Ticket 编排:`specdev/changes/{change}/goal-plan.md`;
|
|
374
|
+
6. 当前代码与运行事实;
|
|
375
|
+
7. 旧计划、旧日志和未经确认的推断。
|
|
376
|
+
|
|
377
|
+
代码事实可以证明计划已过时,但不能静默改写用户目标或已接受契约。出现这种情况时,按 下方 `<deviation-control>` 标签 退回相应工件修订。
|
|
378
|
+
|
|
379
|
+
## 3. 来源追踪
|
|
380
|
+
|
|
381
|
+
高影响条目应带来源标识:
|
|
382
|
+
|
|
383
|
+
- `USER-DECISION:<date-or-summary>`;
|
|
384
|
+
- `ADR-###`;
|
|
385
|
+
- `US-###` 或 `AC-###`;
|
|
386
|
+
- `CODE:project/relative/path`;
|
|
387
|
+
- `RESEARCH:<Url>https://example.com/source</Url>`;
|
|
388
|
+
- `DIAG-###`。
|
|
389
|
+
|
|
390
|
+
来源追踪解释“为什么这样决定”,不要求为普通描述逐句加标签。
|
|
391
|
+
|
|
392
|
+
## 4. 冲突处理
|
|
393
|
+
|
|
394
|
+
1. 指明冲突事项和双方来源;
|
|
395
|
+
2. 判断冲突属于事实过时、产品取舍、架构取舍、Ticket 范围还是调度问题;
|
|
396
|
+
3. 按本规则的权威顺序提出裁决;
|
|
397
|
+
4. 若改变外部行为、公共契约、数据、安全、范围、迁移或验收,必须获得用户或指定批准人决定;
|
|
398
|
+
5. 更新真正拥有该决策的工件;
|
|
399
|
+
6. 在 `specdev/changes/{change}/LOG.md` 保留被替代结论和原因;
|
|
400
|
+
7. 重新执行结构校验;纯网页环境按本文的内联规则人工核对。
|
|
401
|
+
|
|
402
|
+
不得仅在下游工件中覆盖上游权威。
|
|
403
|
+
|
|
404
|
+
</artifact-contract>
|
|
405
|
+
|
|
406
|
+
<readiness-and-depth>
|
|
407
|
+
|
|
408
|
+
# 规划深度与执行就绪
|
|
409
|
+
|
|
410
|
+
## 1. Planning Depth
|
|
411
|
+
|
|
412
|
+
### Lite
|
|
413
|
+
|
|
414
|
+
适用条件通常全部满足:范围局部、行为明确、沿用既有模式、无公共接口或数据迁移、无安全或高事故半径影响、易回滚、无需并行协调。
|
|
415
|
+
|
|
416
|
+
最低内容:目标、范围、项目路径授权、1–3 条执行路线、验收标准和验证方法。
|
|
417
|
+
|
|
418
|
+
### Standard
|
|
419
|
+
|
|
420
|
+
适用于大多数跨多个文件或技术层的垂直切片。
|
|
421
|
+
|
|
422
|
+
额外要求:锁定决策与假设、接口接缝、输入输出、不变量、失败行为、有序执行路线、验证矩阵和路径所有权。
|
|
423
|
+
|
|
424
|
+
### Deep
|
|
425
|
+
|
|
426
|
+
任一条件触发:公共 API、schema、wire format、数据迁移、认证授权、隐私、资金、不可逆操作、expand-contract、共享核心路径、多 Agent 复杂协作、多个实质架构方案或高事故半径。
|
|
427
|
+
|
|
428
|
+
额外要求:数据流或状态转换、兼容窗口、迁移顺序、可观测性、回滚、风险缓解、收缩条件和人工批准点。
|
|
429
|
+
|
|
430
|
+
## 2. Ticket Definition of Ready
|
|
431
|
+
|
|
432
|
+
Ticket 只有同时满足以下适用条件才可设置 `ready: true`:
|
|
433
|
+
|
|
434
|
+
- 外部行为和可观察产出明确;
|
|
435
|
+
- IN、REUSE、OUT 无冲突;
|
|
436
|
+
- 高影响决策已锁定;
|
|
437
|
+
- 没有会改变行为、接口、数据、兼容、安全、范围或验收的未决问题;
|
|
438
|
+
- 依赖存在且无循环;
|
|
439
|
+
- `writable_paths`、`read_only_paths` 和 `shared_paths` 使用项目根相对路径;
|
|
440
|
+
- shared path 有唯一 owner;
|
|
441
|
+
- 验收标准可判定;
|
|
442
|
+
- 验证矩阵覆盖正常、失败和回归风险,或有可信的不适用理由;
|
|
443
|
+
- Standard 或 Deep Ticket 有有序执行路线;
|
|
444
|
+
- Deep Ticket 有迁移、兼容、监控、回滚和批准点,或逐项说明不适用;
|
|
445
|
+
- 单个全新上下文可以完成,否则必须拆分。
|
|
446
|
+
|
|
447
|
+
详细检查位于 “拆分 Tickets 阶段的 Ticket Ready 检查”。
|
|
448
|
+
|
|
449
|
+
## 3. Spec Readiness
|
|
450
|
+
|
|
451
|
+
`specdev/changes/{change}/spec.md` 只有在外部行为、范围、公共接口、数据、安全、兼容、迁移和验收合同不存在高影响未知项时,才可设置 `ready_for_tickets: true`。
|
|
452
|
+
|
|
453
|
+
## 4. 假设规则
|
|
454
|
+
|
|
455
|
+
- 低影响、可逆的默认值可以作为显式假设继续;
|
|
456
|
+
- 高影响假设不得用于强行通过 Ready;
|
|
457
|
+
- 实现者发现假设不成立时,按 下方 `<deviation-control>` 标签 处理;
|
|
458
|
+
- 假设必须有适用范围和验证方式。
|
|
459
|
+
|
|
460
|
+
</readiness-and-depth>
|
|
461
|
+
|
|
462
|
+
<evidence-and-verification>
|
|
463
|
+
|
|
464
|
+
# 证据与验证规范
|
|
465
|
+
|
|
466
|
+
验证回答“怎样证明行为已经正确发生”,Evidence 回答“实际运行了什么、结果是什么、仍有什么风险”。
|
|
467
|
+
|
|
468
|
+
## 1. 验证矩阵
|
|
469
|
+
|
|
470
|
+
每一行绑定一个行为、合同或风险:
|
|
471
|
+
|
|
472
|
+
| 行为或风险 | 验证接缝 | 方法或命令 | 预期结果 | Evidence |
|
|
473
|
+
|---|---|---|---|---|
|
|
474
|
+
| 正常路径 | 公共接口 | 项目定向测试 | 指定外部行为成立 | `specdev/changes/{change}/evidence/T-NN.md` |
|
|
475
|
+
| 无效输入 | schema 或公共接口 | 定向失败测试 | 稳定错误行为成立 | `specdev/changes/{change}/evidence/T-NN.md` |
|
|
476
|
+
| 回归 | 现有测试套件 | 项目回归命令 | 相关既有行为保持 | `specdev/changes/{change}/evidence/T-NN.md` |
|
|
477
|
+
|
|
478
|
+
命令引用项目脚本时,项目文件路径使用项目根相对路径,例如 `package.json` 或 `Makefile`。
|
|
479
|
+
|
|
480
|
+
## 2. 最小充分验证
|
|
481
|
+
|
|
482
|
+
选择最接近目标行为的稳定接缝:
|
|
483
|
+
|
|
484
|
+
1. 公共接口或契约集成测试;
|
|
485
|
+
2. 稳定接缝上的单元测试;
|
|
486
|
+
3. 类型检查、静态分析、lint 和构建;
|
|
487
|
+
4. 可重复手动步骤、截图或查询结果;
|
|
488
|
+
5. 代码阅读推断。
|
|
489
|
+
|
|
490
|
+
E2E 仅在变更影响用户界面交互时加入验证矩阵,并且只由 Lead 在集成阶段执行。Worker 只记录场景、预期结果和待执行状态。API、CLI、后端、库或数据变更默认使用其稳定接缝,不追加 E2E。
|
|
491
|
+
|
|
492
|
+
低层证据不能替代明确要求的用户行为证据。高风险迁移还需要 dry-run、调用点扫描、数据核对、监控信号或回滚演练。
|
|
493
|
+
|
|
494
|
+
## 3. 失败分类
|
|
495
|
+
|
|
496
|
+
每个失败必须分类为:
|
|
497
|
+
|
|
498
|
+
- 本 Ticket 引入的新失败;
|
|
499
|
+
- 基线已存在的失败;
|
|
500
|
+
- 环境、权限或基础设施失败;
|
|
501
|
+
- 验证本身无效或无法观察目标行为。
|
|
502
|
+
|
|
503
|
+
不得通过跳过测试、放宽断言、吞错、删除用例或把命令移出验证矩阵来制造绿色。
|
|
504
|
+
|
|
505
|
+
## 4. Evidence 最低内容
|
|
506
|
+
|
|
507
|
+
每个完成 Ticket 在 `specdev/changes/{change}/evidence/T-NN.md` 记录:
|
|
508
|
+
|
|
509
|
+
- 基线、分支或 worktree;
|
|
510
|
+
- 实际修改的项目路径;
|
|
511
|
+
- 每条命令、退出状态和结果摘要;
|
|
512
|
+
- 每条验收合同的证据映射;
|
|
513
|
+
- 未运行项与原因;
|
|
514
|
+
- 新失败、既有失败和环境失败;
|
|
515
|
+
- 偏差及批准;
|
|
516
|
+
- 残余风险;
|
|
517
|
+
- worktree、提交或 PR 引用;
|
|
518
|
+
- 最终结论。
|
|
519
|
+
|
|
520
|
+
无法运行关键验证、存在未批准偏差或 Evidence 不完整时,Ticket 不得标为 `done`。
|
|
521
|
+
|
|
522
|
+
</evidence-and-verification>
|
|
523
|
+
|
|
524
|
+
<deviation-control>
|
|
525
|
+
|
|
526
|
+
# 偏差控制
|
|
527
|
+
|
|
528
|
+
偏差是“当前事实或实现需要偏离已批准工件”的显式事件。偏差不是普通进度说明,也不能作为先改后补文档的许可证。
|
|
529
|
+
|
|
530
|
+
## 1. 偏差等级
|
|
531
|
+
|
|
532
|
+
- **local**:只改变局部实现,不改变 Ticket 的行为、范围、公共契约、路径所有权或验证;记录到 Evidence 后可继续。
|
|
533
|
+
- **ticket**:改变 Ticket 的执行路线、可写范围、局部契约或验收映射,但不改变 Spec;必须停止相关修改、更新 Ticket 并获得 owner 或 Lead 批准。
|
|
534
|
+
- **spec**:改变外部行为、范围、用户故事、验收合同或非功能要求;必须返回 “编写 Spec 阶段”。
|
|
535
|
+
- **architecture**:改变已接受架构决策或公共架构约束;必须返回 “设计访谈能力” 并更新 `specdev/changes/{change}/ADR.md`。
|
|
536
|
+
- **release**:改变迁移、兼容窗口、发布门禁、回滚或不可逆批准点;必须停止并获得明确人工批准。
|
|
537
|
+
|
|
538
|
+
## 2. 触发条件
|
|
539
|
+
|
|
540
|
+
以下任一情况必须建立偏差:
|
|
541
|
+
|
|
542
|
+
- 当前代码事实使批准路线不可行;
|
|
543
|
+
- 需要修改 Ticket 未授权的项目路径;
|
|
544
|
+
- 需要修改 shared path,但当前实现者不是 owner;
|
|
545
|
+
- 验证接缝无法证明验收合同;
|
|
546
|
+
- 发现新的安全、数据、兼容、性能或迁移风险;
|
|
547
|
+
- 依赖、合同或外部参考权威已变化;
|
|
548
|
+
- 实际行为将与 Spec 或 ADR 不一致。
|
|
549
|
+
|
|
550
|
+
## 3. 偏差记录
|
|
551
|
+
|
|
552
|
+
偏差记录写入对应 Evidence:`specdev/changes/{change}/evidence/T-NN.md`,并至少包含:
|
|
553
|
+
|
|
554
|
+
- 偏差 ID 与等级;
|
|
555
|
+
- 触发事实和证据;
|
|
556
|
+
- 受影响工件与路径;
|
|
557
|
+
- 继续、回退、修订或拆分的选项;
|
|
558
|
+
- 推荐方案和风险;
|
|
559
|
+
- 批准人、批准时间和批准范围;
|
|
560
|
+
- 最终处理结果。
|
|
561
|
+
|
|
562
|
+
需要改变上层工件时,Evidence 只记录事件;真正的权威变更必须写回对应 Spec、Ticket、ADR 或 Goal Plan。
|
|
563
|
+
|
|
564
|
+
## 4. 停止规则
|
|
565
|
+
|
|
566
|
+
- 未批准的 ticket、spec、architecture 或 release 偏差不得继续实现。
|
|
567
|
+
- 不得通过扩大 `writable_paths`、删除测试、降低断言或把风险改写成“已知限制”来绕过停止。
|
|
568
|
+
- 偏差影响并发 Agent 时,Lead 必须暂停受影响 Wave,重新计算路径所有权、依赖和 Gate。
|
|
569
|
+
|
|
570
|
+
</deviation-control>
|
|
571
|
+
|
|
572
|
+
<research>
|
|
573
|
+
|
|
574
|
+
# SpecDev Research
|
|
575
|
+
|
|
576
|
+
## 触发
|
|
577
|
+
|
|
578
|
+
当外部 API、库版本、协议、法规、产品能力或最佳实践会改变设计/实现决策,且当前材料不足时使用。
|
|
579
|
+
|
|
580
|
+
## 流程
|
|
581
|
+
|
|
582
|
+
1. 写清楚要支持的具体决策和停止条件。
|
|
583
|
+
2. 优先官方文档、规范、源代码、论文或维护者材料;技术问题优先一手来源。
|
|
584
|
+
3. 核对版本、发布日期、适用环境和已知限制。
|
|
585
|
+
4. 区分:来源明确事实、代码库事实、推断、建议。
|
|
586
|
+
5. 对关键结论至少交叉验证;来源冲突时并列呈现,不强行调和。
|
|
587
|
+
6. 记录摘要、证据、置信度、对 ADR/Spec/Ticket 的影响和仍未知项。
|
|
588
|
+
7. 长期有效且经实现验证后才可由 Archive 提升到永久 research。
|
|
589
|
+
|
|
590
|
+
## 输出模板
|
|
591
|
+
|
|
592
|
+
```markdown
|
|
593
|
+
# Research: <问题>
|
|
594
|
+
- 决策用途:
|
|
595
|
+
- 范围/版本:
|
|
596
|
+
- 停止条件:
|
|
597
|
+
|
|
598
|
+
## Findings
|
|
599
|
+
### R-001
|
|
600
|
+
- 结论:
|
|
601
|
+
- 类型:官方事实 / 代码事实 / 推断 / 建议
|
|
602
|
+
- 来源:
|
|
603
|
+
- 置信度:high / medium / low
|
|
604
|
+
- 适用限制:
|
|
605
|
+
- 对工件影响:
|
|
606
|
+
|
|
607
|
+
## Conflicts and Unknowns
|
|
608
|
+
## Recommendation
|
|
609
|
+
```
|
|
610
|
+
|
|
611
|
+
不得长篇复制受版权保护的来源;使用短引文和自己的准确摘要。
|
|
612
|
+
|
|
613
|
+
</research>
|
|
614
|
+
|
|
615
|
+
<config-template>
|
|
616
|
+
|
|
617
|
+
```json
|
|
618
|
+
{
|
|
619
|
+
"schema_version": 3,
|
|
620
|
+
"interaction_language": "zh-CN",
|
|
621
|
+
"artifact_language": "zh-CN",
|
|
622
|
+
"git": {
|
|
623
|
+
"auto_commit": false,
|
|
624
|
+
"default_branch": null,
|
|
625
|
+
"worktree_for_parallel": true
|
|
626
|
+
},
|
|
627
|
+
"execution": {
|
|
628
|
+
"max_parallel": 3,
|
|
629
|
+
"deep_ticket_human_approval": true,
|
|
630
|
+
"shared_path_owner": "lead"
|
|
631
|
+
},
|
|
632
|
+
"verification": {
|
|
633
|
+
"test": null,
|
|
634
|
+
"typecheck": null,
|
|
635
|
+
"lint": null,
|
|
636
|
+
"build": null
|
|
637
|
+
},
|
|
638
|
+
"planning": {
|
|
639
|
+
"default_depth": "standard",
|
|
640
|
+
"require_ready_gate": true,
|
|
641
|
+
"require_evidence": true
|
|
642
|
+
}
|
|
643
|
+
}
|
|
644
|
+
```
|
|
645
|
+
|
|
646
|
+
</config-template>
|
|
647
|
+
|
|
648
|
+
<config-schema>
|
|
649
|
+
|
|
650
|
+
```json
|
|
651
|
+
{
|
|
652
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
653
|
+
"$id": "urn:speculo:specdev:config:v3",
|
|
654
|
+
"title": "SpecDev Configuration",
|
|
655
|
+
"type": "object",
|
|
656
|
+
"required": ["schema_version", "interaction_language", "artifact_language", "git", "execution", "verification", "planning"],
|
|
657
|
+
"properties": {
|
|
658
|
+
"schema_version": {"const": 3},
|
|
659
|
+
"interaction_language": {"type": "string", "minLength": 1},
|
|
660
|
+
"artifact_language": {"type": "string", "minLength": 1},
|
|
661
|
+
"git": {
|
|
662
|
+
"type": "object",
|
|
663
|
+
"required": ["auto_commit", "default_branch", "worktree_for_parallel"],
|
|
664
|
+
"properties": {
|
|
665
|
+
"auto_commit": {"type": "boolean"},
|
|
666
|
+
"default_branch": {"type": ["string", "null"]},
|
|
667
|
+
"worktree_for_parallel": {"type": "boolean"}
|
|
668
|
+
},
|
|
669
|
+
"additionalProperties": true
|
|
670
|
+
},
|
|
671
|
+
"execution": {
|
|
672
|
+
"type": "object",
|
|
673
|
+
"required": ["max_parallel", "deep_ticket_human_approval", "shared_path_owner"],
|
|
674
|
+
"properties": {
|
|
675
|
+
"max_parallel": {"type": "integer", "minimum": 1},
|
|
676
|
+
"deep_ticket_human_approval": {"type": "boolean"},
|
|
677
|
+
"shared_path_owner": {"type": "string", "minLength": 1}
|
|
678
|
+
},
|
|
679
|
+
"additionalProperties": true
|
|
680
|
+
},
|
|
681
|
+
"verification": {
|
|
682
|
+
"type": "object",
|
|
683
|
+
"required": ["test", "typecheck", "lint", "build"],
|
|
684
|
+
"properties": {
|
|
685
|
+
"test": {"type": ["string", "null"]},
|
|
686
|
+
"typecheck": {"type": ["string", "null"]},
|
|
687
|
+
"lint": {"type": ["string", "null"]},
|
|
688
|
+
"build": {"type": ["string", "null"]}
|
|
689
|
+
},
|
|
690
|
+
"additionalProperties": true
|
|
691
|
+
},
|
|
692
|
+
"planning": {
|
|
693
|
+
"type": "object",
|
|
694
|
+
"required": ["default_depth", "require_ready_gate", "require_evidence"],
|
|
695
|
+
"properties": {
|
|
696
|
+
"default_depth": {"enum": ["lite", "standard", "deep"]},
|
|
697
|
+
"require_ready_gate": {"type": "boolean"},
|
|
698
|
+
"require_evidence": {"type": "boolean"}
|
|
699
|
+
},
|
|
700
|
+
"additionalProperties": true
|
|
701
|
+
}
|
|
702
|
+
},
|
|
703
|
+
"additionalProperties": true
|
|
704
|
+
}
|
|
705
|
+
```
|
|
706
|
+
|
|
707
|
+
</config-schema>
|
|
708
|
+
|
|
709
|
+
<status-template>
|
|
710
|
+
|
|
711
|
+
```json
|
|
712
|
+
{
|
|
713
|
+
"schema_version": 3,
|
|
714
|
+
"workflow": "specdev",
|
|
715
|
+
"active": [],
|
|
716
|
+
"work_history": [],
|
|
717
|
+
"completed": []
|
|
718
|
+
}
|
|
719
|
+
```
|
|
720
|
+
|
|
721
|
+
</status-template>
|
|
722
|
+
|
|
723
|
+
<status-schema>
|
|
724
|
+
|
|
725
|
+
```json
|
|
726
|
+
{
|
|
727
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
728
|
+
"$id": "urn:speculo:specdev:status:v3",
|
|
729
|
+
"title": "SpecDev Global Status",
|
|
730
|
+
"type": "object",
|
|
731
|
+
"required": [
|
|
732
|
+
"schema_version",
|
|
733
|
+
"workflow",
|
|
734
|
+
"active",
|
|
735
|
+
"work_history",
|
|
736
|
+
"completed"
|
|
737
|
+
],
|
|
738
|
+
"properties": {
|
|
739
|
+
"schema_version": {
|
|
740
|
+
"const": 3
|
|
741
|
+
},
|
|
742
|
+
"workflow": {
|
|
743
|
+
"const": "specdev"
|
|
744
|
+
},
|
|
745
|
+
"active": {
|
|
746
|
+
"type": "array",
|
|
747
|
+
"items": {
|
|
748
|
+
"type": "object",
|
|
749
|
+
"required": [
|
|
750
|
+
"change",
|
|
751
|
+
"current_work",
|
|
752
|
+
"works_run",
|
|
753
|
+
"result"
|
|
754
|
+
],
|
|
755
|
+
"properties": {
|
|
756
|
+
"change": {
|
|
757
|
+
"type": "string"
|
|
758
|
+
},
|
|
759
|
+
"current_work": {
|
|
760
|
+
"type": [
|
|
761
|
+
"string",
|
|
762
|
+
"null"
|
|
763
|
+
]
|
|
764
|
+
},
|
|
765
|
+
"works_run": {
|
|
766
|
+
"type": "array",
|
|
767
|
+
"items": {
|
|
768
|
+
"type": "string"
|
|
769
|
+
}
|
|
770
|
+
},
|
|
771
|
+
"result": {
|
|
772
|
+
"type": [
|
|
773
|
+
"string",
|
|
774
|
+
"null"
|
|
775
|
+
]
|
|
776
|
+
},
|
|
777
|
+
"claimed_investigations": {
|
|
778
|
+
"type": "array",
|
|
779
|
+
"items": {
|
|
780
|
+
"type": "object",
|
|
781
|
+
"required": [
|
|
782
|
+
"id",
|
|
783
|
+
"owner",
|
|
784
|
+
"claimed_at"
|
|
785
|
+
],
|
|
786
|
+
"properties": {
|
|
787
|
+
"id": {
|
|
788
|
+
"type": "string"
|
|
789
|
+
},
|
|
790
|
+
"owner": {
|
|
791
|
+
"type": "string"
|
|
792
|
+
},
|
|
793
|
+
"session": {
|
|
794
|
+
"type": [
|
|
795
|
+
"string",
|
|
796
|
+
"null"
|
|
797
|
+
]
|
|
798
|
+
},
|
|
799
|
+
"claimed_at": {
|
|
800
|
+
"type": "string"
|
|
801
|
+
}
|
|
802
|
+
},
|
|
803
|
+
"additionalProperties": true
|
|
804
|
+
}
|
|
805
|
+
}
|
|
806
|
+
},
|
|
807
|
+
"additionalProperties": true
|
|
808
|
+
}
|
|
809
|
+
},
|
|
810
|
+
"work_history": {
|
|
811
|
+
"type": "array",
|
|
812
|
+
"items": {
|
|
813
|
+
"type": "object",
|
|
814
|
+
"required": [
|
|
815
|
+
"change",
|
|
816
|
+
"work_id",
|
|
817
|
+
"started_at",
|
|
818
|
+
"completed_at",
|
|
819
|
+
"result"
|
|
820
|
+
],
|
|
821
|
+
"properties": {
|
|
822
|
+
"change": {
|
|
823
|
+
"type": "string"
|
|
824
|
+
},
|
|
825
|
+
"work_id": {
|
|
826
|
+
"type": "string",
|
|
827
|
+
"pattern": "^specdev/"
|
|
828
|
+
},
|
|
829
|
+
"started_at": {
|
|
830
|
+
"type": "string"
|
|
831
|
+
},
|
|
832
|
+
"completed_at": {
|
|
833
|
+
"type": [
|
|
834
|
+
"string",
|
|
835
|
+
"null"
|
|
836
|
+
]
|
|
837
|
+
},
|
|
838
|
+
"result": {
|
|
839
|
+
"type": [
|
|
840
|
+
"string",
|
|
841
|
+
"null"
|
|
842
|
+
]
|
|
843
|
+
}
|
|
844
|
+
},
|
|
845
|
+
"additionalProperties": true
|
|
846
|
+
}
|
|
847
|
+
},
|
|
848
|
+
"completed": {
|
|
849
|
+
"type": "array",
|
|
850
|
+
"items": {
|
|
851
|
+
"type": "object",
|
|
852
|
+
"required": [
|
|
853
|
+
"change",
|
|
854
|
+
"archived_at",
|
|
855
|
+
"archive_path"
|
|
856
|
+
],
|
|
857
|
+
"properties": {
|
|
858
|
+
"change": {
|
|
859
|
+
"type": "string"
|
|
860
|
+
},
|
|
861
|
+
"archived_at": {
|
|
862
|
+
"type": "string"
|
|
863
|
+
},
|
|
864
|
+
"archive_path": {
|
|
865
|
+
"type": "string",
|
|
866
|
+
"pattern": "^specdev/archive/[0-9]{4}-[0-9]{2}/.+/$"
|
|
867
|
+
}
|
|
868
|
+
},
|
|
869
|
+
"additionalProperties": true
|
|
870
|
+
}
|
|
871
|
+
}
|
|
872
|
+
},
|
|
873
|
+
"additionalProperties": true
|
|
874
|
+
}
|
|
875
|
+
```
|
|
876
|
+
|
|
877
|
+
</status-schema>
|
|
878
|
+
|
|
879
|
+
<change-status-template>
|
|
880
|
+
|
|
881
|
+
```json
|
|
882
|
+
{
|
|
883
|
+
"schema_version": 3,
|
|
884
|
+
"artifact": "change-status",
|
|
885
|
+
"change": "<YYYY-MM-DD-topic>",
|
|
886
|
+
"change_status": "active",
|
|
887
|
+
"current_work": null,
|
|
888
|
+
"created_at": "<ISO-8601>",
|
|
889
|
+
"updated_at": "<ISO-8601>",
|
|
890
|
+
"completed_at": null,
|
|
891
|
+
"archived": false,
|
|
892
|
+
"archive_path": null,
|
|
893
|
+
"blockers": [],
|
|
894
|
+
"deviations": [],
|
|
895
|
+
"worktrees": []
|
|
896
|
+
}
|
|
897
|
+
```
|
|
898
|
+
|
|
899
|
+
</change-status-template>
|
|
900
|
+
|
|
901
|
+
<change-status-schema>
|
|
902
|
+
|
|
903
|
+
```json
|
|
904
|
+
{
|
|
905
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
906
|
+
"$id": "urn:speculo:specdev:change-status:v3",
|
|
907
|
+
"title": "SpecDev Change Status",
|
|
908
|
+
"type": "object",
|
|
909
|
+
"required": [
|
|
910
|
+
"schema_version",
|
|
911
|
+
"artifact",
|
|
912
|
+
"change",
|
|
913
|
+
"change_status",
|
|
914
|
+
"current_work",
|
|
915
|
+
"created_at",
|
|
916
|
+
"updated_at",
|
|
917
|
+
"completed_at",
|
|
918
|
+
"archived",
|
|
919
|
+
"archive_path",
|
|
920
|
+
"blockers",
|
|
921
|
+
"deviations"
|
|
922
|
+
],
|
|
923
|
+
"properties": {
|
|
924
|
+
"schema_version": {
|
|
925
|
+
"const": 3
|
|
926
|
+
},
|
|
927
|
+
"artifact": {
|
|
928
|
+
"const": "change-status"
|
|
929
|
+
},
|
|
930
|
+
"change": {
|
|
931
|
+
"type": "string",
|
|
932
|
+
"pattern": "^[0-9]{4}-[0-9]{2}-[0-9]{2}-[a-z0-9]+(?:-[a-z0-9]+)*$"
|
|
933
|
+
},
|
|
934
|
+
"change_status": {
|
|
935
|
+
"enum": [
|
|
936
|
+
"active",
|
|
937
|
+
"blocked",
|
|
938
|
+
"completed",
|
|
939
|
+
"archived"
|
|
940
|
+
]
|
|
941
|
+
},
|
|
942
|
+
"current_work": {
|
|
943
|
+
"type": [
|
|
944
|
+
"string",
|
|
945
|
+
"null"
|
|
946
|
+
]
|
|
947
|
+
},
|
|
948
|
+
"created_at": {
|
|
949
|
+
"type": "string",
|
|
950
|
+
"minLength": 1
|
|
951
|
+
},
|
|
952
|
+
"updated_at": {
|
|
953
|
+
"type": "string",
|
|
954
|
+
"minLength": 1
|
|
955
|
+
},
|
|
956
|
+
"completed_at": {
|
|
957
|
+
"type": [
|
|
958
|
+
"string",
|
|
959
|
+
"null"
|
|
960
|
+
]
|
|
961
|
+
},
|
|
962
|
+
"archived": {
|
|
963
|
+
"type": "boolean"
|
|
964
|
+
},
|
|
965
|
+
"archive_path": {
|
|
966
|
+
"anyOf": [
|
|
967
|
+
{
|
|
968
|
+
"type": "null"
|
|
969
|
+
},
|
|
970
|
+
{
|
|
971
|
+
"type": "string",
|
|
972
|
+
"pattern": "^specdev/archive/[0-9]{4}-[0-9]{2}/.+/$"
|
|
973
|
+
}
|
|
974
|
+
]
|
|
975
|
+
},
|
|
976
|
+
"blockers": {
|
|
977
|
+
"type": "array",
|
|
978
|
+
"items": {
|
|
979
|
+
"type": "string"
|
|
980
|
+
}
|
|
981
|
+
},
|
|
982
|
+
"deviations": {
|
|
983
|
+
"type": "array",
|
|
984
|
+
"items": {
|
|
985
|
+
"type": "string"
|
|
986
|
+
}
|
|
987
|
+
},
|
|
988
|
+
"worktrees": {
|
|
989
|
+
"type": "array",
|
|
990
|
+
"items": {
|
|
991
|
+
"type": "object",
|
|
992
|
+
"required": [
|
|
993
|
+
"ticket_id",
|
|
994
|
+
"owner",
|
|
995
|
+
"provider",
|
|
996
|
+
"base_sha",
|
|
997
|
+
"branch",
|
|
998
|
+
"workspace_ref",
|
|
999
|
+
"status",
|
|
1000
|
+
"updated_at"
|
|
1001
|
+
],
|
|
1002
|
+
"properties": {
|
|
1003
|
+
"ticket_id": {
|
|
1004
|
+
"type": "string",
|
|
1005
|
+
"pattern": "^T-[0-9]{2,}$"
|
|
1006
|
+
},
|
|
1007
|
+
"owner": {
|
|
1008
|
+
"type": "string",
|
|
1009
|
+
"minLength": 1
|
|
1010
|
+
},
|
|
1011
|
+
"provider": {
|
|
1012
|
+
"enum": [
|
|
1013
|
+
"native",
|
|
1014
|
+
"git",
|
|
1015
|
+
"external"
|
|
1016
|
+
]
|
|
1017
|
+
},
|
|
1018
|
+
"base_sha": {
|
|
1019
|
+
"type": "string",
|
|
1020
|
+
"minLength": 1
|
|
1021
|
+
},
|
|
1022
|
+
"branch": {
|
|
1023
|
+
"type": "string",
|
|
1024
|
+
"minLength": 1
|
|
1025
|
+
},
|
|
1026
|
+
"workspace_ref": {
|
|
1027
|
+
"type": "string",
|
|
1028
|
+
"minLength": 1,
|
|
1029
|
+
"pattern": "^(?!/)(?![A-Za-z]:[\\\\/]).+"
|
|
1030
|
+
},
|
|
1031
|
+
"status": {
|
|
1032
|
+
"enum": [
|
|
1033
|
+
"planned",
|
|
1034
|
+
"active",
|
|
1035
|
+
"review",
|
|
1036
|
+
"integrated",
|
|
1037
|
+
"removed",
|
|
1038
|
+
"blocked"
|
|
1039
|
+
]
|
|
1040
|
+
},
|
|
1041
|
+
"updated_at": {
|
|
1042
|
+
"type": "string",
|
|
1043
|
+
"minLength": 1
|
|
1044
|
+
}
|
|
1045
|
+
},
|
|
1046
|
+
"additionalProperties": true
|
|
1047
|
+
}
|
|
1048
|
+
}
|
|
1049
|
+
},
|
|
1050
|
+
"allOf": [
|
|
1051
|
+
{
|
|
1052
|
+
"if": {
|
|
1053
|
+
"properties": {
|
|
1054
|
+
"change_status": {
|
|
1055
|
+
"const": "archived"
|
|
1056
|
+
}
|
|
1057
|
+
}
|
|
1058
|
+
},
|
|
1059
|
+
"then": {
|
|
1060
|
+
"properties": {
|
|
1061
|
+
"archived": {
|
|
1062
|
+
"const": true
|
|
1063
|
+
},
|
|
1064
|
+
"archive_path": {
|
|
1065
|
+
"type": "string",
|
|
1066
|
+
"pattern": "^specdev/archive/[0-9]{4}-[0-9]{2}/.+/$"
|
|
1067
|
+
}
|
|
1068
|
+
}
|
|
1069
|
+
}
|
|
1070
|
+
}
|
|
1071
|
+
],
|
|
1072
|
+
"additionalProperties": true
|
|
1073
|
+
}
|
|
1074
|
+
```
|
|
1075
|
+
|
|
1076
|
+
</change-status-schema>
|
|
1077
|
+
|
|
1078
|
+
<spec-schema>
|
|
1079
|
+
|
|
1080
|
+
```json
|
|
1081
|
+
{
|
|
1082
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
1083
|
+
"$id": "urn:speculo:specdev:spec:v3",
|
|
1084
|
+
"title": "SpecDev Spec Frontmatter",
|
|
1085
|
+
"type": "object",
|
|
1086
|
+
"required": ["schema_version", "artifact", "change", "status", "ready_for_tickets", "sources"],
|
|
1087
|
+
"properties": {
|
|
1088
|
+
"schema_version": {"const": 3},
|
|
1089
|
+
"artifact": {"const": "spec"},
|
|
1090
|
+
"change": {"type": "string", "pattern": "^[0-9]{4}-[0-9]{2}-[0-9]{2}-[a-z0-9]+(?:-[a-z0-9]+)*$"},
|
|
1091
|
+
"status": {"enum": ["draft", "ready", "superseded"]},
|
|
1092
|
+
"ready_for_tickets": {"type": "boolean"},
|
|
1093
|
+
"sources": {"type": "array", "items": {"type": "string", "minLength": 1}, "minItems": 1, "uniqueItems": true}
|
|
1094
|
+
},
|
|
1095
|
+
"additionalProperties": true
|
|
1096
|
+
}
|
|
1097
|
+
```
|
|
81
1098
|
|
|
82
|
-
-
|
|
83
|
-
- 变更目录下的 CONTEXT.md —— 领域词汇表(阅读用)
|
|
84
|
-
- 变更目录下的 ADR.md —— 架构决策记录(阅读用)
|
|
1099
|
+
</spec-schema>
|