Skip to content

feat(ra-console): explorateur d'audit dans le navigateur (étape 6d) - #94

Open
PhilippeVienne wants to merge 2 commits into
devfrom
feat/ra-console-audit-breaks
Open

PhilippeVienne wants to merge 2 commits into
devfrom
feat/ra-console-audit-breaks

Conversation

@PhilippeVienne

Copy link
Copy Markdown
Contributor

Objet

Étape 6d du plan WEBUI : l'explorateur d'audit dans le navigateur, sur GET /api/v1/audit/search. Deux commits, dans l'ordre.

1. Écran « Audit » (lecture seule)

  • Recherche par numéro de série et par période ; filtres par opérateur et par événement appliqués dans le navigateur sur les résultats reçus (l'API ne les connaît pas).
  • Tableau des deux journaux (autorité, console) avec la source de chaque entrée ; détail dépliable de chaque événement, rendu en texte (jamais interprété).
  • Bannière « Chaîne d'audit vérifiée : N entrées intègres » ; chaîne rompue ou journal indisponible : alerte rouge, aucun résultat, même pour l'autre journal (WEBUI §7).
  • Le harnais e2e monte un S3 simulé portant deux vrais journaux chaînés ; le test y dépose un journal altéré pour exercer le blocage, puis l'original.

2. API enrichie (le contrat de docs/UI-UX.md §3.3 n'était pas servi)

  • Chaque entrée porte prev et hash (recoupement du chaînage hors de la console).
  • broken dit, pour chaque journal rompu, la nature (chain, sequence, tampered, unreadable) et l'entrée ou la ligne en cause. Jamais d'empreinte attendue ni de contenu.
  • Une erreur locale de relecture (fichier temporaire) répond 503 au lieu de s'afficher comme une rupture d'intégrité.
  • docs/WEBUI.md §5 décrivait un contrat (kind, payload) qui n'a jamais été celui du code : corrigé.

Limites assumées

  • Pas de pagination : chaque requête relit les deux journaux en entier depuis S3 (déjà le cas avant cette PR).
  • Les filtres opérateur et événement restent côté navigateur.
  • Le champ broken est additif : un ancien serveur ne l'envoie pas, l'écran retombe sur le message générique.
  • bin/ra-console/web/test-results/ est suivi par git et modifié par Playwright : non inclus dans cette PR, à sortir de l'index à part.

Vérifications

  • cargo fmt --check : OK
  • cargo clippy --workspace --all-targets -- -D warnings : OK
  • cargo test -p ra-console -p oe-audit avec PostgreSQL : OK (9 tests d'audit dont 5 nouveaux)
  • Playwright : 12 parcours OK (2 nouveaux, e2e/audit.spec.ts)
  • npm run typecheck et npm run build : OK, dist/ à jour
  • Mutations : sans le blocage de chaîne rompue côté écran, le test e2e échoue ; côté API, deux mutants tués (séquence de l'entrée altérée mal reportée, une seule rupture rapportée au lieu de deux)

Revue humaine obligatoire

Voir PROVENANCE.md. Chaque case est cochée par le contributeur humain qui valide la PR, après l'avoir fait lui-même.

  • Revue d'architecture validée par l'humain
  • Code relu et tests unitaires/intégration vérifiés localement
  • Absence de dépendances tierces incompatibles avec la double licence EUPL-1.2 / AGPL-3.0 (make licenses)
  • Validation de l'apport intellectuel et de la paternité humaine sur la modification

Assistance par IA

  • Cette PR a été produite avec l'assistance de Claude Code : les commits concernés portent la remorque Co-authored-by: Claude <noreply@anthropic.com>, auteur et committer restent humains, et scripts/provenance.py archive a été lancé
  • Cette PR a été écrite sans assistance par IA

PhilippeVienne and others added 2 commits October 6, 2026 08:03
Écran « Audit » sur GET /api/v1/audit/search : recherche par série et par
période, filtres par opérateur et par événement dans le navigateur, détail
dépliable de chaque événement (rendu en texte), source de chaque entrée
(autorité ou console).

Une chaîne rompue ou un journal indisponible bloque tout l'affichage
(alerte rouge, aucun résultat, même pour l'autre journal), conformément à
WEBUI §7. L'écran ne fait jamais confiance à `chain_verified` seul pour
montrer des résultats.

Le harnais e2e monte un S3 simulé portant deux vrais journaux chaînés ; le
test y dépose un journal altéré pour exercer le blocage, puis l'original.
Contrôle par mutation : sans le blocage, le test échoue.

Écarts assumés avec UI-UX §3.3, pour 6d-2 : la séquence rompue et les
empreintes ne sont pas encore exposées par l'API.

Co-authored-by: Claude <noreply@anthropic.com>
…eintes (étape 6d-2)

GET /api/v1/audit/search :
- chaque entrée porte `prev` et `hash`, de quoi recouper le chaînage hors
  de la console ;
- `broken` dit, pour chaque journal rompu, la nature (`chain`, `sequence`,
  `tampered`, `unreadable`) et l'entrée ou la ligne en cause, sans aucune
  empreinte attendue ni contenu ;
- une erreur locale de relecture (fichier temporaire) n'est plus présentée
  comme une rupture d'intégrité : elle répond 503, comme une panne de S3.

Le blocage ne change pas : chaîne rompue, aucun résultat. L'écran affiche
la rupture localisée (journal, nature, entrée) et, dans le détail de chaque
événement, les deux empreintes. docs/WEBUI.md §5 décrivait un contrat
(`kind`, `payload`) qui n'a jamais été celui du code : corrigé.

Cinq tests d'API (empreintes chaînées, entrée altérée, entrée retirée, ligne
illisible, deux journaux rompus) ; deux mutations tuées (séquence mal
reportée, une seule rupture rapportée).

Co-authored-by: Claude <noreply@anthropic.com>
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