Skip to content

console: the row and record-page Delete confirmations name the objects a delete will cascade into, from the served cascadeDeleteObjects (ui half of #28001) #28472

Closed

Description

@objectstack-fleet

domain:server#2 · os-project-manager · session_0186vfjHHMsRXC9EUT9hTFMo

Filing gate: ③ ruling-directed. The maintainer's ruling B on #28001 (recorded in 6545218189) says: "UI half follows on plugin-grid rowCrudAffordances / ObjectGrid delete and the record-page delete confirm. It is a domain:ui card, blocked by the server PR." The server PR, #28451, has merged (6e0b16ac), so this card is the carrier. Filed by domain:server seat 2. ⛔ Not a claim. No grade: triage sets the lane and grade.

Reach: any user deleting a record whose children cascade. HotCRM: deleting a lead silently deletes its campaign memberships (#27380 row 4).
Reader who acts: domain:ui.

What the server now serves (on main)

  • GET /meta/object/:name (both doors, the cached one included) and the app bundle's object entries carry cascadeDeleteObjects: string[] beside item. The schema is GetMetaItemResponseSchema.cascadeDeleteObjects / GetMetaItemCachedResponseSchema.cascadeDeleteObjects in packages/spec/src/api/protocol.zod.ts.
  • It lists, by object name, every object a delete of this object can also delete: the transitive cascade closure from the rule the delete runs (master_detail by default, a lookup / tree with deleteBehavior: 'cascade'). Each object appears once, in the order the delete reaches it. restrict / set_null relations are not listed.
  • [] means nothing cascades. Absent means no engine answered, never that nothing cascades. It is absent on a draft read and on the list read (GET /meta/object).
  • It is object-level only: no record ids and no counts. Object names, not field names: a field name could disclose a field another object's ADR-0106 mask removes.

Wanted

  • The row delete confirm (plugin-grid rowCrudAffordances / ObjectGrid) and the record-page delete confirm (RecordDetailView) add one generated line naming those objects by their labels (resolve the labels on the client from the names, in the user's language). Show nothing extra when the list is [].
  • ⛔ No second copy of "which relations cascade" in the client. When the key is absent, the confirmation says nothing about children rather than guessing.
  • ⛔ No confirmText or other author key (ruling B, "No author key").

Blocked-by: none (#28451 merged).
Related: #28001 (parent, server half landed), #27380 (row 4), #27823.

Dedupe words: delete confirmation cascade children list, cascadeDeleteObjects console, delete confirm names child objects.


Generated by Claude Code

Activity

  1. objectstack-fleet commented on Oct 31, 2026

    @objectstack-fleet
    ContributorAuthor

    triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U

    Path: 业务对象与记录 | none | P②

    Triage: p3 · domain:ui · area:records · 2026-10-31T21:54Z

    ⛔ Not a claim.


    Generated by Claude Code

  2. objectstack-fleet commented on Oct 31, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#1 · os-tesla · session_01L9qibw2uhdSeHYfnZdAf4V

    Claim: PM loop round 1 · 2026-10-31T22:58Z
    Session: session_01L9qibw2uhdSeHYfnZdAf4V (seat; implementation by card thread session session_01L9qibvGtYbnKXjz3iks1AW, mode:thread)
    Account: os-tesla (the seat's linked user as GET /user answers it; the card's assignee)
    Branch: claude/project-thread-r27m28
    Worktree: objectstack-issue-28472
    Domain: domain:ui
    Seat: domain:ui#1
    File surface: ui/packages/plugin-grid/** (row delete confirm), the record-page delete confirm in ui/packages/app-shell/src/views/**, ui/packages/data-objectstack/** / ui/packages/react/** only if the metadata carry is measured necessary, i18n catalogs, tests, root changeset (stop on breach; explain in the report)
    Container & model: M, mode:thread, model: default (dispatch-gates --tier: no path-derived mandate), effort: high
    Clause-②: no (no author key; a new export on a published @object-ui/* package would make it yes — measured from the diff)
    Metadata-protocol: none
    Responsibility: n/a — not a defect card
    Thread-read: 6549643166
    Premise: holds
    Serial constraints cleared: PR #28477 (#27058) edits RecordDetailView.tsx; sibling #28461 (this seat) adds a host callback in ui/packages/plugin-grid/src/ObjectGrid.tsx: ordinary concurrency, small edits, the later lander merges origin/main.
    Order: /mnt/project-files/ui-seat-1/r2026-10-31b/dispatch-28472.md. Ruling: #28001 ruling B (6545218189), no author key; triage 6549643166.

  3. objectstack-fleet commented on Oct 31, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#1 · os-tesla · session_01L9qibw2uhdSeHYfnZdAf4V

    Claim amendment 1 · 2026-10-31T23:00Z · amends claim 6550286715 at the card thread's measured request (main 768ec4bf). Append-only.

    1. Clause-②: yes (widening: new carried-key helpers attachCascadeDeleteObjects / readCascadeDeleteObjects exported from @object-ui/core beside attachObjectSortability, and confirmCopy gains an optional resolved-label list; no accept set moves)
    2. Surface, recorded: ui/packages/core/** (actions/recordDelete.ts confirmCopy + the carried-key helper), ui/packages/data-objectstack/** (fetchObjectSchemaFresh re-attaches the envelope's cascadeDeleteObjects), ui/packages/app-shell/src/hooks/useObjectActions.ts, ui/packages/app-shell/src/views/{ObjectView.tsx,RecordDetailView.tsx} (hosts read the by-name schema, not the list read, and resolve labels), i18n catalogs (one key), tests, root changeset. ui/packages/plugin-grid/** drops out: it has no delete confirm of its own.
    3. Why: plugin-grid hands the row to the host's onDelete; both Console confirms use @object-ui/core confirmCopy; the adapter drops the envelope's siblings, and the hosts' objectDef comes from the list read, where the key is never served.
    4. Bulk delete uses the same confirmCopy and the same cascade, so it gets the same line; noted in Acceptance. plugin-view's own ObjectView dialog stays as is (Acceptance note).
    5. Serial: ObjectView.tsx is also edited by PR feat(app-shell,components): on a phone the record is always a page, with a compact header, a bottom action bar and related records pushed as pages #28477 (console mobile (≤ 640 px): list as card rows with view chips and a FAB, the record page with a compact header, sticky tabs and a bottom action bar, related records pushed as full pages with a path row and back — the record is always a page on a phone #27058) and by sibling Record pane: on a grouped list or a kanban board the counter and ↓ ↑ are missing — step within the row's group or lane and name it in the tooltip #28461 (this seat); ordinary concurrency, the later lander merges origin/main. Clause-② yes ⇒ the seat writes the TIER_DEFAULT contract record.
  4. objectstack-fleet commented on Oct 31, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#1 · os-tesla · session_01L9qibvGtYbnKXjz3iks1AW

    os-dev-report

    {
     "issue": 28472,
     "status": "done",
     "branch": "claude/project-thread-r27m28",
     "pr": "https://github.com/objectstack-ai/objectstack/pull/28490",
     "session": "session_01L9qibvGtYbnKXjz3iks1AW",
     "premise_still_valid": true,
     "summary": "The row, bulk and record-page Delete confirmations add one translated sentence naming the cascade objects by label when the served cascadeDeleteObjects is non-empty; [] and absent keep today's text. Measured: plugin-grid has no confirm (hosts own it via core recordDelete.confirmCopy), the adapter dropped the envelope key, and the hosts' objectDef is the list read; so core gains a symbol-carried key pair, data-objectstack carries it, app-shell hosts read the by-name schema. Surface as recorded in claim amendment 6550299396.",
     "tests": "head e1ded0b8: new + existing delete pins 8 files 51 passed; ui packages/i18n+core+data-objectstack 432 files (3 dts-only reds green after spec dts build: 3 files 77 passed); app-shell hooks/ + views/ObjectView* + views/RecordDetailView* 262 files 2006 passed; type-check core/data-objectstack/i18n/app-shell exit 0. Ablation via scripts/ablation-replace.mjs (reader in resolveCascadeDeleteLabels -> bare return): 2 host files 4 failed / 5 passed (all list-positive pins red, []/absent/failed-read green), restored to HEAD blob 7742aef6.",
     "gates": "dispatch-gates --commands: 35 derived, all exit 0 (incl. check-sdui-manifest + self-test, check:cross-package-test-inputs, check:test-source-alias, check:published-files, check:undeclared-dep-imports, check-changeset-no-major, ui vitest scripts/ 171 files 4901 passed); --ran: 35 derived, 35 run, 0 NOT-MEASURED. ui check:new-line-citations: 0 new. PR check-runs: in_progress at report time.",
     "line_budget": "n/a — no skills/** or ratcheted ledger touched",
     "deviations": [
      "File surface widened from the order (core, app-shell hooks/useObjectActions.ts + views/ObjectView.tsx, i18n; plugin-grid dropped) — measured and recorded by the seat in claim amendment 6550299396 before any code",
      "Commit trailer spelled Co-Authored-By (harness form); model-free"
     ],
     "files_changed": [
      ".changeset/28472-delete-confirm-cascade-objects.md",
      "ui/packages/core/src/utils/cascade-delete-objects.ts",
      "ui/packages/core/src/index.ts",
      "ui/packages/core/src/actions/recordDelete.ts",
      "ui/packages/core/src/actions/__tests__/recordDelete.cascade-28472.test.ts",
      "ui/packages/data-objectstack/src/index.ts",
      "ui/packages/data-objectstack/src/getObjectSchema.cascadeDeleteObjects-28472.test.ts",
      "ui/packages/app-shell/src/hooks/useObjectActions.ts",
      "ui/packages/app-shell/src/hooks/__tests__/useObjectActions.deleteCascade-28472.test.tsx",
      "ui/packages/app-shell/src/views/ObjectView.tsx",
      "ui/packages/app-shell/src/views/RecordDetailView.tsx",
      "ui/packages/app-shell/src/views/RecordDetailView.deleteCascade-28472.test.tsx",
      "ui/packages/i18n/src/locales/{ar,de,en,es,fr,ja,ko,pt,ru,zh}.ts"
     ],
     "shared_files_touched": "ObjectView.tsx (+7 lines), RecordDetailView.tsx (+5 lines) — also edited by PR #28477 / #28461",
     "dogfood_battery": "n/a — no ! in the PR title and no (narrowing) arm",
     "mcp_calls": "6 — reads only: issue_read x3, pull_request_read x1 (get), ToolSearch load x1, plus 0 writes",
     "api_writes": "2 — relay pr_create (PR #28490), relay comment (this os-dev-report on #28472)",
     "open_questions": [],
     "out_of_scope_findings": [
      "carrier: seat · noted, not filed — plugin-view's own ObjectView delete dialog passes no cascadeLabels (Acceptance note)"
     ]
    }
  5. objectstack-fleet commented on Nov 1, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#1 · os-tesla · session_01L9qibw2uhdSeHYfnZdAf4V

    Landed · 2026-11-01T00:53Z · PR #28490 merged through the merge queue as 8c3f9d93 at 2026-11-01T00:52:29Z, on the first pass. Records: contract PASS 6550860170 + delta 6551094102, ACCEPT 6551245886 (head 4e795d9e).

    probe on ui/packages before (8c3f9d93~1) now (origin/main)
    deleteCascade 0 20
    attachCascadeDeleteObjects(item 0 1
    'overrides' (ui SPEC_ACTION_KEYS) 0 1

    The card closed on Fixes; pm:dispatched comes off in the same stroke as this note. The landing also un-reds actionKeys.pin on main for every ui PR (red since ba0084e4, #28467).

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

Metadata

Metadata

Assignees

Labels

area:recordsBusiness objects, records, the views that show data, usable forms, searchdomain:uienhancementNew feature or requestpriority:p3

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions