fix(mllm-cache): refuse a media hit that does not cover the image span
The hybrid hit path sets req.pixel_values = None unconditionally. That is what makes a warm media turn cheap -- the vision tower is skipped because the image KV is already in the restored prefix -- but it is only sound when the hit COVERS the media span. When the hit stops before the image, the remaining tail still carries media placeholders and is now forwarded with no pixel values. Those positions get embedded as ordinary text tokens, so the model answers fluently about an image it never saw. Nothing raises and nothing logs; the answer simply looks fine and is wrong. This is the same class as the text-only follow-up path, which has no guard either. The hit is declined in that case, with the blocks released and the credit zeroed so the refs do not leak and the next turn does not hit the same unusable entry forever. A full prefill is slow; a confidently wrong answer about an image is worse.
J
Jinho Jang committed
3108a7d4548a314f9597fa420d26ce309ac7b6d3
Parent: 1ab278d