_query_base/_query_hybrid passed raw TextNodes to
get_response_synthesizer().synthesize(), which requires NodeWithScore
(it reads node.node internally). Every real query hit
AttributeError: 'TextNode' object has no attribute 'node', got caught
by a bare except Exception, and silently fell back to
_generate_fallback_answer - the "Based on the available
documentation: 1. From X... 2. From Y..." template users were
actually seeing instead of a real LLM-synthesized answer.
This was a pre-existing bug independent of the Groq change - Ollama
hit the same exception, it just wasn't noticed because the fallback
looks superficially like an answer.