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 object designer: an edit made less than 1.5 s before switching to another object in the rail is silently discarded (the autosave debounce never sends it and no confirm is shown) #27511
Found in the 18.3.0 release-candidate browser walkthrough (wave anchor #27377, card W3-UX), at framework main @ c4c515ad, Console built in-repo from the same commit.
Repro (fresh boot)
Boot examples/app-showcase with --seed-admin and sign in as admin. Viewport 1440×900.
From Home choose New in Studio, create a package (e.g. "Field Service"), and create an object Work Order with an optional Number field Estimated Hours and a Picklist Status (option value new, label New Request). Create a second object, Site.
On Work Order's Form tab, add a Text field Temp. Wait 3 s, until "Saved" shows.
Click Remove "Temp". Within one second, click Site in the object rail, then click Work Order again.
The walkthrough measured this with a 150 ms and an 800 ms gap. A label rename followed by a switch 1 s later behaves the same.
Expected
The removal is saved, or the switch asks first. The edit is complete and saveable, so it is not one the pillar is still holding.
Actual
Temp is back, and it is still there after a reload. A renamed label likewise reverts to its old text. Nothing between the edit and the debounce firing shows that an edit is pending: "Saving…" or "Saved" appears only once it sends.
Reading
useDraftAutoSave (ui/packages/app-shell/src/views/studio-design/useDraftAutoSave.ts) sends after a 1500 ms timer. The timer deliberately does not send once the open item has changed ("a switch since the edit left it with its item"), and flush exists for callers. The rail's object switch neither flushes nor confirms.
Related, closed: #26705 and #26845, for edits the pillar is still holding because they are not yet saveable. This case is a saveable edit caught inside the debounce window.
Read fresh. A saveable edit made less than 1.5 s before switching objects in the Studio rail is silently discarded. The autosave debounce never sends it and no confirm is shown. A silent drop of an authored value: p2.
Claim: PM loop round 1
Session: session_01Utp6CaJoinvGQSbHeDaWBe
Account: os-bill
Branch: claude/project-thread-ufaqzz (the card thread's designated push branch, the recorded platform exception to claude/issue-<n>-<slug>)
Worktree: objectstack-issue-27511
Domain: domain:ui
Seat: domain:ui#3
File surface: ui/packages/app-shell/src/views/studio-design/StudioDesignSurface.tsx (selection, rail switch, inspector close, autosave hold region), ui/packages/app-shell/src/views/studio-design/useDraftAutoSave.ts, ui/packages/app-shell/src/views/metadata-admin/inspectors/ObjectFieldInspector.tsx (formula returnType only), tests beside, root .changeset/ (stop on breach; explain in the report)
Container & model: M, mode:thread, model: TIER_DEFAULT (dispatch-gates --tier on ee9a8d6e: no path-derived mandate), effort: high
Clause-②: no
Metadata-protocol: none
Responsibility: ui code produces the defect | no platform path covers it | every Studio / console author reaches it today
Thread-read: 6495181196
Premise: holds
Serial constraints cleared: PR #27557 (#27464, seat 1, Interfaces nav-rename held-edit guard) edits StudioDesignSurface.tsx in another region: merge origin/main after it lands and reuse its guard where it fits · PR #27533 (#27462) and PR #27340 (#27188, pm:epic#8345) edit ObjectFieldInspector.tsx in other regions · seat-3 siblings #27517 (ObjectFieldInspector API-name input) and #27482 (metadata-admin CEL hold), declared regions disjoint
Fold: chain head of #27511 + #27485 (one branch, one PR, one Fixes # line and one commit per card). Five gates answered in the order: same defect form (a pending or held draft edit tied to the selection instead of the draft), same file region, both triaged p2, each checkable by its own repro; excluded look-alikes #27482, #27513, #27459, #27516.
Dispatched 2026-10-29T13:11Z to a card thread of the seat's project; the order lives in the project. ⛔ The thread posts no claim and writes no assignee.
{
"issue": 27511,
"status": "done",
"branch": "claude/project-thread-ufaqzz",
"pr": "https://github.com/objectstack-ai/objectstack/pull/27617",
"session": "session_01Utp6CbCrKUjGeTReNEmUJx",
"premise_still_valid": true,
"summary": "#27511: the Data rail opens objects through one openObject gate that calls useDraftAutoSave's existing flush for an edit inside the 1.5 s debounce, waits out a save in flight, and asks through confirmDropUnsavedWork when the edit cannot be sent; no second autosave path. #27485 (folded): returnType is settled only when the lint and inference verdicts for one source are both in, so a broken formula keeps the stored type; a switch over a held CEL edit asks; and (own commit 73b0ad89) the CEL hold is kept in host state stamped to the field's CEL text, so closing the inspector no longer releases it, with a held line and Show me. Deviations: a WIP commit 5002d07c holding both cards was pushed before the split and stays (no force push); 59a0510e splits it back so the following commits are one per card. File surface widened to studio i18n en/zh for one key, seat-approved 13:14:22Z. CelPredicateField not touched. The PR skips the harness's after-PR assignee/review step by the dispatch order.",
"tests": "Head efb181aa (main merged at 1ed33609): `pnpm --dir ui exec vitest run packages/app-shell/src/views/studio-design packages/app-shell/src/views/metadata-admin/inspectors` under the lock: VERDICT command-exit 0, Test Files 460 passed (460), Tests 4610 passed | 1 skipped. Touched suites 30/30 at 73b0ad89, 25/25 at 19ceb5d8. Ablations via scripts/ablation-replace.mjs, each restored (blob == HEAD, git diff HEAD empty): (1) rail onClick -> bare setCurrent(o): railSwitchFlush 3 failed | 1 passed; (2) settleFormulaType without the errors>0 guard: returnType 1 failed | 2 passed (the card's repro); (3) confirmDropUnsavedWork line deleted from openObject: 2 failed | 11 passed (refused-save case + celGate switch arm); (4) kept-verdict condition forced false: celGate 5 failed | 4 passed (four closers + Show me).",
"gates": "dispatch-gates --ran: 34 derived, 34 run, 0 NOT-MEASURED; 33 exit 0. `pnpm --dir ui exec vitest run scripts/` exit 1 on 15 s timeouts while the 460-file run held the box (5 tests, rerun alone under the lock: 1, check-vi-mock-inherit whole-tree sweep at 16 s); that file alone 83/83 green; none reads a touched file. check-sdui-manifest exit 0; check-nul-bytes exit 0; app-shell type-check exit 0 after rebuilding @object-ui/core (stale dist missing measureCellCurrency from #27340); i18n type-check exit 0; eslint on the 9 changed TS/TSX files 0 errors. `pnpm check:new-line-citations` does not exist in package.json (exit 254); not run. CI check-runs on #27617: pending at report time.",
"dogfood_battery": "n/a — no `!` in the PR title and no (narrowing) arm",
"mcp_calls": "0 — no GitHub MCP tool called (claude-code-remote subscribe_pr_activity on #27617 is a session subscription, not a GitHub write)",
"api_writes": "3 — POST /repos/objectstack-ai/objectstack/dispatches (fleet-write pr_create -> #27617); POST /repos/objectstack-ai/objectstack/issues/27511/comments (this report); POST /repos/objectstack-ai/objectstack/issues/27485/comments (one-line pointer). git push is not counted.",
"open_questions": [
{
"question": "#27485's close arm conflicts with objectui#4306 sub-decision A as restated in DataPillar.celGate.test.tsx: 'the host RESETS its own count when the selection changes or the inspector unmounts' (pinned by 'drops the count when the inspector closes, so the draft cannot wedge unsaved'). #27485's triage asks to 'Tie the CEL hold to the draft rather than to the inspector's selection'. Which stands?",
"options": [
"A: keep the close arm (73b0ad89). The hold follows the draft; the ruling's invariants are kept (host state, never a child's teardown; never wedged: the held line names the field with Show me, and editing, removing the field or reloading ends it). Cost: none further.",
"B: sub-decision A stands. Revert 73b0ad89 on this PR (one revert commit); #27511, returnType and the switch arm still land; #27485 stays open for its close arm or is re-triaged."
],
"recommendation": "A, because the ruling's stated reason (a wedged Save with no editor on screen) no longer applies once the hold names the field and reopens it, and B ships the card's repro unfixed."
}
],
"out_of_scope_findings": [
"class: none (observation) · reach: not measured · the Data pillar's panel-family CEL hold (Validations and other tabs) is keyed by tab, the same selection-keyed shape as #27485's close arm · dedupe words: panelBlocking, CEL hold, tab close, Validations · carrier: none · noted in PR Acceptance notes, not filed"
]
}
Report taken 2026-10-29T14:52Z. PR #27617 is a draft; the seat routes review.
Activity
objectstack-fleet commentedon Oct 29, 2026
triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U
Path: 业务对象与记录 | none | P①
Triage: p2 ·
domain:ui·area:studio· 2026-10-29T11:16Z⛔ Not a claim.
bug,pm:queue.Generated by Claude Code
objectstack-fleet commentedon Oct 29, 2026
domain:ui#3 · os-bill · session_01Utp6CaJoinvGQSbHeDaWBe
Claim: PM loop round 1
Session:
session_01Utp6CaJoinvGQSbHeDaWBeAccount:
os-billBranch:
claude/project-thread-ufaqzz(the card thread's designated push branch, the recorded platform exception toclaude/issue-<n>-<slug>)Worktree:
objectstack-issue-27511Domain:
domain:uiSeat:
domain:ui#3File surface:
ui/packages/app-shell/src/views/studio-design/StudioDesignSurface.tsx(selection, rail switch, inspector close, autosave hold region),ui/packages/app-shell/src/views/studio-design/useDraftAutoSave.ts,ui/packages/app-shell/src/views/metadata-admin/inspectors/ObjectFieldInspector.tsx(formula returnType only), tests beside, root.changeset/(stop on breach; explain in the report)Container & model:
M,mode:thread,model: TIER_DEFAULT(dispatch-gates --tieronee9a8d6e: no path-derived mandate),effort: highClause-②: no
Metadata-protocol: none
Responsibility: ui code produces the defect | no platform path covers it | every Studio / console author reaches it today
Thread-read: 6495181196
Premise: holds
Serial constraints cleared: PR #27557 (#27464, seat 1, Interfaces nav-rename held-edit guard) edits
StudioDesignSurface.tsxin another region: mergeorigin/mainafter it lands and reuse its guard where it fits · PR #27533 (#27462) and PR #27340 (#27188,pm:epic#8345) editObjectFieldInspector.tsxin other regions · seat-3 siblings #27517 (ObjectFieldInspector API-name input) and #27482 (metadata-admin CEL hold), declared regions disjointFold: chain head of #27511 + #27485 (one branch, one PR, one
Fixes #line and one commit per card). Five gates answered in the order: same defect form (a pending or held draft edit tied to the selection instead of the draft), same file region, both triaged p2, each checkable by its own repro; excluded look-alikes #27482, #27513, #27459, #27516.Dispatched 2026-10-29T13:11Z to a card thread of the seat's project; the order lives in the project. ⛔ The thread posts no claim and writes no assignee.
Generated by Claude Code
fix(studio): the Data rail sends an edit inside the autosave delay be…
fix(studio): a broken formula keeps its stored returnType; a switch o…
objectstack-fleet commentedon Oct 29, 2026
domain:ui#3 · os-bill · session_01Utp6CbCrKUjGeTReNEmUJx
os-dev-report
{ "issue": 27511, "status": "done", "branch": "claude/project-thread-ufaqzz", "pr": "https://github.com/objectstack-ai/objectstack/pull/27617", "session": "session_01Utp6CbCrKUjGeTReNEmUJx", "premise_still_valid": true, "summary": "#27511: the Data rail opens objects through one openObject gate that calls useDraftAutoSave's existing flush for an edit inside the 1.5 s debounce, waits out a save in flight, and asks through confirmDropUnsavedWork when the edit cannot be sent; no second autosave path. #27485 (folded): returnType is settled only when the lint and inference verdicts for one source are both in, so a broken formula keeps the stored type; a switch over a held CEL edit asks; and (own commit 73b0ad89) the CEL hold is kept in host state stamped to the field's CEL text, so closing the inspector no longer releases it, with a held line and Show me. Deviations: a WIP commit 5002d07c holding both cards was pushed before the split and stays (no force push); 59a0510e splits it back so the following commits are one per card. File surface widened to studio i18n en/zh for one key, seat-approved 13:14:22Z. CelPredicateField not touched. The PR skips the harness's after-PR assignee/review step by the dispatch order.", "tests": "Head efb181aa (main merged at 1ed33609): `pnpm --dir ui exec vitest run packages/app-shell/src/views/studio-design packages/app-shell/src/views/metadata-admin/inspectors` under the lock: VERDICT command-exit 0, Test Files 460 passed (460), Tests 4610 passed | 1 skipped. Touched suites 30/30 at 73b0ad89, 25/25 at 19ceb5d8. Ablations via scripts/ablation-replace.mjs, each restored (blob == HEAD, git diff HEAD empty): (1) rail onClick -> bare setCurrent(o): railSwitchFlush 3 failed | 1 passed; (2) settleFormulaType without the errors>0 guard: returnType 1 failed | 2 passed (the card's repro); (3) confirmDropUnsavedWork line deleted from openObject: 2 failed | 11 passed (refused-save case + celGate switch arm); (4) kept-verdict condition forced false: celGate 5 failed | 4 passed (four closers + Show me).", "gates": "dispatch-gates --ran: 34 derived, 34 run, 0 NOT-MEASURED; 33 exit 0. `pnpm --dir ui exec vitest run scripts/` exit 1 on 15 s timeouts while the 460-file run held the box (5 tests, rerun alone under the lock: 1, check-vi-mock-inherit whole-tree sweep at 16 s); that file alone 83/83 green; none reads a touched file. check-sdui-manifest exit 0; check-nul-bytes exit 0; app-shell type-check exit 0 after rebuilding @object-ui/core (stale dist missing measureCellCurrency from #27340); i18n type-check exit 0; eslint on the 9 changed TS/TSX files 0 errors. `pnpm check:new-line-citations` does not exist in package.json (exit 254); not run. CI check-runs on #27617: pending at report time.", "dogfood_battery": "n/a — no `!` in the PR title and no (narrowing) arm", "mcp_calls": "0 — no GitHub MCP tool called (claude-code-remote subscribe_pr_activity on #27617 is a session subscription, not a GitHub write)", "api_writes": "3 — POST /repos/objectstack-ai/objectstack/dispatches (fleet-write pr_create -> #27617); POST /repos/objectstack-ai/objectstack/issues/27511/comments (this report); POST /repos/objectstack-ai/objectstack/issues/27485/comments (one-line pointer). git push is not counted.", "open_questions": [ { "question": "#27485's close arm conflicts with objectui#4306 sub-decision A as restated in DataPillar.celGate.test.tsx: 'the host RESETS its own count when the selection changes or the inspector unmounts' (pinned by 'drops the count when the inspector closes, so the draft cannot wedge unsaved'). #27485's triage asks to 'Tie the CEL hold to the draft rather than to the inspector's selection'. Which stands?", "options": [ "A: keep the close arm (73b0ad89). The hold follows the draft; the ruling's invariants are kept (host state, never a child's teardown; never wedged: the held line names the field with Show me, and editing, removing the field or reloading ends it). Cost: none further.", "B: sub-decision A stands. Revert 73b0ad89 on this PR (one revert commit); #27511, returnType and the switch arm still land; #27485 stays open for its close arm or is re-triaged." ], "recommendation": "A, because the ruling's stated reason (a wedged Save with no editor on screen) no longer applies once the hold names the field and reopens it, and B ships the card's repro unfixed." } ], "out_of_scope_findings": [ "class: none (observation) · reach: not measured · the Data pillar's panel-family CEL hold (Validations and other tabs) is keyed by tab, the same selection-keyed shape as #27485's close arm · dedupe words: panelBlocking, CEL hold, tab close, Validations · carrier: none · noted in PR Acceptance notes, not filed" ] }Report taken 2026-10-29T14:52Z. PR #27617 is a draft; the seat routes review.
Generated by Claude Code
objectstack-fleet commentedon Oct 29, 2026
domain:ui#3 · os-bill · session_01Utp6CaJoinvGQSbHeDaWBe
ACCEPT → PR #27617 comment 6502843076 · 2026-10-29T16:45Z
[Edit: the comment id was missing; the ACCEPT record posted after this pointer.]