Skip to content

AI build page: the live preview header says 「home_renovation_management(未发布 · 仅自己可见)」 for a published build and never updates; the progress panel and footnote show machine names / Studio #26469

Closed

Description

@objectstack-fleet

Filing gate ① a reproduced UX defect (class a, public door: the AI build page). reach: one browser, local stack, cloud PR #3297 head 4e7ee6d5 + framework pin 6390fe52 (ui from ui/), zh-CN, 2026-10-27. On a first whole-app build:

  • The chat's result card says 「已搭建并上线 · 家装项目管理 · 核对通过 6/6」 and 「已发布 · Verified」.
  • The side preview's header says 「运行预览 · home_renovation_management(未发布 · 仅自己可见)」: the app's machine name, and a state that contradicts the card. It never updates.
  • During the build, the progress panel lists machine names (u9ba_customer, u9ba_project.project_list, …).
  • The finished card's footnote says 「之后的修改先存草稿,由你在 Studio 发布。」 while the page itself offers 发布.

Batch-of: 5 · 2026-10-27 re-test of the 2026-10-25 desktop E2E after the fixes. Filed at the maintainer's request: 「完整的再测试一遍」 / 「必要的合理的建议都可以立卡」. Reviewed in-session before filing.

Business reason. This is the first screen after the magic moment. Two parts of the same page disagree on whether the app is live, and the preview names it with an identifier the customer never typed. "未发布 · 仅自己可见" next to "已上线" makes the customer doubt the one thing the build was for: that their colleagues can use the app now.

Reader who acts. The domain:ui seat: ui/packages/app-shell/src/console/ai/ and ui/packages/plugin-chatbot. The cloud half (frames carry label; cloud posture strings) is the cloud card filed alongside.

Where (pin 6390fe52; none of these files changed on objectstack main 6746140361)

  • Header state: app-shell/src/console/ai/LiveCanvas.tsx:34-41, 108-121. 未发布 is keyed solely on materialized (string i18n/src/locales/zh.ts:1951 / en.ts:2343, "unlisted until published", ADR-0045). mapMessages.ts:1097 copies only materialized, never appHidden. This build's envelope has "materialized":true,"appHidden":false (listed = live). No publish signal reaches canvasApp, so it cannot change even after the chat's buildIsLive (ChatbotEnhanced.tsx:4179-4184) flips. The ADR-0045 copy predates the "first build goes live at once" posture (cloud#2924 / ADR-0096 (execution-surface identity admission) + fixes for the 3 confirmed-exploitable holes it surfaced (#2980, #2981, #2982) #2975).
  • Header name: AiChatPage.tsx:1820, 1828-1833 passes the app artifact's machine name (fed from ChatbotEnhanced.tsx:2464-2481). The envelope's checklist.app.label, which the result card uses, is never passed.
  • Progress items: plugin-chatbot/src/ChatbotEnhanced.tsx:5363-5366 renders entry.display = it.name.replace(/_sample$/, '') (list :5444-5478). ChatBuildProgress.items (:210) has no label.
  • Footnote: i18n/src/locales/zh.ts:3905 / en.ts:4474 chatbot.build.draftPosture, rendered at ChatbotEnhanced.tsx:5577.

Expected

  • The header derives its state from appHidden / buildIsLive and updates on publish. A listed, published app does not say 未发布.
  • The header shows checklist.app.label (家装项目管理).
  • Progress items render label ?? name.
  • draftPosture names the in-chat 发布.

Dedupe

gh api search/issues, incl. closed:

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 27, 2026
  2. objectstack-fleet commented on Oct 27, 2026

    @objectstack-fleet
    ContributorAuthor

    Cross-link, 2026-10-27T04:29Z: the cloud half (the data-build-progress frames carry label, and the cloud posture strings) is objectstack-ai/cloud#3310. Until it lands, the progress panel has only name to show.

  3. objectstack-fleet commented on Oct 27, 2026

    @objectstack-fleet
    ContributorAuthor

    Triage: audit line · triage seat · session_01AavokzJ5DndAwitDXvKy4U · 2026-10-27T05:13Z

    ⛔ Not a claim, ⛔ not a dispatch. The filer's labels are read and kept; this is the triage line an execution seat needs before it claims.

    • Triage: lands in the AI build page's preview header and progress panel (ui/); rationale: p2 · domain:ui · area:ai. Show the app's label and the publish state the result card already holds, and labels rather than machine names in the progress panel. Read the state from the one source the card uses.

    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 27, 2026
  5. objectstack-fleet commented on Oct 27, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim: PM loop round 1
    Session: session_017iXjUm1rujwDk7f3KT1Pkk (seat); implementing card thread session_01ADHkmQw9ePD2KCzPfJGa6p
    Account: os-steve
    Branch: claude/project-thread-ore7se (platform-assigned card-thread branch; a card thread can push only its assigned branch, and the name carries no issue number, so this claim is the identity record)
    Worktree: the card thread's own container
    Domain: domain:ui
    Seat: domain:ui#1
    File surface: ui/packages/app-shell/src/console/ai/ (LiveCanvas.tsx, AiChatPage.tsx, mapMessages.ts), ui/packages/plugin-chatbot/src/ChatbotEnhanced.tsx (build progress list and footnote only), the preview-header / chatbot.build.draftPosture strings in ui/packages/i18n/src/locales/, their tests, one root changeset (stop on breach; explain in the report). ⛔ ui/.github/** and the root .github/workflows/ci.yml are out of bounds (maintainer's word, ui-merge epic in flight). Changeset in the root .changeset/.
    Container & model: M, mode:thread, model: TIER_DEFAULT (dispatch-gates --tier: no path-derived mandate), effort: medium
    Clause-②: no (an additive label on ChatBuildProgress.items is not a narrowing)
    Metadata-protocol: none
    Responsibility: n/a: renderer defect in ui/, the producing code is the cited ui file; no platform path covers it; reached through the public Console
    Thread-read: 6434348323
    Premise: holds (read-only premise check at origin/main, 2026-10-27T05:30Z; spot-checked by the seat)
    Serial constraints cleared: ChatbotEnhanced.tsx shared with #26471, which goes after this card; layout/ left to #26470

    Dispatch order handed to the card thread by the project coordinator (three partitions: ruling / mechanism hypotheses / suggested route); the dev does not claim, and starts only once this claim names its branch.

  6. objectstack-fleet commented on Oct 27, 2026

    @objectstack-fleet
    ContributorAuthor

    os-dev-report

    {
      "issue": 26469,
      "status": "done",
      "branch": "claude/project-thread-ore7se",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/26538",
      "session": "session_01ADHkmQw9ePD2KCzPfJGa6p",
      "premise_still_valid": true,
      "summary": "The Live Canvas header now reads the build card's own answer: ChatbotEnhanced gains the optional onBuildResult({appName,label,live}) prop, reported by BuildProgressPanel from the values its title renders; AiChatPage keeps it per app and LiveCanvas shows the label and drops 「未发布 · 仅自己可见」 when the card says live (new key console.ai.liveCanvasLive), following the card on publish. buildIsLive also holds for materialized + appHidden:false (DraftReview lifts appHidden). Progress items render label ?? name (extractBuildProgress keeps label; ChatBuildProgress.items gains optional label). chatbot.build.draftPosture names the in-chat Publish in all ten locales. The 发布 (N) block is untouched.",
      "tests": "At af7a3dae. Targeted: 7 files / 90 tests passed (3 new files: ChatbotEnhanced.buildResultHeader-26469 9, LiveCanvas.header-26469 4, AiChatPage.canvasHeader-26469 4). plugin-chatbot package 85 files / 814 passed; i18n package 87 files, 1353 passed, 13 skipped; app-shell src/console/ai/ 45 files / 245 passed (declared narrowing; whole app-shell left to CI). Ablations via scripts/ablation-replace.mjs (anchor 1->0, restored blob == HEAD, git diff HEAD empty; ui vitest aliases src, no build): AiChatPage handleBuildResult live:false -> 2 failed/2 passed; LiveCanvas displayName=appName -> 3 failed/1 passed; LiveCanvas live branch off -> 1 failed/3 passed; buildIsLive appHidden arm off -> 1 failed/8 passed. Forced test edits: buildChat-12724 posture sentence; de-quote-pairing-3876 pins 96->97 (new paired span „Veröffentlichen“).",
      "gates": "dispatch-gates --commands at af7a3dae: 35 commands, each exit 0 (ui scripts/ vitest: 178 files passed, 2 skipped, 5097 tests); --ran: 35 derived, 35 run, 0 NOT-MEASURED (derived zero). Also ui check:i18n-keys / i18n-drift / i18n-dead-keys / i18n-designer-parity exit 0; type-check of @object-ui/plugin-chatbot, i18n, app-shell exit 0 after turbo build of app-shell^... . PR check-runs: in_progress at report time (CI owns the convergence).",
      "dogfood_battery": "n/a — no `!` in the PR title and no (narrowing) arm",
      "mcp_calls": "5 — mcp__github__issue_read x5 (get, get_comments x4); no write tool",
      "api_writes": "2 — pr_create (PR #26538) via fleet-write relay; this os-dev-report comment via post-stamped.mjs. git push is not a REST write.",
      "line_budget": "14 source/locale files + 3 new test files + 2 forced test edits + 1 changeset",
      "deviations": [
        "File surface widened by seat 1 (accepted 05:31Z): plugin-chatbot/src/mapMessages.ts (the claim listed it under app-shell), and in ChatbotEnhanced.tsx the onBuildResult prop + destructure, its pass at the BuildProgressPanel mount, and the buildIsLive appHidden arm, all outside 'progress list and footnote' and away from the 发布 (N) block.",
        "Forced test edit outside the claim's named tests: ui/packages/i18n/src/__tests__/de-quote-pairing-3876.test.ts (count pins 96->97)."
      ],
      "files_changed": [
        ".changeset/26469-ai-build-canvas-header-labels.md",
        "ui/packages/app-shell/src/console/ai/AiChatPage.tsx",
        "ui/packages/app-shell/src/console/ai/LiveCanvas.tsx",
        "ui/packages/app-shell/src/console/ai/LiveCanvas.header-26469.test.tsx",
        "ui/packages/app-shell/src/console/ai/__tests__/AiChatPage.canvasHeader-26469.test.tsx",
        "ui/packages/i18n/src/locales/{ar,de,en,es,fr,ja,ko,pt,ru,zh}.ts",
        "ui/packages/i18n/src/__tests__/de-quote-pairing-3876.test.ts",
        "ui/packages/plugin-chatbot/src/ChatbotEnhanced.tsx",
        "ui/packages/plugin-chatbot/src/mapMessages.ts",
        "ui/packages/plugin-chatbot/src/__tests__/ChatbotEnhanced.buildChat-12724.test.tsx",
        "ui/packages/plugin-chatbot/src/__tests__/ChatbotEnhanced.buildResultHeader-26469.test.tsx"
      ],
      "open_questions": [
        {
          "question": "When the card says live but the build was not materialized (auto-publish environment), should the canvas iframe also leave the draft overlay for the real app URL?",
          "options": [
            "A keep the iframe keyed on materialized (this PR): only the header text follows the card",
            "B also open the real URL when live"
          ],
          "recommendation": "A, because with no pending drafts the overlay already shows the published app, and moving the iframe is outside this card's header/progress scope"
        }
      ],
      "out_of_scope_findings": [
        "carrier: cloud — objectstack-ai/cloud#3310 (frames carry label, cloud posture strings); noted, not filed"
      ]
    }

    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:p2Medium: important, M3

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions