Netherlands (NL) build pipeline
Not a live external fetch — converts an existing FedEx-schema delivery
(~/Desktop/Research/fedex-agents-prototype/datahub-sales-deliveries/Netherlands_Delivery/Netherlands.csv,
467,630-row Universal Data Schema export, already QA'd upstream: validation_report.json
there shows 0 errors) into this repo's 13-column postal-codes schema. convert_from_fedex.py's
own docstring documents every place the two schemas disagree in detail — read it before
changing anything. Summary:
countryCode(NLD, alpha-3) ->country_code(NL, alpha-2).- The 12-column FedEx schema has
additionalInfo; the 13-column one has nowhere to put it. Only 10 of 467,630 rows use it — 8 say "Postal station: Cortelande" (genuinely lost in conversion, noted indata/README.md), 2 carry a licensing statement (see point 3). - Licensing: the FedEx base source is CC0 1.0 (public domain, no attribution needed).
Two rows were backfilled from the CBS woonplaatsen reference (CC-BY 4.0) — those two
rows alone would drag the whole published file into an attribution obligation. They
are exactly the two rows asserting
postalCode "00000"(no postal code) — which don't belong in this product anyway (a list of postal codes has no home for a no-postal-code row; see CLAUDE.md, "Two Output Formats" in fedex-agents-prototype). Dropping them is correct on product grounds and keeps the published dataset cleanly CC0. place_nameandadmin_name3both takecityName— legitimately the same value in NL (woonplaats is both the locality and the third admin tier). The pre-existing R2nl.csvhadadmin_name3as the literal string'nan'; this replaces it with the real value.
Run order
python3 convert_from_fedex.py # reads the FedEx delivery path above directly
python3 archive_nl_full.py # archives the untruncated conversion before any drops
python3 integrity_checker.py
python3 package.py
python3 publish_r2.py # dry run by default; --apply to publish
Verification (2026-08-19)
Confirmed the FedEx source file is real (not a stub) and ran the conversion fresh
against a fresh copy of it: 467,628 rows (the 2 00000 rows correctly dropped per
point 3 above), byte-identical (MD5 match) to both the pre-existing local copy and
live R2. Publish dry-run correctly ignores the phantom nl-full.csv that
_meta/catalog.json still references — that catalog staleness is isolated to the index,
not this data or this script (see the separately-flagged stale-catalog issue for
SG/DE/PT/NL/IT).