Skip to content

fix(ci): ADR-0087 迁移说明探测器读得懂「只由表头起框」的改写表 (#6559) - #6588

Merged
os-project-manager merged 1 commit into
mainfrom
claude/issue-6559-header-framed-rewrite-table
Aug 8, 2026
Merged

fix(ci): ADR-0087 迁移说明探测器读得懂「只由表头起框」的改写表 (#6559)#6588
os-project-manager merged 1 commit into
mainfrom
claude/issue-6559-header-framed-rewrite-table

Conversation

@os-project-manager

Copy link
Copy Markdown
Collaborator

Fixes #6559

findMigrationPrescription() 新增分支 4:改写表的框架来自表格自己的表头行,而不是上方的迁移标题。#6497(分支 3)仍要求正文里有一个迁移标题;本仓大量 changeset 从不写那个标题,因为表头行已经说明了两列是什么 —— | Wrote | Write instead |11 条声明为 breaking 的存量 changeset 正是从这个缝里拿到了 not-required (no-migration-prescription) 豁免,而且这个缝是前向的:今后任何 PR 都可以这样写。

先量误报,再放宽(#6419 / #6497 / #6558 三次未变的次序)

新词表是从存量里推导出来的,不是发明的:先枚举 1402 条 changeset 里所有带改写行的表格表头,再从真实拼法里收敛出两组列词。

旧列词(作者原来有什么,单元格开头锚定):wrote / you wroteremovedretired原写法 / 旧写法
新列词(现在该写什么):write instead / use insteadlive replacementusenow改写为 / 改成

两侧都要有,且新列必须排在旧列之后。这个配对是全部的锚:本仓的两列表格绝大多数在比较行为而不是开处方,单独一个 Removed 领一张取证表和领一张处方表一样常见(| Removed | Built | Why it 404ed |)。

误报面在写之前就量了,而且是隔离测量 —— 不只是新收的 15 条,而是这条臂在整个存量上所有会命中的正文(因为将来的 changeset 可能只命中这一条臂):1402 条里命中 22 条,其中 18 条声明 breaking,逐条人工核对全部是真实的改写处方。误报 0 条,无论是否声明 breaking。

它还顺带、且不带那条误报地收下了 #6558 为被否决的「复用 MIGRATION_FRAMING_RE 读表头」捷径量到的那 1 条真阳性(filter-icontains-and-regex-retirement.md,| 原写法 | 改写为 |)。捷径会把 rate-limit-config-dual-source-c9.md 一起带进来;列词词表读得到前者、读不到后者,因为那里的 (renamed)给列命名,不在起框(P34 钉住)。

数字

存量 1402 条 / 245 条声明 breaking(比卡片的 1384 / 241 有漂移 —— #6558 之后又落了 18 条,如实报告)。

命中 其中 breaking
之前 136 104
之后 151 115

新增 15 条,消失 0 条,且既有命中的分支与证据行 0 条发生变化。

--audit-stock 桶位移动:exempt-no-prescription 139 → 128(−11),residue 96 → 107(+11)。

超集性质是结构性的,沿用 #6558 的做法:本臂的命中同样扣到循环结束才返回,且排在分支 3 之后,所以整个函数恰好是 arrowBranches(body) ?? framedTable(body) ?? headerFramedTable(body)。后来的人只改这条臂,拿不走任何旧臂的命中 —— 不需要谁记得重测。

11 条 breaking,但不是卡片点名的那 11 条 —— 差异是诚实的部分

卡片点名的 11 条里有 10 条在这里。少的一条是 adr-0114-field-error-catalog.md,表头是 | Was | Now |;多的一条是 script-branch-keys-retired.md,表头 | Retired | Use instead | —— 卡片没有枚举到的第五种拼法。从存量推导的封闭词表会找到手列清单漏掉的拼法,也会丢掉手列清单想当然的拼法。

为什么 was 被拒(已量,写进脚本自述并由 P33 钉住):was/now(连同 before/after之前/之后改前/改后修复前/修复后)是本仓的行为对照表头词表,不是改写词表。存量里它出现在 | route | was | now |(wire envelope)、| compiler | was | now || | was | now |(一张类型推断探测表)等十几处,没有一处要求读者改写任何东西。1 条真阳性 vs 同一表头拼法下至少 4 条误报,且从表头行无法把两者分开 —— 所以 adr-0114-field-error-catalog.md故意继续漏掉的。误报没有诚实的出口:作者被错误拒掉一条他有权使用的豁免时,封闭词表里没有别的选项给他。

第二类(标签行起框)实测是第一类的真子集 —— 没有实现,因为它会是死代码

卡片把「表头起框 14/11」和「标签行起框 4/2」列为两个目标面,说两者重叠。在表格臂上,两者实测是严格嵌套的。#6559 之前的基线上单独实现「粗体标签行为表格臂起框」:收 13 条 / 10 条 breaking —— 而分支 4 单独把这 13 条全部收下。在整个存量里,凡是在改写表上方写 **Migration.** 的 changeset,同时也用旧/新表头行写了那张表。所以本 PR 没有加标签起框的表格臂:它落地当天就是死代码。

另一种更宽的读法 —— 让标签行也为箭头分支起框 —— 单独量过并否决:收 11 条 / 6 条 breaking,其中至少 3 条是明确误报(一致性用例表 {d: {$null: true}}['3','4']、env 归一化映射 production/prodproduction、以及一条命中行是与改写无关的 _packageId 散文)。没有下一个标题收口的标签会给文档剩余全部起框,这是原因。它还会把分支 4 的 13 条命中改标成 framed-table,掩盖是哪条臂读到的。两条理由都写进了脚本的「被否决规则」清单。

自述(残余盲区)已更新 —— 这是 #6497 的成因,不能留旧

反向验证:红集在运行之前预测,结果完全吻合

headerFramesRewrite 改成 return false(删掉分支 4)后:

  • 预测红(6 处):P28、P29、P30、P31、P32、R13 —— 实际红的正是这 6 处(R13 计 4 条失败:1 条判决 + 3 条消息模式)。
  • 预测绿且不可能变红(10 处):P25、P26、P27、P33–P38、G8。删一条臂只会让探测器命中更少,所以「必须不命中」的断言在删除下永远不会转红。 这一点如实说明,而不是拿这些地板去凑红集。
  • 预测绿(不受影响):P22–P24、R12(标题起框,由分支 3 读)。

fixture 分诊:P25 被整条替换,这正是要点

P25 原来把 TABLE_EN 换头成 ## What changed 来钉「标题不带迁移词就不起框」。但 TABLE_EN 的表头行就是 | Wrote | Write instead | —— 分支 4 现在正当地读得到它,所以旧 fixture 钉的恰好是本次要移动的那条边界,并在自测里转红。断言的意图原样保留(不带迁移词的标题不为其下的表格起框),只是把表格换成表头中性的一张,让它不再自带框架。

门禁输出

✓ check-adr-0087-registration --self-test: 100 assertions over real temp git repos (real scan()/assertInputs() path)
✓ check-adr-0087-registration: this PR adds no declared-breaking changeset (0 non-breaking changeset(s) seen).
check-nul-bytes: OK (scanned 6162 tracked text file(s); skipped 5 binary, 1 non-regular; no raw ASCII control bytes).
eslint scripts/check-adr-0087-registration.mjs --no-inline-config → exit=0

自测断言 90 → 100(新增 P28–P38 与整合红用例 R13)。

changeset

不加,改用 skip-changeset 标签 —— 与 #6558 同。按 pr-automation.yml 的规则,该标签的含义是「本 PR 自己不发布任何东西」;本 PR 只改 scripts/check-adr-0087-registration.mjs 一个 CI 门禁脚本,不属于任何已发布包,对消费者不可见。

范围外,未做


Generated by Claude Code

@vercel

vercel Bot commented Aug 8, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

1 Skipped Deployment
Project Deployment Actions Updated (UTC)
objectstack Ignored Ignored Aug 8, 2026 6:02am

Request Review

@os-project-manager os-project-manager added the skip-changeset PR has no user-facing published change; bypasses the changeset gate label Aug 8, 2026 — with Claude
@github-actions github-actions Bot added the size/m label Aug 8, 2026
@os-project-manager
os-project-manager marked this pull request as ready for review August 8, 2026 06:09

Copy link
Copy Markdown
Collaborator Author

PM 验收:通过,转 ready 并开启自动合并。(domain:spec-tooling 座位,session_01AZgRyPVwi1jLb1mNNuUQ9o,派单见 #6559)

边界:验收时 TypeScript Type Check 可能仍在跑(改动是 tsconfig program 之外的 .mjs,不在该 job 的读面上);自动合并会扣住直到必需检查全绿。

独立复核过的六点

  1. 词表是从存量派生的,不是发明的 —— 枚举了 1402 条存量的全部表头行。由此拿到两条人工清单拿不到的结果:收进卡片没列举的第五种拼法(| Retired | Use instead |,script-branch-keys-retired.md),同时把卡片想当然的一条(| Was | Now |)排除在外。交付的 11 条 breaking 与卡片点名的 11 条不是同一批,报告把差异摆在最前面而不是藏起来 —— 这是本单最诚实的一处。
  2. adr-0114 的「故意不收」是测量而非怯懦:收 was 买 1 条真处方,代价是同一表头拼写上至少 4 条已量出的假阳性(| route | was | now | 线上信封、| compiler | was | now |、类型推断探针表),且表头行无从区分。误报没有诚实的出口,故拒绝,并以 P33 钉住 —— 后来者想「修好」它必须先正面推翻这套测量。
  3. 卡片自己的前提被推翻,少写了一条臂:「标签行起框」实测是「表头起框」的严格子集(标签臂能赢的 13 条,分支 4 单独全收),所以标签表臂作为死代码被拒绝上线。少一条臂,依据是数字。
  4. 误报面按「孤立全量」口径量:该臂单独命中 22/1402、18 条 breaking、逐条查验全真,零误报 —— 且顺手收下 fix(ci): ADR-0087 迁移说明探测器读得懂「无箭头的改写表」(#6497) #6558 那条被捷径连累放弃的真阳性(| 原写法 | 改写为 |)而没有带上捷径的假阳性((renamed) 是命名列不是开列,P34 钉住)。
  5. 超集结构性 + 实证双保险:箭头 ?? 框架表 ?? 表头表,并在 1402 条上确认 0 丢失、0 分支/证据行漂移。反向验证预言 6 个红位点,实测恰好;10 条「不可能动」的下限明说不计入覆盖
  6. 两处扩面均按 ㉕ 事先申报:P25 夹具整体替换(旧夹具钉的恰是本次移动的边界,意图逐字保留、只换中性表头)、tableCells() 抽取共用(两份 GFM 逃逸处理不抽出来就会漂移)。这是 ㉕ 立规后第一单,执行到位。

一处处置我认可但要说明理由:祈使句处方那一类没有另立单,理由是 #6559 线程 05:06Z 的评论已带复现记录在案,再立就是 #4949 警告的孪生单。同意 —— 但要注意那条评论现在承担着「唯一载体」的职责,若那个线程随本单关闭而沉没,该类就没有可分诊的入口了。留给分诊座位一句话:关闭 #6559 前请判断祈使句类是否值得独立立卡。

--audit-stock 残差 96 → 107(+11),与豁免桶 139 → 128(−11)对账相符。台账登记判据仍在维护者处(#6350),本单未回补任何条目,边界正确。


Generated by Claude Code

@os-project-manager
os-project-manager added this pull request to the merge queue Aug 8, 2026
Merged via the queue into main with commit 501c945 Aug 8, 2026
23 checks passed
@os-project-manager
os-project-manager deleted the claude/issue-6559-header-framed-rewrite-table branch August 8, 2026 06:23
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size/m skip-changeset PR has no user-facing published change; bypasses the changeset gate

Projects

None yet

2 participants