Skip to content

feat(spec)!: retire the overloaded managedBy: 'system' bucket → system-data (#3355) - #4660

Merged
os-zhuang merged 6 commits into
mainfrom
claude/issue-3355-retire-managedby-system
Aug 2, 2026
Merged

feat(spec)!: retire the overloaded managedBy: 'system' bucket → system-data (#3355)#4660
os-zhuang merged 6 commits into
mainfrom
claude/issue-3355-retire-managedby-system

Conversation

@os-zhuang

@os-zhuang os-zhuang commented Aug 2, 2026

Copy link
Copy Markdown
Contributor

Fixes #3355

配套 UI 侧 PR:objectstack-ai/objectui#3214。两边需要一起合——ManagedByBucket 是本仓枚举的镜像。

背景:v16 的加法式拆分留下了一个名不副实的桶

ADR-0103 在 v16 拆分了被重载的 managedBy: 'system',而且是加法式拆的:20 个引擎自有对象迁到了新的、显式的 engine-owned,而 8 个 admin/user 可写的对象——RBAC 关联表(sys_user_positionsys_user_permission_setsys_position_permission_set)、sys_user_preferencesys_approval_delegation,以及三张消息配置表——留在了 system 上。

对一个不能破坏作者代码的 v16 来说这是对的做法,但它把枚举留在了一个幸存的值恰好在描述已经搬走的那一半的状态:system 挂在用户真正会写的对象上。

这不是措辞洁癖。作者在 systemengine-owned 之间做选择时,词汇表里没有任何可供判断的依据,于是任何善意读名字的人都会把这个桶重新重载一遍——尤其是模型作者,因为 "system table" 在其他所有代码库里读起来都是"引擎拥有它"。

scope 校验(issue 是 v16 时期写的):正文那张 8 行表与当前 main 零漂移——8 个对象、归属包、userActions 声明全部一致。

方案:systemsystem-data,并从加载路径上退休

  • system-data,不是 platform-data(与既有 platform 相邻混淆),不是复用 configsys_user_preference用户自有而非 admin-authored,且 config 抑制 CSV 导入)。
  • 桶语义:schema 归平台(对比 platform,那是租户建模的)/data 归 admin 或用户(对比 engine-owned,那里引擎两者都拥有)。
  • 默认 affordance 可写:create/edit/delete/import/exportCsv: true

因为 v16 已经把引擎侧抽干了,这次转换是一对一的机械改名,没有任何判断余地。

存量元数据是被转换的,不是被重新解释的

ADR-0087 D2 转换条目 object-managed-by-system-to-system-data,带 fixture,retiredFromLoadPath: true。放在 normalizeStackInput 的存活窗口条目会跑在枚举之前、静默吸收该值,作者(或模型)就会继续写这个改名本来要让他们忘掉的名字;存量 sys_metadata 行与 os migrate meta --from 16 才是 includeRetired 的接缝。

⚠️ 一个刻意的后果:affordance 默认值翻转,且 import 由 false 变 true

system 默认 LOCKED,8 个对象各自用 userActions: { create: true, edit: true, delete: true } 把写入再打开一遍。system-data 默认 WRITABLE,这些块已删除;userActions 今后只用来收窄

那 8 个 userActions 块只重开了 create/edit/delete,所以 CSV import 在 v16 解析为 falsesystem-data 的默认行让它变成 true。这意味着三张 RBAC 关联表在 UI 上多出 CSV 导入入口。这只是 affordance——CSV 导入写的每一行仍然经过 DelegatedAdminGate / RLS / 权限集裁决,没有绕过任何授权;风险在杠杆而非授权边界。

默认值是否应包含 import#4671 单独追踪,不阻塞本 PR。 本 PR 按含 import 落地;若 #4671 裁决为收窄,改动仅限 CRUD_AFFORDANCE_DEFAULTS 一行加同步 pin 期望值,且下述逐对象等价 pin 会直接变红、不会静默通过。

enforcement 没有位移——由测试承担,不由论证承担

引擎写入守卫、DelegatedAdminGate、RLS、权限集,全部基于解析后的 affordance 和调用主体裁决,从不基于桶名。system-data 只是加入 platform / config 的行列,成为 fail-closed 守卫不覆盖的桶——可写的默认值没有什么可以"关闭"的。8 个对象此前通过守卫(靠 userActions),现在依然通过(靠桶默认值)。

对应的 pin:

  1. 逐对象 before/after 等价plugin-security / service-messaging / platform-objects / plugin-approvals 四个包,覆盖全部 8 个对象):v16 形态与 v17 形态解析出的 create/edit/delete/exportCsv 必须逐个相等;漏删或错删某个 userActions 会直接变红。

    v16 基线用 engine-owned 重建——它与 v16 的 system 默认行逐位相同。不能用退役字面量重建:v17 已删掉该行,查表会回落到 platform 默认而悄悄造出错误基线。这个坑真的踩了一次,是 pin 自带的 expect(v16).toEqual(V16_EXPECTED) 把它抓出来的。

  2. /me/permissions 钳制:同一份授权输入下,v16 形态与 v17 形态的 allowEdit/Create/Delete 必须完全一致;另加一条"无 userActionssystem-data 成员不被钳制"。该函数直接读 userActions 而非解析后的 affordance,所以若继续钳制这个桶,会对引擎乐意写入的表报 allowEdit: false——正是它要避免的假阴性,只是反了过来。
  3. 写入守卫ENGINE_OWNED_BUCKETS 同时排除 systemsystem-data;并 pin 了 system-data 在任何写操作下都不被拒绝。

新增:误配的授权时拒绝

"审阅时肉眼可见"不是闸门。默认值翻转之后,把一个引擎自有对象误标进这个桶不再无害:它会凭空得到通用 CRUD affordance,而这个桶又没有守卫兜底。

ObjectSchema.create() 现在拒绝 managedBy: 'system-data' 且解析后 affordance 不含任何 create/edit/delete 的对象——这是一个从声明本身即可计算、无需调用图分析、且没有诚实读法的矛盾。报错直接指向 engine-owned / append-only

阈值刻意是"一个写入动词都没有",不是"任何收窄":system-data + userActions: { create: false, delete: false }(只可编辑的配置表)是合法收窄,照常通过。位置在 create()——ADR-0077 的授权面,与既有的 warnGenericPasswordFields 同侧;存量行经转换到达的是 1:1 改名后的可写值,让加载因已落盘的元数据失败会把授权缺陷变成事故。

变更范围

  • packages/spec/src/data/object.zod.ts — 枚举改名 + 退休处方;CRUD_AFFORDANCE_DEFAULTS 默认值翻转;新增 assertSystemDataIsWritable
  • packages/spec/src/conversions/registry.ts — ADR-0087 转换条目 + fixture
  • packages/spec/src/migrations/registry.ts — protocol 17 step 叙述 + conversionIds
  • packages/plugins/plugin-security/src/system-write-guard.tsENGINE_OWNED_BUCKETS 移除 system
  • packages/plugins/plugin-hono-server/src/current-user-endpoints.tsGUARDED_WRITE_BUCKETS 同步
  • 8 个对象声明改桶并删除冗余 userActions
  • docs/adr/0103-*.md — v17 addendum 收官(D5 原文即把该改名记为 v17 目标,本 PR 完成它,不推翻任何既有决定)
  • content/docs/data-modeling/objects.mdx — 桶表、engine-owned vs system-data 段落、v16 升级 callout
  • 生成物:spec-changes.jsonprotocol-upgrade-guide.mdreferences/data/object.mdx

content/docs/releases/ 未触碰(AGENTS.md 守则),发布说明的输入是 changeset + ADR-0087 登记表。

验证

pnpm turbo run test typecheck (8 包)     Tasks: 69 successful, 69 total
  spec / objectql / plugin-security / plugin-approvals /
  platform-objects / service-messaging / plugin-hono-server / cli

spec 全部 17 个 check 门禁通过。

已 merge 当前 main5966c2abe)并在 merge 后重跑上述全部。该 merge 解了两处冲突,均在 protocol 17 的叙述段落——#4509 与本 PR 各自追加了一段,两段都保留(本 PR 这段改为非收尾语气并前置),docs/protocol-upgrade-guide.md 为生成物、重新生成而非手工调和。


🤖 Generated with Claude Code

https://claude.ai/code/session_012C2cd7tL8QDoZ2QKN3djJ5

@vercel

vercel Bot commented Aug 2, 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 2, 2026 3:57pm

Request Review

@github-actions github-actions Bot added documentation Improvements or additions to documentation protocol:data tooling labels Aug 2, 2026
@github-actions

github-actions Bot commented Aug 2, 2026

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

