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:

CategoryDraft/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)

SurfaceBeforeAfter
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.mdrecommended it for side effectspoint 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

vercelBot commented Jul 28, 2026

Copy link
Copy Markdown

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

1 Skipped Deployment
ProjectDeploymentActionsUpdated (UTC)
objectstackIgnoredIgnoredJul 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 mainJul 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 freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentationImprovements or additions to documentationprotocol:aisize/mtooling

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@os-zhuang