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.
@@ -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": "dev-playbooks-cn",
3
- "version": "4.0.4",
3
+ "version": "4.0.5",
4
4
  "description": "AI-driven spec-based development workflow",
5
5
  "keywords": [
6
6
  "devbooks",
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: devbooks-brownfield-bootstrap
3
- description: devbooks-brownfield-bootstrap:存量项目初始化:在当前真理目录为空时生成项目画像、术语表、基线规格与最小验证锚点,避免"边补 specs 边改行为"。用户说"存量初始化/基线 specs/项目画像/建立 glossary/把老项目接入上下文协议"等时使用。
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
- ### 2.5 项目级 SSOT(当无上游 SSOT 时必须创建)
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
- 为解决“SSOT 巨大且频繁变动时,无法判定哪些已交付/未交付”的问题,本 Skill 在缺少上游 SSOT 时必须先落盘**最小可寻址 SSOT 包**(不复制长文档,只写索引与可裁判条目):
127
+ 2. **置信度标记**
128
+ - 每条 requirement 标记 `confidence: low|medium|high`
129
+ - AI 生成默认为 `medium`
130
+ - 人类确认后升级为 `high`
90
131
 
91
- | 产物 | 路径(相对 `<truth-root>`) | 说明 |
92
- |------|---------------------------|------|
93
- | Project SSOT | `ssot/SSOT.md` | 人类可读的系统级真相骨架(需求/契约/运行约束/开放问题) |
94
- | Requirements Set(机读) | `ssot/requirements.index.yaml` | 稳定 ID → 锚点 → statement;供 `upstream_claims` 与归档裁判使用 |
95
- | Requirements Ledger(派生缓存) | `ssot/requirements.ledger.yaml` | 进度视图,可丢弃可重建;由脚本从归档变更包派生 |
132
+ 3. **最小可行 SSOT**
133
+ - 初始目标:5-15 条核心需求
134
+ - 不追求完整,追求可寻址
135
+ - 后续通过 `ssot-maintainer` 渐进补全
96
136
 
97
- 若项目已存在上游 SSOT(例如独立 `SSOT docs/`),该 Skill 不复制原文,而是在 `ssot/SSOT.md` 中写入指针/链接,并以 `requirements.index.yaml` 建立稳定 ID 与锚点索引。
137
+ **上游 SSOT 处理**:
138
+ - 若项目已存在上游 SSOT(例如独立 `SSOT docs/`)
139
+ - 本 Skill 不复制原文,而是在 `ssot/SSOT.md` 中写入指针/链接
140
+ - 并以 `requirements.index.yaml` 建立稳定 ID 与锚点索引
98
141
 
99
- ### 3. 架构分析产物
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
- ### 4. 基线变更包
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 truth_root when upstream SSOT is absent.
8
+ Scaffold a minimal Project SSOT pack under devbooks_root when upstream SSOT is absent.
9
9
 
10
10
  Creates (default):
11
- <truth-root>/ssot/SSOT.md
12
- <truth-root>/ssot/requirements.index.yaml
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
- --truth-root <dir> Truth root directory (default: specs)
17
- --ssot-dir <dir> SSOT dir under truth_root (default: ssot)
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
- truth_root="${DEVBOOKS_TRUTH_ROOT:-specs}"
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
- truth_root="${2:-}"
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
- truth_root="${truth_root%/}"
81
+ devbooks_root="${devbooks_root%/}"
81
82
  ssot_dir="${ssot_dir%/}"
82
83
 
83
- if [[ -z "$project_root" || -z "$truth_root" || -z "$ssot_dir" ]]; then
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 [[ "$truth_root" = /* ]]; then
88
- truth_dir="$truth_root"
88
+ if [[ "$devbooks_root" = /* ]]; then
89
+ devbooks_dir="$devbooks_root"
89
90
  else
90
- truth_dir="${project_root}/${truth_root}"
91
+ devbooks_dir="${project_root}/${devbooks_root}"
91
92
  fi
92
93
 
93
- ssot_pack_dir="${truth_dir}/${ssot_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 的“可寻址索引与派生进度视图”。用于“修改/同步 SSOT(上游或项目内)→ 生成可审计 delta → 同步 requirements.index.yaml →(可选)刷新 requirements.ledger.yaml”。通常由 `/devbooks:delivery` 在 `request_kind=governance` 路由下调用。
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
- 目标:把“改 SSOT”从口头叙述升级为**可机读、可审计、可裁判**的闭环:`ssot.delta.yaml → requirements.index.yaml →(可选)requirements.ledger.yaml`。
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
- - `<truth-root>/ssot/requirements.index.yaml`(真相:稳定 ID → anchor → statement)
23
- - `<truth-root>/ssot/requirements.ledger.yaml`(派生缓存:进度视图,可丢弃可重建)
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
- 适用:需要同时管理“上游 SSOT(外部目录)+ 项目级最小 SSOT 包”时的约束与最佳实践。
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`(如存在)→ 解析映射(尤其是 `truth_mapping.ssot_root`)
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:确保 `<truth-root>/ssot/SSOT.md` 与 `<truth-root>/ssot/requirements.index.yaml` 存在(可用 `skills/devbooks-delivery-workflow/scripts/ssot-scaffold.sh` 生成骨架)。
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 讨论“要怎么改”,但最终必须落盘为 delta(禁止只留在聊天里):
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
- 当你的诉求是“修改 SSOT/同步索引/更新账本”,建议在 `/devbooks:delivery` 的输入里明确:
102
+ 当你的诉求是"修改 SSOT/同步索引/更新账本",建议在 `/devbooks:delivery` 的输入里明确:
79
103
 
80
104
  - `request_kind=governance`
81
105
  - 变更类型:SSOT maintenance
@@ -17,6 +17,7 @@ project: project.md
17
17
 
18
18
  # 路径配置
19
19
  paths:
20
+ ssot: ssot/
20
21
  specs: specs/
21
22
  changes: changes/
22
23
  scripts: scripts/
@@ -11,6 +11,12 @@
11
11
  - 提交信息
12
12
  - 规格说明
13
13
 
14
+ ## 核心概念
15
+
16
+ - **SSOT**(`dev-playbooks/ssot/`):需求层真理源,定义"系统必须做什么"
17
+ - **Spec**(`dev-playbooks/specs/`):设计层规格,定义"模块如何工作"
18
+ - 详见 `docs/SSOT与Spec边界说明.md`
19
+
14
20
  ## 工作流
15
21
 
16
22
  当请求满足以下条件时,始终打开 `@/AGENTS.md`:
@@ -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
@@ -1,9 +0,0 @@
1
- schema_version: 1.0.0
2
- set_id: SET_ID
3
- source_ref: truth://path/to/source.md
4
-
5
- requirements:
6
- - id: R-001
7
- severity: must
8
- anchor: ""
9
- statement: "Requirement statement (must be machine-auditable)"