<?xml version="1.0"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/">
	<channel>
		<title>Dura Lex Wiki  - Recent changes [en]</title>
		<link>https://wiki.dura-lex.org/index.php/Special:RecentChanges</link>
		<description>Track the most recent changes to the wiki in this feed.</description>
		<language>en</language>
		<generator>MediaWiki 1.45.3</generator>
		<lastBuildDate>Thu, 23 Apr 2026 03:41:48 GMT</lastBuildDate>
		<item>
			<title>Main Page</title>
			<link>https://wiki.dura-lex.org/index.php?title=Main_Page&amp;diff=57&amp;oldid=31</link>
			<guid isPermaLink="false">https://wiki.dura-lex.org/index.php?title=Main_Page&amp;diff=57&amp;oldid=31</guid>
			<description>&lt;p&gt;Fix navigation links: point to actual pages instead of categories (via update-page on MediaWiki MCP Server)&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 02:24, 23 April 2026&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l19&quot;&gt;Line 19:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 19:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;| [[Architecture]] || How the pieces fit together — kernel, drivers, pipeline, services&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;| [[Architecture]] || How the pieces fit together — kernel, drivers, pipeline, services&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;|-&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;|-&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;| [[&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;:Category:Corpus|&lt;/del&gt;Corpus]] || The data model — schema, tags, edges, quality, temporal versioning, FTS&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;| [[Corpus]] || The data model — schema, tags, edges, quality, temporal versioning, FTS&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;|-&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;|-&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;| [[Sources]] || Data dictionary — one page per ingest source, coverage matrix&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;| [[Sources]] || Data dictionary — one page per ingest source, coverage matrix&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;|-&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;|-&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;| [[&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;:Category:Jurisdictions|&lt;/del&gt;Jurisdictions]] || Legal systems we cover and how they map to the unified schema&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;| [[Jurisdictions]] || Legal systems we cover and how they map to the unified schema&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;|-&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;|-&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;| [[&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;:Category:MCP|&lt;/del&gt;MCP]] || The public API — tools, safety guidelines, reference resolution&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;| [[MCP]] || The public API — tools, safety guidelines, reference resolution&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;|-&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;|-&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;| [[&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;:Category:Development|&lt;/del&gt;Development]] || For contributors — coding conventions, testing, packaging&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;| [[Development]] || For contributors — coding conventions, testing, packaging&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;|-&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;|-&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;| [[:Category:Design decisions|Design decisions]] || Architectural decision records&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;| [[:Category:Design decisions|Design decisions]] || Architectural decision records &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;(coming soon)&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;|}&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;|}&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;

&lt;!-- diff cache key mediawiki:diff:1.41:old-31:rev-57:php=table --&gt;
&lt;/table&gt;</description>
			<pubDate>Thu, 23 Apr 2026 02:24:03 GMT</pubDate>
			<dc:creator>Nicolas</dc:creator>
			<comments>https://wiki.dura-lex.org/index.php/Talk:Main_Page</comments>
		</item>
		<item>
			<title>Architecture</title>
			<link>https://wiki.dura-lex.org/index.php?title=Architecture&amp;diff=56&amp;oldid=0</link>
			<guid isPermaLink="false">https://wiki.dura-lex.org/index.php?title=Architecture&amp;diff=56&amp;oldid=0</guid>
			<description>&lt;p&gt;Architecture page — from spec/ARCHITECTURE.md, full faithful conversion (via create-page on MediaWiki MCP Server)&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;== What Dura Lex is ==&lt;br /&gt;
&lt;br /&gt;
An open-source platform for international legal data. MIT license, ODbL data.&lt;br /&gt;
&lt;br /&gt;
Structures public legal data (legislation, case law, company registries, administrative guidance) into a jurisdiction-agnostic corpus, queryable by AI agents via MCP and by humans via a web portal.&lt;br /&gt;
&lt;br /&gt;
== OS metaphor ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! OS concept !! Dura Lex equivalent&lt;br /&gt;
|-&lt;br /&gt;
| Kernel || duralex — protocols, data models, unified schema&lt;br /&gt;
|-&lt;br /&gt;
| Drivers || Country packages (duralex-fr, duralex-eu, future duralex-gb, duralex-de)&lt;br /&gt;
|-&lt;br /&gt;
| File system || Document IDs, jurisdiction-scoped URIs&lt;br /&gt;
|-&lt;br /&gt;
| System calls || search(), get(), browse(), guidelines(), quality_check()&lt;br /&gt;
|-&lt;br /&gt;
| Package manager || Compiled SQLite packages for the knowledge graph&lt;br /&gt;
|-&lt;br /&gt;
| Applications || duralex-mcp (MCP server), duralex-portal (web), duralex-graph (future)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Package overview (8 packages, 6 repos) ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Package !! Repo !! Role !! Depends on&lt;br /&gt;
|-&lt;br /&gt;
| duralex || duralex/ || Core protocols, data models, temporal, corpus schema, DocumentStore, SearchEngine, FTS. Specs + docs. || nothing&lt;br /&gt;
|-&lt;br /&gt;
| duralex-fr || duralex-jurisdictions/ || French jurisdiction plugin: tag schema, formatters, reference resolver, synonym thesaurus. || duralex&lt;br /&gt;
|-&lt;br /&gt;
| duralex-eu || duralex-jurisdictions/ || EU jurisdiction plugin: EUR-Lex, CJEU, ECHR references. || duralex&lt;br /&gt;
|-&lt;br /&gt;
| duralex-ingest || duralex-ingest/ || Schema DDL, universal BatchWriter, state management, HTML sanitizer. || duralex&lt;br /&gt;
|-&lt;br /&gt;
| duralex-ingest-fr || duralex-ingest/ || French parsers: DILA, Judilibre, BODACC, RNE, BOFiP, CADA, CE, CNIL. || duralex, ingest, fr&lt;br /&gt;
|-&lt;br /&gt;
| duralex-ingest-eu || duralex-ingest/ || EU parsers: EUR-Lex (Cellar), CJEU, ECHR. || duralex, ingest&lt;br /&gt;
|-&lt;br /&gt;
| duralex-mcp || duralex-mcp/ || MCP server: 5 tools (search, get, browse, guidelines, quality_check). Plugin discovery. Docker infra. || duralex, fr/eu&lt;br /&gt;
|-&lt;br /&gt;
| duralex-portal || duralex-portal/ || Web portal for human consultation of the corpus. || duralex&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Future: duralex-graph (knowledge graph compiler, separate repo).&lt;br /&gt;
&lt;br /&gt;
== Dependency graph ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
duralex                           no dependencies&lt;br /&gt;
     |&lt;br /&gt;
     +----&amp;gt; duralex-fr            depends on: duralex&lt;br /&gt;
     +----&amp;gt; duralex-eu            depends on: duralex&lt;br /&gt;
     |&lt;br /&gt;
     +----&amp;gt; duralex-ingest        depends on: duralex&lt;br /&gt;
     |           |&lt;br /&gt;
     |           +----&amp;gt; duralex-ingest-fr    depends on: duralex, ingest, fr&lt;br /&gt;
     |           +----&amp;gt; duralex-ingest-eu    depends on: duralex, ingest&lt;br /&gt;
     |&lt;br /&gt;
     +----&amp;gt; duralex-mcp           depends on: duralex, fr, eu (via plugin discovery)&lt;br /&gt;
     +----&amp;gt; duralex-portal        depends on: duralex&lt;br /&gt;
     +----&amp;gt; duralex-graph         depends on: duralex (future)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Two PostgreSQL schemas ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
corpus.*    -- source documents, citations, tag stats, source metadata&lt;br /&gt;
graph.*     -- concepts, annotations, compiled edges, compilation metadata (future)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Separate schemas in the same database. Different lifecycle:&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;corpus&amp;#039;&amp;#039;&amp;#039;: source data, precious (days to re-ingest), stable after ingestion.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;graph&amp;#039;&amp;#039;&amp;#039;: compiled knowledge, reproducible (hours to recompile), write-heavy during compilation.&lt;br /&gt;
&lt;br /&gt;
Benefits: separate VACUUM/ANALYZE, separate backup strategies, &amp;lt;code&amp;gt;DROP SCHEMA graph CASCADE&amp;lt;/code&amp;gt; to recompile without touching corpus.&lt;br /&gt;
&lt;br /&gt;
== Core composition pattern ==&lt;br /&gt;
&lt;br /&gt;
Three levels:&lt;br /&gt;
&lt;br /&gt;
# &amp;#039;&amp;#039;&amp;#039;Core protocol&amp;#039;&amp;#039;&amp;#039; (duralex): defines WHAT can be done (DocumentStore protocol, SearchEngine protocol).&lt;br /&gt;
# &amp;#039;&amp;#039;&amp;#039;Country implementation&amp;#039;&amp;#039;&amp;#039; (duralex-fr): implements HOW for a specific jurisdiction (formatters, reference resolvers, tag schemas).&lt;br /&gt;
# &amp;#039;&amp;#039;&amp;#039;Application&amp;#039;&amp;#039;&amp;#039; (duralex-mcp): composes protocols + implementations at startup.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Reference resolution&amp;#039;&amp;#039;&amp;#039; uses &amp;lt;code&amp;gt;TagQuery&amp;lt;/code&amp;gt; as the universal interface between jurisdiction parsers and the store. This is a core architectural decision — all reference resolution across all jurisdictions flows through TagQuery. There are no typed reference classes per jurisdiction.&lt;br /&gt;
&lt;br /&gt;
* Core defines: &amp;lt;code&amp;gt;TagQuery&amp;lt;/code&amp;gt; dataclass (&amp;lt;code&amp;gt;language&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;kind&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;tag_filters: TagFilterSet&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;should_sort_in_force_first&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;at_date&amp;lt;/code&amp;gt;) and &amp;lt;code&amp;gt;TagFilterSet&amp;lt;/code&amp;gt; (immutable tuple of &amp;lt;code&amp;gt;TagFilter&amp;lt;/code&amp;gt; predicates with operators EQ/IN/NOT_IN/ILIKE/EXISTS/NOT_EXISTS/NORMALIZE). See [[MCP/Reference resolution]].&lt;br /&gt;
* Jurisdiction plugin (e.g., duralex-fr): parses &amp;quot;article 1240 du code civil&amp;quot; into &amp;lt;code&amp;gt;TagQuery(language=&amp;quot;fr&amp;quot;, kind=&amp;quot;legislation&amp;quot;, tag_filters=TagFilterSet.from_tags({&amp;quot;article_number&amp;quot;: &amp;quot;1240&amp;quot;, &amp;quot;code&amp;quot;: &amp;quot;Code civil&amp;quot;}))&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Store: translates &amp;lt;code&amp;gt;TagQuery&amp;lt;/code&amp;gt; to SQL via the shared &amp;lt;code&amp;gt;build_tag_filter_conditions&amp;lt;/code&amp;gt; builder (generic, zero jurisdiction knowledge).&lt;br /&gt;
&lt;br /&gt;
== MCP tools: 5 ==&lt;br /&gt;
&lt;br /&gt;
search, get, browse, guidelines, quality_check. Each tool is jurisdiction-agnostic. The jurisdiction plugins provide tag schemas, formatters, and reference resolvers — not tools.&lt;br /&gt;
&lt;br /&gt;
== Language boundary ==&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Code&amp;#039;&amp;#039;&amp;#039; (protocols, classes, functions, variables, docstrings): English.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Content&amp;#039;&amp;#039;&amp;#039; (concept names, article text, court names, legal vocabulary): jurisdiction language.&lt;/div&gt;</description>
			<pubDate>Thu, 23 Apr 2026 02:18:20 GMT</pubDate>
			<dc:creator>Nicolas</dc:creator>
			<comments>https://wiki.dura-lex.org/index.php/Talk:Architecture</comments>
		</item>
		<item>
			<title>MCP/Guidelines/EU</title>
			<link>https://wiki.dura-lex.org/index.php?title=MCP/Guidelines/EU&amp;diff=55&amp;oldid=0</link>
			<guid isPermaLink="false">https://wiki.dura-lex.org/index.php?title=MCP/Guidelines/EU&amp;diff=55&amp;oldid=0</guid>
			<description>&lt;p&gt;Create MCP/Guidelines/EU page from jurisdiction.md (European law) (via create-page on MediaWiki MCP Server)&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;= Jurisdiction: European law =&lt;br /&gt;
&lt;br /&gt;
Supplements core safety guidelines with rules specific to European law (&amp;lt;code&amp;gt;tags={&amp;quot;jurisdiction&amp;quot;: &amp;quot;eu&amp;quot;}&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
⚠️ &amp;#039;&amp;#039;&amp;#039;Current limitation&amp;#039;&amp;#039;&amp;#039;: only &amp;lt;code&amp;gt;language=&amp;quot;fr&amp;quot;&amp;lt;/code&amp;gt; ingested. &amp;lt;code&amp;gt;language=&amp;quot;en&amp;quot;&amp;lt;/code&amp;gt; → 0 results. Always pass &amp;lt;code&amp;gt;language=&amp;quot;fr&amp;quot;&amp;lt;/code&amp;gt; for EU searches. Multi-language planned (F-5).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;tags[&amp;quot;jurisdiction&amp;quot;]&amp;lt;/code&amp;gt; is REQUIRED on every search and browse_structure call. Use &amp;lt;code&amp;gt;&amp;quot;eu&amp;quot;&amp;lt;/code&amp;gt; for European law only, &amp;lt;code&amp;gt;&amp;quot;eu|fr&amp;quot;&amp;lt;/code&amp;gt; for combined (recommended for EU member state queries), or &amp;lt;code&amp;gt;&amp;quot;*&amp;quot;&amp;lt;/code&amp;gt; for all jurisdictions.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Which tool for which question ==&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;EU regulations &amp;amp; directives&amp;#039;&amp;#039;&amp;#039;: search(tags={&amp;quot;jurisdiction&amp;quot;: &amp;quot;eu&amp;quot;, &amp;quot;kind&amp;quot;: &amp;quot;legislation&amp;quot;, &amp;quot;nature&amp;quot;: &amp;quot;REGLEMENT&amp;quot;}) or &amp;lt;code&amp;gt;&amp;quot;nature&amp;quot;: &amp;quot;DIRECTIVE&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;CJEU case law&amp;#039;&amp;#039;&amp;#039;: search(tags={&amp;quot;jurisdiction&amp;quot;: &amp;quot;eu&amp;quot;, &amp;quot;kind&amp;quot;: &amp;quot;decision&amp;quot;, &amp;quot;court&amp;quot;: &amp;quot;cjeu&amp;quot;}) for Court of Justice; &amp;lt;code&amp;gt;&amp;quot;court&amp;quot;: &amp;quot;general_court&amp;quot;&amp;lt;/code&amp;gt; for General Court&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;ECHR case law&amp;#039;&amp;#039;&amp;#039;: search(tags={&amp;quot;jurisdiction&amp;quot;: &amp;quot;eu&amp;quot;, &amp;quot;kind&amp;quot;: &amp;quot;decision&amp;quot;, &amp;quot;court&amp;quot;: &amp;quot;echr&amp;quot;})&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Direct CELEX lookup&amp;#039;&amp;#039;&amp;#039;: get_document(&amp;quot;32016R0679&amp;quot;) — resolves to &amp;lt;code&amp;gt;EU.EURLEXTEXT32016R0679&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Transposition into FR&amp;#039;&amp;#039;&amp;#039;: search(query=&amp;quot;transposition directive 2016/680&amp;quot;, tags={&amp;quot;jurisdiction&amp;quot;: &amp;quot;fr&amp;quot;, &amp;quot;kind&amp;quot;: &amp;quot;legislation&amp;quot;}) or check edges on the directive via get_document&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;AG opinions&amp;#039;&amp;#039;&amp;#039;: search(tags={&amp;quot;jurisdiction&amp;quot;: &amp;quot;eu&amp;quot;, &amp;quot;kind&amp;quot;: &amp;quot;decision&amp;quot;, &amp;quot;type&amp;quot;: &amp;quot;advisory_opinion&amp;quot;}) ⚠️ not yet ingested — returns 0 results currently.&lt;br /&gt;
&lt;br /&gt;
When in doubt: &amp;lt;code&amp;gt;&amp;quot;jurisdiction&amp;quot;: &amp;quot;eu|fr&amp;quot;&amp;lt;/code&amp;gt; to combine FR and EU sources.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Search — EU legal terminology ==&lt;br /&gt;
&lt;br /&gt;
* &amp;quot;responsabilité&amp;quot; / &amp;quot;liability&amp;quot; / &amp;quot;responsibility&amp;quot; — texts may be in multiple languages&lt;br /&gt;
* &amp;quot;données personnelles&amp;quot; / &amp;quot;personal data&amp;quot; / &amp;quot;personenbezogene Daten&amp;quot;&lt;br /&gt;
* &amp;quot;concurrence&amp;quot; / &amp;quot;competition&amp;quot; / &amp;quot;antitrust&amp;quot;&lt;br /&gt;
* &amp;quot;marché intérieur&amp;quot; / &amp;quot;internal market&amp;quot; / &amp;quot;single market&amp;quot;&lt;br /&gt;
* Multi-word concepts MUST use quotes: &amp;lt;code&amp;gt;&amp;quot;libre circulation des travailleurs&amp;quot;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;quot;abus de position dominante&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
EU texts exist in 24 official languages. The corpus may contain multiple language versions of the same text — they are equivalent in legal value (TFEU art. 55).&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Multilingual ingestion&amp;#039;&amp;#039;&amp;#039;: each language version is a separate row with a &amp;lt;code&amp;gt;:lang&amp;lt;/code&amp;gt; suffix in the&lt;br /&gt;
document ID (e.g. &amp;lt;code&amp;gt;EU.EURLEXTEXT32016R0679:fr&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;EU.EURLEXTEXT32016R0679:en&amp;lt;/code&amp;gt; for the French&lt;br /&gt;
and English versions of the GDPR). The cross-language identifier &amp;lt;code&amp;gt;tags.text_id&amp;lt;/code&amp;gt; is unsuffixed&lt;br /&gt;
(&amp;lt;code&amp;gt;EU.EURLEXTEXT32016R0679&amp;lt;/code&amp;gt;), so resolver lookups by &amp;lt;code&amp;gt;text_id&amp;lt;/code&amp;gt; find all language versions; the&lt;br /&gt;
&amp;lt;code&amp;gt;language&amp;lt;/code&amp;gt; parameter you pass to the tools narrows results to the user&amp;#039;s language. Documents&lt;br /&gt;
ingested in a fallback language (e.g. EN-only when no FR is available) carry&lt;br /&gt;
&amp;lt;code&amp;gt;tags.translation_pending=&amp;quot;fr&amp;quot;&amp;lt;/code&amp;gt; and may receive a machine translation later.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Courts ==&lt;br /&gt;
&lt;br /&gt;
=== court_level mapping (T1 tag) ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;supranational&amp;lt;/code&amp;gt; — cjeu (Court of Justice), echr&lt;br /&gt;
* &amp;lt;code&amp;gt;first_instance&amp;lt;/code&amp;gt; — general_court (General Court), civil_service_tribunal (dissolved 2016)&lt;br /&gt;
&lt;br /&gt;
=== CJEU (Court of Justice of the EU) ===&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Court of Justice&amp;#039;&amp;#039;&amp;#039; (&amp;quot;Cour de justice&amp;quot;): highest EU court, preliminary rulings, appeals&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;General Court&amp;#039;&amp;#039;&amp;#039; (&amp;quot;Tribunal&amp;quot;): direct actions, competition, state aid, trademarks&lt;br /&gt;
&lt;br /&gt;
Formation solemnity (ascending): single_judge &amp;lt; reduced_bench (3 judges) &amp;lt; standard_bench (5 judges) &amp;lt; grand_bench (15 judges) &amp;lt; full_court (all judges).&lt;br /&gt;
&lt;br /&gt;
Publication grades: &amp;lt;code&amp;gt;ecr_grand_chamber&amp;lt;/code&amp;gt; (Court Reports, Grand Chamber, highest_importance) &amp;gt; &amp;lt;code&amp;gt;ecr_chamber&amp;lt;/code&amp;gt; (Court Reports, Chamber, high_importance) &amp;gt; &amp;lt;code&amp;gt;oj_only&amp;lt;/code&amp;gt; (OJ series C only, low_importance) &amp;gt; &amp;lt;code&amp;gt;unpublished&amp;lt;/code&amp;gt; (minimal_importance).&lt;br /&gt;
&lt;br /&gt;
Procedure types: preliminary ruling (&amp;quot;renvoi préjudiciel&amp;quot;, art. 267 TFEU), annulment (art. 263 TFEU), infringement (art. 258-260 TFEU), opinion (art. 218 TFEU).&lt;br /&gt;
&lt;br /&gt;
=== ECHR (European Court of Human Rights) ===&lt;br /&gt;
&lt;br /&gt;
* Covers 46 Council of Europe member states&lt;br /&gt;
* Application numbers: 5+ digits / 2 digits (e.g., 36022/97)&lt;br /&gt;
&lt;br /&gt;
Importance grades:&lt;br /&gt;
* official_grade 1 = Key case (Reports of Judgments and Decisions) — highest_importance&lt;br /&gt;
* official_grade 2 = High importance — high_importance&lt;br /&gt;
* official_grade 3 = Medium importance — medium_importance&lt;br /&gt;
* official_grade 4 = Low importance — low_importance&lt;br /&gt;
&lt;br /&gt;
Formations: &amp;quot;Grande chambre&amp;quot; (grand_bench) &amp;gt; Section/Chamber (standard_bench) &amp;gt; &amp;quot;Comité&amp;quot; (reduced_bench) &amp;gt; Single Judge (single_judge).&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Legislation ==&lt;br /&gt;
&lt;br /&gt;
=== Hierarchy ===&lt;br /&gt;
&lt;br /&gt;
Treaties (TEU, TFEU, Charter of Fundamental Rights) &amp;gt; Regulations (directly applicable) &amp;gt; Directives (require national transposition) &amp;gt; Decisions.&lt;br /&gt;
&lt;br /&gt;
=== Key distinctions ===&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Regulation&amp;#039;&amp;#039;&amp;#039; (&amp;quot;règlement&amp;quot;): directly applicable in all member states. No transposition. Direct effect.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Directive&amp;#039;&amp;#039;&amp;#039;: binds member states as to the result. Requires national transposition within deadline. After deadline → vertical direct effect (vs State) but NOT horizontal (between private parties).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Decision&amp;#039;&amp;#039;&amp;#039;: binding on its addressees only.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;CELEX number&amp;#039;&amp;#039;&amp;#039;: official identifier, format &amp;lt;code&amp;gt;3{year}{type}{number}&amp;lt;/code&amp;gt; (e.g., 32016R0679 = Regulation 2016/679 = GDPR).&lt;br /&gt;
&lt;br /&gt;
=== Enforcement status ===&lt;br /&gt;
&lt;br /&gt;
Tag: &amp;lt;code&amp;gt;enforcement_status&amp;lt;/code&amp;gt; (canonical international values, see TAG-CONVENTIONS.md)&lt;br /&gt;
EU EUR-Lex emits only:&lt;br /&gt;
* &amp;lt;code&amp;gt;in_force&amp;lt;/code&amp;gt; = in force&lt;br /&gt;
* &amp;lt;code&amp;gt;repealed&amp;lt;/code&amp;gt; = repealed → NEVER cite as current&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Charter of Fundamental Rights ==&lt;br /&gt;
&lt;br /&gt;
Treaty-level value since Lisbon (2009). Binds EU institutions + member states implementing EU law.&lt;br /&gt;
&lt;br /&gt;
Key articles:&lt;br /&gt;
* Art. 7 — private and family life&lt;br /&gt;
* Art. 8 — protection of personal data&lt;br /&gt;
* Art. 21 — non-discrimination&lt;br /&gt;
* Art. 47 — right to effective remedy and fair trial&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Direct effect and primacy ==&lt;br /&gt;
&lt;br /&gt;
* Regulations: full direct effect (vertical + horizontal).&lt;br /&gt;
* Directives: vertical direct effect (vs State) after transposition deadline. NOT horizontal (between private parties).&lt;br /&gt;
* EU primacy over all national law (Costa v ENEL, 1964).&lt;br /&gt;
* France: &amp;quot;contrôle de conventionnalité&amp;quot; by ordinary courts (art. 55 Constitution). Constitutional Council does conventionality control via QPC since 2010.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== ECHR margin of appreciation ==&lt;br /&gt;
&lt;br /&gt;
ECHR grants states a &amp;quot;margin of appreciation&amp;quot; on sensitive topics (morals, religion, national security, family policy). Same legal question → different outcomes in different national contexts.&lt;br /&gt;
&lt;br /&gt;
⚠️ A ruling against Italy ≠ automatically applies to France. Different national context, different margin.&lt;br /&gt;
Always check for rulings against the specific state involved (search tags={&amp;quot;jurisdiction&amp;quot;: &amp;quot;eu&amp;quot;, &amp;quot;source&amp;quot;: &amp;quot;echr&amp;quot;, &amp;quot;respondent_state&amp;quot;: &amp;quot;FRA&amp;quot;} — values are 3-letter ISO country codes).&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Transposition ==&lt;br /&gt;
&lt;br /&gt;
Finding the FR transposition of an EU directive:&lt;br /&gt;
# get_document() the directive, check &amp;lt;code&amp;gt;edges&amp;lt;/code&amp;gt; for explicit transposition links&lt;br /&gt;
# search(query=&amp;quot;transposition directive YYYY/NN&amp;quot;, tags={&amp;quot;jurisdiction&amp;quot;: &amp;quot;fr&amp;quot;, &amp;quot;kind&amp;quot;: &amp;quot;legislation&amp;quot;})&lt;br /&gt;
# Look for the FR &amp;quot;loi de transposition&amp;quot; or &amp;quot;ordonnance de transposition&amp;quot;&lt;br /&gt;
&lt;br /&gt;
⚠️ EUR-Lex national transposition measures may be incomplete or outdated — verify in FR sources.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== CJEU preliminary rulings (art. 267 TFEU) ==&lt;br /&gt;
&lt;br /&gt;
Mechanism: a national court asks the CJEU to interpret EU law. The CJEU answers; the national court applies the answer to the case.&lt;br /&gt;
&lt;br /&gt;
⚠️ A preliminary ruling INTERPRETS EU law. It does NOT decide the underlying national case. The national court applies the interpretation to the facts. Don&amp;#039;t confuse the preliminary ruling answer with a decision on the merits.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Advocate General opinions ==&lt;br /&gt;
&lt;br /&gt;
Separate documents (kind=decision, type=advisory_opinion). Precede the judgment, more detailed reasoning. Not binding on the CJEU but highly persuasive — often followed. Linked via edges when available.&lt;br /&gt;
&lt;br /&gt;
⚠️ Not yet ingested. The search above returns 0 results currently.&lt;br /&gt;
&lt;br /&gt;
When citing a CJEU judgment, also check whether an AG opinion exists — it provides essential context.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Decision analysis — EU courts ==&lt;br /&gt;
&lt;br /&gt;
Supplements core &amp;quot;Structured decision analysis&amp;quot; (§5).&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;CJEU — preliminary rulings (art. 267 TFEU)&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
* Procedure = referring court + national dispute. CJEU answers question, does NOT decide national case.&lt;br /&gt;
* Questions referred: list as formulated. CJEU may reformulate or merge.&lt;br /&gt;
* AG opinion (if exists): summarize BEFORE court&amp;#039;s reasoning. Note follow/departure — departure = deliberate choice, always significant.&lt;br /&gt;
* Reasoning: cite by §number (e.g. &amp;quot;§42-48&amp;quot;). Key paragraphs = principle before application.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;CJEU — direct actions&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
* Contested act (annulment) or member state obligation (infringement).&lt;br /&gt;
* Pleas replace &amp;quot;Claims&amp;quot; — each plea = distinct argument, analyze separately.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;ECHR&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
* Claims → alleged violations by Convention article (e.g. &amp;quot;Art. 8&amp;quot;, &amp;quot;Art. 6§1&amp;quot;).&lt;br /&gt;
* Vote split: note unanimous/majority. Dissenting opinions published, often significant.&lt;br /&gt;
* Margin of appreciation: wide = other states may differ. Narrow = more universal.&lt;br /&gt;
* Formally binding on respondent state only (Art. 46 ECHR). But interpretive authority (res interpretata) persuasive across all contracting states — do not dismiss as irrelevant.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Practical reflexes ==&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Harmonized areas&amp;#039;&amp;#039;&amp;#039; (data protection, competition, consumer, free movement): always check both FR and EU sources. Use &amp;lt;code&amp;gt;&amp;quot;jurisdiction&amp;quot;: &amp;quot;eu|fr&amp;quot;&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Direct applicability&amp;#039;&amp;#039;&amp;#039;: regulations apply without national act. Directives need transposition.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Time limits for direct actions&amp;#039;&amp;#039;&amp;#039;: annulment 2 months (art. 263(6) TFEU). Infringement: no time limit but Commission discretion.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Multiple language versions&amp;#039;&amp;#039;&amp;#039;: in case of divergence, all versions equally authentic. CJEU resolves divergences by purposive interpretation.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Brexit&amp;#039;&amp;#039;&amp;#039;: UK no longer member state since 2020-01-31. EU law no longer applicable. Pre-Brexit case law involving UK still relevant for general EU law principles.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Danger — European emergency resources ==&lt;br /&gt;
&lt;br /&gt;
When danger detected (see core guidelines §6):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
* European emergency: 112 (works in all EU member states)&lt;br /&gt;
* ECHR application: hudoc.echr.coe.int&lt;br /&gt;
* EU complaint to Commission: ec.europa.eu/info/about-european-commission/contact/problems-and-complaints_en&lt;br /&gt;
* Cross-border legal aid: e-justice.europa.eu&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Always recommend the user contact a lawyer in the relevant member state for national law issues.&lt;br /&gt;
&lt;br /&gt;
[[Category:MCP]]&lt;/div&gt;</description>
			<pubDate>Thu, 23 Apr 2026 02:17:22 GMT</pubDate>
			<dc:creator>Nicolas</dc:creator>
			<comments>https://wiki.dura-lex.org/index.php/Talk:MCP/Guidelines/EU</comments>
		</item>
		<item>
			<title>MCP/Guidelines/FR</title>
			<link>https://wiki.dura-lex.org/index.php?title=MCP/Guidelines/FR&amp;diff=54&amp;oldid=0</link>
			<guid isPermaLink="false">https://wiki.dura-lex.org/index.php?title=MCP/Guidelines/FR&amp;diff=54&amp;oldid=0</guid>
			<description>&lt;p&gt;Create MCP/Guidelines/FR page from jurisdiction.md (French law) (via create-page on MediaWiki MCP Server)&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;= Jurisdiction: French law =&lt;br /&gt;
&lt;br /&gt;
Supplements core safety guidelines with rules specific to French law (&amp;lt;code&amp;gt;tags={&amp;quot;jurisdiction&amp;quot;: &amp;quot;fr&amp;quot;}&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
For French users, pass &amp;lt;code&amp;gt;language=&amp;quot;fr&amp;quot;&amp;lt;/code&amp;gt; on every search/get_document/browse_structure call. The corpus is overwhelmingly French (60M+ documents) so this is the typical default, but the parameter is &amp;#039;&amp;#039;&amp;#039;always required&amp;#039;&amp;#039;&amp;#039; — see the global Language guideline. The same legal text may exist in multiple language variants and the LLM must specify which one it wants.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;tags[&amp;quot;jurisdiction&amp;quot;]&amp;lt;/code&amp;gt; is also REQUIRED on every search and browse_structure call. Use &amp;lt;code&amp;gt;&amp;quot;fr&amp;quot;&amp;lt;/code&amp;gt; for French law only, &amp;lt;code&amp;gt;&amp;quot;eu|fr&amp;quot;&amp;lt;/code&amp;gt; for combined FR + EU (recommended for cross-border issues), or &amp;lt;code&amp;gt;&amp;quot;*&amp;quot;&amp;lt;/code&amp;gt; for all jurisdictions.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Which tool for which question ==&lt;br /&gt;
&lt;br /&gt;
All examples below assume &amp;lt;code&amp;gt;tags={&amp;quot;jurisdiction&amp;quot;: &amp;quot;fr&amp;quot;, ...}&amp;lt;/code&amp;gt;. Combine with &amp;lt;code&amp;gt;&amp;quot;eu|fr&amp;quot;&amp;lt;/code&amp;gt; for cross-border questions.&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Employment law&amp;#039;&amp;#039;&amp;#039; (dismissal, contract, salary, working hours): search(tags={&amp;quot;jurisdiction&amp;quot;: &amp;quot;fr&amp;quot;, &amp;quot;kind&amp;quot;: &amp;quot;legislation&amp;quot;, &amp;quot;code&amp;quot;: &amp;quot;Code du travail&amp;quot;}) for statutory floor, then search(tags={&amp;quot;jurisdiction&amp;quot;: &amp;quot;fr&amp;quot;, &amp;quot;kind&amp;quot;: &amp;quot;legislation&amp;quot;, &amp;quot;source&amp;quot;: &amp;quot;kali|acco&amp;quot;}) for collective and company agreements, then search(tags={&amp;quot;jurisdiction&amp;quot;: &amp;quot;fr&amp;quot;, &amp;quot;kind&amp;quot;: &amp;quot;decision&amp;quot;}) for interpretation.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Civil law&amp;#039;&amp;#039;&amp;#039; (contracts, liability, property, family): search(tags={&amp;quot;jurisdiction&amp;quot;: &amp;quot;fr&amp;quot;, &amp;quot;kind&amp;quot;: &amp;quot;legislation&amp;quot;}) for Code civil / Code de la consommation / Code de la construction, then search(tags={&amp;quot;jurisdiction&amp;quot;: &amp;quot;fr&amp;quot;, &amp;quot;kind&amp;quot;: &amp;quot;decision&amp;quot;}).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Criminal law&amp;#039;&amp;#039;&amp;#039; (offenses, penalties, procedure): search(tags={&amp;quot;jurisdiction&amp;quot;: &amp;quot;fr&amp;quot;, &amp;quot;kind&amp;quot;: &amp;quot;legislation&amp;quot;, &amp;quot;code&amp;quot;: &amp;quot;Code pénal&amp;quot;}) or &amp;lt;code&amp;gt;&amp;quot;code&amp;quot;: &amp;quot;Code de procédure pénale&amp;quot;&amp;lt;/code&amp;gt;, then search(tags={&amp;quot;jurisdiction&amp;quot;: &amp;quot;fr&amp;quot;, &amp;quot;kind&amp;quot;: &amp;quot;decision&amp;quot;}).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Tax law&amp;#039;&amp;#039;&amp;#039;: search(tags={&amp;quot;jurisdiction&amp;quot;: &amp;quot;fr&amp;quot;, &amp;quot;kind&amp;quot;: &amp;quot;legislation&amp;quot;}) for CGI / LPF, then search(tags={&amp;quot;jurisdiction&amp;quot;: &amp;quot;fr&amp;quot;, &amp;quot;source&amp;quot;: &amp;quot;bofip&amp;quot;}) for BOFiP interpretation, then search(tags={&amp;quot;jurisdiction&amp;quot;: &amp;quot;fr&amp;quot;, &amp;quot;kind&amp;quot;: &amp;quot;decision&amp;quot;}).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Data protection / GDPR&amp;#039;&amp;#039;&amp;#039;: search(tags={&amp;quot;jurisdiction&amp;quot;: &amp;quot;eu&amp;quot;, &amp;quot;kind&amp;quot;: &amp;quot;legislation&amp;quot;}) for RGPD, search(tags={&amp;quot;jurisdiction&amp;quot;: &amp;quot;fr&amp;quot;, &amp;quot;kind&amp;quot;: &amp;quot;legislation&amp;quot;}) for loi Informatique et Libertés, search(tags={&amp;quot;jurisdiction&amp;quot;: &amp;quot;fr&amp;quot;, &amp;quot;source&amp;quot;: &amp;quot;cnil&amp;quot;}) for CNIL guidelines, search(tags={&amp;quot;jurisdiction&amp;quot;: &amp;quot;fr&amp;quot;, &amp;quot;kind&amp;quot;: &amp;quot;decision&amp;quot;, &amp;quot;court&amp;quot;: &amp;quot;cnil&amp;quot;}) for sanctions. ⚠️ &amp;quot;RGPD&amp;quot; as FTS term returns few EU results — prefer &amp;lt;code&amp;gt;&amp;quot;données à caractère personnel&amp;quot;&amp;lt;/code&amp;gt; OR &amp;lt;code&amp;gt;&amp;quot;protection des données&amp;quot;&amp;lt;/code&amp;gt;, or direct CELEX: &amp;lt;code&amp;gt;get_document(&amp;quot;32016R0679&amp;quot;)&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Administrative law&amp;#039;&amp;#039;&amp;#039;: search(tags={&amp;quot;jurisdiction&amp;quot;: &amp;quot;fr&amp;quot;, &amp;quot;kind&amp;quot;: &amp;quot;legislation&amp;quot;}) for relevant code (urbanisme, environnement, CESEDA...), search(tags={&amp;quot;jurisdiction&amp;quot;: &amp;quot;fr&amp;quot;, &amp;quot;kind&amp;quot;: &amp;quot;decision&amp;quot;, &amp;quot;court&amp;quot;: &amp;quot;administratif&amp;quot;}) for CE / CAA / TA decisions.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Company information&amp;#039;&amp;#039;&amp;#039;: search(tags={&amp;quot;jurisdiction&amp;quot;: &amp;quot;fr&amp;quot;, &amp;quot;kind&amp;quot;: &amp;quot;record&amp;quot;}) for RNE registry + BODACC announcements.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Legislative intent&amp;#039;&amp;#039;&amp;#039;: search(tags={&amp;quot;jurisdiction&amp;quot;: &amp;quot;fr&amp;quot;, &amp;quot;source&amp;quot;: &amp;quot;parliamentary&amp;quot;}) for debates when a text is ambiguous.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;EU law&amp;#039;&amp;#039;&amp;#039;: use &amp;lt;code&amp;gt;&amp;quot;jurisdiction&amp;quot;: &amp;quot;eu&amp;quot;&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;&amp;quot;eu|fr&amp;quot;&amp;lt;/code&amp;gt;. search(tags={&amp;quot;jurisdiction&amp;quot;: &amp;quot;eu&amp;quot;, &amp;quot;kind&amp;quot;: &amp;quot;decision&amp;quot;}) for CJUE/CEDH.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;QPC&amp;#039;&amp;#039;&amp;#039; (constitutionality): search(tags={&amp;quot;jurisdiction&amp;quot;: &amp;quot;fr&amp;quot;, &amp;quot;kind&amp;quot;: &amp;quot;decision&amp;quot;, &amp;quot;court&amp;quot;: &amp;quot;constitutionnel&amp;quot;}).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Public accounting / financial discipline&amp;#039;&amp;#039;&amp;#039;: search(tags={&amp;quot;jurisdiction&amp;quot;: &amp;quot;fr&amp;quot;, &amp;quot;kind&amp;quot;: &amp;quot;decision&amp;quot;, &amp;quot;court&amp;quot;: &amp;quot;cour_des_comptes&amp;quot;}) for CdC, search(tags={&amp;quot;jurisdiction&amp;quot;: &amp;quot;fr&amp;quot;, &amp;quot;kind&amp;quot;: &amp;quot;decision&amp;quot;, &amp;quot;court&amp;quot;: &amp;quot;chambre_regionale_des_comptes&amp;quot;}) for CRC.&lt;br /&gt;
&lt;br /&gt;
When in doubt: search(tags={&amp;quot;jurisdiction&amp;quot;: &amp;quot;fr&amp;quot;, &amp;quot;kind&amp;quot;: &amp;quot;legislation&amp;quot;}) first, then search(tags={&amp;quot;jurisdiction&amp;quot;: &amp;quot;fr&amp;quot;, &amp;quot;kind&amp;quot;: &amp;quot;decision&amp;quot;}). Cross-reference both.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Search — French legal synonyms ==&lt;br /&gt;
&lt;br /&gt;
Same concept, different words across texts and eras. Use OR:&lt;br /&gt;
&lt;br /&gt;
* licenciement / rupture du contrat de travail / congédiement&lt;br /&gt;
* vice caché / défaut de conformité / garantie des vices&lt;br /&gt;
* préjudice / dommage / réparation&lt;br /&gt;
* faute lourde / faute grave / faute inexcusable&lt;br /&gt;
* clause abusive / clause léonine / déséquilibre significatif&lt;br /&gt;
* responsabilité / obligation de réparation&lt;br /&gt;
* bail / contrat de location / louage&lt;br /&gt;
* mise en demeure / sommation / interpellation&lt;br /&gt;
&lt;br /&gt;
Example: &amp;lt;code&amp;gt;&amp;quot;vice caché&amp;quot; OR &amp;quot;défaut de conformité&amp;quot;&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Multi-word concepts MUST use quotes: &amp;quot;action de groupe&amp;quot;, &amp;quot;preuve déloyale&amp;quot;, &amp;quot;abus de position dominante&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Search — numeric literals ==&lt;br /&gt;
&lt;br /&gt;
Thousands separator: space.&lt;br /&gt;
Amounts ≥ 4 digits: OR both forms, quote the spaced form.&lt;br /&gt;
  &amp;lt;code&amp;gt;seuil 10000 OR seuil &amp;quot;10 000&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
Skip: years (2024), case numbers (19-15.165), article numbers (L.1235-1), decimals (10,5).&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Normative hierarchy ==&lt;br /&gt;
&lt;br /&gt;
Constitution &amp;gt; treaties/EU law &amp;gt; &amp;quot;loi&amp;quot; &amp;gt; &amp;quot;ordonnance ratifiée&amp;quot; &amp;gt; &amp;quot;décret&amp;quot; &amp;gt; &amp;quot;arrêté&amp;quot; &amp;gt; &amp;quot;circulaire&amp;quot; (not binding on courts).&lt;br /&gt;
&lt;br /&gt;
=== Codification prefixes ===&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;L.&amp;#039;&amp;#039;&amp;#039; = legislative (&amp;quot;loi&amp;quot;, Parliament). Highest within a code.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;R.&amp;#039;&amp;#039;&amp;#039; = regulatory (&amp;quot;décret en Conseil d&amp;#039;État&amp;quot;).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;D.&amp;#039;&amp;#039;&amp;#039; = regulatory (&amp;quot;décret simple&amp;quot;).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;A.&amp;#039;&amp;#039;&amp;#039; = ministerial order (&amp;quot;arrêté&amp;quot;).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;No prefix&amp;#039;&amp;#039;&amp;#039; = old codes not recodified (Code civil, Code pénal pre-1994).&lt;br /&gt;
&lt;br /&gt;
L. &amp;gt; R. within same code. Same number, different prefix = different articles (L.1234-5 ≠ R.1234-5). If R. contradicts L., L. prevails.&lt;br /&gt;
Include exact prefix in search queries. Test format variations: &amp;lt;code&amp;gt;L. 121-1&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;L121-1&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;L.121-1&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== EU law interaction ===&lt;br /&gt;
&lt;br /&gt;
* Regulation = directly applicable, no transposition.&lt;br /&gt;
* Directive = requires transposition. Untransposed after deadline → invocable vertically (vs State) but NOT horizontally (between private parties).&lt;br /&gt;
* Harmonized areas (data protection, competition, consumer): check FR + EU sources. Use &amp;lt;code&amp;gt;&amp;quot;jurisdiction&amp;quot;: &amp;quot;eu&amp;quot;&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;&amp;quot;eu|fr&amp;quot;&amp;lt;/code&amp;gt;.&lt;br /&gt;
* CJEU preliminary ruling (art. 267 TFEU) = interprets EU law, does NOT decide national case.&lt;br /&gt;
* ECHR: margin of appreciation. Ruling vs Italy ≠ automatically applies to France.&lt;br /&gt;
* Charter Art.7 (private life) and Art.8 (data protection) ≠ ECHR Convention Art.8 (private life). Same wording, different instruments — never confuse.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Major reforms — renumbering traps ==&lt;br /&gt;
&lt;br /&gt;
=== Obligations (ordonnance 2016-131, effective 1 Oct 2016) ===&lt;br /&gt;
&lt;br /&gt;
Key renumbering: 1134→1103+1104, 1147→1231-1, 1382→1240, 1383→1241, 1384→1242.&lt;br /&gt;
Pre-2016 decisions cite old numbers — still valid case law but articles renumbered.&lt;br /&gt;
CRITICAL: contracts before 1 Oct 2016 → old articles apply. Don&amp;#039;t apply new numbering to old contracts.&lt;br /&gt;
&lt;br /&gt;
=== Security interests (ordonnance 2021-1192, effective 1 Jan 2022) ===&lt;br /&gt;
&lt;br /&gt;
Reorganized Code civil Book IV (&amp;quot;sûretés&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
=== Criminal justice for minors (effective 30 Sep 2021) ===&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Code de justice pénale des mineurs&amp;quot; replaced 1945 &amp;quot;ordonnance.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== Criminal procedure (loi n° 2024-364 du 22 avril 2024, effective 1 Jul 2024) ===&lt;br /&gt;
&lt;br /&gt;
Articles 63 et seq. CPP (garde à vue) modified. Check version applicable: pre- or post-1 Jul 2024.&lt;br /&gt;
&lt;br /&gt;
=== Transitional law ===&lt;br /&gt;
&lt;br /&gt;
Applicable version = date of facts, not date of question. Non-retroactivity (art. 2 CC). Immediate application of new procedural law. Criminal &amp;quot;in mitius&amp;quot; (more lenient = retroactive). Check transitional articles in recently reformed texts.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Court system ==&lt;br /&gt;
&lt;br /&gt;
=== court_level mapping (T1 tag) ===&lt;br /&gt;
&lt;br /&gt;
Apex per judicial order (judiciaire / administratif / financier). Pair with &amp;lt;code&amp;gt;court&amp;lt;/code&amp;gt; for FR-specific precision.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;supreme&amp;lt;/code&amp;gt; — cour_cassation (judiciaire), conseil_etat (administratif), cour_des_comptes (financier)&lt;br /&gt;
* &amp;lt;code&amp;gt;appellate&amp;lt;/code&amp;gt; — cour_appel, cour_administrative_appel, tribunal_superieur_appel, cour_appel_financiere&lt;br /&gt;
* &amp;lt;code&amp;gt;first_instance&amp;lt;/code&amp;gt; — tribunal_judiciaire, conseil_prudhommes, tribunal_commerce, tribunal_administratif, chambre_regionale_des_comptes, cour_discipline_budgetaire_financiere&lt;br /&gt;
* &amp;lt;code&amp;gt;constitutional&amp;lt;/code&amp;gt; — conseil_constitutionnel&lt;br /&gt;
* null — tribunal_conflits (sui generis), CNIL / CADA / AMF&lt;br /&gt;
&lt;br /&gt;
=== Judicial order ===&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Cour de cassation&amp;#039;&amp;#039;&amp;#039;: supreme. Controls law, not facts. &amp;quot;Publié au bulletin&amp;quot; = jurisprudential value.&lt;br /&gt;
** &amp;quot;Assemblée plénière&amp;quot; &amp;gt; &amp;quot;Chambre mixte&amp;quot; &amp;gt; individual chamber (civ.1, civ.2, civ.3, com., soc., crim.)&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Cours d&amp;#039;appel&amp;#039;&amp;#039;&amp;#039;: rejudge facts + law.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Tribunal judiciaire&amp;#039;&amp;#039;&amp;#039; (tribunal_judiciaire): general first instance. &amp;#039;&amp;#039;&amp;#039;Conseil de prud&amp;#039;hommes&amp;#039;&amp;#039;&amp;#039; (conseil_prudhommes): labor. &amp;#039;&amp;#039;&amp;#039;Tribunal de commerce&amp;#039;&amp;#039;&amp;#039; (tribunal_commerce): commercial.&lt;br /&gt;
&lt;br /&gt;
=== Administrative order ===&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Conseil d&amp;#039;État&amp;#039;&amp;#039;&amp;#039;: supreme admin court + government advisor (&amp;quot;avis&amp;quot; ≠ &amp;quot;arrêts&amp;quot;).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Cour administrative d&amp;#039;appel&amp;#039;&amp;#039;&amp;#039; (cour_administrative_appel) &amp;gt; &amp;#039;&amp;#039;&amp;#039;Tribunal administratif&amp;#039;&amp;#039;&amp;#039; (tribunal_administratif).&lt;br /&gt;
&lt;br /&gt;
=== Specialized ===&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Conseil constitutionnel&amp;#039;&amp;#039;&amp;#039;: QPC can invalidate provisions.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Tribunal des conflits&amp;#039;&amp;#039;&amp;#039;: judicial vs admin jurisdiction conflicts.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;CNIL&amp;#039;&amp;#039;&amp;#039;: guidelines → search(tags={&amp;quot;jurisdiction&amp;quot;: &amp;quot;fr&amp;quot;, &amp;quot;source&amp;quot;: &amp;quot;cnil&amp;quot;}). Sanctions → search(tags={&amp;quot;jurisdiction&amp;quot;: &amp;quot;fr&amp;quot;, &amp;quot;kind&amp;quot;: &amp;quot;decision&amp;quot;, &amp;quot;court&amp;quot;: &amp;quot;cnil&amp;quot;}).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;CADA&amp;#039;&amp;#039;&amp;#039;: access to admin documents. Opinions → search(tags={&amp;quot;jurisdiction&amp;quot;: &amp;quot;fr&amp;quot;, &amp;quot;source&amp;quot;: &amp;quot;cada&amp;quot;}).&lt;br /&gt;
&lt;br /&gt;
=== Financial order ===&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Cour des comptes&amp;#039;&amp;#039;&amp;#039; (cour_des_comptes): apex of the financial order. Since 2023: 1st instance (contentious chamber, absorbed CDBF) + cassation over CAF. Pre-2023: appellate for CRC. search(tags={&amp;quot;jurisdiction&amp;quot;: &amp;quot;fr&amp;quot;, &amp;quot;kind&amp;quot;: &amp;quot;decision&amp;quot;, &amp;quot;court&amp;quot;: &amp;quot;cour_des_comptes&amp;quot;}).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Chambres régionales des comptes&amp;#039;&amp;#039;&amp;#039; (chambre_regionale_des_comptes): first instance for local authorities. search(tags={&amp;quot;jurisdiction&amp;quot;: &amp;quot;fr&amp;quot;, &amp;quot;kind&amp;quot;: &amp;quot;decision&amp;quot;, &amp;quot;court&amp;quot;: &amp;quot;chambre_regionale_des_comptes&amp;quot;}).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Cour de discipline budgétaire et financière&amp;#039;&amp;#039;&amp;#039; (cour_discipline_budgetaire_financiere): abolished 2023, integrated into CdC contentious chamber. Historical decisions (1954-2022) remain searchable. search(tags={&amp;quot;jurisdiction&amp;quot;: &amp;quot;fr&amp;quot;, &amp;quot;kind&amp;quot;: &amp;quot;decision&amp;quot;, &amp;quot;court&amp;quot;: &amp;quot;cour_discipline_budgetaire_financiere&amp;quot;}).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Cour d&amp;#039;appel financière&amp;#039;&amp;#039;&amp;#039; (cour_appel_financiere, CAF): created 2023, hears appeals from CRC and CdC contentious chamber. Reviewed en cassation by CdC. search(tags={&amp;quot;jurisdiction&amp;quot;: &amp;quot;fr&amp;quot;, &amp;quot;kind&amp;quot;: &amp;quot;decision&amp;quot;, &amp;quot;court&amp;quot;: &amp;quot;cour_appel_financiere&amp;quot;}).&lt;br /&gt;
&lt;br /&gt;
=== Publication grades (official_grade) ===&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Administrative courts&amp;#039;&amp;#039;&amp;#039; (PUBLI_RECUEIL):&lt;br /&gt;
* A: &amp;quot;Publié au Recueil Lebon&amp;quot; (conseil_etat and tribunal_conflits only) — highest_importance&lt;br /&gt;
* B: &amp;quot;Mentionné aux Tables du Lebon&amp;quot; (conseil_etat and tribunal_conflits only) — high_importance&lt;br /&gt;
* R: &amp;quot;Intérêt jurisprudentiel majeur&amp;quot; (cour_administrative_appel and tribunal_administratif — equivalent of A) — highest_importance&lt;br /&gt;
* C+: &amp;quot;Intérêt signalé&amp;quot; (cour_administrative_appel and tribunal_administratif — equivalent of B) — high_importance&lt;br /&gt;
* C: &amp;quot;Inédit&amp;quot; — low_importance&lt;br /&gt;
* D, Z: &amp;quot;Intérêt limité aux parties&amp;quot; — minimal_importance&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Cour de cassation&amp;#039;&amp;#039;&amp;#039; (post-2021):&lt;br /&gt;
* rapport: &amp;quot;Sélectionné pour le Rapport annuel&amp;quot; — highest_importance&lt;br /&gt;
* bulletin: &amp;quot;Publié au Bulletin des arrêts&amp;quot; — high_importance&lt;br /&gt;
* diffuse: &amp;quot;Diffusé sur Légifrance&amp;quot; — low_importance&lt;br /&gt;
* non_diffuse: &amp;quot;Non diffusé&amp;quot; — minimal_importance&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Cour de cassation&amp;#039;&amp;#039;&amp;#039; (pre-2021, decisions before 2021-06-15):&lt;br /&gt;
* rapport (R): &amp;quot;Rapport annuel&amp;quot; — highest_importance&lt;br /&gt;
* bulletin (ancien P): &amp;quot;Publié au Bulletin&amp;quot; — high_importance&lt;br /&gt;
* bulletin_information (ancien B): &amp;quot;Mentionné au BICC&amp;quot; — medium_importance&lt;br /&gt;
* internet (ancien I): &amp;quot;Diffusé sur internet&amp;quot; — low_importance&lt;br /&gt;
* diffuse (ancien D): &amp;quot;Diffusé aux bases&amp;quot; — low_importance&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Lower courts&amp;#039;&amp;#039;&amp;#039; (cour_appel, tribunal_judiciaire, tribunal_commerce):&lt;br /&gt;
* particular_interest: &amp;quot;Arrêt d&amp;#039;intérêt particulier&amp;quot; — highest_importance (only ~1,400 decisions out of 1.25M)&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Financial courts&amp;#039;&amp;#039;&amp;#039; (cour_des_comptes, chambre_regionale_des_comptes, cour_discipline_budgetaire_financiere, cour_appel_financiere):&lt;br /&gt;
* recueil: &amp;quot;Publié au Recueil des juridictions financières&amp;quot; — high_importance (~25% of decisions)&lt;br /&gt;
&lt;br /&gt;
=== Formations (ascending solemnity) ===&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Cour de cassation&amp;#039;&amp;#039;&amp;#039;: F: &amp;quot;formation restreinte&amp;quot; (reduced_bench) &amp;lt; standard chamber (standard_bench) &amp;lt; FS: &amp;quot;formation de section&amp;quot; (grand_bench) &amp;lt; FP: &amp;quot;formation plénière de chambre&amp;quot; (grand_bench) &amp;lt; &amp;quot;Chambre mixte&amp;quot; (combined_chambers) &amp;lt; &amp;quot;Assemblée plénière&amp;quot; (full_court). Note: at the Cass, &amp;quot;Chambre mixte&amp;quot; (combined_chambers) outranks &amp;quot;formation plénière&amp;quot; (grand_bench) — diverges from generic solemnity ordering.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Conseil d&amp;#039;État&amp;#039;&amp;#039;&amp;#039;: &amp;quot;Juge des référés&amp;quot; (single_judge) &amp;lt; &amp;quot;Formation à 3&amp;quot; (reduced_bench) &amp;lt; &amp;quot;Chambre seule&amp;quot; (standard_bench) &amp;lt; &amp;quot;Chambres réunies&amp;quot;/SSR (combined_chambers) &amp;lt; &amp;quot;Section du contentieux&amp;quot; (grand_bench) &amp;lt; &amp;quot;Assemblée du contentieux&amp;quot; (full_court)&lt;br /&gt;
&lt;br /&gt;
=== Reading a decision ===&lt;br /&gt;
&lt;br /&gt;
Structure: &amp;#039;&amp;#039;&amp;#039;visa&amp;#039;&amp;#039;&amp;#039; (&amp;quot;Vu l&amp;#039;article...&amp;quot;) = legal basis → &amp;#039;&amp;#039;&amp;#039;motifs&amp;#039;&amp;#039;&amp;#039; = reasoning (ratio decidendi + obiter dicta) → &amp;#039;&amp;#039;&amp;#039;dispositif&amp;#039;&amp;#039;&amp;#039; (&amp;quot;PAR CES MOTIFS&amp;quot;) = operative part (res judicata).&lt;br /&gt;
&lt;br /&gt;
Key terms:&lt;br /&gt;
* &amp;quot;Casse et annule&amp;quot; = quashes (→ &amp;quot;renvoi&amp;quot;, case NOT over)&lt;br /&gt;
* &amp;quot;Casse sans renvoi&amp;quot; = quashes and decides directly&lt;br /&gt;
* &amp;quot;Rejette&amp;quot; = upholds appealed decision&lt;br /&gt;
* &amp;quot;Infirme&amp;quot;/&amp;quot;confirme&amp;quot; = reverses/upholds (appeal)&lt;br /&gt;
* &amp;quot;Débouté&amp;quot; = claim dismissed (civil) ≠ &amp;quot;relaxé&amp;quot; = acquitted (criminal)&lt;br /&gt;
* &amp;quot;Irrecevable&amp;quot; = inadmissible (can&amp;#039;t examine merits) ≠ &amp;quot;mal fondé&amp;quot; = rejected on merits&lt;br /&gt;
&lt;br /&gt;
Post-2019: Cass. switched from &amp;quot;Attendu que&amp;quot; to direct style. Both equally authoritative.&lt;br /&gt;
Processual roles change between instances — identify WHO is WHO in each decision.&lt;br /&gt;
&lt;br /&gt;
=== Decision analysis — French courts ===&lt;br /&gt;
&lt;br /&gt;
Supplements core &amp;quot;Structured decision analysis&amp;quot; (§5).&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Cour de cassation&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
* Claims = &amp;quot;moyen du pourvoi&amp;quot; (grounds the party argues Cass should quash on) vs cour d&amp;#039;appel position. Moyen ≠ court&amp;#039;s position — it&amp;#039;s what the party claims was wrong.&lt;br /&gt;
* Visa (&amp;quot;Vu l&amp;#039;article...&amp;quot;) = legal basis. Visa + cassation = lower court violated that text.&lt;br /&gt;
* Chapeau = principle stated before application. May be narrower or broader than statutory text.&lt;br /&gt;
* Cass controls law, not facts (see &amp;quot;Court system&amp;quot; above). Do not extract factual findings from a Cass decision — those are the lower court&amp;#039;s. Cass says whether the law was correctly applied.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Conseil d&amp;#039;État&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
* More explicit reasoning than Cass. &amp;quot;Considérant&amp;quot; → direct style since 2019.&lt;br /&gt;
* CE may raise moyens d&amp;#039;ordre public and reformulate the legal question beyond parties&amp;#039; framing.&lt;br /&gt;
* Avis contentieux: same structure, no dispositif — answers question, does not decide case.&lt;br /&gt;
* Dispositif: numbered articles (&amp;quot;Article 1er: ...&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Conseil constitutionnel (QPC)&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
* Saisine: who referred, which provision challenged, which rights invoked.&lt;br /&gt;
* Dispositif: conformité / non-conformité / conformité sous réserve. The reservation IS the holding — often more important than the conformity declaration.&lt;br /&gt;
* Abrogation may be deferred (&amp;quot;à compter du...&amp;quot;) — check effective date before citing.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Cour d&amp;#039;appel / Tribunal judiciaire&amp;#039;&amp;#039;&amp;#039; (cour_appel / tribunal_judiciaire):&lt;br /&gt;
* Rejudge facts AND law. Factual findings are the court&amp;#039;s own.&lt;br /&gt;
* Less standardized structure — locate legal issue and reasoning chain in longer prose.&lt;br /&gt;
&lt;br /&gt;
=== Case number formats ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Court (court tag value) !! Format !! Example&lt;br /&gt;
|-&lt;br /&gt;
| cour_cassation || &amp;lt;code&amp;gt;YY-NN.NNN&amp;lt;/code&amp;gt; || 24-14.752&lt;br /&gt;
|-&lt;br /&gt;
| cour_appel / tribunal_judiciaire || &amp;lt;code&amp;gt;YY/NNNNN&amp;lt;/code&amp;gt; || 21/00091&lt;br /&gt;
|-&lt;br /&gt;
| conseil_etat || &amp;lt;code&amp;gt;NNNNNN&amp;lt;/code&amp;gt; (sequential) || 486329&lt;br /&gt;
|-&lt;br /&gt;
| tribunal_administratif / cour_administrative_appel || &amp;lt;code&amp;gt;YYLLNNNNN&amp;lt;/code&amp;gt; (year + court code) || 24PA01233&lt;br /&gt;
|-&lt;br /&gt;
| conseil_constitutionnel || &amp;lt;code&amp;gt;YYYY-NNN TYPE&amp;lt;/code&amp;gt; || 2021-823 DC&lt;br /&gt;
|-&lt;br /&gt;
| tribunal_conflits || &amp;lt;code&amp;gt;CNNNN&amp;lt;/code&amp;gt; || C4321&lt;br /&gt;
|-&lt;br /&gt;
| cour_des_comptes || &amp;lt;code&amp;gt;S-YYYY-NNNN&amp;lt;/code&amp;gt; || S-2025-0381&lt;br /&gt;
|-&lt;br /&gt;
| cour_discipline_budgetaire_financiere || &amp;lt;code&amp;gt;NNN-NNN&amp;lt;/code&amp;gt; || 264-865&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Cass. pourvoi: digits 3-4 of the sequence correlate with chamber (80-89 = criminal, ~10-25 = civil/commercial/social). A &amp;quot;Cass. civ. 1re&amp;quot; citing n°25-85.337 is suspicious — 85 suggests criminal chamber.&lt;br /&gt;
&lt;br /&gt;
=== &amp;quot;Référés&amp;quot; ===&lt;br /&gt;
&lt;br /&gt;
Provisional measures (&amp;quot;liberté&amp;quot;, &amp;quot;suspension&amp;quot;, &amp;quot;provision&amp;quot;, &amp;quot;expertise&amp;quot;). Single judge, &amp;quot;ordonnance.&amp;quot; Lower standard: &amp;quot;urgence&amp;quot; + &amp;quot;doute sérieux&amp;quot;/&amp;quot;moyens sérieux.&amp;quot; Provisional only, no res judicata on merits. Always flag provisional nature when citing.&lt;br /&gt;
&lt;br /&gt;
=== &amp;quot;Avis contentieux&amp;quot; ===&lt;br /&gt;
&lt;br /&gt;
Advisory opinions: Cass (since 1991, L441-1 COJ), CE (since 1987, L113-1 CJA). Novel legal questions from lower courts. Not binding but highly persuasive. No res judicata, no parties. search(tags={&amp;quot;jurisdiction&amp;quot;: &amp;quot;fr&amp;quot;, &amp;quot;kind&amp;quot;: &amp;quot;decision&amp;quot;, &amp;quot;type&amp;quot;: &amp;quot;advisory_opinion&amp;quot;}).&lt;br /&gt;
&lt;br /&gt;
⚠️ EU AG opinions (CJEU Advocate General): not yet ingested — type=advisory_opinion with jurisdiction=&amp;quot;eu&amp;quot; returns 0 results.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Labor law ==&lt;br /&gt;
&lt;br /&gt;
=== Three-tier hierarchy ===&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Code du travail&amp;quot; (statutory floor) → &amp;quot;convention collective de branche&amp;quot; → &amp;quot;accord d&amp;#039;entreprise.&amp;quot;&lt;br /&gt;
Since 2017 Macron ordonnances: company agreements can override branch in most areas EXCEPT locked domains (&amp;quot;minima salariaux&amp;quot;, &amp;quot;classifications&amp;quot;, &amp;quot;mutualisation formation&amp;quot;, &amp;quot;prévoyance&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
=== bargaining_level (T2 tag) ===&lt;br /&gt;
&lt;br /&gt;
Filters collective / company agreements by negotiation level. Currently emitted (acco source): &amp;lt;code&amp;gt;enterprise&amp;lt;/code&amp;gt; (accord d&amp;#039;entreprise), &amp;lt;code&amp;gt;sectoral&amp;lt;/code&amp;gt; (accord de branche). ADR also defines &amp;lt;code&amp;gt;inter_sectoral&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;territorial&amp;lt;/code&amp;gt; (not yet populated). Example: &amp;lt;code&amp;gt;search(tags={&amp;quot;jurisdiction&amp;quot;: &amp;quot;fr&amp;quot;, &amp;quot;source&amp;quot;: &amp;quot;acco&amp;quot;, &amp;quot;bargaining_level&amp;quot;: &amp;quot;enterprise&amp;quot;})&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== IDCC ===&lt;br /&gt;
&lt;br /&gt;
Each collective agreement has an IDCC number. IDCCs merge (metallurgy → IDCC 3248, 2024). Never assume IDCC is current.&lt;br /&gt;
&lt;br /&gt;
=== Categories ===&lt;br /&gt;
&lt;br /&gt;
Different rules per category: &amp;quot;ouvriers&amp;quot;, &amp;quot;employés&amp;quot;, ETAM, &amp;quot;cadres.&amp;quot; Check section_path in results.&lt;br /&gt;
&lt;br /&gt;
=== Applicable agreement ===&lt;br /&gt;
&lt;br /&gt;
Depends on EMPLOYER&amp;#039;s main activity, not employee&amp;#039;s job. Developer at industrial company → metallurgy, not Syntec.&lt;br /&gt;
&lt;br /&gt;
=== Sources ===&lt;br /&gt;
&lt;br /&gt;
* kali = official texts (DILA/Légifrance). acco = filed company agreements.&lt;br /&gt;
* &amp;quot;Étendue&amp;quot; = all employers in sector. Non-extended = only signatory members.&lt;br /&gt;
&lt;br /&gt;
=== Critical ===&lt;br /&gt;
&lt;br /&gt;
Never from memory on amounts/durations/IDCC. Frequent amendments by &amp;quot;avenant.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Legislation ==&lt;br /&gt;
&lt;br /&gt;
=== Territorial scope ===&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Alsace-Moselle&amp;#039;&amp;#039;&amp;#039;: local law for associations (not &amp;quot;loi 1901&amp;quot;), local social security, civil bankruptcy, extra holidays (Good Friday, 26 Dec), &amp;quot;livre foncier.&amp;quot;&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;DOM&amp;#039;&amp;#039;&amp;#039; (Guadeloupe, Martinique, Guyane, Réunion, Mayotte): FR law with adaptations. Mayotte: specific labor code, customary personal status. L7xx articles = overseas — don&amp;#039;t cite for metropolitan.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;COM&amp;#039;&amp;#039;&amp;#039; (Polynesia, New Caledonia, Wallis): &amp;quot;spécialité législative&amp;quot; — FR law does NOT apply unless expressly stated.&lt;br /&gt;
&lt;br /&gt;
=== Text types ===&lt;br /&gt;
&lt;br /&gt;
Code, &amp;quot;loi&amp;quot; (Parliament), &amp;quot;ordonnance&amp;quot; (gov + parliamentary authorization), &amp;quot;décret&amp;quot;, &amp;quot;arrêté.&amp;quot;&lt;br /&gt;
&amp;quot;Circulaire&amp;quot; = admin interpretation, NOT in this database (→ circulaires.gouv.fr), not binding on courts.&lt;br /&gt;
&lt;br /&gt;
=== nature tag (T3 precision) ===&lt;br /&gt;
&lt;br /&gt;
Source-native classification, slugified (lowercase, no accents, spaces → &amp;lt;code&amp;gt;_&amp;lt;/code&amp;gt;). Use when T1 &amp;lt;code&amp;gt;type&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;document_form&amp;lt;/code&amp;gt; are too broad.&lt;br /&gt;
* Legislation (LEGI): &amp;lt;code&amp;gt;loi&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;loi_organique&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;decret&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ordonnance&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;arrete&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Decisions: &amp;lt;code&amp;gt;arret&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ordonnance&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;avis&amp;lt;/code&amp;gt;; Conseil constitutionnel: &amp;lt;code&amp;gt;dc&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;qpc&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;lp&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;lom&amp;lt;/code&amp;gt;.&lt;br /&gt;
Example: &amp;lt;code&amp;gt;search(tags={&amp;quot;jurisdiction&amp;quot;: &amp;quot;fr&amp;quot;, &amp;quot;kind&amp;quot;: &amp;quot;decision&amp;quot;, &amp;quot;nature&amp;quot;: &amp;quot;qpc&amp;quot;})&amp;lt;/code&amp;gt; — QPC decisions only.&lt;br /&gt;
Use &amp;lt;code&amp;gt;discover=&amp;quot;nature&amp;quot;&amp;lt;/code&amp;gt; to enumerate actual values.&lt;br /&gt;
&lt;br /&gt;
=== JORF (Journal officiel) ===&lt;br /&gt;
&lt;br /&gt;
JORF is the official gazette — the original publication of all legislation. LEGI is the consolidated version. Both are in the corpus. &amp;#039;&amp;#039;&amp;#039;JORF is hidden from default search&amp;#039;&amp;#039;&amp;#039; (LEGI is preferred). To search JORF explicitly: &amp;lt;code&amp;gt;search(tags={&amp;quot;source&amp;quot;: &amp;quot;jorf&amp;quot;})&amp;lt;/code&amp;gt;. JO issues (gazette containers): &amp;lt;code&amp;gt;search(kind=&amp;quot;notice&amp;quot;, tags={&amp;quot;source&amp;quot;: &amp;quot;jorf&amp;quot;, &amp;quot;type&amp;quot;: &amp;quot;gazette_publication&amp;quot;})&amp;lt;/code&amp;gt;. Resolve a JO issue: &amp;lt;code&amp;gt;get_document(reference=&amp;quot;JO du 11 avril 2026&amp;quot;)&amp;lt;/code&amp;gt;. LEGI↔JORF linked by &amp;lt;code&amp;gt;source_text&amp;lt;/code&amp;gt; edges — visible in get_document results.&lt;br /&gt;
&lt;br /&gt;
=== Code abbreviations ===&lt;br /&gt;
&lt;br /&gt;
Common abbreviations in legal writing — the resolver normalizes these automatically:&lt;br /&gt;
C. civ. = Code civil, C. com. = Code de commerce, C. trav. = Code du travail, C. pén. = Code pénal, CPC = Code de procédure civile, CPP = Code de procédure pénale, CGI = Code général des impôts, CSS = Code de la sécurité sociale, C. cons./C. conso. = Code de la consommation, CPI = Code de la propriété intellectuelle, CMF = Code monétaire et financier, CSP = Code de la santé publique, CJA = Code de justice administrative, CGCT = Code général des collectivités territoriales.&lt;br /&gt;
Full list: &amp;lt;code&amp;gt;lister_codes_juridiques&amp;lt;/code&amp;gt; or get_document(reference=&amp;quot;&amp;lt;abbreviation&amp;gt;&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
=== Enforcement status ===&lt;br /&gt;
&lt;br /&gt;
See &amp;quot;Enforcement status&amp;quot; section below for canonical values used in tags.&lt;br /&gt;
&lt;br /&gt;
=== Suppletive vs mandatory ===&lt;br /&gt;
&lt;br /&gt;
* Mandatory (&amp;quot;ordre public&amp;quot;): &amp;quot;toute clause contraire est réputée non écrite.&amp;quot; Cannot override.&lt;br /&gt;
* Suppletive: &amp;quot;sauf stipulation contraire.&amp;quot; Contract can override → mention this caveat.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Doctrine ==&lt;br /&gt;
&lt;br /&gt;
=== BOFiP ===&lt;br /&gt;
&lt;br /&gt;
Tax administration&amp;#039;s official interpretation. Opposable to fisc (cannot apply less favorable position). NOT binding on courts. Series: IR, IS, TVA, BIC, BNC, CF.&lt;br /&gt;
&lt;br /&gt;
=== CNIL ===&lt;br /&gt;
&lt;br /&gt;
Guidelines/recommendations = soft law. Widely followed, used by courts as diligence standard.&lt;br /&gt;
Sanctions (fines, formal notices) → search(tags={&amp;quot;jurisdiction&amp;quot;: &amp;quot;fr&amp;quot;, &amp;quot;kind&amp;quot;: &amp;quot;decision&amp;quot;, &amp;quot;court&amp;quot;: &amp;quot;cnil&amp;quot;}), NOT here.&lt;br /&gt;
&lt;br /&gt;
=== CADA ===&lt;br /&gt;
&lt;br /&gt;
Advisory opinions on access to admin documents.&lt;br /&gt;
&lt;br /&gt;
=== NOT available ===&lt;br /&gt;
&lt;br /&gt;
Academic doctrine (treatises, case commentaries) is NOT in this server. Flag this gap when relevant.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Deadline computation ==&lt;br /&gt;
&lt;br /&gt;
* &amp;quot;Jours francs&amp;quot;: notification day and expiration day don&amp;#039;t count.&lt;br /&gt;
* &amp;quot;Jours calendaires&amp;quot;: all days. &amp;quot;Jours ouvrables&amp;quot;: Mon-Sat minus holidays. &amp;quot;Jours ouvrés&amp;quot;: Mon-Fri minus holidays.&lt;br /&gt;
* Expires on Sat/Sun/holiday → extended to next business day (art. 642 CPC).&lt;br /&gt;
* Prescription start: often &amp;quot;date holder knew or should have known&amp;quot; (art. 2224 CC), not event date. Hidden defects: date of discovery, not sale.&lt;br /&gt;
* Interruption (&amp;quot;assignation&amp;quot;, debt recognition) → restarts clock. Suspension (mediation, minority) → freezes clock.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Common traps ==&lt;br /&gt;
&lt;br /&gt;
* &amp;quot;Obligation de moyens&amp;quot; (creditor proves fault) vs &amp;quot;résultat&amp;quot; (debtor presumed liable unless force majeure).&lt;br /&gt;
* &amp;quot;Responsabilité contractuelle&amp;quot; ≠ &amp;quot;délictuelle.&amp;quot; No cumulation. Different regime, different prescription.&lt;br /&gt;
* &amp;quot;Nullité&amp;quot; (never existed) ≠ &amp;quot;résolution&amp;quot; (retroactive destruction) ≠ &amp;quot;résiliation&amp;quot; (future only).&lt;br /&gt;
* &amp;quot;Bonne foi&amp;quot; (art. 1104 CC): mandatory in all contracts. Formally compliant but bad faith → sanctioned.&lt;br /&gt;
* &amp;quot;Abus de droit&amp;quot;: exercising right solely to harm → sanctioned.&lt;br /&gt;
* &amp;quot;Enrichissement injustifié&amp;quot; (art. 1303 CC): subsidiary only — not available if other basis exists.&lt;br /&gt;
* &amp;quot;Solidarité ne se présume pas&amp;quot; (art. 1310 CC) — must be in contract or statute.&lt;br /&gt;
* &amp;quot;Loi&amp;quot; without &amp;quot;décret d&amp;#039;application&amp;quot; = potentially inapplicable. Check &amp;#039;Implementing texts&amp;#039; in get_document. Text mentions &amp;quot;fixé par décret&amp;quot; but no decree → flag.&lt;br /&gt;
* Non-retroactivity of laws. Exception: criminal law &amp;quot;in mitius.&amp;quot;&lt;br /&gt;
* &amp;quot;Exécution provisoire de droit&amp;quot; since 2020: first-instance judgments immediately enforceable. Appeal ≠ suspension.&lt;br /&gt;
* Contract qualification ≠ party denomination: &amp;quot;prestation de services&amp;quot; with subordination = &amp;quot;contrat de travail.&amp;quot;&lt;br /&gt;
* 4 &amp;quot;bail&amp;quot; types = 4 regimes: habitation (loi 1989) ≠ commercial ≠ professionnel ≠ rural.&lt;br /&gt;
* 3 couple regimes: &amp;quot;mariage&amp;quot; (+ &amp;quot;régime matrimonial&amp;quot;) ≠ PACS ≠ &amp;quot;concubinage.&amp;quot;&lt;br /&gt;
* Construction: 3 warranties (&amp;quot;parfait achèvement&amp;quot; 1y, &amp;quot;biennale&amp;quot; 2y, &amp;quot;décennale&amp;quot; 10y).&lt;br /&gt;
* Medical liability: 3 regimes (&amp;quot;faute&amp;quot;, &amp;quot;perte de chance&amp;quot;, &amp;quot;infection nosocomiale&amp;quot;).&lt;br /&gt;
* Digital: &amp;quot;hébergeur&amp;quot; ≠ &amp;quot;éditeur&amp;quot; (LCEN/DSA — different liability).&lt;br /&gt;
* Proof: free (criminal, commercial), regulated &amp;gt;1500€ civil (1359 CC). Burden: claimant (1353 CC), reversed in harassment (shared), consumer (conformity presumed). Illegally obtained proof: admissible if proportionate (Ass. plén. 22 Dec 2023).&lt;br /&gt;
* &amp;quot;Titre exécutoire&amp;quot; required for enforcement. &amp;quot;Astreinte&amp;quot; for non-compliance, separate liquidation.&lt;br /&gt;
* &amp;quot;Trêve hivernale&amp;quot; (1 Nov – 31 Mar): no eviction of primary residence occupants (L412-6 CPCE). Check exceptions and dates — calendar may shift.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Citation self-check — FR illustrations ==&lt;br /&gt;
&lt;br /&gt;
Core rule 3b applied to French law:&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Source match&amp;#039;&amp;#039;&amp;#039;: L442-1 C.com ≠ L442-1 C.civ — same number, different code, different rule. Verify code name.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Content fidelity&amp;#039;&amp;#039;&amp;#039;: art. 1240 — &amp;quot;oblige à indemniser&amp;quot; ≠ &amp;quot;oblige celui par la faute duquel il est arrivé à le réparer.&amp;quot; The word &amp;quot;faute&amp;quot; is the entire condition.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Completeness&amp;#039;&amp;#039;&amp;#039;: art. 1103 (force obligatoire) without art. 1104 (bonne foi) and ordre public exceptions is half the picture.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Decision reality&amp;#039;&amp;#039;&amp;#039;: Cass. civ. 1re, 15 mars 2023, n°21-12.345 — correct format, plausible date, real chamber. But if not retrieved via tools: fabricated. See &amp;quot;Case number formats&amp;quot; above for valid patterns.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Attribution&amp;#039;&amp;#039;&amp;#039;: Cass. com. ≠ Cass. civ. 1re — different chamber, different authority, potentially opposite rule on same question. Pourvoi digits 3-4 in 80-89 range → likely criminal, not civil.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Practical reflexes ==&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Prescription&amp;#039;&amp;#039;&amp;#039;: 5y civil (2224 CC), 2y consumer (L218-2 C.conso), 10y bodily (2226 CC), 1y dismiss (L1471-1 C.trav), 3y salary (L3245-1 C.trav), 2mo admin (R421-1 CJA), 6y &amp;quot;délit&amp;quot;, 20y &amp;quot;crime&amp;quot;, 1y &amp;quot;contravention.&amp;quot; Start = &amp;quot;knew or should have known&amp;quot;, not event date. Always check — user may be right on substance but time-barred.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Short deadlines&amp;#039;&amp;#039;&amp;#039;: contesting dismissal 12 months, building permit 2 months, &amp;quot;référé&amp;quot; urgency.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Pre-litigation&amp;#039;&amp;#039;&amp;#039;: &amp;quot;mise en demeure&amp;quot; often mandatory. Mediation mandatory in some consumer and labor disputes. &amp;quot;Recours gracieux&amp;quot; / &amp;quot;hiérarchique&amp;quot; in admin law.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Multiple avenues&amp;#039;&amp;#039;&amp;#039;: same problem → civil + criminal + admin paths. Criminal acquittal ≠ civil immunity.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Insurance&amp;#039;&amp;#039;&amp;#039;: &amp;quot;RC pro&amp;quot;, &amp;quot;protection juridique&amp;quot;, D&amp;amp;O, &amp;quot;décennale.&amp;quot; Always ask if user has legal protection insurance.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Collective proceedings&amp;#039;&amp;#039;&amp;#039; (&amp;quot;sauvegarde&amp;quot;/&amp;quot;redressement judiciaire&amp;quot;/&amp;quot;liquidation judiciaire&amp;quot;): individual actions frozen. Check before pursuing.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Annual amounts&amp;#039;&amp;#039;&amp;#039;: SMIC, tax brackets, &amp;quot;taux d&amp;#039;intérêt légal&amp;quot;, &amp;quot;plafond sécurité sociale&amp;quot; change annually. Always date amounts. Flag potential staleness.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Data limitations — French sources ==&lt;br /&gt;
&lt;br /&gt;
What is NOT in this corpus (flag explicitly when relevant):&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;First-instance decisions&amp;#039;&amp;#039;&amp;#039; (TJ, CPH, TC): not systematically published. Practice may differ from supreme courts.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Academic doctrine&amp;#039;&amp;#039;&amp;#039; (treatises, &amp;quot;fascicules&amp;quot;, &amp;quot;notes d&amp;#039;arrêt&amp;quot;): NOT available. Only BOFiP + CNIL + CADA.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Circulaires&amp;#039;&amp;#039;&amp;#039;: not in database. → circulaires.gouv.fr (not binding on courts anyway).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Notarial practice and customs&amp;#039;&amp;#039;&amp;#039;: not available.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Pénal&amp;#039;&amp;#039;&amp;#039;: limited coverage of criminal court decisions (Cass. crim. is in, but lower criminal courts are sparse).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Avocats consultations / mémos internes / DD&amp;#039;&amp;#039;&amp;#039;: confidential, not available.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Recent enactments&amp;#039;&amp;#039;&amp;#039;: ingestion lag. Always flag for very recent texts (&amp;lt; 48h).&lt;br /&gt;
&lt;br /&gt;
=== Decision sources — search by court, not source ===&lt;br /&gt;
&lt;br /&gt;
Overlapping sources: &amp;lt;code&amp;gt;cass&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;inca&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;judilibre&amp;lt;/code&amp;gt; = Cour de cassation; &amp;lt;code&amp;gt;jade&amp;lt;/code&amp;gt;,&lt;br /&gt;
&amp;lt;code&amp;gt;ce_opendata&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;judilibre&amp;lt;/code&amp;gt; = admin courts; &amp;lt;code&amp;gt;capp&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;judilibre&amp;lt;/code&amp;gt; = cours d&amp;#039;appel;&lt;br /&gt;
&amp;lt;code&amp;gt;jufi&amp;lt;/code&amp;gt; = financial courts (CdC, CRC, CDBF, CAF — ~3,500 decisions, 1954-present).&lt;br /&gt;
Dedup keeps one copy. Use &amp;lt;code&amp;gt;&amp;quot;court&amp;quot;: &amp;quot;cour_cassation&amp;quot;&amp;lt;/code&amp;gt;, not &amp;lt;code&amp;gt;&amp;quot;source&amp;quot;: &amp;quot;cass&amp;quot;&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;code&amp;gt;source&amp;lt;/code&amp;gt; filtering may miss decisions.&lt;br /&gt;
&lt;br /&gt;
=== Legislation sources — LEGI vs JORF ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;legi&amp;lt;/code&amp;gt; = consolidated legislation (versioned, with enforcement_status). &amp;lt;code&amp;gt;jorf&amp;lt;/code&amp;gt; = official gazette (original publication, no versioning). Same text exists in both with different IDs (LEGITEXT/JORFTEXT). JORF hidden from default search — LEGI preferred. JORF adds: JO issue structure, visas, ministère metadata. ~4% of JORF texts have no LEGI counterpart (nominations, old texts).&lt;br /&gt;
&lt;br /&gt;
== Stemming gotchas (FR) ==&lt;br /&gt;
&lt;br /&gt;
PostgreSQL stemming covers many forms but NOT all. Common pairs to OR explicitly:&lt;br /&gt;
* &amp;quot;contractuel&amp;quot; ≠ &amp;quot;contrat&amp;quot;&lt;br /&gt;
* &amp;quot;prescription&amp;quot; ≠ &amp;quot;prescrire&amp;quot;&lt;br /&gt;
* &amp;quot;responsabilité&amp;quot; matches &amp;quot;responsable&amp;quot; (OK)&lt;br /&gt;
* &amp;quot;juger&amp;quot; matches &amp;quot;jugement&amp;quot; (OK)&lt;br /&gt;
&lt;br /&gt;
When in doubt, use OR.&lt;br /&gt;
&lt;br /&gt;
== Enforcement status ==&lt;br /&gt;
&lt;br /&gt;
Tag: &amp;lt;code&amp;gt;enforcement_status&amp;lt;/code&amp;gt; (canonical international values)&lt;br /&gt;
* &amp;lt;code&amp;gt;in_force&amp;lt;/code&amp;gt; = currently in force&lt;br /&gt;
* &amp;lt;code&amp;gt;deferred_enforcement&amp;lt;/code&amp;gt; = enacted but not yet applicable → flag the future effective date&lt;br /&gt;
* &amp;lt;code&amp;gt;deferred_repeal&amp;lt;/code&amp;gt; = still in force until a future date → cite but flag the upcoming repeal&lt;br /&gt;
* &amp;lt;code&amp;gt;repealed&amp;lt;/code&amp;gt; = repealed → NEVER cite as current law&lt;br /&gt;
* &amp;lt;code&amp;gt;superseded&amp;lt;/code&amp;gt; = historical version, a newer version exists → cite the newer version&lt;br /&gt;
* &amp;lt;code&amp;gt;never_in_force&amp;lt;/code&amp;gt; = modified before its effective date, never applied → never cite&lt;br /&gt;
* &amp;lt;code&amp;gt;expired&amp;lt;/code&amp;gt; = lapsed by its own terms (sunset clause) → no longer applicable&lt;br /&gt;
* &amp;lt;code&amp;gt;annulled&amp;lt;/code&amp;gt; = struck down by a court (typically retroactive) → never cite&lt;br /&gt;
* &amp;lt;code&amp;gt;transferred&amp;lt;/code&amp;gt; = content moved to a different article (renumbering) → cite the new location&lt;br /&gt;
* &amp;lt;code&amp;gt;denounced&amp;lt;/code&amp;gt; = collective agreement repudiated by a party → no longer applies&lt;br /&gt;
* &amp;lt;code&amp;gt;disjoined&amp;lt;/code&amp;gt; = version split into multiple articles → cite the resulting articles&lt;br /&gt;
* &amp;lt;code&amp;gt;conditional&amp;lt;/code&amp;gt; = in force only under a specific interpretation (constitutional reservation)&lt;br /&gt;
* &amp;lt;code&amp;gt;pending&amp;lt;/code&amp;gt; = adopted but awaiting ratification&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Danger — French emergency resources ==&lt;br /&gt;
&lt;br /&gt;
When danger detected (see core guidelines §6):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
* Emergency: 17 (police) / 15 (SAMU) / 18 (pompiers) / 112 (European)&lt;br /&gt;
* Emergency SMS: 114 (for people who cannot speak — domestic violence, disability)&lt;br /&gt;
* Gendarmerie chat: https://www.gendarmerie.interieur.gouv.fr/contact/echanger-avec-un-gendarme (24/7, anonymous — for non-emergency; call 17 if urgent)&lt;br /&gt;
* Online reporting: internet-signalement.gouv.fr (Pharos)&lt;br /&gt;
* Legal aid: SOS Avocats (consultation gratuite), local &amp;quot;ordre des avocats&amp;quot;&lt;br /&gt;
* Government: https://www.service-public.gouv.fr/particuliers/vosdroits/F20706&lt;br /&gt;
* Domestic violence: 3919 (Violences Femmes Info)&lt;br /&gt;
* Child danger: 119 (Enfance en danger)&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:MCP]]&lt;/div&gt;</description>
			<pubDate>Thu, 23 Apr 2026 02:16:02 GMT</pubDate>
			<dc:creator>Nicolas</dc:creator>
			<comments>https://wiki.dura-lex.org/index.php/Talk:MCP/Guidelines/FR</comments>
		</item>
		<item>
			<title>Corpus/Graph</title>
			<link>https://wiki.dura-lex.org/index.php?title=Corpus/Graph&amp;diff=53&amp;oldid=0</link>
			<guid isPermaLink="false">https://wiki.dura-lex.org/index.php?title=Corpus/Graph&amp;diff=53&amp;oldid=0</guid>
			<description>&lt;p&gt;Import from duralex/spec/GRAPH.md — faithful conversion to wikitext (via create-page on MediaWiki MCP Server)&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;= Knowledge Graph (Draft) =&lt;br /&gt;
&lt;br /&gt;
This document is a preliminary sketch. The graph layer will be refined when implementation begins. See the legalscript spec (separate repository) for the full vision.&lt;br /&gt;
&lt;br /&gt;
== Scope ==&lt;br /&gt;
&lt;br /&gt;
The knowledge graph is a separate system built ON TOP of the corpus. It is not part of the corpus schema. It lives in a separate PostgreSQL schema (&amp;lt;code&amp;gt;graph.*&amp;lt;/code&amp;gt;) and compiles into self-contained SQLite packages for runtime navigation.&lt;br /&gt;
&lt;br /&gt;
== Relationship to corpus ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
corpus.*                              graph.*                          compiled/&lt;br /&gt;
  documents (source texts)     →      concepts (legal concepts)     →  fr.civil.sqlite&lt;br /&gt;
  edges (citations)            →      annotations (LLM/human)       →  fr.travail.sqlite&lt;br /&gt;
                               →      edges (concept relations)     →  fr.conso.sqlite&lt;br /&gt;
                               →      compilations (metadata)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* The corpus stores source data (legislation, decisions, guidance). Precious, days to re-ingest.&lt;br /&gt;
* The graph stores derived knowledge (concepts, annotations). Reproducible, hours to recompile.&lt;br /&gt;
* Compiled packages are self-contained SQLite for runtime. No PostgreSQL dependency at query time.&lt;br /&gt;
&lt;br /&gt;
== Graph schema (draft) ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
CREATE SCHEMA IF NOT EXISTS graph;&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE graph.concepts (&lt;br /&gt;
    id                text PRIMARY KEY,    -- thematic path: fr.civil.contrat.formation.consentement.vice.dol&lt;br /&gt;
    jurisdiction      text NOT NULL,&lt;br /&gt;
    parent_id         text,                -- parent concept (extends)&lt;br /&gt;
    title             text NOT NULL,&lt;br /&gt;
    concept_type      text NOT NULL,       -- qualifiable, standard_ouvert, principe_directeur, procedural, bareme&lt;br /&gt;
    defining_articles jsonb,               -- references to corpus documents&lt;br /&gt;
    metadata          jsonb DEFAULT &amp;#039;{}&amp;#039;,&lt;br /&gt;
    created_at        timestamptz DEFAULT now()&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE graph.annotations (&lt;br /&gt;
    id              bigint GENERATED ALWAYS AS IDENTITY PRIMARY KEY,&lt;br /&gt;
    doc_id          text NOT NULL,         -- references corpus.documents.id&lt;br /&gt;
    annotation_type text NOT NULL,         -- structure, defines, illustrates, condition, qualify, framework...&lt;br /&gt;
    concept_id      text,                  -- references graph.concepts.id&lt;br /&gt;
    version         int NOT NULL,&lt;br /&gt;
    parent_version  int,&lt;br /&gt;
    method          text NOT NULL,         -- stub, llm, human, jurist&lt;br /&gt;
    confidence      text NOT NULL,         -- stub, memory_only, source_checked, cross_validated, disputed&lt;br /&gt;
    author          text,&lt;br /&gt;
    prompt_hash     text,&lt;br /&gt;
    content         jsonb NOT NULL,&lt;br /&gt;
    created_at      timestamptz DEFAULT now()&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
-- PostgreSQL does not allow function calls in table-level UNIQUE constraints.&lt;br /&gt;
-- Use a unique index instead:&lt;br /&gt;
CREATE UNIQUE INDEX idx_ann_unique&lt;br /&gt;
    ON graph.annotations (doc_id, annotation_type, coalesce(concept_id, &amp;#039;&amp;#039;), version);&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE graph.edges (&lt;br /&gt;
    id          bigint GENERATED ALWAYS AS IDENTITY PRIMARY KEY,&lt;br /&gt;
    source_id   text NOT NULL,&lt;br /&gt;
    target_id   text NOT NULL,&lt;br /&gt;
    kind        text NOT NULL,&lt;br /&gt;
    properties  jsonb DEFAULT &amp;#039;{}&amp;#039;,&lt;br /&gt;
    UNIQUE (source_id, target_id, kind)&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE graph.compilations (&lt;br /&gt;
    id            text PRIMARY KEY,&lt;br /&gt;
    version       int NOT NULL,&lt;br /&gt;
    compiled_at   timestamptz NOT NULL,&lt;br /&gt;
    source_commit text,&lt;br /&gt;
    quality       jsonb,&lt;br /&gt;
    dependencies  jsonb,&lt;br /&gt;
    artifact_path text&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Why separate from corpus ==&lt;br /&gt;
&lt;br /&gt;
The graph has different structural needs:&lt;br /&gt;
* Annotations have versioning (version + parent_version), confidence, method, prompt_hash as first-class columns&lt;br /&gt;
* Concepts have concept_type and defining_articles&lt;br /&gt;
* No body/body_search/content_fts/language — annotations are structured JSONB, not searchable text&lt;br /&gt;
* Different write patterns: corpus is append-mostly, graph is recompiled in bulk&lt;br /&gt;
&lt;br /&gt;
Forcing annotations into corpus.documents would leave 5 of 14 columns always NULL. That is not optimal — it is forcing.&lt;br /&gt;
&lt;br /&gt;
== Corpus guarantees for the graph ==&lt;br /&gt;
&lt;br /&gt;
The corpus schema guarantees properties the graph depends on:&lt;br /&gt;
&lt;br /&gt;
# &amp;#039;&amp;#039;&amp;#039;Stable IDs&amp;#039;&amp;#039;&amp;#039; — corpus.documents.id never changes after ingestion. The graph references documents by ID.&lt;br /&gt;
# &amp;#039;&amp;#039;&amp;#039;Permanent article identity&amp;#039;&amp;#039;&amp;#039; — &amp;lt;code&amp;gt;tags.cid&amp;lt;/code&amp;gt; groups temporal versions of the same article. The graph needs this to link concepts to articles across renumbering.&lt;br /&gt;
# &amp;#039;&amp;#039;&amp;#039;Immutable body&amp;#039;&amp;#039;&amp;#039; — &amp;lt;code&amp;gt;body&amp;lt;/code&amp;gt; does not change after initial ingestion. Future annotation anchoring (character offsets) depends on this stability.&lt;br /&gt;
# &amp;#039;&amp;#039;&amp;#039;No reverse dependency&amp;#039;&amp;#039;&amp;#039; — corpus never references graph. The graph depends on corpus, not the inverse.&lt;br /&gt;
&lt;br /&gt;
[[Category:Corpus]]&lt;/div&gt;</description>
			<pubDate>Thu, 23 Apr 2026 02:12:47 GMT</pubDate>
			<dc:creator>Nicolas</dc:creator>
			<comments>https://wiki.dura-lex.org/index.php/Talk:Corpus/Graph</comments>
		</item>
		<item>
			<title>Corpus/FTS</title>
			<link>https://wiki.dura-lex.org/index.php?title=Corpus/FTS&amp;diff=52&amp;oldid=0</link>
			<guid isPermaLink="false">https://wiki.dura-lex.org/index.php?title=Corpus/FTS&amp;diff=52&amp;oldid=0</guid>
			<description>&lt;p&gt;Import from duralex/spec/FTS.md — faithful conversion to wikitext (via create-page on MediaWiki MCP Server)&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;= Full-Text Search =&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
&lt;br /&gt;
FTS uses PostgreSQL tsvector with per-language text search configurations. The &amp;lt;code&amp;gt;content_fts&amp;lt;/code&amp;gt; column is populated by a trigger from &amp;lt;code&amp;gt;coalesce(body_search, body)&amp;lt;/code&amp;gt;. CJK languages require the pgroonga extension.&lt;br /&gt;
&lt;br /&gt;
== The two-text model ==&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;body&amp;lt;/code&amp;gt;: clean displayable content. Always renderable to a user (HTML, links, formatted text). Immutable after ingestion. Never contains noisy OCR or raw PDF binary.&lt;br /&gt;
* &amp;lt;code&amp;gt;body_search&amp;lt;/code&amp;gt;: FTS-optimized text used for indexing. Can be noisy (raw PDF extraction, OCR output) because users never see it directly. Nullable. When NULL, FTS uses body directly.&lt;br /&gt;
&lt;br /&gt;
Why two columns:&lt;br /&gt;
# &amp;#039;&amp;#039;&amp;#039;Display vs index separation.&amp;#039;&amp;#039;&amp;#039; &amp;lt;code&amp;gt;get_document&amp;lt;/code&amp;gt; returns &amp;lt;code&amp;gt;body&amp;lt;/code&amp;gt;, so it must always be clean. FTS reads &amp;lt;code&amp;gt;coalesce(body_search, body)&amp;lt;/code&amp;gt;, so &amp;lt;code&amp;gt;body_search&amp;lt;/code&amp;gt; can hold a noisy-but-indexable representation (e.g., extracted PDF text) without polluting display.&lt;br /&gt;
# &amp;#039;&amp;#039;&amp;#039;PDF-sourced documents.&amp;#039;&amp;#039;&amp;#039; When a document is only available as PDF, &amp;lt;code&amp;gt;body&amp;lt;/code&amp;gt; is a clean stub like &amp;lt;code&amp;gt;&amp;amp;lt;p&amp;amp;gt;Source: &amp;amp;lt;a href=&amp;quot;...&amp;quot;&amp;amp;gt;PDF officiel&amp;amp;lt;/a&amp;amp;gt;&amp;amp;lt;/p&amp;amp;gt;&amp;lt;/code&amp;gt; (the LLM follows the link or uses search snippets). &amp;lt;code&amp;gt;body_search&amp;lt;/code&amp;gt; holds the pdfminer-extracted text so the document is findable via FTS.&lt;br /&gt;
# &amp;#039;&amp;#039;&amp;#039;Legal reference normalization&amp;#039;&amp;#039;&amp;#039; (e.g., &amp;quot;L442-1&amp;quot; to &amp;quot;L442.1&amp;quot;) must be consistent between index and query. &amp;lt;code&amp;gt;body_search&amp;lt;/code&amp;gt; holds the normalized text; the search plugin applies the same normalization to the query.&lt;br /&gt;
# &amp;lt;code&amp;gt;body&amp;lt;/code&amp;gt; is the source of truth for display and annotation anchoring. It never changes.&lt;br /&gt;
&lt;br /&gt;
See ADR-010 for the full rationale of this semantic.&lt;br /&gt;
&lt;br /&gt;
== Trigger ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
CREATE FUNCTION corpus.update_content_fts() RETURNS trigger AS $$&lt;br /&gt;
DECLARE&lt;br /&gt;
    lang text;&lt;br /&gt;
    cfg  regconfig;&lt;br /&gt;
BEGIN&lt;br /&gt;
    -- Skip recomputation if searchable content unchanged (tag-only upserts)&lt;br /&gt;
    IF TG_OP = &amp;#039;UPDATE&amp;#039;&lt;br /&gt;
       AND NEW.title IS NOT DISTINCT FROM OLD.title&lt;br /&gt;
       AND NEW.body IS NOT DISTINCT FROM OLD.body&lt;br /&gt;
       AND NEW.body_search IS NOT DISTINCT FROM OLD.body_search&lt;br /&gt;
       AND NEW.language IS NOT DISTINCT FROM OLD.language&lt;br /&gt;
       AND NEW.jurisdiction IS NOT DISTINCT FROM OLD.jurisdiction&lt;br /&gt;
       AND (NEW.tags-&amp;gt;&amp;gt;&amp;#039;summary&amp;#039;) IS NOT DISTINCT FROM (OLD.tags-&amp;gt;&amp;gt;&amp;#039;summary&amp;#039;)&lt;br /&gt;
       AND (NEW.tags-&amp;gt;&amp;gt;&amp;#039;headnote_classification&amp;#039;) IS NOT DISTINCT FROM (OLD.tags-&amp;gt;&amp;gt;&amp;#039;headnote_classification&amp;#039;) THEN&lt;br /&gt;
        NEW.content_fts := OLD.content_fts;&lt;br /&gt;
        RETURN NEW;&lt;br /&gt;
    END IF;&lt;br /&gt;
&lt;br /&gt;
    -- Extract country prefix for subdivisions (gb-sct → gb, es-ct → es)&lt;br /&gt;
    lang := coalesce(NEW.language, split_part(NEW.jurisdiction, &amp;#039;-&amp;#039;, 1));&lt;br /&gt;
&lt;br /&gt;
    -- CJK: tsvector non-functional, use pgroonga instead&lt;br /&gt;
    IF lang IN (&amp;#039;zh&amp;#039;, &amp;#039;ja&amp;#039;, &amp;#039;ko&amp;#039;) THEN&lt;br /&gt;
        NEW.content_fts := NULL;&lt;br /&gt;
        RETURN NEW;&lt;br /&gt;
    END IF;&lt;br /&gt;
&lt;br /&gt;
    cfg := CASE lang&lt;br /&gt;
        WHEN &amp;#039;fr&amp;#039; THEN &amp;#039;french&amp;#039;::regconfig&lt;br /&gt;
        WHEN &amp;#039;de&amp;#039; THEN &amp;#039;german&amp;#039;::regconfig&lt;br /&gt;
        WHEN &amp;#039;en&amp;#039; THEN &amp;#039;english&amp;#039;::regconfig&lt;br /&gt;
        WHEN &amp;#039;es&amp;#039; THEN &amp;#039;spanish&amp;#039;::regconfig&lt;br /&gt;
        WHEN &amp;#039;it&amp;#039; THEN &amp;#039;italian&amp;#039;::regconfig&lt;br /&gt;
        WHEN &amp;#039;pt&amp;#039; THEN &amp;#039;portuguese&amp;#039;::regconfig&lt;br /&gt;
        WHEN &amp;#039;nl&amp;#039; THEN &amp;#039;dutch&amp;#039;::regconfig&lt;br /&gt;
        WHEN &amp;#039;sv&amp;#039; THEN &amp;#039;swedish&amp;#039;::regconfig&lt;br /&gt;
        WHEN &amp;#039;da&amp;#039; THEN &amp;#039;danish&amp;#039;::regconfig&lt;br /&gt;
        WHEN &amp;#039;fi&amp;#039; THEN &amp;#039;finnish&amp;#039;::regconfig&lt;br /&gt;
        WHEN &amp;#039;hu&amp;#039; THEN &amp;#039;hungarian&amp;#039;::regconfig&lt;br /&gt;
        WHEN &amp;#039;ro&amp;#039; THEN &amp;#039;romanian&amp;#039;::regconfig&lt;br /&gt;
        WHEN &amp;#039;tr&amp;#039; THEN &amp;#039;turkish&amp;#039;::regconfig&lt;br /&gt;
        WHEN &amp;#039;ru&amp;#039; THEN &amp;#039;russian&amp;#039;::regconfig&lt;br /&gt;
        WHEN &amp;#039;no&amp;#039; THEN &amp;#039;norwegian&amp;#039;::regconfig&lt;br /&gt;
        -- Arabic: no built-in PG config. Falls through to &amp;#039;simple&amp;#039;.&lt;br /&gt;
        -- Install a custom Arabic text search config before ingesting AR data.&lt;br /&gt;
        ELSE &amp;#039;simple&amp;#039;::regconfig&lt;br /&gt;
    END;&lt;br /&gt;
&lt;br /&gt;
    -- Binary body check: skip FTS on PDF/binary content&lt;br /&gt;
    IF coalesce(NEW.body_search, NEW.body) IS NOT NULL&lt;br /&gt;
       AND left(coalesce(NEW.body_search, NEW.body), 4) = &amp;#039;%PDF&amp;#039; THEN&lt;br /&gt;
        NEW.content_fts :=&lt;br /&gt;
            setweight(to_tsvector(cfg, unaccent(&lt;br /&gt;
                corpus.normalize_for_fts(NEW.jurisdiction, coalesce(NEW.title, &amp;#039;&amp;#039;))&lt;br /&gt;
            )), &amp;#039;A&amp;#039;) ||&lt;br /&gt;
            setweight(to_tsvector(cfg, unaccent(&lt;br /&gt;
                coalesce(NEW.tags-&amp;gt;&amp;gt;&amp;#039;summary&amp;#039;, &amp;#039;&amp;#039;) || &amp;#039; &amp;#039; ||&lt;br /&gt;
                coalesce(NEW.tags-&amp;gt;&amp;gt;&amp;#039;headnote_classification&amp;#039;, &amp;#039;&amp;#039;)&lt;br /&gt;
            )), &amp;#039;B&amp;#039;);&lt;br /&gt;
        RETURN NEW;&lt;br /&gt;
    END IF;&lt;br /&gt;
&lt;br /&gt;
    NEW.content_fts :=&lt;br /&gt;
        setweight(to_tsvector(cfg, unaccent(&lt;br /&gt;
            corpus.normalize_for_fts(NEW.jurisdiction, coalesce(NEW.title, &amp;#039;&amp;#039;))&lt;br /&gt;
        )), &amp;#039;A&amp;#039;) ||&lt;br /&gt;
        setweight(to_tsvector(cfg, unaccent(&lt;br /&gt;
            coalesce(NEW.tags-&amp;gt;&amp;gt;&amp;#039;summary&amp;#039;, &amp;#039;&amp;#039;) || &amp;#039; &amp;#039; ||&lt;br /&gt;
            coalesce(NEW.tags-&amp;gt;&amp;gt;&amp;#039;headnote_classification&amp;#039;, &amp;#039;&amp;#039;)&lt;br /&gt;
        )), &amp;#039;B&amp;#039;) ||&lt;br /&gt;
        setweight(to_tsvector(cfg, unaccent(&lt;br /&gt;
            corpus.normalize_for_fts(NEW.jurisdiction,&lt;br /&gt;
                regexp_replace(coalesce(NEW.body_search, NEW.body, &amp;#039;&amp;#039;), &amp;#039;&amp;lt;[^&amp;gt;]+&amp;gt;&amp;#039;, &amp;#039; &amp;#039;, &amp;#039;g&amp;#039;))&lt;br /&gt;
        )), &amp;#039;C&amp;#039;);&lt;br /&gt;
    RETURN NEW;&lt;br /&gt;
END $$ LANGUAGE plpgsql;&lt;br /&gt;
&lt;br /&gt;
CREATE TRIGGER trg_content_fts&lt;br /&gt;
    BEFORE INSERT OR UPDATE OF title, body, body_search, tags, language, jurisdiction&lt;br /&gt;
    ON corpus.documents FOR EACH ROW&lt;br /&gt;
    EXECUTE FUNCTION corpus.update_content_fts();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Pluggable normalization (normalize_for_fts) ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
-- Core: identity (no-op)&lt;br /&gt;
CREATE FUNCTION corpus.normalize_for_fts(p_jurisdiction text, p_input text)&lt;br /&gt;
RETURNS text LANGUAGE sql IMMUTABLE AS $$ SELECT p_input; $$;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jurisdiction plugins override this function:&lt;br /&gt;
* FR plugin installs &amp;lt;code&amp;gt;normalize_legal_refs_final()&amp;lt;/code&amp;gt; for French legal references (L442-1 to L442.1).&lt;br /&gt;
* Future DE plugin could install &amp;lt;code&amp;gt;normalize_de_refs()&amp;lt;/code&amp;gt; for German references (paragraph 823 BGB).&lt;br /&gt;
&lt;br /&gt;
The same normalization function must be applied to search queries (by the search plugin) to ensure consistency between indexed text and query.&lt;br /&gt;
&lt;br /&gt;
== Phased approach to normalization ==&lt;br /&gt;
&lt;br /&gt;
Phase 1 (now): For HTML-sourced documents, &amp;lt;code&amp;gt;body_search=NULL&amp;lt;/code&amp;gt;. &amp;lt;code&amp;gt;normalize_for_fts()&amp;lt;/code&amp;gt; in the trigger handles normalization on &amp;lt;code&amp;gt;body&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Phase 2 (PDF ingest, ADR-010): For PDF-sourced documents, &amp;lt;code&amp;gt;body&amp;lt;/code&amp;gt; is a clean HTML stub with the source URL, and &amp;lt;code&amp;gt;body_search&amp;lt;/code&amp;gt; holds the pdfminer-extracted text. &amp;lt;code&amp;gt;normalize_for_fts()&amp;lt;/code&amp;gt; still runs. The trigger uses &amp;lt;code&amp;gt;coalesce(body_search, body)&amp;lt;/code&amp;gt;, preferring the indexable representation when present.&lt;br /&gt;
&lt;br /&gt;
Phase 3 (LLM pipeline): LLM writes a normalized/cleaned version to &amp;lt;code&amp;gt;body_search&amp;lt;/code&amp;gt; for HTML-sourced documents whose body has irregular references. &amp;lt;code&amp;gt;normalize_for_fts()&amp;lt;/code&amp;gt; reset to identity.&lt;br /&gt;
&lt;br /&gt;
Query-side normalization (regex) remains necessary in all phases.&lt;br /&gt;
&lt;br /&gt;
== Weight system ==&lt;br /&gt;
&lt;br /&gt;
Three FTS weights:&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Weight A&amp;#039;&amp;#039;&amp;#039; (highest): title.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Weight B&amp;#039;&amp;#039;&amp;#039;: &amp;lt;code&amp;gt;tags.summary&amp;lt;/code&amp;gt; + &amp;lt;code&amp;gt;tags.headnote_classification&amp;lt;/code&amp;gt;, read directly from JSONB by the trigger. Provides FTS on curated legal metadata (headnotes, summaries) without duplicating body content. Not all documents have these tags — weight B is empty when absent.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Weight C&amp;#039;&amp;#039;&amp;#039;: &amp;lt;code&amp;gt;coalesce(body_search, body)&amp;lt;/code&amp;gt; with HTML tag stripping via &amp;lt;code&amp;gt;regexp_replace&amp;lt;/code&amp;gt;. &amp;lt;code&amp;gt;body_search&amp;lt;/code&amp;gt; holds the indexable representation when &amp;lt;code&amp;gt;body&amp;lt;/code&amp;gt; is a clean stub (e.g., PDF-sourced documents with &amp;lt;code&amp;gt;body=&amp;amp;lt;a&amp;amp;gt;PDF link&amp;amp;lt;/a&amp;amp;gt;&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;body_search=&amp;amp;lt;extracted text&amp;amp;gt;&amp;lt;/code&amp;gt;). NULL for HTML-sourced documents — the trigger falls back to &amp;lt;code&amp;gt;body&amp;lt;/code&amp;gt; directly. See ADR-010.&lt;br /&gt;
&lt;br /&gt;
Weight D is unused.&lt;br /&gt;
&lt;br /&gt;
== CJK languages ==&lt;br /&gt;
&lt;br /&gt;
PostgreSQL built-in text search configurations do not support Chinese, Japanese, or Korean. The &amp;lt;code&amp;gt;simple&amp;lt;/code&amp;gt; config produces single-character tokens that are functionally useless for search.&lt;br /&gt;
&lt;br /&gt;
Hard requirement: install pgroonga or zhparser extension when ingesting CJK data.&lt;br /&gt;
&lt;br /&gt;
The trigger sets &amp;lt;code&amp;gt;content_fts&amp;lt;/code&amp;gt; to NULL for CJK. A separate pgroonga index on body handles CJK search:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
-- When pgroonga is available:&lt;br /&gt;
CREATE INDEX idx_doc_pgroonga ON corpus.documents&lt;br /&gt;
    USING pgroonga (body) WHERE language IN (&amp;#039;zh&amp;#039;, &amp;#039;ja&amp;#039;, &amp;#039;ko&amp;#039;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The search engine routes CJK queries to pgroonga and non-CJK queries to tsvector.&lt;br /&gt;
&lt;br /&gt;
== Partial GIN indexes ==&lt;br /&gt;
&lt;br /&gt;
FTS GIN indexes are split per kind for performance isolation:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
CREATE INDEX idx_doc_fts_legislation ON corpus.documents USING GIN (content_fts) WHERE kind = &amp;#039;legislation&amp;#039;;&lt;br /&gt;
CREATE INDEX idx_doc_fts_decision  ON corpus.documents USING GIN (content_fts) WHERE kind = &amp;#039;decision&amp;#039;;&lt;br /&gt;
CREATE INDEX idx_doc_fts_record    ON corpus.documents USING GIN (content_fts) WHERE kind = &amp;#039;record&amp;#039;;&lt;br /&gt;
CREATE INDEX idx_doc_fts_notice    ON corpus.documents USING GIN (content_fts) WHERE kind = &amp;#039;notice&amp;#039;;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Reindexing annotations (graph layer) does not touch corpus FTS indexes. Bulk ingestion of one kind does not bloat another kind&amp;#039;s GIN index.&lt;br /&gt;
&lt;br /&gt;
== Accent-insensitive search ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;unaccent()&amp;lt;/code&amp;gt; is applied in the trigger before tokenization. Requires the &amp;lt;code&amp;gt;unaccent&amp;lt;/code&amp;gt; PostgreSQL extension. Ensures &amp;quot;responsabilite&amp;quot; matches &amp;quot;responsabilité&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
The search engine must also apply &amp;lt;code&amp;gt;unaccent()&amp;lt;/code&amp;gt; to the query:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
websearch_to_tsquery(cfg, unaccent(corpus.normalize_for_fts(jurisdiction, query)))&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Corpus]]&lt;/div&gt;</description>
			<pubDate>Thu, 23 Apr 2026 02:12:09 GMT</pubDate>
			<dc:creator>Nicolas</dc:creator>
			<comments>https://wiki.dura-lex.org/index.php/Talk:Corpus/FTS</comments>
		</item>
		<item>
			<title>MCP/Guidelines/Core</title>
			<link>https://wiki.dura-lex.org/index.php?title=MCP/Guidelines/Core&amp;diff=51&amp;oldid=0</link>
			<guid isPermaLink="false">https://wiki.dura-lex.org/index.php?title=MCP/Guidelines/Core&amp;diff=51&amp;oldid=0</guid>
			<description>&lt;p&gt;Create MCP/Guidelines/Core page from core.md (via create-page on MediaWiki MCP Server)&lt;/p&gt;
&lt;a href=&quot;https://wiki.dura-lex.org/index.php?title=MCP/Guidelines/Core&amp;amp;diff=51&quot;&gt;Show changes&lt;/a&gt;</description>
			<pubDate>Thu, 23 Apr 2026 02:12:00 GMT</pubDate>
			<dc:creator>Nicolas</dc:creator>
			<comments>https://wiki.dura-lex.org/index.php/Talk:MCP/Guidelines/Core</comments>
		</item>
		<item>
			<title>Corpus/Temporal</title>
			<link>https://wiki.dura-lex.org/index.php?title=Corpus/Temporal&amp;diff=50&amp;oldid=0</link>
			<guid isPermaLink="false">https://wiki.dura-lex.org/index.php?title=Corpus/Temporal&amp;diff=50&amp;oldid=0</guid>
			<description>&lt;p&gt;Import from duralex/spec/TEMPORAL.md — faithful conversion to wikitext (via create-page on MediaWiki MCP Server)&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;= Temporal Model =&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
&lt;br /&gt;
Legal documents exist in time. Articles are versioned (valid_from/valid_until). Decisions are point-in-time events. The schema handles both with the same promoted columns.&lt;br /&gt;
&lt;br /&gt;
== date and date_end semantics by kind ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! kind !! date = !! date_end =&lt;br /&gt;
|-&lt;br /&gt;
| legislation (statute, versioned article) || valid_from (entry into force) || valid_until (repeal, amendment)&lt;br /&gt;
|-&lt;br /&gt;
| legislation (decree, regulation) || publication_date or entry_into_force || expiration (if any)&lt;br /&gt;
|-&lt;br /&gt;
| legislation (collective agreement) || filing_date or effective_date || expiration_date&lt;br /&gt;
|-&lt;br /&gt;
| legislation (guidance, circular) || publication_date || NULL (until superseded)&lt;br /&gt;
|-&lt;br /&gt;
| legislation (bill, debate) || publication_date || NULL&lt;br /&gt;
|-&lt;br /&gt;
| decision || decision_date || NULL&lt;br /&gt;
|-&lt;br /&gt;
| record (company) || creation_date || closure_date&lt;br /&gt;
|-&lt;br /&gt;
| record (person) || NULL || NULL&lt;br /&gt;
|-&lt;br /&gt;
| notice || publication_date || NULL&lt;br /&gt;
|-&lt;br /&gt;
| section || NULL || NULL&lt;br /&gt;
|-&lt;br /&gt;
| chunk || (inherited from parent) || NULL&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Article versioning ==&lt;br /&gt;
&lt;br /&gt;
Multiple versions of the same article = multiple documents with the same &amp;lt;code&amp;gt;tags.cid&amp;lt;/code&amp;gt; (permanent article identity) and different date/date_end ranges.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
-- Get the version of article 1147 CC in force on 2015-06-15&lt;br /&gt;
SELECT * FROM corpus.documents&lt;br /&gt;
WHERE tags-&amp;gt;&amp;gt;&amp;#039;cid&amp;#039; = &amp;#039;LEGISCTA000006136353&amp;#039;&lt;br /&gt;
  AND date &amp;lt;= &amp;#039;2015-06-15&amp;#039;&lt;br /&gt;
  AND (date_end IS NULL OR date_end &amp;gt; &amp;#039;2015-06-15&amp;#039;)&lt;br /&gt;
ORDER BY date DESC LIMIT 1;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;tags.cid&amp;lt;/code&amp;gt; is the permanent identity (CID from LEGI XML, or equivalent). It survives renumbering. Article 1382 and article 1240 have different &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; values but the relationship is captured in &amp;lt;code&amp;gt;corpus.edges kind=replaces&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== at_date in TagQuery ==&lt;br /&gt;
&lt;br /&gt;
The reference resolver supports temporal queries via at_date:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
TagQuery(&lt;br /&gt;
    language=&amp;quot;fr&amp;quot;,&lt;br /&gt;
    kind=&amp;quot;legislation&amp;quot;,&lt;br /&gt;
    tag_filters=TagFilterSet.from_tags({&amp;quot;article_number&amp;quot;: &amp;quot;1147&amp;quot;, &amp;quot;code&amp;quot;: &amp;quot;Code civil&amp;quot;}),&lt;br /&gt;
    at_date=date(2015, 6, 15),&lt;br /&gt;
)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Translated to SQL:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
WHERE language = &amp;#039;fr&amp;#039;&lt;br /&gt;
  AND kind = &amp;#039;legislation&amp;#039;&lt;br /&gt;
  AND tags @&amp;gt; &amp;#039;{&amp;quot;article_number&amp;quot;: &amp;quot;1147&amp;quot;, &amp;quot;code&amp;quot;: &amp;quot;Code civil&amp;quot;}&amp;#039;&lt;br /&gt;
  AND date &amp;lt;= &amp;#039;2015-06-15&amp;#039;&lt;br /&gt;
  AND (date_end IS NULL OR date_end &amp;gt; &amp;#039;2015-06-15&amp;#039;)&lt;br /&gt;
ORDER BY date DESC LIMIT 1&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Non-Gregorian calendars ==&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;date&amp;lt;/code&amp;gt; column always stores ISO/Gregorian dates. The original calendar representation is preserved in tags:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Calendar !! Tag !! Example !! Used by&lt;br /&gt;
|-&lt;br /&gt;
| Islamic (Hijri) || tags.date_hijri || &amp;quot;1445-08-15&amp;quot; || SA, AE, other ME&lt;br /&gt;
|-&lt;br /&gt;
| Japanese imperial era || tags.date_era_jp || &amp;quot;R06&amp;quot; (Reiwa 6 = 2024) || JP&lt;br /&gt;
|-&lt;br /&gt;
| Taiwan ROC (Minguo) || tags.date_roc_tw || &amp;quot;112&amp;quot; (= 2023) || TW&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Conversion is done at ingestion time. The trigger and all queries use the ISO date column.&lt;br /&gt;
&lt;br /&gt;
== Enforcement status ==&lt;br /&gt;
&lt;br /&gt;
For versioned text documents, &amp;lt;code&amp;gt;tags.enforcement_status&amp;lt;/code&amp;gt; tracks the legal force:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Status !! Meaning&lt;br /&gt;
|-&lt;br /&gt;
| in_force || Currently applicable&lt;br /&gt;
|-&lt;br /&gt;
| deferred_enforcement || Not yet in force, will be on a future date&lt;br /&gt;
|-&lt;br /&gt;
| deferred_repeal || Currently in force, repeal scheduled for a future date&lt;br /&gt;
|-&lt;br /&gt;
| repealed || Explicitly repealed by a subsequent act&lt;br /&gt;
|-&lt;br /&gt;
| superseded || Historical version — a newer version of the same article exists&lt;br /&gt;
|-&lt;br /&gt;
| never_in_force || Modified before its effective date, never applied&lt;br /&gt;
|-&lt;br /&gt;
| expired || Lapsed by its own terms (sunset clause, fixed-duration text)&lt;br /&gt;
|-&lt;br /&gt;
| annulled || Struck down by a court (e.g. constitutional review) — typically retroactive&lt;br /&gt;
|-&lt;br /&gt;
| transferred || Content moved to a different article or location (renumbering)&lt;br /&gt;
|-&lt;br /&gt;
| denounced || Collective agreement repudiated by one of the parties&lt;br /&gt;
|-&lt;br /&gt;
| disjoined || Version split into multiple separate articles&lt;br /&gt;
|-&lt;br /&gt;
| conditional || In force only under a specific interpretation (constitutional reservation)&lt;br /&gt;
|-&lt;br /&gt;
| pending || Emergency decree or provisional measure awaiting ratification&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The boolean shortcut &amp;lt;code&amp;gt;tags.in_force&amp;lt;/code&amp;gt; (true/false) enables simple filtering. Unlike &amp;lt;code&amp;gt;enforcement_status&amp;lt;/code&amp;gt;, which is set once at ingest from the source data, &amp;lt;code&amp;gt;in_force&amp;lt;/code&amp;gt; is dynamically recomputed by the &amp;lt;code&amp;gt;refresh_in_force&amp;lt;/code&amp;gt; post-ingest job from the article&amp;#039;s &amp;lt;code&amp;gt;date&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;date_end&amp;lt;/code&amp;gt; columns. The two tags can therefore diverge over time:&lt;br /&gt;
&lt;br /&gt;
* An article tagged &amp;lt;code&amp;gt;deferred_enforcement&amp;lt;/code&amp;gt; becomes &amp;lt;code&amp;gt;in_force=true&amp;lt;/code&amp;gt; once its effective &amp;lt;code&amp;gt;date&amp;lt;/code&amp;gt; is in the past (the tag is not rewritten — only the boolean).&lt;br /&gt;
* An article tagged &amp;lt;code&amp;gt;deferred_repeal&amp;lt;/code&amp;gt; becomes &amp;lt;code&amp;gt;in_force=false&amp;lt;/code&amp;gt; once its &amp;lt;code&amp;gt;date_end&amp;lt;/code&amp;gt; is in the past.&lt;br /&gt;
* An article tagged &amp;lt;code&amp;gt;in_force&amp;lt;/code&amp;gt; becomes &amp;lt;code&amp;gt;in_force=false&amp;lt;/code&amp;gt; if its &amp;lt;code&amp;gt;date&amp;lt;/code&amp;gt; is in the future (rare — late-published versions).&lt;br /&gt;
* All other &amp;quot;not in force&amp;quot; states (&amp;lt;code&amp;gt;repealed&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;superseded&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;expired&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;annulled&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;transferred&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;denounced&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;never_in_force&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;disjoined&amp;lt;/code&amp;gt;) are always &amp;lt;code&amp;gt;in_force=false&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
In short: &amp;lt;code&amp;gt;enforcement_status&amp;lt;/code&amp;gt; answers &amp;quot;what is the legal lifecycle state of this version?&amp;quot;, while &amp;lt;code&amp;gt;in_force&amp;lt;/code&amp;gt; answers &amp;quot;is this version currently legally applicable?&amp;quot;. Use &amp;lt;code&amp;gt;in_force&amp;lt;/code&amp;gt; for filter queries, &amp;lt;code&amp;gt;enforcement_status&amp;lt;/code&amp;gt; for display and warnings.&lt;br /&gt;
&lt;br /&gt;
== Transitional provisions ==&lt;br /&gt;
&lt;br /&gt;
When a reform includes transitional rules (e.g., the 2016 French contract law reform: contracts signed before Oct 1, 2016 governed by old law), these are modeled as:&lt;br /&gt;
* A separate document (the transitional provision article)&lt;br /&gt;
* With edges to both the old and new versions&lt;br /&gt;
* The knowledge graph (future) encodes transitional provisions as QUALIFY nodes that route to the correct version based on temporal context&lt;br /&gt;
&lt;br /&gt;
[[Category:Corpus]]&lt;/div&gt;</description>
			<pubDate>Thu, 23 Apr 2026 02:10:58 GMT</pubDate>
			<dc:creator>Nicolas</dc:creator>
			<comments>https://wiki.dura-lex.org/index.php/Talk:Corpus/Temporal</comments>
		</item>
		<item>
			<title>Corpus/Quality</title>
			<link>https://wiki.dura-lex.org/index.php?title=Corpus/Quality&amp;diff=49&amp;oldid=0</link>
			<guid isPermaLink="false">https://wiki.dura-lex.org/index.php?title=Corpus/Quality&amp;diff=49&amp;oldid=0</guid>
			<description>&lt;p&gt;Import from duralex/spec/QUALITY.md — faithful conversion to wikitext (via create-page on MediaWiki MCP Server)&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;= Content Quality =&lt;br /&gt;
&lt;br /&gt;
== Two quality axes ==&lt;br /&gt;
&lt;br /&gt;
The system tracks two independent quality dimensions:&lt;br /&gt;
&lt;br /&gt;
=== 1. Content quality (tags.content_quality on corpus documents) ===&lt;br /&gt;
&lt;br /&gt;
Quality of the text in &amp;lt;code&amp;gt;body&amp;lt;/code&amp;gt;. Progression:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Level !! Description !! Searchable? !! Reliable for display?&lt;br /&gt;
|-&lt;br /&gt;
| ocr_raw || OCR extraction, errors likely || Degraded FTS || No -- warn user&lt;br /&gt;
|-&lt;br /&gt;
| ocr_cleaned || OCR cleaned by regex or LLM || Better FTS || Partially&lt;br /&gt;
|-&lt;br /&gt;
| native_raw || Native text (PDF text layer, .doc), structure lost || Good FTS || Yes, but no structure&lt;br /&gt;
|-&lt;br /&gt;
| native_structured || Structured source (HTML Legifrance, XML Akoma Ntoso) || Optimal FTS || Yes&lt;br /&gt;
|-&lt;br /&gt;
| machine_reviewed || Reviewed/corrected by LLM || Optimal FTS || Yes&lt;br /&gt;
|-&lt;br /&gt;
| human_reviewed || Reviewed by a human || Optimal FTS || Yes&lt;br /&gt;
|-&lt;br /&gt;
| jurist_reviewed || Validated by a jurist || Optimal FTS || Yes (gold standard)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Only the current level is stored. Progression is one-way (except disputes).&lt;br /&gt;
&lt;br /&gt;
=== 2. Annotation confidence (on graph.annotations -- future, documented here for reference) ===&lt;br /&gt;
&lt;br /&gt;
Quality of knowledge graph annotations. Separate from content quality.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Method !! Confidence !! Meaning&lt;br /&gt;
|-&lt;br /&gt;
| stub || stub || Placeholder, not yet created&lt;br /&gt;
|-&lt;br /&gt;
| llm || memory_only || LLM-generated, not verified against source&lt;br /&gt;
|-&lt;br /&gt;
| llm || source_checked || Verification pass confirmed citation exists&lt;br /&gt;
|-&lt;br /&gt;
| llm || cross_validated || Cross-validation confirmed consistency&lt;br /&gt;
|-&lt;br /&gt;
| human || (any) || Non-expert human reviewed&lt;br /&gt;
|-&lt;br /&gt;
| jurist || (any) || Legal professional validated&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Progression: stub -&amp;gt; memory_only -&amp;gt; source_checked -&amp;gt; cross_validated. Can be downgraded to &amp;lt;code&amp;gt;disputed&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== How they interact ===&lt;br /&gt;
&lt;br /&gt;
A corpus document has content_quality. An annotation on that document has its own confidence. The weakest link determines the trust of any reasoning path:&lt;br /&gt;
* An annotation with confidence=cross_validated on a document with content_quality=ocr_raw is still unreliable (the source text may have OCR errors that corrupted the annotation).&lt;br /&gt;
* A high-quality document (native_structured) with a stub annotation has no knowledge graph coverage yet.&lt;br /&gt;
&lt;br /&gt;
== Impact on the system ==&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;MCP tools&amp;#039;&amp;#039;&amp;#039;: display warnings for content_quality &amp;lt; native_structured&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Knowledge graph&amp;#039;&amp;#039;&amp;#039;: propagate minimum confidence in reasoning paths&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Quality pipeline&amp;#039;&amp;#039;&amp;#039;: prioritize ocr_raw documents for LLM cleaning, then for annotation&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;body_search&amp;#039;&amp;#039;&amp;#039;: documents with content_quality &amp;gt;= machine_reviewed should have body_search populated with cleaned text&lt;br /&gt;
&lt;br /&gt;
[[Category:Corpus]]&lt;/div&gt;</description>
			<pubDate>Thu, 23 Apr 2026 02:10:16 GMT</pubDate>
			<dc:creator>Nicolas</dc:creator>
			<comments>https://wiki.dura-lex.org/index.php/Talk:Corpus/Quality</comments>
		</item>
		<item>
			<title>Corpus/Edge types</title>
			<link>https://wiki.dura-lex.org/index.php?title=Corpus/Edge_types&amp;diff=48&amp;oldid=0</link>
			<guid isPermaLink="false">https://wiki.dura-lex.org/index.php?title=Corpus/Edge_types&amp;diff=48&amp;oldid=0</guid>
			<description>&lt;p&gt;Import from duralex/spec/EDGE-TYPES.md — faithful conversion to wikitext (via create-page on MediaWiki MCP Server)&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;= Edge Types =&lt;br /&gt;
&lt;br /&gt;
Edge types (stored in &amp;lt;code&amp;gt;corpus.edges.kind&amp;lt;/code&amp;gt;) form an open vocabulary — new types are added when data sources provide them. This document lists all known types organized by category.&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;properties&amp;lt;/code&amp;gt; JSONB column on edges carries type-specific metadata (grounds for partial cassation, commencement date, reservation text, confidence, etc.).&lt;br /&gt;
&lt;br /&gt;
== Universality ==&lt;br /&gt;
&lt;br /&gt;
Edge kinds have varying degrees of cross-jurisdiction applicability. &amp;#039;&amp;#039;&amp;#039;Universal&amp;#039;&amp;#039;&amp;#039; kinds (amends, repeals, cites, interprets...) appear in 3+ legal traditions and are documented here. &amp;#039;&amp;#039;&amp;#039;Multi-jurisdiction&amp;#039;&amp;#039;&amp;#039; kinds (cassation_of, preliminary_reference_to...) appear in 2+ jurisdictions. &amp;#039;&amp;#039;&amp;#039;Local&amp;#039;&amp;#039;&amp;#039; kinds (establishes_jurisprudencia, violates...) are specific to one legal system and documented in the emitting plugin. This is a documentation convention, not a runtime constraint — the &amp;lt;code&amp;gt;kind&amp;lt;/code&amp;gt; column has no enum. See ADR: edge pipeline architecture (design-decisions/2026-04-22-edge-pipeline-architecture.md).&lt;br /&gt;
&lt;br /&gt;
== Category 1: Textual modification (legislation &amp;lt;-&amp;gt; legislation) ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Edge kind !! Direction !! Description !! Open data&lt;br /&gt;
|-&lt;br /&gt;
| amends || A-&amp;gt;B || A amends B (umbrella term). Alias: &amp;lt;code&amp;gt;modifies&amp;lt;/code&amp;gt; (FR LEGI: MODIFIE/MODIFICATION) || FR LEGI, UK legislation.gov.uk, IT normattiva&lt;br /&gt;
|-&lt;br /&gt;
| inserts || A-&amp;gt;B || A inserts text into B || UK legislation.gov.uk&lt;br /&gt;
|-&lt;br /&gt;
| substitutes || A-&amp;gt;B || A substitutes text in B || UK legislation.gov.uk&lt;br /&gt;
|-&lt;br /&gt;
| omits || A-&amp;gt;B || A removes text from B || UK legislation.gov.uk&lt;br /&gt;
|-&lt;br /&gt;
| rectifies || A-&amp;gt;B || A corrects an error in B (no policy change). FR LEGI: RECTIFICATION/RECTIFIE || FR LEGI, EU corrigenda, EU CELLAR &amp;lt;code&amp;gt;resource_legal_corrects_resource_legal&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| renumbers || A-&amp;gt;B || A renumbers provisions in B. Alias: &amp;lt;code&amp;gt;moves&amp;lt;/code&amp;gt; (FR LEGI: DEPLACE/DEPLACEMENT) || FR LEGI&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Category 2: Lifecycle / legal force ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Edge kind !! Direction !! Description !! Open data&lt;br /&gt;
|-&lt;br /&gt;
| repeals || A-&amp;gt;B || A repeals B entirely || FR LEGI, UK, all&lt;br /&gt;
|-&lt;br /&gt;
| repeals_in_part || A-&amp;gt;B || A repeals specific provisions of B || UK legislation.gov.uk&lt;br /&gt;
|-&lt;br /&gt;
| creates || A-&amp;gt;B || A creates/establishes B || FR LEGI&lt;br /&gt;
|-&lt;br /&gt;
| expires || A-&amp;gt;B || B expires by operation of A (or by its own sunset clause). FR LEGI: PERIME/PEREMPTION, PERIME_NVCC_IDCC/PEREMPTION_NVCC_IDCC || FR LEGI&lt;br /&gt;
|-&lt;br /&gt;
| suspends || A-&amp;gt;B || A temporarily suspends B || Rare in open data&lt;br /&gt;
|-&lt;br /&gt;
| revives || A-&amp;gt;B || A revives previously suspended/repealed B || UK&lt;br /&gt;
|-&lt;br /&gt;
| saves || A-&amp;gt;B || A carves B out from a wider repeal || UK legislation.gov.uk&lt;br /&gt;
|-&lt;br /&gt;
| extends || A-&amp;gt;B || A extends the application of B (territorial, temporal, or personal scope). FR LEGI: EXTENSION/ETEND, ADHESION/ADHERE, ELARGISSEMENT/ELARGIT || FR labor (extension), UK&lt;br /&gt;
|-&lt;br /&gt;
| restricts || A-&amp;gt;B || A restricts the scope of B || UK legislation.gov.uk&lt;br /&gt;
|-&lt;br /&gt;
| annuls || A-&amp;gt;B || A annuls B (judicial or legislative) || FR LEGI&lt;br /&gt;
|-&lt;br /&gt;
| denounces || A-&amp;gt;B || A terminates convention/treaty B || FR labor conventions&lt;br /&gt;
|-&lt;br /&gt;
| disjoins || A-&amp;gt;B || A splits a relationship between two texts || FR LEGI&lt;br /&gt;
|-&lt;br /&gt;
| converts || A-&amp;gt;B || Parliament converts emergency decree A into law B || IT, FR (ordonnance), ES, BR (medida provisoria)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Category 3: Hierarchical / delegation ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Edge kind !! Direction !! Description !! Open data&lt;br /&gt;
|-&lt;br /&gt;
| implements || A-&amp;gt;B || A implements/applies B (implementing regulation -&amp;gt; framework law). FR LEGI: APPLICATION/APPLIQUE, SPEC_APPLI || FR LEGI, EU&lt;br /&gt;
|-&lt;br /&gt;
| transposes || A-&amp;gt;B || A transposes EU directive B into national law. FR LEGI: TRANSPOSITION, DIRECTIVE_EUROPEENNE || EU CELLAR NIM, FR LEGI&lt;br /&gt;
|-&lt;br /&gt;
| commences || A-&amp;gt;B || Commencement order A brings B into force || UK legislation.gov.uk&lt;br /&gt;
|-&lt;br /&gt;
| enables || A-&amp;gt;B || A grants power to make B (delegation) || Extraction&lt;br /&gt;
|-&lt;br /&gt;
| made_under || A-&amp;gt;B || A is made under authority of B || UK&lt;br /&gt;
|-&lt;br /&gt;
| ratifies || A-&amp;gt;B || A ratifies treaty B || FR LEGI&lt;br /&gt;
|-&lt;br /&gt;
| codifies || A-&amp;gt;B || A codifies standalone text B into a code || FR LEGI&lt;br /&gt;
|-&lt;br /&gt;
| based_on || A-&amp;gt;B || A has B as treaty base (EU) || EU&lt;br /&gt;
|-&lt;br /&gt;
| requires_implementation || A-&amp;gt;B || A requires implementing measure B to be applicable. Properties: &amp;lt;code&amp;gt;{status: &amp;quot;applied&amp;quot;|&amp;quot;pending&amp;quot;|&amp;quot;moot&amp;quot;, measure_object: &amp;quot;...&amp;quot;}&amp;lt;/code&amp;gt; || FR Baromètre AN&lt;br /&gt;
|-&lt;br /&gt;
| supplements || A-&amp;gt;B || A adds sectoral provisions to framework B || EU&lt;br /&gt;
|-&lt;br /&gt;
| complies_with || A-&amp;gt;B || A ensures compliance with standard/rule B || EU, compliance&lt;br /&gt;
|-&lt;br /&gt;
| derogates_from || A-&amp;gt;B || A explicitly derogates from B || EU, FR&lt;br /&gt;
|-&lt;br /&gt;
| adopts || A-&amp;gt;B || A adopts the text of B (Council decision adopting a regulation/directive) || EU CELLAR &amp;lt;code&amp;gt;resource_legal_adopts_resource_legal&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Category 4: Cross-reference / concordance ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Edge kind !! Direction !! Description !! Open data&lt;br /&gt;
|-&lt;br /&gt;
| cites || A-&amp;gt;B || A cites B (neutral reference). FR LEGI: CITATION, RENVOI/RENVOIT, CITATION_JURI_LEGI || FR LEGI, EU CELLAR &amp;lt;code&amp;gt;work_cites_work&amp;lt;/code&amp;gt;, ECHR HUDOC &amp;lt;code&amp;gt;extractedappno&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| replaces || A-&amp;gt;B || A replaces B (renumbering: article 1240 replaces 1382). FR LEGI: TEXTE_SUITE || FR LEGI&lt;br /&gt;
|-&lt;br /&gt;
| corresponds_to || A&amp;lt;-&amp;gt;B || A and B are concordant (synchronized texts) || FR LEGI&lt;br /&gt;
|-&lt;br /&gt;
| transfers || A-&amp;gt;B || A moved provision from B to another location || FR LEGI&lt;br /&gt;
|-&lt;br /&gt;
| source_text || A-&amp;gt;B || B is the source text that A codifies/implements || FR LEGI&lt;br /&gt;
|-&lt;br /&gt;
| associated_text || A&amp;lt;-&amp;gt;B || A and B are associated texts. FR LEGI: TXT_ASSOCIE, RATTACHEMENT/RATTACHE || FR LEGI&lt;br /&gt;
|-&lt;br /&gt;
| pilot_follower || A&amp;lt;-&amp;gt;B || A and B are synchronized (labor: pilot/follower) || FR LEGI&lt;br /&gt;
|-&lt;br /&gt;
| historical || A-&amp;gt;B || Historical link between A and B || FR LEGI&lt;br /&gt;
|-&lt;br /&gt;
| consolidates || A-&amp;gt;B || A consolidates multiple texts including B || All, EU CELLAR &amp;lt;code&amp;gt;act_consolidated_consolidates_resource_legal&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| language_variant || A&amp;lt;-&amp;gt;B || A and B are language versions of the same document || Multilingual jurisdictions&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Category 5: Judicial treatment (decision &amp;lt;-&amp;gt; decision) ==&lt;br /&gt;
&lt;br /&gt;
=== Negative treatments ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Edge kind !! Direction !! Description&lt;br /&gt;
|-&lt;br /&gt;
| overrules || A-&amp;gt;B || A overrules B (B&amp;#039;s ratio is no longer good law)&lt;br /&gt;
|-&lt;br /&gt;
| partially_overrules || A-&amp;gt;B || A overrules B on specific grounds. Properties: &amp;lt;code&amp;gt;{grounds: [...]}&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| reverses || A-&amp;gt;B || A reverses B in the same case (appellate)&lt;br /&gt;
|-&lt;br /&gt;
| vacates || A-&amp;gt;B || A vacates B (US)&lt;br /&gt;
|-&lt;br /&gt;
| not_followed || A-&amp;gt;B || A explicitly declines to follow B&lt;br /&gt;
|-&lt;br /&gt;
| criticizes || A-&amp;gt;B || A criticizes reasoning in B&lt;br /&gt;
|-&lt;br /&gt;
| doubts || A-&amp;gt;B || A expresses doubt about B&lt;br /&gt;
|-&lt;br /&gt;
| limits || A-&amp;gt;B || A narrows the scope of B without overruling&lt;br /&gt;
|-&lt;br /&gt;
| distinguishes || A-&amp;gt;B || A distinguishes its facts from B (rule in B does not apply)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Positive treatments ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Edge kind !! Direction !! Description&lt;br /&gt;
|-&lt;br /&gt;
| follows || A-&amp;gt;B || A follows the reasoning of B&lt;br /&gt;
|-&lt;br /&gt;
| applies_rule_of || A-&amp;gt;B || A applies the rule established in B&lt;br /&gt;
|-&lt;br /&gt;
| affirms || A-&amp;gt;B || A affirms B in the same case (appellate)&lt;br /&gt;
|-&lt;br /&gt;
| confirms || A-&amp;gt;B || A confirms B&amp;#039;s position on a legal question&lt;br /&gt;
|-&lt;br /&gt;
| explains || A-&amp;gt;B || A explains or clarifies B&lt;br /&gt;
|-&lt;br /&gt;
| harmonizes || A-&amp;gt;B || A reconciles B with another apparently conflicting decision&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Procedural relationships ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Edge kind !! Direction !! Description&lt;br /&gt;
|-&lt;br /&gt;
| appeal_of || A-&amp;gt;B || A is an appeal of B&lt;br /&gt;
|-&lt;br /&gt;
| cassation_of || A-&amp;gt;B || A is a cassation review of B (civil law)&lt;br /&gt;
|-&lt;br /&gt;
| remanded_from || A-&amp;gt;B || A results from remand by B&lt;br /&gt;
|-&lt;br /&gt;
| preliminary_reference_to || A-&amp;gt;B || National court A refers question to CJEU/constitutional court B&lt;br /&gt;
|-&lt;br /&gt;
| answers_preliminary_reference || A-&amp;gt;B || A answers the preliminary reference from B&lt;br /&gt;
|-&lt;br /&gt;
| constitutional_reference_to || A-&amp;gt;B || A refers constitutionality question to constitutional court B (FR QPC, IT, DE)&lt;br /&gt;
|-&lt;br /&gt;
| joined_with || A&amp;lt;-&amp;gt;B || A and B are joined cases&lt;br /&gt;
|-&lt;br /&gt;
| reviews || A-&amp;gt;B || A reviews B (generic procedural link). FR LEGI: SUITE_PROCEDURALE&lt;br /&gt;
|-&lt;br /&gt;
| opinion_for || A-&amp;gt;B || A is an opinion/conclusion for case B (rapporteur public, AG opinion, amicus). Properties: &amp;lt;code&amp;gt;{role: &amp;quot;rapporteur_public&amp;quot;|&amp;quot;avocat_general&amp;quot;|&amp;quot;amicus_curiae&amp;quot;}&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| referred_to_grand_chamber || A-&amp;gt;B || Chamber judgment A was referred to Grand Chamber, resulting in judgment B. ECHR (deferred — requires re-ingest with new fields)&lt;br /&gt;
|-&lt;br /&gt;
| execution_of || A-&amp;gt;B || Execution supervision document A monitors compliance with judgment B. ECHR HUDOC-EXEC (deferred — requires HUDOC-EXEC ingestion)&lt;br /&gt;
|-&lt;br /&gt;
| case_group_member || A-&amp;gt;B || Judgment A belongs to the execution group led by judgment B. ECHR HUDOC-EXEC (deferred — requires HUDOC-EXEC ingestion)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Category 6: Decision &amp;lt;-&amp;gt; legislation ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Edge kind !! Direction !! Description&lt;br /&gt;
|-&lt;br /&gt;
| interprets || A-&amp;gt;B || Decision A interprets provision B. FR LEGI: JURISPRUDENTIEL. EU CELLAR &amp;lt;code&amp;gt;case-law_interpretes_resource_legal&amp;lt;/code&amp;gt;, FR LEGI&lt;br /&gt;
|-&lt;br /&gt;
| declares_unconstitutional || A-&amp;gt;B || Decision A declares B unconstitutional&lt;br /&gt;
|-&lt;br /&gt;
| declares_constitutional || A-&amp;gt;B || Decision A declares B constitutional&lt;br /&gt;
|-&lt;br /&gt;
| declares_constitutional_with_reservation || A-&amp;gt;B || A declares B constitutional under specific interpretation. Properties: &amp;lt;code&amp;gt;{reservation: &amp;quot;...&amp;quot;}&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| annuls || A-&amp;gt;B || Administrative court A annuls administrative act B (same edge kind as Category 2 &amp;lt;code&amp;gt;annuls&amp;lt;/code&amp;gt;)&lt;br /&gt;
|-&lt;br /&gt;
| quashes || A-&amp;gt;B || A quashes B (UK judicial review)&lt;br /&gt;
|-&lt;br /&gt;
| disapplies || A-&amp;gt;B || A disapplies national law B (EU primacy). Also: plea of illegality (Art. 277 TFEU). EU CELLAR &amp;lt;code&amp;gt;case-law_incidentally_declares_void_resource_legal&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| states_infringement_of || A-&amp;gt;B || Infringement judgment A declares member state failure to comply with directive/regulation B (Art. 258 TFEU). EU CELLAR &amp;lt;code&amp;gt;case-law_states_failure_concerning_resource_legal&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| violates || A-&amp;gt;B || Judgment A finds a violation of Convention article B. ECHR (deferred — requires Convention text ingestion)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Category 7: Civil law doctrine-specific ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Edge kind !! Direction !! Description !! Country&lt;br /&gt;
|-&lt;br /&gt;
| establishes_jurisprudencia || A-&amp;gt;B || 5th concordant decision A makes tesis B binding || MX&lt;br /&gt;
|-&lt;br /&gt;
| interrupts_jurisprudencia || A-&amp;gt;B || Contradictory decision A breaks the reiteracion chain of tesis B || MX&lt;br /&gt;
|-&lt;br /&gt;
| substitutes_jurisprudencia || A-&amp;gt;B || New tesis A replaces old tesis B || MX&lt;br /&gt;
|-&lt;br /&gt;
| establishes_sumula || A-&amp;gt;B || Decision A contributes to creating sumula B || BR&lt;br /&gt;
|-&lt;br /&gt;
| cancels_sumula || A-&amp;gt;B || Decision A cancels sumula B || BR&lt;br /&gt;
|-&lt;br /&gt;
| guiding_case_reference || A-&amp;gt;B || Decision A refers to guiding case B || CN&lt;br /&gt;
|-&lt;br /&gt;
| judicial_interpretation_of || A-&amp;gt;B || SPC interpretation A interprets statute B || CN&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Category 8: Cross-regulation stacking ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Edge kind !! Direction !! Description&lt;br /&gt;
|-&lt;br /&gt;
| lex_specialis_to || A-&amp;gt;B || A prevails over B in their overlap area (lex specialis)&lt;br /&gt;
|-&lt;br /&gt;
| stacks_with || A&amp;lt;-&amp;gt;B || A and B apply concurrently with no displacement&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Notes ==&lt;br /&gt;
&lt;br /&gt;
* All types are directional (A-&amp;gt;B) unless marked A&amp;lt;-&amp;gt;B.&lt;br /&gt;
* The UNIQUE constraint &amp;lt;code&amp;gt;(source_id, target_id, kind)&amp;lt;/code&amp;gt; prevents duplicate edges.&lt;br /&gt;
* With nullable &amp;lt;code&amp;gt;target_id&amp;lt;/code&amp;gt; and PostgreSQL&amp;#039;s NULL-is-distinct-from-NULL behavior, multiple unresolved references from the same source are allowed.&lt;br /&gt;
* Edge properties carry type-specific metadata:&lt;br /&gt;
** &amp;lt;code&amp;gt;partially_overrules&amp;lt;/code&amp;gt;: &amp;lt;code&amp;gt;{grounds: [&amp;quot;moyen_2&amp;quot;, &amp;quot;moyen_3&amp;quot;], scope: &amp;quot;partial&amp;quot;}&amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;declares_constitutional_with_reservation&amp;lt;/code&amp;gt;: &amp;lt;code&amp;gt;{reservation: &amp;quot;conforme sous reserve que...&amp;quot;}&amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;commences&amp;lt;/code&amp;gt;: &amp;lt;code&amp;gt;{commencement_date: &amp;quot;2024-06-01&amp;quot;, extent: &amp;quot;england_and_wales&amp;quot;}&amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;suspends&amp;lt;/code&amp;gt;: &amp;lt;code&amp;gt;{start: &amp;quot;2024-01-01&amp;quot;, end: &amp;quot;2024-12-31&amp;quot;}&amp;lt;/code&amp;gt;&lt;br /&gt;
* The vocabulary is open — new types added when data sources provide them. No enum constraint in the schema.&lt;br /&gt;
&lt;br /&gt;
[[Category:Corpus]]&lt;/div&gt;</description>
			<pubDate>Thu, 23 Apr 2026 02:09:48 GMT</pubDate>
			<dc:creator>Nicolas</dc:creator>
			<comments>https://wiki.dura-lex.org/index.php/Talk:Corpus/Edge_types</comments>
		</item>
		<item>
			<title>Corpus/Tag conventions</title>
			<link>https://wiki.dura-lex.org/index.php?title=Corpus/Tag_conventions&amp;diff=47&amp;oldid=0</link>
			<guid isPermaLink="false">https://wiki.dura-lex.org/index.php?title=Corpus/Tag_conventions&amp;diff=47&amp;oldid=0</guid>
			<description>&lt;p&gt;Import from duralex/spec/TAG-CONVENTIONS.md — faithful conversion to wikitext (via create-page on MediaWiki MCP Server)&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;= Tag Conventions =&lt;br /&gt;
&lt;br /&gt;
Tags are the primary mechanism for jurisdiction-specific metadata. They live in the &amp;lt;code&amp;gt;tags&amp;lt;/code&amp;gt; JSONB column on &amp;lt;code&amp;gt;corpus.documents&amp;lt;/code&amp;gt;. This document defines the shared vocabulary — tag keys that have the same meaning across jurisdictions.&lt;br /&gt;
&lt;br /&gt;
Jurisdiction-specific tags (e.g., &amp;lt;code&amp;gt;idcc&amp;lt;/code&amp;gt; for French labor conventions, &amp;lt;code&amp;gt;foral&amp;lt;/code&amp;gt; for Spanish Basque tax law) are documented in each jurisdiction&amp;#039;s plugin, not here.&lt;br /&gt;
&lt;br /&gt;
== General rules ==&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Enum / classification tag values MUST be lowercase.&amp;#039;&amp;#039;&amp;#039; Values from controlled vocabularies (type, binding, enforcement_status, content_quality, importance_level, legal_branch, etc.) must always be lowercase. No mixed-case, no uppercase. Enforced at ingest time. This ensures deterministic matching and avoids case-sensitivity bugs in filters, discover mode, and tag_stats aggregation.&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Data values are stored as-is, queried case-insensitively.&amp;#039;&amp;#039;&amp;#039; Values that represent real-world data — company names (denominations like &amp;quot;DANONE&amp;quot;), legal form labels (&amp;quot;SAS&amp;quot;, &amp;quot;SARL&amp;quot;), role labels (&amp;quot;Président&amp;quot;), tribunal names, case numbers, ECLI identifiers, NOR codes — are stored in their original case. The MCP search tools already lowercase tag values at query time for case-insensitive matching.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Legal classification ==&lt;br /&gt;
&lt;br /&gt;
=== tags.type (required) ===&lt;br /&gt;
&lt;br /&gt;
The legal nature of the document. This does the work that the old per-table schema did.&lt;br /&gt;
&lt;br /&gt;
Values for &amp;lt;code&amp;gt;kind=legislation&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
statute, decree, regulation, enforcement_decree, ordinance, order,&lt;br /&gt;
collective_agreement, guidance, circular, manual, instruction,&lt;br /&gt;
fatwa, tesis, sumula_vinculante, tsūtatsu, judicial_interpretation,&lt;br /&gt;
dictamen, acordada, auto_acordado, normative_document,&lt;br /&gt;
inquiry_report, bill, debate, question, committee_report,&lt;br /&gt;
constitutional_amendment, provisional_measure, technical_standard,&lt;br /&gt;
code_of_practice, regulatory_handbook&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Values for &amp;lt;code&amp;gt;kind=decision&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
judgment, order, advisory_opinion, enforcement_decision,&lt;br /&gt;
constitutional_review, preliminary_ruling, arbitral_award,&lt;br /&gt;
tutela, amparo, advance_ruling, administrative_decision&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Values for &amp;lt;code&amp;gt;kind=record&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
company, person, property, patent, establishment&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Values for &amp;lt;code&amp;gt;kind=notice&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
insolvency, registration, modification, filing, deregistration,&lt;br /&gt;
capital_change, merger, liquidation, gazette_publication&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== tags.binding (optional) ===&lt;br /&gt;
&lt;br /&gt;
Whether the document creates binding legal obligations.&lt;br /&gt;
&lt;br /&gt;
Values: &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== tags.binding_scope (optional, when binding=true) ===&lt;br /&gt;
&lt;br /&gt;
Who is bound.&lt;br /&gt;
&lt;br /&gt;
Values: &amp;lt;code&amp;gt;erga_omnes&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;administration&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;inter_partes&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;applicant_only&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;sector&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== tags.legal_tradition (optional) ===&lt;br /&gt;
&lt;br /&gt;
For jurisdictions with mixed legal systems (UAE, ZA, NG).&lt;br /&gt;
&lt;br /&gt;
Values: &amp;lt;code&amp;gt;civil_law&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;common_law&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;sharia&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;customary&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;mixed&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;roman_dutch&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Document form ==&lt;br /&gt;
&lt;br /&gt;
=== tags.document_form (required for all documents) ===&lt;br /&gt;
&lt;br /&gt;
Editorial/administrative form of the document. Jurisdiction-agnostic. Distinguishes the authoritative text from its editorial variants, notices, opinions, and corrections. See ADR: document_form tag (design-decisions/2026-04-22-document-form-tag.md) for naming rationale.&lt;br /&gt;
&lt;br /&gt;
Values:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Value !! Description !! Examples&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;canonical_text&amp;lt;/code&amp;gt; || Authoritative full text (default) || Judgment, statute, regulation, collective agreement&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;editorial_summary&amp;lt;/code&amp;gt; || Summary by documentalist/editor || CELEX &amp;lt;code&amp;gt;_res&amp;lt;/code&amp;gt;, headnote, syllabus, Leitsatz, massima&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;gazette_notice&amp;lt;/code&amp;gt; || Publication notice in official gazette || EU OJ-C notice, JORF avis, Federal Register notice&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;case_registration&amp;lt;/code&amp;gt; || Notice of new case filing || CELEX CN/TN/FN, certified question (US), ICJ memorial&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;corrigendum&amp;lt;/code&amp;gt; || Correction/erratum || JORF rectificatif, EUR-Lex corrigendum&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;consolidated_version&amp;lt;/code&amp;gt; || Consolidated text incorporating amendments || EUR-Lex consolidated, UK consolidation act&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;amendment&amp;lt;/code&amp;gt; || Amending instrument || Avenant (ACCO/KALI), amending regulation&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;dissenting_opinion&amp;lt;/code&amp;gt; || Dissenting opinion by judge(s) || ECHR, ICJ, SCOTUS, BVerfG Sondervotum&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;concurring_opinion&amp;lt;/code&amp;gt; || Concurring opinion by judge(s) || ECHR, common law&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;separate_opinion&amp;lt;/code&amp;gt; || Separate opinion (neutral) || ICJ Art.57, ECHR&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;declaration&amp;lt;/code&amp;gt; || Brief declaration without detailed reasoning || ICJ, ECHR&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;per_curiam&amp;lt;/code&amp;gt; || Unsigned opinion attributed to the court || SCOTUS, UKSC&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;memorandum_opinion&amp;lt;/code&amp;gt; || Brief opinion without detailed reasoning || US federal courts&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Default: &amp;lt;code&amp;gt;canonical_text&amp;lt;/code&amp;gt; when not specified. Title prefix: when &amp;lt;code&amp;gt;document_form != canonical_text&amp;lt;/code&amp;gt;, prefix title with English bracketed label: &amp;lt;code&amp;gt;[Editorial Summary]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;[OJ Notice]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;[Case Filing]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;[Corrigendum]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;[Consolidated]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;[Amendment]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;[Dissenting Opinion]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;[Concurring Opinion]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;[Separate Opinion]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;[Declaration]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;[Per Curiam]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;[Memorandum]&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Temporal metadata ==&lt;br /&gt;
&lt;br /&gt;
=== tags.enforcement_status (for kind=legislation with versioning) ===&lt;br /&gt;
&lt;br /&gt;
Values:&lt;br /&gt;
* &amp;lt;code&amp;gt;in_force&amp;lt;/code&amp;gt; — currently applicable&lt;br /&gt;
* &amp;lt;code&amp;gt;deferred_enforcement&amp;lt;/code&amp;gt; — adopted but not yet in force, will be on a future date&lt;br /&gt;
* &amp;lt;code&amp;gt;deferred_repeal&amp;lt;/code&amp;gt; — currently in force, repeal scheduled for a future date&lt;br /&gt;
* &amp;lt;code&amp;gt;repealed&amp;lt;/code&amp;gt; — explicitly repealed by a subsequent act&lt;br /&gt;
* &amp;lt;code&amp;gt;superseded&amp;lt;/code&amp;gt; — historical version, a newer version of the same article exists&lt;br /&gt;
* &amp;lt;code&amp;gt;never_in_force&amp;lt;/code&amp;gt; — modified before its effective date, never applied&lt;br /&gt;
* &amp;lt;code&amp;gt;expired&amp;lt;/code&amp;gt; — lapsed by its own terms (sunset clause, fixed-duration text)&lt;br /&gt;
* &amp;lt;code&amp;gt;annulled&amp;lt;/code&amp;gt; — struck down by a court (e.g. constitutional review) — typically retroactive&lt;br /&gt;
* &amp;lt;code&amp;gt;transferred&amp;lt;/code&amp;gt; — content moved to a different article or location (renumbering)&lt;br /&gt;
* &amp;lt;code&amp;gt;denounced&amp;lt;/code&amp;gt; — collective agreement repudiated by one of the parties&lt;br /&gt;
* &amp;lt;code&amp;gt;disjoined&amp;lt;/code&amp;gt; — version split into multiple separate articles&lt;br /&gt;
* &amp;lt;code&amp;gt;conditional&amp;lt;/code&amp;gt; — in force only under a specific interpretation (constitutional reservation)&lt;br /&gt;
* &amp;lt;code&amp;gt;pending&amp;lt;/code&amp;gt; — emergency decree or provisional measure awaiting ratification&lt;br /&gt;
&lt;br /&gt;
=== tags.in_force (boolean shortcut) ===&lt;br /&gt;
&lt;br /&gt;
Values: &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== tags.status (for provisional instruments: BR medida provisoria, AR DNU) ===&lt;br /&gt;
&lt;br /&gt;
Values: &amp;lt;code&amp;gt;in_force&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;pending_ratification&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;converted&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;rejected&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;lapsed&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== tags.last_modified (optional, ISO date) ===&lt;br /&gt;
&lt;br /&gt;
Date the source last modified this document editorially. Distinct from &amp;lt;code&amp;gt;date&amp;lt;/code&amp;gt; (legal effect date) and from ingestion timestamps. Populated when the source exposes it (BOFiP &amp;lt;code&amp;gt;bodgfip:date_modification&amp;lt;/code&amp;gt;, Judilibre &amp;lt;code&amp;gt;update_date&amp;lt;/code&amp;gt;, KALI &amp;lt;code&amp;gt;DATE_PUBLI&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
=== tags.date_published (optional, ISO date) ===&lt;br /&gt;
&lt;br /&gt;
Date the document was officially published (e.g. in the Journal Officiel, Official Gazette, EUR-Lex). Distinct from &amp;lt;code&amp;gt;date&amp;lt;/code&amp;gt; (legal effect date) which may be later (deferred enforcement). Populated when source exposes it and it differs from &amp;lt;code&amp;gt;date&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Non-Gregorian calendars ==&lt;br /&gt;
&lt;br /&gt;
ISO date in the promoted &amp;lt;code&amp;gt;date&amp;lt;/code&amp;gt; column. Original calendar representation in tags.&lt;br /&gt;
&lt;br /&gt;
=== tags.date_hijri ===&lt;br /&gt;
&lt;br /&gt;
Islamic (Hijri) calendar date. Format: &amp;lt;code&amp;gt;&amp;quot;YYYY-MM-DD&amp;quot;&amp;lt;/code&amp;gt; in Hijri.&lt;br /&gt;
&lt;br /&gt;
Used by: SA, AE, other Middle Eastern jurisdictions.&lt;br /&gt;
&lt;br /&gt;
=== tags.date_era_jp ===&lt;br /&gt;
&lt;br /&gt;
Japanese imperial era year. Format: era letter + 2-digit year (e.g., &amp;lt;code&amp;gt;&amp;quot;R06&amp;quot;&amp;lt;/code&amp;gt; = Reiwa 6 = 2024).&lt;br /&gt;
&lt;br /&gt;
Used by: JP.&lt;br /&gt;
&lt;br /&gt;
=== tags.date_roc_tw ===&lt;br /&gt;
&lt;br /&gt;
Republic of China (Minguo) year. Format: 3-digit year (e.g., &amp;lt;code&amp;gt;&amp;quot;112&amp;quot;&amp;lt;/code&amp;gt; = 2023).&lt;br /&gt;
&lt;br /&gt;
Used by: TW.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Content quality ==&lt;br /&gt;
&lt;br /&gt;
=== tags.content_quality (required for all documents) ===&lt;br /&gt;
&lt;br /&gt;
The quality level of the text in &amp;lt;code&amp;gt;body&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Values (progression order):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ocr_raw              — OCR extraction, errors likely&lt;br /&gt;
ocr_cleaned          — OCR cleaned by regex or LLM&lt;br /&gt;
native_raw           — native text (PDF text layer, .doc), structure lost&lt;br /&gt;
native_structured    — structured source (HTML Legifrance, XML Akoma Ntoso, API JSON)&lt;br /&gt;
machine_reviewed     — reviewed/corrected by LLM&lt;br /&gt;
human_reviewed       — reviewed by a human&lt;br /&gt;
jurist_reviewed      — validated by a jurist (highest confidence)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Only the current level is stored. History is not tracked.&lt;br /&gt;
&lt;br /&gt;
Critical for:&lt;br /&gt;
&lt;br /&gt;
* Knowledge graph trust chains (annotations on &amp;lt;code&amp;gt;ocr_raw&amp;lt;/code&amp;gt; docs have lower confidence)&lt;br /&gt;
* User-facing warnings (&amp;quot;this text may contain OCR errors&amp;quot;)&lt;br /&gt;
* Quality pipeline prioritization&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Sub-jurisdiction ==&lt;br /&gt;
&lt;br /&gt;
=== tags.sub_jurisdiction ===&lt;br /&gt;
&lt;br /&gt;
For legal enclaves or devolved entities within a jurisdiction that have their own legal system.&lt;br /&gt;
&lt;br /&gt;
Examples: &amp;lt;code&amp;gt;difc&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;adgm&amp;lt;/code&amp;gt; (UAE free zones with English common law courts).&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;jurisdiction&amp;lt;/code&amp;gt; column carries the country; this tag carries the enclave.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Internal tags ==&lt;br /&gt;
&lt;br /&gt;
Tags prefixed with &amp;lt;code&amp;gt;_&amp;lt;/code&amp;gt; are internal: never displayed to users, excluded from discover mode, excluded from &amp;lt;code&amp;gt;tag_stats&amp;lt;/code&amp;gt;. Used for computed values needed by the search engine. Populated at ingestion time by jurisdiction plugins.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Quality flags ==&lt;br /&gt;
&lt;br /&gt;
=== tags.need_fixing ===&lt;br /&gt;
&lt;br /&gt;
Marker that the document has a known data quality issue that should be revisited later. The value is the &amp;#039;&amp;#039;category&amp;#039;&amp;#039; of the problem so we can group records by what needs to be done:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;date&amp;lt;/code&amp;gt; — one or more date columns were nullified at ingest time because the source published an aberrant value (DILA sentinels like &amp;lt;code&amp;gt;2999-01-01&amp;lt;/code&amp;gt; in the wrong column, INPI &amp;lt;code&amp;gt;9999-12-31&amp;lt;/code&amp;gt;, manual typos like &amp;lt;code&amp;gt;5489-12-30&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;3023-04-03&amp;lt;/code&amp;gt;). The original raw value is lost; recovering it requires re-fetching from the source. Used by &amp;lt;code&amp;gt;duralex.ingest.date_validation.validate_date&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
The tag is intentionally a single string and not an array — one flag per document is enough for now. If we ever need to track multiple issue categories on the same document, switch to an array.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Precedent, publication, and importance ==&lt;br /&gt;
&lt;br /&gt;
=== tags.is_precedent (boolean) ===&lt;br /&gt;
&lt;br /&gt;
Formally designated as binding precedent.&lt;br /&gt;
&lt;br /&gt;
Used by: FI (ennakkopäätös), PL (uchwala zasada prawna), CN (guiding case).&lt;br /&gt;
&lt;br /&gt;
=== tags.official_grade (string, kind=decision) ===&lt;br /&gt;
&lt;br /&gt;
Official publication/importance grade assigned by the jurisdiction. Values are jurisdiction-specific, documented per plugin. Absent when the source has no grading system.&lt;br /&gt;
&lt;br /&gt;
The grade is relative to the issuing court — a high grade from a first-instance court is not equivalent to the same grade from a supreme court. The real importance depends on the (court, grade) pair.&lt;br /&gt;
&lt;br /&gt;
Known values by jurisdiction:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Jurisdiction !! Source !! Values (highest → lowest)&lt;br /&gt;
|-&lt;br /&gt;
| FR admin (CE, TdC) || JADE &amp;lt;code&amp;gt;PUBLI_RECUEIL&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;A&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;B&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| FR admin (cour_administrative_appel, tribunal_administratif) || JADE &amp;lt;code&amp;gt;PUBLI_RECUEIL&amp;lt;/code&amp;gt;, CE opendata &amp;lt;code&amp;gt;Code_Publication&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;R&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;C+&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;C&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;D&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Z&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| FR cass (post-2021) || Judilibre &amp;lt;code&amp;gt;publication&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;rapport&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;bulletin&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;diffuse&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;non_diffuse&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| FR cass (pre-2021) || Judilibre &amp;lt;code&amp;gt;publication&amp;lt;/code&amp;gt;, DILA XML || &amp;lt;code&amp;gt;rapport&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;bulletin&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;bulletin_information&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;internet&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;diffuse&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| ECHR || HUDOC &amp;lt;code&amp;gt;importance&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| CJEU || CELLAR &amp;lt;code&amp;gt;erecueil&amp;lt;/code&amp;gt; + CELEX sector || &amp;lt;code&amp;gt;ecr_grand_chamber&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ecr_chamber&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;oj_only&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;unpublished&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| DE || juris &amp;lt;code&amp;gt;Dokumenttyp&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;amtlicher_leitsatz&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;orientierungssatz&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;redaktioneller_leitsatz&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| CH || bger.ch || &amp;lt;code&amp;gt;atf&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;atf_partial&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;online_only&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| US || CourtListener || &amp;lt;code&amp;gt;precedential&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;non_precedential&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| CN || SPC database || &amp;lt;code&amp;gt;guiding&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;reference&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;typical&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;gazette&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ordinary&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| MX || SJF || &amp;lt;code&amp;gt;jurisprudencia&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;precedente&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;tesis_aislada&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| IT || CED || &amp;lt;code&amp;gt;sezioni_unite_massima&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;massima&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;no_massima&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| UK || ICLR || &amp;lt;code&amp;gt;law_reports&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;wlr_2_3&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;wlr_1&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;wlr_4&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;all_er&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;unreported&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| FR fond (cour_appel, tribunal_judiciaire, tribunal_commerce) || Judilibre &amp;lt;code&amp;gt;particularInterest&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;particular_interest&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| FR financial (CdC, CRC, CDBF, CAF) || Légifrance &amp;lt;code&amp;gt;publicationRecueil&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;recueil&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== tags.importance_level (string, computed) ===&lt;br /&gt;
&lt;br /&gt;
Harmonized importance score derived from &amp;lt;code&amp;gt;official_grade&amp;lt;/code&amp;gt; by jurisdiction plugins. NOT an official classification — computed by Dura Lex for cross-jurisdiction search and FTS ranking. Applies to &amp;lt;code&amp;gt;kind=decision&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;kind=legislation&amp;lt;/code&amp;gt; (for authoritative guidance like BOFiP fiscal doctrine). Absent when no importance signal is available. BOFiP documents are always &amp;lt;code&amp;gt;high_importance&amp;lt;/code&amp;gt; (no per-document grading from the source).&lt;br /&gt;
&lt;br /&gt;
Values (ascending importance): &amp;lt;code&amp;gt;minimal_importance&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;low_importance&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;medium_importance&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;high_importance&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;highest_importance&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== tags._importance_level_default (string, internal) ===&lt;br /&gt;
&lt;br /&gt;
Internal tag for FTS ranking, never displayed. Always set for documents that have importance signals (&amp;lt;code&amp;gt;kind=decision&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;kind=legislation&amp;lt;/code&amp;gt; with authoritative guidance). Equals &amp;lt;code&amp;gt;importance_level&amp;lt;/code&amp;gt; when available, else derived from &amp;lt;code&amp;gt;court_level&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;supreme&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;constitutional&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;supranational&amp;lt;/code&amp;gt; → &amp;lt;code&amp;gt;medium_importance&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;appellate&amp;lt;/code&amp;gt; → &amp;lt;code&amp;gt;low_importance&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;first_instance&amp;lt;/code&amp;gt; → &amp;lt;code&amp;gt;minimal_importance&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;court_level&amp;lt;/code&amp;gt; absent or null → &amp;lt;code&amp;gt;unknown_importance&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== tags.formation_solemnity (string, computed, kind=decision) ===&lt;br /&gt;
&lt;br /&gt;
Standardized bench type derived from &amp;lt;code&amp;gt;formation&amp;lt;/code&amp;gt; by jurisdiction plugins. NOT an official classification — computed by Dura Lex for cross-jurisdiction comparison and display. Absent when formation is unknown.&lt;br /&gt;
&lt;br /&gt;
Values (ascending solemnity): &amp;lt;code&amp;gt;single_judge&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;reduced_bench&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;standard_bench&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;combined_chambers&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;grand_bench&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;full_court&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== tags.court_level (string, kind=decision) ===&lt;br /&gt;
&lt;br /&gt;
Position of the issuing court in the judicial hierarchy. Cross-jurisdiction handle for filtering by instance. Distinct from &amp;lt;code&amp;gt;court&amp;lt;/code&amp;gt; (the name) and from &amp;lt;code&amp;gt;formation_solemnity&amp;lt;/code&amp;gt; (the bench that heard the case). Null (absent) for non-judicial authorities (CNIL, CADA, AMF, Défenseur des droits) and for sui generis bodies that don&amp;#039;t fit the hierarchy (Tribunal des conflits).&lt;br /&gt;
&lt;br /&gt;
Values:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;first_instance&amp;lt;/code&amp;gt; — trial courts (FR tribunal judiciaire, tribunal de commerce, tribunal administratif, conseil de prud&amp;#039;hommes; EU General Court, Civil Service Tribunal)&lt;br /&gt;
* &amp;lt;code&amp;gt;appellate&amp;lt;/code&amp;gt; — appeal courts (FR cour d&amp;#039;appel, cour administrative d&amp;#039;appel, tribunal supérieur d&amp;#039;appel)&lt;br /&gt;
* &amp;lt;code&amp;gt;supreme&amp;lt;/code&amp;gt; — apex ordinary courts (FR Cour de cassation, Conseil d&amp;#039;État)&lt;br /&gt;
* &amp;lt;code&amp;gt;constitutional&amp;lt;/code&amp;gt; — constitutional review bodies (FR Conseil constitutionnel, DE BVerfG, IT Corte Costituzionale)&lt;br /&gt;
* &amp;lt;code&amp;gt;supranational&amp;lt;/code&amp;gt; — international/supranational courts (CJEU Court of Justice, ECHR, ICJ)&lt;br /&gt;
&lt;br /&gt;
See ADR: Tag tier architecture (design-decisions/2026-04-22-tag-tier-architecture.md) for the per-jurisdiction mapping rationale.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Collective bargaining ==&lt;br /&gt;
&lt;br /&gt;
=== tags.bargaining_level (string, kind=legislation, type=collective_agreement) ===&lt;br /&gt;
&lt;br /&gt;
Level at which a collective agreement was negotiated. ILO/OECD standard terminology. Applies to collective agreements and amendments (&amp;lt;code&amp;gt;avenants&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Values:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;enterprise&amp;lt;/code&amp;gt; — company-level (FR &amp;lt;code&amp;gt;entreprise&amp;lt;/code&amp;gt;, including group and establishment agreements)&lt;br /&gt;
* &amp;lt;code&amp;gt;sectoral&amp;lt;/code&amp;gt; — industry/branch-level (FR &amp;lt;code&amp;gt;branche&amp;lt;/code&amp;gt;)&lt;br /&gt;
* &amp;lt;code&amp;gt;inter_sectoral&amp;lt;/code&amp;gt; — cross-industry, national (FR &amp;lt;code&amp;gt;interprofessionnel&amp;lt;/code&amp;gt;, e.g. ANI)&lt;br /&gt;
* &amp;lt;code&amp;gt;territorial&amp;lt;/code&amp;gt; — geographically scoped (regional, departmental)&lt;br /&gt;
&lt;br /&gt;
Renames the former FR-specific &amp;lt;code&amp;gt;level&amp;lt;/code&amp;gt; key.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Administrative subclassification ==&lt;br /&gt;
&lt;br /&gt;
=== tags.subcategory (string, optional) ===&lt;br /&gt;
&lt;br /&gt;
Subclassification finer than &amp;lt;code&amp;gt;type&amp;lt;/code&amp;gt;. T2: key is shared across jurisdictions, value vocabularies are controlled per plugin and listed in that plugin&amp;#039;s documentation. Used primarily on &amp;lt;code&amp;gt;kind=notice&amp;lt;/code&amp;gt; (BODACC event types) and on records (RCS filing subtypes). Values are English lowercase, slugified — translated from source classifications so they are portable across tools.&lt;br /&gt;
&lt;br /&gt;
Per-plugin value lists live in &amp;lt;code&amp;gt;duralex-ingest-fr/docs/FR-TAGS.md&amp;lt;/code&amp;gt; and equivalents.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Source-native classifications (T3) ==&lt;br /&gt;
&lt;br /&gt;
Some tag keys hold values that mirror the source&amp;#039;s own taxonomy rather than a Dura Lex enum. These keys are documented per plugin, not here, and are intended for intra-jurisdiction precision filters. Values are slugified at ingest time (lowercase, no accents, spaces → underscores) so that queries remain deterministic.&lt;br /&gt;
&lt;br /&gt;
=== tags.nature (string) ===&lt;br /&gt;
&lt;br /&gt;
Source-native document classification (e.g. FR &amp;lt;code&amp;gt;arret&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ordonnance&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;loi_organique&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;qpc&amp;lt;/code&amp;gt;). T3 source-fidelity — values are plugin-specific. For cross-jurisdiction search, prefer &amp;lt;code&amp;gt;type&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;document_form&amp;lt;/code&amp;gt;; use &amp;lt;code&amp;gt;nature&amp;lt;/code&amp;gt; for jurisdiction-local precision (e.g. distinguishing QPC from an ordinary Conseil constitutionnel decision).&lt;br /&gt;
&lt;br /&gt;
Slugification (accent removal + space → underscore) is applied centrally at ingest time by &amp;lt;code&amp;gt;duralex.ingest.tag_normalization.normalize_tag_value&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Known tech debt: EU &amp;lt;code&amp;gt;nature&amp;lt;/code&amp;gt; values are French-origin slugs because CJEU ingestion sources French documents first. See ADR: Tag tier architecture (design-decisions/2026-04-22-tag-tier-architecture.md).&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Legal branch ==&lt;br /&gt;
&lt;br /&gt;
=== tags.legal_branch (array, kind=legislation only) ===&lt;br /&gt;
&lt;br /&gt;
Branch(es) of law. Populated at ingest from code→branch mapping (deterministic). Decisions: LLM-enriched (future).&lt;br /&gt;
&lt;br /&gt;
Values: &amp;lt;code&amp;gt;civil&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;criminal&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;administrative&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;commercial&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;social&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;tax&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;constitutional&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;environmental&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;consumer&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ip&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;public_procurement&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;health&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;family&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;real_estate&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;digital&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Translation ==&lt;br /&gt;
&lt;br /&gt;
=== tags.translation_of ===&lt;br /&gt;
&lt;br /&gt;
ID of the original document this is a translation of. Present only on translated documents, not on originals.&lt;br /&gt;
&lt;br /&gt;
=== tags.translation_quality ===&lt;br /&gt;
&lt;br /&gt;
Quality of the translation. Present only on documents that are translations or language variants.&lt;br /&gt;
&lt;br /&gt;
Values:&lt;br /&gt;
* &amp;lt;code&amp;gt;official&amp;lt;/code&amp;gt; — equally authoritative version (EU texts in 24 languages, BE/FI/CH bilingual laws). No single original exists.&lt;br /&gt;
* &amp;lt;code&amp;gt;official_translation&amp;lt;/code&amp;gt; — official translation without equal legal force&lt;br /&gt;
* &amp;lt;code&amp;gt;machine_translated&amp;lt;/code&amp;gt; — LLM translation, not verified&lt;br /&gt;
* &amp;lt;code&amp;gt;human_reviewed&amp;lt;/code&amp;gt; — translation reviewed by bilingual human&lt;br /&gt;
&lt;br /&gt;
=== tags.translation_pending ===&lt;br /&gt;
&lt;br /&gt;
ISO 639-1 code of the target language for which a translation is pending. Set on documents whose original language differs from the user&amp;#039;s primary language and that have not yet been translated. Removed once a &amp;lt;code&amp;gt;language_variant&amp;lt;/code&amp;gt; edge is created linking to the translated version.&lt;br /&gt;
&lt;br /&gt;
Used by the LLM enrichment script (&amp;lt;code&amp;gt;enrich_translations.py&amp;lt;/code&amp;gt;) to find candidates for machine translation:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT id, body, body_search FROM corpus.documents&lt;br /&gt;
WHERE jurisdiction=&amp;#039;eu&amp;#039; AND tags-&amp;gt;&amp;gt;&amp;#039;translation_pending&amp;#039; = &amp;#039;fr&amp;#039;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== ID convention for language variants ===&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;EU texts&amp;#039;&amp;#039;&amp;#039; (all versions equally authoritative): every version has a language suffix. No version is &amp;quot;the original.&amp;quot;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
eu.celex:32016r0679:fr    language=fr, tags.translation_quality=official&lt;br /&gt;
eu.celex:32016r0679:en    language=en, tags.translation_quality=official&lt;br /&gt;
eu.celex:32016r0679:de    language=de, tags.translation_quality=official&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;National texts with translations&amp;#039;&amp;#039;&amp;#039; (one original, others are translations): the original has no suffix. Translations have &amp;lt;code&amp;gt;:lang&amp;lt;/code&amp;gt; suffix and &amp;lt;code&amp;gt;tags.translation_of&amp;lt;/code&amp;gt; pointing to the original.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
fr.legiarti000006902764       language=fr  (original, no suffix)&lt;br /&gt;
fr.legiarti000006902764:en    language=en, tags.translation_of=fr.legiarti000006902764&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
All language variants are linked by &amp;lt;code&amp;gt;language_variant&amp;lt;/code&amp;gt; edges. The edge target is chosen by convention (alphabetical or first ingested) — no version is inherently canonical for equally authoritative texts.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Identifiers ==&lt;br /&gt;
&lt;br /&gt;
=== tags.text_id (kind=legislation and chunk) ===&lt;br /&gt;
&lt;br /&gt;
Cross-language canonical identifier of the underlying legal work. Equal across all language variants of the same text — does NOT carry the &amp;lt;code&amp;gt;:lang&amp;lt;/code&amp;gt; suffix that the document &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; column carries. Used by reference resolvers to find a text regardless of language.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
id = &amp;quot;eu.eurlextext32016r0679:fr&amp;quot;   tags.text_id = &amp;quot;eu.eurlextext32016r0679&amp;quot;&lt;br /&gt;
id = &amp;quot;eu.eurlextext32016r0679:en&amp;quot;   tags.text_id = &amp;quot;eu.eurlextext32016r0679&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Both rows match a search by &amp;lt;code&amp;gt;text_id = &amp;quot;eu.eurlextext32016r0679&amp;quot;&amp;lt;/code&amp;gt;. The search engine then narrows by user language via the &amp;lt;code&amp;gt;language&amp;lt;/code&amp;gt; filter on &amp;lt;code&amp;gt;TagQuery&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
For articles and sections, &amp;lt;code&amp;gt;tags.text_id&amp;lt;/code&amp;gt; points to the parent text (also without &amp;lt;code&amp;gt;:lang&amp;lt;/code&amp;gt; suffix), enabling cross-language navigation: an article in the EN version of GDPR has the same &amp;lt;code&amp;gt;text_id&amp;lt;/code&amp;gt; as the corresponding article in the FR version.&lt;br /&gt;
&lt;br /&gt;
=== tags.eli ===&lt;br /&gt;
&lt;br /&gt;
ELI (European Legislation Identifier) URI when provided by source. Not all jurisdictions support ELI.&lt;br /&gt;
&lt;br /&gt;
=== tags.celex ===&lt;br /&gt;
&lt;br /&gt;
CELEX identifier for EU documents (EUR-Lex primary key). Format: sector digit + 4-digit year + type letter(s) + ordinal (e.g. &amp;lt;code&amp;gt;32016R0679&amp;lt;/code&amp;gt; for GDPR). Redundant with the document ID (&amp;lt;code&amp;gt;EU.CELEX:32016R0679&amp;lt;/code&amp;gt;) but useful for tag-based filtering and discovery.&lt;br /&gt;
&lt;br /&gt;
=== tags.ecli (kind=decision) ===&lt;br /&gt;
&lt;br /&gt;
ECLI (European Case Law Identifier). Stored upper-case with whitespace stripped (ECLIs are case-insensitive per the EU spec but published mixed-case across sources). Normalization happens at ingest time via &amp;lt;code&amp;gt;duralex.ingest.tag_normalization.normalize_ecli&amp;lt;/code&amp;gt; so dedup queries can match cross-source via a single partial expression index.&lt;br /&gt;
&lt;br /&gt;
=== tags.case_number (array, kind=decision) ===&lt;br /&gt;
&lt;br /&gt;
Display form of the case number(s), as published by the source. Multiple aliases allowed. Used for human-readable presentation only.&lt;br /&gt;
&lt;br /&gt;
=== tags.case_number_normalized (array, kind=decision) ===&lt;br /&gt;
&lt;br /&gt;
Indexable form of the case number(s) for cross-source dedup matching. Built at ingest time by &amp;lt;code&amp;gt;duralex.ingest.tag_normalization.normalize_case_number_list&amp;lt;/code&amp;gt; which strips dots and whitespace while preserving dashes, slashes and letters (matches the historical &amp;lt;code&amp;gt;replace(., &amp;#039;.&amp;#039;, &amp;#039;&amp;#039;)&amp;lt;/code&amp;gt; semantics so we don&amp;#039;t introduce cross-court false positives like CASS &amp;lt;code&amp;gt;22-13456&amp;lt;/code&amp;gt; colliding with CAPP &amp;lt;code&amp;gt;22/13456&amp;lt;/code&amp;gt;). Backed by partial GIN &amp;lt;code&amp;gt;jsonb_path_ops&amp;lt;/code&amp;gt; index &amp;lt;code&amp;gt;idx_doc_decision_case_number_normalized&amp;lt;/code&amp;gt; for &amp;lt;code&amp;gt;@&amp;amp;gt;&amp;lt;/code&amp;gt; containment queries.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Original document reference ==&lt;br /&gt;
&lt;br /&gt;
=== tags.original_url ===&lt;br /&gt;
&lt;br /&gt;
URL or path to the original document (PDF in external storage).&lt;br /&gt;
&lt;br /&gt;
=== tags.original_format ===&lt;br /&gt;
&lt;br /&gt;
Original format: &amp;lt;code&amp;gt;pdf&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;xml&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;html&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;json&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;docx&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;odt&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Document structure (for kind=chunk) ==&lt;br /&gt;
&lt;br /&gt;
=== tags.part ===&lt;br /&gt;
&lt;br /&gt;
The structural section of the parent document this chunk represents.&lt;br /&gt;
&lt;br /&gt;
Values: &amp;lt;code&amp;gt;visa&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;facts&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;moyens&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;reasoning&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ruling&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ag_opinion&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;conclusie&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;dispositif&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== tags.position ===&lt;br /&gt;
&lt;br /&gt;
Ordinal position within parent (for ordering chunks and sections).&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Article versioning ==&lt;br /&gt;
&lt;br /&gt;
=== tags.cid ===&lt;br /&gt;
&lt;br /&gt;
Permanent article identity — groups temporal versions of the same article across renumbering. Corresponds to LEGI XML CID in France; other jurisdictions provide equivalent identifiers (e.g., BWB number in NL, SFS number in SE).&lt;br /&gt;
&lt;br /&gt;
Used by: the compiler to group versions, the &amp;lt;code&amp;gt;at_date&amp;lt;/code&amp;gt; TagQuery to select the correct temporal version, the knowledge graph to link concepts to articles.&lt;br /&gt;
&lt;br /&gt;
See [[Corpus/Temporal|TEMPORAL]] for temporal versioning details.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Structure type (for kind=section) ==&lt;br /&gt;
&lt;br /&gt;
=== tags.structure_type ===&lt;br /&gt;
&lt;br /&gt;
Differentiates navigation trees.&lt;br /&gt;
&lt;br /&gt;
Values: &amp;lt;code&amp;gt;legislation&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;labor&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;doctrine&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;official_journal&amp;lt;/code&amp;gt; (and future jurisdiction-specific values)&lt;br /&gt;
&lt;br /&gt;
[[Category:Corpus]]&lt;/div&gt;</description>
			<pubDate>Thu, 23 Apr 2026 02:08:28 GMT</pubDate>
			<dc:creator>Nicolas</dc:creator>
			<comments>https://wiki.dura-lex.org/index.php/Talk:Corpus/Tag_conventions</comments>
		</item>
		<item>
			<title>Development/Adding a source</title>
			<link>https://wiki.dura-lex.org/index.php?title=Development/Adding_a_source&amp;diff=46&amp;oldid=0</link>
			<guid isPermaLink="false">https://wiki.dura-lex.org/index.php?title=Development/Adding_a_source&amp;diff=46&amp;oldid=0</guid>
			<description>&lt;p&gt;Create guide for adding a new data source to the ingest pipeline (via create-page on MediaWiki MCP Server)&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;= Adding a source =&lt;br /&gt;
&lt;br /&gt;
This guide explains how to add a new data source to the Dura Lex ingest pipeline. A &amp;quot;source&amp;quot; is a public institutional data feed (legislation, case law, company records, official notices) that gets downloaded, parsed, and inserted into the corpus.&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
&lt;br /&gt;
Adding a source involves these steps:&lt;br /&gt;
&lt;br /&gt;
# Register the source in the source registry&lt;br /&gt;
# Implement a downloader (and optionally a parser)&lt;br /&gt;
# Follow tag and edge conventions&lt;br /&gt;
# Document the source on the wiki&lt;br /&gt;
&lt;br /&gt;
== Step 1: Register the source ==&lt;br /&gt;
&lt;br /&gt;
Every source must be registered in the jurisdiction&amp;#039;s &amp;lt;code&amp;gt;source_registry.py&amp;lt;/code&amp;gt; module. Registration happens at import time via the &amp;lt;code&amp;gt;register_source()&amp;lt;/code&amp;gt; function from &amp;lt;code&amp;gt;duralex.ingest.source_registry&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Location ===&lt;br /&gt;
&lt;br /&gt;
* French sources: &amp;lt;code&amp;gt;duralex-ingest/duralex-ingest-fr/src/duralex/ingest/fr/source_registry.py&amp;lt;/code&amp;gt;&lt;br /&gt;
* EU sources: &amp;lt;code&amp;gt;duralex-ingest/duralex-ingest-eu/src/duralex/ingest/eu/source_registry.py&amp;lt;/code&amp;gt;&lt;br /&gt;
* New jurisdictions: create &amp;lt;code&amp;gt;duralex-ingest/duralex-ingest-{jur}/src/duralex/ingest/{jur}/source_registry.py&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Required fields ===&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;register_source()&amp;lt;/code&amp;gt; function requires the following fields:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Field !! Type !! Description !! Example&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;source_key&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;str&amp;lt;/code&amp;gt; (positional) || Unique short identifier for the source || &amp;lt;code&amp;gt;&amp;quot;cada&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;jurisdiction&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;str&amp;lt;/code&amp;gt; || ISO-style jurisdiction code || &amp;lt;code&amp;gt;&amp;quot;fr&amp;quot;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;quot;eu&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;str&amp;lt;/code&amp;gt; || Human-readable source name || &amp;lt;code&amp;gt;&amp;quot;CADA&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;description&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;str&amp;lt;/code&amp;gt; || What this source contains || &amp;lt;code&amp;gt;&amp;quot;Avis et conseils de la Commission d&amp;#039;accès aux documents administratifs&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;kind&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;str&amp;lt;/code&amp;gt; || One of the 6 structural kinds: &amp;lt;code&amp;gt;legislation&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;decision&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;record&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;notice&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;section&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;chunk&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;&amp;quot;decision&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;publisher&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;str&amp;lt;/code&amp;gt; || Organization that publishes the data || &amp;lt;code&amp;gt;&amp;quot;CADA&amp;quot;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;quot;DILA&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;publisher_url&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;str&amp;lt;/code&amp;gt; || URL where the data can be found || &amp;lt;code&amp;gt;&amp;quot;https://www.data.gouv.fr/fr/datasets/...&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;license&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;str&amp;lt;/code&amp;gt; || License name || &amp;lt;code&amp;gt;&amp;quot;Licence Ouverte 2.0&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;license_url&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;str&amp;lt;/code&amp;gt; || URL of the license || &amp;lt;code&amp;gt;&amp;quot;https://www.etalab.gouv.fr/licence-ouverte-open-licence/&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;language&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;str&amp;lt;/code&amp;gt; || ISO 639-1 language code || &amp;lt;code&amp;gt;&amp;quot;fr&amp;quot;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;quot;en&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;date_bounds&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;DateBounds&amp;lt;/code&amp;gt; || Valid date range for this source || see below&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== DateBounds ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;DateBounds&amp;lt;/code&amp;gt; validates that document dates are within a plausible range. Two factory methods are available:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;DateBounds.strict(min_year=NNNN)&amp;lt;/code&amp;gt; — for sources where documents cannot have future dates (decisions, records, notices). Max year defaults to current year + small margin.&lt;br /&gt;
* &amp;lt;code&amp;gt;DateBounds.permissive(min_year=NNNN, max_year=NNNN)&amp;lt;/code&amp;gt; — for legislation with legitimate forward entry-into-force or expiration dates.&lt;br /&gt;
&lt;br /&gt;
=== Example: simple source registration ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from duralex.ingest.date_validation import DateBounds&lt;br /&gt;
from duralex.ingest.source_registry import register_source&lt;br /&gt;
&lt;br /&gt;
register_source(&lt;br /&gt;
    &amp;quot;cada&amp;quot;,&lt;br /&gt;
    jurisdiction=&amp;quot;fr&amp;quot;,&lt;br /&gt;
    name=&amp;quot;CADA&amp;quot;,&lt;br /&gt;
    description=&amp;quot;Avis et conseils de la Commission d&amp;#039;accès aux documents administratifs&amp;quot;,&lt;br /&gt;
    kind=&amp;quot;decision&amp;quot;,&lt;br /&gt;
    publisher=&amp;quot;CADA&amp;quot;,&lt;br /&gt;
    publisher_url=&amp;quot;https://www.data.gouv.fr/fr/datasets/53698f37a3a729239d2036a0/&amp;quot;,&lt;br /&gt;
    license=&amp;quot;Licence Ouverte 2.0&amp;quot;,&lt;br /&gt;
    license_url=&amp;quot;https://www.etalab.gouv.fr/licence-ouverte-open-licence/&amp;quot;,&lt;br /&gt;
    language=&amp;quot;fr&amp;quot;,&lt;br /&gt;
    date_bounds=DateBounds.strict(min_year=1900),&lt;br /&gt;
)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Sub-sources ===&lt;br /&gt;
&lt;br /&gt;
If your source has logical sub-feeds (e.g., different court levels within a single API), register them as sub-sources. Sub-sources inherit all metadata from their parent:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from duralex.ingest.source_registry import register_sub_source&lt;br /&gt;
&lt;br /&gt;
# Parent must be registered first&lt;br /&gt;
for sub_key in (&amp;quot;judilibre_cc&amp;quot;, &amp;quot;judilibre_ca&amp;quot;, &amp;quot;judilibre_tj&amp;quot;, &amp;quot;judilibre_tcom&amp;quot;):&lt;br /&gt;
    register_sub_source(sub_key, &amp;quot;judilibre&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Step 2: Implement a downloader ==&lt;br /&gt;
&lt;br /&gt;
=== BaseDownloader (for DILA-style tar.gz archives) ===&lt;br /&gt;
&lt;br /&gt;
If your source publishes data as &amp;lt;code&amp;gt;.tar.gz&amp;lt;/code&amp;gt; archives on an HTTP index page (like DILA sources), subclass &amp;lt;code&amp;gt;BaseDownloader&amp;lt;/code&amp;gt; from &amp;lt;code&amp;gt;duralex.ingest.sources.base_downloader&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;BaseDownloader&amp;lt;/code&amp;gt; provides:&lt;br /&gt;
* HTTP retry with exponential backoff and 429/Retry-After support&lt;br /&gt;
* Listing remote files from an HTML index page&lt;br /&gt;
* Downloading with partial-download safety (&amp;lt;code&amp;gt;.tmp&amp;lt;/code&amp;gt; files + atomic rename)&lt;br /&gt;
* Extracting &amp;lt;code&amp;gt;.tar.gz&amp;lt;/code&amp;gt; archives with prefix stripping&lt;br /&gt;
* State tracking (last downloaded diff filename) for incremental updates&lt;br /&gt;
* Freemium base file + incremental diff pattern&lt;br /&gt;
&lt;br /&gt;
Constructor parameters:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Parameter !! Description&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;dataset_name&amp;lt;/code&amp;gt; || Identifier for this dataset (e.g. &amp;lt;code&amp;gt;&amp;quot;cass&amp;quot;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;quot;legi&amp;quot;&amp;lt;/code&amp;gt;)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;data_directory&amp;lt;/code&amp;gt; || Root directory for extracted data and archives&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;base_url&amp;lt;/code&amp;gt; || URL of the HTTP index listing &amp;lt;code&amp;gt;.tar.gz&amp;lt;/code&amp;gt; files&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;get_state&amp;lt;/code&amp;gt; || Callback returning the last processed filename, or &amp;lt;code&amp;gt;None&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;set_state&amp;lt;/code&amp;gt; || Callback to persist the last processed filename&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;archive_prefix_markers&amp;lt;/code&amp;gt; || Directory names marking the start of useful content in tar archives (e.g. &amp;lt;code&amp;gt;[&amp;quot;JURI&amp;quot;, &amp;quot;CETA&amp;quot;]&amp;lt;/code&amp;gt;)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;run()&amp;lt;/code&amp;gt; method is the main entry point. It downloads the freemium base (on first run) and/or incremental diffs, extracts them, and returns a list of extracted XML file paths. State is NOT written by &amp;lt;code&amp;gt;run()&amp;lt;/code&amp;gt; -- call &amp;lt;code&amp;gt;commit_state()&amp;lt;/code&amp;gt; after successful ingest.&lt;br /&gt;
&lt;br /&gt;
=== Inline downloader (for non-archive sources) ===&lt;br /&gt;
&lt;br /&gt;
For sources that do not follow the tar.gz archive pattern (e.g., CSV files, API endpoints), write a standalone downloader class that handles its own parsing and DB insertion. This is called an &amp;quot;inline source&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
The CADA downloader is a good example of an inline source. Key patterns:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
class CadaDownloader:&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Downloads CADA CSV from data.gouv.fr and ingests into corpus.documents.&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    def __init__(self, dsn: str, data_directory: Path) -&amp;gt; None:&lt;br /&gt;
        self.dsn = dsn&lt;br /&gt;
        self._cache_directory = data_directory / &amp;quot;cada&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    def run(self, errors: IngestErrors | None = None) -&amp;gt; list[str]:&lt;br /&gt;
        &amp;quot;&amp;quot;&amp;quot;Download, parse, and insert. Returns [].&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
        # 1. Check upstream for changes (compare last_modified)&lt;br /&gt;
        # 2. Download or use cached file&lt;br /&gt;
        # 3. Parse rows into corpus.documents records&lt;br /&gt;
        # 4. Insert in batches using insert_batch()&lt;br /&gt;
        # 5. Clean up orphaned records&lt;br /&gt;
        # 6. Update ingest state&lt;br /&gt;
        ...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Key conventions for inline downloaders:&lt;br /&gt;
&lt;br /&gt;
* Accept &amp;lt;code&amp;gt;dsn&amp;lt;/code&amp;gt; (PostgreSQL connection string) and &amp;lt;code&amp;gt;data_directory&amp;lt;/code&amp;gt; (root for cached files) in the constructor&lt;br /&gt;
* Accept an optional &amp;lt;code&amp;gt;errors: IngestErrors | None&amp;lt;/code&amp;gt; parameter in &amp;lt;code&amp;gt;run()&amp;lt;/code&amp;gt; for error tracking&lt;br /&gt;
* Cache downloaded files to disk with a &amp;lt;code&amp;gt;.tmp&amp;lt;/code&amp;gt; extension during download and atomic rename on completion&lt;br /&gt;
* Store a sidecar metadata file (e.g., &amp;lt;code&amp;gt;.meta&amp;lt;/code&amp;gt;) for change detection&lt;br /&gt;
* Use &amp;lt;code&amp;gt;get_ingest_state()&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;set_ingest_state()&amp;lt;/code&amp;gt; from &amp;lt;code&amp;gt;duralex.ingest.state&amp;lt;/code&amp;gt; to track whether the upstream data has changed&lt;br /&gt;
* Use &amp;lt;code&amp;gt;insert_batch()&amp;lt;/code&amp;gt; from &amp;lt;code&amp;gt;duralex.ingest.database.batch_writer&amp;lt;/code&amp;gt; for bulk insertion&lt;br /&gt;
* Return an empty list (inline sources handle their own insertion)&lt;br /&gt;
&lt;br /&gt;
=== Document record format ===&lt;br /&gt;
&lt;br /&gt;
Each record inserted into &amp;lt;code&amp;gt;corpus.documents&amp;lt;/code&amp;gt; must have:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Field !! Description&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; || Globally unique document ID, prefixed with jurisdiction (e.g. &amp;lt;code&amp;gt;&amp;quot;fr.cada_20240001&amp;quot;&amp;lt;/code&amp;gt;)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;kind&amp;lt;/code&amp;gt; || One of: &amp;lt;code&amp;gt;legislation&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;decision&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;record&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;notice&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;section&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;chunk&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;jurisdiction&amp;lt;/code&amp;gt; || Jurisdiction code (e.g. &amp;lt;code&amp;gt;&amp;quot;fr&amp;quot;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;quot;eu&amp;quot;&amp;lt;/code&amp;gt;)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;language&amp;lt;/code&amp;gt; || ISO 639-1 language code&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;source&amp;lt;/code&amp;gt; || Source key matching the registered source&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;date&amp;lt;/code&amp;gt; || Primary date (ISO 8601 format &amp;lt;code&amp;gt;YYYY-MM-DD&amp;lt;/code&amp;gt;), or &amp;lt;code&amp;gt;None&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;date_end&amp;lt;/code&amp;gt; || End date for documents with a date range, or &amp;lt;code&amp;gt;None&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;parent_id&amp;lt;/code&amp;gt; || Parent document ID for hierarchical sources, or &amp;lt;code&amp;gt;None&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;title&amp;lt;/code&amp;gt; || Human-readable title&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;body&amp;lt;/code&amp;gt; || Clean displayable content (HTML or formatted text). Immutable after ingestion.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;body_search&amp;lt;/code&amp;gt; || Indexable text for FTS (can be noisy: PDF OCR, etc.), or &amp;lt;code&amp;gt;None&amp;lt;/code&amp;gt; to use &amp;lt;code&amp;gt;body&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;tags&amp;lt;/code&amp;gt; || JSON string of metadata tags (see below)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Step 3: Follow tag conventions ==&lt;br /&gt;
&lt;br /&gt;
Tags are the primary metadata mechanism. Every document gets a &amp;lt;code&amp;gt;tags&amp;lt;/code&amp;gt; JSON object. Refer to [[Corpus/Tag conventions]] for the full shared vocabulary.&lt;br /&gt;
&lt;br /&gt;
=== Mandatory tags ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;type&amp;lt;/code&amp;gt; — legal document type (e.g. &amp;lt;code&amp;gt;&amp;quot;law&amp;quot;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;quot;decree&amp;quot;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;quot;judgment&amp;quot;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;quot;administrative_decision&amp;quot;&amp;lt;/code&amp;gt;). See the tag conventions for the full list.&lt;br /&gt;
* &amp;lt;code&amp;gt;content_quality&amp;lt;/code&amp;gt; — quality of the body content (e.g. &amp;lt;code&amp;gt;&amp;quot;native_structured&amp;quot;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;quot;ocr_raw&amp;quot;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;quot;metadata_only&amp;quot;&amp;lt;/code&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
=== Common optional tags ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;nature&amp;lt;/code&amp;gt; — source-specific document nature&lt;br /&gt;
* &amp;lt;code&amp;gt;court&amp;lt;/code&amp;gt; — court identifier (for decisions)&lt;br /&gt;
* &amp;lt;code&amp;gt;authority&amp;lt;/code&amp;gt; — issuing authority&lt;br /&gt;
* &amp;lt;code&amp;gt;case_number&amp;lt;/code&amp;gt; — case/dossier numbers (as a list)&lt;br /&gt;
* &amp;lt;code&amp;gt;solution&amp;lt;/code&amp;gt; — outcome/disposition&lt;br /&gt;
* &amp;lt;code&amp;gt;summary&amp;lt;/code&amp;gt; — headnote or summary&lt;br /&gt;
* &amp;lt;code&amp;gt;headnote_classification&amp;lt;/code&amp;gt; — subject classification&lt;br /&gt;
* &amp;lt;code&amp;gt;_importance_level_default&amp;lt;/code&amp;gt; — default importance for ranking&lt;br /&gt;
&lt;br /&gt;
=== Tag construction pattern ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import json&lt;br /&gt;
&lt;br /&gt;
def _tags(**kwargs: object) -&amp;gt; str:&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Build a tags JSON string, stripping None values.&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    return json.dumps(&lt;br /&gt;
        {k: v for k, v in kwargs.items() if v is not None},&lt;br /&gt;
        ensure_ascii=False,&lt;br /&gt;
    )&lt;br /&gt;
&lt;br /&gt;
# Usage&lt;br /&gt;
tags = _tags(&lt;br /&gt;
    type=&amp;quot;administrative_decision&amp;quot;,&lt;br /&gt;
    content_quality=&amp;quot;native_structured&amp;quot;,&lt;br /&gt;
    court=&amp;quot;cada&amp;quot;,&lt;br /&gt;
    case_number=[number],&lt;br /&gt;
    solution=outcome or None,&lt;br /&gt;
)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Step 4: Follow edge conventions ==&lt;br /&gt;
&lt;br /&gt;
If your source contains cross-references to other documents (citations, amendments, transpositions, etc.), create edges in the &amp;lt;code&amp;gt;corpus.edges&amp;lt;/code&amp;gt; table. Refer to [[Corpus/Edge types]] for the full taxonomy of ~75 edge types.&lt;br /&gt;
&lt;br /&gt;
Common edge types for new sources:&lt;br /&gt;
* &amp;lt;code&amp;gt;cites&amp;lt;/code&amp;gt; — document A cites document B&lt;br /&gt;
* &amp;lt;code&amp;gt;amends&amp;lt;/code&amp;gt; — document A amends document B&lt;br /&gt;
* &amp;lt;code&amp;gt;repeals&amp;lt;/code&amp;gt; — document A repeals document B&lt;br /&gt;
* &amp;lt;code&amp;gt;implements&amp;lt;/code&amp;gt; — national law implements an EU directive&lt;br /&gt;
* &amp;lt;code&amp;gt;transposes&amp;lt;/code&amp;gt; — national law transposes an EU directive&lt;br /&gt;
* &amp;lt;code&amp;gt;consolidates&amp;lt;/code&amp;gt; — consolidated version of a text&lt;br /&gt;
&lt;br /&gt;
== Step 5: Document the source ==&lt;br /&gt;
&lt;br /&gt;
Create a wiki page at &amp;lt;code&amp;gt;Sources/{jurisdiction}/{source_name}&amp;lt;/code&amp;gt; documenting:&lt;br /&gt;
&lt;br /&gt;
* What the source contains&lt;br /&gt;
* Publisher and license&lt;br /&gt;
* Data format (XML, CSV, JSON, API)&lt;br /&gt;
* Update frequency&lt;br /&gt;
* Known quirks or data quality issues&lt;br /&gt;
* Volume (approximate number of documents)&lt;br /&gt;
* Coverage dates&lt;br /&gt;
&lt;br /&gt;
== Complete example: CADA source ==&lt;br /&gt;
&lt;br /&gt;
The CADA (Commission d&amp;#039;acces aux documents administratifs) source is a good reference implementation for a simple inline source.&lt;br /&gt;
&lt;br /&gt;
=== Registration ===&lt;br /&gt;
&lt;br /&gt;
In &amp;lt;code&amp;gt;duralex-ingest/duralex-ingest-fr/src/duralex/ingest/fr/source_registry.py&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
register_source(&lt;br /&gt;
    &amp;quot;cada&amp;quot;,&lt;br /&gt;
    jurisdiction=&amp;quot;fr&amp;quot;,&lt;br /&gt;
    name=&amp;quot;CADA&amp;quot;,&lt;br /&gt;
    description=&amp;quot;Avis et conseils de la Commission d&amp;#039;accès aux documents administratifs&amp;quot;,&lt;br /&gt;
    kind=&amp;quot;decision&amp;quot;,&lt;br /&gt;
    publisher=&amp;quot;CADA&amp;quot;,&lt;br /&gt;
    publisher_url=&amp;quot;https://www.data.gouv.fr/fr/datasets/53698f37a3a729239d2036a0/&amp;quot;,&lt;br /&gt;
    license=&amp;quot;Licence Ouverte 2.0&amp;quot;,&lt;br /&gt;
    license_url=&amp;quot;https://www.etalab.gouv.fr/licence-ouverte-open-licence/&amp;quot;,&lt;br /&gt;
    language=&amp;quot;fr&amp;quot;,&lt;br /&gt;
    date_bounds=DateBounds.strict(min_year=1900),&lt;br /&gt;
)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Downloader ===&lt;br /&gt;
&lt;br /&gt;
In &amp;lt;code&amp;gt;duralex-ingest/duralex-ingest-fr/src/duralex/ingest/fr/sources/cada.py&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
* Downloads a consolidated CSV (~184 MB, ~60k records, 1984-present) from data.gouv.fr&lt;br /&gt;
* Caches the CSV to disk with change detection via &amp;lt;code&amp;gt;last_modified&amp;lt;/code&amp;gt; timestamp&lt;br /&gt;
* Parses each CSV row into a &amp;lt;code&amp;gt;corpus.documents&amp;lt;/code&amp;gt; record with structured tags&lt;br /&gt;
* Inserts in batches of 5000 using &amp;lt;code&amp;gt;insert_batch()&amp;lt;/code&amp;gt;&lt;br /&gt;
* Cleans up orphaned records (with a safety threshold of 30,000 to avoid accidental mass deletion)&lt;br /&gt;
* Tracks ingest state so unchanged upstream data is skipped&lt;br /&gt;
&lt;br /&gt;
=== Record construction ===&lt;br /&gt;
&lt;br /&gt;
Each CADA record maps to:&lt;br /&gt;
* &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt;: &amp;lt;code&amp;gt;&amp;quot;fr.cada_{number}&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;kind&amp;lt;/code&amp;gt;: &amp;lt;code&amp;gt;&amp;quot;decision&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;source&amp;lt;/code&amp;gt;: &amp;lt;code&amp;gt;&amp;quot;cada&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;title&amp;lt;/code&amp;gt;: &amp;lt;code&amp;gt;&amp;quot;CADA {year} n°{number} — {subject}&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;tags&amp;lt;/code&amp;gt;: includes &amp;lt;code&amp;gt;type&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;content_quality&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;nature&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;court&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;authority&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;theme&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;case_number&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;solution&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;summary&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;headnote_classification&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Existing French sources ==&lt;br /&gt;
&lt;br /&gt;
For reference, the following sources are currently registered for France:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Source key !! Name !! Kind !! Publisher&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;cass&amp;lt;/code&amp;gt; || Cour de cassation || decision || DILA&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;inca&amp;lt;/code&amp;gt; || INCA || decision || DILA&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;capp&amp;lt;/code&amp;gt; || Cours d&amp;#039;appel || decision || DILA&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;jade&amp;lt;/code&amp;gt; || JADE || decision || DILA&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;constit&amp;lt;/code&amp;gt; || Conseil constitutionnel || decision || DILA&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;cnil&amp;lt;/code&amp;gt; || CNIL || decision || DILA&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;legi&amp;lt;/code&amp;gt; || LEGI || legislation || DILA&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;kali&amp;lt;/code&amp;gt; || KALI || legislation || DILA&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;acco&amp;lt;/code&amp;gt; || ACCO || legislation || DILA&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;jorf&amp;lt;/code&amp;gt; || JORF || legislation || DILA&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ce_opendata&amp;lt;/code&amp;gt; || Justice administrative (open data) || decision || Conseil d&amp;#039;État&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;cada&amp;lt;/code&amp;gt; || CADA || decision || CADA&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;bofip&amp;lt;/code&amp;gt; || BOFiP || legislation || DGFiP&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;judilibre&amp;lt;/code&amp;gt; || Judilibre || decision || Cour de cassation&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;jufi&amp;lt;/code&amp;gt; || Juridictions financières || decision || DILA&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rne&amp;lt;/code&amp;gt; || Registre national des entreprises || record || INPI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;bodacc&amp;lt;/code&amp;gt; || BODACC || notice || DILA&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Category:Development]]&lt;/div&gt;</description>
			<pubDate>Thu, 23 Apr 2026 02:07:32 GMT</pubDate>
			<dc:creator>Nicolas</dc:creator>
			<comments>https://wiki.dura-lex.org/index.php/Talk:Development/Adding_a_source</comments>
		</item>
		<item>
			<title>MCP/Guidelines</title>
			<link>https://wiki.dura-lex.org/index.php?title=MCP/Guidelines&amp;diff=45&amp;oldid=0</link>
			<guid isPermaLink="false">https://wiki.dura-lex.org/index.php?title=MCP/Guidelines&amp;diff=45&amp;oldid=0</guid>
			<description>&lt;p&gt;Create MCP/Guidelines index page explaining the guidelines system (via create-page on MediaWiki MCP Server)&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;= Guidelines =&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;safety_guidelines&amp;lt;/code&amp;gt; tool returns mandatory guidelines for legal research. The guidelines system uses a two-call workflow:&lt;br /&gt;
&lt;br /&gt;
# &amp;#039;&amp;#039;&amp;#039;Core guidelines&amp;#039;&amp;#039;&amp;#039; — called ONCE at the start of any session via &amp;lt;code&amp;gt;safety_guidelines(category=&amp;quot;core&amp;quot;)&amp;lt;/code&amp;gt;. Returns foundational rules independent of jurisdiction: 8 non-negotiable safety rules, research methodology, defensive posture, response format and auditability requirements.&lt;br /&gt;
# &amp;#039;&amp;#039;&amp;#039;Jurisdiction guidelines&amp;#039;&amp;#039;&amp;#039; — called BEFORE researching any new jurisdiction via &amp;lt;code&amp;gt;safety_guidelines(category=&amp;quot;jurisdiction&amp;quot;, jurisdiction=&amp;quot;&amp;lt;code&amp;gt;&amp;quot;)&amp;lt;/code&amp;gt;. Returns jurisdiction-specific rules and corpus provenance. When switching jurisdiction mid-session, call again with the new code.&lt;br /&gt;
&lt;br /&gt;
== Architecture ==&lt;br /&gt;
&lt;br /&gt;
The guidelines are loaded at server startup and cached for the lifetime of the MCP server process. Restarting the container is required after editing guideline files.&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Core text&amp;#039;&amp;#039;&amp;#039; lives in &amp;lt;code&amp;gt;duralex-mcp/src/duralex/mcp/core.md&amp;lt;/code&amp;gt; and is loaded by the MCP server directly (not by plugins).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Jurisdiction texts&amp;#039;&amp;#039;&amp;#039; are provided by each jurisdiction plugin via the &amp;lt;code&amp;gt;get_guidelines() -&amp;gt; str&amp;lt;/code&amp;gt; protocol. Each plugin returns a single jurisdiction-scoped supplement.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Corpus provenance&amp;#039;&amp;#039;&amp;#039; is dynamically appended to jurisdiction guidelines, listing available data sources with document counts, coverage start years, and latest document dates.&lt;br /&gt;
&lt;br /&gt;
Single-jurisdiction variants (e.g., &amp;lt;code&amp;gt;&amp;quot;fr&amp;quot;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;quot;eu&amp;quot;&amp;lt;/code&amp;gt;) are precomputed at registration time. Multi-jurisdiction variants (e.g., &amp;lt;code&amp;gt;&amp;quot;eu|fr&amp;quot;&amp;lt;/code&amp;gt;) are built on demand by concatenating the relevant single-jurisdiction variants.&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;jurisdiction&amp;lt;/code&amp;gt; parameter supports Overpass QL operators: &amp;lt;code&amp;gt;&amp;quot;fr&amp;quot;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;quot;eu&amp;quot;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;quot;eu|fr&amp;quot;&amp;lt;/code&amp;gt; (combined), &amp;lt;code&amp;gt;&amp;quot;*&amp;quot;&amp;lt;/code&amp;gt; (all jurisdictions), &amp;lt;code&amp;gt;&amp;quot;!=eu&amp;quot;&amp;lt;/code&amp;gt; (exclusion). The &amp;lt;code&amp;gt;&amp;quot;!*&amp;quot;&amp;lt;/code&amp;gt; operator is not allowed.&lt;br /&gt;
&lt;br /&gt;
== Categories ==&lt;br /&gt;
&lt;br /&gt;
=== Core ===&lt;br /&gt;
&lt;br /&gt;
Foundational rules applicable to all jurisdictions. Contains:&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Identity and tone&amp;#039;&amp;#039;&amp;#039; — research partner posture, no legal advice, no predictions, adaptive fact-gathering&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;8 non-negotiable safety rules&amp;#039;&amp;#039;&amp;#039; — fetch before cite, explicit refusal, quote-first, citation self-check, no jurisdiction mixing, temporal check, absence vs inexistence, quality_check mandatory&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Context window management&amp;#039;&amp;#039;&amp;#039; — compaction detection and warning protocol&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Research methodology&amp;#039;&amp;#039;&amp;#039; — 13-step checklist, search syntax, tool routing, fallback strategies&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Defensive posture and analysis&amp;#039;&amp;#039;&amp;#039; — adversarial self-review, structured reasoning, authority weighting, hallucination pattern detection&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Response format and auditability&amp;#039;&amp;#039;&amp;#039; — citation format, permanent links, danger detection, language rules&lt;br /&gt;
&lt;br /&gt;
Full text: &amp;#039;&amp;#039;&amp;#039;[[MCP/Guidelines/Core|Core guidelines]]&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
=== Jurisdiction: FR (French law) ===&lt;br /&gt;
&lt;br /&gt;
French law-specific rules. Contains:&lt;br /&gt;
&lt;br /&gt;
* Tool routing by legal domain (employment, civil, criminal, tax, data protection, administrative, company information)&lt;br /&gt;
* French legal synonyms for FTS&lt;br /&gt;
* Normative hierarchy and codification prefixes&lt;br /&gt;
* Major reforms and renumbering traps (obligations 2016, security interests 2022, criminal procedure 2024)&lt;br /&gt;
* Court system: judicial, administrative, financial orders with court_level mappings&lt;br /&gt;
* Publication grades (official_grade) for all court families&lt;br /&gt;
* Formations and solemnity ordering&lt;br /&gt;
* Decision reading and analysis (Cass, CE, CC, CA/TJ)&lt;br /&gt;
* Case number formats&lt;br /&gt;
* Labor law (three-tier hierarchy, IDCC, bargaining_level)&lt;br /&gt;
* Legislation (territorial scope, text types, nature tag, JORF, code abbreviations, enforcement status)&lt;br /&gt;
* Doctrine (BOFiP, CNIL, CADA)&lt;br /&gt;
* Deadline computation&lt;br /&gt;
* Common traps (40+ pitfalls)&lt;br /&gt;
* Practical reflexes (prescription periods, pre-litigation steps)&lt;br /&gt;
* Data limitations and source coverage&lt;br /&gt;
* Emergency resources&lt;br /&gt;
&lt;br /&gt;
Full text: &amp;#039;&amp;#039;&amp;#039;[[MCP/Guidelines/FR|FR guidelines]]&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
=== Jurisdiction: EU (European law) ===&lt;br /&gt;
&lt;br /&gt;
European law-specific rules. Contains:&lt;br /&gt;
&lt;br /&gt;
* Tool routing (regulations, directives, CJEU, ECHR, CELEX lookup, transposition)&lt;br /&gt;
* EU legal terminology and multilingual search&lt;br /&gt;
* Courts: CJEU (Court of Justice + General Court), ECHR&lt;br /&gt;
* Publication grades and importance grades&lt;br /&gt;
* Legislation hierarchy (treaties &amp;gt; regulations &amp;gt; directives &amp;gt; decisions)&lt;br /&gt;
* Charter of Fundamental Rights&lt;br /&gt;
* Direct effect and primacy&lt;br /&gt;
* ECHR margin of appreciation&lt;br /&gt;
* Transposition lookup workflow&lt;br /&gt;
* CJEU preliminary rulings&lt;br /&gt;
* Advocate General opinions&lt;br /&gt;
* Decision analysis (preliminary rulings, direct actions, ECHR)&lt;br /&gt;
* Practical reflexes&lt;br /&gt;
* Emergency resources&lt;br /&gt;
&lt;br /&gt;
Full text: &amp;#039;&amp;#039;&amp;#039;[[MCP/Guidelines/EU|EU guidelines]]&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
[[Category:MCP]]&lt;/div&gt;</description>
			<pubDate>Thu, 23 Apr 2026 02:07:01 GMT</pubDate>
			<dc:creator>Nicolas</dc:creator>
			<comments>https://wiki.dura-lex.org/index.php/Talk:MCP/Guidelines</comments>
		</item>
		<item>
			<title>MCP/Reference resolution</title>
			<link>https://wiki.dura-lex.org/index.php?title=MCP/Reference_resolution&amp;diff=44&amp;oldid=0</link>
			<guid isPermaLink="false">https://wiki.dura-lex.org/index.php?title=MCP/Reference_resolution&amp;diff=44&amp;oldid=0</guid>
			<description>&lt;p&gt;Create MCP/Reference resolution page from REFERENCE-RESOLUTION.md (via create-page on MediaWiki MCP Server)&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;= Reference Resolution =&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
&lt;br /&gt;
Reference resolution transforms a natural language legal reference (or a document ID) into a query against the corpus. It is the bridge between how humans cite law and how the database stores it.&lt;br /&gt;
&lt;br /&gt;
The resolver is used by:&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;MCP &amp;lt;code&amp;gt;get&amp;lt;/code&amp;gt; tool&amp;#039;&amp;#039;&amp;#039;: user asks for &amp;quot;article 1240 du code civil&amp;quot; → find the document&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Knowledge graph compiler&amp;#039;&amp;#039;&amp;#039; (future): annotations reference articles by citation → resolve to corpus document IDs&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Edge resolution&amp;#039;&amp;#039;&amp;#039;: when &amp;lt;code&amp;gt;corpus.edges.target_id&amp;lt;/code&amp;gt; is NULL, a background job resolves &amp;lt;code&amp;gt;reference&amp;lt;/code&amp;gt; strings to document IDs&lt;br /&gt;
&lt;br /&gt;
== TagQuery ==&lt;br /&gt;
&lt;br /&gt;
The universal output of any reference parser. Jurisdiction-agnostic.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
@dataclass(frozen=True)&lt;br /&gt;
class TagQuery:&lt;br /&gt;
    language: str  # required, kw_only&lt;br /&gt;
    kind: str | None = None&lt;br /&gt;
    tag_filters: TagFilterSet = field(default_factory=TagFilterSet)&lt;br /&gt;
    should_sort_in_force_first: bool = False&lt;br /&gt;
    at_date: date | None = None&lt;br /&gt;
    hint: str | None = None&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Fields:&lt;br /&gt;
* &amp;lt;code&amp;gt;language&amp;lt;/code&amp;gt;: ISO 639-1 code, required (disambiguates language variants)&lt;br /&gt;
* &amp;lt;code&amp;gt;kind&amp;lt;/code&amp;gt;: filter on document kind (legislation, decision, record...)&lt;br /&gt;
* &amp;lt;code&amp;gt;tag_filters&amp;lt;/code&amp;gt;: TagFilterSet with all tag predicates (EQ, IN, NOT_IN, ILIKE, EXISTS, NOT_EXISTS, NORMALIZE)&lt;br /&gt;
* &amp;lt;code&amp;gt;should_sort_in_force_first&amp;lt;/code&amp;gt;: order results with &amp;lt;code&amp;gt;tags.in_force=true&amp;lt;/code&amp;gt; first, then by date descending&lt;br /&gt;
* &amp;lt;code&amp;gt;at_date&amp;lt;/code&amp;gt;: temporal version selection — &amp;lt;code&amp;gt;date &amp;lt;= at_date AND (date_end IS NULL OR date_end &amp;gt; at_date)&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;hint&amp;lt;/code&amp;gt;: optional human-readable interpretation label. TagQueries &amp;#039;&amp;#039;&amp;#039;with&amp;#039;&amp;#039;&amp;#039; &amp;lt;code&amp;gt;hint&amp;lt;/code&amp;gt; are &amp;#039;&amp;#039;candidates&amp;#039;&amp;#039; (collected from all plugins, disambiguated at MCP level); those &amp;#039;&amp;#039;&amp;#039;without&amp;#039;&amp;#039;&amp;#039; are &amp;#039;&amp;#039;confident matches&amp;#039;&amp;#039; (first hit wins)&lt;br /&gt;
&lt;br /&gt;
== TagFilterSet ==&lt;br /&gt;
&lt;br /&gt;
Unified immutable filter model. A tuple of &amp;lt;code&amp;gt;TagFilter&amp;lt;/code&amp;gt; predicates, AND-combined.&lt;br /&gt;
Replaces the previous scattered dict params (&amp;lt;code&amp;gt;tags&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;tags_ilike&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;normalize&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
class TagFilterOp(enum.Enum):&lt;br /&gt;
    EQ          # tags @&amp;gt; &amp;#039;{&amp;quot;k&amp;quot;: &amp;quot;v&amp;quot;}&amp;#039; (JSONB containment)&lt;br /&gt;
    IN          # tags-&amp;gt;&amp;gt;&amp;#039;k&amp;#039; = ANY(...)&lt;br /&gt;
    NOT_IN      # tags ? &amp;#039;k&amp;#039; AND NOT (tags-&amp;gt;&amp;gt;&amp;#039;k&amp;#039; = ANY(...))&lt;br /&gt;
    ILIKE       # unaccent(tags-&amp;gt;&amp;gt;&amp;#039;k&amp;#039;) ILIKE unaccent(pattern)&lt;br /&gt;
    EXISTS      # tags ? &amp;#039;k&amp;#039;&lt;br /&gt;
    NOT_EXISTS  # NOT (tags ? &amp;#039;k&amp;#039;)&lt;br /&gt;
    NORMALIZE   # regexp_replace comparison (reference resolution only)&lt;br /&gt;
&lt;br /&gt;
@dataclass(frozen=True)&lt;br /&gt;
class TagFilter:&lt;br /&gt;
    key: str                              # tag key or virtual key (source/jurisdiction/language)&lt;br /&gt;
    op: TagFilterOp&lt;br /&gt;
    value: str | list[str] | None = None&lt;br /&gt;
    normalize_pattern: str | None = None  # only for NORMALIZE&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Convenience constructor: &amp;lt;code&amp;gt;TagFilterSet.from_tags({&amp;quot;k&amp;quot;: &amp;quot;v&amp;quot;})&amp;lt;/code&amp;gt; builds EQ filters from a dict.&lt;br /&gt;
&lt;br /&gt;
== Resolution pipeline ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
input string&lt;br /&gt;
    |&lt;br /&gt;
    v&lt;br /&gt;
1. Direct ID lookup (try as corpus.documents.id — covers all kinds in one query)&lt;br /&gt;
    |  found? → return (with CID-based version redirection if at_date is set)&lt;br /&gt;
    v&lt;br /&gt;
2. Jurisdiction parser (FR, EU, GB...) → TagQuery&lt;br /&gt;
    |  parsed? → execute against store&lt;br /&gt;
    |  Note: SIREN 9-digit lookup is a detector in the FR plugin (with Luhn validation)&lt;br /&gt;
    v&lt;br /&gt;
3. Disambiguation (bare article number matches multiple codes → error with suggestions)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== TagQuery examples ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# &amp;quot;article 1240 du code civil&amp;quot;&lt;br /&gt;
TagQuery(language=&amp;quot;fr&amp;quot;, kind=&amp;quot;legislation&amp;quot;,&lt;br /&gt;
    tag_filters=TagFilterSet.from_tags({&amp;quot;article_number&amp;quot;: &amp;quot;1240&amp;quot;, &amp;quot;code&amp;quot;: &amp;quot;Code civil&amp;quot;}),&lt;br /&gt;
    should_sort_in_force_first=True)&lt;br /&gt;
&lt;br /&gt;
# &amp;quot;article 1147 du code civil&amp;quot; (version in force in 2015)&lt;br /&gt;
TagQuery(language=&amp;quot;fr&amp;quot;, kind=&amp;quot;legislation&amp;quot;,&lt;br /&gt;
    tag_filters=TagFilterSet.from_tags({&amp;quot;article_number&amp;quot;: &amp;quot;1147&amp;quot;, &amp;quot;code&amp;quot;: &amp;quot;Code civil&amp;quot;}),&lt;br /&gt;
    at_date=date(2015, 6, 15))&lt;br /&gt;
&lt;br /&gt;
# &amp;quot;loi n 2021-1109&amp;quot;&lt;br /&gt;
TagQuery(language=&amp;quot;fr&amp;quot;, kind=&amp;quot;legislation&amp;quot;,&lt;br /&gt;
    tag_filters=TagFilterSet.from_tags({&amp;quot;nature&amp;quot;: &amp;quot;LOI&amp;quot;, &amp;quot;number&amp;quot;: &amp;quot;2021-1109&amp;quot;}))&lt;br /&gt;
&lt;br /&gt;
# &amp;quot;pourvoi 20-20.648&amp;quot; — case number with court filter and hint (candidate)&lt;br /&gt;
TagQuery(language=&amp;quot;fr&amp;quot;, kind=&amp;quot;decision&amp;quot;,&lt;br /&gt;
    tag_filters=TagFilterSet(filters=(&lt;br /&gt;
        TagFilter(key=&amp;quot;case_number&amp;quot;, op=TagFilterOp.NORMALIZE,&lt;br /&gt;
                  value=&amp;quot;20-20.648&amp;quot;, normalize_pattern=r&amp;quot;[\s.\-/]&amp;quot;),&lt;br /&gt;
        TagFilter(key=&amp;quot;court&amp;quot;, op=TagFilterOp.EQ, value=&amp;quot;cour_cassation&amp;quot;),&lt;br /&gt;
    )),&lt;br /&gt;
    hint=&amp;quot;pourvoi Cour de cassation&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
# &amp;quot;486329&amp;quot; — CE request number&lt;br /&gt;
TagQuery(language=&amp;quot;fr&amp;quot;, kind=&amp;quot;decision&amp;quot;,&lt;br /&gt;
    tag_filters=TagFilterSet(filters=(&lt;br /&gt;
        TagFilter(key=&amp;quot;case_number&amp;quot;, op=TagFilterOp.NORMALIZE,&lt;br /&gt;
                  value=&amp;quot;486329&amp;quot;, normalize_pattern=r&amp;quot;[\s.\-/]&amp;quot;),&lt;br /&gt;
        TagFilter(key=&amp;quot;court&amp;quot;, op=TagFilterOp.EQ, value=&amp;quot;conseil_etat&amp;quot;),&lt;br /&gt;
    )),&lt;br /&gt;
    hint=&amp;quot;requete Conseil d&amp;#039;Etat&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
# &amp;quot;21/00091&amp;quot; — CA/TJ RG number&lt;br /&gt;
TagQuery(language=&amp;quot;fr&amp;quot;, kind=&amp;quot;decision&amp;quot;,&lt;br /&gt;
    tag_filters=TagFilterSet(filters=(&lt;br /&gt;
        TagFilter(key=&amp;quot;case_number&amp;quot;, op=TagFilterOp.NORMALIZE,&lt;br /&gt;
                  value=&amp;quot;21/00091&amp;quot;, normalize_pattern=r&amp;quot;[\s.\-/]&amp;quot;),&lt;br /&gt;
        TagFilter(key=&amp;quot;court&amp;quot;, op=TagFilterOp.IN, value=[&amp;quot;cour_appel&amp;quot;, &amp;quot;tribunal_judiciaire&amp;quot;]),&lt;br /&gt;
    )),&lt;br /&gt;
    hint=&amp;quot;RG cour d&amp;#039;appel ou tribunal judiciaire&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
# ECLI&lt;br /&gt;
TagQuery(language=&amp;quot;fr&amp;quot;, kind=&amp;quot;decision&amp;quot;,&lt;br /&gt;
    tag_filters=TagFilterSet.from_tags({&amp;quot;ecli&amp;quot;: &amp;quot;ECLI:FR:CCASS:2024:C100001&amp;quot;}))&lt;br /&gt;
&lt;br /&gt;
# &amp;quot;IDCC 3239&amp;quot;&lt;br /&gt;
TagQuery(language=&amp;quot;fr&amp;quot;, kind=&amp;quot;legislation&amp;quot;,&lt;br /&gt;
    tag_filters=TagFilterSet.from_tags({&amp;quot;idcc&amp;quot;: &amp;quot;3239&amp;quot;, &amp;quot;in_force&amp;quot;: &amp;quot;true&amp;quot;}))&lt;br /&gt;
&lt;br /&gt;
# UK: &amp;quot;section 1 of the Theft Act 1968&amp;quot; (ILIKE for fuzzy act title)&lt;br /&gt;
TagQuery(language=&amp;quot;en&amp;quot;, kind=&amp;quot;legislation&amp;quot;,&lt;br /&gt;
    tag_filters=TagFilterSet(filters=(&lt;br /&gt;
        TagFilter(key=&amp;quot;section_number&amp;quot;, op=TagFilterOp.EQ, value=&amp;quot;1&amp;quot;),&lt;br /&gt;
        TagFilter(key=&amp;quot;act_title&amp;quot;, op=TagFilterOp.ILIKE, value=&amp;quot;Theft Act 1968&amp;quot;),&lt;br /&gt;
    )))&lt;br /&gt;
&lt;br /&gt;
# DE: &amp;quot;§ 823 BGB&amp;quot;&lt;br /&gt;
TagQuery(language=&amp;quot;de&amp;quot;, kind=&amp;quot;legislation&amp;quot;,&lt;br /&gt;
    tag_filters=TagFilterSet.from_tags({&amp;quot;paragraph&amp;quot;: &amp;quot;823&amp;quot;, &amp;quot;code&amp;quot;: &amp;quot;BGB&amp;quot;}))&lt;br /&gt;
&lt;br /&gt;
# EU: &amp;quot;Article 101 TFEU&amp;quot;&lt;br /&gt;
TagQuery(language=&amp;quot;en&amp;quot;, kind=&amp;quot;legislation&amp;quot;,&lt;br /&gt;
    tag_filters=TagFilterSet.from_tags({&amp;quot;article_number&amp;quot;: &amp;quot;101&amp;quot;, &amp;quot;treaty&amp;quot;: &amp;quot;TFEU&amp;quot;}))&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Store execution ==&lt;br /&gt;
&lt;br /&gt;
The store translates TagQuery to SQL via the shared &amp;lt;code&amp;gt;build_tag_filter_conditions&amp;lt;/code&amp;gt;&lt;br /&gt;
helper. Zero jurisdiction knowledge. Each TagFilterOp maps to a specific SQL pattern:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT * FROM corpus.documents&lt;br /&gt;
WHERE language = %(language)s                                       -- always required&lt;br /&gt;
  AND kind = %(kind)s&lt;br /&gt;
  AND tags @&amp;gt; %(eq_batch)s                                          -- coalesced EQ filters (GIN)&lt;br /&gt;
  AND tags-&amp;gt;&amp;gt;&amp;#039;k&amp;#039; = ANY(%(in_values)s)                               -- IN filter&lt;br /&gt;
  AND unaccent(tags-&amp;gt;&amp;gt;&amp;#039;code&amp;#039;) ILIKE unaccent(%(code_pattern)s)      -- ILIKE filter&lt;br /&gt;
  AND regexp_replace(tags-&amp;gt;&amp;gt;&amp;#039;case_number&amp;#039;, %(p)s, &amp;#039;&amp;#039;, &amp;#039;g&amp;#039;)          -- NORMALIZE filter&lt;br /&gt;
      = regexp_replace(%(v)s, %(p)s, &amp;#039;&amp;#039;, &amp;#039;g&amp;#039;)&lt;br /&gt;
  AND date &amp;lt;= %(at_date)s                                           -- temporal (if at_date)&lt;br /&gt;
  AND (date_end IS NULL OR date_end &amp;gt; %(at_date)s)&lt;br /&gt;
ORDER BY&lt;br /&gt;
    (tags-&amp;gt;&amp;gt;&amp;#039;in_force&amp;#039;)::boolean DESC NULLS LAST,                   -- should_sort_in_force_first&lt;br /&gt;
    date DESC NULLS LAST&lt;br /&gt;
LIMIT 10;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Multi-candidate resolution ==&lt;br /&gt;
&lt;br /&gt;
When a reference is ambiguous (e.g., a French case number that could match&lt;br /&gt;
multiple courts), the resolver returns multiple TagQuery instances, each with&lt;br /&gt;
a &amp;lt;code&amp;gt;hint&amp;lt;/code&amp;gt; describing the interpretation. The MCP &amp;lt;code&amp;gt;get_document&amp;lt;/code&amp;gt; tool:&lt;br /&gt;
&lt;br /&gt;
# Collects all TagQueries from all jurisdiction plugins&lt;br /&gt;
# Separates &amp;#039;&amp;#039;&amp;#039;confident&amp;#039;&amp;#039;&amp;#039; (no hint) from &amp;#039;&amp;#039;&amp;#039;candidates&amp;#039;&amp;#039;&amp;#039; (with hint)&lt;br /&gt;
# Tries confident matches first — first hit wins (existing behavior)&lt;br /&gt;
# Tries all candidates against the store:&lt;br /&gt;
#* 1 match → returns the document with a warning noting the interpretation&lt;br /&gt;
#* 2+ matches → returns an error listing all candidates with IDs&lt;br /&gt;
#* 0 matches → falls through to &amp;quot;not found&amp;quot;&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;get_document&amp;lt;/code&amp;gt; tool also accepts an optional &amp;lt;code&amp;gt;tags&amp;lt;/code&amp;gt; parameter that merges&lt;br /&gt;
additional EQ filters into each TagQuery, narrowing the search (e.g.,&lt;br /&gt;
&amp;lt;code&amp;gt;tags={&amp;quot;court&amp;quot;: &amp;quot;conseil_etat&amp;quot;}&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
== Jurisdiction parsers ==&lt;br /&gt;
&lt;br /&gt;
Each jurisdiction plugin provides a parser that recognizes its citation formats:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Plugin !! Recognizes&lt;br /&gt;
|-&lt;br /&gt;
| duralex-fr || Articles of codes, loi/decret/ordonnance by number, NOR codes, IDCC, ECLI, case numbers, BOFiP IDs, named laws&lt;br /&gt;
|-&lt;br /&gt;
| duralex-eu || CELEX numbers, ECLI, treaty articles, directive/regulation numbers&lt;br /&gt;
|-&lt;br /&gt;
| Future duralex-gb || Neutral citations ([2024] UKSC 1), Act + section, SI numbers&lt;br /&gt;
|-&lt;br /&gt;
| Future duralex-de || § + BGB/StGB/etc, Aktenzeichen, ECLI&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Parsers are composable: the MCP server chains all installed jurisdiction parsers. First match wins.&lt;br /&gt;
&lt;br /&gt;
== Batch resolution (for knowledge graph) ==&lt;br /&gt;
&lt;br /&gt;
The compiler needs to resolve millions of references. The same TagQuery mechanism is used, but with batch-friendly optimizations:&lt;br /&gt;
* Pre-filter by known patterns (regex on reference strings)&lt;br /&gt;
* Group by reference type and execute one query per group&lt;br /&gt;
* Cache resolved IDs in a lookup table for the duration of compilation&lt;br /&gt;
&lt;br /&gt;
== Edge resolution (background job) ==&lt;br /&gt;
&lt;br /&gt;
When &amp;lt;code&amp;gt;corpus.edges.target_id&amp;lt;/code&amp;gt; is NULL, a background job periodically attempts resolution:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT id, reference FROM corpus.edges WHERE target_id IS NULL;&lt;br /&gt;
-- For each: parse reference → TagQuery → execute → update target_id&lt;br /&gt;
UPDATE corpus.edges SET target_id = %(resolved_id)s WHERE id = %(edge_id)s;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:MCP]]&lt;/div&gt;</description>
			<pubDate>Thu, 23 Apr 2026 02:06:25 GMT</pubDate>
			<dc:creator>Nicolas</dc:creator>
			<comments>https://wiki.dura-lex.org/index.php/Talk:MCP/Reference_resolution</comments>
		</item>
		<item>
			<title>Development/GitHub</title>
			<link>https://wiki.dura-lex.org/index.php?title=Development/GitHub&amp;diff=43&amp;oldid=0</link>
			<guid isPermaLink="false">https://wiki.dura-lex.org/index.php?title=Development/GitHub&amp;diff=43&amp;oldid=0</guid>
			<description>&lt;p&gt;Create GitHub conventions page from coding-conventions/GITHUB.md (via create-page on MediaWiki MCP Server)&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;= GitHub Conventions =&lt;br /&gt;
&lt;br /&gt;
Issues, pull requests, branches, and commit messages across all &amp;lt;code&amp;gt;duralex-*&amp;lt;/code&amp;gt; repositories.&lt;br /&gt;
&lt;br /&gt;
== Commit messages and PR titles ==&lt;br /&gt;
&lt;br /&gt;
All repositories use &amp;#039;&amp;#039;&amp;#039;conventional commits&amp;#039;&amp;#039;&amp;#039;. Since PRs are squash-merged, the PR title becomes the commit message. The PR title format is enforced.&lt;br /&gt;
&lt;br /&gt;
=== Format ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;type&amp;gt;(&amp;lt;scope&amp;gt;): &amp;lt;Description starting with uppercase&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Scope is optional. Description starts with uppercase, does not end with punctuation.&lt;br /&gt;
&lt;br /&gt;
=== Types ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Type !! When to use&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;feat&amp;lt;/code&amp;gt; || New feature or capability&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;fix&amp;lt;/code&amp;gt; || Bug fix&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;refactor&amp;lt;/code&amp;gt; || Code change that neither fixes a bug nor adds a feature&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;perf&amp;lt;/code&amp;gt; || Performance improvement&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;docs&amp;lt;/code&amp;gt; || Documentation only&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;test&amp;lt;/code&amp;gt; || Adding or updating tests&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ci&amp;lt;/code&amp;gt; || CI/CD configuration&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;chore&amp;lt;/code&amp;gt; || Maintenance (dependencies, tooling, config)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;build&amp;lt;/code&amp;gt; || Build system or packaging changes&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Scopes (per repo) ===&lt;br /&gt;
&lt;br /&gt;
Scopes are short identifiers for the area of the codebase. Each repo defines its own set.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;duralex:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
feat(corpus): Add source metadata discovery&lt;br /&gt;
fix(data): Handle missing content element in LEGI XML&lt;br /&gt;
refactor(annotations): Split envelope from type definitions&lt;br /&gt;
perf(fts): Optimize FTS query for large result sets&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;duralex-fr:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
feat(parser): Add KALI collective agreement parser&lt;br /&gt;
fix(refs): Correct L/R/D prefix detection for code du travail&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Breaking changes ===&lt;br /&gt;
&lt;br /&gt;
Append &amp;lt;code&amp;gt;!&amp;lt;/code&amp;gt; after the scope for breaking changes:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
refactor(data)!: Rename LegislationArticle fields to match URI scheme&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The PR body must include a &amp;lt;code&amp;gt;== Breaking changes ==&amp;lt;/code&amp;gt; section explaining what breaks and how to migrate.&lt;br /&gt;
&lt;br /&gt;
== Branch naming ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;type&amp;gt;/&amp;lt;issue-number&amp;gt;-&amp;lt;short-description&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Lowercase, hyphens between words. The type matches the conventional commit type.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
feat/12-ecli-reference-detection&lt;br /&gt;
fix/34-lrd-prefix-code-travail&lt;br /&gt;
refactor/56-rename-article-fields&lt;br /&gt;
docs/78-add-packaging-conventions&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Pull request template ==&lt;br /&gt;
&lt;br /&gt;
Every &amp;lt;code&amp;gt;duralex-*&amp;lt;/code&amp;gt; repo has a &amp;lt;code&amp;gt;.github/pull_request_template.md&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
## Summary&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- What does this change do and why? One to three sentences. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
## Linked issues&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Closes #123 --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
## Test plan&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- How was this tested? Paste test output or describe manual verification. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
## Breaking changes&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Leave empty if none. Otherwise explain what breaks and migration path. --&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== PR guidelines ===&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Target size: under 200 lines changed.&amp;#039;&amp;#039;&amp;#039; If larger, split into stacked PRs.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;One concern per PR.&amp;#039;&amp;#039;&amp;#039; A bug fix does not include a refactor. A feature does not include unrelated cleanup.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Squash-merge only.&amp;#039;&amp;#039;&amp;#039; The PR title is the commit message in &amp;lt;code&amp;gt;main&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Link to the issue.&amp;#039;&amp;#039;&amp;#039; Use &amp;lt;code&amp;gt;Closes #N&amp;lt;/code&amp;gt; syntax so the issue auto-closes on merge.&lt;br /&gt;
&lt;br /&gt;
== Issue templates ==&lt;br /&gt;
&lt;br /&gt;
Each repo has three YAML issue forms in &amp;lt;code&amp;gt;.github/ISSUE_TEMPLATE/&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
=== bug_report.yml ===&lt;br /&gt;
&lt;br /&gt;
Required fields:&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Description&amp;#039;&amp;#039;&amp;#039; — what happened vs. what was expected&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Reproducible example&amp;#039;&amp;#039;&amp;#039; — minimal code or steps (required)&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Version info&amp;#039;&amp;#039;&amp;#039; — output of &amp;lt;code&amp;gt;pip show duralex&amp;lt;/code&amp;gt; or similar (required)&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Checklist&amp;#039;&amp;#039;&amp;#039; — &amp;quot;I searched existing issues&amp;quot;, &amp;quot;I am using the latest version&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== feature_request.yml ===&lt;br /&gt;
&lt;br /&gt;
Required fields:&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Use case&amp;#039;&amp;#039;&amp;#039; — what problem does this solve? (required)&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Proposed API&amp;#039;&amp;#039;&amp;#039; — how would the user call it? Code example preferred.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Alternatives considered&amp;#039;&amp;#039;&amp;#039; — what else was evaluated&lt;br /&gt;
&lt;br /&gt;
=== config.yml ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;yaml&amp;quot;&amp;gt;&lt;br /&gt;
blank_issues_enabled: false&lt;br /&gt;
contact_links:&lt;br /&gt;
  - name: Questions and discussions&lt;br /&gt;
    url: https://github.com/duralex/duralex/discussions&lt;br /&gt;
    about: Ask questions and discuss ideas here&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Blank issues are disabled. Questions go to GitHub Discussions. Issues are for confirmed bugs and accepted features.&lt;br /&gt;
&lt;br /&gt;
== Labels ==&lt;br /&gt;
&lt;br /&gt;
Namespaced prefixes for machine-parseable filtering.&lt;br /&gt;
&lt;br /&gt;
=== Shared across all repos ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
type:bug&lt;br /&gt;
type:feature&lt;br /&gt;
type:refactor&lt;br /&gt;
type:docs&lt;br /&gt;
type:performance&lt;br /&gt;
&lt;br /&gt;
priority:critical&lt;br /&gt;
priority:high&lt;br /&gt;
priority:medium&lt;br /&gt;
priority:low&lt;br /&gt;
&lt;br /&gt;
status:needs-triage          (auto-applied to new issues)&lt;br /&gt;
status:accepted&lt;br /&gt;
status:blocked&lt;br /&gt;
status:in-progress&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Per-repo area labels ===&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;duralex:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
area:corpus&lt;br /&gt;
area:annotations&lt;br /&gt;
area:concepts&lt;br /&gt;
area:data&lt;br /&gt;
area:temporal&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;duralex-fr:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
area:mcp&lt;br /&gt;
area:refs&lt;br /&gt;
area:temporal&lt;br /&gt;
area:courts&lt;br /&gt;
area:search&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Changelog ==&lt;br /&gt;
&lt;br /&gt;
Generated automatically from conventional commit messages (PR titles). Each type maps to a changelog section:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Commit type !! Changelog section&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;feat&amp;lt;/code&amp;gt; || Added&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;fix&amp;lt;/code&amp;gt; || Fixed&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;perf&amp;lt;/code&amp;gt; || Performance&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;refactor!&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;feat!&amp;lt;/code&amp;gt; || Breaking changes&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;docs&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;test&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ci&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;chore&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;build&amp;lt;/code&amp;gt; || Not included&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Category:Development]]&lt;/div&gt;</description>
			<pubDate>Thu, 23 Apr 2026 02:06:04 GMT</pubDate>
			<dc:creator>Nicolas</dc:creator>
			<comments>https://wiki.dura-lex.org/index.php/Talk:Development/GitHub</comments>
		</item>
		<item>
			<title>Jurisdictions/EU</title>
			<link>https://wiki.dura-lex.org/index.php?title=Jurisdictions/EU&amp;diff=42&amp;oldid=0</link>
			<guid isPermaLink="false">https://wiki.dura-lex.org/index.php?title=Jurisdictions/EU&amp;diff=42&amp;oldid=0</guid>
			<description>&lt;p&gt;Create EU jurisdiction reference page (via create-page on MediaWiki MCP Server)&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;= European Legal System =&lt;br /&gt;
&lt;br /&gt;
Jurisdiction code: &amp;lt;code&amp;gt;eu&amp;lt;/code&amp;gt;. Language: &amp;lt;code&amp;gt;fr&amp;lt;/code&amp;gt; only (current limitation; multi-language planned). Covers EU law (EUR-Lex, CJEU) and Council of Europe (ECHR).&lt;br /&gt;
&lt;br /&gt;
== Court structure ==&lt;br /&gt;
&lt;br /&gt;
=== court_level mapping (T1 tag) ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
! court_level !! Court (court tag) !! Institution !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;supranational&amp;lt;/code&amp;gt; || Court of Justice (&amp;lt;code&amp;gt;cjeu&amp;lt;/code&amp;gt;) || CJEU || Highest EU court; preliminary rulings, appeals from General Court&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;supranational&amp;lt;/code&amp;gt; || ECHR (&amp;lt;code&amp;gt;echr&amp;lt;/code&amp;gt;) || Council of Europe || 46 member states; human rights&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;first_instance&amp;lt;/code&amp;gt; || General Court (&amp;lt;code&amp;gt;general_court&amp;lt;/code&amp;gt;) || CJEU || Direct actions: competition, state aid, trademarks&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;first_instance&amp;lt;/code&amp;gt; || Civil Service Tribunal (&amp;lt;code&amp;gt;civil_service_tribunal&amp;lt;/code&amp;gt;) || CJEU || &amp;#039;&amp;#039;&amp;#039;Dissolved 2016&amp;#039;&amp;#039;&amp;#039; — competence transferred to General Court&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== CJEU (Court of Justice of the European Union) ===&lt;br /&gt;
&lt;br /&gt;
Two active courts:&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Court of Justice&amp;#039;&amp;#039;&amp;#039; (&amp;#039;&amp;#039;Cour de justice&amp;#039;&amp;#039;): highest EU court. Preliminary rulings (art. 267 TFEU), appeals from General Court, infringement proceedings.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;General Court&amp;#039;&amp;#039;&amp;#039; (&amp;#039;&amp;#039;Tribunal&amp;#039;&amp;#039;): direct actions — competition, state aid, trademarks, EU staff disputes (since 2016).&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Procedure types&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Type !! Treaty basis !! Description&lt;br /&gt;
|-&lt;br /&gt;
| Preliminary ruling || Art. 267 TFEU || National court asks CJEU to interpret EU law. CJEU answers; does NOT decide national case.&lt;br /&gt;
|-&lt;br /&gt;
| Annulment || Art. 263 TFEU || Challenge legality of EU act&lt;br /&gt;
|-&lt;br /&gt;
| Infringement || Art. 258-260 TFEU || Commission vs. member state for failure to comply&lt;br /&gt;
|-&lt;br /&gt;
| Opinion || Art. 218 TFEU || Compatibility of international agreement with treaties&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== ECHR (European Court of Human Rights) ===&lt;br /&gt;
&lt;br /&gt;
Covers 46 Council of Europe member states (broader than EU). Application number format: &amp;lt;code&amp;gt;NNNNN/YY&amp;lt;/code&amp;gt; (e.g., 36022/97).&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Margin of appreciation&amp;#039;&amp;#039;&amp;#039;: ECHR grants states discretion on sensitive topics (morals, religion, national security). A ruling against Italy does NOT automatically apply to France. Filter by respondent state: &amp;lt;code&amp;gt;tags={&amp;quot;respondent_state&amp;quot;: &amp;quot;FRA&amp;quot;}&amp;lt;/code&amp;gt; (3-letter ISO codes).&lt;br /&gt;
&lt;br /&gt;
== CJEU publication grades (official_grade) ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Grade !! Label !! importance_level&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ecr_grand_chamber&amp;lt;/code&amp;gt; || Published in ECR (Grand Chamber) || highest_importance&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ecr_chamber&amp;lt;/code&amp;gt; || Published in ECR (Chamber) || high_importance&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;oj_only&amp;lt;/code&amp;gt; || Published in OJ only (not in ECR) || low_importance&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;unpublished&amp;lt;/code&amp;gt; || Unpublished || minimal_importance&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
ECR = European Court Reports. OJ = Official Journal (series C).&lt;br /&gt;
&lt;br /&gt;
== ECHR importance grades (official_grade) ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Grade !! Label !! importance_level&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || Key case (ECHR Reports of Judgments and Decisions) || highest_importance&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; || High importance || high_importance&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || Medium importance || medium_importance&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt; || Low importance || low_importance&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Formation / solemnity system ==&lt;br /&gt;
&lt;br /&gt;
=== CJEU formations ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Formation !! Solemnity tag !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| Single judge || &amp;lt;code&amp;gt;single_judge&amp;lt;/code&amp;gt; ||&lt;br /&gt;
|-&lt;br /&gt;
| Chamber (3 judges) || &amp;lt;code&amp;gt;reduced_bench&amp;lt;/code&amp;gt; ||&lt;br /&gt;
|-&lt;br /&gt;
| Chamber (5 judges) || &amp;lt;code&amp;gt;standard_bench&amp;lt;/code&amp;gt; ||&lt;br /&gt;
|-&lt;br /&gt;
| Grand Chamber (15 judges) || &amp;lt;code&amp;gt;grand_bench&amp;lt;/code&amp;gt; ||&lt;br /&gt;
|-&lt;br /&gt;
| Full Court (all judges) || &amp;lt;code&amp;gt;full_court&amp;lt;/code&amp;gt; || Rare; constitutional matters&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== ECHR formations ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Formation !! Solemnity tag !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| Single Judge || &amp;lt;code&amp;gt;single_judge&amp;lt;/code&amp;gt; || Admissibility only&lt;br /&gt;
|-&lt;br /&gt;
| Committee (3 judges) || &amp;lt;code&amp;gt;reduced_bench&amp;lt;/code&amp;gt; || Repetitive cases&lt;br /&gt;
|-&lt;br /&gt;
| Section / Chamber (7 judges) || &amp;lt;code&amp;gt;standard_bench&amp;lt;/code&amp;gt; || Standard formation&lt;br /&gt;
|-&lt;br /&gt;
| Grand Chamber (17 judges) || &amp;lt;code&amp;gt;grand_bench&amp;lt;/code&amp;gt; || Relinquishment or referral; highest authority&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== EU legislation ==&lt;br /&gt;
&lt;br /&gt;
=== Hierarchy ===&lt;br /&gt;
&lt;br /&gt;
Treaties (TEU, TFEU, Charter of Fundamental Rights) &amp;gt; Regulations &amp;gt; Directives &amp;gt; Decisions &amp;gt; Recommendations/Opinions (non-binding)&lt;br /&gt;
&lt;br /&gt;
=== Key types ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Type !! Effect !! Direct effect !! Tag example&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Regulation&amp;#039;&amp;#039;&amp;#039; (&amp;#039;&amp;#039;reglement&amp;#039;&amp;#039;) || Directly applicable in all member states || Full (vertical + horizontal) || &amp;lt;code&amp;gt;tags={&amp;quot;nature&amp;quot;: &amp;quot;REGLEMENT&amp;quot;}&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Directive&amp;#039;&amp;#039;&amp;#039; || Binds as to result; requires national transposition || Vertical only (vs. State), after deadline || &amp;lt;code&amp;gt;tags={&amp;quot;nature&amp;quot;: &amp;quot;DIRECTIVE&amp;quot;}&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Decision&amp;#039;&amp;#039;&amp;#039; || Binding on addressees only || Depends on content ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Recommendation&amp;#039;&amp;#039;&amp;#039; || Non-binding || None ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== CELEX numbers ===&lt;br /&gt;
&lt;br /&gt;
Official EU identifier. Format: &amp;lt;code&amp;gt;3{year}{type}{number}&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Example !! Meaning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;32016R0679&amp;lt;/code&amp;gt; || Regulation 2016/679 (GDPR)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;32016L0680&amp;lt;/code&amp;gt; || Directive 2016/680 (Law Enforcement Directive)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;32004D0001&amp;lt;/code&amp;gt; || Decision 2004/1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Direct lookup: &amp;lt;code&amp;gt;get_document(&amp;quot;32016R0679&amp;quot;)&amp;lt;/code&amp;gt; resolves to &amp;lt;code&amp;gt;EU.EURLEXTEXT32016R0679&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Enforcement status ===&lt;br /&gt;
&lt;br /&gt;
EU EUR-Lex emits only two values:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Value !! Meaning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;in_force&amp;lt;/code&amp;gt; || In force&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;repealed&amp;lt;/code&amp;gt; || Repealed — NEVER cite as current&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Direct effect and primacy ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Instrument !! Direct effect !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| Regulation || Vertical + horizontal || No transposition needed&lt;br /&gt;
|-&lt;br /&gt;
| Directive (after deadline) || Vertical only (vs. State) || NOT horizontal (between private parties)&lt;br /&gt;
|-&lt;br /&gt;
| Directive (before deadline) || None || Must wait for transposition&lt;br /&gt;
|-&lt;br /&gt;
| All EU law || Primacy over national law || Costa v ENEL (1964)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Multilingual documents ==&lt;br /&gt;
&lt;br /&gt;
EU texts exist in 24 official languages, all equally authentic (TFEU art. 55).&lt;br /&gt;
&lt;br /&gt;
Each language version is a separate document with a &amp;lt;code&amp;gt;:lang&amp;lt;/code&amp;gt; suffix in the ID:&lt;br /&gt;
* &amp;lt;code&amp;gt;EU.EURLEXTEXT32016R0679:fr&amp;lt;/code&amp;gt; — GDPR in French&lt;br /&gt;
* &amp;lt;code&amp;gt;EU.EURLEXTEXT32016R0679:en&amp;lt;/code&amp;gt; — GDPR in English&lt;br /&gt;
&lt;br /&gt;
The cross-language identifier &amp;lt;code&amp;gt;tags.text_id&amp;lt;/code&amp;gt; is unsuffixed (&amp;lt;code&amp;gt;EU.EURLEXTEXT32016R0679&amp;lt;/code&amp;gt;). The &amp;lt;code&amp;gt;language&amp;lt;/code&amp;gt; parameter narrows results to the requested language.&lt;br /&gt;
&lt;br /&gt;
Documents ingested in a fallback language (e.g., EN-only when no FR available) carry &amp;lt;code&amp;gt;tags.translation_pending=&amp;quot;fr&amp;quot;&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Advocate General opinions ==&lt;br /&gt;
&lt;br /&gt;
Separate documents (&amp;lt;code&amp;gt;kind=decision, type=advisory_opinion&amp;lt;/code&amp;gt;). Precede the judgment, provide more detailed reasoning. Not binding but highly persuasive — often followed by the Court. Linked to judgments via edges when available.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Current limitation&amp;#039;&amp;#039;&amp;#039;: AG opinions are not yet ingested. &amp;lt;code&amp;gt;type=advisory_opinion&amp;lt;/code&amp;gt; with &amp;lt;code&amp;gt;jurisdiction=&amp;quot;eu&amp;quot;&amp;lt;/code&amp;gt; returns 0 results.&lt;br /&gt;
&lt;br /&gt;
== Charter of Fundamental Rights ==&lt;br /&gt;
&lt;br /&gt;
Treaty-level value since Lisbon Treaty (2009). Binds EU institutions and member states when implementing EU law.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Article !! Right&lt;br /&gt;
|-&lt;br /&gt;
| Art. 7 || Private and family life&lt;br /&gt;
|-&lt;br /&gt;
| Art. 8 || Protection of personal data&lt;br /&gt;
|-&lt;br /&gt;
| Art. 21 || Non-discrimination&lt;br /&gt;
|-&lt;br /&gt;
| Art. 47 || Right to effective remedy and fair trial&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Do not confuse&amp;#039;&amp;#039;&amp;#039;: Charter Art. 7 (private life) and Art. 8 (data protection) are separate from ECHR Convention Art. 8 (private life). Same wording, different instruments.&lt;br /&gt;
&lt;br /&gt;
== What is NOT in the corpus ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Gap !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| Advocate General opinions || Not yet ingested; planned&lt;br /&gt;
|-&lt;br /&gt;
| English-language documents || Only FR ingested currently; multi-language planned&lt;br /&gt;
|-&lt;br /&gt;
| EU national transposition measures || EUR-Lex transposition data may be incomplete — verify in FR sources&lt;br /&gt;
|-&lt;br /&gt;
| EU secondary legislation (delegated/implementing acts) || Partial coverage&lt;br /&gt;
|-&lt;br /&gt;
| Pre-accession case law for newer member states || Historical gaps&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Practical notes ==&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Cross-border queries&amp;#039;&amp;#039;&amp;#039;: use &amp;lt;code&amp;gt;jurisdiction=&amp;quot;eu|fr&amp;quot;&amp;lt;/code&amp;gt; to combine EU and FR sources&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;GDPR search tip&amp;#039;&amp;#039;&amp;#039;: &amp;quot;RGPD&amp;quot; as FTS term returns few EU results — prefer &amp;lt;code&amp;gt;&amp;quot;donnees a caractere personnel&amp;quot;&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;&amp;quot;protection des donnees&amp;quot;&amp;lt;/code&amp;gt;, or direct CELEX: &amp;lt;code&amp;gt;get_document(&amp;quot;32016R0679&amp;quot;)&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Transposition&amp;#039;&amp;#039;&amp;#039;: get_document() the directive, check edges for transposition links, then search FR sources&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Brexit&amp;#039;&amp;#039;&amp;#039;: UK no longer member state since 2020-01-31. Pre-Brexit case law involving UK still relevant for general EU law principles.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Preliminary rulings&amp;#039;&amp;#039;&amp;#039;: CJEU interprets EU law but does NOT decide the national case. The national court applies the interpretation.&lt;br /&gt;
&lt;br /&gt;
[[Category:Jurisdictions]]&lt;/div&gt;</description>
			<pubDate>Thu, 23 Apr 2026 02:05:50 GMT</pubDate>
			<dc:creator>Nicolas</dc:creator>
			<comments>https://wiki.dura-lex.org/index.php/Talk:Jurisdictions/EU</comments>
		</item>
		<item>
			<title>Development/Packaging</title>
			<link>https://wiki.dura-lex.org/index.php?title=Development/Packaging&amp;diff=41&amp;oldid=0</link>
			<guid isPermaLink="false">https://wiki.dura-lex.org/index.php?title=Development/Packaging&amp;diff=41&amp;oldid=0</guid>
			<description>&lt;p&gt;Create Packaging conventions page from coding-conventions/PACKAGING.md (via create-page on MediaWiki MCP Server)&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;= Packaging Conventions =&lt;br /&gt;
&lt;br /&gt;
All duralex-* packages follow these conventions for consistent packaging, installation, and namespace management.&lt;br /&gt;
&lt;br /&gt;
== Naming ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Layer !! Convention !! Example&lt;br /&gt;
|-&lt;br /&gt;
| Brand || Dura Lex (always two words) || —&lt;br /&gt;
|-&lt;br /&gt;
| Domain || &amp;lt;code&amp;gt;dura-lex.*&amp;lt;/code&amp;gt; (hyphenated) || &amp;lt;code&amp;gt;dura-lex.org&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| GitHub org || &amp;lt;code&amp;gt;duralex&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;github.com/duralex/&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| PyPI package || &amp;lt;code&amp;gt;duralex-{name}&amp;lt;/code&amp;gt; (hyphenated) || &amp;lt;code&amp;gt;duralex-fr&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;duralex-mcp&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Python import || &amp;lt;code&amp;gt;duralex.{name}&amp;lt;/code&amp;gt; (dotted) || &amp;lt;code&amp;gt;from duralex.corpus import ...&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Exception || The core package is just &amp;lt;code&amp;gt;duralex&amp;lt;/code&amp;gt; on PyPI || &amp;lt;code&amp;gt;pip install duralex&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Repository structure (6 repos) ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~/duralex/&lt;br /&gt;
├── duralex/                          # PyPI: duralex (core + corpus + specs)&lt;br /&gt;
│   ├── pyproject.toml&lt;br /&gt;
│   ├── src/duralex/&lt;br /&gt;
│   │   ├── corpus/                   # DocumentStore, FTS, TagQuery&lt;br /&gt;
│   │   ├── temporal/                 # versioning, temporal types&lt;br /&gt;
│   │   ├── data/                     # citation types, text utils&lt;br /&gt;
│   │   ├── annotations/             # annotation framework&lt;br /&gt;
│   │   ├── concepts/                # concept definitions&lt;br /&gt;
│   │   ├── errors.py                # DuralexError base&lt;br /&gt;
│   │   ├── database.py              # DSN builder&lt;br /&gt;
│   │   ├── logging.py               # JSON/console logging&lt;br /&gt;
│   │   ├── middleware.py             # ASGI middleware&lt;br /&gt;
│   │   └── retry.py                 # exponential backoff&lt;br /&gt;
│   ├── tests/&lt;br /&gt;
│   ├── sql/                          # corpus DDL&lt;br /&gt;
│   ├── spec/                         # authoritative specifications&lt;br /&gt;
│   ├── coding-conventions/           # this directory&lt;br /&gt;
│   ├── design-decisions/             # ADRs&lt;br /&gt;
│   ├── research/                     # investigation logs&lt;br /&gt;
│   └── issues/                       # issue tracker&lt;br /&gt;
│&lt;br /&gt;
├── duralex-jurisdictions/            # monorepo, two PyPI packages&lt;br /&gt;
│   ├── duralex-fr/                   # PyPI: duralex-fr&lt;br /&gt;
│   │   ├── pyproject.toml&lt;br /&gt;
│   │   ├── src/duralex/fr/&lt;br /&gt;
│   │   └── tests/&lt;br /&gt;
│   └── duralex-eu/                   # PyPI: duralex-eu&lt;br /&gt;
│       ├── pyproject.toml&lt;br /&gt;
│       ├── src/duralex/eu/&lt;br /&gt;
│       └── tests/&lt;br /&gt;
│&lt;br /&gt;
├── duralex-ingest/                   # monorepo, three PyPI packages&lt;br /&gt;
│   ├── duralex-ingest/               # PyPI: duralex-ingest&lt;br /&gt;
│   │   ├── pyproject.toml&lt;br /&gt;
│   │   ├── src/duralex/ingest/       # NO __init__.py (namespace)&lt;br /&gt;
│   │   └── tests/&lt;br /&gt;
│   ├── duralex-ingest-fr/            # PyPI: duralex-ingest-fr&lt;br /&gt;
│   │   ├── pyproject.toml&lt;br /&gt;
│   │   ├── src/duralex/ingest/fr/&lt;br /&gt;
│   │   └── tests/&lt;br /&gt;
│   └── duralex-ingest-eu/            # PyPI: duralex-ingest-eu&lt;br /&gt;
│       ├── pyproject.toml&lt;br /&gt;
│       ├── src/duralex/ingest/eu/&lt;br /&gt;
│       └── tests/&lt;br /&gt;
│&lt;br /&gt;
├── duralex-mcp/                      # PyPI: duralex-mcp (+ Docker infra)&lt;br /&gt;
│   ├── pyproject.toml&lt;br /&gt;
│   ├── src/duralex/mcp/&lt;br /&gt;
│   ├── tests/&lt;br /&gt;
│   ├── Dockerfile&lt;br /&gt;
│   ├── docker-compose.dev.yml&lt;br /&gt;
│   ├── docker-compose.prod.yml&lt;br /&gt;
│   └── Caddyfile&lt;br /&gt;
│&lt;br /&gt;
├── duralex-portal/                   # PyPI: duralex-portal&lt;br /&gt;
│   ├── pyproject.toml&lt;br /&gt;
│   ├── src/duralex/portal/&lt;br /&gt;
│   └── tests/&lt;br /&gt;
│&lt;br /&gt;
└── duralex-feedback/                 # standalone, not distributed&lt;br /&gt;
    ├── server.py&lt;br /&gt;
    ├── Dockerfile&lt;br /&gt;
    └── docker-compose.yml&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== src layout with namespace packages ==&lt;br /&gt;
&lt;br /&gt;
Every package uses the &amp;#039;&amp;#039;&amp;#039;src layout&amp;#039;&amp;#039;&amp;#039; with implicit namespace packages (PEP 420).&lt;br /&gt;
&lt;br /&gt;
The critical rule: &amp;#039;&amp;#039;&amp;#039;no &amp;lt;code&amp;gt;__init__.py&amp;lt;/code&amp;gt; in namespace directories&amp;#039;&amp;#039;&amp;#039;. Only leaf packages have &amp;lt;code&amp;gt;__init__.py&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
duralex-fr/&lt;br /&gt;
├── pyproject.toml&lt;br /&gt;
├── src/&lt;br /&gt;
│   └── duralex/                     # NO __init__.py (namespace)&lt;br /&gt;
│       └── fr/                      # NO __init__.py (namespace)&lt;br /&gt;
│           ├── mcp/&lt;br /&gt;
│           │   ├── __init__.py      # leaf package&lt;br /&gt;
│           │   └── ...&lt;br /&gt;
│           ├── refs/&lt;br /&gt;
│           │   ├── __init__.py&lt;br /&gt;
│           │   └── ...&lt;br /&gt;
│           └── courts/&lt;br /&gt;
│               ├── __init__.py&lt;br /&gt;
│               └── ...&lt;br /&gt;
└── tests/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Special case: duralex-ingest namespace ===&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;duralex.ingest&amp;lt;/code&amp;gt; namespace is shared across three packages. The base &amp;lt;code&amp;gt;duralex-ingest&amp;lt;/code&amp;gt; package must NOT have &amp;lt;code&amp;gt;__init__.py&amp;lt;/code&amp;gt; at &amp;lt;code&amp;gt;src/duralex/ingest/&amp;lt;/code&amp;gt; — otherwise Python blocks namespace discovery of &amp;lt;code&amp;gt;duralex.ingest.fr&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;duralex.ingest.eu&amp;lt;/code&amp;gt; from sibling packages.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
duralex-ingest/duralex-ingest/src/duralex/ingest/       # NO __init__.py&lt;br /&gt;
duralex-ingest/duralex-ingest/src/duralex/ingest/database/__init__.py   # leaf&lt;br /&gt;
duralex-ingest/duralex-ingest-fr/src/duralex/ingest/fr/__init__.py      # leaf&lt;br /&gt;
duralex-ingest/duralex-ingest-eu/src/duralex/ingest/eu/__init__.py      # leaf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== pyproject.toml template ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;toml&amp;quot;&amp;gt;&lt;br /&gt;
[build-system]&lt;br /&gt;
requires = [&amp;quot;setuptools&amp;gt;=69.0&amp;quot;]&lt;br /&gt;
build-backend = &amp;quot;setuptools.build_meta&amp;quot;&lt;br /&gt;
&lt;br /&gt;
[project]&lt;br /&gt;
name = &amp;quot;duralex-fr&amp;quot;&lt;br /&gt;
version = &amp;quot;0.1.0&amp;quot;&lt;br /&gt;
description = &amp;quot;France: legal reference resolver, court hierarchy, and validation for the Dura Lex ecosystem&amp;quot;&lt;br /&gt;
requires-python = &amp;quot;&amp;gt;=3.12&amp;quot;&lt;br /&gt;
license = &amp;quot;MIT&amp;quot;&lt;br /&gt;
authors = [{ name = &amp;quot;Nicolas Baldeck&amp;quot; }]&lt;br /&gt;
keywords = [&amp;quot;legal&amp;quot;, &amp;quot;open-data&amp;quot;, &amp;quot;france&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
dependencies = [&lt;br /&gt;
    &amp;quot;duralex&amp;gt;=0.1.0&amp;quot;,&lt;br /&gt;
]&lt;br /&gt;
&lt;br /&gt;
[project.optional-dependencies]&lt;br /&gt;
dev = [&lt;br /&gt;
    &amp;quot;pytest&amp;gt;=8.2&amp;quot;,&lt;br /&gt;
    &amp;quot;ruff&amp;gt;=0.15&amp;quot;,&lt;br /&gt;
    &amp;quot;mypy&amp;gt;=1.15&amp;quot;,&lt;br /&gt;
]&lt;br /&gt;
&lt;br /&gt;
[tool.setuptools.packages.find]&lt;br /&gt;
where = [&amp;quot;src&amp;quot;]&lt;br /&gt;
include = [&amp;quot;duralex.fr*&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
[tool.ruff]&lt;br /&gt;
line-length = 120&lt;br /&gt;
target-version = &amp;quot;py312&amp;quot;&lt;br /&gt;
&lt;br /&gt;
[tool.ruff.lint]&lt;br /&gt;
select = [&amp;quot;E&amp;quot;, &amp;quot;F&amp;quot;, &amp;quot;W&amp;quot;, &amp;quot;I&amp;quot;, &amp;quot;UP&amp;quot;, &amp;quot;B&amp;quot;, &amp;quot;SIM&amp;quot;, &amp;quot;TCH&amp;quot;, &amp;quot;RUF&amp;quot;, &amp;quot;PTH&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
[tool.ruff.format]&lt;br /&gt;
quote-style = &amp;quot;double&amp;quot;&lt;br /&gt;
&lt;br /&gt;
[tool.mypy]&lt;br /&gt;
python_version = &amp;quot;3.12&amp;quot;&lt;br /&gt;
strict = true&lt;br /&gt;
namespace_packages = true&lt;br /&gt;
explicit_package_bases = true&lt;br /&gt;
mypy_path = [&amp;quot;src&amp;quot;, &amp;quot;../../duralex/src&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
[tool.pytest.ini_options]&lt;br /&gt;
testpaths = [&amp;quot;tests&amp;quot;]&lt;br /&gt;
addopts = [&amp;quot;--strict-config&amp;quot;, &amp;quot;--strict-markers&amp;quot;, &amp;quot;--import-mode=importlib&amp;quot;, &amp;quot;-m not slow and not integration&amp;quot;]&lt;br /&gt;
xfail_strict = true&lt;br /&gt;
consider_namespace_packages = true&lt;br /&gt;
filterwarnings = [&amp;quot;error&amp;quot;]&lt;br /&gt;
markers = [&lt;br /&gt;
    &amp;quot;slow: tests with extended runtime&amp;quot;,&lt;br /&gt;
    &amp;quot;integration: requires PostgreSQL (testcontainers)&amp;quot;,&lt;br /&gt;
]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Editable development installs ==&lt;br /&gt;
&lt;br /&gt;
Install all packages in editable mode from the repo root:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd ~/duralex&lt;br /&gt;
pip install -e &amp;quot;./duralex[dev,pg]&amp;quot;&lt;br /&gt;
pip install -e &amp;quot;./duralex-jurisdictions/duralex-fr[dev,db]&amp;quot;&lt;br /&gt;
pip install -e &amp;quot;./duralex-jurisdictions/duralex-eu[dev]&amp;quot;&lt;br /&gt;
pip install -e &amp;quot;./duralex-ingest/duralex-ingest[dev]&amp;quot;&lt;br /&gt;
pip install -e &amp;quot;./duralex-ingest/duralex-ingest-fr[dev]&amp;quot;&lt;br /&gt;
pip install -e &amp;quot;./duralex-ingest/duralex-ingest-eu[dev]&amp;quot;&lt;br /&gt;
pip install -e &amp;quot;./duralex-mcp[dev]&amp;quot;&lt;br /&gt;
pip install -e &amp;quot;./duralex-portal[dev]&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If namespace resolution breaks between sibling packages:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
pip install -e &amp;quot;.[dev]&amp;quot; --config-settings editable_mode=compat&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Version policy ==&lt;br /&gt;
&lt;br /&gt;
All packages start at &amp;lt;code&amp;gt;0.1.0&amp;lt;/code&amp;gt;. Packages are versioned independently. A major version bump in &amp;lt;code&amp;gt;duralex&amp;lt;/code&amp;gt; triggers compatibility review in all downstream packages.&lt;br /&gt;
&lt;br /&gt;
== Brand vs. code ==&lt;br /&gt;
&lt;br /&gt;
The brand is always written &amp;#039;&amp;#039;&amp;#039;Dura Lex&amp;#039;&amp;#039;&amp;#039; (two words). Code identifiers use &amp;lt;code&amp;gt;duralex&amp;lt;/code&amp;gt; (one word, no space) because Python and PyPI do not allow spaces. Never write &amp;quot;Duralex&amp;quot; — it is either &amp;quot;Dura Lex&amp;quot; (prose) or &amp;lt;code&amp;gt;duralex&amp;lt;/code&amp;gt; (code).&lt;br /&gt;
&lt;br /&gt;
[[Category:Development]]&lt;/div&gt;</description>
			<pubDate>Thu, 23 Apr 2026 02:05:32 GMT</pubDate>
			<dc:creator>Nicolas</dc:creator>
			<comments>https://wiki.dura-lex.org/index.php/Talk:Development/Packaging</comments>
		</item>
		<item>
			<title>Corpus/Schema</title>
			<link>https://wiki.dura-lex.org/index.php?title=Corpus/Schema&amp;diff=40&amp;oldid=0</link>
			<guid isPermaLink="false">https://wiki.dura-lex.org/index.php?title=Corpus/Schema&amp;diff=40&amp;oldid=0</guid>
			<description>&lt;p&gt;Import from duralex/spec/CORPUS-SCHEMA.md — faithful conversion to wikitext (via create-page on MediaWiki MCP Server)&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;= Corpus Schema =&lt;br /&gt;
&lt;br /&gt;
Technical specification for the Dura Lex unified corpus schema. Reference for developers and AI agents.&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
&lt;br /&gt;
One &amp;lt;code&amp;gt;documents&amp;lt;/code&amp;gt; table with promoted columns and a JSONB &amp;lt;code&amp;gt;tags&amp;lt;/code&amp;gt; column, inspired by OpenStreetMap&amp;#039;s model: a small fixed schema handles structure, while a flexible key-value store handles everything jurisdiction-specific.&lt;br /&gt;
&lt;br /&gt;
Validated across 25 jurisdictions on 5 continents. Benchmark on 3.4M rows: 7x faster than the previous 16-table normalized schema.&lt;br /&gt;
&lt;br /&gt;
Four tables:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Table !! Purpose&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;corpus.documents&amp;lt;/code&amp;gt; || All legal content: legislation, case law, regulatory filings, administrative notices&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;corpus.edges&amp;lt;/code&amp;gt; || Relationships between documents: citations, amendments, hierarchy, consolidation&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;corpus.tag_stats&amp;lt;/code&amp;gt; || Aggregated tag counts per kind/jurisdiction, refreshed post-ingest&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;corpus.source_metadata&amp;lt;/code&amp;gt; || Data source registry: publishers, licenses, ingestion state, freshness&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Schema: corpus.documents ==&lt;br /&gt;
&lt;br /&gt;
14 columns.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
CREATE SCHEMA IF NOT EXISTS corpus;&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE corpus.documents (&lt;br /&gt;
    id            text PRIMARY KEY,&lt;br /&gt;
    kind          text NOT NULL,&lt;br /&gt;
    jurisdiction  text NOT NULL,&lt;br /&gt;
    language      text,&lt;br /&gt;
    source        text NOT NULL,&lt;br /&gt;
    date          date,&lt;br /&gt;
    date_end      date,&lt;br /&gt;
    parent_id     text,&lt;br /&gt;
    title         text,&lt;br /&gt;
    body          text,&lt;br /&gt;
    body_search   text,&lt;br /&gt;
    tags          jsonb NOT NULL DEFAULT &amp;#039;{}&amp;#039;,&lt;br /&gt;
    content_fts   tsvector,&lt;br /&gt;
    ingested_at   timestamptz DEFAULT now()&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Column definitions ===&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;id&amp;#039;&amp;#039;&amp;#039; -- Text primary key. Uses source-native identifiers with a jurisdiction prefix, always &amp;#039;&amp;#039;&amp;#039;lowercase&amp;#039;&amp;#039;&amp;#039;: &amp;lt;code&amp;gt;{jurisdiction}.{source_id}&amp;lt;/code&amp;gt; (e.g., &amp;lt;code&amp;gt;fr.legiarti000006902764&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;eu.eurlextext32016r0679&amp;lt;/code&amp;gt;). Identifiers with built-in jurisdiction context keep their original form (&amp;lt;code&amp;gt;ECLI:FR:CCASS:2024:CR00123&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;[2024] UKSC 1&amp;lt;/code&amp;gt;). For non-legal registries where the source ID could collide, prefix with &amp;lt;code&amp;gt;{jurisdiction}.{source}.&amp;lt;/code&amp;gt; (e.g., &amp;lt;code&amp;gt;fr.company.443061841&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;gb.company.12345678&amp;lt;/code&amp;gt;). Never synthetic UUIDs -- the ID must be meaningful and traceable to the source. See ADR: lowercase document IDs (design-decisions/2026-04-09-lowercase-document-ids.md).&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;kind&amp;#039;&amp;#039;&amp;#039; -- Structural classification. Exactly 6 values (see Kind Taxonomy below): &amp;lt;code&amp;gt;legislation&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;decision&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;record&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;notice&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;section&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;chunk&amp;lt;/code&amp;gt;. This column answers &amp;quot;what shape is this document?&amp;quot; not &amp;quot;what legal category is it?&amp;quot; -- legal category belongs in &amp;lt;code&amp;gt;tags.type&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;jurisdiction&amp;#039;&amp;#039;&amp;#039; -- Geographic/political area, not institution. ISO 3166-1 alpha-2 for countries (&amp;lt;code&amp;gt;fr&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;gb&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;de&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;br&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;jp&amp;lt;/code&amp;gt;). ISO 3166-2 for subdivisions (&amp;lt;code&amp;gt;us-ca&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;gb-sct&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;es-ct&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;de-by&amp;lt;/code&amp;gt;). Extensions for supranational areas: &amp;lt;code&amp;gt;eu&amp;lt;/code&amp;gt; (European law — EU institutions and Council of Europe), &amp;lt;code&amp;gt;int&amp;lt;/code&amp;gt; (international treaties). A search for a jurisdiction includes its subdivisions: searching &amp;lt;code&amp;gt;us&amp;lt;/code&amp;gt; includes &amp;lt;code&amp;gt;us-ca&amp;lt;/code&amp;gt;. No default value -- every document must declare its jurisdiction explicitly.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;language&amp;#039;&amp;#039;&amp;#039; -- ISO 639-1 (&amp;lt;code&amp;gt;fr&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;en&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;de&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ar&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;zh&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ja&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ko&amp;lt;/code&amp;gt;). Nullable. When NULL, the FTS trigger infers language from &amp;lt;code&amp;gt;jurisdiction&amp;lt;/code&amp;gt;. Decoupled from jurisdiction because many countries are multilingual: Belgium (3 languages), Switzerland (4), South Africa (11), India (23+). A Belgian law in Dutch and the same law in French are two separate documents with the same jurisdiction (&amp;lt;code&amp;gt;be&amp;lt;/code&amp;gt;) but different languages.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;source&amp;#039;&amp;#039;&amp;#039; -- Data source identifier. Examples: &amp;lt;code&amp;gt;legi&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;cass&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;hmrc_manuals&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;cendoj&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;boe&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;legifrance_jorf&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;knesset&amp;lt;/code&amp;gt;. One source maps to one ingestion pipeline. Multiple sources can feed the same jurisdiction.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;date&amp;#039;&amp;#039;&amp;#039; -- Primary date, always ISO 8601 (converted from Hijri calendar, Japanese era dates, etc. at ingestion). Semantics vary by kind: &amp;lt;code&amp;gt;decision_date&amp;lt;/code&amp;gt; for decisions, &amp;lt;code&amp;gt;valid_from&amp;lt;/code&amp;gt; for legislation, &amp;lt;code&amp;gt;publication_date&amp;lt;/code&amp;gt; for notices, &amp;lt;code&amp;gt;creation_date&amp;lt;/code&amp;gt; for records. The semantic meaning is implicit from &amp;lt;code&amp;gt;kind&amp;lt;/code&amp;gt; -- not stored separately.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;date_end&amp;#039;&amp;#039;&amp;#039; -- End date. &amp;lt;code&amp;gt;valid_until&amp;lt;/code&amp;gt; for legislation, expiration for notices, closure for records. NULL for most decisions (they don&amp;#039;t expire). NULL does not mean &amp;quot;still in force&amp;quot; -- it means the source did not provide an end date.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;parent_id&amp;#039;&amp;#039;&amp;#039; -- Hierarchical link to another document ID. Used for structure trees (code -&amp;gt; article), sub-documents (decision -&amp;gt; chunk), and entity hierarchies (company -&amp;gt; director appointments). Text, not a foreign key -- the parent may live in a different source or not yet be ingested. No FK constraint.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;title&amp;#039;&amp;#039;&amp;#039; -- Display title. Free text. May be NULL for chunks and sections that inherit their parent&amp;#039;s title.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;body&amp;#039;&amp;#039;&amp;#039; -- Clean displayable content. HTML or plain text suitable for direct rendering to a user. Immutable after initial ingestion. Never contains noisy OCR or raw PDF binary. For PDF-only sources, &amp;lt;code&amp;gt;body&amp;lt;/code&amp;gt; is a clean stub like &amp;lt;code&amp;gt;&amp;amp;lt;p&amp;amp;gt;Source: &amp;amp;lt;a href=&amp;quot;...&amp;quot;&amp;amp;gt;PDF officiel&amp;amp;lt;/a&amp;amp;gt;&amp;amp;lt;/p&amp;amp;gt;&amp;lt;/code&amp;gt; and the extracted text goes to &amp;lt;code&amp;gt;body_search&amp;lt;/code&amp;gt;. &amp;lt;code&amp;gt;body&amp;lt;/code&amp;gt; is what &amp;lt;code&amp;gt;get_document&amp;lt;/code&amp;gt; returns.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;body_search&amp;#039;&amp;#039;&amp;#039; -- Indexable text representation used by FTS. Can be noisy (raw PDF extraction, OCR output) because users never see it directly — &amp;lt;code&amp;gt;get_document&amp;lt;/code&amp;gt; never returns it. Nullable. When NULL, the FTS trigger falls back to &amp;lt;code&amp;gt;body&amp;lt;/code&amp;gt; via &amp;lt;code&amp;gt;coalesce(body_search, body)&amp;lt;/code&amp;gt;. Used for: (a) PDF-sourced documents where &amp;lt;code&amp;gt;body&amp;lt;/code&amp;gt; is a clean stub and &amp;lt;code&amp;gt;body_search&amp;lt;/code&amp;gt; holds the pdfminer-extracted text; (b) HTML documents with irregular references that need an LLM-cleaned indexable version. Summary and headnote FTS indexing is handled separately by the trigger reading &amp;lt;code&amp;gt;tags.summary&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;tags.headnote_classification&amp;lt;/code&amp;gt; directly from JSONB (weight B). See ADR-010 (design-decisions/2026-04-08-body-search-inversion.md) for the current semantic and ADR-008 (design-decisions/2026-04-05-fts-three-weights.md) for the trigger weight system. See [[Corpus/Quality|QUALITY]] for &amp;lt;code&amp;gt;tags.content_quality&amp;lt;/code&amp;gt; levels.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;tags&amp;#039;&amp;#039;&amp;#039; -- JSONB. Everything jurisdiction-specific or type-specific that does not deserve a promoted column. Examples: &amp;lt;code&amp;gt;{&amp;quot;type&amp;quot;: &amp;quot;loi&amp;quot;, &amp;quot;nid&amp;quot;: &amp;quot;JORFTEXT000041865244&amp;quot;, &amp;quot;nature&amp;quot;: &amp;quot;LOI&amp;quot;}&amp;lt;/code&amp;gt; for French legislation, &amp;lt;code&amp;gt;{&amp;quot;chamber&amp;quot;: &amp;quot;2e_civ&amp;quot;, &amp;quot;solution&amp;quot;: &amp;quot;cassation&amp;quot;}&amp;lt;/code&amp;gt; for French cassation decisions, &amp;lt;code&amp;gt;{&amp;quot;sic_code&amp;quot;: &amp;quot;6411&amp;quot;, &amp;quot;status&amp;quot;: &amp;quot;active&amp;quot;}&amp;lt;/code&amp;gt; for UK company records. No enforced schema -- each source defines its own tag vocabulary. Queried via &amp;lt;code&amp;gt;@&amp;amp;gt;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt;, and &amp;lt;code&amp;gt;jsonb_path_ops&amp;lt;/code&amp;gt; GIN index.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;content_fts&amp;#039;&amp;#039;&amp;#039; -- &amp;lt;code&amp;gt;tsvector&amp;lt;/code&amp;gt; column, populated by a trigger with three weights: A=title, B=&amp;lt;code&amp;gt;tags.summary&amp;lt;/code&amp;gt;+&amp;lt;code&amp;gt;tags.headnote_classification&amp;lt;/code&amp;gt; (read from JSONB), C=&amp;lt;code&amp;gt;coalesce(body_search, body)&amp;lt;/code&amp;gt; with HTML tags stripped. Uses the appropriate language configuration (derived from &amp;lt;code&amp;gt;language&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;jurisdiction&amp;lt;/code&amp;gt;). NULL for CJK languages (Chinese, Japanese, Korean) which require pgroonga or zhparser instead of PostgreSQL built-in FTS. See [[Corpus/FTS|FTS]] for full trigger details.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;ingested_at&amp;#039;&amp;#039;&amp;#039; -- Timestamp of first ingestion. &amp;lt;code&amp;gt;DEFAULT now()&amp;lt;/code&amp;gt;. Not updated on re-ingestion -- use &amp;lt;code&amp;gt;tags&amp;lt;/code&amp;gt; for versioning metadata if needed.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Indexes ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
-- B-tree indexes on promoted columns&lt;br /&gt;
CREATE INDEX idx_doc_kind          ON corpus.documents (kind);&lt;br /&gt;
CREATE INDEX idx_doc_jurisdiction   ON corpus.documents (jurisdiction);&lt;br /&gt;
CREATE INDEX idx_doc_source        ON corpus.documents (source);&lt;br /&gt;
CREATE INDEX idx_doc_date          ON corpus.documents (date);&lt;br /&gt;
CREATE INDEX idx_doc_date_end      ON corpus.documents (date_end)   WHERE date_end IS NOT NULL;&lt;br /&gt;
CREATE INDEX idx_doc_parent        ON corpus.documents (parent_id)  WHERE parent_id IS NOT NULL;&lt;br /&gt;
CREATE INDEX idx_doc_kind_juris    ON corpus.documents (kind, jurisdiction);&lt;br /&gt;
CREATE INDEX idx_doc_kind_source   ON corpus.documents (kind, source);&lt;br /&gt;
&lt;br /&gt;
-- GIN index on tags&lt;br /&gt;
CREATE INDEX idx_doc_tags          ON corpus.documents USING GIN (tags jsonb_path_ops);&lt;br /&gt;
&lt;br /&gt;
-- Partial GIN indexes per kind (FTS isolation)&lt;br /&gt;
CREATE INDEX idx_doc_fts_legislation ON corpus.documents USING GIN (content_fts) WHERE kind = &amp;#039;legislation&amp;#039;;&lt;br /&gt;
CREATE INDEX idx_doc_fts_decision  ON corpus.documents USING GIN (content_fts) WHERE kind = &amp;#039;decision&amp;#039;;&lt;br /&gt;
CREATE INDEX idx_doc_fts_record    ON corpus.documents USING GIN (content_fts) WHERE kind = &amp;#039;record&amp;#039;;&lt;br /&gt;
CREATE INDEX idx_doc_fts_notice    ON corpus.documents USING GIN (content_fts) WHERE kind = &amp;#039;notice&amp;#039;;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Why partial GIN indexes per kind instead of table partitioning ===&lt;br /&gt;
&lt;br /&gt;
Partitioning &amp;lt;code&amp;gt;documents&amp;lt;/code&amp;gt; by &amp;lt;code&amp;gt;kind&amp;lt;/code&amp;gt; would require &amp;lt;code&amp;gt;kind&amp;lt;/code&amp;gt; in the primary key (PostgreSQL requires the partition key in the PK). That means &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; alone can no longer be a PK -- every FK, every edge reference, every external link would need to carry &amp;lt;code&amp;gt;(id, kind)&amp;lt;/code&amp;gt; instead of just &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt;. The complexity cascades through the entire system.&lt;br /&gt;
&lt;br /&gt;
Partial GIN indexes achieve 80% of the performance benefit with 0% of the complexity. When a query filters &amp;lt;code&amp;gt;WHERE kind = &amp;#039;legislation&amp;#039; AND content_fts @@ ...&amp;lt;/code&amp;gt;, PostgreSQL uses the partial index &amp;lt;code&amp;gt;idx_doc_fts_legislation&amp;lt;/code&amp;gt; which contains only legislation tsvectors. The planner skips the other kinds entirely. Index size is smaller, scans are faster, and the PK stays a simple &amp;lt;code&amp;gt;text&amp;lt;/code&amp;gt; column.&lt;br /&gt;
&lt;br /&gt;
No partial index for &amp;lt;code&amp;gt;section&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;chunk&amp;lt;/code&amp;gt; because they rarely have &amp;lt;code&amp;gt;body&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;body_search&amp;lt;/code&amp;gt; content worth full-text indexing.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Schema: corpus.edges ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
CREATE TABLE corpus.edges (&lt;br /&gt;
    id          bigint GENERATED ALWAYS AS IDENTITY PRIMARY KEY,&lt;br /&gt;
    source_id   text NOT NULL,&lt;br /&gt;
    target_id   text,&lt;br /&gt;
    kind        text NOT NULL,&lt;br /&gt;
    reference   text,&lt;br /&gt;
    properties  jsonb DEFAULT &amp;#039;{}&amp;#039;,&lt;br /&gt;
    UNIQUE (source_id, target_id, kind)&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
CREATE INDEX idx_edge_source ON corpus.edges (source_id);&lt;br /&gt;
CREATE INDEX idx_edge_target ON corpus.edges (target_id) WHERE target_id IS NOT NULL;&lt;br /&gt;
CREATE INDEX idx_edge_kind   ON corpus.edges (kind);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Column definitions ===&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;id&amp;#039;&amp;#039;&amp;#039; -- Synthetic identity, &amp;lt;code&amp;gt;bigint GENERATED ALWAYS AS IDENTITY&amp;lt;/code&amp;gt;. Edges have no natural key.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;source_id&amp;#039;&amp;#039;&amp;#039; -- The document that originates the relationship. Not a foreign key.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;target_id&amp;#039;&amp;#039;&amp;#039; -- The document that receives the relationship. Nullable: an unresolved reference (a citation to a document not yet ingested, or a reference to an external system) has &amp;lt;code&amp;gt;target_id = NULL&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;reference&amp;lt;/code&amp;gt; containing the raw citation text. Once the target is ingested or resolved, &amp;lt;code&amp;gt;target_id&amp;lt;/code&amp;gt; is backfilled.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;kind&amp;#039;&amp;#039;&amp;#039; -- Relationship type. Open vocabulary. Examples: &amp;lt;code&amp;gt;cites&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;amends&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;repeals&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;implements&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;transposes&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;overrules&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;affirms&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;commences&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;language_variant&amp;lt;/code&amp;gt;. See [[Corpus/Edge types|EDGE-TYPES]] for the full taxonomy.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;reference&amp;#039;&amp;#039;&amp;#039; -- Raw citation text as found in the source document. Preserved even after resolution for traceability. Example: &amp;lt;code&amp;gt;&amp;quot;article L. 121-1 du code de la consommation&amp;quot;&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;properties&amp;#039;&amp;#039;&amp;#039; -- JSONB metadata on the relationship. Standard provenance keys (see ADR: edge pipeline architecture, design-decisions/2026-04-22-edge-pipeline-architecture.md):&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;extraction&amp;lt;/code&amp;gt;: &amp;lt;code&amp;gt;&amp;quot;publisher_provided&amp;quot;&amp;lt;/code&amp;gt; (source has a structured link) or &amp;lt;code&amp;gt;&amp;quot;id_resolved&amp;quot;&amp;lt;/code&amp;gt; (textual reference resolved by the reference resolver).&lt;br /&gt;
* &amp;lt;code&amp;gt;source_type&amp;lt;/code&amp;gt;: identifies the source system (&amp;lt;code&amp;gt;legi_lien&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;cellar_sparql&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;hudoc_appno&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;cellar_nim&amp;lt;/code&amp;gt;).&lt;br /&gt;
* &amp;lt;code&amp;gt;raw_link_type&amp;lt;/code&amp;gt;: source-native link type preserved for traceability (e.g., &amp;lt;code&amp;gt;&amp;quot;TRANSPOSITION&amp;quot;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;quot;cdm:resource_legal_amends_resource_legal&amp;quot;&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Type-specific examples: &amp;lt;code&amp;gt;{&amp;quot;scope&amp;quot;: &amp;quot;partial&amp;quot;, &amp;quot;articles&amp;quot;: [&amp;quot;1&amp;quot;, &amp;quot;2&amp;quot;, &amp;quot;3&amp;quot;]}&amp;lt;/code&amp;gt; for partial amendments, &amp;lt;code&amp;gt;{&amp;quot;commencement_date&amp;quot;: &amp;quot;2024-01-01&amp;quot;, &amp;quot;territorial_extent&amp;quot;: &amp;quot;england_and_wales&amp;quot;}&amp;lt;/code&amp;gt; for UK effects, &amp;lt;code&amp;gt;{&amp;quot;reservation&amp;quot;: &amp;quot;sous reserve de...&amp;quot;}&amp;lt;/code&amp;gt; for conditional constitutionality decisions.&lt;br /&gt;
&lt;br /&gt;
=== Quarantine model ===&lt;br /&gt;
&lt;br /&gt;
Edges with unresolved targets are stored with &amp;lt;code&amp;gt;target_id = NULL&amp;lt;/code&amp;gt; and the raw citation in &amp;lt;code&amp;gt;reference&amp;lt;/code&amp;gt;. They are visible to MCP and queryable for monitoring. The partial unique index &amp;lt;code&amp;gt;idx_edge_unique_without_target ON (source_id, reference, kind) WHERE target_id IS NULL&amp;lt;/code&amp;gt; prevents duplicate quarantine entries.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Ownership:&amp;#039;&amp;#039;&amp;#039; an edge is owned by the jurisdiction prefix of its &amp;lt;code&amp;gt;source_id&amp;lt;/code&amp;gt;. Drop-and-reingest for jurisdiction X deletes edges WHERE &amp;lt;code&amp;gt;source_id LIKE &amp;#039;{x}.%&amp;#039;&amp;lt;/code&amp;gt;. Cross-jurisdiction quarantine edges (e.g., EU NIM → FR target) survive the target jurisdiction&amp;#039;s reingest.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Reconciliation:&amp;#039;&amp;#039;&amp;#039; after each jurisdiction ingest, a post-ingest pass attempts to resolve quarantine edges whose reference matches the freshly ingested jurisdiction. Resolved → &amp;lt;code&amp;gt;UPDATE target_id&amp;lt;/code&amp;gt;. Still unresolved → remains in quarantine.&lt;br /&gt;
&lt;br /&gt;
=== Why no foreign keys ===&lt;br /&gt;
&lt;br /&gt;
At 50M+ edges, FK checks on every insert become a measurable bottleneck. Sources are ingested independently and in parallel -- a French decision citing a EU directive may be ingested before the directive itself. FKs would either block ingestion order or require two-pass inserts.&lt;br /&gt;
&lt;br /&gt;
Orphan cleanup runs periodically (post-ingest batch job), not on every write.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Schema: corpus.tag_stats ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
CREATE TABLE corpus.tag_stats (&lt;br /&gt;
    kind          text NOT NULL,&lt;br /&gt;
    jurisdiction  text NOT NULL,&lt;br /&gt;
    tag_key       text NOT NULL,&lt;br /&gt;
    tag_value     text NOT NULL,&lt;br /&gt;
    count         integer DEFAULT 0,&lt;br /&gt;
    PRIMARY KEY (kind, jurisdiction, tag_key, tag_value)&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Refreshed post-ingest, incrementally per source. Provides instant faceted counts without scanning &amp;lt;code&amp;gt;documents&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Must handle both scalar and array tag values. For scalar tags, count directly. For array tags (e.g., &amp;lt;code&amp;gt;tags.themes = [&amp;quot;droit civil&amp;quot;, &amp;quot;responsabilite&amp;quot;]&amp;lt;/code&amp;gt;), use &amp;lt;code&amp;gt;jsonb_array_elements_text&amp;lt;/code&amp;gt; to explode the array and count each element individually.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Kind taxonomy ==&lt;br /&gt;
&lt;br /&gt;
6 structural values. These classify document shape, not legal category.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Kind !! What it is !! What it is NOT !! Examples&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;legislation&amp;lt;/code&amp;gt; || Creates, interprets, or defines a rule. Normative or quasi-normative content. || Not a resolution of a specific dispute. || Statute, regulation, decree, circular, directive, fatwa, ministerial order, regulatory handbook&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;decision&amp;lt;/code&amp;gt; || Resolves a specific dispute or case. Issued by a court or quasi-judicial body. || Not a general rule, even if it sets precedent. || Judgment, ruling, order, arbitral award, AG opinion&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;record&amp;lt;/code&amp;gt; || Factual registration in an official registry. || Not normative, not adjudicative. || Company filing, trademark registration, patent, land title, birth certificate&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;notice&amp;lt;/code&amp;gt; || Official announcement or publication. Time-bound, informational. || Not normative long-term. || Gazette entry, public consultation, tender, regulatory announcement&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;section&amp;lt;/code&amp;gt; || Structural subdivision of another document. Has a &amp;lt;code&amp;gt;parent_id&amp;lt;/code&amp;gt;. || Not a standalone document. || Part, title, chapter, article, schedule, annex&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;chunk&amp;lt;/code&amp;gt; || Processing artifact. A fragment of a document created for search or embedding. || Not an editorial unit. || Paragraph-level split for RAG, embedding chunk&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Disambiguation rule ===&lt;br /&gt;
&lt;br /&gt;
When a document is ambiguous:&lt;br /&gt;
&lt;br /&gt;
# Does it resolve a specific dispute between parties? -&amp;gt; &amp;lt;code&amp;gt;decision&amp;lt;/code&amp;gt;&lt;br /&gt;
# Does it create, interpret, or define a general rule? -&amp;gt; &amp;lt;code&amp;gt;legislation&amp;lt;/code&amp;gt;&lt;br /&gt;
# Still ambiguous? -&amp;gt; &amp;lt;code&amp;gt;legislation&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The legal category goes in &amp;lt;code&amp;gt;tags.type&amp;lt;/code&amp;gt; (e.g., &amp;lt;code&amp;gt;&amp;quot;type&amp;quot;: &amp;quot;sumula_vinculante&amp;quot;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;quot;type&amp;quot;: &amp;quot;tesis_jurisprudencial&amp;quot;&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
=== Stress-test: ambiguous documents across jurisdictions ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Document !! Jurisdiction !! Kind !! Rationale&lt;br /&gt;
|-&lt;br /&gt;
| Sumula vinculante || BR || &amp;lt;code&amp;gt;legislation&amp;lt;/code&amp;gt; || Binding precedent abstract, creates a general rule. Not resolving a specific dispute.&lt;br /&gt;
|-&lt;br /&gt;
| Tesis jurisprudencial || MX || &amp;lt;code&amp;gt;legislation&amp;lt;/code&amp;gt; || Abstracted legal thesis from repeated rulings. General rule, not a specific dispute.&lt;br /&gt;
|-&lt;br /&gt;
| Judicial interpretation (司法解释) || CN || &amp;lt;code&amp;gt;legislation&amp;lt;/code&amp;gt; || Supreme People&amp;#039;s Court quasi-legislation. Creates binding rules of general application.&lt;br /&gt;
|-&lt;br /&gt;
| Dictamen CGR || CL || &amp;lt;code&amp;gt;legislation&amp;lt;/code&amp;gt; || Comptroller General opinion. Interprets administrative law generally.&lt;br /&gt;
|-&lt;br /&gt;
| AG Opinion (CJEU) || EU || &amp;lt;code&amp;gt;decision&amp;lt;/code&amp;gt; || Issued in the context of a specific case, advises on its resolution.&lt;br /&gt;
|-&lt;br /&gt;
| FCA Handbook || GB || &amp;lt;code&amp;gt;legislation&amp;lt;/code&amp;gt; || Financial Conduct Authority regulatory rules. Normative, not case-specific.&lt;br /&gt;
|-&lt;br /&gt;
| Fatwa || SA || &amp;lt;code&amp;gt;legislation&amp;lt;/code&amp;gt; || Religious-legal ruling of general application. Interprets Islamic law.&lt;br /&gt;
|-&lt;br /&gt;
| Administrative guidance (通達 tsutatsu) || JP || &amp;lt;code&amp;gt;legislation&amp;lt;/code&amp;gt; || Ministry directive to subordinate agencies. General rule, not dispute resolution.&lt;br /&gt;
|-&lt;br /&gt;
| Restatement section || US || &amp;lt;code&amp;gt;legislation&amp;lt;/code&amp;gt; || Scholarly synthesis of common law rules. General rule formulation.&lt;br /&gt;
|-&lt;br /&gt;
| Grundsatzentscheidung || DE || &amp;lt;code&amp;gt;decision&amp;lt;/code&amp;gt; || Federal Court principle decision. Resolves a specific case, even if it sets precedent.&lt;br /&gt;
|-&lt;br /&gt;
| Arret de principe || FR || &amp;lt;code&amp;gt;decision&amp;lt;/code&amp;gt; || Cour de cassation principle ruling. Resolves a specific dispute.&lt;br /&gt;
|-&lt;br /&gt;
| Sentenza interpretativa di rigetto || IT || &amp;lt;code&amp;gt;decision&amp;lt;/code&amp;gt; || Constitutional Court interpretive rejection. Resolves a specific constitutional question.&lt;br /&gt;
|-&lt;br /&gt;
| Advisory Opinion (ICJ) || INT || &amp;lt;code&amp;gt;decision&amp;lt;/code&amp;gt; || Issued on a specific question referred by a UN organ.&lt;br /&gt;
|-&lt;br /&gt;
| Pleno no jurisdiccional || ES || &amp;lt;code&amp;gt;decision&amp;lt;/code&amp;gt; || Supreme Court plenary agreement. Resolves doctrinal conflict arising from cases.&lt;br /&gt;
|-&lt;br /&gt;
| Bepaling van algemene strekking || NL || &amp;lt;code&amp;gt;legislation&amp;lt;/code&amp;gt; || General binding regulation. Normative, not case resolution.&lt;br /&gt;
|-&lt;br /&gt;
| Constitutional Court communique || TR || &amp;lt;code&amp;gt;legislation&amp;lt;/code&amp;gt; || Press release summarizing a decision. Informational/normative summary.&lt;br /&gt;
|-&lt;br /&gt;
| Practice Direction || GB || &amp;lt;code&amp;gt;legislation&amp;lt;/code&amp;gt; || Court-issued procedural rules. General application.&lt;br /&gt;
|-&lt;br /&gt;
| Reglement grand-ducal || LU || &amp;lt;code&amp;gt;legislation&amp;lt;/code&amp;gt; || Grand-ducal regulation. Normative.&lt;br /&gt;
|-&lt;br /&gt;
| Acordao vinculante STF || BR || &amp;lt;code&amp;gt;decision&amp;lt;/code&amp;gt; || Binding Supreme Court judgment. Resolves a specific case.&lt;br /&gt;
|-&lt;br /&gt;
| Royal Decree (مرسوم ملكي) || SA || &amp;lt;code&amp;gt;legislation&amp;lt;/code&amp;gt; || Royal legislative act. Creates general rules.&lt;br /&gt;
|-&lt;br /&gt;
| Verfassungsbeschwerde decision || DE || &amp;lt;code&amp;gt;decision&amp;lt;/code&amp;gt; || Constitutional complaint resolution. Specific dispute.&lt;br /&gt;
|-&lt;br /&gt;
| Recurso extraordinario || BR || &amp;lt;code&amp;gt;decision&amp;lt;/code&amp;gt; || Extraordinary appeal. Resolves a specific case.&lt;br /&gt;
|-&lt;br /&gt;
| EU Regulation || EU || &amp;lt;code&amp;gt;legislation&amp;lt;/code&amp;gt; || Directly applicable legislation. General normative act.&lt;br /&gt;
|-&lt;br /&gt;
| OHADA Uniform Act || INT || &amp;lt;code&amp;gt;legislation&amp;lt;/code&amp;gt; || Harmonized commercial law. General normative act.&lt;br /&gt;
|-&lt;br /&gt;
| Tax ruling (rescrit) || FR || &amp;lt;code&amp;gt;legislation&amp;lt;/code&amp;gt; || Tax authority interpretation. General application (even if triggered by a specific request).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Benchmark results ==&lt;br /&gt;
&lt;br /&gt;
Measured on 3.4M rows, PostgreSQL 16, single-node, 16 GB RAM.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Query !! Corpus schema !! Previous 16-table schema !! Speedup&lt;br /&gt;
|-&lt;br /&gt;
| Tag filter + date range || 0.9 ms || — || B-tree scan, instant&lt;br /&gt;
|-&lt;br /&gt;
| FTS + tag filter (broad, 111K results) || 4.4 s || 31 s || 7x faster (BitmapAnd vs Seq Scan)&lt;br /&gt;
|-&lt;br /&gt;
| Tag-only + date || 1.4 ms || — || B-tree scan, instant&lt;br /&gt;
|-&lt;br /&gt;
| FTS narrow (17K results, warm) || 565 ms || — || Partial GIN index&lt;br /&gt;
|-&lt;br /&gt;
| Get by ID || 0.3 ms || 0.3 ms || PK lookup&lt;br /&gt;
|-&lt;br /&gt;
| Tag discovery (GROUP BY court, 3.4M rows) || 2.7 s || — || Seq scan — justifies tag_stats&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The FTS speedup comes from BitmapAnd of GIN (FTS) + GIN (tags) indexes. The previous schema used a Parallel Seq Scan because the planner could not combine B-tree (court column) with GIN (FTS) efficiently.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Operational notes ==&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;No FK on edges or parent_id.&amp;#039;&amp;#039;&amp;#039; Foreign keys on multi-million row tables with parallel ingestion from independent sources create ordering constraints and lock contention that outweigh referential safety. Orphan detection runs as a periodic batch job.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Partial GIN indexes per kind.&amp;#039;&amp;#039;&amp;#039; See the indexes section. Keeps FTS index sizes small, avoids partitioning complexity.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;WHERE IS DISTINCT FROM in upserts.&amp;#039;&amp;#039;&amp;#039; Use &amp;lt;code&amp;gt;IS DISTINCT FROM&amp;lt;/code&amp;gt; instead of &amp;lt;code&amp;gt;!=&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;ON CONFLICT ... DO UPDATE SET ... WHERE&amp;lt;/code&amp;gt; clauses. &amp;lt;code&amp;gt;!=&amp;lt;/code&amp;gt; returns NULL when comparing with NULL (and the row is not updated), while &amp;lt;code&amp;gt;IS DISTINCT FROM&amp;lt;/code&amp;gt; treats NULL as a comparable value. Critical for columns like &amp;lt;code&amp;gt;date_end&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;body_search&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;language&amp;lt;/code&amp;gt; that are frequently NULL.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Autovacuum tuning.&amp;#039;&amp;#039;&amp;#039; Set &amp;lt;code&amp;gt;autovacuum_vacuum_scale_factor = 0.01&amp;lt;/code&amp;gt; on &amp;lt;code&amp;gt;corpus.documents&amp;lt;/code&amp;gt;. The default (0.2) means autovacuum triggers after 20% of rows are dead -- on a 3.4M row table, that is 680K dead rows before cleanup. At 0.01, it triggers at 34K dead rows, keeping bloat and index performance under control.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Estimated counts at scale.&amp;#039;&amp;#039;&amp;#039; &amp;lt;code&amp;gt;COUNT(*) OVER()&amp;lt;/code&amp;gt; becomes expensive above 100M rows. Use &amp;lt;code&amp;gt;EXPLAIN&amp;lt;/code&amp;gt;-based row estimates or &amp;lt;code&amp;gt;pg_class.reltuples&amp;lt;/code&amp;gt; for approximate counts in paginated APIs. Exact counts only when explicitly requested.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;CJK full-text search.&amp;#039;&amp;#039;&amp;#039; PostgreSQL built-in FTS does not support Chinese, Japanese, or Korean tokenization. &amp;lt;code&amp;gt;content_fts&amp;lt;/code&amp;gt; is NULL for CJK documents. Use pgroonga (all three languages) or zhparser (Chinese only) as an extension. CJK search queries must use a different code path.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Partitioning at CN scale.&amp;#039;&amp;#039;&amp;#039; At 130M+ rows (realistic for a full Chinese legal corpus), partition &amp;lt;code&amp;gt;documents&amp;lt;/code&amp;gt; by &amp;lt;code&amp;gt;jurisdiction&amp;lt;/code&amp;gt;. This is the one case where partitioning is justified: queries almost always filter by jurisdiction, and partition pruning eliminates entire shards. The composite PK concern is manageable when partitioning by a column that is already always present in queries.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== corpus.source_metadata ==&lt;br /&gt;
&lt;br /&gt;
Tracks data sources, their static descriptive metadata, and dynamic statistics recomputed at the end of each ingest cycle.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
CREATE TABLE corpus.source_metadata (&lt;br /&gt;
    source_key             text PRIMARY KEY,&lt;br /&gt;
    parent_source_key      text,&lt;br /&gt;
    jurisdiction           text NOT NULL,&lt;br /&gt;
    name                   text NOT NULL,&lt;br /&gt;
    description            text NOT NULL,&lt;br /&gt;
    kind                   text NOT NULL DEFAULT &amp;#039;legislation&amp;#039;,&lt;br /&gt;
    publisher              text NOT NULL,&lt;br /&gt;
    publisher_url          text NOT NULL,&lt;br /&gt;
    license                text NOT NULL,&lt;br /&gt;
    license_url            text NOT NULL,&lt;br /&gt;
    language               text NOT NULL DEFAULT &amp;#039;fr&amp;#039;,&lt;br /&gt;
    coverage_start_year    integer,&lt;br /&gt;
    document_count         integer,&lt;br /&gt;
    freshest_document_date date,&lt;br /&gt;
    last_file              text,&lt;br /&gt;
    source_updated         date,&lt;br /&gt;
    ingested_at            timestamptz&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Used by the MCP server (guidelines, data freshness display) and the portal. Sub-sources (e.g., &amp;lt;code&amp;gt;bodacc_pcl&amp;lt;/code&amp;gt;) have &amp;lt;code&amp;gt;parent_source_key&amp;lt;/code&amp;gt; set.&lt;br /&gt;
&lt;br /&gt;
=== Static vs dynamic columns ===&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Static&amp;#039;&amp;#039;&amp;#039; (written by &amp;lt;code&amp;gt;sync_source_registry()&amp;lt;/code&amp;gt; at init from &amp;lt;code&amp;gt;SOURCE_REGISTRY&amp;lt;/code&amp;gt;): &amp;lt;code&amp;gt;source_key&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;parent_source_key&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;jurisdiction&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;description&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;kind&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;publisher&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;publisher_url&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;license&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;license_url&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;language&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Dynamic&amp;#039;&amp;#039;&amp;#039; (written by &amp;lt;code&amp;gt;refresh_corpus_stats()&amp;lt;/code&amp;gt; at the end of each ingest cycle, including the dedup steps inside &amp;lt;code&amp;gt;run_post_ingest()&amp;lt;/code&amp;gt;): &amp;lt;code&amp;gt;coverage_start_year&amp;lt;/code&amp;gt; (= &amp;lt;code&amp;gt;MIN(date)&amp;lt;/code&amp;gt; per source), &amp;lt;code&amp;gt;document_count&amp;lt;/code&amp;gt; (= &amp;lt;code&amp;gt;COUNT(*)&amp;lt;/code&amp;gt; per source), &amp;lt;code&amp;gt;freshest_document_date&amp;lt;/code&amp;gt; (= &amp;lt;code&amp;gt;MAX(date)&amp;lt;/code&amp;gt; per source). Top-level parent rows that have sub-sources are populated by a SUM/MIN/MAX rollup over their children.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Operational&amp;#039;&amp;#039;&amp;#039; (written by &amp;lt;code&amp;gt;state.set_ingest_state()&amp;lt;/code&amp;gt; per ingest run): &amp;lt;code&amp;gt;last_file&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;source_updated&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ingested_at&amp;lt;/code&amp;gt;. These track pipeline state, not content state, and are not displayed in MCP responses.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sync_source_registry()&amp;lt;/code&amp;gt; MUST NOT touch dynamic columns — they would be reset to NULL on every init. The INSERT and &amp;lt;code&amp;gt;ON CONFLICT DO UPDATE SET&amp;lt;/code&amp;gt; clauses only list static columns.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Required PostgreSQL extensions ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
CREATE EXTENSION IF NOT EXISTS unaccent;    -- accent-insensitive FTS&lt;br /&gt;
-- Optional (for CJK jurisdictions):&lt;br /&gt;
-- CREATE EXTENSION IF NOT EXISTS pgroonga;  -- CJK full-text search&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Complete DDL execution order ==&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;code&amp;gt;CREATE SCHEMA corpus;&amp;lt;/code&amp;gt;&lt;br /&gt;
# &amp;lt;code&amp;gt;CREATE EXTENSION IF NOT EXISTS unaccent;&amp;lt;/code&amp;gt;&lt;br /&gt;
# &amp;lt;code&amp;gt;CREATE TABLE corpus.documents (...);&amp;lt;/code&amp;gt; (14 columns)&lt;br /&gt;
# &amp;lt;code&amp;gt;CREATE TABLE corpus.edges (...);&amp;lt;/code&amp;gt;&lt;br /&gt;
# &amp;lt;code&amp;gt;CREATE TABLE corpus.tag_stats (...);&amp;lt;/code&amp;gt;&lt;br /&gt;
# &amp;lt;code&amp;gt;CREATE TABLE corpus.source_metadata (...);&amp;lt;/code&amp;gt;&lt;br /&gt;
# &amp;lt;code&amp;gt;CREATE FUNCTION corpus.normalize_for_fts(...);&amp;lt;/code&amp;gt; (see [[Corpus/FTS|FTS]])&lt;br /&gt;
# &amp;lt;code&amp;gt;CREATE FUNCTION corpus.update_content_fts(...);&amp;lt;/code&amp;gt; (see [[Corpus/FTS|FTS]])&lt;br /&gt;
# &amp;lt;code&amp;gt;CREATE TRIGGER trg_content_fts ...;&amp;lt;/code&amp;gt;&lt;br /&gt;
# All indexes (B-tree, GIN, partial GIN)&lt;br /&gt;
# &amp;lt;code&amp;gt;ANALYZE corpus.documents;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For the graph schema (future): &amp;lt;code&amp;gt;CREATE SCHEMA graph;&amp;lt;/code&amp;gt; + tables from [[Corpus/Graph|GRAPH]].&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== ID format convention ==&lt;br /&gt;
&lt;br /&gt;
Document IDs use source-native identifiers, always &amp;#039;&amp;#039;&amp;#039;lowercase&amp;#039;&amp;#039;&amp;#039;. Rules:&lt;br /&gt;
&lt;br /&gt;
* All document IDs carry a lowercase jurisdiction prefix: &amp;lt;code&amp;gt;{jurisdiction}.{source_id}&amp;lt;/code&amp;gt; (e.g., &amp;lt;code&amp;gt;fr.legiarti000006902764&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;fr.juritext000041701651&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;fr.cetatext000046783006&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;eu.eurlextext32016r0679&amp;lt;/code&amp;gt;).&lt;br /&gt;
* Identifiers with built-in jurisdiction context (ECLI:*, CELEX:*, [year] UKSC) may omit the prefix.&lt;br /&gt;
* For non-legal registries where the source ID could collide, use &amp;lt;code&amp;gt;{jurisdiction}.{source}.&amp;lt;/code&amp;gt; (e.g., &amp;lt;code&amp;gt;fr.company.443061841&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;gb.company.12345678&amp;lt;/code&amp;gt;).&lt;br /&gt;
* Decision: the ingest plugin author determines the prefix format, documented in the plugin&amp;#039;s tag schema.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Bidirectional edges convention ==&lt;br /&gt;
&lt;br /&gt;
Some edge types are logically bidirectional (&amp;lt;code&amp;gt;language_variant&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;corresponds_to&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;associated_text&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;joined_with&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;pilot_follower&amp;lt;/code&amp;gt;). The convention:&lt;br /&gt;
&lt;br /&gt;
* Store ONE edge, not two.&lt;br /&gt;
* Pick a canonical direction (alphabetical by source_id, or the &amp;quot;primary&amp;quot; document in the pair).&lt;br /&gt;
* Queries for bidirectional edges check both directions: &amp;lt;code&amp;gt;WHERE (source_id = X OR target_id = X) AND kind = &amp;#039;language_variant&amp;#039;&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Jurisdiction subdivision mapping in FTS trigger ==&lt;br /&gt;
&lt;br /&gt;
The trigger resolves language from &amp;lt;code&amp;gt;coalesce(language, jurisdiction)&amp;lt;/code&amp;gt;. For subdivision jurisdictions like &amp;lt;code&amp;gt;gb-sct&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;es-ct&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;de-by&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
* If &amp;lt;code&amp;gt;language&amp;lt;/code&amp;gt; is set (recommended for subdivisions), it is used directly.&lt;br /&gt;
* If &amp;lt;code&amp;gt;language&amp;lt;/code&amp;gt; is NULL, the trigger extracts the country prefix: &amp;lt;code&amp;gt;split_part(jurisdiction, &amp;#039;-&amp;#039;, 1)&amp;lt;/code&amp;gt; → &amp;lt;code&amp;gt;gb&amp;lt;/code&amp;gt;. Since &amp;lt;code&amp;gt;gb&amp;lt;/code&amp;gt; is not a language code in the mapping (the mapping uses ISO 639-1 codes like &amp;lt;code&amp;gt;en&amp;lt;/code&amp;gt;), it falls through to &amp;lt;code&amp;gt;simple&amp;lt;/code&amp;gt;. Set &amp;lt;code&amp;gt;language = &amp;#039;en&amp;#039;&amp;lt;/code&amp;gt; explicitly for English-language jurisdictions like &amp;lt;code&amp;gt;gb&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;gb-sct&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;us&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
This extraction is in the FTS trigger code (see [[Corpus/FTS|FTS]]).&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Migration strategy ==&lt;br /&gt;
&lt;br /&gt;
Migration from the current 16-table schema is incremental and reversible:&lt;br /&gt;
&lt;br /&gt;
# Create &amp;lt;code&amp;gt;corpus.*&amp;lt;/code&amp;gt; tables alongside existing tables (coexistence).&lt;br /&gt;
# Migrate one kind at a time with SQL INSERT...SELECT scripts (decision first — largest and most exercised).&lt;br /&gt;
# Benchmark each migrated kind against the equivalent old-table queries.&lt;br /&gt;
# Adapt the MCP server to read from &amp;lt;code&amp;gt;corpus.documents&amp;lt;/code&amp;gt; (dual-read during transition).&lt;br /&gt;
# Switch MCP tools one by one (search first, then get, then browse).&lt;br /&gt;
# When all tools read from &amp;lt;code&amp;gt;corpus.*&amp;lt;/code&amp;gt;, drop old tables.&lt;br /&gt;
# Migrate &amp;lt;code&amp;gt;citations&amp;lt;/code&amp;gt; → &amp;lt;code&amp;gt;corpus.edges&amp;lt;/code&amp;gt; (same process).&lt;br /&gt;
# Refresh &amp;lt;code&amp;gt;corpus.tag_stats&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Rollback: during coexistence, the old tables are still the source of truth. If migration fails, revert MCP to old tables.&lt;br /&gt;
&lt;br /&gt;
[[Category:Corpus]]&lt;/div&gt;</description>
			<pubDate>Thu, 23 Apr 2026 02:05:28 GMT</pubDate>
			<dc:creator>Nicolas</dc:creator>
			<comments>https://wiki.dura-lex.org/index.php/Talk:Corpus/Schema</comments>
		</item>
		<item>
			<title>MCP/Tools</title>
			<link>https://wiki.dura-lex.org/index.php?title=MCP/Tools&amp;diff=39&amp;oldid=0</link>
			<guid isPermaLink="false">https://wiki.dura-lex.org/index.php?title=MCP/Tools&amp;diff=39&amp;oldid=0</guid>
			<description>&lt;p&gt;Create MCP/Tools page from MCP-TOOLS.md (via create-page on MediaWiki MCP Server)&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;= MCP Tools =&lt;br /&gt;
&lt;br /&gt;
Dura Lex exposes 5 MCP tools. All are jurisdiction-agnostic. Jurisdiction plugins provide tag schemas, formatters, and reference resolvers — not tools.&lt;br /&gt;
&lt;br /&gt;
== search ==&lt;br /&gt;
&lt;br /&gt;
Search the corpus with full-text search, tag filters, and faceted discovery.&lt;br /&gt;
ALL filters go in the &amp;lt;code&amp;gt;tags&amp;lt;/code&amp;gt; parameter. Tag values support Overpass QL-inspired&lt;br /&gt;
operators (see Tag filter operators below).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
search(&lt;br /&gt;
    language:               str              # REQUIRED — ISO 639-1 (fr, en, de, ar...)&lt;br /&gt;
    query:                  str | None       # FTS query (websearch syntax: AND, OR, &amp;quot;phrase&amp;quot;, -exclude)&lt;br /&gt;
    tags:                   dict | None      # ALL filters — kind, jurisdiction, source, court, etc.&lt;br /&gt;
    edges:                  dict | None      # Edge filters — key=edge kind, value=target document ID&lt;br /&gt;
    discover:               str | None       # tag key to discover values for, or &amp;quot;*&amp;quot; for available keys&lt;br /&gt;
    at_date:                str | None       # historical date (YYYY-MM-DD) — versions in force at that date&lt;br /&gt;
    date_from:              str | None       # minimum date (YYYY-MM-DD)&lt;br /&gt;
    date_to:                str | None       # maximum date (YYYY-MM-DD)&lt;br /&gt;
    should_expand_synonyms: bool = true      # expand query with legal synonyms&lt;br /&gt;
    limit:                  int = 20         # results per page (max 100)&lt;br /&gt;
    offset:                 int = 0          # pagination offset&lt;br /&gt;
)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Tag filter operators (Overpass QL-inspired) ===&lt;br /&gt;
&lt;br /&gt;
Tag values support these operators:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;&amp;quot;value&amp;quot;&amp;lt;/code&amp;gt; — exact match (default)&lt;br /&gt;
* &amp;lt;code&amp;gt;&amp;quot;!=value&amp;quot;&amp;lt;/code&amp;gt; — negation: key exists, value differs&lt;br /&gt;
* &amp;lt;code&amp;gt;&amp;quot;val1|val2&amp;quot;&amp;lt;/code&amp;gt; — any of (OR)&lt;br /&gt;
* &amp;lt;code&amp;gt;&amp;quot;!=val1|val2&amp;quot;&amp;lt;/code&amp;gt; — none of (negated OR)&lt;br /&gt;
* &amp;lt;code&amp;gt;&amp;quot;*&amp;quot;&amp;lt;/code&amp;gt; — key exists (any value)&lt;br /&gt;
* &amp;lt;code&amp;gt;&amp;quot;!*&amp;quot;&amp;lt;/code&amp;gt; — key absent&lt;br /&gt;
&lt;br /&gt;
=== Virtual tag keys (promoted columns filterable as tags) ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;kind&amp;lt;/code&amp;gt;: &amp;lt;code&amp;gt;legislation&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;decision&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;record&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;notice&amp;lt;/code&amp;gt;. Operators: &amp;lt;code&amp;gt;&amp;quot;legislation|decision&amp;quot;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;quot;!=record&amp;quot;&amp;lt;/code&amp;gt;. Drives the fan-out UNION ALL query.&lt;br /&gt;
* &amp;lt;code&amp;gt;jurisdiction&amp;lt;/code&amp;gt; (REQUIRED): ISO code. Subdivision-aware: &amp;lt;code&amp;gt;&amp;quot;fr&amp;quot;&amp;lt;/code&amp;gt; matches &amp;lt;code&amp;gt;fr&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;fr-alsace&amp;lt;/code&amp;gt;. Multi: &amp;lt;code&amp;gt;&amp;quot;eu|fr&amp;quot;&amp;lt;/code&amp;gt;. Wildcard: &amp;lt;code&amp;gt;&amp;quot;*&amp;quot;&amp;lt;/code&amp;gt; (no filter). Negation: &amp;lt;code&amp;gt;&amp;quot;!=eu&amp;quot;&amp;lt;/code&amp;gt;. &amp;#039;&amp;#039;&amp;#039;Omitting &amp;lt;code&amp;gt;tags[&amp;quot;jurisdiction&amp;quot;]&amp;lt;/code&amp;gt; raises a ToolError&amp;#039;&amp;#039;&amp;#039; — the LLM must always be explicit about jurisdiction scope.&lt;br /&gt;
* &amp;lt;code&amp;gt;source&amp;lt;/code&amp;gt;: data source. &amp;lt;code&amp;gt;&amp;quot;legi&amp;quot;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;quot;cass&amp;quot;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;quot;acco&amp;quot;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;quot;kali&amp;quot;&amp;lt;/code&amp;gt;... Exclusion: &amp;lt;code&amp;gt;&amp;quot;!=acco|kali&amp;quot;&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;language&amp;lt;/code&amp;gt;: overrides the auto-filter from the &amp;lt;code&amp;gt;language&amp;lt;/code&amp;gt; parameter. &amp;lt;code&amp;gt;&amp;quot;fr|en&amp;quot;&amp;lt;/code&amp;gt; returns French AND English.&lt;br /&gt;
&lt;br /&gt;
=== Primary tag filters (T1) ===&lt;br /&gt;
&lt;br /&gt;
T1 tags (cross-jurisdiction enums, documented in TAG-CONVENTIONS.md) are the intended primary search filters — stable English vocabularies, safe to use regardless of jurisdiction: &amp;lt;code&amp;gt;type&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;document_form&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;court_level&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;enforcement_status&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;importance_level&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;formation_solemnity&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;content_quality&amp;lt;/code&amp;gt;. For jurisdiction-local precision, fall back to T2/T3 keys (e.g. FR &amp;lt;code&amp;gt;nature&amp;lt;/code&amp;gt;) — see &amp;lt;code&amp;gt;spec/TAG-CONVENTIONS.md&amp;lt;/code&amp;gt; and the per-plugin tag references.&lt;br /&gt;
&lt;br /&gt;
=== Edge filters ===&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;edges&amp;lt;/code&amp;gt; parameter filters documents by their relationships to other&lt;br /&gt;
documents. Key = edge kind (from EDGE-TYPES.md), value = target document ID.&lt;br /&gt;
Semantics: return documents that have an outgoing edge of this kind to this&lt;br /&gt;
target.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Syntax !! Semantics&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;quot;cites&amp;quot;: &amp;quot;id1&amp;quot;&amp;lt;/code&amp;gt; || cites id1&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;quot;cites&amp;quot;: &amp;quot;id1&amp;amp;#124;id2&amp;quot;&amp;lt;/code&amp;gt; || cites id1 OR id2&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;quot;cites&amp;quot;: &amp;quot;id1&amp;amp;id2&amp;quot;&amp;lt;/code&amp;gt; || cites id1 AND id2&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;quot;cites&amp;quot;: &amp;quot;id1&amp;quot;, &amp;quot;amends&amp;quot;: &amp;quot;id2&amp;quot;&amp;lt;/code&amp;gt; || cites id1 AND amends id2&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;quot;*&amp;quot;: &amp;quot;id1&amp;quot;&amp;lt;/code&amp;gt; || any edge kind to id1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Edge filters compose with all other search parameters (query, tags, dates,&lt;br /&gt;
pagination). The &amp;lt;code&amp;gt;edges&amp;lt;/code&amp;gt; parameter is separate from &amp;lt;code&amp;gt;tags&amp;lt;/code&amp;gt; because edges are&lt;br /&gt;
relationships between documents, not intrinsic properties.&lt;br /&gt;
&lt;br /&gt;
=== Searchable kinds ===&lt;br /&gt;
&lt;br /&gt;
The search tool only accepts &amp;lt;code&amp;gt;legislation&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;decision&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;record&amp;lt;/code&amp;gt;, and &amp;lt;code&amp;gt;notice&amp;lt;/code&amp;gt; as &amp;lt;code&amp;gt;kind&amp;lt;/code&amp;gt; values. &amp;lt;code&amp;gt;section&amp;lt;/code&amp;gt; (navigated via &amp;lt;code&amp;gt;browse_structure&amp;lt;/code&amp;gt;) and &amp;lt;code&amp;gt;chunk&amp;lt;/code&amp;gt; (processing artifact) are valid document kinds in the corpus but are filtered out of search.&lt;br /&gt;
&lt;br /&gt;
=== Modes ===&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Search mode&amp;#039;&amp;#039;&amp;#039; (query and/or tags provided): FTS + tag filters + date range. Returns ranked results with snippets.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Browse mode&amp;#039;&amp;#039;&amp;#039; (tags only, no query): returns documents matching tag filters, ordered by date descending.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Discover mode&amp;#039;&amp;#039;&amp;#039; (discover parameter set): returns distinct values for the given tag key from &amp;lt;code&amp;gt;tag_stats&amp;lt;/code&amp;gt;. Use &amp;lt;code&amp;gt;discover=&amp;quot;*&amp;quot;&amp;lt;/code&amp;gt; to list all available tag keys. Use &amp;lt;code&amp;gt;discover=&amp;quot;edge_kinds&amp;quot;&amp;lt;/code&amp;gt; to list available edge kinds.&lt;br /&gt;
&lt;br /&gt;
=== Examples ===&lt;br /&gt;
&lt;br /&gt;
All examples pass &amp;lt;code&amp;gt;tags[&amp;quot;jurisdiction&amp;quot;]&amp;lt;/code&amp;gt; (REQUIRED).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
search(language=&amp;quot;fr&amp;quot;, query=&amp;quot;responsabilite civile&amp;quot;, tags={&amp;quot;jurisdiction&amp;quot;: &amp;quot;fr&amp;quot;, &amp;quot;kind&amp;quot;: &amp;quot;decision&amp;quot;, &amp;quot;court&amp;quot;: &amp;quot;cassation&amp;quot;})&lt;br /&gt;
search(language=&amp;quot;fr&amp;quot;, tags={&amp;quot;jurisdiction&amp;quot;: &amp;quot;fr&amp;quot;, &amp;quot;kind&amp;quot;: &amp;quot;legislation&amp;quot;, &amp;quot;type&amp;quot;: &amp;quot;collective_agreement&amp;quot;, &amp;quot;idcc&amp;quot;: &amp;quot;3239&amp;quot;})&lt;br /&gt;
search(language=&amp;quot;fr&amp;quot;, tags={&amp;quot;jurisdiction&amp;quot;: &amp;quot;fr&amp;quot;, &amp;quot;kind&amp;quot;: &amp;quot;legislation&amp;quot;, &amp;quot;source&amp;quot;: &amp;quot;acco&amp;quot;, &amp;quot;type&amp;quot;: &amp;quot;collective_agreement&amp;quot;})&lt;br /&gt;
search(language=&amp;quot;fr&amp;quot;, tags={&amp;quot;jurisdiction&amp;quot;: &amp;quot;fr&amp;quot;, &amp;quot;kind&amp;quot;: &amp;quot;decision&amp;quot;}, discover=&amp;quot;court&amp;quot;)&lt;br /&gt;
search(language=&amp;quot;fr&amp;quot;, discover=&amp;quot;*&amp;quot;, tags={&amp;quot;jurisdiction&amp;quot;: &amp;quot;fr&amp;quot;, &amp;quot;kind&amp;quot;: &amp;quot;decision&amp;quot;})&lt;br /&gt;
search(language=&amp;quot;fr&amp;quot;, query=&amp;quot;article 1240&amp;quot;, tags={&amp;quot;jurisdiction&amp;quot;: &amp;quot;fr&amp;quot;, &amp;quot;kind&amp;quot;: &amp;quot;legislation&amp;quot;}, at_date=&amp;quot;2015-06-15&amp;quot;)&lt;br /&gt;
search(language=&amp;quot;fr&amp;quot;, tags={&amp;quot;jurisdiction&amp;quot;: &amp;quot;fr&amp;quot;, &amp;quot;kind&amp;quot;: &amp;quot;decision&amp;quot;, &amp;quot;importance_level&amp;quot;: &amp;quot;highest_importance&amp;quot;})&lt;br /&gt;
search(language=&amp;quot;fr&amp;quot;, tags={&amp;quot;jurisdiction&amp;quot;: &amp;quot;fr&amp;quot;, &amp;quot;kind&amp;quot;: &amp;quot;decision&amp;quot;, &amp;quot;official_grade&amp;quot;: &amp;quot;A&amp;quot;})&lt;br /&gt;
search(language=&amp;quot;fr&amp;quot;, tags={&amp;quot;jurisdiction&amp;quot;: &amp;quot;eu|fr&amp;quot;, &amp;quot;kind&amp;quot;: &amp;quot;decision&amp;quot;, &amp;quot;court_level&amp;quot;: &amp;quot;supreme|supranational&amp;quot;})  # apex-court rulings only&lt;br /&gt;
&lt;br /&gt;
# Overpass QL operators&lt;br /&gt;
search(language=&amp;quot;fr&amp;quot;, tags={&amp;quot;jurisdiction&amp;quot;: &amp;quot;fr&amp;quot;, &amp;quot;kind&amp;quot;: &amp;quot;legislation&amp;quot;, &amp;quot;source&amp;quot;: &amp;quot;!=acco|kali&amp;quot;})  # exclude conventions&lt;br /&gt;
search(language=&amp;quot;fr&amp;quot;, tags={&amp;quot;jurisdiction&amp;quot;: &amp;quot;eu|fr&amp;quot;, &amp;quot;kind&amp;quot;: &amp;quot;legislation|decision&amp;quot;})  # multi-kind, multi-jurisdiction&lt;br /&gt;
search(language=&amp;quot;fr&amp;quot;, tags={&amp;quot;jurisdiction&amp;quot;: &amp;quot;*&amp;quot;, &amp;quot;kind&amp;quot;: &amp;quot;decision&amp;quot;, &amp;quot;official_grade&amp;quot;: &amp;quot;*&amp;quot;})  # all jurisdictions, only graded decisions&lt;br /&gt;
&lt;br /&gt;
# Edge filters&lt;br /&gt;
search(language=&amp;quot;fr&amp;quot;, tags={&amp;quot;jurisdiction&amp;quot;: &amp;quot;fr&amp;quot;, &amp;quot;kind&amp;quot;: &amp;quot;decision&amp;quot;}, edges={&amp;quot;cites&amp;quot;: &amp;quot;fr.legiarti000032041571&amp;quot;})  # decisions citing article 1240 code civil&lt;br /&gt;
search(language=&amp;quot;fr&amp;quot;, query=&amp;quot;preuve deloyale&amp;quot;, tags={&amp;quot;jurisdiction&amp;quot;: &amp;quot;fr&amp;quot;}, edges={&amp;quot;cites&amp;quot;: &amp;quot;fr.legiarti000032041571&amp;quot;})  # + FTS&lt;br /&gt;
search(language=&amp;quot;fr&amp;quot;, tags={&amp;quot;jurisdiction&amp;quot;: &amp;quot;fr&amp;quot;}, edges={&amp;quot;cites&amp;quot;: &amp;quot;fr.legiarti000032041571&amp;amp;fr.legiarti000006436298&amp;quot;})  # citing both articles&lt;br /&gt;
search(language=&amp;quot;fr&amp;quot;, tags={&amp;quot;jurisdiction&amp;quot;: &amp;quot;fr&amp;quot;}, edges={&amp;quot;*&amp;quot;: &amp;quot;fr.jorftext000032004539&amp;quot;})  # any relationship to this law&lt;br /&gt;
search(language=&amp;quot;fr&amp;quot;, tags={&amp;quot;jurisdiction&amp;quot;: &amp;quot;fr&amp;quot;}, discover=&amp;quot;edge_kinds&amp;quot;)  # list available edge kinds&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== get_document ==&lt;br /&gt;
&lt;br /&gt;
Retrieve a single document by ID or legal reference.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
get_document(&lt;br /&gt;
    reference:  str               # document ID or natural language reference&lt;br /&gt;
    language:   str               # REQUIRED — ISO 639-1 (fr, en, de...). Disambiguates language variants.&lt;br /&gt;
    highlight:  str | None        # select matching blocks (non-contiguous, ±1 context, capped at 40)&lt;br /&gt;
    blocks:     str | None        # block range for large documents (&amp;quot;30-50&amp;quot;)&lt;br /&gt;
    at_date:    str | None        # historical date (YYYY-MM-DD) — version in force at that date&lt;br /&gt;
)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The reference resolver (jurisdiction-specific) parses the reference into a TagQuery and executes it against the store. Falls back to direct ID lookup. For decisions, the output includes grade and formation display: &amp;lt;code&amp;gt;Grade : A — Publié au Recueil Lebon — highest_importance&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;Formation : Assemblée du contentieux (full_court)&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Examples ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
get_document(reference=&amp;quot;article 1240 du code civil&amp;quot;)&lt;br /&gt;
get_document(reference=&amp;quot;fr.juritext000041701651&amp;quot;, highlight=&amp;quot;preuve deloyale&amp;quot;)&lt;br /&gt;
get_document(reference=&amp;quot;[2024] UKSC 1&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== browse_structure ==&lt;br /&gt;
&lt;br /&gt;
Navigate hierarchical structure (table of contents of codes, conventions, doctrine).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
browse_structure(&lt;br /&gt;
    language:  str             # REQUIRED — filters the tree (not just labels)&lt;br /&gt;
    tags:      dict            # REQUIRED, must contain &amp;quot;jurisdiction&amp;quot;&lt;br /&gt;
    root_id:   str | None      # node ID to start from (NULL = top-level roots)&lt;br /&gt;
    depth:     int | None      # maximum tree depth (capped at 20 internally)&lt;br /&gt;
    limit:     int = 50        # max nodes returned per page&lt;br /&gt;
    offset:    int = 0         # pagination offset&lt;br /&gt;
)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;tags[&amp;quot;jurisdiction&amp;quot;]&amp;lt;/code&amp;gt; is REQUIRED — same syntax as &amp;lt;code&amp;gt;search&amp;lt;/code&amp;gt;: &amp;lt;code&amp;gt;&amp;quot;fr&amp;quot;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;quot;eu&amp;quot;&amp;lt;/code&amp;gt;,&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;quot;eu|fr&amp;quot;&amp;lt;/code&amp;gt; (combined), &amp;lt;code&amp;gt;&amp;quot;*&amp;quot;&amp;lt;/code&amp;gt; (all jurisdictions). Other tag filters&lt;br /&gt;
(e.g., &amp;lt;code&amp;gt;&amp;quot;structure_type&amp;quot;: &amp;quot;legislation&amp;quot;&amp;lt;/code&amp;gt;) are passed through as JSONB&lt;br /&gt;
containment filters.&lt;br /&gt;
&lt;br /&gt;
Operates on documents with &amp;lt;code&amp;gt;kind=section&amp;lt;/code&amp;gt;. Uses recursive CTE on &amp;lt;code&amp;gt;parent_id&amp;lt;/code&amp;gt;.&lt;br /&gt;
The jurisdiction and language filters are applied to BOTH the anchor and the&lt;br /&gt;
recursive part of the CTE so a parent&amp;#039;s children inherit the same scope (no&lt;br /&gt;
mixed-jurisdiction or mixed-language trees). Multi-jurisdiction uses&lt;br /&gt;
&amp;lt;code&amp;gt;s.jurisdiction = ANY(%(jurisdictions)s)&amp;lt;/code&amp;gt; in both anchor and recursive WHERE.&lt;br /&gt;
&lt;br /&gt;
== safety_guidelines ==&lt;br /&gt;
&lt;br /&gt;
Retrieve mandatory guidelines for legal research. Two-call workflow: &amp;lt;code&amp;gt;core&amp;lt;/code&amp;gt; once at session start, &amp;lt;code&amp;gt;jurisdiction&amp;lt;/code&amp;gt; per jurisdictional context.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
safety_guidelines(&lt;br /&gt;
    category:     str             # REQUIRED — &amp;quot;core&amp;quot; or &amp;quot;jurisdiction&amp;quot;&lt;br /&gt;
    jurisdiction: str | None      # REQUIRED iff category=&amp;quot;jurisdiction&amp;quot;; ignored (with warning) if category=&amp;quot;core&amp;quot;&lt;br /&gt;
)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Categories ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;&amp;quot;core&amp;quot;&amp;lt;/code&amp;gt;: foundational rules (8 non-negotiable, methodology, defensive posture, response format). Independent of jurisdiction. Called ONCE per session. Passing &amp;lt;code&amp;gt;jurisdiction&amp;lt;/code&amp;gt; is non-fatal: the parameter is ignored and a warning is prepended to the returned text instructing the LLM to make a separate &amp;lt;code&amp;gt;category=&amp;quot;jurisdiction&amp;quot;&amp;lt;/code&amp;gt; call.&lt;br /&gt;
* &amp;lt;code&amp;gt;&amp;quot;jurisdiction&amp;quot;&amp;lt;/code&amp;gt;: jurisdiction-specific rules + corpus provenance filtered by jurisdiction. Called when entering a jurisdictional research context. Supports the same Overpass QL syntax as &amp;lt;code&amp;gt;tags[&amp;quot;jurisdiction&amp;quot;]&amp;lt;/code&amp;gt;: &amp;lt;code&amp;gt;&amp;quot;fr&amp;quot;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;quot;eu&amp;quot;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;quot;eu|fr&amp;quot;&amp;lt;/code&amp;gt; (concatenated), &amp;lt;code&amp;gt;&amp;quot;*&amp;quot;&amp;lt;/code&amp;gt; (all jurisdictions), &amp;lt;code&amp;gt;&amp;quot;!=eu&amp;quot;&amp;lt;/code&amp;gt; (exclusion). The &amp;lt;code&amp;gt;&amp;quot;!*&amp;quot;&amp;lt;/code&amp;gt; operator is not allowed.&lt;br /&gt;
&lt;br /&gt;
Returns jurisdiction-specific guidance: citation rules, search strategy, authority hierarchy, data freshness, caveats.&lt;br /&gt;
&lt;br /&gt;
The plugin protocol (&amp;lt;code&amp;gt;get_guidelines() -&amp;gt; str&amp;lt;/code&amp;gt;) returns a single jurisdiction-scoped supplement; the core text lives in &amp;lt;code&amp;gt;duralex.mcp/core.md&amp;lt;/code&amp;gt; and is loaded by the MCP server, not by plugins.&lt;br /&gt;
&lt;br /&gt;
== quality_check ==&lt;br /&gt;
&lt;br /&gt;
Mandatory research debrief. Fire-and-forget. Two modes:&lt;br /&gt;
* &amp;lt;code&amp;gt;research&amp;lt;/code&amp;gt; — called ONCE per research sequence, at the END, before presenting the answer to the user. Captures the full research journey.&lt;br /&gt;
* &amp;lt;code&amp;gt;correction&amp;lt;/code&amp;gt; — called immediately when the model detects an error, or when the user signals one.&lt;br /&gt;
&lt;br /&gt;
PRIVACY: ABSOLUTE. Only technical and structural data. Never user facts, names, conversation content, or anything that could identify a party.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
quality_check(&lt;br /&gt;
    mode:               str          # &amp;quot;research&amp;quot; or &amp;quot;correction&amp;quot;&lt;br /&gt;
    model:              str          # LLM model identifier&lt;br /&gt;
    jurisdiction:       str | None   # jurisdiction(s) researched (fr, eu, eu|fr, *) — always include&lt;br /&gt;
&lt;br /&gt;
    # Research-mode fields&lt;br /&gt;
    queries_attempted:  list[str] | None    # legal-concept queries (no user facts)&lt;br /&gt;
    tools_sequence:     list[str] | None    # ordered tool calls (e.g. [&amp;quot;search&amp;quot;,&amp;quot;get_document&amp;quot;])&lt;br /&gt;
    documents_cited:    list[str] | None    # IDs of documents cited in the answer&lt;br /&gt;
    tags_used:          dict | None         # tag filters applied&lt;br /&gt;
    satisfaction:       str | None          # sufficient | partial | insufficient&lt;br /&gt;
    confidence:         str | None          # high | moderate | low&lt;br /&gt;
    gaps:               list[str] | None    # coverage gaps identified&lt;br /&gt;
    difficulties:       list[str] | None    # technical issues encountered&lt;br /&gt;
    concept:            str | None          # legal concept label for synonym groups&lt;br /&gt;
&lt;br /&gt;
    # Correction-mode fields&lt;br /&gt;
    error_type:         str | None          # fabricated_citation | wrong_jurisdiction&lt;br /&gt;
                                            # | repealed_law | misattribution&lt;br /&gt;
                                            # | temporal_error | wrong_article&lt;br /&gt;
                                            # | user_correction&lt;br /&gt;
    document_ids:       list[str] | None    # documents involved in the error&lt;br /&gt;
    detail:             str | None          # technical description (no user facts)&lt;br /&gt;
    severity:           str | None          # critical | important | minor&lt;br /&gt;
&lt;br /&gt;
    # Self-audit checklist (11 booleans, all default False)&lt;br /&gt;
    # Pure presence-of-string checks on the pending response / visible context.&lt;br /&gt;
    # Declared-true values trigger adaptive alerts tiered STOP / DANGER /&lt;br /&gt;
    # DRIFT / ATTENTION; the tool returns a structured block the model must&lt;br /&gt;
    # translate-and-relay to the user before emitting.&lt;br /&gt;
    context_contains_compaction_marker:                     bool&lt;br /&gt;
    response_self_references_previous_turn:                 bool&lt;br /&gt;
    response_contains_flattery:                             bool&lt;br /&gt;
    response_contains_prescriptive_legal_advice:            bool&lt;br /&gt;
    response_contains_outcome_prediction:                   bool&lt;br /&gt;
    response_contains_legal_assertion_verb:                 bool&lt;br /&gt;
    response_contains_hedge_marker:                         bool&lt;br /&gt;
    response_cites_document_without_verbatim_or_locator:    bool&lt;br /&gt;
    response_cites_document_without_permanent_link:         bool&lt;br /&gt;
    response_claims_settled_case_law:                       bool&lt;br /&gt;
    response_asserts_legal_absence_as_inexistence:          bool&lt;br /&gt;
    safety_guidelines_not_fully_loaded:                     bool&lt;br /&gt;
    safety_guidelines_distant_or_unclear:                   bool&lt;br /&gt;
)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The feedback server is schema-agnostic; the tool adds &amp;lt;code&amp;gt;&amp;quot;tool_name&amp;quot;: &amp;quot;quality_check&amp;quot;&amp;lt;/code&amp;gt; automatically so downstream JSONL analysis can distinguish quality_check payloads from older &amp;lt;code&amp;gt;report&amp;lt;/code&amp;gt; payloads.&lt;br /&gt;
&lt;br /&gt;
The 11 self-audit booleans and the computed &amp;lt;code&amp;gt;highest_alert_severity&amp;lt;/code&amp;gt; are persisted in the payload for forensic analysis of declaration rates per boolean. See ADR &amp;lt;code&amp;gt;2026-04-15-quality-check-self-audit-checklist&amp;lt;/code&amp;gt; for the full rationale and the alert-severity tiering.&lt;br /&gt;
&lt;br /&gt;
[[Category:MCP]]&lt;/div&gt;</description>
			<pubDate>Thu, 23 Apr 2026 02:05:18 GMT</pubDate>
			<dc:creator>Nicolas</dc:creator>
			<comments>https://wiki.dura-lex.org/index.php/Talk:MCP/Tools</comments>
		</item>
		<item>
			<title>Jurisdictions/FR</title>
			<link>https://wiki.dura-lex.org/index.php?title=Jurisdictions/FR&amp;diff=38&amp;oldid=0</link>
			<guid isPermaLink="false">https://wiki.dura-lex.org/index.php?title=Jurisdictions/FR&amp;diff=38&amp;oldid=0</guid>
			<description>&lt;p&gt;Create French jurisdiction reference page (via create-page on MediaWiki MCP Server)&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;= French Legal System =&lt;br /&gt;
&lt;br /&gt;
Jurisdiction code: &amp;lt;code&amp;gt;fr&amp;lt;/code&amp;gt;. Language: &amp;lt;code&amp;gt;fr&amp;lt;/code&amp;gt; (always required). Corpus size: 60M+ documents.&lt;br /&gt;
&lt;br /&gt;
== Court hierarchy ==&lt;br /&gt;
&lt;br /&gt;
France has four judicial orders: judicial (&amp;#039;&amp;#039;judiciaire&amp;#039;&amp;#039;), administrative (&amp;#039;&amp;#039;administratif&amp;#039;&amp;#039;), financial (&amp;#039;&amp;#039;financier&amp;#039;&amp;#039;), and constitutional (&amp;#039;&amp;#039;constitutionnel&amp;#039;&amp;#039;). Each has its own apex court.&lt;br /&gt;
&lt;br /&gt;
=== court_level mapping (T1 tag) ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
! court_level !! Court (court tag) !! Order !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;supreme&amp;lt;/code&amp;gt; || Cour de cassation (&amp;lt;code&amp;gt;cour_cassation&amp;lt;/code&amp;gt;) || Judicial || Controls law, not facts&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;supreme&amp;lt;/code&amp;gt; || Conseil d&amp;#039;Etat (&amp;lt;code&amp;gt;conseil_etat&amp;lt;/code&amp;gt;) || Administrative || Also government advisor (&amp;#039;&amp;#039;avis&amp;#039;&amp;#039; are not &amp;#039;&amp;#039;arrets&amp;#039;&amp;#039;)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;supreme&amp;lt;/code&amp;gt; || Cour des comptes (&amp;lt;code&amp;gt;cour_des_comptes&amp;lt;/code&amp;gt;) || Financial || Apex since 2023 reform; 1st instance (contentious chamber) + cassation over CAF&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;appellate&amp;lt;/code&amp;gt; || Cour d&amp;#039;appel (&amp;lt;code&amp;gt;cour_appel&amp;lt;/code&amp;gt;) || Judicial || Rejudges facts + law&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;appellate&amp;lt;/code&amp;gt; || Cour administrative d&amp;#039;appel (&amp;lt;code&amp;gt;cour_administrative_appel&amp;lt;/code&amp;gt;) || Administrative ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;appellate&amp;lt;/code&amp;gt; || Tribunal superieur d&amp;#039;appel (&amp;lt;code&amp;gt;tribunal_superieur_appel&amp;lt;/code&amp;gt;) || Judicial || Overseas territories&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;appellate&amp;lt;/code&amp;gt; || Cour d&amp;#039;appel financiere (&amp;lt;code&amp;gt;cour_appel_financiere&amp;lt;/code&amp;gt;) || Financial || Created 2023; appeals from CRC and CdC contentious chamber&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;first_instance&amp;lt;/code&amp;gt; || Tribunal judiciaire (&amp;lt;code&amp;gt;tribunal_judiciaire&amp;lt;/code&amp;gt;) || Judicial || General civil/criminal&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;first_instance&amp;lt;/code&amp;gt; || Conseil de prud&amp;#039;hommes (&amp;lt;code&amp;gt;conseil_prudhommes&amp;lt;/code&amp;gt;) || Judicial || Labor&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;first_instance&amp;lt;/code&amp;gt; || Tribunal de commerce (&amp;lt;code&amp;gt;tribunal_commerce&amp;lt;/code&amp;gt;) || Judicial || Commercial&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;first_instance&amp;lt;/code&amp;gt; || Tribunal administratif (&amp;lt;code&amp;gt;tribunal_administratif&amp;lt;/code&amp;gt;) || Administrative ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;first_instance&amp;lt;/code&amp;gt; || Chambre regionale des comptes (&amp;lt;code&amp;gt;chambre_regionale_des_comptes&amp;lt;/code&amp;gt;) || Financial || Local authorities&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;first_instance&amp;lt;/code&amp;gt; || Cour de discipline budgetaire et financiere (&amp;lt;code&amp;gt;cour_discipline_budgetaire_financiere&amp;lt;/code&amp;gt;) || Financial || Abolished 2023 (integrated into CdC); historical decisions 1954-2022&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;constitutional&amp;lt;/code&amp;gt; || Conseil constitutionnel (&amp;lt;code&amp;gt;conseil_constitutionnel&amp;lt;/code&amp;gt;) || Constitutional || QPC can invalidate provisions&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;null&amp;#039;&amp;#039; || Tribunal des conflits (&amp;lt;code&amp;gt;tribunal_conflits&amp;lt;/code&amp;gt;) || Sui generis || Arbitrates judicial vs. admin jurisdiction&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;null&amp;#039;&amp;#039; || CNIL (&amp;lt;code&amp;gt;cnil&amp;lt;/code&amp;gt;) || Independent authority || Data protection&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;null&amp;#039;&amp;#039; || CADA (&amp;lt;code&amp;gt;cada&amp;lt;/code&amp;gt;) || Independent authority || Access to admin documents&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Source-to-court mapping ===&lt;br /&gt;
&lt;br /&gt;
Multiple data sources cover overlapping courts. Always search by &amp;lt;code&amp;gt;court&amp;lt;/code&amp;gt; tag, not &amp;lt;code&amp;gt;source&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Source !! System !! Courts covered&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;cass&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;inca&amp;lt;/code&amp;gt; || Judicial || Cour de cassation&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;capp&amp;lt;/code&amp;gt; || Judicial || Cours d&amp;#039;appel&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;judilibre&amp;lt;/code&amp;gt; || Mixed || Cour de cassation + admin courts + cours d&amp;#039;appel (deduplicated)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;jade&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ce_opendata&amp;lt;/code&amp;gt; || Administrative || CE, CAA, TA, Tribunal des conflits&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;jufi&amp;lt;/code&amp;gt; || Financial || CdC, CRC, CDBF, CAF (~3,500 decisions, 1954-present)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;constit&amp;lt;/code&amp;gt; || Constitutional || Conseil constitutionnel&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;cnil&amp;lt;/code&amp;gt; || Independent authority || CNIL sanctions&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;cada&amp;lt;/code&amp;gt; || Independent authority || CADA opinions&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Financial order — 2023 reform ===&lt;br /&gt;
&lt;br /&gt;
Before 2023:&lt;br /&gt;
* Cour des comptes = appellate over CRC&lt;br /&gt;
* CDBF = separate disciplinary court&lt;br /&gt;
&lt;br /&gt;
After 2023:&lt;br /&gt;
* Cour des comptes = apex (supreme): contentious chamber (absorbed CDBF) + cassation over CAF&lt;br /&gt;
* Cour d&amp;#039;appel financiere (CAF) = new appellate court&lt;br /&gt;
* CRC = first instance (unchanged)&lt;br /&gt;
* CDBF = abolished, historical decisions remain searchable&lt;br /&gt;
&lt;br /&gt;
== Legislation types ==&lt;br /&gt;
&lt;br /&gt;
=== Normative hierarchy ===&lt;br /&gt;
&lt;br /&gt;
Constitution &amp;gt; treaties/EU law &amp;gt; &amp;#039;&amp;#039;loi&amp;#039;&amp;#039; &amp;gt; &amp;#039;&amp;#039;ordonnance ratifiee&amp;#039;&amp;#039; &amp;gt; &amp;#039;&amp;#039;decret&amp;#039;&amp;#039; &amp;gt; &amp;#039;&amp;#039;arrete&amp;#039;&amp;#039; &amp;gt; &amp;#039;&amp;#039;circulaire&amp;#039;&amp;#039; (not binding on courts)&lt;br /&gt;
&lt;br /&gt;
=== Text types ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Type !! Description !! Tag example&lt;br /&gt;
|-&lt;br /&gt;
| Code || Consolidated legislation organized by topic || &amp;lt;code&amp;gt;tags={&amp;quot;code&amp;quot;: &amp;quot;Code civil&amp;quot;}&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Loi || Parliament statute || &amp;lt;code&amp;gt;tags={&amp;quot;nature&amp;quot;: &amp;quot;loi&amp;quot;}&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Loi organique || Organic law (constitutional-tier procedure) || &amp;lt;code&amp;gt;tags={&amp;quot;nature&amp;quot;: &amp;quot;loi_organique&amp;quot;}&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Ordonnance || Government act under parliamentary authorization || &amp;lt;code&amp;gt;tags={&amp;quot;nature&amp;quot;: &amp;quot;ordonnance&amp;quot;}&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Decret || Executive regulation || &amp;lt;code&amp;gt;tags={&amp;quot;nature&amp;quot;: &amp;quot;decret&amp;quot;}&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Arrete || Ministerial/prefectoral order || &amp;lt;code&amp;gt;tags={&amp;quot;nature&amp;quot;: &amp;quot;arrete&amp;quot;}&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Circulaire || Administrative interpretation (NOT in corpus) || See circulaires.gouv.fr&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Codification prefixes ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Prefix !! Origin !! Example&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;L.&amp;#039;&amp;#039;&amp;#039; || Legislative (Parliament) — highest within a code || L.1234-5&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;R.&amp;#039;&amp;#039;&amp;#039; || Regulatory (&amp;#039;&amp;#039;decret en Conseil d&amp;#039;Etat&amp;#039;&amp;#039;) || R.1234-5&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;D.&amp;#039;&amp;#039;&amp;#039; || Regulatory (&amp;#039;&amp;#039;decret simple&amp;#039;&amp;#039;) || D.1234-5&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;A.&amp;#039;&amp;#039;&amp;#039; || Ministerial order (&amp;#039;&amp;#039;arrete&amp;#039;&amp;#039;) || A.1234-5&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;No prefix&amp;#039;&amp;#039; || Old codes not recodified (Code civil, Code penal pre-1994) || 1240&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
L. &amp;gt; R. within the same code. Same number with different prefix = different articles (L.1234-5 != R.1234-5).&lt;br /&gt;
&lt;br /&gt;
=== Legislation sources: LEGI vs JORF ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Source !! Content !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;legi&amp;lt;/code&amp;gt; || Consolidated legislation (versioned, with enforcement_status) || Preferred; shown in default search&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;jorf&amp;lt;/code&amp;gt; || Official gazette (original publication, no versioning) || Hidden from default search; use &amp;lt;code&amp;gt;tags={&amp;quot;source&amp;quot;: &amp;quot;jorf&amp;quot;}&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Same text exists in both with different IDs (LEGITEXT / JORFTEXT). ~4% of JORF texts have no LEGI counterpart (nominations, old texts).&lt;br /&gt;
&lt;br /&gt;
=== Enforcement status ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Value !! Meaning !! Safety&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;in_force&amp;lt;/code&amp;gt; || Currently in force || Safe to cite&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;deferred_enforcement&amp;lt;/code&amp;gt; || Enacted but not yet applicable || Flag future effective date&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;deferred_repeal&amp;lt;/code&amp;gt; || Still in force until a future date || Cite but flag upcoming repeal&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;repealed&amp;lt;/code&amp;gt; || Repealed || NEVER cite as current law&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;superseded&amp;lt;/code&amp;gt; || Historical version, newer exists || Cite the newer version&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;never_in_force&amp;lt;/code&amp;gt; || Modified before effective date || Never cite&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;expired&amp;lt;/code&amp;gt; || Lapsed by sunset clause || No longer applicable&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;annulled&amp;lt;/code&amp;gt; || Struck down by court (typically retroactive) || Never cite&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;transferred&amp;lt;/code&amp;gt; || Content moved to different article (renumbering) || Cite new location&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;denounced&amp;lt;/code&amp;gt; || Collective agreement repudiated || No longer applies&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;disjoined&amp;lt;/code&amp;gt; || Version split into multiple articles || Cite resulting articles&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;conditional&amp;lt;/code&amp;gt; || In force under specific interpretation (constitutional reservation) ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;pending&amp;lt;/code&amp;gt; || Adopted but awaiting ratification ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Publication grades (official_grade) ==&lt;br /&gt;
&lt;br /&gt;
=== Administrative courts (PUBLI_RECUEIL system) ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Grade !! Label !! Courts !! importance_level&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;A&amp;lt;/code&amp;gt; || Publie au Recueil Lebon || CE, Tribunal des conflits || highest_importance&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;B&amp;lt;/code&amp;gt; || Mentionne aux Tables du Lebon || CE, Tribunal des conflits || high_importance&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;R&amp;lt;/code&amp;gt; || Interet jurisprudentiel majeur || CAA, TA (equivalent of A) || highest_importance&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;C+&amp;lt;/code&amp;gt; || Interet signale || CAA, TA (equivalent of B) || high_importance&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;C&amp;lt;/code&amp;gt; || Inedit || All admin courts || low_importance&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;D&amp;lt;/code&amp;gt; || Interet limite aux parties || All admin courts || minimal_importance&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Z&amp;lt;/code&amp;gt; || Interet limite aux parties || All admin courts || minimal_importance&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Cour de cassation (post-2021, decisions after 2021-06-15) ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Grade !! Label !! importance_level&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rapport&amp;lt;/code&amp;gt; || Selectionne pour le Rapport annuel || highest_importance&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;bulletin&amp;lt;/code&amp;gt; || Publie au Bulletin des arrets || high_importance&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;diffuse&amp;lt;/code&amp;gt; || Diffuse sur Legifrance || low_importance&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;non_diffuse&amp;lt;/code&amp;gt; || Non diffuse || minimal_importance&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Cour de cassation (pre-2021, decisions before 2021-06-15) ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Grade !! Former code !! Label !! importance_level&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rapport&amp;lt;/code&amp;gt; || R || Rapport annuel || highest_importance&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;bulletin&amp;lt;/code&amp;gt; || P || Publie au Bulletin || high_importance&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;bulletin_information&amp;lt;/code&amp;gt; || B || Mentionne au BICC || medium_importance&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;internet&amp;lt;/code&amp;gt; || I || Diffuse sur internet || low_importance&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;diffuse&amp;lt;/code&amp;gt; || D || Diffuse aux bases || low_importance&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Lower courts (cour_appel, tribunal_judiciaire, tribunal_commerce) ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Grade !! Label !! importance_level !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;particular_interest&amp;lt;/code&amp;gt; || Arret d&amp;#039;interet particulier || highest_importance || ~1,400 decisions out of 1.25M&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Financial courts (CdC, CRC, CDBF, CAF) ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Grade !! Label !! importance_level !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;recueil&amp;lt;/code&amp;gt; || Publie au Recueil des juridictions financieres || high_importance || ~25% of decisions&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Default importance by court level (when no grade) ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Court level !! Default importance_level&lt;br /&gt;
|-&lt;br /&gt;
| cassation (supreme) || medium_importance&lt;br /&gt;
|-&lt;br /&gt;
| appel (appellate) || low_importance&lt;br /&gt;
|-&lt;br /&gt;
| premiere_instance (first_instance) || minimal_importance&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Formation / solemnity system ==&lt;br /&gt;
&lt;br /&gt;
Formations are ranked by ascending solemnity. Higher solemnity = greater jurisprudential authority.&lt;br /&gt;
&lt;br /&gt;
=== Cour de cassation ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Formation !! Solemnity tag !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| Formation restreinte (F, FRH, FRR) || &amp;lt;code&amp;gt;reduced_bench&amp;lt;/code&amp;gt; || Minimum composition&lt;br /&gt;
|-&lt;br /&gt;
| Standard chamber (civ.1, civ.2, civ.3, com., soc., crim.) || &amp;lt;code&amp;gt;standard_bench&amp;lt;/code&amp;gt; || Normal composition&lt;br /&gt;
|-&lt;br /&gt;
| Formation de section (FS) || &amp;lt;code&amp;gt;grand_bench&amp;lt;/code&amp;gt; || Important questions&lt;br /&gt;
|-&lt;br /&gt;
| Formation pleniere de chambre (FP) || &amp;lt;code&amp;gt;grand_bench&amp;lt;/code&amp;gt; || Full chamber&lt;br /&gt;
|-&lt;br /&gt;
| Chambre mixte (FM) || &amp;lt;code&amp;gt;combined_chambers&amp;lt;/code&amp;gt; || Multiple chambers; outranks &amp;#039;&amp;#039;formation pleniere&amp;#039;&amp;#039;&lt;br /&gt;
|-&lt;br /&gt;
| Assemblee pleniere || &amp;lt;code&amp;gt;full_court&amp;lt;/code&amp;gt; || All chambers; highest authority&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Note: at the Cour de cassation, &amp;lt;code&amp;gt;combined_chambers&amp;lt;/code&amp;gt; (Chambre mixte) outranks &amp;lt;code&amp;gt;grand_bench&amp;lt;/code&amp;gt; (formation pleniere) — this diverges from the generic solemnity ordering.&lt;br /&gt;
&lt;br /&gt;
=== Conseil d&amp;#039;Etat ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Formation !! Solemnity tag&lt;br /&gt;
|-&lt;br /&gt;
| Juge des referes || &amp;lt;code&amp;gt;single_judge&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Formation a 3 || &amp;lt;code&amp;gt;reduced_bench&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Chambre seule || &amp;lt;code&amp;gt;standard_bench&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Chambres reunies / SSR || &amp;lt;code&amp;gt;combined_chambers&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Section du contentieux || &amp;lt;code&amp;gt;grand_bench&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Assemblee du contentieux || &amp;lt;code&amp;gt;full_court&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Case number formats ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Court !! Format !! Example&lt;br /&gt;
|-&lt;br /&gt;
| Cour de cassation || &amp;lt;code&amp;gt;YY-NN.NNN&amp;lt;/code&amp;gt; || 24-14.752&lt;br /&gt;
|-&lt;br /&gt;
| Cour d&amp;#039;appel / TJ || &amp;lt;code&amp;gt;YY/NNNNN&amp;lt;/code&amp;gt; || 21/00091&lt;br /&gt;
|-&lt;br /&gt;
| Conseil d&amp;#039;Etat || &amp;lt;code&amp;gt;NNNNNN&amp;lt;/code&amp;gt; (sequential) || 486329&lt;br /&gt;
|-&lt;br /&gt;
| TA / CAA || &amp;lt;code&amp;gt;YYLLNNNNN&amp;lt;/code&amp;gt; (year + court code) || 24PA01233&lt;br /&gt;
|-&lt;br /&gt;
| Conseil constitutionnel || &amp;lt;code&amp;gt;YYYY-NNN TYPE&amp;lt;/code&amp;gt; || 2021-823 DC&lt;br /&gt;
|-&lt;br /&gt;
| Tribunal des conflits || &amp;lt;code&amp;gt;CNNNN&amp;lt;/code&amp;gt; || C4321&lt;br /&gt;
|-&lt;br /&gt;
| Cour des comptes || &amp;lt;code&amp;gt;S-YYYY-NNNN&amp;lt;/code&amp;gt; || S-2025-0381&lt;br /&gt;
|-&lt;br /&gt;
| CDBF || &amp;lt;code&amp;gt;NNN-NNN&amp;lt;/code&amp;gt; || 264-865&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Cass. pourvoi digits 3-4 correlate with chamber (80-89 = criminal, ~10-25 = civil/commercial/social).&lt;br /&gt;
&lt;br /&gt;
== Labor law sources ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Source !! Content !! Tag&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;kali&amp;lt;/code&amp;gt; || Official collective agreement texts (DILA/Legifrance) || &amp;lt;code&amp;gt;tags={&amp;quot;source&amp;quot;: &amp;quot;kali&amp;quot;}&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;acco&amp;lt;/code&amp;gt; || Filed company agreements || &amp;lt;code&amp;gt;tags={&amp;quot;source&amp;quot;: &amp;quot;acco&amp;quot;}&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;bargaining_level&amp;#039;&amp;#039;&amp;#039; (T2 tag): &amp;lt;code&amp;gt;enterprise&amp;lt;/code&amp;gt; (company agreement), &amp;lt;code&amp;gt;sectoral&amp;lt;/code&amp;gt; (branch agreement). Also defined but not yet populated: &amp;lt;code&amp;gt;inter_sectoral&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;territorial&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Each collective agreement has an IDCC number. IDCCs merge over time (e.g., metallurgy merged to IDCC 3248 in 2024).&lt;br /&gt;
&lt;br /&gt;
== Doctrine sources ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Source !! Content !! Binding?&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;bofip&amp;lt;/code&amp;gt; || Tax administration interpretation (BOFiP) || Opposable to tax authority; NOT binding on courts&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;cnil&amp;lt;/code&amp;gt; || CNIL guidelines/recommendations || Soft law; widely followed as diligence standard&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;cada&amp;lt;/code&amp;gt; || CADA advisory opinions on document access || Advisory&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== What is NOT in the corpus ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Gap !! Alternative&lt;br /&gt;
|-&lt;br /&gt;
| First-instance decisions (TJ, CPH, TC) || Not systematically published&lt;br /&gt;
|-&lt;br /&gt;
| Academic doctrine (treatises, case commentaries) || Not available&lt;br /&gt;
|-&lt;br /&gt;
| Circulaires || circulaires.gouv.fr (not binding on courts)&lt;br /&gt;
|-&lt;br /&gt;
| Notarial practice and customs || Not available&lt;br /&gt;
|-&lt;br /&gt;
| Lower criminal court decisions || Sparse coverage (Cass. crim. is included)&lt;br /&gt;
|-&lt;br /&gt;
| Very recent enactments (&amp;lt; 48h) || Ingestion lag; flag for recent texts&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Major reforms — renumbering traps ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Reform !! Effective !! Key changes&lt;br /&gt;
|-&lt;br /&gt;
| Obligations (ordonnance 2016-131) || 1 Oct 2016 || 1134-&amp;gt;1103+1104, 1147-&amp;gt;1231-1, 1382-&amp;gt;1240, 1383-&amp;gt;1241, 1384-&amp;gt;1242. Contracts before 1 Oct 2016 use OLD articles.&lt;br /&gt;
|-&lt;br /&gt;
| Security interests (ordonnance 2021-1192) || 1 Jan 2022 || Reorganized Code civil Book IV (suretes)&lt;br /&gt;
|-&lt;br /&gt;
| Criminal justice for minors || 30 Sep 2021 || Code de justice penale des mineurs replaced 1945 ordonnance&lt;br /&gt;
|-&lt;br /&gt;
| Criminal procedure (loi 2024-364) || 1 Jul 2024 || Articles 63+ CPP (garde a vue) modified&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Category:Jurisdictions]]&lt;/div&gt;</description>
			<pubDate>Thu, 23 Apr 2026 02:05:00 GMT</pubDate>
			<dc:creator>Nicolas</dc:creator>
			<comments>https://wiki.dura-lex.org/index.php/Talk:Jurisdictions/FR</comments>
		</item>
		<item>
			<title>Development/Testing</title>
			<link>https://wiki.dura-lex.org/index.php?title=Development/Testing&amp;diff=37&amp;oldid=0</link>
			<guid isPermaLink="false">https://wiki.dura-lex.org/index.php?title=Development/Testing&amp;diff=37&amp;oldid=0</guid>
			<description>&lt;p&gt;Create Testing conventions page from coding-conventions/TESTING.md (via create-page on MediaWiki MCP Server)&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;= Testing Conventions =&lt;br /&gt;
&lt;br /&gt;
All duralex-* packages follow these conventions for test organization, naming, and execution.&lt;br /&gt;
&lt;br /&gt;
== Directory structure ==&lt;br /&gt;
&lt;br /&gt;
Tests mirror the &amp;lt;code&amp;gt;src/duralex/&amp;lt;/code&amp;gt; structure:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
tests/&lt;br /&gt;
├── conftest.py                      # shared fixtures for this repo&lt;br /&gt;
├── data/                            # mirrors src/duralex/data/&lt;br /&gt;
│   ├── test_models.py&lt;br /&gt;
│   └── test_schema.py&lt;br /&gt;
├── temporal/                        # mirrors src/duralex/temporal/&lt;br /&gt;
│   └── test_temporal_version.py&lt;br /&gt;
├── store/                           # mirrors src/duralex/corpus/store/&lt;br /&gt;
│   ├── test_full_text_search_configuration.py&lt;br /&gt;
│   └── test_full_text_search_query_builder.py&lt;br /&gt;
├── integration/                     # tests requiring external services&lt;br /&gt;
│   └── test_postgres_document_store.py&lt;br /&gt;
└── fixtures/                        # real data files for tests&lt;br /&gt;
    ├── fr.legiarti000006436298.xml&lt;br /&gt;
    ├── fr.cetatext000046783006.xml&lt;br /&gt;
    └── 5fdcdddd994f0448aad44c0b.json&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
No &amp;lt;code&amp;gt;__init__.py&amp;lt;/code&amp;gt; in test directories. Use &amp;lt;code&amp;gt;--import-mode=importlib&amp;lt;/code&amp;gt; instead.&lt;br /&gt;
&lt;br /&gt;
== Test naming ==&lt;br /&gt;
&lt;br /&gt;
Pattern: &amp;lt;code&amp;gt;test_{what}_{scenario}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# What is being tested + specific scenario&lt;br /&gt;
def test_resolve_legal_reference_article_of_code():&lt;br /&gt;
def test_resolve_legal_reference_empty_string():&lt;br /&gt;
def test_resolve_legal_reference_unknown_pattern():&lt;br /&gt;
def test_resolve_legal_reference_pourvoi_number():&lt;br /&gt;
&lt;br /&gt;
def test_parse_legislation_article_basic_fields():&lt;br /&gt;
def test_parse_legislation_article_missing_content():&lt;br /&gt;
def test_parse_legislation_article_multiple_versions():&lt;br /&gt;
&lt;br /&gt;
def test_sanitize_html_content_strips_script_tags():&lt;br /&gt;
def test_sanitize_html_content_preserves_table_structure():&lt;br /&gt;
def test_sanitize_html_content_empty_input():&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The test name alone must tell an auditor what is being verified, without reading the body.&lt;br /&gt;
&lt;br /&gt;
== Test body structure ==&lt;br /&gt;
&lt;br /&gt;
Each test follows a clear three-section structure. Sections are separated by blank lines, not comments.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
def test_resolve_legal_reference_article_of_code():&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&amp;#039;article 1240 du code civil&amp;#039; resolves to fr.law.code.civil.article-1240.&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    resolver = FrenchLegalReferenceResolver()&lt;br /&gt;
&lt;br /&gt;
    results = resolver.resolve_legal_reference(&amp;quot;article 1240 du code civil&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    assert len(results) == 1&lt;br /&gt;
    assert results[0].uri == &amp;quot;fr.law.code.civil.article-1240&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Line 1:&amp;#039;&amp;#039;&amp;#039; Setup (create objects, prepare inputs)&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Line 2:&amp;#039;&amp;#039;&amp;#039; Act (call the function under test)&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Line 3:&amp;#039;&amp;#039;&amp;#039; Assert (verify the result)&lt;br /&gt;
&lt;br /&gt;
One assertion per concept. Multiple &amp;lt;code&amp;gt;assert&amp;lt;/code&amp;gt; statements are fine when they verify different aspects of the same result.&lt;br /&gt;
&lt;br /&gt;
== Fixtures ==&lt;br /&gt;
&lt;br /&gt;
=== Factory fixtures for data objects ===&lt;br /&gt;
&lt;br /&gt;
When tests need multiple instances with variations, use factory fixtures:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
@pytest.fixture&lt;br /&gt;
def make_legislation_article():&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Factory: creates LegislationArticle instances with sensible defaults.&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    def _make(&lt;br /&gt;
        article_id: str = &amp;quot;fr.legiarti000006436298&amp;quot;,&lt;br /&gt;
        article_number: str = &amp;quot;1240&amp;quot;,&lt;br /&gt;
        code_name: str = &amp;quot;code civil&amp;quot;,&lt;br /&gt;
        is_in_force: bool = True,&lt;br /&gt;
        **overrides,&lt;br /&gt;
    ) -&amp;gt; LegislationArticle:&lt;br /&gt;
        defaults = {&lt;br /&gt;
            &amp;quot;article_id&amp;quot;: article_id,&lt;br /&gt;
            &amp;quot;article_number&amp;quot;: article_number,&lt;br /&gt;
            &amp;quot;code_name&amp;quot;: code_name,&lt;br /&gt;
            &amp;quot;is_in_force&amp;quot;: is_in_force,&lt;br /&gt;
            &amp;quot;html_content&amp;quot;: &amp;quot;&amp;lt;p&amp;gt;Tout fait quelconque de l&amp;#039;homme...&amp;lt;/p&amp;gt;&amp;quot;,&lt;br /&gt;
            &amp;quot;plain_text_content&amp;quot;: &amp;quot;Tout fait quelconque de l&amp;#039;homme...&amp;quot;,&lt;br /&gt;
        }&lt;br /&gt;
        defaults.update(overrides)&lt;br /&gt;
        return LegislationArticle(**defaults)&lt;br /&gt;
    return _make&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Real data fixtures ===&lt;br /&gt;
&lt;br /&gt;
Test fixtures use &amp;#039;&amp;#039;&amp;#039;real files&amp;#039;&amp;#039;&amp;#039; from public institutional data sources (DILA, Judilibre, EUR-Lex). Not invented mocks. This is consistent with the project&amp;#039;s commitment to transparency and auditability.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
FIXTURES_DIR = Path(__file__).parent / &amp;quot;fixtures&amp;quot;&lt;br /&gt;
&lt;br /&gt;
@pytest.fixture&lt;br /&gt;
def sample_legi_article_path() -&amp;gt; Path:&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Real LEGI XML article: article 1240 du code civil.&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    return FIXTURES_DIR / &amp;quot;fr.legiarti000006436298.xml&amp;quot;&lt;br /&gt;
&lt;br /&gt;
@pytest.fixture&lt;br /&gt;
def sample_jade_decision_path() -&amp;gt; Path:&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Real JADE XML decision: CE, 13 dec 2022, n 462274.&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    return FIXTURES_DIR / &amp;quot;fr.cetatext000046783006.xml&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Session-scoped fixtures for expensive resources ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
@pytest.fixture(scope=&amp;quot;session&amp;quot;)&lt;br /&gt;
def database_connection():&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;PostgreSQL connection via testcontainers. Shared across all tests in session.&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    with PostgresContainer(&amp;quot;postgres:17&amp;quot;) as postgres:&lt;br /&gt;
        pool = ConnectionPool(postgres.get_connection_url())&lt;br /&gt;
        yield pool&lt;br /&gt;
        pool.close()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Markers ==&lt;br /&gt;
&lt;br /&gt;
Two standard markers, defined in every repo&amp;#039;s &amp;lt;code&amp;gt;pyproject.toml&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
@pytest.mark.slow&lt;br /&gt;
def test_parse_all_code_civil_articles():&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Parse all 2000+ articles of Code civil. Verifies no crash.&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    ...&lt;br /&gt;
&lt;br /&gt;
@pytest.mark.integration&lt;br /&gt;
def test_full_text_search_returns_ranked_results(database_connection):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;FTS with real PostgreSQL, real French stemming, real data.&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    ...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Default &amp;lt;code&amp;gt;pytest&amp;lt;/code&amp;gt; invocation excludes both:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
pytest                         # unit tests only (fast)&lt;br /&gt;
pytest -m integration          # integration only&lt;br /&gt;
pytest -m &amp;quot;not slow&amp;quot;           # everything except slow&lt;br /&gt;
pytest -m &amp;quot;&amp;quot;                   # everything including slow + integration&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Parametrize for data-driven tests ==&lt;br /&gt;
&lt;br /&gt;
Use &amp;lt;code&amp;gt;@pytest.mark.parametrize&amp;lt;/code&amp;gt; for testing multiple inputs against the same logic:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
@pytest.mark.parametrize(&amp;quot;raw_input, expected_uri&amp;quot;, [&lt;br /&gt;
    (&amp;quot;article 1240 du code civil&amp;quot;, &amp;quot;fr.law.code.civil.article-1240&amp;quot;),&lt;br /&gt;
    (&amp;quot;article L. 442-1 du code de commerce&amp;quot;, &amp;quot;fr.law.code.commerce.article-l442-1&amp;quot;),&lt;br /&gt;
    (&amp;quot;loi n° 85-677&amp;quot;, &amp;quot;fr.law.loi.85-677&amp;quot;),&lt;br /&gt;
    (&amp;quot;24-14.340&amp;quot;, &amp;quot;fr.court.pourvoi.24-14.340&amp;quot;),&lt;br /&gt;
])&lt;br /&gt;
def test_resolve_legal_reference_known_patterns(raw_input, expected_uri):&lt;br /&gt;
    resolver = FrenchLegalReferenceResolver()&lt;br /&gt;
    results = resolver.resolve_legal_reference(raw_input)&lt;br /&gt;
    assert results[0].uri == expected_uri&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== What NOT to test ==&lt;br /&gt;
&lt;br /&gt;
* Private implementation details (functions starting with &amp;lt;code&amp;gt;_&amp;lt;/code&amp;gt;)&lt;br /&gt;
* Third-party library behavior (lxml, psycopg, nh3)&lt;br /&gt;
* Configuration values&lt;br /&gt;
&lt;br /&gt;
== pyproject.toml reference ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;toml&amp;quot;&amp;gt;&lt;br /&gt;
[tool.pytest.ini_options]&lt;br /&gt;
testpaths = [&amp;quot;tests&amp;quot;]&lt;br /&gt;
addopts = [&lt;br /&gt;
    &amp;quot;--strict-config&amp;quot;,&lt;br /&gt;
    &amp;quot;--strict-markers&amp;quot;,&lt;br /&gt;
    &amp;quot;--import-mode=importlib&amp;quot;,&lt;br /&gt;
    &amp;quot;-m not slow and not integration&amp;quot;,&lt;br /&gt;
]&lt;br /&gt;
xfail_strict = true&lt;br /&gt;
consider_namespace_packages = true&lt;br /&gt;
filterwarnings = [&amp;quot;error&amp;quot;]&lt;br /&gt;
markers = [&lt;br /&gt;
    &amp;quot;slow: tests with extended runtime&amp;quot;,&lt;br /&gt;
    &amp;quot;integration: requires PostgreSQL (testcontainers)&amp;quot;,&lt;br /&gt;
]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Development]]&lt;/div&gt;</description>
			<pubDate>Thu, 23 Apr 2026 02:04:53 GMT</pubDate>
			<dc:creator>Nicolas</dc:creator>
			<comments>https://wiki.dura-lex.org/index.php/Talk:Development/Testing</comments>
		</item>
		<item>
			<title>Development/Python</title>
			<link>https://wiki.dura-lex.org/index.php?title=Development/Python&amp;diff=36&amp;oldid=0</link>
			<guid isPermaLink="false">https://wiki.dura-lex.org/index.php?title=Development/Python&amp;diff=36&amp;oldid=0</guid>
			<description>&lt;p&gt;Create Python conventions page from coding-conventions/PYTHON.md (via create-page on MediaWiki MCP Server)&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;= Python Conventions =&lt;br /&gt;
&lt;br /&gt;
All duralex-* packages follow these conventions. No exceptions.&lt;br /&gt;
&lt;br /&gt;
== Naming ==&lt;br /&gt;
&lt;br /&gt;
=== Casing (PEP 8) ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Element !! Case !! Example&lt;br /&gt;
|-&lt;br /&gt;
| Functions, methods, variables || &amp;lt;code&amp;gt;snake_case&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;parse_legislation_article()&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Classes || &amp;lt;code&amp;gt;PascalCase&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;LegislationArticle&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Constants || &amp;lt;code&amp;gt;UPPER_SNAKE&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;ALLOWED_TABLE_NAMES&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Enum members || &amp;lt;code&amp;gt;UPPER_SNAKE&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;Confidence.SOURCE_CHECKED&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Enum string values || &amp;lt;code&amp;gt;lowercase&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;&amp;quot;source_checked&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Module filenames || &amp;lt;code&amp;gt;snake_case&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;connection_pool.py&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== No abbreviations ===&lt;br /&gt;
&lt;br /&gt;
The code is written and maintained by AI. The AI does not tire of typing. Full words always.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Wrong !! Right&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ref&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;reference&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;leg&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;legislation&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;dec&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;decision&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;doc&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;document&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;fts&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;full_text_search&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;tbl&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;table&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;q&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;query&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;lim&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;limit&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;flt&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;filter&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;el&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;element&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ctx&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;context&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;conn&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;connection&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;cfg&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;configuration&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;num&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;number&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;idx&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;index&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;val&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Qualified names ===&lt;br /&gt;
&lt;br /&gt;
Single-word names are ambiguous. Always qualify with the domain.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Wrong !! Right !! Why&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;query&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;search_query&amp;lt;/code&amp;gt; || Could be SQL, HTTP, FTS...&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;text&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;article_text&amp;lt;/code&amp;gt; || Could be anything&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;content&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;html_content&amp;lt;/code&amp;gt; || What kind?&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;result&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;search_result&amp;lt;/code&amp;gt; || Result of what?&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;decision_data&amp;lt;/code&amp;gt; || Meaningless alone&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;items&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;matched_articles&amp;lt;/code&amp;gt; || What items?&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;response&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;search_response&amp;lt;/code&amp;gt; || From where?&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;file_path&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;concept_path&amp;lt;/code&amp;gt; || Filesystem? URI?&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Booleans read as phrases ===&lt;br /&gt;
&lt;br /&gt;
A boolean variable or parameter must read as a true/false statement.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# Wrong&lt;br /&gt;
active = True&lt;br /&gt;
force = False&lt;br /&gt;
recursive = True&lt;br /&gt;
&lt;br /&gt;
# Right&lt;br /&gt;
is_in_force = True&lt;br /&gt;
should_force_refresh = False&lt;br /&gt;
is_recursive = True&lt;br /&gt;
has_been_verified = False&lt;br /&gt;
should_include_repealed = True&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Classes: named for what they ARE ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
class LegislationArticle: ...&lt;br /&gt;
class CaseLawDecision: ...&lt;br /&gt;
class ResolvedReference: ...&lt;br /&gt;
class AnnotationEnvelope: ...&lt;br /&gt;
class ConceptDefinition: ...&lt;br /&gt;
class SearchFilters: ...&lt;br /&gt;
class SearchResults: ...&lt;br /&gt;
class CompiledPackage: ...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Methods: verb + explicit object ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
def parse_legislation_article(xml_path: Path) -&amp;gt; LegislationArticle: ...&lt;br /&gt;
def resolve_legal_reference(raw_text: str) -&amp;gt; list[ResolvedReference]: ...&lt;br /&gt;
def search_full_text(query: str, filters: SearchFilters) -&amp;gt; SearchResults: ...&lt;br /&gt;
def compile_domain_package(domain: str) -&amp;gt; CompiledPackage: ...&lt;br /&gt;
def sanitize_html_content(raw_html: str) -&amp;gt; str: ...&lt;br /&gt;
def extract_text_content(element: Element, xpath: str) -&amp;gt; str | None: ...&lt;br /&gt;
def validate_date_range(date_from: str | None, date_to: str | None) -&amp;gt; None: ...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Protocols: named for the capability ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
class LegislationParser(Protocol): ...&lt;br /&gt;
class ReferenceResolver(Protocol): ...&lt;br /&gt;
class SearchEngine(Protocol): ...&lt;br /&gt;
class VersionSelector(Protocol): ...&lt;br /&gt;
class DecisionDownloader(Protocol): ...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Enums ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
class ConceptType(Enum):&lt;br /&gt;
    QUALIFIABLE = &amp;quot;qualifiable&amp;quot;&lt;br /&gt;
    OPEN_STANDARD = &amp;quot;open_standard&amp;quot;&lt;br /&gt;
    GUIDING_PRINCIPLE = &amp;quot;guiding_principle&amp;quot;&lt;br /&gt;
    PROCEDURAL = &amp;quot;procedural&amp;quot;&lt;br /&gt;
    SCALE = &amp;quot;scale&amp;quot;&lt;br /&gt;
&lt;br /&gt;
class Confidence(Enum):&lt;br /&gt;
    STUB = &amp;quot;stub&amp;quot;&lt;br /&gt;
    MEMORY_ONLY = &amp;quot;memory_only&amp;quot;&lt;br /&gt;
    SOURCE_CHECKED = &amp;quot;source_checked&amp;quot;&lt;br /&gt;
    CROSS_VALIDATED = &amp;quot;cross_validated&amp;quot;&lt;br /&gt;
&lt;br /&gt;
class Outcome(Enum):&lt;br /&gt;
    QUALIFIED = &amp;quot;qualified&amp;quot;&lt;br /&gt;
    NOT_QUALIFIED = &amp;quot;not_qualified&amp;quot;&lt;br /&gt;
    VALIDATED = &amp;quot;validated&amp;quot;&lt;br /&gt;
    INVALIDATED = &amp;quot;invalidated&amp;quot;&lt;br /&gt;
    PROCEDURAL = &amp;quot;procedural&amp;quot;&lt;br /&gt;
    MOOT = &amp;quot;moot&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Architecture patterns ==&lt;br /&gt;
&lt;br /&gt;
=== Dependency injection ===&lt;br /&gt;
&lt;br /&gt;
Dependencies are passed explicitly. No global singletons, no module-level mutable state.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# Wrong&lt;br /&gt;
class SearchEngine:&lt;br /&gt;
    def __init__(self):&lt;br /&gt;
        self._pool = _get_global_pool()&lt;br /&gt;
        self._load_cache()&lt;br /&gt;
&lt;br /&gt;
# Right&lt;br /&gt;
class FullTextSearchEngine:&lt;br /&gt;
    def __init__(self, connection_pool: ConnectionPool):&lt;br /&gt;
        self.connection_pool = connection_pool&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== No side effects in &amp;lt;code&amp;gt;__init__&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
Constructors store parameters. They do not open connections, load caches, or perform I/O.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# Wrong&lt;br /&gt;
class FrenchReferenceResolver:&lt;br /&gt;
    def __init__(self, connection_pool: ConnectionPool):&lt;br /&gt;
        self.connection_pool = connection_pool&lt;br /&gt;
        self._code_cache = self._load_code_cache()  # I/O in __init__&lt;br /&gt;
&lt;br /&gt;
# Right&lt;br /&gt;
class FrenchReferenceResolver:&lt;br /&gt;
    def __init__(self, connection_pool: ConnectionPool):&lt;br /&gt;
        self.connection_pool = connection_pool&lt;br /&gt;
        self._code_cache: dict[str, str] | None = None&lt;br /&gt;
&lt;br /&gt;
    def _ensure_code_cache(self) -&amp;gt; dict[str, str]:&lt;br /&gt;
        if self._code_cache is None:&lt;br /&gt;
            self._code_cache = self._load_code_cache()&lt;br /&gt;
        return self._code_cache&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Composition over inheritance ===&lt;br /&gt;
&lt;br /&gt;
Core libraries define &amp;lt;code&amp;gt;Protocol&amp;lt;/code&amp;gt; interfaces. Country packages and plugins provide implementations. Applications compose them.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# duralex -- defines the interface&lt;br /&gt;
class ReferenceResolver(Protocol):&lt;br /&gt;
    def resolve_legal_reference(self, raw_text: str) -&amp;gt; list[ResolvedReference]: ...&lt;br /&gt;
&lt;br /&gt;
class CompositeReferenceResolver:&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Chains multiple resolvers. First match wins.&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    def __init__(self, resolvers: list[ReferenceResolver]):&lt;br /&gt;
        self.resolvers = resolvers&lt;br /&gt;
&lt;br /&gt;
    def resolve_legal_reference(self, raw_text: str) -&amp;gt; list[ResolvedReference]:&lt;br /&gt;
        for resolver in self.resolvers:&lt;br /&gt;
            if results := resolver.resolve_legal_reference(raw_text):&lt;br /&gt;
                return results&lt;br /&gt;
        return []&lt;br /&gt;
&lt;br /&gt;
# duralex-fr -- implements for France&lt;br /&gt;
class FrenchLegalReferenceResolver:&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;French legal references: articles, lois, pourvois, ECLI.&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    ...&lt;br /&gt;
&lt;br /&gt;
# Application -- composes at startup&lt;br /&gt;
resolver = CompositeReferenceResolver([&lt;br /&gt;
    FrenchLegalReferenceResolver(connection_pool=pool),&lt;br /&gt;
    SireneCompanyResolver(),&lt;br /&gt;
])&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== One module = one concept ===&lt;br /&gt;
&lt;br /&gt;
A Python file should contain one coherent concept. If you need a table of contents to navigate the file, split it.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Wrong !! Right&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;db.py&amp;lt;/code&amp;gt; (1400 lines: pool + CRUD + FTS + ingest + dedup + browse) || &amp;lt;code&amp;gt;connection_pool.py&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;full_text_search.py&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ingest_state.py&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;browse_structure.py&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;validation.py&amp;lt;/code&amp;gt; (filters + jurisdiction + pagination + dates + courts) || &amp;lt;code&amp;gt;search_filters.py&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;court_classification.py&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Target: &amp;#039;&amp;#039;&amp;#039;under 300 lines per file&amp;#039;&amp;#039;&amp;#039;. Hard limit: &amp;#039;&amp;#039;&amp;#039;500 lines&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
== Type annotations ==&lt;br /&gt;
&lt;br /&gt;
Every function signature is fully annotated. An auditor reads signatures before reading bodies.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# Wrong&lt;br /&gt;
def search(query, table, limit=20):&lt;br /&gt;
    ...&lt;br /&gt;
&lt;br /&gt;
# Right&lt;br /&gt;
def search_full_text(&lt;br /&gt;
    search_query: str,&lt;br /&gt;
    table_name: str,&lt;br /&gt;
    result_limit: int = 20,&lt;br /&gt;
    date_from: date | None = None,&lt;br /&gt;
    date_to: date | None = None,&lt;br /&gt;
) -&amp;gt; SearchResults:&lt;br /&gt;
    ...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Use &amp;lt;code&amp;gt;|&amp;lt;/code&amp;gt; union syntax (Python 3.10+), not &amp;lt;code&amp;gt;Optional&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;Union&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Docstrings ==&lt;br /&gt;
&lt;br /&gt;
Every public class and function has a docstring. Docstrings include &amp;lt;code&amp;gt;Examples&amp;lt;/code&amp;gt; blocks -- AI reads examples first to understand expected behavior.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
def resolve_legal_reference(raw_text: str) -&amp;gt; list[ResolvedReference]:&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Parse a legal citation string into structured references.&lt;br /&gt;
&lt;br /&gt;
    Runs a pipeline of detectors in priority order (most specific first).&lt;br /&gt;
    First match wins. Returns empty list if no pattern matches.&lt;br /&gt;
&lt;br /&gt;
    Args:&lt;br /&gt;
        raw_text: A French legal citation in natural language.&lt;br /&gt;
&lt;br /&gt;
    Returns:&lt;br /&gt;
        List of resolved references with canonical URIs.&lt;br /&gt;
&lt;br /&gt;
    Examples:&lt;br /&gt;
        &amp;gt;&amp;gt;&amp;gt; resolve_legal_reference(&amp;quot;article 1240 du code civil&amp;quot;)&lt;br /&gt;
        [ResolvedReference(uri=&amp;quot;fr.law.code.civil.article-1240&amp;quot;)]&lt;br /&gt;
&lt;br /&gt;
        &amp;gt;&amp;gt;&amp;gt; resolve_legal_reference(&amp;quot;loi n° 85-677&amp;quot;)&lt;br /&gt;
        [ResolvedReference(uri=&amp;quot;fr.law.loi.85-677&amp;quot;)]&lt;br /&gt;
&lt;br /&gt;
        &amp;gt;&amp;gt;&amp;gt; resolve_legal_reference(&amp;quot;bonjour&amp;quot;)&lt;br /&gt;
        []&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Error handling ==&lt;br /&gt;
&lt;br /&gt;
Errors are explicit. Never swallowed. Never hidden behind a generic fallback.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# Wrong&lt;br /&gt;
try:&lt;br /&gt;
    result = parse_article(path)&lt;br /&gt;
except Exception:&lt;br /&gt;
    result = None&lt;br /&gt;
&lt;br /&gt;
# Right&lt;br /&gt;
try:&lt;br /&gt;
    result = parse_article(path)&lt;br /&gt;
except FileNotFoundError:&lt;br /&gt;
    raise ArticleNotFoundError(article_id=article_id, path=path) from None&lt;br /&gt;
except etree.XMLSyntaxError as error:&lt;br /&gt;
    raise ArticleParseError(article_id=article_id, detail=str(error)) from error&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Custom exception classes inherit from a common base:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
class DuralexError(Exception):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Base exception for all Dura Lex errors.&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
class ArticleNotFoundError(DuralexError):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Raised when a legislation article file does not exist on disk.&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
class ArticleParseError(DuralexError):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Raised when a legislation article XML file cannot be parsed.&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
class ReferenceResolutionError(DuralexError):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Raised when a legal reference is ambiguous or malformed.&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Language ==&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;All code is in English.&amp;#039;&amp;#039;&amp;#039; Variable names, function names, class names, docstrings, comments, error messages -- everything.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Content is in the jurisdiction&amp;#039;s language.&amp;#039;&amp;#039;&amp;#039; Concept names (&amp;lt;code&amp;gt;fr.civil.contrat.formation.consentement.vice.dol&amp;lt;/code&amp;gt;), article text, legal vocabulary, court names -- these are in French (or the local language of the jurisdiction).&lt;br /&gt;
&lt;br /&gt;
The boundary is clear: code structure is English, data values are local.&lt;br /&gt;
&lt;br /&gt;
[[Category:Development]]&lt;/div&gt;</description>
			<pubDate>Thu, 23 Apr 2026 02:04:17 GMT</pubDate>
			<dc:creator>Nicolas</dc:creator>
			<comments>https://wiki.dura-lex.org/index.php/Talk:Development/Python</comments>
		</item>
		<item>
			<title>MCP</title>
			<link>https://wiki.dura-lex.org/index.php?title=MCP&amp;diff=35&amp;oldid=0</link>
			<guid isPermaLink="false">https://wiki.dura-lex.org/index.php?title=MCP&amp;diff=35&amp;oldid=0</guid>
			<description>&lt;p&gt;Create MCP index page (via create-page on MediaWiki MCP Server)&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;The public API for AI agents and applications. 5 tools, safety guidelines per jurisdiction, reference resolution.&lt;br /&gt;
&lt;br /&gt;
== Tools ==&lt;br /&gt;
&lt;br /&gt;
The MCP server exposes 5 tools, all jurisdiction-agnostic. Jurisdiction plugins provide tag schemas, formatters, and reference resolvers — not tools.&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;[[MCP/Tools|Tools]]&amp;#039;&amp;#039;&amp;#039; — full specification of all 5 tools (search, get_document, browse_structure, safety_guidelines, quality_check)&lt;br /&gt;
&lt;br /&gt;
== Reference resolution ==&lt;br /&gt;
&lt;br /&gt;
Reference resolution transforms a natural language legal reference (or a document ID) into a query against the corpus.&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;[[MCP/Reference resolution|Reference resolution]]&amp;#039;&amp;#039;&amp;#039; — TagQuery, jurisdiction parsers, resolution pipeline&lt;br /&gt;
&lt;br /&gt;
== Guidelines ==&lt;br /&gt;
&lt;br /&gt;
Mandatory safety guidelines for legal research. Two-call workflow: core once at session start, jurisdiction per jurisdictional context.&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;[[MCP/Guidelines|Guidelines]]&amp;#039;&amp;#039;&amp;#039; — overview of the guidelines system&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;[[MCP/Guidelines/Core|Core guidelines]]&amp;#039;&amp;#039;&amp;#039; — foundational rules (8 non-negotiable, methodology, defensive posture, response format)&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;[[MCP/Guidelines/FR|FR guidelines]]&amp;#039;&amp;#039;&amp;#039; — French law jurisdiction-specific rules&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;[[MCP/Guidelines/EU|EU guidelines]]&amp;#039;&amp;#039;&amp;#039; — European law jurisdiction-specific rules&lt;br /&gt;
&lt;br /&gt;
[[Category:MCP]]&lt;/div&gt;</description>
			<pubDate>Thu, 23 Apr 2026 02:03:40 GMT</pubDate>
			<dc:creator>Nicolas</dc:creator>
			<comments>https://wiki.dura-lex.org/index.php/Talk:MCP</comments>
		</item>
		<item>
			<title>Jurisdictions</title>
			<link>https://wiki.dura-lex.org/index.php?title=Jurisdictions&amp;diff=34&amp;oldid=0</link>
			<guid isPermaLink="false">https://wiki.dura-lex.org/index.php?title=Jurisdictions&amp;diff=34&amp;oldid=0</guid>
			<description>&lt;p&gt;Create jurisdictions index page (via create-page on MediaWiki MCP Server)&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;Legal systems covered by Dura Lex. Each page describes the court hierarchy, legislation types, and publication systems for a jurisdiction.&lt;br /&gt;
&lt;br /&gt;
== Covered jurisdictions ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Jurisdiction !! Code !! Description&lt;br /&gt;
|-&lt;br /&gt;
| [[Jurisdictions/FR|France]] || &amp;lt;code&amp;gt;fr&amp;lt;/code&amp;gt; || French legal system: judicial, administrative, financial, and constitutional orders. 60M+ documents.&lt;br /&gt;
|-&lt;br /&gt;
| [[Jurisdictions/EU|European Union]] || &amp;lt;code&amp;gt;eu&amp;lt;/code&amp;gt; || EU law (EUR-Lex, CJEU) and ECHR. Currently FR-language only.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Using jurisdiction tags ==&lt;br /&gt;
&lt;br /&gt;
Every &amp;lt;code&amp;gt;search&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;browse_structure&amp;lt;/code&amp;gt; call requires &amp;lt;code&amp;gt;tags[&amp;quot;jurisdiction&amp;quot;]&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Value !! Meaning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;quot;fr&amp;quot;&amp;lt;/code&amp;gt; || French law only&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;quot;eu&amp;quot;&amp;lt;/code&amp;gt; || European law only (EUR-Lex, CJEU, ECHR)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;quot;eu{{!}}fr&amp;quot;&amp;lt;/code&amp;gt; || Both (recommended for cross-border questions)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;quot;*&amp;quot;&amp;lt;/code&amp;gt; || All jurisdictions&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;quot;!=eu&amp;quot;&amp;lt;/code&amp;gt; || Everything except EU&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Category:Jurisdictions]]&lt;/div&gt;</description>
			<pubDate>Thu, 23 Apr 2026 02:03:30 GMT</pubDate>
			<dc:creator>Nicolas</dc:creator>
			<comments>https://wiki.dura-lex.org/index.php/Talk:Jurisdictions</comments>
		</item>
		<item>
			<title>Development</title>
			<link>https://wiki.dura-lex.org/index.php?title=Development&amp;diff=33&amp;oldid=0</link>
			<guid isPermaLink="false">https://wiki.dura-lex.org/index.php?title=Development&amp;diff=33&amp;oldid=0</guid>
			<description>&lt;p&gt;Create Development index page (via create-page on MediaWiki MCP Server)&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;For contributors to the Dura Lex codebase. Coding conventions, testing, packaging, and how to add new sources and jurisdictions.&lt;br /&gt;
&lt;br /&gt;
== Sub-pages ==&lt;br /&gt;
&lt;br /&gt;
* [[Development/Python]] — Python coding conventions (naming, architecture, types, docstrings, errors)&lt;br /&gt;
* [[Development/Testing]] — Test organization, fixtures, markers, parametrize&lt;br /&gt;
* [[Development/Packaging]] — Repository structure, namespace packages, pyproject.toml&lt;br /&gt;
* [[Development/GitHub]] — Issues, pull requests, branches, commit messages&lt;br /&gt;
* [[Development/Adding a source]] — How to add a new data source to the ingest pipeline&lt;br /&gt;
&lt;br /&gt;
[[Category:Development]]&lt;/div&gt;</description>
			<pubDate>Thu, 23 Apr 2026 02:03:19 GMT</pubDate>
			<dc:creator>Nicolas</dc:creator>
			<comments>https://wiki.dura-lex.org/index.php/Talk:Development</comments>
		</item>
		<item>
			<title>Corpus</title>
			<link>https://wiki.dura-lex.org/index.php?title=Corpus&amp;diff=32&amp;oldid=0</link>
			<guid isPermaLink="false">https://wiki.dura-lex.org/index.php?title=Corpus&amp;diff=32&amp;oldid=0</guid>
			<description>&lt;p&gt;Corpus index page — links to all data model specs (via create-page on MediaWiki MCP Server)&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;The Dura Lex data model. One table, JSONB tags, six structural kinds. Inspired by OpenStreetMap.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Page !! Scope&lt;br /&gt;
|-&lt;br /&gt;
| [[Corpus/Schema]] || Tables, columns, indexes, DDL, benchmarks&lt;br /&gt;
|-&lt;br /&gt;
| [[Corpus/Tag conventions]] || Shared tag vocabulary across jurisdictions&lt;br /&gt;
|-&lt;br /&gt;
| [[Corpus/Edge types]] || Taxonomy of relationship types between documents (~75 types)&lt;br /&gt;
|-&lt;br /&gt;
| [[Corpus/Quality]] || Content quality levels and annotation confidence&lt;br /&gt;
|-&lt;br /&gt;
| [[Corpus/Temporal]] || Versioning, at_date, non-Gregorian calendars&lt;br /&gt;
|-&lt;br /&gt;
| [[Corpus/FTS]] || Full-text search: trigger, body/body_search, normalization, CJK&lt;br /&gt;
|-&lt;br /&gt;
| [[Corpus/Graph]] || Knowledge graph: concepts, annotations, compilation (draft)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Category:Corpus]]&lt;/div&gt;</description>
			<pubDate>Thu, 23 Apr 2026 02:01:05 GMT</pubDate>
			<dc:creator>Nicolas</dc:creator>
			<comments>https://wiki.dura-lex.org/index.php/Talk:Corpus</comments>
		</item>
		<item>
			<title>Main Page</title>
			<link>https://wiki.dura-lex.org/index.php?title=Main_Page&amp;diff=31&amp;oldid=9</link>
			<guid isPermaLink="false">https://wiki.dura-lex.org/index.php?title=Main_Page&amp;diff=31&amp;oldid=9</guid>
			<description>&lt;p&gt;Fix Sources link: point to Sources page instead of category (via update-page on MediaWiki MCP Server)&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 01:57, 23 April 2026&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l21&quot;&gt;Line 21:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 21:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;| [[:Category:Corpus|Corpus]] || The data model — schema, tags, edges, quality, temporal versioning, FTS&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;| [[:Category:Corpus|Corpus]] || The data model — schema, tags, edges, quality, temporal versioning, FTS&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;|-&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;|-&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;| [[&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;:Category:Sources|&lt;/del&gt;Sources]] || Data dictionary — one page per ingest source, coverage matrix&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;| [[Sources]] || Data dictionary — one page per ingest source, coverage matrix&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;|-&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;|-&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;| [[:Category:Jurisdictions|Jurisdictions]] || Legal systems we cover and how they map to the unified schema&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;| [[:Category:Jurisdictions|Jurisdictions]] || Legal systems we cover and how they map to the unified schema&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;

&lt;!-- diff cache key mediawiki:diff:1.41:old-9:rev-31:php=table --&gt;
&lt;/table&gt;</description>
			<pubDate>Thu, 23 Apr 2026 01:57:59 GMT</pubDate>
			<dc:creator>Nicolas</dc:creator>
			<comments>https://wiki.dura-lex.org/index.php/Talk:Main_Page</comments>
		</item>
		<item>
			<title>Sources/EU/EUR-Lex</title>
			<link>https://wiki.dura-lex.org/index.php?title=Sources/EU/EUR-Lex&amp;diff=30&amp;oldid=0</link>
			<guid isPermaLink="false">https://wiki.dura-lex.org/index.php?title=Sources/EU/EUR-Lex&amp;diff=30&amp;oldid=0</guid>
			<description>&lt;p&gt;Source doc: eurlex — EU legislation (CELLAR/SPARQL) (via create-page on MediaWiki MCP Server)&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;EU legislation from the Publications Office CELLAR database. Regulations, directives, decisions, recommendations, and international agreements. Article-level granularity with chapter/section hierarchy. Year-by-year from 1952 via SPARQL.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Status:&amp;#039;&amp;#039;&amp;#039; active&lt;br /&gt;
&lt;br /&gt;
== Source ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Key !! Kind !! Origin !! Auth !! Update&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;eurlex&amp;lt;/code&amp;gt; || legislation + section || SPARQL + CELLAR download — &amp;lt;code&amp;gt;publications.europa.eu/webapi/rdf/sparql&amp;lt;/code&amp;gt; || none || incremental (year-by-year)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;ID format:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* Text root: &amp;lt;code&amp;gt;eu.eurlextext{celex.lower()}:{lang}&amp;lt;/code&amp;gt; (e.g. &amp;lt;code&amp;gt;eu.eurlextext32016r0679:fr&amp;lt;/code&amp;gt;)&lt;br /&gt;
* Article: &amp;lt;code&amp;gt;eu.eurlexarti{celex.lower()}_{article_number}:{lang}&amp;lt;/code&amp;gt;&lt;br /&gt;
* Chapter/section: &amp;lt;code&amp;gt;eu.eurlexscta{celex.lower()}_{html_id}:{lang}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Coverage:&amp;#039;&amp;#039;&amp;#039; 1952–present&lt;br /&gt;
&lt;br /&gt;
== Tags ==&lt;br /&gt;
&lt;br /&gt;
=== Classification ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! CELEX nature code !! → &amp;lt;code&amp;gt;nature&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| R || &amp;lt;code&amp;gt;REGLEMENT&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| L || &amp;lt;code&amp;gt;DIRECTIVE&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| D || &amp;lt;code&amp;gt;DECISION&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| H || &amp;lt;code&amp;gt;RECOMMANDATION&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| X || &amp;lt;code&amp;gt;ACCORD_INTERNATIONAL&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;type&amp;lt;/code&amp;gt; = &amp;lt;code&amp;gt;statute&amp;lt;/code&amp;gt; (always). &amp;lt;code&amp;gt;number&amp;lt;/code&amp;gt; derived from CELEX pattern (e.g. &amp;lt;code&amp;gt;2016/679&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
=== Enforcement ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! &amp;lt;code&amp;gt;enforcement_status&amp;lt;/code&amp;gt; !! &amp;lt;code&amp;gt;in_force&amp;lt;/code&amp;gt; !! Signal&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;in_force&amp;lt;/code&amp;gt; || true || SPARQL in-force signal present&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;repealed&amp;lt;/code&amp;gt; || false || end_of_validity is past&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Only these two values are emitted (full vocabulary defined in TAG-CONVENTIONS but not used by this source).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;needs_review&amp;lt;/code&amp;gt; = &amp;lt;code&amp;gt;&amp;quot;enforcement_status_missing&amp;quot;&amp;lt;/code&amp;gt; (no signal) or &amp;lt;code&amp;gt;&amp;quot;enforcement_status_contradiction&amp;quot;&amp;lt;/code&amp;gt; (in-force=true but end-of-validity is past).&lt;br /&gt;
&lt;br /&gt;
=== Structure ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Record type !! kind !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| Root text node || section || &amp;lt;code&amp;gt;structure_type: &amp;quot;legislation&amp;quot;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;text_id&amp;lt;/code&amp;gt; = cross-language canonical ID&lt;br /&gt;
|-&lt;br /&gt;
| Chapter || section || parent = text root&lt;br /&gt;
|-&lt;br /&gt;
| Sub-section || section || parent = chapter&lt;br /&gt;
|-&lt;br /&gt;
| Article || legislation || parent = nearest enclosing section&lt;br /&gt;
|-&lt;br /&gt;
| Preamble || legislation || &amp;lt;code&amp;gt;article_number: &amp;quot;PREAMBULE&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Identifiers ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Tag !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;celex&amp;lt;/code&amp;gt; || CELEX identifier&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;text_id&amp;lt;/code&amp;gt; || cross-language canonical work ID (no &amp;lt;code&amp;gt;:lang&amp;lt;/code&amp;gt; suffix)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Multilingual ===&lt;br /&gt;
&lt;br /&gt;
Each language version is a separate row with &amp;lt;code&amp;gt;:{lang}&amp;lt;/code&amp;gt; suffix. &amp;lt;code&amp;gt;translation_pending&amp;lt;/code&amp;gt; set when content was fetched in EN fallback.&lt;br /&gt;
&lt;br /&gt;
== Edges ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! &amp;lt;code&amp;gt;kind&amp;lt;/code&amp;gt; !! Direction !! Trigger&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;language_variant&amp;lt;/code&amp;gt; || EN ↔ FR || post-ingest LLM translation enrichment&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Related sources ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Source !! Relationship&lt;br /&gt;
|-&lt;br /&gt;
| [[Sources/EU/CJEU|cjeu]] || CJEU decisions interpret EU legislation. No cross-source edges yet.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Limitations ==&lt;br /&gt;
&lt;br /&gt;
* Only &amp;lt;code&amp;gt;language=&amp;quot;fr&amp;quot;&amp;lt;/code&amp;gt; ingested — multi-language support planned&lt;br /&gt;
* Only R, L, D, H, X nature codes — other CELEX types not ingested&lt;br /&gt;
* No citation edges between EU legislative acts&lt;br /&gt;
* Legacy/PDF format documents produce a single article (no structural breakdown)&lt;br /&gt;
&lt;br /&gt;
[[Category:Sources]][[Category:EU]]&lt;/div&gt;</description>
			<pubDate>Thu, 23 Apr 2026 01:57:01 GMT</pubDate>
			<dc:creator>Nicolas</dc:creator>
			<comments>https://wiki.dura-lex.org/index.php/Talk:Sources/EU/EUR-Lex</comments>
		</item>
		<item>
			<title>Sources/EU/ECHR</title>
			<link>https://wiki.dura-lex.org/index.php?title=Sources/EU/ECHR&amp;diff=29&amp;oldid=0</link>
			<guid isPermaLink="false">https://wiki.dura-lex.org/index.php?title=Sources/EU/ECHR&amp;diff=29&amp;oldid=0</guid>
			<description>&lt;p&gt;Source doc: echr — European Court of Human Rights (HUDOC) (via create-page on MediaWiki MCP Server)&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;European Court of Human Rights decisions from the HUDOC database. Judgments and admissibility decisions. Year-by-year from 1959, with automatic splitting for high-volume years. Parallel downloads (32 workers).&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Status:&amp;#039;&amp;#039;&amp;#039; active&lt;br /&gt;
&lt;br /&gt;
== Source ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Key !! Kind !! Origin !! Auth !! Update&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;echr&amp;lt;/code&amp;gt; || decision || HUDOC search API — &amp;lt;code&amp;gt;hudoc.echr.coe.int/app/query/results&amp;lt;/code&amp;gt; || none || incremental (year-by-year)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;ID format:&amp;#039;&amp;#039;&amp;#039; &amp;lt;code&amp;gt;eu.echr_{itemid}:{language}&amp;lt;/code&amp;gt; (e.g. &amp;lt;code&amp;gt;eu.echr_001-12345:fr&amp;lt;/code&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Coverage:&amp;#039;&amp;#039;&amp;#039; 1959–present&lt;br /&gt;
&lt;br /&gt;
== Tags ==&lt;br /&gt;
&lt;br /&gt;
=== Classification ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Tag !! Values !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;type&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;judgment&amp;lt;/code&amp;gt; || always (both judgments and decisions)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;nature&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;ARRÊT&amp;lt;/code&amp;gt; (JUDGMENTS collection) or &amp;lt;code&amp;gt;DÉCISION&amp;lt;/code&amp;gt; (DECISIONS collection) ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;document_form&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;canonical_text&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;dissenting_opinion&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;concurring_opinion&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;separate_opinion&amp;lt;/code&amp;gt; || detected via docname regex&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;court&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;echr&amp;lt;/code&amp;gt; || always&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;court_level&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;supranational&amp;lt;/code&amp;gt; || always&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Grades ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! &amp;lt;code&amp;gt;official_grade&amp;lt;/code&amp;gt; !! → &amp;lt;code&amp;gt;importance_level&amp;lt;/code&amp;gt; !! Meaning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;highest_importance&amp;lt;/code&amp;gt; || Key case (ECHR Reports)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;high_importance&amp;lt;/code&amp;gt; || High importance&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;medium_importance&amp;lt;/code&amp;gt; || Medium importance&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;low_importance&amp;lt;/code&amp;gt; || Low importance&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Formation ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! &amp;lt;code&amp;gt;formation_solemnity&amp;lt;/code&amp;gt; !! Criteria&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;grand_bench&amp;lt;/code&amp;gt; || &amp;quot;Grande chambre&amp;quot; in chamber label&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;standard_bench&amp;lt;/code&amp;gt; || section/chamber (not committee, not grand)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;reduced_bench&amp;lt;/code&amp;gt; || &amp;quot;Comité&amp;quot; or &amp;quot;(comité)&amp;quot; in label&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Chamber label derived from &amp;lt;code&amp;gt;originatingbody&amp;lt;/code&amp;gt; (section ID) and &amp;lt;code&amp;gt;doctypebranch&amp;lt;/code&amp;gt;. 5 sections (Première–Cinquième) with optional committee qualifier.&lt;br /&gt;
&lt;br /&gt;
=== Domain-specific ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Tag !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;respondent_state&amp;lt;/code&amp;gt; || defendant country (e.g. &amp;quot;FRA&amp;quot;)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;has_separate_opinion&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;&amp;quot;true&amp;quot;&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;&amp;quot;false&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;echr_branch&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;admissibility&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;admissibility_committee&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;grand_chamber_decision&amp;lt;/code&amp;gt; (when applicable)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;chamber&amp;lt;/code&amp;gt; || full chamber label in French&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;solution&amp;lt;/code&amp;gt; || conclusion field from HUDOC&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;summary&amp;lt;/code&amp;gt; || headnote extracted from bordered CSS box in HTML&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ecli&amp;lt;/code&amp;gt; || ECLI string&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;case_number&amp;lt;/code&amp;gt; || application numbers (split by &amp;quot;;&amp;quot;)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;translation_pending&amp;lt;/code&amp;gt; || target language code when no sibling found&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Edges ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! &amp;lt;code&amp;gt;kind&amp;lt;/code&amp;gt; !! Direction !! Trigger&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;language_variant&amp;lt;/code&amp;gt; || EN ↔ FR || post-ingest LLM translation enrichment&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Related sources ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Source !! Relationship&lt;br /&gt;
|-&lt;br /&gt;
| [[Sources/EU/CJEU|cjeu]] || Separate court system (Council of Europe vs EU). Different grade system, different formation model.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Limitations ==&lt;br /&gt;
&lt;br /&gt;
* Only &amp;lt;code&amp;gt;language=&amp;quot;fr&amp;quot;&amp;lt;/code&amp;gt; ingested — multi-language support planned&lt;br /&gt;
* &amp;lt;code&amp;gt;needs_review: &amp;quot;echr_chamber_unmapped&amp;quot;&amp;lt;/code&amp;gt; when neither branch nor body resolved to known mapping&lt;br /&gt;
* No citation edges between ECHR decisions&lt;br /&gt;
* Formation solemnity not available for single-judge decisions (no &amp;lt;code&amp;gt;single_judge&amp;lt;/code&amp;gt; value set)&lt;br /&gt;
&lt;br /&gt;
[[Category:Sources]][[Category:EU]]&lt;/div&gt;</description>
			<pubDate>Thu, 23 Apr 2026 01:56:42 GMT</pubDate>
			<dc:creator>Nicolas</dc:creator>
			<comments>https://wiki.dura-lex.org/index.php/Talk:Sources/EU/ECHR</comments>
		</item>
		<item>
			<title>Sources/FR/BODACC</title>
			<link>https://wiki.dura-lex.org/index.php?title=Sources/FR/BODACC&amp;diff=28&amp;oldid=0</link>
			<guid isPermaLink="false">https://wiki.dura-lex.org/index.php?title=Sources/FR/BODACC&amp;diff=28&amp;oldid=0</guid>
			<description>&lt;p&gt;Source doc: bodacc — commercial announcements (DILA) (via create-page on MediaWiki MCP Server)&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;Bulletin officiel des annonces civiles et commerciales — commercial announcements from the DILA open data platform. Insolvency proceedings, company registrations, modifications, deregistrations, and annual account filings.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Status:&amp;#039;&amp;#039;&amp;#039; active&lt;br /&gt;
&lt;br /&gt;
== Source ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Key !! Kind !! Origin !! Auth !! Update&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;bodacc&amp;lt;/code&amp;gt; || notice || DILA open data dump — &amp;lt;code&amp;gt;echanges.dila.gouv.fr/OPENDATA/BODACC/&amp;lt;/code&amp;gt; || none || incremental (.taz archives)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;ID format:&amp;#039;&amp;#039;&amp;#039; &amp;lt;code&amp;gt;fr.bodacc_{nojo}_{numero}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;parent_id:&amp;#039;&amp;#039;&amp;#039; &amp;lt;code&amp;gt;fr.company.{siren}&amp;lt;/code&amp;gt; when SIREN is extractable from the RCS number.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Coverage:&amp;#039;&amp;#039;&amp;#039; 1850–present&lt;br /&gt;
&lt;br /&gt;
== Sub-sources ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Key !! Feed !! Content&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;bodacc_pcl&amp;lt;/code&amp;gt; || PCL || Insolvency proceedings (procédures collectives)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;bodacc_rcs_a&amp;lt;/code&amp;gt; || RCS-A || Company registrations (immatriculations)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;bodacc_rcs_b&amp;lt;/code&amp;gt; || RCS-B || Modifications and deregistrations&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;bodacc_bilan&amp;lt;/code&amp;gt; || BILAN || Annual account filings&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Tags ==&lt;br /&gt;
&lt;br /&gt;
=== By sub-feed ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Feed !! &amp;lt;code&amp;gt;type&amp;lt;/code&amp;gt; !! &amp;lt;code&amp;gt;category&amp;lt;/code&amp;gt; !! &amp;lt;code&amp;gt;subcategory&amp;lt;/code&amp;gt; values&lt;br /&gt;
|-&lt;br /&gt;
| PCL || &amp;lt;code&amp;gt;insolvency&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;insolvency&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;liquidation&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;reorganization&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;preventive_restructuring&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;recovery_plan&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;closure&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;consumer_insolvency&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;management_ban&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;asset_transfer&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| RCS-A || &amp;lt;code&amp;gt;registration&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;registration&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;registration_natural_person&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;registration_legal_entity&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;registration_dormant_entity&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;gaec_conversion&amp;lt;/code&amp;gt;, etc.&lt;br /&gt;
|-&lt;br /&gt;
| RCS-B || &amp;lt;code&amp;gt;deregistration&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;modification&amp;lt;/code&amp;gt; || same as type || &amp;lt;code&amp;gt;deregistration&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;modification&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| BILAN || &amp;lt;code&amp;gt;filing&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;filing&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;annual_accounts&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;consolidated_accounts&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Common tags ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Tag !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;authority&amp;lt;/code&amp;gt; || issuing court&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;region&amp;lt;/code&amp;gt; || geographic region&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;effective_date&amp;lt;/code&amp;gt; || effective date of the event&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;registration_number&amp;lt;/code&amp;gt; || RCS number&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;denomination&amp;lt;/code&amp;gt; || company name&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;address_postal_code&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;address_city&amp;lt;/code&amp;gt; || company address&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Edges ==&lt;br /&gt;
&lt;br /&gt;
None. Parent-child relationship to company records via &amp;lt;code&amp;gt;parent_id&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Related sources ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Source !! Relationship&lt;br /&gt;
|-&lt;br /&gt;
| [[Sources/FR/RNE|rne]] || BODACC notices reference companies by SIREN via parent_id.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Limitations ==&lt;br /&gt;
&lt;br /&gt;
* No full text — structured metadata only&lt;br /&gt;
* No grade system&lt;br /&gt;
&lt;br /&gt;
[[Category:Sources]][[Category:FR]]&lt;/div&gt;</description>
			<pubDate>Thu, 23 Apr 2026 01:56:10 GMT</pubDate>
			<dc:creator>Nicolas</dc:creator>
			<comments>https://wiki.dura-lex.org/index.php/Talk:Sources/FR/BODACC</comments>
		</item>
		<item>
			<title>Sources/FR/RNE</title>
			<link>https://wiki.dura-lex.org/index.php?title=Sources/FR/RNE&amp;diff=27&amp;oldid=0</link>
			<guid isPermaLink="false">https://wiki.dura-lex.org/index.php?title=Sources/FR/RNE&amp;diff=27&amp;oldid=0</guid>
			<description>&lt;p&gt;Source doc: rne — French company registry (INPI) (via create-page on MediaWiki MCP Server)&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;French national company registry (Registre National des Entreprises) from INPI. Companies, directors, and establishments. 24.2M companies, 15M directors.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Status:&amp;#039;&amp;#039;&amp;#039; active&lt;br /&gt;
&lt;br /&gt;
== Source ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Key !! Kind !! Origin !! Auth !! Update&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rne&amp;lt;/code&amp;gt; || record || INPI FTP (stock ZIP) + REST API (diffs) || &amp;lt;code&amp;gt;INPI_RNE_FTP_USER&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;INPI_RNE_FTP_PASSWORD&amp;lt;/code&amp;gt; (FTP), &amp;lt;code&amp;gt;INPI_RNE_API_USER&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;INPI_RNE_API_PASSWORD&amp;lt;/code&amp;gt; (API) || stock + incremental diffs&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;ID format:&amp;#039;&amp;#039;&amp;#039; &amp;lt;code&amp;gt;fr.company.{siren}&amp;lt;/code&amp;gt; (company), &amp;lt;code&amp;gt;fr.company.{siren}.dir.{uuid4}&amp;lt;/code&amp;gt; (director)&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Coverage:&amp;#039;&amp;#039;&amp;#039; 1600–present&lt;br /&gt;
&lt;br /&gt;
== Sub-sources ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Key !! Scope&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rne_diff&amp;lt;/code&amp;gt; || incremental diffs via API&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rne_reparse_progress&amp;lt;/code&amp;gt; || resume checkpoint within stock ZIP&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Tags ==&lt;br /&gt;
&lt;br /&gt;
=== Company records ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Tag !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;type&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;company&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;registration_number&amp;lt;/code&amp;gt; || SIREN&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;legal_form_code&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;legal_form_label&amp;lt;/code&amp;gt; || ~50 codes from INSEE&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;activity_code&amp;lt;/code&amp;gt; || APE/NACE code&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;activity_sector&amp;lt;/code&amp;gt; || sector description&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;entity_status&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;active&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;ceased&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;entity_type&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;legal_entity&amp;lt;/code&amp;gt; (M), &amp;lt;code&amp;gt;natural_person&amp;lt;/code&amp;gt; (P), &amp;lt;code&amp;gt;agricultural_entity&amp;lt;/code&amp;gt; (E)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;capital_amount&amp;lt;/code&amp;gt; || integer centimes&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;address_street&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;address_postal_code&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;address_city&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;address_country&amp;lt;/code&amp;gt; || registered address&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Director records ===&lt;br /&gt;
&lt;br /&gt;
parent_id = company ID&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Tag !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;type&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;person&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;role_code&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;role_label&amp;lt;/code&amp;gt; || 17 codes (gérant, DG, président SAS...)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;role_category&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;dirigeant&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;gouvernance&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;controle&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;autre&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;entity_type&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;natural_person&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;legal_entity&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;last_name&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;first_names&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;birth_year&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;nationality&amp;lt;/code&amp;gt; || natural persons&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;denomination&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;director_registration_number&amp;lt;/code&amp;gt; || legal entity directors&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Establishment records ===&lt;br /&gt;
&lt;br /&gt;
parent_id = company ID, type = &amp;lt;code&amp;gt;establishment&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Edges ==&lt;br /&gt;
&lt;br /&gt;
None. Parent-child relationships via &amp;lt;code&amp;gt;parent_id&amp;lt;/code&amp;gt;, not edges table.&lt;br /&gt;
&lt;br /&gt;
== Related sources ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Source !! Relationship&lt;br /&gt;
|-&lt;br /&gt;
| [[Sources/FR/BODACC|bodacc]] || BODACC notices reference companies by SIREN. &amp;lt;code&amp;gt;parent_id&amp;lt;/code&amp;gt; = &amp;lt;code&amp;gt;fr.company.{siren}&amp;lt;/code&amp;gt;.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Limitations ==&lt;br /&gt;
&lt;br /&gt;
* Non-diffusible records (diffusionINSEE = &amp;quot;N&amp;quot;) are filtered out&lt;br /&gt;
* Stock ZIP is multi-GB, requires FTP with resume support&lt;br /&gt;
* Director IDs are UUID4 — not stable across re-ingests&lt;br /&gt;
&lt;br /&gt;
[[Category:Sources]][[Category:FR]]&lt;/div&gt;</description>
			<pubDate>Thu, 23 Apr 2026 01:55:57 GMT</pubDate>
			<dc:creator>Nicolas</dc:creator>
			<comments>https://wiki.dura-lex.org/index.php/Talk:Sources/FR/RNE</comments>
		</item>
		<item>
			<title>Sources/FR/BOFiP</title>
			<link>https://wiki.dura-lex.org/index.php?title=Sources/FR/BOFiP&amp;diff=26&amp;oldid=0</link>
			<guid isPermaLink="false">https://wiki.dura-lex.org/index.php?title=Sources/FR/BOFiP&amp;diff=26&amp;oldid=0</guid>
			<description>&lt;p&gt;Source doc: bofip — tax doctrine (DGFiP) (via create-page on MediaWiki MCP Server)&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;Bulletin Officiel des Finances Publiques — tax authority doctrine from the DGFiP. Commentaries, rate tables, recommendations, and reference guides on French tax law. Opposable to the tax authority (taxpayer can rely on it), but NOT binding on courts.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Status:&amp;#039;&amp;#039;&amp;#039; active&lt;br /&gt;
&lt;br /&gt;
== Source ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Key !! Kind !! Origin !! Auth !! Update&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;bofip&amp;lt;/code&amp;gt; || legislation + section || DGFiP open data — &amp;lt;code&amp;gt;bofip.impots.gouv.fr/opendata/&amp;lt;/code&amp;gt; || none || incremental (stock + flux archives)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;ID format:&amp;#039;&amp;#039;&amp;#039; &amp;lt;code&amp;gt;fr.bofip_{pgp_id.lower()}&amp;lt;/code&amp;gt; (content), &amp;lt;code&amp;gt;fr.{node_id.lower()}&amp;lt;/code&amp;gt; (structure)&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Coverage:&amp;#039;&amp;#039;&amp;#039; 2000–present&lt;br /&gt;
&lt;br /&gt;
== Tags ==&lt;br /&gt;
&lt;br /&gt;
=== Classification ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Tag !! Values&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;type&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;guidance&amp;lt;/code&amp;gt; (always)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Guidance subtypes ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! &amp;lt;code&amp;gt;guidance_subtype&amp;lt;/code&amp;gt; !! Source contenu_type&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;commentary&amp;lt;/code&amp;gt; || commentaire&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;opinion&amp;lt;/code&amp;gt; || avis&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;reference_guide&amp;lt;/code&amp;gt; || référentiel&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;annex&amp;lt;/code&amp;gt; || autres annexes&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;template&amp;lt;/code&amp;gt; || lettre type / modèle&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;recommendation&amp;lt;/code&amp;gt; || recommandation&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;form&amp;lt;/code&amp;gt; || formulaire&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rate_table&amp;lt;/code&amp;gt; || barème&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;map&amp;lt;/code&amp;gt; || cartographie&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Domain-specific ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Tag !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;series&amp;lt;/code&amp;gt; || first Dublin Core subject (IR, IS, TVA, BIC, BNC, CF...)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;modification_date&amp;lt;/code&amp;gt; || last modification date&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;importance_level&amp;lt;/code&amp;gt; || always &amp;lt;code&amp;gt;high_importance&amp;lt;/code&amp;gt; (no per-document grading)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Structure ===&lt;br /&gt;
&lt;br /&gt;
PlanClassement produces kind=&amp;lt;code&amp;gt;section&amp;lt;/code&amp;gt; with &amp;lt;code&amp;gt;structure_type: &amp;quot;doctrine&amp;quot;&amp;lt;/code&amp;gt;, forming a hierarchical tree. Content documents are children of these sections.&lt;br /&gt;
&lt;br /&gt;
== Edges ==&lt;br /&gt;
&lt;br /&gt;
None.&lt;br /&gt;
&lt;br /&gt;
== Limitations ==&lt;br /&gt;
&lt;br /&gt;
* No per-document grade system — all BOFiP has uniform importance&lt;br /&gt;
* Opposable to the tax authority, NOT binding on courts&lt;br /&gt;
* Structure relies on PlanClassement XML which can be complex&lt;br /&gt;
&lt;br /&gt;
[[Category:Sources]][[Category:FR]]&lt;/div&gt;</description>
			<pubDate>Thu, 23 Apr 2026 01:55:38 GMT</pubDate>
			<dc:creator>Nicolas</dc:creator>
			<comments>https://wiki.dura-lex.org/index.php/Talk:Sources/FR/BOFiP</comments>
		</item>
		<item>
			<title>Sources/FR/ACCO</title>
			<link>https://wiki.dura-lex.org/index.php?title=Sources/FR/ACCO&amp;diff=25&amp;oldid=0</link>
			<guid isPermaLink="false">https://wiki.dura-lex.org/index.php?title=Sources/FR/ACCO&amp;diff=25&amp;oldid=0</guid>
			<description>&lt;p&gt;Source doc: acco — enterprise labor agreements (DILA) (via create-page on MediaWiki MCP Server)&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;Enterprise and branch labor agreements filed with the French Ministry of Labor. Metadata-rich (IDCC, unions, themes, company identifiers), often with attached .docx/.odt content files. See also [[Sources/FR/KALI|kali]] for extended branch conventions.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Status:&amp;#039;&amp;#039;&amp;#039; active&lt;br /&gt;
&lt;br /&gt;
== Source ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Key !! Kind !! Origin !! Auth !! Update&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;acco&amp;lt;/code&amp;gt; || legislation || DILA open data dump — &amp;lt;code&amp;gt;echanges.dila.gouv.fr/OPENDATA/ACCO/&amp;lt;/code&amp;gt; || none || incremental (tar.gz archives)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;ID format:&amp;#039;&amp;#039;&amp;#039; &amp;lt;code&amp;gt;fr.{raw_id.lower()}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Coverage:&amp;#039;&amp;#039;&amp;#039; 1900–present (includes forward-dated expiration)&lt;br /&gt;
&lt;br /&gt;
== Tags ==&lt;br /&gt;
&lt;br /&gt;
=== Classification ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Tag !! Values&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;type&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;collective_agreement&amp;lt;/code&amp;gt; (always)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;document_form&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;canonical_text&amp;lt;/code&amp;gt; (ACCORD), &amp;lt;code&amp;gt;amendment&amp;lt;/code&amp;gt; (AVENANT), &amp;lt;code&amp;gt;corrigendum&amp;lt;/code&amp;gt; (RECTIFICATIF)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Domain-specific ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Tag !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;bargaining_level&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;sectoral&amp;lt;/code&amp;gt; (CODE_UNITE_SIGNATAIRE in 01/02) or &amp;lt;code&amp;gt;enterprise&amp;lt;/code&amp;gt; (others)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;idcc&amp;lt;/code&amp;gt; || convention collective identifier&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;themes&amp;lt;/code&amp;gt; || list of theme labels&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;unions&amp;lt;/code&amp;gt; || list of signatory unions&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;siret&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;siren&amp;lt;/code&amp;gt; || company identifiers&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;company_name&amp;lt;/code&amp;gt; || company denomination&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;activity_code&amp;lt;/code&amp;gt; || APE/NACE code&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;sector&amp;lt;/code&amp;gt; || industry sector&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;number&amp;lt;/code&amp;gt; || agreement number&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;is_complete_version&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;&amp;quot;true&amp;quot;&amp;lt;/code&amp;gt; if integral version&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Dates ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Tag !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;filing_date&amp;lt;/code&amp;gt; || date filed with ministry&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;text_date&amp;lt;/code&amp;gt; || date of the agreement text&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;effective_date&amp;lt;/code&amp;gt; || entry into force&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;publication_date&amp;lt;/code&amp;gt; || publication date&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;expiration_date&amp;lt;/code&amp;gt; || end of validity (sentinel 2999-01-01 stripped)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;date&amp;lt;/code&amp;gt; column: coalesced from filing_date &amp;gt; text_date &amp;gt; effective_date &amp;gt; publication_date.&lt;br /&gt;
&lt;br /&gt;
== Edges ==&lt;br /&gt;
&lt;br /&gt;
None.&lt;br /&gt;
&lt;br /&gt;
== Related sources ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Source !! Relationship&lt;br /&gt;
|-&lt;br /&gt;
| [[Sources/FR/KALI|kali]] || Complementary. KALI = extended branch conventions with article-level granularity and enforcement tracking. ACCO = filed agreements with company-level metadata.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Limitations ==&lt;br /&gt;
&lt;br /&gt;
* No enforcement_status tracking (unlike KALI)&lt;br /&gt;
* No article-level granularity — each agreement is a single document&lt;br /&gt;
* Content often in .docx/.odt attachments, not structured XML&lt;br /&gt;
* No edges&lt;br /&gt;
&lt;br /&gt;
[[Category:Sources]][[Category:FR]]&lt;/div&gt;</description>
			<pubDate>Thu, 23 Apr 2026 01:55:19 GMT</pubDate>
			<dc:creator>Nicolas</dc:creator>
			<comments>https://wiki.dura-lex.org/index.php/Talk:Sources/FR/ACCO</comments>
		</item>
		<item>
			<title>Sources/FR/KALI</title>
			<link>https://wiki.dura-lex.org/index.php?title=Sources/FR/KALI&amp;diff=24&amp;oldid=0</link>
			<guid isPermaLink="false">https://wiki.dura-lex.org/index.php?title=Sources/FR/KALI&amp;diff=24&amp;oldid=0</guid>
			<description>&lt;p&gt;Source doc: kali — collective labor agreements (DILA) (via create-page on MediaWiki MCP Server)&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;French collective labor agreements (conventions collectives de branche) from the DILA open data platform. Extended branch agreements with article-level granularity, enforcement status tracking, and IDCC codes. See also [[Sources/FR/ACCO|acco]] for enterprise-level agreements.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Status:&amp;#039;&amp;#039;&amp;#039; active&lt;br /&gt;
&lt;br /&gt;
== Source ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Key !! Kind !! Origin !! Auth !! Update&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;kali&amp;lt;/code&amp;gt; || legislation + section || DILA open data dump — &amp;lt;code&amp;gt;echanges.dila.gouv.fr/OPENDATA/KALI/&amp;lt;/code&amp;gt; || none || incremental (tar.gz archives)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;ID format:&amp;#039;&amp;#039;&amp;#039; &amp;lt;code&amp;gt;fr.{raw_id.lower()}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Coverage:&amp;#039;&amp;#039;&amp;#039; 1850–present (includes forward-dated expiration)&lt;br /&gt;
&lt;br /&gt;
== Tags ==&lt;br /&gt;
&lt;br /&gt;
=== Classification (articles) ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Tag !! Values&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;type&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;collective_agreement&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;document_form&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;canonical_text&amp;lt;/code&amp;gt; (ACCORD), &amp;lt;code&amp;gt;amendment&amp;lt;/code&amp;gt; (AVENANT), &amp;lt;code&amp;gt;corrigendum&amp;lt;/code&amp;gt; (RECTIFICATIF)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Domain-specific ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Tag !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;idcc&amp;lt;/code&amp;gt; || convention collective identifier (IDCC code)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;nature&amp;lt;/code&amp;gt; || raw NATURE field&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;article_number&amp;lt;/code&amp;gt; || article number within the text&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;section_path&amp;lt;/code&amp;gt; || breadcrumb through TM hierarchy&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;text_id&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;container_id&amp;lt;/code&amp;gt; || structural references&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;sector&amp;lt;/code&amp;gt; || industry sector&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Enforcement ===&lt;br /&gt;
&lt;br /&gt;
Same enforcement_status mapping as [[Sources/FR/LEGI|legi]] — full 13-value vocabulary from DILA ETAT codes (in_force, repealed, superseded, transferred, denounced, etc.).&lt;br /&gt;
&lt;br /&gt;
Temporal validity via &amp;lt;code&amp;gt;date&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;date_end&amp;lt;/code&amp;gt;. Sentinel &amp;lt;code&amp;gt;2999-01-01&amp;lt;/code&amp;gt; stripped to null.&lt;br /&gt;
&lt;br /&gt;
=== Structure ===&lt;br /&gt;
&lt;br /&gt;
KALI produces multiple record types:&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;ARTICLE&amp;#039;&amp;#039;&amp;#039; → kind=&amp;lt;code&amp;gt;legislation&amp;lt;/code&amp;gt; (the actual agreement articles)&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;IDCC containers&amp;#039;&amp;#039;&amp;#039; (KALICONT + TM groups) → kind=&amp;lt;code&amp;gt;section&amp;lt;/code&amp;gt; with &amp;lt;code&amp;gt;structure_type: &amp;quot;labor&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;SECTION_TA&amp;#039;&amp;#039;&amp;#039; → kind=&amp;lt;code&amp;gt;section&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;TEXTEKALI&amp;#039;&amp;#039;&amp;#039; → kind=&amp;lt;code&amp;gt;section&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;TEXTE_VERSION&amp;#039;&amp;#039;&amp;#039; → skipped&lt;br /&gt;
&lt;br /&gt;
== Edges ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! &amp;lt;code&amp;gt;kind&amp;lt;/code&amp;gt; !! Direction !! Trigger&lt;br /&gt;
|-&lt;br /&gt;
| various (normalized link types) || article → article || ARTICLE LIENS elements with sens=&amp;quot;cible&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Properties include &amp;lt;code&amp;gt;target_cid&amp;lt;/code&amp;gt; when cidtexte is present.&lt;br /&gt;
&lt;br /&gt;
== Related sources ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Source !! Relationship&lt;br /&gt;
|-&lt;br /&gt;
| [[Sources/FR/ACCO|acco]] || Complementary. KALI = extended branch conventions (with articles, enforcement tracking). ACCO = filed enterprise agreements (metadata-heavy, often with .docx/.odt attachments).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Limitations ==&lt;br /&gt;
&lt;br /&gt;
* Complex archive layout with multiple root element types&lt;br /&gt;
* Section hierarchy is deep (IDCC → TM → SECTION_TA → ARTICLE)&lt;br /&gt;
&lt;br /&gt;
[[Category:Sources]][[Category:FR]]&lt;/div&gt;</description>
			<pubDate>Thu, 23 Apr 2026 01:55:10 GMT</pubDate>
			<dc:creator>Nicolas</dc:creator>
			<comments>https://wiki.dura-lex.org/index.php/Talk:Sources/FR/KALI</comments>
		</item>
		<item>
			<title>Sources/FR/JORF</title>
			<link>https://wiki.dura-lex.org/index.php?title=Sources/FR/JORF&amp;diff=23&amp;oldid=0</link>
			<guid isPermaLink="false">https://wiki.dura-lex.org/index.php?title=Sources/FR/JORF&amp;diff=23&amp;oldid=0</guid>
			<description>&lt;p&gt;Source doc: jorf — Journal officiel (DILA) (via create-page on MediaWiki MCP Server)&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;Journal officiel de la République française — original gazette publication of laws, decrees, orders, and official notices. The gazette counterpart to [[Sources/FR/LEGI|legi]] (consolidated). JORF captures the original publication with visas, ministère, and gazette structure. Linked to LEGI via &amp;lt;code&amp;gt;source_text&amp;lt;/code&amp;gt; edges.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Status:&amp;#039;&amp;#039;&amp;#039; active&lt;br /&gt;
&lt;br /&gt;
== Source ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Key !! Kind !! Origin !! Auth !! Update&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;jorf&amp;lt;/code&amp;gt; || legislation + section + notice || DILA open data dump — &amp;lt;code&amp;gt;echanges.dila.gouv.fr/OPENDATA/JORF/&amp;lt;/code&amp;gt; || none || incremental (tar.gz archives)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;ID format:&amp;#039;&amp;#039;&amp;#039; &amp;lt;code&amp;gt;fr.{raw_id.lower()}&amp;lt;/code&amp;gt; (e.g. &amp;lt;code&amp;gt;fr.jorftext000000000001&amp;lt;/code&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Coverage:&amp;#039;&amp;#039;&amp;#039; 1539–present (includes forward entry-into-force dates)&lt;br /&gt;
&lt;br /&gt;
== Tags ==&lt;br /&gt;
&lt;br /&gt;
=== Classification ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! NATURE !! → &amp;lt;code&amp;gt;type&amp;lt;/code&amp;gt; !! → &amp;lt;code&amp;gt;document_form&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| LOI, LOI_ORGANIQUE || &amp;lt;code&amp;gt;statute&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;canonical_text&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| ORDONNANCE || &amp;lt;code&amp;gt;ordinance&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;canonical_text&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| DECRET || &amp;lt;code&amp;gt;decree&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;canonical_text&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| ARRETE, DECISION || &amp;lt;code&amp;gt;order&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;canonical_text&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| AVIS || &amp;lt;code&amp;gt;order&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;gazette_notice&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| CIRCULAIRE || &amp;lt;code&amp;gt;circular&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;canonical_text&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| RECTIFICATIF || (same as base) || &amp;lt;code&amp;gt;corrigendum&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| other || &amp;lt;code&amp;gt;normative_document&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;canonical_text&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Domain-specific ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Tag !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;nor&amp;lt;/code&amp;gt; || NOR identifier&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;number&amp;lt;/code&amp;gt; || act number&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ministere&amp;lt;/code&amp;gt; || issuing ministry&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;date_published&amp;lt;/code&amp;gt; || gazette publication date&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;publication_reference&amp;lt;/code&amp;gt; || JO reference&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;eli&amp;lt;/code&amp;gt; || European Legislation Identifier&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;text_id&amp;lt;/code&amp;gt; || JORFTEXT canonical ID&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;legi_text_id&amp;lt;/code&amp;gt; || corresponding LEGITEXT ID (when available)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Gazette structure ===&lt;br /&gt;
&lt;br /&gt;
JO containers produce kind=&amp;lt;code&amp;gt;notice&amp;lt;/code&amp;gt; with type=&amp;lt;code&amp;gt;gazette_publication&amp;lt;/code&amp;gt; and child sections with &amp;lt;code&amp;gt;structure_type: &amp;quot;official_journal&amp;quot;&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Edges ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! &amp;lt;code&amp;gt;kind&amp;lt;/code&amp;gt; !! Direction !! Trigger&lt;br /&gt;
|-&lt;br /&gt;
| various (cites, amends...) || outgoing || TEXTE_VERSION LIENS with sens=&amp;quot;source&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;source_text&amp;lt;/code&amp;gt; || LEGITEXT → JORFTEXT || TEXTELR VERSIONS/VERSION/LIEN_TXT&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Related sources ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Source !! Relationship&lt;br /&gt;
|-&lt;br /&gt;
| [[Sources/FR/LEGI|legi]] || Same texts, different view. LEGI = consolidated + versioned. JORF = original gazette. ~4% of JORF texts have no LEGI counterpart. Linked by &amp;lt;code&amp;gt;source_text&amp;lt;/code&amp;gt; edges.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Limitations ==&lt;br /&gt;
&lt;br /&gt;
* No enforcement_status — JORF is the original publication, not the consolidated version&lt;br /&gt;
* Hidden from default search — access via &amp;lt;code&amp;gt;tags={&amp;quot;source&amp;quot;: &amp;quot;jorf&amp;quot;}&amp;lt;/code&amp;gt;&lt;br /&gt;
* No versioning — each article is a single snapshot at publication time&lt;br /&gt;
&lt;br /&gt;
[[Category:Sources]][[Category:FR]]&lt;/div&gt;</description>
			<pubDate>Thu, 23 Apr 2026 01:54:50 GMT</pubDate>
			<dc:creator>Nicolas</dc:creator>
			<comments>https://wiki.dura-lex.org/index.php/Talk:Sources/FR/JORF</comments>
		</item>
		<item>
			<title>Sources/FR/CADA</title>
			<link>https://wiki.dura-lex.org/index.php?title=Sources/FR/CADA&amp;diff=22&amp;oldid=0</link>
			<guid isPermaLink="false">https://wiki.dura-lex.org/index.php?title=Sources/FR/CADA&amp;diff=22&amp;oldid=0</guid>
			<description>&lt;p&gt;Source doc: cada — transparency authority opinions (via create-page on MediaWiki MCP Server)&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;Opinions and advice from the Commission d&amp;#039;accès aux documents administratifs (CADA) — the French transparency authority. Single consolidated CSV from data.gouv.fr. ~60,000 records, 1984–present.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Status:&amp;#039;&amp;#039;&amp;#039; active&lt;br /&gt;
&lt;br /&gt;
== Source ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Key !! Kind !! Origin !! Auth !! Update&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;cada&amp;lt;/code&amp;gt; || decision || data.gouv.fr CSV (~184 MB) — dataset &amp;lt;code&amp;gt;53698f37a3a729239d2036a0&amp;lt;/code&amp;gt; || none || full re-download (checks last_modified)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;ID format:&amp;#039;&amp;#039;&amp;#039; &amp;lt;code&amp;gt;fr.cada_{number}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Coverage:&amp;#039;&amp;#039;&amp;#039; 1984–present&lt;br /&gt;
&lt;br /&gt;
== Tags ==&lt;br /&gt;
&lt;br /&gt;
=== Classification ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Tag !! Values&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;type&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;administrative_decision&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;court&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;cada&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;nature&amp;lt;/code&amp;gt; || CSV column &amp;quot;Type&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Domain-specific ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Tag !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;authority&amp;lt;/code&amp;gt; || administation concerned&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;theme&amp;lt;/code&amp;gt; || subject classification&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;solution&amp;lt;/code&amp;gt; || outcome (&amp;quot;Sens et motivation&amp;quot;)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;case_number&amp;lt;/code&amp;gt; || dossier number&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;_importance_level_default&amp;lt;/code&amp;gt; = &amp;lt;code&amp;gt;low_importance&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Grades ===&lt;br /&gt;
&lt;br /&gt;
No grade system.&lt;br /&gt;
&lt;br /&gt;
== Edges ==&lt;br /&gt;
&lt;br /&gt;
None.&lt;br /&gt;
&lt;br /&gt;
== Limitations ==&lt;br /&gt;
&lt;br /&gt;
* No full text — only structured metadata and outcome&lt;br /&gt;
* Orphan cleanup: deletes CADA records not in current CSV when total ≥ 30,000&lt;br /&gt;
&lt;br /&gt;
[[Category:Sources]][[Category:FR]]&lt;/div&gt;</description>
			<pubDate>Thu, 23 Apr 2026 01:54:24 GMT</pubDate>
			<dc:creator>Nicolas</dc:creator>
			<comments>https://wiki.dura-lex.org/index.php/Talk:Sources/FR/CADA</comments>
		</item>
		<item>
			<title>Sources/FR/Jufi</title>
			<link>https://wiki.dura-lex.org/index.php?title=Sources/FR/Jufi&amp;diff=21&amp;oldid=0</link>
			<guid isPermaLink="false">https://wiki.dura-lex.org/index.php?title=Sources/FR/Jufi&amp;diff=21&amp;oldid=0</guid>
			<description>&lt;p&gt;Source doc: jufi — financial courts (Légifrance API) (via create-page on MediaWiki MCP Server)&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;French financial court decisions from the Légifrance PISTE API. Covers Cour des comptes (supreme), chambres régionales des comptes (CRC), Cour de discipline budgétaire et financière (CDBF), and Cour d&amp;#039;appel financière (CAF). ~3,500 decisions, 1950–present.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Status:&amp;#039;&amp;#039;&amp;#039; active&lt;br /&gt;
&lt;br /&gt;
== Source ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Key !! Kind !! Origin !! Auth !! Update&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;jufi&amp;lt;/code&amp;gt; || decision || Légifrance PISTE API — &amp;lt;code&amp;gt;api.piste.gouv.fr/dila/legifrance/lf-engine-app&amp;lt;/code&amp;gt; (fond=JUFI) || &amp;lt;code&amp;gt;PISTE_OAUTH_CLIENT_ID&amp;lt;/code&amp;gt; + &amp;lt;code&amp;gt;PISTE_OAUTH_CLIENT_SECRET&amp;lt;/code&amp;gt; (OAuth2) || incremental (date-filtered search)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;ID format:&amp;#039;&amp;#039;&amp;#039; &amp;lt;code&amp;gt;fr.{decision_id.lower()}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Coverage:&amp;#039;&amp;#039;&amp;#039; 1950–present&lt;br /&gt;
&lt;br /&gt;
== Sub-sources ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Key !! Scope&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;jufi_cour_des_comptes&amp;lt;/code&amp;gt; || Cour des comptes&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;jufi_chambres_comptes&amp;lt;/code&amp;gt; || Chambres régionales des comptes&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;jufi_discipline&amp;lt;/code&amp;gt; || Cour de discipline budgétaire et financière&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;jufi_appel_financiere&amp;lt;/code&amp;gt; || Cour d&amp;#039;appel financière&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Tags ==&lt;br /&gt;
&lt;br /&gt;
=== Courts ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! &amp;lt;code&amp;gt;court&amp;lt;/code&amp;gt; !! &amp;lt;code&amp;gt;court_level&amp;lt;/code&amp;gt; !! natureJuridiction&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;cour_des_comptes&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;supreme&amp;lt;/code&amp;gt; || COURS_COMPTES&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;chambre_regionale_des_comptes&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;first_instance&amp;lt;/code&amp;gt; || CHAMBRES_COMPTES&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;cour_discipline_budgetaire_financiere&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;first_instance&amp;lt;/code&amp;gt; || COURS_DE_DISCIPLINE&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;cour_appel_financiere&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;appellate&amp;lt;/code&amp;gt; || COURS_APPEL_FINANCIERE&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;court_location&amp;lt;/code&amp;gt;: extracted from CRC formation strings matching &amp;quot;CRC {region}&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Grades ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! &amp;lt;code&amp;gt;official_grade&amp;lt;/code&amp;gt; !! → &amp;lt;code&amp;gt;importance_level&amp;lt;/code&amp;gt; !! Source signal&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;recueil&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;high_importance&amp;lt;/code&amp;gt; || publicationRecueil = &amp;quot;C&amp;quot; or starts with &amp;quot;Publié&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| (none) || default || no publication signal&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Identifiers ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Tag !! Format&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;case_number&amp;lt;/code&amp;gt; || array&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Domain-specific ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Tag !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rapporteur&amp;lt;/code&amp;gt; || reporting judge&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;commissaire&amp;lt;/code&amp;gt; || government commissioner&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;chamber&amp;lt;/code&amp;gt; || formation value for non-CRC courts&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Edges ==&lt;br /&gt;
&lt;br /&gt;
None.&lt;br /&gt;
&lt;br /&gt;
== Limitations ==&lt;br /&gt;
&lt;br /&gt;
* Small corpus (~3,500 decisions)&lt;br /&gt;
* No formation_solemnity&lt;br /&gt;
* OAuth2 authentication required (not simple API key)&lt;br /&gt;
* Rate-limited (0.5s default)&lt;br /&gt;
&lt;br /&gt;
[[Category:Sources]][[Category:FR]]&lt;/div&gt;</description>
			<pubDate>Thu, 23 Apr 2026 01:54:15 GMT</pubDate>
			<dc:creator>Nicolas</dc:creator>
			<comments>https://wiki.dura-lex.org/index.php/Talk:Sources/FR/Jufi</comments>
		</item>
		<item>
			<title>Sources/FR/INCA</title>
			<link>https://wiki.dura-lex.org/index.php?title=Sources/FR/INCA&amp;diff=20&amp;oldid=0</link>
			<guid isPermaLink="false">https://wiki.dura-lex.org/index.php?title=Sources/FR/INCA&amp;diff=20&amp;oldid=0</guid>
			<description>&lt;p&gt;Source doc: inca — legacy administrative courts (superseded) (via create-page on MediaWiki MCP Server)&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;Legacy administrative court decisions from the DILA open data platform. Superseded by [[Sources/FR/Jade|jade]] and [[Sources/FR/CE OpenData|ce_opendata]].&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Status:&amp;#039;&amp;#039;&amp;#039; legacy&lt;br /&gt;
&lt;br /&gt;
== Source ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Key !! Kind !! Origin !! Auth !! Update&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;inca&amp;lt;/code&amp;gt; || decision || DILA open data dump — &amp;lt;code&amp;gt;echanges.dila.gouv.fr/OPENDATA/INCA/&amp;lt;/code&amp;gt; || none || no longer updated&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Coverage:&amp;#039;&amp;#039;&amp;#039; 1800–present (historical)&lt;br /&gt;
&lt;br /&gt;
== Tags ==&lt;br /&gt;
&lt;br /&gt;
Same parser as [[Sources/FR/Cass|cass]] (&amp;lt;code&amp;gt;case_law_parser&amp;lt;/code&amp;gt;). Tags follow the same pattern — court, grade, formation, identifiers.&lt;br /&gt;
&lt;br /&gt;
Grade for inca: &amp;lt;code&amp;gt;diffuse&amp;lt;/code&amp;gt; (PUBLI_BULL@publie=&amp;quot;non&amp;quot; or absent) or &amp;lt;code&amp;gt;bulletin&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Edges ==&lt;br /&gt;
&lt;br /&gt;
None.&lt;br /&gt;
&lt;br /&gt;
== Related sources ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Source !! Relationship&lt;br /&gt;
|-&lt;br /&gt;
| [[Sources/FR/Jade|jade]] || Replacement — DILA open data dump for administrative courts&lt;br /&gt;
|-&lt;br /&gt;
| [[Sources/FR/CE OpenData|ce_opendata]] || Replacement — Conseil d&amp;#039;État&amp;#039;s own portal, more structured&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Category:Sources]][[Category:FR]]&lt;/div&gt;</description>
			<pubDate>Thu, 23 Apr 2026 01:53:59 GMT</pubDate>
			<dc:creator>Nicolas</dc:creator>
			<comments>https://wiki.dura-lex.org/index.php/Talk:Sources/FR/INCA</comments>
		</item>
		<item>
			<title>Sources/FR/CNIL</title>
			<link>https://wiki.dura-lex.org/index.php?title=Sources/FR/CNIL&amp;diff=19&amp;oldid=0</link>
			<guid isPermaLink="false">https://wiki.dura-lex.org/index.php?title=Sources/FR/CNIL&amp;diff=19&amp;oldid=0</guid>
			<description>&lt;p&gt;Source doc: cnil — data protection authority (DILA) (via create-page on MediaWiki MCP Server)&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;CNIL (French data protection authority) decisions and guidelines from the DILA open data platform. Produces both decision (sanctions, enforcement) and legislation (guidance, opinions, recommendations) depending on the nature of the deliberation.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Status:&amp;#039;&amp;#039;&amp;#039; active&lt;br /&gt;
&lt;br /&gt;
== Source ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Key !! Kind !! Origin !! Auth !! Update&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;cnil&amp;lt;/code&amp;gt; || decision + legislation || DILA open data dump — &amp;lt;code&amp;gt;echanges.dila.gouv.fr/OPENDATA/CNIL/&amp;lt;/code&amp;gt; || none || incremental (tar.gz archives)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;ID format:&amp;#039;&amp;#039;&amp;#039; &amp;lt;code&amp;gt;fr.{raw_id.lower()}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Coverage:&amp;#039;&amp;#039;&amp;#039; 1978–present&lt;br /&gt;
&lt;br /&gt;
== Tags ==&lt;br /&gt;
&lt;br /&gt;
=== Classification ===&lt;br /&gt;
&lt;br /&gt;
Routing depends on NATURE_DELIB:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! NATURE_DELIB !! → kind !! → type !! → guidance_subtype&lt;br /&gt;
|-&lt;br /&gt;
| avis || legislation || &amp;lt;code&amp;gt;guidance&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;opinion&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| recommandation/lignes directrices || legislation || &amp;lt;code&amp;gt;guidance&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;recommendation&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| référentiel/règlement type/norme || legislation || &amp;lt;code&amp;gt;guidance&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;reference_guide&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| other (sanctions, enforcement) || decision || &amp;lt;code&amp;gt;administrative_decision&amp;lt;/code&amp;gt; || —&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Grades ===&lt;br /&gt;
&lt;br /&gt;
No grade system.&lt;br /&gt;
&lt;br /&gt;
=== Identifiers ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Tag !! Format&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;case_number&amp;lt;/code&amp;gt; || for decisions (sanctions)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Edges ==&lt;br /&gt;
&lt;br /&gt;
None.&lt;br /&gt;
&lt;br /&gt;
== Limitations ==&lt;br /&gt;
&lt;br /&gt;
* Source registry declares &amp;lt;code&amp;gt;kind=&amp;quot;decision&amp;quot;&amp;lt;/code&amp;gt; but parser also produces &amp;lt;code&amp;gt;legislation&amp;lt;/code&amp;gt; — registry needs fixing&lt;br /&gt;
* No structured grade or formation system&lt;br /&gt;
&lt;br /&gt;
[[Category:Sources]][[Category:FR]]&lt;/div&gt;</description>
			<pubDate>Thu, 23 Apr 2026 01:53:42 GMT</pubDate>
			<dc:creator>Nicolas</dc:creator>
			<comments>https://wiki.dura-lex.org/index.php/Talk:Sources/FR/CNIL</comments>
		</item>
		<item>
			<title>Sources/FR/Constit</title>
			<link>https://wiki.dura-lex.org/index.php?title=Sources/FR/Constit&amp;diff=18&amp;oldid=0</link>
			<guid isPermaLink="false">https://wiki.dura-lex.org/index.php?title=Sources/FR/Constit&amp;diff=18&amp;oldid=0</guid>
			<description>&lt;p&gt;Source doc: constit — Conseil constitutionnel (DILA) (via create-page on MediaWiki MCP Server)&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;French Constitutional Council decisions from the DILA open data platform. QPC, DC, LP, LOM and other constitutional review decisions.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Status:&amp;#039;&amp;#039;&amp;#039; active&lt;br /&gt;
&lt;br /&gt;
== Source ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Key !! Kind !! Origin !! Auth !! Update&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;constit&amp;lt;/code&amp;gt; || decision || DILA open data dump — &amp;lt;code&amp;gt;echanges.dila.gouv.fr/OPENDATA/CONSTIT/&amp;lt;/code&amp;gt; || none || incremental (tar.gz archives)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;ID format:&amp;#039;&amp;#039;&amp;#039; &amp;lt;code&amp;gt;fr.{raw_id.lower()}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Coverage:&amp;#039;&amp;#039;&amp;#039; 1958–present&lt;br /&gt;
&lt;br /&gt;
== Tags ==&lt;br /&gt;
&lt;br /&gt;
=== Classification ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Tag !! Values !! When&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;type&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;constitutional_review&amp;lt;/code&amp;gt; || always&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;nature&amp;lt;/code&amp;gt; || e.g. &amp;lt;code&amp;gt;dc&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;qpc&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;lp&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;lom&amp;lt;/code&amp;gt; ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;court&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;conseil_constitutionnel&amp;lt;/code&amp;gt; || always&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;court_level&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;constitutional&amp;lt;/code&amp;gt; || always&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Grades ===&lt;br /&gt;
&lt;br /&gt;
No grade system. &amp;lt;code&amp;gt;_importance_level_default&amp;lt;/code&amp;gt; = &amp;lt;code&amp;gt;medium_importance&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Identifiers ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Tag !! Format&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ecli&amp;lt;/code&amp;gt; || ECLI string&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;case_number&amp;lt;/code&amp;gt; || array&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Edges ==&lt;br /&gt;
&lt;br /&gt;
None.&lt;br /&gt;
&lt;br /&gt;
== Limitations ==&lt;br /&gt;
&lt;br /&gt;
* No summaries or headnote classifications&lt;br /&gt;
* No grade distinction — all constitutional decisions treated equally&lt;br /&gt;
&lt;br /&gt;
[[Category:Sources]][[Category:FR]]&lt;/div&gt;</description>
			<pubDate>Thu, 23 Apr 2026 01:53:34 GMT</pubDate>
			<dc:creator>Nicolas</dc:creator>
			<comments>https://wiki.dura-lex.org/index.php/Talk:Sources/FR/Constit</comments>
		</item>
		<item>
			<title>Sources/FR/CE OpenData</title>
			<link>https://wiki.dura-lex.org/index.php?title=Sources/FR/CE_OpenData&amp;diff=17&amp;oldid=0</link>
			<guid isPermaLink="false">https://wiki.dura-lex.org/index.php?title=Sources/FR/CE_OpenData&amp;diff=17&amp;oldid=0</guid>
			<description>&lt;p&gt;Source doc: ce_opendata — administrative courts (CE portal) (via create-page on MediaWiki MCP Server)&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;Administrative court decisions from the Conseil d&amp;#039;État open data portal. Covers Conseil d&amp;#039;État, CAA, and TA with structured metadata (court codes, formation fields, publication grades). Monthly ZIP archives. More structured than [[Sources/FR/Jade|jade]] for the same courts.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Status:&amp;#039;&amp;#039;&amp;#039; active&lt;br /&gt;
&lt;br /&gt;
== Source ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Key !! Kind !! Origin !! Auth !! Update&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ce_opendata&amp;lt;/code&amp;gt; || decision || Monthly ZIPs — &amp;lt;code&amp;gt;opendata.justice-administrative.fr&amp;lt;/code&amp;gt; || none || incremental (monthly archives)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;ID format:&amp;#039;&amp;#039;&amp;#039; &amp;lt;code&amp;gt;fr.ceod_{identification.lower()}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Coverage:&amp;#039;&amp;#039;&amp;#039; CE since 2021-06, CAA since 2022-03, TA since 2022-06&lt;br /&gt;
&lt;br /&gt;
== Sub-sources ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Key !! Scope !! Since&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ce_opendata_ce&amp;lt;/code&amp;gt; || Conseil d&amp;#039;État || 2021-06&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ce_opendata_caa&amp;lt;/code&amp;gt; || Cours administratives d&amp;#039;appel || 2022-03&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ce_opendata_ta&amp;lt;/code&amp;gt; || Tribunaux administratifs || 2022-06&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Tags ==&lt;br /&gt;
&lt;br /&gt;
=== Courts ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! &amp;lt;code&amp;gt;court&amp;lt;/code&amp;gt; !! &amp;lt;code&amp;gt;court_level&amp;lt;/code&amp;gt; !! Code_Juridiction&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;conseil_etat&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;supreme&amp;lt;/code&amp;gt; || CE&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;cour_administrative_appel&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;appellate&amp;lt;/code&amp;gt; || CAA + dept code&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;tribunal_administratif&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;first_instance&amp;lt;/code&amp;gt; || TA + dept code&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;court_location&amp;lt;/code&amp;gt;: city from department code lookup (9 CAAs + 40+ TAs including overseas).&lt;br /&gt;
&lt;br /&gt;
=== Grades ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! &amp;lt;code&amp;gt;official_grade&amp;lt;/code&amp;gt; !! → &amp;lt;code&amp;gt;importance_level&amp;lt;/code&amp;gt; !! Meaning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;A&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;highest_importance&amp;lt;/code&amp;gt; || Published in Recueil Lebon&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;B&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;high_importance&amp;lt;/code&amp;gt; || Mentioned in Tables du Lebon&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;R&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;highest_importance&amp;lt;/code&amp;gt; || Major jurisprudential interest&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;C+&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;high_importance&amp;lt;/code&amp;gt; || Flagged interest&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;C&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;low_importance&amp;lt;/code&amp;gt; || Unpublished&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;D&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;minimal_importance&amp;lt;/code&amp;gt; || Limited interest&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Z&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;minimal_importance&amp;lt;/code&amp;gt; || Limited interest&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Raw value from &amp;lt;code&amp;gt;Code_Publication&amp;lt;/code&amp;gt; field.&lt;br /&gt;
&lt;br /&gt;
=== Formation ===&lt;br /&gt;
&lt;br /&gt;
Resolved from &amp;lt;code&amp;gt;Formation_Jugement&amp;lt;/code&amp;gt; via &amp;lt;code&amp;gt;formation.py&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Identifiers ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Tag !! Format&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ecli&amp;lt;/code&amp;gt; || normalized from Numero_ECLI&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;case_number&amp;lt;/code&amp;gt; || from Numero_Dossier&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Edges ==&lt;br /&gt;
&lt;br /&gt;
None.&lt;br /&gt;
&lt;br /&gt;
== Related sources ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Source !! Relationship&lt;br /&gt;
|-&lt;br /&gt;
| [[Sources/FR/Jade|jade]] || Same courts, different data source. Jade is DILA open data dump, CE OpenData is the Conseil d&amp;#039;État&amp;#039;s own portal. CE OpenData has more structured metadata.&lt;br /&gt;
|-&lt;br /&gt;
| [[Sources/FR/INCA|inca]] || Legacy predecessor.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Limitations ==&lt;br /&gt;
&lt;br /&gt;
* TA coverage starts 2022 — no historical first-instance decisions&lt;br /&gt;
* Reversed decisions require monthly CSV checks for re-download&lt;br /&gt;
* No summaries or headnote classifications&lt;br /&gt;
&lt;br /&gt;
[[Category:Sources]][[Category:FR]]&lt;/div&gt;</description>
			<pubDate>Thu, 23 Apr 2026 01:53:27 GMT</pubDate>
			<dc:creator>Nicolas</dc:creator>
			<comments>https://wiki.dura-lex.org/index.php/Talk:Sources/FR/CE_OpenData</comments>
		</item>
		<item>
			<title>Sources/FR/Jade</title>
			<link>https://wiki.dura-lex.org/index.php?title=Sources/FR/Jade&amp;diff=16&amp;oldid=0</link>
			<guid isPermaLink="false">https://wiki.dura-lex.org/index.php?title=Sources/FR/Jade&amp;diff=16&amp;oldid=0</guid>
			<description>&lt;p&gt;Source doc: jade — administrative court decisions (DILA) (via create-page on MediaWiki MCP Server)&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;Administrative court decisions from the DILA open data platform. Covers Conseil d&amp;#039;État, cours administratives d&amp;#039;appel (CAA), and tribunaux administratifs (TA). Overlaps with [[Sources/FR/CE OpenData|ce_opendata]] which has more structured metadata and actively maintained monthly releases.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Status:&amp;#039;&amp;#039;&amp;#039; active&lt;br /&gt;
&lt;br /&gt;
== Source ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Key !! Kind !! Origin !! Auth !! Update&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;jade&amp;lt;/code&amp;gt; || decision || DILA open data dump — &amp;lt;code&amp;gt;echanges.dila.gouv.fr/OPENDATA/JADE/&amp;lt;/code&amp;gt; || none || incremental (tar.gz archives)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;ID format:&amp;#039;&amp;#039;&amp;#039; &amp;lt;code&amp;gt;fr.{raw_id.lower()}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Coverage:&amp;#039;&amp;#039;&amp;#039; 1800–present&lt;br /&gt;
&lt;br /&gt;
== Tags ==&lt;br /&gt;
&lt;br /&gt;
=== Classification ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Tag !! Values !! When&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;type&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;judgment&amp;lt;/code&amp;gt; || default&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;type&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;advisory_opinion&amp;lt;/code&amp;gt; || FORMATION starts with &amp;quot;AVIS&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;nature&amp;lt;/code&amp;gt; || raw NATURE field ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Courts ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! &amp;lt;code&amp;gt;court&amp;lt;/code&amp;gt; !! &amp;lt;code&amp;gt;court_level&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;conseil_etat&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;supreme&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;cour_administrative_appel&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;appellate&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;tribunal_administratif&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;first_instance&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;court_location&amp;lt;/code&amp;gt;: city extracted from JURIDICTION string.&lt;br /&gt;
&lt;br /&gt;
=== Grades ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! &amp;lt;code&amp;gt;official_grade&amp;lt;/code&amp;gt; !! → &amp;lt;code&amp;gt;importance_level&amp;lt;/code&amp;gt; !! Meaning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;A&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;highest_importance&amp;lt;/code&amp;gt; || Published in Recueil Lebon (CE only)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;B&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;high_importance&amp;lt;/code&amp;gt; || Mentioned in Tables du Lebon (CE only)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;R&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;highest_importance&amp;lt;/code&amp;gt; || Major jurisprudential interest (CAA/TA)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;C+&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;high_importance&amp;lt;/code&amp;gt; || Flagged interest (CAA/TA)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;C&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;low_importance&amp;lt;/code&amp;gt; || Unpublished (CAA/TA)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;D&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;minimal_importance&amp;lt;/code&amp;gt; || Limited interest (CAA/TA)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Z&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;minimal_importance&amp;lt;/code&amp;gt; || Limited interest (CAA/TA)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Formation ===&lt;br /&gt;
&lt;br /&gt;
Resolved from FORMATION string via &amp;lt;code&amp;gt;formation.py&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Identifiers ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Tag !! Format&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ecli&amp;lt;/code&amp;gt; || ECLI string&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;case_number&amp;lt;/code&amp;gt; || array&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Edges ==&lt;br /&gt;
&lt;br /&gt;
None.&lt;br /&gt;
&lt;br /&gt;
== Related sources ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Source !! Relationship&lt;br /&gt;
|-&lt;br /&gt;
| [[Sources/FR/CE OpenData|ce_opendata]] || Same courts, different data source. CE OpenData has more structured metadata (court codes, formation fields). Both are actively maintained.&lt;br /&gt;
|-&lt;br /&gt;
| [[Sources/FR/INCA|inca]] || Legacy predecessor for administrative courts.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Limitations ==&lt;br /&gt;
&lt;br /&gt;
* Grade values are raw PUBLI_RECUEIL from DILA — less structured than CE OpenData&lt;br /&gt;
* No summaries or headnote classifications for most decisions&lt;br /&gt;
&lt;br /&gt;
[[Category:Sources]][[Category:FR]]&lt;/div&gt;</description>
			<pubDate>Thu, 23 Apr 2026 01:53:08 GMT</pubDate>
			<dc:creator>Nicolas</dc:creator>
			<comments>https://wiki.dura-lex.org/index.php/Talk:Sources/FR/Jade</comments>
		</item>
		<item>
			<title>Sources/FR/Capp</title>
			<link>https://wiki.dura-lex.org/index.php?title=Sources/FR/Capp&amp;diff=15&amp;oldid=0</link>
			<guid isPermaLink="false">https://wiki.dura-lex.org/index.php?title=Sources/FR/Capp&amp;diff=15&amp;oldid=0</guid>
			<description>&lt;p&gt;Source doc: capp — French courts of appeal (DILA) (via create-page on MediaWiki MCP Server)&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;French courts of appeal decisions from the DILA open data platform. Uses the same parser as [[Sources/FR/Cass|cass]] and [[Sources/FR/Jade|jade]] (&amp;lt;code&amp;gt;case_law_parser&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Status:&amp;#039;&amp;#039;&amp;#039; active&lt;br /&gt;
&lt;br /&gt;
== Source ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Key !! Kind !! Origin !! Auth !! Update&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;capp&amp;lt;/code&amp;gt; || decision || DILA open data dump — &amp;lt;code&amp;gt;echanges.dila.gouv.fr/OPENDATA/CAPP/&amp;lt;/code&amp;gt; || none || incremental (tar.gz archives)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;ID format:&amp;#039;&amp;#039;&amp;#039; &amp;lt;code&amp;gt;fr.{raw_id.lower()}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Coverage:&amp;#039;&amp;#039;&amp;#039; 1790–present&lt;br /&gt;
&lt;br /&gt;
== Tags ==&lt;br /&gt;
&lt;br /&gt;
=== Classification ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Tag !! Values !! When&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;type&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;judgment&amp;lt;/code&amp;gt; || default&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;type&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;advisory_opinion&amp;lt;/code&amp;gt; || FORMATION starts with &amp;quot;AVIS&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;court&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;cour_appel&amp;lt;/code&amp;gt; || always&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;court_level&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;appellate&amp;lt;/code&amp;gt; || always&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;court_location&amp;lt;/code&amp;gt; || city extracted from JURIDICTION string ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Grades ===&lt;br /&gt;
&lt;br /&gt;
No structured grade system. Lower court decisions are ungraded by default (&amp;lt;code&amp;gt;_importance_level_default&amp;lt;/code&amp;gt; = &amp;lt;code&amp;gt;low_importance&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
=== Formation ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! &amp;lt;code&amp;gt;formation_solemnity&amp;lt;/code&amp;gt; !! Criteria&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;grand_bench&amp;lt;/code&amp;gt; || &amp;quot;assemblée plénière&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;standard_bench&amp;lt;/code&amp;gt; || default&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;reduced_bench&amp;lt;/code&amp;gt; || &amp;quot;formation restreinte&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Identifiers ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Tag !! Format&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ecli&amp;lt;/code&amp;gt; || ECLI string&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;case_number&amp;lt;/code&amp;gt; || array&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Edges ==&lt;br /&gt;
&lt;br /&gt;
None.&lt;br /&gt;
&lt;br /&gt;
== Related sources ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Source !! Relationship&lt;br /&gt;
|-&lt;br /&gt;
| [[Sources/FR/Judilibre|judilibre]] || Overlaps for cours d&amp;#039;appel. Judilibre is PISTE API, capp is DILA open data dump.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Limitations ==&lt;br /&gt;
&lt;br /&gt;
* No grade system — all decisions have equal weight&lt;br /&gt;
* No summaries or headnote classifications&lt;br /&gt;
&lt;br /&gt;
[[Category:Sources]][[Category:FR]]&lt;/div&gt;</description>
			<pubDate>Thu, 23 Apr 2026 01:52:55 GMT</pubDate>
			<dc:creator>Nicolas</dc:creator>
			<comments>https://wiki.dura-lex.org/index.php/Talk:Sources/FR/Capp</comments>
		</item>
		<item>
			<title>Sources/FR/Cass</title>
			<link>https://wiki.dura-lex.org/index.php?title=Sources/FR/Cass&amp;diff=14&amp;oldid=0</link>
			<guid isPermaLink="false">https://wiki.dura-lex.org/index.php?title=Sources/FR/Cass&amp;diff=14&amp;oldid=0</guid>
			<description>&lt;p&gt;Source doc: cass — Cour de cassation (DILA) (via create-page on MediaWiki MCP Server)&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;Cour de cassation decisions from the DILA open data platform. Historical depth back to 1750. Shares coverage with [[Sources/FR/Judilibre|judilibre]] for post-2021 decisions — judilibre has richer metadata (summaries, themes, finer grades), cass has deeper historical coverage.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Status:&amp;#039;&amp;#039;&amp;#039; active&lt;br /&gt;
&lt;br /&gt;
== Source ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Key !! Kind !! Origin !! Auth !! Update&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;cass&amp;lt;/code&amp;gt; || decision || DILA open data dump — &amp;lt;code&amp;gt;echanges.dila.gouv.fr/OPENDATA/CASS/&amp;lt;/code&amp;gt; || none || incremental (tar.gz archives)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;ID format:&amp;#039;&amp;#039;&amp;#039; &amp;lt;code&amp;gt;fr.{raw_id.lower()}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Coverage:&amp;#039;&amp;#039;&amp;#039; 1750–present&lt;br /&gt;
&lt;br /&gt;
== Tags ==&lt;br /&gt;
&lt;br /&gt;
=== Classification ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Tag !! Values !! When&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;type&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;judgment&amp;lt;/code&amp;gt; || default&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;type&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;advisory_opinion&amp;lt;/code&amp;gt; || FORMATION starts with &amp;quot;AVIS&amp;quot; or NATURE = &amp;quot;avis&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;nature&amp;lt;/code&amp;gt; || raw NATURE field ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;court&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;cour_cassation&amp;lt;/code&amp;gt; || always&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;court_level&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;supreme&amp;lt;/code&amp;gt; || always&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Grades ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! &amp;lt;code&amp;gt;official_grade&amp;lt;/code&amp;gt; !! → &amp;lt;code&amp;gt;importance_level&amp;lt;/code&amp;gt; !! Source signal&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;bulletin&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;high_importance&amp;lt;/code&amp;gt; || PUBLI_BULL@publie=&amp;quot;oui&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;diffuse&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;low_importance&amp;lt;/code&amp;gt; || default (no PUBLI_BULL or publie=&amp;quot;non&amp;quot;)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Less granular than [[Sources/FR/Judilibre|judilibre]] which also has &amp;lt;code&amp;gt;rapport&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;non_diffuse&amp;lt;/code&amp;gt;, and &amp;lt;code&amp;gt;particular_interest&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Formation ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! &amp;lt;code&amp;gt;formation_solemnity&amp;lt;/code&amp;gt; !! Criteria&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;full_court&amp;lt;/code&amp;gt; || &amp;quot;assemblée plénière&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;grand_bench&amp;lt;/code&amp;gt; || &amp;quot;chambre mixte&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;combined_chambers&amp;lt;/code&amp;gt; || &amp;quot;réunies&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;standard_bench&amp;lt;/code&amp;gt; || default&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;reduced_bench&amp;lt;/code&amp;gt; || &amp;quot;formation restreinte&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Identifiers ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Tag !! Format&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ecli&amp;lt;/code&amp;gt; || ECLI string (normalized)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;case_number&amp;lt;/code&amp;gt; || array from NUMEROS_AFFAIRES&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Domain-specific ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Tag !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;chamber&amp;lt;/code&amp;gt; || from META_JURI_JUDI/FORMATION&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;formation&amp;lt;/code&amp;gt; || raw formation string&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;solution&amp;lt;/code&amp;gt; || decision outcome&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;summary&amp;lt;/code&amp;gt; || from SOMMAIRE (when available)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;headnote_classification&amp;lt;/code&amp;gt; || from ANA/SCT elements&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Edges ==&lt;br /&gt;
&lt;br /&gt;
None.&lt;br /&gt;
&lt;br /&gt;
== Related sources ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Source !! Relationship&lt;br /&gt;
|-&lt;br /&gt;
| [[Sources/FR/Judilibre|judilibre]] || Overlaps for CC post-2021. Judilibre has summaries, themes, rapport/non_diffuse grades.&lt;br /&gt;
|-&lt;br /&gt;
| [[Sources/FR/INCA|inca]] || Legacy. Some older decisions may appear in both.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Limitations ==&lt;br /&gt;
&lt;br /&gt;
* No summaries or headnote classifications for most decisions (unlike judilibre)&lt;br /&gt;
* Grade system less granular than judilibre (no rapport/non_diffuse distinction)&lt;br /&gt;
* Pre-2021 decisions may lack ECLI&lt;br /&gt;
&lt;br /&gt;
[[Category:Sources]][[Category:FR]]&lt;/div&gt;</description>
			<pubDate>Thu, 23 Apr 2026 01:52:47 GMT</pubDate>
			<dc:creator>Nicolas</dc:creator>
			<comments>https://wiki.dura-lex.org/index.php/Talk:Sources/FR/Cass</comments>
		</item>
		<item>
			<title>Sources/EU/CJEU</title>
			<link>https://wiki.dura-lex.org/index.php?title=Sources/EU/CJEU&amp;diff=13&amp;oldid=0</link>
			<guid isPermaLink="false">https://wiki.dura-lex.org/index.php?title=Sources/EU/CJEU&amp;diff=13&amp;oldid=0</guid>
			<description>&lt;p&gt;Source doc: cjeu — EU Court of Justice decisions (via create-page on MediaWiki MCP Server)&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;Court of Justice of the European Union decisions from the Publications Office CELLAR database. Covers three courts: Court of Justice (CJEU), General Court, and Civil Service Tribunal (dissolved 2016). Fetched via SPARQL, with HTML/PDF download from CELLAR and InfoCuria fallback.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Status:&amp;#039;&amp;#039;&amp;#039; active&lt;br /&gt;
&lt;br /&gt;
== Source ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Key !! Kind !! Origin !! Auth !! Update&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;cjeu&amp;lt;/code&amp;gt; || decision (+ notice for OJ-C publications) || SPARQL + CELLAR download — &amp;lt;code&amp;gt;publications.europa.eu/webapi/rdf/sparql&amp;lt;/code&amp;gt; || none || incremental (year-by-year from 1952)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;ID format:&amp;#039;&amp;#039;&amp;#039; &amp;lt;code&amp;gt;eu.eurlexjuri{celex.lower()}:{lang}&amp;lt;/code&amp;gt; (e.g. &amp;lt;code&amp;gt;eu.eurlexjuri62019cj0311:fr&amp;lt;/code&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Coverage:&amp;#039;&amp;#039;&amp;#039; 1952–present&lt;br /&gt;
&lt;br /&gt;
== Tags ==&lt;br /&gt;
&lt;br /&gt;
=== Classification ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Tag !! Values !! When&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;type&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;judgment&amp;lt;/code&amp;gt; || CELEX sectors CJ, TJ, TT, FJ&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;type&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;advisory_opinion&amp;lt;/code&amp;gt; || CELEX sectors CC, CV&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;type&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;order&amp;lt;/code&amp;gt; || CELEX sectors CO, CP, CS, CT, TO, TC, FO&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;nature&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;ARRÊT&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ORDONNANCE&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;CONCLUSIONS&amp;lt;/code&amp;gt; || extracted from title&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;celex&amp;lt;/code&amp;gt; || CELEX identifier ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
OJ-C publications (case registrations, gazette notices) are ingested as kind=&amp;lt;code&amp;gt;notice&amp;lt;/code&amp;gt; with type=&amp;lt;code&amp;gt;gazette_publication&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Courts ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! &amp;lt;code&amp;gt;court&amp;lt;/code&amp;gt; !! &amp;lt;code&amp;gt;court_level&amp;lt;/code&amp;gt; !! CELEX position 5&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;cjeu&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;supranational&amp;lt;/code&amp;gt; || C&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;general_court&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;first_instance&amp;lt;/code&amp;gt; || T&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;civil_service_tribunal&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;first_instance&amp;lt;/code&amp;gt; || F (dissolved 2016)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Grades ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! &amp;lt;code&amp;gt;official_grade&amp;lt;/code&amp;gt; !! → &amp;lt;code&amp;gt;importance_level&amp;lt;/code&amp;gt; !! Meaning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ecr_grand_chamber&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;highest_importance&amp;lt;/code&amp;gt; || Published in ECR, Grand Chamber or Full Court&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ecr_chamber&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;high_importance&amp;lt;/code&amp;gt; || Published in ECR, chamber formation&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;oj_only&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;low_importance&amp;lt;/code&amp;gt; || Published in Official Journal only, not in ECR&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;unpublished&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;minimal_importance&amp;lt;/code&amp;gt; || Not published in ECR&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Formation ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! &amp;lt;code&amp;gt;formation_solemnity&amp;lt;/code&amp;gt; !! Criteria&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;full_court&amp;lt;/code&amp;gt; || CELLAR URI slug FULL_COURT_C&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;grand_bench&amp;lt;/code&amp;gt; || CELLAR URI slug CHAMB_GD_C, or label contains &amp;quot;grand&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;standard_bench&amp;lt;/code&amp;gt; || numbered chamber (CHAMB_01–10)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;reduced_bench&amp;lt;/code&amp;gt; || label contains &amp;quot;three&amp;quot; or &amp;quot;trois&amp;quot; or &amp;quot;3&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;single_judge&amp;lt;/code&amp;gt; || label contains &amp;quot;single&amp;quot; or &amp;quot;juge unique&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
~40% coverage from CELLAR URI; remainder via label substring fallback.&lt;br /&gt;
&lt;br /&gt;
=== Identifiers ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Tag !! Format&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ecli&amp;lt;/code&amp;gt; || ECLI string from SPARQL&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;celex&amp;lt;/code&amp;gt; || CELEX identifier&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;case_number&amp;lt;/code&amp;gt; || e.g. &amp;lt;code&amp;gt;[&amp;quot;C-311/19&amp;quot;]&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Domain-specific ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Tag !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;advocate_general&amp;lt;/code&amp;gt; || name from SPARQL&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;judge_rapporteur&amp;lt;/code&amp;gt; || name from SPARQL&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;summary&amp;lt;/code&amp;gt; || from HTML &amp;lt;code&amp;gt;&amp;amp;lt;p class=&amp;quot;index&amp;quot;&amp;amp;gt;&amp;lt;/code&amp;gt; paragraphs&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;original_format&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;html&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;pdf&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;translation_pending&amp;lt;/code&amp;gt; || target language code when content fetched in EN fallback&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Edges ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! &amp;lt;code&amp;gt;kind&amp;lt;/code&amp;gt; !! Direction !! Trigger&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;language_variant&amp;lt;/code&amp;gt; || EN ↔ FR || post-ingest LLM translation enrichment&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
No citation edges during ingest.&lt;br /&gt;
&lt;br /&gt;
== Related sources ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Source !! Relationship&lt;br /&gt;
|-&lt;br /&gt;
| [[Sources/EU/EUR-Lex|eurlex]] || EU legislation that CJEU decisions interpret. No edges between them yet.&lt;br /&gt;
|-&lt;br /&gt;
| [[Sources/EU/ECHR|echr]] || Separate court (Council of Europe, not EU). Different grade system.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Limitations ==&lt;br /&gt;
&lt;br /&gt;
* Only &amp;lt;code&amp;gt;language=&amp;quot;fr&amp;quot;&amp;lt;/code&amp;gt; ingested — &amp;lt;code&amp;gt;language=&amp;quot;en&amp;quot;&amp;lt;/code&amp;gt; returns 0 results. Multi-language support planned.&lt;br /&gt;
* Advocate General opinions not yet ingested — &amp;lt;code&amp;gt;type=advisory_opinion&amp;lt;/code&amp;gt; only covers CJEU advisory opinions on treaty interpretation, not AG opinions&lt;br /&gt;
* Formation solemnity has ~40% coverage from structured CELLAR data; 60% from label heuristics&lt;br /&gt;
* No citation edges between CJEU decisions or to EU legislation&lt;br /&gt;
&lt;br /&gt;
[[Category:Sources]][[Category:EU]]&lt;/div&gt;</description>
			<pubDate>Thu, 23 Apr 2026 01:50:27 GMT</pubDate>
			<dc:creator>Nicolas</dc:creator>
			<comments>https://wiki.dura-lex.org/index.php/Talk:Sources/EU/CJEU</comments>
		</item>
		<item>
			<title>Sources/FR/LEGI</title>
			<link>https://wiki.dura-lex.org/index.php?title=Sources/FR/LEGI&amp;diff=12&amp;oldid=0</link>
			<guid isPermaLink="false">https://wiki.dura-lex.org/index.php?title=Sources/FR/LEGI&amp;diff=12&amp;oldid=0</guid>
			<description>&lt;p&gt;Source doc: legi — FR consolidated legislation (via create-page on MediaWiki MCP Server)&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;French consolidated legislation from the DILA open data platform. The primary source for codes, laws, decrees, ordinances. Every article is versioned with enforcement status and temporal validity. Linked to [[Sources/FR/JORF|jorf]] (original gazette publication) via &amp;lt;code&amp;gt;source_text&amp;lt;/code&amp;gt; edges.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Status:&amp;#039;&amp;#039;&amp;#039; active&lt;br /&gt;
&lt;br /&gt;
== Source ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Key !! Kind !! Origin !! Auth !! Update&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;legi&amp;lt;/code&amp;gt; || legislation (+ section) || DILA open data dump — &amp;lt;code&amp;gt;echanges.dila.gouv.fr/OPENDATA/LEGI/&amp;lt;/code&amp;gt; || none || incremental (tar.gz archives)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;ID format:&amp;#039;&amp;#039;&amp;#039; &amp;lt;code&amp;gt;fr.{raw_id.lower()}&amp;lt;/code&amp;gt; (e.g. &amp;lt;code&amp;gt;fr.legiarti000006900168&amp;lt;/code&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Coverage:&amp;#039;&amp;#039;&amp;#039; 1539–present (includes forward entry-into-force dates)&lt;br /&gt;
&lt;br /&gt;
== Tags ==&lt;br /&gt;
&lt;br /&gt;
=== Classification ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Tag !! Values !! When&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;type&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;statute&amp;lt;/code&amp;gt; || always&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;nature&amp;lt;/code&amp;gt; || raw (e.g. &amp;lt;code&amp;gt;CODE&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LOI&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;DECRET&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ORDONNANCE&amp;lt;/code&amp;gt;) ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;code&amp;lt;/code&amp;gt; || code name || when nature = CODE&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;number&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;nor&amp;lt;/code&amp;gt; || act identifiers ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Enforcement ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! &amp;lt;code&amp;gt;enforcement_status&amp;lt;/code&amp;gt; !! &amp;lt;code&amp;gt;in_force&amp;lt;/code&amp;gt; !! DILA code&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;in_force&amp;lt;/code&amp;gt; || true || VIGUEUR, VIGUEUR_ETEN, VIGUEUR_NON_ETEN&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;deferred_enforcement&amp;lt;/code&amp;gt; || true || VIGUEUR_DIFF&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;deferred_repeal&amp;lt;/code&amp;gt; || false || ABROGE_DIFF&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;repealed&amp;lt;/code&amp;gt; || false || ABROGE&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;superseded&amp;lt;/code&amp;gt; || false || MODIFIE, REMPLACE&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;never_in_force&amp;lt;/code&amp;gt; || false || MODIFIE_MORT_NE&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;expired&amp;lt;/code&amp;gt; || false || PERIME&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;annulled&amp;lt;/code&amp;gt; || false || ANNULE&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;transferred&amp;lt;/code&amp;gt; || false || TRANSFERE, DEPLACE&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;denounced&amp;lt;/code&amp;gt; || false || DENONCE&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;disjoined&amp;lt;/code&amp;gt; || false || DISJOINT&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Structure ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Tag !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;article_number&amp;lt;/code&amp;gt; || article number within the text&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;section_path&amp;lt;/code&amp;gt; || breadcrumb through TM hierarchy&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;text_id&amp;lt;/code&amp;gt; || canonical text ID (e.g. &amp;lt;code&amp;gt;fr.legitext000006069577&amp;lt;/code&amp;gt;)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;nota&amp;lt;/code&amp;gt; || legislative notes (NOTA/CONTENU)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Temporal validity via &amp;lt;code&amp;gt;date&amp;lt;/code&amp;gt; (entry into force) and &amp;lt;code&amp;gt;date_end&amp;lt;/code&amp;gt; (end of validity). Sentinel &amp;lt;code&amp;gt;2999-01-01&amp;lt;/code&amp;gt; stripped to null.&lt;br /&gt;
&lt;br /&gt;
== Edges ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! &amp;lt;code&amp;gt;kind&amp;lt;/code&amp;gt; !! Direction !! Trigger&lt;br /&gt;
|-&lt;br /&gt;
| various (amends, repeals, cites...) || article → article || LIENS elements with sens=&amp;quot;cible&amp;quot;, normalized via &amp;lt;code&amp;gt;normalize_link_type()&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;source_text&amp;lt;/code&amp;gt; || LEGITEXT → JORFTEXT || META_TEXTE_CHRONICLE/CID starts with &amp;quot;JORFTEXT&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Related sources ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Source !! Relationship&lt;br /&gt;
|-&lt;br /&gt;
| [[Sources/FR/JORF|jorf]] || Same texts, different view. LEGI = consolidated + versioned. JORF = original gazette with visas and ministère. Linked by &amp;lt;code&amp;gt;source_text&amp;lt;/code&amp;gt; edges.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Limitations ==&lt;br /&gt;
&lt;br /&gt;
* ~4% of JORF texts have no LEGI counterpart&lt;br /&gt;
* No per-article grading — importance derived from text nature and code membership&lt;br /&gt;
* Consolidation lag: recent amendments may take days to appear&lt;br /&gt;
&lt;br /&gt;
[[Category:Sources]][[Category:FR]]&lt;/div&gt;</description>
			<pubDate>Thu, 23 Apr 2026 01:49:53 GMT</pubDate>
			<dc:creator>Nicolas</dc:creator>
			<comments>https://wiki.dura-lex.org/index.php/Talk:Sources/FR/LEGI</comments>
		</item>
		<item>
			<title>Sources/FR/Judilibre</title>
			<link>https://wiki.dura-lex.org/index.php?title=Sources/FR/Judilibre&amp;diff=11&amp;oldid=0</link>
			<guid isPermaLink="false">https://wiki.dura-lex.org/index.php?title=Sources/FR/Judilibre&amp;diff=11&amp;oldid=0</guid>
			<description>&lt;p&gt;Source doc: judilibre — FR judicial decisions (CC, CA, TJ, TC) (via create-page on MediaWiki MCP Server)&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;Open judicial decisions from the Cour de cassation API. Covers 4 court levels — Cour de cassation, cours d&amp;#039;appel, tribunaux judiciaires, tribunaux de commerce. Richest metadata among FR case law sources (summaries, themes, fine-grained grades). Overlaps with [[Sources/FR/Cass|cass]] for Cour de cassation decisions — judilibre has richer metadata, cass has deeper historical coverage.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Status:&amp;#039;&amp;#039;&amp;#039; active&lt;br /&gt;
&lt;br /&gt;
== Source ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Key !! Kind !! Origin !! Auth !! Update&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;judilibre&amp;lt;/code&amp;gt; || decision || PISTE API — &amp;lt;code&amp;gt;api.piste.gouv.fr/cassation/judilibre/v1.0&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;PISTE_CLIENT_ID&amp;lt;/code&amp;gt; || incremental (transactional history)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;ID format:&amp;#039;&amp;#039;&amp;#039; &amp;lt;code&amp;gt;fr.judi_{raw_id}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Coverage:&amp;#039;&amp;#039;&amp;#039; 1790–present&lt;br /&gt;
&lt;br /&gt;
== Sub-sources ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Key !! Scope&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;judilibre_cc&amp;lt;/code&amp;gt; || Cour de cassation&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;judilibre_ca&amp;lt;/code&amp;gt; || Cours d&amp;#039;appel&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;judilibre_tj&amp;lt;/code&amp;gt; || Tribunaux judiciaires&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;judilibre_tcom&amp;lt;/code&amp;gt; || Tribunaux de commerce&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Tags ==&lt;br /&gt;
&lt;br /&gt;
=== Classification ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Tag !! Values !! When&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;type&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;judgment&amp;lt;/code&amp;gt; || default&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;type&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;advisory_opinion&amp;lt;/code&amp;gt; || nature = &amp;quot;avis&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;nature&amp;lt;/code&amp;gt; || raw from API || e.g. arret, ordonnance, avis&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Courts ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! &amp;lt;code&amp;gt;court&amp;lt;/code&amp;gt; !! &amp;lt;code&amp;gt;court_level&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;cour_cassation&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;supreme&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;cour_appel&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;appellate&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;tribunal_judiciaire&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;first_instance&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;tribunal_commerce&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;first_instance&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;court_location&amp;lt;/code&amp;gt;: city extracted from jurisdiction taxonomy (e.g. &amp;quot;Cour d&amp;#039;appel de Bordeaux&amp;quot; → &amp;quot;Bordeaux&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
=== Grades ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! &amp;lt;code&amp;gt;official_grade&amp;lt;/code&amp;gt; !! → &amp;lt;code&amp;gt;importance_level&amp;lt;/code&amp;gt; !! Meaning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rapport&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;highest_importance&amp;lt;/code&amp;gt; || Selected for the Annual Report&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;particular_interest&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;highest_importance&amp;lt;/code&amp;gt; || Flagged as particularInterest (lower courts)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;bulletin&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;high_importance&amp;lt;/code&amp;gt; || Published in Bulletin des arrêts&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;diffuse&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;low_importance&amp;lt;/code&amp;gt; || Published online only&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;non_diffuse&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;minimal_importance&amp;lt;/code&amp;gt; || Not published&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Formation ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! &amp;lt;code&amp;gt;formation_solemnity&amp;lt;/code&amp;gt; !! Criteria&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;combined_chambers&amp;lt;/code&amp;gt; || formation = &amp;quot;fm&amp;quot; (chambre mixte)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;grand_bench&amp;lt;/code&amp;gt; || formation = &amp;quot;fs&amp;quot; or &amp;quot;fp&amp;quot; (assemblée plénière)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;reduced_bench&amp;lt;/code&amp;gt; || formation = &amp;quot;frh&amp;quot;, &amp;quot;frr&amp;quot;, or &amp;quot;f&amp;quot; (formation restreinte)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;standard_bench&amp;lt;/code&amp;gt; || default&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Identifiers ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Tag !! Format&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ecli&amp;lt;/code&amp;gt; || ECLI string (normalized)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;case_number&amp;lt;/code&amp;gt; || array, display form&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;case_number_normalized&amp;lt;/code&amp;gt; || array, indexable form&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Domain-specific ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Tag !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;chamber&amp;lt;/code&amp;gt; || raw chamber field&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;formation&amp;lt;/code&amp;gt; || raw formation field&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;solution&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;solution_alt&amp;lt;/code&amp;gt; for CA, &amp;lt;code&amp;gt;solution&amp;lt;/code&amp;gt; for others&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;summary&amp;lt;/code&amp;gt; || from API summary or titlesAndSummaries&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;headnote_classification&amp;lt;/code&amp;gt; || titles joined with &amp;quot; / &amp;quot;, or themes&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Edges ==&lt;br /&gt;
&lt;br /&gt;
None.&lt;br /&gt;
&lt;br /&gt;
== Related sources ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Source !! Relationship&lt;br /&gt;
|-&lt;br /&gt;
| [[Sources/FR/Cass|cass]] || Overlaps for Cour de cassation. Cass has deeper history (1750 vs 1790), judilibre has summaries, themes, finer grades.&lt;br /&gt;
|-&lt;br /&gt;
| [[Sources/FR/Capp|capp]] || Overlaps for cours d&amp;#039;appel. Capp is DILA open data dump, judilibre is PISTE API.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Limitations ==&lt;br /&gt;
&lt;br /&gt;
* Cours d&amp;#039;appel, TJ, TC coverage starts ~2024 — very recent&lt;br /&gt;
* Rate-limited API (0.5s default between calls)&lt;br /&gt;
* No edges — cannot traverse citation graphs from judilibre decisions&lt;br /&gt;
&lt;br /&gt;
[[Category:Sources]][[Category:FR]]&lt;/div&gt;</description>
			<pubDate>Thu, 23 Apr 2026 01:49:18 GMT</pubDate>
			<dc:creator>Nicolas</dc:creator>
			<comments>https://wiki.dura-lex.org/index.php/Talk:Sources/FR/Judilibre</comments>
		</item>
		<item>
			<title>Sources</title>
			<link>https://wiki.dura-lex.org/index.php?title=Sources&amp;diff=10&amp;oldid=0</link>
			<guid isPermaLink="false">https://wiki.dura-lex.org/index.php?title=Sources&amp;diff=10&amp;oldid=0</guid>
			<description>&lt;p&gt;Sources index — coverage matrix by court/domain (via create-page on MediaWiki MCP Server)&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;Data dictionary for the Dura Lex corpus. Each page describes what one ingest source contributes to the unified schema ([[Corpus/Tag conventions|tags]], [[Corpus/Edge types|edges]]).&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Looking for a court?&amp;#039;&amp;#039;&amp;#039; → Coverage matrix below&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Know the source key?&amp;#039;&amp;#039;&amp;#039; → Jump to the source page&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Adding a new source?&amp;#039;&amp;#039;&amp;#039; → See [[Development/Adding a source]]&lt;br /&gt;
&lt;br /&gt;
== FR — Decisions ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Court !! Level !! Sources !! Grade system !! Since&lt;br /&gt;
|-&lt;br /&gt;
| Cour de cassation || supreme || [[Sources/FR/Cass|cass]], [[Sources/FR/Judilibre|judilibre]] || rapport › bulletin › diffuse › non_diffuse || 1750&lt;br /&gt;
|-&lt;br /&gt;
| Conseil d&amp;#039;État || supreme || [[Sources/FR/Jade|jade]], [[Sources/FR/CE OpenData|ce_opendata]] || A › B || 1800&lt;br /&gt;
|-&lt;br /&gt;
| CAA || appellate || [[Sources/FR/Jade|jade]], [[Sources/FR/CE OpenData|ce_opendata]] || R › C+ › C › D › Z || 2000&lt;br /&gt;
|-&lt;br /&gt;
| TA || first_instance || [[Sources/FR/CE OpenData|ce_opendata]] || R › C+ › C › D › Z || 2022&lt;br /&gt;
|-&lt;br /&gt;
| Cours d&amp;#039;appel || appellate || [[Sources/FR/Capp|capp]], [[Sources/FR/Judilibre|judilibre]] || particular_interest || 2024&lt;br /&gt;
|-&lt;br /&gt;
| TJ, TC || first_instance || [[Sources/FR/Judilibre|judilibre]] || — || 2024&lt;br /&gt;
|-&lt;br /&gt;
| Conseil constitutionnel || constitutional || [[Sources/FR/Constit|constit]] || — || 1958&lt;br /&gt;
|-&lt;br /&gt;
| Cour des comptes || supreme || [[Sources/FR/Jufi|jufi]] || recueil || 1950&lt;br /&gt;
|-&lt;br /&gt;
| CRC, CDBF, CAF || varies || [[Sources/FR/Jufi|jufi]] || recueil || 1950&lt;br /&gt;
|-&lt;br /&gt;
| CNIL || — || [[Sources/FR/CNIL|cnil]] || — || 1978&lt;br /&gt;
|-&lt;br /&gt;
| CADA || — || [[Sources/FR/CADA|cada]] || — || 1984&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== FR — Legislation ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Domain !! Sources !! Versioned !! Edges !! Since&lt;br /&gt;
|-&lt;br /&gt;
| Codes, laws, decrees || [[Sources/FR/LEGI|legi]] || yes (enforcement_status) || amends, repeals, cites... || 1539&lt;br /&gt;
|-&lt;br /&gt;
| Official gazette || [[Sources/FR/JORF|jorf]] || no (original publication) || cites, source_text || 1539&lt;br /&gt;
|-&lt;br /&gt;
| Collective agreements (branch) || [[Sources/FR/KALI|kali]] || yes (enforcement_status) || cites || 1850&lt;br /&gt;
|-&lt;br /&gt;
| Collective agreements (enterprise) || [[Sources/FR/ACCO|acco]] || no || — || 1900&lt;br /&gt;
|-&lt;br /&gt;
| Tax doctrine || [[Sources/FR/BOFiP|bofip]] || no || — || 2000&lt;br /&gt;
|-&lt;br /&gt;
| CNIL guidelines || [[Sources/FR/CNIL|cnil]] || no || — || 1978&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== FR — Records &amp;amp; Notices ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Domain !! Sources !! Kind !! Since&lt;br /&gt;
|-&lt;br /&gt;
| Company registry || [[Sources/FR/RNE|rne]] || record || 1600&lt;br /&gt;
|-&lt;br /&gt;
| Commercial announcements || [[Sources/FR/BODACC|bodacc]] || notice || 1850&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== EU ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Court / Domain !! Sources !! Grade system !! Since&lt;br /&gt;
|-&lt;br /&gt;
| CJEU (Court of Justice) || [[Sources/EU/CJEU|cjeu]] || ecr_grand_chamber › ecr_chamber › oj_only › unpublished || 1952&lt;br /&gt;
|-&lt;br /&gt;
| General Court || [[Sources/EU/CJEU|cjeu]] || (same) || 1989&lt;br /&gt;
|-&lt;br /&gt;
| ECHR || [[Sources/EU/ECHR|echr]] || 1 › 2 › 3 › 4 || 1959&lt;br /&gt;
|-&lt;br /&gt;
| EU legislation || [[Sources/EU/EUR-Lex|eurlex]] || — || 1952&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Source status ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Status !! Sources&lt;br /&gt;
|-&lt;br /&gt;
| active || all except below&lt;br /&gt;
|-&lt;br /&gt;
| legacy || [[Sources/FR/INCA|inca]] (superseded by jade + ce_opendata)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Category:Sources]]&lt;/div&gt;</description>
			<pubDate>Thu, 23 Apr 2026 01:48:47 GMT</pubDate>
			<dc:creator>Nicolas</dc:creator>
			<comments>https://wiki.dura-lex.org/index.php/Talk:Sources</comments>
		</item>
		<item>
			<title>Main Page</title>
			<link>https://wiki.dura-lex.org/index.php?title=Main_Page&amp;diff=9&amp;oldid=4</link>
			<guid isPermaLink="false">https://wiki.dura-lex.org/index.php?title=Main_Page&amp;diff=9&amp;oldid=4</guid>
			<description>&lt;p&gt;Add: libraries are composable Python packages, embeddable in custom applications (via update-page on MediaWiki MCP Server)&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 01:46, 23 April 2026&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;4&quot; class=&quot;diff-multi&quot; lang=&quot;en&quot;&gt;(One intermediate revision by the same user not shown)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l2&quot;&gt;Line 2:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 2:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;It structures public legal data — legislation, case law, company registries, administrative guidance — into a jurisdiction-agnostic corpus, queryable by AI agents via MCP and by humans via a web portal.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;It structures public legal data — legislation, case law, company registries, administrative guidance — into a jurisdiction-agnostic corpus, queryable by AI agents via MCP and by humans via a web portal.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;A jurisdiction-agnostic kernel, jurisdiction plugins (France and EU today, designed for any country), a robust ingestion pipeline, and services on top. The schema follows the OpenStreetMap model — six universal structural kinds, JSONB tags, zero schema migration to add a jurisdiction.&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;Everything is published as &#039;&#039;&#039;Python libraries&#039;&#039;&#039; (MIT). The kernel, the corpus protocol, the jurisdiction drivers, the ingestion framework — all are composable packages that can be embedded in any application. Use the MCP server as-is, or import the libraries directly to build your own legal data product.&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Software licensed under &amp;#039;&amp;#039;&amp;#039;MIT&amp;#039;&amp;#039;&amp;#039;. Enriched data licensed under &amp;#039;&amp;#039;&amp;#039;ODbL&amp;#039;&amp;#039;&amp;#039;.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Software licensed under &amp;#039;&amp;#039;&amp;#039;MIT&amp;#039;&amp;#039;&amp;#039;. Enriched data licensed under &amp;#039;&amp;#039;&amp;#039;ODbL&amp;#039;&amp;#039;&amp;#039;.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l13&quot;&gt;Line 13:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 17:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;| [[Philosophy]] || Why Dura Lex exists — safety, transparency, sovereignty, professional secrecy&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;| [[Philosophy]] || Why Dura Lex exists — safety, transparency, sovereignty, professional secrecy&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;|-&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;|-&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;| [[Architecture]] || How the pieces fit together&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;| [[Architecture]] || How the pieces fit together &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;— kernel, drivers, pipeline, services&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;|-&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;|-&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;| [[:Category:Corpus|Corpus]] || The data model — schema, tags, edges, quality, FTS&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;| [[:Category:Corpus|Corpus]] || The data model — schema, tags, edges, quality&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;, temporal versioning&lt;/ins&gt;, FTS&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;|-&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;|-&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;| [[:Category:Sources|Sources]] || Data dictionary — one page per ingest source&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;| [[:Category:Sources|Sources]] || Data dictionary — one page per ingest source&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;, coverage matrix&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;|-&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;|-&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;| [[:Category:Jurisdictions|Jurisdictions]] || Legal systems we cover&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;| [[:Category:Jurisdictions|Jurisdictions]] || Legal systems we cover &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;and how they map to the unified schema&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;|-&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;|-&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;| [[:Category:MCP|MCP]] || The public API — tools, guidelines, reference resolution&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;| [[:Category:MCP|MCP]] || The public API — tools, &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;safety &lt;/ins&gt;guidelines, reference resolution&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;|-&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;|-&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;| [[:Category:Development|Development]] || For contributors — coding conventions, testing, packaging&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;| [[:Category:Development|Development]] || For contributors — coding conventions, testing, packaging&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l29&quot;&gt;Line 29:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 33:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;== Current data ==&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;== Current data ==&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;France is the first implementation. The architecture is designed for any jurisdiction.&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;{| class=&amp;quot;wikitable&amp;quot;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;{| class=&amp;quot;wikitable&amp;quot;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;|-&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;|-&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;! Data !! Volume &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;!! Sources&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;! Jurisdiction !&lt;/ins&gt;! Data !! Volume&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;|-&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;| rowspan=&quot;7&quot; | &#039;&#039;&#039;France&#039;&#039;&#039; || Court decisions || 3.4M&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;|-&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;| Legislation articles || 1.8M&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;|-&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;| Collective agreements || 299K articles + 382K enterprise agreements&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;|-&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;|-&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;| &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;Court decisions &lt;/del&gt;|| &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;3&lt;/del&gt;.&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;4M || Judilibre, Conseil d&#039;État, JADE, INCA, Cass, courts of appeal, CADA, CNIL, Constit&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;| &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;Administrative doctrine &lt;/ins&gt;|| &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;9&lt;/ins&gt;.&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;6K&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;|-&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;|-&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;| &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;Legislation articles &lt;/del&gt;|| &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;1&lt;/del&gt;.&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;8M || LEGI (73 codes + non-codified laws)&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;| &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;Companies &lt;/ins&gt;|| &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;24&lt;/ins&gt;.&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;2M&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;|-&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;|-&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;| &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;Collective agreements &lt;/del&gt;|| &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;299K articles + 382K enterprise agreements || KALI, ACCO&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;| &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;Directors &lt;/ins&gt;|| &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;15M&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;|-&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;|-&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;| &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;Administrative doctrine &lt;/del&gt;|| &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;9&lt;/del&gt;.&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;6K || BOFiP, CNIL&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;| &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;Cross-citations &lt;/ins&gt;|| &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;4&lt;/ins&gt;.&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;4M links&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;|-&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;|-&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;| &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;Companies &lt;/del&gt;|| &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;24.2M &lt;/del&gt;|| &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;RNE/SIRENE&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;| &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;rowspan=&quot;3&quot; &lt;/ins&gt;| &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&#039;&#039;&#039;EU&#039;&#039;&#039; &lt;/ins&gt;|| &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;CJEU decisions &lt;/ins&gt;|&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;| —&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;|-&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;|-&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;| &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;Directors &lt;/del&gt;|| &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;15M || RNE&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;| &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;ECHR decisions &lt;/ins&gt;|| &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;—&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;|-&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;|-&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;| &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;Cross-citations &lt;/del&gt;|| &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;4.4M || Inter-document links&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;| &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;EU legislation (regulations, directives, decisions) &lt;/ins&gt;|| &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;—&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;|}&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;|}&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;

&lt;!-- diff cache key mediawiki:diff:1.41:old-4:rev-9:php=table --&gt;
&lt;/table&gt;</description>
			<pubDate>Thu, 23 Apr 2026 01:46:55 GMT</pubDate>
			<dc:creator>Nicolas</dc:creator>
			<comments>https://wiki.dura-lex.org/index.php/Talk:Main_Page</comments>
		</item>
</channel></rss>