Skip to content

feat(oe-raflow): journal bloquant, exception documentée pour Decider::decide - #45

Merged
PhilippeVienne merged 1 commit into
devfrom
feat/oe-raflow-recorder-async
Sep 26, 2026
Merged

PhilippeVienne merged 1 commit into
devfrom
feat/oe-raflow-recorder-async

Conversation

@PhilippeVienne

Copy link
Copy Markdown
Contributor

Contexte

Deuxième morceau du chantier « Recorder async » (docs/WEBUI.md §7, §15 étape 2b ; recoupe aussi l'item P0 J-2 de l'audit du 2026-09-25, docs/AUDIT_2026_09_25.md / TODO.md §0). Suite de #42 (oe-ca-core, mergée). Base dev.

Contenu

  • oe_raflow::Recorder devient async (#[async_trait]).
  • Flow::open (nouvelle demande) réordonné comme oe-ca-core : le journal s'écrit avant store.create_request. Si le journal échoue, aucune demande n'est créée.
  • Decider::decide (approve/reject RA) est une exception documentée, décidée avec vous : l'écriture optimiste (update_request, CAS sur l'état Pending) reste avant le journal, parce qu'elle départage deux décisions concurrentes sur la même demande — journaliser avant risquerait de consigner une décision qui perd la course et n'a jamais eu lieu. Conséquence assumée et testée : un échec du journal après decide() laisse la décision déjà appliquée en base, malgré l'erreur rendue à l'appelant.
  • oe-actions avait déjà la propagation de l'échec du journal (Error::Journal, commentaire « le journal d'abord » déjà présent dans le code) : seul le passage en async restait à corriger (.await ajouté à 14 sites), plus deux écritures délibérément best-effort (refus d'amorçage à un système verrouillé, échec de republication de CRL après une révocation déjà acquise) laissées telles quelles.
  • ca-server, ra-console : mise à jour des implémentations de test (MemJournal, NullJournal) et de l'AuditRecorder de production.

Reste : oe_tsa_core::Recorder et oe_timesource::Recorder (tsa-server), même démarche ; puis le câblage S3 réel de ca-server (2b-B).

Vérifications

  • cargo fmt --check
  • cargo clippy --workspace --all-targets -- -D warnings (1.97 et 1.98.1)
  • cargo test --workspace (avec OE_CASTORE_TEST_DSN) : vert, y compris 2 nouveaux tests (réordonnancement de Flow::open, et l'exception documentée sur Decider::decide)
  • cargo audit --ignore RUSTSEC-2023-0071 : rien à signaler
  • Contrôle par mutation : le réordonnancement de Flow::open échoue pour la bonne raison quand on revient à l'ordre précédent

…:decide

Deuxième morceau du chantier « Recorder async » (docs/WEBUI.md §7, §15
étape 2b ; recoupe aussi l'item P0 J-2 de l'audit du 2026-09-25).

- oe_raflow::Recorder devient async (#[async_trait]).
- Flow::open (nouvelle demande) réordonné comme oe-ca-core : le journal
  s'écrit avant store.create_request. Si le journal échoue, aucune demande
  n'est créée.
- Decider::decide (approve/reject RA) est une EXCEPTION DOCUMENTÉE, décidée
  avec l'utilisateur : l'écriture optimiste (update_request, CAS sur l'état
  Pending) reste avant le journal, parce qu'elle départage deux décisions
  concurrentes sur la même demande. Journaliser avant risquerait de
  consigner une décision qui perd la course et n'a jamais eu lieu.
  Conséquence assumée et testée : un échec du journal après decide() laisse
  la décision déjà appliquée en base, malgré l'erreur rendue à l'appelant.
- oe-actions avait déjà la propagation de l'échec du journal
  (Error::Journal, commentaire « le journal d'abord » déjà présent) : seul
  le passage en async restait à corriger (.await ajouté à 14 sites), plus
  deux écritures délibérément best-effort (refus d'amorçage à un système
  verrouillé, échec de republication de CRL après une révocation déjà
  acquise) laissées telles quelles, désormais await-ées proprement.
- ca-server, ra-console : mise à jour des implémentations de test
  (MemJournal, NullJournal) et de l'AuditRecorder de production.

Reste : oe_tsa_core::Recorder et oe_timesource::Recorder (tsa-server), même
démarche ; puis le câblage S3 réel de ca-server.

Vérifications : cargo fmt --check, cargo clippy --workspace --all-targets
(1.97 et 1.98.1), cargo test --workspace (avec OE_CASTORE_TEST_DSN), cargo
audit. Contrôle par mutation : le réordonnancement de Flow::open échoue
pour la bonne raison quand on revient à l'ordre précédent ; un test dédié
prouve et documente le comportement de l'exception sur Decider::decide
(décision appliquée malgré l'échec du journal).
@PhilippeVienne
PhilippeVienne merged commit 1a3b496 into dev Sep 26, 2026
15 checks passed
@PhilippeVienne
PhilippeVienne deleted the feat/oe-raflow-recorder-async branch October 12, 2026 19:12
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant