Skip to content

check:authorable-surface--check 模式下也会重写 authorable-surface.base.json —— 一次纯核验会改工作区,且任何无关 PR 都能因此静默推进删除门的锚点 #5358

Description

@os-zhuang

#4912(PR #5339)的 os-regen 同步中记录的观察,由该单 dev 发现并如实上报而非自行处置。未认领。

现象

packages/spec/scripts/build-schemas.ts 每一次运行都会重新锚定 packages/spec/authorable-surface.base.json,包括 --check 模式。实测:在干净工作树上跑 pnpm --filter @objectstack/spec check:authorable-surface,该文件被改写。

两个独立的后果:

1. 一个「检查」写工作区(与 #4723 同类)

check:* 应当是只读判定。这条与 #4723(check:docs 第一步 gen:schema 改工作区,#4711 的残洞)是同一类缺陷的另一处实例:核验动作带副作用,于是「跑一次门禁」和「产生一次改动」无法分辨,本地跑完门禁再 git add -A 就会把它捎带进任何 PR。

2. 更要紧的:删除门的锚点可以被无关 PR 静默推进

authorable-surface.base.json 的作用是给删除门(ADR-0078 完整性闸门一族)提供基线。它自己的描述写着该文件「written only from a git-resolved baseline — never from the build that is being checked」。

但既然任何一次 build/check 都会重锚,那么:一个与可授权面完全无关的 PR(比如 #5339,一个只改文档渲染器、packages/spec/src/** 零改动的 PR)只要在本地跑过门禁并提交了工作区,就会把 baseRev1c3da1f 推进到 c89d18c,连带把 110 个 ui/ComponentAnimation 族的键从记录中抹掉 —— 而那正是 #4988/#5321 刚刚退役的那批。锚点一旦推进,删除门就看不见那次退役了,而且两种状态门禁都判绿,没有任何信号。

PR #5339 的 dev 正是察觉到这一点后刻意把该文件保持在 main 的字节并上报,没有自行决定。CI 不受影响(CI 从不提交这次重写),风险面完全在本地工作流。

为什么值得修

这是「声明与强制不符」的门禁版本:文件自称只从 git 解析的基线写入,实际每次构建都重写;门禁自称核验,实际改工作区。而它守护的恰恰是退役是否被如实记录——一个可以被无关改动静默推进的锚点,等于这道门在最需要它的时候可以被无声关掉。

建议修法(未验证,留给分诊)

关联

⛔ 注意:本单不是#5339 做错了什么 —— 它刻意保住了 main 的字节并上报,处置正确。

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions