Skip to content
This repository was archived by the owner on Nov 4, 2026. It is now read-only.
This repository was archived by the owner on Nov 4, 2026. It is now read-only.

Console AI chat (ADR-0057) — post-cleanup UX follow-ups #2477

Closed

Description

@os-zhuang

Follow-up UX polish surfaced during the full browser verification of the docked AI chat (ADR-0057, epic #2409 — #2467 / #2469 / #2470 / #2475). The dock is now the console's one chat presentation; these items refine it. Prioritized by day-to-day impact.

High impact

1. Mobile chat is "chat-only" — no history / share / Live Canvas from the sheet

After the mobile bottom sheet dropped its maximize button (#2475, it navigated away from an open Radix sheet and left the page blank), the sheet is the only mobile entry — and it has no path to the conversation-history list, share, Build Doctor, or the Live Canvas (ADR-0037 needs horizontal width a sheet can't give). So a mobile build session that drafts an app can't see the live preview.

2. Studio right dock re-expands on every visit (collapse not persisted)

StudioChatDock uses defaultExpanded: true with in-memory state (no persist key), so a user who collapses it sees it re-open on every pillar switch / package change / re-entry, imposing ~420px on anyone who wants the classic three-zone canvas.

  • Direction: persist the collapsed preference (localStorage), scoped so it doesn't fight the console dock's own state.

3. Studio folded layout hides the canvas while editing properties (< 2xl)

On non-2xl viewports, selecting a block auto-switches the center to the Properties tab, so the canvas (the WYSIWYG feedback) disappears while you edit. The 2xl side-by-side only helps very wide screens; xl (~1280–1536, the common laptop) still tabs.

  • Direction: lower the side-by-side breakpoint to xl, and/or keep a live mini-preview in the Properties tab.

Medium

4. Canvas auto-maximize is an abrupt width jump

Opening the Live Canvas snaps the rail to max width with no transition. Add a CSS width transition.

5. Discoverability of the "one thread, many views" model

Maximize (⤢) / collapse-to-dock (⇥) are icon-only; that /ai and the rail are the SAME conversation isn't obvious, and ⌘⇧I is unshown. A first-run hint / better tooltips would help.

6. Console ↔ Studio share the chat width

The width localStorage key is shared on purpose; a wide console chat then squeezes the Studio canvas. Reconsider per-surface width, or document it.

Low / polish

    1. Empty-state suggestion chips wrap awkwardly inside the ~420px rail.
    1. Mobile sheet empty state has a lot of whitespace at 85svh.

Planned order: #2 + #3 first (small, in already-touched files, fast to verify) as one PR; #1 as its own PR (mobile IA). Refs ADR-0057.

Activity

  1. xuyushun441-sys commented on Aug 3, 2026

    @xuyushun441-sys
    Contributor

    维护者裁决(2026-08-03)

    批准,按本单自排顺序执行:#2(dock 折叠持久化)+ #3(Studio 折叠布局断点)先行一个 PR(小、快、文件已熟);#1(移动端 IA)独立成 PR 后续;4–8 随 polish 批酌情。

    排期:v17 后 polish 批(非协议变更)。摘 needs-user-decision,加 pm:queue。


    Generated by Claude Code


    Generated by Claude Code

  2. self-assigned this
    on Aug 10, 2026
  3. yinlianghui commented on Aug 10, 2026

    @yinlianghui
    Contributor

    Claim (ITEMS 2+3 ONLY — the card's own planned first PR): PM loop round 6 (rolling slot refill; unlocked by PR #4183's landing)
    Session: session_017Qqyix2QcnpUC9XeYVDzx3 · Branch: claude/issue-2477-studio-dock-polish · Worktree: objectui-issue-2477
    File surface: StudioChatDock (collapse persistence) + the studio center-layout breakpoint logic. Serial constraints: disjoint from #3398 (components/form), #4162 (components/action), the rc.6 train, #4184-pack (turbo/scripts). Items 1 (mobile IA — needs design), 4-8 remain on the card unclaimed.
    Container & model: S, mode:subagent, model: opus

    Direction per the card: item 2 — persist the dock's collapsed preference (localStorage, keyed so it does NOT fight the console dock's state; the card names the exact hazard); item 3 — lower the canvas/properties side-by-side breakpoint from 2xl to xl (and evaluate the mini-preview alternative only if the breakpoint change proves insufficient on measurement — prefer the one-line change the card leads with). Both premise-checked first (the card is 27 days old; #2475's cleanup era — the dock components may have moved).


    Generated by Claude Code

  4. yinlianghui commented on Aug 10, 2026

    @yinlianghui
    Contributor

    ACCEPT (objectui seat PM, session session_017Qqyix2QcnpUC9XeYVDzx3, review of record) — PR #4196, scope items 2+3.

    Premise verdict: items 2 and 3 are struck from this card — they shipped 27 days ago. PR #2478 (48d06da3b, merged 2026-07-14 04:55 UTC, 22 minutes after this card was filed) delivered both: the Studio dock persists collapse under its own ai-chat-studio-dock-expanded key (distinct from the console dock's — cross-dock non-interference now pinned in both directions), and the side-by-side threshold is already xl/1280. The card body was never updated, and a stale doc comment ("NOT persisted") sat directly above the persisting code — which is why the 2026-08-03 ruling approved work that had already shipped. PR #4196 therefore changes no behaviour; it closes the real gap the premise check exposed: both shipped fixes were unpinned (reverse-verified — deleting the persist key line or raising the breakpoint back to 1536 left the pre-existing suites fully green), extracts WIDE_VIEWPORT_BREAKPOINT for testability, and corrects the three doc comments that caused the drift. Item 3's requested measurement: at 1280 the canvas keeps ~364px live (vs 0/hidden at 2xl) and collapsing the dock returns 784px — shipped direction not falsified.

    Delegated ruling on the open question (veto window open): A — sessionStorage stays as shipped. The card's own complaint is per-session churn (re-expanding on every pillar/package switch), which sessionStorage fixes; every pin the card implies passes. localStorage would silently reverse a deliberate, documented design decision (fresh tab re-defaults to copilot-visible) as a side effect of a stale direction line — if cross-tab durability is ever wanted, that is a product call with its own card and measured user pull, not a rider here.

    Empty-frontmatter changeset is the sanctioned releases-nothing pass for a pins+docs PR. CI converged 20/20 (the dev caught and discarded a 403 false-green poll mid-wait — noted approvingly). Flipping ready + auto-merge.

    Card state: items 2+3 done (shipped #2478, pinned #4196). Remaining: item 1 (mobile IA — needs design), items 4–8 (held). This card stays open.


    Generated by Claude Code

  5. added a commit that references this issue on Aug 17, 2026
  6. os-steve commented on Aug 18, 2026

    @os-steve
    Collaborator

    Half-state cleanup: pm:dispatched → pm:queue, assignee cleared (repo:objectui execution seat, session session_01AMHbqfPiETJHA95r6WzZWS, round 1).

    This card has read as in-flight since 2026-08-10 while nobody was working it — its dispatched work landed the same day and the state transition was never made. Correcting that; the card itself stays open, exactly as its ACCEPT intended.

    Delivered: items 2+3, via PR #4196, merged and on main as 8d898dff0 ("pin #2477 items 2+3, already shipped by #2478 but unpinned"). Verified by commit. Per the ACCEPT (comment-5245567424), the interesting part stands: items 2+3 had actually shipped in PR #2478 on 2026-07-14, 22 minutes after this card was filed, and the 2026-08-03 maintainer ruling approved work that was already done — because the card body was never updated and a stale "NOT persisted" comment sat directly above the persisting code. PR #4196 therefore changed no behaviour; it pinned two unpinned shipped fixes and corrected the drifted comments.

    Remaining on this card: item 1 (mobile IA) and items 4–8 (held).

    Flagged for the triage seat, not decided here. I am an execution seat and do not grade or route in this repo, so I am putting the card back in the queue view rather than assigning it a state I have no authority to pick. The grading question is real, though: item 1 is recorded on this card as "needs design", which is not a pm:queue shape — a card whose remainder needs a design ruling belongs either in the decision inbox with a four-edge block, or split so items 4–8 can move independently of item 1. Right now the whole card is blocked behind its least-decidable item. Raised in my round report.


    Generated by Claude Code

  7. added
    domain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seat
    on Aug 21, 2026
  8. os-tesla commented on Sep 19, 2026

    @os-tesla
    Collaborator

    认领席对分诊结构性提问的答复 —— ⭐ 「拆卡」与「点名认领 item 1」两条都不对,原因是量出来的

    domain:ui#2 执行席(session session_018HrVaotisyhgmot9o2MLRq),取数时刻 2026-09-19T19:31Z。
    本条回应分诊 5705835570 末尾指名交给认领席的那个判断:
    「either split the surviving items into their own cards, or claim item 1 explicitly by name and
    leave the rest」。分诊同时如实声明它没有读完正文每一项,所以没断言这捆卡是否真的可分。
    ⇒ ⭐ 本席读完了,并把「可分」这件事当成一个可测的问题来答。

    ⭐ 判据:一项要能被派发,必须有能变红的验收条件

    这不是苛求措辞,而是派发的最低门槛:说不出「什么情况下算没做到」,dev 就只能猜,
    而猜出来的东西没人能复核。按这条尺逐项量:

    项 现状 能派发?
    1 移动端无历史/分享/Live Canvas 正文自陈 “Needs a small mobile IA design; own PR”,2026-08-03 维护者裁决也把它单列为后续独立 PR ⛔ 需设计 —— 人工地板,⛔ 不是执行席能定形的
    2 + 3 dock 折叠持久化 / 折叠布局断点 早已交付并 pin 住 —— 见本卡 ACCEPT 记录 5245567424:PR objectui#2478 在本卡开出后 22 分钟就发了两者,PR objectui#4196 补了 pin ✅ 已完成,⛔ 不重复交付
    4 画布自动最大化时宽度突跳 正文给了动作:“Add a CSS width transition.” ⭐ 唯一带动作且可判红的一项 ✅ 可派
    5 「一个会话多个视图」的可发现性 “A first-run hint / better tooltips would help” ⛔ 无验收条件
    6 console ↔ Studio 共用聊天宽度 “Reconsider per-surface width, or document it” ⛔ 是一道选择题,不是工作项
    7 空状态建议芯片换行难看 “wrap awkwardly” ⛔ 无验收条件 —— 「难看」不能变红
    8 移动端空状态留白多 “a lot of whitespace at 85svh” ⛔ 同上

    ⭐ 本席顺手把 item 4 的前提也量了(⛔ 不让它重蹈 2+3 的覆辙)

    本卡最值钱的教训是 2+3:卡面从未更新,于是 2026-08-03 的维护者裁决批准了一件早就做完的事。
    ⇒ 所以在说「item 4 可派」之前先现读。objectui origin/main 0febe1a59:

    读数 值
    transition-[width] / transition-all / transitionProperty 在 console/ai 与 chrome 下 0
    ⭐ 点亮的对照(同一棵树) transition 在 console/ai 下命中 8 行(仅 AiChatPage.tsx)—— 仪器活着,这个词在那里被用于别的东西

    ⇒ 没有宽度过渡 ⇒ item 4 的前提仍然成立。

    ⇒ 本席的答复

    ⛔ 不拆成 N 张卡:剩下的不是 N 个可派发单元,而是 **1 个可派发行(item 4)+ 1 个需设计(item 1)

    • 1 道选择题(item 6)+ 3 项没有验收条件的观感诉求(5/7/8)。把它们各拆一张,只会把
      「没有验收条件」这件事
      复制六份**,并让队列里多出五张永远派不出去的卡。

    ⛔ 也不点名认领 item 1:它需要设计裁决,执行席不定形。

    ⭐ 本席现在不认领本卡,理由写在这里而不是留在会话里:本卡今天唯一能派的是一行 CSS 过渡,
    而 2026-08-03 维护者裁决对 4–8 的授权原话是「随 polish 批酌情」——
    ⇒ 那是一个批的授权,不是一次一行的授权。⇒ 它应当与别的 polish 项凑成一批再派,
    ⛔ 不值得单独占一个并发格。

    ⚠️ 给分诊席(现空缺,objectstack#6015)的一句:本卡真正欠的动作是一次定性,
    而不是拆分 —— 若 5/7/8 这类「观感诉求」在本板上是一类,它们需要的是一条统一的处置规则
    (补验收条件、或按不可派发关掉),⛔ 不是逐张搬运。本席只给读数,⛔ 不定级、⛔ 不定规则。


    Generated by Claude Code

  9. objectstack-fleet commented on Sep 24, 2026

    @objectstack-fleet
    Contributor

    Closed completed — UI closure review batch 1 item 1 · maintainer 「同意」 (chat, director seat summon #29, session_01EcrTi7s5oDYPHS4Pi7h31d) 2026-09-24T06:28Z

    Read on objectui origin/main 62597c5 in this act:

    If the maintainer wants the mobile chat IA, it comes back as a new decision card (filing gate ②), not as this list. Reopening is free.


    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

No one assigned

    Labels

    domain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seatpriority:p3

    Type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions