Skip to content

Studio: a draft autosave names nothing — only the top bar's "Saved HH:MM" shows, which the write-feedback convention does not count (ruling on #28345) #28984

Closed

Description

@objectstack-fleet

domain:devx#1 · os-warren · session_01JQwxbWJDYbbtH6dhJNoboN

立卡门: ① 产品缺陷(用户可见体验缺陷),具名落点 + 复现(reach: 界面,Studio 改字段标签后自动保存,实测两次)
业务理由: 在 Studio 里改元数据的管理员看不到「刚刚保存了什么」:自动保存落地后界面上只有顶栏的「已保存 时:分」,没有点名字段或对象的反馈。维护者在 #28345 的裁决 ② 定了:顶栏保存状态不算写入反馈,只有点名对象的 toast 或行内文字算。照此 ux-conventions.write-feedback 的 Studio 自动保存一行判失败,发版清单持续红;同屏连续改几个字段时,用户也无从确认哪一次落地了。
动手的读者: domain:ui 席,ui/packages/app-shell/src/views/studio-design/StudioDesignSurface.tsx 的草稿自动保存路径(约 L8855「the hint is the whole affordance」处),让落地的保存点名所改条目(字段或对象标签),形态可选 toast 或行内状态。
查重: studio autosave feedback names item 11 命中、studio saved indicator write feedback 4(均含已关);只有运行记录 #27441/#24570/#23953 和已关的裁决卡 #28345,没有产品卡。

QA-source: #28981 · ux-conventions.write-feedback · A0, A1

What happens

A Studio draft autosave lands (PUT … ?mode=draft 200), but the only feedback is the top bar's "Saved HH:MM" (data-testid=data-saved-at), the "Draft · 1 unpublished" chip and the "Changes 1" counter. No toast and no role=status/alert text appears, and nothing names the field or the object.

Ruling 6545938831 ② on #28345 (2026-10-31): the Studio top-bar 「已保存」 is not write feedback; only record-naming feedback counts, and the convention's wording stands. Checklist item ux-conventions.write-feedback revision 9 scores that. The other Studio rows already comply: publish says "Published 1 item in this package", discard says "Draft discarded: QA Widget".

Measured at framework 7fa9873f (main, 2026-11-02), stock showcase boot from a scratch copy, Console built from the same tree.

Reproduction

  1. As admin: POST /api/v1/packages {"manifest":{"id":"com.qa.r6wf","name":"QA R6 Scratch","version":"0.1.0","type":"app","namespace":"qrsix"}}, then PUT /api/v1/meta/object/qrsix_widget?package=com.qa.r6wf with sharingModel: "private" and text fields name ("Name") and note ("Note").
  2. Form sign-in; open /_console/studio/com.qa.r6wf/data?surface=object:qrsix_widget → Form → field "Note" → Properties → Label "QA Remark", Tab.
  3. Network: PUT /api/v1/meta/object/qrsix_widget?mode=draft&package=com.qa.r6wf&surface=studio → 200 state: "draft".
  4. Expected: a toast or inline text naming the item, e.g. the field "QA Remark" or the object "QA Widget".
  5. Actual: zero toasts and no status/alert text over 6 s; only "Saved HH:MM", the Draft chip and the Changes counter. Reproduced twice (Note → QA Remark; Name → Widget Name).

Generated by Claude Code

Activity

  1. objectstack-fleet commented on Nov 2, 2026

    @objectstack-fleet
    ContributorAuthor

    triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U

    Path: none

    Triage: p2 · domain:ui · area:studio · pm:queue · 2026-11-02T06:01Z

    ⛔ Not a claim.


    Generated by Claude Code

  2. added
    area:studioChanging a running app without code — authoring, publish, docs and the portal
    domain:uiDomain lane — seat card indexed by label:pm:seat
    pm:queueReady for the PM dispatch loop
    pm:dispatchedDispatched to a dev agent by /pm-dispatch
    and removed
    pm:queueReady for the PM dispatch loop
    on Nov 2, 2026
  3. objectstack-fleet commented on Nov 2, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#2 · zhuangjianguo · session_01QsR2jRFuJz9QBZqPVHYVhJ

    Claim: PM loop round 3 · 2026-11-02T09:55Z
    Session: session_01QsR2jQxMrtgg1LCjc1NmLf (card thread, os-dev); dispatched by seat session session_01QsR2jRFuJz9QBZqPVHYVhJ
    Account: zhuangjianguo
    Branch: claude/project-thread-l6odko (platform-assigned to the card thread; it can push only this branch)
    Worktree: objectstack-issue-28984
    Domain: domain:ui
    Seat: domain:ui#2
    File surface: ui/packages/app-shell/src/views/studio-design/StudioDesignSurface.tsx (the draft autosave path and its saved-state feedback only), ui/packages/i18n/src/namespaces/studio/en.ts and zh.ts for the new key(s), their tests, and a root .changeset; not the StudioRefusalStrip region PR #29224 holds (stop on breach; explain in the report)
    Container & model: S, mode:thread, model: default tier (dispatch-gates --tier: no path-derived mandate), effort: default
    Clause-②: no
    Metadata-protocol: none
    Responsibility: a landed Studio draft autosave names nothing; only the top bar's "Saved HH:MM" shows, which ruling 6545938831 ② on #28345 says is not write feedback | ux-conventions.write-feedback stays red on the release checklist | every Studio author
    Thread-read: none
    Premise: holds (card measured at 7fa9873f; blocker PR #29132 landed 09:52Z as 3d2e8fdb; at origin/main the only saved-state affordance on the draft path is data-saved-at, ~L8838 "the hint is the whole affordance"; studio namespace keys are Record<string, string>, so a new key widens nothing, which the os-dev confirms on the built types before pr_create)
    Serial constraints cleared: PR #29224 (#29139, domain:ui#3) edits the same file hunk-disjointly at StudioRefusalStrip, so pr_create waits for it to land and for main to be merged in; #29113 (seat 5) takes this card as its same-file serial constraint

  4. objectstack-fleet commented on Nov 2, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#2 · zhuangjianguo · session_01QsR2jQxMrtgg1LCjc1NmLf
    os-dev-report

    {
     "issue": 28984,
     "status": "done",
     "branch": "claude/project-thread-l6odko",
     "pr": "https://github.com/objectstack-ai/objectstack/pull/29310",
     "session": "session_01QsR2jQxMrtgg1LCjc1NmLf",
     "premise_still_valid": true,
     "head": "f9f3982b",
     "summary": "A landed Studio draft autosave now toasts 'Draft saved: LABEL' (engine.studio.draftSaved, en + zh) under one sonner id per item (studio-draft-saved:TYPE:NAME), in the five autosave sites of StudioDesignSurface.tsx: Data object and extension, Interfaces leaf and nav, Automations flow. Called only after the save lands (not on refusal, not on a reloaded conflict); the top bar's Saved hint stays. Live card repro on showcase: before 0 toasts, after at most 1 toast on screen over 3 landed draft PUTs, text 'Draft saved: QA Widget'. StudioRefusalStrip untouched; main (with #29224, 8a8a03d3) merged in cleanly before pr_create.",
     "tests": "New DataPillar.draftSavedNamed-28984.test.tsx 3/3 (real MetadataClient over a fetch double, real sonner Toaster). Ablation via scripts/ablation-replace.mjs on the committed fix, restore proven blob == HEAD with empty git diff HEAD: (1) object announce call replaced by a no-op: 2 red (landed, repeated), refused green; first attempt void(...) did not parse, not counted; (2) per-save random id: repeated case red at on-screen count (2 toasts), landed red at id. Related sweep 226 files / 1887 tests green at c5511bd1; 230 files / 1910 tests green at f9f3982b after merging main and rebuilding. Type-check app-shell + i18n (turbo, 66 tasks) green at both heads.",
     "gates": "dispatch-gates --commands derived 34 at c5511bd1 and the same 34 at f9f3982b; all 34 exit 0 at both (32 unlocked loop, type-check-debt and ui vitest scripts/ locked: 169 files, 4900 tests). --ran at f9f3982b: 34 derived, 34 run, 0 NOT-MEASURED. node scripts/check-sdui-manifest.mjs exit 0. PR-body gates (changeset-no-major, adr-0087-registration, closing-keyword-parity, partof-closing-keyword) exit 0 on the sent body. CI check-runs: in_progress at report time (not waited on).",
     "line_budget": "5 files, +247 / -4 vs origin/main (StudioDesignSurface.tsx +44/-4, test +186, locale +3, changeset +14)",
     "files_changed": [
      ".changeset/28984-studio-draft-saved-named.md",
      "ui/packages/app-shell/src/views/studio-design/DataPillar.draftSavedNamed-28984.test.tsx",
      "ui/packages/app-shell/src/views/studio-design/StudioDesignSurface.tsx",
      "ui/packages/i18n/src/namespaces/studio/en.ts",
      "ui/packages/i18n/src/namespaces/studio/zh.ts"
     ],
     "clause_2": "no — built ui/packages/i18n/dist/namespaces/studio/en.d.ts types STUDIO_EN as Record of string to string; the new key is in en.js and no .d.ts",
     "deviations": [
      "Scope read: all five autosave sites in the file surface, not only the Data object path the card reproduced (one Studio voice).",
      "pnpm lint not run repo-wide (CI Lint UI); eslint on the 4 touched ui files 0 errors, 43 warnings all on unchanged lines.",
      "Live probe ran at c5511bd1, not re-run at f9f3982b; the merge changed StudioDesignSurface.tsx only in the refusal strip."
     ],
     "dogfood_battery": "n/a — no ! in the PR title and no (narrowing) arm",
     "mcp_calls": "5 — GitHub MCP reads only: issue_read get x1, issue_read get_comments x2, pull_request_read get x1 (29224); plus get_session (not GitHub). No MCP writes.",
     "api_writes": "3 — git push (branch, several pushes), relay pr_create (objectstack#29310, run 41438034052), this os-dev-report comment via post-stamped",
     "open_questions": [],
     "out_of_scope_findings": [
      "class: none (not measured live) · five editors outside the file surface still name nothing on a landed draft save: useObjectListViewDraft, ObjectHooksPanel, PermissionMatrixEditor, StudioBundleItemEditor, Data doReorderFields · carrier: seat domain:ui#2 (ACCEPT) · noted in PR Out of scope, not filed · dedupe words: studio draft saved toast, autosave names nothing, write feedback studio editors",
      "class: none (shared placement, not this card) · top-centre toaster covers the header Draft chip and Saved hint for 4 s; publish and discard toasts sit there too · carrier: seat domain:ui#2 · noted in PR Out of scope, not filed"
     ]
    }
  5. objectstack-fleet commented on Nov 2, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#2 · zhuangjianguo · session_01QsR2jRFuJz9QBZqPVHYVhJ

    Landed · 2026-11-02T12:41Z · PR #29310 merged through the queue as bbfccbdc; the merge commit carries all 5 files of the accepted head f9f3982b (announceDraftSaved at the five autosave sites in StudioDesignSurface.tsx, the engine.studio.draftSaved key in the en and zh studio packs, its test, the changeset). Delivered in full: nothing remains on this card; pm:dispatched removed.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

area:studioChanging a running app without code — authoring, publish, docs and the portaldomain: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