范围外发现,记录于 #4663 的前提复验过程中(该单前提已被证伪,详见其评论)。观察类:不构成绕过,门禁照样红,只是诊断质量与同文件的姊妹路径不对称。
事实
packages/spec/scripts/build-schemas.ts 里有两个「读一个受字节纪律约束的committed 产物」的路径,保护程度不同:
| 读取对象 |
位置 |
JSON.parse 保护 |
形状校验 |
authorable-surface.base.json(锚点) |
readCommittedSurfaceBase() L951–982 |
有:try/catch → ❌ ... is not valid JSON (#5235) |
有:baseRev 40-hex + Array.isArray(keys),并给出 git checkout -- / 重锚两条处方 |
authorable-surface.json(本体) |
L595–598 |
无 |
无(L602 直接 surfaceDoc.keys.map(...)) |
// build-schemas.ts:595-598
if (fs.existsSync(AUTHORABLE_SURFACE_PATH)) {
surfaceRaw = fs.readFileSync(AUTHORABLE_SURFACE_PATH, 'utf-8');
surfaceDoc = JSON.parse(surfaceRaw) as AuthorableSurface; // ← 未保护
}
实测
在 e2bfa6ce3(当日 origin/main)的 worktree 里,把 authorable-surface.json 末尾的 } 删掉(模拟一次手编翻车),跑 pnpm --filter @objectstack/spec check:authorable-surface:
EXIT=1
SyntaxError: Expected ',' or '}' after property value in JSON at position 311133 (line 7942 column 1)
at JSON.parse (anonymous)
at path (/…/packages/spec/scripts/build-schemas.ts:597:21)
即:退出码正确(1),但输出是一条 node 栈,而不是这套门禁一贯的「一句诊断 + 一句修法」。同样的破坏打在 .base.json 上,得到的是 ❌ authorable-surface.base.json is not valid JSON (#5235) 加两条处方。
keys 被改成非数组 / 含非字符串项时同理:L602 的 .map(...) / .replace(...) 抛 TypeError,红但无处方。
为什么归为观察类
建议修法(窄)
把 L595–598 对齐 readCommittedSurfaceBase():try/catch + Array.isArray(doc?.keys) 形状校验,失败时输出与字节比对分支(L1536–1546)同族的处方 —— 都是 pnpm --filter @objectstack/spec gen:schema。不需要新增任何语义,只是让这条路径和它的姊妹一样会说话。
关联:#4650(门禁本体)、#5235(锚点 reader,对照实现)、#4663(本发现的来源单)
范围外发现,记录于 #4663 的前提复验过程中(该单前提已被证伪,详见其评论)。观察类:不构成绕过,门禁照样红,只是诊断质量与同文件的姊妹路径不对称。
事实
packages/spec/scripts/build-schemas.ts里有两个「读一个受字节纪律约束的committed 产物」的路径,保护程度不同:authorable-surface.base.json(锚点)readCommittedSurfaceBase()L951–982try/catch→❌ ... is not valid JSON (#5235)baseRev40-hex +Array.isArray(keys),并给出git checkout --/ 重锚两条处方authorable-surface.json(本体)surfaceDoc.keys.map(...))实测
在
e2bfa6ce3(当日 origin/main)的 worktree 里,把authorable-surface.json末尾的}删掉(模拟一次手编翻车),跑pnpm --filter @objectstack/spec check:authorable-surface:即:退出码正确(1),但输出是一条 node 栈,而不是这套门禁一贯的「一句诊断 + 一句修法」。同样的破坏打在
.base.json上,得到的是❌ authorable-surface.base.json is not valid JSON (#5235)加两条处方。keys被改成非数组 / 含非字符串项时同理:L602 的.map(...)/.replace(...)抛 TypeError,红但无处方。为什么归为观察类
--check在解析之前不写任何文件,所以既不会过绿也不会顺手改树(check:authorable-surface在 --check 模式下仍会写json-schema.manifest.json—— 一个「检查」在改工作区 #4711 纪律未退步)。gen:schema重生成」这句话丢了,读者要自己从栈顶行号反推。建议修法(窄)
把 L595–598 对齐
readCommittedSurfaceBase():try/catch+Array.isArray(doc?.keys)形状校验,失败时输出与字节比对分支(L1536–1546)同族的处方 —— 都是pnpm --filter @objectstack/spec gen:schema。不需要新增任何语义,只是让这条路径和它的姊妹一样会说话。关联:#4650(门禁本体)、#5235(锚点 reader,对照实现)、#4663(本发现的来源单)