Skip to content

[metadata-protocol] seed-loader:无 pass-2 时「引用解析不了 ⇒ 整条记录丢弃」计为 error 却一行日志都不打(#4729 判据的更深一格) #4997

Closed

Description

@xuyushun441-sys

发现于 #4729(把 seed-loader 里「计数为错、日志为 warn」的行对齐到 error)的同文件盘点。本条不在 #4729 的判据内(它盘的是 this.logger.warn 调用),所以只记录、不在那个 PR 里改。

现象

packages/metadata-protocol/src/seed-loader.ts,pass-1 引用解析、multiPass 关闭的分支:

} else {
  // Cannot resolve and no pass 2 will run — skip the whole record
  // (LOUD: counted + reported). Writing it anyway would either
  // carry the raw natural-key string into the FK column or, on
  // update, corrupt the existing row.
  pushError(
    `Cannot resolve reference: ${objectName}.${ref.field} = '${String(unresolvedItem)}' → ` +
      `${ref.targetObject}.${ref.targetField} not found`,
    unresolvedItem,
  );
  unresolvedRefError = true;
}

pushError 把错误推进 errors / allErrors(⇒ success: false),随后 unresolvedRefError 让 errored++ 并 continue —— 整条记录被丢弃,一行都没有种下去。但这里没有任何 logger 调用:注释写的 "LOUD" 只兑现了「计入结果对象」,控制台上一个字都没有。

为什么值得单开

#4729 的论点是「计数与日志级别应当一致」:结果对象里数得到、日志却停在没人读的 warn。这一处是同一条链的更深一格 —— 计数有、日志级别是「无」。对只看 boot 日志的运维/agent 来说,一次丢了 N 条记录的 seed 与一次干净的 seed 在控制台上完全一样(区别只在调用方是否检查了 result.success,而 packages/runtime 的若干 seed 调用点只是 await 之后继续)。

check:durability-log-level 把这种形态叫 silent-swallow,但那个门禁只扫 try/catch,而这里不是 catch,所以扫不到。

期望(待维护者确认)

未认领。

Activity

  1. claude commented on Aug 4, 2026

    @claude
    Contributor

    🔒 认领:PM 循环第 8 轮(恢复派发,bug-only 口径)
    会话:session_01NrmBxj8rK2uGCnh9aipjwX(账号 xuyushun441-sys)
    分支:claude/issue-4997-seed-drop-silent-log
    Worktree:objectstack-issue-4997
    域:domain:engine
    文件面:packages/metadata-protocol/src/seed-loader.ts 及同目录测试(⛔ 与 #5088 的 protocol.ts 不交)

    ⛔ 硬约束:spec/** 及生成物零改动;metadata-protocol/src/protocol.ts 零改动(借道 #5088 在飞占用);releases/ 零触碰。
    全局在飞不相交已核:#5088(protocol.ts,借道)、#5087(plugin-email)、#5089/#5090(#5040 执行器)、#5096/#5026(lint)、#5011,与本文件面均不交。


    Generated by Claude Code

  2. claude commented on Aug 4, 2026

    @claude
    Contributor

    ✅ 验收通过 —— PR #5128(draft,CI 跑完入队)

    对照实际 diff 复核(3 文件,+454/-11;⛔ spec / protocol.ts / releases 零触碰 —— 与借道在飞的 #5088 后续零交集,逐一核实):

    1. 点名分支补 error 齐全:对象/记录序号/字段/目标 + 「整条记录一行都没种下」的后果 + 三条补救;名不副实的 'LOUD: counted + reported' 注释改写为真;
    2. 裁定逐条兑现:dry-run 保持安静、理由入注释、测试钉成决定(变异第 3 钉:给 dry-run 加日志反而红 —— 「安静即正确」也被钉住,这是少见的双向纪律);同判据盘完全文件,又找到并对齐一处(pass-2 的 'unresolved after pass 2',其孪生分支自 [metadata-protocol] seed-loader 的「LOUD FAILURE」注释要求 error,代码却记 warn —— 第二类降级(#4632 规则),本轮因包冻结未修 #4729 就在 error);
    3. 变异钉三处全验(两处删日志红、一处加日志红),计数与结果对象形状零改动;
    4. metadata-protocol 324 全过 + runtime 消费方 41 过;typecheck 用测量基线路线(62=62,零新增);门禁 25 绿,3 条先天失败均以 stash 复跑证明与本 diff 无关;
    5. 衍生已核实:[metadata-protocol] seed-loader pass 2:目标解析成功但记录 id 找不到时,整条 deferred 回填被静默丢弃(既不计数也不打日志) #5127(pass-2 目标解析成功但 id 缺位 → 既不计数也不打日志,比本单更深一格)立案;「非 catch 静默丢弃扫描器」的门禁扩面判断写进 PR 正文而非搭车 —— 假阳性面(dry-run 类安静即正确)需要基线机制,单独讨论是对的。

    CI 绿后转 ready 入合并队列。


    Generated by Claude Code

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Labels

bugSomething isn't workingpm:dispatchedDispatched to a dev agent by /pm-dispatchpm:queueReady for the PM dispatch loop

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions