Supersedes the #619 proposal to add a Market entity to hydradistrict. Markets and infrastructure are different domains, so markets get their own loosely coupled service: hydratam.
Scaffold is complete and committed at /home/claude-user/hydratam. Not yet pushed, tagged or deployed.
hydradistrict models compute locations: id, name, provider, coordinates, service URLs. A market is a commercial object: NUTS regions, a priority tier, candidate cities, a rationale per city. Putting both in one YAML store would have coupled a sales decision to an infrastructure record and given one service two reasons to change.
The coupling between them is one optional outbound read. Without a hydradistrict URL hydratam starts normally, serves every market, and the atlas hides the district layer. Coverage endpoints return 503 with a setup_url, and health stays ok with coverage.configured=false. A missing optional integration is not a fault.
Same conventions as hydradistrict: Go + Cobra, YAML store with no database, hydraauth bearer tokens, hydramonitor SSE, hydraserve autocert, auto-update from releases.experiencenet.com, multi-arch OCI image.
Endpoints:
CLI: serve, seed (--dry-run, --replace), geometry build, version, update.
Seeded with the 15 markets from #603: 32 NUTS 2 regions, 47 cities, 3 live venues.
hydratam geometry build reproduces the committed boundary file byte for byte from the Eurostat source.Tier 0 is a real state. It means researched but not yet placed in the priority sequence, not lowest priority. It sorts after tier 4 and is filterable with ?tier=0, so open decisions are findable. Four markets from #603 sit there today.
Content is on disk, not go:embed. web/atlas.html, data/geo/, docs/ and seed/ are COPY'd into the image at the same paths they have in the repo. The atlas can be edited and reloaded with no rebuild.
A retired NUTS code fails loudly. TestEverySeededRegionExistsInTheGeometry asserts every market's nuts_ids exist in the shipped geometry. Verified it catches the real case: reintroducing NL33 for Zuid-Holland fails the test with a message naming the market and the code. Without it the only symptom is a region that quietly does not paint.
Repository is not yet created under github.com/cederikdotcom.