Repository navigation
Description
coordinator#1 · hotlong · session_6eb9ec2e0e3f410b91239dab7a337b9e
Filing gate: ③ a task on the maintainer's word. Coordinator session, 2026-11-06: after reviewing screenshots of an MCP client (Claude app) working against a hosted environment, the maintainer said 「这些问题都需要立卡处理」, then 「你只需要立卡,不需要派发」.
Reader: domain:server (packages/mcp/src/mcp-http-tools.ts, stdio-data-bridge.ts), designed together with #30813 (delete_record requires confirm: true, dispatched). Suggested priority p1. Triage decides.
Dedupe:
- objectstack
delete_records MCP: 2 hits, neither is this. - objectstack
bulk delete filter: open hits are MCP delete_record refuses a call without confirm: true (ACTION_CONFIRMATION_REQUIRED), the run_action confirmation gate widened to deletes #30813 and QA runs. - cloud
bulk delete filter: open feat(client): actions surface — the SDK path to server-registered actions (#3563 PR-2) #3571 (recycle bin, cloud side), related, not this.
维护者速读
用户让 AI 通过 MCP 删掉一个应用里的数据(几百条),AI 只能一条一条删,几百条就要调几百次。删到一半,又有一批被业务规则拒绝(比如「已关闭商机的明细不能删」),AI 只能停下来让用户挑办法,其中一个选项是先改记录状态绕过规则。需要一个按条件批量删除、一次确认、按原因汇总拒绝的工具。
What was seen (a hosted environment with HotCRM 6.0.0)
- Asked to delete all of an app's data (about 400 rows across 20 objects), the client planned one
delete_recordper row. - After 50 calls, 21 rows were deleted and 29 refused by the package's own rules: line items of closed opportunities are locked, and one parent was under approval.
- The client then offered to reopen the closed opportunities so their children could be deleted, which would change records and fire automation.
Ask
- A bulk delete tool taking an object and a filter (or an id list). It answers first with what it would delete: count, a sample, and the refusals the engine would give, grouped by reason. It deletes only on a confirmed second call. The confirmation follows MCP delete_record refuses a call without confirm: true (ACTION_CONFIRMATION_REQUIRED), the run_action confirmation gate widened to deletes #30813's contract, so there is one confirmation rule for one-row and many-row deletes.
- Refusals come back grouped, for example "29 refused: line items of a closed opportunity are locked (rule )", not one error per row.
- Runs as the caller: their permissions, row-level security and the package's delete rules. ⛔ No bypass of business rules.
- A cap per call (the lane proposes it), with the answer saying how many remain.
Open question for the maintainer, asked by the maintainer in the session (「我是管理员也不能清理历史数据吗?」): should an administrator have a "purge this object's data" control that bypasses a package's locking rules? Coordinator's lean is no: business rules bind administrators too, and a full reset goes through removing sample data (objectstack-ai/cloud#3657) or uninstalling and reinstalling. Rule it before the lane builds item 3.
Acceptance
- Tests pin the preview call (count, sample, grouped refusals, nothing deleted), the confirmed call, the cap and the remainder, and that a locking rule refuses rows for an administrator too.
- An MCP client deletes a few hundred rows across objects in a handful of calls.
🤖 Generated with Claude Code
Activity
objectstack-fleet commentedon Nov 6, 2026
triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U
Path: none
Triage: audit · p1 kept ·
domain:server· re-queued · 2026-11-06T12:45Z⛔ Not a claim.
confirm: truecontract (serial after MCP delete_record refuses a call without confirm: true (ACTION_CONFIRMATION_REQUIRED), the run_action confirmation gate widened to deletes #30813). p1 kept: a new MCP tool shape.pm:*state, so no seat could see it. That was a triage sweep miss, fixed this round.Generated by Claude Code
objectstack-fleet commentedon Nov 6, 2026
triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U
Path: none
Triage: open question split to decision card #30939 · 2026-11-06T12:50Z
⛔ Not a claim.
domain:server#3's ask (6685126445). The body's open maintainer question (an administrator purge that bypasses a package's locking rules) is a security boundary, so it is now decision card [Decision] Should an administrator have a "purge this object's data" control that bypasses a package's locking rules? (gates #30891 item 3) #30939.Generated by Claude Code
objectstack-fleet commentedon Nov 6, 2026
domain:server#4 · os-elon-musk · session_016WV4czvZykUqhYxYXSSDt4
Claim: PM loop round 1 · 2026-11-06T12:52Z
Session:
session_016WV4czvZykUqhYxYXSSDt4Account:
os-elon-musk(the seat's linked user asGET /useranswers it; the card's assignee)Branch: the card thread's designated
claude/project-thread-*branch, re-posted in a whole claim once the thread reports itWorktree:
objectstack-issue-30891Domain:
domain:serverSeat:
domain:server#4File surface: one new MCP bulk-delete tool (
packages/mcp/src/mcp-http-tools.ts,packages/mcp/src/stdio-data-bridge.ts, the runtime bridgepackages/runtime/src/domains/mcp.ts,packages/mcp/src/skill-md.ts), their tests and dogfood;content/docs/ai/connect-mcp.mdx; one root.changeset/file. ⛔packages/spec/**beyond a docblock on the confirmation contract naming the new door (a new published key: stop, seat files thedomain:specsub-card); ⛔ui/**,skills/**(stop on breach; explain in the report)Container & model:
L,mode:thread,model: default,effort: xhigh(p1)Clause-②: yes (widening) (provisional: a new tool on the published MCP surface; the dev measures)
Metadata-protocol: none
Responsibility: n/a — new capability
Thread-read: 6685138600
Premise: card body (maintainer 「这些问题都需要立卡处理」) and triage 6685138600 (p1 kept, serial after #30813). The tool takes an object plus a filter or an id list.
confirm: truecontract.Item 3's open question (an administrator purge that bypasses locking rules) goes to the maintainer before the build.
Serial constraints cleared: NOT cleared. Serial behind PR feat(mcp)!: delete_record refuses a call without confirm: true #30861 (MCP delete_record refuses a call without confirm: true (ACTION_CONFIRMATION_REQUIRED), the run_action confirmation gate widened to deletes #30813's confirmation gate in the same file), so this card is parked
pm:blockeduntil it landsThe contract review (a widening) is owed before the queue.
objectstack-fleet commentedon Nov 6, 2026
domain:server#4 · os-elon-musk · session_016WV4czvZykUqhYxYXSSDt4
Parked · 2026-11-06T12:52Z · serial behind PR #30861 (card #30813): this tool takes that confirmation gate. Item 3 (an administrator purge that bypasses locking rules) is with the maintainer on a decision card, and the build waits for both.
Blocked-by: #30861
objectstack-fleet commentedon Nov 6, 2026
triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U
Path: none
Triage: blocker line repaired · 2026-11-06T14:09Z
⛔ Not a claim.
Blocked-by:names feat(mcp)!: delete_record refuses a call without confirm: true #30861, which is a pull request (the delivery for card MCP delete_record refuses a call without confirm: true (ACTION_CONFIRMATION_REQUIRED), the run_action confirmation gate widened to deletes #30813). The blocker index reads cards, so MCP delete_record refuses a call without confirm: true (ACTION_CONFIRMATION_REQUIRED), the run_action confirmation gate widened to deletes #30813 looked as if nothing waited on it (H14).Generated by Claude Code
objectstack-fleet commentedon Nov 6, 2026
domain:server#4 · os-elon-musk · session_016WV4czvZykUqhYxYXSSDt4
Ruling · 2026-11-06T14:58Z · the card's open question (item 3).
The maintainer answered the seat's decision card in the app with option A, 「不绕过(推荐)」, on 「#30891:管理员能否有「清空此对象数据」,绕过包的锁定规则?」.
So item 3 stands as written: the purge runs as the caller, under their permissions, row-level security and the package's delete rules. There is no administrator bypass of a package's locking rules. A full reset goes through removing sample data (objectstack-ai/cloud#3657) or uninstalling and reinstalling.
The card stays parked:
Blocked-by: #30861still holds, and the build starts when that PR lands.objectstack-fleet commentedon Nov 6, 2026
domain:server#4 · os-elon-musk · session_016WV4czvZykUqhYxYXSSDt4
Unblocked and released · 2026-11-06T16:15Z ·
Blocked-by: #30861is cleared: PR #30861 merged (c77dd17f26). The confirmation gate this tool takes is now on main. The maintainer's item-3 ruling is recorded at 6687860173: no administrator bypass of a package's locking rules. Server seat 4 is signing off on the maintainer's word, so it releases its claim before building: the assignee is removed and the card movespm:blocked→pm:queuefor any seat to claim fresh.objectstack-fleet commentedon Nov 6, 2026
domain:server#2 · os-tesla · session_01L9qibyvxbrLP4jm4PargoH
Claim: PM loop round 1 · fresh claim after the
domain:server#4release 6689577721 · 2026-11-06T16:30ZSession:
session_01L9qibyvxbrLP4jm4PargoHAccount:
os-tesla(the card's assignee)Branch:
claude/project-thread-nhupf1(the card thread's designated branch; dev sessionsession_01L9qibx1NhZMrqCvW7FBxg5)Worktree:
objectstack-issue-30891Domain:
domain:serverSeat:
domain:server#2File surface: one new MCP bulk-delete tool and its wiring (
packages/mcp/src/mcp-http-tools.ts,packages/mcp/src/stdio-data-bridge.ts, the tool's lines inpackages/mcp/src/skill-md.ts), the runtime bridgepackages/runtime/src/domains/mcp.tsif needed, their tests and dogfood,content/docs/ai/connect-mcp.mdx, one changeset. ⛔packages/spec/**beyond a docblock naming the new door on the confirmation contract; ⛔ui/**,skills/**(stop on breach).Container & model:
L,mode:thread,model: TIER_DEFAULT(dispatch-gates --tier: no path mandate),effort: xhigh(p1)Clause-②: yes (widening)
Metadata-protocol: none
Responsibility: the MCP data tools are ours (
packages/mcp, objectstack); no bulk door exists (onedelete_recordper row); every MCP client cleaning an app's data meets it (hosted HotCRM 6.0.0, card).Thread-read: 6689577721
Premise: holds.
Blocked-by: #30813/#30861cleared (PR #30861 merged); the ruling on item 3 is 6687860173 (no administrator bypass of a package's locking rules).Serial constraints cleared: #30892 (
domain:server#4, MCP attachments) sharespackages/mcp/src/**anddomains/mcp.ts; this card mergesorigin/mainafter it lands, or names the overlap in its report.Order:
/mnt/project-files/server-seat-2/r2026-11-06/dispatch-30891.md(frameFRAME.mdbeside it).objectstack-fleet commentedon Nov 6, 2026
domain:server#2 · os-tesla · session_01L9qibx1NhZMrqCvW7FBxg5
os-dev-report
{ "issue": 30891, "status": "done", "branch": "claude/project-thread-nhupf1", "pr": "https://github.com/objectstack-ai/objectstack/pull/31024", "session": "session_01L9qibx1NhZMrqCvW7FBxg5", "premise_still_valid": true, "summary": "New MCP data:write tool delete_records, registered in registerObjectTools (both transports). Request {objectName, where | recordIds (1..200), confirm?}; exactly one selection. Unconfirmed call = the preview: #30861's refusal unchanged in shape (ACTION_CONFIRMATION_REQUIRED, 428, details {actionName:'delete_records', objectName, confirmationMember:'confirm'}) plus a preview member beside error {object, matched | matchedMoreThan, wouldAttempt, cap, sampleRecordIds (<=10), notFound?, note}; nothing deleted. Confirmed call answers {object, matched | matchedMoreThan, attempted, deleted, refused, refusals:[{code, status, reason, count, recordIds}], notRemoved?, notFound?, remaining?, cap, next?}. The tool composes bridge members only: query (+aggregate for the count) selects as the caller, then each id goes through bridge.remove, the member delete_record uses, so every row meets its own beforeDelete hooks, restricted relations, permissions and RLS; no runtime change and no admin bypass (ruling 6687860173). Cap 200 per call = REST deleteMany's batch.maxBatchSize default; the tool deletes one row at a time like that route, so the cap also bounds one call's length; a filter is worked in id order and the answer says how many remain. Refusal details are withheld (thrownRefusalEnvelope), ADR-0090 D10 narrowing is stated. Docs: connect-mcp.mdx table row + security bullet; SKILL.md tool line; mcp README; spec AIActionConfirmation docblock names the third door (doc comment only, permitted by the order). Merged origin/main at ef1973df (#30771 touched mcp-http-tools.ts / runtime domains/mcp.ts, clean).", "tests": "head ef1973df: pnpm --filter @objectstack/mcp test: 58 files, 713 tests passed (new src/mcp-delete-records.test.ts 17/17); pnpm --filter @objectstack/mcp run typecheck exit 0 (check:test-typecheck OK); dogfood mcp-delete-records.dogfood.test.ts 4/4 + mcp-delete-record-confirmation.dogfood.test.ts 4/4 after a full ./packages/** + @objectstack/dogfood^... build; dogfood tsc --noEmit exit 0; eslint --no-inline-config over packages/mcp/src, the dogfood file and the spec file exit 0. Ablations (node scripts/ablation-replace.mjs WRAP mode, on ef1973df and earlier on e223b854, each restored 'blob == HEAD and git diff HEAD is empty'): A1 preview deletes (deleteEach run in the unconfirmed branch) -> 7 failed | 10 passed, 'expected \"vi.fn()\" to not be called at all, but actually been called 5 times'; A2 gate removed (if (!isDeleteConfirmed(args)) -> if (false)) -> 7 failed, 'expected undefined to be true' on result.isError; A3 admin bypass (runtime domains/mcp.ts remove hands the engine {...ec, skipAutomations: true}, the flag that skips metadata-bound hooks) -> dogfood 1 failed | 3 passed, deleted 2 -> 4, refused 2 -> 0, the REST DELETE control stayed green.", "gates": "dispatch-gates --commands derived 111 on ef1973df, plus 9 artifact-roster families naming a path of this diff (check-published-list-mirrors.mjs, spec check:meta-url-spelling, check:authz-resolver, check:changeset-fixed, check:error-code-casing, check:facade-delegation-only, check:filter-alias-parity, check:i18n-stale-fill, check:published-readme-exports); all 120 run with stdin from /dev/null, every exit 0 (record: node scripts/check-adr-0087-registration.mjs --base origin/main :: exit 0; node scripts/check-adr-0087-registration.mjs --self-test :: exit 0; node scripts/check-adr-links.mjs :: exit 0; node scripts/check-adr-links.mjs --self-test :: exit 0; node scripts/check-changeset-no-major.mjs --base origin/main :: exit 0; node scripts/check-closing-keyword-parity.mjs :: exit 0; node scripts/check-closing-keyword-parity.mjs --self-test :: exit 0; node scripts/check-comment-mask-adoption.mjs :: exit 0; node scripts/check-comment-mask-adoption.mjs --self-test :: exit 0; node scripts/check-comment-mask-corpus.mjs :: exit 0; node scripts/check-dev-prereqs.mjs --self-test :: exit 0; node scripts/check-doc-route-spelling.mjs --advisory :: exit 0; node scripts/check-doc-route-spelling.mjs --self-test :: exit 0; node scripts/check-docs-section-name.mjs :: exit 0; node scripts/check-docs-section-name.mjs --self-test :: exit 0; node scripts/check-dts-emitted.mjs --self-test :: exit 0; node scripts/check-empty-changeset.mjs --base origin/main :: exit 0; node scripts/check-empty-changeset.mjs --self-test :: exit 0; node scripts/check-issue-citations.mjs :: exit 0; node scripts/check-plugin-teardown-shape.mjs :: exit 0; node scripts/check-plugin-teardown-shape.mjs --self-test :: exit 0; node scripts/check-section-landing-index.mjs :: exit 0; node scripts/check-section-landing-index.mjs --self-test :: exit 0; node scripts/ci/assert-turbo-remote-cache.mjs --self-test :: exit 0; node scripts/ci/plan-test-core-shards.mjs --self-test :: exit 0; node scripts/ci/prune-turbo-cache.mjs --self-test :: exit 0; node scripts/ci/snapshot-next.mjs --self-test :: exit 0; node scripts/docs-audit/check-affected-docs.mjs :: exit 0; node scripts/docs-audit/check-drift-comment.mjs :: exit 0; node scripts/pm/release-rehearsal-clone.mjs --self-test :: exit 0; node scripts/release-pending-publish.mjs --self-test :: exit 0; pnpm --filter @objectstack/lint run check:doc-formula-expressions :: exit 0; pnpm --filter @objectstack/lint run check:doc-security-posture :: exit 0; pnpm --filter @objectstack/spec run check:api-surface :: exit 0; pnpm --filter @objectstack/spec run check:authorable-surface :: exit 0; pnpm --filter @objectstack/spec run check:browser-reachable-entries :: exit 0; pnpm --filter @objectstack/spec run check:docs :: exit 0; pnpm --filter @objectstack/spec run check:dual-source-exports :: exit 0; pnpm --filter @objectstack/spec run check:duration-unit-keys :: exit 0; pnpm --filter @objectstack/spec run check:empty-state :: exit 0; pnpm --filter @objectstack/spec run check:entry-nameability :: exit 0; pnpm --filter @objectstack/spec run check:export-origins :: exit 0; pnpm --filter @objectstack/spec run check:exported-any :: exit 0; pnpm --filter @objectstack/spec run check:liveness :: exit 0; pnpm --filter @objectstack/spec run check:llms-txt :: exit 0; pnpm --filter @objectstack/spec run check:skill-examples :: exit 0; pnpm --filter @objectstack/spec run check:skill-refs :: exit 0; pnpm --filter @objectstack/spec run check:strictness-ledger :: exit 0; pnpm --filter @objectstack/spec run check:variant-docs :: exit 0; pnpm --filter @objectstack/spec run check:yaml-examples :: exit 0; pnpm check:agent-test-spelling :: exit 0; pnpm check:bash32-floor :: exit 0; pnpm check:changeset-gate-self-tests :: exit 0; pnpm check:ci-filter-parity :: exit 0; pnpm check:cli-command-ids :: exit 0; pnpm check:closed-ceremony-text :: exit 0; pnpm check:corpus-claim-drift :: exit 0; pnpm check:cross-package-test-inputs :: exit 0; pnpm check:dispatcher-error-vocabulary :: exit 0; pnpm check:doc-anchors :: exit 0; pnpm check:doc-authoring :: exit 0; pnpm check:doc-frontmatter :: exit 0; pnpm check:docs-audit-scope :: exit 0; pnpm check:docs-redirects :: exit 0; pnpm check:docs-single-h1 :: exit 0; pnpm check:docs-spec-enumerations :: exit 0; pnpm check:docs-transcript-drift :: exit 0; pnpm check:driver-memory-census :: exit 0; pnpm check:dts-closure :: exit 0; pnpm check:dual-build-cjs-loads :: exit 0; pnpm check:engine-double-contract :: exit 0; pnpm check:entry-guard :: exit 0; pnpm check:error-status-conformance :: exit 0; pnpm check:gitlink-declared :: exit 0; pnpm check:issue-citations :: exit 0; pnpm check:keyed-text-bounds :: exit 0; pnpm check:lean-entry-closure :: exit 0; pnpm check:logger-receiver-detach :: exit 0; pnpm check:merge-driver :: exit 0; pnpm check:nul-bytes :: exit 0; pnpm check:objectql-double-limit :: exit 0; pnpm check:org-identifier :: exit 0; pnpm check:page-declaration-shape :: exit 0; pnpm check:parse-guard :: exit 0; pnpm check:platform-object-tenancy-census :: exit 0; pnpm check:pm-prior-rulings :: exit 0; pnpm check:pnpm-filter-targets :: exit 0; pnpm check:pnpm-flag-spellings :: exit 0; pnpm check:published-files :: exit 0; pnpm check:published-readme-links :: exit 0; pnpm check:query-options-erasure :: exit 0; pnpm check:react-page-adapter-contract :: exit 0; pnpm check:refd-timer-probe :: exit 0; pnpm check:registry-log-declared :: exit 0; pnpm check:rest-log-spy-declared :: exit 0; pnpm check:role-word :: exit 0; pnpm check:scripts-symbol-anchors :: exit 0; pnpm check:skill-identifier-liveness :: exit 0; pnpm check:slot-lookup :: exit 0; pnpm check:sourcemap-no-sources-content :: exit 0; pnpm check:spec-docblock-symbol-anchors :: exit 0; pnpm check:spec-parsed-alias :: exit 0; pnpm check:system-context-census :: exit 0; pnpm check:test-source-alias :: exit 0; pnpm check:tier-file-adoption :: exit 0; pnpm check:type-check-coverage :: exit 0; pnpm check:type-check-debt :: exit 0; pnpm check:undeclared-dep-imports :: exit 0; pnpm check:vendor-version-stamps :: exit 0; pnpm check:watch-hint-literal :: exit 0; pnpm check:where-matcher :: exit 0; node scripts/check-published-list-mirrors.mjs :: exit 0; pnpm --filter @objectstack/spec run check:meta-url-spelling :: exit 0; pnpm check:authz-resolver :: exit 0; pnpm check:changeset-fixed :: exit 0; pnpm check:error-code-casing :: exit 0; pnpm check:facade-delegation-only :: exit 0; pnpm check:filter-alias-parity :: exit 0; pnpm check:i18n-stale-fill :: exit 0; pnpm check:published-readme-exports :: exit 0). --ran: '111 derived famil(ies) accounted for — 111 run, 0 NOT-MEASURED'. Record file: server-seat-2/r2026-11-06/out/30891-gates-ran-ef1973df.list. Earlier sweep on e223b854: check:where-matcher exit 1 (the new engine double read a combinator as a field; fixed a7989233), and five exit-3 prerequisites (spec dist predating the docblock, client-react dist, six packages without dist, pinned commit 621a4876) cleared by builds and a fetch.", "line_budget": "17 files, +1218 / -18 (1236 changed lines), under the 3,000 human-merge threshold; no governed path; packages/spec touched only in the AIActionConfirmation docblock the order permits.", "files_changed": [ ".changeset/30891-mcp-delete-records.md", "content/docs/ai/connect-mcp.mdx", "packages/mcp/README.md", "packages/mcp/src/mcp-coded-refusal.test.ts", "packages/mcp/src/mcp-delete-records.test.ts", "packages/mcp/src/mcp-http-tools.scopes.test.ts", "packages/mcp/src/mcp-http-tools.ts", "packages/mcp/src/mcp-http-tools.unknown-argument-keys.test.ts", "packages/mcp/src/mcp-server-runtime.authoring-scope.test.ts", "packages/mcp/src/mcp-server-runtime.http.test.ts", "packages/mcp/src/mcp-stdio-tools.test.ts", "packages/mcp/src/skill-md.test.ts", "packages/mcp/src/skill-md.ts", "packages/mcp/src/stdio-data-bridge.stored-metadata-body.test.ts", "packages/qa/dogfood/test/mcp-delete-records.dogfood.test.ts", "packages/spec/src/contracts/ai-service.ts", "scripts/engine-double-contract.pinned.json" ], "deviations": "(1) Card premise partly falsified: the preview cannot report grouped refusals before the delete. The engine has no delete dry run (BatchOptions.validateOnly retired), and a rolled-back transaction would still fire afterDelete hooks; so the preview gives count + sample and says the rules are judged at delete time, and the grouped refusals (with ids) are in the confirmed call's answer. (2) Groups key on code + status + message: the engine attaches no rule/hook name to a refusal. (3) The preview IS the unconfirmed call (the refusal with a preview member beside error), not a separate mode, so there is one confirmation shape. (4) Files beyond the listed surface: packages/mcp/README.md (tool list line), the existing tool-surface test pins in packages/mcp/src, and scripts/engine-double-contract.pinned.json (ledger --write for the new double). (5) packages/runtime is untouched: the tool needed no runtime half. The harness's assignee/reviewer step was skipped per the frame (no GitHub MCP writes). The changeset is patch for @objectstack/mcp and @objectstack/spec (Clause-② widening, Metadata-protocol none).", "dogfood_battery": "n/a — no '!' in the PR title and no (narrowing) arm", "mcp_calls": "0 writes (reads only: issue_read on #30891 and #30892, pull_request_read on #31024)", "api_writes": "3 — git push (claude/project-thread-nhupf1); relay pr_create (run 42269991378, PR #31024, read-back identical 14546 bytes); this os-dev-report comment via post-stamped", "open_questions": [], "security_findings": "none", "out_of_scope_findings": [ "carrier: seat · noted, not filed: an engine delete dry run would let the preview name per-record refusals; today no door can answer that without deleting", "carrier: seat · noted, not filed: skills/objectstack-ai/SKILL.md and the Console's MCP mirror do not teach delete_records (skills/** outside this card)", "carrier: seat · noted, not filed: a data:write-only OAuth token can now read ids and counts through the preview (under its RLS); data:read is not required for the selection read", "carrier: seat · noted, not filed: an object whose apiMethods exclude list cannot use delete_records (the selection is a list-class read); delete_record still works there", "carrier: seat · serial with #30892 (open, no PR at report time): whichever lands second takes the tool-count / tool-list pins into its merge" ] }Posted 2026-11-06T18:23Z.
objectstack-fleet commentedon Nov 6, 2026
domain:server#2 · os-tesla · session_01L9qibyvxbrLP4jm4PargoH
Claim amendment · 2026-11-06T18:57Z · amends claim 6689893243 on this card
File surface (added, seat leave):
ui/apps/console/src/pages/developer/objectstack-skill.ts, a text-only mirror of the newdelete_recordsbullet inpackages/mcp/src/skill-md.ts. Reason: #31015 (merged7d9f1e973e) added a drift pin,ui/apps/console/src/pages/developer/objectstack-skill.test.ts, that byte-compares the console'srenderObjectStackSkillwith the served SKILL.md, so any new tool line inskill-md.tsmust land in the console copy in the same PR. No logic change inui/**; no otherui/**orskills/**file. Thepackages/spec/**limit stands.objectstack-fleet commentedon Nov 6, 2026
domain:server#2 · os-tesla · session_01L9qibyvxbrLP4jm4PargoH
Claim amendment · 2026-11-06T18:58Z · amends claim 6689893243 and amendment 6692914335 on this card
File surface (added, seat leave):
ui/apps/console/src/pages/developer/objectstack-skill.test.ts, one line:'delete_records'added to the #31015 pin that lists every data and action tool in the console download, so the mirror in 6692914335 keeps that suite green. The console's'@object-ui/console': patchbump goes into the PR's one changeset. Nothing else inui/**orskills/**.