Skip to content

Commit 020db12

Browse files
committed
Merge origin/main — retirement supersedes the #9511 gate widening; #9504 instruction scan gains the retirement ledger row
The modify/delete conflict on scripts/check-adr-merge-approval.mjs resolves as deletion: #9511 widened the per-PR gate's predicate to the published skills/ catalog under the pre-retirement regime, and that semantic content survives in the audit's GOVERNED_SURFACES (skills/** was already governed there by the 2026-08-18 unified definition). The #9504 instruction-surface scan lands intact; per its append-only ledger contract this merge adds the 'ADR maintainer approval' retirement row (replacedBy: null) in the same PR that removes the registry entry. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Rn7aaamsR99FXRqLcpL99q
2 parents 9b75229 + 072b55a commit 020db12

4 files changed

Lines changed: 742 additions & 23 deletions

File tree

‎.claude/agents/os-dev.md‎

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -190,14 +190,21 @@ dispatch prompt 只携带每单增量(裁决引文、裁决 / PM-机制假设分
190190
(删掉一个喂计数的读取,能让下游门禁*多出*一个发现);反转(canonical-first 的 `??`
191191
链:非法拼写落到 schema 的具名拒收 —— 规则绿、schema 红)。报告你实际观察到的方向;永
192192
不硬套模板的预设。
193-
- **dogfood ablation 跑在 `dist/` 上,所以要重建被 ablate 的包 —— 并在报告里说明你建
194-
了。** `packages/qa/dogfood` 刻意从各包**构建产物 `dist/`** 解析被测代码,且两个方向
195-
不对称:没 build 的修复是会被注意到的假红,没 build 的 **ablation** 跑的是变异前的构
196-
建、保持**绿** —— 给一条可能永远失败不了的断言背书,对 CI 永久隐形。每一腿都是:变异
197-
→ `pnpm --filter <pkg> build` → **证明变异到达了产物** → 运行:
198-
`node scripts/ablation-dist-preflight.mjs <pkg> '<marker>'`,ablation 删守卫时用
199-
`--absent` —— 它同时是恢复腿,因为留在 `dist/` 里的 marker 会让变异代码在之后每次运行
200-
里继续生效。
193+
- **ablation 的成立条件是解析路径,不是套件名 —— 变异腿与还原腿都要重建,并在报告里说
194+
明你建了。** 条件:**被测主体经依赖的 `exports` 解析**(那指向该包的 `dist/`,不是
195+
`src/`),且没有 vitest alias 把 specifier 拉回源码;这批 pair 有实测台账 ——
196+
`scripts/check-test-source-alias.mjs` 的 `KNOWN_UNALIASED_TEST_IMPORTS`。
197+
`packages/qa/dogfood` 是最眼熟的一例,不是定义:读成 dogfood 专属,普通单元套件里的
198+
ablation 就会被当真(实测:plugin-email → platform-objects 消融后 375 试全绿,重建后
199+
4 红;plugin-auth → core 那组「证明新门禁能红」的腿跑的是变异前产物)。两个方向不对
200+
称:没 build 的修复是会被注意到的假红;没 build 的 **ablation** 保持**绿**,给一条可
201+
能永远失败不了的断言背书,对 CI 永久隐形(CI 构建正确,那边永远绿)。⚠️ 消融本就为证
202+
明**新门禁能失败**时,这份假绿不是空结果 —— 它读作「门禁没触发」,指向门禁坏了而不是
203+
夹具坏了,于是有人去弱化一条本来正常的门禁。所以每一腿(变异**与**还原)都是:改动 →
204+
`pnpm --filter <pkg> build` → **证明它到达了 `dist/`** → 才读运行结果:
205+
`node scripts/ablation-dist-preflight.mjs <pkg> '<marker>'`(删守卫的消融、以及每个
206+
**还原腿**,用 `--absent`)。⛔ 还原腿最常被跳过 —— 留在 `dist/` 里的 marker 会让变异
207+
代码对该树之后的每次运行继续生效,后面的测量量的是错的树。
201208

202209
## Definition of done(按序)
203210

‎.claude/skills/checklist-test/SKILL.md‎

Lines changed: 70 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,9 @@ expected-fail 探针 —— 永不在真实缺陷上把条款打成绿。
127127
那个分数是标题的一部分,不是可选装饰。
128128
- **标签** —— 只带 `qa-run`,⛔ 不挂 `bug`/priority 等工作标签:run 记录是协议载体、
129129
不入分诊 sweep,⛔ 不是可派发单元;工作标签随抽取出的缺陷卡走(RUNNER 抽取义务条款)。
130+
**这条在记录的整个生命周期成立** —— 收口与关闭时同样不补挂。实测漂移形态:记录事后
131+
被补上 `tests` / `tracking` / `bug`,每一个都把协议载体推回排除清单本要挡住的
132+
sweep。
130133
- **正文**,按此顺序:
131134
- **环境指纹** —— framework sha、`.objectui-sha`、端口、db、seed、时间戳。
132135
- **范围** —— 选择器 + 每项所对的 `revision`。
@@ -139,13 +142,79 @@ expected-fail 探针 —— 永不在真实缺陷上把条款打成绿。
139142
- **收束抽取(RUNNER 抽取义务条款)** —— 运行中发现的每个产品缺陷,收束报告时逐个抽
140143
取为独立 issue:标题自含、复现与机制条目化、指回本 run issue 取全量证据;缺陷卡不
141144
挂 `qa-run`,正常进分诊首触。清单准确性发现与 fixture 缺口归波次锚卡(sweep 跟踪
142-
issue)收口,⛔ 不抽取;环境阻塞记录在案即可。
145+
issue)收口,⛔ 不抽取;环境阻塞记录在案即可。逐条 `fail` 的四分法处置、收口评论的
146+
机器行与抽取卡的溯源行见 §5。
143147
- **完成判据** —— 一个区只有在**每一项都有判定**时才算跑完。跑不完的一轮照常立单:
144148
交出已有的判定,**外加一份点名未触达项的交接清单**,标题按上面的分数如实写。
145149
`not-run` 是诚实判定;在 11 项 not-run 之上写 `(FULL area)` 不是。
146150

147151
同一份逐条款表 + 环境准备与测试的耗时之比,回报给维护者(chat),并链接已立的 issue。
148152

153+
## 5. 收口 —— 一张 `qa-run` 记录什么时候才算关闭
154+
155+
立单不是终点,收口是每一轮运行的一部分。RUNNER 的抽取义务条款给的是**抽什么**;本节
156+
给的是**一张记录什么时候才算关闭**,以及关闭这件事在别处怎么被读到。零新标签 —— 下面
157+
每个状态都用现有载体承载。
158+
159+
**开着的 `qa-run` 数 = 未清的收口债**,与裸 `finding` 计数同一构造:它是可直接读的健
160+
康指标,所以⛔ 永不靠关掉记录让它变好看,只靠把下面几件事做完。
161+
162+
**每个 `fail` 落一个四分法处置**,判据是这份记录自己的证据,不是记忆:
163+
164+
| 处置 | 判据 | 动作 |
165+
|---|---|---|
166+
| **产品缺陷** | 被测能力的行为违背它自己声明的契约 | 抽取独立缺陷卡(§4 抽取条款):先查重、立在**修复落地的仓**、⛔ 不挂 pm 标签,正常进分诊 |
167+
| **断言缺陷** | 产品是对的,测试项的 `steps` / `acceptance` 写错了 | 在**拥有该测试项的仓**立 test-fix 卡;条款侧修订照 §3 |
168+
| **过期规格** | 两边都按各自的声明行事,条款钉的是已被裁决改掉的旧形状 | 立 re-point 卡:把条款重新指向现行规格,引裁决 |
169+
| **配对无效** | 该项与这个 subject / fixture 根本不成立(错配的 revision、不适用的环境) | 记 `blocked` 说明,⛔ 不立卡 |
170+
171+
四选一是**穷尽的**:落不进任何一格的 `fail` 说明你还没判完 —— ⛔ 永不把它留成一条无处
172+
置的红行。
173+
174+
与 §4「清单准确性发现归波次锚卡」的分界,是**有没有一条 `fail` 要清**:由 `fail` 判出
175+
的断言缺陷 / 过期规格各自立卡(那条红行得有人负责变绿),运行中顺带看到的清单准确性问
176+
题仍归锚卡收口,⛔ 不抽取。
177+
178+
**`partial` 的覆盖缺口点名,永不丢**:要么按区立 pin 升级卡(把该区缺 `automated.ref`
179+
的项钉起来),要么挂到波次锚卡上。`not-run` 由 §4 的完成判据兜底(交接清单),⛔ 不另
180+
起第二份清单。
181+
182+
**收口评论是机器可 grep 的** —— 一条一行,落在记录 issue 的收口评论里:
183+
184+
```text
185+
Extracted: #缺陷卡号 · area.item · 条款
186+
Parked-on: #锚卡号 · 缺口
187+
Superseded-by: #新记录号
188+
Carried-forward: #旧记录号 · area.item · 判定
189+
```
190+
191+
**抽取出的每张卡,正文带一行溯源**(靠 grep,不靠标签):
192+
193+
```text
194+
QA-source: #运行记录号 · area.item · 条款
195+
```
196+
197+
上面两处的定位字段一律是 §0 的**裸 id 形式 `area.item`**(如
198+
`platform-core.console-login`)—— 解析器、run 记录的逐条款表、抽取卡三处同一把定位
199+
符,才互相 grep 得到;⛔ 不写只有 item 段的短形。**写进 GitHub 正文/评论时⛔ 不要用尖
200+
括号占位符**:`<`+字母会被写入层当标签吃掉,一行溯源就此消失在库里 —— 占位用中文词或
201+
直接填实值。
202+
203+
**Supersede 协议** —— 重跑覆盖了旧记录的地面时,旧记录关闭(`not_planned` + 一行
204+
`Superseded-by:` 指向新记录),但**先把新一轮没有重新判定的判定结转过去**:结转行
205+
(`Carried-forward:`,引旧记录号)落在**新记录**上,supersede 行落在**旧记录**上。⛔
206+
永不用「新的一轮跑过了」直接关掉旧记录:没被重新覆盖的判定会随它一起消失,而记录被关
207+
闭这件事在别处不留任何痕迹。
208+
209+
**重测触发,三条且只有三条**:
210+
211+
1. **发版候选** ⇒ 完整 Tier 1 重跑(§1 的分层)。
212+
2. **QA 抽取的修复卡落地** ⇒ **接受该卡的座位**把受影响的项追加到波次锚卡的重测清
213+
单 —— 与跨仓联动同一纪律:第一产者是接受座位。
214+
3. **维护者点名目标**。
215+
216+
⛔ 其它一切都不是重测触发:凭手感「再跑一遍」只增加收口债,不增加覆盖。
217+
149218
## Guardrails
150219

