Skip to content

ADR-0087 探测器 branch 1 仍有一条**过匹配**残留:硬换行把「提及」折到行首后仍被读成标签 #7094

Description

@os-project-manager

#6967 的 dev 提交(它在 ~10 分钟内三次尝试查重均被 GitHub 限流打回,拒绝在未查重的情况下立单——这个克制是对的;查重由座位补做,见文末)。未认领、未定级,定级归分诊。

出处:#6967 / PR #7078(labelPositioned + carriesConcreteRewrite 落地)。

残留

#7078 把「记号被使用」与「记号被提及」区分开的判据,是看占位符紧邻前方由什么支配:只有标记、句子边界或框定词时算标签。

本仓散文硬换行在 ~80 列。于是一条「提及」的 FROM → TO 若恰好折到新行开头,它就位于第 0 列、紧邻前方什么也没有——支配它的那个词在上一行。判据据此把它读成标签,过匹配依旧。

活体标本:.changeset/changelog-ships-in-tarball.md

…changesets to carry their
FROM → TO migration because…

their 在上一行,FROM 在行首。语义上是提及(说的是「changeset 各自携带处方」这件事),形状上是标签。

今天为什么还够不成伤害

该 changeset 不声明破坏性,因此从不被门禁judge——所以是观察类,不是活缺陷。危害要等到某天一条声明破坏性的 changeset 恰好在这个位置折行。

⚠️ 为什么值得立卡,而不是只写进代码注释

这是 dev 的论证,座位认同:

findMigrationPrescription 此前三次修复(#6419 / #6497 / #6559)在块注释里记录过的残留,全部是欠匹配——它们只会多给一次豁免,后果是漏登记,可由 --audit-stock 事后扫出来。

本条是过匹配,与 #6967 本身同属硬卡作者的危害类:命中之后四条处置全堵,作者唯一能做的是去改写一句本身为真的散文。欠匹配和过匹配不该按同一档记录。

已经做了什么

残留已写进门禁的块注释与 labelPositioned 的文档注释,并写明了为什么没有尝试跨行前缀判据:一个折行的标签同样常见,仅凭上一行无法把两者分开。所以这不是「忘了处理」,是一个已知且有理由的边界——立卡是为了让它可被检索、可被分诊定级,而不是只活在一个文件的注释里。

修法方向(不主张)

若要收口,需要的是比「上一行」更强的信号——例如判断上一行是否以句子终止符结尾、或该段落整体是否构成处方块。⚠️ 任何收紧都必须先在存量上测「带走多少条真处方」:#7078 实测过两条更宽的判据,其中一条会带走 5 条真处方(含一条声明破坏性的 app-dead-authoring-keys.md)。先测后写在这条分支上已经有两次教训。

查重(座位补做,dev 当时被限流)

labelPositioned / from-to-label / hard-wrapped / over-match 检索开放单:零同题命中(七条结果分别是 driver-sql $regex_unpublishedsearchableFields 等无关面)。按 #4949 纪律执行。

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions