The current portals.json on main is valid JSON. The malformed version
referenced in the issue was likely from a draft that was fixed before
merge. Added 4 validation tests to prevent future corruption:
- test_portals_json_valid: file must parse as JSON
- test_portals_json_no_duplicate_keys: no duplicate keys in any object
- test_portals_json_structure: required fields (id, name, description,
status, color, position) present on every portal
- test_portals_json_positions_valid: x/y/z coordinates are numbers
Closes#1440