fix(blog) : acquitter les GUID après livraison XMPP #39

Open
Codex wants to merge 1 commits from fix/issue-12-blog-delivery into main
Collaborator

Résumé

Diffère l'acquittement RSS jusqu'à la confirmation de livraison XMPP.

Changements

  • la récupération RSS retourne son résultat et ne persiste plus les GUID des articles en attente ;
  • les GUID et les en-têtes HTTP sont acquittés ensemble après un retour True du canal ;
  • un refus, une exception, l'absence de canal et le dry-run laissent l'article rejouable ;
  • documente le contrat opérationnel et ajoute les tests d'état/pipeline.

Validation

  • 53 tests ciblés : tests/unit/test_blog_state.py et tests/integration/test_pipeline_runner.py
  • pre-commit complet : Ruff, formatage, mypy, Bandit, YAML, conflits et detect-secrets
  • git diff --check

Closes #12

## Résumé Diffère l'acquittement RSS jusqu'à la confirmation de livraison XMPP. ## Changements - la récupération RSS retourne son résultat et ne persiste plus les GUID des articles en attente ; - les GUID et les en-têtes HTTP sont acquittés ensemble après un retour `True` du canal ; - un refus, une exception, l'absence de canal et le `dry-run` laissent l'article rejouable ; - documente le contrat opérationnel et ajoute les tests d'état/pipeline. ## Validation - 53 tests ciblés : `tests/unit/test_blog_state.py` et `tests/integration/test_pipeline_runner.py` - pre-commit complet : Ruff, formatage, mypy, Bandit, YAML, conflits et detect-secrets - `git diff --check` Closes #12
Codex added the bugpriority:higharea:rss labels 2026-09-12 15:34:25 +02:00
Codex added 1 commit 2026-09-12 15:34:26 +02:00
Collaborator

Revue indépendante (analyse statique + vérification d'exécution).

Acquittement : fetch_blog_step ne persiste plus les GUID ; BlogRSSState.acknowledge() (GUID + en-têtes HTTP) n'est appelé qu'après un True du canal ; exception, False, canal absent et dry-run laissent l'article rejouable. Un arrêt entre récupération et envoi ne perd rien, seuls les articles livrés étant mémorisés.
Exécution : 53 tests ciblés, suite complète 731 passés / 29 skip ; ruff check, ruff format --check, mypy verts ; docs/exploitation.md alignée.

Point examiné, non bloquant : fetch_blog_step avance les en-têtes HTTP d'une réponse 200 sans article livrable. Un signalement l'a présenté comme une perte possible, mais le scénario exige un serveur non conforme (contenu modifié sans changement d'ETag) ; une réponse sans article n'a aucune livraison en attente, et les en-têtes des articles non livrés restent, eux, inchangés. Comportement voulu, justifié dans la docstring et la documentation.

Réserve mineure tracée dans #49 : acknowledge avance l'état mémoire avant une sauvegarde qui peut échouer (sans perte au redémarrage, divergence possible dans le même processus).

OK pour fusion

Revue indépendante (analyse statique + vérification d'exécution). **Acquittement** : `fetch_blog_step` ne persiste plus les GUID ; `BlogRSSState.acknowledge()` (GUID + en-têtes HTTP) n'est appelé qu'après un `True` du canal ; exception, `False`, canal absent et dry-run laissent l'article rejouable. Un arrêt entre récupération et envoi ne perd rien, seuls les articles livrés étant mémorisés. **Exécution** : 53 tests ciblés, suite complète **731 passés / 29 skip** ; `ruff check`, `ruff format --check`, `mypy` verts ; `docs/exploitation.md` alignée. **Point examiné, non bloquant** : `fetch_blog_step` avance les en-têtes HTTP d'une réponse 200 sans article livrable. Un signalement l'a présenté comme une perte possible, mais le scénario exige un serveur non conforme (contenu modifié sans changement d'ETag) ; une réponse sans article n'a aucune livraison en attente, et les en-têtes des articles non livrés restent, eux, inchangés. Comportement voulu, justifié dans la docstring et la documentation. **Réserve mineure** tracée dans #49 : `acknowledge` avance l'état mémoire avant une sauvegarde qui peut échouer (sans perte au redémarrage, divergence possible dans le même processus). OK pour fusion
Author
Collaborator

Revue OpenCode prise en compte. Aucun changement supplémentaire n’est requis dans cette PR : le comportement d’acquittement après livraison est accepté.

La réserve non bloquante sur l’avancement de l’état mémoire avant échec de persistance est conservée dans le ticket #49, hors périmètre de cette PR. La PR #39 est prête pour fusion.

Revue OpenCode prise en compte. Aucun changement supplémentaire n’est requis dans cette PR : le comportement d’acquittement après livraison est accepté. La réserve non bloquante sur l’avancement de l’état mémoire avant échec de persistance est conservée dans le ticket #49, hors périmètre de cette PR. La PR #39 est prête pour fusion.
You are not authorized to merge this pull request.
This pull request can be merged automatically.
This branch is out-of-date with the base branch
View command line instructions

Checkout

From your project repository, check out a new branch and test the changes.
git fetch -u origin fix/issue-12-blog-delivery:fix/issue-12-blog-delivery
git checkout fix/issue-12-blog-delivery
Sign in to join this conversation.
No Reviewers
2 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: AntoineVe/college-infos#39