The full upstream README, mirrored here for reference. Install config, tool schemas, adoption signals, and an original overview live on the L0g.fr Risk Intelligence listing page.
Journal statique (Astro 7 + Tailwind v4), édité en Markdown/MDX, versionné sur GitHub, déployé en pull-based sur un serveur Debian/Apache qui ne sert que du HTML. Infographies locales, recherche Pagefind, RSS, sitemap, aucun tracker.
Pour publier (articles, pages avec graphes, colonne de droite), voir le guide pas à pas :
docs/GUIDE-CONTENU.md.
Aperçu d'un build de production (nécessaire pour tester la recherche Pagefind) :
l0g publie aussi des surfaces lisibles par machine, utilisées par les agents IA et par les dashboards :
/agents.json : manifeste de découverte pour agents./openapi.json : contrat OpenAPI 3.1 de l'API publique./api/v1/risk-diff.json : diff du risque sur 1, 7 et 30 jours
(signaux, sources, claims, modèles, articles et confiance)./api/v1/black-box.json : frames point-in-time hashées pour rejouer
l'état public du risque sans reconstruction rétroactive./api/v1/risk.json : signaux de risque normalisés par instrument./api/v1/debt-risk.json : snapshot canonique Dette US repris de Debt Risk
Radar latest.json, avec provenance, buckets et couverture lorsque disponible./api/v1/signals/history.* : historique point-in-time pour backtests et
replay sans look-ahead bias./api/v1/signals/{slug}/chart.svg : graphique autonome 1200 × 630 d'une
série nommée, avec source et attribution CC BY 4.0 intégrées./ressources-journalistes/ et /en/press-resources/ : graphiques, exports,
code d'intégration, citations recommandées et limites de réutilisation./api/mcp/compact : façade MCP recommandée à six outils, avec découverte,
recherche, documents, preuves, research packs et get_risk_state, produit
principal pour l’état courant, le diff, l’historique et le replay./api/mcp : surface MCP complète en lecture seule, conservée pour compatibilité
et usages experts autour d'Agent Surface, Risk Diff, Black Box, claims, sources,
intégrité et changefeed./api/v1/toolset-manifest.json : versions et empreintes anti-dérive des contrats
d'outils MCP complet et compact./api/v1/human-traffic.json : GET HTML humains agrégés par jour, page et
domaine référent, plus une ventilation séparée MCP/API, previews, robots et
scans ; sans identifiant persistant et avec seuil k=5./llms.txt et /llms-full.txt : cartes textuelles pour agents et RAG.Les détails de calcul et les limites de modèle sont dans
docs/MODELES-RISQUE.md et dans
/methodologie/.
L'UI de revue humaine des assertions (tooling d’admin) est volontairement isolée du site public et du MCP. Elle n'est pas exposée publiquement :
127.0.0.1:4317http://127.0.0.1:4317/Lancement :
Le mode commit reste strictement en terminal :
Détails sécurité côté local :
/api/review, /api/remove) exigent JSON + token anti-CSRF propre à la session (x-review-token),CONFIRMER.Le MCP public et les endpoints de production ne sont pas affectés par ces options.
En cas d’erreur dans l’UI de revue :
Requête rejetée avec Token de sécurité manquant ou invalide
Cmd/Ctrl + R) puis rejoue l’action.Ctrl+C dans le terminal qui a lancé node scripts/review-claims.mjsnode scripts/review-claims.mjsErreur Method not allowed / 405
POST avec JSON.Erreur Content-Type invalide: application/json requis
content-type: application/json.Erreur de débit (Trop de requêtes)
Erreur Requête trop volumineuse / champs trop longs
Ctrl+C) avant de relancer la commande,node scripts/review-claims.mjs,/api/state).git status --short,node scripts/review-claims.mjs --commit --dry-run --message "...",src/config/claim-reviews.json,commit --dry-run réel avec CONFIRMER uniquement si le diff est conforme.curl -s http://127.0.0.1:4317/api/security-statsDeux corrections de modèle sont maintenant reflétées dans les surfaces l0g :
50, au lieu de renormaliser tout le score sur les seules sources
disponibles. Le prochain snapshot généré depuis latest.json expose
score.coverage.Après modification d'un moteur amont, régénérer les artefacts l0g avec
npm run risk:update, puis npm run test:risk-snapshot,
npm run test:agent-surface et npm run build.
Créer un fichier dans src/content/posts/, en .md (texte) ou .mdx (texte +
composants). Frontmatter :
L'URL est dérivée du nom de fichier : mon-article.md → /posts/mon-article/.
Les visuels publiés doivent être locaux : SVG inline dans un fichier .mdx,
composant Astro interne ou fichier placé dans public/infographies/.
Les scripts, iframes, images et polices chargés depuis un domaine tiers sont interdits. Le build de sécurité contrôle cette promesse.
Toute balise <img> doit déclarer ses dimensions intrinsèques width et
height, ainsi que loading="lazy" et decoding="async". L'audit de
performance bloque une régression susceptible de provoquer du CLS.
main qui affecte le site,
ou à la demande. Les changements limités aux documents internes et aux
workflows sans effet sur le site ne republient pas built.security-extended sur les changements de code et
les pull requests, avec annulation des analyses devenues obsolètes. Les
changements purement éditoriaux ou statiques sont exclus.l0g-risk.timer, configuré toutes les
15 minutes, reste le mécanisme de production des agrégats.npm run test:ci-policy bloque la réintroduction silencieuse d'un cron et
vérifie les principaux garde-fous de coût et de sécurité.built uniquement une enveloppe de release
composée de l'archive statique, du SHA-256, du bundle Sigstore et des
coordonnées du commit source. Ces coordonnées sont incluses dans
l'archive attestée et dupliquées à la racine de built; le déployeur exige
leur égalité octet par octet avant toute bascule..last_source_sha et .last_built_sha.L'index des contrats, runbooks et versions maintenues se trouve dans
docs/README.md.
git push sur main.dist/, crée une archive déterministe de toute la
sortie, puis l'atteste avec GitHub OIDC et Sigstore.built transporte l'archive en fragments numérotés de 90 Mio
au maximum, avec leurs SHA-256, le SHA-256 de l'archive entière, le bundle
d'attestation et les coordonnées du commit source de main. Le découpage
évite la limite de taille par fichier GitHub sans modifier l'archive signée.built toutes les 2 min.
Avant toute bascule, il exige
que le clone corresponde au HEAD distant de built, que le SHA source
corresponde au HEAD distant de main. Le worker contrôle les noms,
l'ordre, le nombre (16 au maximum), la taille et le SHA-256 des fragments,
puis reconstitue l'archive dans son répertoire temporaire privé. Il exige
ensuite que le SHA-256 global et gh attestation verify
confirment l'archive, le workflow signataire, la ref et le commit source.Le déploiement statique n'exécute aucune toolchain Node, ne build rien et n'ouvre aucun port entrant. Le serveur ne possède aucun token GitHub permanent.
Pour migrer un serveur qui possède déjà l'ancien timer, utiliser plutôt le script transactionnel. Il sauvegarde le worker et les unités, vérifie le premier déploiement attesté et restaure automatiquement l'ancien worker, les unités, le symlink courant et les marqueurs si l'activation échoue :
La première publication utilisant les fragments exige l'installation de cette
version de deploy/deploy.sh sur le serveur. L'ancien worker refuse ce nouveau
transport et conserve la version en ligne ; il ne doit pas être contourné.
Le nouveau worker accepte aussi les anciennes archives monolithiques. Toute
absence, altération ou ambiguïté dans les fragments empêche la bascule. Les
signatures, l'identité du workflow, le commit source et les protections
d'extraction restent vérifiés sur l'archive entière.
Si la version Debian de gh ne fournit pas attestation verify, suivre le bloc
d'installation depuis le dépôt officiel GitHub dans
docs/MCP-RELEASE.md. Tant que
l'archive attestée ou l'outil de vérification manque, le script refuse la
release et conserve le symlink courant.
Contrôles après le premier déploiement attesté :
renovate.json fusionne
automatiquement patch/minor quand la CI est verte. Le preset
helpers:pinGitHubActionDigests conserve toutes les Actions sur des SHA
immuables et ouvre les mises à jour de digest. Les majeures restent en PR
manuelle. Un build cassé ou une provenance incohérente n'atteint jamais la
prod : la release courante continue de servir.unattended-upgrades côté Debian.built n'est pas une autorité seule : son archive doit être
attestée par .github/workflows/build.yml et provenir du HEAD courant de
main au moment de l'activation. Cette vérification est le contrat du nouveau
déployeur ; l'état transitoire du serveur est documenté plus haut.deploy/l0g.fr.apache.conf), HSTS, en-têtes durcis.CITATION.cff ;releases/l0g-editorial-protocol-1.0.0/.Le fichier LICENSE définit précisément la portée et renvoie aux
deux textes juridiques complets dans LICENSES/.
Le site est en édition « git-pur » par choix de sécurité. Pour ajouter une UI
type CMS sans base de données, le plus propre avec Astro est Keystatic
(git-based, schémas TypeScript). Cela réintroduit toutefois une route /admin
et un flux OAuth GitHub à autoriser dans la CSP — à peser contre le modèle
« zéro runtime » actuel.