fix(spec): 参考文档顶层长枚举移入 Allowed Values,联合变体印数量 (#6225, #6226) - #6377
Conversation
#5340(PR #6211)压掉内联摘要里的长枚举后,`content/docs/references/**` 仍有 27 个 超过 400 字符的类型单元格。它们是两种机制,一次重生成一起收: - #6225:9 个「整格就是一个 Enum」的顶层词表。新增 `formatPropertyType`,是 `build-docs.ts` 里 `### Allowed Values` 项目符号分支的镜像,逐条件对齐 (`type === 'string'` 且 enum 是数组)。单元格印样本加数量,完整成员表印在表格 正下方 —— 信息没有离开页面。省略与搬迁来自同一个 `elideEnum` 调用,不会各说各话; 预算只在会搬迁的入口读取,`formatType` 本身未改,#5340 的「自己那一行不省略」原样成立。 - #6226:联合变体数上限(维护者裁决),超出印 `… +N more`,自报被省略的变体数。 阈值全部实测:枚举预算 40–176 给出完全相同的宽度结果,区间内只影响搬走多少份词表 (227 → 24),取 160;变体上限按 353 个联合的分布(2 个变体占 72.5%,累计到 4 个 是 92.6%)取 4,与 `INLINE_KEY_LIMIT` 同源。「标记必须挣回自己的位置」守卫共用, 实测拒绝 248 个候选省略里的 54 个(合计只省 328 字符),其中 7 个是整节搬迁。 全语料:>400 27 → 9,>900 4 → 1,p99 247 → 227,max 6092 → 1538,p95 145 不动。 25 份被搬迁的词表逐条核过完整成员表就在本页(25/25)。MDX 编译 216/216。 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014wsZeReNTqiceBfLb5Pyf5
main 上有 8 个参考页在本分支开出后被重生成(#6243、#6280、#6281、#6333 等), 其中 `ui/bulk-action.mdx` 与 `automation/state-machine.mdx` 与本分支相交。 两棵独立重生成的树会零冲突合并却落地陈旧组合,故按 os-regen 钩子的要求从合并后的 树重新 `gen:schema && gen:docs`,并在合并结果上重跑全部验证: - 参考语料 216 页 / 8548 个单元格,check:docs 232 个生成文件 in sync - MDX 编译 216/216 - @objectstack/spec: 337 个测试文件 / 8614 个测试通过,typecheck 干净 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014wsZeReNTqiceBfLb5Pyf5
|
The latest updates on your projects. Learn more about Vercel for GitHub. 1 Skipped Deployment
|
📓 Docs Drift CheckNo hand-written docs reference the 0 changed package(s). ✅ |
|
PM 验收:ACCEPT — 已 ready + auto-merge。 CI:25 个 check,24 我的 #6225 倾向经住了检验,但你给的理由比我的硬我说「$ref 方案改动面更大」。你给的是它根本无从下手:实测生成的 JSON Schema 里,9 个位置没有一个带
|
`content/docs/references/**` 走 `merge=os-regen`,合并驱动只把 contract.mdx / metadata.mdx 记为 pending 而不做文本合并(AGENTS.md §11)。按其规定顺序重建 工作区后 `check:generated --fix`,产物现同时含 #6377 的新版式(顶层长枚举移入 Allowed Values 小节、联合变体印数量)与本单从 ledger 摘掉的那一个码。 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01JTSZAjgtL3oR6YcpNDhW3T
Fixes #6225
Fixes #6226
打包派发:同一个文件面(
packages/spec/scripts/lib/format-type.ts)、同一次content/docs/references/**重生成。分开做要付两次重生成,而且各自的 diff 会被对方淹没。#5340(PR #6211)压掉内联摘要里的长枚举之后,语料仍有 27 个超过 400 字符的类型单元格。它们不是一种毛病,是两种。
两个前提都在当前 main 上重新验证过
在
origin/main(含 #6308、#6243、#6280、#6281、#6333 等 19 个新提交)上重生成后实测:27 个>400的单元格,9 个是顶层长枚举、18 个不是,max 仍是 6092。与立单时的数字一致,两个前提都成立。#6225 —— 顶层长枚举
build-docs.ts一直有一条更适合长词表的渲染路径(### Allowed Values+ 每成员一行项目符号),但只在整个 schema 是type: 'string'+enum时才走。同样 49 个成员,被 Zod 提升成具名 schema(data/FieldType)的走项目符号,内联在属性上的(Field.type)得到 561 字符的表格单元格,ApiError.code的 261 个成员得到 6092 字符。新增的
formatPropertyType就是那条分支的镜像,逐条件对齐。单元格印样本加数量,完整成员表由build-docs.ts印在表格正下方。省略与搬迁是同一个elideEnum调用的两个返回值,不可能各说各话;预算只在会搬迁的那个入口读取,formatType本身一行未改,所以 #5340 的「词表自己那一行永不省略」在formatType上原样成立(它的 4 条 pin 全绿)。关于
$ref那个候选(派发时提到的第二方案)—— 实测它连数据都不存在。 我查了生成的 JSON Schema:这 9 个位置没有一个带$ref,Zod 把枚举整个内联了(data/Field.json的type是裸的{ type: 'string', enum: [...] })。要走$ref就得靠成员集合比对去反推「这份内联枚举等于那个具名 schema」,那正是 #5340 注释里点名拒绝的「猜哪个页内标题恰好带着同样的成员」。所以 PM 的判断方向对,理由比原来更硬。#6226 —— 联合变体重复(按维护者裁决)
anyOf分支原本是variants.map(...).join(' | '),对变体相似度一无所知 ——ui/app.mdx的App.navigation把同一个{ id; label; icon?; order?; … }印了 9 遍,其中 7 遍逐字相同。现在最多印 4 个,其余印… +N more,自报被省略的变体数。阈值全部实测,没有拍脑袋的常数
逐候选值重生成再量真实语料:
枚举预算(216 页 / 8548 个单元格 / 893 个顶层
Enum):>200>40040 到 176 之间每一个值的宽度结果完全相同,所以这段区间里选哪个跟宽度无关,只跟搬走多少份词表有关(227 → 24)。取 160:拿到能拿到的最好宽度、只搬 25 份、距 184 的悬崖留有余量,且恰好是内联预算 80 的两倍 —— 把两个位置的不对称说明白:摘掉一份副本几乎免费,把词表搬出它自己那一行要在页面上多开一节。
变体上限(语料 353 个联合;2 个变体占 72.5%,累计到 4 个是 92.6%,之后是薄尾):上限 2 → 8 个宽单元格,3 → 8,4 → 9,5 → 11,6 → 18(与不设上限无异)。取 4:仍能做完几乎全部工作的最松上限(收到 3 只多救回 1 个单元格,却要省略 44 个联合而不是 26 个),且与读者上一行刚见过的
INLINE_KEY_LIMIT = 4同源 —— 一个单元格里两个不同的「印几个之后…」正是裁决要避免的不一致。「标记必须挣回自己的位置」守卫
沿用 #5340,并被两条新省略共用。实测(把守卫改成无条件省略再重生成对比):拒绝了 248 个候选省略里的 54 个,那 54 个加起来只省 328 字符 —— 平均每个 6 字符,而标记本身要花 12–15 字符。其中 7 个是搬迁候选,即七整节
### Allowed Values本会为了给一个单元格削掉个位数字符而被加进页面。守卫在搬迁上比在内联省略上更要紧:那边一次拒绝省下一个标记,这边省下一整节。全语料重新测量
>200字符>400字符>900字符p95 纹丝不动是重点:普通单元格一个都没有移位。
这 9 份词表改完之后住在哪里(硬要求:信息不得离开页面)
api/contract.mdxApiError.code### Allowed Values: ApiError.codeapi/errors.mdxEnhancedApiError.code## StandardErrorCode)api/errors.mdxFieldError.code## FieldErrorCode)api/events.mdxMetadataEvent.type## MetadataEventType)data/field.mdxField.type## FieldType)ui/view.mdxFormField.typeFieldType在data/field.mdx)ui/action.mdxActionParam.typeui/bulk-action.mdxBulkActionParam.typeai/solution-blueprint.mdxBlueprintField.type25 份被搬迁的词表(这 9 份 + 160 字符档的另外 16 份)逐条核过:每一份的每一个成员都在本页,25/25,0 缺失。新增的 25 个标题按 schema + 属性双重限定,全页面唯一(
api/errors.mdx上EnhancedApiError与FieldError都有code,只写属性名会撞锚点)。刻意不匹配的位置
Enum< … >[]、Record< string, Enum< … > >、以及联合变体(Enum< … > | string)—— 对它们来说「本属性的允许值」不是实话,成员是元素 / 值 / 某一个变体的词表,表格下面挂项目符号会宣称 schema 没说过的事。数字枚举同样不匹配:项目符号渲染成`x`分不出2与'2',正是 #5729 修掉的错(镜像的整 schema 分支也要求type === 'string',所以这是对齐不是巧合)。三者都有 pin。反向验证(方向在运行之前写死,含一处未命中)
PageSlots.slots1538 字符,枚举已省略后仍如此) #6226 的肢体(变体上限调到 999):预测「只有断言标记的用例转红,断言完整拼写的保持绿」。命中:4 红 / 64 绿,四条红全是标记用例。### Allowed Values项目符号只对「整个 schema 是枚举」生效,对「某个属性是枚举」从不生效 #6225 的肢体(formatPropertyType恒等委托):预测「部分转红 —— 搬迁用例红,断言allowedValues === null的守卫绿」。命中:4 红 / 64 绿。formatType的enum分支(一个想当然的改法会放的地方)。预测「5 条既有的 gen:docs 内联形状里的长枚举不省略,单个类型单元格可达约 900 字符(BulkActionDef.params 实例) #5340 用例转红」。未命中,而且是往低了估:那 5 条确实红了,但本 PR 新加的 2 条守卫也红了(数组/Record/变体那条、数字枚举那条),实测 7 红 / 61 绿。多出来的两条红才是这次结果里有用的部分 —— 说明这个误放本块自己就能抓到,契约不依赖 gen:docs 内联形状里的长枚举不省略,单个类型单元格可达约 900 字符(BulkActionDef.params 实例) #5340 的用例继续存在。三次结果(含这次未命中)都如实写进了测试文件的注释,没有拿模板凑数。
没有被这次改动够到的、如实记录 → 已另立 #6374
剩下 9 个
>400的单元格里,ui/page.mdx的Page.slots(1538,本轮新的 max)恰恰不是变体重复 —— 它每个联合只有 2 个变体(T或T[]),宽度来自INLINE_KEY_LIMIT的 4 个键 × 2 个变体 × 每个约 176 字符,任何 ≥2 的变体上限都够不到它。另有 4 个(Manifest.capabilities、PluginRegistryEntry.capabilities、GetTranslationsResponse.translations、PluginSecurityManifest.permissions)根本没有联合。这是第三种机制(嵌套形状深度),已按 PD#10 立为观察类 #6374,不在本 PR 范围。裁决本身没错 —— 它确实修掉了 9 个宽单元格 —— 只是 #6226 立单时标称的旗舰样本不属于它修的那一类。变基说明
本分支开出后 main 前进了 19 个提交,其中 8 个参考页被重生成(
ui/bulk-action.mdx、automation/state-machine.mdx与本分支相交)。两棵独立重生成的树会零冲突合并却落地陈旧组合,故按os-regen钩子的要求从合并后的树重新gen:schema && gen:docs,并在合并结果上重跑了全部验证。⛔ 未手改任何生成的.mdx。验证
pnpm --filter @objectstack/spec test— 337 个测试文件 / 8614 个测试全绿(新增 17 条 pin)pnpm --filter @objectstack/spec typecheck— 干净check:docs— 232 个生成文件 in sync;check:generated— 10 个生成物全部最新;check:variant-docs— 19 个可辨联合,9 governed / 10 exemptnode scripts/check-nul-bytes.mjs— 5991 个文件,无裸控制字节Changeset
content/docs/references/**是已发布面且读者可见输出变了,按 #6211 / #6224 / #6308 的先例给具名@objectstack/specpatch(⛔ 非空 frontmatter)。🤖 Generated with Claude Code
https://claude.ai/code/session_014wsZeReNTqiceBfLb5Pyf5
Generated by Claude Code