CE QUI A QUITTE L'EDITION CLOUD, ET COMMENT LE RENDRE
=====================================================

Pose a C53, le 18/10/2026, a la demande du client.


1. LE DOSSIER SCANNER
---------------------

POURQUOI IL EST PARTI
  Il surveille un dossier SUR LA MACHINE QUI SERT LES PAGES, ou un
  copieur depose ses numerisations. Dans un centre de donnees il n'y a ni
  copieur, ni dossier d'arrivee, ni personne devant la machine : l'ecran
  s'ouvrait, proposait de regler un chemin, et ne pouvait rien produire.
  Pire qu'une porte fermee -- il laissait croire que le materiel manquait
  CHEZ LA PERSONNE.

CE QUI A ETE RETIRE
  . la page "scanner.php" (85 Ko) -- supprimee
  . le droit "page_scanner" -- hors du catalogue des permissions
  . l'entree de menu et la pastille de l'en-tete
  . le bandeau "dossier scanner injoignable"
  . la fiche d'aide de l'ecran, son etape du cycle de vie, sa ligne de
    "Que faire ?"
  . deux chapitres de la visite guidee et l'etape "Brancher vos copieurs"
  . la ligne "Dossier scanner" du diagnostic
  . la pastille cote navigateur et les regles de la fenetre d'apercu
  . la table "scan_fichiers" et les quatre reglages "scan_*"
  . les clefs "Scanner" / "scanner" des trois dictionnaires

CE QUI A ETE RANGE, NON DETRUIT
  . app/scanner.php
      LES 19 FONCTIONS DU MOTEUR, sorties de "app/core.php" SANS
      retouche. Le fichier n'est REQUIS PAR PERSONNE.
  . tools/retire-du-cloud/
      les deux epreuves du module (159 controles mesures) et leur notice.

CE QUI RESTE EN PLACE, INERTE, ET POURQUOI
  Deux blocs de "assets/js/app.js" -- "LE CLASSEMENT D'UNE PIECE" et
  "LE CLASSEMENT D'UN LOT", environ 250 lignes -- s'accrochent aux
  identifiants "clForm" et "lotLancer", que SEULE la page du scanner
  emettait. Ils sont gardes ("if (form)", "if (!lancer) return") donc
  ils ne s'executent jamais. Les regles CSS "#mClasser" sont dans le
  meme cas.
  On les a LAISSES a dessein : les retirer est une refonte de deux cent
  cinquante lignes au milieu d'un fichier de neuf mille, pour aucun gain
  visible -- et une refonte qui casse un voisin coute plus que du code
  inerte. Ils sont nommes ici pour que personne ne les croie vivants.

POUR LE RENDRE (sur un serveur a soi, ou un dossier d'arrivee a un sens)
  a) charger le moteur : ajouter dans "app/core.php", a cote des autres
     "require KHZ_ROOT . '/app/...'" :
         require KHZ_ROOT . '/app/scanner.php';
  b) reprendre la page "scanner.php" depuis une installation qui l'a
     encore -- elle n'a pas ete modifiee, seulement supprimee ici ;
  c) rendre le droit au catalogue : dans "actions_reglables()"
     (app/auth.php), remettre l'entree "page_scanner" -- la note C53
     marque l'endroit exact ;
  d) la table se recree seule : "scan_schema_boot()" la pose au premier
     regard. Regler ensuite le dossier surveille ;
  e) remettre la pastille et l'entree de menu dans "app/layout.php", la
     fiche dans "app/aide.php", les chapitres dans "app/visite.php",
     la pastille de "assets/js/app.js" -- chaque endroit porte une note
     "C53" qui dit ce qui y etait ;
  f) ramener les deux epreuves de "tools/retire-du-cloud/" dans
     "tools/" et les reinscrire dans "tools/banc_complet.py" (les
     notes C53 y marquent les deux listes) ;
  g) retourner les trois assertions retournees a C53 :
     "tools/banc_http.py", "tools/epreuve_coherence.py",
     "tools/epreuve_securite.py".

LE CLIQUET QUI TIENT LE RETRAIT
  "tools/epreuve_sans_scanner.php" refuse que le module reparaisse par
  un bout. Si l'on RAMENE le module, ce cliquet devient faux : il faut le
  retourner lui aussi, ou le ranger ici avec sa raison -- *un cliquet
  qu'on laisse derriere soi redevient un piege : il tiendrait la regle
  d'hier.*

====================================================================
LE LECTEUR MANUSCRIT (retire a C58, le 18/10/2026)
====================================================================

CE QUE C'ETAIT
--------------
Un service PYTHON qui tourne SUR LA MACHINE QUI SERT LES PAGES. Il ecoute
sur 127.0.0.1, ports 47653 et 8765, charge RapidOCR (latin) et un modele
arabe (rec.onnx), et lit ce que Tesseract ne sait pas lire : l'ecriture a
la main. Le produit le reveillait tout seul, a chaque page, et le
redemarrait depuis l'ecran des Reglages.

POURQUOI IL A QUITTE CETTE EDITION
----------------------------------
Il lui faut, sur le serveur : Python, la bibliotheque RapidOCR, un
lancement de programme, et une tache planifiee Windows pour survivre a un
redemarrage. Un hebergement mutualise n'a RIEN de tout cela.

/!\ Et l'ecran ne le disait pas : il proposait "Demarrer le lecteur",
montrait le temps passer, puis annoncait "pas de reponse apres 90 s --
voir journal_service.txt". La personne cherchait un defaut chez elle.
C'est la faute que la maison nomme deux fois : un remede qu'on ne peut pas
appliquer est pire qu'un silence.

/!\ Il etait aussi la DERNIERE DEPENDANCE entre les deux installations :
ses lanceurs, ecrits par le produit, pointaient vers le dossier du voisin,
et Windows n'a qu'UN espace de noms pour ses taches planifiees -- deux
installations qui demandent le meme nom se marchent dessus, et la seconde
ecrase la tache de la premiere sans un mot.

CE QUI A ETE RETIRE
-------------------
  - app/pipeline.php     : 12 fonctions + 4 passages par le repli manuscrit
  - app/outils.php       : 2 fonctions + le relevement a l'entretien
  - admin_settings.php   : 2 gestes (252 lignes) + 6 lignes de carte
  - app/layout.php       : le reveil a chaque page, et le demarrage
  - login.php            : le demarrage a la connexion
  - assets/js/app.js     : le bouton "Demarrer le lecteur" (142 lignes)

CE QUI A ETE GARDE, ET OU
-------------------------
  - app/lecteur_manuscrit.php   LE MOTEUR, range tel quel. 15 fonctions,
                                deplacees SANS UNE RETOUCHE. Personne ne le
                                charge : c'est ce qui le rend inerte.
  - tools/lecteur_manuscrit/    Le service Python lui-meme, intact.
  - installation/KHAZINA_INSTALLER.bat
                                Ses etapes 7 a 10 (Python, RapidOCR, modele
                                arabe, service) posent encore tout cela sur
                                un poste Windows. Elles ne genent pas : le
                                produit ne les appelle plus.

COMMENT LE REBRANCHER (sur un serveur a soi)
--------------------------------------------
  1. Dans app/core.php, ajouter a cote des autres :
         require_once KHZ_ROOT . '/app/lecteur_manuscrit.php';
  2. Dans app/pipeline.php, remettre les quatre passages du repli, chacun
     juste apres sa lecture :
         $o = manuscrit_repli($img, $o);
     Les quatre endroits portent le commentaire C58 qui les nomme.
  3. Dans app/layout.php et login.php, remettre l'appel
     manuscrit_demarrer_si_besoin(), derriere son function_exists.
  4. Dans admin_settings.php, remettre les deux gestes et les lignes de
     carte : les blocs retires portent chacun leur commentaire C58.
  5. Lancer installation/KHAZINA_INSTALLER.bat : ses etapes 7 a 10 posent
     Python, RapidOCR, le modele arabe et le service.

/!\ Avant de rebrancher, verifier que l'hote sait lancer un programme :
kz_peut_lancer() rend faux sur un mutualise, et tout le module en depend.

