Blocked-by: #14162 实现 ADR-0130 **D1 + D3**,epic #14122 实现面第 4+5 行。⚠️ 本卡是整个设计里唯一能伤到客户数据的部位,D3 的不可拆约束是硬验收。 ## 要求(单源在 ADR-0130 D1/D3) 1. `installPackage` 命名空间闸(`packages/objectql/src/registry.ts:3575`,判据 `:3583`,抛错 `:3595`)从「同一包 id」改为「**同一发布物内的共同所有者**」;`RESERVED_NAMESPACES`/`isShareableNamespace` 行为不变。 2. **同一 PR 内**新增**安装期逐对象名唯一性检查**:同物内两包定义同名对象 ⇒ 安装期 REFUSED,错误点名两个包与对象名;检查先于任何 DDL。⛔ 两者任一不得单独发布,顺序不可颠倒。 3. **配对门测试**(D3 验收判据 2):断言为一个命题——「闸既已放行同物共同所有者,则同物同名对象的物必被安装期拒绝」;放宽存在而拒绝缺失 ⇒ 测试红。 4. 拒绝断言遵循 ADR-0112 信封:断言错误的 **`code` 与 `status`**,⛔ 不是裸 throw(裸 throw 在驱动因无关原因抛普通 Error 时也绿)。 5. 兼容性:新拒绝只拒今天本就会在 DB 层炸的配置(#14122 §6.2),更早更清楚,不是破坏。 ## Clause-② 拒绝行为新增 = accept/reject 面移动 ⇒ 预期 yes,挂 `needs:contract-review`,PR 恒 draft 待复审。 ## 验收 配对门测试红→绿双向证据(消融放宽保留、检查删除 ⇒ 必红);既有 NamespaceConflictError 测试全绿;跨物场景(不同物两包同 namespace)照旧拒绝。
Blocked-by: #14162
实现 ADR-0130 D1 + D3,epic #14122 实现面第 4+5 行。⚠️ 本卡是整个设计里唯一能伤到客户数据的部位,D3 的不可拆约束是硬验收。
要求(单源在 ADR-0130 D1/D3)
installPackage命名空间闸(packages/objectql/src/registry.ts:3575,判据:3583,抛错:3595)从「同一包 id」改为「同一发布物内的共同所有者」;RESERVED_NAMESPACES/isShareableNamespace行为不变。code与status,⛔ 不是裸 throw(裸 throw 在驱动因无关原因抛普通 Error 时也绿)。Clause-②
拒绝行为新增 = accept/reject 面移动 ⇒ 预期 yes,挂
needs:contract-review,PR 恒 draft 待复审。验收
配对门测试红→绿双向证据(消融放宽保留、检查删除 ⇒ 必红);既有 NamespaceConflictError 测试全绿;跨物场景(不同物两包同 namespace)照旧拒绝。