Merge ARCHITECTURE.md into README, expand Légifrance section on transparence

- README: add sommaire, integrate full architecture content (diagram,
  components, routes, flows, security, decisions, scalability), add
  Légifrance articles table and PISTE setup instructions
- ARCHITECTURE.md: removed (content fully merged into README)
- transparence.tsx: expand Légifrance block with full table of 11 tracked
  articles (priority, description), cache/resilience/monitoring details

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-06-24 09:54:12 +02:00
parent 7674505a26
commit 8f904f4cf0
3 changed files with 557 additions and 475 deletions
@@ -86,21 +86,72 @@ export default function Transparence() {
</p>
</div>
<div className="bg-muted/40 border border-border/50 p-5 space-y-2">
<div className="bg-muted/40 border border-border/50 p-5 space-y-4">
<p className="font-mono text-xs font-semibold uppercase tracking-widest text-primary">Sources légales — Légifrance en temps réel</p>
<p className="text-foreground/90 text-sm leading-relaxed">
Les textes des articles légaux critiques (Art. 225-1, 24 Loi 1881, Art. 421-2-5…) sont
récupérés en temps réel depuis <strong>l'API officielle Légifrance (PISTE)</strong> et injectés
dans le prompt avant chaque analyse. Le modèle travaille ainsi sur le texte
consolidé du jour, pas sur sa mémoire d'entraînement figée.
</p>
<p className="text-foreground/90 text-sm leading-relaxed">
Les textes sont mis en cache 24 h. Un script de surveillance hebdomadaire
(<code className="bg-muted px-1 py-0.5 rounded text-xs">scripts/check_legal_refs.py</code>) détecte
tout changement législatif et alerte en cas de modification. Si l'API Légifrance
est indisponible, le système bascule automatiquement sur le cadre légal statique
intégré au prompt le filtrage continue sans interruption.
Les textes des articles légaux les plus sensibles sont récupérés à chaque analyse
depuis <strong>l'API officielle Légifrance (PISTE)</strong> et injectés dans le prompt
immédiatement avant les critères d'acceptation. Le modèle travaille ainsi sur les textes
consolidés du jour, pas sur sa mémoire d'entraînement figée qui peut dater de
plusieurs années.
</p>
<div className="space-y-2">
<p className="text-foreground/90 text-sm font-semibold">Articles surveillés</p>
<p className="text-foreground/80 text-xs leading-relaxed">
Les articles de priorité <strong>critique</strong> et <strong>haute</strong> sont injectés dans chaque prompt.
Les articles <strong>moyenne</strong> sont suivis pour détecter les changements législatifs mais ne sont pas injectés
(le cadre légal statique les couvre déjà).
</p>
<div className="overflow-x-auto">
<table className="w-full text-xs border-collapse mt-2">
<thead>
<tr className="border-b border-border">
<th className="text-left py-1.5 pr-4 font-mono uppercase tracking-wider text-muted-foreground">Référence</th>
<th className="text-left py-1.5 pr-4 font-mono uppercase tracking-wider text-muted-foreground">Infraction</th>
<th className="text-left py-1.5 font-mono uppercase tracking-wider text-muted-foreground">Priorité</th>
</tr>
</thead>
<tbody className="divide-y divide-border/40">
{[
{ ref: "Code pénal Art. 225-1", desc: "Discrimination", prio: "Critique", color: "text-red-600 dark:text-red-400" },
{ ref: "Loi 1881 Art. 24", desc: "Provocation à la haine", prio: "Critique", color: "text-red-600 dark:text-red-400" },
{ ref: "Code pénal Art. 222-33", desc: "Harcèlement sexuel", prio: "Haute", color: "text-amber-600 dark:text-amber-400" },
{ ref: "Code pénal Art. 222-33-2-2", desc: "Cyberharcèlement en meute", prio: "Haute", color: "text-amber-600 dark:text-amber-400" },
{ ref: "Code pénal Art. 421-2-5", desc: "Apologie du terrorisme", prio: "Haute", color: "text-amber-600 dark:text-amber-400" },
{ ref: "Code pénal Art. 211-1", desc: "Génocide", prio: "Haute", color: "text-amber-600 dark:text-amber-400" },
{ ref: "Loi 1881 Art. 24 bis", desc: "Négationnisme", prio: "Haute", color: "text-amber-600 dark:text-amber-400" },
{ ref: "Code pénal Art. 226-4-1", desc: "Usurpation d'identité numérique", prio: "Haute", color: "text-amber-600 dark:text-amber-400" },
{ ref: "Code pénal Art. 212-1", desc: "Crimes contre l'humanité", prio: "Moyenne", color: "text-muted-foreground" },
{ ref: "Code pénal Art. 223-13", desc: "Provocation au suicide", prio: "Moyenne", color: "text-muted-foreground" },
{ ref: "Loi 1881 Art. 29", desc: "Diffamation", prio: "Moyenne", color: "text-muted-foreground" },
].map((row) => (
<tr key={row.ref}>
<td className="py-1.5 pr-4 font-mono text-foreground/80">{row.ref}</td>
<td className="py-1.5 pr-4 text-foreground/70">{row.desc}</td>
<td className={`py-1.5 font-semibold ${row.color}`}>{row.prio}</td>
</tr>
))}
</tbody>
</table>
</div>
</div>
<div className="space-y-1.5 text-foreground/80 text-sm">
<p>
<strong>Cache :</strong> les textes sont mis en cache 24 h (Redis si disponible, sinon mémoire par worker).
Un appel API Légifrance n'est effectué qu'à l'expiration du cache.
</p>
<p>
<strong>Surveillance hebdomadaire :</strong> le script{" "}
<code className="bg-muted px-1 py-0.5 rounded text-xs">check_legal_refs.py --check</code>{" "}
compare les textes courants avec la baseline stockée et retourne un code d'erreur si des
modifications sont détectées intégrable dans une pipeline CI ou un cron.
</p>
<p>
<strong>Résilience :</strong> si l'API Légifrance est indisponible, le système bascule
automatiquement sur le cadre légal statique intégré au prompt — le filtrage continue sans
interruption et sans dégradation visible.
</p>
</div>
</div>
<div>