Skip to content

json-schema.manifest.json 的「deliberate removal」删行仍是纪律而非门禁 —— #4650 的同类洞,上移一层(整 schema 级) #4725

Description

@os-zhuang

背景

#4650 堵住了 authorable-surface.json 的手编删行捷径:被删基线行现在必须在门禁内自证(aged-out tombstone / 从元数据根不可达 / 整 def 已不再发出)。

但第三条路径把「整 def 消失」的裁判权交给了 json-schema.manifest.json 的 #2978 ratchet —— 而那个 ratchet 对删行的要求只有一句注释:

remove a key ONLY for a deliberate retirement

没有任何机器校验这一条。 与 #4650 修复前的 authorable-surface 完全同构:manifest 的「missing」检查读的是同 commit 里可手改的文件,把要删的 schema 的 manifest 行一起删掉,missing 恒空,门禁静默通过。check:api-surface 也只是新鲜度门(快照需再生成),对「删除是否正当」不置一词。

影响

删除一个从元数据根可达的整 schema(export + manifest 行 + baseline 行一起删)时:

  • authorable-surface 检查 (c):def 不再发出 → 按路径 3 放行(打印 notice,指向 manifest ratchet);
  • manifest ratchet:行已删 → 绿;
  • api-surface:再生成即绿。

三个门都绿,唯一的防线是 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 删除的实例,当时判定无害)。

Activity

  1. os-zhuang commented on Aug 3, 2026

    @os-zhuang
    ContributorAuthor

    车道标注(PM 记账,不改变本单状态):落点是 json-schema.manifest.json 及其门禁,属 packages/spec 生成物一侧,按 #4604 登记表归 spec 车道(session_0176qgxgCXTJCUv4YFLtusP9),本会话不派发。

    记在这里免得后续轮次把它当成无人认领的可派单。


    Generated by Claude Code

  2. self-assigned this
    on Aug 6, 2026
  3. baozhoutao commented on Aug 6, 2026

    @baozhoutao
    Contributor

    认领: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

  4. baozhoutao commented on Aug 6, 2026

    @baozhoutao
    Contributor

    验收:ACCEPT → PR #5971(转 ready + 挂 auto-merge)

    旁路先被沙箱活体坐实(一行 barrel 删除 + 手删 manifest/baseline 行 → 116 个可授权键静默离开契约、写模式与 --check 双双 exit 0)—— 这是比立案推理更硬的证据。落地复核:

    1. 删行门锚在 merge-base 的 manifest 上,对照 generatedKeys 而非树内可手改文件 —— authorable-surface 的 tombstone 门禁可被手编基线绕过 —— 删掉基线行就删掉了证据(#4638 / #4643 已两次这样过绿) #4650 证明结构如样上移整-def 级;门跑在检查 (c) 之前,让 (c) 的 route-3 deferral 第一次成为真裁决;
    2. 「声明 vs 可达性」的取舍有实测背书:reachableVia() 查 zodByDefKey 只对已发出的 def 有条目,停发的 def 会答 null=「不可达,豁免」—— 恰好在本门要防的形状上静默放行;近四日 main 有 ~15 次真实整-def 删除,可走的登记路线是必需品。RETIRED_DEFS_BY_MAJOR 姊妹表沿 fix(spec): 退休登记按确切 key 判定 —— 无关簇的同名叶子不再替 tombstone 背书 (#4659) #5902 全套惯例(精确成员、可粘贴处方、(b2) 镜像、RENAMED_DEFS 先行);
    3. 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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions