L'unité web portait ORIGIN=https://veille.example.org : un fichier versionné
qu'il fallait éditer à chaque déploiement, et dont l'oubli casse silencieusement
les soumissions de formulaire. Remplacé par PROTOCOL_HEADER / HOST_HEADER :
l'application déduit son origine des en-têtes du reverse proxy et fonctionne
donc sur n'importe quel domaine, sans édition.
Vérifié en exécutant réellement le binaire construit : deux domaines
différents servis par le même processus, HTTP 200 dans les deux cas, et un
ORIGIN figé l'emporte bien sur les en-têtes.
Au passage, une affirmation fausse que j'avais écrite en commentaire : « le
.env l'emporte sur les variables systemd ». C'est l'inverse — le --env-file de
Node ne remplace pas une variable déjà présente dans l'environnement (constaté
sur Node 24). Le commentaire dit désormais pourquoi ORIGIN dans .env fonctionne
quand même : parce que l'unité ne le déclare pas. Et un contrôle mécanique
interdit désormais de le redéclarer.
ExecStart passe par /usr/bin/env : NodeSource installe node dans /usr/bin, une
compilation manuelle dans /usr/local/bin, un chemin figé échouait sur l'un des
deux.
Deux contrôles ajoutés à make verifier : aucune valeur d'exemple active dans
les unités systemd, et ORIGIN laissé au .env.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Application — rendu serveur sur adapter-node, conforme au §3bis :
- tableau de bord, recherche à facettes, fiche détaillée, calendrier
- /a-propos et /methode prérendues ; tout le reste en rendu serveur
- API JSON ouverte : /api/textes, /api/textes/[slug], /api/echeances
- recherche FTS5 avec surlignage et classement bm25 pondéré (le titre pèse
dix fois plus que les points clés)
- facettes recalculées sur le résultat filtré par les AUTRES facettes : cocher
un thème doit recompter les statuts encore disponibles, sinon les compteurs
mentent
Identité OKI sobrifiée : tokens en CSS vanilla, thème sombre par défaut et
clair opt-in, or comme seule couleur d'action, flag-bar une fois par écran,
polices Archivo/Inter auto-hébergées. Politique de sécurité de contenu
interdisant toute requête tierce. Les statuts ne reposent jamais sur la seule
couleur : libellé en toutes lettres et pastille de forme distincte.
Budget respecté très largement : 6,6 Ko de JavaScript sur l'accueil (3 Ko
compressés) pour un plafond de 100 Ko. Les faits clés — AFD à 500 €, saisine
2026-915 DC, statut — sont lisibles sans JavaScript.
Trois défauts trouvés en testant l'application, pas en relisant le code :
- v_textes est une vue, et une vue SQLite n'a pas de rowid : la jointure avec
l'index plein texte échouait (migration 005)
- ppl-montagne remontait en « pertinence forte » alors que le corpus dit
« sans portée pour la Guadeloupe » — la cotation comptait le mot sans lire
la négation. Idem pour pjl-logement et accord-globe. Corrigé par une lecture
du voisinage, avec quatre tests de non-régression.
- les libellés d'affichage étaient importés depuis /server dans un
composant, ce que SvelteKit interdit à raison
PWA : service worker réseau-d'abord pour les pages, cache-d'abord pour le
coffre du build. Une veille législative ne doit pas servir une page périmée
quand le réseau répond — une date de promulgation change tout. Les réponses
issues du cache portent un en-tête qui le dit.
systemd : timer du pipeline (6 h, 18 h, dimanche 9 h, avec dispersion et
rattrapage), application activée par socket avec mise en sommeil à 300 s.
Unités durcies, validées par systemd-analyze.
Documentation : README d'installation sur Debian/Ubuntu vierge,
README-pipeline avec le piège des deux couples d'identifiants PISTE, et
scripts/verifier-conformite.sh qui contrôle mécaniquement le §3bis et le §8.
172 tests, npm run check à 0 erreur, make verifier au vert.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>