Repository navigation
Description
domain:ui#4 · os-bill · session_01Utp6CbDAucNyQ4UtzCJKyh
Filing gate: ③ triage-directed split. Triage on #27520 (6495077487) said: 「Each row is either taken, with its own card where it needs code」. This card is row 10.
Business reason: a record delete cannot be undone. The platform has no recycle bin: enable.trash was retired, and its tombstone in packages/spec/src/data/object.zod.ts says soft delete "is parked". Yet the confirm dialog only asks "Are you sure?", and the toast does not say which record went. A user who deletes the wrong row gets no warning before, and no name after, to notice it.
Reader who acts: domain:ui (the console's record delete confirm and toast).
Duplicate search: search_issues "delete confirm dialog does not say permanent cannot be undone toast Record deleted names record" → 0 hits. New.
What happens (row 10 of #27520, 18.3.0 RC walkthrough at c4c515ad)
Admin, desktop, delete a task. The confirm dialog does not say the delete cannot be undone. The toast is a generic Record deleted, while the create toast names the record.
Mechanism (read on origin/main, not reproduced here)
- Record page:
ui/packages/app-shell/src/views/RecordDetailView.tsx~L3914toast.success(t('detail.deleted', { defaultValue: 'Record deleted' })). The confirm copy isdetail.deleteConfirmation("Are you sure you want to delete this record?"). - A list row delete has its own confirm, with keys near
en.ts~L3980 (deleteConfirm, anddeleteConfirmTitle: 'Delete {{label}} "{{name}}"?'). Measure which confirm and toast each delete entry point (record page header, list row menu, bulk delete) uses. - Studio's object and field deletes already say "This action cannot be undone" (
en.ts~L2065). That is the house wording to reuse.
Expected
- The confirm says the delete is permanent ("This can't be undone"), on every record-delete entry point that shows a confirm.
- The success toast names the record, the same way the create toast does, e.g.
Task "Website Relaunch" deleted. A bulk delete keeps its count. - ⛔ No Undo: there is no restore to undo with.
Acceptance
- One measured repro on current
mainfirst: list the delete entry points and the keys each uses. - Tests: the confirm carries the permanence sentence, and the toast names the record (label and name). Control: the bulk delete toast keeps its count. Include an ablation.
- New copy in all ten
@object-ui/i18npacks. A new key isClause-②: yes (widening).
Links back: #27520 (row 10)
Generated by Claude Code
Activity
objectstack-fleet commentedon Oct 30, 2026
domain:ui#4 · os-bill · session_01Utp6CbDAucNyQ4UtzCJKyh
Claim: PM loop round 1
Session:
session_01Utp6CbDAucNyQ4UtzCJKyhAccount:
os-billBranch:
claude/project-thread-ttt0dx(the card thread's designated push branch, the recorded platform exception toclaude/issue-<n>-<slug>)Worktree:
objectstack-issue-27823Domain:
domain:uiSeat:
domain:ui#4File surface: the record-delete confirm/toast sites (app-shell
RecordDetailView.tsxdelete region only, list/bulk delete sites as measured),@object-ui/i18npacks (all ten), tests beside, root.changeset/; ⛔RecordDetailView.tsxapiHandler(in-flight PR #27793) (stop on breach; explain in the report)Container & model:
S,mode:thread,model: TIER_DEFAULT(dispatch-gates --tieron2a0b37bb: no path-derived mandate),effort: mediumClause-②: yes (widening)
Metadata-protocol: none
Responsibility: every record-delete confirm says the delete is permanent and the success toast names the record (bulk keeps its count); no Undo; new copy in all ten packs
Thread-read: none
Premise: holds
Serial constraints cleared: in-flight: PR #27793 (RecordDetailView apiHandler, excluded); merge origin/main before the PR
Dispatched 2026-10-30T00:54Z 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
objectstack-fleet commentedon Oct 30, 2026
domain:ui#4 · os-bill · session_01Utp6CYTT4mayn9WzbCF7tz
os-dev-report
Report for PR #27850, written 2026-10-30T02:06Z.
{ "issue": 27823, "status": "done", "branch": "claude/project-thread-ttt0dx", "pr": "https://github.com/objectstack-ai/objectstack/pull/27850", "head": "6ff4636e", "session": "session_01Utp6CYTT4mayn9WzbCF7tz", "premise_still_valid": true, "summary": "Every one-record delete question (objectActions.deleteConfirm: record page, console list, object-view grid; detail.deleteConfirmation: plugin-detail) now ends with the pack's own permanence sentence, the one bulkDeleteConfirm already carried, in all ten packs. New recordDelete.successText names the deleted record by getRecordDisplayName (Record #id floor keeps the object-label toast); recordDelete.run and the record page use it, run takes an optional objectDef. New key objectActions.deletedNamed in ten packs. Bulk toast keeps its count. No Undo.", "tests": "pre-merge targeted vitest 97 files 1448 passed / 13 skipped; neighbours (core/src/actions, plugin-view, plugin-detail, key-pinning files) 468 files 4579 passed / 18 skipped; merged head 6ff4636e targeted 97 files 1448 passed / 13 skipped; ablation 1 (successText always deleteSuccess, blob 5dc54382 -> c23705e9) 4 failed / 23 passed, restored to HEAD blob; ablation 2 (en deleteConfirm without the sentence, blob bec64d03 -> ffdb6618) 2 failed / 23 passed, restored to HEAD blob; type-check exit 0 on 6ff4636e for @object-ui/core, i18n, plugin-view, plugin-detail, app-shell", "gates": "dispatch-gates --commands: 34 derived; 33 run on c92450e9 each exit 0 (incl. node scripts/check-sdui-manifest.mjs exit 0); pnpm --dir ui exec vitest run scripts/ on 6ff4636e exit 0 (171 files, 4902 passed / 2 skipped); --ran reconcile: 34 accounted, 0 NOT-MEASURED; pnpm check:new-line-citations 0 new; CI check-runs: in_progress at report time", "line_budget": "22 files, +258 / -51 (309 changed lines) vs merge base; under the 3000 human-merge threshold", "files_changed": 22, "dogfood_battery": "n/a — no ! in the PR title and no (narrowing) arm", "deviations": [ "commit 3a041186 (the fix commit) carries the seat's session id in its Claude-Session trailer instead of this thread's session_01Utp6CYTT4mayn9WzbCF7tz; not rewritten (no force push on a non claude/issue-* branch)", "the harness's after-PR assignee/review step skipped per the dispatch order", "the 33 node/check gates ran on c92450e9 before the origin/main merge; the merge touched none of this diff's files" ], "mcp_calls": "0", "api_writes": "2 — fleet-write relay pr_create (repository_dispatch -> POST pulls #27850); post-stamped POST issues/27823/comments (this report)", "open_questions": [], "out_of_scope_findings": [ "carrier: none · detail.deleted has no call site after this PR; left in the packs for the dead-key sweep (report-only), noted in Acceptance notes", "carrier: none · author-declared bulkActionDefs operation delete in ObjectGrid BulkActionDialog shows its own declared copy; not a built-in delete path, noted in Acceptance notes" ] }objectstack-fleet commentedon Oct 30, 2026
domain:ui#4 · os-bill · session_01Utp6CbDAucNyQ4UtzCJKyh
ACCEPT → PR #27850 comment 6513428115 · 2026-10-30T02:25Z
Generated by Claude Code