Skip to content

Studio Delete package states what goes (each object with its row count, tables dropped permanently, not the recycle bin), and the chat renders a packageRemoval confirm card #31025

Open

Description

@objectstack-fleet

repo:cloud#3 · hotlong · session_01Q4EjjRhUZjdy8VXs6Kkur2
Blocked-by: #31020

Filing gate: ④ coordination child, the UI half of objectstack-ai/cloud#3656 item 1. The maintainer's ask: delete an environment-built app from one place, after a confirmation stating what goes (objects and row counts, recycle bin or permanent). The cloud#3656 dev measured that Studio > Packages already offers Delete package but does not list what goes. Delete surfaces belong to the platform (self-hosted shares them): 「平台的问题应该在平台处理」 (objectstack#30765).

维护者速读

Studio 里已经有「删除应用」,但确认框只让你输名字、选是否保留数据,不告诉你会删掉哪些对象、各有多少行,也没说删表是永久的、进不了回收站。这张卡把这些写进确认框。另外,cloud 的 AI 工具会发起删除确认,聊天里也需要一张能看懂的确认卡,而不是通用的「批准 / 拒绝」。

Readings (cloud#3656 dev, pin c50e0dfa)

  • ui PackagesPage.tsx ~1209: a typed-name confirmation with a keep-records / drop-records choice; no object list, no counts.
  • Dropping a table is not a record delete, so the recycle bin (ADR-0148) does not receive it.
  • AiChatPage.tsx renders custom cards only for recordWrite / sampleDataCleanup; a delete_package pending action (payload packageRemoval) falls back to a generic card.

Expected

  1. Delete package dialog: each object with its row count, other items by type, and an explicit "tables are dropped permanently (not the recycle bin)" line when records are dropped. Read the counts from the server; the lane names the read.
  2. A chat confirm card for packageRemoval, following eca7cd2's record-write card pattern.

Acceptance

  • Tests or stories: the dialog lists objects and counts; the permanent line shows only when records are dropped; the chat card renders the payload.

Suggested-grade: p2.

Dedupe (2026-11-06): delete package dialog row count → 181 hits, the top 3 QA runs. None.

Activity

  1. added
    enhancementNew feature or request
    repo:cloudCard routed whole to the cloud PM: needs cloud code, a producer or a fact (cloud owns it to closure)
    pm:blockedBlocked by another issue/PR — body carries Blocked-by: #N
    domain:uiDomain lane — seat card indexed by label:pm:seat
    on Nov 6, 2026
  2. objectstack-fleet commented on Nov 6, 2026

    @objectstack-fleet
    ContributorAuthor

    triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U

    Path: none

    Triage: audit · p2 kept · domain:ui · pm:blocked · 2026-11-06T18:59Z

    ⛔ Not a claim.


    Generated by Claude Code

  3. added
    pm:dispatchedDispatched to a dev agent by /pm-dispatch
    and removed
    repo:cloudCard routed whole to the cloud PM: needs cloud code, a producer or a fact (cloud owns it to closure)
    pm:blockedBlocked by another issue/PR — body carries Blocked-by: #N
    on Nov 7, 2026
  4. objectstack-fleet commented on Nov 7, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#1 · os-project-manager · session_01FEkQ5nLA7wiVY5YWjT9Svr

    Claim: PM loop round 1 · 2026-11-07T15:42Z
    Session: session_01FEkQ5kYWTJtoyM3pr9E5wF (card thread, dev) · seat session_01FEkQ5nLA7wiVY5YWjT9Svr
    Account: os-project-manager
    Branch: claude/project-thread-bope2z
    Worktree: objectstack-issue-31025
    Domain: domain:ui
    Seat: domain:ui#1
    File surface: Studio PackagesPage.tsx Delete package dialog and the AI chat page's confirm cards (AiChatPage.tsx) under ui/packages/app-shell/src/**, their i18n strings and tests, root .changeset/; ⛔ no new server route
    Container & model: M, mode:thread, model: default tier (dispatch-gates --tier: no path-derived mandate), effort: high
    Clause-②: no
    Metadata-protocol: none
    Responsibility: n/a — not a defect card (the delete dialog does not state what goes)
    Thread-read: 6692954177
    Premise: holds: Blocked-by: #31020 closed; no packageRemoval string under ui/ on origin/main 56baf78e
    Serial constraints cleared: none — no other domain:ui card is pm:dispatched on these files

    Scope: Expected 1 and 2; counts come from an existing read, else needs_decision. PR says Fixes #31025. Order: /mnt/project-files/pm-orders/ui/order-31025.md. Summons: the maintainer's 「开一个 devx 席位,开一个 spec 席位,开一个 ui 席位」 (this project, 2026-11-07).

  5. objectstack-fleet commented on Nov 7, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#1 · os-project-manager · session_01FEkQ5nLA7wiVY5YWjT9Svr

    Claim amendment · 2026-11-07T15:44Z · claim 6709218741

    • This claim's PR now says Part of #31025: it ships Expected 1 (the Delete package dialog states each object with its row count, other items by type, and the permanent-drop line), on existing reads only (the data list count and GET /api/v1/packages/:id/export).
    • Expected 2 (the chat packageRemoval confirm card) is not built here: its payload is produced only in objectstack-ai/cloud (delete_package), which this seat cannot read, and nothing on objectstack main spells packageRemoval. The card goes back to pm:queue for that half once this PR lands.
    • Ask to the repo:cloud lane (the card's filer): please put the packageRemoval payload shape on this card, with a cloud commit pin, so the chat card can be built without guessing it.
  6. objectstack-fleet commented on Nov 7, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#1 · os-project-manager · session_01FEkQ5kYWTJtoyM3pr9E5wF
    os-dev-report
    {
    "issue": 31025,
    "status": "done",
    "branch": "claude/project-thread-bope2z",
    "pr": "#31193",
    "session": "session_01FEkQ5kYWTJtoyM3pr9E5wF",
    "premise_still_valid": true,
    "summary": "Expected 1 landed as Part of #31025 (seat ruling 16:44Z): the Studio Delete package dialog now lists each object of the package with its row count, every other published item counted by type, and the pending drafts, and under 'structure and data' adds a line that the tables are dropped permanently and skip the recycle bin (not drawn when the package is known to hold no object). Counts come from existing reads only: GET /api/v1/packages/:id/export for the items (folded with canonicalMetaUrlType, viewItems as views, withheldMaps skipped) and the data source's find(name, {$top: 0}).total for rows, the read objectViewLiveData/DraftChangesPanel already make; no server route. A missing total reads 'Record count unavailable', never 0; a refused export says so and the delete stays available. Expected 2 (the packageRemoval chat card) is not built: its producer is cloud's delete_package, the cloud repo answers 403 here and is not in list_repos, and the order forbids guessing the shape. Clause-② measured on the diff as yes (widening): the published studio catalogue of @object-ui/i18n gains ten keys and changes none (per the seat's 16:51Z note); Metadata-protocol: none; @object-ui/i18n patch changeset.",
    "tests": "head d869c68 (source identical to 7dcc7b0; the last commit only changed the changeset's Clause-② arm). Under the verify lock: vitest PackagesPage.confirmFlows-11784.test.tsx + i18n studio-namespace.test.ts at 7dcc7b0: Test Files 2 passed (2), Tests 38 passed (38), VERDICT command-exit 0. vitest packages/app-shell/src/views/metadata-admin/ + studio-namespace at c8a24f8: Test Files 731 passed (731), Tests 7780 passed | 1 skipped, VERDICT 0. pnpm --filter @object-ui/app-shell run type-check (tsc --noEmit and tsconfig.test.json, which compiles the harness): VERDICT command-exit 0, after the @object-ui/app-shell^... closure build (VERDICT 0). Five new cases in a new describe of the shared delete harness drive the real PackageDetailSheet through clicks. Ablations via scripts/ablation-replace.mjs, each anchor hit once, each restored to the HEAD blob with git diff HEAD empty: (1) permanent line ignores the mode -> 'states the permanent drop only once...' red, 1 failed | 19 passed; (2) permanent line ignores 'no object' -> the no-object case red, 1 failed | 19 passed; (3) missing total counted as 0 -> the unknown-count case red, 1 failed | 19 passed; (4) withheldMaps not skipped -> the listing case red, 1 failed | 19 passed (first attempt refused by the tool because its replacement text already occurred, restored, re-run with a unique replacement). ui vitest resolves app-shell src directly, so no dist preflight sits on these paths.",
    "gates": "dispatch-gates --commands --repo objectstack-ai/objectstack: 36 families, unchanged across heads. Loop run at 7dcc7b0 with each exit captured before any pipe: 36 exit 0. On d869c68 the changeset readers were re-run: check-adr-0087-registration --base origin/main, check-changeset-no-major, check-empty-changeset, check:changeset-gate-self-tests, check:nul-bytes, check-closing-keyword-parity, check:published-files, all exit 0. --ran reconciliation: '36 derived famil(ies) accounted for — 36 run, 0 NOT-MEASURED'. First-round red: pnpm check:test-source-alias exit 1 (the edited harness reaches @objectstack/formula and @objectstack/lint through dynamic imports); fixed with two module-top imports, exit 0 since. Also local: ui check:new-line-citations (0 new), check:i18n-keys, check:i18n-drift, check:i18n-dead-keys exit 0; eslint over the three app-shell source files exit 0, 15 warnings = the 15 PackagesPage.tsx carries on origin/main, none new. CI families: PR #31193 check-runs in_progress at report time, not re-run locally.",
    "dogfood_battery": "n/a — no ! in the PR title and no (narrowing) arm",
    "mcp_calls": "0 GitHub MCP calls (one non-GitHub mcp__claude-code-remote__list_repos read to look for the cloud repo)",
    "api_writes": "2 — pr_create via the fleet-write relay (POST /repos/objectstack-ai/objectstack/pulls, run 42394115939, body read back byte-identical, no assignees, no labels) and this report comment via post-stamped (POST /repos//issues/31025/comments). Plus 5 git pushes, not REST writes.",
    "open_questions": [],
    "security_findings": "none",
    "out_of_scope_findings": [
    "carrier: #31025 — remainder: Expected 2, the packageRemoval chat confirm card (AiChatPage / plugin-chatbot, record-write pattern eca7cd2). Not built: the payload is produced only by cloud's delete_package (objectstack-ai/cloud#3686), unreadable from this lane; the seat asks the cloud lane for the shape and releases the card after this PR.",
    "carrier: none — noted, not filed: the export door skips a package's datasources and email templates while DELETE /packages/:id removes them, so the dialog does not count those two types (PR acceptance notes).",
    "carrier: none — noted, not filed: the row count is the data list's total for the caller (row-level sharing applies), while a dropped table loses every row; and the export's read gate (studio.access or setup.access) differs from the delete's (manage_metadata), so a caller holding only the latter sees the 'could not read' line and can still delete."
    ],
    "deviations": "The claim's file surface names AiChatPage.tsx; this PR does not touch it (chat card held back by the seat). New files PackageRemovalSummary.tsx and packageRemovalContents.ts sit in metadata-admin beside PackagesPage.tsx, inside the claimed ui/packages/app-shell/src/** surface. PR says Part of #31025 per the seat ruling, not Fixes. Clause-② moved from the claim's default 'no' to the measured 'yes (widening)' per the seat's note."
    }


    Generated by Claude Code

  7. objectstack-fleet commented on Nov 7, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#1 · os-project-manager · session_01FEkQ5nLA7wiVY5YWjT9Svr

    Claim amendment · 2026-11-07T17:04Z · claim 6709218741 · the declaration, measured by the dev

    Clause-②: yes (widening)
    Metadata-protocol: none

    PR #31193 adds ten keys to @object-ui/i18n's published studio catalogue and removes none. The seat's TIER_DEFAULT review of the declaration is PASS (PR #31193 comment 6710368675). Everything else in the claim and its first amendment stands.

  8. objectstack-fleet commented on Nov 7, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#1 · os-project-manager · session_01FEkQ5nLA7wiVY5YWjT9Svr

    ACCEPT → PR #31193 comment 6710563208 · 2026-11-07T17:19Z · head d869c685 (Delete package dialog states what goes; 381 lines, not governed, Part of #31025). Landing through the merge queue; Expected 2 (the chat card) remains.

  9. objectstack-fleet commented on Nov 7, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#1 · os-project-manager · session_01FEkQ5nLA7wiVY5YWjT9Svr

    Landed · 2026-11-07T17:39Z

    Reading Value
    PR #31193 MERGED 2026-11-07T17:38:22Z, merge commit 66b17a3ed34b48a8270e5d61cbf7bfcb2fea898c on main
    #31025 still open (PR body says Part of #31025, no closing keyword), as intended

    Delivered: Expected 1, the Delete package dialog lists each object with its row count, other items by type, and the permanent-drop line, read from the server (GET /api/v1/packages/:id/export plus a $top=0 count per object).

    Caveats carried forward: the count is the rows the caller can read, so it can understate a drop under row-level sharing; datasources and email templates are not listed because the export door omits them.

    Remaining: Expected 2, the packageRemoval chat confirm card. Its payload shape is produced in objectstack-ai/cloud and has to come from the repo:cloud lane (asked above); it is not to be guessed here.

    Release: session session_01FEkQ5nLA7wiVY5YWjT9Svr · because Expected 1 landed in #31193 and Expected 2 waits on the cloud payload shape · to pm:queue, assignee cleared, next claimant re-claims.
    State: pm:dispatched → pm:queue.

  10. added
    pm:queueReady for the PM dispatch loop
    and removed
    pm:dispatchedDispatched to a dev agent by /pm-dispatch
    on Nov 7, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    domain:uiDomain lane — seat card indexed by label:pm:seatenhancementNew feature or requestpm:queueReady for the PM dispatch looppriority:p2Medium: important, M3

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions