[Bug]: 指定模型不存在时回退默认模型未记录 WARN 日志(不可诊断)
目标仓库 openJiuwen/agent-core-java;提交前需按 gitcode-issue-quality-scoring 自评并获用户授权。
基线说明:本轮基线为 core 开发指定的转测基线 930(419688f58/头 20b1090e,制品 agent-core-java:0.1.16);复现证据即在该基线上取得。该内容另经 squash 进入 develop(0.1.17),只读源码复核同样成立;结论不自动适用于 0.1.17。
① 场景
- 测试场景:调用方在 A2A 请求 metadata 中指定一个未登记的模型名 → 运行时把该标识写入请求上下文 → agent-core 解析失败 → 回退默认模型完成请求
- 模块:
agent-core-java
- 特性:
FEAT-050-CORE:动态模型配置(agent-core)
- 目标仓库:
openJiuwen/agent-core-java
- 关联用例:
dmc.route.fallback / DynamicModelCandidateReproTest#cand01FallbackLogsWarn
- 正式基线:
930@419688f58(core 开发指定的转测基线);制品 com.openjiuwen:agent-core-java:0.1.16
- 需求依据:FEAT-050-CORE §2「模型解析 优先级链」、§5.1.5 异常表、§4 SC-CORE-04
② 问题概述
请求指定了不存在的模型时,实现按契约回退到默认模型并正常完成(这部分正确);但设计同时要求记录 WARN 日志(内容形如"指定模型 X 不存在,回退默认模型 Y"),实测该回退分支没有任何日志输出。影响:回退是静默的,运维无法从日志发现"调用方写错了模型名"或"模型未登记",只能看到请求成功。
③ 问题分析
3.1 判据
- 权威来源:FEAT-050-CORE(docs main
de5e8baa)§2、§5.1.5、SC-CORE-04
- 原文保真摘要:「❶ 未命中(modelId 不在列表中):降级到 ❷❸ 级,记录 WARN 日志("指定模型 X 不存在,回退默认模型 Y"),请求正常完成。」(MUST 级,未改写)
- 缺陷判定:实际行为完成了"回退 + 成功",但缺少 MUST 要求的 WARN 记录 → 属"可诊断性"要求未落地,不是范围外能力。
3.2 执行与观察证据
- 执行状态:
executed;用例结论:FAIL(该用例按设计断言"必须出现 WARN",故 FAIL 即"未落地"的复现证据)
- 精确 selector:
DynamicModelCandidateReproTest#cand01FallbackLogsWarn
- 结果计数:
Tests run: 3, Failures: 3(同批候选复现组,其中本条 FAIL);执行时间 2026-09-22,WSL Ubuntu / JDK 21
| 观察项 |
预期 |
实际 |
证据 |
| 回退分支的 WARN 日志行数(本次请求时间窗) |
≥1 且含请求的模型名 |
0 |
ErrorEvidence: …回退实现所在分段落日志行数=0 |
| 请求最终落点 |
默认模型端点 |
默认模型端点(正确) |
端点收单记录 + 响应 canary |
关键证据:
设计要求:指定模型不存在时回退默认并记录 WARN(FEAT-050 §2/§5.1.5/SC-CORE-04)。
本次请求 model_name=ghost-462037857703,回退实现所在分段落日志行数=0
(本项以 SIT FAIL 发现;XML 见本轮证据目录 target/dmc-evidence/all/。)
3.3 现象、定位与推断
- 已观察事实:请求成功、落默认模型;同一时间窗内其它 WARN 可被采集到,采集通道本身有效
- 已排除项:夹具日志采集范围(同时采
run.log 与 stdout.log 全量追加行)、环境、制品版本、请求通道
- 静态分析:
ModelMgr.resolveModel(dynamicModelId, …) 在"dynamic 未命中"分支直接 fall through,无 logger 调用;ReActAgent 侧亦无
- 待开发确认的推断:日志应输出的层与关键字(设计未规定载体)
3.4 Pre-flight 与历史关系
- 全字段扫描:本项不涉及字段级差异;同类"可诊断性"要求仅此一处
- 交叉通道验证:换成"未指定模型名"的请求不产生日志属正常(不是本条);两条对照说明差异只来自"是否命中 ❶"
- 客户端可见契约核对:设计未定义日志载体,故本条只能证明"无任何日志",不能指定关键字
- 历史 ISSUE 关系:未发现同族历史单
④ 复现条件
- 前置:载体登记模型 {A, B} 且默认 A;A 端点与 B 端点可区分
- 可执行命令:
mvn -o -Dtest.env=openjiuwen -Dtest=DynamicModelCandidateReproTest#cand01FallbackLogsWarn test
- 预期失败信号:断言"WARN 行数 ≥1"失败
- 复现产物位置:
target/feature-acceptance-testing/dmc-cand01-evidence.json、本组 XML
⑤ 问题代码分析
core/src/main/java/com/openjiuwen/core/runner/resourcemanager/ModelMgr.java → resolveModel(String dynamicModelId, ModelClientConfig, ModelRequestConfig) 的"dynamic 未命中"分支(无日志)
core/src/main/java/com/openjiuwen/core/singleagent/agents/ReActAgent.java → getLlm(AgentCallbackContext)(取模型路径,无日志)
⑥ 问题影响
- 影响面:所有"调用方传错/传了未登记模型名"的请求;现象是"静默降级",与设计"不静默成功"的 DFX 目标相反
- 风险:排障成本高;错误配置长期不被发现(模型分流失效但无告警)
⑦ 建议修复方案
- 在回退分支输出 WARN,包含请求的 modelId 与实际回退目标;载体与关键字建议由 L2 明确(当前 L2 缺失)
- 修复验证清单:
cand01FallbackLogsWarn 转 PASS;dmc.route.fallback 仍 PASS(回退语义不被破坏)
[Bug]: 指定模型不存在时回退默认模型未记录 WARN 日志(不可诊断)
① 场景
agent-core-javaFEAT-050-CORE:动态模型配置(agent-core)openJiuwen/agent-core-javadmc.route.fallback/DynamicModelCandidateReproTest#cand01FallbackLogsWarn930@419688f58(core 开发指定的转测基线);制品com.openjiuwen:agent-core-java:0.1.16② 问题概述
请求指定了不存在的模型时,实现按契约回退到默认模型并正常完成(这部分正确);但设计同时要求记录 WARN 日志(内容形如"指定模型 X 不存在,回退默认模型 Y"),实测该回退分支没有任何日志输出。影响:回退是静默的,运维无法从日志发现"调用方写错了模型名"或"模型未登记",只能看到请求成功。
③ 问题分析
3.1 判据
de5e8baa)§2、§5.1.5、SC-CORE-043.2 执行与观察证据
executed;用例结论:FAIL(该用例按设计断言"必须出现 WARN",故 FAIL 即"未落地"的复现证据)DynamicModelCandidateReproTest#cand01FallbackLogsWarnTests run: 3, Failures: 3(同批候选复现组,其中本条 FAIL);执行时间 2026-09-22,WSL Ubuntu / JDK 21ErrorEvidence: …回退实现所在分段落日志行数=0关键证据:
(本项以 SIT FAIL 发现;XML 见本轮证据目录
target/dmc-evidence/all/。)3.3 现象、定位与推断
run.log与stdout.log全量追加行)、环境、制品版本、请求通道ModelMgr.resolveModel(dynamicModelId, …)在"dynamic 未命中"分支直接 fall through,无 logger 调用;ReActAgent侧亦无3.4 Pre-flight 与历史关系
④ 复现条件
mvn -o -Dtest.env=openjiuwen -Dtest=DynamicModelCandidateReproTest#cand01FallbackLogsWarn testtarget/feature-acceptance-testing/dmc-cand01-evidence.json、本组 XML⑤ 问题代码分析
core/src/main/java/com/openjiuwen/core/runner/resourcemanager/ModelMgr.java→resolveModel(String dynamicModelId, ModelClientConfig, ModelRequestConfig)的"dynamic 未命中"分支(无日志)core/src/main/java/com/openjiuwen/core/singleagent/agents/ReActAgent.java→getLlm(AgentCallbackContext)(取模型路径,无日志)⑥ 问题影响
⑦ 建议修复方案
cand01FallbackLogsWarn转 PASS;dmc.route.fallback仍 PASS(回退语义不被破坏)