Part of epic #105 (ADR-013 Hop-B sink leg). No dependencies — first story.
Problem
Nothing in this repo declares the FAO delivery product (§4.2a: expected target set is views-postprocessing configuration), the §6 floor, the §4.1a consumer document name, or the §11.4 upload interlock. And the §4.1b Hop-B file-name templates exist only as fixture bytes.
Work
views_postprocessing/unfao/product.py — declared constants, never inferred: TARGETS = ("lr_ged_sb", "lr_ged_ns", "lr_ged_os") (§7a vocabulary), S_MIN = 2 (walking skeleton; production pinning is an OPEN maintainer item), CONSUMER_DOCUMENT_NAME = "un_fao" (§4.1a pin), UPLOAD_ENABLED = False (§11.4 interlock — overridable only by an explicit launch-config key, later story).
views_postprocessing/unfao/wire/__init__.py + wire/naming.py — §4.1b templates as functions: shard_name(run_id, target, time_id), run_manifest_name(run_id), sidecar_name(run_id). Locators only, never identity (§3.3 lesson).
Acceptance criteria
- Golden-string tests reproduce the exact fixture file names (
fixture_run_0__lr_ged_sb__m000543.arrow.parquet, fixture_run_0__manifest.json, fixture_run_0__sidecar.parquet).
product.UPLOAD_ENABLED is False asserted as a literal (the interlock's golden test seed).
- Suite + design-contract tests green.
Tests: tests/test_product.py, tests/test_wire_naming.py. Oracle: tests/fixtures/wire_contract/SHA256SUMS names.
🤖 Generated with Claude Code
Part of epic #105 (ADR-013 Hop-B sink leg). No dependencies — first story.
Problem
Nothing in this repo declares the FAO delivery product (§4.2a: expected target set is views-postprocessing configuration), the §6 floor, the §4.1a consumer document name, or the §11.4 upload interlock. And the §4.1b Hop-B file-name templates exist only as fixture bytes.
Work
views_postprocessing/unfao/product.py— declared constants, never inferred:TARGETS = ("lr_ged_sb", "lr_ged_ns", "lr_ged_os")(§7a vocabulary),S_MIN = 2(walking skeleton; production pinning is an OPEN maintainer item),CONSUMER_DOCUMENT_NAME = "un_fao"(§4.1a pin),UPLOAD_ENABLED = False(§11.4 interlock — overridable only by an explicit launch-config key, later story).views_postprocessing/unfao/wire/__init__.py+wire/naming.py— §4.1b templates as functions:shard_name(run_id, target, time_id),run_manifest_name(run_id),sidecar_name(run_id). Locators only, never identity (§3.3 lesson).Acceptance criteria
fixture_run_0__lr_ged_sb__m000543.arrow.parquet,fixture_run_0__manifest.json,fixture_run_0__sidecar.parquet).product.UPLOAD_ENABLED is Falseasserted as a literal (the interlock's golden test seed).Tests:
tests/test_product.py,tests/test_wire_naming.py. Oracle:tests/fixtures/wire_contract/SHA256SUMSnames.🤖 Generated with Claude Code