# Cahier de recette par parcours

> **Version 1.4 — 19/08/2026 au soir.** Dix parcours, **140 étapes** (134 en
> v1.3). Reste à établir la matrice de couverture, une fois qu'ils auront été
> joués.
>
> **Ce qui change en v1.5 (21/08) — TROIS ÉTAPES DÉCRIVAIENT UN ATTENDU FAUX.**
> Elles ressortaient KO à chaque passage sans qu'aucun défaut n'existe, et
> faisaient perdre du temps au testeur : **5.2** (« Mes équipes » n'est attendue
> que pour un encadrant de plusieurs niveaux), **6.17** (cinq panneaux mais
> quatre onglets), **7.10** (le formateur ne crée pas de cours — arbitré le
> 20/08). Règle qui s'applique ici : *un attendu invalidé par une décision ou par
> la mesure se corrige DANS LE CAHIER, jamais par une note en marge* — on ne
> demande pas au testeur de rectifier lui-même son référentiel.
>
> **Ce qui change en v1.4 — les ÉTAPES rattrapent les livraisons du 19/08.** Le
> registre était à jour, les parcours décrivaient encore l'interface d'avant. La
> recette ayant repris, chaque écart a été rejoué contre la PR qui l'a corrigé :
>
> | Volet | Ce qui bouge |
> |---|---|
> | **Bascule d'univers** | l'admin en a **trois** — Administration · Pilotage · Apprentissage (P0.3, P0.5, **P0.10 neuve**) |
> | **Barre du haut** | le bouton « Tableau de bord » de l'admin a disparu (P0.4) |
> | **Comptes** | la modale de modification n'existe plus : tout se fait sur la **fiche** `/admin/utilisateurs/:id` (P8.1, P8.4, P8.5, **P8.14 à P8.17 neuves**) |
> | **Invitations / Inscriptions** | le pied d'actions est dans le flux, le libellé est « Envoyer l'invitation » (P1.1, P3.1 à P3.4, P4.1) |
> | **Listes** | « Par page » au gabarit, décompte « Affichage 1 à 20 de N » (P3.5, P8.17) |
> | **Sélecteurs de rattachement** | le serveur sert enfin de quoi départager deux homonymes ; l'écran ne l'affiche pas encore (P3.2, P4.2) |
> | **Demandes d'inscription** | 500 levé, filtre réel, trace de la décision (P4.6, P4.7, P4.9, **P4.11 neuve**) |
>
> **Deux ajouts de méthode :**
>
> 1. **Statut correctif par étape.** Une étape dont le comportement a changé
>    pendant la recette porte, dans sa colonne Issue, la mention
>    « *corrigé le JJ/MM — #xxx — **À REJOUER*** ». Un testeur qui reprend le
>    cahier voit d'un coup d'œil ce qui a bougé depuis son dernier passage. Les
>    `KO` encore ouverts gardent, eux, leur simple numéro d'issue.
> 2. **Maquettes de référence par parcours.** Chaque parcours ouvre sur les
>    liens vers les maquettes de ses écrans. En cas de doute, on ouvre la
>    maquette plutôt que d'arbitrer de mémoire.
>
> ### ⚠️ La règle que la v1.4 institue
>
> **Une livraison qui change un parcours met le cahier à jour DANS le train.**
> Le cahier est un **livrable du correctif**, pas un rattrapage à faire plus
> tard. C'est ce retard-là — registre à jour, étapes périmées — qui a rendu
> cette version nécessaire : un testeur qui rejoue une étape contre une
> description obsolète signale un défaut qui n'existe plus, et le tri de ce
> faux positif coûte plus cher que la ligne qu'on n'a pas écrite.
>
> *Rappel v1.3 (toujours vrai) : le prérequis d'inscription est levé — les quatre
> jeux sont jouables — et le **registre des écarts déjà connus** (en fin de
> cahier) liste les `KO` attendus étape par étape. Lisez-le avant de signaler
> quoi que ce soit.*

## À quoi sert ce document

Il décrit ce qu'un utilisateur **fait**, pas ce que le code contient. C'est la
différence qui compte : les 1 361 tests automatiques garantissent que
`prochainCertificat` départage trois formations correctement. Aucun ne dit qu'un
apprenant arrive à obtenir un certificat.

## Les trois étapes, et qui fait quoi

| Étape | Qui | Ce qu'elle attrape |
|---|---|---|
| **Recette unitaire** | Claude | l'écran est-il conforme à sa maquette — gabarits, tailles, couleurs, mesurés sur le rendu |
| **Contre-recette** | Claude | le parcours s'enchaîne-t-il — sur les écrans réels, avec un vrai compte |
| **Recette utilisateur** | **un humain** | est-ce **utilisable** — ce qu'aucune mesure ne dit |

Les étapes 2 et 3 suivent **le même cahier**. C'est délibéré : sans cela, vos
retours et les miens ne porteraient pas sur les mêmes gestes et ne pourraient
pas se comparer.

## Comment signaler — la convention

Une ligne par retour, dans le champ de signalement Sentry. **Jamais deux étapes
dans un même message.**

| Marqueur | Sens | Exemple |
|---|---|---|
| `OK` | l'étape se comporte comme attendu | `OK #172 P3.4` |
| `KO` | l'étape échoue, sur une **issue connue** | `KO #172 P3.4 — le filtre ne renvoie rien` |
| `BUG` | défaut réel, **rattaché à aucune issue** | `BUG P3.4 — la page blanchit au second clic` |
| `EVO` | ça marche, mais ça devrait être autrement | `EVO P3.4 — pouvoir trier par date` |

**`OK` est obligatoire.** Un silence est ambigu : on ne sait pas si l'étape a
réussi ou n'a pas été jouée.

La distinction `KO` / `BUG` est celle qui compte : un `KO` alimente une issue
existante, un `BUG` en crée une. Sans elle, les vrais défauts se noient dans les
écarts déjà connus.

> ### ⚠️ Avant de signaler un `BUG`, lisez le registre
>
> Le **registre des écarts déjà connus** (en fin de cahier) liste, étape par
> étape, ce qui est **déjà suivi par une issue**. Si votre constat y figure,
> c'est un `KO` avec le numéro d'issue — pas un `BUG`.
>
> Ce n'est pas une formalité : deux personnes qui rédigent la même issue à deux
> heures d'écart coûtent une heure de tri à quelqu'un, et le doublon survit
> souvent au tri. **Cherchez sur le CONTENU du constat**, pas sur son titre —
> une même anomalie se décrit rarement deux fois avec les mêmes mots.
>
> Si vous hésitez, signalez `KO` avec votre description : rattacher un constat à
> la mauvaise issue se corrige en dix secondes, un doublon coûte bien plus.

## Les huit fonctions vitales

Ce sans quoi le produit n'a pas d'objet. Une étape qui les met en jeu est
marquée **vital** ; son échec arrête la recette.

⚠️ Elles parlent de **toute personne qui se forme**, jamais du « rôle apprenant ».
La distinction n'est pas de style : sur staging, **38 personnes sont inscrites à
une formation, dont 16 ne portent pas le rôle `learner`** — managers, directeurs,
formateurs. Dans ce produit, les encadrants se forment aussi, souvent à des
formations obligatoires. Un critère écrit « un apprenant… » les aurait exclus,
et aurait fait passer BACK#447 pour un défaut secondaire.

1. Une personne **entre** — invitation, mot de passe, connexion
2. Elle **atteint** ses formations, **quel que soit son rôle**
3. Elle **consomme** un support — vidéo, PDF, page
4. Sa **progression est enregistrée ET visible par elle** ← c'est la preuve, pas un confort
5. Elle **passe un quiz**, et son score est conservé
6. Un **certificat** est délivré
7. Un encadrant **voit qui a fait quoi** ← la preuve QUALIOPI
8. **Rien ne se perd** — l'historique survit aux suppressions

