feat(spec)!: system-data 默认 affordance 去掉 CSV import,改为按对象显式 opt-in (#4671) - #6152
Merged
Merged
Conversation
…in (#4671) `CRUD_AFFORDANCE_DEFAULTS['system-data']` 默认保留 create/edit/delete/exportCsv, 不再包含 `import`;需要 CSV 导入向导的对象写 `userActions: { import: true }`。 `platform` 成为唯一默认授予 `import` 的桶。 授权边界未动 —— `import` 只决定 UI 入口是否渲染,CSV 导入写下的每一行仍逐条经过 DelegatedAdminGate / RLS / 权限集裁决。变的是杠杆:桶的三个 charter 成员是 RBAC 关联表(sys_user_position / sys_user_permission_set / sys_position_permission_set), 即整个权限模型的授予面,一份错 CSV 就是一次批量授权。批量授予入口应是显式声明, 而不是「被归进正确的桶」就继承的东西。 原「默认含 import」出自 #3355 上更早的 agent 会话,非维护者拍板;维护者 2026-08-03 裁决收窄、2026-08-06 最终确认。记录见 ADR-0103 的 #4671 addendum。 #4660 埋在 4 个包的逐对象等价 pin 按预言直接变红(8 对象 × 2 = 16 条,无覆盖缺口), 按新语义同步:等价循环扩到五个动词(改名现在在任何动词上都不移动 affordance), 「gains CSV import」整条替换为 `keeps CSV import opt-IN` —— 断言桶默认为 false **且** opt-in 后可达,避免退化成因为什么都没产生而通过的空绿测试。 从 v16 升级零影响:v16 的 `system` 默认 LOCKED,8 个成员的 userActions 块只重开 create/edit/delete,CSV 导入本来就解析为 false。 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_011M7UwH25Unfi73UHim7ajY
|
The latest updates on your projects. Learn more about Vercel for GitHub. 1 Skipped Deployment
|
Contributor
📓 Docs Drift CheckThis PR changes 1 package(s): 112 hand-written doc(s) reference the affected code and may need an implementation-accuracy re-verification:
|
…tem-data-import-optin
merge 把生成物文本上干净地合上了,但相对合并后的 migrations/registry.ts 仍是 stale (check:upgrade-guide 报红)。按门给的命令重生成,未手改。 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_011M7UwH25Unfi73UHim7ajY
reconcileManagedApiMethods 的 system-data 用例注释写着「the rename made full CRUD the bucket default」,#4671 之后不再成立。import 不是 apiMethods 动词,不进这条 reconciliation,注释里一并写明,免得下一个读者以为该用例覆盖了它。 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_011M7UwH25Unfi73UHim7ajY
…tem-data-import-optin
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Fixes #4671
按维护者 2026-08-03 裁决、2026-08-06 最终确认的「收窄」落地:
system-data桶的默认affordance 去掉
import,改为按对象显式 opt-in。一、前提复核(issue 立于 08-02,已过 5 天)
对
origin/main@6513c17逐条重验,前提仍成立:CRUD_AFFORDANCE_DEFAULTS['system-data']确实仍含import: true;#4660 埋在 4 个包的逐对象 before/after 等价 pin 也都还在原处。裁决评论(2026-08-06,
session_011M7UwH25Unfi73UHim7ajY)是本单的最终依据,认领评论会话 ID 一致、无更早他人认领。
二、改了什么
一行常量 + 随之为真的文字:
packages/spec/src/data/object.zod.tsCRUD_AFFORDANCE_DEFAULTS['system-data'].import→false;桶注释、CrudAffordances.import的 JSDoc、MANAGED_BY_SYSTEM_RETIRED退役处方、assertSystemDataIsWritable的报错文本同步(后两处原文都写着「默认 FULL CRUD /userActions只用于 NARROW」,收窄后不再成立)packages/spec/src/migrations/registry.tssystem对象本来就解析为import: false,改名后仍是false」docs/protocol-upgrade-guide.mdgen:upgrade-guide重生成(未手改)docs/adr/0103-...mdAddendum (v17, #4671);并在 #3355 addendum 那句「CSVimportresolvestruewhere it resolvedfalse」上就地标注被本 addendum revisedcontent/docs/data-modeling/objects.mdxuserActions行、system-data段落、代码示例、v16 升级 Callout;新增「CSV import onsystem-datais opt-in」小节packages/spec/src/data/object.test.ts⛔ 未碰:授权/RLS/DelegatedAdminGate 任何逻辑(issue 明确 affordance 只管 UI 入口);
其它五个桶的默认;
content/docs/releases/;.zod.ts的类型别名区(#6072 在飞)。三、8 个对象、16 条断言:pin 按 issue 预言直接变红
issue 说「它们会直接变红,不会静默通过」。先只改常量、不动 pin 跑了一遍,逐条记录:
plugin-securitysys_user_position/sys_user_permission_set/sys_position_permission_setservice-messagingsys_notification_template/_subscription/_preferenceplatform-objectssys_user_preferenceplugin-approvalssys_approval_delegation8 对象 × 2 = 16,一条不漏,无覆盖缺口。「四动词等价」那条循环(
create/edit/delete/exportCsv)按预期保持绿 ——
import本来就不在它的枚举里,这正说明当初的 pin 把这条差异单独拎出来是对的。
四、pin 的三种处置,不是批量改期望值
V17_EXPECTED:改期望值(import: true→false)。两个常量保留为两条而不是合并成一个字面量 —— 现在两边字节相同,但合并会让将来任意一侧移动都看不出 diff。create/import/edit/delete/exportCsv),并追加expect(v17).toEqual(v16)。收窄之后这条改名在任何动词上都不移动 affordance,这是比原来更强的陈述,不是更弱。keeps CSV import opt-IN,两半:false(删掉system-data那一行常量满足不了这半 —— fallback 是platform,而platform给import);userActions: { import: true }后为true—— 该动词是变成 opt-in 而不是被删除,没有这半上一半就是空绿。packages/spec/src/data/object.test.ts另加 4 条桶级 pin,含「platform是唯一仍默认给import的桶」和「其余五桶答案一致」。五、反向验证(方向事先声明为「红」,与实测一致)
把
'system-data'那行还原成import: true并重新构建 spec:27 条断言转红(4 包 8 对象 × 3 + spec 3),全部落在
import上,还原后全绿。方向是标准的「红」方向,没有出现反转或「诊断变多」的情形 —— 因为收窄后的判据是逐对象等值断言,不是计数。
六、仓内 opt-in 需求排查:零命中(附反查证伪)
排查是否有对象依赖
system-data的默认导入。examples//skills//apps//core/里 0 个
managedBy: 'system-data'声明,因此没有对象需要补userActions: { import: true }。零命中必须配控制:同一把扫描器在
examples/下确实能命中managedBy这个词(
app-showcase/test/no-startup-warnings.test.ts:24、app-crm/test/smoke.test.ts:106,两处都是
managedBy === 'better-auth')—— 扫描器工作正常,是真的没有声明,不是 grep 写错了。仓内全部 8 个
system-data对象都是平台自带的系统对象,按裁决一个都不 opt-in:它们在v16 本来就没有导入入口。
七、生成物
check:generated十门:改完migrations/registry.ts后唯一 stale 的是docs/protocol-upgrade-guide.md,按它给的命令gen:upgrade-guide重生成(未手改、未整套重跑),复跑
✓ All 10 generated artifacts are up to date.authorable-surface/api-surface/json-schema/content/docs/references/**/strictness 台账 零变化 —— affordance 默认是运行时常量,不在可作者化面上,所以不涉及分片布局。
这是实测读数,不是预期。
八、验证
pnpm --filter @objectstack/spec testpnpm --filter @objectstack/plugin-security testpnpm --filter @objectstack/service-messaging testpnpm --filter @objectstack/platform-objects testpnpm --filter @objectstack/plugin-approvals testtypecheckpnpm --filter @objectstack/spec check:generatedcheck:doc-authoring/docs-audit-scope/adr-anchors/empty-changeset/role-word/error-code-casing/engine-double-contract/route-envelopenpx eslint(改动文件)ESLINT_EXIT=0node scripts/check-nul-bytes.mjs九、changeset
@objectstack/specmajor(行为变化,搭 v17 rc 窗口)。正文按要求写清 FROM → TO、三张 RBAC 关联表各自消失的是哪个管理台入口、以及如何逐对象显式恢复;并注明从 v16 升上来的
用户零影响(v16 就解析为
import: false)。十、与在飞工作的关系
XParsed(纯增量)+ 防回流门 #6072(XParsed别名铺设,151 个.zod.ts)—— 同样动object.zod.ts,但改的是类型别名区;本 PR 只动常量区与四处文字,行号不相邻,且本 PR 的
check:api-surface零变化(不新增导出),与 feat(spec): ADR-0122 第一期 —— 解析态统一命名
XParsed(纯增量)+ 防回流门 #6072 的api-surface.json+637 不冲突。packages/mcp/FieldMappingTransform)。ui/app.zod.ts、MetadataEventType、ConnectorActionDescriptor;与本 PR 零文件相交。Generated by Claude Code