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

@baozhoutao
baozhoutao marked this pull request as ready for review August 6, 2026 06:07
@baozhoutao
baozhoutao added this pull request to the merge queue Aug 6, 2026
Merged via the queue into main with commit e4c8b6c Aug 6, 2026
25 checks passed
@baozhoutao
baozhoutao deleted the claude/issue-5337-protocol17-areas-rationale branch August 6, 2026 06:19
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