发现于 #6771 (PR #6824 )的实施——删除 addSysMetadataOverlayIndex 后逐条清点该导出的引用时读到。不在该单的 file surface 内(packages/metadata + tests + changeset),故单独记录。
事实
docs/adr/0005-metadata-customization-overlay.md:405-416 用现在时描述一套已经不存在的机制:
Drivers ignore `indexes` declarations on synced tables today, so a new
idempotent migration is provided and run automatically by
`DatabaseLoader.ensureSchema()`:
- `addSysMetadataOverlayIndex(driver)` — exported from
`@objectstack/metadata/migrations`.
这三句现在逐句为假:
addSysMetadataOverlayIndex 已删除 ([metadata] addSysMetadataOverlayIndex 用 ADR-0048 之前的键抢占 idx_sys_metadata_overlay_active——同名索引有两个生产者,先跑的赢 #6771 / PR fix(metadata): one owner for idx_sys_metadata_overlay_active — remove the stale-keyed second producer #6824 ),@objectstack/metadata/migrations 不再导出它;
DatabaseLoader.ensureSchema() 不再运行任何覆盖层索引迁移 ——两处调用点随之移除;
「Drivers ignore indexes declarations on synced tables」本身已经不成立 ,且与 [metadata] addSysMetadataOverlayIndex 用 ADR-0048 之前的键抢占 idx_sys_metadata_overlay_active——同名索引有两个生产者,先跑的赢 #6771 无关:SqlDriver.syncDeclaredIndexes 会把声明的索引物化出来。这一条是该段落里最容易误导人的,因为它正是 [metadata] addSysMetadataOverlayIndex 用 ADR-0048 之前的键抢占 idx_sys_metadata_overlay_active——同名索引有两个生产者,先跑的赢 #6771 里「删除生产者是安全的」这个判断的反面——实测(真实 SQLite)声明索引确实被建出来,且带的是现行键 (type, name, organization_id, package_id)。
同段的 YAML 示例还写着 fields: ['type','name','organization_id','project_id','scope'] 与 partial: "state = 'active'"——project_id 早已改名 environment_id 后退役,partial 键在 #5248 / #4943 已被 enforce-or-remove 撤销。这两处的陈旧早于 #6771 ,不是本次改动造成的。
影响
无运行时影响,纯文档漂移——因此按 observation-class 归档(finding,不带 pm:queue)。代价在于 ADR 是人和 AI 抄写的语料:这一段读起来像是在描述当前交付覆盖层唯一性的机制,而真正交付它的是 metadata-protocol 的 ensureMetadataOverlayIndexes(partial + NULL-safe)与 metadata-core 声明索引(粗粒度兜底)这两层。
处理方向(未决定,留给 triage)
ADR 是历史决策记录,通常不就地改写正文。两条可选:一是加一段 Amended 说明,指明 Phase 1 的这套迁移机制已被 #5248 /#4943 /#6771 取代、现行归属在哪两层;二是只订正那句关于 syncDeclaredIndexes 的事实陈述。倾向前者——它保留了历史,也让读者不会把历史当现状。
复现
读 docs/adr/0005-metadata-customization-overlay.md:405-416,与 packages/metadata/src/migrations/index.ts 的 tombstone 注释、packages/metadata-core/src/objects/sys-metadata.object.ts:200-230 对照即可,无需运行。
发现于 #6771(PR #6824)的实施——删除
addSysMetadataOverlayIndex后逐条清点该导出的引用时读到。不在该单的 file surface 内(packages/metadata+ tests + changeset),故单独记录。事实
docs/adr/0005-metadata-customization-overlay.md:405-416用现在时描述一套已经不存在的机制:这三句现在逐句为假:
addSysMetadataOverlayIndex已删除([metadata] addSysMetadataOverlayIndex 用 ADR-0048 之前的键抢占 idx_sys_metadata_overlay_active——同名索引有两个生产者,先跑的赢 #6771 / PR fix(metadata): one owner for idx_sys_metadata_overlay_active — remove the stale-keyed second producer #6824),@objectstack/metadata/migrations不再导出它;DatabaseLoader.ensureSchema()不再运行任何覆盖层索引迁移——两处调用点随之移除;indexesdeclarations on synced tables」本身已经不成立,且与 [metadata] addSysMetadataOverlayIndex 用 ADR-0048 之前的键抢占 idx_sys_metadata_overlay_active——同名索引有两个生产者,先跑的赢 #6771 无关:SqlDriver.syncDeclaredIndexes会把声明的索引物化出来。这一条是该段落里最容易误导人的,因为它正是 [metadata] addSysMetadataOverlayIndex 用 ADR-0048 之前的键抢占 idx_sys_metadata_overlay_active——同名索引有两个生产者,先跑的赢 #6771 里「删除生产者是安全的」这个判断的反面——实测(真实 SQLite)声明索引确实被建出来,且带的是现行键(type, name, organization_id, package_id)。同段的 YAML 示例还写着
fields: ['type','name','organization_id','project_id','scope']与partial: "state = 'active'"——project_id早已改名environment_id后退役,partial键在 #5248 / #4943 已被 enforce-or-remove 撤销。这两处的陈旧早于 #6771,不是本次改动造成的。影响
无运行时影响,纯文档漂移——因此按 observation-class 归档(
finding,不带pm:queue)。代价在于 ADR 是人和 AI 抄写的语料:这一段读起来像是在描述当前交付覆盖层唯一性的机制,而真正交付它的是metadata-protocol的ensureMetadataOverlayIndexes(partial + NULL-safe)与metadata-core声明索引(粗粒度兜底)这两层。处理方向(未决定,留给 triage)
ADR 是历史决策记录,通常不就地改写正文。两条可选:一是加一段 Amended 说明,指明 Phase 1 的这套迁移机制已被 #5248/#4943/#6771 取代、现行归属在哪两层;二是只订正那句关于
syncDeclaredIndexes的事实陈述。倾向前者——它保留了历史,也让读者不会把历史当现状。复现
读
docs/adr/0005-metadata-customization-overlay.md:405-416,与packages/metadata/src/migrations/index.ts的 tombstone 注释、packages/metadata-core/src/objects/sys-metadata.object.ts:200-230对照即可,无需运行。