universal-dev-standards 6.14.0-beta.3 → 6.14.0-beta.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.
Files changed (63) hide show
  1. package/bin/uds.js +7 -1
  2. package/bundled/ai/standards/ai-response-navigation.ai.yaml +43 -3
  3. package/bundled/ai/standards/checkin-standards.ai.yaml +25 -6
  4. package/bundled/ai/standards/full-coverage-testing.ai.yaml +46 -5
  5. package/bundled/ai/standards/pipeline-security-gates.ai.yaml +5 -1
  6. package/bundled/core/ai-response-navigation.md +128 -12
  7. package/bundled/core/full-coverage-testing.md +57 -3
  8. package/bundled/extensions/frameworks/fat-free-patterns.md +937 -0
  9. package/bundled/extensions/languages/csharp-style.md +464 -0
  10. package/bundled/extensions/languages/php-style.md +700 -0
  11. package/bundled/extensions/locales/zh-cn.md +717 -0
  12. package/bundled/extensions/locales/zh-tw.md +717 -0
  13. package/bundled/locales/COVERAGE.md +5 -4
  14. package/bundled/locales/zh-CN/CHANGELOG.md +54 -3
  15. package/bundled/locales/zh-CN/README.md +2 -2
  16. package/bundled/locales/zh-CN/SECURITY.md +1 -1
  17. package/bundled/locales/zh-CN/core/ai-response-navigation.md +110 -12
  18. package/bundled/locales/zh-CN/core/full-coverage-testing.md +61 -7
  19. package/bundled/locales/zh-CN/docs/CHEATSHEET.md +3 -1
  20. package/bundled/locales/zh-CN/docs/FEATURE-REFERENCE.md +8 -5
  21. package/bundled/locales/zh-CN/skills/README.md +1 -0
  22. package/bundled/locales/zh-CN/skills/comprehension-ladder/SKILL.md +289 -0
  23. package/bundled/locales/zh-CN/skills/comprehension-ladder/eval-cases.md +261 -0
  24. package/bundled/locales/zh-TW/CHANGELOG.md +54 -3
  25. package/bundled/locales/zh-TW/README.md +2 -2
  26. package/bundled/locales/zh-TW/SECURITY.md +1 -1
  27. package/bundled/locales/zh-TW/core/ai-response-navigation.md +110 -12
  28. package/bundled/locales/zh-TW/core/full-coverage-testing.md +61 -7
  29. package/bundled/locales/zh-TW/docs/CHEATSHEET.md +3 -1
  30. package/bundled/locales/zh-TW/docs/FEATURE-REFERENCE.md +8 -5
  31. package/bundled/locales/zh-TW/skills/README.md +1 -0
  32. package/bundled/locales/zh-TW/skills/comprehension-ladder/SKILL.md +289 -0
  33. package/bundled/locales/zh-TW/skills/comprehension-ladder/eval-cases.md +261 -0
  34. package/bundled/skills/README.md +1 -0
  35. package/bundled/skills/comprehension-ladder/SKILL.md +283 -0
  36. package/bundled/skills/comprehension-ladder/eval-cases.md +255 -0
  37. package/bundled/templates/gates/check-anti-fake-tests.mjs +991 -0
  38. package/bundled/templates/gates/check-stubs.mjs +644 -0
  39. package/package.json +3 -3
  40. package/src/commands/audit.js +11 -0
  41. package/src/commands/check.js +124 -24
  42. package/src/commands/init.js +45 -9
  43. package/src/commands/update.js +183 -21
  44. package/src/core/install-records.js +2 -1
  45. package/src/i18n/messages.js +50 -9
  46. package/src/installers/standards-installer.js +16 -23
  47. package/src/reconciler/backup-manager.js +418 -82
  48. package/src/reconciler/index.js +27 -5
  49. package/src/reconciler/install-roots.js +90 -0
  50. package/src/reconciler/plan-executor.js +33 -13
  51. package/src/uninstallers/hook-uninstaller.js +7 -4
  52. package/src/utils/command-hash-ownership.js +103 -0
  53. package/src/utils/copier.js +78 -1
  54. package/src/utils/gate-scripts.js +141 -0
  55. package/src/utils/git-hooks.js +8 -4
  56. package/src/utils/health-scorer.js +10 -7
  57. package/src/utils/locale.js +19 -0
  58. package/src/utils/skill-hash-ownership.js +64 -0
  59. package/src/utils/skills-installer.js +12 -1
  60. package/src/utils/test-change-check.js +160 -0
  61. package/src/utils/test-policy.js +214 -0
  62. package/src/utils/update-summary.js +29 -0
  63. package/standards-registry.json +21 -7
