来自 #5841 的事实 2(该单按范围裁定只交付事实 1,事实 2 测量后立单)。测量证据与修向分析见 PR #5889 报告,此处摘录并附 PM 裁决。未指派;标签交分诊。
事实(#5841 的 dev 实测,origin/main)
loadMetaFromDb 的返回值 { loaded, errors, invalid } 没有任何字段能表达「这次水合根本没读到存储」。其返回值的唯一 生产消费方是 packages/objectql/src/plugin.ts:1140 的 restoreMetadataFromDb,且没有任何调用方对 loaded: 0 做分支处置 —— 唯一分支是选哪条日志:读不到存储的 boot 在 kernel 日志里被写成 debug 级 的 "No persisted metadata found in database"。
下游后果(plugin.ts Phase 2 自己的注释已写明):registry.getObject 返回空 → unknown-$select guard / hooks / relationships silently degrade ;没读到的 overlay 对象既不建表也不桥接,kernel 照常 ready。自托管运维在 boot 期只有日志一个信号,而这个信号是 debug 级的「库是空的」。
修向(dev 的四案分析,原文见 #5841 报告)
PM 裁决(第三档:带前提,否决窗口开放)
裁 A ,前提两条(实施 dev 开工先核,任一不成立即报 fork、⛔ 不许静默改道):
loadMetaFromDb 返回值的消费方仍然只有 restoreMetadataFromDb 一个(loadMetaFromDb 用 /no such table/i 正则判「良性首启」,其余 sys_metadata 读失败吞成 console.warn + loaded:0 —— isMissingTableError 的手抄第二份 #5841 测量时如此);
ProtocolWithDbRestore 是 objectql 内部接口声明,不在 packages/spec 公开契约面上(若实测它已进 spec,转 domain:spec 座位)。
依据:ADR-0110 D3(outage ≠ miss)已是本仓在 DatabaseLoader(#5108 )、listForIndex(#5089 )、协议 overlay 读(#5532 /#5705 /#5843 )的既定方向,A 是同一条规矩的 boot 侧落地 —— 属 restore-invariant,不占维护者决策位;B 过重(boot 应 degrade loudly 而非 die),C 属 workaround(两个相反事实一个名字),D 违背 D3。
协调
Refs #5841 / PR #5889 、#5840 、ADR-0110 D3、#5108 、#5089 、#5532 。
来自 #5841 的事实 2(该单按范围裁定只交付事实 1,事实 2 测量后立单)。测量证据与修向分析见 PR #5889 报告,此处摘录并附 PM 裁决。未指派;标签交分诊。
事实(#5841 的 dev 实测,origin/main)
loadMetaFromDb的返回值{ loaded, errors, invalid }没有任何字段能表达「这次水合根本没读到存储」。其返回值的唯一生产消费方是packages/objectql/src/plugin.ts:1140的restoreMetadataFromDb,且没有任何调用方对loaded: 0做分支处置 —— 唯一分支是选哪条日志:读不到存储的 boot 在 kernel 日志里被写成 debug 级的 "No persisted metadata found in database"。下游后果(plugin.ts Phase 2 自己的注释已写明):registry.getObject 返回空 → unknown-
$selectguard / hooks / relationships silently degrade;没读到的 overlay 对象既不建表也不桥接,kernel 照常 ready。自托管运维在 boot 期只有日志一个信号,而这个信号是 debug 级的「库是空的」。修向(dev 的四案分析,原文见 #5841 报告)
storeUnavailable/degraded),restoreMetadataFromDb读它并按 AGENTS「Degradation log levels」升到 error。改返回契约 +objectql/src/plugin.ts:23的ProtocolWithDbRestore接口声明与消费分支;面小、不改控制流;与 MetadataManager.get() 丢弃 loadDiagnosed 的 degraded 判定:loader 读不到与「这一项没声明」在 6 个消费点上不可分辨 #5840 的方向 (a)(诊断版读法)同形,可共用。restoreMetadataFromDb现有 catch 会重新吞掉,不同步改消费方等于没改。loaded===0分支从 debug 升 warn —— 空库与 outage 仍不可分,把两个相反事实继续用同一个名字叫,workaround。PM 裁决(第三档:带前提,否决窗口开放)
裁 A,前提两条(实施 dev 开工先核,任一不成立即报 fork、⛔ 不许静默改道):
loadMetaFromDb返回值的消费方仍然只有restoreMetadataFromDb一个(loadMetaFromDb 用 /no such table/i 正则判「良性首启」,其余 sys_metadata 读失败吞成 console.warn + loaded:0 —— isMissingTableError 的手抄第二份 #5841 测量时如此);ProtocolWithDbRestore是 objectql 内部接口声明,不在packages/spec公开契约面上(若实测它已进 spec,转domain:spec座位)。依据:ADR-0110 D3(outage ≠ miss)已是本仓在 DatabaseLoader(#5108)、listForIndex(#5089)、协议 overlay 读(#5532/#5705/#5843)的既定方向,A 是同一条规矩的 boot 侧落地 —— 属 restore-invariant,不占维护者决策位;B 过重(boot 应 degrade loudly 而非 die),C 属 workaround(两个相反事实一个名字),D 违背 D3。
协调
plugin.ts/metadata-manager.ts文件面切分,先派者在报告里回答对后派者的必答项。Refs #5841 / PR #5889、#5840、ADR-0110 D3、#5108、#5089、#5532。