Skip to content

fix(spec): ToolExecutionContext fails closed on missing actor — system is an explicit isSystem opt-in (#2991)#3078

Merged
os-zhuang merged 2 commits into
mainfrom
claude/ai-toolexecutioncontext-security-kuahsy
Jul 16, 2026
Merged

fix(spec): ToolExecutionContext fails closed on missing actor — system is an explicit isSystem opt-in (#2991)#3078
os-zhuang merged 2 commits into
mainfrom
claude/ai-toolexecutioncontext-security-kuahsy

Conversation

@os-zhuang

Copy link
Copy Markdown
Contributor

修复 #2991(ADR-0096 E4 收敛出的合同级 fall-open)。

问题

AI 工具执行合同(packages/spec/src/contracts/ai-service.ts)把 system 级(绕过 RLS)执行 文档化为缺失 actor / toolExecutionContext 时的默认行为,覆盖所有内置数据工具(query/get/create/update/delete/run_action)。任何忘记从 req.user 填充 actor 的 cloud 或自定义路由,都会让 LLM 的工具以完全权限运行——违反 D1 不变式("无身份绝不等于授权")。

修改内容

  • ChatWithToolsOptions.toolExecutionContext:省略不再意味着回退到 system 级行为。合同现在要求执行器在缺失上下文时以未认证(RLS 生效、什么都看不到)主体运行数据工具——fail-closed,绝不 fall-open。
  • ToolExecutionContext:接口文档新增身份推导规则(actor → 用户上下文;isSystem → system;两者皆无 → 匿名,绝不是 system),并新增显式 isSystem?: boolean 字段,镜像 IDataEngine / IKnowledgeServiceisSystem 约定——"以 system 运行"从此是一个可 grep 的、深思熟虑的选择,而不是漏填字段的后果。actor 存在时 isSystem 被忽略(最小权限优先)。
  • content/docs/ai/actions-as-tools.mdx:文档不再宣传"省略 toolExecutionContext 以保持 system 级行为(cron、内部调用)",改为指向显式的 isSystem: true 选择加入。
  • changeset(@objectstack/spec minor):含迁移说明——依赖旧省略默认值的内部调用方(cron、迁移、服务端任务)需显式传 toolExecutionContext: { isSystem: true }

保持 actor 可选(而非强制):内部调用方合法地没有终端用户,它们现在通过显式 isSystem 表达意图。

#2981 / ADR-0096 的关系

这是 #2981(knowledge/RAG fail-closed 修复)在合同层的镜像——framework 没有 chatWithTools 执行器(grep 确认合同仅在 ai-service.ts 中出现),所以诚实的修复位置就是合同本身。Cloud 侧(跨仓库) 仍需:(a) 每个 AI 路由从 req.user 填充 actor;(b) 缺失 actor 时默认匿名/拒绝的 ExecutionContext,绝不 isSystem

验证

  • packages/spec 类型检查通过(tsc --noEmit)
  • pnpm build + check:api-surface 通过(公共 API 面无变化——新增字段在既有接口内)
  • pnpm test:254 个测试文件、6883 个用例全部通过

🤖 Generated with Claude Code

https://claude.ai/code/session_019rao3tuTpJ8HPQV5fyxBoz


Generated by Claude Code

…m is an explicit isSystem opt-in (#2991)

The AI tool-execution contract documented system-level (RLS-bypassing)
execution as the default for a missing actor / toolExecutionContext — a
contract-level fall-open across all built-in data tools (ADR-0096 E4,
D1 invariant: no identity is never a grant of authority).

- ChatWithToolsOptions.toolExecutionContext: omission now means an
  unauthenticated (RLS-on, sees-nothing) principal; executors MUST NOT
  fall back to system-level behaviour.
- ToolExecutionContext: documents the fail-closed identity derivation
  (actor → user context; isSystem → system; neither → anonymous) and
  adds an explicit isSystem?: boolean opt-in mirroring the IDataEngine /
  IKnowledgeService convention, so 'run as system' is a deliberate,
  greppable choice — not the consequence of a forgotten field.
- content/docs/ai/actions-as-tools.mdx: docs no longer advertise
  omission as the way to keep system-level behaviour for cron/internal
  callers; they now point at the explicit isSystem opt-in.

Mirror of the #2981 knowledge/RAG fail-closed fix, applied at the
contract layer. Cloud-side executor work is tracked cross-repo.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019rao3tuTpJ8HPQV5fyxBoz
@vercel

vercel Bot commented Jul 16, 2026

Copy link
Copy Markdown

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

Project Deployment Actions Updated (UTC)
spec Ready Ready Preview, Comment Jul 16, 2026 4:15pm

Request Review

@github-actions github-actions Bot added documentation Improvements or additions to documentation tooling size/s labels Jul 16, 2026
@github-actions

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

This PR changes 1 package(s): @objectstack/spec.

98 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/troubleshooting.mdx (via @objectstack/spec)
  • content/docs/getting-started/build-with-claude-code.mdx (via @objectstack/spec)
  • content/docs/getting-started/cli.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/validating-metadata.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/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/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/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 packages/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/v9.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/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.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019rao3tuTpJ8HPQV5fyxBoz
@os-zhuang
os-zhuang marked this pull request as ready for review July 16, 2026 16:28
@os-zhuang
os-zhuang merged commit 3fe9df1 into main Jul 16, 2026
17 checks passed
@os-zhuang
os-zhuang deleted the claude/ai-toolexecutioncontext-security-kuahsy branch July 16, 2026 16:28
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/s tooling

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants