chore(mcp): PR #172 회차 1 리뷰 반영

`ask_tool_routes_multi_hop_true_to_decompose_first` 의 error code
검증을 더 견고하게 — `model_unreachable | timeout` 둘 다 accept.
환경 차이 (즉시 ECONNREFUSED vs connect timeout) 가 다른 wire code
로 분류돼도 dispatch divergence 자체 (schema_version=error.v1 +
isError=true vs single-pass 의 answer.v1 grounded=false) 는 동일하게
검증.

검증
- `cargo test -p kebab-mcp -j 1 --test tools_call_ask_multi_hop` 2 통과.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-05-25 09:08:40 +00:00
parent 8a2f7affa6
commit 24221826ed

View File

@@ -91,9 +91,17 @@ async fn ask_tool_routes_multi_hop_true_to_decompose_first() {
};
let mh_v: serde_json::Value = serde_json::from_str(&mh_text).unwrap();
assert_eq!(mh_v["schema_version"], "error.v1");
assert_eq!(
mh_v["code"], "model_unreachable",
"multi-hop dispatch must hit the LLM and surface model_unreachable; got {mh_v}"
// The dispatch contract is "multi-hop reached the LLM". The exact
// error code depends on how the host TCP stack reports an
// unreachable port — fast-path `ECONNREFUSED` classifies as
// `model_unreachable`, but environments that take the connect
// timeout path (some CI / Docker network stacks) surface
// `timeout`. Accept either.
let mh_code = mh_v["code"].as_str().unwrap_or("");
assert!(
matches!(mh_code, "model_unreachable" | "timeout"),
"multi-hop dispatch must reach the LLM and surface model_unreachable/timeout; \
got code={mh_code:?} from {mh_v}"
);
// Single-pass branch — empty KB short-circuits at retrieve, no LLM