5d70b7f7b8
Per mneme /ideas id 118 (req markus 2026-07-22): hossenfelder is a failover/auto-routing proxy, so the model NAME in the request is not necessarily what served it. Every direct-API caller was parsing choices[0].message.content and discarding the response's own `model` field — the room reply echoed the ASK, not the reality. Applies "asked X, served by Y" (only shown when they differ, so the common non-failover case stays quiet) to: - bullpen-grinder: ask_model() captures served_model; save_best/report thread it through so GREEN/RED replies show it. - bullpen-coder, bullpen-researcher (incl. the SSE stream path — model is on every chunk, not just a final non-streaming body), bullpen-callboy, bullpen-triage: same pattern. - bullpen-dispatcher: the LLM tie-break path only — the deterministic keyword-match path never touched a model and stays untagged. - lib/bullpen_participant.py (architect/skeptic conversants): tag prepended as "> asked X, served by Y" — matches the "> build · model" convention opencode-backed workers already show natively, so the room now has one consistent visual convention for "which model" instead of two (opencode-native vs none). - lurker/bullpen-lurker (claude -p workers): no proxy failover in this path, so just reports the configured --model directly rather than parsing a JSON field the CLI may or may not carry. Skipped: @librarian, @doctor (no LLM in either — nothing to report). Local syntax-checked; dispatcher's --once mode exercised for both the keyword path (untagged, correct) and roster-fallback path. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01EWpfhDgYNA21tETDP9ueBE