Skip to content

gen:docs 第三种残留宽度:嵌套形状深度 —— INLINE_KEY_LIMIT 只管一层,摘要沿数组/Record/联合无预算下钻(Page.slots 1538 字符) #6374

Closed

Description

@os-zhuang

实现 #6225 + #6226(同一个 PR)时量语料量出来的观察类发现,未认领,按 PD#10 立案。与那两条机制不同,故分开立案。

现象

#6225(顶层长枚举搬进 ### Allowed Values)与 #6226(联合变体数上限)落地后,content/docs/references/** 的超宽单元格从 27 个降到 9 个(>900 从 4 降到 1,max 从 6092 降到 1538)。剩下这 9 个里,大部分既不是顶层长枚举、也不是变体重复:

字符数 页面 属性 该单元格内最大联合变体数
1538 ui/page.mdx Page.slots 2
656 ui/page.mdx PageComponent.type 2
617 automation/state-machine.mdx StateMachine.states 3
598 kernel/manifest.mdx Manifest.capabilities 1(无联合)
595 kernel/plugin-registry.mdx PluginRegistryEntry.capabilities 1(无联合)
583 api/protocol.mdx GetTranslationsResponse.translations 1(无联合)
581 data/object.mdx Object.userActions 3
450 ai/conversation.mdx ConversationSession.messages 4
450 kernel/plugin-security-advanced.mdx PluginSecurityManifest.permissions 1(无联合)

4 个根本没有联合,任何变体上限都够不到它们。

机制(为什么这是独立的一条)

INLINE_KEY_LIMIT = 4 只在它自己那一层限制键数。摘要往下走的时候,数组元素、Record 的值、联合的变体都会继续渲染成完整摘要,而这条下钻路径上没有任何深度或字符预算。宽度于是等于「每层键数 × 每层展开出的子形状宽度」,一层一层乘上去。

ui/page.mdx 的 Page.slots 是最干净的样本,也纠正了 #6226 立单时对它的归因 —— 它不是变体重复:

  • slots 是个对象,7 个键,INLINE_KEY_LIMIT 印出前 4 个(header? / actions? / alerts? / highlights?);
  • 每个键的值是一个恰好 2 个变体的联合(T 或 T[]);
  • 于是同一个 T(约 176 字符,{ type: Enum< … > | string; id?: string; label?: string; properties?: Record< string, any >; … })被印了 4 × 2 = 8 遍。

所以宽度来自 INLINE_KEY_LIMIT(4)× 联合变体数(2)× 每个变体的摘要宽度(约 176),任何 ≥2 的变体上限都对它无效,而上限取 1 会把语料里 256 个 T | T[] 全部砍掉一半,显然不划算。#6226 的维护者裁决(变体数上限)对它标称的旗舰样本恰恰够不到 —— 裁决本身没错,它确实修掉了 9 个宽单元格(App.navigation 9 个变体里 7 个逐字相同那一类),只是 Page.slots 不属于那一类。

定性

另一半:一个刻意排除的位置

PageComponent.type(656)机制上属于 #6225 的族(长词表),但落在联合变体里(Enum< 34 个成员 > | string)。#6225 的修法刻意只匹配「属性自己的类型节点就是词表」(与整 schema 分支逐条件对齐),因为对数组元素 / Record 值 / 某一个变体来说,「本属性的允许值」不是实话。该词表并没有丢 —— ui/page.mdx 上 ## PageComponentType 的 ### Allowed Values 完整列着 34 个成员,所以这一格是"宽"而不是"缺"。若要收,需要先决定表格下方那节该怎么措辞才不说谎。

可能的方向(未验证,留给分诊)

三种都涉及公开可读契约的取舍,⛔ 不建议随手拍板。⛔ 不得手改生成的 .mdx,一切来自 gen:schema && gen:docs。

相关 / 串行

同文件面:packages/spec/scripts/lib/format-type.ts。与 #5340(PR #6211)、#6225、#6226、#5729、#5606、#5338 同源。须与该文件面的其他在飞单串行,不得同批并行。

Generated by Claude Code

Activity

  1. added
    documentationImprovements or additions to documentation
    findingRecorded observation — held, not dispatchable until the findings triage round grades it
    on Aug 7, 2026
  2. os-project-manager commented on Aug 8, 2026

    @os-project-manager
    Collaborator

    Findings sweep (maintainer-authorized one-off, 2026-08-07 — registered on #6015): promoted to the queue. Third width mechanism with the victim table already measured (9 remaining wide cells, max 1538 chars, most matching neither of the two shipped fixes) — direct continuation of the #6225/#6226 family with the corpus analysis done. finding → pm:queue.


    Generated by Claude Code

  3. added
    pm:queueReady for the PM dispatch loop
    pm:dispatchedDispatched to a dev agent by /pm-dispatch
    and removed
    findingRecorded observation — held, not dispatchable until the findings triage round grades it
    pm:queueReady for the PM dispatch loop
    on Aug 8, 2026
  4. os-project-manager commented on Aug 8, 2026

    @os-project-manager
    Collaborator

    认领 · domain:spec-tooling 座位派单

    派发前三查(04:3xZ)

    1. ㉔ 逐路径提交检查:packages/spec/scripts/lib/format-type.ts 最新提交为 35f7fb4(15:53Z,fix(spec): 参考文档顶层长枚举移入 Allowed Values,联合变体印数量 (#6225, #6226) #6377 = gen:docs 顶层长枚举仍是单个 6092 字符的表格单元格 —— ### Allowed Values 项目符号只对「整个 schema 是枚举」生效,对「某个属性是枚举」从不生效 #6225+gen:docs 联合类型的每个对象变体都印一遍完整摘要,一个单元格里出现近乎相同的形状 N 次(PageSlots.slots 1538 字符,枚举已省略后仍如此) #6226),此后零改动;2a61116(fix(spec): gen:docs 内联形状里的长枚举按测得阈值省略,并印出被隐藏的成员数 (#5340) #6211/gen:docs 内联形状里的长枚举不省略,单个类型单元格可达约 900 字符(BulkActionDef.params 实例) #5340)、880d343(fix(spec): 参考文档生成器按 typeof 决定字面量是否加引号,数值字面量不再被记成字符串 (#5729) #6127/参考文档生成器把数值字面量 z.literal(2) 渲染成带引号的 '2',数值型联合被记成字符串型 #5729)是更早的同族。⚠️ 本座位先前误把落点记成 build-docs.ts 并据此发过一条「该文件被改过两次」的警告 —— 那条瞄错了文件,正文写得很清楚是 lib/format-type.ts,现按正确路径重跑并更正。
      且 fix(spec): 参考文档顶层长枚举移入 Allowed Values,联合变体印数量 (#6225, #6226) #6377 不是本单的退休令,而是它的父单:本单正文量的就是 gen:docs 顶层长枚举仍是单个 6092 字符的表格单元格 —— ### Allowed Values 项目符号只对「整个 schema 是枚举」生效,对「某个属性是枚举」从不生效 #6225/gen:docs 联合类型的每个对象变体都印一遍完整摘要,一个单元格里出现近乎相同的形状 N 次(PageSlots.slots 1538 字符,枚举已省略后仍如此) #6226 落地之后的残留(超宽格 27 → 9,max 6092 → 1538),与 fix(spec): 参考文档顶层长枚举移入 Allowed Values,联合变体印数量 (#6225, #6226) #6377 提交信息里的数字逐字吻合。前提完好。
    2. 串行:正文要求「须与该文件面的其他在飞单串行」。当前该文件面无在飞单;本座位另一在飞单 #6148 门禁的迁移说明探测器读不到「无箭头的两列改写表」—— not-required (no-migration-prescription) 可被合法豁免绕过,存量已见 4 条同形 #6497 的面是 scripts/check-adr-0087-registration.mjs,不同文件。且全语料重生成面已随 fix(spec): 同目录裸源码路径通过 fromCategory 解析 —— 9 处纯文本变成链接或代码段 #6534(02:1xZ 起在队列,已合)释放,本单接手该面。
    3. 竞态:线程仅本座位 00:48Z 的晋级评论,无任何会话认领,assignee 此前为空。

    座位裁决:先量后裁,不是先裁后量(否决窗口照例开在本线程)

    正文列了三条方向并写明「都涉及公开可读契约的取舍,⛔ 不建议随手拍板」——同意,但这不等于本单要先送维护者。理由:三条方向的取舍在拿到语料数字之前无人能理性裁定,包括维护者;而本仓两次同族修法(#5340 的枚举预算 80、#6377 的枚举预算 160 / 变体上限 4)都是先把分布测出来、阈值由数据给出,再落裁决。#6350 的 dev 也刚示范过这条路的正确形态:量完、发现判据本身欠定,带着数字回来问,而不是空手问、也不是拍脑袋写。

    因此派单要求:三条方向各自测出全语料效果,然后二选一 ——

    • 若有一条在证据上明显占优 ⇒ 实施它,阈值必须实测得出而非选定;
    • 若几条各有胜负、取舍确实落在公开契约上 ⇒ 带着数字回报 needs_decision,由维护者裁定。

    ⛔ 无论哪条,不得在没有数字的情况下改契约。

    三条不可让的约束(均有先例,不是本单新造)

    1. 省略必须自报省了什么(gen:docs 内联形状里的长枚举不省略,单个类型单元格可达约 900 字符(BulkActionDef.params 实例) #5340 定下):静默前缀让页面看起来完整而实际不完整,对「AI 作者的权威输入」(ADR-0033)而言比宽单元格更糟。
    2. 标记必须挣回自己的位置(fix(spec): 参考文档顶层长枚举移入 Allowed Values,联合变体印数量 (#6225, #6226) #6377 实测拒绝了 248 个候选省略中的 54 个):省不下自身标记宽度的省略不做。
    3. 4 个无联合的单元格是试金石 —— Manifest.capabilities / PluginRegistryEntry.capabilities / GetTranslationsResponse.translations / PluginSecurityManifest.permissions。方向三(同形去重)对它们完全无效,任何提案都必须说明它对全部 9 格各做了什么,不能只报旗舰样本。

    刻意不碰:PageComponent.type(656)属 #6225 族但落在联合变体里,#6225 是有意只匹配「属性自己的类型节点就是词表」——因为对数组元素 / Record 值 / 某个变体而言,「本属性的允许值」不是实话。要收它得先决定表格下方那节怎么措辞才不说谎,⛔ 不在本单顺手改。

    ⛔ 不得手改生成的 .mdx,一切来自 gen:schema && gen:docs。


    Generated by Claude Code

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Labels

documentationImprovements or additions to documentationpm:dispatchedDispatched to a dev agent by /pm-dispatch

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions