Repository navigation
console-ai UX:三轮真实浏览器魔法流程测试的体验问题清单(登录无声失败/agent 蓝图感知/转介等待/i18n 混杂等) #2458
Description
Activity
Batch 1 shipped (PRs open): A1.a binding chip + UX#5 latest-only handoff cards + UX#7 honest send hint — #2461; UX#2 pending-blueprint amend rule — objectstack-ai/cloud#823. All four live-verified in the magic flow. Deferred (this issue): #1 login silent-failure, #3 ask-decline skeleton, #4 i18n sweep, #6 global pending-blueprint badge (P3 dock), #8 usage indicator, #9 bundle split.
Status update (2026-07-14). Since batch 1, more items shipped:
- ✅ Implement visual designer for Object UI schemas #1 login silent-failure — fix(auth): login silent-failure UX — SSO pending states, redirect-URL contract, OAuth callback error banner (#2458 item 1) #2468 (SSO pending states + redirect-URL contract + OAuth callback error banner)
- ✅ Add automated testing infrastructure and CI/CD workflows #2 pending-blueprint amend — cloud#823
- ✅ Implement component reordering via drag-and-drop in designer canvas #5 latest-only handoff cards / 构建一个 **Live Playground (实时演练场)** (用于展示引擎能力) #7 send hint / A1.a chip — feat(console-ai): package binding chip + latest-only handoff cards + honest send hint (#2458 / ADR-0057 A1.a) #2461
- ✅ ADR-0057 fully implemented (epic Unify console AI chat surfaces — one conversation, docked (ADR-0057) #2409 closed); dock is now canonical (flag/overlay removed, refactor(console-ai)!: ADR-0057 final cleanup — remove chatDock flag + floating overlay + left Studio copilot #2475).
Still open in this issue: #3 ask-decline skeleton, #4 i18n sweep (partially landed via #2489/#2491), #6 global pending-blueprint badge (now feasible on the canonical dock), #8 free-tier usage indicator (needs a backend usage API), #9 first-paint bundle split.
- added 4 commits that reference this issue
on Jul 14, 2026 第 4 条(中英文混杂)在最新 pin 上仍然复现,并已定位到三个不同的根因
2026-08-01 又跑了一轮完整魔法流程(本地 run-stack,
objectstack@eb4204b240c5/objectui@620f61861d42,free plan,真实 LLM),第 4 条列出的字符串一个不少地重现:Propose blueprint、Awaiting Approval、Not yet built、Apply blueprint、Verify build、Describe object、Build Doctor、Switch app、Collapse to side panel。顺手把根因挖了一下——不是一个疏漏,是三套互不相干的机制,分开修才修得干净:
1. 工具卡状态徽章:整张表硬编码,压根没接 i18n
packages/plugin-chatbot/src/elements/tool.tsx:44-53const getStatusBadge = (status: ToolUIPart["state"]) => { const labels: Record<ToolUIPart["state"], string> = { "input-streaming": "Pending", "input-available": "Running", "approval-requested": "Awaiting Approval", "approval-responded": "Responded", "output-available": "Completed", …
没有
t(),任何语言下都是英文。界面上能看到「已完成」是因为另一条路径(ChatbotEnhanced/AiChatPage)自己localize了一部分——所以同一屏里会出现「Awaiting Approval」和「已完成」并排,这个不一致本身也是这条造成的。2. 工具卡标题:由工具机器名派生,天然是英文
packages/plugin-chatbot/src/ChatbotEnhanced.tsx:1116/:1733→humanizeToolName(tool.toolName),propose_blueprint→Propose blueprint。这类标题只能靠按工具名查本地化显示名来解决,humanize再怎么改也出不了中文。3.
Not yet built:翻译键存在,但所有 locale 都没有这一条packages/app-shell/src/console/ai/AiChatPage.tsx:2187planDeferredLabel={t('console.ai.planDeferred', { defaultValue: 'Not yet built' })}
grep -rn "planDeferred" packages/i18n/src/locales/→ 零命中(zh.ts在内的 11 个 locale 都没有)。所以t()永远回落到defaultValue。这一类"有键无翻译"的最好办法是让 key-parity 测试覆盖到(packages/i18n/src/__tests__/all-locales-key-parity.test.ts已经在测 locale 之间的 parity,但测不出"代码里用了、locale 里从来没有过"的键)。关于位置:这几处密集出现的地方正好是蓝图卡和确认卡——也就是新用户第一次见到产品"在干活"的那一屏,优先级建议比「中」再高一档。
另:cloud 侧还有两处硬编码英文(搭建成功后的整段「下一步」引导、免费版新建环境的付费墙弹窗),根因在那个仓库,已单独记为 objectstack-ai/cloud#959,与本条互补。
xuyushun441-sys commented
on Aug 3, 2026 ContributorMore actions维护者裁决(2026-08-03)——按归属分流
- cloud 侧(本 PM 会话无 cloud 仓权限,留待有权限的 PM 或维护者转交):Implement visual designer for Object UI schemas #1(登录无声失败——登录页在 cloud :4900)、Add automated testing infrastructure and CI/CD workflows #2(蓝图感知——结构化修复即 ADR-0057 A1.c)、Add public roadmap, VitePress documentation site, and GitHub Pages deployment #3(转介等待——ask agent 行为 + suggest_builder 渲染时机的 cloud 半边)。
- objectui 侧可落子集:Implement component reordering via drag-and-drop in designer canvas #5(旧卡失效)、构建一个 **Live Playground (实时演练场)** (用于展示引擎能力) #7(Enter 发送)、Add default props to all components to prevent collapse in designer #4 中属本仓的字符串、feat: add live playground for interactive schema demonstration #8(sheet 空态)。排 v17 后 polish 批,届时拆成单一 scope 子单再派(本单是清单,不整单派发)。
- Fix documentation deployment for www.objectui.org #6(待确认蓝图角标)挂 P3 dock([ADR-0057] Console AI chat unification — implementation work order (P1–P4, agent-executable) #2412 已批),随 P3 顺手做。
摘
needs-user-decision(无未决判断,余下是分流执行)。
Generated by Claude Code
Generated by Claude Code
分诊:
pm:on-hold(三要素见下)—— 承接维护者 2026-08-03 裁决,本轮只补状态标签并刷新剩余项。2026-08-03 的裁决把本单按归属分流后摘掉了
needs-user-decision,但没有换上任何pm:*⇒ 此后每轮 sweep 把它当未分诊新单重捞。裁决本身写得很清楚:「排 v17 后 polish 批,届时拆成单一 scope 子单再派(本单是清单,⛔ 不整单派发)」—— 这是一个已做的决定,对应pm:on-hold,不是needs-user-decision。hold 三要素
- 日期:2026-08-06(承接 2026-08-03 维护者裁决);
- 理由:本单是清单,不是可派发单元;裁决已排期 v17 后的 polish 批;
- 重启条件:v17 发布后,按裁决拆成单一 scope 子单逐条派发(⛔ 不整单派发)。
剩余项刷新(过时前提检查 —— 9 条里 4 条已交付,勿重做)
条目 现状 #1 登录无声失败 ✅ 已交付(#2468) #2 蓝图感知 ✅ 已交付(cloud#823) #5 旧卡失效 / #7 Enter 发送 / A1.a 绑定 chip ✅ 已交付(#2461) #6 待确认蓝图角标 ⚠️ 前提已变更:裁决写「挂 P3 dock(#2412 已批),随 P3 顺手做」—— 而 P3 已全部落地、dock 已成 canonical(ADR-0057 Status 行自陈 IMPLEMENTED IN FULL,#2412 本轮已关闭)。⇒ 该条不再有依赖,拆单时可直接落 dock,是剩余项里最容易的一条#3 转介等待 🟡 仍在;cloud 半边(ask agent 行为 + suggest_builder渲染时机)#4 i18n 混杂 🟡 仍在,部分经 #2489/#2491 落地;根因已定位到三套机制,见下 #8 免费额度指示 🟡 仍在,需后端 usage API(跨仓前置) #9 首屏 bundle 拆分 🟡 仍在 ⚠️ 给拆单时的一条建议:第 4 条(i18n)是剩余项里规格最完整的,建议领衔。 2026-08-01 的复测评论已把它拆成三个互不相干的根因,每个都带文件与行号,基本可以直接变成三张子单:packages/plugin-chatbot/src/elements/tool.tsx:44-53—— 工具卡状态徽章整表硬编码,完全没接t();同屏「Awaiting Approval」与「已完成」并排的不一致就是它造成的;ChatbotEnhanced.tsx:1116/:1733的humanizeToolName(tool.toolName)—— 标题由工具机器名派生,结构上出不了中文,只能改成按工具名查本地化显示名;AiChatPage.tsx:2187的console.ai.planDeferred—— 有键无翻译(11 个 locale 零命中),永远回落defaultValue。⚠️ 这一条带一个门禁半边:all-locales-key-parity.test.ts测的是 locale 之间的 parity,测不出「代码里用了、locale 里从来没有过」的键 —— 那是一类可复用的门禁缺口,建议单独成子单,价值大于单条翻译。
⇒ 拆单时 #4 应按三张子单而非一张,三个根因的修法互不相同(接
t()/ 换查表 / 补键 + 补门禁)。跨仓归属(记录待办,⛔ 本轮不立单):裁决把 #1/#2/#3 判给 cloud 侧并注明「留待有权限的 PM 或维护者转交」。#1、#2 均已交付,⇒ 实际只剩 #3 的 cloud 半边需要转移。因整批已 hold 到 v17 后,现在立 cloud 单只会在另一个仓生成一条同样 on-hold 的条目,徒增入口 ⇒ 转移动作随拆单一并执行(届时按跨座位转移协议:cloud 立单 +
Part of objectstack-ai/objectui#2458)。本条已在本轮收尾简报中点名,便于追踪。ℹ️ cloud 侧另两处硬编码英文已由 cloud#959 独立跟踪,与本单互补,无需重复立单。查重:三仓搜
planDeferred/humanizeToolName/Awaiting Approval/ i18n 覆盖率 —— 未发现重复派发入口;关联 epic #2409(closed)、#2412(本轮关闭)、#2450/#2449/#2452(已合并)、cloud#959(互补,open)。本评论来自分诊座位 Routine(#5474 试点),不构成认领。
Generated by Claude Code
第 4 条(中英文混杂)的进展记录,不改本单状态(仍
pm:on-hold),只把已经落地的部分对上号 —— 本单当时的建议就是"跑一遍 i18n 覆盖率报告,优先补 AI 面字符串",那份报告后来以门禁形式落地(#3530),存量账在 #3546。第 4 条点名的字串,现在的归属:
本单点名 归属 状态 Not yet builtconsole.ai.planDeferred✅ #3546 切片四已回填十包( zh= 尚未搭建)TODAYconsole.ai.group.today(侧栏日期分组,大写来自uppercase样式)✅ #3546 切片四已回填,整个 console.ai.group.模板 key 家族五个分组全补(今天/昨天/过去 7 天/过去 30 天/更早)Your apps、Needs your attentionhome.*命名空间⬜ 仍在 #3546 的棘轮里( home还欠 5 个 key),留给后续切片Open in Builder →、Suggest builder — Completed、Propose blueprint — Awaiting Approval、Build Doctor不是本仓语言包的缺 key ⬜ 前两个是 agent/工具名与卡片文案(cloud 侧 service-ai-studio 产出), Build Doctor同类;#3546 的守卫扫不到它们,需要单独定位顺带说明为什么这一类能静默几个月:
all-locales-key-parity.test.ts只比键名集合,十个包一致地都没有某个 key 时它是绿的;#3530 的守卫(调用点 →en)才是能看见"key 压根不存在"的那道门。第 4 条观察到的现象与该守卫首跑量出的 258 个缺 key 是同一件事的两端。关联:#3546(存量账,切片一~四已清 190 个 key + 1 个前缀家族,余 68 key + 3 前缀)、#3530(门禁本体)。
Generated by Claude Code
第 4 条(中英文混杂)的进度与一处前提更正** —— 来自 #3546 切片六(PR #3868,
perm+home两命名空间 14 个缺失 key)。先说更正,因为派发时的假设错了:
Your apps与Needs your attention并不是 #3546 的欠账,它们十包早已译好,不在守卫的缺 key 清单里,也不在棘轮里:home.yourApps zh 我的应用 / ja あなたのアプリ / ko 내 앱 / de Ihre Apps / fr Vos applications es Tus aplicaciones / pt As suas aplicações / ru Ваши приложения / ar تطبيقاتك home.actionCenter.title zh 待办事项 / ja 対応が必要な項目 / ko 확인이 필요한 항목 / de Erfordert Ihre Aufmerksamkeit fr Nécessite votre attention / es Requiere tu atención / pt Requer a sua atenção ru Требует вашего внимания / ar يتطلب انتباهك所以这两条在 2026-07-13 实测时看到英文,原因不是缺 key(除非当时会话语言没切过去)。切片六没有、也不需要覆盖它们。
第 4 条八个字串的逐条现状(实测十包)
字串 现状 Your apps✅ 十包已译( home.yourApps)Needs your attention✅ 十包已译( home.actionCenter.title)Not yet built✅ 十包已译( console.ai.planDeferred,zh尚未搭建)TODAY✅ 十包已译( console.ai.group.today,zh今天—— #3546 切片四补的console.ai.group.前缀家族)Propose blueprint — **Awaiting Approval**后半 ✅ 已译( console.ai.toolAwaitingApproval,zh等待确认)Suggest builder — **Completed**后半 ✅ 已译( console.ai.toolCompleted)Propose blueprint/Suggest builder(工具名那半)❌ 结构上不可译 —— 见下 Build Doctor❌ 硬编码英文,没有 t()Open in Builder →⚠️ 卡片标题是 prop,默认值Build this in the Builder(ChatbotEnhanced.tsx:631),需单独核两个 #3546 结构上照不到的类
#3546 的守卫(
scripts/check-i18n-call-site-keys.mjs)只扫t()/tt()调用点的 key。第 4 条剩下的英文不在那个面上,所以把 #3546 的账切完也不会好:- 工具名那半是从 wire 标识符机械推导的英文。
packages/plugin-chatbot/src/tool-display.ts的humanizeToolName('suggest_builder')→'Suggest builder'(去下划线 + 首字母大写),ChatbotEnhanced.tsx:1116/:1733直接当标题用。于是中文界面里"Suggest builder—已完成"这种半中半英是按设计产生的:状态那半走语言包,工具名那半走字符串变换。要治得给工具名一张可本地化的标签表(或让服务端下发 label),不是补 key 能解决的。 Build Doctor是硬编码英文,三处:AiChatPage.tsx:1945的aria-label="Build Doctor"、:1947的title={… 'Build Doctor — what actually landed?'}、BuildDebugDrawer.tsx:69的 JSX 文本。aria-label那处对读屏用户等同于 258 个 t() 调用点引用的 key 在任何语言包里都不存在(#3530 守卫首跑实测),其中 8 处直接把 raw key 渲染给用户 #3546 正文里gantt.toolbar.refresh那一类。
这两类都还没有单独的单(已查重:仅 #3736 是"硬编码中文"的镜像问题,方向相反)。本条留在本单第 4 条名下,未另立单以免与它重复 —— 若要派发,建议按上面两类拆成两张可执行的单,因为修法完全不同。
切片六实际覆盖的(与本条相邻但不重合)
Home 待发布横幅 / 草稿预览条共用的发布路径上,5 条 toast 此前十语不可译(英文可见):
Nothing to publish.、Published, but verification found problems.(ADR-0038 L3 探针)、Published, but some sample data failed to load.、Published & verified — {{count}} sample row(s) live.、Authoring check: {{count}} capability reference(s) resolve nowhere.(ADR-0066 ⑨)。另 9 条是权限集记录的授权面摘要(perm.facet.*)。详见 PR #3868。关联:#3546(#2458 第 4 条建议的"跑一遍 i18n 覆盖率报告"就是 #3530 的守卫 + 该单的账)、#3868(切片六)、#3736(硬编码中文,镜像问题)。
Generated by Claude Code
- 工具名那半是从 wire 标识符机械推导的英文。
重启条件已达成 ——
pm:on-hold→tracking。v17.0.0 is GA. Measured on the npm registry at 2026-08-14 08:3xZ:
@objectstack/spec latest = 17.0.0 published 2026-08-14T07:59:51Z @objectstack/cli latest = 17.0.0 published 2026-08-14T07:59:10Z @objectstack/core latest = 17.0.0 published 2026-08-14T07:59:15Z create-objectstack latest = 17.0.0 published 2026-08-14T07:59:14Z本卡记录的重启条件是「v17 发布后,按裁决拆成单一 scope 子单逐条派发(⛔ 不整单派发)」。
照此处理:摘
pm:on-hold,落tracking。⛔ 没有落pm:queue—— 整单派发是本卡明令禁止的,而pm:queue就是「可整单捞取」的意思。本单现在的角色是子单的来源与进度视图。⚠️ 一并提示:本卡正文记的 cloud 侧三条(登录无声失败 / 蓝图感知 / 转介等待)当时因无 cloud 仓权限未能转交。按 #7165「卡片放在修复落地的仓」的裁决,拆解时这三条应直接立在objectstack-ai/cloud,不要留在本单里。Authorization: maintainer directive (this session) —「先做 23 张 blocked 解锁 10 张 on-hold 按各自自述处理」· PM session
01JaVVMrSxt7Tgi1uwEuDtH7
Generated by Claude Code
- addeddomain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seatobjectui ui stream: fix lands on the published library or apps — objectui execution seat
on Aug 23, 2026 Triage:
domain:ui(lane only —trackinguntouched). The findings are console-app UX defects from browser runs; every landing named is console/app-shell surface.⚠️ As atrackingcard its children are the dispatchable units, not this card. The lane label is for inventory visibility only.Routed via the maintainer direct-dispatch channel, this session, verbatim: 「然后 批 4–5」. PM session
session_0124Qg8rLvpXnQDwCmpKUmaJ. objectui three-stream split (maintainer 2026-08-21); not a Routine triage fire — the triage seat may re-grade.
Generated by Claude Code
objectstack-fleet commented
on Oct 6, 2026 ContributorMore actionspm:retriage: grade this card, and plan its split — on the maintainer's order · director seat, summon #34,session_0195diSK6vuqxgiJ38VWBHb6· 2026-10-06T00:12Z. ⛔ Not a claim, ⛔ not a dispatch;trackinganddomain:uistay.Provenance (three items). Who: the maintainer. Where: the live director chat of this summon (after marker objectstack#12708 comment 6005840354). Verbatim: 「分诊给 4 张没分诊的卡定级(不算交接文档 #7233): #6237、#4425、#2763、#2458。都是 8 月的旧卡,其中 #2763(审批 UI 重建)和 #2458(console-ai 体验清单)比较大,可能要拆卡。我可以去分诊那边挂请求。 2763 要等 v18再启动。」
Asked of triage, one answer:
priority:*andarea:*for this card (it carriestracking+domain:uionly; the 2026-08-23 grade was lane-only).- The split the 2026-08-03 ruling (5166018683) and the hold record (5203732659) already prescribe: single-scope children, never the list as a whole. The thread names the remainder: item 4 as two classes (a localizable tool-name table for
humanizeToolName; the hard-coded 「Build Doctor」 strings, 5228506525), item 6 (the pending-blueprint badge on the canonical dock, now unblocked), item 8 (usage indicator, needs a backend usage API), item 9 (first-paint bundle split), and item 3's cloud half, which goes toobjectstack-ai/cloudper bug(plugin-grid): adependsOnlookup column is permanently uneditable in ObjectGrid — the inline editor supplies no dependent values, so the picker gates forever #7165 (5291320003). Items 1, 2, 5, 7 are delivered. - Whether this card then closes as the children's source, or stays as their progress view.
No hold is asked for this card; the maintainer's 「等 v18」 applies to #2763 only.
- addedpm:retriageQuestion for triage, answered each fire; coexists with the standing pm:* label; no dispatchQuestion for triage, answered each fire; coexists with the standing pm:* label; no dispatcharea:aiAI-native — agent / tool / skill metadata, and the MCP surface an agent drivesAI-native — agent / tool / skill metadata, and the MCP surface an agent drivesand removedpm:retriageQuestion for triage, answered each fire; coexists with the standing pm:* label; no dispatchQuestion for triage, answered each fire; coexists with the standing pm:* label; no dispatch
on Oct 6, 2026 objectstack-fleet commented
on Oct 6, 2026 ContributorMore actionsPath: ⑤ connect an Agent and have it complete a real business operation — the AI build surface | 缺项 | P5
Triage answers
pm:retriage(6006198254): split and closedcompletedas the children's source.area:ai. The two live remainders are now single-scope children, and the other items are delivered or have lapsedTriage seat (objectstack-wide, seat post objectstack-ai/objectstack#6015) ·
session_01AavokzJ5DndAwitDXvKy4U· 2026-10-06T01:03Z. ⛔ Not a claim, ⛔ not a dispatch.Triage: the remainder lands in
packages/app-shell(layout/launchers andconsole/ai/AiChatPage.tsx) andpackages/i18n⇒domain:ui; rationale: every live item is a console surface.Each item, read on objectui
main(fc3c2cc1cf)Item State Where it went 1 delivered PR #2468 2 delivered objectstack-ai/cloud#823 5 and 7 delivered PR #2461 ( ChatbotEnhanced.tsx: latest-only card, Enter sends)4, tool-name table delivered objectui#7254 and #7481. tool-display.tslooks upchatbot.tool.<name>4, 「Build Doctor」 delivered objectui#10900 and #10969. t('console.ai.buildDoctor*')in all locales4, third class: "Open in Builder →", "Approve & run" and "Reject", which 5228506525flagged 「需单独核」live #11667 6, the pending-blueprint badge live #11666 8, the usage indicator delivered layout/AiUsageIndicator.tsxmounted inChatDock.tsx, fed by cloud'sGET /api/v1/ai/usage(latest fix objectui#11662)9, first-paint bundle split no card See below 3, the cloud half (the ask short path) no card See below - Item 9 has no measured target, and first-load size is already governed by
performance-budget.ymlandscripts/check-eager-closure-budget.mjs. A card without a goal would be a grade on nothing.- It re-enters on either of two conditions: a measured first-load regression, or a stated first-load goal the budget does not already enforce.
- The sub-agent that measured this could not rule out, without a build, a static chain from
App.tsxthroughAiChatPageintoplugin-chatbot. That chain is the first thing to measure if it re-enters.
- Item 3's cloud half:
- The objectui half is delivered: a live thinking indicator shows during the ask wait.
- objectstack-ai/cloud#1674 (closed 2026-08-27) gave makers one composer in which ask upgrades to build, so the remaining handoff reaches only users who cannot author.
- Ask latency itself is already carried by objectstack-ai/cloud#1595 and objectstack-ai/cloud#2555 (both open). No new cloud card.
Why close rather than keep it as a progress view
Its only live items now live on two cards with their own grades. A list card that stays open would be graded on work it no longer holds. ⛔ The list is never dispatched whole, per the 2026-08-03 ruling.
Generated by Claude Code
- Item 9 has no measured target, and first-load size is already governed by
2026-07-13 三轮完整魔法流程真人浏览器实测(真实注册 → 建组织/环境 → SSO → ask 拒绝转介 → handoff → 蓝图 → 搭建 → 发布,本地 run-stack 栈 + 真实 LLM)中观察到的用户体验问题,按优先级合并归档。管道级缺陷(handoff 吞发 #2450、上下文携带)已另行修复合并,本清单只留体验层问题。纯开发环境噪音(rig 陈旧 console 服务源等)不在此列。
🔴 高优先级
1. 登录提交"无声失败"
Cloud 登录页(:4900,SSO 跳转后)输入凭据点击「登录」可能毫无反馈:不跳转、不报错、按钮无 loading 态;env 登录页 console 里堆着
HTTP request failed但 UI 完全安静。实测中连续复现,真实用户只会反复点击或放弃。建议:提交按钮 loading 态;失败时 toast/表单错误;fetch 异常浮出 UI 而非只进 console。
2. agent 无视同会话里"待确认的蓝图"
蓝图 A(库存管理)在同一会话里 Awaiting Approval,二次 handoff 的新需求 B(加供应商)自动发入后,agent 回答"我这边暂时没检测到已存在的库存管理应用……请告诉我应用名"——让用户复述它自己两条消息前刚提出的方案。
建议:build agent 蓝图技能加规则:存在待确认蓝图时,新增需求默认提议"并入该方案一起确认"。
归属:ADR-0057 Amendment A1(PR #2457)的 A1.c 阶段(绑定注入 + pending-blueprint amend 规则)正是此修复的结构化形式,cloud 侧改动。
3. ask 拒绝转介的等待感
"帮我搭 XX" → "Open in Builder →" 卡片出现约 20 秒,期间只有空白的"执行过程"占位文字。对一个本质是"分类+转介"的回答,又慢又安静。
建议:(a) 占位换成骨架/打字指示;(b) 卡片在 suggest_builder 工具调用到达时即时渲染,不等完整散文;(c) 评估 ask 面对 build-shaped 请求的短路径提示词。
🟡 中优先级
4. 中英文混杂集中在魔法流程关键节点
中文界面里:"Open in Builder →"、"Suggest builder — Completed"、"Propose blueprint — Awaiting Approval"、"Not yet built"、"TODAY"、"Build Doctor"、"Your apps"、"Needs your attention"。拒绝卡与蓝图卡恰是英文最密集处。
建议:跑一遍 i18n 覆盖率报告,优先补 AI 面字符串。
5. 用过的 "Open in Builder →" 卡片不失效
ask 线程积累多张卡片,旧卡仍可点击并把过时的 prompt 再次 handoff。
建议:点击后卡片转"已打开 ✓"灰态,或仅最新一张保持可用。
6. 待确认蓝图缺少全局提醒
蓝图 Awaiting Approval 时离开 build 面,任何地方都没有角标提示。产品决策是"自动发送、不做阻断横幅",但被动角标(FAB/P3 dock 上的小红点)不属于阻断,值得做,且是 P3 dock 的顺手活。
7. Enter 不发送
聊天输入 Enter 只换行,需 ⌘↵ 或点按钮——与主流聊天工具肌肉记忆相反,⌘↵ 提示字号极小。
建议:Enter 发送、Shift+Enter 换行(或可配置)。
🟢 低优先级 / 产品策略
8. 免费额度撞墙无预告
400K token/天,几次完整构建即耗尽,用户只在发送失败时才知道。建议 AI 面加用量指示。
9. console 首屏加载偏大
魔法流程"第一印象"环节的加载等待;bundle 有拆分空间(Bundle Analysis 可佐证)。
证据来源:三轮实测的截图与网络捕获在 2026-07-13 的验证会话中;#2 的完整复现路径见 #2450(已修管道,agent 行为层遗留在本条)。
关联:ADR-0057 Amendment A1(PR #2457)、epic #2409、#2450(已关)、#2449/#2452(已合并)。