Part of epic #105. Depends on S1. Parallel-eligible with S3/S4.
Problem
The run's single commit marker (§4.2: ONE manifest per run, spanning all targets, uploaded LAST after shards AND sidecar) has no builder. Its fields are pinned by the fixture.
Work
views_postprocessing/unfao/wire/run_manifest.py: build_run_manifest(*, run_id, targets, shard_records, expected_months, expected_cell_count, sidecar_record) -> bytes — exact §4.2 field table (shards entries: name/target/time_id/sha256; sidecar object: name/sha256), pinned key order, indent=2 (fixture serialization). expected_cell_count = per-shard N (§3.2 ruling).
Acceptance criteria
- Fed the fixture names + hashes: output byte-equals
fixture_run_0__manifest.json.
Tests: tests/test_wire_run_manifest.py. Oracle: fixture run manifest.
🤖 Generated with Claude Code
Part of epic #105. Depends on S1. Parallel-eligible with S3/S4.
Problem
The run's single commit marker (§4.2: ONE manifest per run, spanning all targets, uploaded LAST after shards AND sidecar) has no builder. Its fields are pinned by the fixture.
Work
views_postprocessing/unfao/wire/run_manifest.py:build_run_manifest(*, run_id, targets, shard_records, expected_months, expected_cell_count, sidecar_record) -> bytes— exact §4.2 field table (shards entries: name/target/time_id/sha256; sidecar object: name/sha256), pinned key order,indent=2(fixture serialization). expected_cell_count = per-shard N (§3.2 ruling).Acceptance criteria
fixture_run_0__manifest.json.Tests:
tests/test_wire_run_manifest.py. Oracle: fixture run manifest.🤖 Generated with Claude Code