dev-playbooks-cn 4.0.4 → 4.0.5
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/docs/SSOT/344/270/216Spec/350/276/271/347/225/214/350/257/264/346/230/216.md +115 -0
- package/package.json +1 -1
- package/skills/devbooks-brownfield-bootstrap/SKILL.md +57 -14
- package/skills/devbooks-delivery-workflow/scripts/ssot-scaffold.sh +15 -14
- package/skills/devbooks-ssot-maintainer/SKILL.md +35 -11
- package/templates/.devbooks/config.yaml +1 -0
- package/templates/CLAUDE.md +6 -0
- package/templates/dev-playbooks/ssot/SSOT.md +70 -0
- package/templates/dev-playbooks/ssot/requirements.index.yaml +22 -0
- package/templates/dev-playbooks/requirements/requirements.index.yaml +0 -9
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
# SSOT 与 Spec 边界说明
|
|
2
|
+
|
|
3
|
+
本文档明确 DevBooks 中 SSOT(Single Source of Truth)和 Spec(Specification)的职责边界。
|
|
4
|
+
|
|
5
|
+
## 核心区别
|
|
6
|
+
|
|
7
|
+
| 维度 | SSOT | Spec |
|
|
8
|
+
|------|------|------|
|
|
9
|
+
| **抽象层次** | 需求层(What) | 设计层(How) |
|
|
10
|
+
| **粒度** | 项目级 | 模块级 |
|
|
11
|
+
| **内容** | 系统必须做什么 | 模块如何工作 |
|
|
12
|
+
| **来源** | 业务/产品/合规/架构约束 | 技术设计决策 |
|
|
13
|
+
| **变更频率** | 低(里程碑级) | 中(功能级) |
|
|
14
|
+
|
|
15
|
+
## 内容示例
|
|
16
|
+
|
|
17
|
+
### SSOT 示例
|
|
18
|
+
|
|
19
|
+
```markdown
|
|
20
|
+
# R-001: API 错误格式标准化
|
|
21
|
+
- severity: must
|
|
22
|
+
- 所有对外 API 必须返回标准错误格式
|
|
23
|
+
- 错误响应必须包含 code、message、details 字段
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
### Spec 示例
|
|
27
|
+
|
|
28
|
+
```markdown
|
|
29
|
+
# ErrorResponse Spec
|
|
30
|
+
|
|
31
|
+
## Schema
|
|
32
|
+
| 字段 | 类型 | 必填 | 说明 |
|
|
33
|
+
|------|------|------|------|
|
|
34
|
+
| code | string | Y | 错误码,格式 `E-{MODULE}-{NUMBER}` |
|
|
35
|
+
| message | string | Y | 人类可读错误信息 |
|
|
36
|
+
| details | object | N | 附加上下文 |
|
|
37
|
+
|
|
38
|
+
## 行为
|
|
39
|
+
- 4xx 错误:code 以 `E-CLIENT-` 开头
|
|
40
|
+
- 5xx 错误:code 以 `E-SERVER-` 开头
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
## 目录结构
|
|
44
|
+
|
|
45
|
+
```
|
|
46
|
+
dev-playbooks/
|
|
47
|
+
├── ssot/ # 【需求层】项目级真理源
|
|
48
|
+
│ ├── SSOT.md # 人类可读的需求/约束文档
|
|
49
|
+
│ ├── requirements.index.yaml # 机读索引(稳定 ID → 锚点)
|
|
50
|
+
│ └── requirements.ledger.yaml # 派生进度(可丢弃可重建)
|
|
51
|
+
│
|
|
52
|
+
├── specs/ # 【设计层】模块级行为规格
|
|
53
|
+
│ ├── _meta/ # 元数据(画像/术语表)
|
|
54
|
+
│ ├── architecture/ # 架构约束
|
|
55
|
+
│ └── <capability>/spec.md # 模块规格
|
|
56
|
+
│
|
|
57
|
+
└── changes/ # 变更历史
|
|
58
|
+
└── <change-id>/
|
|
59
|
+
├── proposal.md # upstream_claims 引用 SSOT
|
|
60
|
+
└── specs/ # spec delta(归档后合并到 specs/)
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
## 追溯链条
|
|
64
|
+
|
|
65
|
+
```
|
|
66
|
+
SSOT.md (R-001: API 错误格式标准化)
|
|
67
|
+
↓ 索引
|
|
68
|
+
requirements.index.yaml (R-001 → anchor → statement)
|
|
69
|
+
↓ 引用
|
|
70
|
+
changes/<id>/proposal.md (upstream_claims: [R-001])
|
|
71
|
+
↓ 设计
|
|
72
|
+
changes/<id>/specs/error-handling/spec.md (ErrorResponse 设计)
|
|
73
|
+
↓ 归档
|
|
74
|
+
specs/error-handling/spec.md (真理)
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
## Skill 职责划分
|
|
78
|
+
|
|
79
|
+
### SSOT 相关
|
|
80
|
+
|
|
81
|
+
| Skill | 职责 | 触发时机 |
|
|
82
|
+
|-------|------|----------|
|
|
83
|
+
| `brownfield-bootstrap` | **创建** SSOT 骨架 | 存量项目初始化 |
|
|
84
|
+
| `ssot-maintainer` | **维护** SSOT(增删改) | SSOT 内容变更 |
|
|
85
|
+
|
|
86
|
+
### Spec 相关
|
|
87
|
+
|
|
88
|
+
| Skill | 职责 | 触发时机 |
|
|
89
|
+
|-------|------|----------|
|
|
90
|
+
| `brownfield-bootstrap` | **创建** 基线 Spec | 存量项目初始化 |
|
|
91
|
+
| `spec-contract` | **定义** 模块行为规格 | 变更包设计阶段 |
|
|
92
|
+
| `design-doc` | **设计** 架构与约束 | 变更包设计阶段 |
|
|
93
|
+
|
|
94
|
+
## 常见问题
|
|
95
|
+
|
|
96
|
+
### Q: 什么时候写 SSOT,什么时候写 Spec?
|
|
97
|
+
|
|
98
|
+
- **写 SSOT**:当你在定义"系统必须满足的约束"时
|
|
99
|
+
- 例:合规要求、SLA 承诺、API 兼容性保证
|
|
100
|
+
- **写 Spec**:当你在设计"具体模块如何实现"时
|
|
101
|
+
- 例:接口签名、数据模型、状态机
|
|
102
|
+
|
|
103
|
+
### Q: SSOT 和 Spec 可以只保留一个吗?
|
|
104
|
+
|
|
105
|
+
不能。它们是不同抽象层次:
|
|
106
|
+
- SSOT 是"输入"(需求来源)
|
|
107
|
+
- Spec 是"输出"(设计决策)
|
|
108
|
+
|
|
109
|
+
一个需求(SSOT)可能影响多个模块的 Spec。
|
|
110
|
+
|
|
111
|
+
### Q: 变更包的 upstream_claims 引用什么?
|
|
112
|
+
|
|
113
|
+
引用 SSOT 中的需求 ID(如 `R-001`),不引用 Spec。
|
|
114
|
+
|
|
115
|
+
Spec 是变更包的"产出",不是"输入"。
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: devbooks-brownfield-bootstrap
|
|
3
|
-
description: devbooks-brownfield-bootstrap
|
|
3
|
+
description: devbooks-brownfield-bootstrap:存量项目初始化:在当前真理目录为空时生成项目画像、术语表、SSOT、基线规格与最小验证锚点,避免"边补 specs 边改行为"。用户说"存量初始化/基线 specs/项目画像/建立 glossary/初始化 SSOT/把老项目接入上下文协议"等时使用。
|
|
4
4
|
recommended_experts: ["System Architect", "Technical Writer"]
|
|
5
5
|
allowed-tools:
|
|
6
6
|
- Glob
|
|
@@ -27,6 +27,29 @@ allowed-tools:
|
|
|
27
27
|
### 扩展层(可选)
|
|
28
28
|
适用:需要与外部系统或可选工具协同时补充。
|
|
29
29
|
|
|
30
|
+
## 与 ssot-maintainer 的职责边界
|
|
31
|
+
|
|
32
|
+
| Skill | 职责 | 类比 |
|
|
33
|
+
|-------|------|------|
|
|
34
|
+
| **brownfield-bootstrap** | **创建** SSOT/Spec 骨架(从无到有) | `git init` |
|
|
35
|
+
| **ssot-maintainer** | **维护** SSOT(增删改已有条目) | `git commit` |
|
|
36
|
+
|
|
37
|
+
**关键区分**:
|
|
38
|
+
- 本 Skill 负责**初始化**:当 `ssot/` 目录不存在或为空时,生成骨架
|
|
39
|
+
- `ssot-maintainer` 负责**维护**:当 SSOT 已存在后,处理 delta、同步索引、刷新 ledger
|
|
40
|
+
- 初始化完成后,后续 SSOT 变更应使用 `ssot-maintainer`
|
|
41
|
+
|
|
42
|
+
## SSOT 与 Spec 的区别
|
|
43
|
+
|
|
44
|
+
| 维度 | SSOT | Spec |
|
|
45
|
+
|------|------|------|
|
|
46
|
+
| **抽象层次** | 需求层(What) | 设计层(How) |
|
|
47
|
+
| **粒度** | 项目级 | 模块级 |
|
|
48
|
+
| **位置** | `<devbooks-root>/ssot/` | `<truth-root>/` |
|
|
49
|
+
| **内容** | 系统必须做什么 | 模块如何工作 |
|
|
50
|
+
|
|
51
|
+
详见 `docs/SSOT与Spec边界说明.md`
|
|
52
|
+
|
|
30
53
|
## 推荐 MCP 能力类型
|
|
31
54
|
- 代码检索(code-search)
|
|
32
55
|
- 引用追踪(reference-tracking)
|
|
@@ -34,8 +57,8 @@ allowed-tools:
|
|
|
34
57
|
|
|
35
58
|
## 前置:配置发现(协议无关)
|
|
36
59
|
|
|
37
|
-
- `<truth-root
|
|
38
|
-
- `<change-root
|
|
60
|
+
- `<truth-root>`:当前真理目录根(通常是 `dev-playbooks/specs/`)
|
|
61
|
+
- `<change-root>`:变更包目录根(通常是 `dev-playbooks/changes/`)
|
|
39
62
|
- `<devbooks-root>`:DevBooks 管理目录(通常是 `dev-playbooks/`)
|
|
40
63
|
|
|
41
64
|
执行前**必须**按以下顺序查找配置(找到后停止):
|
|
@@ -55,7 +78,7 @@ allowed-tools:
|
|
|
55
78
|
|
|
56
79
|
存量项目初始化包含以下职责:
|
|
57
80
|
|
|
58
|
-
### 1.
|
|
81
|
+
### 1. 基础配置文件初始化
|
|
59
82
|
|
|
60
83
|
在 `<devbooks-root>/`(通常是 `dev-playbooks/`)下检查并创建:
|
|
61
84
|
|
|
@@ -84,19 +107,39 @@ allowed-tools:
|
|
|
84
107
|
| 文档维护元数据 | `_meta/docs-maintenance.md` | 文档风格与维护配置 |
|
|
85
108
|
| 领域概念 | `_meta/key-concepts.md` | 基于代码语义的概念提取(可选) |
|
|
86
109
|
|
|
87
|
-
###
|
|
110
|
+
### 3. 项目级 SSOT 初始化(核心职责)
|
|
111
|
+
|
|
112
|
+
在 `<devbooks-root>/ssot/` 下生成 SSOT 骨架:
|
|
113
|
+
|
|
114
|
+
| 产物 | 路径 | 说明 |
|
|
115
|
+
|------|------|------|
|
|
116
|
+
| SSOT 文档 | `ssot/SSOT.md` | 人类可读的需求/约束文档 |
|
|
117
|
+
| 需求索引 | `ssot/requirements.index.yaml` | 机读索引(稳定 ID → 锚点 → statement) |
|
|
118
|
+
|
|
119
|
+
**生成策略:骨架优先 + 渐进补全**
|
|
120
|
+
|
|
121
|
+
1. **核心契约提取**(AI 主导)
|
|
122
|
+
- 扫描 API 定义(OpenAPI/GraphQL/RPC)
|
|
123
|
+
- 扫描数据模型(Schema/Entity)
|
|
124
|
+
- 扫描配置约束(env vars/feature flags)
|
|
125
|
+
- 扫描关键业务规则(从代码注释/测试用例推断)
|
|
88
126
|
|
|
89
|
-
|
|
127
|
+
2. **置信度标记**
|
|
128
|
+
- 每条 requirement 标记 `confidence: low|medium|high`
|
|
129
|
+
- AI 生成默认为 `medium`
|
|
130
|
+
- 人类确认后升级为 `high`
|
|
90
131
|
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
| Requirements Ledger(派生缓存) | `ssot/requirements.ledger.yaml` | 进度视图,可丢弃可重建;由脚本从归档变更包派生 |
|
|
132
|
+
3. **最小可行 SSOT**
|
|
133
|
+
- 初始目标:5-15 条核心需求
|
|
134
|
+
- 不追求完整,追求可寻址
|
|
135
|
+
- 后续通过 `ssot-maintainer` 渐进补全
|
|
96
136
|
|
|
97
|
-
|
|
137
|
+
**上游 SSOT 处理**:
|
|
138
|
+
- 若项目已存在上游 SSOT(例如独立 `SSOT docs/`)
|
|
139
|
+
- 本 Skill 不复制原文,而是在 `ssot/SSOT.md` 中写入指针/链接
|
|
140
|
+
- 并以 `requirements.index.yaml` 建立稳定 ID 与锚点索引
|
|
98
141
|
|
|
99
|
-
###
|
|
142
|
+
### 4. 架构分析产物
|
|
100
143
|
|
|
101
144
|
在 `<truth-root>/architecture/` 下生成:
|
|
102
145
|
|
|
@@ -109,7 +152,7 @@ allowed-tools:
|
|
|
109
152
|
|
|
110
153
|
> **设计决策**:C4 架构地图现在由 brownfield-bootstrap 在初始化时生成,后续架构变更通过 design.md 的 Architecture Impact 章节记录,由 archiver 在归档时合并。
|
|
111
154
|
|
|
112
|
-
###
|
|
155
|
+
### 5. 基线变更包(可选)
|
|
113
156
|
|
|
114
157
|
在 `<change-root>/<baseline-id>/` 下生成:
|
|
115
158
|
|
|
@@ -5,16 +5,16 @@ usage() {
|
|
|
5
5
|
cat <<'EOF' >&2
|
|
6
6
|
usage: ssot-scaffold.sh [options]
|
|
7
7
|
|
|
8
|
-
Scaffold a minimal Project SSOT pack under
|
|
8
|
+
Scaffold a minimal Project SSOT pack under devbooks_root when upstream SSOT is absent.
|
|
9
9
|
|
|
10
10
|
Creates (default):
|
|
11
|
-
<
|
|
12
|
-
<
|
|
11
|
+
<devbooks-root>/ssot/SSOT.md
|
|
12
|
+
<devbooks-root>/ssot/requirements.index.yaml
|
|
13
13
|
|
|
14
14
|
Options:
|
|
15
15
|
--project-root <dir> Project root directory (default: pwd)
|
|
16
|
-
--
|
|
17
|
-
--ssot-dir <dir> SSOT dir under
|
|
16
|
+
--devbooks-root <dir> DevBooks root directory (default: dev-playbooks)
|
|
17
|
+
--ssot-dir <dir> SSOT dir under devbooks_root (default: ssot)
|
|
18
18
|
--set-id <id> requirements.index set_id (default: derived from project dir)
|
|
19
19
|
--source-ref <ref> requirements.index source_ref (default: truth://<ssot-dir>/SSOT.md)
|
|
20
20
|
--force Overwrite existing files
|
|
@@ -24,6 +24,7 @@ Notes:
|
|
|
24
24
|
- This script is intentionally deterministic and does not "discover" external SSOT.
|
|
25
25
|
Use it when your project does not have an upstream SSOT, or you want an internal pointer file.
|
|
26
26
|
- requirements.index.yaml schema_version is fixed to 1.0.0 (required by upstream_claims checks).
|
|
27
|
+
- For full SSOT initialization with AI-assisted content extraction, use brownfield-bootstrap skill.
|
|
27
28
|
EOF
|
|
28
29
|
}
|
|
29
30
|
|
|
@@ -34,7 +35,7 @@ die_usage() {
|
|
|
34
35
|
}
|
|
35
36
|
|
|
36
37
|
project_root="${DEVBOOKS_PROJECT_ROOT:-$(pwd)}"
|
|
37
|
-
|
|
38
|
+
devbooks_root="${DEVBOOKS_ROOT:-dev-playbooks}"
|
|
38
39
|
ssot_dir="ssot"
|
|
39
40
|
set_id=""
|
|
40
41
|
source_ref=""
|
|
@@ -50,8 +51,8 @@ while [[ $# -gt 0 ]]; do
|
|
|
50
51
|
project_root="${2:-}"
|
|
51
52
|
shift 2
|
|
52
53
|
;;
|
|
53
|
-
--truth-root)
|
|
54
|
-
|
|
54
|
+
--devbooks-root|--truth-root)
|
|
55
|
+
devbooks_root="${2:-}"
|
|
55
56
|
shift 2
|
|
56
57
|
;;
|
|
57
58
|
--ssot-dir)
|
|
@@ -77,20 +78,20 @@ while [[ $# -gt 0 ]]; do
|
|
|
77
78
|
done
|
|
78
79
|
|
|
79
80
|
project_root="${project_root%/}"
|
|
80
|
-
|
|
81
|
+
devbooks_root="${devbooks_root%/}"
|
|
81
82
|
ssot_dir="${ssot_dir%/}"
|
|
82
83
|
|
|
83
|
-
if [[ -z "$project_root" || -z "$
|
|
84
|
+
if [[ -z "$project_root" || -z "$devbooks_root" || -z "$ssot_dir" ]]; then
|
|
84
85
|
die_usage "missing required paths"
|
|
85
86
|
fi
|
|
86
87
|
|
|
87
|
-
if [[ "$
|
|
88
|
-
|
|
88
|
+
if [[ "$devbooks_root" = /* ]]; then
|
|
89
|
+
devbooks_dir="$devbooks_root"
|
|
89
90
|
else
|
|
90
|
-
|
|
91
|
+
devbooks_dir="${project_root}/${devbooks_root}"
|
|
91
92
|
fi
|
|
92
93
|
|
|
93
|
-
ssot_pack_dir="${
|
|
94
|
+
ssot_pack_dir="${devbooks_dir}/${ssot_dir}"
|
|
94
95
|
|
|
95
96
|
if [[ -z "$set_id" ]]; then
|
|
96
97
|
base="$(basename "$project_root")"
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: devbooks-ssot-maintainer
|
|
3
|
-
description: devbooks-ssot-maintainer:维护项目 SSOT
|
|
3
|
+
description: devbooks-ssot-maintainer:维护项目 SSOT 的"可寻址索引与派生进度视图"。用于"修改/同步 SSOT(上游或项目内)→ 生成可审计 delta → 同步 requirements.index.yaml →(可选)刷新 requirements.ledger.yaml"。通常由 `/devbooks:delivery` 在 `request_kind=governance` 路由下调用。注意:SSOT 初始化请使用 `brownfield-bootstrap`。
|
|
4
4
|
recommended_experts: ["Technical Writer", "System Architect"]
|
|
5
5
|
allowed-tools:
|
|
6
6
|
- Glob
|
|
@@ -15,27 +15,50 @@ allowed-tools:
|
|
|
15
15
|
|
|
16
16
|
## 渐进披露
|
|
17
17
|
### 基础层(必读)
|
|
18
|
-
|
|
19
|
-
输入:变更包路径、上游/项目内 SSOT 的引用锚点、以及本次变更的 delta。
|
|
18
|
+
目标:把"改 SSOT"从口头叙述升级为**可机读、可审计、可裁判**的闭环:`ssot.delta.yaml → requirements.index.yaml →(可选)requirements.ledger.yaml`。
|
|
19
|
+
输入:变更包路径、上游/项目内 SSOT 的引用锚点、以及本次变更的 delta。
|
|
20
20
|
输出:
|
|
21
21
|
- `<change-root>/<change-id>/inputs/ssot.delta.yaml`(本次变更的最小机读输入)
|
|
22
|
-
- `<
|
|
23
|
-
- `<
|
|
22
|
+
- `<devbooks-root>/ssot/requirements.index.yaml`(真相:稳定 ID → anchor → statement)
|
|
23
|
+
- `<devbooks-root>/ssot/requirements.ledger.yaml`(派生缓存:进度视图,可丢弃可重建)
|
|
24
24
|
边界:
|
|
25
25
|
- 不通读/不复制上游 SSOT 全库;只维护索引与引用锚点。
|
|
26
26
|
- 不改变 `upstream_claims` 的合同语义。
|
|
27
|
+
- **不负责 SSOT 初始化**(初始化请使用 `brownfield-bootstrap`)。
|
|
27
28
|
证据:脚本输出日志、更新后的索引文件、(可选)ledger 刷新日志。
|
|
28
29
|
|
|
29
30
|
### 进阶层(可选)
|
|
30
|
-
|
|
31
|
+
适用:需要同时管理"上游 SSOT(外部目录)+ 项目级最小 SSOT 包"时的约束与最佳实践。
|
|
31
32
|
|
|
32
33
|
### 扩展层(可选)
|
|
33
34
|
适用:需要将 SSOT 维护纳入 Knife/Epic 切片(例如 `slices[].ssot_ids`)或更严格治理闸门时。
|
|
34
35
|
|
|
36
|
+
## 与 brownfield-bootstrap 的职责边界
|
|
37
|
+
|
|
38
|
+
| Skill | 职责 | 类比 | 触发时机 |
|
|
39
|
+
|-------|------|------|----------|
|
|
40
|
+
| **brownfield-bootstrap** | **创建** SSOT 骨架 | `git init` | `ssot/` 不存在或为空 |
|
|
41
|
+
| **ssot-maintainer** | **维护** SSOT(增删改) | `git commit` | SSOT 已存在,需要变更 |
|
|
42
|
+
|
|
43
|
+
**关键区分**:
|
|
44
|
+
- 如果 `<devbooks-root>/ssot/` 目录不存在或为空,应先使用 `brownfield-bootstrap` 初始化
|
|
45
|
+
- 本 Skill 只处理**已有 SSOT 的增删改**,不负责从零创建
|
|
46
|
+
|
|
47
|
+
## SSOT 与 Spec 的区别
|
|
48
|
+
|
|
49
|
+
| 维度 | SSOT | Spec |
|
|
50
|
+
|------|------|------|
|
|
51
|
+
| **抽象层次** | 需求层(What) | 设计层(How) |
|
|
52
|
+
| **粒度** | 项目级 | 模块级 |
|
|
53
|
+
| **位置** | `<devbooks-root>/ssot/` | `<truth-root>/` |
|
|
54
|
+
| **内容** | 系统必须做什么 | 模块如何工作 |
|
|
55
|
+
|
|
56
|
+
详见 `docs/SSOT与Spec边界说明.md`
|
|
57
|
+
|
|
35
58
|
## 前置:配置发现(协议无关)
|
|
36
59
|
|
|
37
60
|
执行前必须按以下顺序查找配置(找到后停止):
|
|
38
|
-
1. `.devbooks/config.yaml`(如存在)→ 解析映射(尤其是 `
|
|
61
|
+
1. `.devbooks/config.yaml`(如存在)→ 解析映射(尤其是 `paths.ssot`)
|
|
39
62
|
2. `dev-playbooks/project.md`(如存在)→ Dev-Playbooks 协议
|
|
40
63
|
3. `project.md`(如存在)→ template 协议
|
|
41
64
|
4. 若仍无法确定 → 停止并询问用户
|
|
@@ -46,11 +69,12 @@ allowed-tools:
|
|
|
46
69
|
|
|
47
70
|
- 若存在上游 SSOT 文档库:在项目 `.devbooks/config.yaml` 配置:
|
|
48
71
|
- `truth_mapping: { ssot_root: "SSOT docs/" }`
|
|
49
|
-
- 若不存在上游 SSOT:确保 `<
|
|
72
|
+
- 若不存在上游 SSOT:确保 `<devbooks-root>/ssot/SSOT.md` 与 `<devbooks-root>/ssot/requirements.index.yaml` 存在
|
|
73
|
+
- 如果不存在,提示用户先运行 `brownfield-bootstrap` 初始化
|
|
50
74
|
|
|
51
75
|
### 2) 修改 SSOT(内容编辑)并产出 delta(机读)
|
|
52
76
|
|
|
53
|
-
你可以用 AI
|
|
77
|
+
你可以用 AI 讨论"要怎么改",但最终必须落盘为 delta(禁止只留在聊天里):
|
|
54
78
|
|
|
55
79
|
- 推荐落点:`<change-root>/<change-id>/inputs/ssot.delta.yaml`
|
|
56
80
|
- 约束:`statement` 必须是单行字符串(否则脚本会拒绝执行)
|
|
@@ -68,14 +92,14 @@ allowed-tools:
|
|
|
68
92
|
|
|
69
93
|
### 4) (可选)刷新进度账本(派生缓存)
|
|
70
94
|
|
|
71
|
-
|
|
95
|
+
若你需要"已做/未做"的可见性(仪表板/审计),可刷新:
|
|
72
96
|
- `skills/devbooks-delivery-workflow/scripts/requirements-ledger-derive.sh ...`
|
|
73
97
|
|
|
74
98
|
注意:ledger 是 derived cache,可删可重建,不能当作 SSOT 采信。
|
|
75
99
|
|
|
76
100
|
## 推荐用法(通过 Delivery 统一入口)
|
|
77
101
|
|
|
78
|
-
|
|
102
|
+
当你的诉求是"修改 SSOT/同步索引/更新账本",建议在 `/devbooks:delivery` 的输入里明确:
|
|
79
103
|
|
|
80
104
|
- `request_kind=governance`
|
|
81
105
|
- 变更类型:SSOT maintenance
|
package/templates/CLAUDE.md
CHANGED
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
# SSOT - Single Source of Truth
|
|
2
|
+
|
|
3
|
+
> 本文档是项目的**需求层真理源**,定义"系统必须做什么"。
|
|
4
|
+
>
|
|
5
|
+
> - 技术设计("如何实现")请参见 `specs/` 目录
|
|
6
|
+
> - 机读索引请参见 `requirements.index.yaml`
|
|
7
|
+
|
|
8
|
+
## 系统边界
|
|
9
|
+
|
|
10
|
+
<!-- 描述系统与外部世界的边界 -->
|
|
11
|
+
|
|
12
|
+
### 用户角色
|
|
13
|
+
|
|
14
|
+
| 角色 | 描述 |
|
|
15
|
+
|------|------|
|
|
16
|
+
| <!-- 角色名 --> | <!-- 角色描述 --> |
|
|
17
|
+
|
|
18
|
+
### 外部系统
|
|
19
|
+
|
|
20
|
+
| 系统 | 交互方式 | 说明 |
|
|
21
|
+
|------|----------|------|
|
|
22
|
+
| <!-- 系统名 --> | <!-- API/消息/文件 --> | <!-- 说明 --> |
|
|
23
|
+
|
|
24
|
+
## 核心需求
|
|
25
|
+
|
|
26
|
+
<!--
|
|
27
|
+
每条需求格式:
|
|
28
|
+
- id: R-XXX(稳定 ID,不可变)
|
|
29
|
+
- severity: must | should | may
|
|
30
|
+
- statement: 单行描述(必须可机读)
|
|
31
|
+
-->
|
|
32
|
+
|
|
33
|
+
### R-001: <!-- 需求标题 -->
|
|
34
|
+
|
|
35
|
+
- **severity**: must
|
|
36
|
+
- **statement**: <!-- 单行需求描述 -->
|
|
37
|
+
|
|
38
|
+
<!-- 补充说明(可选) -->
|
|
39
|
+
|
|
40
|
+
## 约束与合规
|
|
41
|
+
|
|
42
|
+
<!-- 非功能性约束:性能、安全、合规等 -->
|
|
43
|
+
|
|
44
|
+
### 性能约束
|
|
45
|
+
|
|
46
|
+
| 指标 | 要求 | 说明 |
|
|
47
|
+
|------|------|------|
|
|
48
|
+
| <!-- 指标名 --> | <!-- 阈值 --> | <!-- 说明 --> |
|
|
49
|
+
|
|
50
|
+
### 安全约束
|
|
51
|
+
|
|
52
|
+
<!-- 安全相关的强制要求 -->
|
|
53
|
+
|
|
54
|
+
### 合规要求
|
|
55
|
+
|
|
56
|
+
<!-- 法规/标准合规要求 -->
|
|
57
|
+
|
|
58
|
+
## 开放问题
|
|
59
|
+
|
|
60
|
+
<!-- 尚未决定的问题,需要后续澄清 -->
|
|
61
|
+
|
|
62
|
+
| ID | 问题 | 状态 | 决定 |
|
|
63
|
+
|----|------|------|------|
|
|
64
|
+
| Q-001 | <!-- 问题描述 --> | open | - |
|
|
65
|
+
|
|
66
|
+
---
|
|
67
|
+
|
|
68
|
+
> **维护说明**:
|
|
69
|
+
> - 修改本文档后,需同步更新 `requirements.index.yaml`
|
|
70
|
+
> - 使用 `ssot-maintainer` skill 或 `ssot-index-sync.sh` 脚本
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
schema_version: 1.0.0
|
|
2
|
+
set_id: PROJECT_ID
|
|
3
|
+
source_ref: truth://ssot/SSOT.md
|
|
4
|
+
|
|
5
|
+
# Requirements Index
|
|
6
|
+
#
|
|
7
|
+
# 本文件是 SSOT.md 的机读索引,用于:
|
|
8
|
+
# - upstream_claims 验证
|
|
9
|
+
# - 归档裁判
|
|
10
|
+
# - 进度追踪
|
|
11
|
+
#
|
|
12
|
+
# 维护方式:
|
|
13
|
+
# - 手动编辑后运行 ssot-index-sync.sh --validate
|
|
14
|
+
# - 或通过 ssot-maintainer skill 的 delta 机制更新
|
|
15
|
+
|
|
16
|
+
requirements:
|
|
17
|
+
# - id: R-001
|
|
18
|
+
# severity: must
|
|
19
|
+
# anchor: "## R-001"
|
|
20
|
+
# statement: "需求描述(单行)"
|
|
21
|
+
# confidence: medium # low | medium | high
|
|
22
|
+
# source: ai-inferred # manual | ai-inferred | imported
|