5 Comparatif Synthese
Corentin JOGUET edited this page 2026-09-30 15:09:10 +02:00

Comparatif attendu / reel — synthese

Ce comparatif verifie que tout ce qui decrit Wakdo dit vrai. Il confronte l'attendu (le sujet d'examen et sa maquette, le referentiel RNCP 37805, la documentation du depot, les pages de ce wiki, le dossier de soutenance) au reel (le code de la version deployee et des mesures sur la production en ligne). Il a ete mene le 27 septembre 2026 sur le commit 11271f7, celui que sert la production (GET /api/health renvoie "version":"11271f7"), en trois volets :

  • Comparatif-Front : la borne, l'interface du back-office, les preuves du Bloc 1, les annexes ;
  • Comparatif-Back : le serveur PHP, le modele de donnees, l'API, la securite applicative ;
  • Comparatif-DevOps : l'integration et le deploiement continus, les conteneurs, le cron, la sauvegarde et la remise a zero de la demonstration.

Aucune ecriture n'a ete faite en production pour mesurer : lectures GET, appels refuses avant toute ecriture, et, pour tout ce qui exige une session ou une ecriture, une pile Docker jetable montee puis detruite.

Comment chaque ecart est classe

Un ecart n'appelle pas la meme reponse selon qu'il est voulu ou non. Chaque ecart recoit donc un seul des quatre cas suivants :

Cas Ce que ca veut dire Ce qu'on fait
a la documentation se trompe, le code est juste corriger la documentation
b le code se trompe, la documentation est juste corriger le code, avec un test
c ecart voulu, et la raison est ecrite (fiche de decision, dossier) rien : on le montre comme un choix
d ecart voulu, mais rien ne l'explique ecrire la trace, sans toucher au code

Un ecart n'est retenu que s'il porte une preuve des deux cotes : la citation exacte de l'attendu, et la preuve du reel (fichier et ligne, ou commande executee et resultat). Sinon il est range a part, dans la section « A verifier » de chaque volet.

Le bilan

Volet Ecarts a b c d
Front 23 17 1 4 1
Back 18 17 0 0 1
DevOps 12 8 1 0 3
Total 53 42 2 4 5

Quelques ecarts reviennent dans deux volets (les chiffres de la page Architecture, la liste de Decisions, le nombre de tests) : ils sont comptes dans chaque volet qui les a trouves. S'y ajoutent deux criteres du Bloc 5 (Cr 7.c.1 et 7.c.2, machine virtuelle) que le dossier declare deja non couverts au sens strict : c'est un cas (c), assume et ecrit.

Ce que ce bilan veut dire

  • Le code est sain. Sur 53 ecarts, deux seulement sont des defauts de code (cas b), et tous deux sont corriges (voir plus bas). La suite de tests passe sur la version deployee : 2352 tests PHP (7791 assertions, avec la base de test), 399 tests JavaScript, PHPStan niveau 6 sans erreur.
  • Les documents de reference tiennent. Le dictionnaire de donnees, la liste des regles de gestion, le registre des fiches de decision, la matrice des droits, les comptes de demonstration, le contrat de l'API et la page DevOps correspondent au reel, verifies terme a terme.
  • Les ecarts se concentrent dans les documents qui recopient des chiffres a une date. Le dossier de soutenance decrit le commit 567bb0a du 24 septembre ; le plan d'oral, le commit 1dd2620 du 26 ; entre les deux et la version deployee, 26 demandes de fusion ont ete livrees. Nombre de routes, de tests, de fiches, de migrations, d'entites : chaque chiffre recopie a la main a vieilli avec le code. C'est la cause d'une large majorite des cas (a).
  • Trois documents se contredisent eux-memes, et c'est ce qu'un jury trouve seul en feuilletant : la table de synthese de la tracabilite dement sa propre table detaillee ; la note d'accessibilite 06 n'a mis a jour que son tableau de tete ; le commentaire d'en-tete du fichier de CI annonce quatre travaux et en definit cinq.

Les deux defauts de code, corriges

Defaut Effet Correction Verification
Le service wakdo-cron du fichier de composition de l'hote n'avait ni le montage ./src ni la variable ORDER_PENDING_EXPIRY_MINUTES (le gabarit versionne les porte ; seul le fichier de l'hote, hors depot, avait derive) la tache d'expiration des commandes en attente echouait chaque nuit (exit status 1 a 02h00) les deux lignes ajoutees sur l'hote le 27/09 a 15h43 UTC, seul ce conteneur recree order-expire.php sort en 0 ; les autres conteneurs n'ont pas redemarre ; montage en lecture seule confirme
L'import CSV comparait les unites en tenant compte des accents, la base non (collation utf8mb4_unicode_ci) le modele officiel, telecharge puis reimporte sans modification, etait bloque (« Unite "piece" differente de l'unite existante ("piece" accentue) ») depuis que les donnees de demonstration portent leurs accents la comparaison ignore desormais casse et accents, comme la base ; le modele utilise les vraies graphies ; la CI installe php-intl comme l'image de production (demande de fusion #178) 5 tests ecrits avant la correction, rouges puis verts ; le test navigateur officiel du projet passe (3 sur 3)

