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
Record delete: the confirm dialog never says the delete is permanent, and the toast says "Record deleted" without naming the record #27823
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 ~L3914 toast.success(t('detail.deleted', { defaultValue: 'Record deleted' })). The confirm copy is detail.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, and deleteConfirmTitle: '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 main first: 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/i18n packs. A new key is Clause-②: yes (widening).
Claim: PM loop round 1
Session: session_01Utp6CbDAucNyQ4UtzCJKyh
Account: os-bill
Branch: claude/project-thread-ttt0dx (the card thread's designated push branch, the recorded platform exception to claude/issue-<n>-<slug>)
Worktree: objectstack-issue-27823
Domain: domain:ui
Seat: domain:ui#4
File surface: the record-delete confirm/toast sites (app-shell RecordDetailView.tsx delete region only, list/bulk delete sites as measured), @object-ui/i18n packs (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 --tier on 2a0b37bb: no path-derived mandate), effort: medium
Clause-②: 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.
{
"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"
]
}
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