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

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions