Returns NULL when the file is missing (e.g., a run directory created by a very old pakhom version, or a partially-initialized run that crashed before run_metadata.json was written). Returns NULL on parse error too, so callers can treat "no metadata" and "corrupt metadata" identically (both mean: fall back to the no-prior-state code path). Errors do warn so the user knows the file existed but couldn't be read.