Un troisieme defaut de code est apparu le 28/09, apres le comparatif, en rejouant le balayage du back-office que le comparatif n'avait pas pu executer : la connexion de demonstration de la page Sante envoyait un formulaire vide (422, et un essai compte dans la limitation des connexions). Corrige par #183, deploye par #184 ; detail plus bas, dans « Ce qui est fait, ce qui reste ».

Les chiffres de reference

Recomptes sur la version deployee 11271f7, le 27 septembre 2026. Chaque chiffre porte la commande qui le rejoue, pour qu'on le recompte plutot que le recopier.

Quoi Valeur Comment le recompter
Routes 157 (76 GET, 67 POST, 9 PUT, 5 DELETE) grep -c 'router->add(' src/app/Core/routes.php
Fichiers de controleurs 34 : 31 controleurs concrets, 2 classes abstraites, 1 trait find src/app/Controllers -name '*.php'
Controleurs de premier niveau 23 : 2 abstraits, 14 heritent d'AdminController, 6 de Controller, 1 d'AuthenticatedController ls src/app/Controllers/*.php
Fichiers de vues 41 : 36 vues du back-office, 3 d'authentification, 2 gabarits de page find src/app/Views -name '*.php'
Classes d'acces aux donnees (*Repository) 11 find src/app -name '*Repository.php'
Entites du modele 23 docs/merise/dictionary.md, 3.1 a 3.23 ; SHOW TABLES hors tables techniques
Migrations / jeux de donnees 17 (0001 a 0018, 0004 sautee volontairement) / 10 ls db/migrations db/seeds
Fiches de decision 20 (0001 a 0020) ls docs/adr/0*.md
Entrees du journal 14 ls docs/journal hors README.md
Commits / demandes de fusion fusionnees 226 / 176 git rev-list --count HEAD ; API de la forge
Tests PHP 2352 tests, 7791 assertions, 0 echec (avec la base de test) un script local (hors depot) qui joue PHPStan et PHPUnit sur une base MariaDB jetable
Tests JavaScript / shell 399 tests / 37 assertions npm run test:js ; tests/shell/demo-snapshot-lib.test.sh
Accessibilite mesuree 19 ecrans (6 borne, 13 back-office), 943 mesures de contraste, 0 violation docs/soutenance/preuves/rapports/resume.json
Travaux de CI 5, dont 4 exiges par la protection des branches main et dev .forgejo/workflows/ci.yml ; API branch_protections
Taches planifiees actives 4 (expiration des commandes, sauvegarde, purge du journal d'audit, purge des compteurs) docker/cron/crontab
Conteneurs 5 (4 permanents, 1 qui s'execute une fois au demarrage) docker-compose.yml

Les chiffres de tests et de commits continuent de bouger a chaque demande de fusion : ils sont dates, et doivent etre remesures juste avant le depot.

Remesure sur les versions deployees ensuite

Deux releases ont suivi le comparatif, chacune verifiee en production par GET /api/health : #182 (1ccc9db, le 27/09 a 17h20 UTC) livre les corrections du comparatif et la console de la page Sante ; #184 (97a45c1, le 28/09 a 07h26 UTC) livre la correction #183, issue du balayage rejoue (voir plus bas). Les releases du 28/09 (#187, #192, #194, #196) ont suivi, puis celle du 29/09 (#198, aab4e96), qui livre le contre-audit du jour (#197). Seules ces lignes changent entre 11271f7 et dc1829d ; la colonne aab4e96 reprend aussi les comptes qui ont bouge le 29/09 (routes : 158, entites : 24, migrations : 20 fichiers, 0001 a 0021). Le 30/09, un nouvel audit de documentation (5 relecteurs independants) et deux revues adversariales des correctifs qui en decoulent (D-1 a D-7, A-2) ont fait bouger les chiffres de test une derniere fois, sur le code (commit 17c8fe5) : la derniere colonne les reprend. Ce code est en production depuis la release du 30/09 (f841027, deployee a 12:28 UTC).

Quoi 11271f7 97a45c1 dc1829d aab4e96 (29/09) f841027 (30/09, code mesure 17c8fe5)
Tests PHP 2352 tests, 7791 assertions 2357 tests, 7800 assertions, 0 echec (aucun fichier PHP modifie par #183) 2386 tests, 7886 assertions, 0 echec 2535 tests, 8716 assertions, 0 echec, 0 depreciation 2610 tests, 8924 assertions, 0 echec, 0 depreciation
Tests JavaScript 399 432, 0 echec 446, 0 echec 492, 0 echec 492, 0 echec (inchange)
Accessibilite mesuree 943 mesures de contraste 946 mesures, 85 combinaisons, 0 violation (chiffre faux : il comptait l'apercu d'import au bug des accents, corrige par #178) 935 mesures, 85 combinaisons, 0 violation (audit rejoue le 28/09) 934 mesures, 0 violation (audit rejoue le 29/09 apres les correctifs) non rejoue le 30/09 (reste a 934, mesure du 29/09)
Balayage de mise en page du back-office 4630 (chiffre du 26/09, avant la page Sante) 4807 verifications, 0 echec, 111 pages-roles, 4 largeurs 4807, 0 echec 4807, 0 echec (rejoue le 29/09 ; il a d'abord trouve un debordement sur la page Sante, corrige avant la release) 4812, 0 echec (rejoue le 30/09)
Suite de securite executable — — — phase principale 99 reussis + 8 sautes, puis 4 et 4 phase principale 108 reussis + 8 sautes, puis 5 et 4 (117 reussis, 0 echec)
Entrees du journal 14 15 16 17 18
Commits / demandes de fusion fusionnees 226 / 176 233 / 183 244 / 194 246 / 196 non recompte le 30/09

Ce qui est fait, ce qui reste

Fait le 27/09 :

  • les deux defauts de code (ci-dessus) : le cron sur l'hote, l'import CSV par la demande de fusion #178 ;
  • les corrections de documentation du depot, demande de fusion #181 : sections 7 et 19.4 de PROJECT_CONTEXT.md (4 taches planifiees, deploiement automatique, 23 entites classifiees), commentaire de .gitleaks.toml (le hook local ne lance pas gitleaks), en-tete du fichier de CI (5 travaux), SECURITY.md, maquette-vs-build.md, chiffres des notes de preuve 03 et 08 (dont une reserve sur le cache HTTP), note de couverture du MCT, bloc reseau ipam reporte dans le gabarit docker-compose.prod.yml.example, chiffres du plan d'oral ;
  • les chiffres des pages de ce wiki, remis a jour sur la version 1ccc9db ;
  • la console de la page Sante (#180) : detail complet de chaque sonde, console de lecture, connexion de demonstration ; un defaut d'affichage des panneaux trouve par son test navigateur et corrige avant la fusion ;
  • la release #182, deployee et verifiee (version servie, conteneurs, cron, fichiers servis, remise a zero de la demonstration jouee a blanc) ;
  • le 28/09, le balayage du back-office rejoue sur 1ccc9db : la page Sante n'y etait pas encore passee, 3 echecs. Une connexion de demonstration vide partait au serveur (422, et un essai compte dans la limitation des connexions) : corrige par #183, tests ecrits avant. La regle « texte technique » signalait les chemins d'API que cette page a pour fonction de montrer : exception limitee a cette page, tracee dans le rapport du balayage. Resultat : 4807 verifications, 0 echec. Release #184, deployee et verifiee ;
  • le plan d'oral portait encore l'audit d'accessibilite du 26/09 (11 ecrans, 415 mesures) dans ses trois mesures de tete : remis sur l'artefact versionne (19 ecrans, 946) par #183.

Trouve en corrigeant, apres le comparatif :

  • le test navigateur des droits (tests/e2e/rbac-demo.spec.js) affirmait encore que le responsable ne voit pas les commandes : il echouait depuis l'ADR-0020 (#176). Ce test n'est pas joue par la CI (tests de bout en bout manuels), d'ou le retard. Corrige par #179 ;
  • le plan d'oral comptait les demandes de fusion par une commande git log qui ne voit pas les anciennes fusions (158 annoncees) ; le compte par l'API de la forge donne 176, et c'est cette methode qui est desormais ecrite (#181).

Reste une decision de l'auteur :

  • ajouter au fichier .env de l'hote les 15 reglages de securite (et les 4 reglages de conservation et d'expiration) qui tournent aujourd'hui sur les valeurs par defaut du code (identiques a celles documentees : aucune degradation mesuree, mais ils ne sont pas pilotables sans cela ; recompte du 28/09, noms seulement) ;
  • compte de deploiement : la documentation prescrit un compte systeme deploy dedie, la forge utilise le compte personnel de l'auteur (la commande forcee limite ce que la cle peut lancer). Soit creer ce compte, soit ecrire la raison du choix dans une fiche de decision ;
  • un controle automatique qui compare le service wakdo-cron entre le gabarit versionne et le fichier de l'hote, pour que la derive trouvee ici ne puisse pas se reproduire en silence.

Reste a l'auteur, pour le dossier : la liste des passages a corriger figure a la fin de chaque volet, avec le texte actuel, le texte juste, et la mention « faux pour 567bb0a » ou « depasse depuis 567bb0a ». Les plus visibles pour un jury :

Passage Pourquoi c'est prioritaire
tracabilite.md, table de synthese du Bloc 1 (31 couverts, 9 partiels, 2 non couverts) le meme fichier, dans sa table detaillee, donne 39 / 2 / 1, et le code a 567bb0a lui donne raison
partie-2-c1.md, Cr 1.e.8 (« aucune balise <picture> ») et Cr 1.d.2 (« la numerotation saute de 8 a 10 ») faux meme pour 567bb0a ; le Google Doc, lui, est juste sur ces deux points
le contrat PUT/DELETE de l'API d'administration « reste au stade prevu » exact a 567bb0a, mais la version deployee le livre (9 PUT, 5 DELETE)
« 755 tests PHP et 233 tests JavaScript » 2386 tests PHP (7886 assertions) et 446 tests JavaScript a dc1829d
« seize fiches », « 12 entrees de journal », « 103 fichiers PHP / 65 classes » 20 fiches, 16 entrees, 135 fichiers PHP sous src/app / 92 classes et interfaces (plus 1 trait)
APP_ENV « vaut dev en production », la production « sert encore 1e28a8f » resolus : production, et la production sert le dernier main
les 42 captures de l'annexe, et la mention « corrections F38 comprises » les captures precedent F38 de deux heures, et le back-office a change depuis : a regenerer une fois la version decrite fixee

Le 28 septembre : ce que la preparation de l'oral a revele

En preparant ses appels Bruno pour l'oral, l'auteur a constate que le trajet de la page Sante ne donnait pas les bons retours. Ce constat a ouvert une verification plus fine que le comparatif : chaque route appelee pour de vrai, en succes et sur chacun de ses refus.

Constat Classement Suite
Le trajet affichait des corps ecrits a la main, dont des refus faux (Resource not found au lieu de Produit introuvable.) (b) code faux #188 : reponses reelles, capturees sur une pile jetable pour 158 routes et 670 refus
Une cle d'idempotence de plus de 36 caracteres faisait echouer la commande en 500 (b) code faux #186, deploye (#187) : 422 INVALID_IDEMPOTENCY_KEY
Une adresse inconnue du back-office et une erreur serveur s'affichaient en JSON brut (b) code faux #190 : page lisible, l'API garde son JSON
La carte alignait 157 routes a plat, et trois routes d'une meme action se lisaient comme des doublons (a) presentation trompeuse #189 : carte rangee par action (80 actions)
L'historique des mouvements existait au back-office, pas dans l'API (d) ecart non ecrit #191 : route 158, meme regle d'acces a l'auteur
La recherche nutritionnelle existe au back-office seulement (d) ecart non ecrit ecrit dans le contrat de l'API : elle reste au back-office, et pourquoi
3 routes de l'API sans requete dans la collection Bruno (d) #191 : la collection couvre les 57 routes de l'API d'administration
Le chiffre d'accessibilite du 27/09 (946) comptait l'ecran d'un bug (a) chiffre faux audit rejoue : 935 ; explique dans la fiche 06
La documentation du depot decrivait par endroits un etat ancien : machine a 4 etats au lieu de 6, responsable sans ses droits de commande, saisie comptoir « sous PIN », CI a 4 travaux, diapositives du 22/09 (a) documentation depassee audit complet du depot contre le code, #195 : chaque ecart prouve puis corrige, deploye par #196
Le contre-audit du 29/09 a montre que la passe #195 laissait des ecarts et en introduisait ; il a aussi trouve des defauts de code (modification d'un menu deja commande en erreur 500, adresse tapee ecrite au journal d'audit, option de menu en rupture commandable) et une suite de tests de securite a trouve 11 ecarts de plus (a) et (b) corriges en TDD, documentation recalee, tests de securite executables versionnes (fiche de preuve 10) ; livre par #197, deploye par #198

Les limites de ce comparatif

  • Le dossier de soutenance lui-meme n'a pas ete modifie : c'est le travail de l'auteur, a partir de ces listes.
  • Chaque volet liste ce qu'il n'a pas pu trancher (section « A verifier ») : l'etat exact a 567bb0a de certains chiffres, le decompte des regles :focus-visible, la configuration Traefik de l'hote (hors depot), le contenu d'authorized_keys sur l'hote.
  • Une partie du volet Front a ete confiee a une autre instance de l'assistant IA ; les passages concernes sont signales comme tels dans Comparatif-Front. Les trois constats les plus graves de ce volet ont ete reverifies a la main (import CSV rejoue, <picture> et numerotation lus a 567bb0a, table de tracabilite relue).