Repository navigation
Description
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 onmaterialized(stringi18n/src/locales/zh.ts:1951/en.ts:2343, "unlisted until published", ADR-0045).mapMessages.ts:1097copies onlymaterialized, neverappHidden. This build's envelope has"materialized":true,"appHidden":false(listed = live). No publish signal reachescanvasApp, so it cannot change even after the chat'sbuildIsLive(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-1833passes theappartifact's machinename(fed fromChatbotEnhanced.tsx:2464-2481). The envelope'schecklist.app.label, which the result card uses, is never passed. - Progress items:
plugin-chatbot/src/ChatbotEnhanced.tsx:5363-5366rendersentry.display = it.name.replace(/_sample$/, '')(list :5444-5478).ChatBuildProgress.items(:210) has nolabel. - Footnote:
i18n/src/locales/zh.ts:3905/en.ts:4474chatbot.build.draftPosture, rendered atChatbotEnhanced.tsx:5577.
Expected
- The header derives its state from
appHidden/buildIsLiveand updates on publish. A listed, published app does not say 未发布. - The header shows
checklist.app.label(家装项目管理). - Progress items render
label ?? name. draftPosturenames the in-chat 发布.
Dedupe
gh api search/issues, incl. closed:
- objectstack
Live Canvas unlisted published header: 2. Studio copilot: one right slot that shows either the properties or the copilot — properties follow the selection and mark the copilot's drafts; the copilot folds to a strip while properties show; change card v2; the 变更 badge in sync; no 源码 tab; pillar labels kept #25943 (open Studio right slot) and qa(checklist): 18.0 release sweep anchor at 5b14b7f3 — re-point 5 red-row clauses + the wave's checklist-accuracy findings, fixture gaps and not-run handover (18 records) #24579 (closed) are unrelated. - objectstack
运行预览 未发布: 2, the same two. - objectstack
LiveCanvas: 0. - cloud
运行预览 未发布 已发布: 0. - objectstack
build progress panel label machine name: 41, none relevant.
Activity
objectstack-fleet commentedon Oct 27, 2026
Cross-link, 2026-10-27T04:29Z: the cloud half (the
data-build-progressframes carrylabel, and the cloud posture strings) is objectstack-ai/cloud#3310. Until it lands, the progress panel has onlynameto show.objectstack-fleet commentedon Oct 27, 2026
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.
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
objectstack-fleet commentedon Oct 27, 2026
Claim: PM loop round 1
Session:
session_017iXjUm1rujwDk7f3KT1Pkk(seat); implementing card threadsession_01ADHkmQw9ePD2KCzPfJGa6pAccount:
os-steveBranch:
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:uiSeat:
domain:ui#1File 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.draftPosturestrings inui/packages/i18n/src/locales/, their tests, one root changeset (stop on breach; explain in the report). ⛔ui/.github/**and the root.github/workflows/ci.ymlare 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: mediumClause-②: no (an additive
labelon 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 ConsoleThread-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.
objectstack-fleet commentedon Oct 27, 2026
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