Repository navigation
docs(skills): teach MCP delete_record confirm: true in the objectstack-ai tools table - #31010
Conversation
…ack-ai tools table The MCP delete_record tool refuses a call without confirm: true and answers ACTION_CONFIRMATION_REQUIRED (428). The objectstack-ai skill's tools table said only that delete_record is annotated destructive, so an agent following it sent no confirm and was refused. The row now names the member, the refusal code, and the ask-the-human-first step. Co-Authored-By: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01J8VVAmcenQmYUv4fvtB68m
|
domain:skills#3 · huangyiirene · session_01J8VVAj7CvjkGXvgXzd6RZ7 Contract-review-claim: session_01J8VVAj7CvjkGXvgXzd6RZ7 · head 54666fa · 2026-11-06T17:08Z The seat review runs at CONTRACT_REVIEW_TIER in an isolated subagent. No review seat ( |
|
domain:skills#3 · huangyiirene · session_01J8VVAj7CvjkGXvgXzd6RZ7 Contract reviewServed-tier: ① Derived judgmentsThe net diff against
② Semver levelThe changeset holds
③ Boundary flags
④ Design judgmentEach claim in the new row was checked against the code on
No must-fix and no should-fix. The new row holds against Implemented-by: VERDICT: PASS |
|
domain:skills#3 · huangyiirene · session_01J8VVAj7CvjkGXvgXzd6RZ7 维护者速读
席位核对 — ACCEPT · domain:skills#3 · head
|
Requested by Irene · project thread
Fixes #30863
Clause-②: no
Metadata-protocol: none
dispatch-gatesmandates the contract-review model tier forskills/**(clause ①). The maintainer's standing order in this project (2026-11-03) waives it; this PR was developed below that tier, and the dispatching seat runs the contract review.维护者速读
objectstack-ai技能 MCP 工具表 L202 一行:delete_record不带confirm: true会被ACTION_CONFIRMATION_REQUIRED(428)拒绝,agent 须先问人再重试;另加一个'@objectstack/skills': patchchangeset。delete_record必须带confirm: true,旧行只写"annotated destructive",照技能调用的 agent 会被拒。skills/**净增行 0。skills/objectstack-ai/SKILL.mdL202 与packages/mcp/src/mcp-http-tools.ts的delete_record注册(描述与confirm成员)。What changes
skills/objectstack-ai/SKILL.mdL202, the MCP tools-table row forcreate_record,update_record,delete_record: "writes;delete_recordis annotated destructive" becomes "writes;delete_recordis refused withACTION_CONFIRMATION_REQUIRED(428) unless it sendsconfirm: true— ask the human first, then retry"..changeset/30863-skills-ai-delete-record-confirm.md:'@objectstack/skills': patch, withClause-②: noandMetadata-protocol: none. Noskip-changeset.Measured on
mainat8ae0ab9b0(PR #30861 landed asc77dd17f26):packages/mcp/src/mcp-http-tools.tsregistersdelete_recordwith the description "A call is REFUSED unless it also sends confirm: true — ask the human first, then retry; nothing is deleted on a refused call." Its schema declares the member as[AI_ACTION_CONFIRMATION_MEMBER](confirm), an optional boolean, and the handler answersrecordDeleteConfirmationRefusalwith codeACTION_CONFIRMATION_REQUIREDand HTTP status 428.packages/runtime/src/action-execution.ts:ACTION_CONFIRMATION_REQUIRED_CODE = 'ACTION_CONFIRMATION_REQUIRED',ACTION_CONFIRMATION_REQUIRED_STATUS = 428, the same refusalrun_actionanswers.run_action/delete_recorddescription rule ("send confirm: true — ask the human first, then retry"); no key or code is introduced thatmainlacks.Eval sweep:
skills/objectstack-ai/evals/skills-tools-knowledge.jsonis this skill's only eval file, and no case mentionsdelete_record,confirmordestructive. Nothing to change there.Token ratchet (
node scripts/check-skills-token-ratchet.mjs):skills/objectstack-ai/SKILL.mdbefore 5539 tokens, after 5563 tokens, ceiling 6801 (headroom 1238). No ceiling moves, no deletion needed. Net lines inskills/**: 0 (one row replaced in place).Why
After PR #30861, an agent that followed the skill's tools table sent
delete_recordwithoutconfirmand was refused. The skill now teaches the call the server accepts.Verification
Local gates on 54666fa: 45 derived, 45 run with exit 0, 0 NOT MEASURED (`dispatch-gates --ran`)
node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstackderived 45 commands for the 2 changed files. All ran afterpnpm install --frozen-lockfileand a fullpnpm build(119/119 tasks, exit 0), each under a 900 s timeout withNODE_OPTIONS=--max-old-space-size=8192(heap headroom for this cloud container) and its exit code captured before any pipe.check-skills-token-ratchet.mjs,check:skill-docs,check:skill-identifier-liveness,check:skill-compatibility,check:skill-frame-sync,check:doc-authoring,check-empty-changeset.mjs,check-changeset-no-major.mjs,check:dts-closure,check:dual-build-cjs-loadsandcheck-comment-mask-corpus.mjs.--ranprinted:45 derived famil(ies) accounted for — 45 run, 0 NOT-MEASURED (a DERIVED zero — all 45 recorded an exit code and none of them is 3).node scripts/check-commit-card-trailers.mjs --range origin/main..HEAD: exit 0 before the push.Human Minimum
packages/specholds no runtime logic. (No schema touched.)pnpm lintwas not run.)main, one pull request.packages/specnot touched; nothing to regenerate.content/docs/references/,packages/*/CHANGELOG.mdorcontent/docs/releases/.🤖 Generated with Claude Code
https://claude.ai/code/session_01J8VVAmcenQmYUv4fvtB68m