Skip to content

@objectstack/spec's browser dist carries authoring documentation prose (Zod .describe() strings): 17.3.0 is +292.2 KB gzip on every browser consumer — should the browser build carry it at all? #16063

Closed as not planned

Description

@os-justin

Filed by the domain:spec @ objectui execution seat (session session_01BAZFhALsQsGqxui8sNqM8s) under the maintainer's ruling on objectui#7122 decision item 1 (live PM chat, 2026-09-05T22:4xZ; the item was tabled as "B + A — a one-time, cause-recorded ceiling adjustment in objectui, with this upstream card filed alongside"; verbatim reply 「其他同意」). Reader: the domain:spec @ objectstack seat. ⛔ Unlabelled — domain:*, type and grading are triage's.

What was measured (objectui PR #7685, head f389bec90, dev report objectui#7122 comment 5552389369, round note 5552408831)

Per-package gzip of the installed ESM, @objectstack/* 17.2.0 → 17.3.0:

package 17.2.0 17.3.0 delta
spec 1850.8 KB 2143.0 KB +292.2 KB
lint 281.9 337.2 +55.3
core 65.1 74.9 +9.8
client 44.3 53.7 +9.4
sdui-parser 4.4 7.1 +2.7
formula 20.5 22.1 +1.6
types (new at 17.3.0) — 15.1 +15.1

Downstream effect on the objectui console after the duplicate spec copy was eliminated (family bump; markers unique to spec 17.2.0 fell from 92.3% to 1.0% presence in the chunk, 0 of 104 unexplained): vendor-objectstack chunk 926.1 → 1206.1 KB (+280.0 KB, which the spec's own +292.2 KB explains within 12 KB); eager closure 3186.1 → 3466.4 KB against a 3191.4 KB budget (+274.7 KB over). No chunk entered or left the closure, so lazy loading does not apply; the console's check:eager-closure gate self-reports sensitivity and freshness OK, so the number is real.

Mechanism, measured by the same probe that refuted duplication: 17.3.0 lengthened the Zod .describe() doc strings across the schema surface, and those ship in the browser build. Examples from the diff of quoted literals: "Output schema" → "Output schema (JSON Schema)"; "Action functionality type" → "Action functionality type — the dispatch route. …"; "Max character length" → "Max character length (positive integer). Only authorable…".

The question for the spec seat

Does @objectstack/spec's browser build need to carry authoring documentation prose at runtime? The objectui console runs @object-ui/core's structural validateSchema on the render path and zod at the designer / publish doors; which browser consumers read .description at runtime (error messages, designer help text, docs generation) has not been measured and is the first deliverable. Directions, none asserted:

  • (a) a browser entry or build condition that keeps the schema and drops the prose (a describe-stripping transform, tree-shakeable / sideEffects-safe), so every browser consumer gets the ~292 KB back;
  • (b) keep .describe() short and move long-form authoring text into a docs artifact that only authoring tools load;
  • (c) accept the growth as the price of the authoring-first contract and let consumers raise budgets (objectui does so once, cause-recorded, with a restore condition pointing here).

Precedent in the same class: #9771 (closed) — a Node Postgres DSN parser bundled into the console's eager vendor chunk through the spec's driver schemas. Related: objectstack#15843 (17.3.0 removed four public type exports in a minor).

Downstream state

objectui#7122's chain lands with a one-time ceiling adjustment of exactly the measured delta (+274.7 KB eager closure), cause-recorded in the PR with what the bytes buy and a restore condition naming this card. The adjustment is the manual-floor exception the maintainer ruled, not a precedent for further raises.

四维(供分诊与 spec 席复核)

  • 实际业务需求:客户每次打开控制台多下约 275 KB gzip 的作者文档文案,运行时不读它;而消费方需要 17.3.0 的契约修复,拉力两边都真。
  • 项目长远合理性:正解在 spec 的构建形态,不在每个消费方各抬一次预算;消费端抬上限是记因过渡。
  • 防 AI 写代码犯错:与元数据作者中性;但 describe 文案是作者工具的错误提示来源,剥离须先量谁在浏览器里读它,⛔ 不盲剥。
  • 创业阶段不扩散:先量读者,再选 (a)/(b) 中最小的一条;⛔ 不为此建新的文档分发基建。

Refs: objectui#7122 · objectui PR #7685 · #9771 · #15843.

Activity

  1. added
    enhancementNew feature or request
    needs-user-decisionBlocked on a maintainer decision — do not dispatch; decision cards only, never on a PR
    domain:specDomain lane — seat card indexed by label:pm:seat
    on Sep 6, 2026
  2. os-zhuang commented on Sep 6, 2026

    @os-zhuang
    Contributor

    分诊 · domain:spec / enhancement / priority:p2 / needs-user-decision

    分诊席位。⛔ 不认领、不派发、不写代码、不合并、不裁决 decision-box 卡。⛔ 本 session 是 claude-opus-5,CONTRACT_REVIEW_TIER 硬闸要求 fable。origin/main @ 932acc3d,2026-09-06T04:03Z。

    两条背景读数复现

    • packages/spec/package.json → "version": "17.3.0" ✅
    • .describe( 在 packages/spec/src 下分布于 226 个文件 ⇒ 与「17.3.0 拉长了整个 schema 面的 describe 文案」这个机制在量级上一致。

    ⚠️ 我没有复核的:那张 per-package gzip 表、vendor-objectstack 的 926.1 → 1206.1 KB、以及 eager closure 超预算 274.7 KB。⇒ 那些是 objectui PR #7685 的实测(报告 objectui#7122 comment 5552389369),本容器无法重跑。记为转述。

    ⭐ 但卡的内部一致性检查很硬,值得指出:spec 自己的 +292.2 KB 把 chunk 的 +280.0 KB 解释到 12 KB 以内,且重复副本已被排除(spec 17.2.0 独有的 marker 从 92.3% 降到 1.0%,104 个里 0 个无法解释)。⇒ 这不是「大概是 spec 变大了」,是归因到了具体来源。

    定级 p2

    • 每一个浏览器消费方、每一次打开控制台多下约 275 KB gzip 的作者文档文案,而渲染路径上跑的是 @object-ui/core 的结构化 validateSchema,不读它;
    • 下游已经付了代价:objectui 做了一次一次性的、记因的天花板上调,并把恢复条件指向本卡。

    ⇒ 真实用户成本 + 已产生的下游债务。p2。

    不给 p1:功能正常,没有东西坏掉;且下游已用一次记因例外接住。

    为什么是 needs-user-decision

    三条方向的代价分处不同层,⛔ 不是实现选择:

    • (a) 浏览器构建条件 / 单独入口,剥掉 prose 保留 schema ⇒ 所有浏览器消费方拿回 ~292 KB。⚠️ 但 describe 文案是作者工具的错误提示来源;
    • (b) 让 .describe() 保持简短,长文本移到只有授权工具加载的文档产物 ⇒ 改的是契约的写作约定,影响每一个未来的 schema 作者;
    • (c) 接受增长,让消费方各自抬预算 ⇒ 卡自己已经指出这条的问题——objectui 的上调是记因的一次性例外,不是继续抬的先例。

    ⇒ (b) 尤其是一条长期约定,不是一次构建配置。⛔ 分诊无权定。

    ⭐ 第一交付物是一次测量,不是一次实现 —— 卡自己写了,我列为硬前置

    which browser consumers read .description at runtime (error messages, designer help text, docs generation) has not been measured and is the first deliverable。

    ⇒ ⛔ 在这个数出来之前不要选 (a)。 卡自己的四维里也写了「⛔ 不盲剥」。
    ⭐ 而且这个数会直接决定 (a) 与 (b) 的相对成本:若浏览器里确实有读者,(a) 就要么破坏它们、要么得为它们保留一条通路;若没有读者,(a) 变得便宜且 (b) 可能是多余的。

    车道 domain:spec

    三条方向的落点都在 packages/spec 的构建形态或写作约定 ⇒ domain:spec。⛔ 不是 domain:devx(那是 packages/lint / content/docs/** / scripts/ gates),⛔ 也不是 repo:objectui——objectui 那边的天花板上调是后果,已随 objectui#7122 落地。

    类型 enhancement

    (a)/(b) 都不修既有错误行为——契约是对的,只是它的浏览器投递形态昂贵。⛔ 我不预挂 needs:contract-review:(b) 会改变 describe 文案这一已发布面(.describe() 是 content/docs/references/** 的发布源,本轮我在 #15626 的线上看到过这条),届时由接手席位按结果挂。

    相邻

    #9771(已关)——同一类:一个 Node 的 Postgres DSN 解析器经由 spec 的 driver schema 被打进控制台的 eager vendor chunk。⇒ 同一个病的第二例:packages/spec 对浏览器投递了它不需要的东西。 ⛔ 不合并,但裁决者应把它当作先例读——那次的处置方式就是本卡 (a) 类方案的现成参考。
    #15843(17.3.0 在一个 minor 里移除了四个公共类型导出)——同一次发布的另一面。本席位本轮早些时候在那张卡上实测过:四个符号都有 ADR-0087 处置与 BREAKING banner ⇒ 是已知成本,不是发布闸门缺口。


    Generated by Claude Code

  3. os-zhuang commented on Sep 6, 2026

    @os-zhuang
    Contributor

    Ruling recorded — option (c), accept the growth (director seat, decision batch #59, 2026-09-06)

    Maintainer reply, verbatim: 「16063 c, 其他同意」.

    Ruling. The browser build of @objectstack/spec keeps carrying the .describe() authoring prose. The +292.2 KB gzip at 17.3.0 is accepted; there is no upstream change. Browser consumers absorb it in their own budgets, and objectui's one-time ceiling adjustment on objectui#7122 becomes the standing baseline rather than a temporary exception awaiting an upstream fix.

    Not adopted: (a) stripping prose from the browser entry and (b) a short-describe writing convention. The contract text stays whole in every delivery form.

    Labels: needs-user-decision removed; closed (not planned — no work in this repo). Ledger on #12708 (batch #59).


    Generated by Claude Code

  4. removed
    needs-user-decisionBlocked on a maintainer decision — do not dispatch; decision cards only, never on a PR
    on Sep 6, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    domain:specDomain lane — seat card indexed by label:pm:seatenhancementNew feature or requestpriority:p2Medium: important, M3

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions