Repository navigation
Description
发现于 #5013 的全仓别名一致性闸门(范围外,未指派)。观察类:实测当前无缺陷,
记录的是覆盖边界本身。
现状
#5013 新增的 packages/spec/src/shared/alias-integrity.test.ts 判定的是
strictObject(...) 建的表——它靠 strictObjectDeclarations() 在构造期登记,
所以能拿到运行时 .shape。235 个 surface 被判定。
但 strictObject 不是唯一的入口。helper 之前的老接线直接调
strictUnknownKeyError({ surface, knownKeys, aliases, guidance, history }),
自带一份手抄的 knownKeys 数组,这些表根本不进登记表:
44 个调用点,分布在 14 个文件
data/object.zod.ts、automation/flow.zod.ts、security/permission.zod.ts、
ui/app.zod.ts(9 处)、data/datasource.zod.ts(6 处)、automation/approval.zod.ts(4 处)、
data/driver/{sqlite,mongo,memory,postgres,mysql}.zod.ts、data/hook*.zod.ts、
security/{rls,sharing}.zod.ts、identity/position.zod.ts、
ui/{action,bulk-action}.zod.ts
ui/action.zod.ts 的 ActionParamSchema 就是其中之一——#5013 修的是同一个文件里
ActionSchema 的表,而同文件的 param 表当时不在任何闸门下。
实测结论:干净
临时给 strictUnknownKeyError 加了登记后跑同样两条判据(别名 key 不得是已知键、
别名 target 必须是已知键)+ guidance key 判据,51 张表全部通过,唯一的报告集中在
ui/app.zod.ts 的 navigation item 系列,那是刻意的散文式 target
(type: 'url' (with url)),不是键名,属于另一种写法而非缺陷。
所以这条是「暂时没事,但没人看着」,不是待修 bug。
已做的缓解
#5013 在闸门里放了一条只减不增的棘轮,把这个数钉在 44:
expect(uncovered.length).toBeLessThanOrEqual(44);迁一个到 strictObject 是免费的;新增一个直接调用点会红,逼作者显式选择。
建议(两条路,选一)
- 收编判定:让
strictUnknownKeyError也登记{surface, knownKeys, aliases, guidance},
闸门对这批按knownKeys判定。便宜,但判的是手抄数组而不是 shape——
数组本身与 shape 漂移仍无人看守(那正是strictObject存在的理由,
见其 docblock「the array is a second copy of the truth」)。 - 迁移到
strictObject:一次性消掉手抄数组,这批自动进入现有闸门,
棘轮随之降到 0。工作量大得多,但把两个问题一起消掉。
倾向 2,分批做;1 可以作为过渡期的看守。
复现日期 2026-08-05,基线 origin/main ed0d2aa。
Activity
docs(spec): name the two filed findings in the gate's coverage bounda…
os-zhuang commentedon Aug 5, 2026
补一条边界更新(来自 #5481 / PR #5516,不另开 issue —— 这落在本 issue 的完成范围内:无论走路线 1 还是路线 2,这批表都会自动进入闸门的全部判据)。
#5481 给
alias-integrity.test.ts加了第三条判据:一张表内任意两个别名 key 的aliasProbe不得相同(归一化后撞车的两条共用一个下标,后写的静默覆盖先写的 ——snap.grid因此被指向布尔的showGrid)。对本 issue 的影响是:这 44 个直接调用点现在处于三条判据之外,而不是两条。
值得说明的是本 issue 正文里那次"实测干净"的结论:当时临时登记后跑的是"别名 key 不得是已知键 + 别名 target 必须是已知键 + guidance key"这三条,第三条 probe 判据当时还不存在,所以那次测量并没有覆盖撞车这一类。也就是说这 44 张表在 probe 撞车上目前是未测量,而不是"已测干净"。
参考量级:在已覆盖的
strictObject那 235 张表里,probe 撞车实测有 4 条(1 条活缺陷 + 3 条休眠冗余),PR #5516 已清零。同样的密度是否存在于这 44 张表里没人知道,所以这条不是"再加一个待办",而是把本 issue 那句"暂时没事,但没人看着"里的**"暂时没事"缩小到了两条判据的范围**。对路线选择没有改变倾向:路线 2(迁到
strictObject)仍然一次性解决全部三条;路线 1(让strictUnknownKeyError也登记)同样能顺带覆盖 probe 判据,因为这条判据只读别名表本身、不需要 shape —— 它是三条里唯一不依赖 shape 的,所以哪怕只做路线 1 的过渡看守,也能立刻把它开起来。Generated by Claude Code
os-zhuang commentedon Aug 5, 2026
分诊轮判级(spec 车道 PM,
session_018fxLGQdatPbBUvCgiVxg6D,2026-08-05):晋级(摘finding挂pm:queue)。理由:#5481 落地后事实已变 —— 44 个直调点现处三条判据之外且 probe 维度未测量(非已测净,见 #5481 dev 的追记);过渡路线 1(让strictUnknownKeyError登记)可立即把 probe 判据开到这批表上,只减不增棘轮已在位。排存量批次。Generated by Claude Code
os-zhuang commentedon Aug 5, 2026
PM 认领(spec 车道 PM,
session_018fxLGQdatPbBUvCgiVxg6D,2026-08-05)claude/issue-5483-strict-unknown-registry../objectstack-5483-strict-unknown(基于最新origin/main)domain:specstrictUnknownKeyErrorhelper 所在的 shared 严格性模块 +shared/alias-integrity.test.ts;不改 44 个调用点本身(路线 1 过渡看守){surface, knownKeys, aliases, guidance},三条判据全开,probe 判据不依赖 shape 可全量开启;ui/app.zod.ts散文式 target 走显式豁免、不许静默放过)。路线 2(44 点分批迁strictObject)本单不做,由 dev 另立跟进 issue。若登记机制被迫要改调用点(含在飞 [spec] 退役 HookContext session.roles —— #4839 双删后零消费方零生产方(ADR-0049) #5050 的data/hook*.zod.ts),停手回报,PM 重新排程Generated by Claude Code
os-zhuang commentedon Aug 5, 2026
验收通过(spec 车道 PM,
session_018fxLGQdatPbBUvCgiVxg6D,2026-08-05)—— PR #5609,路线 1 按裁定落地。strictUnknownKeyError工厂首行;strictObject内部调用显式抑制(防双登记与测试顺序漂移);独立登记表不与 shape 背书的那张合并——成色不同不混账。data/object.zod.ts延迟表)。expanded别名在八个变体上二次拒绝)——issue 正文「实测干净」被证伪:当时这批被误归给散文 target。已立ui/app.zod.ts导航项:4 条expanded别名在另外 8 个变体上把作者指向该变体同样拒绝的键(二次拒绝) #5555,闸门内钉结构化只减不增容差(≤32),第五种拼法即红(反向验证 C 已证)。strictUnknownKeyError直调点批量迁到strictObject,棘轮降到 0(路线 1 消不掉手抄数组与 shape 的漂移) #5593(路线 2,含三个已知迁移坑)已立。check:api-surface/check:generated未在本地跑(构建锁排队),由 CI 兜底——落地前以 PR 的 Test Core / TypeScript Type Check 绿为准。落地暂缓:等 #5604(main 全仓红)修复后合 main 重跑 → ready → auto-merge。
Generated by Claude Code
fix(spec): 别名表必须是对 schema 的真断言 —— 修 12 条存量 + 全仓闸门 (objectstack-ai#5013)…
test(spec): 别名一致性闸门收编 44 个 strictUnknownKeyError 直调点 —— probe 撞车维度首测 (o…
docs(agents): os-dev isolates scratchpad temp files in a per-issue su…