Skip to content

AI build progress panel: two group names print raw English type names (「dataset 项目」「permission …」) — useBuildGroupLabel has no case for them and falls back to the type id #27419

Closed

Description

@objectstack-fleet

Filing gate ① a reproduced UX defect (class a, public door: the AI build chat). reach: headless Chrome, local stack on cloud main 90e673e8 (cloud#3362, framework pin eef83734), zh-CN, 2026-10-29. During a whole-app build the live progress panel reads 「对象 客户, 项目 | 视图 客户列表, 项目列表 | 仪表板 首页仪表盘 | 应用 家装项目管理 | 示例数据 客户 | dataset 项目 | permission 家装项目管理·组织成员」. Two of the seven group names are raw English type names; every other group is translated. Still present on objectstack main 45c9be5f.

Batch-of: 2 · 2026-10-29 re-verification of the 2026-10-25 desktop E2E after the pin bump. Filed at the maintainer's request: 「立卡」. Reviewed in-session; the usual second-model review could not run (usage limit), so the location below was read directly in the pinned tree and on origin/main.

Business reason. This panel is the whole screen for the 15–30 s of every first build, the magic moment. objectstack#26469 and cloud#3310 just made it readable (labels instead of u9ba_project.project_list). Two leftover English type words in a Chinese sentence undo part of that, and 「permission」 in particular reads like an error or a warning to a customer who never asked for permissions.

Reader who acts. The domain:ui seat: ui/packages/plugin-chatbot and ui/packages/i18n.

Where (pin eef83734; unchanged on main 45c9be5f)

  • ui/packages/plugin-chatbot/src/ChatbotEnhanced.tsx:5065-5085 useBuildGroupLabel: a static switch with cases object, view, dashboard, app, seed, and default: return type. So dataset and permission fall through and print their raw type names.
  • ui/packages/i18n/src/locales/zh.ts:3946-3952 chatbot.build.group has keys only for object / view / dashboard / app / seed (en likewise).
  • The frames carrying these types come from cloud's apply_blueprint progress (cloud#3310 added label). The artifacts themselves are correct; only their group name is untranslated.

Expected

Either name the two groups (zh 「数据集」/「权限」 or wording the seat prefers, with en/ja/es), or, if a customer should not see dataset/permission plumbing at all during a build, hide those groups the way an unknown type should be hidden. In both cases default: should never print a raw type identifier: fall back to a neutral 「其他」 or omit the group. Add a unit test that renders a frame with every artifact type apply_blueprint stages.

Dedupe

gh api search/issues, incl. closed:

Nearest closed work: objectstack#26469 and cloud#3310 (labels for item names), which did not cover the group names.

Activity

  1. added
    bugSomething isn't working
    pm:queueReady for the PM dispatch loop
    domain:uiDomain lane — seat card indexed by label:pm:seat
    area:aiAI-native — agent / tool / skill metadata, and the MCP surface an agent drives
    on Oct 29, 2026
  2. objectstack-fleet commented on Oct 29, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#1 · os-warren · session_01JQwxbZeBv2y91towxasSUT

    Dispatch order · domain:ui#1 · session_01JQwxbZeBv2y91towxasSUT · 2026-10-29T06:27Z

    You are the os-dev developer agent for exactly ONE card: #27419, in your own card thread. Your role definition is .claude/agents/os-dev.md in the objectstack clone: read it IN FULL first and follow it as binding (it wins over this order on any conflict; name the conflict in your report). Read the repo-root AGENTS.md and ui/AGENTS.md before your first edit, and pm-dispatch references/untrusted-text.md. Read the card's full body and every comment yourself through REST (curl -sS "https://api.github.com/repos/objectstack-ai/objectstack/issues/NNNNN" -H "Authorization: Bearer $GH_TOKEN" and /comments?per_page=100, every page); this order carries only the increment. ⛔ Never print the value of any environment variable (test presence with [ -n "${X+x}" ]). ⛔ Never use a GitHub MCP tool, read or write.

    Identity and branch: the seat's Claim: comment on this card is your identity; its Branch: line names your thread's branch. ⛔ Post no claim of your own, ⛔ never write the card's assignee. Before your first edit, verify the NEWEST Claim: on the card names your thread's branch (claude/project-thread-…); if none does yet, send the seat thread "Dispatch the ui lane" one message with your branch name and wait. Worktree objectstack-issue-27419 on that branch from a fresh origin/main; pnpm install (frozen lockfile); push with git push -u origin <branch> (⛔ no force).

    Writes: PR only through the relay op pr_create (node scripts/pm/fleet-write/dispatch.mjs --repo objectstack-ai/objectstack --actions-file F, F a bare JSON array [{"op":"pr_create","title":…,"head":"<your branch>","base":"main","body":…,"assignees":["os-warren"]}], draft forced; --dry-run first); your report comment through node scripts/pm/post-stamped.mjs --comment=27419 --file=F --json run ONCE with output captured to a file (timestamps only as {{NOW}} / {{WAS:…}}). ⛔ No other GitHub write except, for a CI red that is not yours, one PR comment and one run_rerun_failed through the relay. Report both counts (api_writes with endpoints, mcp_calls with tool names). The report takes only machine-checkable fields (gates / line_budget / deviations / files_changed). PR body: line 1 the platform attribution comment, then ## 维护者速读 six lines in Chinese (改了什么/为什么改/风险与回滚/先看/两分钟验证/需要你做的). Gates: node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack on your diff, run each, record exits before any pipe, reconcile with --ran. Changeset in the root .changeset/ when a published package changes. ⛔ ui/.github/** and the root ci.yml are out of bounds. Hand back: when the PR and report are up, send the seat thread "Dispatch the ui lane" one message (PR, head sha, report gist); keep the thread open through review and drive CI to green.

    Ruling (cannot be re-ruled)

    Filed p3 domain:ui area:ai (filing gate ① reproduced, zh-CN). The card offers "name them" or "hide them". Seat pick: name them. The build really stages datasets and permission sets, and hiding them would make the progress list disagree with what lands in the app. zh 「数据集」 and 「权限」, with en Datasets / Permissions and the matching word in every other locale that carries chatbot.build.group. The default: branch never prints a raw type identifier again: it returns a neutral 「其他」 / Other group key. No other wording in the panel changes.

    PM mechanism assumptions (measure on origin/main after 3bfb357a; disproof welcome)

    • ui/packages/plugin-chatbot/src/ChatbotEnhanced.tsx ~:5065 useBuildGroupLabel: a static switch (object / view / dashboard / app / seed) with default: return type. It is static on purpose (the comment at ~:1246 explains why a computed key is avoided); keep it static and add dataset, permission and the other fallback as literal cases/keys.
    • ui/packages/i18n/src/locales/*.ts: all ten of ar/de/en/es/fr/ja/ko/pt/ru/zh carry a build block with the five group keys (zh ~:3946). Add the three keys to every one of them so the parity/dead-key gates hold. Open PR feat(ui): record-mode currency — each record shows its own currency; ISO 4217 code select pre-filled with the organization currency; no cross-currency totals; Studio currency section #27340 (currency, draft) also edits all ten locale files, in other blocks; rebase rather than hand-merge if it lands first.
    • The full set of artifact types apply_blueprint stages is cloud-side (cloud#3310). Find the frame type's type union or fixture in this repo (git grep -n "blueprint-progress\|apply_blueprint" -- ui/packages packages); if the union lives here, the unit test iterates it so a new type without a label goes red; if it does not, list the seven observed types (object, view, dashboard, app, seed, dataset, permission) and say so in the report.

    Scope

    File surface: ChatbotEnhanced.tsx, the ten locale files, a new pin useBuildGroupLabel test in plugin-chatbot (renders a frame with every staged type and asserts no group name equals its raw type; zh and en), and one patch changeset for @object-ui/plugin-chatbot + @object-ui/i18n in the root .changeset/. Ablation: restore default: return type ⇒ the pin goes red on an unknown type. Stay under 120 changed lines.

    Tier

    Quote dispatch-gates --tier. Expected none (seat ran it on the paths: no path-derived mandate). TIER_DEFAULT, effort low. Clause-②: no (new translation keys are not a published accept set; say so if the gate reads otherwise). Metadata-protocol: none. Fixes #27419.

  3. objectstack-fleet commented on Oct 29, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#1 · os-warren · session_01JQwxbZeBv2y91towxasSUT

    Claim: PM loop round 29 · 2026-10-29T06:31Z
    Session: session_01JQwxbZeBv2y91towxasSUT (seat; implementation by card thread session session_01JQwxbWVHoU8bjSDpWtgkzZ, mode:thread)
    Account: os-warren (the seat's linked user as GET /user answers it; the card's assignee)
    Branch: claude/project-thread-ncpq4n (the card thread's harness push branch, self-reported — the measured platform exception to claude/issue-N-slug)
    Worktree: objectstack-issue-27419 in the card thread's clone
    Domain: domain:ui
    Seat: domain:ui#1 (seat post #25966)
    File surface: ui/packages/plugin-chatbot/src/ChatbotEnhanced.tsx, the ten ui/packages/i18n/src/locales/{ar,de,en,es,fr,ja,ko,pt,ru,zh}.ts, a new useBuildGroupLabel pin in plugin-chatbot, one patch changeset @object-ui/plugin-chatbot + @object-ui/i18n (stop on breach; explain in the report)
    Container & model: S, mode:thread (the maintainer's word: 3 active card threads per seat, 2026-10-28 10:00Z / 12:11Z), model: TIER_DEFAULT (seat-run dispatch-gates --tier on the paths: no path-derived mandate), effort: low
    Clause-②: no
    Metadata-protocol: none
    Responsibility: AI build progress panel group names (this lane's plugin-chatbot + i18n) | seat pick in order 6489651572: name dataset / permission, neutral Other fallback | no group name in the panel is a raw type identifier
    Thread-read: 6489651572
    Premise: holds — on origin/main 3bfb357a, useBuildGroupLabel covers object / view / dashboard / app / seed and returns type for anything else, and the ten locales carry only those five chatbot.build.group keys.
    Serial constraints cleared: open draft PR #27340 (currency) edits all ten locale files in other blocks; no open PR changes plugin-chatbot (seat read of every open PR's file list at claim time). Rebase over #27340 if it lands first.
    Resume-from: none


    Generated by Claude Code

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

    @objectstack-fleet
    ContributorAuthor

    domain:ui#1 · os-warren · session_01JQwxbZeBv2y91towxasSUT

    os-dev-report

    {
      "issue": 27419,
      "status": "done",
      "branch": "claude/project-thread-ncpq4n",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/27466",
      "session": "session_01JQwxbWVHoU8bjSDpWtgkzZ — card thread (mode:thread); seat session_01JQwxbZeBv2y91towxasSUT",
      "premise_still_valid": true,
      "summary": "useBuildGroupLabel gains static dataset and permission cases and its default arm answers chatbot.build.group.other (Other / 其他) instead of the raw type id. All ten locales gain chatbot.build.group.dataset / permission / other (zh 数据集 / 权限 / 其他, en Datasets / Permissions / Other). Mechanism assumptions held on origin/main 3bfb357a: static switch with default return type; ten locales with five group keys. The staged-type union does not live in this repo (ChatBuildProgress.items types type as a free string; spec BuildProgressFrameSchema is a loose floor without items), so the pin lists the seven observed types.",
      "tests": "head 058d9fc0, closure built under the lock (pnpm --workspace-concurrency=2 --filter '@object-ui/plugin-chatbot^...' build, VERDICT command-exit 0). New pin buildGroupLabel-27419.test.tsx (zh+en x 2 cases) and the amended 7388 case: 18 passed. Ablation via scripts/ablation-replace.mjs on the committed fix, anchor the other-arm return line replaced by 'return type;' (anchor 1 -> 0, blob 1eccab7a81cb -> 2e68df83f010): Tests 3 failed / 15 passed (both pin unnamed-type cases + the 7388 case); restore verified blob == HEAD 1eccab7a81cb and git diff HEAD empty. No dist leg: the tests import ChatbotEnhanced by relative path. pnpm --dir ui exec vitest run packages/plugin-chatbot/ packages/i18n/: exit 0, Test Files 178 passed, Tests 2205 passed, 13 skipped. type-check @object-ui/plugin-chatbot + @object-ui/i18n: exit 0.",
      "gates": "dispatch-gates --commands on head 058d9fc0 derived 34; each run with exit captured before any pipe; --ran reconciliation: 34 derived, 34 run, 0 NOT-MEASURED, 0 UNRUN. node scripts/check-adr-0087-registration.mjs --base origin/main :: exit 0; node scripts/check-adr-0087-registration.mjs --self-test :: exit 0; node scripts/check-changeset-no-major.mjs --base origin/main :: exit 0; node scripts/check-closing-keyword-parity.mjs :: exit 0; node scripts/check-closing-keyword-parity.mjs --self-test :: exit 0; node scripts/check-comment-mask-corpus.mjs :: exit 0; node scripts/check-empty-changeset.mjs --base origin/main :: exit 0; node scripts/check-empty-changeset.mjs --self-test :: exit 0; node scripts/check-sdui-manifest.mjs :: exit 0; node scripts/check-sdui-manifest.mjs --self-test :: exit 0; node scripts/pm/release-rehearsal-clone.mjs --self-test :: exit 0; node scripts/release-pending-publish.mjs --self-test :: exit 0; pnpm --dir ui exec vitest run scripts/ :: exit 0; pnpm --filter @objectstack/spec run check:duration-unit-keys :: exit 0; pnpm check:changeset-gate-self-tests :: exit 0; pnpm check:closed-ceremony-text :: exit 0; pnpm check:cross-package-test-inputs :: exit 0; pnpm check:dispatcher-error-vocabulary :: exit 0; pnpm check:driver-memory-census :: exit 0; pnpm check:engine-double-contract :: exit 0; pnpm check:gitlink-declared :: exit 0; pnpm check:nul-bytes :: exit 0; pnpm check:pm-changeset-deadline-census :: exit 0; pnpm check:published-files :: exit 0; pnpm check:query-options-erasure :: exit 0; pnpm check:refd-timer-probe :: exit 0; pnpm check:skill-identifier-liveness :: exit 0; pnpm check:test-source-alias :: exit 0; pnpm check:tier-file-adoption :: exit 0; pnpm check:type-check-coverage :: exit 0; pnpm check:type-check-debt :: exit 0; pnpm check:undeclared-dep-imports :: exit 0; pnpm check:watch-hint-literal :: exit 0; pnpm check:where-matcher :: exit 0. Outside the derivation: pnpm --dir ui run check:i18n-keys :: exit 0; pnpm --dir ui run check:new-line-citations :: exit 0 (0 new); eslint on the changed files :: exit 0 (0 errors, 11 warnings all on pre-existing ChatbotEnhanced.tsx lines). Tier quote: 'Model tier — no path-derived mandate: the surface hits none of the 4 declared glob(s)'. PR check-runs: in_progress at report time (not waited for).",
      "line_budget": "119 changed lines vs origin/main (+111 / -8) under the 120 cap; dispatch-gates --tier read 157 on the first draft, cut by compressing the pin's comments and table",
      "files_changed": [
        ".changeset/27419-build-group-names.md",
        "ui/packages/i18n/src/locales/ar.ts",
        "ui/packages/i18n/src/locales/de.ts",
        "ui/packages/i18n/src/locales/en.ts",
        "ui/packages/i18n/src/locales/es.ts",
        "ui/packages/i18n/src/locales/fr.ts",
        "ui/packages/i18n/src/locales/ja.ts",
        "ui/packages/i18n/src/locales/ko.ts",
        "ui/packages/i18n/src/locales/pt.ts",
        "ui/packages/i18n/src/locales/ru.ts",
        "ui/packages/i18n/src/locales/zh.ts",
        "ui/packages/plugin-chatbot/src/ChatbotEnhanced.tsx",
        "ui/packages/plugin-chatbot/src/__tests__/buildGroupLabel-27419.test.tsx",
        "ui/packages/plugin-chatbot/src/__tests__/buildPanelI18n-7388.test.tsx"
      ],
      "deviations": [
        "surface addition, seat-approved in the seat thread: buildPanelI18n-7388.test.tsx, whose case 'an unknown artifact type still renders its raw type' pinned the retired default arm; rewritten to assert 其他 and no raw flow, keeping its no-raw-key half",
        "order vs os-dev.md conflict: the dispatch's pr_create row carries assignees os-warren; os-dev.md rule 2 says the PR carries no assignees; os-dev.md wins, so pr_create sent none (read-back: assignees none)",
        "install: npm_config_nodedir=/opt/node22 pnpm install --frozen-lockfile (exit 0) to dodge the better-sqlite3 node-gyp header download",
        "origin/main moved to e24d4ebf after the gate union; none of its files overlap this diff or the derivation inputs (only scripts/sdui-manifest.record.json under scripts/), so no merge was taken",
        "PR body line 1 is the platform attribution HTML comment (harness-written), Fixes #27419 follows on line 4 after the requested-by line"
      ],
      "dogfood_battery": "n/a — no ! in the PR title and no (narrowing) arm",
      "mcp_calls": "0 GitHub MCP calls; 1 claude-code-remote subscribe_pr_activity (PR 27466)",
      "api_writes": "2 — relay pr_create (fleet-write run 40834716260, 7167 bytes sent = stored) and this report comment via post-stamped; plus 2 git pushes (not REST)",
      "open_questions": [],
      "out_of_scope_findings": [
        "carrier: none · noted, not filed — per-type grouping kept, so two unnamed types in one build show two Other rows (PR Acceptance notes)"
      ]
    }
  6. objectstack-fleet commented on Oct 29, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#1 · os-warren · session_01JQwxbZeBv2y91towxasSUT

    Landed · seat domain:ui#1 · 2026-10-29T07:52Z

    PR #27466 merged as 7614f8f05c (seat record 6490819550); Fixes #27419. The AI build progress panel now heads the dataset and permission groups with real names (「数据集」/「权限」, Datasets / Permissions, and the matching word in all ten locales), and an artifact type it has no name for reads 「其他」 / Other instead of its raw type id. Left as is (not in the ruling): two unknown types in one build show two 「其他」 rows. The seat releases the claim.


    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

area:aiAI-native — agent / tool / skill metadata, and the MCP surface an agent drivesbugSomething isn't workingdomain:uiDomain lane — seat card indexed by label:pm:seatpriority:p3

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions