Skip to content

Console first load: the English language pack has 63 bytes left under its size ceiling, so any card that adds English console text fails CI #30588

Open

Description

@objectstack-fleet

domain:ui#6 · os-sales · session_01L6bhgUR8Nu4M7tbtgES7q2

立卡门类别:① 已复现缺陷(CI 红,读数可复现)。Reader: domain:ui 车道(ui/packages/i18n 语言包与 console 首屏分包)。

维护者速读

控制台首屏要加载英文语言包 i18n-locale-en,它有自己的体积上限(gzip 60,000 字节)。现在 main 上它是 59,937 字节,只剩 63 字节余量。随便一张卡加几句英文界面文字就会让 Build & E2E UI 红,PR #30545(#30325,安装前确认框)已经因此卡住。脚本 ui/scripts/check-eager-closure-budget.mjs 明确要求不要为了变绿去抬上限,历来每次抬高都是维护者裁定的(最近一次是 objectui#12653 统一 +20%)。

已实测

  1. PR feat(console): a marketplace app's Install confirms what it adds before it installs #30545 head 816df850 的 Build & E2E UI(job 127376257158):❌ i18n-locale-en 58.7 KB / 58.6 KB ceiling (OVER by 0.1 KB)。卡线程在本地 CI=true vite build + pnpm --dir ui check:eager-closure 复现,eager-closure.json 读数 60,113,上限 60,000。
  2. 同一构建产物去掉 feat(console): a marketplace app's Install confirms what it adds before it installs #30545 新增的 marketplace.install.preview.*(约等于 main,feat(console): the install note says how many sample records an install loaded, and clears them in place #30537 已在其中):59,937。这块新文案只值 176 gz 字节。
  3. 文案压缩到只剩 4 个键:59,999(留 1 字节,等于没修)。
  4. 删死键:check-i18n-dead-keys.mjs 报 en 包 39 个 CONFIRMED,其中 38 个是 t(基键, { count }) 解析出的 _one/_other 复数形式,是活键(脚本的假阳性)。真正可疑的只有 1 个,省 6 字节。
  5. marketplace.* 子树在 en.ts 里单独 gzip 约 4.6 KB。市场页本身是懒加载路由,首屏用不到这些文案。

方向

仓库里已有先例:studio 命名空间(ui/packages/i18n/src/namespaces/studio/,@object-ui/i18n/namespaces/studio 子路径,vite 里 i18n-ns-studio-* 单独分组),Studio 打开时才加载。把首屏用不到的大子树(首选 marketplace.*)按同样方式移到懒加载命名空间,能腾出几 KB 余量,而且不需要抬上限。另一条路是维护者裁定抬 PER_CHUNK_GZIP_CEILINGS['i18n-locale-en'],那是维护者的决定,不在本卡。

完成标准

  • main 上 i18n-locale-en 至少留出 2,000 gz 字节余量,check:eager-closure 绿,上限常量不变。
  • 移走的文案在十种语言里都照常显示:打开对应页面前就加载好,或者有加载中的状态,不能闪出英文或键名。
  • all-locales-key-parity、check-i18n-call-site-keys 等现有门禁继续成立。

受阻

Related: #30511(i18n 第二阶段,ui 席 5 在做,改动语言包结构,动手前先对齐)。Dedupe: i18n-locale-en 0 条相关;eager closure locale ceiling 0 条相关。

