Skip to content

#6148 门禁的迁移说明探测器读不到「无箭头的两列改写表」—— not-required (no-migration-prescription) 可被合法豁免绕过,存量已见 4 条同形 #6497

Description

@os-project-manager

#6350 的存量回补审计(PR 见下)里测出来的。未认领。

事实

scripts/check-adr-0087-registration.mjsfindMigrationPrescription()not-required (no-migration-prescription) 这条豁免的唯一守门人:正文带改写指令 ⇒ 拒绝该豁免。它有两条分支,#6419 修过一次:

  1. FROM / TO 标签约定;
  2. 带迁移框架的改写 —— REWRITE_RE 要求一个 X 箭头 Y,两侧都是代码形。

两条分支都要求出现箭头。而本仓相当一批 changeset 把改写指令写成 ## Migration 标题下的两列 markdown 表,一个箭头都没有:

## Migration

| Wrote | Write instead |
| --- | --- |
| `new HttpServer(new HonoHttpServer(port))` registered as `http.server` | register the `HonoHttpServer` directly |
| `import { HttpServer } from '@objectstack/runtime'` | remove it — tsc reports this one |

这是 runtime-httpserver-wrapper-retired.md(#5122)的真实正文。探测器判它 无迁移说明,于是这条 changeset 落进 exempt-no-prescription 桶 —— 它够不着门禁的残差面

实测口径(当前存量,1372 条 changeset)

  • 13 条 changeset 带「迁移框架标题下的无箭头两列改写表」;
  • 其中 4 条声明为 breaking 且当前正是靠这条盲区拿到豁免:runtime-httpserver-wrapper-retired.mdetl-author-shape-aliases.mdretire-three-deprecated-aliases.mdunknown-key-strictness-ui-batch15.md。修好探测器后这 4 条会从 exempt-no-prescription 移入残差面。

复现:node scripts/check-adr-0087-registration.mjs --audit-stock(PR #6350 半边新增的一次性审计口),runtime-httpserver-wrapper-retired.md 不出现在残差列表里。

为什么这是前向问题,不只是存量问题

门禁是前向的,而这条盲区同样前向:今后任何一个 PR,只要把迁移说明写成表格而不是箭头,就可以合法地写下 not-required (no-migration-prescription),门禁会批准这条自相矛盾的豁免 —— 正是 #6419 那个形状的第三种拼写。#6419 的教训逐字适用:「作者写得越认真,探测器越看不见」—— 一张写清了「原来怎么写 / 改成怎么写」的表,比一行箭头信息量更大,却恰恰是探测器唯一读不到的形状。

顺带:脚本正文里那段「残余盲区」自述目前只说 未加框架 的改写表读不到(128 changesets ... 21 of them declared-breaking)。上面这 4 条是加了框架的,所以那段自述本身也不完整,应一并改写。

明确不主张具体改法

候选各有代价,需要先量化误报面:把表格行(| 分隔、两侧各带反引号代码段)在迁移框架下也算作改写,是最直接的一条,但 changeset 正文里的表格用途很杂(能力矩阵、行为对照、版本对照),放宽之前要照 #6419 的做法把误报数先测出来 —— 那次的结论是「一条诚实收窄的探测器胜过一条吵闹的」,因为误报没有诚实的出口:作者被拒掉一条他有权使用的豁免,而封闭词表里没有别的选项给他。

按 startup focus,先把事实与数字记在案,由 PM 分诊定级。


Generated by Claude Code

Metadata

Metadata

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions