Read and parse manifest.json from a run directory.
Silent-failure semantics match the pre-refactor analysis-aggregator.ts
and article-generator.ts callers: missing files, malformed JSON, and
I/O errors all yield manifest: null rather than throwing. Callers that
need to distinguish "file missing" from "file malformed" can compare
manifest === null against fs.existsSync(result.path).
Read and parse
manifest.jsonfrom a run directory.Silent-failure semantics match the pre-refactor
analysis-aggregator.tsandarticle-generator.tscallers: missing files, malformed JSON, and I/O errors all yieldmanifest: nullrather than throwing. Callers that need to distinguish "file missing" from "file malformed" can comparemanifest === nullagainstfs.existsSync(result.path).