This repository was archived by the owner on Jun 6, 2026. It is now read-only.
feat: add EU source records and cross-border conditions — #40 PR 1/4 (foundation)#47
Merged
TommiLindfors merged 1 commit intoMay 30, 2026
Conversation
Contributor
|
Merged! Excellent foundation work @HirenGajjar. A few things that stood out:
Foundation is in main now, so PRs 2-4 can reference these IDs. Thirteen merged PRs and counting. |
TommiLindfors
pushed a commit
that referenced
this pull request
May 30, 2026
Part 2 of 4 for issue #40. Depends on PR 1/4 (#47, now merged). Adds the France corridor: 2 French sources, 2 French institutions, and the LU–FR corridor scenario. --- ## Context France is the largest frontalier corridor for Luxembourg — approximately 120,000 workers cross the border daily. This PR encodes the sources and institutions a Luxembourg-connected family with French ties would interact with, and wires them into a corridor scenario that references the cross-border conditions and EU regulations from PR 1. --- ## Files added ### `data/sources/fr/service-public-deces.yaml` **URL verified:** https://www.service-public.fr/particuliers/vosdroits/F16507 — loads correctly, title confirmed as "Un proche est décédé". Last verified on service-public.fr: 01 janvier 2026. - `source_type: government_portal` - `verification_status: source-checked` - Covers the full French bereavement journey: funeral organisation, institution notifications, succession steps, and time-sensitive obligations --- ### `data/sources/fr/info-retraite-reversion.yaml` **URL verified:** https://www.info-retraite.fr — loads correctly. GIP Union Retraite official portal. - `source_type: institutional_page` - `verification_status: source-checked` - Key research finding documented in notes: if the survivor pension (pension de réversion) is filed within 1 year of death, the start date is the first day of the month after death. A single online request covers all French base and complementary schemes. --- ### `data/institutions/fr/carsat.yaml` **URL verified:** https://www.carsat-alsacemoselle.fr — loads correctly. - `id: institution:fr:carsat-alsace-moselle` — deliberately the Alsace-Moselle CARSAT, not a generic CARSAT record, because this CARSAT directly borders Luxembourg and specifically handles Luxembourg frontalier pension coordination - Documents the 2026 "mixed career" form (formulaire carrière mixte) introduced to expedite coordination with CNAP via form P5000 - Organises personalised advisory sessions with Luxembourg CNAP representatives --- ### `data/institutions/fr/scec.yaml` **URL verified:** https://www.diplomatie.gouv.fr/fr/services-aux-francais/etat-civil-et-nationalite-francaise/ — loads correctly (general civil status section). - `id: institution:fr:scec` - `verification_status: discovered` — the specific SCEC transcription page content was not fully verified; honest status applied - Documents that for a French national who dies in Luxembourg, the family must request transcription of the Luxembourg death certificate through SCEC for French civil registry records and succession procedures - SCEC is located in Nantes and operates under the Ministry of Europe and Foreign Affairs --- ### `data/scenarios/corridor-lu-fr.yaml` - `scenario_type: corridor` - `countries: [LU, FR]` - `publication_status: draft` - References all 5 conditions from PR 1: `deceased-is-foreign-national`, `deceased-is-frontalier`, `survivor-resides-abroad`, `assets-in-multiple-jurisdictions`, `repatriation-of-remains` - References both EU sources from PR 1 and both FR sources from this PR **Key corridor facts documented in notes:** - Survivor pension filed via Info Retraite (single request, all French schemes) - CARSAT Alsace-Moselle coordinates with CNAP via P5000 form - Luxembourg death certificate requires SCEC transcription for French civil registry - Succession governed by Brussels IV habitual residence rule --- ## Schema compliance - Read all schemas before writing — `additionalProperties: false` respected throughout - Institution `official_site` field confirmed loading for all records - `source_ids` in institutions reference sources created in this same PR - Scenario `condition_ids` reference conditions merged in PR 1 — dependency respected --- ## What PR 3 will add - `scenario:corridor-lu-de` + 2 DE sources (DRV pages) + 1 DE institution (DRV) --- ## Verified - `python3 scripts/validate.py` — passes (24 data files, up from 19) - All 5 trailing newlines confirmed `0a` - 5 new files, 0 existing files modified - All source and institution URLs verified loading in browser before writing - `git status` confirmed no unintended changes
TommiLindfors
pushed a commit
that referenced
this pull request
May 31, 2026
Part 4 of 4 for issue #40. Completes the cross-border corridor infrastructure with Belgium and Portugal. --- ## Context This PR adds the two remaining corridors: - **Belgium** — ~50,000 daily frontaliers, third largest corridor - **Portugal** — ~100,000 residents, the largest foreign national community in Luxembourg --- ## Files added ### `data/sources/be/belgium-be-deces.yaml` **URL verified:** https://www.belgium.be/fr/famille/deces — loads correctly, title confirmed as "Décès". - `source_type: government_portal` - `verification_status: source-checked` - `languages: [fr, nl, de]` — belgium.be is trilingual - Includes `title_fr`, `title_de`, `description_fr`, `description_de` **Key facts documented in notes (from issue #40 research):** - Death must be declared to the municipality where the person died, usually handled by the undertaker - Death certificate is then forwarded to the municipality of last residence - Succession duties in Belgium are regional and depend on fiscal residence --- ### `data/institutions/be/sfp.yaml` **URL verified:** https://www.sfpd.fgov.be — loads correctly as "Federal Pensions Service". - `id: institution:be:sfp` - `verification_status: structured-from-source` - `languages: [fr, nl, de]` — Belgian trilingual institution (SFP in French, FPD in Dutch) - References `source:be:belgium-be-deces` **Key facts documented in notes:** - Survivor pension applications submitted via mypension.be - Coordinates with CNAP via EU social security coordination for cross-border cases - Covers ~50,000 Belgian frontaliers --- ### `data/scenarios/corridor-lu-be.yaml` - `scenario_type: corridor` - `countries: [LU, BE]` - `publication_status: draft` - References all 5 PR1 conditions and both EU sources + BE source --- ### `data/sources/pt/gov-pt-obito.yaml` **URL:** https://eportugal.gov.pt/en/temas/familia/morte — identified from official ePortugal portal structure; page was inaccessible during creation. - `source_type: government_portal` - `verification_status: discovered` — honest status, URL could not be confirmed loading - `last_verified_at: null` - Notes explicitly state full content verification requires further access **Key facts encoded from issue #40 research:** - Death of a Portuguese citizen abroad must be declared in Portugal - Survivor pension (pensão de sobrevivência) requires minimum 36 months of contributions - Application via Segurança Social Direta using form RP 5075 --- ### `data/institutions/pt/seguranca-social.yaml` **URL:** https://www.seg-social.pt — confirmed loading from research. - `id: institution:pt:seguranca-social` - `verification_status: discovered` — consistent with PT source status - `languages: [pt]` **Key facts documented in notes:** - Portugal has the largest foreign national community in Luxembourg (~100,000 residents) - 36-month contribution requirement for survivor pension - Death of Portuguese national abroad must be registered in Portugal via consular services - Centro Nacional de Pensões (CNP) within ISS handles international pension coordination --- ### `data/scenarios/corridor-lu-pt.yaml` - `scenario_type: corridor` - `countries: [LU, PT]` - `publication_status: draft` - Notes explicitly flag that further source verification is needed for full PT corridor detail --- ## Verification status honesty Belgium sources are `source-checked` — URLs verified loading, content confirmed. Portugal sources are `discovered` — URL identified from official portal structure but could not be verified loading during creation. This is consistent with issue #40's own note: "Detailed survivor-pension routing and death transcription process need further verification." --- ## Issue #40 complete With this PR all four corridors are now in main: - PR 1/4 (#47) — EU foundation (conditions + EU regulations) ✅ - PR 2/4 (#48) — France corridor ✅ - PR 3/4 (#49) — Germany corridor ✅ - PR 4/4 (this PR) — Belgium + Portugal corridors Total new files across all 4 PRs: 25 files covering 2 EU regulations, 5 cross-border conditions, 4 corridor scenarios, 6 foreign sources, 5 foreign institutions. --- ## Schema compliance - All schemas read before writing — `additionalProperties: false` respected throughout - All condition IDs reference conditions from PR 1 (merged) - All EU source IDs reference sources from PR 1 (merged) - `institution_ids` and `source_ids` cross-references consistent within each PR --- ## Verified - `python3 scripts/validate.py` — passes (34 data files, up from 28) - All 6 trailing newlines confirmed `0a` - 6 new files, 0 existing files modified - `git status` confirmed no unintended changes
This was referenced May 31, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to subscribe to this conversation on GitHub.
Already have an account?
Sign in.
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Part 1 of 4 for issue #40. This PR establishes the shared foundation — EU-level source records and cross-border conditions — that all four corridor PRs will reference. It must merge before PR 2 (France), PR 3 (Germany), and PR 4 (Belgium + Portugal).
Context and approach
Issue #40 is structured as 4 sequential PRs. This first PR contains no corridor-specific content — only the infrastructure that is shared across all corridors:
The corridor scenario files (PR 2–4) will reference
condition:deceased-is-frontalier,condition:survivor-resides-abroad, etc. by ID. Those references will only resolve correctly after this PR merges into main.Files added
data/sources/eu/brussels-iv-regulation.yamlURL verified: https://eur-lex.europa.eu/legal-content/EN/TXT/?uri=CELEX:32012R0650 — loads correctly on EUR-Lex, title confirmed as "Regulation (EU) No 650/2012".
source_type: regulation— EU Regulations are binding law, not guidance or portal pagesverification_status: structured-from-source— URL verified and key provisions readjurisdiction.country: EU— valid per^[A-Z]{2}$pattern; appropriate for an EU-wide regulationinstitution_ids: []— no EU institution record exists yet in the data modelKey provisions documented in notes:
data/sources/eu/social-security-coordination.yamlURL verified: https://eur-lex.europa.eu/legal-content/EN/TXT/?uri=CELEX:32004R0883 — loads correctly, title confirmed as "Regulation (EC) No 883/2004".
source_type: regulationverification_status: structured-from-sourceKey facts documented in notes:
data/conditions/common/deceased-is-foreign-national.yamlcondition_type: nationalityexpression.field: deceased_nationality,operator: not_equals,value: LUsource:eu:brussels-iv-regulationdata/conditions/common/deceased-is-frontalier.yamlcondition_type: cross_borderexpression.field: deceased_work_country,operator: not_equals,value: LUsource:eu:social-security-coordinationdata/conditions/common/survivor-resides-abroad.yamlcondition_type: heir_locationexpression.field: survivor_residence_country,operator: not_equals,value: LUsource:eu:social-security-coordinationandsource:eu:brussels-iv-regulationdata/conditions/common/assets-in-multiple-jurisdictions.yamlcondition_type: asset_locationexpression.field: asset_countries,operator: count_greater_than,value: 1source:eu:brussels-iv-regulationdata/conditions/common/repatriation-of-remains.yamlcondition_type: cross_borderexpression.field: repatriation_requested,operator: equals,value: truesource:lu:guichet:death-life-event— no EU regulation specifically governs this; the 1973 Strasbourg Convention applies for EU corridorsSchema compliance notes
schemas/v0.1/before writing any filedata/conditions/common/death-in-jurisdiction.yamlfor expression block structurejurisdiction.country: EUpasses^[A-Z]{2}$validation — deliberately chosen for EU-wide regulationssource:eu:...IDs pass^source:[a-z]{2}:[a-z0-9-]+...pattern —eumatches[a-z]{2}additionalProperties: falseconstraints respected — no extra fields addedsource_idsreference sources that either already exist in main or are created in this same PRWhat PR 2–4 will add
scenario:corridor-lu-fr+ 2 FR sources (service-public, info-retraite) + 2 FR institutions (CARSAT, SCEC)scenario:corridor-lu-de+ 2 DE sources (DRV) + 1 DE institution (DRV)scenario:corridor-lu-be+scenario:corridor-lu-pt+ BE/PT sources and institutionsVerified
python3 scripts/validate.py— passes (19 data files, up from 12)0agit statusconfirmed no unintended changes