fix: mark 8 more Google Maps false matches detected via name mismatch

Additional Type I custodian files with obvious name mismatches between
KIEN registry entries and Google Maps results. These couldn't be
auto-detected via domain mismatch because they lack official websites.

Fixes:
- Dick Timmerman (person) → carpentry business
- Ria Bos (cigar maker) → money transfer agent
- Stichting Kracom (Krampuslauf) → Happy Caps retail
- Fed. Nederlandse Vertelorganisaties → NET Foundation
- Stichting dodenherdenking Alphen → wrong memorial
- Sao Joao Rotterdam → Heemraadsplein (location not org)
- sport en spel (heritage) → equipment rental
- Eiertikken Ommen → restaurant

Also adds detection and fix scripts for Google Maps false matches.
This commit is contained in:
kempersc 2026-01-08 13:26:53 +01:00
parent b2b21abe2b
commit 85d9cee82f
12 changed files with 1030 additions and 326 deletions

View file

@ -118,21 +118,29 @@ ghcid:
country_code: NL country_code: NL
geonames_id: 2759661 geonames_id: 2759661
google_maps_enrichment: google_maps_enrichment:
place_id: ChIJ9w1N5c01xkcRt6VDu57TGfE status: FALSE_MATCH
name: Timmer & Onderhoudsbedrijf Dik Lubbertsen false_match_reason: 'Google Maps returned "Timmer & Onderhoudsbedrijf Dik Lubbertsen" (carpentry business) instead of "Dick
formatted_address: Parklaan 14, 3881 CT Putten, Netherlands Timmerman" (heritage practitioner (person)). Name mismatch detected during manual review. Per Rule 40: KIEN is authoritative
fetch_timestamp: '2025-12-06T19:31:45.339848+00:00' for Type I intangible heritage custodians.'
api_status: OK original_false_match:
coordinates: place_id: ChIJ9w1N5c01xkcRt6VDu57TGfE
latitude: 52.2661407 name: Timmer & Onderhoudsbedrijf Dik Lubbertsen
longitude: 5.6104113 formatted_address: Parklaan 14, 3881 CT Putten, Netherlands
phone_international: +31 341 358 563 fetch_timestamp: '2025-12-06T19:31:45.339848+00:00'
phone_local: 0341 358 563 api_status: OK
website: http://www.lubbertsen.nl/ coordinates:
google_place_types: latitude: 52.2661407
- point_of_interest longitude: 5.6104113
- establishment phone_international: +31 341 358 563
business_status: OPERATIONAL phone_local: 0341 358 563
website: http://www.lubbertsen.nl/
google_place_types:
- point_of_interest
- establishment
business_status: OPERATIONAL
correction_timestamp: '2026-01-08T12:24:16Z'
correction_agent: opencode-claude-sonnet-4
correction_method: manual_name_mismatch_review
wikidata_enrichment: wikidata_enrichment:
status: NOT_FOUND status: NOT_FOUND
fetch_timestamp: '2025-12-06T19:35:33.940708+00:00' fetch_timestamp: '2025-12-06T19:35:33.940708+00:00'
@ -157,13 +165,11 @@ unesco_enrichment:
lon: 5.1475555556 lon: 5.1475555556
lat: 52.0853333333 lat: 52.0853333333
url: https://whc.unesco.org/en/list/965 url: https://whc.unesco.org/en/list/965
short_description: The Rietveld Schröder House in Utrecht was commissioned by short_description: The Rietveld Schröder House in Utrecht was commissioned by Ms Truus Schröder-Schräder, designed by
Ms Truus Schröder-Schräder, designed by the architect Gerrit Thomas Rietveld, the architect Gerrit Thomas Rietveld, and built in 1924. This small family house, with its interior, the flexible spatial
and built in 1924. This small family house, with its interior, the flexible arrangement, and the visual and formal qualities, was a manifesto of the ideals of the De Stijl group of artists and
spatial arrangement, and the visual and formal qualities, was a manifesto of architects in the Netherlands in the 1920s, and has since been considered one of the icons of the Modern Movement in
the ideals of the De Stijl group of artists and architects in the Netherlands architecture.
in the 1920s, and has since been considered one of the icons of the Modern Movement
in architecture.
- unesco_id: '739' - unesco_id: '739'
uuid: 46eedc7a-a087-55dc-b552-49d7cac966a2 uuid: 46eedc7a-a087-55dc-b552-49d7cac966a2
name_en: Schokland and Surroundings name_en: Schokland and Surroundings
@ -180,12 +186,10 @@ unesco_enrichment:
lon: 5.771666667 lon: 5.771666667
lat: 52.63861111 lat: 52.63861111
url: https://whc.unesco.org/en/list/739 url: https://whc.unesco.org/en/list/739
short_description: Schokland was a peninsula that by the 15th century had become short_description: Schokland was a peninsula that by the 15th century had become an island. Occupied and then abandoned
an island. Occupied and then abandoned as the sea encroached, it had to be evacuated as the sea encroached, it had to be evacuated in 1859. But following the draining of the Zuider Zee, it has, since the
in 1859. But following the draining of the Zuider Zee, it has, since the 1940s, 1940s, formed part of the land reclaimed from the sea. Schokland has vestiges of human habitation going back to prehistoric
formed part of the land reclaimed from the sea. Schokland has vestiges of human times. It symbolizes the heroic, age-old struggle of the people of the Netherlands against the encroachment of the waters.
habitation going back to prehistoric times. It symbolizes the heroic, age-old
struggle of the people of the Netherlands against the encroachment of the waters.
unesco_ich_enrichment: unesco_ich_enrichment:
country_code: NL country_code: NL
total_elements_in_country: 5 total_elements_in_country: 5
@ -198,11 +202,9 @@ unesco_ich_enrichment:
inscription_year: 2023 inscription_year: 2023
multinational: false multinational: false
url: https://ich.unesco.org/en/RL/rotterdam-summer-carnival-01870 url: https://ich.unesco.org/en/RL/rotterdam-summer-carnival-01870
description: The Rotterdam Summer Carnival is a multicultural celebration that description: The Rotterdam Summer Carnival is a multicultural celebration that unites participants from the Caribbean
unites participants from the Caribbean and European Netherlands, as well as and European Netherlands, as well as ethnic minority groups from Central and South America and Africa living in the
ethnic minority groups from Central and South America and Africa living in the Netherlands. The event includes a street parade, a brass band competition and a...
Netherlands. The event includes a street parade, a brass band competition and
a...
- unesco_ich_id: '1979' - unesco_ich_id: '1979'
name: 'Traditional irrigation: knowledge, technique, and organization' name: 'Traditional irrigation: knowledge, technique, and organization'
list_type: RL list_type: RL
@ -210,9 +212,8 @@ unesco_ich_enrichment:
inscription_year: 2023 inscription_year: 2023
multinational: true multinational: true
url: https://ich.unesco.org/en/RL/traditional-irrigation-knowledge-technique-and-organization-01979 url: https://ich.unesco.org/en/RL/traditional-irrigation-knowledge-technique-and-organization-01979
description: Traditional irrigation uses gravity and hand-made constructions such description: Traditional irrigation uses gravity and hand-made constructions such as channels and ditches to distribute
as channels and ditches to distribute water from naturally-occurring water catchment water from naturally-occurring water catchment points (such as springs, streams and glaciers) to the fields. Practitioners
points (such as springs, streams and glaciers) to the fields. Practitioners
choose specific days and periods to manually divert the water, and the... choose specific days and periods to manually divert the water, and the...
- unesco_ich_id: '1707' - unesco_ich_id: '1707'
name: Corso culture, flower and fruit parades in the Netherlands name: Corso culture, flower and fruit parades in the Netherlands
@ -221,11 +222,9 @@ unesco_ich_enrichment:
inscription_year: 2021 inscription_year: 2021
multinational: false multinational: false
url: https://ich.unesco.org/en/RL/corso-culture-flower-and-fruit-parades-in-the-netherlands-01707 url: https://ich.unesco.org/en/RL/corso-culture-flower-and-fruit-parades-in-the-netherlands-01707
description: Dating back to the late nineteenth century, a corso is an annual description: Dating back to the late nineteenth century, a corso is an annual parade of floats or boats decorated with
parade of floats or boats decorated with flowers, fruit, vegetables and, in flowers, fruit, vegetables and, in some cases, people in costumes. Originating in the south of France and Italy, the
some cases, people in costumes. Originating in the south of France and Italy, practice spread to the Netherlands in the nineteenth century. The parade take...
the practice spread to the Netherlands in the nineteenth century. The parade
take...
- unesco_ich_id: '1708' - unesco_ich_id: '1708'
name: Falconry, a living human heritage name: Falconry, a living human heritage
list_type: RL list_type: RL
@ -233,9 +232,8 @@ unesco_ich_enrichment:
inscription_year: 2021 inscription_year: 2021
multinational: true multinational: true
url: https://ich.unesco.org/en/RL/falconry-a-living-human-heritage-01708 url: https://ich.unesco.org/en/RL/falconry-a-living-human-heritage-01708
description: Falconry is the traditional art and practice of training and flying description: Falconry is the traditional art and practice of training and flying falcons (and sometimes eagles, hawks,
falcons (and sometimes eagles, hawks, buzzards and other birds of prey). It buzzards and other birds of prey). It has been practised for over 4000 years. The practice of falconry in early and
has been practised for over 4000 years. The practice of falconry in early and
medieval periods of history is documented in many parts of the world. Original... medieval periods of history is documented in many parts of the world. Original...
- unesco_ich_id: '1265' - unesco_ich_id: '1265'
name: Craft of the miller operating windmills and watermills name: Craft of the miller operating windmills and watermills
@ -244,9 +242,8 @@ unesco_ich_enrichment:
inscription_year: 2017 inscription_year: 2017
multinational: false multinational: false
url: https://ich.unesco.org/en/RL/craft-of-the-miller-operating-windmills-and-watermills-01265 url: https://ich.unesco.org/en/RL/craft-of-the-miller-operating-windmills-and-watermills-01265
description: The craft of the miller operating windmills and watermills involves description: The craft of the miller operating windmills and watermills involves the knowledge and skills necessary to
the knowledge and skills necessary to operate a mill and maintain it in a good operate a mill and maintain it in a good state of repair. With a declining number of people earning their livelihood
state of repair. With a declining number of people earning their livelihood
from the craft, millers today also play a key role in transmitting the cultur... from the craft, millers today also play a key role in transmitting the cultur...
location: location:
latitude: 52.2661407 latitude: 52.2661407
@ -274,9 +271,8 @@ crawl4ai_enrichment:
links_count: 9 links_count: 9
open_graph: open_graph:
title: Timmer & Onderhoudsbedrijf Dick Lubbertsen title: Timmer & Onderhoudsbedrijf Dick Lubbertsen
description: U bent op zoek naar een bedrijf voor uw timmer- of onderhoudsklus? description: U bent op zoek naar een bedrijf voor uw timmer- of onderhoudsklus? Wij helpen u graag! Dankzij onze brede
Wij helpen u graag! Dankzij onze brede ervaring kunnen we alle facetten van ervaring kunnen we alle facetten van een klus voor onze rekening nemen. Hierdoor bespaart u...
een klus voor onze rekening nemen. Hierdoor bespaart u...
image: http://www.lubbertsen.nl/uploads/4/9/5/7/49571465/1435164563.png image: http://www.lubbertsen.nl/uploads/4/9/5/7/49571465/1435164563.png
url: http://www.lubbertsen.nl/ url: http://www.lubbertsen.nl/
site_name: Timmer & Onderhoudsbedrijf Dick Lubbertsen site_name: Timmer & Onderhoudsbedrijf Dick Lubbertsen
@ -304,16 +300,14 @@ timespan:
events: events:
- date: '2007' - date: '2007'
type: founding type: founding
description: is opgericht onder auspiciën van de gemeente Renkum en in samenwerking description: is opgericht onder auspiciën van de gemeente Renkum en in samenwerking met lokale instanties
met lokale instanties
timeline_enrichment: timeline_enrichment:
timeline_events: timeline_events:
- event_type: FOUNDING - event_type: FOUNDING
event_date: '2007' event_date: '2007'
date_precision: year date_precision: year
approximate: false approximate: false
description: is opgericht onder auspiciën van de gemeente Renkum en in samenwerking description: is opgericht onder auspiciën van de gemeente Renkum en in samenwerking met lokale instanties
met lokale instanties
source_urls: source_urls:
- https://www.timmerman-nu.nl/arnhem/ - https://www.timmerman-nu.nl/arnhem/
- https://www.werkspot.nl/timmerwerken/timmerman-vakmannen/arnhem - https://www.werkspot.nl/timmerwerken/timmerman-vakmannen/arnhem
@ -321,13 +315,11 @@ timeline_enrichment:
- https://sb-bouw.com/timmerman-arnhem/ - https://sb-bouw.com/timmerman-arnhem/
- https://www.klusup.nl/timmerman/arnhem - https://www.klusup.nl/timmerman/arnhem
linkup_query: '"Dick Timmerman" Arnhem opgericht OR gesticht OR sinds' linkup_query: '"Dick Timmerman" Arnhem opgericht OR gesticht OR sinds'
linkup_answer: Dick Timmerman uit Arnhem is betrokken bij een groep die is opgericht linkup_answer: Dick Timmerman uit Arnhem is betrokken bij een groep die is opgericht rond het zoeken naar vermiste militairen
rond het zoeken naar vermiste militairen van de Slag om Arnhem. Deze groep, van de Slag om Arnhem. Deze groep, bestaande uit Hans Timmerman, zijn broer Dick en David van Buggenum, is opgericht
bestaande uit Hans Timmerman, zijn broer Dick en David van Buggenum, is opgericht onder auspiciën van de gemeente Renkum en in samenwerking met lokale instanties. De oprichting van deze groep vond plaats
onder auspiciën van de gemeente Renkum en in samenwerking met lokale instanties. vóór 2007, aangezien er in 2007 en 2008 al zoekacties werden uitgevoerd. Er is geen specifieke oprichtingsdatum van
De oprichting van deze groep vond plaats vóór 2007, aangezien er in 2007 en een timmerbedrijf of ander bedrijf van Dick Timmerman in Arnhem vermeld.
2008 al zoekacties werden uitgevoerd. Er is geen specifieke oprichtingsdatum
van een timmerbedrijf of ander bedrijf van Dick Timmerman in Arnhem vermeld.
fetch_timestamp: '2025-12-15T17:21:48.150538+00:00' fetch_timestamp: '2025-12-15T17:21:48.150538+00:00'
archive_path: web/1703/linkup/linkup_founding_20251215T172148Z.json archive_path: web/1703/linkup/linkup_founding_20251215T172148Z.json
extraction_method: linkup_answer_regex extraction_method: linkup_answer_regex

View file

@ -120,21 +120,29 @@ ghcid:
distance_km: 0.0 distance_km: 0.0
geonames_id: 2749503 geonames_id: 2749503
google_maps_enrichment: google_maps_enrichment:
place_id: ChIJc3ARj3DHx0cRCYlrOyxPl4U status: FALSE_MATCH
name: Damu Sport en Spel Verhuur false_match_reason: 'Google Maps returned "Damu Sport en Spel Verhuur" (sports equipment rental business) instead of "sport
formatted_address: Kanaal Noord 145, 7317 AB Apeldoorn, Netherlands en spel" (traditional games heritage organization). Name mismatch detected during manual review. Per Rule 40: KIEN is
fetch_timestamp: '2025-12-06T19:32:03.990098+00:00' authoritative for Type I intangible heritage custodians.'
api_status: OK original_false_match:
coordinates: place_id: ChIJc3ARj3DHx0cRCYlrOyxPl4U
latitude: 52.221916 name: Damu Sport en Spel Verhuur
longitude: 5.972760200000001 formatted_address: Kanaal Noord 145, 7317 AB Apeldoorn, Netherlands
phone_international: +31 55 542 3300 fetch_timestamp: '2025-12-06T19:32:03.990098+00:00'
phone_local: 055 542 3300 api_status: OK
website: http://www.damu-verhuur.nl/ coordinates:
google_place_types: latitude: 52.221916
- point_of_interest longitude: 5.972760200000001
- establishment phone_international: +31 55 542 3300
business_status: OPERATIONAL phone_local: 055 542 3300
website: http://www.damu-verhuur.nl/
google_place_types:
- point_of_interest
- establishment
business_status: OPERATIONAL
correction_timestamp: '2026-01-08T12:24:17Z'
correction_agent: opencode-claude-sonnet-4
correction_method: manual_name_mismatch_review
wikidata_enrichment: wikidata_enrichment:
wikidata_entity_id: Q131420360 wikidata_entity_id: Q131420360
api_metadata: api_metadata:
@ -166,8 +174,7 @@ wikidata_enrichment:
instance_of: &id001 instance_of: &id001
- id: Q59861107 - id: Q59861107
label: temporary art exhibition label: temporary art exhibition
description: organized presentation and display of a selection of works of art, description: organized presentation and display of a selection of works of art, with an expected end date
with an expected end date
wikidata_instance_of: *id001 wikidata_instance_of: *id001
wikidata_location: wikidata_location:
location: location:
@ -194,12 +201,10 @@ unesco_enrichment:
lon: 5.771666667 lon: 5.771666667
lat: 52.63861111 lat: 52.63861111
url: https://whc.unesco.org/en/list/739 url: https://whc.unesco.org/en/list/739
short_description: Schokland was a peninsula that by the 15th century had become short_description: Schokland was a peninsula that by the 15th century had become an island. Occupied and then abandoned
an island. Occupied and then abandoned as the sea encroached, it had to be evacuated as the sea encroached, it had to be evacuated in 1859. But following the draining of the Zuider Zee, it has, since the
in 1859. But following the draining of the Zuider Zee, it has, since the 1940s, 1940s, formed part of the land reclaimed from the sea. Schokland has vestiges of human habitation going back to prehistoric
formed part of the land reclaimed from the sea. Schokland has vestiges of human times. It symbolizes the heroic, age-old struggle of the people of the Netherlands against the encroachment of the waters.
habitation going back to prehistoric times. It symbolizes the heroic, age-old
struggle of the people of the Netherlands against the encroachment of the waters.
unesco_ich_enrichment: unesco_ich_enrichment:
country_code: NL country_code: NL
total_elements_in_country: 5 total_elements_in_country: 5
@ -212,11 +217,9 @@ unesco_ich_enrichment:
inscription_year: 2023 inscription_year: 2023
multinational: false multinational: false
url: https://ich.unesco.org/en/RL/rotterdam-summer-carnival-01870 url: https://ich.unesco.org/en/RL/rotterdam-summer-carnival-01870
description: The Rotterdam Summer Carnival is a multicultural celebration that description: The Rotterdam Summer Carnival is a multicultural celebration that unites participants from the Caribbean
unites participants from the Caribbean and European Netherlands, as well as and European Netherlands, as well as ethnic minority groups from Central and South America and Africa living in the
ethnic minority groups from Central and South America and Africa living in the Netherlands. The event includes a street parade, a brass band competition and a...
Netherlands. The event includes a street parade, a brass band competition and
a...
- unesco_ich_id: '1979' - unesco_ich_id: '1979'
name: 'Traditional irrigation: knowledge, technique, and organization' name: 'Traditional irrigation: knowledge, technique, and organization'
list_type: RL list_type: RL
@ -224,9 +227,8 @@ unesco_ich_enrichment:
inscription_year: 2023 inscription_year: 2023
multinational: true multinational: true
url: https://ich.unesco.org/en/RL/traditional-irrigation-knowledge-technique-and-organization-01979 url: https://ich.unesco.org/en/RL/traditional-irrigation-knowledge-technique-and-organization-01979
description: Traditional irrigation uses gravity and hand-made constructions such description: Traditional irrigation uses gravity and hand-made constructions such as channels and ditches to distribute
as channels and ditches to distribute water from naturally-occurring water catchment water from naturally-occurring water catchment points (such as springs, streams and glaciers) to the fields. Practitioners
points (such as springs, streams and glaciers) to the fields. Practitioners
choose specific days and periods to manually divert the water, and the... choose specific days and periods to manually divert the water, and the...
- unesco_ich_id: '1707' - unesco_ich_id: '1707'
name: Corso culture, flower and fruit parades in the Netherlands name: Corso culture, flower and fruit parades in the Netherlands
@ -235,11 +237,9 @@ unesco_ich_enrichment:
inscription_year: 2021 inscription_year: 2021
multinational: false multinational: false
url: https://ich.unesco.org/en/RL/corso-culture-flower-and-fruit-parades-in-the-netherlands-01707 url: https://ich.unesco.org/en/RL/corso-culture-flower-and-fruit-parades-in-the-netherlands-01707
description: Dating back to the late nineteenth century, a corso is an annual description: Dating back to the late nineteenth century, a corso is an annual parade of floats or boats decorated with
parade of floats or boats decorated with flowers, fruit, vegetables and, in flowers, fruit, vegetables and, in some cases, people in costumes. Originating in the south of France and Italy, the
some cases, people in costumes. Originating in the south of France and Italy, practice spread to the Netherlands in the nineteenth century. The parade take...
the practice spread to the Netherlands in the nineteenth century. The parade
take...
- unesco_ich_id: '1708' - unesco_ich_id: '1708'
name: Falconry, a living human heritage name: Falconry, a living human heritage
list_type: RL list_type: RL
@ -247,9 +247,8 @@ unesco_ich_enrichment:
inscription_year: 2021 inscription_year: 2021
multinational: true multinational: true
url: https://ich.unesco.org/en/RL/falconry-a-living-human-heritage-01708 url: https://ich.unesco.org/en/RL/falconry-a-living-human-heritage-01708
description: Falconry is the traditional art and practice of training and flying description: Falconry is the traditional art and practice of training and flying falcons (and sometimes eagles, hawks,
falcons (and sometimes eagles, hawks, buzzards and other birds of prey). It buzzards and other birds of prey). It has been practised for over 4000 years. The practice of falconry in early and
has been practised for over 4000 years. The practice of falconry in early and
medieval periods of history is documented in many parts of the world. Original... medieval periods of history is documented in many parts of the world. Original...
- unesco_ich_id: '1265' - unesco_ich_id: '1265'
name: Craft of the miller operating windmills and watermills name: Craft of the miller operating windmills and watermills
@ -258,9 +257,8 @@ unesco_ich_enrichment:
inscription_year: 2017 inscription_year: 2017
multinational: false multinational: false
url: https://ich.unesco.org/en/RL/craft-of-the-miller-operating-windmills-and-watermills-01265 url: https://ich.unesco.org/en/RL/craft-of-the-miller-operating-windmills-and-watermills-01265
description: The craft of the miller operating windmills and watermills involves description: The craft of the miller operating windmills and watermills involves the knowledge and skills necessary to
the knowledge and skills necessary to operate a mill and maintain it in a good operate a mill and maintain it in a good state of repair. With a declining number of people earning their livelihood
state of repair. With a declining number of people earning their livelihood
from the craft, millers today also play a key role in transmitting the cultur... from the craft, millers today also play a key role in transmitting the cultur...
location: location:
latitude: 52.221916 latitude: 52.221916
@ -295,8 +293,8 @@ digital_platform_v2:
platform_name: 'Sport- en spelmaterialen: bekijk ons complete assortiment Website' platform_name: 'Sport- en spelmaterialen: bekijk ons complete assortiment Website'
platform_url: https://tebe.nl/productgroep/sport-en-spel/ platform_url: https://tebe.nl/productgroep/sport-en-spel/
platform_type: DISCOVERY_PORTAL platform_type: DISCOVERY_PORTAL
description: Sport- en spelactiviteiten organiseren? TéBé Evenementen verhuurt description: Sport- en spelactiviteiten organiseren? TéBé Evenementen verhuurt sport- en spelmaterialen. Bekijk of reserveer
sport- en spelmaterialen. Bekijk of reserveer hier. hier.
language: nl language: nl
og_image: https://tebe.nl/wp-content/uploads/2016/09/Springkussen-Clown-huren-TeBe-2-250x188.jpg og_image: https://tebe.nl/wp-content/uploads/2016/09/Springkussen-Clown-huren-TeBe-2-250x188.jpg
favicon: https://tebe.nl/wp-content/themes/tebe/img/icons/favicon.ico favicon: https://tebe.nl/wp-content/themes/tebe/img/icons/favicon.ico
@ -324,8 +322,8 @@ logo_enrichment:
- claim_type: logo_url - claim_type: logo_url
claim_value: https://tebe.nl/wp-content/themes/tebe/img/logo-tebe-evenementen-service-en-partyverhuur-apeldoorn.png claim_value: https://tebe.nl/wp-content/themes/tebe/img/logo-tebe-evenementen-service-en-partyverhuur-apeldoorn.png
source_url: http://www.damu-verhuur.nl source_url: http://www.damu-verhuur.nl
css_selector: '[document] > html.js.flexbox > body.home.wp-singular > div.wrapper:nth-of-type(3) css_selector: '[document] > html.js.flexbox > body.home.wp-singular > div.wrapper:nth-of-type(3) > header > div.mobile-logo
> header > div.mobile-logo > a > img' > a > img'
retrieved_on: '2025-12-21T20:54:33.883595+00:00' retrieved_on: '2025-12-21T20:54:33.883595+00:00'
extraction_method: crawl4ai_header_logo extraction_method: crawl4ai_header_logo
detection_confidence: high detection_confidence: high

View file

@ -120,25 +120,33 @@ ghcid:
distance_km: 0.0 distance_km: 0.0
geonames_id: 2753358 geonames_id: 2753358
google_maps_enrichment: google_maps_enrichment:
place_id: ChIJ_ZtDzyDHx0cRIw-S4I8eCik status: FALSE_MATCH
name: Ria Money Transfer Agent false_match_reason: 'Google Maps returned "Ria Money Transfer Agent" (money transfer business) instead of "Ria Bos" (traditional
formatted_address: RepairPhone, Asselsestraat 26, 7311 EM Apeldoorn, Netherlands cigar maker (person)). Name mismatch detected during manual review. Per Rule 40: KIEN is authoritative for Type I intangible
fetch_timestamp: '2025-12-06T19:32:56.963775+00:00' heritage custodians.'
api_status: OK original_false_match:
coordinates: place_id: ChIJ_ZtDzyDHx0cRIw-S4I8eCik
latitude: 52.214168799999996 name: Ria Money Transfer Agent
longitude: 5.958730999999999 formatted_address: RepairPhone, Asselsestraat 26, 7311 EM Apeldoorn, Netherlands
phone_international: +31 55 785 0896 fetch_timestamp: '2025-12-06T19:32:56.963775+00:00'
phone_local: 055 785 0896 api_status: OK
website: https://www.riamoneytransfer.com/en-nl/ coordinates:
google_place_types: latitude: 52.214168799999996
- finance longitude: 5.958730999999999
- point_of_interest phone_international: +31 55 785 0896
- establishment phone_local: 055 785 0896
business_status: OPERATIONAL website: https://www.riamoneytransfer.com/en-nl/
rating: 2.8 google_place_types:
user_rating_count: 6 - finance
photo_count: 1 - point_of_interest
- establishment
business_status: OPERATIONAL
rating: 2.8
user_rating_count: 6
photo_count: 1
correction_timestamp: '2026-01-08T12:24:16Z'
correction_agent: opencode-claude-sonnet-4
correction_method: manual_name_mismatch_review
wikidata_enrichment: wikidata_enrichment:
wikidata_entity_id: Q97774077 wikidata_entity_id: Q97774077
api_metadata: api_metadata:
@ -214,8 +222,7 @@ wikidata_enrichment:
instance_of: &id001 instance_of: &id001
- id: Q5 - id: Q5
label: human label: human
description: any single member of Homo sapiens, unique extant species of the description: any single member of Homo sapiens, unique extant species of the genus Homo
genus Homo
wikidata_instance_of: *id001 wikidata_instance_of: *id001
location: location:
latitude: 52.214168799999996 latitude: 52.214168799999996
@ -247,15 +254,12 @@ digital_platform_v2:
source_status_code: 200 source_status_code: 200
primary_platform: primary_platform:
platform_id: primary_website_riamoneytransfer_com platform_id: primary_website_riamoneytransfer_com
platform_name: Send Money Online Quickly & Securely to Over 190 Countries | Ria platform_name: Send Money Online Quickly & Securely to Over 190 Countries | Ria Money Transfer - Netherlands Website
Money Transfer - Netherlands Website
platform_url: https://www.riamoneytransfer.com/en-nl/ platform_url: https://www.riamoneytransfer.com/en-nl/
platform_type: INSTITUTIONAL_WEBSITE platform_type: INSTITUTIONAL_WEBSITE
description: Send money online from your mobile device in Netherlands with the description: Send money online from your mobile device in Netherlands with the Ria Money Transfer app. Safely and quickly
Ria Money Transfer app. Safely and quickly remit money to 190+ countries in remit money to 190+ countries in our network, with over 600,000 partner locations. With receiving options including
our network, with over 600,000 partner locations. With receiving options including cash pickup, bank deposit, mobile wallets, and home delivery, we make receiving money simple.
cash pickup, bank deposit, mobile wallets, and home delivery, we make receiving
money simple.
language: en language: en
og_image: https://www.riamoneytransfer.com/meta-image.png og_image: https://www.riamoneytransfer.com/meta-image.png
favicon: https://www.riamoneytransfer.com/favicon.ico favicon: https://www.riamoneytransfer.com/favicon.ico

View file

@ -103,8 +103,7 @@ ghcid:
- ghcid: NL-OV-OMM-I-EO - ghcid: NL-OV-OMM-I-EO
ghcid_numeric: 12419799121087638065 ghcid_numeric: 12419799121087638065
valid_from: '2025-12-14T21:40:38.654382+00:00' valid_from: '2025-12-14T21:40:38.654382+00:00'
reason: 'Type corrected: intangible_heritage_custodian should use type I (Intangible reason: 'Type corrected: intangible_heritage_custodian should use type I (Intangible Heritage), not U (Unknown)'
Heritage), not U (Unknown)'
- ghcid: NL-OV-OMM-U-EO - ghcid: NL-OV-OMM-U-EO
ghcid_numeric: 14519261499902116425 ghcid_numeric: 14519261499902116425
valid_from: '2025-12-06T23:52:48.611395+00:00' valid_from: '2025-12-06T23:52:48.611395+00:00'
@ -129,31 +128,39 @@ ghcid:
resolution_date: '2025-12-06T23:52:48.611395+00:00' resolution_date: '2025-12-06T23:52:48.611395+00:00'
geonames_id: 2759661 geonames_id: 2759661
google_maps_enrichment: google_maps_enrichment:
place_id: ChIJmzW-m0_9x0cReZydPligYBI status: FALSE_MATCH
name: Restaurant Ekkelenkamp Ommen false_match_reason: 'Google Maps returned "Restaurant Ekkelenkamp Ommen" (restaurant) instead of "Eiertikken Ommen" (traditional
formatted_address: Stationsweg 1, 7731 AW Ommen, Netherlands egg-tapping game heritage). Name mismatch detected during manual review. Per Rule 40: KIEN is authoritative for Type I
fetch_timestamp: '2025-12-06T19:31:45.957934+00:00' intangible heritage custodians.'
api_status: OK original_false_match:
coordinates: place_id: ChIJmzW-m0_9x0cReZydPligYBI
latitude: 52.515932 name: Restaurant Ekkelenkamp Ommen
longitude: 6.4226101 formatted_address: Stationsweg 1, 7731 AW Ommen, Netherlands
phone_international: +31 529 451 782 fetch_timestamp: '2025-12-06T19:31:45.957934+00:00'
phone_local: 0529 451 782 api_status: OK
website: http://www.ekkelenkamp-ommen.nl/ coordinates:
google_place_types: latitude: 52.515932
- restaurant longitude: 6.4226101
- ice_cream_shop phone_international: +31 529 451 782
- dessert_shop phone_local: 0529 451 782
- confectionery website: http://www.ekkelenkamp-ommen.nl/
- food_store google_place_types:
- food - restaurant
- point_of_interest - ice_cream_shop
- store - dessert_shop
- establishment - confectionery
business_status: OPERATIONAL - food_store
rating: 4.5 - food
user_rating_count: 2482 - point_of_interest
photo_count: 10 - store
- establishment
business_status: OPERATIONAL
rating: 4.5
user_rating_count: 2482
photo_count: 10
correction_timestamp: '2026-01-08T12:24:17Z'
correction_agent: opencode-claude-sonnet-4
correction_method: manual_name_mismatch_review
wikidata_enrichment: wikidata_enrichment:
status: NOT_FOUND status: NOT_FOUND
fetch_timestamp: '2025-12-06T19:35:34.794723+00:00' fetch_timestamp: '2025-12-06T19:35:34.794723+00:00'
@ -178,12 +185,10 @@ unesco_enrichment:
lon: 5.771666667 lon: 5.771666667
lat: 52.63861111 lat: 52.63861111
url: https://whc.unesco.org/en/list/739 url: https://whc.unesco.org/en/list/739
short_description: Schokland was a peninsula that by the 15th century had become short_description: Schokland was a peninsula that by the 15th century had become an island. Occupied and then abandoned
an island. Occupied and then abandoned as the sea encroached, it had to be evacuated as the sea encroached, it had to be evacuated in 1859. But following the draining of the Zuider Zee, it has, since the
in 1859. But following the draining of the Zuider Zee, it has, since the 1940s, 1940s, formed part of the land reclaimed from the sea. Schokland has vestiges of human habitation going back to prehistoric
formed part of the land reclaimed from the sea. Schokland has vestiges of human times. It symbolizes the heroic, age-old struggle of the people of the Netherlands against the encroachment of the waters.
habitation going back to prehistoric times. It symbolizes the heroic, age-old
struggle of the people of the Netherlands against the encroachment of the waters.
unesco_ich_enrichment: unesco_ich_enrichment:
country_code: NL country_code: NL
total_elements_in_country: 5 total_elements_in_country: 5
@ -196,11 +201,9 @@ unesco_ich_enrichment:
inscription_year: 2023 inscription_year: 2023
multinational: false multinational: false
url: https://ich.unesco.org/en/RL/rotterdam-summer-carnival-01870 url: https://ich.unesco.org/en/RL/rotterdam-summer-carnival-01870
description: The Rotterdam Summer Carnival is a multicultural celebration that description: The Rotterdam Summer Carnival is a multicultural celebration that unites participants from the Caribbean
unites participants from the Caribbean and European Netherlands, as well as and European Netherlands, as well as ethnic minority groups from Central and South America and Africa living in the
ethnic minority groups from Central and South America and Africa living in the Netherlands. The event includes a street parade, a brass band competition and a...
Netherlands. The event includes a street parade, a brass band competition and
a...
- unesco_ich_id: '1979' - unesco_ich_id: '1979'
name: 'Traditional irrigation: knowledge, technique, and organization' name: 'Traditional irrigation: knowledge, technique, and organization'
list_type: RL list_type: RL
@ -208,9 +211,8 @@ unesco_ich_enrichment:
inscription_year: 2023 inscription_year: 2023
multinational: true multinational: true
url: https://ich.unesco.org/en/RL/traditional-irrigation-knowledge-technique-and-organization-01979 url: https://ich.unesco.org/en/RL/traditional-irrigation-knowledge-technique-and-organization-01979
description: Traditional irrigation uses gravity and hand-made constructions such description: Traditional irrigation uses gravity and hand-made constructions such as channels and ditches to distribute
as channels and ditches to distribute water from naturally-occurring water catchment water from naturally-occurring water catchment points (such as springs, streams and glaciers) to the fields. Practitioners
points (such as springs, streams and glaciers) to the fields. Practitioners
choose specific days and periods to manually divert the water, and the... choose specific days and periods to manually divert the water, and the...
- unesco_ich_id: '1707' - unesco_ich_id: '1707'
name: Corso culture, flower and fruit parades in the Netherlands name: Corso culture, flower and fruit parades in the Netherlands
@ -219,11 +221,9 @@ unesco_ich_enrichment:
inscription_year: 2021 inscription_year: 2021
multinational: false multinational: false
url: https://ich.unesco.org/en/RL/corso-culture-flower-and-fruit-parades-in-the-netherlands-01707 url: https://ich.unesco.org/en/RL/corso-culture-flower-and-fruit-parades-in-the-netherlands-01707
description: Dating back to the late nineteenth century, a corso is an annual description: Dating back to the late nineteenth century, a corso is an annual parade of floats or boats decorated with
parade of floats or boats decorated with flowers, fruit, vegetables and, in flowers, fruit, vegetables and, in some cases, people in costumes. Originating in the south of France and Italy, the
some cases, people in costumes. Originating in the south of France and Italy, practice spread to the Netherlands in the nineteenth century. The parade take...
the practice spread to the Netherlands in the nineteenth century. The parade
take...
- unesco_ich_id: '1708' - unesco_ich_id: '1708'
name: Falconry, a living human heritage name: Falconry, a living human heritage
list_type: RL list_type: RL
@ -231,9 +231,8 @@ unesco_ich_enrichment:
inscription_year: 2021 inscription_year: 2021
multinational: true multinational: true
url: https://ich.unesco.org/en/RL/falconry-a-living-human-heritage-01708 url: https://ich.unesco.org/en/RL/falconry-a-living-human-heritage-01708
description: Falconry is the traditional art and practice of training and flying description: Falconry is the traditional art and practice of training and flying falcons (and sometimes eagles, hawks,
falcons (and sometimes eagles, hawks, buzzards and other birds of prey). It buzzards and other birds of prey). It has been practised for over 4000 years. The practice of falconry in early and
has been practised for over 4000 years. The practice of falconry in early and
medieval periods of history is documented in many parts of the world. Original... medieval periods of history is documented in many parts of the world. Original...
- unesco_ich_id: '1265' - unesco_ich_id: '1265'
name: Craft of the miller operating windmills and watermills name: Craft of the miller operating windmills and watermills
@ -242,9 +241,8 @@ unesco_ich_enrichment:
inscription_year: 2017 inscription_year: 2017
multinational: false multinational: false
url: https://ich.unesco.org/en/RL/craft-of-the-miller-operating-windmills-and-watermills-01265 url: https://ich.unesco.org/en/RL/craft-of-the-miller-operating-windmills-and-watermills-01265
description: The craft of the miller operating windmills and watermills involves description: The craft of the miller operating windmills and watermills involves the knowledge and skills necessary to
the knowledge and skills necessary to operate a mill and maintain it in a good operate a mill and maintain it in a good state of repair. With a declining number of people earning their livelihood
state of repair. With a declining number of people earning their livelihood
from the craft, millers today also play a key role in transmitting the cultur... from the craft, millers today also play a key role in transmitting the cultur...
location: location:
latitude: 52.515932 latitude: 52.515932
@ -279,8 +277,7 @@ digital_platform_v2:
platform_name: Restaurant Ekkelenkamp Ommen | Restaurant en IJssalon Website platform_name: Restaurant Ekkelenkamp Ommen | Restaurant en IJssalon Website
platform_url: https://www.ekkelenkamp-ommen.nl/ platform_url: https://www.ekkelenkamp-ommen.nl/
platform_type: INSTITUTIONAL_WEBSITE platform_type: INSTITUTIONAL_WEBSITE
description: Kom genieten van lunch, diner, heerlijke koffie en natuurlijk ons description: Kom genieten van lunch, diner, heerlijke koffie en natuurlijk ons welbekende ijs!
welbekende ijs!
language: nl language: nl
og_image: null og_image: null
favicon: https://www.ekkelenkamp-ommen.nl/wp-content/uploads/2025/07/favicon-300x300.png favicon: https://www.ekkelenkamp-ommen.nl/wp-content/uploads/2025/07/favicon-300x300.png

View file

@ -107,24 +107,32 @@ ghcid:
distance_km: 0.07428445760936703 distance_km: 0.07428445760936703
geonames_id: 2745912 geonames_id: 2745912
google_maps_enrichment: google_maps_enrichment:
place_id: ChIJD_OoDEK4x0cRJVl5FEdQLyM status: FALSE_MATCH
name: NET Foundation false_match_reason: 'Google Maps returned "NET Foundation" (different foundation) instead of "Federatie Nederlandse Vertelorganisaties"
formatted_address: Laan van Westenenk 12, 7336 AZ Apeldoorn, Netherlands (Dutch storytelling federation). Name mismatch detected during manual review. Per Rule 40: KIEN is authoritative for Type
fetch_timestamp: '2025-12-06T19:33:10.001718+00:00' I intangible heritage custodians.'
api_status: OK original_false_match:
coordinates: place_id: ChIJD_OoDEK4x0cRJVl5FEdQLyM
latitude: 52.190509299999995 name: NET Foundation
longitude: 5.9380245 formatted_address: Laan van Westenenk 12, 7336 AZ Apeldoorn, Netherlands
phone_international: +31 55 200 0236 fetch_timestamp: '2025-12-06T19:33:10.001718+00:00'
phone_local: 055 200 0236 api_status: OK
website: http://netfoundation.nl/ coordinates:
google_place_types: latitude: 52.190509299999995
- point_of_interest longitude: 5.9380245
- establishment phone_international: +31 55 200 0236
business_status: OPERATIONAL phone_local: 055 200 0236
rating: 4.8 website: http://netfoundation.nl/
user_rating_count: 4 google_place_types:
photo_count: 2 - point_of_interest
- establishment
business_status: OPERATIONAL
rating: 4.8
user_rating_count: 4
photo_count: 2
correction_timestamp: '2026-01-08T12:24:17Z'
correction_agent: opencode-claude-sonnet-4
correction_method: manual_name_mismatch_review
wikidata_enrichment: wikidata_enrichment:
status: NOT_FOUND status: NOT_FOUND
fetch_timestamp: '2025-12-06T19:41:17.465971+00:00' fetch_timestamp: '2025-12-06T19:41:17.465971+00:00'
@ -165,15 +173,13 @@ digital_platform_v2:
founding_context: Founded at Vertel Event 2019 in Culemborg founding_context: Founded at Vertel Event 2019 in Culemborg
data_quality_notes: data_quality_notes:
google_maps_status: CONFLATED google_maps_status: CONFLATED
google_maps_issue: 'Google Maps returned "NET Foundation" in Apeldoorn (place_id: google_maps_issue: 'Google Maps returned "NET Foundation" in Apeldoorn (place_id: ChIJD_OoDEK4x0cRJVl5FEdQLyM), which
ChIJD_OoDEK4x0cRJVl5FEdQLyM), which is a completely different organization. is a completely different organization. The correct address is Biltstraat 166, 3572 BP Utrecht, as confirmed by KIEN
The correct address is Biltstraat 166, 3572 BP Utrecht, as confirmed by KIEN
registry. Coordinates in location block are WRONG.' registry. Coordinates in location block are WRONG.'
wikidata_status: NOT_FOUND wikidata_status: NOT_FOUND
correct_address: Biltstraat 166, 3572 BP Utrecht correct_address: Biltstraat 166, 3572 BP Utrecht
coordinate_warning: The location.latitude/longitude values (52.190509, 5.938024) coordinate_warning: The location.latitude/longitude values (52.190509, 5.938024) point to Apeldoorn, not Utrecht. These
point to Apeldoorn, not Utrecht. These coordinates are from the conflated Google coordinates are from the conflated Google Maps result and should NOT be used for mapping this organization.
Maps result and should NOT be used for mapping this organization.
intangible_heritage: intangible_heritage:
heritage_form_name: Verhalen Vertellen heritage_form_name: Verhalen Vertellen
heritage_form_name_en: Storytelling heritage_form_name_en: Storytelling
@ -190,11 +196,9 @@ digital_platform_v2:
organization_profile: organization_profile:
organization_type: federation organization_type: federation
scope: national scope: national
description: The Federatie Nederlandse Vertelorganisaties (Federation of Dutch description: The Federatie Nederlandse Vertelorganisaties (Federation of Dutch Storytelling Organizations) is an umbrella
Storytelling Organizations) is an umbrella organization uniting major Dutch organization uniting major Dutch storytelling organizations. Founded in 2019, it aims to contribute to the emancipation
storytelling organizations. Founded in 2019, it aims to contribute to the emancipation of storytelling (verhalen vertellen), both artistically and as applied art, within Dutch society.
of storytelling (verhalen vertellen), both artistically and as applied art,
within Dutch society.
mission_goals: mission_goals:
- Recognition of storytelling as a theater genre - Recognition of storytelling as a theater genre
- Lobbying cultural funds and Ministry of OC&W - Lobbying cultural funds and Ministry of OC&W
@ -259,9 +263,8 @@ digital_platform_v2:
provenance: provenance:
research_date: '2025-12-15T16:30:00+00:00' research_date: '2025-12-15T16:30:00+00:00'
research_agent: claude-opus-4 research_agent: claude-opus-4
research_notes: Research confirmed Google Maps conflation issue - returned completely research_notes: Research confirmed Google Maps conflation issue - returned completely wrong organization (NET Foundation
wrong organization (NET Foundation in Apeldoorn). Correct data sourced from in Apeldoorn). Correct data sourced from KIEN registry and organization website. Federation founded 2019, unites 8 major
KIEN registry and organization website. Federation founded 2019, unites 8 major
Dutch storytelling organizations. Dutch storytelling organizations.
data_sources: data_sources:
- source_type: institutional_registry - source_type: institutional_registry

View file

@ -28,8 +28,7 @@ provenance:
linkup_timespan: linkup_timespan:
- source_type: linkup_web_search - source_type: linkup_web_search
fetch_timestamp: '2025-12-15T22:09:47.438623+00:00' fetch_timestamp: '2025-12-15T22:09:47.438623+00:00'
search_query: '"Dodenherdenking Alphen" Alphen aan den Rijn opgericht OR gesticht search_query: '"Dodenherdenking Alphen" Alphen aan den Rijn opgericht OR gesticht OR sinds'
OR sinds'
source_urls: source_urls:
- https://www.alphens.nl/nieuws/dodenherdenking-2025-in-alphen-aan-den-rijn.html - https://www.alphens.nl/nieuws/dodenherdenking-2025-in-alphen-aan-den-rijn.html
- https://www.alphens.nl/nieuws/dodenherdenking-2024-in-alphen-aan-den-rijn.html - https://www.alphens.nl/nieuws/dodenherdenking-2024-in-alphen-aan-den-rijn.html
@ -50,8 +49,7 @@ provenance:
- Entry created from KIEN (Kenniscentrum Immaterieel Erfgoed Nederland) registry - Entry created from KIEN (Kenniscentrum Immaterieel Erfgoed Nederland) registry
- Intangible heritage custodian organization - Intangible heritage custodian organization
- 'safeguards slot added 2025-12-05T09:07:10.732807+00:00: linked to 1 IntangibleHeritageForm(s)' - 'safeguards slot added 2025-12-05T09:07:10.732807+00:00: linked to 1 IntangibleHeritageForm(s)'
- Location extracted from organization name 'Stichting dodenherdenking Alphen' - - Location extracted from organization name 'Stichting dodenherdenking Alphen' - matched place 'Alphen aan den Rijn' (NAME_EXTRACTION_GEONAMES)
matched place 'Alphen aan den Rijn' (NAME_EXTRACTION_GEONAMES)
- Canonical location added via normalize_custodian_files.py on 2025-12-08T23:19:43Z - Canonical location added via normalize_custodian_files.py on 2025-12-08T23:19:43Z
- Canonical location added via normalize_custodian_files.py on 2025-12-09T07:10:52Z - Canonical location added via normalize_custodian_files.py on 2025-12-09T07:10:52Z
kien_enrichment: kien_enrichment:
@ -137,23 +135,31 @@ ghcid:
distance_km: 0.0 distance_km: 0.0
geonames_id: 2759875 geonames_id: 2759875
google_maps_enrichment: google_maps_enrichment:
place_id: ChIJrZf_p9m5xUcRgJU1bZQIuQw status: FALSE_MATCH
name: Waalsdorpervlakte Bourdon Bell false_match_reason: 'Google Maps returned "Waalsdorpervlakte Bourdon Bell" (different memorial in different location) instead
formatted_address: 2244 AJ Wassenaar, Netherlands of "Stichting dodenherdenking Alphen" (memorial foundation Alphen aan den Rijn). Name mismatch detected during manual
fetch_timestamp: '2025-12-06T19:33:17.179987+00:00' review. Per Rule 40: KIEN is authoritative for Type I intangible heritage custodians.'
api_status: OK original_false_match:
coordinates: place_id: ChIJrZf_p9m5xUcRgJU1bZQIuQw
latitude: 52.115082099999995 name: Waalsdorpervlakte Bourdon Bell
longitude: 4.3364664 formatted_address: 2244 AJ Wassenaar, Netherlands
website: https://www.erepeloton.nl/ fetch_timestamp: '2025-12-06T19:33:17.179987+00:00'
google_place_types: api_status: OK
- monument coordinates:
- point_of_interest latitude: 52.115082099999995
- establishment longitude: 4.3364664
business_status: OPERATIONAL website: https://www.erepeloton.nl/
rating: 4.6 google_place_types:
user_rating_count: 628 - monument
photo_count: 10 - point_of_interest
- establishment
business_status: OPERATIONAL
rating: 4.6
user_rating_count: 628
photo_count: 10
correction_timestamp: '2026-01-08T12:24:17Z'
correction_agent: opencode-claude-sonnet-4
correction_method: manual_name_mismatch_review
wikidata_enrichment: wikidata_enrichment:
status: NOT_FOUND status: NOT_FOUND
fetch_timestamp: '2025-12-06T19:41:47.754154+00:00' fetch_timestamp: '2025-12-06T19:41:47.754154+00:00'
@ -191,10 +197,9 @@ digital_platform_v2:
platform_name: Home - Erepeloton Waalsdorp Website platform_name: Home - Erepeloton Waalsdorp Website
platform_url: https://erepeloton.nl/ platform_url: https://erepeloton.nl/
platform_type: DISCOVERY_PORTAL platform_type: DISCOVERY_PORTAL
description: 'Helpt u mee?Het Erepeloton Waalsdorp heeft tot doel jaarlijks een description: 'Helpt u mee?Het Erepeloton Waalsdorp heeft tot doel jaarlijks een herdenking te verzorgen die de nagedachtenis
herdenking te verzorgen die de nagedachtenis aan de slachtoffers waardig is. aan de slachtoffers waardig is. Als u deze doelstelling een warm hart toedraagt en u wilt bijdragen aan het voortbestaan
Als u deze doelstelling een warm hart toedraagt en u wilt bijdragen aan het van deze herdenking, kunt u een donatie doen. Doneren
voortbestaan van deze herdenking, kunt u een donatie doen. Doneren
Updates over Erepeloton Waalsdorp? Volg onze' Updates over Erepeloton Waalsdorp? Volg onze'
language: nl language: nl
@ -218,8 +223,7 @@ logo_enrichment:
- claim_type: favicon_url - claim_type: favicon_url
claim_value: https://erepeloton.nl/wp-content/uploads/2021/04/cropped-Logo-180x180.jpg claim_value: https://erepeloton.nl/wp-content/uploads/2021/04/cropped-Logo-180x180.jpg
source_url: https://www.erepeloton.nl source_url: https://www.erepeloton.nl
css_selector: '[document] > html.avada-html-layout-wide.avada-html-header-position-top css_selector: '[document] > html.avada-html-layout-wide.avada-html-header-position-top > head > link:nth-of-type(13)'
> head > link:nth-of-type(13)'
retrieved_on: '2025-12-22T12:01:13.310940+00:00' retrieved_on: '2025-12-22T12:01:13.310940+00:00'
extraction_method: crawl4ai_link_rel extraction_method: crawl4ai_link_rel
favicon_type: '' favicon_type: ''
@ -227,8 +231,7 @@ logo_enrichment:
- claim_type: og_image_url - claim_type: og_image_url
claim_value: https://erepeloton.nl/wp-content/uploads/2021/04/Logo.jpg claim_value: https://erepeloton.nl/wp-content/uploads/2021/04/Logo.jpg
source_url: https://www.erepeloton.nl source_url: https://www.erepeloton.nl
css_selector: '[document] > html.avada-html-layout-wide.avada-html-header-position-top css_selector: '[document] > html.avada-html-layout-wide.avada-html-header-position-top > head > meta:nth-of-type(13)'
> head > meta:nth-of-type(13)'
retrieved_on: '2025-12-22T12:01:13.310940+00:00' retrieved_on: '2025-12-22T12:01:13.310940+00:00'
extraction_method: crawl4ai_meta_og extraction_method: crawl4ai_meta_og
summary: summary:

View file

@ -124,26 +124,34 @@ ghcid:
distance_km: 0.0 distance_km: 0.0
geonames_id: 2747891 geonames_id: 2747891
google_maps_enrichment: google_maps_enrichment:
place_id: ChIJJRL3HLFQzWMRfIKrnP4qQoU status: FALSE_MATCH
name: Happy Caps false_match_reason: 'Google Maps returned "Happy Caps" (retail store in different city (Apeldoorn)) instead of "Stichting
formatted_address: Arnhemseweg 55A, 7331 BB Apeldoorn, Netherlands Kracom" (Krampuslauf Rotterdam heritage foundation). Name mismatch detected during manual review. Per Rule 40: KIEN is
fetch_timestamp: '2025-12-06T19:33:21.984508+00:00' authoritative for Type I intangible heritage custodians.'
api_status: OK original_false_match:
coordinates: place_id: ChIJJRL3HLFQzWMRfIKrnP4qQoU
latitude: 52.205657599999995 name: Happy Caps
longitude: 5.9628179 formatted_address: Arnhemseweg 55A, 7331 BB Apeldoorn, Netherlands
phone_international: +31 85 401 6820 fetch_timestamp: '2025-12-06T19:33:21.984508+00:00'
phone_local: 085 401 6820 api_status: OK
website: https://happy-caps.com/ coordinates:
google_place_types: latitude: 52.205657599999995
- health longitude: 5.9628179
- point_of_interest phone_international: +31 85 401 6820
- store phone_local: 085 401 6820
- establishment website: https://happy-caps.com/
business_status: OPERATIONAL google_place_types:
rating: 5 - health
user_rating_count: 44 - point_of_interest
photo_count: 6 - store
- establishment
business_status: OPERATIONAL
rating: 5
user_rating_count: 44
photo_count: 6
correction_timestamp: '2026-01-08T12:24:16Z'
correction_agent: opencode-claude-sonnet-4
correction_method: manual_name_mismatch_review
wikidata_enrichment: wikidata_enrichment:
status: NOT_FOUND status: NOT_FOUND
fetch_timestamp: '2025-12-06T19:42:22.510788+00:00' fetch_timestamp: '2025-12-06T19:42:22.510788+00:00'

View file

@ -48,8 +48,7 @@ provenance:
notes: notes:
- Entry created from KIEN (Kenniscentrum Immaterieel Erfgoed Nederland) registry - Entry created from KIEN (Kenniscentrum Immaterieel Erfgoed Nederland) registry
- Intangible heritage custodian organization - Intangible heritage custodian organization
- Location extracted from organization name 'Sao Joao Rotterdam' - matched place - Location extracted from organization name 'Sao Joao Rotterdam' - matched place 'Rotterdam' (NAME_EXTRACTION_GEONAMES)
'Rotterdam' (NAME_EXTRACTION_GEONAMES)
- Canonical location added via normalize_custodian_files.py on 2025-12-08T23:20:34Z - Canonical location added via normalize_custodian_files.py on 2025-12-08T23:20:34Z
- Canonical location added via normalize_custodian_files.py on 2025-12-09T07:13:16Z - Canonical location added via normalize_custodian_files.py on 2025-12-09T07:13:16Z
kien_enrichment: kien_enrichment:
@ -127,22 +126,30 @@ ghcid:
distance_km: 0.0 distance_km: 0.0
geonames_id: 2747891 geonames_id: 2747891
google_maps_enrichment: google_maps_enrichment:
place_id: ChIJtYmZWJQ0xEcRXeaDiHmHrMA status: FALSE_MATCH
name: Heemraadsplein false_match_reason: 'Google Maps returned "Heemraadsplein" (public square (location, not organization)) instead of "Sao
formatted_address: Heemraadsplein, 3023 BD Rotterdam, Netherlands Joao Rotterdam" (Portuguese heritage festival organization). Name mismatch detected during manual review. Per Rule 40:
fetch_timestamp: '2025-12-06T19:33:25.065137+00:00' KIEN is authoritative for Type I intangible heritage custodians.'
api_status: OK original_false_match:
coordinates: place_id: ChIJtYmZWJQ0xEcRXeaDiHmHrMA
latitude: 51.9128672 name: Heemraadsplein
longitude: 4.454419700000001 formatted_address: Heemraadsplein, 3023 BD Rotterdam, Netherlands
google_place_types: fetch_timestamp: '2025-12-06T19:33:25.065137+00:00'
- park api_status: OK
- point_of_interest coordinates:
- establishment latitude: 51.9128672
business_status: OPERATIONAL longitude: 4.454419700000001
rating: 4.1 google_place_types:
user_rating_count: 108 - park
photo_count: 10 - point_of_interest
- establishment
business_status: OPERATIONAL
rating: 4.1
user_rating_count: 108
photo_count: 10
correction_timestamp: '2026-01-08T12:24:17Z'
correction_agent: opencode-claude-sonnet-4
correction_method: manual_name_mismatch_review
wikidata_enrichment: wikidata_enrichment:
status: NOT_FOUND status: NOT_FOUND
fetch_timestamp: '2025-12-06T19:42:27.320456+00:00' fetch_timestamp: '2025-12-06T19:42:27.320456+00:00'
@ -177,39 +184,30 @@ digital_platform_v2:
data_quality_notes: data_quality_notes:
wikidata_status: NOT_FOUND wikidata_status: NOT_FOUND
google_maps_status: current google_maps_status: current
google_maps_notes: 'Google Maps found Heemraadsplein (place_id: ChIJtYmZWJQ0xEcRXeaDiHmHrMA). google_maps_notes: 'Google Maps found Heemraadsplein (place_id: ChIJtYmZWJQ0xEcRXeaDiHmHrMA). This is CORRECT - Heemraadsplein
This is CORRECT - Heemraadsplein is the traditional location where the São João is the traditional location where the São João Baptista celebration takes place. The square was historically called
Baptista celebration takes place. The square was historically called Pracinha Pracinha dQuebrôd (the penniless square) by the Cape Verdean community.'
dQuebrôd (the penniless square) by the Cape Verdean community.' notes: São João Baptista Rotterdam is organized by the SJBR working group, a volunteer organization of second-generation
notes: São João Baptista Rotterdam is organized by the SJBR working group, a volunteer Cape Verdeans in the Netherlands. The celebration has taken place since the 1970s when Cape Verdean sailors settled
organization of second-generation Cape Verdeans in the Netherlands. The celebration in Rotterdam. Since 2011, the festival has been organized by SJBR in cooperation with Stichting Bruggenbouwers (which
has taken place since the 1970s when Cape Verdean sailors settled in Rotterdam. handles grants and sponsorships) and other Cape Verdean organizations. The celebration is part of the festas de romária
Since 2011, the festival has been organized by SJBR in cooperation with Stichting (pilgrimage feasts) tradition from Cape Verde. No dedicated website exists; KIEN page serves as primary online presence.
Bruggenbouwers (which handles grants and sponsorships) and other Cape Verdean
organizations. The celebration is part of the festas de romária (pilgrimage
feasts) tradition from Cape Verde. No dedicated website exists; KIEN page serves
as primary online presence.
organization_profile: organization_profile:
organization_type: Intangible Heritage Custodian - Cape Verdean Festival Organization organization_type: Intangible Heritage Custodian - Cape Verdean Festival Organization
scope: regional scope: regional
description: Werkgroep São João Baptista Rotterdam (SJBR) organizes the annual description: Werkgroep São João Baptista Rotterdam (SJBR) organizes the annual celebration of São João Baptista (Saint
celebration of São João Baptista (Saint John the Baptist) for the Cape Verdean John the Baptist) for the Cape Verdean community in Rotterdam and surroundings. The celebration, held on the Saturday
community in Rotterdam and surroundings. The celebration, held on the Saturday before or after June 24, includes a church service at Sint Viktor Church in Waddinxveen, a procession carrying the statue
before or after June 24, includes a church service at Sint Viktor Church in of Saint John to Heemraadsplein, traditional Kola San Jon dancing, tambores (drums), the navio (miniature ship) ritual,
Waddinxveen, a procession carrying the statue of Saint John to Heemraadsplein, and cultural activities including Cape Verdean cuisine, performances, and storytelling. The celebration honors sailors,
traditional Kola San Jon dancing, tambores (drums), the navio (miniature ship) asks for protection, peace, and fertility. Attendees come from Rotterdam, Zaandam, Belgium, Luxembourg, and the UK.
ritual, and cultural activities including Cape Verdean cuisine, performances,
and storytelling. The celebration honors sailors, asks for protection, peace,
and fertility. Attendees come from Rotterdam, Zaandam, Belgium, Luxembourg,
and the UK.
heritage_forms: heritage_forms:
- form_name: São João Baptista Rotterdam - form_name: São João Baptista Rotterdam
form_type: Religious and spiritual practice / Procession / Social practice form_type: Religious and spiritual practice / Procession / Social practice
kien_url: https://www.immaterieelerfgoed.nl/nl/sao-joao-bapista-rotterdam kien_url: https://www.immaterieelerfgoed.nl/nl/sao-joao-bapista-rotterdam
description: Cape Verdean celebration of the birthday of Saint John the Baptist, description: Cape Verdean celebration of the birthday of Saint John the Baptist, part of the festas de romária (pilgrimage
part of the festas de romária (pilgrimage feasts) tradition. Combines Catholic feasts) tradition. Combines Catholic religious elements with traditional Cape Verdean customs including Kola San Jon
religious elements with traditional Cape Verdean customs including Kola San dance, tambores drumming, and navio ship ritual.
Jon dance, tambores drumming, and navio ship ritual.
primary_platform: primary_platform:
platform_id: kien_page platform_id: kien_page
platform_url: https://www.immaterieelerfgoed.nl/nl/page/5331/sao-joao-rotterdam platform_url: https://www.immaterieelerfgoed.nl/nl/page/5331/sao-joao-rotterdam
@ -218,16 +216,14 @@ digital_platform_v2:
key_locations: key_locations:
- name: Heemraadsplein - name: Heemraadsplein
type: festival_location type: festival_location
description: Main location for the São João Baptista celebration. Historically description: Main location for the São João Baptista celebration. Historically called Pracinha dQuebrôd by the Cape Verdean
called Pracinha dQuebrôd by the Cape Verdean community. Meeting place for Cape community. Meeting place for Cape Verdean sailors since the late 1950s.
Verdean sailors since the late 1950s.
google_place_id: ChIJtYmZWJQ0xEcRXeaDiHmHrMA google_place_id: ChIJtYmZWJQ0xEcRXeaDiHmHrMA
- name: Sint Viktor Church - name: Sint Viktor Church
type: religious_venue type: religious_venue
location: Waddinxveen location: Waddinxveen
description: Church where the statue of Saint John the Baptist is collected at description: Church where the statue of Saint John the Baptist is collected at the start of the celebration, referencing
the start of the celebration, referencing the Cape Verdean tradition of fetching the Cape Verdean tradition of fetching the statue from the highlands.
the statue from the highlands.
partner_organizations: partner_organizations:
- name: Stichting Bruggenbouwers - name: Stichting Bruggenbouwers
role: Coordinator for grants and sponsorship role: Coordinator for grants and sponsorship
@ -283,12 +279,10 @@ timeline_enrichment:
- https://www.uitagendarotterdam.nl/alle-artikelen/vier-de-kaapverdiaanse-cultuur-bij-sao-joao-op-het-heemraadsplein/ - https://www.uitagendarotterdam.nl/alle-artikelen/vier-de-kaapverdiaanse-cultuur-bij-sao-joao-op-het-heemraadsplein/
- https://www.lilithmag.nl/agenda/2024/6/22/festival-gidstour-so-joo-pracinha-dquebrod-rotterdam - https://www.lilithmag.nl/agenda/2024/6/22/festival-gidstour-so-joo-pracinha-dquebrod-rotterdam
linkup_query: '"Sao Joao Rotterdam" Rotterdam opgericht OR gesticht OR sinds' linkup_query: '"Sao Joao Rotterdam" Rotterdam opgericht OR gesticht OR sinds'
linkup_answer: De viering van São João Baptista in Rotterdam wordt sinds eind linkup_answer: De viering van São João Baptista in Rotterdam wordt sinds eind jaren zeventig georganiseerd door de Kaapverdiaanse
jaren zeventig georganiseerd door de Kaapverdiaanse gemeenschap. De werkgroep gemeenschap. De werkgroep São João Baptista Rotterdam (SJBR) organiseert het evenement sinds 2011. De Stichting Sao
São João Baptista Rotterdam (SJBR) organiseert het evenement sinds 2011. De Joao Baptista Rotterdam zelf is opgericht op 19 december 2017. Het feest vindt plaats op het Heemraadsplein, ook wel
Stichting Sao Joao Baptista Rotterdam zelf is opgericht op 19 december 2017. Pracinha d Quebrôd genoemd, een ontmoetingsplek voor Kaapverdiaanse zeelieden sinds eind jaren vijftig.
Het feest vindt plaats op het Heemraadsplein, ook wel Pracinha d Quebrôd genoemd,
een ontmoetingsplek voor Kaapverdiaanse zeelieden sinds eind jaren vijftig.
fetch_timestamp: '2025-12-15T22:49:18.192162+00:00' fetch_timestamp: '2025-12-15T22:49:18.192162+00:00'
archive_path: web/1776/linkup/linkup_founding_20251215T224918Z.json archive_path: web/1776/linkup/linkup_founding_20251215T224918Z.json
extraction_method: linkup_answer_regex extraction_method: linkup_answer_regex

View file

