从 #4912(PR 修 passthrough 对象被塌缩成 record)的实现中发现的**同类但独立**的缺陷,记录在该单的 out_of_scope_findings 并按 PD#10 立案。**未认领。** ## 症状 `packages/spec/scripts/lib/format-type.ts`(#4912 前为 `build-docs.ts` 内联)的数组分支直接把 `[]` 拼在元素渲染结果后面: ```ts return `${formatType(prop.items, ctx)}[]`; ``` 当元素本身渲染成**顶层联合类型**时,`[]` 的结合优先级高于 `|`,于是单元格印出的类型和 schema 表达的类型**不是同一个**: | schema 表达 | 参考页印出 | 印出的东西实际含义 | |:---|:---|:---| | 数组,元素为 `string` 或 `number` | `string \| number[]` | 「一个 string,**或者**一个 number 数组」 | | 数组,元素为 `string` 或 `{ field, label? }` | `string \| { field: string; label?: string }[]` | 同上,顶层被拆成二选一 | 正确写法需要括号:`( string \| number )[]`。 ## 规模 对当前 `json-schema/` 全量语料跑修好的 `formatType`,再按深度扫描顶层运算符统计:**164 个数组站点**的元素渲染出顶层 `|`。样例(schema 文件 → 渲染结果): - `CreateViewRequest.json` → `string \| number[]` - `CreateViewRequest.json` → `string \| { field: string; label?: string }[]` - `CreateViewRequest.json` → `string \| number \| boolean[]` - `Agent.json` → `string \| { type: string; params?: Record< string, any > }[]` - `AiModelsResponse.json` → `string \| { id: string; label: string; default: boolean }[]` - `AppDefinitionResponse.json` → 两个对象变体的联合 + `[]` ## 与 #4912 的关系(为什么没在那个 PR 里顺手修) #4912 的修复**引入**了交叉类型元素(`{ 已声明键 } & Record< string, any >`),它有一模一样的优先级问题(`A & B[]` 是 `A & (B[])`)。那一处是该 PR 自己造成的,所以在 PR 内用 `hasTopLevelIntersection()` 深度扫描加了括号,并**只限定 `&`**: - 联合的 164 处是**既有**缺陷,早于该次渲染器改动; - 一并修会让那个 PR 的重生成 diff 从 12 行涨到 ~170 行,真正的 passthrough 修复会被埋掉。 `format-type.ts` 里已留注释指向本单。修法应当很短:把 `hasTopLevelIntersection` 放宽成 `hasTopLevelUnionOrIntersection`(深度扫描已经会正确忽略 `{}` / `< >` / `[]` / `()` 内的运算符),然后 `pnpm --filter @objectstack/spec gen:docs` 重生成并逐页确认。`packages/spec/scripts/format-type.test.ts` 已有该处的括号/非括号用例,照着加联合用例即可。 ## 为什么值得修 参考页的类型单元格正是 AI 元数据作者直接抄的那一行(和 #4570 让 import 示例只能来自真实导出面是同一条理由)。一个印出 `string \| number[]` 的单元格会让作者写出 `string`,而 schema 要的是数组 —— 声明与呈现不符,正是 #4001 战役在追的那类问题。 关联:#4912(同一渲染器,交叉类型侧已修)、#4001(战役)。
Activity
fix(spec): render declared keys + openness for passthrough objects in…
baozhoutao commentedon Aug 6, 2026
认领:PM 循环第 1 轮(spec-tooling 车道,C 包 #5163)
会话:
session_01559M8FVm6W6vDLABL3jvdW分支:
claude/issue-5338-union-array-bracketsWorktree:
objectstack-issue-5338域:
domain:spec-tooling文件面:
packages/spec/scripts/lib/format-type.ts、packages/spec/scripts/format-type.test.ts、content/docs/references/**(gen:docs整体重生成,预期 ~164 处单元格变化)、.changeset/*.md。⛔ 不碰packages/spec/src/**。(越界即停,报告说明)串行声明:#4912 已合入解锁本单;#5340(长枚举)与 #4696(裸名索引)同渲染器文件族,本轮不派,串行在后。
Generated by Claude Code
baozhoutao commentedon Aug 6, 2026
验收:ACCEPT → PR #5793(已转 ready 入队)
修法即立案建议:
hasTopLevelIntersection放宽为hasTopLevelUnionOrIntersection([]对|与&同样不满足分配律,一条规则一次扫描)。重生成 19 页 / 42 行单元格 / 47 处补括号,零新增页、零复活页,check:docs240 文件不动点。CI 24 检查零红。立案口径更正(记录在案):正文的「164 处」是对
json-schema/全语料按节点扫描的原始站点数(同一共享 shape 每个引用处各计一次);dev 复测为原始 415 站点 → 去重 22 个不同单元格字符串 → 页面上 42 行。修复后同一探针报告未加括号站点为 0,覆盖完全 —— 两个数字是两种分母,不是漏修。测试:format-type.test.ts 新增 7 用例(含真实
AiModelsResponse.models/View.list.filter[].value标本);反向验证收窄回&时 5 条新 pin 变红、#4912 交叉侧 pin 全绿。authorable-surface.base.json污染(#5358)已核实剔除。Generated by Claude Code
fix(spec): parenthesize union elements before `[]` in reference type …