Skip to content

docs(spec): ISharingService 模块头按 ADR-0111 D3 拆出 canDelete() 门 - #6066

Merged
qq9340100 merged 2 commits into
mainfrom
claude/issue-5817-sharing-module-header-d3
Aug 7, 2026
Merged

docs(spec): ISharingService 模块头按 ADR-0111 D3 拆出 canDelete() 门#6066
qq9340100 merged 2 commits into
mainfrom
claude/issue-5817-sharing-module-header-d3

Conversation

@qq9340100

Copy link
Copy Markdown
Collaborator

Fixes #5817

问题

packages/spec/src/contracts/sharing-service.ts模块头第 2 条("Per-record gating")写于 ADR-0111 D3 拆分之前,仍然说:

canEdit() answers the access question for update / delete operations.

这与同一文件 140 行之下的 canDelete() 方法文档直接矛盾。D3 定下的动词边界是:share 只放宽一个主体够得着的"行",从不放宽它能用的"动词" —— 所以 delete 只有 ownership(写 DEPTH 放宽)或 modifyAllRecords 超级用户旁路两条路,edit share 授予删除权(Salesforce 的 Read/Write 不能删,Dataverse 的 Delete 是独立权限,Odoo 把 write/unlink 分开)。实现侧也是两道门:plugin-sharing 的 canEdit / canDelete,后者根本没有 share 分支。

为什么值得改:模块头是跨包调用方进这个文件读到的第一段。照它做,要么把 edit share 当成删除授权(D3 明确拒绝的语义),要么根本不知道存在 canDelete。错的散文比沉默更糟 —— 它看上去权威。

改法

把第 2 条拆成两道门,措辞与下方 canEdit() / canDelete() 两个方法文档对齐:canEdit()update(ownership / edit share / modifyAllRecords 旁路),canDelete()delete显式更窄并点名 ADR-0111 D3。

纯注释改动,零 schema / 类型 / 行为变化。

范围严格限定在模块头这一处:未碰 #5973(#5858)新落的 HierarchyScopeContext / resolveOwnerIds 段,未碰 #5125 已修的 canEdit 方法 doc,未顺手改其它散文。

钉子

同文件已有 #5125 / #5858 的 AST 散文钉先例,补一枚同款轻量钉(加在既有 sharing-service.test.ts 里,不新建文件)。与前两枚不同的是,它钉的是文件级 leading comment 而非 interface 成员文档,所以走 ts.getLeadingCommentRanges(text, 0)、用模块路径行认出模块头。

两条断言 + 两条反空(anti-vacuity)守卫:

  • 正钉:模块头点名 canDelete()
  • 负钉:canEdit()canDelete() 之间那一段不得再出现 delete 动词(两个下标按序解析,切片不会为空 —— 排除"空切片假绿")。
  • 反空 1:确认取到的确实是带编号条目的模块头(改写不能把断言掏空)。
  • 反空 2:小写 delete 仍在模块头里(只是改挂到 canDelete() 名下),所以负钉不是靠"这个词整体消失"而通过的。

反向验证(方向为预期的"红"):把 D3 之前那句话原样放回去,新钉子变红,报错落在 canDelete() 那条正钉上,同文件其余 6 条既有测试全绿 —— 既证明钉子真的咬住了这处漂移,也证明既有的钉子覆盖不到它。

验证

  • pnpm --filter @objectstack/spec check:generated10/10 全部 up to date,零生成物漂移(如预期:模块头不进 content/docs/references/)。
  • pnpm --filter @objectstack/spec typecheck — 通过(tsc --noEmit + check:test-typecheck,debt 账本未增长)。
  • pnpm --filter @objectstack/spec test — 全量见 CI;定向跑 src/contracts/sharing-service.test.ts:7 passed
  • node scripts/check-nul-bytes.mjs — OK;两个改动文件另做了越过该 gate 盲区的控制字符自查,零命中。

Changeset

建议 skip-changeset:comment-only + test-only,不发布任何东西,不产生 user-visible 变更。


Generated by Claude Code

模块头的 "Per-record gating" 一条写于 D3 拆分之前,仍称 `canEdit()`
回答 `update` / `delete`,与同文件 140 行之下的 `canDelete()` 文档
直接矛盾 —— D3 的动词边界是:share 只放宽可及的行,不放宽可用的动词,
delete = ownership(写 DEPTH 放宽)或 `modifyAllRecords` 旁路,`edit`
share 不授予。模块头是跨包调用方进文件读到的第一段,照它做会把 `edit`
share 当成删除授权,或以为 `canDelete` 不存在。

改为一条两门:`canEdit()` 管 `update`,`canDelete()` 管 `delete` 且
显式更窄,措辞与下方两个方法文档对齐。纯注释,无 schema/类型/行为变化。

同文件已有 #5125 / #5858 的散文钉先例,补一枚同款轻量钉:读文件级
leading comment(而非 interface 成员文档),断言模块头点名
`canDelete()`,且 `canEdit()` 那一段不再声称 `delete` 动词;两条
反空断言防止改写把断言掏空。

Fixes #5817

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011M7UwH25Unfi73UHim7ajY
@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 11:50pm

Request Review

@qq9340100 qq9340100 added the skip-changeset PR has no user-facing published change; bypasses the changeset gate label Aug 6, 2026 — with Claude
@github-actions github-actions Bot added the tests 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.

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.

test.yml 的 rerun attempt 落在 GitHub 平台 20:01Z 冻结窗口内,卡在预排队
limbo:409 不可取消、零 job 实例化。调度层已恢复但只对新触发生效,故用空提交
换 head 重新调度。

无任何文件改动(--allow-empty),不含 merge / rebase。

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011M7UwH25Unfi73UHim7ajY
@qq9340100
qq9340100 marked this pull request as ready for review August 7, 2026 00:17
@qq9340100
qq9340100 added this pull request to the merge queue Aug 7, 2026
Merged via the queue into main with commit a96439f Aug 7, 2026
25 checks passed
@qq9340100
qq9340100 deleted the claude/issue-5817-sharing-module-header-d3 branch August 7, 2026 00:41
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size/s skip-changeset PR has no user-facing published change; bypasses the changeset gate tests

Projects

None yet

Development

Successfully merging this pull request may close these issues.

spec 契约文档漂移:ISharingService 模块头仍称 canEdit() 回答 update/delete,ADR-0111 D3 已把 delete 拆给 canDelete()

2 participants