Skip to content

fix(spec): protocol-17 rationale 改述 area 项级门禁的现状 —— #4722 已关闭「服务端不走 areas」那条 caveat (#5337) - #5796

Merged
baozhoutao merged 1 commit into
mainfrom
claude/issue-5337-protocol17-areas-rationale
Aug 6, 2026
Merged

fix(spec): protocol-17 rationale 改述 area 项级门禁的现状 —— #4722 已关闭「服务端不走 areas」那条 caveat (#5337)#5796
baozhoutao merged 1 commit into
mainfrom
claude/issue-5337-protocol17-areas-rationale

Conversation

@baozhoutao

Copy link
Copy Markdown
Contributor

Fixes #5337

前提复核(先于实现)

origin/main(1624f4a)逐处核实,三处全部命中,单据属实:

位置 证据
packages/spec/src/migrations/registry.ts:672–674 跨行拼接,grep "One honest caveat" 命中(单行 grep 整句零命中,正是单据提醒的读数陷阱)
docs/protocol-upgrade-guide.md:173 完整携带该句,现在时
.changeset/app-area-fail-open-gates-removed.md:54–58 同一句

反证一侧同样核实:packages/rest/src/rest-server.tsfilterAppForUser 在 2441 行带 [#4722] 注释,2520 行 filterAreas 对每一棵 areas[].navigation 复用同一个 filterNav(2526 行),项级 requiredPermissions / requiresService 在两棵树被同等强制;2449–2452 行同时写明 visible(CEL)与 requiresObject 仍只在客户端求值。

一处补充发现,与本单口径相关且已一并处理:仓库处于 changesets pre 模式(.changeset/pre.jsonmode: "pre"),所以 app-area-fail-open-gates-removed.md 虽然已经进过 packages/spec/CHANGELOG.md17.0.0-rc.2 段落,文件本身仍留在 .changeset/,并且仍是 v17 GA 发布说明的法定输入 —— 即 PM 裁定「一并改」的效力是真实的,不是改一份已消费掉的稿子。已发布的 CHANGELOG.md 属既成历史,本 PR 零改动

改了什么

1. registry.ts 的 protocol-17 rationale

措辞蓝本:PR #5336 落地的 AREA_VISIBLE_RETIRED / AREA_REQUIRED_PERMISSIONS_RETIRED,以及 packages/spec/liveness/app.jsonareas.navigation 记录。

2. .changeset/app-area-fail-open-gates-removed.md

同一句按 PM 裁定一并改(裁定否决窗口已过)。retirement kit 表格两行未动 —— 它们本来就叫作者把门禁下沉到 area 的 navigation 项上,#4722 之后这条建议只是从「壳层强制」升级为「服务端强制」,原文无需改。⛔ content/docs/releases/ 零改动。

3. docs/protocol-upgrade-guide.md

未手改,由 pnpm --filter @objectstack/spec gen:upgrade-guide 重新生成;check:upgrade-guide 复验 up to date

反向验证(方向:预测为红,实测为红)

把 caveat 那句还原成改前措辞(仅这一句,其余不动)后重跑 migrations.test.ts:

× does not repeat the retired "the server does not walk `areas`" claim
× names #4722 and the two trees an item gate is now enforced in
× does not read as reviving the area-LEVEL keys
× keeps `visible` client-side only — the half #4722 did NOT change
 Tests  4 failed | 68 passed (72)

第 5 条 still carries the #4651 history the step exists to explain 按预期保持绿:它钉的是被保留的历史前半段,而反向实验只还原了 caveat 一句 —— 这条本就不该随之变红,如实记录而非凑成「五条全红」。

一条 pin 在编写过程中被实测证伪并按事实修正:最初写的 not.toMatch(/enforced by the shell only/i) 会连引用旧论断的历史陈述一起判红,而新措辞刻意保留了这句引用(读者需要知道旧建议作废,而不是让处方对 areas[] 悄悄闭嘴 —— 那会让他以为旧边界仍然成立)。改为钉时态:not.toMatch(/is enforced by the shell only/i) + toMatch(/was CLOSED by #4722/)

测试

pnpm --filter @objectstack/spec test
  Test Files  319 passed (319)
       Tests  8149 passed (8149)

pnpm --filter @objectstack/spec typecheck
  tsc --noEmit ✓
  check:test-typecheck: OK

pnpm --filter @objectstack/spec check:upgrade-guide
  protocol-upgrade-guide.md is up to date.

node scripts/check-nul-bytes.mjs        → OK (5678 tracked text files)
node scripts/check-changeset-fixed.mjs  → ✓ fixed group in sync (70 packages)
node scripts/check-release-notes.mjs    → OK
node scripts/check-doc-authoring.mjs    → ✓ 362 files clean

Changeset

带自己的 changeset(patch on @objectstack/spec),不走 skip-changeset。理由:MIGRATIONS_BY_MAJOR[17].rationale@objectstack/spec 导出的运行期数据(os migrate meta 打印给消费者),docs/protocol-upgrade-guide.md 是面向读者的投影 —— 两者都不是纯测试/纯工作流改动。

落地前注意

越界

本 PR 只碰 packages/spec/src/migrations/registry.ts、其生成物、两份 .changeset/*.mdmigrations.test.tspackages/spec/src/ui/app.zod.ts / app.test.ts 只读未改(PR #5336 已落地)。未发现需另开单的越界缺陷。

🤖 Generated with Claude Code

https://claude.ai/code/session_01559M8FVm6W6vDLABL3jvdW


Generated by Claude Code

…#4722 closed the "server does not walk `areas`" caveat (#5337)

`MIGRATIONS_BY_MAJOR[17].rationale` still carried the caveat written at the
#4651 retirement: per-item gating inside an area is enforced by the shell only,
since the server does not walk `areas`. #4722 landed in the same 17.0.0 window
and made that false — `filterAppForUser` runs the same `filterNav` over every
`areas[].navigation`, so an item's `requiredPermissions` / `requiresService` is
stripped server-side in both trees.

That prose is not a comment: `docs/protocol-upgrade-guide.md` is a pure
projection of it (ADR-0087 D4), i.e. the page an author upgrading 16 -> 17
reads, and the sentence sent them off to restructure their navigation tree for
a gate they can now write in place.

- registry.ts: history anchored ("At the time of the retirement …") and the
  caveat replaced with the corrected fact — #4722 named, both trees named,
  area-LEVEL keys explicitly still retired, `visible` (CEL) explicitly still
  client-side only at every level.
- `.changeset/app-area-fail-open-gates-removed.md`: same sentence corrected
  (repo is in changesets pre mode, so that file is still a live input to the
  v17 GA notes).
- `docs/protocol-upgrade-guide.md` regenerated via `gen:upgrade-guide`, not
  hand-edited.
- migrations.test.ts: five pins on the step-17 rationale.

Wording mirrors the schema-side prescriptions landed by PR #5336 and the
`areas.navigation` note in `packages/spec/liveness/app.json`.

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

vercel Bot commented Aug 6, 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 6, 2026 5:52am

Request Review

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

github-actions Bot commented Aug 6, 2026

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

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

110 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 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/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.

Copy link
Copy Markdown
Contributor Author

越界发现补记(更正正文最后一节)

正文写「未发现需另开单的越界缺陷」时尚未查到第四处。收尾复查发现一处,未在本 PR 修复,已按 Prime Directive #10 独立开单:

#5809packages/spec/CHANGELOG.md:86–90(## 17.0.0-rc.2 段落)仍带着同一句 caveat。因为仓库处于 changesets pre 模式,GA 时 changeset version 只会新增 ## 17.0.0 段落(携带本 PR 订正后的措辞),不会回头重写 rc.2 段落 —— 净结果是同一个 CHANGELOG.md 里两种说法并存。

判为 observation-class(finding 标签,不带 pm:queue):处置方式(前向注记 / 原地改写 / 靠 GA 段落覆盖)是编辑口径决策,与「发布说明集中在发布时写」的惯例有张力,应由 PM/维护者定,不该由本 PR 顺手选一个。先例 #5781 属同类。

CI

24 项检查全部完成,零失败(success 或 skipped)。其中与本单直接相关的:Check Changeset ✅(本 PR 自带 patch changeset,不需要 skip-changeset)、TypeScript Type Check ✅、Test Core (1–3/3) ✅、Spec property liveness ✅、Flag docs affected by code changes ✅、No other open PR may claim the same issue ✅。

机器人落定后读回的标签:documentationsize/mteststooling


Generated by Claude Code


Generated by Claude Code

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.

protocol-17 的 migration rationale 仍写着「the server does not walk areas」,并投影进生成的升级指南

2 participants