Pre-existing _read_json class (loop/contract.py:48: path.read_text(encoding="utf-8") wrapped only for json.JSONDecodeError) — reproduced on the untouched .loop/repair/ path, so it pre-dates Slice 2. But Slice 2's .loop/evidence/ discovery adds a worker-written directory to the reachable surface, so hostile bytes now have a natural author. It fails closed (non-zero, traceback), so R007's substance holds — but the traceback should be a typed finding. Fix: widen the except to (UnicodeDecodeError, OSError) → typed invalid_json/unreadable_file; note this changes repair/state/manifest behavior too, so it needs its own small slice with tests across all consumers.
Pre-existing
_read_jsonclass (loop/contract.py:48:path.read_text(encoding="utf-8")wrapped only forjson.JSONDecodeError) — reproduced on the untouched.loop/repair/path, so it pre-dates Slice 2. But Slice 2's.loop/evidence/discovery adds a worker-written directory to the reachable surface, so hostile bytes now have a natural author. It fails closed (non-zero, traceback), so R007's substance holds — but the traceback should be a typed finding. Fix: widen the except to(UnicodeDecodeError, OSError)→ typedinvalid_json/unreadable_file; note this changes repair/state/manifest behavior too, so it needs its own small slice with tests across all consumers.