clone

an offline map explorer where each world, from a game map to a city's open data, ships as one .atlas file

main
atlas / docs / decisions / 0003-merge-moves-to-enrich.md
0003-merge-moves-to-enrich.md 2.0K rendered
1# 3. Cross-source merge moves from generate to enrich23- **Date:** 2026-08-024- **Status:** accepted5- **Where it is written down:** issue #5 §5.2, §5.3, §10 decision 4;6 [generate.md](../generate.md), [enrich.md](../enrich.md)78## Context910In the reference implementation, folding several sources' readings of one11volume together happens **inside composition**. That places the merge — with12its affine fits, its match radii, its per-key attribute policy and its ledger —13in the middle of the lane whose job is to turn one source's capture into one14volume. Composition therefore has to know what a donor is, and the generate15lane cannot be reasoned about, tested, or replaced without the merge coming16along.1718## Decision1920**Generate is single-source.** What one source said travels through untouched.21Folding readings together is an enricher — the first of the curated queue — and22the composed multi-source result is `generate ⊕ enrich`.2324Correctness is defined at the composed-bundle level: the goldens check the25result of running both lanes, not the boundary between them.2627## Consequences2829- The two lanes never import each other (issue #5 §3.2, enforced by30 `tools/depcheck`), which is what forces the adapter seam of31 [ADR 9](0009-the-enrich-compose-adapter-seam.md).32- Only a merge ledger ever names a source, so the source-neutral rule33 ([ADR 4](0004-source-neutral-interchange-document.md)) has exactly one34 sanctioned exception and it is a provenance record.35- An enriched build must win the registry fold deterministically, which is36 [ADR 10](0010-revision-packing.md), which is in turn why every merged fixture37 carries the `enriched-build-revision` waiver: the reference tree wrote a38 plain policy revision, so the manifest — and therefore the stamp and the file39 name — cannot match by construction.40- Merge becomes replaceable and separately testable: it sees translated worlds41 and returns contributions, and everything it decided is in a ledger the gate42 audits.