@@ -0,0 +1,289 @@
1
+ ---
2
+ name: comprehend
3
+ source: ../../../../skills/comprehension-ladder/SKILL.md
4
+ source_version: 1.0.0
5
+ translation_version: 1.0.0
6
+ last_synced: 2026-10-05
7
+ source_hash: 7c69dc2bfc9f
8
+ status: current
9
+ scope: universal
10
+ description: |
11
+ [UDS] 把一段难懂的 AI 输出换成较好懂的形式:受控文字、Mermaid 图、单文件 HTML 解说页。所有形式都来自同一份大纲,所以形式会变,事实不会变。
12
+ Use when: AI 的说明、规格或代码解说太密、读的人看不出该不该核准;非专业的人必须靠它做核准;想要它的图或离线解说页。
13
+ Not for: 写新内容或加新分析——本技能只把既有的文字换形式;从源代码产生文档——请用 /docgen;为专家读者缩短文字——直接改写即可。
14
+ Keywords: comprehension ladder, explainer, controlled language, Mermaid, HTML explainer, outline, plain language, understand AI output, 理解阶梯, 受控语言, 流程图, 解说页, 换形式不换事实.
15
+ allowed-tools: Read, Glob, Grep, Write
16
+ argument-hint: "[text or file | 原文或文件] [rungs: 1 | 2 | 3]"
17
+ ---
18
+
19
+ # 理解阶梯
20
+
21
+ > **语言**: [English](../../../../skills/comprehension-ladder/SKILL.md) | [繁體中文](../../../zh-TW/skills/comprehension-ladder/SKILL.md) | 简体中文
22
+
23
+ **版本**: 1.0.0 | **最后更新**: 2026-10-05 | **适用**: Claude Code Skills
24
+
25
+ 把一段难懂的 AI 输出换成较好懂的形式。形式会变,事实不会变。
26
+
27
+ ## 目的
28
+
29
+ 现在慢的不是拿到答案,而是看懂答案并判断它。本技能帮忙这一步。它拿一份原文,最多做出三种形式,每一种叫一「阶」。
30
+
31
+ 本技能的文字依 [ai-response-navigation](../../core/ai-response-navigation.md) 第 12 条(受控语言)写成。它自己也遵守自己的防护。
32
+
33
+ ## 阶梯
34
+
35
+ 阶梯正好有三阶。每一阶都从同一份大纲产生(见[大纲](#大纲))。任何一阶都不得在大纲之外加东西。
36
+
37
+ | 阶 | 形式 | 适合 | 产出 |
38
+ |----|------|------|------|
39
+ | 1 | 受控文字 | 任何原文。永远是第一阶 | 短句或编号列,放在对话或文件里 |
40
+ | 2 | Mermaid 图 | 有流程、先后顺序、多个角色,或 3 个以上选项的原文 | 一个 Mermaid 代码区块,外加一份画不出来的项目文字清单 |
41
+ | 3 | 单文件 HTML 解说页 | 需要探索或核准的读者 | 一个可离线打开的 `.html` 文件 |
42
+
43
+ 先问用户要哪几阶。用户没说,就先做第 1 阶,再提议另外两阶。
44
+
45
+ 没有视频阶。视频需要语音服务,而且会把原文送给第三方。
46
+
47
+ ## 三条防护
48
+
49
+ 这三条防护**必须**遵守。破坏任何一条的那一阶,就还没做完。不得交出去。
50
+
51
+ | 编号 | 防护 | 等级 |
52
+ |------|------|------|
53
+ | G1 | `no-new-facts`:不加原文没有的事实 | **必须(Required)** |
54
+ | G2 | `keep-hedges`:保留每一个不确定语气。不得把不确定的说法改成确定 | **必须(Required)** |
55
+ | G3 | `trace-and-gaps`:每一项都附「对应原文哪一段」与「没涵盖什么」 | **必须(Required)** |
56
+
57
+ G2 与 [ai-response-navigation](../../core/ai-response-navigation.md) 的 12.1 条是同一条规则。这里把它用在本技能的三阶。
58
+
59
+ ### G1 `no-new-facts`(必须)
60
+
61
+ 每一阶的每一个说法都必须来自原文。不要加原因、数字、名字、日期或「已确认」。不要加你知道、但原文没写的背景。
62
+
63
+ **正例**——原文写:「订单有时会在付款步骤失败。」
64
+
65
+ ```text
66
+ O1 订单有时会在付款步骤失败。
67
+ ```
68
+
69
+ **反例**——同一份原文:
70
+
71
+ ```text
72
+ O1 订单会在付款步骤失败。这也会让退款坏掉。
73
+ ```
74
+
75
+ 「退款」是添加的事实。「有时」也不见了,所以 G2 同时被破坏。
76
+
77
+ ### G2 `keep-hedges`(必须)
78
+
79
+ 不确定语气告诉读者,一个说法可以信到什么程度。例如:可能、推断、大概、尚未确认、might、could、probably。它是信息,不是赘字。
80
+
81
+ - 原文写「可能」,这一阶就写「可能」。
82
+ - 图里也要保留。不确定的项目用虚线画,标签里留下那个词。
83
+ - HTML 里也要保留。不确定的项目要显示看得见的「尚未确认」标记。
84
+ - 只有在原文自己说这个说法已经验证时,才可以拿掉不确定语气。这时要写出检查了什么。
85
+
86
+ **正例**——原文写:「原因可能是缓存留着旧的价目表。」
87
+
88
+ ```text
89
+ O2 原因可能是缓存留着旧的价目表。 [hedge: 可能]
90
+ ```
91
+
92
+ **反例**——同一份原文:
93
+
94
+ ```text
95
+ O2 原因是缓存留着旧的价目表。
96
+ ```
97
+
98
+ 反例比较短,也比较好读。但它与原文不符。读的人若凭这一行核准修复,就被误导了。
99
+
100
+ ### G3 `trace-and-gaps`(必须)
101
+
102
+ 每一项都带两个注记:
103
+
104
+ - **对应原文**:这一项出自原文的哪个位置。用段落与句子编号,或文件名与行号,再加一段 12 个词以内的引文(中文约 20 字以内)。
105
+ - **没涵盖**:这一项没说到什么,或它证明不了什么。原文没有更多内容时,写「原文没有更多内容」。
106
+
107
+ 最后一项之后,加一份清单,叫做**这份大纲没有收的部分**。它列出原文中所有没变成项目的部分。
108
+
109
+ **正例**
110
+
111
+ ```text
112
+ O3 我们尚未在测试环境重现这个问题。
113
+ 对应原文:第 1 段第 3 句——「尚未在测试环境重现」
114
+ 没涵盖:为什么没有重现。原文没有给理由。
115
+ ```
116
+
117
+ **反例**
118
+
119
+ ```text
120
+ O3 这个问题已在测试环境重现。
121
+ 对应原文:那份报告。
122
+ ```
123
+
124
+ 「那份报告」没有指向某个位置。这个说法也与原文相反。而且没有「没涵盖」注记。
125
+
126
+ ## 大纲
127
+
128
+ 大纲是唯一共享的事实来源。先做大纲,再做任何一阶。不要直接从原文写某一阶。
129
+
130
+ 每个大纲项目有一个编号和一个种类。
131
+
132
+ | 种类 | 意思 |
133
+ |------|------|
134
+ | `claim` | 原文提出的说法 |
135
+ | `mechanism` | 一个步骤、一个原因,或两件事之间的关联 |
136
+ | `uncertainty` | 原文说不知道或尚未确认的事 |
137
+ | `example` | 原文拿来说明某个说法的案例 |
138
+
139
+ 每个项目写成这个样子:
140
+
141
+ ```text
142
+ O<编号> | 种类 | 文字 | hedge: <原文的不确定用词,或 none>
143
+ 对应原文:<位置> — 「<引文,12 个词以内>」
144
+ 没涵盖:<这一项没说到的事>
145
+ ```
146
+
147
+ 依原文的顺序编号。编号不得重复使用。三阶都用同一组编号。
148
+
149
+ ## 工作流程
150
+
151
+ ### 步骤 1——读原文
152
+
153
+ 读完整份原文。原文是文件,就读那个文件。读完之前,不要开始做大纲。
154
+
155
+ ### 步骤 2——创建大纲
156
+
157
+ 抽出项目。一项一个事实。每个不确定用词都要原样抄下。
158
+
159
+ ### 步骤 3——为每一项标出处
160
+
161
+ 为每一项写「对应原文」与「没涵盖」。再写「这份大纲没有收的部分」清单。
162
+
163
+ ### 步骤 4——把大纲给用户看
164
+
165
+ 项目超过 5 个,或用户要求时,就把大纲给用户看。让用户删除或修正项目。用户否决的大纲,不要拿去做任何一阶。
166
+
167
+ ### 步骤 5——做出各阶
168
+
169
+ 用户要哪几阶,就做哪几阶。照下面各阶的规则做。
170
+
171
+ #### 第 1 阶:受控文字
172
+
173
+ 照 [ai-response-navigation](../../core/ai-response-navigation.md) 的 12.2 条:
174
+
175
+ - 一句一件事。英文约 15 到 25 个词,中文约 25 到 40 个字。
176
+ - 一物一名。不要为了文采换名称。
177
+ - 写清楚谁做什么。
178
+ - 一步一动作。流程写成编号列表。
179
+ - 少用分号。
180
+ - 数字要带单位。
181
+
182
+ 每一行开头保留项目编号,读的人才找得到它在大纲里的位置。
183
+
184
+ #### 第 2 阶:Mermaid 图
185
+
186
+ 1. 步骤与因果用 `flowchart TD`。角色与交接用 `flowchart LR`。
187
+ 2. 每个 `mechanism` 项目画一个节点。用项目编号当节点编号。
188
+ 3. 节点标签取自项目文字。标签里要留下不确定用词。
189
+ 4. 不确定的项目画成虚线节点或虚线边(`-.->`)。
190
+ 5. 不要画没有大纲编号的节点。
191
+ 6. 在图的下面,用文字列出你没有画的每一项,并各附一个理由。
192
+
193
+ ```mermaid
194
+ flowchart TD
195
+ O1["O1 订单有时在付款步骤失败"]
196
+ O2["O2 可能:缓存留着旧的价目表"]
197
+ O1 -.-> O2
198
+ ```
199
+
200
+ #### 第 3 阶:单文件 HTML 解说页
201
+
202
+ 页面必须是一个文件。必须能离线打开。不得从网络加载任何东西。
203
+
204
+ 页面**必须**符合:
205
+
206
+ - 所有 CSS 都放在一个 `<style>` 元素里。
207
+ - 所有脚本(若有)都放在一个内嵌的 `<script>` 元素里。关掉脚本,页面仍要能用。
208
+ - `src`、`href`、`action`、`@import`、`url()` 里不得有 `http://`、`https://` 或 `//` 开头的网址。只允许页内的 `#` 锚点链接。
209
+ - 不得有 `<link>` 元素。不得有网络字体、CDN 或外部图片。
210
+ - 不得调用 `fetch`、`XMLHttpRequest`、`WebSocket` 或 `import()`。
211
+ - 不要加载 Mermaid 函数库。把图画成内嵌 SVG,或画成有样式的清单。
212
+ - 原文中 HTML 会当成标记的字符,都要跳脱。
213
+
214
+ 页面依序包含:
215
+
216
+ 1. 标题,加一句话说明原文是什么。
217
+ 2. 图(若用户要了第 2 阶)。
218
+ 3. 每个大纲项目一张卡片。卡片显示编号、文字、有不确定语气时的「尚未确认」标记、对应原文,以及没涵盖注记。
219
+ 4. 「这份大纲没有收的部分」清单。
220
+
221
+ 最小骨架:
222
+
223
+ ```html
224
+ <!doctype html>
225
+ <html lang="zh-Hant">
226
+ <head>
227
+ <meta charset="utf-8">
228
+ <meta name="viewport" content="width=device-width, initial-scale=1">
229
+ <title>解说页:原文的简短名称</title>
230
+ <style>
231
+ body { font: 16px/1.6 system-ui, sans-serif; max-width: 46rem; margin: 2rem auto; padding: 0 1rem; }
232
+ .card { border: 1px solid #8884; border-radius: 8px; padding: .75rem 1rem; margin: .75rem 0; }
233
+ .badge { background: #fd0; color: #000; border-radius: 4px; padding: 0 .4rem; font-size: .85em; }
234
+ </style>
235
+ </head>
236
+ <body>
237
+ <h1>解说页</h1>
238
+ <p>一句话:原文是什么。</p>
239
+ <section class="card" id="O2">
240
+ <strong>O2</strong> 原因可能是缓存留着旧的价目表。
241
+ <span class="badge">尚未确认:可能</span>
242
+ <p><em>对应原文:</em>第 1 段第 2 句</p>
243
+ <p><em>没涵盖:</em>是哪一个缓存。原文没有说。</p>
244
+ </section>
245
+ </body>
246
+ </html>
247
+ ```
248
+
249
+ ### 步骤 6——交出之前先检查
250
+
251
+ 五项检查都要跑。有一项没过,就修好那一阶,再跑一次。
252
+
253
+ 1. **数量**:每一阶的项目数,等于大纲的项目数,减去你列为「没有画」的项目。原文有 5 个步骤,每一阶就是 5 个步骤。不是 4,也不是 6。
254
+ 2. **没有新项目**:每一阶的每个项目都有大纲编号。找找看有没有项目没有编号。
255
+ 3. **不确定语气比对**:`hedge:` 不是 `none` 的每一项,每一阶都要有同一个不确定用词。比对的是该阶与原文。任何语言都做得到。
256
+ 4. **出处**:每一项都有指向某个位置的「对应原文」,也有「没涵盖」注记。
257
+ 5. **离线**(只用于第 3 阶):在文件里搜索 `http`、`//`、`<link`、`fetch(` 与 `XMLHttpRequest`。每一项搜索,除了你从原文引用的文字,都必须是零命中。
258
+
259
+ ### 步骤 7——回报
260
+
261
+ 结尾放这张表。没有这张表,不要交出任何一阶。
262
+
263
+ | 项目 | 第 1 阶 | 第 2 阶 | 第 3 阶 | 保留不确定语气 | 对应原文 | 没涵盖 |
264
+ |------|---------|---------|---------|----------------|----------|--------|
265
+ | O1 | 有 | 有 | 有 | 不适用 | 第 1 段第 1 句 | 「有时」的频率 |
266
+
267
+ 有任何一项防护检查没过、又修不好,就说是哪一项、为什么。不要回报成功。
268
+
269
+ ## 什么时候不要用
270
+
271
+ - 原文不到约 150 字。用 [ai-response-navigation](../../core/ai-response-navigation.md) 的 12.2 条改写,并保留不确定语气。不要做各阶。
272
+ - 读者是专家,需要密度高的原形。
273
+ - 任务是找出新的事实。本技能不做这件事。
274
+
275
+ ## 衡量它有没有帮助
276
+
277
+ 本技能还没有被证明有帮助。[eval-cases.md](eval-cases.md) 有 5 段原文,各附理解题与标准答案,并附一套跑法,会产出两个数字:前后的答对率,以及防护违反次数。实跑需要模型调用,目前还没做。实跑完成之前,不要宣称本技能有效。
278
+
279
+ ## 相关
280
+
281
+ - [ai-response-navigation](../../core/ai-response-navigation.md):第 12 条,受控语言。12.1 条是防护 G2 的基础。
282
+ - [documentation-guide](../documentation-guide/SKILL.md):Mermaid 图在项目文档中该放哪里。
283
+ - [brainstorm-assistant](../brainstorm-assistant/SKILL.md):相反方向,还没有原文时用。
284
+
285
+ ## 版本历史
286
+
287
+ | 版本 | 日期 | 变更 |
288
+ |------|------|------|
289
+ | 1.0.0 | 2026-10-05 | 首次发布。从同一份大纲做出三阶。三条必须遵守的防护。评估案例。落实 dev-platform XSPEC-450 / DEC-125 D4。 |
@@ -0,0 +1,261 @@
1
+ ---
2
+ source: ../../../../skills/comprehension-ladder/eval-cases.md
3
+ source_version: 1.0.0
4
+ translation_version: 1.0.0
5
+ last_synced: 2026-10-05
6
+ source_hash: a2b33f2ef215
7
+ status: current
8
+ scope: universal
9
+ description: |
10
+ 理解阶梯技能的评估案例与跑法:5 段原文,各附理解题、标准答案与防护违反检查。尚未实跑。
11
+ Use when: 想衡量理解阶梯技能是否帮得上读者,或想重新检查它的三条防护。
12
+ Keywords: evaluation, eval cases, comprehension questions, answer key, guard violations, DEC-114.
13
+ ---
14
+
15
+ # 理解阶梯:评估案例
16
+
17
+ > **语言**: [English](../../../../skills/comprehension-ladder/eval-cases.md) | [繁體中文](../../../zh-TW/skills/comprehension-ladder/eval-cases.md) | 简体中文
18
+
19
+ **状态:尚未实跑。** 本文件只有案例与跑法。没有调用过任何模型,也没有任何读者作过答。实跑完成之前,不要说本技能让文字比较好懂。
20
+
21
+ 下面五段原文都是为这次评估写的。它们不描述任何真实的客户、人物或系统。
22
+
23
+ ## 实跑会产出什么
24
+
25
+ 一次实跑产出两个数字:
26
+
27
+ 1. **前后的答对率。** 读者看原文时(A 组,「之前」)与看技能产出时(B 组,「之后」),答对题目的比例。
28
+ 2. **防护违反次数。** 技能的产出破坏 G1、G2 或 G3 的次数。
29
+
30
+ 建议的通过线,实跑前要与负责人谈定:B 组比 A 组高至少 10 个百分点,而且防护违反次数为 0。10 个百分点只是起始值,还没有校准过。
31
+
32
+ ## 跑法
33
+
34
+ ### 1. 产出
35
+
36
+ 每个案例都对原文跑一次技能。要求第 1 阶与第 2 阶。存下大纲与两阶的产出。若也要测第 3 阶,就要求它并存下 HTML 文件。
37
+
38
+ 五个案例使用同一个模型、同样的设置。记下模型名称。
39
+
40
+ ### 2. 分读者
41
+
42
+ 至少用 6 位读者。读者可以是人,也可以是模型。人给出的证据比较强。模型是比较便宜的替身。
43
+
44
+ 把读者分成人数相同的两组。
45
+
46
+ | 案例 | 第 1 组读 | 第 2 组读 |
47
+ |------|-----------|-----------|
48
+ | 1 | A(原文) | B(技能产出) |
49
+ | 2 | B | A |
50
+ | 3 | A | B |
51
+ | 4 | B | A |
52
+ | 5 | A | B |
53
+
54
+ 每位读者每个案例只看一次。这样读者不会在一组学到答案,再带到另一组。
55
+
56
+ B 组的读者只看技能产出,不看原文。
57
+
58
+ ### 3. 问题
59
+
60
+ 把该案例的题目交给每位读者。读者只能依手上拿到的文字作答,不得用任何其他来源。
61
+
62
+ 读者可以答「文字没有说」。对标为**未提及**的题目,这是正确答案。
63
+
64
+ ### 4. 评分
65
+
66
+ 依下面的标准答案评分。答案要符合「采计」栏才算对。标为**不确定语气**的题目,若答案把说法讲成确定,即使事实对了也算错。
67
+
68
+ 答对率 = 答对的题数 ÷ 全部答案数,各组分开算。
69
+
70
+ ### 5. 计算防护违反
71
+
72
+ 对照原文,检查每一份产出。下列情形,每一项各算一次。
73
+
74
+ | 防护 | 一次违反是 |
75
+ |------|------------|
76
+ | G1 `no-new-facts` | 某一项或某一句,说了原文没说的事。每个案例的「陷阱」清单列出最可能的几种。 |
77
+ | G2 `keep-hedges` | 原文的说法有不确定语气,产出的那一项却没有,或语气变得更强。每个案例的「不确定用词清单」列出这些用词。 |
78
+ | G3 `trace-and-gaps` | 某一项没有「对应原文」、指到的位置不是它所宣称的位置,或没有「没涵盖」注记。另外:产出没有「这份大纲没有收的部分」清单。 |
79
+
80
+ 请第二个人也数同一批产出,再比对两份计数。不同时,逐项讨论,记下最后的计数。
81
+
82
+ ### 6. 回报
83
+
84
+ 填这张表。两个数字都要有。
85
+
86
+ | 案例 | A 组答对 | B 组答对 | G1 | G2 | G3 |
87
+ |------|----------|----------|----|----|----|
88
+ | 1 | / | / | | | |
89
+ | 2 | / | / | | | |
90
+ | 3 | / | / | | | |
91
+ | 4 | / | / | | | |
92
+ | 5 | / | / | | | |
93
+ | **合计** | **A 组答对率** | **B 组答对率** | | | |
94
+
95
+ ### 实跑规模
96
+
97
+ 说明实跑的规模,让负责人在开跑前决定模型与预算:
98
+
99
+ - 产出步骤:5 次技能运行,加 5 次防护检查。共 10 次模型调用。
100
+ - 读者步骤,若读者是模型:5 个案例 × 2 组 × 每组读者数。
101
+ - 题目很短。最长的输入是一段原文或一份产出。
102
+
103
+ 模型与预算由负责人决定。这里不设置。
104
+
105
+ ---
106
+
107
+ ## 案例 1:搜索结果过期
108
+
109
+ **类型**:含多处不确定语气的事件记录。
110
+
111
+ ### 原文
112
+
113
+ > 昨晚商品目录导入之后,搜索页约有 3 小时显示旧的商品名称。最可能的原因是,导入之后搜索索引没有重建。我们认为导入工作先结束,重建步骤才排进队列,但我们还没有检查工作记录。顾客仍然可以购买那些商品。团队计划在星期四,替导入工作加上重建步骤,前提是记录证实了事件的先后顺序。没有人量过有多少顾客看到旧名称。
114
+
115
+ ### 问题与标准答案
116
+
117
+ | # | 问题 | 类型 | 采计 |
118
+ |---|------|------|------|
119
+ | 1 | 搜索页显示旧名称的时间有多久? | 事实 | 约 3 小时 |
120
+ | 2 | 最可能的原因是什么?已经确认了吗? | 不确定语气 | 导入之后索引没有重建。尚未确认:「最可能」 |
121
+ | 3 | 工作记录检查过了吗? | 事实 | 没有。还没有 |
122
+ | 4 | 问题发生期间,顾客还能购买商品吗? | 事实 | 能 |
123
+ | 5 | 修复计划在什么时候?它取决于什么? | 事实 | 星期四。取决于记录是否证实事件的先后顺序 |
124
+ | 6 | 有多少顾客看到旧名称? | 未提及 | 文字没有说。没有人量过 |
125
+
126
+ ### 不确定用词清单
127
+
128
+ 「约 3 小时」、「最可能」、「我们认为」、「还没有检查」、「前提是记录证实」、「没有人量过」。
129
+
130
+ ### 陷阱(原文没说的事实)
131
+
132
+ 受影响顾客的人数。原因已确认的说法。记录显示了事件先后顺序的说法。任何退款、营收或客服单的数字。
133
+
134
+ ---
135
+
136
+ ## 案例 2:退款核准流程
137
+
138
+ **类型**:有分支的流程(适合第 2 阶)。
139
+
140
+ ### 原文
141
+
142
+ > 顾客在 App 里申请退款。系统检查订单日期。订单超过 30 天,系统立刻驳回申请,并向顾客显示一条消息。订单在 30 天以内(含 30 天),系统把申请送给客服人员。客服人员在 2 个工作日内核准或驳回。客服人员核准后,系统把钱退回原付款方式,并发送电子邮件给顾客。超过 NT$5,000 的退款,还需要组长第二次核准。规格没有说组长要在多久内回复。
143
+
144
+ ### 问题与标准答案
145
+
146
+ | # | 问题 | 类型 | 采计 |
147
+ |---|------|------|------|
148
+ | 1 | 45 天前的订单申请退款,会怎么处理? | 事实 | 立刻驳回。顾客会看到一条消息 |
149
+ | 2 | 刚好 30 天的订单申请退款,会怎么处理? | 事实 | 送给客服人员(「30 天以内(含 30 天)」) |
150
+ | 3 | 客服人员有多久可以决定? | 事实 | 2 个工作日 |
151
+ | 4 | 核准之后,钱退到哪里? | 事实 | 原付款方式。顾客还会收到电子邮件 |
152
+ | 5 | 哪些退款需要第二次核准?由谁核准? | 事实 | 超过 NT$5,000 的退款。由组长 |
153
+ | 6 | 组长要在多久内回复? | 未提及 | 文字没有说 |
154
+
155
+ ### 不确定用词清单
156
+
157
+ 主张里没有不确定用词。文字明说了一个缺口:「规格没有说组长要在多久内回复。」产出必须保留这个缺口。
158
+
159
+ ### 陷阱
160
+
161
+ 组长的时限。消息的内容。刚好 NT$5,000 的退款规则。检查顾客历史记录的步骤。
162
+
163
+ ### 预期规模
164
+
165
+ 原文有 7 个 `mechanism` 项目(申请、日期检查、驳回、分流、客服决定、付款与电子邮件、组长核准),以及 1 个 `uncertainty` 项目(组长缺少时限)。每一阶都应该呈现同样的 8 项,或列出没有画的项目。
166
+
167
+ ---
168
+
169
+ ## 案例 3:重试函数
170
+
171
+ **类型**:含数字与两处不确定说法的代码解说。
172
+
173
+ ### 原文
174
+
175
+ > 函数 `fetchWithRetry` 最多调用付款 API 4 次。第一次调用立刻发生。调用失败后,它会先等一会儿,再做下一次。等待从 200 ms 开始,每次加倍,所以等待时间是 200 ms、400 ms 和 800 ms。它只在网络错误与 HTTP 状态 503 时重试。遇到其他状态,例如 400,它就停止并返回错误。4 次调用全部失败时,它抛出最后一个错误。程序没有加入随机抖动,所以许多同时失败的客户端可能会同时重试。我们还没有测试 API 返回状态 429 时会发生什么事。
176
+
177
+ ### 问题与标准答案
178
+
179
+ | # | 问题 | 类型 | 采计 |
180
+ |---|------|------|------|
181
+ | 1 | 这个函数最多调用几次? | 事实 | 4 次 |
182
+ | 2 | 调用之间的等待时间是多少? | 事实 | 200 ms、400 ms、800 ms |
183
+ | 3 | 哪些失败会重试? | 事实 | 网络错误与 HTTP 状态 503 |
184
+ | 4 | 遇到状态 400 会怎样? | 事实 | 停止并返回错误 |
185
+ | 5 | 程序没有加入抖动。接下来可能发生什么? | 不确定语气 | 许多同时失败的客户端可能会同时重试。这是一种可能,不是必然 |
186
+ | 6 | 遇到状态 429 会怎样? | 未提及 | 不知道。还没有测试过 |
187
+
188
+ ### 不确定用词清单
189
+
190
+ 「可能会同时重试」、「我们还没有测试」。
191
+
192
+ ### 陷阱
193
+
194
+ 状态 429 的行为(重试或不重试)。客户端确实会同时重试的说法。原文没有给的等待总时间上限。API 的名称。
195
+
196
+ ---
197
+
198
+ ## 案例 4:上传文件要存在哪里
199
+
200
+ **类型**:三个选项与取舍(适合第 2 阶)。
201
+
202
+ ### 原文
203
+
204
+ > 我们比较了三种存储用户上传文件的方式。选项 A:把文件放在应用服务器的磁盘上。它最便宜,也不需要新工具。但服务器一换,文件就会丢失,而且两台服务器无法共享文件。选项 B:使用云服务商的对象存储。以目前的量来说,费用约为每月 NT$600。更换服务器后文件仍在,任何一台服务器都能读取。它需要一次性的访问密钥设置。选项 C:使用网络文件共享。服务器之间可以共享文件,也不需要改程序。但它多出一台要维护的机器,而且我们认为,在高负载下它会比较慢。我们建议选项 B。我们还没有测试选项 C 的速度。
205
+
206
+ ### 问题与标准答案
207
+
208
+ | # | 问题 | 类型 | 采计 |
209
+ |---|------|------|------|
210
+ | 1 | 文字说哪个选项在更换服务器后文件仍在? | 事实 | 选项 B。(文字说选项 A 不会。对选项 C,文字没有说。) |
211
+ | 2 | 选项 B 的费用是多少? | 事实 | 以目前的量来说,约每月 NT$600 |
212
+ | 3 | 哪个选项不需要改程序? | 事实 | 选项 C |
213
+ | 4 | 团队建议哪个选项? | 事实 | 选项 B |
214
+ | 5 | 在高负载下,选项 C 比较慢吗? | 不确定语气 | 团队认为是,但还没有测试过 |
215
+ | 6 | 选项 C 的费用是多少? | 未提及 | 文字没有说 |
216
+
217
+ ### 不确定用词清单
218
+
219
+ 「约 NT$600」、「我们认为它会比较慢」、「我们还没有测试」。
220
+
221
+ ### 陷阱
222
+
223
+ 选项 A 或选项 C 的费用。选项 C 在更换服务器后文件仍在的说法。没有带不确定语气、就说选项 C 比较慢。原文没有给的建议理由。
224
+
225
+ ---
226
+
227
+ ## 案例 5:访问记录里的会话令牌
228
+
229
+ **类型**:含未知事项与尚未评级风险的安全发现。
230
+
231
+ ### 原文
232
+
233
+ > 审查 API 网关时,我们发现访问记录可能含有会话令牌。客户端把令牌放在网址的查询字符串、而不是放在请求头时,令牌就会出现在记录里。移动 App 2.3 版在个人资料页面这样做。网页客户端使用请求头,不受影响。记录保存 90 天,有 12 位工程师可以读取。我们没有找到有人使用过被记下的令牌的证据。风险大概是中等,但我们还没有正式评级。我们提出两项修改:移动 App 把令牌改放请求头,以及在记录中遮蔽查询字符串。我们还不知道有多少用户在用 App 2.3 版。
234
+
235
+ ### 问题与标准答案
236
+
237
+ | # | 问题 | 类型 | 采计 |
238
+ |---|------|------|------|
239
+ | 1 | 令牌什么时候会出现在记录里? | 事实 | 客户端把它放在网址的查询字符串、而不是请求头时 |
240
+ | 2 | 哪些客户端受影响? | 事实 | 移动 App 2.3 版,在个人资料页面。网页客户端不受影响 |
241
+ | 3 | 记录保存多久?谁能读? | 事实 | 90 天。12 位工程师 |
242
+ | 4 | 有没有人被证实滥用被记下的令牌? | 不确定语气 | 没有找到证据。这不等于「没有人这样做」 |
243
+ | 5 | 风险有多严重? | 不确定语气 | 大概是中等。尚未正式评级 |
244
+ | 6 | 有多少用户在用 App 2.3 版? | 未提及 | 还不知道 |
245
+
246
+ ### 不确定用词清单
247
+
248
+ 「可能含有」、「没有找到……证据」、「大概是中等」、「还没有正式评级」、「还不知道」。
249
+
250
+ ### 陷阱
251
+
252
+ 受影响用户的人数。没有任何令牌被滥用的说法。正式的风险等级(例如「高」或「中」)。修复日期。网页客户端有风险的说法。
253
+
254
+ ---
255
+
256
+ ## 实跑之后
257
+
258
+ - 记下日期、模型名称、读者人数,以及谁计算防护违反。
259
+ - 把填好的回报表放在本文件旁边。不要覆写案例。
260
+ - 防护违反次数大于 0 时,先修技能,再去解读答对率。加了事实或拿掉不确定语气的产出,可能拉高答对率,却仍然误导读者。
261
+ - 某段原文被发现有歧义时,把原文与答案一起修正,再重跑那个案例。
@@ -1,8 +1,8 @@
1
1
  ---
2
2
  source: ../../CHANGELOG.md
3
- source_version: 6.14.0-beta.3
4
- translation_version: 6.14.0-beta.3
5
- last_synced: 2026-09-30
3
+ source_version: 6.14.0-beta.5
4
+ translation_version: 6.14.0-beta.5
5
+ last_synced: 2026-10-06
6
6
  status: current
7
7
  ---
8
8
 
@@ -17,6 +17,57 @@ status: current
17
17
 
18
18
  ## [Unreleased]
19
19
 
20
+ ## [6.14.0-beta.5] - 2026-10-06
21
+
22
+ > **測試版**——以 `npm install -g universal-dev-standards@beta` 安裝。要測什麼、如何退回正式版:[docs/PRE-RELEASE.md](../../docs/PRE-RELEASE.md)。
23
+ >
24
+ > **行為改變:**`uds check` 計入技能與命令檔的遺失或修改(`--ci` 以 1 結束);`uds check --diff` 以所裝套件為原稿,不再抓 GitHub `main`;`uds init` 會加入兩支在提交時警告的掃描腳本。
25
+
26
+ ### Changed
27
+
28
+ - **行為改變——`uds check --diff` 現在以你所安裝的 UDS 套件內的檔為原稿,不再對照 GitHub `main`。** 這個差異回答的是「我改了 UDS 給我的哪些地方」;它過去從 GitHub `main` 下載原稿,所以離線會失敗(擴充檔也一樣),而且 UDS 在你安裝後自己改過的內容,會被列成你改的差異。現在原稿一律從所裝套件讀取——標準、選項、擴充檔皆同——不下載任何東西。指令會印出比對基準(`installed UDS package (version X)`),並提示看 UDS 之後的變更請用 `uds update --plan`。若專案內的標準是從另一個 UDS 版本安裝的、與目前安裝的套件版本不同,也會明說,因為兩版之間 UDS 改過的檔會顯示成差異。套件內找不到某個受追蹤檔的原稿時,指令會**點名**該檔、不下載、以結束碼 1 結束;不再退回 GitHub,也不再靜默略過。沒有被修改的檔時,`--diff` 現在會說「沒有差異可顯示」,而不是什麼都不印。**誰會看到不同:**執行 `uds check --diff`(或在互動式 `uds check` 按「檢視」)的人——凡是 `main` 與你所裝版本不同之處,差異可能與以往不同;而原本在套件缺原稿時讀到結束碼 0 的腳本,現在會讀到 1。**要做什麼:**不用做任何事;要看上游有什麼新內容,請執行 `uds update --plan`。落實 dev-platform XSPEC-453 R1。
29
+
30
+ ### Removed
31
+
32
+ - **移除 `extensions/languages/php/`**——兩個沒有任何東西引用的檔(`php-style.md`、`fat-free-patterns.md`,約 37 KB);安裝器、registry 與文件使用的是 `extensions/languages/php-style.md` 與 `extensions/frameworks/fat-free-patterns.md`,兩者不變。npm 套件因此少了這兩個檔,現在剛好只含安裝器裝得到的 5 個擴充檔;新增的測試會在有未宣告的擴充檔被打包時變紅。`uds init --lang php` 與 `--framework fat-free` 裝的檔與先前相同。落實 dev-platform XSPEC-453 R2。
33
+
34
+ ### 修正
35
+
36
+ - **健康分數的覆蓋度維度不再回報永遠是 0 的 `has_tests`。**`calculateCoverage` 宣告了 `hasTests = 0` 卻從未改動它,所以 `uds audit --score` 印出一個看起來像「標準有沒有測試」的量測、實際上不會動的數字。它已從加總與 `details` 移除;**任何專案的覆蓋度分數都不變**(分母本來就是每個標準兩份——`check-<id>.sh` 與 `check-<id>-sync.sh`)。(XSPEC-444 R5)
37
+ - **行為改變——`uds check` 現在會把遺失或被改過的技能檔算進判定。它以前會印出紅色 ✗,結尾卻仍說「專案符合標準」、exit 0。** Skills 完整性檢查的結果算出來之後被丟掉了。現在刪掉或改過技能檔,`uds check` 會說「偵測到一些問題」並點名該檔,`uds check --ci` 會 exit 1(不帶 `--ci` 時 exit code 仍是 0,與其他各類發現一致;UDS 寫的 pre-commit hook 執行的是不帶參數的 `uds check`,所以不會因此被擋)。**誰會看到差別:**技能資料夾被改過或掉了檔的專案。**怎麼處理:**執行訊息印出的指令 `uds update --apply --skills`。**幽靈紀錄先處理,所以既有專案不會突然開始失敗:**專案的 manifest 可能列著 UDS 從未安裝的技能檔——採用者自己的技能,以及舊版 UDS 因為雜湊整個資料夾而誤拷進技能資料夾的 `agents/`、`workflows/`、`_shared/`,後來 `uds update` 把它們刪了卻沒忘掉紀錄(有個專案顯示 26 個「遺失」,6.11.0 與 6.14.0-beta.4 相同)。現在安裝器只記錄自己裝的技能(也不記錄自己的 `.manifest.json`);`uds update` 刪掉技能資料夾時一併刪掉它的紀錄;`uds check` 忽略不描述任何出貨技能的紀錄並說出有幾筆(`N skill record(s) ignored`);`uds update`(`--apply`、`--skills`,或已是最新版的路徑)會把它們從 `.standards/manifest.json` 永久清掉。**斜線命令檔同樣適用**——它的檢查結果原本也被丟棄:命令檔被刪或被改,`uds check` 現在會點名,`--ci` 會 exit 1(修復:`uds update --apply --commands`)。UDS 不出貨的命令紀錄由 `uds update` 清掉;裝在使用者層級(所有專案共用,本專案無從背書)的命令紀錄,檢查會忽略並說明。另外,當「改程式沒動測試」或「假測試」檢查設為 `"mode": "block"` 時,`uds check` 印出 BLOCKED 後不再以「符合標準」收尾。落實 dev-platform XSPEC-454 R2。
38
+ - **`uds update --rollback` 現在還原整個升級,而不只是標準檔。** 依序執行 `update --apply`、`update --apply --skills`、`update --apply --commands` 後,一次 `--rollback` 只還原標準檔與 `CLAUDE.md`/`AGENTS.md`,新增的技能資料夾(`comprehension-ladder`)、技能與命令的 `.manifest.json`、以及 `.standards/manifest.json` 裡的雜湊紀錄都留在新版,於是 `uds check` 報修改過的檔,專案同時不符合兩個版本。原因:備份只記錄計畫要覆寫的檔(沒有更新所建立的檔,也沒有 `.standards/manifest.json`);`--skills` 與 `--commands` 寫檔時完全沒有備份;還原用的 `copyFileSync` 還原不了資料夾。現在 `--apply`、`--apply --skills`、`--apply --commands` 的每一步都建立備份,並記錄它所建立的檔(`--skills`/`--commands` 自己建立備份,沒有備份就不寫;只備份 UDS 出貨的技能與命令,不碰你自己的);不帶 `--apply` 的一般 `uds update` 仍和以前一樣不建立備份;連續的步驟以 `.standards/manifest.json` 前後的雜湊串起來,所以一次 `--rollback` 會一路退過整串沒有被打斷的升級,並在中間有別的變更處停下來、明說;還原後會讀回驗證;指令會印出還原了什麼、移除了什麼,若有任何失敗,**不會以「成功」收尾**(exit 1,並說明怎麼重試)。**沒有涵蓋、並會如實印出:**使用者層級的技能/命令(`~/.claude/skills`,由所有專案共用),以及舊版本做的備份(它們從未記錄所建立的檔與 manifest)。落實 dev-platform XSPEC-454 R1。
39
+ - **`uds update --commands` 把命令數印成了工具數**(只有一個 OpenCode 卻印「為 51 個 AI 工具更新」)。該訊息鍵在每個語言都寫成「N 個 AI 工具」,卻被填入命令檔數。現在有獨立的訊息,兩個欄位各放各的數字:「Updated 51 commands for 1 AI tool(s)」/「已為 1 個 AI 工具更新 51 個斜線命令」/「已为 1 个 AI 工具更新 51 个斜线命令」。舊鍵的其他用法本來就傳工具數,不變。落實 dev-platform XSPEC-454 R4。
40
+
41
+ ### 新增
42
+
43
+ - **`uds init` 現在會附上 `full-coverage-testing` 一直要你自己寫的假測試與空殼掃描腳本,`uds check` 會把它們找到的東西以警告印出。**標準一直寫著「新增 `scripts/check-stubs.sh` 與 `scripts/check-anti-fake-tests.sh`」,驗證器也只檢查這兩個檔案存在——但 UDS 兩個都沒附,這條指示根本照做不了。`uds init` 現在會寫入 `scripts/check-anti-fake-tests.mjs`(找**沒有斷言**的測試、唯一的斷言是 `expect(true).toBe(true)` 或 `assert 200 == 200` 這類**恆真式**的測試、**每支測試都被跳過或標 todo** 的測試檔)與 `scripts/check-stubs.mjs`(`// WARNING: STUB` 標記、宣稱**尚未實作**而旁邊沒有標記的函式本體、本體**為空**而旁邊沒有標記的具名函式)。純 Node、零相依、不預設測試框架;它們是你的檔案。單獨執行時,找到東西就以非 0 結束。**`uds check`——pre-commit hook 執行的指令——會執行它們並把找到的東西印成警告;不擋任何東西**,除非你在 `.standards/test-policy.json` 設 `"mode": "block"`。有暫存檔案時掃描那些檔案;沒有暫存任何東西時(CI 執行)掃描整個專案。**測試檔規則涵蓋 JavaScript/TypeScript、Python、Java/Kotlin/Scala/C#、Go、Rust、Ruby、Elixir、PHP、Swift、Dart、Lua 與 C/C++;其他語言的測試檔會被列為「未掃描」,絕不當成乾淨。**它們讀的是文字、不執行你的測試,所以用掃描器認不得的名稱做斷言的輔助函式會被報為「no-assertion」(請命名為 `assert*`/`verify*`/`expect*`,或把樣式列在 `assertionPatterns`)。每次執行都先拿已知的假測試與好測試檢驗自己,失敗就以 `2`(「無法判定」,絕不算通過)結束。已存在的檔案絕不覆寫;`uds uninstall` 只移除 `uds init` 寫入且未被改動的檔案;較早初始化的專案由 `uds update` 詢問是否寫入(提示的預設為否;**`uds update -y` 會直接回答是**,所以升級指令是 `uds update -y` 的專案,下次更新就會多這兩個檔案)。**誰會看到差別:**本版之後每次 `uds init` 會在 `scripts/` 多兩個檔案,每次提交 `uds check` 會多印兩行(或找到的東西)。**怎麼處理:**讀它的發現;想讓某類檔案不再被報,加一份 `test-policy.json`;想強制執行,設 `"mode": "block"` 或在 CI 跑這兩支腳本。`uds check --standard full-coverage-testing` 現在會執行這兩支腳本,不再只檢查它們存在。(XSPEC-444 R5)
44
+ - **`uds check` 在一次提交改了程式碼卻沒動任何測試時發出警告。**有檔案暫存時,`uds check` 會在「改了程式檔、同一次提交沒有測試檔變動」時列出那些程式檔,並列出它不認得類型的變更檔案(絕不當成沒事,也絕不擋)。刪除不需要測試;純重新命名(git `R100`)與符合 `exempt` 條目的路徑可免,輸出會記下理由。哪些路徑是測試、哪些是程式,是附有常見生態預設值的資料——`*.test.*`、`*_test.go`、`test_*.py`、`*Test.java`、`tests/` 等——由 `.standards/test-policy.json`(`testDirs`、`testPatterns`、`sourceExtensions`、`nonCodeExtensions`、`ignore`,以及每筆都必須附 `reason` 否則不生效的 `exempt`)**加進**而不是取代。**它只警告、放行提交。**同一份檔案裡的 `"mode": "block"` 會讓它擋下提交;這是目前提供的唯一收緊步驟。**沒有做,因為規格沒有定義:**未配測試的變更數棘輪(基線放在哪、以什麼計數),以及逐次提交的豁免理由(pre-commit hook 讀不到提交訊息)。(XSPEC-444 R2)
45
+ - **`uds audit --offline`。** `check` 與 `update` 早就有,`audit` 卻回「unknown option」。加上它之後,`audit` 不發任何網路請求——包含每個指令結束後的「有新版本」提示(它對 `check`、`update` 也忽略 `--offline`,現在都遵守);`--report` 會說「離線模式:不提交回報。」(並指出出路 `--dry-run`),而不是去啟動 `gh`、瀏覽器或剪貼簿。落實 dev-platform XSPEC-454 R3。
46
+
47
+ ## [6.14.0-beta.4] - 2026-10-06
48
+
49
+ > **測試版**——以 `npm install -g universal-dev-standards@beta` 安裝。要測什麼、如何退回正式版:[docs/PRE-RELEASE.md](../../docs/PRE-RELEASE.md)。
50
+ >
51
+ > **行為改變:**`uds check --standard checkin-standards` 在 lint 或測試失敗時會失敗;非 Node 專案的原生 pre-commit hook 現在擋得住提交。見下方 Fixed 的相關條目。
52
+
53
+ ### 修正
54
+ - **`extensions/` 現在放進 npm 套件,`uds init`、`uds update` 與 reconciler 只從套件內安裝擴充檔——三者都不再從 GitHub 下載。** 6.13.1 版套件裡 `extensions/` 底下的 7 個檔(語言風格規範、框架模式、繁中與簡中語系包)一個都沒有,所以 `uds init --lang csharp`、`--lang php`、`--framework fat-free`、`--locale zh-tw`/`zh-cn` 安裝時是去 GitHub `main` 下載。後果有兩個:離線或公司內網裝不了這些擴充;而且拿到的是 `main` 當天的內容,不是你所裝版本對應的那個檔。同一個備援也把缺少的 `zh-cn.md` 藏了好幾個月。現在 `cli/scripts/prepack.mjs` 會把整個目錄打包;套件內容一致性檢查會逐檔、逐位元比對 `extensions/` 與套件(以前只比對 `.ai.yaml` 標準,所以一個擴充檔都沒有的套件也會顯示「bundle parity holds」);宣告的擴充檔若不在套件內,安裝會**失敗並點名該檔**——不下載、也不靜默略過。**誰會看到差別:**從 npm 安裝的人多拿到 7 個檔(約 152 KB),且這些檔不再發出任何網路請求;`uds update` 也從套件內更新 `manifest.extensions` 的項目。**沒有改的:**其他在本機缺檔時仍會嘗試 GitHub 的地方(標準、選項、整合檔、技能),以及 `uds check --diff`——它仍會從 GitHub `main` 抓任何追蹤檔(含擴充檔)的原稿來比對。這份清單列在規格裡,本次不動。新增的測試會執行 `npm pack`、把壓縮檔裝進拋棄式目錄、封鎖並記錄網路,對已安裝套件宣告的每一個擴充選項執行 `uds init`,再逐位元讀回每個已安裝的檔;第二支測試從套件移除一個宣告的檔,要求安裝以該檔的名稱失敗,且沒有任何下載嘗試。落實 dev-platform XSPEC-452 的 R1、R2、R3。
55
+ - **`uds init --locale` 不分大小寫,且不支援的語系會明說**:`--locale zh-CN` 以前會安裝英文並回報成功,現在會裝簡體中文。不支援的值(例如 `fr`)仍改用英文安裝,但會印出警告,不再靜默。(dev-platform XSPEC-451 後續)
56
+
57
+ - **行為改變——`uds check --standard checkin-standards` 在你的 lint 或測試失敗時現在會失敗;它以前會說「通過」。** 該驗證器原本是 `(npm test --if-present || echo "No test script")`。`--if-present` 本來就處理「沒有測試腳本」的情況;`|| echo` 因此只做了一件事:把失敗的 `npm test` 或 `npm run lint` 變成 exit 0。UDS 自己的 `test-governance` 標準要求閘門 fail-closed,它自己出貨的檢查卻沒做到。現在:lint 或測試腳本失敗會回非 0,並指出是哪一個(`FAILED: npm run test exited with 1`,後面接該腳本自己的輸出);真的沒有該腳本不算失敗,並且**只有這時**才印 `No lint script`/`No test script`;`npm init` 為 `test` 寫的預設佔位(`echo "Error: no test specified" && exit 1`)視為沒有;沒有 `package.json` 的專案通過,並印出 lint 與測試**沒有**被執行;`package.json` 存在卻無法解析會失敗,不會被當成「沒有腳本」。缺 `CHANGELOG.md` 仍只是提示。**誰會看到差別:**pre-commit hook 執行 `check --standard checkin-standards` 的專案(UDS 在 2026-02-04 至 2026-03-04 寫的 hook,`uds update` 會把它保留成區塊的參數),以及在 CI 或腳本裡執行該指令的人。過去帶著失敗的測試也能提交成功的 commit,現在會被擋下——這正是目的。**怎麼處理:**執行 `npm test`/`npm run lint`,修掉它們回報的問題。沒有測試的專案不受影響。全新的 `uds init` 所寫的 hook 執行的是不帶參數的 `uds check`,它不評估這個驗證器;它該不該評估是另一個決定,本次不變。驗證器現在會執行 `node`,凡是在跑 `uds` CLI 的專案本來就有。
58
+ - **`pipeline-security-gates` 驗證器不再在沒有任何 pipeline 提到安全閘門時通過。**它把 `grep` 接到 `head -1`,再以 `|| echo 'no-ci-pipeline'` 兜底;`head` 永遠回 0,所以兜底從不執行,這個檢查不可能失敗。現在改用 `grep -q`,除非 `.github/workflows/`、`.gitlab-ci.yml` 或 `Jenkinsfile` 提到 `secrets`、`sast`、`sca` 或 `dast`,否則回非 0。只有 `uds check --standard pipeline-security-gates` 會執行它。
59
+ - **`uds init` 為非 Node 專案寫的原生 `.git/hooks/pre-commit` 現在真的能擋下 commit。**它原本把每個 linter 都寫成 `... 2>/dev/null || true`,把 `uds check 2>/dev/null || true` 也是,最後印出「Pre-commit checks passed」——什麼都擋不了,還把自己的錯誤藏起來。現在:已安裝的 linter(`ruff`、`go vet`、`cargo clippy`)失敗會擋下 commit,沒安裝的 linter 則略過;UDS 檢查改用與 husky hook 相同的標記區塊,所以它的結束碼會擋下 commit,而找不到 `universal-dev-standards` CLI 時會說明如何安裝並擋下,不再靜默略過。`uds uninstall` 會整段移除該區塊,連你改過的腳本也一樣。**磁碟上既有的 hook 維持原樣**——UDS 無法證明一個被改過的檔案是自己寫的,這一項也沒有隨本次變更附上遷移。
60
+ - **`uds init --locale zh-cn` 現在可用。它以前會失敗並把整個安裝回滾。** 安裝程式宣告了 `zh-cn`,並會複製 `extensions/locales/zh-cn.md`,但這個檔案不存在(只有 `zh-tw.md`),所以安裝以 `extensions/locales/zh-cn.md: File not available` 收場,並移除它裝過的所有東西——沒有人能用簡體中文安裝 UDS,而且沒有任何測試用簡體中文跑過安裝,所以一直壞著。現在這個檔案存在了:它是以大陸通行術語寫成的簡體中文語系包(不是把繁體版逐字轉換——它的術語表寫「Performance → 性能」,繁體版寫的正好相反)。它以 `zh-cn-locale` 登錄在 `zh-tw-locale` 旁邊。新增的測試對安裝程式宣告的每一個語系實際執行真正的 `uds init`(清單從安裝程式讀出,不寫在測試裡),並讀回語系包、manifest 與已安裝的技能;有語系宣告了卻沒有對應檔,測試就會變紅並指出是哪個語系。理解階梯的安裝測試現在也讓 zh-CN 走 `uds init`。**npm 安裝的注意事項:**寫下這一條時 `extensions/` 不在 npm 套件裡,語系包是安裝時從 GitHub(`main`)下載的;現在它已放進套件(見上方 `extensions/` 那一條)。落實 dev-platform XSPEC-451 的 R1、R2。
61
+
62
+ ### 新增
63
+
64
+ - **`ai-response-navigation` 1.3.0 → 1.4.0——R12 受控語言,其中一條為必須。** 把文字簡化會讓它更好讀,而最好讀的句子是肯定的句子,所以「簡化」會朝肯定的方向漂移:「可能」變成「是」。R12 把答案分成兩半。**12.1 屬必須**:為非原作者的讀者縮短、簡化、改寫或翻譯文字時,要保留寫作者的不確定語氣(might、could、probably、可能、推斷、尚未確認),不可把不確定的論斷改成確定的,也不可加入原文沒說的事實。只有這一部分的失敗會讓讀者相信不真實的事,而且不需要校準:檢查就是拿改寫前後比對,任何語言都做得到。**12.2 屬選用**,理由已寫進標準:以該語言自己的單位計句長(起始範圍,依語言校準)、同物同名、主動語態、一步一動作、少用分號、數字帶單位。R10 現在指向 R12。
65
+ - **不附英文詞典,並在標準裡明說。** 這些原則取自 ASD-STE100,但它的核可字表與時態限制依賴英文,不適用於中文或其他非英文文字。標準只取原則、不附任何字表,並警告:以空白斷詞的計數器會把一整段中文看成一個詞,永遠通過。
66
+ - **一組中文範例**:同一段文字的原文、約 80%、嚴格三個版本,全部保留不確定語氣,外加第四個更短卻錯誤的改寫(把「可能」改成直接陳述的原因、把「尚未重現」改成「已確認」)。同步 zh-TW 與 zh-CN、兩份 `.ai.yaml`,以及一支讀取實際出貨檔案的測試——必須條款被削弱或刪除時它會變紅。
67
+ - **新增技能 `comprehension-ladder`(`/comprehend`)1.0.0 — 把一段難懂的 AI 輸出換成較好懂的形式,而且不改變事實。** 技能先從原文建立一份大綱,再從大綱做出最多三階:受控文字、Mermaid 圖、單檔 HTML 解說頁(可離線開啟,不從網路載入任何東西)。沒有影片階。**三條防護為必須**,各附正例與反例:不加原文沒有的事實、保留每一個不確定語氣(「可能」仍是「可能」)、每一項都附對應原文的位置與「沒涵蓋」註記。技能本身依 [ai-response-navigation](../../core/ai-response-navigation.md) 第 12 條(受控語言)寫成,防護 G2 就是 12.1 條。
68
+ - **尚未證明有幫助。** `skills/comprehension-ladder/eval-cases.md` 有 5 段為此撰寫的原文,各附理解題與標準答案,並附一套跑法,會產出兩個數字:前後的答對率,以及防護違反次數。實跑需要模型呼叫,目前還沒做。做完之前,技能不宣稱有效。
69
+ - 提供 `zh-TW` 與 `zh-CN` 版本,並登錄於 registry、manifest、`llms.txt` 與技能索引。有一支測試會在拋棄式專案裡執行真正的 `uds init`,讀回安裝後的技能:三條防護都在、且標為必須,HTML 階禁止外部資源,也沒有影片階。
70
+
20
71
  ## [6.14.0-beta.3] - 2026-09-30
21
72
 
22
73
  > **測試版**——以 `npm install -g universal-dev-standards@beta` 安裝。要測什麼、如何退回正式版:[docs/PRE-RELEASE.md](../../docs/PRE-RELEASE.md)。