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

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions