You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
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
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
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").
Form sign-in; open /_console/studio/com.qa.r6wf/data?surface=object:qrsix_widget → Form → field "Note" → Properties → Label "QA Remark", Tab.
Network: PUT /api/v1/meta/object/qrsix_widget?mode=draft&package=com.qa.r6wf&surface=studio → 200 state: "draft".
Expected: a toast or inline text naming the item, e.g. the field "QA Remark" or the object "QA Widget".
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).
Read fresh. A Studio draft autosave names nothing, only the top bar's "Saved HH:MM". Ruling ② on [Decision] wave-3 checklist: five held items need a ruling before their ledger edits (#27377) #28345 says that does not count as write feedback, so ux-conventions.write-feedback stays red. The named location is the draft-autosave path in StudioDesignSurface.tsx. A user-visible defect with a ruled direction: domain:ui, p2.
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
{
"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"
]
}
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.
Activity
objectstack-fleet commentedon Nov 2, 2026
triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U
Path: none
Triage: p2 ·
domain:ui·area:studio·pm:queue· 2026-11-02T06:01Z⛔ Not a claim.
ux-conventions.write-feedbackstays red. The named location is the draft-autosave path inStudioDesignSurface.tsx. A user-visible defect with a ruled direction:domain:ui, p2.Generated by Claude Code
objectstack-fleet commentedon Nov 2, 2026
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 sessionsession_01QsR2jRFuJz9QBZqPVHYVhJAccount:
zhuangjianguoBranch:
claude/project-thread-l6odko(platform-assigned to the card thread; it can push only this branch)Worktree:
objectstack-issue-28984Domain:
domain:uiSeat:
domain:ui#2File 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.tsandzh.tsfor the new key(s), their tests, and a root.changeset; not theStudioRefusalStripregion 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: defaultClause-②: 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 authorThread-read: none
Premise: holds (card measured at
7fa9873f; blocker PR #29132 landed 09:52Z as3d2e8fdb; atorigin/mainthe only saved-state affordance on the draft path isdata-saved-at, ~L8838 "the hint is the whole affordance"; studio namespace keys areRecord<string, string>, so a new key widens nothing, which the os-dev confirms on the built types beforepr_create)Serial constraints cleared: PR #29224 (#29139,
domain:ui#3) edits the same file hunk-disjointly atStudioRefusalStrip, sopr_createwaits for it to land and for main to be merged in; #29113 (seat 5) takes this card as its same-file serial constraintobjectstack-fleet commentedon Nov 2, 2026
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" ] }objectstack-fleet commentedon Nov 2, 2026
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 headf9f3982b(announceDraftSavedat the five autosave sites inStudioDesignSurface.tsx, theengine.studio.draftSavedkey in the en and zh studio packs, its test, the changeset). Delivered in full: nothing remains on this card;pm:dispatchedremoved.