Skip to content

feat(spec): ADR-0087 台账登记 ctx.user.roles 的立即退役 (#6011) - #6138

Merged
qq9340100 merged 2 commits into
mainfrom
claude/issue-6011-adr0087-ledger-entry
Aug 7, 2026
Merged

feat(spec): ADR-0087 台账登记 ctx.user.roles 的立即退役 (#6011)#6138
qq9340100 merged 2 commits into
mainfrom
claude/issue-6011-adr0087-ledger-entry

Conversation

@qq9340100

Copy link
Copy Markdown
Collaborator

Part of #6011

#6011台账半边(运行时半边已随 PR #6048 合并落地;该 issue 已关闭,本 PR 不重开它)。按 issue 上分诊座位 15:10Z 评论的**走法 1「不拆,registry 条目按跨域例外路径处理」**执行,认领已在 02:55Z 评论申报。RELEASE-BLOCKING for v17.0.0-rc.4。

为什么要有这一条

PR #6048 删掉了 ActorUser 上的 roles 别名(action body 的 ctx.user / AI 路由的 req.user),positions 成为唯一拼法。但 ADR-0087 语义迁移台账里这一面没有任何条目 —— 而同一次 ADR-0090 改名的另外三张面全都在册:

台账条目 状态
data.hookContext.session.roles hook-context-session-roles-retired 已有
ui.actionSession.roles action-session-roles-to-positions 已有
CEL/formula: current_user.roles cel-current-user-roles-to-positions 已有
ctx.user.roles / req.user.roles ← 本 PR 补上

这种不对称正是 #6011 立单的原因:退役已经发生,但对 objectstack migrate meta / spec-changes.json / 升级指南的读者不可见。本 PR 只登记既成事实(FROM→TO 已由 #6048 固定),不重判退役范围、不复核消费方。

条目

actor-user-roles-to-positions,置于 packages/spec/src/migrations/registry.ts 的 step17 semantic 列表中、紧邻其同族兄弟 action-session-roles-to-positions

  • surface:action body / AI route: ctx.user.roles (req.user.roles)
  • replacement:ctx.user.positions(AI 路由读 req.user.positions)—— 同一个数组,值逐字不变

⚠️ 「退役一个 spec 从未声明过的键」怎么写(#6048 正文点名的必答项)

ctx.user至今没有 spec schema,只有 packages/runtime 里的 TS interface —— 所以 surface 刻意不带 data. / ui. 这类 spec 域前缀,否则会谎称存在一个 spec 声明。写法照抄台账里已有的非 schema 面先例 CEL/formula: current_user.roles 的「渠道: 标识符」形状。

处置口径则沿用 data-driver-find-stream-retired(#4484)/ storage-service-list-retired(#5540)那一族:TS 契约面,无存量源可改写,刻意不设 tombstone(从没有任何 ActorUser 走过 .parse(),写在那里的处方无人可达),强制渠道是 tsc,报在读取点。条目正文如实标注本面比那两条还外一层 —— 它们至少声明在 packages/spec/src/contracts,本面只在 packages/runtime;因此对未加类型的 / 沙箱 body 而言根本没有强制渠道,这正是本台账条目必须存在的理由。

⚠️ctx.session 的边界(条目里双处写明)

同一个 ctx 上两张面、两套时间表,条目开头即警告不要互读:ctx.user.roles 在 17 里已经不存在(无窗口、无双发);ctx.session.roles 保留 #5613 的一个弃用窗口,期间照常双发。

生成物

按 os-regen 纪律整体重生,零手改:pnpm --filter @objectstack/spec buildcheck:generated 判定恰好 2 个过期,--fix 只重生这 2 个。

新条目已出现在重生后的升级指南(docs/protocol-upgrade-guide.md:347,Protocol 16 → 17 的 Semantic 段):

- **`actor-user-roles-to-positions`** — `action body / AI route: ctx.user.roles (req.user.roles)` → ctx.user.positions …

spec-changes.json 里出现两处(单 major 清单 + 跨 major 合成视图),是同一数据的两个投影。

测试证据

pnpm --filter @objectstack/spec build            → 通过
pnpm --filter @objectstack/spec check:generated  → 10 项中恰好 2 项过期(spec-changes / upgrade-guide),其余全绿
  └ --fix                                        → ✓ gen:spec-changes  ✓ gen:upgrade-guide
pnpm --filter @objectstack/spec test             → Test Files 327 passed (327) / Tests 8371 passed (8371)
pnpm --filter @objectstack/spec typecheck        → tsc --noEmit 干净 + check:test-typecheck OK
pnpm --filter @objectstack/spec check:spec-changes      → spec-changes.json is up to date.
pnpm --filter @objectstack/spec check:upgrade-guide     → protocol-upgrade-guide.md is up to date.
pnpm --filter @objectstack/spec check:authorable-surface → ✅ 1622 schemas(锚点 ℹ️ 落后 1 key,属允许形态,未手改锚点文件)
pnpm --filter @objectstack/spec check:docs              → ✅ 232 generated files in sync
node scripts/check-nul-bytes.mjs                        → OK (5870 files, 无裸控制字节)

反向验证(方向事前判定为「红」,结果一致)

把 registry 条目撤掉、生成物保持重生后的样子:

check:spec-changes   → exit 1  "spec-changes.json is stale — the ADR-0087 registries changed without regenerating"
check:upgrade-guide  → exit 1  "docs/protocol-upgrade-guide.md is stale — …"

恢复条目后两条立刻回绿。

但要如实说明这道门禁到底钉住了什么:它钉的是台账 ↔ 生成物同步,不是「已发生的退役必须有台账条目」。本 PR 之前的 origin/main 上,registry 与生成物是互相一致的(都没有这一条),所有门禁全绿 —— 这正是为什么这条缺失只能靠人工/分诊立单发现,而 CI 抓不到。仓库里不存在「退役 ↔ 台账」完备性门禁,本 PR 也不新造一个(那是另一个设计决定,不在本单范围)。

⛔ 范围外(已刻意不动)


🤖 Generated with Claude Code

https://claude.ai/code/session_01Wbxm29qPKnLf44AbSxizqW


Generated by Claude Code

claude added 2 commits August 7, 2026 03:00
Part of #6011 —— 运行时半边已随 PR #6048 落地,本条补上
ADR-0087 语义迁移台账里缺失的 ctx.user 面,与 session 侧三条同族条目对称。

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Wbxm29qPKnLf44AbSxizqW
spec-changes.json / docs/protocol-upgrade-guide.md 由 check:generated --fix 整体重生
(仅重生被判过期的 2 个),未手改。

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

vercel Bot commented Aug 7, 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 Aug 7, 2026 3:15am

Request Review

@github-actions github-actions Bot added the size/m label Aug 7, 2026
@github-actions

github-actions Bot commented Aug 7, 2026

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

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

112 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 @objectstack/spec)
  • content/docs/automation/connectors.mdx (via @objectstack/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 @objectstack/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/tenancy-modes.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 @objectstack/spec)
  • content/docs/kernel/index.mdx (via packages/spec)
  • content/docs/kernel/runtime-services/data-service.mdx (via @objectstack/spec)
  • content/docs/kernel/runtime-services/email-service.mdx (via packages/spec)
  • content/docs/kernel/runtime-services/examples.mdx (via @objectstack/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 @objectstack/spec)
  • content/docs/kernel/runtime-services/sms-service.mdx (via packages/spec)
  • content/docs/kernel/runtime-services/storage-service.mdx (via @objectstack/spec)
  • content/docs/kernel/services-checklist.mdx (via @objectstack/spec)
  • content/docs/kernel/services.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/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/http-protocol.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/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/v17.mdx (via @objectstack/spec)
  • content/docs/releases/v9.mdx (via @objectstack/spec)
  • content/docs/ui/actions.mdx (via @objectstack/spec)
  • content/docs/ui/apps.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/field-grouping-and-order.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)
  • 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.

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.

2 participants