Fichier de mémoire de travail partagé entre jul_oh et Claude. Se lit au début de chaque nouvelle conversation pour reprendre le contexte. Se met à jour à la fin de chaque session productive.
Dernière mise à jour : 2026-08-08
Pipeline de curation RSS → digest IA opérationnel en production depuis le 2026-04-19. Tourne 3x/jour via GitHub Actions, synthétise avec Claude Haiku (scoring) + Sonnet (synthèse), servi par GitHub Pages, consommé dans Reeder iOS.
2026-08-08 — Les articles retenus affichent désormais dans le digest leur score initial (3 à 5) et la raison du filtrage. L'annexe est rendue par Python après la synthèse afin de garantir l'association score/article sans appel LLM.
2026-08-07 — Garde-fous critiques de collecte et de coût : la fenêtre repart du dernier run réussi au lieu d'un lookback fixe, avec 60 min de chevauchement. Les candidats sont triés par fraîcheur puis plafonnés à 50/source et 200/run avant tout appel LLM. Le détail d'audit passe dans les artefacts Actions (30 jours) au lieu d'être versionné.
- Repo : https://github.com/julienoh/veille (public, MIT)
- URL digest : https://julienoh.github.io/veille/digest.xml
- Coût réel constaté : ~0.05$ par run
2026-04-25 — Documentation inline de digest.py étoffée
(docstring module, sémantique des paramètres, docstrings fonctions,
commentaires aux points subtils). Code inchangé. Le fichier est
maintenant lisible "à froid" par un dev tiers.
2026-04-25 — Ajout du déclencheur push: branches: [main] dans
digest.yml (avec paths-ignore: ['**.md', 'LICENSE']). Le README §3
documentait 3 déclencheurs mais le workflow n'en avait que 2.
- 2026-04-19 — GitHub Actions comme cron (vs VPS, Raspberry Pi, n8n) → zéro infra à maintenir, gratuit, versionné, logs intégrés
- 2026-04-19 — GitHub Pages comme serveur RSS (vs Cloudflare R2, Netlify) → même repo, zéro config supplémentaire
- 2026-04-20 — Repo public (vs privé) → GitHub Pages gratuit sur repo public uniquement, rien de sensible dans le code (la clé API est dans GitHub Secrets, jamais dans le repo)
- 2026-04-19 — OPML comme source de vérité des sources (vs URLs hardcodées) → double usage : lisible par le pipeline ET importable dans Reeder
- 2026-04-25 — Déclencheur
pushajouté àdigest.ymlavecpaths-ignoresur**.mdetLICENSE→ permet de tester un changement de code immédiatement sans attendre le cron, sans re-générer un digest pour les modifs de doc seules
- 2026-04-19 — Split Haiku (scoring) + Sonnet (synthèse) (vs tout-Sonnet) → Haiku ~10x moins cher pour une tâche de classification simple, économise ~65% sur la facture mensuelle
- 2026-04-19 — Modèles retenus :
claude-haiku-4-5-20251001etclaude-sonnet-4-6
- 2026-04-19 —
seen.jsoncommité dans git (vs SQLite, Redis, DynamoDB) → zéro infra, versionné gratuitement, fenêtre 14 jours ~50KB max - 2026-04-19 — Un seul item RSS par run (vs un par article) → format "bulletin" plus lisible dans Reeder, moins d'items à marquer lus
- 2026-08-07 —
last_success.jsoncommité dans git → la collecte repart du dernier run terminé avec succès et couvre les écarts irréguliers du cron, les retards et les runs manqués - 2026-08-07 —
audit-details.mddéplacé vers les artefacts Actions → détail disponible 30 jours sans croissance continue de l'historique Git
- 2026-08-07 — Plafonds appliqués avant le scoring LLM : 50 articles par source et 200 par run, avec priorité aux articles datés les plus récents
- 2026-08-08 — Score + raison visibles pour chaque article retenu dans le RSS
→ rendu déterministe depuis
score_phase1, sans confier l'association au LLM
- 2026-04-21 — Licence MIT (vs Apache, AGPL, pas de licence) → code générique sans enjeu de brevet ni logique métier originale, friction minimale pour un éventuel fork
Enrichissement du contenu des articles : les feeds RSS sont souvent tronqués par les éditeurs. La synthèse Sonnet est donc basée sur des résumés courts, ce qui limite la qualité.
Trois solutions envisagées, aucune encore implémentée :
- Jina Reader (
r.jina.ai) — le plus simple, zéro infra, appel HTTP - Wallabag self-hosted — meilleure qualité d'extraction, nécessite un serveur
- wallabag.it — service gratuit hébergé, quota limité
Sous-question ouverte : l'hébergement Hostinger de jul_oh est-il un shared hosting (incompatible Wallabag) ou un VPS (compatible) ? À clarifier avant de trancher.
- Hostinger : type exact du plan (shared vs VPS) ? Conditionne le choix entre wallabag.it et self-hosted
- Stratégie de fallback : Wallabag → Jina → résumé feed, ou directement Jina partout ? À décider une fois le test effectué
- Paywalls (FT, Bloomberg, The Information) : laisser tels quels ou chercher une solution ? Pour l'instant laissés tels quels, décision à réévaluer si des articles importants passent à côté du radar
- Retry sur les appels API avec
tenacityou backoff exponentiel - Batch scoring via l'API Batch d'Anthropic (50% de réduction + parallélisme)
- Alertes sur feeds cassés (log structuré + notification après N échecs)
- Catégorie "Cyber FR" dédiée avec CERT-FR, ANSSI, CISA KEV + prompt de scoring spécialisé (criticité CVE, DICP)
- Pré-filtre arXiv par mots-clés avant le scoring Haiku (réduire le volume entrant sur cette source très bruyante)
- Déduplication cross-sources via clustering de titres (embeddings ou Jaccard sur tokens)
- Mémoire des sujets via PGVector + embeddings (adapter le scoring si un sujet a déjà été couvert N fois ce mois)
- Feedback loop pour signaler les articles mal scorés (et affiner le prompt automatiquement)
- Migration vers actions Pages natives
(
actions/upload-pages-artifact+actions/deploy-pages)
- Warning Node.js 20 deprecation dans les logs Actions
(échéance juin 2026, à corriger avant en mettant à jour les versions
d'actions dans
digest.yml) - Feeds probablement cassés non identifiés : certaines URLs de l'OPML
sont des patterns probables non vérifiés individuellement
(
/feed,/rss) qui peuvent retourner 404. À identifier dans les logs sur 1-2 semaines d'usage réel. - Message trompeur "To get started, purchase credits" sur platform.claude.com peut s'afficher même avec un solde positif (UI incohérente côté Anthropic)
- 2026-04-19 20:11 UTC — Premier run réussi en production 44 sources chargées, 20 articles frais, 3 retenus, digest.xml écrit, branche gh-pages créée
À la fin d'une conversation productive :
"Résume ce qu'on a fait dans cette conversation et propose les mises à jour de MEMORY.md, CHANGELOG.md et README.md si nécessaire."
Au début d'une nouvelle conversation (si MCP GitHub activé) : Claude lit ce fichier en premier pour reprendre le contexte sans avoir à tout recoller manuellement.
Activation MCP GitHub : app Claude → Settings → Connectors → GitHub → connecter compte. À faire une fois pour toutes.