What
Every warning the router produces — including "requested backend 'X' is unavailable; selecting automatically" — is folded into the explanation string and printed only when --explain is passed.
Sources/bestasr/BestASRCommand.swift:143-146:
print("Wrote \(result.format) transcript to \(result.outputPath)")
if explain {
FileHandle.standardError.write(Data((result.explanation + "\n").utf8))
}
CommandCore.swift:447 is the only place rec.warnings is consumed, and it appends into that same explanation.
Why it matters
The user asks for one backend and silently receives another's output. Observed during #121 verification:
$ bestasr transcribe cv-zhtw-2.wav --backend apple-speech --language zh
Wrote txt transcript to …/cv-zhtw-2.txt ← that is the entire output
The transcript was produced by mlx-audio Whisper, not apple-speech. Only --explain revealed it. Anyone comparing backends by hand would have recorded one backend's numbers under another's name.
The same suppression hides the other router warnings, several of which exist precisely to stop a silent quality loss:
Each was written to be seen. None is, by default.
Scope
Pre-existing, not introduced by #121 — git log -L143,146:Sources/bestasr/BestASRCommand.swift traces it to the original CLI commit (471218a, 2026-07-02), and main is byte-identical there. It affects every backend, not just the new one.
Suggested direction
Separate reasons from warnings: reason is explanatory detail and belongs behind --explain; warnings are things the user needs to know to trust the output, and belong on stderr unconditionally (a --quiet can opt out). Both already exist as separate arrays on ASRRecommendation, so the split is available without a schema change.
Worth checking benchmark and recommend for the same pattern.
Acceptance
transcribe --backend <unavailable> prints the substitution warning without --explain
--explain output is unchanged
- a test asserts the warning reaches stderr on the default path — the current suite would not have caught this
What
Every warning the router produces — including "requested backend 'X' is unavailable; selecting automatically" — is folded into the
explanationstring and printed only when--explainis passed.Sources/bestasr/BestASRCommand.swift:143-146:CommandCore.swift:447is the only placerec.warningsis consumed, and it appends into that sameexplanation.Why it matters
The user asks for one backend and silently receives another's output. Observed during #121 verification:
The transcript was produced by mlx-audio Whisper, not apple-speech. Only
--explainrevealed it. Anyone comparing backends by hand would have recorded one backend's numbers under another's name.The same suppression hides the other router warnings, several of which exist precisely to stop a silent quality loss:
"model 'X' does not list support for language 'Y' — output quality is not established"(recommend/transcribe 的 --language auto 未偵測音訊語言,非英文內容被推薦英文專用後端 #105 declared-language gate)ColdStartPrior.ensureFitsmemory-downgrade warningsEach was written to be seen. None is, by default.
Scope
Pre-existing, not introduced by #121 —
git log -L143,146:Sources/bestasr/BestASRCommand.swifttraces it to the original CLI commit (471218a, 2026-07-02), andmainis byte-identical there. It affects every backend, not just the new one.Suggested direction
Separate reasons from warnings:
reasonis explanatory detail and belongs behind--explain;warningsare things the user needs to know to trust the output, and belong on stderr unconditionally (a--quietcan opt out). Both already exist as separate arrays onASRRecommendation, so the split is available without a schema change.Worth checking
benchmarkandrecommendfor the same pattern.Acceptance
transcribe --backend <unavailable>prints the substitution warning without--explain--explainoutput is unchanged