Skip to content

AI build surface UX from the 2026-10-05 cloud acceptance: land on the running app after a build, a placeholder that names the task, one usage meter, a ring that is not a spinner, and a localized scope chip #11658

Closed

Description

@hotlong

Source

objectstack-ai/cloud acceptance run, 2026-10-05: cloud main 4b38cd28, objectstack main 088428fb, objectui main 76993f8e. A new zh-CN free user built an app with AI, added a table, and asked a data question. The items below are the objectui half of cloud#2627, cloud#2634 and cloud#2435 item 8, all on the AI build surface. Each is accepted independently.

Rulings

The maintainer delegated these decisions to the epic PM on 2026-10-05: 「你不用找我确认,你自己确认」. Under that delegation:

  1. After the first AI build, land on the running app, not the designer. Today the page jumps to /_console/studio/<pkg>/interfaces?surface=dashboard:<name> on the 「设计」 tab, with the properties panel open (列数 / 间距 / 自动刷新, squeezed into narrow columns). ADR-0080 sets the direction as preview-first. Default the post-build landing to the 「运行」 tab of the same workbench (or the app home), with the properties panel collapsed; 「设计」 stays one click away. (cloud#2634 item 1)
  2. The in-app assistant placeholder names what the user can do, not the agent. console.ai.askAgent = 「向 {{agent}} 提问…」 renders 「向 构建 提问…」 inside a running app (packages/app-shell/src/console/ai/AiChatPage.tsx:2371, plus the floating panel). In an app context, use 「问问数据,或让我改改这个应用…」 (en: "Ask about your data, or ask me to change this app…"). (cloud#2634 item 3)
  3. The AI usage popover shows one meter. After a data question asked through the single composer, the popover read 「AI 搭建 19% · 数据问询 0%」 (meterBuild / meterAsk, zh.ts:1835-1836). The free cap is one shared pool, and the split cannot attribute a composer turn honestly, so drop the split and show the single figure. (cloud#2634 item 3)
  4. The usage ring must not look like a loading spinner. packages/app-shell/src/layout/AiUsageIndicator.tsx: at low usage, the ring is a short arc in the header, which reads as 「还在加载」 in every screenshot. Give it a full track (or a different glyph at low usage) so that it reads as a gauge. (cloud#2627 item 4)
  5. The plan card's scope chip is localized. packages/plugin-chatbot/src/ChatbotEnhanced.tsx:1421 and :4012 hard-code 'Adding to existing app', and the chip also shows the internal app id ("customer_management"). Localize it and show the app's label. (cloud#2435 item 8)

Acceptance

Per item: a screenshot of the same place after the fix, in zh-CN and en. Item 1 also needs the URL the build lands on. Item 5 also needs a test pinning that the chip has no ASCII-only literal.

Related

  • cloud#2627, cloud#2634, cloud#2435 (the cloud cards these items come from)
  • ADR-0080 (Studio preview-first)

Activity

  1. added
    enhancementNew feature or request
    pm:epicParent delegated to a dedicated epic PM — other PMs never dispatch into its subtree
    on Oct 5, 2026
  2. self-assigned this
    on Oct 5, 2026
  3. hotlong commented on Oct 5, 2026

    @hotlong
    ContributorAuthor

    Claim: epic #2636 PM loop round 1
    Session: session_64cb68a6-01c7-4dc6-acc6-ccb459c90ef2
    Account: hotlong
    Branch: claude/issue-11658-ai-build-surface-ux
    Worktree: ~/Documents/GitHub/objectui-issue-11658
    Epic: objectstack-ai/cloud#2636
    File surface: packages/plugin-chatbot/src/**, packages/app-shell/src/console/ai/**, packages/app-shell/src/layout/AiUsageIndicator.tsx (+ the post-build navigation site it finds), packages/i18n/src/locales/*, tests, .changeset (stop on breach; explain in the report)
    Container & model: M (judgment: five UX items), mode:subagent, model: opus (judgment tier)
    Thread-read: none
    Serial constraints cleared: objectui#11659 (shares packages/i18n/src/locales/*) is queued for round 2, not in flight

  4. objectstack-fleet commented on Oct 5, 2026

    @objectstack-fleet
    Contributor

    Triage: routing only — domain:ui added. This epic carried a state with no lane

    Triage seat (objectstack-wide, seat post objectstack-ai/objectstack#6015) · session_01AavokzJ5DndAwitDXvKy4U · 2026-10-05T13:53Z. ⛔ Not a claim, ⛔ not a dispatch; the assignee and the claim are untouched.

    Triage: lands in packages/app-shell (console AI pages, AiUsageIndicator), packages/plugin-chatbot and packages/i18n ⇒ domain:ui; rationale: the claim's file surface (5995563227) is all objectui console code, and the board's sweep flags a state without a lane.

    • The grade, the rulings recorded in the body (made by the epic PM under the maintainer's delegation), and the claim stand.

    Generated by Claude Code

  5. added
    domain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seat
    on Oct 5, 2026
  6. hotlong commented on Oct 6, 2026

    @hotlong
    ContributorAuthor

    os-dev-report

    {
      "issue": 11658,
      "repo": "objectstack-ai/objectui",
      "status": "done",
      "branch": "claude/issue-11658-ai-build-surface-ux",
      "head": "25d046b0c",
      "base": "846f98251",
      "pr": "https://github.com/objectstack-ai/objectui/pull/11662",
      "session": "session_64cb68a6-01c7-4dc6-acc6-ccb459c90ef2 (subagent: the parent's id)",
      "premise_still_valid": true,
      "summary": "All five items are implemented and each is pinned by its own test. Item 1: the built-moment transition passes STUDIO_RUN_LANDING router state. The Interfaces pillar opens in Run with the properties aside collapsed, and the first Design click restores the aside. Item 2: the app-scoped build agent's placeholder is console.ai.askOrChangeApp. Item 3: the popover shows one figure (console.ai.usage.poolUsed), and the split and its three keys are retired. Item 4: MeterGauge is a closed tone-coloured outline around a pie wedge. Item 5: both chip sites read chatbot.plan.extendTarget and show the app label through a new resolveAppLabel prop, with the machine name moved to the tooltip.",
      "gates": [
        {"cmd": "npx turbo run build --filter='@object-ui/app-shell^...' --concurrency=2", "exit": 0, "note": "28/28 tasks"},
        {"cmd": "(packages/i18n) pnpm run type-check", "exit": 0},
        {"cmd": "(packages/plugin-chatbot) pnpm run type-check", "exit": 0},
        {"cmd": "(packages/app-shell) pnpm run type-check", "exit": 0},
        {"cmd": "pnpm exec vitest run packages/plugin-chatbot/ packages/i18n/ --maxWorkers=3", "exit": 0, "note": "133 files passed; 1852 tests passed, 13 skipped; head 25d046b0c"},
        {"cmd": "pnpm exec vitest run packages/app-shell/ --maxWorkers=3", "exit": 0, "note": "1010 files passed, 1 skipped; 10008 tests passed, 9 skipped; head 25d046b0c"},
        {"cmd": "eslint --no-inline-config over the 20 changed .ts/.tsx files (narrowed)", "exit": 1, "note": "1 error, react-hooks/static-components in the DataPillar header of StudioDesignSurface.tsx. It already exists on the base file and is suppressed inline in normal runs. Per-rule counts at base and at head are identical for all 4 touched source files (StudioDesignSurface 1/18, AiChatPage 0/32, AiUsageIndicator 0/1, ChatbotEnhanced 0/10 errors/warnings). The repo-wide pnpm lint is left to CI."},
        {"cmd": "pnpm run check:i18n-keys", "exit": 0},
        {"cmd": "pnpm run check:i18n-drift", "exit": 0},
        {"cmd": "pnpm run check:i18n-dead-keys", "exit": 0, "note": "report-only; none of the new or retired keys are listed"},
        {"cmd": "pnpm run check:new-line-citations", "exit": 0, "note": "VERDICT: 0 new citations"},
        {"cmd": "node scripts/check-changeset-presence.mjs", "exit": 0},
        {"cmd": "pnpm run changeset:check", "exit": 0},
        {"cmd": "pnpm run check:changeset-claims", "exit": 0},
        {"cmd": "pnpm run check:pending-changeset-literals", "exit": 0}
      ],
      "files_changed": [
        "packages/app-shell/src/console/ai/AiChatPage.tsx",
        "packages/app-shell/src/console/ai/__tests__/AiChatPage.appContextComposer-11658.test.tsx (new)",
        "packages/app-shell/src/console/ai/__tests__/AiChatPage.builtLandsRunning-11658.test.tsx (new)",
        "packages/app-shell/src/layout/AiUsageIndicator.tsx",
        "packages/app-shell/src/layout/__tests__/AiUsageIndicator.test.tsx",
        "packages/app-shell/src/views/studio-design/StudioDesignSurface.tsx",
        "packages/app-shell/src/views/studio-design/studioLanding.ts (new)",
        "packages/app-shell/src/views/studio-design/StudioDesignSurface.runLanding-11658.test.tsx (new)",
        "packages/plugin-chatbot/src/ChatbotEnhanced.tsx",
        "packages/plugin-chatbot/src/__tests__/ChatbotEnhanced.extendChip-11658.test.tsx (new)",
        "packages/i18n/src/locales/{ar,de,en,es,fr,ja,ko,pt,ru,zh}.ts",
        ".changeset/11658-ai-build-surface-ux.md"
      ],
      "line_budget": "21 files, +946 / -133. About 710 of the added lines are tests. Locales: +3 keys and -3 keys in each of 10 packs.",
      "deviations": [
        "File surface: item 1's landing half is in packages/app-shell/src/views/studio-design/ (StudioDesignSurface.tsx, the new studioLanding.ts and its test), which is outside the claim's globs. I read it as '+ the post-build navigation site it finds', because the default tab and the collapsed panel are both state of the Interfaces pillar.",
        "Item 1 mechanism: router state, not a URL param. It is a one-shot arrival intent (Commandment #8), so a reload, a shared link or the 'Design in Studio' door still opens Design. The first Design click after the landing also re-opens the properties aside (one click to the full designer), unless the user has already toggled the aside themselves.",
        "Item 5: ChatbotEnhanced gains an optional resolveAppLabel prop (a widening, so the plugin-chatbot changeset is minor). planExtendLabel no longer defaults to an English string. The chip text keeps an inline defaultValue for provider-less hosts, the established pattern (useMetadataCountBits). The 'no ASCII-only literal' pin is on the rendered zh chip: no Latin-letter run at all, with a Chinese target label.",
        "The PR body says the app-shell suite result is in this report, because that suite finished after the PR was opened. Per the role rule (one body write), the body was not edited."
      ],
      "ablation": [
        "Method: python driver in the worktree (.rig-logs/ablate.py, not committed). For each run: anchor count must be exactly 1; mutate only the source; count the marker on disk; run vitest; restore with 'git checkout HEAD -- ABSPATH'; prove the on-disk blob hash equals the HEAD blob and 'git diff HEAD' is empty; re-run green. Tests resolve source via the root vitest aliases, so no dist rebuild was needed.",
        "item 1 pillar (landing state ignored): 2 failed / 3 passed -> restored 5/5 green, hash 0bcaa48d54 == HEAD",
        "item 1 pillar (Design does not hand the aside back): 1 failed / 4 passed -> restored 5/5, hash 0bcaa48d54 == HEAD",
        "item 1 producer (navigate without state): 2 failed / 1 passed -> restored 3/3, hash e568849c1c == HEAD",
        "item 2 (app-context branch removed): 2 failed / 3 passed -> restored 5/5, hash e568849c1c == HEAD",
        "item 3 (AiUsageIndicator.tsx reverted to base 846f98251; -t 'the popover figure'): 2 failed -> restored 2/2, hash 07e4dbb171 == HEAD",
        "item 4 (same revert; -t 'the gauge glyph'): 3 failed -> restored 3/3, hash 07e4dbb171 == HEAD",
        "item 5 (chip back to an English template literal): 4 failed / 2 passed (the en controls stay green, as expected) -> restored 6/6, hash e1e1f4ba8c == HEAD"
      ],
      "per_item": {
        "1_land_on_running_app": {"state": "done", "evidence": "StudioDesignSurface.runLanding-11658.test.tsx (5) and AiChatPage.builtLandsRunning-11658.test.tsx (3), plus the existing builtTransition suite green. Landing URL: /studio/PKG/interfaces, then ?surface=dashboard:NAME added by the pillar mirror, now in Run with the properties collapsed. NOT VERIFIED IN BROWSER."},
        "2_placeholder_names_task": {"state": "done", "evidence": "AiChatPage.appContextComposer-11658.test.tsx: zh renders the ruling's text exactly, en renders 'Ask about your data, or ask me to change this app…'; controls: cold-start build keeps 'Ask Build…', the ask agent keeps 'Ask anything…'. NOT VERIFIED IN BROWSER."},
        "3_one_usage_meter": {"state": "done", "evidence": "AiUsageIndicator.test.tsx 'the popover figure (one meter)': exactly one percentage in the popover ('19% used'), no split even when the wire carries it. NOT VERIFIED IN BROWSER."},
        "4_ring_not_spinner": {"state": "done", "evidence": "AiUsageIndicator.test.tsx 'the gauge glyph (not a spinner)' at 0 / 0.05 / 0.19: an undashed currentColor track with no opacity class around a pie wedge (stroke-width == 2r, inside the track, dash share == fraction). NOT VERIFIED IN BROWSER."},
        "5_scope_chip_localized": {"state": "done", "evidence": "ChatbotEnhanced.extendChip-11658.test.tsx (6): for both chip sites, the zh chip has no Latin-letter run and shows the label, not the machine name (the name is in the title attribute); en control; an unknown app shows its name. The host resolver is pinned in AiChatPage.appContextComposer-11658.test.tsx. NOT VERIFIED IN BROWSER."}
      },
      "premises": {
        "B1": "VERIFIED. The navigation is decided in objectui: ChatPane's built-moment effect calls paneNavigate to /studio/PKG/interfaces. ?surface=dashboard:NAME is appended by the Interfaces pillar's useSurfaceDeepLink mirror when it auto-opens the first nav leaf. Cloud supplies only the packageId in the build envelope. No cloud change is needed.",
        "B2": "PARTLY FALSIFIED. console.ai.askAgent is read at ONE source site (ChatPane's placeholder prop in AiChatPage.tsx). ChatPane has THREE hosts: the full-page AiChatPage, the console ChatDock (ChatDockConversation) and the Studio dock (StudioAiCopilot). Fixing the one site covers all three.",
        "B3": "VERIFIED. 'Adding to existing app' appeared twice in code in ChatbotEnhanced (the planExtendLabel default and the BlueprintProgressPanel extendLabel default), and once more in a JSDoc. All three are removed."
      },
      "screenshots": "NOT VERIFIED IN BROWSER, all five items. The console has no cheap mock mode for the AI build surface or the cloud usage endpoint, and the dispatch rules out booting a cloud stack. Left to the epic's final re-walk.",
      "out_of_scope_findings": [
        "class: observation (not filed) · The cold-start build surface (no package) still reads 'Ask Build…' / 「向 构建 提问…」. The ruling scopes item 2 to the in-app context. carrier: none (承接者:无); noted in PR Acceptance notes · dedupe words: askAgent placeholder cold start, 向 构建 提问, build surface placeholder",
        "class: dormant read (not filed) · useAiUsage still parses breakdown strictly, and no renderer reads it after item 3. carrier: none (承接者:无); noted in PR Acceptance notes · dedupe words: useAiUsage breakdown unused, AI usage split retire"
      ],
      "open_questions": [],
      "mcp_calls": "0",
      "api_writes": "2: POST repos/objectstack-ai/objectui/pulls (draft PR 11662); POST repos/objectstack-ai/objectui/issues/11658/comments (this report). git push is not counted as a REST write."
    }

    Generated by Claude Code

  7. hotlong commented on Oct 6, 2026

    @hotlong
    ContributorAuthor

    Review: ACCEPT (epic objectstack-ai/cloud#2636 PM, session 64cb68a6-01c7-4dc6-acc6-ccb459c90ef2)

    PR #11662 at head 25d046b0c was checked against GitHub, not against the report.

    • CI on head: 40 success, 3 skipped (path filters), 0 failed. mergeable_state = clean.
    • Diff: 21 files, +946/−133. About 710 of the added lines are tests. The 10 locale packs each add 3 keys and retire 3 (meterBuild / meterAsk / the split go away; askOrChangeApp, poolUsed, extendTarget come in).
    • Independent re-run in the dev's worktree (clean, HEAD 25d046b0c): 5 files / 41 tests passed:
      • AiChatPage.appContextComposer-11658
      • AiChatPage.builtLandsRunning-11658
      • StudioDesignSurface.runLanding-11658
      • ChatbotEnhanced.extendChip-11658
      • AiUsageIndicator
    • Per item (item 1 lands on Run with the panel collapsed, and the first Design click reopens it):
      • Each of the 5 items is pinned by its own test.
      • Each test goes red under its own ablation.
      • Each restore is proven by hash.
    • Premises:
      • B1 is verified: objectui decides the post-build navigation, and no cloud change is needed.
      • B2 is partly falsified: one placeholder site serves all three ChatPane hosts.
    • Accepted deviation: the views/studio-design/ files sit outside the claimed globs. They are the site that "+ the post-build navigation site it finds" was meant to admit.
    • NOT VERIFIED IN BROWSER: all five items. The epic's final re-walk on cloud, after the .objectui-sha move, carries the screenshots.
    • Left open, noted in the PR:
      • The cold-start build page (no app) still reads 「向 构建 提问…」. Item 2 was ruled for the in-app case only.
      • useAiUsage still parses a breakdown that nothing displays.

    Flipping to ready and queueing. objectui#11659 shares the locale packs. Whichever lands second merges main.

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 seatenhancementNew feature or requestpm:dispatchedpm:epicParent delegated to a dedicated epic PM — other PMs never dispatch into its subtree

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions