The earlier P3-5 hotfix wired --config through ingest / search / list /
inspect / doctor by switching kb-cli to call the *_with_config
companions. P4-3 added the ask body but kb-cli's Cmd::Ask arm still
called bare kb_app::ask(query, opts) — same bug as before, ask
silently fell back to ~/.config/kb/config.toml regardless of what the
user passed.
Caught during the post-P4-3 smoke against /tmp/kb-smoke/ pointed at
192.168.0.47 Ollama with gemma4:26b: the answer's wire JSON reported
`model.id = "qwen2.5:14b-instruct"` (the user's XDG default) instead
of `gemma4:26b` from the explicit --config, plus the score_gate /
data_dir / model fields all reflected XDG defaults. After this fix
the same invocation correctly returns model.id=gemma4:26b,
embedding=multilingual-e5-small (from the smoke config), grounded=true
with `[#2]` citation pointing at rust/ownership.md.
Same minimal pattern as the P3-5 hotfix:
- Build the Config once via Config::load(cli.config.as_deref()).
- Call kb_app::ask_with_config(cfg, query, opts) instead of
kb_app::ask(query, opts).
Workspace 319 tests pass; cargo clippy --workspace --all-targets --
-D warnings clean.
Smoke verified across four scenarios:
- Korean→Korean-body lookup: grounded with rust/ownership.md citation.
- English→Korean-body cross-language: grounded with arch/rag-
architecture.md citation.
- Korean→English-body cross-language: grounded with arch/embeddings.md
citation.
- Out-of-corpus query: LlmSelfJudge refusal with "근거가 부족하다."
Out of scope (filed for follow-up):
- config.rag.score_gate default 0.05 is incompatible with hybrid
RRF scores. RRF top score is bounded by 2/k_rrf (≈0.033 at k_rrf
=60), so the spec default trips ScoreGate on every hybrid query.
Workaround: lower the gate to 0.005 in the user's config; long-
term fix needs either per-mode gate config or RRF score
normalization to [0,1]. Tracked separately.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>