universal-dev-standards 5.1.0-beta.7 → 5.1.0

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.
Files changed (50) hide show
  1. package/README.md +6 -0
  2. package/bin/uds.js +2 -0
  3. package/bundled/ai/standards/translation-lifecycle-standards.ai.yaml +145 -0
  4. package/bundled/core/translation-lifecycle-standards.md +162 -0
  5. package/bundled/locales/zh-CN/CHANGELOG.md +32 -3
  6. package/bundled/locales/zh-CN/README.md +1 -1
  7. package/bundled/locales/zh-CN/core/anti-hallucination.md +22 -3
  8. package/bundled/locales/zh-CN/core/anti-sycophancy-prompting.md +192 -0
  9. package/bundled/locales/zh-CN/core/capability-declaration.md +123 -0
  10. package/bundled/locales/zh-CN/core/circuit-breaker.md +106 -0
  11. package/bundled/locales/zh-CN/core/dual-phase-output.md +103 -0
  12. package/bundled/locales/zh-CN/core/failure-source-taxonomy.md +99 -0
  13. package/bundled/locales/zh-CN/core/frontend-design-standards.md +289 -0
  14. package/bundled/locales/zh-CN/core/health-check-standards.md +144 -0
  15. package/bundled/locales/zh-CN/core/immutability-first.md +96 -0
  16. package/bundled/locales/zh-CN/core/packaging-standards.md +224 -0
  17. package/bundled/locales/zh-CN/core/recovery-recipe-registry.md +146 -0
  18. package/bundled/locales/zh-CN/core/retry-standards.md +131 -0
  19. package/bundled/locales/zh-CN/core/security-decision.md +104 -0
  20. package/bundled/locales/zh-CN/core/skill-standard-alignment-check.md +112 -0
  21. package/bundled/locales/zh-CN/core/standard-admission-criteria.md +104 -0
  22. package/bundled/locales/zh-CN/core/standard-lifecycle-management.md +116 -0
  23. package/bundled/locales/zh-CN/core/timeout-standards.md +117 -0
  24. package/bundled/locales/zh-CN/core/token-budget.md +108 -0
  25. package/bundled/locales/zh-CN/core/translation-lifecycle-standards.md +159 -0
  26. package/bundled/locales/zh-TW/CHANGELOG.md +32 -3
  27. package/bundled/locales/zh-TW/README.md +1 -1
  28. package/bundled/locales/zh-TW/core/anti-sycophancy-prompting.md +8 -0
  29. package/bundled/locales/zh-TW/core/capability-declaration.md +111 -0
  30. package/bundled/locales/zh-TW/core/circuit-breaker.md +111 -0
  31. package/bundled/locales/zh-TW/core/dual-phase-output.md +132 -0
  32. package/bundled/locales/zh-TW/core/failure-source-taxonomy.md +146 -0
  33. package/bundled/locales/zh-TW/core/frontend-design-standards.md +460 -0
  34. package/bundled/locales/zh-TW/core/health-check-standards.md +144 -0
  35. package/bundled/locales/zh-TW/core/immutability-first.md +159 -0
  36. package/bundled/locales/zh-TW/core/recovery-recipe-registry.md +146 -0
  37. package/bundled/locales/zh-TW/core/retry-standards.md +140 -0
  38. package/bundled/locales/zh-TW/core/security-decision.md +120 -0
  39. package/bundled/locales/zh-TW/core/skill-standard-alignment-check.md +112 -0
  40. package/bundled/locales/zh-TW/core/standard-admission-criteria.md +104 -0
  41. package/bundled/locales/zh-TW/core/standard-lifecycle-management.md +116 -0
  42. package/bundled/locales/zh-TW/core/timeout-standards.md +117 -0
  43. package/bundled/locales/zh-TW/core/token-budget.md +143 -0
  44. package/bundled/locales/zh-TW/core/translation-lifecycle-standards.md +159 -0
  45. package/package.json +2 -1
  46. package/src/commands/check.js +6 -0
  47. package/src/commands/init.js +6 -0
  48. package/src/commands/update.js +6 -0
  49. package/src/utils/detect-self-adoption.js +173 -0
  50. package/standards-registry.json +15 -4
@@ -0,0 +1,289 @@
1
+ ---
2
+ source: ../../../core/frontend-design-standards.md
3
+ source_version: 1.0.0
4
+ translation_version: 1.0.0
5
+ last_synced: 2026-04-20
6
+ status: current
7
+ ---
8
+
9
+ # 前端设计标准
10
+
11
+ > **语言**: [English](../../../core/frontend-design-standards.md) | 简体中文
12
+
13
+ **版本**: 1.0.0
14
+ **最后更新**: 2026-04-13
15
+ **状态**: Active
16
+ **适用范围**: 所有具备前端用户界面的项目
17
+ **参考**: DEC-029(awesome-design-md, MIT)、DEC-030(OpenAI Frontend Guide)
18
+
19
+ ---
20
+
21
+ ## 目的
22
+
23
+ 本标准定义一套机器可读的前端设计规格格式(DESIGN.md),用于 AI 辅助开发。建立 9 段式 DESIGN.md 结构、强制设计 token 词汇、UI 硬性约束,以及反模式拒绝规则。
24
+
25
+ 目标是通过结构化设计约束(而非自由形式的风格描述)确保 AI Agent 在不同执行情境下产生一致、高质量的 UI。
26
+
27
+ **核心原则**:
28
+ - DESIGN.md 是设计规格的唯一真实来源
29
+ - 语义化 token 命名(框架无关)
30
+ - 约束式提示:自由度越少 = UI 质量越高
31
+ - 与源代码同步进行版本控制
32
+
33
+ ---
34
+
35
+ ## DESIGN.md 结构
36
+
37
+ DESIGN.md 是放在项目根目录的 Markdown 文件,作为机器可读的设计规格书。使用结构化 Markdown,人类与 AI Agent 皆可读取。
38
+
39
+ ```
40
+ 传统方式:Figma 设计稿 → 人类开发者 → 代码
41
+ 新方式:DESIGN.md → AI Agent → 代码
42
+
43
+ DESIGN.md = 给 AI 读的设计规格书
44
+ - 人类可读(Markdown 格式)
45
+ - AI 可消费(结构化纯文本)
46
+ - 版本控制友好(放在 repo 根目录)
47
+ - 与代码同步演进
48
+ ```
49
+
50
+ ### 必填段落
51
+
52
+ 完整的 DESIGN.md 必须依序包含全部 9 个段落:
53
+
54
+ | # | 段落键值 | 必填 | 说明 |
55
+ |---|---------|------|------|
56
+ | 1 | `visual-theme` | 是 | 整体风格与氛围定义 |
57
+ | 2 | `color-palette` | 是 | 语义色彩 token 与 hex 值 |
58
+ | 3 | `typography` | 是 | 字体家族与字体层级角色 |
59
+ | 4 | `component-styling` | 是 | UI 组件的视觉规则 |
60
+ | 5 | `layout-spacing` | 是 | 间距尺度与网格定义 |
61
+ | 6 | `depth-shadow` | 是 | 层次感与阴影系统 |
62
+ | 7 | `design-guidelines` | 是 | 设计规则与反模式清单 |
63
+ | 8 | `responsive` | 是 | 断点与响应式规则 |
64
+ | 9 | `agent-prompt-refs` | 是 | AI 可消费的设计意图摘要 |
65
+
66
+ ---
67
+
68
+ ## 第 1 段:视觉主题与氛围
69
+
70
+ **目的**:定义产品的整体美学意图。AI Agent 在生成 UI 时以此作为高层次约束。
71
+
72
+ **必填字段**:
73
+ - `theme`: 单行风格描述(如「极简、专业、数据密集」)
74
+ - `mood`: 情感品质(如「沉稳、专注、可信赖」)
75
+ - `inspiration`: 参考产品或设计流派(如「Linear、Stripe dashboard」)
76
+ - `dark-mode`: 深色模式是 primary / secondary / 不支持
77
+
78
+ ---
79
+
80
+ ## 第 2 段:色彩系统
81
+
82
+ **目的**:定义完整的语义色彩系统。所有颜色以语义 token 表示,不直接在代码中使用原始 hex 值。
83
+
84
+ **必填**:全部 5 个语义 token(见[语义色彩 Token](#语义色彩-token))
85
+
86
+ **选填**:状态扩展 token(error、warning、success、info)、border、overlay。
87
+
88
+ ---
89
+
90
+ ## 第 3 段:字体系统
91
+
92
+ **目的**:定义字体家族与字体层级角色。约束 AI 最多使用 2 个字体家族。
93
+
94
+ **必填**:全部 4 个字体角色定义(见[字体角色](#字体角色))
95
+
96
+ **约束**:最多 2 个字体家族(display + body)。使用 3 个以上属反模式。
97
+
98
+ ---
99
+
100
+ ## 第 4 段:组件样式
101
+
102
+ **目的**:定义常见 UI 组件(按钮、卡片、输入框、徽章)的视觉规则。
103
+
104
+ **必填字段**:
105
+ - 圆角尺度
106
+ - 按钮变体(primary、secondary、ghost)
107
+ - 输入框样式
108
+ - 卡片 / surface 样式
109
+
110
+ ---
111
+
112
+ ## 第 5 段:版面与间距
113
+
114
+ **目的**:定义间距尺度与网格系统。以 8px 基础网格,定义 7 个间距步骤。
115
+
116
+ **必填**:标准尺度的全部 7 个间距步骤(见[间距尺度](#间距尺度))
117
+
118
+ ---
119
+
120
+ ## 第 6 段:层次感与阴影系统
121
+
122
+ **目的**:以阴影定义高度层次感,不依赖颜色建立视觉层级。
123
+
124
+ **必填**:至少 3 个高度层级。
125
+
126
+ ---
127
+
128
+ ## 第 7 段:设计准则与反模式
129
+
130
+ **目的**:对 AI Agent 明确列出规则和禁止的 UI 模式。此段落是约束式提示的主要机制。
131
+
132
+ **必填子段落**:
133
+ 1. UI 硬性约束(≥4 条规则)
134
+ 2. 反模式清单(≥5 个禁止模式)
135
+
136
+ ---
137
+
138
+ ## 第 8 段:响应式行为
139
+
140
+ **目的**:定义断点与响应式规则。必须采用 Mobile-first 做法。
141
+
142
+ **必填**:至少 3 个断点(mobile、tablet、desktop)。
143
+
144
+ ---
145
+
146
+ ## 第 9 段:Agent 提示参考
147
+
148
+ **目的**:设计意图的精简 AI 最优化摘要。AI Agent 应先读此段作快速定向,再查阅其他段落。
149
+
150
+ **必填字段**:
151
+ - `style-summary`: 1–2 句设计意图
152
+ - `key-constraints`: 最关键规则的列表
153
+ - `tone`: 设计带给用户的「感受」
154
+
155
+ ---
156
+
157
+ ## 语义色彩 Token
158
+
159
+ 每个 DESIGN.md **必须**定义以下 5 个语义色彩 token。它们与框架无关,必须使用这些精确名称。
160
+
161
+ | Token | 角色 | 对应示例 |
162
+ |-------|------|---------|
163
+ | `background` | 页面 / App 背景 | `#0A0A0A`(深色)/ `#FFFFFF`(浅色)|
164
+ | `surface` | 卡片、面板、Modal | `#1A1A1A`(深色)/ `#F9FAFB`(浅色)|
165
+ | `primary-text` | 主要正文 | `#F5F5F5`(深色)/ `#111827`(浅色)|
166
+ | `muted-text` | 次要文字、placeholder | `#888888`(深色)/ `#6B7280`(浅色)|
167
+ | `accent` | CTA 按钮、链接、强调 | `#6366F1`(靛蓝示例)|
168
+
169
+ **规则**:
170
+ - Token 名称为 kebab-case,必须完全相符
171
+ - 每个 token 必须定义 hex 值
172
+ - `accent` 必须是单一颜色,禁止多个强调色
173
+ - 扩展 token(error、warning、success)为选填,但必须遵循相同命名模式
174
+
175
+ ---
176
+
177
+ ## 字体角色
178
+
179
+ 每个 DESIGN.md **必须**定义以下 4 个字体角色:
180
+
181
+ | 角色 | 大小 | 字重 | 行高 | 用途 |
182
+ |------|------|------|------|------|
183
+ | `display` | 48px+ | 700 | 1.1 | 英雄标题、展示文字 |
184
+ | `headline` | 24–32px | 600 | 1.3 | 段落标题、卡片标题 |
185
+ | `body` | 16px | 400 | 1.6 | 段落、主要内文 |
186
+ | `caption` | 12–14px | 400 | 1.4 | 标签、Metadata、辅助文字 |
187
+
188
+ **规则**:
189
+ - 角色名称为小写,必须完全相符
190
+ - 4 个角色最多使用 2 个字体家族
191
+ - 字体大小为最小值,响应式缩放可接受
192
+
193
+ ---
194
+
195
+ ## 间距尺度
196
+
197
+ 标准间距尺度以 8px 基础网格,定义 7 个命名步骤:
198
+
199
+ | Token | 值 | 用途 |
200
+ |-------|-----|------|
201
+ | `space-1` | 4px | 图标内距、紧凑元素 |
202
+ | `space-2` | 8px | 默认元素内距 |
203
+ | `space-3` | 16px | 组件内部间距 |
204
+ | `space-4` | 24px | 段落内距、Gutter |
205
+ | `space-5` | 32px | 组件之间 |
206
+ | `space-6` | 48px | 主要段落之间 |
207
+ | `space-8` | 64px | 页面级别分隔 |
208
+
209
+ **规则**:
210
+ - 所有代码中的间距必须使用这些步骤 token,不得使用任意 px 值
211
+ - `space-7` 刻意跳过(直接跳到 space-8=64px 维持视觉节奏)
212
+
213
+ ---
214
+
215
+ ## UI 硬性约束
216
+
217
+ | 约束 | 规则 | 理由 |
218
+ |------|------|------|
219
+ | H1 数量 | 每页最多 1 个 H1 | 清晰内容层级 |
220
+ | 段落数量 | 每页最多 6 个段落 | 防止认知过载 |
221
+ | 字体家族 | 最多 2 个字体家族 | 视觉一致性 |
222
+ | 强调色 | 最多 1 个强调色 | 防止视觉噪音 |
223
+ | 嵌套深度 | 最多 3 层视觉嵌套 | 可读性 |
224
+ | 信息层级 | Hero → Support → Detail → CTA | 叙事结构 |
225
+ | 触控目标 | 移动端最小 44×44px | 无障碍设计 |
226
+
227
+ ---
228
+
229
+ ## 反模式
230
+
231
+ 以下 UI 模式为**禁止**。AI Agent 在生成前端代码或设计规格时必须拒绝这些模式。
232
+
233
+ | 反模式 | 说明 | 建议替代方案 |
234
+ |--------|------|------------|
235
+ | `floating-badge` | 与内容脱离的浮动徽章 | 行内标签或状态指示器 |
236
+ | `generic-card-layout` | 以完全相同的卡片堆叠作为主要内容 | 有清晰层级的多元内容结构 |
237
+ | `dashboard-grid-as-homepage` | 营销首页看起来像数据 dashboard | Hero → Support → CTA 叙事首页 |
238
+ | `competing-ctas` | 同一画面出现视觉权重相同的多个 CTA | 一个 primary CTA,零或一个 secondary CTA |
239
+ | `color-only-differentiation` | 仅用颜色传达状态或类别 | 搭配图标、图案或文字标签 |
240
+ | `decorative-overload` | 不传递信息的插图或动画 | 移除装饰性元素;偏好功能性视觉 |
241
+ | `triple-nesting` | 视觉层级超过 3 层 | 扁平化结构;以留白作分隔 |
242
+ | `rainbow-accents` | 多个强调/高亮色 | 单一强调色系统 |
243
+
244
+ 每个 DESIGN.md 的第 7 段必须明确列出至少 5 个反模式。
245
+
246
+ ---
247
+
248
+ ## DESIGN.md 文件位置
249
+
250
+ DESIGN.md 必须放在**项目根目录**,与 README.md 同层。
251
+
252
+ **规则**:
253
+ - 文件名:`DESIGN.md`(大小写必须完全相符)
254
+ - 位置:仅在项目根目录(不在 `docs/`、`src/` 或子目录)
255
+ - 格式:使用 `##` 级别段落标题的 Markdown
256
+ - 版本:文档标题包含版本字段
257
+ - 更新策略:设计 token 变更时 DESIGN.md 必须同步更新;视为代码,而非文档
258
+
259
+ ---
260
+
261
+ ## 验证清单
262
+
263
+ ### 结构
264
+ - [ ] 全部 9 个段落依序存在
265
+ - [ ] 文件位于项目根目录(与 README.md 同层)
266
+ - [ ] 文件名精确为 `DESIGN.md`
267
+
268
+ ### 色彩系统(第 2 段)
269
+ - [ ] 定义了全部 5 个语义 token:`background`、`surface`、`primary-text`、`muted-text`、`accent`
270
+ - [ ] 所有 token 都有 hex 值
271
+ - [ ] 只定义了 1 个强调色
272
+
273
+ ### 字体系统(第 3 段)
274
+ - [ ] 定义了全部 4 个角色:`display`、`headline`、`body`、`caption`
275
+ - [ ] 最多使用 2 个字体家族
276
+
277
+ ### 间距(第 5 段)
278
+ - [ ] 定义了全部 7 个间距步骤:space-1 到 space-8(无 space-7)
279
+ - [ ] 值符合 8px 基础尺度
280
+
281
+ ### 设计准则(第 7 段)
282
+ - [ ] 列出至少 4 条 UI 硬性约束
283
+ - [ ] 列出至少 5 个反模式
284
+ - [ ] 明确禁止 `floating-badge`、`generic-card-layout`、`dashboard-grid-as-homepage`
285
+
286
+ ### Agent 提示参考(第 9 段)
287
+ - [ ] 风格摘要存在(1–2 句)
288
+ - [ ] 关键约束列表存在
289
+ - [ ] 氛围(tone)已定义
@@ -0,0 +1,144 @@
1
+ ---
2
+ source: ../../../core/health-check-standards.md
3
+ source_version: 1.0.0
4
+ translation_version: 1.0.0
5
+ last_synced: 2026-04-20
6
+ status: current
7
+ ---
8
+
9
+ # 健康检查标准
10
+
11
+ > **语言**: [English](../../../core/health-check-standards.md) | 简体中文
12
+
13
+ **版本**: 1.0.0
14
+ **最后更新**: 2026-04-17
15
+ **状态**: Trial(到期 2026-10-17)
16
+ **适用范围**: universal
17
+ **来源**: XSPEC-067(DEC-043 Wave 1 可靠性套件)
18
+
19
+ ---
20
+
21
+ ## 目的
22
+
23
+ 健康检查标准:liveness / readiness / startup 三种 probe、深度 health check、结构化 JSON 响应。
24
+
25
+ 业界常见错误:把 liveness 和 readiness 混用(健康检查检查外部依赖导致连锁重启)。本标准明确三种 probe 语义分离,定义深度 health check 的检查范围(仅关键依赖),并规范结构化 JSON 响应以便下游自动化处理。
26
+
27
+ ---
28
+
29
+ ## 核心规范
30
+
31
+ - Liveness probe 不得检查外部依赖(DB、下游 API),否则会造成连锁重启
32
+ - Readiness probe 可检查关键外部依赖,但仅关键(非全部依赖)
33
+ - 慢启动服务应使用 startup probe,启动完成后交棒给 liveness
34
+ - Health check 端点必须回传结构化 JSON,包含 status / dependencies / timestamp
35
+ - Health check 结果应作为 observability 的 Error signal 之一,连续 fail 触发 incident
36
+
37
+ ---
38
+
39
+ ## 三种 Probe 类型
40
+
41
+ ### Liveness Probe
42
+
43
+ - **目的**:服务是否还存活(process 是否卡死)
44
+ - **建议端点**:`GET /health/live`
45
+ - **允许检查**:process 是否能响应 HTTP、内部 event loop 是否可用
46
+ - **禁止检查**:DB 连接、下游 API、消息队列(会造成连锁重启)
47
+ - **失败行为**:重启 pod / process
48
+ - **参数**:failureThreshold=3,periodSeconds=10
49
+
50
+ ### Readiness Probe
51
+
52
+ - **目的**:是否可接收流量
53
+ - **建议端点**:`GET /health/ready`
54
+ - **允许检查**:自身 API 可用、DB 连接(若服务必须依赖 DB)、关键下游依赖、必要配置已加载
55
+ - **禁止检查**:非关键依赖(避免非关键故障造成服务被移出负载均衡)
56
+ - **失败行为**:移出负载均衡,不重启
57
+ - **参数**:failureThreshold=3,periodSeconds=5
58
+
59
+ ### Startup Probe
60
+
61
+ - **目的**:启动期专用,替代慢启动服务的 liveness
62
+ - **建议端点**:`GET /health/startup`
63
+ - **检查项目**:启动过程所需资源(如缓存预热、index 加载)已完成
64
+ - **失败行为**:重启 pod(启动超时)
65
+ - **完成后**:停用,改由 liveness 接手
66
+ - **参数**:failureThreshold=30,periodSeconds=10
67
+
68
+ ---
69
+
70
+ ## 深度规则
71
+
72
+ | 层级 | 使用时机 | 检查范围 |
73
+ |------|---------|---------|
74
+ | Shallow | Liveness | process 是否可响应,不碰任何外部依赖 |
75
+ | Deep | Readiness | 自身 API 路由、DB ping(若必须)、关键下游 API ping |
76
+
77
+ **关键依赖的定义**:没有它服务就完全无法提供核心功能。
78
+
79
+ ---
80
+
81
+ ## 响应格式
82
+
83
+ **Content-Type**:`application/json`
84
+
85
+ | HTTP 状态码 | 含义 |
86
+ |------------|------|
87
+ | `200` | healthy — 所有关键依赖正常 |
88
+ | `503` | unhealthy — 至少一个关键依赖失败 |
89
+
90
+ **JSON Schema**:
91
+
92
+ ```json
93
+ {
94
+ "status": "healthy | degraded | unhealthy",
95
+ "timestamp": "<ISO-8601>",
96
+ "uptime_seconds": 12345,
97
+ "version": "1.0.0",
98
+ "dependencies": {
99
+ "database": {
100
+ "status": "healthy | unhealthy",
101
+ "latency_ms": 5,
102
+ "last_check": "<ISO-8601>"
103
+ },
104
+ "upstream_api": {
105
+ "status": "healthy | unhealthy",
106
+ "latency_ms": 20
107
+ }
108
+ }
109
+ }
110
+ ```
111
+
112
+ ---
113
+
114
+ ## 与 Observability 整合
115
+
116
+ - Health check 结果应作为 RED metric 的 Error 来源之一(Rate / Errors / Duration)
117
+ - 连续 N 次 health check failed 应触发 incident(对齐 incident-response)
118
+ - probe 延迟本身应被监控(异常缓慢可能是 resource_exhaustion 征兆)
119
+
120
+ ---
121
+
122
+ ## 情境示例
123
+
124
+ **情境 1:liveness 不检查 DB**
125
+ - 条件:DB 暂时无法连接
126
+ - Liveness 回传 200 healthy(不检查 DB),避免连锁重启
127
+
128
+ **情境 2:readiness 因关键依赖失败**
129
+ - 条件:关键下游 API 不可达
130
+ - Readiness 回传 503,pod 移出负载均衡但不重启
131
+
132
+ **情境 3:startup 后交棒 liveness**
133
+ - 条件:服务需 60s 预热缓存
134
+ - 前 60s startup probe 持续回 503,预热完成后交棒 liveness
135
+
136
+ ---
137
+
138
+ ## 错误码
139
+
140
+ | 代码 | 说明 |
141
+ |------|------|
142
+ | `HC-001` | `HEALTH_CHECK_FAILED` — 关键依赖失败 |
143
+ | `HC-002` | `HEALTH_CHECK_TIMEOUT` — probe 本身超时 |
144
+ | `HC-003` | `INVALID_DEPENDENCY_SET` — readiness 检查了非关键依赖(设计违规)|
@@ -0,0 +1,96 @@
1
+ ---
2
+ source: ../../../core/immutability-first.md
3
+ source_version: 1.0.0
4
+ translation_version: 1.0.0
5
+ last_synced: 2026-04-20
6
+ status: current
7
+ ---
8
+
9
+ # 不可变性优先原则
10
+
11
+ > **语言**: [English](../../../core/immutability-first.md) | 简体中文
12
+
13
+ **版本**: 1.0.0
14
+ **最后更新**: 2026-04-17
15
+ **状态**: Trial(到期 2026-10-17)
16
+ **适用范围**: universal
17
+ **来源**: XSPEC-068(DEC-043 Wave 1 可靠性套件)
18
+
19
+ ---
20
+
21
+ ## 目的
22
+
23
+ 不可变性优先原则:DTO 字段 readonly,防止并发 Agent 竞态条件。
24
+
25
+ 多个 Agent 并发执行时,共享状态的可变对象容易产生竞态条件(race condition)。本标准要求所有跨 Agent 边界传递的数据对象(DTO)默认使用 readonly 字段,并提供安全修改的替代模式(返回新实例而非原地修改)。
26
+
27
+ ---
28
+
29
+ ## 核心规范
30
+
31
+ - 所有 DTO(Data Transfer Object)字段默认必须声明为 `readonly`
32
+ - 跨 Agent 边界传递的对象必须是不可变的(immutable)
33
+ - 需要修改时,必须返回新实例(而非原地修改)
34
+ - 深层嵌套对象的所有层级都必须是 readonly
35
+ - 集合(数组/Map)使用 `ReadonlyArray` / `ReadonlyMap`
36
+
37
+ ---
38
+
39
+ ## IMM 规则
40
+
41
+ | 规则 | 说明 |
42
+ |------|------|
43
+ | `IMM-001` | DTO 所有字段声明为 `readonly` |
44
+ | `IMM-002` | 嵌套对象使用 `Readonly<T>` 递归包装 |
45
+ | `IMM-003` | 数组使用 `ReadonlyArray<T>` 而非 `T[]` |
46
+ | `IMM-004` | 禁止对跨 Agent 边界的对象使用原地修改(`push`、`splice`、直接赋值)|
47
+ | `IMM-005` | 需要修改时,使用展开运算符(spread)返回新实例 |
48
+
49
+ ---
50
+
51
+ ## TypeScript 示例
52
+
53
+ ```typescript
54
+ // 正确:不可变 DTO
55
+ interface TaskResult {
56
+ readonly taskId: string;
57
+ readonly status: 'succeeded' | 'failed';
58
+ readonly outputs: ReadonlyArray<string>;
59
+ readonly metadata: Readonly<Record<string, unknown>>;
60
+ }
61
+
62
+ // 正确:通过展开运算符创建新实例
63
+ function updateStatus(result: TaskResult, newStatus: TaskResult['status']): TaskResult {
64
+ return { ...result, status: newStatus };
65
+ }
66
+
67
+ // 错误:原地修改(违反 IMM-004)
68
+ // result.status = 'succeeded'; // TypeScript 会报错
69
+ ```
70
+
71
+ ---
72
+
73
+ ## 情境示例
74
+
75
+ **情境 1:并发 Agent 读取同一 DTO**
76
+ - 条件:两个 Agent 并发读取 `TaskResult` 对象
77
+ - 结果:因为字段是 readonly,无需加锁,不存在竞态条件
78
+
79
+ **情境 2:需要更新状态**
80
+ - 条件:Agent A 需要将 `TaskResult.status` 从 `failed` 改为 `succeeded`
81
+ - 结果:通过 `{ ...result, status: 'succeeded' }` 返回新对象,不修改原始对象
82
+
83
+ **情境 3:集合操作**
84
+ - 条件:需要向 `outputs` 数组添加新元素
85
+ - 结果:`{ ...result, outputs: [...result.outputs, newOutput] }`
86
+
87
+ ---
88
+
89
+ ## 错误码
90
+
91
+ | 代码 | 说明 |
92
+ |------|------|
93
+ | `IMM-001` | `MUTABLE_DTO_FIELD` — DTO 字段缺少 readonly 声明 |
94
+ | `IMM-002` | `MUTABLE_NESTED_OBJECT` — 嵌套对象未使用 Readonly 包装 |
95
+ | `IMM-003` | `MUTABLE_ARRAY` — 使用可变数组而非 ReadonlyArray |
96
+ | `IMM-004` | `IN_PLACE_MUTATION` — 对跨 Agent 边界对象执行原地修改 |