17 points bloquent la mise en production. Ils sont listés à part, en tête ; tout le reste est classé par priorité, et chaque ligne renvoie à son ticket.
Bloquants pour la mise en production
17
section 3.0 : à traiter avant toute autre
Tickets dans l’outil de ticketing
71 / 71
un par référence, rattaché à son workflow
Ouverts, correctif serveur attendu
50
aucune absorption côté application
Contournés côté application
16
l’application absorbe le défaut ; le correctif reste attendu
Liste à part, à traiter avant toute autre. Tant qu'un seul de ces points est ouvert, l'application ne peut pas être publiée : soit une fonction livrée n'opère pas, soit un client réel subirait un défaut visible ou dangereux. Ils sont sortis des listes par priorité de la section 3.1. Tous relèvent des lots 1 et 2 du plan d'action, attendus à la fin de la semaine de traitement des issues (calendrier en section 1.4). Le détail de chaque ticket est en section 3.2.
17 points· 13 ouverts, 2 contournés côté application, 2 en arbitrage. Tant qu’un seul reste ouvert, l’application ne peut pas être publiée.
Tickets backend bloquants pour la mise en production
POST /auth/refresh répond 500 avec un jeton valide
Tout utilisateur est déconnecté au bout de 30 minutes ; la connexion par empreinte n'opère que dans cette fenêtre ; aucun contournement propre côté mobile
Correctifs applicatifs bloquants (côté SHIFTIN, sans dépendance backend)
Correctifs applicatifs bloquants
Réf.
Workflow
Défaut
Correctif
Échéance
APP-1
Authentification – Inscription
L'OTP e-mail était envoyé avant POST /users ; le serveur répond 404 pour toute adresse nouvelle
Corrigé : le compte est créé à l'étape téléphone, puis l'adresse est vérifiée par l'OTP ; l'étape SMS (non envoyable, A23#69(ticket dans l’outil de ticketing, nouvelle fenêtre)) est retirée ; écrans instrumentés, flow Maestro 02 réenregistré de bout en bout
Livré dans l'APK de référence
APP-2
Authentification – Réinitialisation du mot de passe
Étape 1 sur POST /auth/mfa/send (jeton obligatoire) au lieu de POST /auth/otp ; jeton de /auth/otp/validate non conservé pour PATCH /auth/password
Corrigé : /auth/otp à l'étape 1, jeton conservé (préfixe Bearer retiré) et porté vers PATCH /auth/password, tests unitaires sur la chaîne ; flow Maestro 03 réenregistré de bout en bout
Livré dans l'APK de référence
Prérequis client bloquants pour la mise en production
Prérequis client bloquants
Réf.
Besoin
Ce qui est bloqué sans lui
Responsable
CP-02
Compte App Store (organisation, D-U-N-S, certificats)
Build iOS, TestFlight, publication
Amana
CP-01
Compte Google Play Store
Publication Android
Amana
CP-11
URL de l'API de production
Build de production (l'URL configurée est encore factice)
Amana
CP-12
Instance Satim marchande au nom d'Amana
Le paiement carte de test s'exécute sur une page au nom d'un marchand tiers, non livrable
Amana / Satim
CP-08
Cartes Dahabia de test
Le paiement Dahabia n'a jamais été réglé de bout en bout
Décision A2 : plafond de la prime Voyage Famille au 7ᵉ voyageur
Trois voyageurs sur dix assurés sans contrepartie tant que non tranché
Amana
Tous les tickets, par priorité
Critiques, haute priorité, priorité normale, à traiter ultérieurement, et les constats d’audit ticketés depuis cette édition. Les bloquants de mise en production sont marqués et remontent en tête.
le JWT d'un simple assuré porte 19 rôles dont des périmètres de back-office ; au moins un est inerte sur cette passerelle. Questions : les 18 autres sont-ils inertes partout ? Le compte de test est-il représentatif ?
primeNetteSansReduction: 16164.146341463415, primeNetteSansReductionMensuel: 1347.0121951219512 ; reduction: false alors que les variantes avec et sans réduction diffèrent
Remplir les required de la spécification et corriger les cinq écarts actifs
par ordre de nocivité : POST /refunds (documente type, retiré ; omet codeActe) → PUT /members (questionnaire plat au lieu d'imbriqué) → GET /auth/me (5 champs au lieu de 18 + 4 objets) → /refunds et `/clai…
modèle du compte unifié, identifiant stable de la personne, rôle exact de l'endpoint, session porteuse de l'appel, contenu du LoginDto renvoyé, cas d'échec et idempotence, déclencheur côté application (checkuser ?…
!P1 · haute
3.2
Section 3.2 : Détail des tickets
Organisé par workflow, dans l’ordre du référentiel. Pour chaque ticket : description, impact, priorité, responsable, statut, dépendances et échéance cible (lot). Le détail complet est dans l’outil.
Authentification
P0-D#2 (nouvelle fenêtre)‼P0 · critique?Arbitrage attendubloquant pour la mise en production
Vérifier l'OTP téléphone à l'inscription
POST /auth/otp/validate
Description
Le backend ne contrôle que l'OTP e-mail ; l'OTP téléphone est envoyé, collecté et jamais vérifié.
Impact
Un compte peut être créé avec un numéro dont l'utilisateur n'est pas titulaire.
Priorité
P0
Responsable
Amana (décision A1) puis Backend
Statut
Arbitrage.
Dépendances
Décision de maintenir ou d'abandonner l'authentification par téléphone.
Avec un jeton de rafraîchissement valide (émis 2 minutes plus tôt, expirant dans 8 heures), l'endpoint répond 500 INTERNAL_SERVER_ERROR. Un corps avec un autre nom de champ répond 400 « refreshToken ne doit pas être vide », ce qui confirme que la requête de l'application est correcte. La spécification est juste ; l'implémentation est cassée.
Impact
Le jeton d'accès vit 30 minutes ; tout utilisateur au-delà est déconnecté au lieu d'être renouvelé ; la connexion par empreinte digitale échoue de la même façon. Aucun contournement propre côté mobile (ré-authentifier silencieusement exigerait de stocker le mot de passe)
Priorité
P0
Responsable
Backend
Statut
Ouvert.
Dépendances
Aucune. À défaut de correctif immédiat, allonger nettement la durée de vie du jeton d'accès (palliatif, pas correctif)
Enveloppe d'erreur et codes 419 / 420 non déclarés
POST /auth/login
Description
Les réponses 419 (changement de mot de passe imposé) et 420 (MFA requis) arrivent avec un jeton porteur sans champ status ; une connexion est rejetée si un JWT périmé est attaché.
Impact
Comportement découvert par l'essai ; hiérarchie d'erreurs dédiée côté application.
Priorité
P2
Responsable
Backend
Statut
Ouvert.
Échéance cible
Lot 4
P3.7résolu, sans ticket·P3 · ultérieure✓Résolu
/auth/password-policy annoncé mais absent
PATCH /auth/password
Description
GET /auth/password-policy répond désormais, en anonyme, quatre règles en français (8 caractères minimum ; majuscule, minuscule, chiffre et caractère spécial parmi @ # ! ? $ £ ; pas d'informations personnelles ; différent des 5 derniers mots de passe). L'application les affiche et les évalue à chaque frappe. Reste : déclarer l'endpoint dans la spécification, et faire nommer par le 419 la règle violée
Le code MFA de connexion n'est pas délivré par e-mail
POST /auth/mfa/send
Description
La séquence du diagramme backend (création, connexion, 420 INSERT_CODE_MULTIFACTORIELLE, OTP, mfa/verify) a été rejouée sur le compte de recette demo@shiftin-demo.com, seule adresse dont la boîte est relevée. Aucun code n'arrive par e-mail après le 420 (attente 2 min) ; POST /auth/mfa/send répond 200 « RESENDING WITH SUCCESS !!! » pour EMAIL, email, MAIL, avec username et à corps vide, sans qu'aucun e-mail ne soit délivré (INBOX, Junk, spam), sur une adresse qui reçoit bien l'OTP de /auth/otp. POST /auth/mfa/verify avec un code erroné répond proprement 400. Si le code part par SMS, ce n'est ni documenté ni observable.
Impact
Aucun compte ne peut franchir le défi MFA par e-mail ; le compte de recette est dans cet état. Les étapes 14 à 25 du diagramme backend ne peuvent pas être validées.
Priorité
P0
Responsable
Backend
Statut
Ouvert.
Échéance cible
Lot 1 (chantier 2). Attendu : délivrer le code par e-mail, ou documenter le canal réellement utilisé (SMS ?)
L'ordre du parcours d'inscription doit être tranché (l'application le corrige de son côté) ; le bouton « renvoyer le code » échouera ; la réutilisation d'un OTP est un défaut de sécurité.
Modèle du compte unifié, identifiant stable de la personne, rôle exact de l'endpoint, session porteuse de l'appel, contenu du LoginDto renvoyé, cas d'échec et idempotence, déclencheur côté application (checkuser ? altern_users ?), parcours « ancien compte Assurance seul ». Point connexe : le CIN collecté à l'inscription n'a aucun champ dans POST /users.
Impact
Quatre écrans construits et testés, inaccessibles à l'utilisateur.
Responsable
Backend
Statut
Questions transmises, sans réponse.
Ce qui débloquerait le plus vite
Un curl complet d'un rattachement réussi, un compte de test possédant deux anciens comptes non rattachés, la réponse à Q8.
GET /contrats, /beneficiaries, /notifications, /refunds, /claims
Description
Page Spring complète d'un côté, page réduite de l'autre ; base d'index 0 ou 1 selon l'endpoint ; /refunds, /claims et /beneficiaries répondent 500 sans page ; la spécification documente encore l'enveloppe retirée.
Impact
Lecture unifiée côté application ; base codée en dur par appel.
Priorité
P2
Responsable
Backend
Statut
Contourné.
Échéance cible
Lot 6 (page Spring complète partout, base 0, valeur par défaut sans page)
GET /auth/me : DTO plat déclaré, réponse imbriquée
Description
5 champs plats déclarés, 18 champs et 4 objets imbriqués réels (souscripteur, adresse, tel, email, wilaya) ; nom/prenom vides à la racine ; deux champs déclarés n'existent pas. L'endpoint le plus utilisé de l'application (10 hooks) est documenté à 22 %
Remplacement d'enregistrement complet et non mise à jour partielle ; bloc questionnaire nommé questionnaire et non bonneSanteQuestion ; réponses en chaînes « Oui »/« Non » ; validation (téléphone 10 chiffres, code postal 5 chiffres, ville et date d'entrée en service obligatoires) documentée nulle part ; aucun champ pour la wilaya.
Impact
Codé d'après la documentation, l'enregistrement du profil santé échouait à 100 %. Contourné par relecture et fusion avant chaque écriture.
500 dès que l'appelant n'est pas adhérent santé (route interne bulletinV2DocumentUtil/{adherentId} : « cet adherent n'existe pas »), sur un catalogue de textes réglementaires publics
Impact
Écran mort pour la majorité des souscripteurs réels, là où la réglementation impose la mise à disposition. Découvert en exécutant les parcours E2E.
Priorité
P0
Responsable
Backend
Statut
Ouvert.
Échéance cible
Lot 2. Attendu : servir le catalogue à tout compte authentifié, remonter un 404 amont en 404
fichier est un chemin de fichier serveur (opt/amana-digitale-preprod/…) ; GET /assets?path= répond 404
Impact
La liste s'affiche, aucun document n'est ouvrable ; bouton masqué ; quatre boutons « documents » de contrat et de sinistre bloqués par la même absence.
Priorité
P0
Responsable
Backend
Statut
Ouvert.
Échéance cible
Lot 2. Attendu : une route de téléchargement et un identifiant par document
201 success: true avec un contratId qui répond ensuite 404. Le backend indique que le contrôle est fait en amont sur la création de l'assuré principal ; un contrôle côté appelant ne remplace pas une validation côté API
Impact
Relecture systématique de GET /contrats/{id} après chaque souscription (un aller-retour par vente), à retirer dès correction.
Priorité
P1
Responsable
Backend
Statut
Contourné.
Échéance cible
Lot 4. Attendu : 400/404 avec le motif quand une personne ou un contrat référencé n'existe pas
POST /personnes/assure → POST /souscriptions/voyage → POST /personnes/membre-assure
Description
Trois appels enchaînés sans transaction ni annulation ; rattacher un membre à un contrat inexistant → 500 Cannot invoke "…toEntity()" because "dto" is null.
Impact
Une coupure laisse un contrat vendu pour N voyageurs mais n'en couvrant qu'une partie. Risque assumé, le contrat restant impayé.
Priorité
P1
Responsable
Backend
Statut
Ouvert.
Échéance cible
Lot 4. Attendu, par ordre de préférence : membres dans le payload de souscription ; à défaut, une annulation d'un contrat non payé ; dans tous les cas, 400/404 au lieu de 500
age omis → 200 avec un prix plausible mais faux ; destinationId omis → bascule silencieuse sur une autre destination ; dateEffet/dateFin omis → 500 « date must not be null »
Priorité
P1
Responsable
Backend
Statut
Contourné (appel émis seulement une fois tous les champs réunis)
Plafonnement de la prime Famille au 7ᵉ voyageur (V13)
Description
La prime cesse d'augmenter au-delà de 7 personnes ; avec la règle métier « 2 adultes + 8 enfants », une famille de 10 paie le prix de 7. Confirmé par le backend comme comportement attendu.
Signaler un compte sans enregistrement souscripteur
GET /auth/me, POST /souscriptions
Description
Un compte de test ne renvoie ni personneId ni bloc souscripteur dans /auth/me alors que /auth/login renvoie personne_id ; POST /souscriptions exige personneId.
Impact
Le client remplit tout le tunnel et n'obtient que « Paiement non abouti » alors que rien n'a été créé ; « Oui, je suis l'assuré » ne préremplit presque rien.
Priorité
P1
Responsable
Backend
Statut
Ouvert.
Échéance cible
Lot 2. Attendu : refuser l'entrée dans le tunnel avec un motif nommé, et provisionner le compte
Avec le prix issu de la simulation du backend et la règle de typeContratId communiquée par le backend, la création en groupe répond 409 Bad Request sans message.
Après un règlement réussi, Satim redirige vers site-test.amana.dz, le site vitrine, au lieu du lien profond de l'application. Vérifié sur des paiements réellement encaissés, sur les quatre produits.
Impact
Le client reste dans le navigateur, sur une page sans rapport avec sa souscription, et doit fermer la session à la main. Dernier obstacle entre un paiement qui marche et un paiement présentable. Bloque la validation client du sprint 2.
Priorité
P0
Responsable
Backend / Satim
Statut
Ouvert.
Échéance cible
Lot 1. À traiter en même temps : remplacer le marchand de test tiers par Amana
P0-N#6 (nouvelle fenêtre)‼P0 · critique◐Contourné côté appbloquant pour la mise en production
confirmPayment nie le paiement qu'il vient d'encaisser
GET /modePaiement/confirmPayment/{orderId}
Description
valid: false, tous champs nuls, sur un contrat passé à ENCAISSE avec police émise ; deux appels à plusieurs minutes d'intervalle, même réponse
Impact
Sans le contournement (relecture du contrat), tout paiement réussi s'afficherait en échec ; avec, jusqu'à 90 s avant l'écran de succès.
Envoi multipart pour le justificatif de résiliation
POST /avenant/resiliation
Description
AvenantDTO.justificatif est une chaîne base64 là où tous les autres téléversements sont multipart ; 500 sur contrat inconnu, divulguant un chemin interne
Impact
La demande part avec son motif et son commentaire, sans ses pièces jointes ; produire du base64 exigerait une nouvelle dépendance native côté mobile.
Exposer le référentiel « produit » de POST /claims
Description
produit doit correspondre à un référentiel « produit sinistre » qu'aucun endpoint mobile n'expose ; dix valeurs candidates (codes produit, identifiants, libellés) échouent sur Attempt to read property "produit_sinistre_id" on null. Piège associé : le validateur nomme date_naiss, date_sinistre, path_files alors que l'endpoint lit dateNaiss, dateSinistre, pieces
Impact
La déclaration de sinistre n'est jamais déposée ; l'écran affichait un succès sans rien envoyer. Le point le plus trompeur du périmètre. Bloque la validation client du sprint 3.
Priorité
P0
Responsable
Backend
Statut
Ouvert.
Échéance cible
Lot 2. Attendu : le référentiel ou la liste des valeurs acceptées, et des noms de champs alignés
P3.12#11 (nouvelle fenêtre)·P3 · ultérieure?Arbitrage attendubloquant pour la mise en production
Rattacher le chat du service client à un sinistre
GET /chat/history, POST /chat/send
Description
Aucun paramètre de dossier ; tous les messages du compte partagent un identifiant de conversation unique ; updatedAt déclaré mais absent.
Impact
La même conversation s'affiche sous chaque sinistre ; un message envoyé depuis un dossier apparaît sous tous les autres.
Priorité
P3 (sévérité bloquante)
Responsable
Produit / Backend (décision A3)
Statut
Arbitrage.
Échéance cible
Lot 3. Deux issues : un paramètre sinistreId (l'écran fonctionne alors tel quel), ou un fil unique déplacé vers le menu
Remboursements
P0-I#12 (nouvelle fenêtre)‼P0 · critique◐Contourné côté appbloquant pour la mise en production
Relever la limite de téléversement
tous les téléversements (POST /refunds, /nousContacter, profil santé)
Description
Plafond d'environ 1 Mio par fichier (valeur Spring par défaut) ; dépassement → 500 « Maximum upload size exceeded » sans nom de champ ni limite. Mesuré : 1 024 Kio accepté, 1 200 Kio refusé, deux fichiers de 600 Kio dans le même appel acceptés (plafond par fichier)
Impact
Une photo de justificatif prise avec un téléphone récent (3 à 5 Mo) ne passe pas : le cas nominal d'une fonction livrée. Atténué côté application (compression, refus expliqué)
Priorité
P0
Responsable
Backend
Statut
Contourné.
Échéance cible
Lot 2 (le plus urgent du lot). Attendu : max-file-size porté à 10 Mo, et un 413 ou un 422 nommant la pièce et la limite
Le champ portant l'acte est passé de type à codeActe côté serveur sans préavis ; l'ancien nom répond 404 « Acte non trouvé » ; la spécification documente le champ retiré et omet celui qui fonctionne.
Impact
Une déclaration codée d'après l'indication du backend échouait silencieusement. Un contrat consommé par une autre équipe ne peut pas changer sans annonce.
Publier le contrat de POST /members/addPieceJointe
Compléter profil santé (3 segments)
Description
Annoncé prêt par l'équipe backend ; la spécification déclare un corps multipart sans aucun champ ; toute requête répond 422 « The given data was invalid. » sans nommer de champ ; plus de 25 noms de parties testés, en fichier comme en texte ; une seule propriété identifiée (rib, String) par fuite d'erreur de conversion.
Impact
Le dépôt des pièces du profil santé n'est pas branchable ; les fichiers réellement sélectionnés n'ont nulle part où aller.
Priorité
P0
Responsable
Backend
Statut
Ouvert.
Échéance cible
Lot 2. Attendu : la liste des parties (un curl fonctionnel suffirait) ou un validateur qui nomme les champs manquants, comme le fait /refunds
GET /members/bulletinAdhesion répond 500 et ne répond plus au-delà de 12 s
Compléter profil santé (3 segments)
Impact
L'écran existe, rien à télécharger ; le message de succès de la validation d'adhérent réclame de renvoyer ce bulletin signé, étape impossible de bout en bout ; le profil reste non activé.
Rendre exploitable le devis de renouvellement Santé
POST /avenants/{contratId}/renouvellements/sante/devis — Contrat santé (Individuelle, Famille)
Description
409 « problem devis Renouvellement Sante » à tout payload : six contrats (individuel et famille, encaissés et non payés), les deux valeurs de modifyDevis, types 530 et 531, formule en libellé et en identifiant. Aucun champ nommé, aucune raison
Impact
Le renouvellement a une interface complète et rien à appeler ; seul reliquat de donnée simulée de l'application.
Priorité
P1
Responsable
Backend
Statut
Ouvert.
Dépendances
Décision A5.
Échéance cible
Lot 3. Attendu : un message exploitable, ou les préconditions par écrit (états renouvelables, fenêtre de renouvellement)
POST /avenants/{contratId}/adjonctions/sante/devis
Description
Le champ error est typé int alors que le service amont renvoie la chaîne "409 :" ; la passerelle plante sur sa propre gestion d'erreur et répond 500, masquant le refus métier réel.
primeNetteSansReduction: 16164.146341463415, primeNetteSansReductionMensuel: 1347.0121951219512 ; reduction: false alors que les variantes avec et sans réduction diffèrent
personne_id chaîne vs personneId entier ; {key, value} au lieu de {id, label} ; PoliceId en PascalCase ; code_reference / codeReference selon le résultat
Fournir un exemple de requête fonctionnelle par endpoint d'écriture
Description
Demande formelle restée sans réponse ; 41 opérations sur 107 déclarent required: [] alors que l'API valide strictement.
Impact
Cause racine du mode essai/erreur ; la mesure au meilleur rapport coût/effet du registre. Remplir les required rendrait le générateur de code utilisable et supprimerait 1 968 lignes maintenues à la main.
Le JWT d'un simple assuré porte 19 rôles dont des périmètres de back-office ; au moins un est inerte sur cette passerelle. Questions : les 18 autres sont-ils inertes partout ? Le compte de test est-il représentatif ?
Remplir les required de la spécification et corriger les cinq écarts actifs
Description
Par ordre de nocivité : POST /refunds (documente type, retiré ; omet codeActe) → PUT /members (questionnaire plat au lieu d'imbriqué) → GET /auth/me (5 champs au lieu de 18 + 4 objets) → /refunds et /claims (enveloppe retirée) → /simulation-voyage (type: string au lieu de JSON). Documenter GET /produits/{id}/detail. Déclarer les 4xx réellement renvoyés. Ouvrir /api-docs au compte mobile ou publier la spécification dans le dépôt.
Priorité
P1
Responsable
Backend
Statut
Ouvert.
Échéance cible
Lot 4
Prérequis côté client (hors outil de ticketing)
Prérequis côté client
Réf.
Besoin
Bloque
Responsable
CP-01
Compte Google Play Store
Publication Android
Amana
CP-02
Compte App Store (organisation, D-U-N-S, certificats)
Build iOS, TestFlight, publication
Amana
CP-03
Décision : authentification par téléphone (A1)
Sprint 1 — inscription
Amana
CP-04
Décision : plafond de la prime Voyage Famille (A2)
Sprint 3 — Voyage
Amana
CP-05
Décision : chat par sinistre ou fil unique (A3)
Sprint 3 — Sinistres
Produit
CP-06
Décision : périmètre Santé Groupe (A4)
Sprint 5
Amana
CP-07
Décision : renouvellements et avenants Santé (A5)
Sprint 5
Amana
CP-08
Cartes Dahabia de test
Sprint 2 — paiement Dahabia
Amana
CP-09
Compte de test jetable en pré-production
✅ Fourni : khaddoucheTest@amana.dz, déjà utilisé pour des paiements réels ; il reste à y rejouer la résiliation et le retrait d'ayant droit
Amana / Backend
CP-10
Accès à une boîte mail de test ou OTP fixe en pré-production
Recette des parcours inscription et mot de passe oublié
Amana / Backend
CP-11
URL de l'API de production
Build de production
Amana
CP-12
Instance Satim marchande au nom d'Amana
Paiement carte en production
Amana / Satim
CP-13
Validation de l'APK de référence (section 1.4), qui remplace le livrable précédent non validé
Clôture des sprints 1 et 2
Amana
3.3
Section 3.3 : Outil de ticketing
Le reporting ne présente que ce qui sert au suivi et à la priorisation ; le détail complet de chaque ticket est dans l’outil de ticketing.
Outil de ticketing AMANA-MOBILE
71 tickets, un par référence des sections 3.0 et 3.1, rattachés au projet de leur workflow. L’outil fait foi pour le statut.
Outil : https://amana-support.shiftin-demo.com/ — un ticket par ligne des sections 3.0 et 3.1 (55 demandes du registre plus les constats A9#1(ticket dans l’outil de ticketing, nouvelle fenêtre) à A24#70(ticket dans l’outil de ticketing, nouvelle fenêtre) et les questions Q1-Q9#71(ticket dans l’outil de ticketing, nouvelle fenêtre)), rattaché au projet correspondant à la clé du workflow (par exemple paiement-cib, sinistres, sante-individuelle-completer-profil-sante), titre préfixé par la référence stable. Chaque ticket porte l'endpoint, le comportement observé, le comportement attendu, l'impact et les références aux documents internes. Les accès nominatifs de l'équipe backend sont transmis séparément.
Le détail complet de chaque ticket est disponible dans l'outil de ticketing. Le présent reporting ne présente que les informations nécessaires au suivi et à la priorisation ; en cas d'écart entre les deux, l'outil fait foi pour le statut.
Annexes techniques exploitables directement : le journal des écarts de contrat (33 sections, avec les commandes curl de reproduction) docs/BACKEND_CHANGES_wire-remaining-app-flows.md ; le registre des anomalies et l'ordre de résorption API_Remaining_Tasks_Issues.md ; l'audit « API réelle vs spécification » audit-api-reel-vs-specification.md ; les questions sur les comptes migrés docs/backend-requests/QUESTIONS_AUTH_ATTACH.md.
Reproduction et surveillance : yarn api:probe (54 endpoints de lecture, sans écriture), yarn api:contract (comparaison au contrat figé, distinction entre rupture sur endpoint consommé et dérive sur endpoint non branché), scripts/capture-live-mutations.mts --dry-run --tier 4 (les 31 payloads réels de l'application, rien d'envoyé).
Dashboard de reporting : https://reporting-amana.164-132-116-139.nip.io/ (hôte provisoire jusqu'au rattachement du sous-domaine reporting-amana.octera.tech), sections Livraison APK, QA, Statut, Timeline, Planning ; filtres par sprint et par workflow dans l'URL ; export CSV et Excel.
Numéros de tickets : à reporter dans les colonnes « N° » des sections 3.0 et 3.1 et dans le dashboard au fur et à mesure de leur création.
Document confidentiel — OCTERA / SHIFTIN pour Amana Assurances. Source de données du dashboard de reporting du board. Toute mise à jour de ce document doit préserver la règle de datation : aucune date en dehors des sections 1.4 et 2.3.