1# Contre-audit de la passe du 14 septembre sur le document publié 2 3**Poste :** `audit-contradicteur` · **Date :** 14/09/2026 · **Régime :** lecture seule, aucun appel réseau, aucune clé, aucune modification des deux fichiers cibles. Écriture dans `analyse/` uniquement. 4 5**Cible :** `code/flexylead-audit-2026-09-14/index.html` et `README.md`, commit local `59205bc` (14/09 13:52 +0100), attaqué par le diff contre `355837e5`. 6 7**Corpus re-mesuré par moi, sans recopier un seul chiffre du document attaqué :** `code/flexylead-crm-2026-09-14/` (`ccbbaa07`) · `code/flexylead-crm-0908/` (`730a5e79`) · `code/apteva-server-2026-09-13/` · `contre-familles-2026-09-14.md` · `contre-face-a-face-github-2026-09-14.md` · les quatre `famille*-vs-deploye-2026-09-14.md` · `lecture-apteva-live-2026-09-13.md` · `lecture-vultr-live-2026-09-13.md` · `argent-agent-administration-2026-09-13.md` · `donnees-filtre-inoperant-2026-09-13.md` · `face-a-face-23-constats-2026-09-13.md` · `preuves-travail-2026-09-09.md` · pièces brutes du scratchpad de session. 8 9--- 10 11## 0. Le résultat en une phrase 12 13**La passe est bonne : elle n'a rehaussé aucun verdict des `contre-*` et elle a porté la plupart des bornes.** Ce qui cède n'est pas le fond, ce sont **cinq faits mal attribués**, **quatre chiffres**, **trois bornes escamotées** et **une contradiction interne de comptage** qui, publiée telle quelle, donnera la même prise que « le titre dit deux, le corps dit trois » la fois précédente. 14 15**Deux points ne doivent pas partir sur GitHub en l'état :** 16 171. **« le prestataire a synchronisé »** — le dépôt attribue `ccbbaa07` au compte `jeremy-flexylead <j.normand@flexylead.com>`, auteur **et** validateur. Aucun commit n'est signé Marco. `contre-familles` §0.3(b) l'avait relevé ; la passe ne l'a pas appliqué, et elle l'a écrit **trois fois**. 182. **La fenêtre des lectures en direct est fausse** : le README et le pied annoncent « entre 9 h 45 et 10 h 35 UTC ». Le balayage qui produit les 43 réservations, les 27 actions de la Vigie et les 13 reconfigurations a été fait **entre 14:15 et 14:25 UTC** (`lecture-apteva-live` §5.6 ; pièces `tcall_*.json`, `tres*.json`, horodatées 15:15–15:24 locales = 14:15–14:24 UTC). Un document qui fait de la provenance son argument central ne peut pas sous-déclarer sa propre empreinte. 19 20**Une bonne nouvelle contre mon propre poste :** `contre-face-a-face-github` §2.1(d) demandait de retirer « relevé deux jours de suite ». **Cette exigence est périmée** : les pièces `v_backups_0914.json`, `v_snapshots_0914.json`, `v_backup_schedule_0914.json` et `v_firewalls_0914.json` (14/09 10:55 locale) existent et donnent le même résultat. Le document a raison, mon contre-audit antérieur avait tort — sur quatre des sept éléments listés, pas sur les sept (§5.3 ci-dessous). 21 22--- 23 24## 1. Les 23 « État au 14 septembre », confrontés au verdict et à l'étiquette 25 26Rappel des marques de `contre-familles` §0.2 : **[A]** attesté par hachage (08/09) · **[I]** instantané du 14/09, **non attesté** · **[S]** `src/` seul, absent des paquets livrés. 27 28### 1.1 Tableau de concordance 29 30| n° | Verdict `contre-familles` §7 | « État au 14 septembre » publié | Concordance | 31|---|---|---|---| 32| 1 | PART. CORRIGÉ **[I]** · `FAIT` | « en partie corrigé, sur un instantané non attesté » | **tient** | 33| 2 | INTACT — et 3ᵉ copie de `prime_montant` identifiée | « intact — et un second cas du même défaut vient de s'ouvrir » (IVR) | **à borner** — §1.3 | 34| 3 | PART. CORRIGÉ **[I] serveur / [S] écran** | « corrigé dans la source de l'écran seulement… Côté serveur, le geste est le même qu'avant » | **à corriger** — §1.2 | 35| 4 | PART. CORRIGÉ [I] / AGGRAVÉ · `FAIT` chiffres, `SUGGÉRÉ` effet net | « en partie corrigé, en partie aggravé… Non attesté, et non mesuré en production » | **tient** | 36| 5 | INTACT | « intact » | **tient** | 37| 6 | TIENT [I] | « intact, et renforcé » | tient | 38| 7 | TIENT, verbatim, derrière un cache | « intact… désormais derrière un cache » | **tient** | 39| 8 | TIENT | « intact — et le garde-fou du côté centre a une faille de deux heures » | tient, borne mineure §1.5 | 40| 9 | TIENT | « intact, et renforcé un étage plus haut » | tient | 41| 10 | INTACT | « intact — et la documentation du service de transcription dit exactement pourquoi » | **§3 entier** | 42| 11 | À RÉÉCRIRE · `FAIT` absence de chemin, **`SUGGÉRÉ`** conclusion | « la question s'est resserrée… Le vrai défaut est ailleurs, et il est non confirmé » | **tient sur le niveau, casse sur le comptage** — §1.4 | 43| 12 | PART. CORRIGÉ [S] / NON VÉRIFIABLE serveur | « en partie corrigé à l'écran, non vérifiable côté serveur » | **tient** | 44| 13 | INTACT [I] ; aggravation · `SUGGÉRÉ` dormance | « intact, et aggravé… le second est probablement dormant, ce n'est pas établi » | **tient** | 45| 14 | INTACT | « intact » | tient | 46| 15 | **CORRIGÉ [I]** | « corrigé — les trois pièces sont dans le dossier de production… Sur un instantané non attesté » | **tient**, mais voir §5.1 (bandeau) | 47| 16 | PART. CORRIGÉ [I] — 2/4 · `FAIT` · `SUGGÉRÉ` ampleur | « en partie corrigé — deux compteurs sur quatre, sur un instantané non attesté » | **à borner sur l'ampleur** — §1.6 | 48| 17 | INTACT — et **la porte 1 vérifie bien** | « intact… nous l'avons relu ligne à ligne » | **à borner** — §1.7 | 49| 18 | INTACT, rayon étendu | « intact » | tient | 50| 19 | INTACT | « intact — et le problème s'est déplacé vers la notation » | **à borner** — §1.8 | 51| 20 | INTACT, aggravé | « intact, dans un contexte qui s'est aggravé » | tient | 52| 21 | AGGRAVÉ — 13 (08/09) → 16 (14/09), **à publier daté** | « avéré, et aggravé… treize le 8 septembre, seize le 14 » | **tient, et c'est bien fait** | 53| 22 | PART. CORRIGÉ **[I]** — identité oui, trace non | « en partie corrigé » — sans marque de portée | **à borner** — §1.9 | 54| 23 | INTACT | « intact. Les onze points d'écriture… sont inchangés » | **chiffre faux** — §1.10 | 55 56**Aucun rehaussement de niveau de certitude n'a été trouvé.** Les divergences ci-dessous sont des portées, des attributions et des nombres. 57 58### 1.2 Constat 3 — **à corriger.** La moitié serveur a été perdue, et elle était au crédit du prestataire 59 60Le document écrit : *« Côté serveur, le geste est le même qu'avant. »* 61 62C'est faux, et les deux contre-audits l'avaient dit. `famille1` §3.4, `FAIT` : `backend/flexylead-app-commercial-missed-calls-query.mjs:337` — `if (!centreId || !aliases.length) throw new Error('Commercial queue scope missing');` — **zéro occurrence dans le déployé du 08/09**, et les masquages vides de ce fichier passent de 3 à 2. `contre-face-a-face-github` §4.2 exigeait explicitement le rétablissement de « [I] serveur / [S] écran ». 63 64C'est une perte **contre** le prestataire : le document lui retire un correctif réellement passé en service. 65 66> **Phrase à substituer** (remplace « Côté serveur, le geste est le même qu'avant. ») : 67> **« Côté serveur, un masquage sur trois a bien été réparé** — la file d'attente du commercial refuse désormais de rendre une liste vide quand elle ne sait pas de quel centre il s'agit. Les deux autres subsistent, et les seize conversions d'erreur en résultat vide de la fonction unique n'ont pas bougé. *Écran : dans la source seulement. Serveur : sur un instantané non attesté.* » 68 69### 1.3 Constat 2 — **à borner.** Le document substitue une construction neuve au fait trouvé 70 71`contre-familles` §7 donne pour le constat 2 : « INTACT — et **3ᵉ copie de `prime_montant` identifiée** ». `famille1` §4 l'établit en trois points (ligne de vente `create-sales.mjs:753` ; table de règles `remuneration-query.mjs:2209` ; agrégat `SUM(prime_montant)` `:4000`), avec son rayon d'impact : *une correction portée sur l'une des trois n'atteindra pas les deux autres.* 72 73Le document remplace cela par un rapprochement **produit par l'agent principal** : le tableau de bord exclut l'IVR de son taux de décroché, la rémunération non, donc « deux chiffres justes, sous le même nom ». Les deux faits sont établis (`contre-familles` §4 : `hasAnswerEvidence` ne teste pas `handled_by`, ni en pilotage ni en rémunération). **Mais « sous le même nom » n'est établi nulle part** — aucune pièce ne montre que les deux grandeurs portent le même intitulé à l'écran — et la même phrase est déjà au constat 16, où elle a sa place. 74 75> **Phrase à substituer** (remplace l'« État au 14 septembre » du constat 2) : 76> **« État au 14 septembre : intact — et le rayon du défaut s'est élargi.** La case `prime_montant` existe en **trois exemplaires** dans la chaîne : figée sur la ligne de vente, relue dans la table des règles, et ré-agrégée en somme dans le pilotage. La même case sert en outre de repli au tarif du centre quand aucune règle ne s'applique. **Une correction portée sur l'un des trois n'atteindra pas les deux autres.** À l'écran, un avertissement nouveau signale les ventes qui n'ont *ni* règle *ni* instantané — ce qui ne dit toujours pas, dans les autres cas, lequel des deux on regarde. » 77 78### 1.4 Constat 11 — **le niveau tient, le comptage casse le texte** 79 80Le niveau est juste : `FAIT` sur l'absence de chemin d'écriture, **non confirmé** sur l'inatteignabilité — le document écrit « Le vrai défaut est ailleurs, et il est non confirmé » et « c'est une déduction, pas un fait ». C'est exactement la borne de `contre-familles` §3. **Rien à retrancher au fond.** 81 82Mais **le titre dit deux et le corps dit trois** — le piège exact de la version précédente : 83 84- Titre : « **Deux** moteurs de notation coexistent » 85- Corps : « Les **deux copies vivantes** du moteur… La **troisième copie** est toujours là » 86- Correctif : « la **troisième** copie est-elle un vestige ? » 87 88`contre-face-a-face-github` §4.4 avait nommé le piège : le document publié compte **deux versions** de moteur, dont l'une existe en **deux exemplaires** ; le travail du 14 compte **trois fichiers**. Deux unités de compte, présentées sans transition. Un lecteur non technique conclura que le titre est faux. 89 90> **Phrase à insérer** en tête de l'« État au 14 septembre » du constat 11, avant « Les deux copies vivantes » : 91> **« Un mot sur le décompte, pour éviter un malentendu : il y a bien deux *versions* du moteur, et trois *fichiers*.** La version à jour existe en deux exemplaires — un dans le dossier de production, un dans le texte de travail ; la version « avant correction des instructions » est le troisième fichier. » 92 93### 1.5 Constat 8 — borne mineure, à porter 94 95« entre minuit et deux heures du matin » : la source (`argent-agent-administration` §C13) précise **« 00:00–02:00 en heure d'été ; 00:00–01:00 en hiver »**. Le document publie la fenêtre d'été comme si elle valait toute l'année. 96 97> **Substitution :** « …entre minuit et deux heures du matin en été — une heure en hiver — une application datée du jour est acceptée et prend effet aussitôt. » 98 99### 1.6 Constat 16 — **à borner sur l'ampleur** 100 101`contre-familles` §4 : « **`FAIT` sur le mécanisme, `SUGGÉRÉ` sur l'ampleur** : bien posé. » Le document publie l'ampleur au présent de l'indicatif : 102 103> « toute la série historique de ces deux écrans baisse d'un coup, périodes closes comprises ; **le mois d'août consulté avant et après le 14 septembre ne donne pas le même taux.** » 104 105Le mécanisme impose la *direction* (une baisse), pas son *existence* : s'il n'y a aucun appel marqué « serveur vocal » en août, rien ne bouge. Le document n'a pas ouvert la base et le dit lui-même deux sections plus bas. La phrase affirme donc une mesure qu'il s'interdit. 106 107> **Phrase à substituer :** « …toute la série historique de ces deux écrans baisse d'un coup, périodes closes comprises. **Le mois d'août consulté avant et après le 14 septembre peut donc ne plus donner le même taux** — le mécanisme est établi dans le code, son ampleur ne l'est pas : elle dépend du nombre d'appels marqués, que seule la base dirait. » 108 109### 1.7 Constat 17 — **« nous l'avons relu ligne à ligne » n'est pas soutenu tel qu'un lecteur l'entend** 110 111Ce qui a été relu, c'est `verifyRingoverSignature` — **vingt-six lignes** (`:3070-3095`) plus son point d'appel (`:194`) — dans un fichier de **4 565** lignes. Le pied du même document écrit : « **Ce n'est pas une lecture intégrale du code.** » Un lecteur non technique rapprochera les deux. 112 113Le fond, lui, est plus solide que le document ne le dit : `contre-familles` §4 a établi **contre le rendu de famille** que cette porte vérifie correctement (HMAC-SHA256 puis SHA512, comparaison à temps constant, 401 avant tout traitement), et a **retiré** le comptage qui laissait croire le contraire. 114 115> **Phrase à substituer :** « La première porte, elle, vérifie bien : chiffrement d'authentification, comparaison à temps constant, refus avant tout traitement. **Nous avons relu cette vérification ligne à ligne — vingt-six lignes et son point d'appel — et une première mesure qui laissait croire l'inverse a été retirée.** » 116 117Les chiffres du constat sont justes et je les ai refaits : `ringover-call-events.go` passe de **4 440** à **4 565** lignes (+132/−7), zéro marqueur de signature aux deux dates. 118 119### 1.8 Constat 19 — **à borner.** Deux consentements différents sont rapprochés 120 121Le document écrit : *« Les consignes ajoutées au moteur ce jour-là érigent le consentement RGPD en critère bloquant… Le moteur doit donc juger un accord qu'aucune colonne ne stocke. »* 122 123Le fait est littéral et je l'ai vérifié — `backend/process-appel-db-only.mjs:1224` : *« LT002 (consentement RGPD) et LT006 (accord de recontact) sont bloquants… même si le score est élevé. »* Mais le moteur juge **l'enregistrement de l'appel**, pas une colonne : il n'a pas besoin de la case pour rendre son verdict. Et rien n'établit que le consentement du formulaire LeadByte (constat 19) et le consentement prononcé dans l'appel (LT002) soient le même objet. 124 125> **Phrase à substituer :** « …érigent le consentement RGPD en **critère bloquant** de la note de qualité, à signaler explicitement, même si la vente est signée. **Le logiciel juge donc, à l'oreille, un accord qu'il ne range dans aucune case** — et rien ne permet de rapprocher ce que le client a dit au téléphone de ce qu'il avait coché dans le formulaire. » 126 127### 1.9 Constat 22 — la marque de portée manque 128 129Verdict source : **PARTIELLEMENT CORRIGÉ [I]**. Le document écrit « en partie corrigé » sans la mention « sur un instantané non attesté » qu'il porte pour les constats 1, 2 (bis), 15 et 16. Vérifié par moi : `commercial-supervision-session.mjs` → 2 occurrences de l'adaptateur, `flexylead-app-commercial-bootstrap-query.mjs` → 3. Le fait tient ; c'est la portée qui manque. 130 131> **Substitution :** « **État au 14 septembre : en partie corrigé, sur un instantané non attesté.** » 132 133### 1.10 Constat 23 — **chiffre faux** 134 135« Les **onze** points d'écriture du verrou et l'unique remise à zéro sont inchangés. » 136 137Recompté par moi sur les deux arbres, `centre_lock_source:` suivi d'une valeur littérale : 138 139| origine | fichiers et lignes (14/09) | nombre | 140|---|---|---| 141| `sale` | `flexylead-create-sales.mjs:494` · `flexylead-reconcile-telephony-handoffs.mjs:600,625` · `flexylead-start-callback.mjs:1277` · `flexylead-sync-local-google.mjs:4463,4485,4492` | **7** | 142| `answered_call` | `ringover-call-events.go:1411,1541,1709` | **3** | 143| `commercial_comment` | `lead-qualification-update.mjs:857` | **1** | 144| `work_assignment` | `flexylead-reconcile-telephony-handoffs.mjs:630` | **1** | 145| **écritures** | | **12** | 146| remise à zéro (`released_ko`) | `lead-qualification-update.mjs:980` | **1** | 147 148**Douze, pas onze** — identique au 08/09 (10 en JavaScript, 3 en Go, dont une remise à zéro). L'affirmation « inchangés » est juste ; le nombre ne l'est pas. 149 150> **Substitution :** « **État au 14 septembre : intact.** Les **douze** points d'écriture du verrou et l'unique remise à zéro sont inchangés — au 14 septembre, sur le dossier de production. » 151 152*(Application directe du corollaire de `contre-familles` §6 : un constat dont l'énoncé est un nombre se périme ou se trompe ; le nombre doit porter sa date et son arbre.)* 153 154--- 155 156## 2. La section « En production » — les niveaux, un par un 157 158### 2.1 Ce qui tient sans réserve 159 160| affirmation | contrôle | 161|---|---| 162| « version 0.51.3, reconstruite le 13 septembre à 8 h 14 » | `lecture-apteva` §1 — build `2026-09-13T08:14:18Z`, point de lecture non authentifié. **Tient.** Ajouter « UTC » (§7.2). | 163| « Treize agents… cinq en production, huit en recette » | `lecture-apteva` §4 — 1, 3, 5, 167, 170 en PROD ; 4, 166, 168, 169, 171-174 en staging. **Tient.** | 164| « Un agent de production est configuré pour lire la base… Il n'a jamais tourné… *Capacité configurée, jamais réalisée* » | `lecture-apteva` §5.1 — 0 événement, 0 appel d'outil, aucun manifeste jamais émis ; méthode enseignée sur liste noire depuis le 10/07. **Tient, et l'étiquette est exacte.** | 165| « 63 programmes sur 100 » | Recompté : `backend/` = 101 entrées, dont **99 `.mjs` + 1 `.go` = 100 programmes** et un fichier de relevé ; `requireTrustedPrincipal` → **63** fichiers. **Le dénominateur est le bon.** | 166| « ni trois des quatre programmes lancés par les tâches automatiques » | Recompté : `flexylead-route-work-items.mjs` → 2 ; `flexylead-reconcile-call-routing-decisions.mjs`, `flexylead-sync-google-ads-costs.mjs`, `ringover-audio-reconcile.mjs` → 0. **Tient.** | 167| « la nouvelle grille n'existe nulle part dans la livraison… *Absence avérée ; présence en base non vérifiable* » | `grep -rn lead_telecom_v3` → 5 occurrences, toutes dans `backend/process-appel-db-only.mjs`. **Tient, et l'étiquette est exemplaire.** | 168| « Pour huit centres » | `famille3` §3 — huit centres (Reda, ATM, GRF Connect, CaptoPhone, Nabadji X, TINGIS, MGK, Mon Assistant Perso) sur neuf familles de dossiers. **Tient.** | 169| « son prédécesseur désactivait ce comportement à chacun de ses quinze appels » | `contre-familles` §2 — quinze sur quinze, dont quatre sur `ventes`. **Tient, et c'est la version dure et juste.** | 170| « 289 Gio le 13 septembre » | `vbw2.json` : 310 468 815 045 octets entrants = **289,1 Gio**. **Tient.** | 171| « un stockage d'objets… à Amsterdam, quand la machine est à Paris » | `lecture-vultr` §4 et §2. **Tient.** | 172| « l'hébergeur n'offre aucun journal d'actions » | `/v2/account/activity` → 404. **Tient.** | 173| « cent trente dollars par mois… aucune facture n'ayant encore été émise » | `lecture-vultr` §6 — projection 0,153 $/h × 730 h + stockage. **La borne « projection » est portée. Tient**, borne de devise au §2.4. | 174 175### 2.2 Ce qui doit être borné 176 177**(a) « quarante-trois réservations » — c'est un plancher, la source le dit en toutes lettres.** 178 179`lecture-apteva` §5.6, `FAIT` : *« **Plancher et non mesure** : la réponse est bornée à 1 000 événements et le paramètre `since` ne la prolonge pas vers le passé. »* L'agent 5 **a atteint la borne**. La fenêtre « entre le 9 et le 12 septembre » est donc elle-même un artefact du plafond : des réservations antérieures seraient invisibles. Le document publie « quarante-trois » et « *Avéré* », sans la borne. `contre-face-a-face-github` §5.3 avait demandé de reporter cette même borne ailleurs ; elle manque ici aussi. 180 181> **Puce à substituer :** 182> « **Ce qu'ils ont réellement écrit en production : au moins quarante-trois réservations**, prises par l'agent téléphonique entre le 9 et le 12 septembre. Sur tout l'historique lisible, **c'est la seule écriture métier d'une IA**. *Avéré ; le nombre est un plancher* — la plateforme ne rend que les mille derniers événements d'un agent, et cet agent a atteint la limite. » 183 184**(b) « l'opération de lecture la plus simple de cet outil échoue six fois sur six » — mauvais agent, mauvais projet, mauvais temps.** 185 186Les six échecs `functions_functions_list` sont ceux de **l'agent 169, en recette**, le **19/08 entre 09:00:13 et 09:00:24** — onze secondes, aucune tentative depuis (`lecture-apteva` §5.8). Le document les attribue à « **le même agent** », c'est-à-dire l'agent d'administration **de production** (170), et les écrit au présent (« *outil cassé* », étiqueté **Avéré**). La source classe la conclusion **`SUGGÉRÉ`** ; `contre-face-a-face-github` §5.3 l'avait déjà relevé. L'explication innocente — indisponibilité passagère ce matin-là — n'est pas éliminée. 187 188Cette même formule est reprise **deux autres fois** : au constat 01 (« l'outil qui les listerait échoue six fois sur six ») et à la demande n°1 (« l'outil qui les listerait échoue »). Les trois doivent bouger ensemble. 189 190> **Puce à substituer :** 191> « **Le même agent voit des outils pour créer, réécrire, déployer et supprimer les programmes du serveur**, dans chacun de ses onze manifestes. **Aucun n'a jamais été appelé, sur toute la fenêtre lisible.** La seule tentative de lecture par cette voie, sur l'agent jumeau de recette, a échoué six fois en onze secondes, le 19 août — et n'a jamais été retentée. *Capacité avérée, jamais exercée ; voie de lecture vraisemblablement inutilisable, non démontré.* » 192> 193> **Au constat 01, substituer :** « …la clé remise est en lecture seule et ne voit ni les programmes ni leurs versions, et **la seule voie d'outil qui les listerait a échoué à ses six tentatives, un matin d'août, et n'a jamais été rejouée**. » 194> 195> **À la demande n°1, substituer :** « …la clé en lecture seule ne voit pas les programmes, et **la voie d'outil qui les listerait n'a jamais fonctionné les seules fois où elle a été essayée**. » 196 197**(c) « Sur le projet de recette, les modèles sont en panne depuis le 8 septembre » — faux pour deux agents sur quatre.** 198 199`lecture-apteva` §6.1, `FAIT` : *« Les agents 166 et 169, en Staging et sur google, **réussissent leurs appels**. L'hypothèse d'un identifiant Google invalide sur ce projet est donc **écartée**. »* Ce qui tombe, ce sont les agents dont les outils portent le motif refusé par Gemini — 168 (zéro appel abouti) et 4. « Les modèles sont en panne » sur tout le projet est une généralisation que la source **écarte explicitement**. 200 201> **Puce à substituer (premier membre) :** 202> « **Sur le projet de recette, deux agents sur quatre n'obtiennent plus une seule réponse de modèle depuis le 8 septembre** : le fournisseur principal refuse le format de leurs outils — un défaut de la plateforme —, le fournisseur de secours refuse la clé, et aucune reprise n'est tentée. Quatre dates. Les deux autres agents de recette, eux, fonctionnent : ce n'est pas la clé du projet qui est en cause. » 203 204**(d) « aucun lecteur » — à retirer, c'est une affirmation sur ce que des personnes ont vu.** 205 206`contre-face-a-face-github` §5.5 : *« "sans qu'aucun lecteur ne l'ait vue" est une affirmation sur ce que des personnes ont vu ou non, invérifiable. → "sans qu'aucune alerte ne se déclenche" — ce qui est établi, et qui est le vrai point. »* La passe a reproduit la formule (« quatre dates, **aucun lecteur** »), et une seconde fois au « problème de fond » n°2 (« n'a été vue **par personne** »). 207 208> **Substitution, aux deux endroits :** « quatre dates, **et aucune alerte** » · « une clé de fournisseur en panne depuis le 8 septembre **sans qu'aucune alerte ne se déclenche**. » 209 210**(e) « Depuis le 8 septembre, aucun manifeste ne lui présente plus ces outils. »** 211 212La source dit **« depuis au moins le 08/09 »**, et le niveau est `SUGGÉRÉ` : les onze manifestes disponibles ne remontent pas plus loin. Le document transforme une limite d'observation en date de changement. 213 214> **Substitution :** « Sur les onze manifestes disponibles, du 8 au 13 septembre, **aucun ne lui présente ces outils** — il les lui présentait le 19 août, puisqu'ils ont servi. » 215 216**(f) « Le transfert était terminé le 14. »** 217 218Le relevé du 14 est de **08:27 UTC**, soit un tiers de journée : 0,45 Gio entrants, 0,59 Gio sortants (`vbw2.json`). `contre-face-a-face-github` §6 avait fixé la formule. 219 220> **Substitution :** « **Au matin du 14, le gros du transfert était derrière** : moins d'un gigaoctet sur la journée entamée. » 221 222**(g) « six jours après sa création » — la machine a été créée le 8 septembre à 17 h 11 ; le relevé le plus tardif est du 14 au matin. Cinq jours et dix-sept heures.** 223 224> **Substitution :** « **Sur cette machine, relevée le 13 puis le 14 septembre** : aucun instantané, aucune sauvegarde, calendrier de sauvegarde désactivé, aucun pare-feu de l'hébergeur… » 225 226**(h) « Relevé deux jours de suite, résultat identique » — vrai pour quatre des sept éléments listés.** 227 228Les pièces du 14/09 (10:55 locale) couvrent **instantanés, sauvegardes, calendrier et pare-feu**. Les clés d'accès (`vssh.json`), le mode `root` et le port 22 n'ont été relevés **qu'une fois**, le 13 — et le port 22 vient d'un sondage extérieur, pas d'une lecture du compte. 229 230> **Substitution :** « …**Les quatre premiers relevés deux jours de suite, résultat identique ; les trois autres une seule fois, le 13.** » 231 232**(i) « deux secrets sont écrits en clair dans le code ».** 233 234Recompté : **une seule** clé de service en clair dans le dossier de production, écrite **deux fois** — `backend/flexylead-sync.mjs:31` et `backend/process-appel.mjs:25`, valeur identique. Le second secret relevé au dossier (`contre-familles` §8.6) est un compte de recette avec son mot de passe, et il est dans un script de test **hors** du dossier de production. 235 236> **Substitution :** « Et **une clé de service est écrite en clair dans deux programmes du dossier de production**, un compte de recette avec son mot de passe dans un script d'essai — *consignés, sans relance, conformément à l'arbitrage du 2 septembre.* » 237 238**(j) « la plateforme refuse le remplacement intégral d'une instruction ».** 239 240La source cite le message exact : *« full directive replacement is disabled **for structured Markdown directives** »*. Le garde-fou est conditionné au format. La phrase apparaît **deux fois** (section « Ce qui tient » et section « En production »). 241 242> **Substitution, aux deux endroits :** « **La plateforme refuse le remplacement intégral d'une instruction** — au moins pour les instructions au format structuré, qui sont celles employées ici. » 243 244### 2.3 Ce qui doit être retiré ou réattribué 245 246**« le prestataire a synchronisé pour la première fois le dossier de production » — à retirer sous cette forme.** 247 248`contre-familles` §0.3(b), `FAIT` : *« Tous les commits, y compris `ccbbaa07`, sont écrits **et** validés par `jeremy-flexylead <j.normand@flexylead.com>`. Aucun n'est signé Marco. La chaîne d'attribution vers le prestataire n'est pas établie par le dépôt. »* Re-vérifié par moi sur les trois commits. 249 250La formule apparaît **trois fois** : intro de « En production », README (« première synchronisation de production par le prestataire »), et implicitement au bandeau. C'est l'objection la plus facile à formuler de tout le document, et elle est gratuite : le fait n'a pas besoin de l'attribution. 251 252> **Substitution, intro de « En production » :** « Le 14, **le dossier de production a été synchronisé pour la première fois** depuis la livraison. » 253> **Substitution, README :** « La version 3 — **première synchronisation du dossier de production depuis la livraison, publiée sous le compte FLEXYLEAD** — sert à dire l'**état** de chaque constat au 14 septembre… » 254 255**Le titre de section, à ajuster.** « Ce que la production a montré, les 13 et 14 septembre » coiffe trois sous-parties, dont la troisième — « Le geste du 14 septembre, lu de près » — n'est pas une lecture de production mais **une lecture de dépôt**. L'intro promet par ailleurs : « Chaque fait ci-dessous a été contredit avant d'être écrit ; ceux qui ne le sont qu'à moitié le disent » — promesse non tenue aux points (a), (b) et (c) ci-dessus. 256 257> **Substitution du titre :** « **Ce que nous avons vu hors du code, les 13 et 14 septembre** ». 258 259**La note de retrait, à réattribuer.** « Une phrase de ce document est retirée **par ces lectures** — une seule » et « **C'est la seule affirmation de ce document que les lectures en direct ont invalidée** ». Le retrait vient de la lecture de `backend/flexylead-api-gateway-bootstrap.mjs` — un fichier du dépôt, pas une lecture en direct. Et il y a **deux** retraits nouveaux, pas un (§4). 260 261> **Substitution :** « **C'est la seule affirmation de ce document que la synchronisation du 14 septembre invalide.** » 262 263--- 264 265## 3. Le constat 10 — le paragraphe Deepgram 266 267**J'ai vérifié (a), (c), (d) et (e) sur les fichiers. Les quatre tiennent.** 268 269| # | affirmation | contrôle | 270|---|---|---| 271| **(a)** | les étiquettes de locuteur vivent dans la liste des mots que la plateforme retire | **VRAI.** `code/apteva-server-2026-09-13/integrations-catalog/deepgram.json`, outil `listen`, `response_omit` = `["metadata.sha256", "metadata.model_info", "metadata.request_id", "metadata.transaction_key", "results.channels[].alternatives[].words"]`. Et le retrait s'applique bien **à tous les appelants, pas seulement aux agents** : il est exécuté dans `connections.go:2586-2591`, à l'intérieur de `executeIntegrationToolOnce`, chemin unique de tout appel d'intégration. J'ai cherché la sortie de secours : il n'y en a pas. | 272| **(c)** | `multichannel` est absent du schéma de l'outil `listen` | **VRAI.** Les dix-neuf propriétés de `listen` sont : `audio, callback, detect_language, diarize, filler_words, intents, keywords, language, model, paragraphs, profanity_filter, punctuate, redact, sentiment, smart_format, summarize, topics, url, utterances`. **Zéro occurrence de `multichannel` dans tout le fichier.** | 273| **(d)** | Ringover demande `paragraphs` sans `diarize` ; Twilio demande `diarize` sans `utterances` | **VRAI, aux lignes près.** `backend/process-appel-db-only.mjs:951-957` → `model: 'nova-3', smart_format, punctuate, paragraphs` — **pas de `diarize`**. `backend/flexylead-transcribe-telephony-recording.mjs:201-207` → `model: "nova-3", smart_format, punctuate, diarize: true` — **pas d'`utterances`**. Les deux références de ligne du document sont exactes. | 274| **(e)** | aucun programme ne demande un enregistrement à deux canaux | **VRAI.** `grep -rn multichannel` sur l'arbre entier → **zéro**. `stereo`, `dual_channel`, `two_channel`, `channels=2` → **zéro**. | 275 276**Sur (b), les faits de documentation tels que fournis :** le paragraphe **reste dedans sur quatre points et les dépasse sur deux.** 277 278**Ce qui reste dedans :** « chaque mot reçoit un numéro de locuteur — 0, 1, 2 — et un degré de confiance » ✓ · « Il ne dit jamais qui est qui : aucune notion de vendeur ni de client » ✓ · « l'option qui les ferait survivre par phrase (`utterances`) » ✓ — `results.utterances` n'est pas dans la liste des retraits, donc la sortie par phrase survivrait ✓ · « il restera à décider, dans le programme, lequel des numéros est le commercial » ✓. 279 280**Ce qui dépasse :** 281 2821. **« La méthode que Deepgram recommande pour un appel téléphonique est autre : un enregistrement stéréo, une voix par canal. »** Le fait fourni est : *`multichannel` est **recommandé pour un appel stéréo à une voix par canal**, inutile sur du mono.* La recommandation est **conditionnée à ce qu'on dispose déjà d'un enregistrement stéréo** ; elle ne prescrit pas de produire du stéréo. Le document inverse le conditionnel et fait dire à Deepgram une consigne d'enregistrement qu'il ne donne pas. **C'est le seul endroit du document où une source extérieure est citée au-delà de ce qu'elle dit.** 283 284> **Substitution :** « **Il existe une voie plus sûre, et elle n'est pas ouverte ici** : quand l'enregistrement est en deux pistes, une par interlocuteur, Deepgram transcrit chaque piste séparément et la séparation devient certaine. **Cette option n'existe pas dans l'intégration que la plateforme expose**, et aucun programme ne demande aux opérateurs un enregistrement en deux canaux — nous avons cherché les deux, il n'y a rien. » 285 2862. **« seulement des numéros attribués dans l'ordre d'apparition ».** L'ordre d'attribution ne fait pas partie des faits fournis. À retirer — il n'ajoute rien et il est invérifiable ici. 287 288> **Substitution :** « …aucune notion de vendeur ni de client, **seulement des numéros**, et c'est au programme de deviner lequel est le commercial. » 289 290**Une réserve que le paragraphe ne porte pas, et qu'il devrait.** Sur la chaîne de l'agent vocal, le programme lit `results.channels[0].alternatives[0].transcript` (`flexylead-transcribe-telephony-recording.mjs:213-214`). **Même si la plateforme ne retirait rien, il ne lirait pas les locuteurs** : il ne demande que le texte. Le retrait par la plateforme est réel, mais il n'est pas la seule cause du résultat. Le dire renforce le constat plutôt que de l'affaiblir, et coupe une objection. 291 292> **Phrase à ajouter, après « que la plateforme retire de la réponse avant de la rendre au programme » :** « **— et quand bien même elle ne les retirerait pas, le programme ne lit que le bloc de texte, jamais le détail mot à mot.** Deux causes, un seul résultat. » 293 294--- 295 296## 4. Les retraits et les « corrections de forme » 297 298### 4.1 Sont-ce bien des retraits ? **Oui pour les deux.** 299 300- **« rien n'installe ».** `backend/flexylead-api-gateway-bootstrap.mjs:4-24`, vérifié par moi : `RETIRED_ROUTING_JOBS` annule `flexylead-dispatch-leadbyte-prospects` ; `CANONICAL_JOBS` planifie `flexylead-process-ai-ready-appels` (60 s → `process-appel-db-only`) et `flexylead-reconcile-sale-revenue` (300 s). **L'affirmation publiée était fausse, le retrait est justifié.** Et le document a raison de souligner que ce fichier est le seul dont l'empreinte tienne encore. 301- **« l'une d'elles crée la colonne d'août ».** `preuves-travail-2026-09-09.md:128`, vérifié : la colonne `centre.effective_call_min_talk_seconds` n'est créée par **aucune** des treize fonctions ; elle l'est par `scripts/ensure-local-partners-schema.mjs`, qui refuse de tourner ailleurs qu'en local. **Retrait justifié.** 302 303### 4.2 Mais la datation de l'un des deux est fausse 304 305L'introduction écrit : « **les lectures des 13 et 14 septembre en ont retiré deux de plus** ». Le retrait de la colonne d'août a été établi le **9 septembre** (`preuves-travail-2026-09-09.md:128`, `liste-23-constats-reconstituee-2026-09-13.md:119`), exactement comme les deux « corrections de forme » que le document date correctement (« relevées le 9 septembre et appliquées seulement le 14 »). Il y a donc **deux poids, deux mesures** dans le même paragraphe. 306 307> **Substitution de l'introduction :** « Une première version de ce document a été établie le 7 septembre. La livraison du lendemain en a démenti sept affirmations ; **la relecture du 14 septembre en retire deux de plus — l'une établie par la synchronisation du jour, l'autre relevée dès le 9 septembre et appliquée seulement maintenant.** Nous les listons plutôt que de les effacer. » 308 309### 4.3 « Corrections de forme » — le mot est faux pour l'une des deux 310 311« Quatre endroits, pas deux lignes » change l'estimation de l'effort d'un facteur deux et touche une fonction supplémentaire, **côté centre** (`monthlyFormulaRuleFor`), qui n'était pas dans le rayon annoncé. Ce n'est pas de la forme. « Rien à compter » est en revanche bien une correction de consigne. 312 313> **Substitution :** « **Deux corrections relevées le 9 septembre et appliquées seulement le 14.** La première touche le rayon d'un remède : le défaut des règles de prime supprimées vit à **quatre endroits, pas dans deux lignes** — dont un côté centre, que nous n'avions pas nommé. La seconde est une consigne : il n'y a **rien à compter d'abord** sur le consentement, aucune fiche n'en a, par construction. » 314 315### 4.4 Le compte des retraits se contredit en quatre endroits 316 317| endroit | ce qui est écrit | compte | 318|---|---|---| 319| Chapeau | « **une affirmation supplémentaire** est retirée » | 1 | 320| « En production », note | « Une phrase… est retirée par ces lectures — **une seule** » | 1 | 321| « Ce que nous avons retiré » | « en ont retiré **deux** de plus » + deux entrées à la liste | 2 | 322| README | « **deux** affirmations hors constats ont été retirées » | 2 | 323 324C'est la reprise exacte du défaut relevé la fois précédente. **À réconcilier avant publication.** 325 326> **Substitution au chapeau :** « …et **deux affirmations supplémentaires sont retirées**. » 327> **Substitution à la note :** voir §2.3 — « la seule affirmation que la synchronisation du 14 septembre invalide ». 328 329--- 330 331## 5. Le bandeau, la provenance, le pied 332 333### 5.1 Le bandeau — deux défauts, dont un de lisibilité 334 335> « 23 constats · 10 bloquants / 4 familles · **aucun invalidé, aucun corrigé au sens plein** / **1 en service, 3 en partie** — sur un instantané non attesté » 336 337- **« aucun corrigé au sens plein » est repris fidèlement de `contre-familles` §7.** Mais un lecteur non technique le rapprochera du constat 15, dont l'état dit « **corrigé** » et « le seul dont le remède soit **entièrement en service** ». Le « sens plein » de `contre-familles` veut dire « attesté » ; le bandeau ne le dit pas. 338- **« 1 en service, 3 en partie » ne dit pas de quoi, et il en manque un.** Le corps du document, au constat 02, compte correctement **cinq** constats dont le correctif était écrit : un en service (15), trois en partie (1, 4, 16), **un à l'écran seulement (3)**. Le bandeau laisse tomber le cinquième. `contre-face-a-face-github` §4.6 avait prévenu : le bandeau ne parlait pas de constats mais de **23 correctifs sur 18 programmes**, et **ce compte-là n'a jamais été refait**. 339 340> **Substitution du bandeau :** « 23 constats · 10 bloquants<br />4 familles · aucun invalidé, **aucun corrigé de façon attestée**<br />**Sur les 5 constats dont le correctif était écrit : 1 en service, 3 en partie, 1 à l'écran seulement — sur un instantané non attesté** » 341 342### 5.2 La provenance — exacte, sauf un mot et une omission 343 344- **« 295 fichiers »** — `git show --numstat ccbbaa07` → **295**. ✓ 345- **« 17 programmes de serveur nouveaux »** — comparé les deux `backend/` : **17** entrants, zéro sortant. ✓ (dont huit `tmp-*` et un `debug-*`, ce que le document dit ailleurs.) 346- **« 63 programmes sur 100 »** ✓ (§2.1). 347- **« 14 septembre 2026 à 08 h 46 (heure de Barcelone) »** — `ccbbaa07`, `Mon Sep 14 08:46:08 2026 +0200`. ✓ 348- **« 10 sur 10 concordaient le 8, 1 sur 10 le 14 »** — repris de `contre-familles` §0.1. ✓ Et la phrase « cela se vérifie sans la parole de personne » est **exactement** la borne que `contre-familles` §10.1 se donnait à elle-même : le relevé et l'arbre sont cohérents, ce qui n'établit pas que l'arbre vienne de la production. **Le document ne franchit pas ce pas. Très bien.** 349 350**Un mot à corriger :** *« Mais le texte de travail n'a pas changé d'un octet »*. Vrai pour les 147 programmes de `functions/` (`diff -rq` → aucune sortie). **Faux pour l'écran** : 146 fichiers de `src/` ont changé, et le constat 3 du même document le dit (« Les onze données facultatives ont disparu du texte de l'écran »). Un lecteur non technique ne distinguera pas « texte de travail » de « texte de l'écran ». 351 352> **Substitution :** « Mais **le texte de travail du serveur n'a pas changé d'un octet** — cent quarante-sept programmes, tous identiques — la phrase qui présentait le dossier de production comme tel a disparu du mode d'emploi, et… » 353 354**Une omission qui va coûter :** `package.json` passe de **1.1.20 à 1.1.36**, et l'ossature de l'écran de React 18 à React 19, **avec des paquets compilés inchangés**. Le document dit ailleurs « Le numéro de version de l'application, lui, n'a pas bougé : 1.1.20 » (version 2) et « onze constructions différentes de l'interface, de la 1.1.12 à la 1.1.20 ». Ces deux phrases sont désormais périmées, et le fait neuf est **plus démonstratif** que celui que le document emploie au constat 3 : des paquets compatibles React 18 ne peuvent pas être ceux d'une source React 19. `contre-familles` §8.4 l'avait signalé comme angle mort ; il l'est resté. 355 356> **Phrase à ajouter à la provenance de la troisième version :** « **Le numéro de version de l'application, lui, saute de 1.1.20 à 1.1.36 et l'ossature de l'écran change de génération — sans qu'aucun paquet compilé ne soit refait.** Les paquets livrés ne peuvent donc pas être ceux de la source livrée. » 357 358### 5.3 Le pied — le paragraphe « Chiffres » est le meilleur ajout du document 359 360> « Tout nombre de ce document vaut à la date de l'instantané où il a été mesuré, et cette date est dite. Un chiffre juste le 8 peut être faux le 14 sans que personne ne se soit trompé : treize fonctions altérant le schéma sont devenues seize. » 361 362C'est la règle de `contre-familles` §6 rendue lisible, avec son illustration exacte. **Rien à retrancher.** Une seule remarque : la promesse « et cette date est dite » n'est pas tenue partout — les « douze/onze points d'écriture » du constat 23, les « quatre-vingt-trois en service » du point 01 et les « 4 565 lignes » du constat 17 sont publiés sans date ni arbre. 363 364> **Substitution :** « …et **cette date est dite chaque fois qu'un chiffre peut avoir bougé**. » 365 366### 5.4 Le pied — la fenêtre des lectures est fausse 367 368« Lectures en direct du 13 septembre **entre 9 h 45 et 10 h 35**, puis du 14. » Voir §0. Deux campagnes, pas une. 369 370> **Substitution (pied et README) :** « Lectures en direct du 13 septembre, **en deux séries — de 9 h 45 à 10 h 35, puis de 14 h 15 à 14 h 25 (temps universel)** — puis un relevé de l'hébergeur le 14 au matin. » 371 372--- 373 374## 6. Le README 375 376| ligne | contrôle | 377|---|---| 378| Ligne « version 3 », référence `ccbbaa07870e0f786729003dd6f8862e4bcc8256`, 14/09 08 h 46 | **exacte**, vérifiée sur `git log`. | 379| Colonne « signature de contrôle de l'ensemble » = « — (non attestée) » | **à corriger.** Les deux premières lignes portent une empreinte **que nous avons calculée nous-mêmes** (`f68816ff`, `11bf212e`). Rien n'empêchait d'en calculer une pour la troisième. Ce que le document veut dire, c'est qu'**aucune attestation de la plateforme** ne la couvre — ce qui est une autre notion, et elle a sa place en note, pas dans cette colonne. → mettre l'empreinte calculée, et déplacer « non attestée » en note de tableau. | 380| « Les vingt-trois constats sont établis sur les versions 1 et 2 » | **exact et bien dit.** | 381| « l'empreinte de contrôle livrée le 8 septembre pour dix programmes n'en couvre plus qu'un » | **exact.** | 382| « première synchronisation de production **par le prestataire** » | **à retirer** — §2.3. | 383| « entre 9 h 45 et 10 h 35 UTC » | **faux** — §5.4. | 384| « Le 14, l'état de l'hébergeur a été relevé une seconde fois » | **exact**, et soutenu par quatre pièces (`v_backups_0914.json`, `v_snapshots_0914.json`, `v_backup_schedule_0914.json`, `v_firewalls_0914.json`). | 385| « elles n'ouvrent ni les tables ni les programmes du CRM » | **exact** (`lecture-apteva` §0 : `/apps/*` hors liste blanche). | 386| Régime : « depuis le 13, des lectures seulement, avec des clés remises pour cela, chaque appel laissant une trace assumée » | **exact, et c'est la bonne façon de le dire.** | 387| État : « Aucun des vingt-trois constats n'est invalidé ; aucun n'est corrigé au sens plein » | **repris fidèlement** de `contre-familles` §7. Même réserve de lisibilité qu'au bandeau (§5.1). | 388| État : « deux affirmations hors constats ont été retirées » | **exact — et c'est le chapeau du HTML qui doit s'aligner sur le README**, pas l'inverse (§4.4). | 389 390--- 391 392## 7. Lisibilité — ce qu'un lecteur non technique ne pourra pas suivre 393 3941. **« deux » / « trois » au constat 11.** Le piège de la version précédente, reproduit. Corrigé au §1.4. 3952. **Le compte des retraits, contradictoire en quatre endroits.** §4.4. 3963. **« texte de travail » désigne deux objets différents** dans le même document : les programmes du serveur (provenance) et, par contraste, « texte de l'écran » (constat 3). Un lecteur lira « n'a pas changé d'un octet » et, six écrans plus bas, « ont disparu du texte de l'écran ». §5.2. 3974. **« aucun corrigé au sens plein » (bandeau) contre « corrigé » (constat 15).** §5.1. 3985. **« l'identité de celui qui appelle n'est plus *jamais* déduite de ce que l'écran déclare »** est écrit deux fois, immédiatement après « soixante-trois programmes sur cent ». Dans la section « En production », la phrase suivante rattrape (« le programme d'administration ne l'a pas reçu ») ; dans « Ce qui tient », **rien ne rattrape**. → substituer, dans « Ce qui tient » : « …**l'identité de celui qui appelle n'y est plus déduite de ce que l'écran déclare**. Trente-sept ne l'ont pas reçu, dont celui qui écrit les barèmes. » 3996. **« 1 en service, 3 en partie » sans unité.** §5.1. 4007. **Le titre « Ce que la production a montré » coiffe une lecture de dépôt.** §2.3. 4018. **« 8 h 14 » sans fuseau**, dans une section où le README a pris soin de dire « UTC ». → « 8 h 14, temps universel ». 4029. **« mille premiers caractères »** : la plateforme tronque à **mille octets** (`telemetry.go:619`), ce que la démonstration du dossier montre (2 759 octets ramenés à 1 003). Sans importance métier, mais c'est une substitution gratuite. → « les mille premiers octets ». 403 404--- 405 406## 8. Deux chiffrages à border, hors du périmètre demandé mais dans le diff 407 408**(a) « de l'ordre de cinquante mille euros par an et par centre » (section « Le contrat »).** 409 410Le paragraphe s'annonce « toutes avérées dans le code ». Les 68 € et les 90 € le sont (`argent-agent-administration` §174, recalcul sur les indicateurs du 03/09). **Le total annuel ne l'est pas** : il suppose un volume de contrats mensuel que le document ne donne pas et qu'il s'interdit par ailleurs (« Aucun montant, aucun décompte de ce document n'est tiré de la base de production »). 411 412> **Substitution :** « …**vingt-deux euros de plus par contrat** — sur un centre au volume du seul que nous ayons observé, de l'ordre de cinquante mille euros par an ; le volume réel n'est pas dans notre périmètre. » 413 414**(b) Le même paragraphe omet l'explication la plus favorable, et Marco la donnera.** 415 416`argent-agent-administration` §173, `FAIT` : *« `economicsApply` est le **seul** outil d'écriture du fichier à ne pas utiliser `forwardableActor(actor)` (`:546` contre dix autres), ce qui fait échouer la cible dès la lecture… **Le barème n'est pas protégé par le garde-fou, il est peut-être protégé par un défaut.** »* Le document ne le dit pas. C'est pourtant ce qui rend le « jamais écrit » cohérent, et ce qui transforme une accusation en avertissement : **une seule ligne corrigée armerait tout le chemin.** 417 418> **Phrase à ajouter :** « **Et il se peut qu'il ne fonctionne pas** : une ligne de ce programme diffère de ses dix voisines d'une façon qui ferait échouer l'écriture avant même de commencer. Si c'est le cas, le barème n'est pas protégé par un garde-fou — il est protégé par une panne, **qu'une seule ligne corrigée ferait disparaître.** » 419 420--- 421 422## 9. Angles morts — ce que cette passe n'a pas regardé 423 4241. **Le saut React 18 → 19 et 1.1.20 → 1.1.36 avec paquets inchangés.** §5.2. C'est l'argument le plus court et le plus imparable sur « les paquets livrés ne sont pas ceux de la source », et il n'est nulle part. 4252. **Le recompte des 23 correctifs.** Le bandeau d'origine reposait dessus ; il a été retiré du bandeau sans être refait. `contre-face-a-face-github` §4.6 et angle mort 3. 4263. **« Onze publications sur la plateforme »**, chiffre du 09/09, jamais réactualisé, alors que le compte côté CRM l'a été le 14 — dans une phrase que la passe a précisément réécrite. 4274. **L'écart résiduel de `flexylead-start-callback.mjs`** (130 lignes pour un adaptateur de ~49). Le constat 15 est celui que le document déclare « corrigé » ; l'écart non caractérisé est dans le fichier qui le porte. `contre-familles` §8.7. 4285. **`appels` laissée au défaut `deleteMissing = true`**, comme `ventes`. Le document ne parle que des ventes. La table `appels` porte le dénominateur du constat 6 et le rattachement audio du constat 20. `contre-familles` §8.8. 4296. **La cause du démarrage des quatre agents de production le 13/09 à 09:47:39**, 39 secondes après notre premier appel. La question est ouverte au dossier, la réponse la plus économe est « une matinée de migration » — le document ne mentionne ni l'un ni l'autre. Prudent, mais Marco peut le sortir comme un reproche : *« vos lectures ont redémarré ma production. »* Mieux vaut la phrase préparée que le silence. 430 431--- 432 433## 10. Objections que Marco pourra formuler, et la réponse préparée 434 435| # | objection | réponse | 436|---|---|---| 437| 1 | « Vous écrivez partout que *j'ai* synchronisé. Montrez-moi un commit à mon nom. » | **Accordé, et corrigé avant lui.** Les trois commits sont écrits et validés par `jeremy-flexylead <j.normand@flexylead.com>`. Le document ne dit plus qui a agi ; il dit ce qui a changé, et que personne n'a réémis le relevé qui le prouverait. | 438| 2 | « Votre outil de gestion de fonctions n'est pas cassé : il a échoué six fois un matin d'août, en recette, il y a un mois. » | **Accordé, et borné avant lui.** Six échecs, onze secondes, le 19 août, sur l'agent de recette — jamais retenté depuis. Nous n'écrivons plus « cassé » : nous écrivons que la seule voie de lecture qui dirait quelles fonctions tournent n'a jamais fonctionné les seules fois où elle a été essayée. **Donne l'export du 14 et le sujet est clos en une minute.** | 439| 3 | « Les modèles ne sont pas en panne en recette : deux agents sur quatre y tournent très bien. » | **Exact, et c'est nous qui le disons.** Ce qui tombe, ce sont les agents dont les outils portent un motif que Gemini refuse — un défaut de votre plateforme, pas de la clé du projet. Les deux autres passent. **La clé Anthropic du chemin de repli, elle, rend 401 à quatre dates.** | 440| 4 | « Vous dites qu'il n'y a aucune sauvegarde. Le dump de la base part toutes les nuits ailleurs. » | **Le document l'écrit déjà**, en toutes lettres : « Ce que cela ne dit pas : qu'aucune sauvegarde de la base n'existe ailleurs — nous ne l'avons pas vérifié. » Ce que nous établissons, relevé deux jours de suite : sur la machine qui reçoit la bascule, le service de l'hébergeur n'est pas activé. **La question reste la même qu'au 8 septembre : où est la sauvegarde, et qui a déjà démontré qu'il savait la relire ?** | 441| 5 | « Le découpage en huit est une correction, pas une régression — la requête unique dépassait le plafond de 4 Mio. » | **Recevable, et non écartée.** Votre commentaire déployé (`:3515-3516`) dit cela ; celui de votre source dit qu'elle tient à 1,43 Mo. Nous ne tranchons pas. Nous disons que la charge passe de cinq à douze lectures par ouverture d'écran, et que **la reprise sur dépassement de délai a bien disparu — ce correctif-là, nous vous le créditons.** | 442| 6 | « Deepgram ne recommande pas d'enregistrer en stéréo. » | **Accordé, et la phrase est corrigée avant lui.** Deepgram propose un transcript par canal *quand l'enregistrement est déjà en deux pistes*. Ce que nous établissons reste entier : l'option n'existe pas dans l'intégration que votre plateforme expose, aucun programme ne demande deux canaux, et les étiquettes de locuteur sont retirées de la réponse avant qu'elle n'atteigne le programme. | 443| 7 | « Vous auditez une archive, pas mon système. » | C'est écrit à chaque verdict : *sur un instantané non attesté*. **Deux pièces lèvent la réserve** : l'export d'empreintes équivalent à celui du 8 septembre, et la réponse à « les paquets compilés sont-ils refaits au déploiement ? ». La seconde s'est durcie : votre source est passée en React 19, vos paquets sont restés en React 18. | 444| 8 | « Vos lectures du 13 ont redémarré mes quatre agents de production. » | **Vérifié et écarté.** Le seul point de démarrage joignable en lecture n'est pas dans la liste blanche de la clé et n'a pas été appelé ; les quatre démarrages sont échelonnés de 0,33 seconde, incompatible avec le mécanisme de reprise du serveur. **L'explication la plus économe est votre matinée de migration** — 289 Gio transférés le même jour, stockage objet créé deux heures plus tôt. Nous ne l'attribuons à personne : votre hébergeur n'a aucun journal d'actions. | 445| 9 | « Le barème n'a jamais été touché par l'IA, votre chiffrage ne tient pas. » | **C'est ce que nous écrivons** : sur tout l'historique lisible, deux lectures, aucune écriture. Le chiffrage est conditionnel et le dit. **Et nous ajoutons ce que vous alliez dire** : ce chemin est peut-être en panne, une ligne diffère de ses dix voisines. C'est précisément pourquoi il ne faut pas la « réparer » sans décider d'abord du garde-fou. | 446| 10 | « Vous m'attribuez un secret en clair deux fois pour en compter deux. » | **Corrigé avant lui** : une clé de service, écrite dans deux programmes ; un compte de recette avec son mot de passe dans un script d'essai. Consignés, sans relance, conformément à l'arbitrage du 2 septembre — et à régénérer de toute façon au changement d'hébergeur. | 447 448--- 449 450## 11. Ce que je n'ai pas abaissé, et pourquoi je le dis 451 452Trois endroits où la passe est **plus dure que ce que j'aurais écrit**, et où j'ai cherché à la faire tomber sans y parvenir : 453 4541. **« C'est la mesure la plus utile de ce dossier »** (l'attestation par hachage). J'ai vérifié que le document ne franchit pas le pas interdit : il écrit « le dossier de production en était bien un, et cela se vérifie sans la parole de personne » — soit *vérifiable et cohérent*, jamais *prouvé venir de la production*. C'est exactement la borne que mon poste s'était imposée. **Rien à retrancher.** 4552. **Le constat 21 « seul confirmé par une lecture du jour ».** Vérifié : le socle est le dépôt public `apteva/apps`, relu au commit `5a64116` du 13/09, `buildCreateTableSQL` n'émet aucune clause `FOREIGN KEY`, `UNIQUE` ni `CHECK`. Le document le dit et le borne (« son socle est le code public de la plateforme »). **Tient.** 4563. **Le constat 16, l'effet rétroactif.** `contre-familles` l'appelle « la meilleure trouvaille des quatre rendus ». Le document le publie avec le bon renversement (*l'argent ne bouge pas, l'écart écran/paie s'ouvre*). Seule l'ampleur doit être bornée (§1.6). **Le fond tient.** 457 458## 12. Contre-lecture de ce contre-audit 459 4601. **Mon résultat le plus lourd — la fenêtre de lecture fausse — repose sur des horodatages de fichiers**, pas sur un journal serveur. Les pièces `tcall_*.json` portent 15:15 locales, et le fuseau du poste (UTC+1) est établi par recoupement avec `v_backups.json` (11:19 locales pour un appel daté 10:19 UTC dans `lecture-vultr`). Si le poste avait changé de fuseau entre-temps, mon calcul tomberait. **Mais `lecture-apteva` §5.6 écrit de lui-même « relevé le 13/09 entre 14:15 et 14:25 UTC » : la source se contredit avec son propre en-tête, et ce n'est pas moi qui l'ai inventée.** 4612. **J'ai relevé douze points d'écriture du verrou contre les onze publiés, et je n'ai pas trouvé de lecture à onze.** Il est possible qu'une définition légitime (par exemple « fichiers », ou « points hors synchronisation Google ») donne onze. Je n'affirme pas que le document s'est trompé de comptage : j'affirme que **le nombre publié n'est reproductible par aucune mesure que j'aie su faire**, ce qui suffit à le retirer ou à le redire. 4623. **Je retire une exigence de mon propre poste** (« relevé deux jours de suite » à supprimer), sur des pièces qui n'existaient pas quand elle a été formulée. C'est le fonctionnement normal, mais il faut le dire : **mon contre-audit de 10 h 40 était juste à 10 h 40 et faux à 13 h 52.** Il doit être corrigé dans `contre-face-a-face-github-2026-09-14.md`, sinon deux livrables du dossier se contrediront. 4634. **Je n'ai invalidé aucun des 23 constats, ni aucun verdict d'état.** Ce qui cède, ce sont cinq attributions, quatre nombres, trois bornes et un comptage interne — c'est-à-dire, une fois de plus, exactement ce qui se voit dans un livrable et ce qui se retourne en réunion. 464 465--- 466 467*Contre-audit établi le 14/09/2026 sur `code/flexylead-audit-2026-09-14/index.html` et `README.md` au commit `59205bc`. Toutes les mesures ont été refaites sur les arbres cités, aux commits cités. Aucun niveau de certitude n'a été rehaussé. Aucune conclusion n'a été abaissée par principe : trois sont explicitement maintenues contre moi au §11.* 468