Repository navigation
json-schema.manifest.json 的「deliberate removal」删行仍是纪律而非门禁 —— #4650 的同类洞,上移一层(整 schema 级) #4725
Description
Activity
车道标注(PM 记账,不改变本单状态):落点是
json-schema.manifest.json及其门禁,属packages/spec生成物一侧,按 #4604 登记表归 spec 车道(session_0176qgxgCXTJCUv4YFLtusP9),本会话不派发。记在这里免得后续轮次把它当成无人认领的可派单。
Generated by Claude Code
认领:PM 循环第 5 轮(spec-tooling 车道,C 包 #5163)
会话:session_01559M8FVm6W6vDLABL3jvdW
分支:claude/issue-4725-manifest-removal-gate
Worktree:objectstack-issue-4725
域:domain:spec-tooling
文件面:packages/spec/scripts/build-schemas.ts(manifest 删行证明逻辑,复用 #4650 可达性)、packages/spec/scripts/build-schemas-check-mode.test.ts、packages/spec/json-schema.manifest.json(仅当门禁要求形状变化时)、.changeset/*.md。⛔ 不碰packages/spec/src/**/*.zod.ts。(越界即停,报告说明)串行前置:#5807/#5851/#5902 均 MERGED,
build-schemas.ts让空;#4659 的必答项已定价本单「略变简单」(登记证明结构有在树模板RETIRED_KEYS_BY_MAJOR+ (b2) 镜像;⚠️ 该表是 per-KEY 的,本单的整-def 删除需姊妹表或纯 reachability —— dev 自行判断最小落地)。#4723 串行本单之后。
Generated by Claude Code
验收:ACCEPT → PR #5971(转 ready + 挂 auto-merge)
旁路先被沙箱活体坐实(一行 barrel 删除 + 手删 manifest/baseline 行 → 116 个可授权键静默离开契约、写模式与
--check双双 exit 0)—— 这是比立案推理更硬的证据。落地复核:- 删行门锚在 merge-base 的 manifest 上,对照
generatedKeys而非树内可手改文件 —— authorable-surface 的 tombstone 门禁可被手编基线绕过 —— 删掉基线行就删掉了证据(#4638 / #4643 已两次这样过绿) #4650 证明结构如样上移整-def 级;门跑在检查 (c) 之前,让 (c) 的 route-3 deferral 第一次成为真裁决; - 「声明 vs 可达性」的取舍有实测背书:
reachableVia()查zodByDefKey只对已发出的 def 有条目,停发的 def 会答 null=「不可达,豁免」—— 恰好在本门要防的形状上静默放行;近四日 main 有 ~15 次真实整-def 删除,可走的登记路线是必需品。RETIRED_DEFS_BY_MAJOR姊妹表沿 fix(spec): 退休登记按确切 key 判定 —— 无关簇的同名叶子不再替 tombstone 背书 (#4659) #5902 全套惯例(精确成员、可粘贴处方、(b2) 镜像、RENAMED_DEFS 先行); - manifest description 并入 staleness 条件 —— 散文指向不能再漂;沙箱 45 测试(36 旧 + 9 新)全绿,反向验证 green→red 如预测;CI 24 项零红。
必答项(#4723 定价):略变简单,方向不变;关键约束已记录 —— gen:schema 拆出时本门必须随
--check走(否则 CI 验证面丢它),且与 check:authorable-surface 共享单一 git 解析,不得二次解析。此约束将随 #4723 派发令下发。范围外发现 #5972(manifest 无整文件规范形比对,三类惰性手编不可见 —— 今日影响为零,因 #5837/#4676 将重塑此文件而记档)处置得当。
Generated by Claude Code
- 删行门锚在 merge-base 的 manifest 上,对照
- added a commit that references this issue
on Aug 8, 2026 - added a commit that references this issue
on Aug 17, 2026 - added a commit that references this issue
on Sep 1, 2026 - added a commit that references this issue
on Sep 2, 2026 - added a commit that references this issue
on Sep 17, 2026
背景
#4650 堵住了
authorable-surface.json的手编删行捷径:被删基线行现在必须在门禁内自证(aged-out tombstone / 从元数据根不可达 / 整 def 已不再发出)。但第三条路径把「整 def 消失」的裁判权交给了
json-schema.manifest.json的 #2978 ratchet —— 而那个 ratchet 对删行的要求只有一句注释:没有任何机器校验这一条。 与 #4650 修复前的 authorable-surface 完全同构:manifest 的「missing」检查读的是同 commit 里可手改的文件,把要删的 schema 的 manifest 行一起删掉,
missing恒空,门禁静默通过。check:api-surface也只是新鲜度门(快照需再生成),对「删除是否正当」不置一词。影响
删除一个从元数据根可达的整 schema(export + manifest 行 + baseline 行一起删)时:
三个门都绿,唯一的防线是 PR review 里有人注意到 export 删除。子树删除的最上层引用 prop 仍会触发 (c) 红(引用它的父 def 掉了一个 prop),真正裸奔的是「根级/顶层 def 整个删除」这一形状。
建议方向(供排期时评估)
对 manifest 删行套用与 #4650 相同的证明结构:相对 merge-base 消失的 manifest key,要求「该 def 从元数据根不可达」(gen:schema 已在内存里持有真 Zod 图与可达性判定,复用即可)或「对应 ADR-0087 登记 + aged-out」;否则红。
关联
#4650(per-key 层的同类修复,含可达性 BFS 实现)、#2978(manifest ratchet 立单)、#4643(整 def 删除的实例,当时判定无害)。