Files

152 lines
10 KiB
Markdown
Raw Permalink Normal View History

# Plan d'implĂ©mentation — Plateforme « Veille LĂ©gislative Guadeloupe »
> Phase 0 du prompt `prompt-kimi-cli-veille-legislative.md`. Rédigé le 25 juillet 2026.
> **Statut : en attente de validation.**
---
## A. Rapport de lecture du corpus (Phase 0)
### A.1 Volumétrie réelle
| Ensemble | Fichiers | Mots | RĂŽle retenu |
|---|---|---|---|
| Rapport consolidé | `.agent.final.md` (+ `.converted.md`, doublon) | 38 271 | Source de vérité rédactionnelle (résumés, points clés) |
| Chapitres | `sec00` → `sec10` | 28 642 | `sec10` = **parsing prioritaire** (2 tableaux structurĂ©s) ; `sec00` = synthĂšse |
| Bibliographie | `_ref.md` | 9 591 | 481 rĂ©fĂ©rences numĂ©rotĂ©es `[N] Éditeur. Titre [EB/OL]. Date. URL` |
| Dimensions | `research/dim01` → `dim12` | 91 530 | MatiĂšre brute sourcĂ©e (claims + notes de bas de page) |
| Méta-recherche | `cross_verification`, `insight`, `phase5_validation` | 5 857 | Confiance, analyses transversales, arbitrages |
| Plan / outline | `plan.md`, `.agent.outline.md` | 2 332 | Taxonomie des chapitres |
Total ≈ **214 500 mots**. Les `.docx` sont des dĂ©rivĂ©s du markdown — non ingĂ©rĂ©s.
### A.2 Découverte structurante : les fichiers `dim` ont **trois dialectes**
Le prompt (§2) postule un format unique `Claim / Source / URL / Date / Excerpt / Confidence`. La réalité mesurée :
| Dialecte | Fichiers | Motif |
|---|---|---|
| **A — claim plat** | dim01, dim02, dim03, dim04, dim07 | `Claim: 
` puis `Source:` / `URL:` / `Date:` / `Excerpt:` / `Confidence:` en dĂ©but de ligne |
| **B — claim numĂ©rotĂ© gras** | dim05 | `**Claim 3 :** 
` puis champs plats |
| **C — claim en liste** | dim10 (+ portions de dim06, dim08) | `**Claim 1.2** — 
` puis `- **Source** : ` / `- **URL** : ` (URLs parfois multiples, sĂ©parĂ©es par ` ; `) |
| **D — prose + notes** | dim06, dim08, dim09, dim11, dim12 | Aucun bloc claim ; sources en fin de fichier sous forme `[^N^] Éditeur — titre : URL` |
Comptage : 153 blocs `Claim` explicites, 258 dĂ©finitions de notes de bas de page, 884 usages de marqueurs `[^N^]` dans les dim. **Le parseur doit gĂ©rer les quatre dialectes**, sinon on perd dim06/08/09/11/12 — soit prĂ©cisĂ©ment les dimensions associations, entreprises, migration et calendrier.
### A.3 Résolution des citations `[^dimXX-N^]`
Chaßne de résolution implémentable et vérifiée :
```
sec0X.md : « 
 chlordĂ©cone [^dim07-24^] »
→ dim07, note locale n° 24
→ dim07 §« [^24^] Vie-publique — chlordĂ©cone 
 : https://
 » (ou bloc Claim portant [^24^])
→ URL + date + extrait verbatim + confiance
```
Marqueurs distincts recensĂ©s dans les chapitres : **333**, dont des marqueurs non-dim (`[^phase5-3.1^]`, `[^insight-5^]`) qui pointent vers `phase5_validation.md` et `insight.md` — Ă  traiter comme deux « pseudo-dimensions ».
### A.4 Inventaire seed cible
- **Tableau A de `sec10`** : 27 lois promulguĂ©es (23 avr. → 23 juill. 2026), colonnes `N° de loi | Promulgation/JO | Objet | Statut libertĂ©s | Pertinence Guadeloupe-OM`.
- **Tableau B de `sec10`** : 24 lignes (adoptĂ©s non promulguĂ©s, navette, dĂ©posĂ©s, annoncĂ©s) — dont 2 lignes portant chacune 2 textes (accords Kazakhstan + Colombie ; MACF ratification + accord plateforme) → **26 textes** aprĂšs Ă©clatement.
- **Décisions CC** identifiables : 2026-903, 904, 905, 906, 908, 909 (rendues) + 910 à 915 (en instance) = **12 affaires DC**.
→ Cible rĂ©aliste : **53 textes** (27 + 26), au-delĂ  du plancher de 49 exigĂ© au §2. Les dĂ©cisions CC alimentent la table `decisions_cc` et non le compteur `textes`.
### A.5 Contradictions détectées dans le corpus (à encoder comme rÚgles, pas à masquer)
1. `insight.md` §1 annonce « 5 dĂ©cisions DC attendues fin aoĂ»t » puis en liste 6 ; `sec10` en compte 7 + Philippine hors suspension. → RĂšgle : **`sec10` + `phase5_validation` priment** sur `insight` pour les faits ; `insight` n'est utilisĂ© que comme contenu Ă©ditorial (encart « point de veille »).
2. `dim11` point de vigilance n° 1 dit la saisine Riposte « non confirmĂ©e par une source primaire » ; `phase5_validation` §3 la tranche comme **effective, 24/07/2026, n° 2026-915 DC**. → `phase5_validation` prime (rĂšgle explicite du §5.2 du prompt).
3. AFD free party : 1 500 € (dim09) vs 500 € (phase5). → **500 €**, conformĂ©ment au test d'acceptation §7 du prompt.
4. DurĂ©es DOM chĂŽmage antĂ©rieures : divergence assumĂ©e `low` dans `cross_verification` → entrĂ©e marquĂ©e « Ă  vĂ©rifier ».
Ces quatre rÚgles sont codées dans `pipeline/resolution_conflits.py` et testées.
---
## B. Architecture décidée
```
veille_legislative_971/
├── data/
│ ├── input/ ← LECTURE SEULE (jamais modifiĂ©)
│ ├── veille.db ← SQLite (gĂ©nĂ©rĂ©)
│ └── textes.json ← dump statique (gĂ©nĂ©rĂ©, mode dĂ©gradĂ©)
├── pipeline/ ← Python 3.12 (uv)
│ ├── modeles.py ← pydantic : Texte, Source, Evenement, DecisionCC
│ ├── db.py ← connexion, migrations, FTS5
│ ├── migrations/ ← 001_initial.sql, 

│ ├── seed_from_research.py ← orchestrateur du seed
│ ├── parseurs/
│ │ ├── tableaux_sec10.py ← tableaux A et B (chemin principal)
│ │ ├── blocs_claim.py ← 4 dialectes dim (A/B/C/D)
│ │ ├── notes_bas_page.py ← rĂ©solution [^dimXX-N^] → URL
│ │ ├── bibliographie.py ← _ref.md, 481 entrĂ©es
│ │ └── meta.py ← cross_verification, insight, phase5
│ ├── collecteurs/ ← legifrance.py (PISTE), assemblee.py, senat.py,
│ │ conseil_constit.py, vie_publique.py
│ ├── rapprochement.py ← matching numero_officiel puis fuzzy titre
│ ├── classification.py ← thùmes/impacts heuristiques (config.yaml)
│ ├── guadeloupe.py ← dĂ©tection outre-mer
│ ├── resolution_conflits.py ← hiĂ©rarchie JO > AN/SĂ©nat > CC > presse
│ ├── update.py ← run complet, --dry-run obligatoire
│ └── config.yaml
├── web/ ← SvelteKit 2 + Svelte 5 runes + TS strict
│ ├── src/lib/server/ ← better-sqlite3, requĂȘtes FTS5, facettes
│ ├── src/routes/
│ │ ├── +page.svelte SSR — tableau de bord
│ │ ├── recherche/ SSR — facettes dans url.searchParams
│ │ ├── textes/[slug]/ SSR — fiche + timeline + sources
│ │ ├── calendrier/ SSR — Ă©chĂ©ances aoĂ»t-octobre
│ │ ├── a-propos/ methode/ prerender = true
│ │ └── api/textes|textes/[slug]|echeances/+server.ts
│ └── svelte.config.js ← adapter-node, precompress
├── systemd/
│ ├── veille-legislative.service / .timer (6 h, 18 h + dimanche intensif)
│ └── veille-web.service / .socket (activation par socket, IDLE_TIMEOUT=300)
├── tests/ ← pytest (parseurs, fixtures figĂ©es)
├── Makefile ← seed, update, dev, build, check, test
├── .env.example
├── README.md
└── README-pipeline.md
```
### B.1 Arbitrages prompt ↔ recommandations `doc2sveltekit-transition`
| Sujet | Prompt | Playbook OKI | Décision |
|---|---|---|---|
| Adapter | `adapter-node`, SSR, « non nĂ©gociable » (§3bis) | `adapter-static`, prerender intĂ©gral | **Prompt** — le playbook vise des sites vitrines, ici les facettes URL et la fraĂźcheur pipeline exigent le SSR |
| ZĂ©ro tiers, self-hĂ©bergement polices | §3 « zĂ©ro CDN externe » | §2.2 idem | **Convergent** — appliquĂ© |
| ThĂšme sombre / or / flag-bar | « sobre et institutionnel » | identitĂ© OKI obligatoire | **À valider** (question 2) |
| Tailwind | imposĂ© (§3) | interdit (§2.3) | **À valider** (question 1) |
| ZĂ©ro emoji, set SVG krĂ©yĂČl | non traitĂ© | obligatoire | **Playbook** — appliquĂ© (badges de statut en SVG, pas d'emoji) |
| Motion gwoka + `prefers-reduced-motion` | non traitĂ© | obligatoire | **Playbook**, dosĂ© : transitions ≀ 120 ms, aucune animation de scroll |
| Schema.org / SEO AI-Overview | non traitĂ© | PRD dĂ©diĂ© | **Playbook** — `Legislation` + `Dataset` JSON-LD sur les fiches, sitemap, robots.txt |
| Accessibilité WCAG AA | §6 | §2.8 | **Convergent** |
---
## C. Phases d'exécution
| Phase | Contenu | Vérification exécutable |
|---|---|---|
| **1** | Squelette repo, `uv` + Python 3.12, schéma SQLite + FTS5, migrations, modÚles pydantic | `make db-init` puis `sqlite3 data/veille.db .schema` |
| **2** | Parseurs `sec10` (A + B) → 53 textes, avec statuts, dates, pertinence Guadeloupe | `make seed` → compte-rendu ≄ 49 textes ; `pytest tests/test_tableaux_sec10.py` |
| **3** | Parseurs `dim` (4 dialectes) + rĂ©solution `[^dimXX-N^]` + `_ref.md` → sources, extraits verbatim, confiance | `make seed` → 100 % des textes avec ≄ 1 source URL ; couverture pytest ≄ 70 % |
| **4** | Enrichissement : `resume`, `points_cles`, `impacts`, timeline `evenements`, `decisions_cc`, insights | Tests d'acceptation §7 du prompt (7 assertions) automatisés en pytest |
| **5** | Collecteurs live + `update.py --dry-run` + rĂ©solution de conflits + `veille_log` + dump JSON | `make update-dry` → rapport de diffs rĂ©el affichĂ© |
| **6** | SvelteKit : layout, tokens, accueil, recherche à facettes, fiche, calendrier, à-propos/méthode, API JSON | `npm run build`, `npm run check` (0 erreur TS), `node build` répond sur 127.0.0.1 |
| **7** | PWA, systemd (4 unités), README d'installation Debian vierge, doc des dégradations sans clé PISTE | grep de conformité §3bis, démo des 5 scénarios du §8.7 |
Chaque phase se clÎt par la sortie réelle des commandes, montrée telle quelle.
---
## D. Points bloquants Ă  trancher avant la Phase 1
1. **Tailwind ou CSS vanilla + tokens OKI** (prompt vs playbook).
2. **Identité visuelle** : charte OKI complÚte, OKI sobrifiée, ou institutionnel neutre.
3. **Clé Légifrance** : la clé fournie ressemble à un `client_id` PISTE ; l'API OAuth2 `client_credentials` exige aussi un `client_secret`. Sans lui, le collecteur Légifrance sera codé mais désactivé (dégradation documentée : repli scraping AN/Sénat).
4. **Git** : le dossier n'est pas un dépÎt. `git init` + commit initial recommandé avant toute écriture (rÚgle transverse n° 2 du playbook) ; publication Gitea `labola.o-k-i.net` optionnelle.