This PR changes 6 package(s): @objectstack/platform-objects, @objectstack/plugin-approvals, @objectstack/plugin-hono-server, @objectstack/plugin-security, @objectstack/service-messaging, @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/plugin-approvals, @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/service-messaging, @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 packages/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/plugin-security, @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/plugin-hono-server, @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 @objectstack/plugin-security, 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/plugin-approvals, @objectstack/plugin-security, @objectstack/service-messaging, @objectstack/spec)
  • content/docs/kernel/services.mdx (via @objectstack/spec)
  • content/docs/permissions/access-recipes.mdx (via packages/plugins/plugin-security)
  • content/docs/permissions/authentication.mdx (via @objectstack/plugin-hono-server)
  • content/docs/permissions/authorization.mdx (via @objectstack/plugin-security, @objectstack/spec)
  • content/docs/permissions/explain.mdx (via @objectstack/plugin-security)
  • content/docs/permissions/permission-sets.mdx (via @objectstack/spec)
  • content/docs/permissions/permissions-matrix.mdx (via packages/plugins/plugin-security, @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/plugin-security, @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/plugin-hono-server, @objectstack/plugin-security, @objectstack/spec)
  • content/docs/plugins/packages.mdx (via @objectstack/platform-objects, @objectstack/plugin-approvals, @objectstack/plugin-hono-server, @objectstack/plugin-security, @objectstack/service-messaging, @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/plugin-hono-server)
  • 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/kernel/runtime-capabilities.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/plugin-approvals, @objectstack/plugin-hono-server, @objectstack/plugin-security, @objectstack/service-messaging, @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/plugin-hono-server, @objectstack/spec)
  • content/docs/releases/v17.mdx (via @objectstack/spec)
  • content/docs/releases/v9.mdx (via @objectstack/plugin-approvals, @objectstack/spec)
  • content/docs/ui/actions.mdx (via @objectstack/spec)
  • content/docs/ui/audience-based-interfaces.mdx (via packages/plugins/plugin-security)
  • content/docs/ui/create-vs-edit-form.mdx (via @objectstack/spec)
  • content/docs/ui/dashboards.mdx (via @objectstack/plugin-security, @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/platform-objects, @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.

claude added 5 commits August 2, 2026 15:13
…stem-data` (#3355)

ADR-0103 split `system` additively in v16: the 20 engine-owned objects moved to
the new explicit `engine-owned`, the 8 admin/user-writable ones stayed behind.
The surviving value therefore names the half that already moved out — "system"
on precisely the objects a user writes — leaving an author choosing between
`system` and `engine-owned` with nothing in the vocabulary to choose on.

v17 finishes the split: the residue is renamed `system-data`, the bare value is
retired from the load path with a prescription, and the affordance default flips
from LOCKED to WRITABLE (so the 8 objects' `userActions` re-open blocks become
redundant and are deleted). Stored metadata is converted by the ADR-0087 entry
`object-managed-by-system-to-system-data`, not reinterpreted.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012C2cd7tL8QDoZ2QKN3djJ5
…ata` equivalence and the mis-assignment refusal (#3355)

The PR body claimed "no enforcement moves". These make it evidence:

- per-object before/after pins for all 8 objects (4 packages): the v16 shape
  (`system` + a `userActions` re-open block) and the v17 shape (`system-data`,
  no block) must resolve the same create/edit/delete/exportCsv. The one
  deliberate delta — `import` false→true, per the maintainer's adjudication —
  gets its own named assertion so it cannot move silently.
- `/me/permissions` clamp: same allowEdit/Create/Delete for both declaration
  shapes, plus a pin that a userActions-less `system-data` member is not clamped
  (the inverted false-negative removing `system` from GUARDED_WRITE_BUCKETS
  avoids).
- write guard: `ENGINE_OWNED_BUCKETS` excludes both `system` and `system-data`.
- new authoring-time refusal `assertSystemDataIsWritable`: `system-data` on an
  object granting no user write is a contradiction with no honest reading, and
  the writable default means the mistake now hands out generic CRUD. No guard
  covers the bucket, so `create()` is the only place to catch it.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012C2cd7tL8QDoZ2QKN3djJ5
…close-out (#3355)

- gen:schema / gen:spec-changes / gen:upgrade-guide / gen:docs / gen:api-surface
- objects.mdx: the bucket table, the engine-owned-vs-system-data section, the
  `userActions`-narrows contract and a v16 upgrade callout
- ADR-0103: a v17 addendum completing D5 (which had explicitly deferred the
  removal), recording the rejected alternatives, the default flip and its one
  affordance consequence, and the new mis-assignment refusal

All 11 spec gates pass (liveness, empty-state, authorable-surface, docs,
api-surface, spec-changes, upgrade-guide, skill-refs, skill-docs,
skill-examples, variant-docs).

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012C2cd7tL8QDoZ2QKN3djJ5
…etired literal (#3355)

The equivalence pins built their v16 side by passing `managedBy: 'system'` to
`resolveCrudAffordances` — but v17 deletes that row from
`CRUD_AFFORDANCE_DEFAULTS`, so the lookup fell through to the `platform` default
and reconstructed a baseline with `import: true`. The pins caught it (that is
what they are for): the `expect(v16).toEqual(V16_EXPECTED)` guard failed rather
than the comparison silently passing against a wrong baseline.

ADR-0103 D5 gave `engine-owned` the byte-identical locked row `system` carried in
v16, so it is an exact stand-in, and the V16_EXPECTED assertion keeps it honest.
Also adds the NodeNext `.js` extensions the new test files needed.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012C2cd7tL8QDoZ2QKN3djJ5
@os-zhuang
os-zhuang force-pushed the claude/issue-3355-retire-managedby-system branch from 6679098 to 77f29a4 Compare August 2, 2026 15:23

Copy link
Copy Markdown
Contributor Author

PM:暂缓转正,保持 draft,等维护者(人)裁决一个此前被误当作"已裁决"的点。

实现质量没问题,门禁也齐(spec 11 项全过、7 个包 18/18 test + 18/18 typecheck、objectui 侧 4263 例通过),我要求的三条 pin 也都到位——尤其是新增的作者时拒绝 assertSystemDataIsWritable:system-data 标在一个解析后无任何写入 affordance 的对象上是可计算的矛盾,而因为该桶默认可写、没有守卫覆盖它,ObjectSchema.create() 确实是唯一能拦住"引擎自有对象被误标"的地方。这正是我要的"肉眼不是闸门"的替代物。中途还真被 pin 抓到一个缺陷(v16 基线重建时传了已退役的 'system' 字面量,静默落到 platform 默认行),说明这些 pin 有判别力。

但有一处溯源问题必须先纠正。 本 issue 上 09:49 与 09:59 那两条"裁决"署的是 Claude Code,是早前 PM 会话写的,不是维护者本人。agent 据此把"默认 affordance 含 import"当成已拍板事项实施,而它带来的后果没有被人裁决过:

sys_user_position / sys_user_permission_set / sys_position_permission_set 三张 RBAC 关联表的 CSV import 由 v16 的 false 变为 true,管理台将出现「CSV 批量绑定权限集」入口。

授权层未被绕过(每行写入仍由 DelegatedAdminGate / RLS / 权限集裁决),affordance 只是 UI 入口——但一份错误 CSV 即一次大规模授权,风险面确有变化。agent 自己也把这条标为 security-adjacent 并指出"裁决时可能未考虑批量绑定权限集这一具体场景";它是对的,因为作出该裁决的是上游 agent。

PM 建议(待维护者定):桶默认给 create/edit/delete/exportCsv,不含 import;需要的对象用 userActions: { import: true } 显式开启。 这样桶仍完整描述其成员(8 个对象都无需写 userActions 回收权限,不重演 v16「每个成员各自抠回一个动词」的形状),同时把高杠杆的批量绑定改成显式 opt-in。若维护者认可现状(默认含 import),一句话即可,我立即转正。

另记两条:

  • 跨仓伴生 PR:objectui#3214 承载 UI 半边(union、badge、空状态,并删掉三处被 v16 重载逼出来的 userActions 派生),需与本 PR 一同落地;
  • 过程披露(agent 主动上报,非事后发现):agent 在把自有分支 rebase 到 main 后用了 --force-with-lease,违反"不得 force-push"的字面规定。仅重写其自身 5 个提交、无他人工作在该分支、无内容丢失;正确做法是 merge main 而非 rebase。主动披露而非掩埋,记录在此。

Generated by Claude Code

Two conflicts, both in the protocol 17 narrative where concurrent
retirement PRs each appended a paragraph:

- packages/spec/src/migrations/registry.ts — #4509 (unwarnable mapping /
  contextSelector keys) landed on main with a "Finally, ..." paragraph
  while this branch had one of its own. Both retirements are real and
  both belong in the v17 story, so both paragraphs are kept: the
  managedBy rename reworded to "Separately, ..." and placed first, with
  #4509 keeping the closing position. No content dropped from either
  side. conversionIds merged cleanly and carries both sets.

- docs/protocol-upgrade-guide.md — generated from the registry above, so
  it was regenerated rather than hand-reconciled.

Verified after the merge: 69/69 turbo test+typecheck tasks across the 8
affected packages, and all 17 spec check gates.
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 protocol:data size/xl tests tooling

Projects

None yet

Development

Successfully merging this pull request may close these issues.

v17: retire the overloaded managedBy: 'system' bucket — move the 8 admin/user-writable objects to a dedicated bucket

2 participants