151220
- **不伪造覆盖。** 缺 fixture → `blocked(fixture)` 带理由;console 没构建 → 构建它

‎.claude/skills/dogfood-verification/SKILL.md‎

Lines changed: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -63,15 +63,22 @@ dev 工作树、dev-server 端口、preview 浏览器全是**共享的**:并行
6363
watcher 只重编译示例应用自己的 `objectstack.config.ts` / `src`,不管工作区的包。
6464
- [ ] 所以:先做完**全部**源码编辑 → `pnpm --filter <pkg...> build` →
6565
`preview_stop` + `preview_start`。不要每修一处就编辑→构建→重启一遍。
66-
- [ ] ⚠️ **消融验证(predict-then-mutate)以最危险的方式继承这一条 —— mutate 与运行
67-
之间要重建,并在报告里写明重建过。** 忘记重建*修复*是假红:费一圈,但会被发
68-
现。忘记重建**消融**跑的是突变前的构建,套件保持**绿**,而这份绿会被记成「测试
69-
已被证明有区分度」—— 给一条可能根本红不了的断言发了证书,之后任何 CI 都暴露不
70-
了它(CI 构建正确,在那边永远绿)。每一腿都是 mutate →
71-
`pnpm --filter <pkg> build` → **证明突变已到达 `dist/`** → 运行:
72-
`node scripts/ablation-dist-preflight.mjs <pkg> '<marker>'` 只在被消费的
73-
`dist/` 真带着突变时才退 0(消融删除守卫时用 `--absent`;restore 腿也要跑它 ——
74-
留在 `dist/` 里的 marker 会让突变代码对该树之后的每次运行保持生效)。
66+
- [ ] ⚠️ **消融验证(predict-then-mutate)以最危险的方式继承这一条,而且它不是 dogfood
67+
专属 —— mutate 腿与 restore 腿各自都要重建,并在报告里写明重建过。** 判据是解析
68+
路径:任何主体经依赖的 `exports` 解析(→ 该包的 `dist/`,且没有 vitest alias
69+
把 specifier 拉回源码)的测试都中招,普通单元套件一样(这批 pair 的台账是
70+
`scripts/check-test-source-alias.mjs` 的 `KNOWN_UNALIASED_TEST_IMPORTS`)。忘记重
71+
建*修复*是假红:费一圈,但会被发现。忘记重建**消融**跑的是突变前的构建,套件保持
72+
**绿**,而这份绿会被记成「测试已被证明有区分度」—— 给一条可能根本红不了的断言发了
73+
证书,之后任何 CI 都暴露不了它(CI 构建正确,在那边永远绿);消融本就为证明**新门
74+
禁能失败**时更毒 —— 那份绿读作「门禁没触发」,指向门禁坏了而不是夹具坏了,会诱人
75+
去弱化一条本来正常的门禁(实测:plugin-auth → core;plugin-email →
76+
platform-objects 则是消融后 375 试假绿、重建后 4 红)。每一腿(mutate **与**
77+
restore)都是:改动 → `pnpm --filter <pkg> build` → **证明它到达了 `dist/`** → 才
78+
读运行结果:`node scripts/ablation-dist-preflight.mjs <pkg> '<marker>'` 只在被消费
79+
的 `dist/` 真带着该状态时才退 0(消融删除守卫、以及每个 restore 腿,用
80+
`--absent`)。⛔ restore 腿最常被跳过 —— 留在 `dist/` 里的 marker 会让突变代码对该
81+
树之后的每次运行保持生效,后面的测量量的是错的树。
7582
- [ ] `dist/` 已 gitignore —— 安全;永不提交构建产物。
7683
- [ ] **`/_console` UI 是 *vendored objectui 构建*,与框架 `dist` 是两回事。** 它由
7784
`.objectui-sha` 钉住、按预构建 bundle 提供。已合并的 objectui 修复 —— *甚至

0 commit comments

Comments
 (0)