====================================================================
LA LECTURE ET LE DECOUPAGE PAR MODELE (retires a C77, REMIS a C78)
====================================================================

CE QUE C'EST
------------
Un scan ou une photo n'a pas de texte : il faut le LIRE. Cette edition
n'embarque aucun programme (voir C54), donc deux chemins seulement : le
navigateur de la personne (tesseract.js, gratuit -- voir C55), ou un
MODELE chez OpenAI, Anthropic ou Google, qui lit nettement mieux et sait
en plus decouper une liasse en pieces.

Le modele sert a trois choses, et a trois seulement :
  - lire une page (ia_lire_page)
  - proposer le plan de decoupage d'une liasse (ia_plan_decoupage)
  - remplir la fiche d'une piece (nature, numero, client, total, resume)

/!\ IL NE SERT JAMAIS A LIRE UN DOCUMENT NATIF. Un txt, un pdf a couche
de texte, un Word, un tableur se lisent directement et GRATUITEMENT, et
leur langue se detecte seule. Payer un modele pour cela serait payer
chaque document que la maison sait deja lire (C41, C70).

CE QUI S'EST PASSE
------------------
C77, le 20/10/2026 : retire a la demande du client -- "supprime la
logique de lecture et decoupage AI model (OpenAI, Gemini, Claude), et
apres je te donne comment la refaire".

C78, le MEME JOUR : le client a fourni sa consigne. La mesure a montre
que les QUINZE piliers qu'elle decrit etaient deja en place, et NEUF des
dix points fins du contrat : C77 n'avait range que la couche qui APPELLE
le modele. "Refaire" fut donc REMETTRE, en quatre gestes.

/!\ C'EST LA PREUVE DE CE QUE C54 PROMETTAIT : un seul mot ferme, un seul
mot rouvre. Disseque, le retrait aurait ete 31 occasions d'en oublier une.

LA PORTE, ET ELLE EST UNIQUE
----------------------------
  app/ia.php     ia_lecture_modele_active()

Elle rend true. Pour tout refermer, un seul mot :

         return false;

Les TROIS appelants la consultent, et aucun ne se garde soi-meme :
  - app/pipeline.php      la lecture d'une page scannee
  - app/segmentation.php  le plan de decoupage d'une liasse
  - ocr_navigateur.php    le guichet du navigateur, branche "modele"

/!\ UN CLIQUET TIENT CETTE UNICITE : tools/epreuve_portes.php, section 8.
Il remonte a la fonction englobante de chaque appel et exige la garde
entre sa tete et l'appel -- il ne compte pas une presence. Qu'un
quatrieme appel s'ecrive sans la garde, et refermer la porte laisserait
une fuite MUETTE : le produit marcherait, et la depense partirait quand
meme (R1505).

OU VIT LE MOTEUR
----------------
  app/ia_lecture.php      7 fonctions, chargees par core.php en
                          require_once. Il s'appelait a C77
                          "ia_lecture_retiree.php" et son en-tete disait
                          "charge par personne" : les deux sont devenus
                          faux a la seconde ou core.php l'a repris, et
                          c'est pourquoi il a ete renomme dans le meme
                          geste (paragraphe 1.4 : nomme par ce que ca FAIT).

/!\ ET IL N'EST PAS DERRIERE UN function_exists : *une garde prudente qui
rend false ne laisse RIEN dans la console -- le code passe, et le
comportement est faux*. Cette famille a coute cinq plaintes a R1485 et
frappe trois fois dans ce projet.

CE QU'IL FAUT POUR QUE CELA SERVE
---------------------------------
Une cle d'API, posee dans Reglages > Moteur IA. Sans cle, rien ne part :
le produit le DIT, avec l'endroit ou poser la cle -- jamais un remede
impossible (C17, C28). Et le navigateur lit les scans gratuitement a la
place (C55).

/!\ UN ABONNEMENT NE FINANCE PAS UNE CLE D'API. Ce piege a coute une
journee au client ; "plus de credit" est reconnu chez les trois maisons,
dont le code HTTP ne tranche pas (400 Anthropic, 429 OpenAI, 403 Google
pour le meme fait), et sa phrase le nomme.
