Files
veye-lalwa/PLAN-IMPLEMENTATION.md
Cyber MawonajandClaude Opus 5 3ce7d17db9 Socle : corpus de recherche en entrée, plan d'implémentation, gitignore
Commit initial de l'existant avant toute modification (rĂšgle transverse du
playbook OKI). data/input/ est en lecture seule pour toute la suite du projet.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-07-25 17:37:12 -04:00

10 KiB

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.