Final-review hardening:
- discover_printer falls back to direct IP reachability when printer_mac is
empty (restores legacy behavior; avoids permanent unreachable on misconfig).
Keeps the MAC check when a MAC IS set so we never print to a wrong DHCP tenant.
- bridge subprocess decodes child stdout as utf-8 explicitly, so a LANG=C systemd
locale can't UnicodeDecodeError on the success checkmark and mis-report error.
- add tests for both no-MAC fallback paths (5 passed).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
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>
print_receipt now resolves the printer by MAC via discover_printer() instead of
a hardcoded IP. Verified end-to-end: physical receipt printed to 192.168.0.184.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
The prior commit only recorded the conftest.py deletion; this adds the actual
fix: tests/pytest.ini (pins rootdir to tests/ so the standard pytest command
no longer crashes on the dead /root/bin symlink) and the PEP8 import move.
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>