Le point 8 n'est pas théorique : la suppression d'un cours effaçait l'historique
de tous ses apprenants en cascade. L'entrée a été retirée de l'interface le
16/08, la route reste ouverte (BACK#445).

## Quatre niveaux de criticité

Ils se définissent par **ce que l'utilisateur ne peut plus faire**, jamais par
l'ampleur du correctif.

| Niveau | Définition | Exemple | Où va le correctif |
|---|---|---|---|
| **Vital** | le produit ne remplit plus sa fonction **pour quelqu'un** | une personne ne peut pas suivre son cours, ou ne voit pas où elle en est — que ce soit un apprenant ou un manager en formation | **arrête la recette**, correction immédiate |
| **Majeur** | le produit fonctionne, mais une décision se prend sur du faux | un reporting collaborateurs erroné ; un écran qui ne s'affiche pas | **L4.8**, avant la mise en prod |
| **Mineur** | gêne réelle, sans empêchement ni erreur | un composant pas à jour, un libellé anglais | L5 |
| **Cosmétique** | écart au dessin, invisible à l'usage | un espacement, une nuance | plus tard |

⚠️ **Le critère d'entrée en L4.8 est la criticité, pas la date de découverte.**
Sans cette règle, le lot devient la liste de tout ce que la recette a vu, et il
ne se ferme jamais.

## Les comptes

52 comptes sur staging, mot de passe commun. ⚠️ **Les suffixes sont croisés avec
les clés techniques**, à dessein : le testeur voit le mot qu'il verra à l'écran.

    recette-<qui>-admin@yopmail.com           Administrateur
    recette-<qui>-managerrh@yopmail.com       Manager RH          (clé `manager`)
    recette-<qui>-managergeneral@yopmail.com  Manager Général
    recette-<qui>-directeur@yopmail.com       Directeur
    recette-<qui>-manager@yopmail.com         Manager d'équipe    (clé `sub_manager`)
    recette-<qui>-formateur@yopmail.com       Formateur
    recette-<qui>-apprenant@yopmail.com       Apprenant

⚠️ **Toute adresse SANS segment de jeu** (`recette-apprenant@…`, `recette-manager@…`)
est une **ancienne génération** de comptes : elle se connecte avec le même mot de
passe mais son jeu de données ne correspond PAS au cahier. Vécu en contre-recette :
un fil a perdu une heure sur `recette-apprenant@` au lieu de `recette-claude-apprenant@`.
Le segment de jeu est OBLIGATOIRE.

`<qui>` vaut `david`, `eng`, `lilian` ou `claude`. Chacun dispose en plus de
3 apprenants et 3 managers d'équipe supplémentaires, pour éprouver les
rattachements et les équipes à plusieurs niveaux.

Trois sociétés : **RecetteAikan**, **RecetteACS**, **RecetteEfektiv**. Certaines
équipes traversent deux sociétés — c'est le comportement normal du modèle, la
société décrit, elle ne cloisonne pas.

### État des données au 18/08 au soir — après le lot back #479

| | |
|---|---|
| Formations **ouvrables** par apprenant et par manager d'équipe | **4** — `relation-client`, `traitement-des-reclamations-rcl`, et les 2 non publiées (`gsicass-ouverture-do`, `test-course`) qui s'ouvrent DÉSORMAIS pour les inscrits (#453 corrigée : l'inscription décide) |
| Demande d'inscription **en attente** | apprenant2 → `relation-client` (jeu `claude`) — ne pas l'accepter, elle sert d'état d'épreuve |
| Utilisateurs statistiquement visibles | 3 par société (`recette-stats-*`) — le filtre Société du tableau de bord doit rendre du non-vide |
| Parcours brouillon d'épreuve | `recette-brouillon-249` — visible du studio avec badge, fermé aux apprenants |

**Un 404 sur une formation listée dans « Mes formations » est désormais une
RÉGRESSION** — l'inverse d'avant le 18/08 au soir.

### ⚠️ Espacez vos connexions

Le serveur limite les tentatives de connexion. En enchaînant plusieurs
authentifications coup sur coup — plusieurs rôles, ou plusieurs passes API — les
suivantes sont refusées, et le symptôme ressemble à *« ce compte ne
fonctionne pas »*. Ce n'en est pas un.

Comptez **~20 secondes entre deux connexions**. Si un compte semble mort,
attendez une minute et recommencez avant de signaler quoi que ce soit.

---

# Ce que chaque parcours sert à obtenir

Une story par parcours. Le **« afin de »** n'est pas de la forme : c'est lui qui
permet de juger un cas que le cahier n'a pas prévu. Sans lui, un testeur constate
un écart au script ; avec lui, il sait si l'écart a de l'importance.

| | En tant que… | je veux… | afin de… |
|---|---|---|---|
| **P0** | n'importe quel utilisateur | entrer et sortir de la plateforme | accéder à mon espace sans que quelqu'un d'autre puisse y entrer à ma place |
| **P1** | apprenant invité | recevoir mon accès et trouver ma première formation | commencer sans qu'on ait à m'expliquer comment faire |
| **P2** | personne en formation | suivre mes supports jusqu'au certificat | prouver que j'ai suivi la formation, à moi et à mon employeur |
| **P3** | Manager RH | faire entrer une équipe | que mes collaborateurs accèdent à leurs formations obligatoires sans créer chaque compte |
| **P4** | Manager RH | inscrire et arbitrer les demandes | que chacun suive ce qu'il doit suivre, et pas autre chose |
| **P5** | Manager d'équipe | voir où en sont mes collaborateurs | intervenir **avant** qu'un retard devienne un abandon |
| **P6** | administrateur | composer et publier le catalogue | que l'offre corresponde à ce que l'organisme s'est engagé à délivrer |
| **P7** | formateur | suivre mes cours et mes apprenants | accompagner ceux qui décrochent, sans attendre le bilan |
| **P8** | administrateur | gérer les comptes et les rattachements | que chacun voie ce qui le regarde, et rien de plus |
| **P9** | responsable produit | vérifier ce qui a été RETIRÉ | qu'aucune fonction abandonnée ne subsiste en état de nuire |

---

# Les dix parcours

| | Parcours | Rôle principal | Couvre |
|---|---|---|---|
| **P0** | Entrer et sortir | **les 7 rôles** | connexion, déconnexion, mot de passe, bascule |
| **P1** | De l'invitation au premier cours | Apprenant | invitation plateforme, onboarding, catalogue, page cours |
| P2 | Suivre une formation jusqu'au certificat | Apprenant | supports, progression, quiz, certificat |
| P3 | Faire entrer une équipe | Manager RH | invitations, suivi des envois, relances |
| P4 | Inscrire et traiter les demandes | Manager RH | inscriptions, demandes, notifications |
| P5 | Piloter son équipe | Manager d'équipe | tableau de bord, cockpit, retard et abandon |
| P6 | Administrer le catalogue | Admin | création cours/tuto/parcours, publication, référentiels |
| P7 | Encadrer ses apprenants | Formateur | mes cours, mes apprenants, fiche apprenant |
| P8 | Gérer les comptes | Admin | utilisateurs, rôles, rattachements, sociétés |
| P9 | Ce qui doit être ABSENT | tous | écrans supprimés, chat masqué, suppression retirée |

**P9 n'est pas une formalité.** Le lot a beaucoup retiré — six écrans morts, deux
vues fusionnées, la suppression de cours, le chat. Un retrait raté ne se voit pas
en cherchant ce qui marche : il faut aller vérifier que ça ne marche **plus**.

---

# P0 — Entrer et sortir

**Le seul parcours joué par les SEPT rôles.** Court, et c'est la seule chose que
tout le monde fait. Un défaut ici bloque tous les autres parcours.

**Comptes** : les sept de votre jeu, l'un après l'autre.
**Durée** : 5 minutes par rôle.

**Maquettes de référence :**
[connexion et mot de passe oublié](html/11-connexion-efektiv-v3.html) ·
[profil unique](html/10-profil-unique-efektiv-v3.html) ·
[fiche utilisateur admin](html/maquette-fiche-utilisateur-admin-efektiv-v1.html)
— c'est elle qui porte le gabarit `.segmented` du **sélecteur d'univers** (0.5).

| # | Ce que vous faites | Ce qui doit se produire | Criticité | Issue |
|---|---|---|---|---|
| 0.1 | Ouvrir l'adresse de staging | L'écran de connexion s'affiche. Logo et libellés en français. | **vital** | #11 |
| 0.2 | Se connecter avec un mot de passe FAUX | Le refus est explicite. **Il ne dit pas si l'adresse existe** — sinon il révèle qui a un compte. Les deux réponses doivent être identiques **au caractère près**. | majeur | BACK#448 — *corrigé le 19/08, PR BACK#495 — **À REJOUER*** |
| 0.3 | Se connecter avec le bon mot de passe | L'espace s'ouvre **sur l'univers du rôle** : **Administration** pour l'admin (`/admin/dashboard` ne fait plus que rediriger vers `/admin/utilisateurs`), Pilotage pour les autres encadrants, Apprentissage pour l'apprenant, son espace propre pour le formateur. | **vital** | #75 — *admin corrigé le 19/08, #269 / PR FRONT#272 — **À REJOUER*** |
| 0.4 | Regarder la barre du haut | Le nom et le rôle affichés sont les **libellés** — « Manager RH », jamais `manager`. ⚠️ **Plus de bouton « Tableau de bord » pour l'admin** : il faisait doublon avec « Administration » du sélecteur, il a été retiré. **Le formateur garde le sien** — c'est son unique chemin vers `/teacher/dashboard`, il n'a pas de sélecteur. | majeur | #154 · #273 — *corrigé le 19/08, PR FRONT#276 — **À REJOUER*** |
| 0.5 | Regarder le **sélecteur d'univers** de la barre du haut | **Trois** boutons pour l'administrateur — **Administration · Pilotage · Apprentissage**, dans cet ordre. **Deux** pour les autres encadrants (Manager RH, Manager d'équipe, Directeur, Manager général) : Pilotage · Apprentissage. **Aucun sélecteur** pour l'apprenant ni pour le formateur. Les libellés **annoncent où l'on va**, pas où l'on est ; l'univers courant est la pilule sombre. Le groupe est au gabarit de la maquette (hauteur 42 px, fond `--surface-2`, survol et focus visibles). | majeur | #336 · #269 · #274 — *corrigé le 19/08, PR FRONT#272 + #278 — **À REJOUER*** |
| 0.6 | Ouvrir **Mon profil** | Un seul écran, quel que soit le rôle. Le rôle y est affiché, **non modifiable**. | majeur | #154 |
| 0.7 | Se déconnecter | Retour à l'écran de connexion. **Aucun écran de l'application n'est plus atteignable** en revenant en arrière. | **vital** | — |
| 0.8 | Coller une URL interne après déconnexion | Redirection vers la connexion. Pas de page blanche, pas de contenu. | **vital** | #18 |
| 0.9 | Demander un **mot de passe oublié** | Le message part, le lien reçu **porte un domaine complet**. | majeur | #100 |
| 0.10 | **Faire le tour de ses univers, et REVENIR** — cliquer chaque bouton du sélecteur, puis retourner à celui du départ | Chaque bouton mène à l'accueil de son univers : Administration → Utilisateurs, Pilotage → Tableau de bord, Apprentissage → Mes formations. **La pilule sombre suit la route** à chaque étape, et le retour ramène bien au point de départ. ⚠️ Pour un apprenant ou un formateur, l'étape se lit en une seconde : **il n'y a pas de sélecteur**, et c'est le comportement attendu. | majeur | #269 · #92 — *neuve en v1.4, PR FRONT#272 + #278* |

## Variantes de rôle — les seules qui comptent

Le périmètre diffère **légitimement** selon le rôle. Partout ailleurs, un même
écran doit se comporter de la même façon :

| Rôle | Ce qu'il doit voir en plus | Ce qu'il ne doit PAS voir |
|---|---|---|
| Administrateur | tout | — |
| Manager RH | l'onglet **Tous les collaborateurs** | — |
| Manager d'équipe | ses seuls rattachés | les collaborateurs des autres |
| Directeur · Manager général | leur hiérarchie | l'onglet Tous les collaborateurs |
| Formateur | ses cours, ses apprenants | le pilotage |
| Apprenant | l'apprentissage seul | le pilotage |

⚠️ **Une différence de comportement qui n'est PAS dans ce tableau est un
défaut**, pas une règle. Exemple vécu : la progression d'une formation n'était
servie qu'au rôle `learner` — un manager qui se forme ne voyait donc jamais où
il en était (BACK#447, **16 personnes concernées sur staging**). Un cahier écrit
depuis le code aurait figé ce bug en « comportement attendu ».

Et c'est **vital**, pas majeur : pour ces seize personnes, le produit ne remplit
pas sa fonction. Un encadrant en formation obligatoire qui ne sait pas où il en
est est exactement dans la situation qu'un LMS existe pour éviter.

---

# P1 — De l'invitation au premier cours

**Rôle** : Manager RH pour les étapes 1.1 à 1.3, puis Apprenant.
**Comptes** : `recette-<qui>-managerrh@` puis un apprenant supplémentaire non
encore activé.
**Durée estimée** : 20 minutes.

**Maquettes de référence :**
[Invitations](html/MAQUETTES%20FORMIND/Pilotage/4-invitations-efektiv-v3.html) ·
[Invitations · Suivi](html/MAQUETTES%20FORMIND/Pilotage/5-invitations-suivi-efektiv-v3.html) ·
[onboarding par lien](html/8-onboarding-lien-efektiv-v3.html) ·
[accueil apprenant](html/MAQUETTES%20FORMIND/Apprentissage/0-accueil-apprenant-efektiv-v3.html) ·
[catalogue apprenant](html/maquette-catalogue-apprenant-efektiv-v3.html) ·
[Mes formations](html/maquette-mes-formations-efektiv-v3.html) ·
[page d'un cours](html/maquette-cours-apprenant-efektiv-v3.html) ·
[Favoris](html/maquette-favoris-efektiv-v3.html)

| # | Ce que vous faites | Ce qui doit se produire | Criticité | Issue |
|---|---|---|---|---|
| 1.1 | Pilotage › Invitations › **Inviter**, saisir une adresse yopmail inédite | Le formulaire accepte l'adresse. Le compteur de destinataires s'incrémente. Le **pied d'actions** annonce « N destinataire(s) · N cours ouvert(s) » et le bouton principal dit « **Envoyer l'invitation** » — au singulier défini, comme la maquette. | **vital** | #96 · #286 — *libellé corrigé le 19/08, PR FRONT#288 — **À REJOUER*** |
| 1.2 | Ajouter **6 destinataires** | Le 6e est **refusé** : la borne est de 5. Le message dit laquelle. ⚠️ **La borne est posée par l'écran seul** : `invite-mail` valide `emails => nullable\|array`, sans `max:5` ni `max:400` sur le message. `KO` attendu, et la contourner par l'API passe. | mineur | BACK#403 |
| 1.3 | Envoyer, puis ouvrir l'onglet **Suivi** | L'envoi apparaît, avec son état. Le regroupement est **par personne**, pas par envoi. | majeur | #168 |
| 1.4 | Ouvrir la boîte yopmail du destinataire | Le message est arrivé. **Le lien porte un domaine complet** — pas `/onboarding/<jeton>`. | **vital** | BACK#442 |
| 1.5 | Cliquer le lien | L'écran d'onboarding s'ouvre. **Pas de page blanche.** | **vital** | #59 |
| 1.6 | Définir un mot de passe trop court | Le refus **dit la règle**, il ne se contente pas de refuser. | mineur | #100 |
| 1.7 | Définir un mot de passe valide | Connexion automatique. L'espace **Apprentissage** s'ouvre. | **vital** | #77 |
| 1.8 | Regarder la barre latérale | **Quatre entrées** : Mes formations · Catalogue · Certificats · Favoris. Pas d'onglets horizontaux. | mineur | #153 |
| 1.9 | Regarder l'accueil | Le vide **dit quoi faire**, il ne dit pas « aucun enregistrement trouvé ». | mineur | #199 |
| 1.10 | Ouvrir **Catalogue** | Rayons par sous-catégorie. Les filtres de durée et d'avancement portent un **compteur**. | majeur | #83, #199 |
| 1.11 | Filtrer sur une durée | La liste se restreint. Une formation **sans durée déclarée** n'apparaît pas dans un filtre de durée. | mineur | #139 |
| 1.12 | Ouvrir une formation | La page s'ouvre sur le **panneau sombre**, trois onglets, le sommaire à droite. ⚠️ **Toutes les formations listées s'ouvrent**, y compris les non publiées auxquelles le compte est inscrit : c'est l'inscription qui décide. **Un 404 ici est désormais une RÉGRESSION** — l'inverse de ce que disait la v1.3. | **vital** | #212 · #453 — *corrigé le 18/08 — **À REJOUER*** |
| 1.13 | Lire le bloc de progression | « **0 supports terminés sur N** », la barre est à zéro, le temps restant est annoncé. ⚠️ **À jouer AUSSI avec un compte manager** : la progression doit s'afficher pour **tout inscrit**, quel que soit son rôle. | **vital** | #212, BACK#447 |
| 1.14 | Chercher le bouton d'action | « **Commencer le cours** » est présent et cliquable. | **vital** | #212 |
| 1.15 | Regarder les onglets du sommaire | **Pas d'onglet Chat** : il est masqué. | mineur | #140, BACK#391 |
| 1.16 | Coller `/chat` dans la barre d'adresse | La route **ne s'ouvre pas** — la fermeture est serveur, pas seulement visuelle. | majeur | BACK#391 |

## Ce que P1 ne couvre pas, et pourquoi

- **Le contenu du courriel** au-delà du lien — la mise en page des messages n'a
  pas été reprise par le lot.
- **La réinitialisation de mot de passe** — parcours distinct, à ajouter en P1bis
  si vous le jugez utile.
- **L'inscription libre** (`/signup`) — retirée par décision produit (#192) :
  l'entrée se fait par invitation. Vérifiée en **P9**.

## Points d'attention pour le testeur

**1.4 est le plus fragile.** Les boîtes yopmail sont **publiques** : n'importe
qui connaissant l'adresse lit le message. C'est voulu sur staging, et
inacceptable ailleurs.

**1.13 emploie le pluriel à zéro** — « 0 supports terminés ». C'est une décision
tracée (#212), pas un défaut : la règle stricte du français veut le singulier,
mais la convention retenue est l'accord unique, celui qui a le moins d'impact.
Ne pas le signaler comme `BUG`.

**1.16 est un test de retrait.** Il échoue si la page s'ouvre — c'est l'inverse
de l'intuition. Le masquage doit tenir même quand on contourne l'interface.

---

# P2 — Suivre une formation jusqu'au certificat

**Rôle** : Apprenant, puis **le même parcours rejoué par un Manager d'équipe inscrit**.
**Comptes** : `recette-<qui>-apprenant@`, puis `recette-<qui>-manager@`.
**Durée** : 30 minutes.

**Maquettes de référence :**
[Mes formations](html/maquette-mes-formations-efektiv-v3.html) ·
[page d'un cours](html/maquette-cours-apprenant-efektiv-v3.html) ·
[page d'un parcours](html/9-page-parcours-efektiv-v3.html) ·
[Certificats](html/maquette-certificats-efektiv-v3.html)

C'est le parcours qui met en jeu **cinq des huit fonctions vitales**. S'il ne
passe pas, le produit ne sert à rien.

| # | Ce que vous faites | Ce qui doit se produire | Criticité | Issue |
|---|---|---|---|---|
| 2.1 | Ouvrir une formation inscrite | Le sommaire liste les supports **dans l'ordre**, avec leur type et leur durée. | **vital** | #212 |
| 2.2 | Ouvrir le premier support **vidéo** | La vidéo se lit. Le lecteur ne déborde pas de son cadre. | **vital** | #212 |
| 2.3 | Regarder la vidéo jusqu'au bout | Le support passe à **terminé**, sans qu'on ait à le déclarer soi-même. | **vital** | BACK#398 |
| 2.4 | Revenir au sommaire | La progression a **augmenté** : pourcentage, barre, « N supports terminés ». | **vital** | #212, BACK#447 |
| 2.5 | Ouvrir un support **PDF** | Le document s'affiche ou se télécharge. Pas de page blanche. | **vital** | — |
| 2.6 | Ouvrir un support de type **page** (HTML) | Le contenu s'affiche dans l'écran, mis en forme. | majeur | BACK#355 |
| 2.7 | Quitter la formation, revenir plus tard | On retrouve **où on en était**. La progression n'a pas été perdue. | **vital** | BACK#398 |
| 2.8 | Ouvrir le **quiz** de la formation | L'écran de quiz s'ouvre. L'instruction dit ce qui va se passer. | **vital** | #197 |
| 2.9 | Répondre à une question, **vérifier** | La correction s'affiche **question par question**, pas à la fin. | majeur | #145, #197 |
| 2.10 | Lire une option corrigée | Chaque option porte **son mot** (« Juste », « À écarter », « Attendue »), **pas seulement une couleur**. | majeur | #197 |
| 2.11 | Laisser une question sans réponse et terminer | Un avertissement **chiffre** ce qui manque et laisse revenir en arrière. | majeur | #197 |
| 2.12 | Terminer le quiz | Le score s'affiche, avec la cible. Il est **conservé** : recharger la page le retrouve. | **vital** | #197 |
| 2.13 | Terminer tous les supports | La formation passe à **100 %**. | **vital** | — |
| 2.14 | Ouvrir **Certificats** | Le certificat de la formation terminée **apparaît**. | **vital** | #155 |
| 2.15 | Télécharger le certificat | Le PDF s'ouvre, **au nom de la bonne personne**, avec la bonne formation. | **vital** | #155 |
| 2.16 | Lire le bas de l'écran Certificats | La **règle d'obtention** est écrite en clair. | mineur | #155 |
| 2.17 | **Rejouer 2.1 à 2.4 avec un Manager d'équipe inscrit** | **Comportement identique.** La progression s'affiche. | **vital** | BACK#447 |

## Ce que P2 ne couvre pas

- **Le contenu pédagogique** lui-même — ce cahier vérifie qu'on peut le
  consommer, pas qu'il est bon.
- **Les quiz autonomes** (hors formation) — reportés en V2 (#142).
- **Le partage ponctuel d'un support** (BACK#382) — parcours à part si vous le
  jugez utile.

## Points d'attention

**2.3 est la fonction vitale n°4**, et la plus difficile à éprouver : elle
dépend du suivi de lecture. Si le support ne passe pas à « terminé » tout seul,
**ne pas le forcer** — c'est le défaut, pas un contretemps.

**2.17 n'est pas une redite.** C'est l'étape qui a fait naître BACK#447 : la
progression n'était servie qu'au **rôle** `learner`, jamais aux 16 personnes
inscrites qui portent un autre rôle. Si elle échoue, la recette **s'arrête**.

**2.6** dépend de BACK#355, ouverte : la famille « page » (HTML) n'est peut-être
pas encore gérée par la visionneuse. Un `KO` y est attendu.

---

# P3 — Faire entrer une équipe

**Rôle** : Manager RH.
**Compte** : `recette-<qui>-managerrh@`.
**Durée** : 20 minutes.

**Maquettes de référence :**
[Invitations](html/MAQUETTES%20FORMIND/Pilotage/4-invitations-efektiv-v3.html) ·
[Invitations · Suivi](html/MAQUETTES%20FORMIND/Pilotage/5-invitations-suivi-efektiv-v3.html) ·
[Tous les collaborateurs](html/MAQUETTES%20FORMIND/Pilotage/3-tous-collaborateurs-efektiv-v3.html)

| # | Ce que vous faites | Ce qui doit se produire | Criticité | Issue |
|---|---|---|---|---|
| 3.1 | Pilotage › **Invitations** › Inviter | Deux onglets : **Inviter** et **Suivi**. Pas d'écran legacy. Le formulaire tient en deux colonnes : la composition à gauche (destinataires, message, cours ouverts), l'**aperçu de l'e-mail** à droite, **qui reste à sa place quand on fait défiler**. | majeur | #96 · #266 — *aperçu corrigé le 19/08, PR FRONT#268 — **À REJOUER*** |
| 3.2 | Saisir 3 adresses, puis **déplier « Cours ouverts à l'arrivée »** | La saisie accepte les trois adresses. La liste de cours est **cherchable** et, **une fois dépliée, rien ne la recouvre** : le pied d'actions est dans le flux de la page, il ne flotte plus par-dessus. ⚠️ Les options ne portent que le **nom** du cours : le serveur sert désormais la catégorie et le nombre de supports, l'écran ne les affiche pas encore — `KO` attendu (FRONT#170). ⚠️ Ce formulaire ne propose **ni rôle ni manager de rattachement** : ces deux réglages n'existent pas à l'invitation, ils se posent depuis la fiche utilisateur (P8). | majeur | #96 · #267 — *pied corrigé le 19/08, PR FRONT#285 — **À REJOUER*** · FRONT#170 ← BACK#406 (PR BACK#511) |
| 3.3 | Dépasser **400 caractères** de message | Le refus dit la borne. | mineur | BACK#403 |
| 3.4 | Envoyer | Le bouton principal dit « **Envoyer l'invitation** ». Confirmation **au passé** : « Invitations envoyées ». | mineur | #145 · #286 — *libellé corrigé le 19/08, PR FRONT#288 — **À REJOUER*** |
| 3.5 | Onglet **Suivi** | Regroupement **par personne**. Les filtres Statut et Compte fonctionnent et portent un compteur. Le pied de liste porte « **Par page** » au gabarit et le décompte « **Affichage 1 à 20 de N** » — avec l'espace avant « de ». | majeur | #168 · #275 · #283 — *pied et décompte corrigés le 19/08, PR FRONT#284 + #287 — **À REJOUER*** |
| 3.6 | Filtrer sur « en attente » | La liste se restreint. Le compteur correspond au nombre affiché. | majeur | #168 |
| 3.7 | **Exporter** le suivi | Le fichier se télécharge, avec le **même périmètre** que ce qui est affiché — filtres compris. | majeur | #168 |
| 3.8 | Relancer une invitation | Un nouveau message part. Le suivi le montre. | majeur | #139 |
| 3.9 | Ouvrir **Tous les collaborateurs** | L'onglet existe — **réservé au Manager RH et à l'admin**. | majeur | BACK#63 |
| 3.10 | Rejouer 3.9 avec un **Manager d'équipe** | L'onglet **n'existe pas**. Il ne voit que ses rattachés. | **vital** | BACK#63 |

## Ce que P3 ne couvre pas

- **L'écran d'administration des règles de relance** (#139) — pas encore
  développé, reporté après la prod.
- La **mise en page des courriels**.

## Points d'attention

**3.10 est un test de cloisonnement**, donc vital : un manager d'équipe qui voit
toute la plateforme est une fuite, pas un défaut d'affichage.

**3.7** : l'export doit refléter les filtres. Un export qui rend tout, alors
que l'écran filtre, produit un fichier qui ne correspond à rien de ce qu'on a vu.

**3.2 a changé deux fois, et dans deux sens opposés.** Le pied d'actions
recouvrait la liste de cours dépliée — corrigé le 19/08 (FRONT#267, PR #285) :
si la liste est de nouveau masquée, c'est une **régression**. En revanche la
seconde ligne des options (nom + société, nom + catégorie) n'est **toujours pas
affichée** : le serveur la sert depuis BACK#511, l'écran ne l'a pas encore
branchée — c'est FRONT#170, ouverte, donc un `KO` attendu et non un défaut neuf.

**Le rôle et le manager de rattachement ne se saisissent PAS à l'invitation.**
La v1.3 les décrivait dans ce formulaire ; ils n'y sont pas, et n'y ont pas été
retirés — ils se posent à la création d'un compte et sur la fiche utilisateur
(P8). L'étape a été réécrite sur ce qui existe.

---

# P4 — Inscrire et traiter les demandes

**Rôle** : Manager RH.
**Durée** : 20 minutes.

**Maquettes de référence :**
[Inscriptions](html/MAQUETTES%20FORMIND/Pilotage/6-inscriptions-efektiv-v3.html) ·
[Inscriptions · Demandes](html/MAQUETTES%20FORMIND/Pilotage/7-inscriptions-demandes-efektiv-v3.html)

| # | Ce que vous faites | Ce qui doit se produire | Criticité | Issue |
|---|---|---|---|---|
| 4.1 | Pilotage › **Inscriptions** › Inscrire | Deux onglets : **Inscrire** et **Demandes**. Le pied d'actions est **dans le flux** : une liste dépliée n'est plus recouverte (même correctif qu'aux Invitations, la classe est partagée par les deux onglets). | majeur | #96 · #267 — *corrigé le 19/08, PR FRONT#285 — **À REJOUER*** |
| 4.2 | Choisir une formation et des apprenants | Les deux listes sont cherchables. Les personnes déjà inscrites sont **signalées**, pas proposées en double. ⚠️ **Les options ne portent toujours que le NOM** : deux homonymes restent indistinguables à l'écran. Le serveur sert pourtant désormais l'adresse et la société/le profil métier pour les personnes, la catégorie et le nombre de supports pour les cours — l'écran ne les a pas encore branchés. `KO` attendu. | majeur | FRONT#170 ← BACK#406 — *serveur corrigé le 19/08, PR BACK#511 ; **écran non branché**, FRONT#170 reste ouverte* |
| 4.3 | Chercher **l'interrupteur de notification** | Il est **absent** : la fonction n'est pas livrée. Ne pas le signaler comme bug. | mineur | #170, BACK#405 |
| 4.4 | Inscrire | Confirmation. Les personnes apparaissent comme inscrites. | **vital** | — |
| 4.5 | Vérifier côté apprenant | La formation apparaît dans **Mes formations**. | **vital** | — |
| 4.6 | Onglet **Demandes** | La liste des demandes d'inscription s'affiche — **y compris pour un encadrant sans aucun rattaché**. Un 500 ici est désormais une **RÉGRESSION**. | majeur | #172 · #452 — *corrigé le 18/08, PR BACK#463 — **À REJOUER*** |
| 4.7 | Filtrer par statut | Le filtre **s'applique réellement** : Pending, Approved, Rejected restreignent la liste. | majeur | BACK#410 — *corrigé le 19/08, PR BACK#495 — **À REJOUER*** · CORRIGÉ le 19/08 (FRONT#312, PR #316) : filtre statut serveur, vue par défaut « À traiter ». **À REJOUER** |
| 4.8 | **Accepter** une demande | L'apprenant est inscrit. La demande disparaît de la liste. | **vital** | CORRIGÉ le 19/08 (FRONT#312) : une demande traitée sort de la vue par défaut. L'inscription fonctionnait déjà. **À REJOUER** |
| 4.9 | Chercher **qui a accepté, et quand** | La décision porte **son auteur et sa date**. C'est la fonction vitale n°7. | majeur | BACK#411 — *corrigé le 19/08, PR BACK#495 — **À REJOUER*** |
| 4.10 | **Refuser** une demande | Le refus est enregistré, l'apprenant n'est pas inscrit, et **aucun point ne lui est crédité**. ⚠️ **L'attendu de cette étape a CHANGÉ le 22/08** : elle annonçait un crédit de points en `KO` attendu — **c'était faux**, un garde-fou l'empêchait déjà. Ré-enregistrer **le même statut** ne renvoie plus d'e-mail et n'écrase plus la trace de qui a décidé. **À REJOUER** — vérifié en connecté : points 0 → 0. | majeur | BACK#412 — *corrigé 22/08, PR BACK#612* |
| 4.11 | Faire déposer une demande par une personne **sans manager de rattachement**, sur un cours **sans référent** | La demande part sans erreur silencieuse : à défaut de destinataire naturel, **l'administrateur et le(s) Manager(s) RH** sont notifiés. Le trou est fermé des deux côtés. | majeur | BACK#502 · BACK#503 — *neuve en v1.4, corrigées le 19/08* |

## Points d'attention

**Trois `KO` de la v1.3 sont tombés pendant la recette** (4.6, 4.7, 4.9) : ils
sont devenus des **tests de non-régression**. Si le 500, le filtre inerte ou
l'absence de trace reviennent, c'est un `BUG` en citant l'issue d'origine — plus
grave qu'un défaut neuf.

**4.9 touche la preuve QUALIOPI** : une inscription acceptée sans trace de qui
l'a décidée est un trou dans le dossier de formation. C'est la raison pour
laquelle elle a été corrigée avant la prod, et la raison pour laquelle il faut
la **rejouer** plutôt que la croire acquise.

**4.2 est le cas d'école du volet « à rejouer ».** Le correctif serveur est
livré, l'écran ne l'affiche pas : une étape peut être « corrigée » d'un côté et
inchangée pour le testeur. C'est ce que la mention distingue.

---

# P5 — Piloter son équipe

**Rôle** : Manager d'équipe (`sub_manager`), puis Manager RH pour comparer les périmètres.
**Durée** : 30 minutes.

**Maquettes de référence :**
[Tableau de bord pilotage](html/MAQUETTES%20FORMIND/Pilotage/1-Tableau%20de%20bord.html) ·
[Mes collaborateurs](html/MAQUETTES%20FORMIND/Pilotage/2-collaborateurs-efektiv-v3.html) ·
[Tous les collaborateurs](html/MAQUETTES%20FORMIND/Pilotage/3-tous-collaborateurs-efektiv-v3.html) ·
[cockpit apprenant et Mes équipes](html/9-cockpit-apprenant-efektiv-v3.html)

| # | Ce que vous faites | Ce qui doit se produire | Criticité | Issue |
|---|---|---|---|---|
| 5.1 | Se connecter en Manager d'équipe | Arrivée sur **Pilotage**, pas sur un écran legacy. | **vital** | #75 |
| 5.2 | Regarder la latérale | Tableau de bord · Mes collaborateurs · Invitations · Inscriptions. ⚠️ **« Mes équipes » n'apparaît QUE pour un encadrant de PLUSIEURS niveaux** (elle montre les N-1 *et* les N-2). Son absence chez un Manager d'équipe, qui n'encadre qu'un niveau, est le **comportement attendu** — ce n'est pas un KO. | majeur | #70 · *corrigé en v1.5 — l'étape attendait « Mes équipes » pour tous* |
| 5.3 | **Tableau de bord** | Les deux entonnoirs s'affichent avec des chiffres. | **vital** | #328 · CORRIGÉ le 19/08 (FRONT#311, PR #313) : le taux sous l'entonnoir des PERSONNES affichait celui des INSCRIPTIONS ; un entonnoir vide se distingue désormais d'un absent. **À REJOUER** |
| 5.4 | Tableau « **Par module** » | Les colonnes **Vues, Apprenants actifs, Temps moyen, Score quiz** sont **remplies**. | majeur | BACK#328 |
| 5.5 | Filtrer par **société** | Un filtre ne donne **jamais accès à plus** (vital) **et** les chiffres se restreignent **sans s'annuler** : une société peuplée rend un tableau **non vide**. Une société qui rend zéro est désormais une **RÉGRESSION**. ⚠️ **Les deux questions sont à poser** — voir ci-dessous. | **vital** + majeur | #451 — *corrigé le 18/08, PR BACK#463 — **À REJOUER*** |
| 5.6 | **Mes collaborateurs** | Liste des rattachés directs, avec avancement, retard, abandons. Les filtres **Société** et **Profil métier** servent leurs options depuis les routes managériales : un 403 sur cet écran est une **RÉGRESSION**. Le pied de liste porte « Par page » au gabarit et « Affichage 1 à 20 de N ». | **vital** | #263 · #275 · #283 — *filtres et pied corrigés le 19/08, PR FRONT#265 + #284 + #287 — **À REJOUER*** |
| 5.7 | Trier une colonne | Le tri s'applique. Les en-têtes triables ont **la même casse** que les autres. | mineur | #209 |
| 5.8 | Masquer une colonne | La préférence est **retenue** au rechargement. | mineur | BACK#180 |
| 5.9 | **Exporter** | Le fichier reflète filtres et colonnes affichées. | majeur | — |
| 5.10 | **Mes équipes** | Hiérarchie directe **et indirecte**, avec « Manager de rattachement ». | **vital** | — |
| 5.11 | Ouvrir le **cockpit** d'une personne | Son dossier s'ouvre : formations, avancement, historique. | **vital** | #186 |
| 5.12 | Lire les valeurs absentes | Un « — » pour une mesure **absente**, un « 0 » pour une mesure **à zéro**. Jamais l'un pour l'autre. | majeur | #146 |
| 5.13 | Ouvrir une formation du cockpit | Le détail s'affiche, la ligne ouverte est **surlignée**. | majeur | #186 |
| 5.14 | Chercher **retard et abandon au niveau 1** | ⚠️ **Absents** : ils n'apparaissent qu'au niveau 2. `KO` attendu. | majeur | #178 |
| 5.15 | « Afficher tout l'historique » | ⚠️ Rend **des centaines de lignes sans pagination**. `KO` attendu. | majeur | #180 |
| 5.16 | Revenir en arrière depuis le cockpit | ⚠️ Le retour **rejoue l'historique** au lieu de ramener à la liste. `KO` attendu. | mineur | #177 |
| 5.17 | Rejouer 5.6 en **Manager RH** | Il voit **tous** les collaborateurs. Le Manager d'équipe n'a vu que les siens. | **vital** | BACK#63 |
| 5.18 | **Forger** l'accès : en Manager d'équipe, remplacer l'identifiant d'un rattaché par celui de quelqu'un d'autre dans l'URL d'une fiche | Refus (**403**) sur **toutes** les routes qui servent une personne — la fiche admin `user/show` comprise. Une fiche hors périmètre qui s'ouvre est une **RÉGRESSION VITALE**. ⚠️ **Ne se joue pas à la souris** — l'écran ne propose jamais le geste ; passer par `tools/recette-api/`. | confidentialité | #450 — *corrigé le 18/08, PR BACK#463* · BACK#512 — *garde étendue à `user/show` le 19/08 — **À REJOUER*** |

## Points d'attention

**Trois `KO` sont attendus** (5.14 à 5.16) : ce sont les issues du cockpit
sorties du lot UX/UI et reportées. Les signaler confirme qu'elles sont bien
présentes ; ne pas les signaler laisserait croire qu'elles sont corrigées.

**5.5, 5.17 et 5.18 sont les tests de périmètre.** Ils sont vitaux : un manager
qui voit ce qui ne le regarde pas est une fuite de données personnelles. ⚠️ **Les
trois sont tenus depuis le 18/08** — 5.18 l'a été en dernier (#450, PR BACK#463),
et sa garde a été étendue à la fiche utilisateur le 19/08 (BACK#512). Ils ont
donc changé de nature : ce ne sont plus des constats, ce sont des **tests de
non-régression**, et c'est pour cela qu'il faut les rejouer.

**5.5 demande DEUX questions, et la première seule ne suffit pas.** « Le filtre
élargit-il le périmètre ? » est satisfait par un filtre cassé qui rend toujours
zéro : `0 ≤ 52`, invariant respecté. C'était l'état constaté avant le 18/08
(#451) — le filtre société rendait zéro sur les trois sociétés peuplées, et la
passe API le déclarait vert. Il faut donc aussi demander : **« une société
peuplée rend-elle autre chose que zéro ? »** — la réponse doit être oui.

La leçon vaut au-delà de cet écran : **un critère formulé comme une borne
(« jamais plus que ») est satisfait par une fonction qui ne rend rien.** Partout
où le cahier écrit « ne donne jamais accès à plus », il faut lire aussi « et
donne bien accès à ce qui est dû ».

**5.18 n'est pas une étape d'utilisateur, et c'est pour cela qu'elle manquait.**
Un cahier écrit du point de vue de ce qu'on **fait** ne peut pas décrire une
fuite : l'interface ne propose jamais de changer un identifiant dans une URL.
Elle se joue par la passe API (`v_idor_fiche_apprenant`), pas au navigateur.
Les deux routes qui servaient l'état civil et l'avancement de n'importe qui à
n'importe quel encadrant répondent 403 depuis le 18/08 (#450), et la passe
couvre depuis le 19/08 la route de la **fiche utilisateur admin** (BACK#512),
qui rendait en plus un 500 sur un identifiant inexistant.

---

# P6 — Administrer le catalogue

**Rôle** : Administrateur.
**Durée** : 40 minutes.

**Maquettes de référence :**
[Cours (admin)](html/MAQUETTES%20FORMIND/Apprentissage/3-cours-admin-efektiv-v3.html) ·
[liste Cours unifiée](html/MAQUETTES%20FORMIND/Pilotage/8-liste-cours-efektiv-v3.html) ·
[Créer un cours](html/MAQUETTES%20FORMIND/Apprentissage/3-modale-creer-cours-efektiv-v3.html) ·
[Création d'un tuto](html/MAQUETTES%20FORMIND/Pilotage/maquette-tuto-efektiv-v3.html) ·
[Parcours (liste)](html/MAQUETTES%20FORMIND/Apprentissage/4-parcours-liste-efektiv-v3.html) ·
[Créer un parcours](html/MAQUETTES%20FORMIND/Apprentissage/5-modale-creer-parcours-efektiv-v3.html) ·
[Éditeur de parcours](html/MAQUETTES%20FORMIND/Pilotage/maquette-parcours-efektiv-v3.html) ·
[page parcours apprenant](html/9-page-parcours-efektiv-v3.html) ·
[Référentiels des cours](html/MAQUETTES%20FORMIND/Apprentissage/7-referentiels-efektiv-v3.html)

| # | Ce que vous faites | Ce qui doit se produire | Criticité | Issue |
|---|---|---|---|---|
| 6.1 | Admin › **Cours** | Liste unifiée cours · tutos · parcours, avec un **badge de type** par ligne. Le pied de liste porte « Par page » au gabarit et « Affichage 1 à 20 de N ». | majeur | #72 · #275 · #283 — *pied corrigé le 19/08, PR FRONT#284 + #287 — **À REJOUER*** |
| 6.2 | Menu « **+ Créer** » | Trois entrées, chacune **décrivant sa nature**. | majeur | #75 |
| 6.3 | « Un cours » | La fenêtre s'ouvre, et son en-tête **rappelle le type** — non modifiable. | mineur | #144 |
| 6.4 | Créer sans titre | Le refus **dit lequel** des champs manque. | mineur | — |
| 6.5 | Créer un cours | Il apparaît dans la liste, **non publié**. | **vital** | CORRIGÉ le 20/08 (BACK#553 + PR #554) : le cours naît en BROUILLON, et le défaut SQL de la colonne a été retourné. **À REJOUER** |
| 6.6 | Ouvrir le **studio** | Sections, supports, glisser-déposer. | **vital** | #76 |
| 6.7 | Ajouter un support **vidéo par lien** (Vimeo/YouTube) | Le lien est accepté, la durée est reprise. | majeur | #349 |
| 6.8 | Ajouter un **PDF** | Le fichier se dépose, son type est reconnu. | **vital** | — |
| 6.9 | Renommer le cours **au clic sur le titre** | Le renommage seul fonctionne, sans réclamer toute la fiche. | mineur | #76 |
| 6.10 | **Publier** une section | Le statut change et se voit. | majeur | BACK#369 |
| 6.11 | **Publier** le cours | Il devient visible côté apprentissage. | **vital** | — |
| 6.12 | Ouvrir le cours **par son URL** | Le cours s'ouvre par son **slug**. ✅ **Vérifié le 17/08 par la passe API** : les cours publiés s'ouvrent par leur slug, BACK#337 est close. Un cours **non publié** rend 404 — c'est attendu ici, mais voir #453 pour l'apprenant qui y est inscrit. | **vital** | BACK#337 (close) |
| 6.13 | **Dépublier** | La confirmation **chiffre** ce que les apprenants perdent. | majeur | #145 |
| 6.14 | Chercher « **Supprimer** » | ⚠️ **L'entrée n'existe plus** — décision du 16/08. Ne pas la signaler comme manquante. ✅ **Depuis le 22/08, le serveur refuse aussi** : une formation portant un historique d'apprenants ne peut plus être supprimée, même par un appel direct. Message vérifié en connecté sur une formation à 20 apprenants — il chiffre la conséquence et propose la dépublication. | majeur | #145, BACK#445 — *corrigé 22/08, PR BACK#611* |
| 6.15 | Créer un **tuto** | Écran dédié, badge « Tuto » en en-tête. | majeur | #75 |
| 6.16 | Créer un **parcours** | L'éditeur s'ouvre : étapes, réordonnancement. | majeur | — |
| 6.17 | **Référentiels** | UN écran, deux rubriques, **cinq panneaux dont QUATRE en onglets**. La rubrique « Utilisateurs » n'a qu'un seul contenu : sa barre d'onglets est masquée à dessein (un onglet unique n'offre aucun choix). Compter 4 onglets n'est **pas** un KO. | majeur | #56 · *corrigé en v1.5 — l'étape annonçait « cinq onglets »* |
| 6.18 | Coller `/admin/cours/balises` | **Redirige** vers l'onglet Balises — pas seulement vers l'écran. | mineur | #56 |
| 6.19 | Créer une catégorie | Elle apparaît, et devient disponible dans les filtres. | majeur | — |

## Points d'attention

**6.14 est un test de retrait.** Il échoue si l'entrée est présente.

**6.12 est vital** : sans slug fonctionnel, aucun lien partagé ne mène nulle part.

---

# P7 — Encadrer ses apprenants

**Rôle** : Formateur.
**Durée** : 15 minutes.

**Maquettes de référence :** ⚠️ **aucune maquette v3 ne dessine l'espace
formateur** — il n'a été ni redessiné ni fusionné par le lot. Les écrans se
jugent donc sur les **gabarits partagés** :
[liste Cours unifiée](html/MAQUETTES%20FORMIND/Pilotage/8-liste-cours-efektiv-v3.html)
pour « Mes cours »,
[Mes collaborateurs](html/MAQUETTES%20FORMIND/Pilotage/2-collaborateurs-efektiv-v3.html)
pour « Mes apprenants »,
[cockpit apprenant](html/9-cockpit-apprenant-efektiv-v3.html)
pour la fiche. Un écart de gabarit se signale ; un écart de **contenu** relève
des `KO` ci-dessous, pas de la maquette.

| # | Ce que vous faites | Ce qui doit se produire | Criticité | Issue |
|---|---|---|---|---|
| 7.1 | Se connecter en Formateur | Arrivée sur son espace. Latérale à **deux entrées** : Mes cours · Mes apprenants. ⚠️ **Aucun sélecteur d'univers** — c'est voulu (#269) ; en revanche le formateur **garde son bouton « Tableau de bord »**, qui est son unique chemin vers son accueil. | **vital** | #78 · #273 — *vérifié le 19/08, PR FRONT#276 — **À REJOUER*** |
| 7.2 | **Mes cours** | Ses cours, sur la DataTable commune. | **vital** | #78 |
| 7.3 | Chercher la colonne « **Mis à jour** » | ⚠️ **Absente** : l'API ne sert pas la donnée. `KO` attendu. | mineur | BACK#434 |
| 7.4 | Chercher « **Catégorie › Sous-catégorie** » | ⚠️ Incomplet : la sous-catégorie n'est pas chargée. `KO` attendu. | mineur | BACK#435 |
| 7.5 | Chercher un bouton **Exporter** | ⚠️ **Absent** : aucune route d'export `teacher.*`. | mineur | BACK#436 |
| 7.6 | **Mes apprenants** | La liste s'affiche. | **vital** | #78 |
| 7.7 | Chercher **tri et recherche** | ⚠️ **Absents**, délibérément : la route les ignorerait en silence. | mineur | BACK#437 |
| 7.8 | Ouvrir la **fiche d'un apprenant** | Son dossier s'ouvre : formations, avancement. | **vital** | #78 |
| 7.9 | Revenir en arrière | Retour à **Mes apprenants**, pas ailleurs. | majeur | #78 |
| 7.10 | Chercher « **+ Créer un cours** » et « **Modifier** » | ⚠️ **Absents — comportement ATTENDU.** Arbitrage rendu le 20/08 : **le formateur ne crée pas de cours.** Leur présence serait un défaut. | mineur | #78 *(close sur arbitrage)* · *corrigé en v1.5 — l'étape les attendait* |

## Points d'attention

**Cinq `KO` attendus** (7.3 à 7.5, 7.7, 7.10). C'est le parcours le plus contraint
par le back : les manques sont tracés et assumés. Un tri absent vaut mieux qu'un
tri qui ne trie pas.

---

# P8 — Gérer les comptes

**Rôle** : Administrateur.
**Durée** : 35 minutes.

**Maquettes de référence :**
[Utilisateurs](html/MAQUETTES%20FORMIND/Apprentissage/1-utilisateurs-efektiv-v3.html) ·
[Créer un utilisateur](html/MAQUETTES%20FORMIND/Apprentissage/2-modale-creer-utilisateur-efektiv-v3.html) ·
[**fiche utilisateur admin**](html/maquette-fiche-utilisateur-admin-efektiv-v1.html)
— validée le 19/08, décisions F-1 à F-5 en pied de page ·
[Référentiels](html/MAQUETTES%20FORMIND/Apprentissage/7-referentiels-efektiv-v3.html) ·
[Paramètres](html/MAQUETTES%20FORMIND/Apprentissage/6-parametres-efektiv-v3.html)

| # | Ce que vous faites | Ce qui doit se produire | Criticité | Issue |
|---|---|---|---|---|
| 8.1 | Admin › **Utilisateurs**, puis **cliquer sur une LIGNE** | Liste des comptes, filtres, recherche. **Le clic sur la ligne ouvre la fiche** `/admin/utilisateurs/:id`. Les cellules interactives (case à cocher, menu) restent cliquables sans ouvrir la fiche. | **vital** | #162 · #270 — *corrigé le 19/08, PR FRONT#271 — **À REJOUER*** |
| 8.2 | Créer un utilisateur | La fenêtre s'ouvre. Les rôles proposés **excluent** ceux de niveau supérieur au sien. | **vital** | — |
| 8.3 | Créer avec un rôle managérial et un rattachement | Le parent proposé porte **effectivement** un périmètre hiérarchique. | majeur | BACK#52 |
| 8.4 | Rattacher quelqu'un **à lui-même** — depuis sa fiche | La personne éditée **n'apparaît pas** dans la liste des managers : elle en est retirée, pas seulement refusée à l'enregistrement. | majeur | BACK#52 · #270 — *porté sur la fiche le 19/08, PR FRONT#271 — **À REJOUER*** |
| 8.5 | Modifier un utilisateur | ⚠️ **La modale de modification n'existe plus.** L'édition se fait **sur la fiche** — voir 8.14. Chercher une fenêtre de modification depuis la liste est un test de retrait : elle ne doit pas apparaître. Les modifications enregistrées sont visibles à la relecture. | **vital** | #46 · #270 — *la modale a été supprimée le 19/08, PR FRONT#271 — **À REJOUER*** |
| 8.6 | Changer sa **société** | Le changement est pris. Le **rattachement survit**. | majeur | — |
| 8.7 | Rattacher à un manager d'une **autre société** | Accepté — la société **décrit**, elle ne cloisonne pas. Comportement normal. | mineur | — |
| 8.8 | Désactiver un compte | Il ne peut plus se connecter. Ses données **restent**. | **vital** | — |
| 8.9 | **Apprenants sans manager** | L'écran liste les orphelins et permet de les réaffecter. | majeur | #58 |
| 8.10 | Référentiels › **Sociétés et profils métier** | Les deux listes s'administrent. | majeur | #56 |
| 8.11 | Supprimer une société **utilisée** | La réaffectation est proposée **avant** la suppression. | majeur | #56 |
| 8.12 | **Paramètres** | Les réglages s'affichent et s'enregistrent. | majeur | #165 |
| 8.13 | Chercher les 4 réglages de la maquette | ⚠️ Certains **n'ont pas de champ**. `KO` attendu. | mineur | #165 |
| 8.14 | **La fiche utilisateur** : l'ouvrir, modifier un champ dans chacune des trois sections, enregistrer | Trois sections **éditables sur place** : **Identité** · **Rôle et rattachement** · **Accès**. La barre d'enregistrement **annonce ce qui a changé** avant de valider ; « Annuler » remet les valeurs d'origine. Après enregistrement, la relecture de la fiche montre bien les nouvelles valeurs. | majeur | #270 — *neuve en v1.4, PR FRONT#271* |
| 8.15 | Depuis la fiche, revenir par le **fil d'Ariane** « Utilisateurs › *nom* » | Retour à la **liste**, pas ailleurs, et pas par l'historique du navigateur. | majeur | #270 — *neuve en v1.4, PR FRONT#271* |
| 8.16 | Ouvrir le **menu d'actions d'une ligne** | Quatre entrées, en français, sans icône rose : **Ouvrir la fiche** · **Envoyer un lien de réinitialisation** · **Ouvrir dans Pilotage** · **Désactiver** (ou **Réactiver** sur un compte désactivé). ⚠️ **Plus de « Supprimer »** — c'est un test de retrait (fonction vitale n°8), il échoue si l'entrée est présente. « Ouvrir dans Pilotage » rend le passage d'univers **explicite** : on ne s'y retrouve jamais sans l'avoir demandé. | majeur | #270 — *neuve en v1.4, PR FRONT#271* |
| 8.17 | Regarder le **pied de la liste** | « **Par page** » est au gabarit (13 px, contrôle de 34 px, dans un pied à filet et fond), et le décompte lit « **Affichage 1 à 20 de N utilisatrices** » — **avec l'espace avant « de »** (le défaut relevé écrivait « 20de 108 »). À vérifier aussi **page 3** : le correctif ne doit pas valoir que pour la première page. ⚠️ **Transverse** : le pied est celui de **toutes** les listes de la plateforme. Un écart se signale **une fois**, pas écran par écran. | mineur | #275 · #283 — *neuve en v1.4, PR FRONT#284 + #287* |

## Points d'attention

**8.7 n'est pas un défaut.** Le cloisonnement multi-société est explicitement
reporté au SaaS : `ManagerialParent` n'impose aucune contrainte de société,
`company_id` est nullable, et la société est un **filtre d'affichage**. Une
équipe à cheval sur deux sociétés est le comportement attendu.

**8.8 met en jeu la fonction vitale n°8** : désactiver ne doit rien effacer.

**P8 est le parcours le plus remanié par les livraisons du 19/08.** La modale de
modification a disparu au profit de la fiche `/admin/utilisateurs/:id`, et avec
elle l'entrée « Supprimer ». Quatre étapes neuves (8.14 à 8.17) décrivent ce qui
n'existait pas quand la v1.3 a été écrite : **elles n'ont jamais été jouées par
personne.** Si vous ne devez en jouer que deux, jouez 8.14 et 8.16.

**La fiche n'affiche PAS tout ce que la maquette dessine, et c'est délibéré.**
« Dernière connexion » et la carte Activité complète attendaient une route qui
ne les servait pas ; elle les sert depuis le 19/08 (BACK#508), le branchement
côté écran reste à faire. Un champ absent ici est un `KO` sur BACK#508, pas un
`BUG`. La règle du dépôt s'applique : **un élément de maquette sans route est un
élément absent plus une issue**, jamais un champ menteur.

**La seconde ligne des options de rattachement (rôle · société) manque encore.**
Le serveur la sert depuis BACK#511, l'écran ne l'a pas branchée — c'est le même
`KO` qu'en P4.2 (FRONT#170).

---

# P9 — Ce qui doit être ABSENT

**Rôle** : tous, mais l'admin suffit pour l'essentiel.
**Durée** : 15 minutes.

**Maquettes de référence :** un retrait ne se dessine pas. Deux maquettes servent
tout de même de témoin —
[connexion](html/11-connexion-efektiv-v3.html) pour 9.6 (aucun lien
« Inscription ») et
[vitrine publique](html/12-vitrine-publique-efektiv-v3.html) pour 9.3.

**Ce parcours échoue quand quelque chose s'affiche.** C'est l'inverse de tous les
autres, et c'est pourquoi il est facile à oublier : un retrait raté ne se voit
jamais en vérifiant ce qui marche.

⚠️ **Trois retraits du 19/08 sont vérifiés AILLEURS, volontairement** — les
rejouer ici produirait deux signalements pour un même geste :

| Ce qui a été retiré | Où on le vérifie | Source |
|---|---|---|
| le bouton « Tableau de bord » de l'admin | **P0.4** | #273 / PR FRONT#276 |
| la modale de modification d'un utilisateur | **P8.5** | #46 / PR FRONT#271 |
| l'entrée « Supprimer » du menu d'un utilisateur | **P8.16** | #270 / PR FRONT#271 |

| # | Ce que vous faites | Ce qui doit se produire | Criticité | Issue |
|---|---|---|---|---|
| 9.1 | Coller `/chat` | **Ne s'ouvre pas.** La fermeture est serveur. | majeur | #140, BACK#391 |
| 9.2 | Chercher Chat, Annonces, Tickets dans les latérales | **Aucune entrée**, pour aucun des trois rôles concernés. | majeur | #140 |
| 9.3 | Coller `/catalog` (sans E) | Route **supprimée**. | mineur | #192 |
| 9.4 | Coller `/plans` | Route **supprimée**. | mineur | #192 |
| 9.5 | Coller `/signup` | Route **supprimée** — l'entrée se fait par invitation. | majeur | #192 |
| 9.6 | Chercher un lien « Inscription » sur l'écran de connexion | **Aucun.** | majeur | #192 |
| 9.7 | Coller `/edit-quiz/1` | Route **supprimée**. | mineur | #192 |
| 9.8 | Coller `/admin/courses/<slug>` | **Redirige** vers `/courses/<slug>` — vue unique. | majeur | #193 |
| 9.9 | Chercher « Supprimer » sur un cours | **Aucune entrée.** | majeur | #145 |
| 9.10 | Chercher les onglets horizontaux de l'apprentissage | **Aucun** : latérale seule. | mineur | #153 |
| 9.11 | Coller `/admin/profile/edit` | **Redirige** vers `/profil`. | mineur | #154 |
| 9.12 | Coller une URL quelconque **déconnecté** | Redirection vers la connexion, **jamais** de contenu. | **vital** | #18 |

## Points d'attention

**9.5 et 9.6 vont ensemble.** Supprimer la route sans retirer le lien laisse un
bouton qui mène à une page morte — c'est le piège relevé lors de la chasse aux
routes orphelines : le lien vers `/signup` était dans un bloc **commenté**, donc
invisible à la recherche, mais un autre pouvait subsister.

**9.12 est vital** : c'est le seul test de sécurité de ce parcours.

---

# Vue par rôle

Le même contenu, rangé par **qui joue**. Cette vue sert à RÉPARTIR et à
vérifier qu'aucun rôle n'a été oublié ; la vue par parcours sert à
EXÉCUTER. Elle est dérivée des étapes elles-mêmes — elle ne peut donc pas
diverger du corps du cahier.

| Parcours | Rôle qui le joue | Étapes | dont vitales | Neuves en v1.4 |
|---|---|---:|---:|---|
| **P0** — Entrer et sortir | **les 7 rôles, l'un après l'autre** | 10 ×7 | 4 | 0.10 |
| **P1** — De l'invitation au premier cours | Manager RH (1.1–1.3) puis Apprenant | 16 | 7 | — |
| **P2** — Suivre une formation jusqu'au certificat | Apprenant, puis **un Manager d'équipe inscrit** | 17 | 12 | — |
| **P3** — Faire entrer une équipe | Manager RH | 10 | 1 | — |
| **P4** — Inscrire et traiter les demandes | Manager RH | 11 | 3 | 4.11 |
| **P5** — Piloter son équipe | Manager d'équipe, puis Manager RH (5.17) | 18 | 7 | — |
| **P6** — Administrer le catalogue | Administrateur | 19 | 5 | — |
| **P7** — Encadrer ses apprenants | Formateur | 10 | 4 | — |
| **P8** — Gérer les comptes | Administrateur | 17 | 4 | 8.14 à 8.17 |
| **P9** — Ce qui doit être ABSENT | l'admin suffit | 12 | 1 | — |

**140 étapes**, dont **48 vitales** — **six de plus qu'en v1.3**. Les six portent
sur des écrans livrés le 19/08 : **personne ne les a encore jouées.**

⚠️ **P0 se décline sur les sept rôles** : ses 10 étapes valent 70 exécutions.
Avec des contextes isolés, elles se jouent en parallèle et coûtent le temps de
dix.

---

# Dépendances et parallélisation

## Quatre sortes de dépendances, une seule vraiment bloquante

| Type | Exemple | Parallélisable ? |
|---|---|---|
| **Données** | P2.14 (le certificat apparaît) exige P2.13 (formation à 100 %) | **non** — chaîne stricte |
| **État partagé** | P4.8 accepte une demande : deux testeurs ne peuvent pas prendre la même | **oui**, si chacun joue sur SES comptes |
| **Session** | le navigateur | **oui** — voir ci-dessous |
| **Aucune** | tout P9, les périmètres, les consultations | **oui**, franchement |

La deuxième se résout d'elle-même : chaque testeur a son jeu de comptes
(`david`, `eng`, `lilian`, `claude`). Les demandes que l'un accepte ne sont pas
celles de l'autre. Il ne reste que les chaînes **internes** à un parcours.

## La contrainte de session est levée — mesuré le 16/08

On croyait devoir tout jouer en série : cookies et `localStorage` sont partagés
par ORIGINE, donc deux rôles connectés en même temps s'écrasent l'un l'autre.

**C'est vrai d'un navigateur ordinaire, faux avec des contextes isolés.**
Éprouvé sur staging avec Playwright — déjà présent dans le dépôt depuis le POC
de captures d'août :

    admin          connecté | lit : ["admin"]
    managerrh      connecté | lit : ["manager"]
    manager        connecté | lit : ["sub_manager"]
    formateur      connecté | lit : ["teacher"]
    apprenant      connecté | lit : ["learner"]

Cinq sessions simultanées, chacune gardant la sienne. Chaque `browserContext`
a son propre stockage.

**Conséquence** : P0, qui se décline sur sept rôles, passe de 63 exécutions en
série à **neuf étapes de temps mur**. L'estimation d'une journée tombe à deux ou
trois heures.

## Les chaînes, et ce qui vole en parallèle

    P1 ──▶ P2          entrer, puis suivre, puis être certifié
    P3 ──▶ P4          faire entrer, puis inscrire

    P0   P5   P6   P7   P8   P9        aucune dépendance entre eux

## Répartition proposée — le meilleur des deux mondes

Les humains testent **leur métier** : c'est leur expertise qui donne de la valeur
au retour, et un manager ne saura pas juger de la vue apprenant. Les chaînes
restent entières, mais chacune appartient à un seul testeur.

| Testeur | Parcours | Pourquoi lui |
|---|---|---|
| **Manager** | P3 ▶ P4 ▶ P5 | il sait ce qu'on attend d'un tableau de bord d'équipe |
| **Admin** | P6 · P8 · P9 | il connaît le catalogue et les rattachements |
| **Apprenant** | P1 ▶ P2 | il est le seul à juger si c'est utilisable sans explication |
| **Claude** | P0 (7 rôles) · passe API · ce que personne ne prend | contextes isolés, exécution parallèle |

Les trois colonnes tournent **en même temps**, chacune sur ses comptes.

## ✅ Le prérequis d'inscription est levé — mesuré le 17/08 au soir

**Historique, à garder pour comprendre le piège.** Le seeder crée la même
structure pour les quatre jeux mais **n'inscrivait personne à une formation** ;
puis les inscriptions posées à la main portaient sur des cours **non publiés**,
que « Mes formations » liste alors que la page rend 404 (#453). P1.12 à P1.14 et
tout P2 étaient injouables.

**Débloqué le 17/08 :** apprenant et manager d'équipe de **chacun des quatre
jeux** sont inscrits à deux formations publiées. Vérifié jeu par jeu :

```
claude · david · eng · lilian    →  2 formations ouvrables par rôle
P2.17 (BACK#447, vitale)         →  OK sur les quatre
```

⚠️ **Ce déblocage est manuel et ne survivra pas à une reconstruction du jeu.**
Le seeder doit le porter — c'est **BACK#439**, qui doit garantir deux choses :
inscrire à au moins 2 formations **publiées**, et conserver **au moins une**
inscription non publiée comme cas d'épreuve de #453.

**Pour re-vérifier un jeu à tout moment :**

```bash
RECETTE_PASSWORD='…' RECETTE_QUI=<david|eng|lilian|claude> \
  python3 tools/recette-api/passe_api.py
```

Attendu à `P2.1` : « *2/4 formation(s) listées dont la page rend 404* ». C'est le
**bon** résultat — les deux formations ouvrables fonctionnent, les deux non
publiées démontrent #453. Si le compte est « 4/4 », les inscriptions publiées ont
disparu : rien ne sert de commencer P1 ou P2.

⚠️ **Ne jouez pas les quatre passes à la suite** : la limitation de débit refuse
les connexions et le rapport annonce « pas de jeton », qui ressemble à une panne
de données sans en être une. Espacez de ~20 secondes.

---

# Registre des écarts déjà connus

**À lire avant de signaler.** Chaque ligne est un constat **déjà suivi par une
issue**. Le rencontrer se signale `KO` avec le numéro — jamais `BUG`.

Le registre est arrêté au **17/08 au soir**. Il ne prétend pas être exhaustif :
il couvre ce que la passe API et les tours de recette connectés ont trouvé. Un
constat absent d'ici est un `BUG` légitime, c'est tout l'intérêt de la liste.

> **Deux issues sont en cours de correction au moment où vous lisez** (#450,
> #452, possiblement #451) et **deux PR front sont en attente de merge** (#234,
> #236). Si le comportement décrit ne se reproduit pas, tant mieux : signalez
> `OK`, la correction est passée entre-temps.

## Ce qui a été corrigé et vérifié en ligne — ne doit PLUS se reproduire

Si l'un de ces défauts réapparaît, c'est une **régression** : signalez `BUG` en
citant l'issue d'origine, c'est plus grave qu'un défaut neuf.

| Corrigé | Ce qui doit marcher | Vérifié |
|---|---|---|
| FRONT#223 | la latérale reste à l'écran quand on fait défiler | mesuré, 1 136 px |
| FRONT#231 | catalogue : rayons, familles, flèches de défilement | 42 contenus, 0 rayon sans flèche |
| FRONT#226 | sélection multiple + barre d'actions sur Utilisateurs et Cours admin, confirmation chiffrée, « Par page » | 6 vérifications UI, 18/08 |
| FRONT#228 | page d'un cours : un seul en-tête, quel que soit l'état d'inscription | 3 états rejoués |
| **BACK#447** | **la progression s'affiche pour tout INSCRIT**, pas seulement le rôle apprenant | **vital — OK sur les 4 jeux** |
| **BACK#450** | une fiche hors périmètre répond 403 | vérifié en ligne, 18/08 |
| BACK#337 | les cours publiés s'ouvrent par leur adresse | passe API |
| FRONT#266 | l'aperçu d'e-mail des Invitations reste EN PLACE au défilement (la maquette ne le rend pas sticky) | bundle servi, 19/08 |
| BACK#502 | une demande d'inscription d'un utilisateur SANS manager de rattachement notifie l'admin + le(s) Manager(s) RH, sans erreur silencieuse | rejouée en ligne (transaction annulée), 19/08 |
| BACK#503 | une demande d'inscription sur un cours SANS manager référent notifie aussi l'admin + le(s) Manager(s) RH — le trou est fermé des deux côtés | rejouée en ligne (transaction annulée), 19/08 |
| FRONT#46/#270 | la fiche utilisateur admin (clic sur la ligne, `/admin/utilisateurs/:id`) remplace l'ancienne modale : rôle et rattachement modifiables sur place (sens #52) | bundle servi + contrat PUT rejoué en ligne, 19/08 |
| FRONT#269 (décl. 1)/#92 | l'admin dispose du sélecteur TROIS UNIVERS (Administration · Pilotage · Apprentissage), actif correct partout ; encadrant 2, apprenant 0 | sessions réelles, 19/08 |
| FRONT#273 | le bouton « Tableau de bord » admin est retiré (doublon du sélecteur) ; le formateur garde le sien | sessions réelles, 19/08 |
| FRONT#274 | la bascule d'univers est au gabarit maquette (347×42, --surface-2, survol et focus réels) | bundle servi, 19/08 |
| FRONT#275 | « Par page » des listes au gabarit (13px/34px, pied .table-foot) sur TOUTES les listes | bundle servi, session réelle, 19/08 |
| FRONT#267 | le pied des Invitations/Inscriptions est dans le FLUX : la liste de cours dépliée n'est plus recouverte (0/5 points) | bundle servi, session réelle, 19/08 |
| BACK#406 | learnerList/coursesList désambiguïsées (email + société/profil ; catégorie + nb supports), périmètres inchangés | session réelle, 19/08 |
| BACK#503 | demande sur un cours SANS référent → repli admin + Manager RH (le trou fermé des deux côtés avec #502) | rejouée en ligne, 19/08 |
| BACK#508 | user/show sert last_login_at, created_at, courses_in_progress, certificates_count — rien d'autre | session réelle, 19/08 |
| **BACK#512** | **user/show vérifie le périmètre (garde partagée) : 403 hors périmètre, plus de 500 sur id inexistant** | **mesuré en ligne, 19/08** |

## Les `KO` attendus, parcours par parcours

### P1 — De l'invitation au premier cours

| Étape | Ce que vous verrez | `KO` |
|---|---|---|
| Invitation à plus de 5 destinataires | aucune borne appliquée, aucun message | **BACK#403** |
| Accueil apprenant | **pas de section « À faire »**, pas de badge « ★ Assigné » | **FRONT#227** ← dépend de **BACK#401** |

⚠️ L'absence de « À faire » est **volontaire** : l'API ne sert aucune échéance, et
un délai inventé sur un écran de conformité coûte plus cher que pas de délai. La
question produit — *faut-il exposer une échéance à l'apprenant ?* — est ouverte
sur BACK#401 et vous appartient.

### P2 — Suivre une formation jusqu'au certificat

| Étape | Ce que vous verrez | `KO` |
|---|---|---|
| « Mes formations » | **TOUTES les formations listées s'ouvrent** — y compris les 2 non publiées auxquelles le compte est inscrit (#453 corrigée le 18/08 : l'inscription décide, dépublier ne casse plus un parcours engagé). Un 404 ici est désormais une RÉGRESSION | — |
| Page d'un cours | les durées Vimeo sont remplies (rétro-remplissage #456 joué le 18/08) ; seuls ~19 YouTube et quelques fichiers peuvent rester muets — signalez un « 0:01 » sur une VIDÉO VIMEO comme régression | — |
| Page d'un cours | pas de « Niveau débutant » | **BACK#438** |
| Certificat | ni numéro de référence, ni score | **BACK#446** |
| Reprise | pas de « dernière activité », pas de reprise fine | BACK#398 |

⚠️ Depuis le 18/08 au soir, ces deux inscriptions non publiées servent le cas
INVERSE : elles prouvent qu'un inscrit garde l'accès malgré la dépublication.

### P4 — Inscrire et traiter les demandes

| Étape | Ce que vous verrez | `KO` |
|---|---|---|
| Demandes, encadrant sans rattaché | **corrigé et vérifié le 18/08** (PR #463) — si un 500 revient, régression | — |
| Filtrer les demandes par statut | **fonctionne depuis le 19/08** (PR #495) : Pending/Approved/Rejected filtrent réellement | — |
| Accepter / refuser | **tracé depuis le 19/08** : la décision porte QUI et QUAND (vérifié en ligne) — fonction vitale 7 | — |
| Refuser une demande | crédite quand même l'apprenant de points | BACK#412 |
| Inscrire | l'e-mail part toujours, impossible de s'en passer | BACK#405 |
| Onglet Demandes / Inscrire | 3 + 2 fonctions de la maquette absentes | FRONT#172, FRONT#170 |

### P5 — Piloter son équipe

| Étape | Ce que vous verrez | `KO` |
|---|---|---|
| Filtres Société/Profil métier des écrans collaborateurs | **corrigés et vérifiés le 19/08** (PR #265) — options servies par les routes managériales, 3 profils métier au jeu de données. Si un 403 revient sur ces écrans, régression | — |
| Filtre **Société** du tableau de bord | **fonctionne depuis le 18/08** : chaque société rend un tableau de bord non vide (3 apprenants « Stat » par société, comptes dédiés). Si une société rend zéro, régression | — |
| Fiche d'un apprenant hors de son périmètre | **refusée (403) depuis le 18/08** (PR #463, vérifié en ligne) — si elle s'ouvre, régression VITALE | — |
| Cockpit apprenant | retard et abandon disparaissent au niveau 1 | FRONT#178 |
| Cockpit apprenant | « tout l'historique » rend des centaines de lignes | FRONT#180 |
| Cockpit apprenant | aucune action possible depuis le dossier | FRONT#179 |
| Compteurs de collaborateurs | filtrables en « au moins N » seulement | BACK#422 |

⚠️ **BACK#450 est une divulgation de données, pas une gêne.** Si vous ouvrez une
fiche que vous ne devriez pas voir, c'est le défaut — signalez `KO #450` et
passez. N'explorez pas plus loin, il n'y a rien à documenter de plus.

### P6 — Administrer le catalogue

| Étape | Ce que vous verrez | `KO` |
|---|---|---|
| Studio parcours (liste, création, éditeur) | **livré et vérifié le 18/08** (PR #248) : liste avec Créer/Exporter, fenêtre de création, éditeur avec Aperçu apprenant/Ajouter/Réglages — si un de ces éléments manque, régression | — |
| Aperçu apprenant d'un parcours BROUILLON | **fonctionne depuis le 19/08** (PR #493+#261) : la page rend avec le badge « Brouillon — aperçu studio » pour l'œil du studio, reste fermée aux apprenants. Cas d'épreuve : \`recette-brouillon-249\` | — |
| Étapes d'un parcours publié, vues par un non-inscrit | « Disponible une fois l'étape précédente terminée » même quand tout est réglé « à l'inscription » — le libellé est inventé par repli | **FRONT#249** |
| Actions groupées : Publier, Dépublier | **livrées le 18/08** (PR #240) — si absentes, régression | — |
| Changer de catégorie sur la sélection | absent, la route n'existe pas | **BACK#459** ← FRONT#237 |
| Colonne « Mis à jour » | vide | **BACK#434** |
| Rayon « Catégorie › Sous-catégorie » | sous-catégorie absente | **BACK#435** |
| Bouton Exporter | aucune route derrière | **BACK#436** |
| Supprimer un cours | détruit **définitivement** l'historique des apprenants | **BACK#445** ⚠️ |
| Liste des contenus | 3 informations de la maquette non servies | BACK#399 |

⚠️ **BACK#445** : ne supprimez pas de cours pendant la recette, la perte est
irréversible et emporte l'historique d'apprenants réels du jeu de test.

### P7 — Encadrer ses apprenants

| Étape | Ce que vous verrez | `KO` |
|---|---|---|
| Tri et recherche sur « Mes apprenants » | ignorés | **BACK#437** |
| Export | aucune route | **BACK#436** |

### P8 — Gérer les comptes

| Étape | Ce que vous verrez | `KO` |
|---|---|---|
| Actions groupées : Affecter un manager, Désactiver | **livrées le 18/08** (PR #240) — si absentes, régression | — |
| Changer de rôle sur la sélection | absent, la route n'existe pas | **BACK#458** ← FRONT#237 |
| « Affecter un manager » répond « N déjà rattachés inchangés » | **PAS un bug front** : la route ignore les comptes déjà rattachés, le front affiche le compte rendu VRAI du serveur | **BACK#458** |
| Pastille « N sans manager » → écran dédié, pas un filtre sur la liste | le contrat de listes ne sait pas dire « champ nul » | **BACK#462** |
| Relancer / Exporter la sélection (Tous les collaborateurs) | absents — aucune route, AUCUNE case à cocher sur cet écran (voulu : une sélection sans action = un bouton mort) | **BACK#460/#461** ← FRONT#237 |
| Listes de rattachement | ne servent qu'une partie des personnes | BACK#406 |
| Réglages administrables | 4 clés sans champ | FRONT#165 ← BACK#413 |

### P9 — Ce qui doit être ABSENT

| Étape | Ce que vous verrez | `KO` |
|---|---|---|
| Mot de passe erroné, adresse existante OU inexistante | **réponses identiques au caractère près depuis le 19/08** (PR #495) — si elles diffèrent, régression. Les portes /password/email et signup/verify rendent aussi une réponse neutre identique (PR #498, vérifié) | — |
| Chat, annonces, tickets | non masqués partout où ils devraient l'être | FRONT#140 |

## Écarts d'apparence — transverses, sur tous les écrans

Ceux-ci se rencontrent partout. **Signalez-les une fois, pas à chaque étape.**

| Constat | `KO` |
|---|---|
| Survol des cartes/boutons/champs, « Tout réinitialiser », enveloppe Référentiels, latérale admin | **corrigés et vérifiés en ligne le 18/08** (PR #234, #236) — s'ils réapparaissent, régression | — |
| Session expirée ou corrompue | **retour propre à l'écran de connexion** (#243 corrigée et vérifiée le 18/08) — une page BLANCHE ici est une régression | — |
| Annuler une action depuis sa confirmation | FRONT#219 |
| Trois feuilles de style qui ne se chargent pas sur leurs écrans | FRONT#221 |

## Ce qui n'est pas un défaut

- **« 1 support terminé sur 4 » avec 0 % »** : le pourcentage est pondéré par la
  DURÉE (secondes faites / secondes totales), le comptage n'est qu'un repli quand
  aucune durée n'existe. Terminer un support court d'un long cours peut afficher
  0-3 % — c'est voulu, vérifié dans le code serveur le 18/08.

Pour éviter quatre signalements par testeur sur les mêmes points :

- **Les boîtes yopmail sont publiques.** C'est assumé sur staging, ce n'en est
  pas un sur cet environnement.
- **Une équipe qui traverse deux sociétés** est le comportement voulu : la
  société décrit, elle ne cloisonne pas.
- **Deux formations qui rendent 404** dans « Mes formations » sont le cas
  d'épreuve de #453, laissé en place volontairement.
- **Un compte qui « ne marche plus »** après plusieurs connexions rapides est la
  limitation de débit. Attendez une minute.
- **La section « À faire » absente** de l'accueil apprenant est une décision
  documentée, pas un oubli (#227 / BACK#401).
- **Les titres de page en 28 px.** Une seule maquette sur vingt écrit 32 px ;
  le front passe partout par le même jeton `--t-h1`. C'est la maquette qui est
  l'exception, pas l'écran — la cohérence prime sur le cas isolé.

---

# Matrice de couverture — à établir

Une fois les neuf parcours joués, il restera à vérifier ce qu'**aucun** ne
traverse. La méthode : croiser les **342 routes d'API** (`php artisan route:list`) et les actions déclenchables de
chaque écran avec les étapes ci-dessus. Ce qui n'apparaît nulle part est soit
une fonction oubliée du cahier, soit une fonction que personne n'utilise — les
deux méritent d'être vues.

**Un premier trou, trouvé en v1.4 sans attendre la matrice.** Poser les liens de
maquettes parcours par parcours a suffi à le montrer : sur les 32 maquettes du
dossier, **une seule n'est référencée par aucun parcours** —
[recherche globale](html/maquette-recherche-globale-efektiv-v3.html). Aucune
étape ne fait chercher quoi que ce soit à l'échelle de la plateforme. C'est
exactement le genre de trou que la matrice existe pour attraper ; il est noté
ici en attendant qu'elle le confirme.