@ -0,0 +1,224 @@
#!/usr/bin/env python3
"""
Detect Google Maps domain mismatches for Type I (Intangible Heritage) custodians.
Per Rule 40: KIEN Registry is authoritative for Type I custodians.
Google Maps frequently returns false matches for virtual/volunteer organizations.
This script:
1. Reads all NL-*-I-*.yaml files
2. Compares google_maps_enrichment.website with contact.website
3. Reports domain mismatches indicating likely false Google Maps matches
"""
import os
import sys
from pathlib import Path
from urllib.parse import urlparse
import yaml
# Add parent dir to path for imports
sys.path.insert(0, str(Path(__file__).parent.parent))
def extract_domain(url: str | None) -> str | None:
"""Extract domain from URL, handling common edge cases."""
if not url:
return None
# Normalize URL
url = url.strip()
if not url.startswith(('http://', 'https://')):
url = 'https://' + url
try:
parsed = urlparse(url)
domain = parsed.netloc.lower()
# Remove www. prefix for comparison
if domain.startswith('www.'):
domain = domain[4:]
return domain
except Exception:
return None
def load_yaml_file(filepath: Path) -> dict | None:
"""Load a YAML file, handling errors gracefully."""
try:
with open(filepath, 'r', encoding='utf-8') as f:
return yaml.safe_load(f)
except Exception as e:
print(f" Error loading {filepath}: {e}")
return None
def check_domain_mismatch(data: dict) -> dict | None:
"""
Check if Google Maps website differs from official contact website.
Returns mismatch details if found, None otherwise.
"""
# Get Google Maps website
gmaps = data.get('google_maps_enrichment', {})
gmaps_website = gmaps.get('website')
gmaps_name = gmaps.get('name', '')
gmaps_status = gmaps.get('status', '')
# Skip if already marked as FALSE_MATCH
if gmaps_status == 'FALSE_MATCH':
return None
# Get official website from multiple possible sources (priority order)
official_website = None
# 1. Check custodian_name.official_website
custodian_name = data.get('custodian_name', {})
if isinstance(custodian_name, dict):
official_website = custodian_name.get('official_website')
# 2. Check original_entry.webadres_organisatie (KIEN source)
if not official_website:
original_entry = data.get('original_entry', {})
if isinstance(original_entry, dict):
official_website = original_entry.get('webadres_organisatie')
# 3. Check contact.website
if not official_website:
contact = data.get('contact', {})
if isinstance(contact, dict):
official_website = contact.get('website')
# 4. Check digital_platforms for WEBSITE type
if not official_website:
platforms = data.get('digital_platforms', []) or []
for p in platforms:
if isinstance(p, dict) and p.get('platform_type') == 'WEBSITE':
official_website = p.get('platform_url')
break
# Extract domains
gmaps_domain = extract_domain(gmaps_website)
official_domain = extract_domain(official_website)
# Skip if no Google Maps website
if not gmaps_domain:
return None
# Skip if no official website to compare
if not official_domain:
return {
'type': 'NO_OFFICIAL_WEBSITE',
'gmaps_domain': gmaps_domain,
'gmaps_name': gmaps_name,
'gmaps_website': gmaps_website,
}
# Compare domains
if gmaps_domain != official_domain:
return {
'type': 'DOMAIN_MISMATCH',
'gmaps_domain': gmaps_domain,
'official_domain': official_domain,
'gmaps_name': gmaps_name,
'gmaps_website': gmaps_website,
'official_website': official_website,
}
return None
def main():
"""Main function to scan all Type I custodian files."""
# Find all Type I files
custodian_dir = Path(__file__).parent.parent / 'data' / 'custodian'
type_i_files = list(custodian_dir.glob('NL-*-I-*.yaml'))
print(f"Scanning {len(type_i_files)} Type I custodian files...\n")
mismatches = []
no_gmaps = []
already_fixed = []
no_official = []
ok = []
for filepath in sorted(type_i_files):
data = load_yaml_file(filepath)
if not data:
continue
# Check for Google Maps enrichment
gmaps = data.get('google_maps_enrichment', {})
if not gmaps:
no_gmaps.append(filepath.name)
continue
# Check if already marked as FALSE_MATCH
if gmaps.get('status') == 'FALSE_MATCH':
already_fixed.append(filepath.name)
continue
# Check for domain mismatch
result = check_domain_mismatch(data)
if result:
if result['type'] == 'DOMAIN_MISMATCH':
mismatches.append({
'file': filepath.name,
'custodian_name': data.get('custodian_name', {}).get('emic_name', filepath.stem),
**result
})
elif result['type'] == 'NO_OFFICIAL_WEBSITE':
no_official.append({
'file': filepath.name,
'custodian_name': data.get('custodian_name', {}).get('emic_name', filepath.stem),
**result
})
else:
ok.append(filepath.name)
# Print results
print("=" * 80)
print("DOMAIN MISMATCHES (Likely False Google Maps Matches)")
print("=" * 80)
if mismatches:
for m in mismatches:
print(f"\n📛 {m['file']}")
print(f" Custodian: {m['custodian_name']}")
print(f" GMaps domain: {m['gmaps_domain']} ({m['gmaps_website']})")
print(f" Official domain: {m['official_domain']} ({m['official_website']})")
print(f" GMaps name: {m['gmaps_name']}")
else:
print("\nNo domain mismatches found!")
print("\n" + "=" * 80)
print("NO OFFICIAL WEBSITE (Cannot verify Google Maps match)")
print("=" * 80)
if no_official:
for item in no_official[:10]: # Show first 10
print(f"\n⚠️ {item['file']}")
print(f" Custodian: {item['custodian_name']}")
print(f" GMaps: {item['gmaps_domain']} ({item['gmaps_website']})")
if len(no_official) > 10:
print(f"\n ... and {len(no_official) - 10} more")
print("\n" + "=" * 80)
print("SUMMARY")
print("=" * 80)
print(f"\n✅ Domain matches OK: {len(ok)}")
print(f"📛 Domain mismatches: {len(mismatches)}")
print(f"⚠️ No official website: {len(no_official)}")
print(f"🔧 Already fixed (FALSE_MATCH): {len(already_fixed)}")
print(f"📭 No Google Maps data: {len(no_gmaps)}")
print(f"\nTotal files scanned: {len(type_i_files)}")
# Return exit code based on findings
if mismatches:
print(f"\n⚠️ {len(mismatches)} files need review for potential false Google Maps matches!")
return 1
return 0
if __name__ == '__main__':
sys.exit(main())

View file

@ -0,0 +1,195 @@
#!/usr/bin/env python3
"""
Fix Google Maps false matches in Type I custodian files.
This script marks Google Maps enrichment as FALSE_MATCH when the domain
from Google Maps doesn't match the official domain from KIEN registry.
Per Rule 40: KIEN is TIER_1_AUTHORITATIVE for Type I custodians.
"""
import yaml
import sys
from pathlib import Path
from urllib.parse import urlparse
def extract_domain(url: str) -> str:
"""Extract domain from URL, handling None and empty strings."""
if not url:
return ""
try:
parsed = urlparse(url)
domain = parsed.netloc or parsed.path
domain = domain.lower().replace("www.", "")
return domain
except Exception:
return ""
def fix_gmaps_false_match(file_path: Path, dry_run: bool = False) -> dict:
"""
Fix a single file's Google Maps enrichment if it's a false match.
Returns dict with status info.
"""
with open(file_path, 'r', encoding='utf-8') as f:
data = yaml.safe_load(f)
result = {
'file': file_path.name,
'action': 'skipped',
'reason': None
}
# Check if already marked as FALSE_MATCH
gmaps = data.get('google_maps_enrichment', {})
if gmaps.get('status') == 'FALSE_MATCH':
result['reason'] = 'Already marked as FALSE_MATCH'
return result
# Get domains to compare
gmaps_website = gmaps.get('website', '')
# Check contact website first
official_website = data.get('contact', {}).get('website', '')
# If no contact website, check digital_platforms for WEBSITE type
if not official_website:
for p in data.get('digital_platforms', []):
if p.get('platform_type') == 'WEBSITE':
official_website = p.get('platform_url', '')
break
gmaps_domain = extract_domain(gmaps_website)
official_domain = extract_domain(official_website)
if not gmaps_domain or not official_domain:
result['reason'] = 'Missing domain info'
return result
# Check if domains match
if gmaps_domain == official_domain:
result['reason'] = 'Domains match'
return result
# Domains don't match - this is a false match
gmaps_name = gmaps.get('name', 'Unknown')
custodian_name = data.get('custodian_name', {}).get('claim_value', 'Unknown')
# Create the FALSE_MATCH structure
data['google_maps_enrichment'] = {
'status': 'FALSE_MATCH',
'false_match_reason': (
f'Google Maps returned "{gmaps_name}" (website: {gmaps_website}) '
f'instead of "{custodian_name}" (official website: {official_website}). '
f'Domain mismatch: {gmaps_domain} vs {official_domain}. '
'Per Rule 40: KIEN is authoritative for Type I intangible heritage custodians.'
),
'original_false_match': gmaps,
'correction_timestamp': '2025-01-08T00:00:00Z',
'correction_agent': 'opencode-claude-sonnet-4'
}
# Fix location if it has Google Maps coordinates
location = data.get('location', {})
coord_prov = location.get('coordinate_provenance', {})
if coord_prov.get('source_type') == 'GOOGLE_MAPS':
# Remove coordinates, keep city info
data['location'] = {
'city': location.get('city'),
'region_code': location.get('region_code'),
'country': location.get('country', 'NL'),
'geonames_id': location.get('geonames_id'),
'geonames_name': location.get('geonames_name'),
'feature_code': location.get('feature_code'),
'note': (
'Coordinates removed due to Google Maps false match. '
f'Original coordinates were from "{gmaps_name}".'
),
'coordinate_provenance_removed': {
'reason': 'FALSE_MATCH',
'original_latitude': location.get('latitude'),
'original_longitude': location.get('longitude'),
},
'normalization_timestamp': '2025-01-08T00:00:00Z'
}
# Add provenance correction
if 'provenance' not in data:
data['provenance'] = {}
if 'corrections' not in data['provenance']:
data['provenance']['corrections'] = []
data['provenance']['corrections'].append({
'correction_date': '2025-01-08T00:00:00Z',
'correction_type': 'google_maps_false_match',
'description': (
f'Marked Google Maps enrichment as FALSE_MATCH. '
f'GMaps returned "{gmaps_name}" ({gmaps_domain}) instead of '
f'"{custodian_name}" ({official_domain}).'
),
'corrected_by': 'opencode-claude-sonnet-4'
})
if not dry_run:
with open(file_path, 'w', encoding='utf-8') as f:
yaml.dump(data, f, default_flow_style=False, allow_unicode=True, sort_keys=False, width=100)
result['action'] = 'fixed'
result['gmaps_name'] = gmaps_name
result['gmaps_domain'] = gmaps_domain
result['official_domain'] = official_domain
return result
def main():
import argparse
parser = argparse.ArgumentParser(description='Fix Google Maps false matches')
parser.add_argument('files', nargs='*', help='Specific files to fix (or all Type I if none)')
parser.add_argument('--dry-run', action='store_true', help='Show what would be fixed without changing files')
args = parser.parse_args()
custodian_dir = Path("/Users/kempersc/apps/glam/data/custodian")
if args.files:
files = [custodian_dir / f for f in args.files]
else:
# Find all Type I files
files = list(custodian_dir.glob("*-I-*.yaml"))
print(f"{'[DRY RUN] ' if args.dry_run else ''}Processing {len(files)} files...")
print()
fixed = []
skipped = []
for file_path in sorted(files):
if not file_path.exists():
print(f"⚠️ {file_path.name}: File not found")
continue
try:
result = fix_gmaps_false_match(file_path, dry_run=args.dry_run)
if result['action'] == 'fixed':
fixed.append(result)
print(f"{result['file']}")
print(f" GMaps: {result['gmaps_name']} ({result['gmaps_domain']})")
print(f" Official: {result['official_domain']}")
else:
skipped.append(result)
if args.dry_run:
print(f"⏭️ {result['file']}: {result['reason']}")
except Exception as e:
print(f"{file_path.name}: {e}")
print()
print(f"{'[DRY RUN] ' if args.dry_run else ''}Summary:")
print(f" Fixed: {len(fixed)}")
print(f" Skipped: {len(skipped)}")
if __name__ == '__main__':
main()

View file

@ -0,0 +1,154 @@
#!/usr/bin/env python3
"""
Fix false matches in NL-GE-TIE-I-M.yaml (Stichting MOZA)
Issues to fix:
1. Google Maps FALSE MATCH: MOZA Makelaardij (real estate) vs Stichting MOZA (heritage)
2. YouTube FALSE MATCH: Wolfgang Amadeus Mozart - Topic vs Stichting MOZA
3. Location coordinates: Wrong Wapenveld coords from Google Maps
"""
import yaml
from pathlib import Path
from datetime import datetime
# Custom representer to handle multi-line strings nicely
def str_representer(dumper, data):
if '\n' in data:
return dumper.represent_scalar('tag:yaml.org,2002:str', data, style='>')
return dumper.represent_scalar('tag:yaml.org,2002:str', data)
yaml.add_representer(str, str_representer)
def fix_moza_file():
file_path = Path("/Users/kempersc/apps/glam/data/custodian/NL-GE-TIE-I-M.yaml")
with open(file_path, 'r', encoding='utf-8') as f:
data = yaml.safe_load(f)
# 1. Fix Google Maps enrichment - mark as FALSE_MATCH
original_gmaps = data.get('google_maps_enrichment', {})
data['google_maps_enrichment'] = {
'status': 'FALSE_MATCH',
'false_match_reason': (
'Google Maps returned "MOZA Makelaardij" (real estate agency at moza.nl in Wapenveld) '
'instead of "Stichting MOZA" (Molukse heritage foundation at moza.nu in Tiel). '
'These are completely different organizations - one is a real estate agency, '
'the other is an intangible heritage custodian for Moluccan neighborhood culture.'
),
'original_false_match': original_gmaps,
'correction_timestamp': '2025-01-08T00:00:00Z',
'correction_agent': 'opencode-claude-sonnet-4'
}
# 2. Fix YouTube enrichment - mark as FALSE_MATCH
original_youtube = data.get('youtube_enrichment', {})
# Remove the massive videos list from original - just keep metadata
videos_removed = []
if 'videos' in original_youtube:
videos_removed = original_youtube.pop('videos')
data['youtube_enrichment'] = {
'status': 'FALSE_MATCH',
'false_match_reason': (
'YouTube search returned "Wolfgang Amadeus Mozart - Topic" (classical music auto-generated '
'channel with 190K subscribers, 5709 videos of Mozart compositions) instead of a channel '
'for "Stichting MOZA" (Molukse heritage foundation). The search matched "MOZA" to "Mozart" '
'due to name similarity. No YouTube channel found for Stichting MOZA.'
),
'original_false_match': {
'fetch_timestamp': original_youtube.get('fetch_timestamp'),
'api_endpoint': original_youtube.get('api_endpoint'),
'api_version': original_youtube.get('api_version'),
'channel_id': original_youtube.get('channel_id'),
'channel_url': original_youtube.get('channel_url'),
'title': original_youtube.get('title'),
'subscriber_count': original_youtube.get('subscriber_count'),
'video_count': original_youtube.get('video_count'),
'view_count': original_youtube.get('view_count'),
'status': original_youtube.get('status'),
},
'videos_removed_note': (
f'Removed {len(videos_removed)} Mozart classical music videos from original data as they have '
'no relevance to Stichting MOZA. Videos were from YouTube auto-generated Mozart Topic channel.'
),
'correction_timestamp': '2025-01-08T00:00:00Z',
'correction_agent': 'opencode-claude-sonnet-4'
}
# 3. Fix location - remove wrong Google Maps coordinates, use KIEN data
# The correct location is in 'locations' array (from KIEN), but 'location' has wrong coords
if 'location' in data:
original_location = data['location']
# Keep only the correct parts, remove Google Maps coords
data['location'] = {
'city': 'Tiel',
'region_code': 'GE',
'country': 'NL',
'geonames_id': 2746331,
'geonames_name': 'Tiel',
'feature_code': 'PPL',
'note': (
'Coordinates removed due to Google Maps false match. '
'Location derived from KIEN registry (Tiel). '
'Original false coordinates were from MOZA Makelaardij in Wapenveld.'
),
'coordinate_provenance_removed': {
'reason': 'FALSE_MATCH - coordinates were from wrong organization',
'original_latitude': original_location.get('latitude'),
'original_longitude': original_location.get('longitude'),
'original_source': original_location.get('coordinate_provenance', {}).get('source_type'),
'original_entity_id': original_location.get('coordinate_provenance', {}).get('entity_id'),
},
'normalization_timestamp': '2025-01-08T00:00:00Z'
}
# 4. Add provenance note about corrections
if 'provenance' not in data:
data['provenance'] = {}
if 'corrections' not in data['provenance']:
data['provenance']['corrections'] = []
data['provenance']['corrections'].append({
'correction_date': '2025-01-08T00:00:00Z',
'correction_type': 'google_maps_false_match',
'description': (
'Marked Google Maps enrichment as FALSE_MATCH. Google Maps returned "MOZA Makelaardij" '
'(real estate agency at moza.nl) instead of "Stichting MOZA" (heritage foundation at moza.nu). '
'Per Rule 40: KIEN is authoritative for Type I custodians.'
),
'corrected_by': 'opencode-claude-sonnet-4'
})
data['provenance']['corrections'].append({
'correction_date': '2025-01-08T00:00:00Z',
'correction_type': 'youtube_false_match',
'description': (
'Marked YouTube enrichment as FALSE_MATCH. YouTube search returned "Wolfgang Amadeus Mozart - Topic" '
'channel instead of Stichting MOZA. This is a name similarity false match (MOZA → Mozart).'
),
'corrected_by': 'opencode-claude-sonnet-4'
})
data['provenance']['corrections'].append({
'correction_date': '2025-01-08T00:00:00Z',
'correction_type': 'location_coordinates_removed',
'description': (
'Removed incorrect coordinates from location section. Coordinates were from Google Maps '
'false match (MOZA Makelaardij in Wapenveld). Correct location is Tiel per KIEN registry.'
),
'corrected_by': 'opencode-claude-sonnet-4'
})
# Write back
with open(file_path, 'w', encoding='utf-8') as f:
yaml.dump(data, f, default_flow_style=False, allow_unicode=True, sort_keys=False, width=100)
print(f"Fixed {file_path}")
print("- Marked Google Maps as FALSE_MATCH")
print("- Marked YouTube as FALSE_MATCH (removed Mozart videos)")
print("- Fixed location coordinates")
print("- Added provenance corrections")
if __name__ == '__main__':
fix_moza_file()

View file

@ -0,0 +1,132 @@
#!/usr/bin/env python3
"""
Fix obvious name mismatch false matches for Type I custodians.
These are files where Google Maps returned a completely different organization
than the KIEN registry entry, but we couldn't auto-detect because there was
no official website to compare domains.
Per Rule 40: KIEN Registry is authoritative for Type I custodians.
"""
import yaml
from pathlib import Path
from datetime import datetime, timezone
# Files with definite name mismatches (manually verified)
FILES_TO_FIX = {
"NL-GE-ARN-I-DT.yaml": {
"kien_name": "Dick Timmerman",
"kien_type": "heritage practitioner (person)",
"gmaps_name": "Timmer & Onderhoudsbedrijf Dik Lubbertsen",
"gmaps_type": "carpentry business"
},
"NL-OV-IJS-I-RB.yaml": {
"kien_name": "Ria Bos",
"kien_type": "traditional cigar maker (person)",
"gmaps_name": "Ria Money Transfer Agent",
"gmaps_type": "money transfer business"
},
"NL-ZH-ROT-I-K.yaml": {
"kien_name": "Stichting Kracom",
"kien_type": "Krampuslauf Rotterdam heritage foundation",
"gmaps_name": "Happy Caps",
"gmaps_type": "retail store in different city (Apeldoorn)"
},
"NL-UT-UTR-I-FNV.yaml": {
"kien_name": "Federatie Nederlandse Vertelorganisaties",
"kien_type": "Dutch storytelling federation",
"gmaps_name": "NET Foundation",
"gmaps_type": "different foundation"
},
"NL-ZH-AAD-I-DA.yaml": {
"kien_name": "Stichting dodenherdenking Alphen",
"kien_type": "memorial foundation Alphen aan den Rijn",
"gmaps_name": "Waalsdorpervlakte Bourdon Bell",
"gmaps_type": "different memorial in different location"
},
"NL-ZH-ROT-I-SJR.yaml": {
"kien_name": "Sao Joao Rotterdam",
"kien_type": "Portuguese heritage festival organization",
"gmaps_name": "Heemraadsplein",
"gmaps_type": "public square (location, not organization)"
},
"NL-GE-OOS-I-SS.yaml": {
"kien_name": "sport en spel",
"kien_type": "traditional games heritage organization",
"gmaps_name": "Damu Sport en Spel Verhuur",
"gmaps_type": "sports equipment rental business"
},
"NL-OV-OMM-I-EO.yaml": {
"kien_name": "Eiertikken Ommen",
"kien_type": "traditional egg-tapping game heritage",
"gmaps_name": "Restaurant Ekkelenkamp Ommen",
"gmaps_type": "restaurant"
},
}
def fix_gmaps_false_match(filepath: Path, fix_info: dict) -> bool:
"""Mark Google Maps enrichment as FALSE_MATCH for a file."""
with open(filepath, 'r', encoding='utf-8') as f:
data = yaml.safe_load(f)
gmaps = data.get('google_maps_enrichment', {})
if not gmaps:
print(f" No Google Maps data in {filepath.name}")
return False
if gmaps.get('status') == 'FALSE_MATCH':
print(f" Already fixed: {filepath.name}")
return False
# Create the false match record
false_match_reason = (
f"Google Maps returned \"{fix_info['gmaps_name']}\" ({fix_info['gmaps_type']}) "
f"instead of \"{fix_info['kien_name']}\" ({fix_info['kien_type']}). "
f"Name mismatch detected during manual review. "
f"Per Rule 40: KIEN is authoritative for Type I intangible heritage custodians."
)
# Restructure the data
data['google_maps_enrichment'] = {
'status': 'FALSE_MATCH',
'false_match_reason': false_match_reason,
'original_false_match': gmaps,
'correction_timestamp': datetime.now(timezone.utc).strftime('%Y-%m-%dT%H:%M:%SZ'),
'correction_agent': 'opencode-claude-sonnet-4',
'correction_method': 'manual_name_mismatch_review'
}
# Write back
with open(filepath, 'w', encoding='utf-8') as f:
yaml.dump(data, f, default_flow_style=False, allow_unicode=True, sort_keys=False, width=120)
print(f" ✓ Fixed: {filepath.name}")
print(f" KIEN: {fix_info['kien_name']}")
print(f" GMaps (wrong): {fix_info['gmaps_name']}")
return True
def main():
custodian_dir = Path(__file__).parent.parent / 'data' / 'custodian'
print(f"Fixing {len(FILES_TO_FIX)} files with name mismatch false matches...\n")
fixed = 0
for filename, fix_info in FILES_TO_FIX.items():
filepath = custodian_dir / filename
if not filepath.exists():
print(f" File not found: {filename}")
continue
if fix_gmaps_false_match(filepath, fix_info):
fixed += 1
print(f"\n✓ Fixed {fixed} files")
return 0
if __name__ == '__main__':
exit(main())