nabu-places

The place-matching decisions registry. Gazetteers of the ancient world — Pleiades, Trismegistos Geo, CIGS, GeoNames — already hold the places. What no shared resource holds is the matching decision: which of those identities a source’s verbatim place-name string actually denotes.

Consider three real strings from the corpora this registry serves:

names.yml records exactly these judgments, one row per (source, verbatim string) — and nothing else. An unlisted name is unmatched, visibly: coverage claims stay honest because only decisions are rows (the identity-default doctrine, inherited from nabu-lects).

The row vocabulary

status meaning example
matched the string denotes these gazetteer identities (refs required) {refs: [cigs:GIR, pleiades:912855], status: matched}
unlocatable a real ancient place whose site is unidentified (note required) Irisagrig
region the string is a regional bin, not a place “Middle Egypt (from Kairo to Assiut)”
ghost an attested string naming no identifiable place fragmentary toponyms
rejected examined and deliberately not matched (note required) homonym ruled out
alias_of redirects to another verbatim key in the same section "Roma?" → "Roma"

certainty: low marks upstream-qualified claims (a ?-suffixed provenience). Namespaces are declared in namespaces.yml with id shapes; they are parallel claims — equivalences between gazetteers are the gazetteers’ own crosswalk data, never inferred here.

Not only glue: the native minting lane

Where text analysis, enrichment, or AI-assisted scholarship establishes a place no gazetteer registers, the registry mints its own record in places.yml (namespace np:) — name, optional coordinates, and a required evidence trail, so every minted place is a reviewable scholarly claim. names.yml rows then cite np:<ID> like any other ref. Gazetteers stay the authorities for what they cover; the native lane exists for what they don’t yet.

See the schema for the full grammar and prior art for why this layer exists at all.

Validation

bin/validate (dependency-free Ruby) refuses duplicate source/name keys (YAML’s silent last-wins is a data-loss class), closes the status vocabulary, checks every ref against its namespace’s id shape, and requires notes where honesty needs them. Consumers re-run it against their pinned copy.

License

CC BY 4.0. Maintained as part of the Nabu research infrastructure.