做 #5707(getMetaItemLayered overlay 裸 catch)时,在同文件读到的同族点。不在那单范围内(#5707 的文件面限定为 getMetaItemLayered 的一处 catch),按 Prime Directive #10 单独记在这里,unassigned。严重度不自评,交 PM 分诊。
位置
packages/metadata-protocol/src/protocol.ts,loadMetaFromDb 的外层 catch(以内容定位):
} catch (e: any) {
// "no such table" is expected on first run before migrations execute — not an error.
if (!/no such table/i.test(e.message ?? '')) {
console.warn(`[Protocol] DB hydration skipped: ${e.message}`);
}
}
return { loaded, errors, invalid };
loadMetaFromDb 是 boot 时把 sys_metadata 行水合进 SchemaRegistry 的那一步。
两个可分开处置的事实
1. 良性判定是消息正则的手抄第二份。 平台已经把「表还没建」集中成了一个谓词 isMissingTableError(@objectstack/metadata/errors),DatabaseLoader(#5108)、本包 SysMetadataRepository(#4867)、以及 #5532 / PR #5705 新引入的 rethrowUnlessMetadataStoreUnprovisioned(就在同一个文件里)都问它。这里却仍在对 e.message 跑 /no such table/i —— 一个驱动怪癖要教平台两遍。可预期后果:换驱动后该正则不匹配(Postgres 的措辞是 relation "sys_metadata" does not exist),首启会打出一条本不该有的告警;反向也成立——某个驱动把别的错误也写成 "no such table" 时会被误判为良性。这与 #5808「路由的 message 正则名单完全退休」是同一类。
2. 其余读失败的处置是 console.warn + loaded: 0 返回。 返回值 { loaded, errors, invalid } 里没有任何字段能表达「这次水合根本没读到存储」,调用方拿到的 loaded: 0 与「库里确实一条 overlay 都没有」不可分辨——ADR-0110 D3 的同一条规矩,落在 boot 侧。至少它是 loud(有 warn),所以不像 #5532 那样静默,这也是我不自评严重度的原因。
未验证 / 开工时先测量
- 谁读
loadMetaFromDb 的返回值、有没有人对 loaded: 0 分支;boot 在完全读不到 overlay 的情况下继续以「只有 artifact」的世界服务,是否有已知的下游误判。
- 修向:第 1 点应当就是「改问
isMissingTableError」(同文件已 import);第 2 点是否要升级为返回诊断字段或抛出,需要先量清消费方——别把两件事绑成一次改动。
关联
#5707 / #5532(PR #5705)/ #5706(同文件同家族)、#5108、#4867、#5808(message 正则名单退休的先例)。同文件另有 #4636(loadMetaFromDb 的 object 分支读 record.packageId 恒 undefined)—— 不同的限、不是本单的父单,但两单落同一个方法,派发时注意串行。
Generated by Claude Code
做 #5707(
getMetaItemLayeredoverlay 裸 catch)时,在同文件读到的同族点。不在那单范围内(#5707 的文件面限定为getMetaItemLayered的一处 catch),按 Prime Directive #10 单独记在这里,unassigned。严重度不自评,交 PM 分诊。位置
packages/metadata-protocol/src/protocol.ts,loadMetaFromDb的外层 catch(以内容定位):loadMetaFromDb是 boot 时把sys_metadata行水合进 SchemaRegistry 的那一步。两个可分开处置的事实
1. 良性判定是消息正则的手抄第二份。 平台已经把「表还没建」集中成了一个谓词
isMissingTableError(@objectstack/metadata/errors),DatabaseLoader(#5108)、本包SysMetadataRepository(#4867)、以及 #5532 / PR #5705 新引入的rethrowUnlessMetadataStoreUnprovisioned(就在同一个文件里)都问它。这里却仍在对e.message跑/no such table/i—— 一个驱动怪癖要教平台两遍。可预期后果:换驱动后该正则不匹配(Postgres 的措辞是relation "sys_metadata" does not exist),首启会打出一条本不该有的告警;反向也成立——某个驱动把别的错误也写成 "no such table" 时会被误判为良性。这与 #5808「路由的 message 正则名单完全退休」是同一类。2. 其余读失败的处置是
console.warn+loaded: 0返回。 返回值{ loaded, errors, invalid }里没有任何字段能表达「这次水合根本没读到存储」,调用方拿到的loaded: 0与「库里确实一条 overlay 都没有」不可分辨——ADR-0110 D3 的同一条规矩,落在 boot 侧。至少它是 loud(有 warn),所以不像 #5532 那样静默,这也是我不自评严重度的原因。未验证 / 开工时先测量
loadMetaFromDb的返回值、有没有人对loaded: 0分支;boot 在完全读不到 overlay 的情况下继续以「只有 artifact」的世界服务,是否有已知的下游误判。isMissingTableError」(同文件已 import);第 2 点是否要升级为返回诊断字段或抛出,需要先量清消费方——别把两件事绑成一次改动。关联
#5707 / #5532(PR #5705)/ #5706(同文件同家族)、#5108、#4867、#5808(message 正则名单退休的先例)。同文件另有 #4636(
loadMetaFromDb的 object 分支读record.packageId恒 undefined)—— 不同的限、不是本单的父单,但两单落同一个方法,派发时注意串行。Generated by Claude Code