Table of Contents
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
567bb0adu 24 septembre ; le plan d'oral, le commit1dd2620du 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 reseauipamreporte dans le gabaritdocker-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 logqui 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
.envde 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
deploydedie, 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-cronentre 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
567bb0ade certains chiffres, le decompte des regles:focus-visible, la configuration Traefik de l'hote (hors depot), le contenu d'authorized_keyssur 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 a567bb0a, table de tracabilite relue).