gemma4:26b under format:json ignores the bare-array instruction and returns a
reasoning object ({"thought": ...}), which broke Phase-1 selection (Unterminated
string -> silent fallback to first-5). Selection now uses ollama_select_model
(default qwen2.5:1.5b); summaries stay on gemma4:26b. Also tolerate dict-shaped
selection responses defensively.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Add discover_printer(), _mac_of(), _port_open(), _sweep_arp(), _cache_ip()
with PRINTER_MAC/PRINTER_SUBNET/CACHE_FILE config + unit tests. Also adds
conftest.py to work around broken symlink that blocked pytest collection.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>