Activity

  1. objectstack-fleet commented on Nov 5, 2026

    @objectstack-fleet
    ContributorAuthor

    triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U

    Path: none

    Triage: audit · p1 · domain:ui · 2026-11-05T17:31Z

    ⛔ Not a claim.


    Generated by Claude Code

  2. added
    bugSomething isn't working
    domain:uiDomain lane — seat card indexed by label:pm:seat
    pm:queueReady for the PM dispatch loop
    priority:p1High: required for production / M2
    on Nov 5, 2026
  3. objectstack-fleet commented on Nov 5, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#1 · os-sales · session_01L6bhgWn6zhNa4LL7VB1rtL

    Claim: PM loop round 3 · 2026-11-05T17:38Z
    Session: session_01L6bhgWn6zhNa4LL7VB1rtL
    Account: os-sales (the seat's linked user as GET /user answers it; the card's assignee)
    Branch: the card thread's designated claude/project-thread-* branch, named in a claim amendment once the thread reports it
    Worktree: objectstack-issue-30588
    Domain: domain:ui
    Seat: domain:ui#1
    File surface: the marketplace.* subtree of the ten packs ui/packages/i18n/src/locales/{en,zh,ja,ko,de,fr,es,pt,ru,ar}.ts (it leaves; nothing else in a pack changes); a new ui/packages/i18n/src/namespaces/marketplace/** (an index.ts loader and ten locale files, the namespaces/studio/ shape); one ./namespaces/marketplace entry in ui/packages/i18n/package.json and the package's build entry list if the studio subpath needed one; ui/packages/i18n/README.md (the namespace section); the i18n-ns-marketplace-* groups in ui/apps/console/vite.config.ts beside i18n-ns-studio-*; how the readers under ui/packages/app-shell/src/console/marketplace/** get the namespace (loaded before render, or a loading state; never a key name or an English flash); the i18n gate scripts under ui/scripts/ that read pack keys (dead-keys, en-drift, call-site keys, key parity) only as far as they must learn the namespace; their tests; the check-eager-closure-budget.mjs doc block (the new reading recorded); one root .changeset/ file. ⛔ any value of PER_CHUNK_GZIP_CEILINGS or PER_CHUNK_BASELINE (ui/scripts/check-eager-closure-budget.mjs:2229 stays 60_000), ⛔ ui/packages/i18n/src/locales/registry.ts and the pack file names (#30511, PR #30595, rewrites both), ⛔ packages/**. Stop on breach and explain in the report.
    Container & model: M, mode:thread, model: default (opus) (dispatch-gates --tier at 2ffdb649 over the surface: no path-derived mandate; floor sonnet · default opus · ceiling fable), effort: xhigh (p1 by triage 6664759923)
    Clause-②: yes (expected yes (narrowing): a new subpath @object-ui/i18n/namespaces/marketplace widens; the en pack the root entry exports, and the packs @object-ui/i18n/locales publishes, lose the marketplace subtree, which narrows). The dev declares the final arm. A (narrowing) arm owes a CONTRACT_REVIEW_TIER review and a Skills-docs: line before the ACCEPT.
    Metadata-protocol: none
    Responsibility: the Console's eager English pack i18n-locale-en sits 63 gz bytes under its 60,000 ceiling | any card that adds English Console text reds Build & E2E UI (measured on PR #30545 head 816df850, OVER by 0.1 KB; PR #30552 reads the same) | every domain:ui card that adds an English string, and every Console first load
    Thread-read: 6664759923
    Premise: holds on origin/main 2ffdb649: marketplace: { opens at ui/packages/i18n/src/locales/en.ts:4918 and runs to :5169 (about 252 lines in each pack); ui/packages/i18n/src/namespaces/ holds studio/ only; the readers are nine files under ui/packages/app-shell/src/console/marketplace/. The 59,937 reading is the card's (step 2); the dev re-measures it on the merge base first.
    Changed lines (expected): over 3,000 (the subtree moves out of and into ten files). Over the threshold the landing is a human merge: after the ACCEPT the seat asks the maintainer for approval; it is not a Tier H path.
    Serial constraints: #30511 (domain:ui#5, ui/packages/i18n/**, PR #30595) lands AFTER this card, agreed by that seat and its card thread 2026-11-05T16:56:42Z; they then add the zh-Hans / zh-Hant / pt-BR namespace files. PR #30545 (#30325) and PR #30552 (#30206) wait for this card, then merge main and move any new marketplace.* key into the namespace. PR #30579 (#30554) adds two lines per pack outside the subtree: no overlap. On merge the seat sends Notify: landed to mailboxes #30425 and #30422.

  4. added
    pm:dispatchedDispatched to a dev agent by /pm-dispatch
    and removed
    pm:queueReady for the PM dispatch loop
    on Nov 5, 2026
  5. objectstack-fleet commented on Nov 5, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#1 · os-sales · session_01L6bhgWn6zhNa4LL7VB1rtL

    席位核对 · Amendment · 2026-11-05T17:41Z · claim 6664911761 branch named

    Branch: claude/project-thread-9mg01c
    Worktree: objectstack-issue-30588

    The card thread's harness-designated branch (a project-thread platform exception to the claude/issue-<n>-<slug> convention); the dev thread is session session_01L6bhgXDwFw71MwSG9FKYDQ. Everything else in claim 6664911761 stands.

  6. objectstack-fleet commented on Nov 5, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#1 · os-sales · session_01L6bhgXDwFw71MwSG9FKYDQ
    os-dev-report

    {
      "issue": 30588,
      "status": "done",
      "branch": "claude/project-thread-9mg01c",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/30640",
      "session": "session_01L6bhgXDwFw71MwSG9FKYDQ",
      "premise_still_valid": true,
      "summary": "The marketplace.* group left the ten language packs for a lazy @object-ui/i18n namespace (namespaces/marketplace, one catalogue per built-in language, new published subpath), except the keys Studio's packages page reads through MarketplaceRowActions, MarketplaceNotLoaded, dependencyMissing and protocolCheckSkipped (19 en leaves), which stay resident. Both marketplace pages render under MarketplaceNamespaceGate: the existing load skeleton until the console's language and en are in (again after a language switch), the console's resident error words with Try again on a failed fetch. i18n-locale-en reads 59,951 at bdbaf80c and 57,010 at 17e15c7f (ceiling 60,000 untouched, headroom 2,990); eager closure 2,204,342 to 2,201,442 with the same 103 chunk names. The i18n gates (call-site keys, dead keys, en drift) read the namespace beside each pack; registry.ts, pack file names and every PER_CHUNK value are unchanged. Found and fixed in this PR: the gate's skeleton on a language switch unmounted the package page body, which made SampleDataLeaveBanner raise its leave banner while the installer was still on the page; the frame now says when it holds the page back and the banner asks first. PR is 6,632 changed lines (41 files, +4,338 / -2,294), so it is over the 3,000-line human-merge line. One Acceptance-notes bullet in the PR body is wrong and needs the seat's edit (out_of_scope_findings, first entry).",
      "tests": "Head 17e15c7f. pnpm --dir ui exec vitest run packages/app-shell/src/console/marketplace packages/i18n: 150 files passed, 1960 tests passed, 13 skipped. metadata-admin (Studio's packages page) at ae5aac72: 780 files, 8133 passed, 1 skipped; later commits touch only the frame, the namespace hook, the banner and tests. New suites: marketplace-namespace.test.ts (56), marketplace-namespace-lazy.test.tsx (5), MarketplacePage.namespaceGate-30588.test.tsx (4), marketplaceNamespaceBoundary.test.ts (5), plus namespace cases in the call-site-keys and en-drift gate tests. Ablations via scripts/ablation-replace.mjs, each restored with blob == HEAD and git diff HEAD empty: MarketplacePage's gate wrapper replaced by a bare fragment, frame test 2 failed / 3 (first frame matched the raw-key pattern); the same on MarketplacePackagePage, 1 failed / 3; on 17e15c7f the banner guard line replaced, case 4 failed (the switch raised the zh banner while on the page). The same case 4 was red before the fix was written. Boundary test red at the 69ab56e1 packs (2 / 5, the eleven MarketplaceRowActions keys). Reverse type check on 17e15c7f against the rebuilt i18n dist: en.marketplace.action.uninstall compiled, en.marketplace.title gave exactly one TS2339; probe file removed, git status clean. Type-check exit 0: @object-ui/i18n, @object-ui/app-shell (source and tests), @object-ui/console type-check then build:plugin. eslint --no-inline-config on every changed file: 0 errors, no new warnings. Console CI=true vite build on bdbaf80c and 17e15c7f, check:eager-closure and check:eager-locale-catalogues exit 0.",
      "gates": "node scripts/pm/dispatch-gates.mjs --commands: 57 derived families, identical list at 9cf51c22 and 17e15c7f. Every one recorded exit 0; --ran on 17e15c7f: 57 derived, 57 run, 0 NOT-MEASURED, 0 UNRUN, exit 0. check:dual-build-cjs-loads first exited 3 (PREREQUISITE NOT MET, seven root dists absent: studio, client-react, embedder-openai, knowledge-memory, knowledge-ragflow, service-cluster-redis, service-knowledge); after turbo build of those seven it exited 0 (116 entry points across 71 packages). pnpm --dir ui exec vitest run scripts/ exited 1 on the first loop (check-vi-mock-inherit: two new chunk mocks did not spread the real module), fixed in 5268adc3, then exit 0 on 17e15c7f under the lock: 170 files passed, 2 skipped, 4979 tests. Re-run on 17e15c7f after the last commits, all exit 0: check:type-check-debt (under the lock), check:type-check-coverage, check:nul-bytes, check:test-source-alias, check:cross-package-test-inputs, check:published-files, check:undeclared-dep-imports, check:sourcemap-no-sources-content, check-empty-changeset, check-changeset-no-major, check-adr-0087-registration (verified runtime-interface-only on TranslationKeys). Outside the derived list: pnpm --dir ui run check:new-line-citations 0 new citations (one fixture address in the call-site gate test declared as fixture data); check:i18n-keys, check:i18n-dead-keys (same 94 entries as base), check-i18n-en-drift --base bdbaf80c, check-eager-closure-budget.test.ts (174): exit 0. CI families: PR check-runs not concluded when this report was written, in_progress.",
      "dogfood_battery": "17e15c7f · closure pnpm exec turbo run build --filter='@objectstack/dogfood^...' 69/69 tasks · pnpm --filter @objectstack/dogfood test inside an os-verify-lock hold: step exit 0, the hold's VERDICT command-exit 0 (held 1343s) · Test Files 420 passed, 3 skipped (423) · Tests 3496 passed, 36 skipped (3532) · no failure. An earlier full run on dffa45df read the same counts.",
      "mcp_calls": "6 — mcp__github__issue_read get, mcp__github__issue_read get_comments, mcp__github__pull_request_read get x3 (the card's earlier read, PR #30573 as a body example, PR #30640 read-back), mcp__github__list_pull_requests (no PR on the branch before create). No write tool.",
      "api_writes": "2 — fleet-write relay pr_create (repository_dispatch, run 42098146434, PR #30640, read-back 16459 bytes identical, assignees none) and this os-dev-report comment via post-stamped.mjs. git push is not a REST write.",
      "open_questions": [],
      "security_findings": "none",
      "out_of_scope_findings": [
        "carrier: seat · PR body correction, not a finding: the Acceptance notes bullet 'Out of scope, observed' about i18n-ns-studio-en being eager is wrong and should be struck. The i18n README's studio namespace section says its en catalogue is resident because it is the fallback, so the chunk being eager is by design.",
        "carrier: none · noted in the PR's Acceptance notes, not filed: a language switch while a marketplace page is open unmounts the page body behind the load skeleton, so a half-filled install dialog is lost and the page reads its package again; chosen over showing English for a moment."
      ]
    }

    Generated by Claude Code

  7. objectstack-fleet commented on Nov 5, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#1 · os-sales · session_01L6bhgWn6zhNa4LL7VB1rtL

    ACCEPT → PR #30640 comment 6668161639 · head 17e15c7f · 2026-11-05T20:12Z — CONTRACT_REVIEW_TIER PASS 6668069937. 6,632 changed lines (> 3,000): the PR stays draft and unarmed until an APPROVED review from os-zhuang or hotlong; the seat then readies and arms it. Follow-up from the review: #30645.

  8. objectstack-fleet commented on Nov 5, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#1 · os-sales · session_01L6bhgXDwFw71MwSG9FKYDQ
    os-dev-report

    {
      "issue": 30588,
      "status": "done",
      "branch": "claude/project-thread-9mg01c",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/30640",
      "session": "session_01L6bhgXDwFw71MwSG9FKYDQ",
      "premise_still_valid": true,
      "summary": "Patch round on the seat's order after PR #30653 (47c457b23) landed. origin/main merged into the branch with a merge commit (64857f64), no rebase. The ten packs conflicted only on the marketplace block this branch moved out: each was resolved hunk by hunk with this branch's side (git merge-file --ours on the three stages), so main's other edit in those files (77c203a3, the settingsHub subtitle) stays. 47c457b23's rewrite of marketplace.detail.purgeConfirmAtMost was carried into namespaces/marketplace/CODE.ts in all ten languages, every plural form (3 in en/zh/ja/ko/de, 4 in fr/es/pt, 5 in ru, 7 in ar). For every language, its pack deep-merged with its catalogue now deep-equals main's pack at 47c457b23. One test stub added (countLocalSampleData, the read the package page now makes). New head 54db079b; PR object 41 files, +4,339 / -2,294 = 6,633 changed lines, still a human merge.",
      "tests": "Head 54db079b. Old sentences: none of the 39 pre-47c457b23 purgeConfirmAtMost values (all ten languages) occurs in any namespace file, and grep for 'the number this install loaded' and '即本次安装载入的数量' over namespaces/marketplace has 0 hits. Equality check (tsx script importing each pack and its catalogue): all ten IDENTICAL to origin/main's packs, 174 to 198 namespace leaves plus 19 resident leaves per language. pnpm --dir ui exec vitest run packages/app-shell/src/console/marketplace packages/i18n: 150 files passed, 1980 tests passed, 13 skipped (includes #30653's updated MarketplacePackagePage suites and sampleDataNotice-30323's 20 cases). pnpm --dir ui exec vitest run scripts/: 170 files passed, 2 skipped, 4979 tests. Type-check exit 0: @object-ui/app-shell (source and tests), @object-ui/i18n, @object-ui/console type-check then build:plugin, after turbo build of the console's dependency closure.",
      "gates": "i18n gates on 54db079b: pnpm --dir ui run check:i18n-keys exit 0 (2051 files, 4335/4335 literal keys resolve); pnpm --dir ui run check:i18n-dead-keys exit 0, candidate list identical to the previous head's (only the test-importer census grew by two files); node scripts/check-i18n-en-drift.mjs --base origin/main exit 0 (packs at 47c457b23 vs the tree: 0 en values changed). Bundle: console CI=true vite build, i18n-locale-en 57,003 gz (ceiling 60,000, headroom 2,997; main's 77c203a3 shortened one en string), eager closure 2,204,636 gz over 103 chunks, no marketplace namespace, loader or frame chunk eager; check:eager-closure and check:eager-locale-catalogues exit 0. dispatch-gates --commands on 54db079b: the same 57 families; all 57 re-run on 54db079b, all exit 0; --ran: 57 derived, 57 run, 0 NOT-MEASURED, exit 0. CI on 54db079b when written: 47 success, 9 skipped, 0 failed.",
      "dogfood_battery": "54db079b · closure pnpm exec turbo run build --filter='@objectstack/dogfood^...' exit 0 · pnpm --filter @objectstack/dogfood test inside an os-verify-lock hold: step exit 0, the hold's VERDICT command-exit 0 (held 2136s) · Test Files 421 passed, 3 skipped (424) · Tests 3513 passed, 36 skipped (3549) · no failure.",
      "mcp_calls": "0 this round (GitHub reads through gh api: the PR object and the head's check runs).",
      "api_writes": "1 this round — this os-dev-report comment via post-stamped.mjs. git push is not a REST write. The PR body was not edited.",
      "open_questions": [],
      "security_findings": "none",
      "out_of_scope_findings": []
    }

    Generated by Claude Code

  9. objectstack-fleet commented on Nov 5, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#1 · os-sales · session_01L6bhgWn6zhNa4LL7VB1rtL

    re-ACCEPT → PR #30640 comment 6671207907 · head 54db079b · 2026-11-05T22:29Z. It replaces the ACCEPT on 17e15c7f (6668161639): origin/main merged after PR #30653 (#30616), whose purgeConfirmAtMost wording now lives in the namespace. 6,633 lines > 3,000: not readied, not armed. It waits for an APPROVED review by os-zhuang or hotlong on this head.

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

Metadata

Metadata

Assignees

Labels

bugSomething isn't workingdomain:uiDomain lane — seat card indexed by label:pm:seatpm:dispatchedDispatched to a dev agent by /pm-dispatchpriority:p1High: required for production / M2

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions