Skip to content

观察项:json-schema.manifest.json 没有 #4662 那样的「整文件规范形态」比对 —— 不改变键集的手编至今无人可见 #5972

Description

@baozhoutao

类别:observation-class(今天没有用户会撞上,不带 pm:queue)。在 #4725 的实现过程中顺手量到,按 Prime Directive #10 记账,不在那个 PR 里修。

事实

authorable-surface.json#4662 起被整文件和它的规范序列化比对:

// build-schemas.tsconstcanonicalSurfaceText=JSON.stringify(canonicalSurface,null,2)+'\n';constsurfaceChanged=surfaceRaw!==canonicalSurfaceText;

理由写在那里:#4662 抓到的是一个被手工规范化过的 description 破折号,一个只比对键集的检查永远看不见它 —— 而「这个文件的字节必须全部来自生成器」正是 #4650 的证据链所依赖的。

它的同胞 json-schema.manifest.json 没有这一层。写触发条件只有:

constmanifestChanged=!manifest||added.length>0||renamedAway.length>0||descriptionStale;

(descriptionStale#4725 刚加的,只覆盖 description 一项。)

因此对以下手编,今天没有任何门禁会说话

  • 重排 schemas 数组(生成器写的是 .sort());
  • 缩进 / 尾换行改动;
  • 重复条目——重复的键既不在 missing(它被产出)也不在 added(它在 manifest 里),manifestChanged 恒 false,重复项会一直留着,直到别的改动碰巧触发一次重写。

added / missing / #4725 的 merge-base 删除门都是集合判定,对上面三种都免疫。

影响评估(诚实版:今天为零)

三种都不改变任何门禁的判定结果,也不改变任何消费者行为 —— manifest 只被 build-schemas.ts 自己读。所以这不是缺陷,是同一个文件家族里两种不同的严格度:一个说「每一个字节都必须来自生成器」,另一个说「键集对就行」。

记下来的理由是它会变得重要:#4725 之后 manifest 是一道删除门的输入(虽然那道门读的是 merge-base 的那份,PR 改不动),而 #5837(按 category 分片三个单体 ratchet)和 #4676(投影类生成物是否该退出仓库)都会重新动这个文件的形状 —— 谁先落地,谁最省事地把两边的严格度对齐。

可能的修法(供 triage,不预设)

把 description 与键集的两个条件合并成一个「整文件 vs 规范序列化」比对,和 authorable-surface.json 同形;--check 报告、写模式重写,沿用现有的 #4711 分叉。代价是任何格式漂移都会要求跑一次 gen:schema,和另外七个生成物一致。

关联

#4662(authorable-surface 的整文件比对是怎么来的)、#4725(本观察项的来源,manifest 删除门)、#5837#4676


Generated by Claude Code

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