Skip to content

feat(kernel): kernel:bootstrapped anchor + fix everyone auto-bind ordering (#2926 follow-ups)#2989

Merged
os-zhuang merged 3 commits into
mainfrom
claude/app-showcase-permissions-defects-1h2ed4
Jul 15, 2026
Merged

feat(kernel): kernel:bootstrapped anchor + fix everyone auto-bind ordering (#2926 follow-ups)#2989
os-zhuang merged 3 commits into
mainfrom
claude/app-showcase-permissions-defects-1h2ed4

Conversation

@os-zhuang

Copy link
Copy Markdown
Contributor

两个框架层 follow-up,均源自 #2926 E2E 时暴露的 kernel:ready 生命周期时序问题(#2983 里用 kernel:listening 临时兜住,这里做正解)。

G1 — 新增 kernel:bootstrapped 生命周期锚点

kernel:ready 的处理器按插件注册顺序串行 await(kernel.ts)。早启动插件注册的 hook 会在后启动插件的 bootstrap/种子加载之前跑——消费这些数据的 reconcile/backfill 逻辑因此与它要用的行竞态。目前只能借用 kernel:listening(HTTP 开监听)当"数据就绪"锚点,语义不对。

  • 新增 kernel:bootstrapped:在所有 kernel:ready 处理器 settle 之后、kernel:listening(开 socket)之前触发。这是"所有 bootstrap + 种子数据就绪"的正确锚点。
  • ObjectKernelLiteKernel 都触发;顺序由 kernel.test.ts / lite-kernel.test.ts 的锁定测试保证(ready → bootstrapped → listening)。
  • spec 契约(TS 接口 + zod enum)+ 两个契约测试同步(顺带补上此前遗漏的 kernel:listening)。
  • 消费者迁移:plugin-sharing 的 boot backfill、app-showcase 的 persona 绑定从 kernel:listeningkernel:bootstrapped(语义修正,行为不变)。

改动:packages/spec/src/contracts/plugin-lifecycle-events.tspackages/spec/src/kernel/plugin-lifecycle-events.zod.tspackages/core/src/kernel.tspackages/core/src/lite-kernel.ts(+ 各自测试)、packages/plugins/plugin-sharing/src/sharing-plugin.ts、docs。

G2 — 修复 everyone baseline 自动绑定的时序 bug

ADR-0090 D5 说 app 的 isDefault 集在 boot 时自动绑到 everyone但代码从来没绑上:runBootstrap 里 auto-bind 段跑在 bootstrapBuiltinRoles(创建 everyone 锚点)之前——everyone 查询返回空,绑定静默失败,fresh 部署的 everyone 空壳、personas 降级,还多出一条冗余 sys_audience_binding_suggestion。段里的注释甚至写反了顺序。

  • 把 auto-bind 段移到 bootstrapBuiltinRoles 之后、syncAudienceBindingSuggestions 之前。文档说的自动绑定这才真正发生;建议同步因看到已绑定而不再冗余提示。无 ADR 冲突——这是让代码符合既有 spec/ADR,不是改策略(package isDefault → suggestion 那条不变)。
  • app-showcase 的 glue 相应删掉 everyone 一项(框架现在自己绑),只保留框架无法推断的 7 条 persona 绑定。

改动:packages/plugins/plugin-security/src/security-plugin.tsexamples/app-showcase/src/security/bind-position-sets.tsexamples/app-showcase/src/data/seed/index.ts

验证

  • 单测:spec 6842 / core 341(含新增顺序锁定测试)/ plugin-security 441 / plugin-sharing 99 全绿;turbo build 干净;dogfood 全套 262 通过(everyone←member_default baseline 不回归)。
  • E2E dogfood(fresh sqlite,objectstack dev) —— fresh boot 后:
    • everyone ← showcase_member_default框架创建(binding id pps_*,非 app glue 的 ppsb_*)——package isDefault 现在真的自动绑。
    • sys_audience_binding_suggestion = 0(冗余提示消失)。
    • 8 条绑定齐全(everyone 由框架 + 7 personas 由 app glue on kernel:bootstrapped)。

关联

#2926(E2E 暴露这两个时序 bug)· #2983(用 kernel:listening 临时兜住,本 PR 做正解)· ADR-0090 D5。

🤖 Generated with Claude Code


Generated by Claude Code

claude added 3 commits July 15, 2026 16:44
kernel:ready handlers run sequentially in plugin-registration order, so a
handler that consumes data produced by a later-starting plugin (security
bootstrap seeds sys_position; the app plugin's seed loader inserts records)
races the very rows it needs. Add kernel:bootstrapped — fired after every
kernel:ready handler has settled but before kernel:listening (HTTP socket
open) — as the correct anchor for reconcile/backfill work. Both ObjectKernel
and LiteKernel trigger it; ordering is locked by tests in kernel.test.ts and
lite-kernel.test.ts. The sharing-rule boot backfill moves from kernel:listening
to kernel:bootstrapped (semantics-only).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017bJWtKmZ2mFpRFAmmmoeqe
…is seeded

The ADR-0090 D5 baseline auto-bind ran earlier in runBootstrap than
bootstrapBuiltinRoles, which creates the everyone position — so the everyone
lookup returned nothing and the app's isDefault set (resolved as
fallbackPermissionSet) was never bound. A fresh deploy booted with everyone
empty (personas silently degraded) plus a redundant sys_audience_binding_suggestion
for the same set. Move the auto-bind after bootstrapBuiltinRoles and before
syncAudienceBindingSuggestions so the documented app-level auto-bind actually
happens and the suggestion sync skips the already-bound set.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017bJWtKmZ2mFpRFAmmmoeqe
…edundant everyone binding

The security plugin now auto-binds the app's isDefault set (showcase_member_default)
to everyone at boot, so the app glue no longer needs to. Keep only the persona →
set bindings the framework cannot infer, and move them from kernel:listening to
the kernel:bootstrapped anchor.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017bJWtKmZ2mFpRFAmmmoeqe
@vercel

vercel Bot commented Jul 15, 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 15, 2026 4:58pm

Request Review

@github-actions github-actions Bot added documentation Improvements or additions to documentation tests tooling size/m labels Jul 15, 2026
@github-actions

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

This PR changes 4 package(s): @objectstack/core, @objectstack/plugin-security, @objectstack/plugin-sharing, @objectstack/spec.

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

  • content/docs/ai/actions-as-tools.mdx (via @objectstack/core)
  • content/docs/ai/agents.mdx (via @objectstack/spec)
  • content/docs/ai/knowledge-rag.mdx (via @objectstack/core)
  • content/docs/ai/natural-language-queries.mdx (via @objectstack/core)
  • 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/core, @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/core, 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/migration-from-objectql.mdx (via @objectstack/core)
  • 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/plugin-security, @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/core, @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/examples.mdx (via @objectstack/core)
  • 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/core, @objectstack/spec)
  • content/docs/kernel/services.mdx (via @objectstack/core)
  • content/docs/permissions/access-recipes.mdx (via packages/plugins/plugin-security)
  • content/docs/permissions/authentication.mdx (via @objectstack/core)
  • content/docs/permissions/authorization.mdx (via packages/plugins/plugin-security, packages/plugins/plugin-sharing, @objectstack/spec)
  • content/docs/permissions/explain.mdx (via @objectstack/plugin-security)
  • content/docs/permissions/permission-sets.mdx (via @objectstack/spec)
  • content/docs/permissions/permissions-matrix.mdx (via packages/plugins/plugin-security, packages/plugins/plugin-sharing, @objectstack/spec)
  • content/docs/permissions/positions.mdx (via @objectstack/spec)
  • content/docs/permissions/sharing-rules.mdx (via @objectstack/plugin-security, @objectstack/spec)
  • content/docs/plugins/adding-a-metadata-type.mdx (via @objectstack/spec)
  • content/docs/plugins/anatomy.mdx (via @objectstack/core)
  • content/docs/plugins/development.mdx (via @objectstack/core, @objectstack/spec)
  • content/docs/plugins/index.mdx (via @objectstack/core, @objectstack/plugin-security, @objectstack/spec)
  • content/docs/plugins/packages.mdx (via @objectstack/core, @objectstack/plugin-security, @objectstack/plugin-sharing, @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/core, @objectstack/spec)
  • content/docs/protocol/kernel/i18n-standard.mdx (via @objectstack/spec)
  • content/docs/protocol/kernel/index.mdx (via @objectstack/core)
  • content/docs/protocol/kernel/lifecycle.mdx (via @objectstack/core, @objectstack/spec)
  • content/docs/protocol/kernel/plugin-spec.mdx (via @objectstack/core, @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/plugins/plugin-sharing, 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/core, @objectstack/plugin-security, @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/audience-based-interfaces.mdx (via packages/plugins/plugin-security)
  • content/docs/ui/create-vs-edit-form.mdx (via @objectstack/spec)
  • content/docs/ui/dashboards.mdx (via @objectstack/plugin-security, @objectstack/spec)
  • content/docs/ui/forms.mdx (via @objectstack/spec)
  • content/docs/ui/index.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.

@os-zhuang os-zhuang marked this pull request as ready for review July 15, 2026 17:52
@os-zhuang os-zhuang merged commit 464418e into main Jul 15, 2026
17 checks passed
@os-zhuang os-zhuang deleted the claude/app-showcase-permissions-defects-1h2ed4 branch July 15, 2026 17:52
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 tests tooling

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants