Skip to content

decision(eager closure): the first-load budget is spent and the Studio designers are eager by design — park Studio fixes that add bytes until objectui#11939 lands, or raise the ceiling by a bounded, reclaimable allowance? #11942

Closed

Description

@objectstack-fleet

Ruled: 6056819248 · letter B C · 2026-10-08T09:25Z

Filing gate: a maintainer decision. Raised by domain:ui seat 2 (session_01MgfduSkFrfM3eorB3UGfAU, account os-bill). The trigger ruling A on objectui#11798 named has fired, and no ruling covers the bug fixes in flight until that work lands. ⛔ Not a claim.

维护者速读

首屏预算(check:eager-closure,3307.0 KB)已经用完。main 的 Bundle Analysis 转红,止血卡是 objectui#11937,做法是回滚或堵漏,⛔ 不提高预算。

按你同意的裁决 A(objectui#11798 6054102412),余量耗尽后按 objectui#6795 的顺序做:先让注册表可观察,再懒加载设计器。后续卡已立为 objectui#11939。这是 Clause-②: yes 的工作,要走 spec 车道和合约评审,预计不是一两天能落地的。

问题在中间这段时间:Studio 的设计器和属性面板按设计就在首屏里,所以任何 Studio 修复都会给首屏加字节。实测:

  • PR objectui#11941(objectui#11921,脚本动作的语言)合并引用读数 3307.6 KB,约 +0.6 KB;
  • 在飞的 objectui#11923(校验规则 Runs on)、objectui#11909(字段类型目录)改的也是设计器文件。

在 objectui#11939 落地之前,这些修复怎么处理?

Options

  • A. Park. A Studio PR that adds first-load bytes stays a draft with its expected-red list. It waits until objectui#11939's lazy-loading step lands. Byte-neutral fixes land as usual.
  • B. A bounded, temporary raise. Raise MAX_EAGER_CLOSURE_GZIP_BYTES by a fixed allowance (for example +5 KB), with the PR stating what the bytes buy (Studio fixes). When objectui#11939 moves the designers out, the same PR lowers the ceiling by the bytes that leave plus this allowance.
  • C. objectui#11939 first. Grade it p1 and start it now. Meanwhile, handle fixes as in A.

四轴分析

每个方案必须沿四条固定评估轴分析,这是决策分析的核心原则,不是可选项:

  • 实际业务需求: 被挡住的是真实缺陷。比如 objectui#11921:Studio 写出的动作在作者手动选语言之前一直被 spec 拒绝,QA 实测过。A 让这类修复等多久,取决于 objectui#11939 两步都落地要多久,目前没有估计。B 让它们现在就能落地。C 是 A 的缩短版。
  • 项目长远合理性: 真正的修法是 objectui#11939(contract-first,注册表可观察)。B 是有期限的临时债,对象明确:这些字节属于裁决 A 已同意移出首屏的设计器。预算这道门要拦的是 89 KB 级别的回退,上调 5 KB 不改变它的用途。A 和 C 没有新的债,但修复在等待期间会积压,分支也会越来越难合并。
  • 防 AI 写代码犯错: A 让门禁保持严格,AI 写的 PR 一旦超线就会被拦下。B 放宽了一个已有门禁,但额度有上限、有明确的收回条件,不是消费端宽容。⛔ 不新增门禁。
  • 创业阶段不扩散需求: 三个选项都不增加能力面。C 把一项 Clause-②: yes 的改造提前,它会占用 spec 车道和合约评审的容量。

基本裁决原则: spec 声明 > 实现 > 文档面。被挡住的修复都是让 Studio 写出 spec 接受的元数据,属于补实现,所以修复本身应当落地,问题只在时机。

本席位推荐:B + C。 上调有界额度,让修复现在落地;同时把 objectui#11939 提为 p1,它落地时收回额度。如果你只想守严格预算,就选 A。

What this seat does until the ruling

This seat follows A:

  • A PR that adds first-load bytes is parked as a draft.
  • A byte-neutral fix lands as usual, for example objectui#11934 at −2 bytes.
  • ⛔ The ceiling is not touched.

Generated by Claude Code

Activity

  1. objectstack-fleet commented on Oct 8, 2026

    @objectstack-fleet
    ContributorAuthor

    Ruling: batch #292 item 3 · letters B and C · maintainer 「同意」 2026-10-08T09:24Z

    Director seat, summon #35, objectstack-ai/objectstack#12708, session_01VYToj6PQehTEKNrjGM9akg (GitHub os-zhuang; written as objectstack-fleet[bot] via the relay). Presented in batch #292 from the domain:ui seat 2's decision card (the body): A park every Studio PR that adds first-load bytes until objectui#11939's lazy-loading step lands; B a bounded, temporary raise of MAX_EAGER_CLOSURE_GZIP_BYTES, reclaimed when the designers leave the first load; C grade objectui#11939 p1 and start it now. The seat recommended B plus C; the director seat presented the same with the order fixed; the maintainer answered 「同意」. Thread-read: none (the card has no comment). Freshness: no comment since the presentation. Premises re-read on objectui main f3a0488c: Bundle Analysis on main is red; objectui#11937 (priority:p0, pm:dispatched) is the stop-the-bleed card and forbids a raise; the ceiling constant reads 3,386,364.

    The ruling

    B and C, in this order.

    1. objectui#11937 lands first and main turns green by rollback or plugging. ⛔ The ceiling is not raised to get there.
    2. B. Then one PR raises MAX_EAGER_CLOSURE_GZIP_BYTES by a fixed allowance of at most 5 KB, carrying this card's number; the constant's docblock states what the bytes buy (Studio fixes while the designers are eager by design) and the reclaim condition. The parked Studio fixes (objectui#11921's PR fix(app-shell): the action editor writes a script body that names its language (objectui#11921) #11941, studio(rules): the validation rule "Runs on" checkboxes disagree with the spec's events contract — they offer delete (refused) and show an absent events list as nothing checked (the spec defaults it to insert + update) #11923, studio(data): the field type catalog lacks three spec field types (user, secret, record), so a showcase field of those types reads "(not found)" in the Type control and the add-field palette never offers them #11909 and any later byte-adding Studio fix) land against that ceiling. Byte-neutral fixes land as they do today.
    3. C. objectui#11939 takes priority:p1 and enters the queue in this act. It follows objectui#6795's order (registries observable and the readers migrated first, lazy loading second), Clause-②: yes, spec-lane review at tier. The PR that moves the designers out of the first load lowers the ceiling by the bytes that leave plus the allowance of step 2, in the same change.

    ⛔ Not taken: A alone (QA-measured defects wait on a refactor with no estimate while branches rot). The gate keeps its purpose: it stops an 89 KB-class regression, and a 5 KB allowance with a named reclaim is not a consumer-side tolerance.

    Prior rulings read: objectui#11798 ruling A (6054102412: the remainder waits for #6795's trigger, which has now fired), objectui#6795 (5816759897, the order), objectui#11937 (p0, no raise) → 3 hits; ADR none; thread: 0 comments. 自检: 只看①选 C 为终态;②③④ 决定的是中间怎么过,不翻字母。置信缺口:#11939 两步的工期无估计。

    State

    • needs-user-decision → pm:queue (domain:ui) on this card, which carries step 2's allowance PR; the Ruled: line added to the body; objectui#11939 gains priority:p1 and pm:queue — all in this act. The domain:ui seat 2 executes in the order above.

    Generated by Claude Code

  2. objectstack-fleet commented on Oct 8, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim: PM loop round 4 (ruling B, step 2)
    Session: session_01MgfduSkFrfM3eorB3UGfAU
    Account: os-bill
    Branch: claude/issue-11942-eager-allowance
    Worktree: objectui-issue-11942
    Domain: domain:ui
    Seat: domain:ui#2
    Scope of this claim: step 2 of ruling 6056819248, which is exactly one PR. It raises MAX_EAGER_CLOSURE_GZIP_BYTES by a fixed allowance of 5,120 gzip bytes (5 KB, the ruling's maximum). The constant's docblock states what the bytes buy and the reclaim condition.

    • What the bytes buy: Studio fixes while the designers are eager by design.
    • Reclaim condition: objectui#11939's lazy-loading PR lowers the ceiling by the bytes that leave plus this allowance, in the same change.

    ⛔ Order: this PR stays a draft until objectui#11937 has landed and main is green, as step 1 of the ruling requires. The seat makes it ready only then.

    File surface (on f3a0488):

    • scripts/check-eager-closure-budget.mjs: the constant (about :1009) and its docblock.
    • scripts/__tests__/check-eager-closure-budget.test.ts: only where a pin reads the constant's value or its docblock. The sensitivity pins (the headroom stays narrower than the 89 KB regression) must stay green unchanged.
    • The prose comment beside the history in .github/workflows/performance-budget.yml about :256 only if it names the current value. Otherwise it is not touched.

    ⛔ Not on it:

    • the per-chunk ceilings (PER_CHUNK_GZIP_CEILINGS);
    • every other gate;
    • objectui#11939's work;
    • any app or package source.

    Any file outside this list: the dev reports it before opening the PR (stop on breach; explain in the report).
    Container & model: S, mode:subagent, model: opus (dispatch-gates --tier --repo objectstack-ai/objectui over these paths: no path-derived mandate; default tier)
    Clause-②: no
    Responsibility: objectui console eager-closure budget: the headroom is spent and the Studio designers are eager by design, so QA-measured Studio fixes (PRs objectui#11941, #11945, #11946) cannot land until objectui#11939 moves the designers out | the maintainer's ruling 6056819248 (B then C): a bounded 5 KB allowance with a named reclaim | every Studio author waiting on those fixes
    Thread-read: 6056819248
    Serial constraints cleared: none blocking.

    • Open objectui PRs, read 2026-10-08T09:29Z: none touches check-eager-closure-budget.
    • objectui#11937 (this seat, p0) must land first. This PR is held as a draft until then, by the ruling's order, not by a file conflict.
    • check-governed-merges.mjs --test scripts/check-eager-closure-budget.mjs: NOT governed, so the ordinary queue landing applies. It is re-run on the final file list with --pr.

    Why Clause-②: no: a repo-internal CI budget constant. No package export, prop, spec key or packages/i18n key.


    Generated by Claude Code

  3. objectstack-fleet commented on Oct 8, 2026

    @objectstack-fleet
    ContributorAuthor

    os-dev-report
    {
    "issue": 11942,
    "status": "done",
    "branch": "claude/issue-11942-eager-allowance",
    "pr": "#11949",
    "session": "session_01MgfduSkFrfM3eorB3UGfAU",
    "premise_still_valid": true,
    "head": "1e3d87909",
    "summary": "Step 2 (letter B) of ruling 6056819248: MAX_EAGER_CLOSURE_GZIP_BYTES in scripts/check-eager-closure-budget.mjs goes from 3_386_364 (re-read on main at f3a0488, unchanged since dispatch) to 3_391_484, exactly +5_120. The constant's docblock gains a fifth-raise entry in the file's history style. It quotes ruling step 2, says what the bytes buy (Studio fixes while the metadata-admin designers are eager by design, ruling A on objectui#11798, record 6054102412) and states the reclaim (objectui#11939's lazy-loading PR lowers the ceiling by the bytes that leave plus these 5,120, in the same change). It also gives the sensitivity arithmetic: headroom 16,140 = 0.18x the 91,136-byte regression, which lands 74,996 bytes over the new line. BASELINE, PER_CHUNK_GZIP_CEILINGS, PER_CHUNK_BASELINE and REGRESSION_THIS_GATE_MUST_CATCH_BYTES are unchanged, and draft PR #11949 is held until objectui#11937 lands.",
    "files_changed": [
    "scripts/check-eager-closure-budget.mjs (+63 / -7)"
    ],
    "tests": "HEAD 1e3d879 (git rev-parse --short HEAD after the last commit). OS_VERIFY_LOCK_SLOT=issue-11942 bash os-verify-lock.sh -c 'pnpm exec vitest run scripts/__tests__/check-eager-closure-budget.test.ts scripts/__tests__/ci-cd-pipeline-doc.test.ts scripts/__tests__/render-budget-comment.test.ts' gave 'Test Files 3 passed (3)', 'Tests 304 passed (304)' and 'os-verify-lock: VERDICT command-exit 0'. The three files are every test that imports or reads the checker (git grep on its file name). The sensitivity pins ('would have failed on the regression it exists to catch', 'is exactly one regression wide') pass unchanged. No test edit was needed: no pin reads the constant's literal value or the edited docblock text (the ci-cd doc pin derives the literal from the file). Ablation: none, because the change is a constant plus prose and no guard was added or removed.",
    "gates": [
    "node scripts/check-changeset-presence.mjs: exit 0, 'No source or published contract of a released package changed in this range, so no changeset is owed.' A script-only change owes no changeset, and none was added.",
    "node scripts/check-changeset-no-major.mjs: exit 0, 'No changeset declares a major bump.'",
    "pnpm check:new-line-citations: exit 0, 'VERDICT new-cross-file-line-citations: 0 new citation(s), enforcement report-only -> exit 0'",
    "pnpm check:control-bytes: exit 0, 'check-control-bytes: OK (scanned 7996 tracked text file(s); skipped 85 binary).' The control-byte self-scan grep found 0 hits.",
    "pnpm exec eslint --format json scripts/check-eager-closure-budget.mjs: exit 0, 1 file, 0 errors, 0 warnings. Narrowing evidence: every rule block in eslint.config.js is scoped to ts/tsx globs, and --print-config for this .mjs file shows 0 rules and no parserOptions.project or projectService. Linting is not type-aware, so the diff cannot move an untouched file's verdict. The repo-wide pnpm lint is CI's.",
    "node /home/user/objectstack/scripts/pm/check-governed-merges.mjs --branch claude/issue-11942-eager-allowance --root /home/user/objectui-issue-11942: exit 0, 'governed-surface predicate: 0 of 1 path(s) hit the register' and 'NOT governed — ordinary queue landing applies to a PR with exactly this file list.' head repo: NOT MEASURED, because it was run with --branch, not --pr.",
    "NOT MEASURED: Bundle Analysis / pnpm check:eager-closure, because it needs a console build and the dispatch said CI measures it. On #11949 it weighs the merge ref, and main is red until objectui#11937 lands."
    ],
    "deviations": [
    "Besides adding the entry, the docblock paragraph 'Headroom above BASELINE is ...' was updated from 11,020 / 0.12x to 16,140 / 0.18x for the new pair, and the objectui#11854 pair moved into its history list. It states arithmetic on the two constants and would otherwise read false. Same docblock, inside the claim's file surface.",
    "Test set widened beyond the named file to ci-cd-pipeline-doc.test.ts and render-budget-comment.test.ts, which read the checker file. objectui has no dispatch-gates.mjs, so the gate list was derived by hand from package.json and .github/workflows: only performance-budget.yml runs the checker, and it needs a build.",
    ".github/workflows/performance-budget.yml was not edited. Its comment near the freshness step names only the retired 4,086,000 to 3,345,000 move at 0409b76, not the current value as current.",
    "The commit trailer pair is model-free (Claude-Session plus 'Co-authored-by: Claude'), per objectui AGENTS.md, instead of the harness reminder's model-named Co-Authored-By. The PR body ends with the os-dev session-URL footer instead of the harness's footer form. Both follow the standing rules.",
    "The first fleet-write --dry-run was refused (an actions file shaped as an object, not an array) with zero writes. It was repacked and sent once."
    ],
    "mcp_calls": "0 — no MCP GitHub tool called",
    "api_writes": "3 — via the fleet-write relay (each one POST /repos/objectstack-ai/objectstack/dispatches): (1) pr_create POST /repos/objectstack-ai/objectui/pulls, giving draft #11949, body read back byte-identical (5347 bytes); (2) label-write assign POST /repos//issues/11949/assignees os-bill, read back MATCHES; (3) this os-dev-report comment POST /repos//issues/11942/comments. Plus 2 git pushes (empty branch probe, then 1e3d879), which are not REST.",
    "cleanup": "node_modules removed and worktree /home/user/objectui-issue-11942 removed after git status showed 0 lines and the remote head matched 1e3d879. No background process is left running.",
    "open_questions": [],
    "out_of_scope_findings": [
    "carrier: objectui#11939's lazy-loading PR, which edits this docblock · noted, not filed. Two older passages in scripts/check-eager-closure-budget.mjs no longer match the ceiling's history. The list opening 'Re-baselined DOWNWARD four times' names four downward moves while later ones are recorded in their own entries, and the header section 'The ceiling, and why it is this number' still describes the ceiling as the measurement plus half a regression. This is prose drift, recorded in #11949's Acceptance notes."
    ]
    }


    Generated by Claude Code

  4. objectstack-fleet commented on Oct 8, 2026

    @objectstack-fleet
    ContributorAuthor

    Review: ACCEPT — PR objectui#11949 (ruling 6056819248 step 2) · domain:ui seat 2 · 2026-10-08T10:35Z

    Implemented-by: os-dev subagent of session_01MgfduSkFrfM3eorB3UGfAU, branch claude/issue-11942-eager-allowance, head 1e3d879.
    Reviewed-by: domain:ui seat 2 (session_01MgfduSkFrfM3eorB3UGfAU), against GitHub and the branch diff, not against the report's prose.

    Order kept: step 1 is done. objectui#11956 merged as 3c888c6, and main's push Bundle Analysis on it is green (job 113267437765), with no ceiling raised to get there. This PR, held as a draft until now, is made ready in this act.

    Checklist:

    • PR shape: first line Fixes #11942. Clause-②: no is at the start of a line. The assignee is os-bill.
    • Scope: one file, scripts/check-eager-closure-budget.mjs, inside claim 6056895751:
      • MAX_EAGER_CLOSURE_GZIP_BYTES goes from 3_386_364 to 3_391_484, exactly +5,120, the ruling's maximum;
      • the docblock gains a fifth-raise entry stating what the bytes buy (Studio fixes while the metadata-admin designers are eager by design, ruling A 6054102412);
      • it states the reclaim: objectui#11939's lazy-loading PR lowers the ceiling by the bytes that leave plus these 5,120, in the same change.
    • Unchanged: BASELINE, the per-chunk ceilings and baselines, and REGRESSION_THIS_GATE_MUST_CATCH_BYTES. The gate keeps its purpose. The headroom becomes 16,140 B, 0.18× the 91,136 B regression it exists to catch. The headroom paragraph was updated to match, because it states arithmetic on the two constants.
    • Evidence:
      • every test that reads the checker passes: check-eager-closure-budget, ci-cd-pipeline-doc and render-budget-comment, 304 tests. The sensitivity pins pass unchanged;
      • check-changeset-presence reads "no changeset is owed", because this is a script-only change;
      • check-governed-merges: NOT governed;
      • CI: 38 checks green on 1e3d879.
    • Next, in order: the re-land of objectui#11931 and feat(app-shell): Studio Interfaces pillar creates a page and opens it on source plus live preview (objectui#11823 step 3) #11932 (claim 6057967120, +873 B measured), then the parked Studio fixes objectui#11941, fix(app-shell): Studio's field type catalog gains the spec's user, secret and record types (objectui#11909) #11946 and fix(plugin-form): a create form preselects the option a field marks default: true (objectui#11914) #11944, each landing only when its own Bundle Analysis is green against the new ceiling.

    Out-of-scope note, carrier: objectui#11939's lazy-loading PR: two older passages in the docblock no longer match the ceiling's history, "Re-baselined DOWNWARD four times" and "The ceiling, and why it is this number". That PR edits this docblock anyway.


    Generated by Claude Code

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

Metadata

Metadata

Assignees

Labels

domain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seat

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions