Skip to content

docs(ai): stop tool.requiresConfirmation promising a gate it does not provide (#3715) - #3740

Merged
os-zhuang merged 1 commit into
mainfrom
docs/tool-requires-confirmation-stop-the-bleeding
Jul 28, 2026
Merged

docs(ai): stop tool.requiresConfirmation promising a gate it does not provide (#3715)#3740
os-zhuang merged 1 commit into
mainfrom
docs/tool-requires-confirmation-stop-the-bleeding

Conversation

@os-zhuang

Copy link
Copy Markdown
Contributor

Owner call on #3715: defer the prune-or-wire decision, stop the false promise now. No behaviour change — nothing read the flag before, nothing reads it now.

Why defer rather than prune

ADR-0033 already resolved to delete this placeholder, on the reasoning that the draft/publish workspace is the real approval gate (AI never publishes; a human clicks Publish). That reasoning was sound when the only tools were metadata mutators — and it still describes cloud's 24 *.tool.ts today, all of which declare category: 'data' (17) or 'utility' (7).

But the declared tool surface anticipates more. ToolCategory (packages/spec/src/ai/tool.zod.ts:17-25) includes:

Category Draft/publish covers it?
action"Side-effect actions (send email, create record)" ❌ a sent email does not come back
integration"External API / webhook calls"
flow"Trigger a visual flow"

So the moment a first-class side-effect tool exists, a per-tool confirmation gate stops being a placeholder and becomes a requirement — and removing the shape now means re-adding it later (the cost the field-encryption precedent exists to avoid). Hence: keep the shape, kill the promise, decide when the tool surface's role is settled.

What changed (promise only)

Surface Before After
spec .describe() "Require user confirmation before execution" [EXPERIMENTAL — not enforced] + "NOTHING pauses on this flag (#3715) — use the action-level ai.requiresConfirmation + approval queue"
Studio form section "Access & safety""Permissions and confirmation requirements." "Declarative metadata (not enforced)""Recorded on the tool definition but read by no execution path"
form helpText "Ask user to approve before executing (for destructive actions)" "NOT ENFORCED (#3715) … For a real gate use the action-level ai.requiresConfirmation + approval queue; AI metadata edits are already gated by draft/publish."
skills/objectstack-ai/SKILL.md:547 "put a human in the loop — requiresConfirmation: true on the tool" lists the enforced gates first, then ⚠️ do not rely on the tool-level flag
MCP_GUIDE.md, packages/spec/README.md recommended it for side effects point at approval: 'always' / action-level ai.requiresConfirmation

The section's other field, permissions (already dead in the ledger), got the same treatment — it was sitting under the same "Access & safety" banner making the same implicit promise.

Verification

6710 spec tests · check:liveness / check:docs / check:api-surface / check:skill-docs / check:skill-examples / check:i18n / check:role-word all green.

The four i18n bundles were regenerated (the form copy changed) and the diff verified line-by-line: only the tool form's label / description / helpText keys moved — no unrelated block was rewritten, which a full i18n:extract can otherwise do.

Refs #3715, #3711, ADR-0033.

🤖 Generated with Claude Code

… provide (#3715)

The flag is read by no execution path (LLM tool set, ToolRegistry.execute, the
REST execute route, the MCP bridge — verified in #3711), while the authoring
surface actively taught reliance on it: a form section titled "Access & safety"
with helpText "Ask user to approve before executing (for destructive actions)",
plus SKILL.md / MCP_GUIDE / README all recommending it for destructive work.

Owner call: DEFER the prune-or-wire decision (#3715), stop the false promise
now. The shape is likely needed once side-effect tools exist — ToolCategory
already anticipates `action` (send email / create record), `integration`
(external API) and `flow`, none of which the ADR-0033 draft/publish gate
covers; that ADR's "the draft is the approval gate" reasoning held when the
only tools were metadata mutators.

- spec describe: [EXPERIMENTAL — not enforced] + pointer to the real gate
- form: section renamed "Declarative metadata (not enforced)"; both fields
  (this + the already-dead `permissions`) name the enforced alternative
- SKILL.md / MCP_GUIDE.md / README.md: point at action-level
  ai.requiresConfirmation + the approval queue, and note that AI metadata
  edits are already gated by draft/publish
- ledger note records the deferral
- regenerated docs + the four i18n bundles (diff verified: only the tool form's
  label/description/helpText keys moved)

No behaviour change. 6710 spec tests; liveness/docs/api-surface/skill-docs/
skill-examples/i18n/role-word all green.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@vercel

vercel Bot commented Jul 28, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

1 Skipped Deployment
Project Deployment Actions Updated (UTC)
objectstack Ignored Ignored Jul 28, 2026 1:08am

Request Review

@github-actions

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

This PR changes 2 package(s): @objectstack/platform-objects, @objectstack/spec.

104 hand-written doc(s) reference the affected code and may need an implementation-accuracy re-verification:

  • content/docs/ai/agents.mdx (via @objectstack/spec)
  • content/docs/ai/skills-reference.mdx (via @objectstack/spec)
  • content/docs/ai/skills.mdx (via @objectstack/spec)
  • content/docs/api/client-sdk.mdx (via @objectstack/spec)
  • content/docs/api/environment-routing.mdx (via @objectstack/spec)
  • content/docs/api/error-catalog.mdx (via @objectstack/spec)
  • content/docs/api/error-handling-client.mdx (via @objectstack/spec)
  • content/docs/api/error-handling-server.mdx (via @objectstack/spec)
  • content/docs/api/index.mdx (via @objectstack/spec)
  • content/docs/automation/approvals.mdx (via packages/spec)
  • content/docs/automation/flows.mdx (via @objectstack/spec)
  • content/docs/automation/hook-bodies.mdx (via packages/spec)
  • content/docs/automation/hooks.mdx (via @objectstack/spec)
  • content/docs/automation/index.mdx (via @objectstack/spec)
  • content/docs/automation/webhooks.mdx (via @objectstack/spec)
  • content/docs/automation/workflows.mdx (via @objectstack/spec)
  • content/docs/concepts/architecture.mdx (via @objectstack/spec)
  • content/docs/concepts/design-principles.mdx (via packages/spec)
  • content/docs/concepts/index.mdx (via @objectstack/spec)
  • content/docs/concepts/metadata-driven.mdx (via @objectstack/spec)
  • content/docs/concepts/metadata-lifecycle.mdx (via packages/spec)
  • content/docs/concepts/north-star.mdx (via packages/spec)
  • content/docs/data-modeling/analytics.mdx (via @objectstack/spec)
  • content/docs/data-modeling/drivers.mdx (via @objectstack/spec)
  • content/docs/data-modeling/external-datasources.mdx (via @objectstack/spec)
  • content/docs/data-modeling/field-types.mdx (via @objectstack/spec)
  • content/docs/data-modeling/fields.mdx (via @objectstack/spec)
  • content/docs/data-modeling/formulas.mdx (via @objectstack/spec)
  • content/docs/data-modeling/index.mdx (via @objectstack/spec)
  • content/docs/data-modeling/objects.mdx (via @objectstack/spec)
  • content/docs/data-modeling/queries.mdx (via @objectstack/spec)
  • content/docs/data-modeling/schema-design.mdx (via @objectstack/spec)
  • content/docs/data-modeling/seed-data.mdx (via @objectstack/spec)
  • content/docs/data-modeling/validation-rules.mdx (via @objectstack/spec)
  • content/docs/data-modeling/validation.mdx (via @objectstack/spec)
  • content/docs/deployment/cli.mdx (via @objectstack/spec)
  • content/docs/deployment/troubleshooting.mdx (via @objectstack/spec)
  • content/docs/deployment/validating-metadata.mdx (via @objectstack/spec)
  • content/docs/getting-started/build-with-claude-code.mdx (via @objectstack/spec)
  • content/docs/getting-started/common-patterns.mdx (via @objectstack/spec)
  • content/docs/getting-started/examples.mdx (via @objectstack/spec)
  • content/docs/getting-started/quick-reference.mdx (via @objectstack/spec)
  • content/docs/getting-started/quick-start.mdx (via @objectstack/spec)
  • content/docs/getting-started/your-first-project.mdx (via @objectstack/spec)
  • content/docs/kernel/cluster.mdx (via @objectstack/spec)
  • content/docs/kernel/contracts/auth-service.mdx (via packages/spec)
  • content/docs/kernel/contracts/cache-service.mdx (via packages/spec)
  • content/docs/kernel/contracts/data-engine.mdx (via @objectstack/spec)
  • content/docs/kernel/contracts/index.mdx (via @objectstack/spec)
  • content/docs/kernel/contracts/metadata-service.mdx (via packages/spec)
  • content/docs/kernel/contracts/storage-service.mdx (via packages/spec)
  • content/docs/kernel/index.mdx (via packages/spec)
  • content/docs/kernel/runtime-services/email-service.mdx (via packages/spec)
  • content/docs/kernel/runtime-services/index.mdx (via packages/spec)
  • content/docs/kernel/runtime-services/queue-service.mdx (via packages/spec)
  • content/docs/kernel/runtime-services/sharing-service.mdx (via packages/spec)
  • content/docs/kernel/runtime-services/sms-service.mdx (via packages/spec)
  • content/docs/kernel/runtime-services/storage-service.mdx (via packages/spec)
  • content/docs/kernel/services-checklist.mdx (via @objectstack/spec)
  • content/docs/permissions/authorization.mdx (via @objectstack/spec)
  • content/docs/permissions/permission-sets.mdx (via @objectstack/spec)
  • content/docs/permissions/permissions-matrix.mdx (via @objectstack/spec)
  • content/docs/permissions/positions.mdx (via @objectstack/spec)
  • content/docs/permissions/rls.mdx (via @objectstack/spec)
  • content/docs/permissions/sharing-rules.mdx (via @objectstack/spec)
  • content/docs/plugins/adding-a-metadata-type.mdx (via @objectstack/spec)
  • content/docs/plugins/development.mdx (via @objectstack/spec)
  • content/docs/plugins/index.mdx (via @objectstack/spec)
  • content/docs/plugins/packages.mdx (via @objectstack/platform-objects, @objectstack/spec)
  • content/docs/protocol/backward-compatibility.mdx (via @objectstack/spec)
  • content/docs/protocol/diagram.mdx (via packages/spec)
  • content/docs/protocol/kernel/config-resolution.mdx (via @objectstack/spec)
  • content/docs/protocol/kernel/i18n-standard.mdx (via @objectstack/spec)
  • content/docs/protocol/kernel/index.mdx (via @objectstack/spec)
  • content/docs/protocol/kernel/lifecycle.mdx (via @objectstack/spec)
  • content/docs/protocol/kernel/plugin-spec.mdx (via @objectstack/spec)
  • content/docs/protocol/kernel/runtime-capabilities.mdx (via @objectstack/spec)
  • content/docs/protocol/knowledge.mdx (via @objectstack/spec)
  • content/docs/protocol/objectql/index.mdx (via @objectstack/spec)
  • content/docs/protocol/objectql/query-syntax.mdx (via @objectstack/spec)
  • content/docs/protocol/objectql/schema.mdx (via @objectstack/spec)
  • content/docs/protocol/objectql/security.mdx (via packages/spec)
  • content/docs/protocol/objectql/state-machine.mdx (via @objectstack/spec)
  • content/docs/protocol/objectui/actions.mdx (via @objectstack/spec)
  • content/docs/protocol/objectui/concept.mdx (via @objectstack/spec)
  • content/docs/protocol/objectui/index.mdx (via @objectstack/spec)
  • content/docs/protocol/objectui/layout-dsl.mdx (via @objectstack/spec)
  • content/docs/protocol/objectui/record-alert.mdx (via @objectstack/spec)
  • content/docs/protocol/objectui/widget-contract.mdx (via @objectstack/spec)
  • content/docs/releases/implementation-status.mdx (via @objectstack/spec)
  • content/docs/releases/index.mdx (via @objectstack/spec)
  • content/docs/releases/v12.mdx (via @objectstack/spec)
  • content/docs/releases/v13.mdx (via @objectstack/spec)
  • content/docs/releases/v16.mdx (via @objectstack/spec)
  • content/docs/releases/v9.mdx (via @objectstack/spec)
  • content/docs/ui/actions.mdx (via @objectstack/spec)
  • content/docs/ui/create-vs-edit-form.mdx (via @objectstack/spec)
  • content/docs/ui/dashboards.mdx (via @objectstack/spec)
  • content/docs/ui/forms.mdx (via @objectstack/spec)
  • content/docs/ui/index.mdx (via @objectstack/spec)
  • content/docs/ui/public-data-collection.mdx (via @objectstack/spec)
  • content/docs/ui/setup-app.mdx (via @objectstack/platform-objects, @objectstack/spec)
  • content/docs/ui/translations.mdx (via @objectstack/spec)
  • content/docs/ui/views.mdx (via @objectstack/spec)

Advisory only. To re-verify, run the docs-accuracy-audit workflow scoped to these files:
node scripts/docs-audit/affected-docs.mjs origin/main → pass the list as args.docs.

@os-zhuang
os-zhuang merged commit b098b0e into main Jul 28, 2026
17 checks passed
@os-zhuang
os-zhuang deleted the docs/tool-requires-confirmation-stop-the-bleeding branch July 28, 2026 01:21
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentation Improvements or additions to documentation protocol:ai size/m tooling

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant