Skip to content

feat(security): permission-set package provenance + bootstrapDeclaredPermissions (ADR-0086 P1) - #2566

Merged
os-zhuang merged 1 commit into
mainfrom
claude/adr-0086-p1-permission-provenance
Jul 4, 2026
Merged

feat(security): permission-set package provenance + bootstrapDeclaredPermissions (ADR-0086 P1)#2566
os-zhuang merged 1 commit into
mainfrom
claude/adr-0086-p1-permission-provenance

Conversation

@os-zhuang

Copy link
Copy Markdown
Contributor

概述

落地 ADR-0086 P1(framework 侧)(#2561 P1 首项;ADR 正文见 #2559):权限集的包来源轴 + 声明式播种,让「包为自己的对象自带默认访问」成立,并关闭 stack.permissions 的 ADR-0078 惰性元数据违规。

与 objectui#2221(ADR-0086 P0,Access 矩阵按包限定作用域)是同一 ADR 的两端:本 PR 落地记录级 package_id 后,前端切片合并可以直接用来源轴,不必依赖 manifest 对象清单的临时方案。

变更

Spec(ADR-0086 D3)

  • PermissionSetSchema.packageId —— 包携带的权限集的属主包(缺省 = 环境自建)
  • PermissionSetSchema.managedBy —— 每记录来源,复用 metadata-persistence 既有词汇(package | platform | user),不引入新轴
  • sys_permission_set 对象新增 package_id / managed_by 列 + package_id 索引(卸载/升级按包查询)

播种(ADR-0086 D5)

新增 bootstrapDeclaredPermissions——bootstrapDeclaredRoles 的严格同构兄弟,kernel:ready 时把 stack.permissions 物化进 sys_permission_set:

已存在行的状态行为
不存在插入,managed_by:'package' + package_id(registry _packageId 优先,spec packageId 兜底;二者皆无 → warn + 跳过)
managed_by:'package' 且同包重播种到声明内容(幂等,天然覆盖版本升级,无需版本簿记)
managed_by:'package' 且异包拒绝 + warn(D4:包永不写入外包记录)
platform / user / 无来源(遗留行,含 bootstrapPlatformAdmin 默认集)永不沾染

护栏

  • 一致性矩阵新行 declarative-permission-seeding(enforced,ADR-0056 D10)——播种不可能再静默退回惰性
  • dogfood 证明 showcase-permission-seeding.dogfood.test.ts
  • liveness 账本补 packageId / managedBy 两条(live + 证据)
  • changeset(spec minor + plugin-security minor)

验证

  • 单测:6 个新用例(播种/幂等升级/不沾染环境行/拒绝异包/无属主跳过/spec 兜底)
  • 套件:plugin-security 7 文件、spec 245 文件、liveness 门 ✓、dogfood 37 文件全绿
  • 真实应用实测(showcase --fresh 启动,登录 admin 后查 API):
admin_full_access managed_by= None package_id= None
member_default managed_by= None package_id= None
showcase_contributor managed_by= package package_id= com.example.showcase
showcase_member_default managed_by= package package_id= com.example.showcase

声明集带来源落库、平台默认集保持环境所有——与 D3/D5 语义逐条对应。

关联

🤖 Generated with Claude Code

https://claude.ai/code/session_014y5kiH3aPLWtRRRGcVrXcT


Generated by Claude Code

@vercel

vercelBot commented Jul 4, 2026

Copy link
Copy Markdown

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

ProjectDeploymentActionsUpdated (UTC)
specReadyReadyPreview, CommentJul 4, 2026 9:01am

Request Review

@github-actionsgithub-actionsBot added documentation Improvements or additions to documentation tests tooling labels Jul 4, 2026
@github-actions

github-actionsBot commented Jul 4, 2026

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

This PR changes 3 package(s): @objectstack/dogfood, @objectstack/plugin-security, @objectstack/spec.

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

  • content/docs/concepts/architecture.mdx(via @objectstack/spec)
  • content/docs/concepts/authorization.mdx(via packages/dogfood, packages/plugins/plugin-security, packages/spec)
  • content/docs/concepts/cloud-artifact-api.mdx(via packages/spec)
  • content/docs/concepts/cluster-semantics.mdx(via @objectstack/spec)
  • content/docs/concepts/design-principles.mdx(via packages/spec)
  • content/docs/concepts/implementation-status.mdx(via @objectstack/plugin-security, @objectstack/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/concepts/packages.mdx(via @objectstack/plugin-security, @objectstack/spec)
  • content/docs/concepts/setup-app.mdx(via @objectstack/spec)
  • content/docs/concepts/skills.mdx(via @objectstack/spec)
  • content/docs/concepts/webhook-delivery.mdx(via @objectstack/spec)
  • content/docs/getting-started/architecture.mdx(via @objectstack/spec)
  • content/docs/getting-started/cli.mdx(via @objectstack/plugin-security, @objectstack/spec)
  • content/docs/getting-started/core-concepts.mdx(via @objectstack/spec)
  • content/docs/getting-started/examples.mdx(via @objectstack/spec)
  • content/docs/getting-started/quick-start.mdx(via @objectstack/spec)
  • content/docs/guides/adding-a-metadata-type.mdx(via @objectstack/spec)
  • content/docs/guides/ai-capabilities.mdx(via @objectstack/spec)
  • content/docs/guides/airtable-dashboard-analysis.mdx(via @objectstack/spec)
  • content/docs/guides/analytics-datasets.mdx(via @objectstack/spec)
  • content/docs/guides/api-reference.mdx(via @objectstack/spec)
  • content/docs/guides/business-logic.mdx(via @objectstack/spec)
  • content/docs/guides/cheatsheets/backward-compatibility.mdx(via @objectstack/spec)
  • content/docs/guides/cheatsheets/error-catalog.mdx(via @objectstack/spec)
  • content/docs/guides/cheatsheets/field-type-gallery.mdx(via @objectstack/spec)
  • content/docs/guides/cheatsheets/field-validation-rules.mdx(via @objectstack/spec)
  • content/docs/guides/cheatsheets/permissions-matrix.mdx(via packages/plugins/plugin-security, @objectstack/spec)
  • content/docs/guides/cheatsheets/protocol-diagram.mdx(via packages/spec)
  • content/docs/guides/cheatsheets/query-cheat-sheet.mdx(via @objectstack/spec)
  • content/docs/guides/cheatsheets/quick-reference.mdx(via @objectstack/spec)
  • content/docs/guides/client-sdk.mdx(via @objectstack/spec)
  • content/docs/guides/common-patterns.mdx(via @objectstack/spec)
  • content/docs/guides/contracts/auth-service.mdx(via packages/spec)
  • content/docs/guides/contracts/cache-service.mdx(via packages/spec)
  • content/docs/guides/contracts/data-engine.mdx(via @objectstack/spec)
  • content/docs/guides/contracts/index.mdx(via @objectstack/spec)
  • content/docs/guides/contracts/metadata-service.mdx(via packages/spec)
  • content/docs/guides/contracts/storage-service.mdx(via packages/spec)
  • content/docs/guides/data-modeling.mdx(via @objectstack/spec)
  • content/docs/guides/driver-configuration.mdx(via @objectstack/spec)
  • content/docs/guides/error-handling-client.mdx(via @objectstack/spec)
  • content/docs/guides/error-handling-server.mdx(via @objectstack/spec)
  • content/docs/guides/external-datasources.mdx(via @objectstack/spec)
  • content/docs/guides/formula.mdx(via @objectstack/spec)
  • content/docs/guides/hook-bodies.mdx(via packages/spec)
  • content/docs/guides/kernel-services.mdx(via @objectstack/spec)
  • content/docs/guides/metadata/dashboard.mdx(via @objectstack/plugin-security, @objectstack/spec)
  • content/docs/guides/metadata/field.mdx(via @objectstack/spec)
  • content/docs/guides/metadata/flow.mdx(via @objectstack/spec)
  • content/docs/guides/metadata/index.mdx(via @objectstack/spec)
  • content/docs/guides/metadata/object.mdx(via @objectstack/spec)
  • content/docs/guides/metadata/validation.mdx(via @objectstack/spec)
  • content/docs/guides/metadata/workflow.mdx(via @objectstack/spec)
  • content/docs/guides/packages.mdx(via @objectstack/plugin-security, @objectstack/spec)
  • content/docs/guides/plugin-development.mdx(via @objectstack/spec)
  • content/docs/guides/plugins.mdx(via @objectstack/plugin-security, @objectstack/spec)
  • content/docs/guides/project-scoping.mdx(via @objectstack/spec)
  • content/docs/guides/public-forms.mdx(via @objectstack/spec)
  • content/docs/guides/runtime-services/email-service.mdx(via packages/spec)
  • content/docs/guides/runtime-services/index.mdx(via packages/spec)
  • content/docs/guides/runtime-services/queue-service.mdx(via packages/spec)
  • content/docs/guides/runtime-services/sharing-service.mdx(via packages/spec)
  • content/docs/guides/runtime-services/storage-service.mdx(via packages/spec)
  • content/docs/guides/security.mdx(via @objectstack/plugin-security, @objectstack/spec)
  • content/docs/guides/seed-data.mdx(via @objectstack/spec)
  • content/docs/guides/skills.mdx(via @objectstack/spec)
  • content/docs/guides/solutions/approval-workflow.mdx(via packages/spec)
  • content/docs/guides/solutions/create-vs-edit-form.mdx(via @objectstack/spec)
  • content/docs/guides/solutions/data-automation-interface-access.mdx(via packages/plugins/plugin-security)
  • content/docs/guides/solutions/role-based-interfaces.mdx(via packages/plugins/plugin-security)
  • content/docs/guides/standards.mdx(via @objectstack/spec)
  • content/docs/guides/troubleshooting.mdx(via @objectstack/spec)
  • content/docs/guides/validating-metadata.mdx(via @objectstack/spec)
  • content/docs/protocol/knowledge.mdx(via @objectstack/spec)
  • content/docs/protocol/objectos/config-resolution.mdx(via @objectstack/spec)
  • content/docs/protocol/objectos/i18n-standard.mdx(via @objectstack/spec)
  • content/docs/protocol/objectos/lifecycle.mdx(via @objectstack/spec)
  • content/docs/protocol/objectos/plugin-spec.mdx(via @objectstack/spec)
  • content/docs/protocol/objectos/runtime-capabilities.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 packages/spec)
  • content/docs/protocol/objectui/record-alert.mdx(via @objectstack/spec)
  • content/docs/protocol/objectui/widget-contract.mdx(via @objectstack/spec)
  • content/docs/releases/index.mdx(via @objectstack/spec)
  • content/docs/releases/v9.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.

…Permissions (ADR-0086 P1)
Packages now ship working default access for their own objects, with a
machine-checkable metadata↔config boundary:
- spec (D3): PermissionSetSchema.packageId (owning package; absent =
env-authored) + per-record managedBy provenance on the existing
metadata-persistence axis (package | platform | user). Persisted on
sys_permission_set as package_id / managed_by (+ package_id index for
uninstall/upgrade queries).
- seeding (D5): bootstrapDeclaredPermissions — the sibling of
bootstrapDeclaredRoles — materializes stack.permissions into
sys_permission_set at boot with managed_by:'package' + package_id.
Idempotent + upgrade-aware: own rows re-seeded to the shipped
declaration every boot; foreign-package rows refused loudly (D4: a
package never writes into a foreign record); env-authored
platform/user/legacy rows (incl. bootstrapPlatformAdmin defaults)
never clobbered. Closes the ADR-0078 inert-metadata violation for
stack.permissions.
- conformance matrix row declarative-permission-seeding (ADR-0056 D10)
+ dogfood proof (showcase-permission-seeding) pin the behavior;
liveness ledger entries for the two new spec props.
Verified: plugin-security 7 files / spec 245 files / dogfood 37 files
green; live showcase boot shows showcase_contributor +
showcase_member_default seeded with package provenance while
admin_full_access / member_default stay env-owned.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014y5kiH3aPLWtRRRGcVrXcT
@os-zhuang
os-zhuangforce-pushed the claude/adr-0086-p1-permission-provenance branch from 007d196 to 2159184CompareJuly 4, 2026 08:58
@os-zhuang
os-zhuang marked this pull request as ready for review July 4, 2026 09:10
@os-zhuang
os-zhuang merged commit 7709db4 into mainJul 4, 2026
17 checks passed
@os-zhuang
os-zhuang deleted the claude/adr-0086-p1-permission-provenance branch July 4, 2026 09:10
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentationImprovements or additions to documentationsize/mteststooling

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@os-zhuang@claude