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

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 size/m tooling

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant