TL;DR
La migration v2 du blog était close, mais « la suite » commençait par de la
dette bien visible : le RSS renvoyait 404 en prod, des liens localhost
traînaient dans des pages publiques, et le compte d'articles ne tombait juste
nulle part (384 dans le repo, 456 servis en ligne). Cette session a réparé le
visible, sauvé l'invisible — 74 articles n'existaient que sur le VPS, jamais
revenus dans git — et livré une Bibliothèque qui range enfin les ~500
fichiers markdown non-articles (docs, handoffs, audits, plans, corpus) par
type et par filtre. Huit commits, 78 tests verts, zéro perte.
1. Réparer le visible
Le lien RSS de la navigation pointait /feed/rss.xml → 404. La cause
n'était pas les feeds (ils existaient sur disque) mais le serveur : le
catch-all de src/server.js résolvait les chemins contre la racine du repo,
jamais contre public/, et aucun mount statique ne servait /feed/. Un mount
fastifyStatic de quatre lignes, à côté de ceux de /lexique/ et /shared/,
et le flux répond enfin.
Dans la foulée : les liens http://127.0.0.1:5193 (l'outil Grimoire, local)
qui pointaient vers le vide depuis une page publique sont devenus des libellés
(local) non cliquables ; les pages figées (devblog.html au 16/06,
guide-todos au 30/06 affichant « 179 articles » quand il y en a 458) portent
désormais un bandeau « Instantané du JJ/MM — données non à jour » ; et une
ligne malformée du .gitignore (deux patterns collés) a été séparée.
2. Sauver l'invisible
Le vrai sujet était le comptage incohérent. mirror:prod — un script en
lecture seule qui rapatrie les articles de prod dans .sandbox/ — a
tranché : la prod servait 456 articles, le repo n'en versionnait que
384. Différence : 74 articles publiés directement sur le VPS via l'admin
API, jamais revenus dans git. Le modèle « local-first » du README ne
reflétait pas la réalité — la source la plus complète, c'était la prod.
Ces 74 articles ont été copiés dans devblog/posts/ sans écraser un seul
fichier local, portant le total à 458 (les 456 de prod + 2 articles encore
locaux). Ils sont désormais dans git et sur GitHub et sur le VPS :
triple sauvegarde, rien perdu. Le frontmatter status — qui coexistait en
quatre graphies (pub, "pub", "publish", published) — a été ramené au
canon pub/draft, et publish-article.mjs rejette maintenant toute
valeur inconnue plutôt que de publier un brouillon par accident.
3. Rendre navigable ce qui n'est pas un article
Un blog n'est pas que ses articles. Ce dépôt contient ~500 fichiers markdown
non-articles : 178 handoffs, 170 audits, 79 docs, 49 fichiers de corpus, des
plans, des statuts. Ils existaient dans un catalogue, mais rangés seulement par
dossier — et noyés sous 1000+ fichiers de tooling (.claude, .sandbox).
La refonte ajoute une dimension transversale : le type. Chaque fichier est classé (article, handoff, audit, plan, statut, corpus, doc, workspace) quel que soit son dossier, et le catalogue expose des compteurs par type. En excluant le bruit tooling, il passe de 2163 à 994 entrées réelles.
Au-dessus, une page Bibliothèque (/bibliotheque/) — pas rétro, sur les
tokens du design system, en dark mode, accessible (skip-link, landmarks,
aria-pressed) — offre des facettes cliquables par type, une recherche, et
des groupes par catégorie. Elle remplace « index md » dans la navigation
principale.
| Type | Fichiers |
|---|---|
| Articles | 458 |
| Handoffs | 178 |
| Audits | 170 |
| Docs & guides | 79 |
| Corpus & récits | 49 |
| Statuts | 13 |
| Workspace | 13 |
| Plans & roadmaps | 12 |
| Autres | 22 |
4. Ce qui reste
Le fond de la dette est structurel et attend ses propres sessions :
unifier les trois générateurs HTML qui coexistent, rendre les articles
côté serveur (aujourd'hui un viewer JS affiche « Chargement… », mauvais pour
le SEO et les lecteurs d'écran), régénérer les feeds au moment de la
publication pour arrêter de les committer, et consolider les ~35 catégories de
dossiers. Le plan détaillé vit dans docs/PLAN-BLOG-SUITE-2026-07.md.
La leçon de la session : la dette la plus dangereuse n'est pas celle qu'on
voit (un 404 se remarque) mais celle qu'on ne voit pas — 74 articles à un
rm -rf du néant, sur un seul disque, parce que le chemin de publication
court-circuitait git. Le premier réflexe d'une « suite », c'est de recompter.
Sources : handoff handoffs/2026-07-20-0950-suite-blog-rss-rapatriement-bibliotheque.md ·
plan docs/PLAN-BLOG-SUITE-2026-07.md · script scripts/mirror-prod-articles.mjs ·
catalogue src/md-catalog.js · page public/bibliotheque/.