Repository navigation
ADR-0120 17.x 收尾块:D5e isolated 安装期姿态硬门 + D6 文档/pin 测试扫荡 + 三姿态 conformance(阻塞于 #5030、#4986 的实现 PR) #5081
Description
Activity
补充一条 D6 扫荡范围备注(来自 #4986 spec+lint 侧 PR #5208 的实现会话,非新缺陷):
ADR-0120 Resolved #2 的非规范性引导 —— 官方示例 / 脚手架 / 生成器在新代码中输出
unique: 'organization'而非裸true—— 在 #4986 的 PR 里只落到了UniqueScopeSchema的文档块与describe()(规范文字面)。examples/**、create-objectstack模板与各生成器的实际输出尚未扫过。它与本单 D6 的「全仓 grep 清掉与旧契约相悖的残留表述」同一动作面,建议并入本单执行,不另开 issue。字段级裸true永久合法,此项纯引导性,无用户可见缺陷。
Generated by Claude Code
解除阻塞,可认领。 前置两块已合入 main:
- feat(driver-sql)!: NULL 安全的组织级唯一约束 + 声明索引 'organization' 作用域(ADR-0120 D3/D4,#5030) #5212(driver 侧 D3+D4:
COALESCE(organization_id, '__global__')物化、drift 两侧同步、重复预检、'__global__'保留守卫)— Fixes driver-sql: 单租户栈上 organization_id 恒为 NULL,#3696 的 (tenant, col) 复合 UNIQUE 因 NULL-distinct 而完全不生效 —— 字段级 unique: true 静默零约束 #5030; - feat(spec,lint): unique 范围显式词汇 'organization' + D5a/D5b lint 规则(ADR-0120 17.x 波,#4986) #5208(spec 词汇
'organization'+ D5a/D5b lint 规则)— Fixes driver-sql: 表级{ fields, unique: true }在 tenant-scoped 对象上落成平台级 UNIQUE —— normalizeDeclaredIndex 不补租户列(#4698 实例 2 移交) #4986。
本单范围照 issue 正文执行(D5e isolated 安装期姿态硬门 + D6 剩余文档扫荡 + 三姿态 conformance)。注意 indexing.mdx 重写时以 main 上已落地的实现与 ADR-0120 为准;lint D5c(遗留手写复合的
'organization'重拼写 advisory)也在本单。
Generated by Claude Code
- feat(driver-sql)!: NULL 安全的组织级唯一约束 + 声明索引 'organization' 作用域(ADR-0120 D3/D4,#5030) #5212(driver 侧 D3+D4:
认领:PM 循环第 2 批补位(spec 车道,batch:5;维护者列为 v17 高价值项,前置 #5212/#5030、#5208/#4986 已合入解锁)
会话:session_01ErbEDVAg1No9gdg1pgDAGB
分支:claude/issue-5081-adr0120-17x-closeout
Worktree:objectstack-issue-5081
域:domain:spec
文件面:D5e 安装期姿态硬门(安装链路 + 安装清单 attestation,落点以实测为准)、D6 文档扫荡(content/docs/data-modeling/indexing.mdx、content/docs/references/**经 regen、driver-sql/src/sql-driver.ts文档块、全仓残留表述 grep、examples/脚手架/生成器的unique: 'organization'引导输出、lint D5c advisory)、三姿态 conformance fixture + 测试、scripts/adr-anchors.json、.changeset/*.md。与在飞 #5015/#5235/#5271/#5285 生成物重叠按 os-regen 四步互保;源文件面与四单不相交。执行依据:ADR-0120(Accepted)+ 解锁评论(2026-08-04 12:56Z);⛔ 永不做成启动期告警(#4884 纪律)。
Generated by Claude Code
验收:ACCEPT(PM 复核毕,PR #5314)
复核依据(GitHub 实据):
- 三段式全交付:D5e 硬门落真实安装链路(
MarketplaceInstallLocalPlugin.handleInstall,冲突检查后、注册与 ledger 写入前;停下的安装零残留;attestation 记姿态、跨姿态不算同意;⛔ rehydrate 永不评估,[schema-drift] Fresh DB boots "drifted": detector can't read COALESCE index columns, then tells the operator to --allow-destructive away a legitimate unique index #4884 有专测钉住)+ D5c advisory lint(永不自动修,写进 adr-anchors invariant)+ D6 扫荡(含 driver-sql: 单租户栈上 organization_id 恒为 NULL,#3696 的 (tenant, col) 复合 UNIQUE 因 NULL-distinct 而完全不生效 —— 字段级 unique: true 静默零约束 #5030 证伪过的那句原话替换、skills 的tenant_id误例清理)+ 三姿态 conformance(落 driver 层的论证成立,相同性断言配正向断言防空产出假绿 —— 且首跑正是正向断言抓住了索引名错误); - 35 文件对账贴合(spec 侧仅 validation.zod.ts 文档块);两条前提注记诚实(
syncDeclaredIndexes已被 feat(driver-sql)!: NULL 安全的组织级唯一约束 + 声明索引 'organization' 作用域(ADR-0120 D3/D4,#5030) #5212 提前收窄故本 PR 未动;examples/模板/生成器实测零唯一声明,真实引导面是 skills); - 测试证据 ✓ 六包全绿 + 全部门 PASS;反向验证 5 红/71 绿与预测一致,且如实说明绿的那半防的是误报不是漏报;
- os-regen 四步已 mid-run 完成:main 前进 10 commit,重生成后生成物相对 origin/main 唯一 delta 是自己那处文档块,
git diff --exit-code逐字节核证零吞;与 fix(tenancy): 八处把被降级的 OS_MULTI_ORG_ENABLED 当「是不是多组织」在读 (#5262) #5302 的 import 冲突按语义解决(弃被禁读的resolveMultiOrgEnabled,保postureEnforcesWall); - 顺手发现 TenancyConfigSchema.tenantField 的默认值是 'tenant_id',但平台的租户列叫 organization_id —— 两个 spec 文件对「默认值」的说法互相矛盾 #5315(tenantField 默认值
'tenant_id'与平台列名矛盾)已按 finding 纪律立单,PM 已补domain:spec标签,待发现分诊轮判级。
后续:PR #5314 进落地串行链(现序:#5300 同步中 → #5304 → #5306 → #5308 → #5312 返工后 → 本单);ADR-0120 17.x 三块就此齐活。
Generated by Claude Code
- 三段式全交付:D5e 硬门落真实安装链路(
- added a commit that references this issue
on Aug 4, 2026 - added a commit that references this issue
on Aug 6, 2026
⛔ 阻塞中,勿认领:依赖 ADR-0120 17.x 波前两块(#5030 的 driver 侧 D3+D4、#4986 的 spec 词汇 + lint)的 PR 合入。两者落地后本单解除阻塞。不入 pm:queue,由维护者安排。
ADR-0120(
docs/adr/0120-unique-scope-vocabulary-and-null-safe-tenant-uniqueness.md,已 Accepted)17.x 波的第三块,范围:D5e — isolated 安装期姿态硬门
isolated姿态环境时,枚举其非sys对象上的'global'唯一(字段级与声明索引),逐索引硬停确认:「确认真平台级 / 改写为'organization'」;os doctor/os migrate plan保留 advisory 形态,只兜两类门够不到的存量:门禁上线前的安装、装后姿态变更的环境;D6 — 剩余成文契约扫荡(前两块未覆盖部分)
content/docs/data-modeling/indexing.mdx§Two ways to say "unique" 全节按新词汇重写(含os:check代码块);content/docs/references/**走gen:schema && gen:docs再生成,不手改;packages/plugins/driver-sql/src/sql-driver.tssyncDeclaredIndexes文档块的「VERBATIM」表述收窄到'global';三姿态 conformance(ADR §Acceptance tests)
single | group | isolated三姿态启动,逐 S 行断言 enforcement;'global'业务唯一的 fixture app 装进isolated环境 → 硬停、留痕、不复问;pre-gate 存量走 advisory 的断言;scripts/adr-anchors.json补 ADR-0120 锚点,pnpm check:adr-anchors绿。关联
{ fields, unique: true }在 tenant-scoped 对象上落成平台级 UNIQUE —— normalizeDeclaredIndex 不补租户列(#4698 实例 2 移交) #4986 / driver-sql: 单租户栈上 organization_id 恒为 NULL,#3696 的 (tenant, col) 复合 UNIQUE 因 NULL-distinct 而完全不生效 —— 字段级 unique: true 静默零约束 #5030(前两块);docs(adr): ADR-0120 — explicit unique-scope vocabulary (organization/global) and NULL-safe per-organization uniqueness (#4986, #5030) #5054(ADR PR)