Aller au contenu

08 — Intégration de l'audit multi-drive (compte-rendu & plans révisés)

Une seconde instance a audité les 12 Shared Drives (275 134 fichiers, 718 Go) en lecture seule et produit une bibliothèque de blocs exploitable. Ce document intègre ses conclusions et révise mes docs 01-07 là où l'échantillon local (affaire_serpe/, ~17 AO surtout de 2020, perdus) m'avait induit en erreur. Sources : analyse_doc/handoff-webapp.md, analyse_out/ (gitignorés).

0. Règles d'or non négociables (à graver dans le code)

  1. On n'écrit JAMAIS sur le Drive. Scope drive.readonly seul, garde-fous runtime (src/auth.js) + test qui interdit files.create/update/delete/copy. Corollaire : ne pas proposer de « ranger/nettoyer » le Drive non plus (46 % de fichiers hors-sujet, des milliers de dossiers vides — on le signale, on n'y touche pas).
  2. Jamais de chemin en dur. Reconnaissance par motifs sur libellés normalisés (couvre les 12 agences sans mapping par agence).
  3. Le code affaire [Lettre][AA][NNNN] est la clé de jointure (Drive ↔ Zoho) et le seul proxy de date fiable (modifiedTime est corrompu par une migration : 151 fichiers à la même date de 2020).
  4. Conserver sourceId/sourceLien de bout en bout. Un utilisateur qui voit une phrase générée doit remonter au mémoire d'origine — c'est ce qui fait adopter vs suspecter l'outil.

1. Les 7 faits qui contraignent la conception

# Fait Impact sur mes docs
1 Le Drive est un fourre-tout (46 % hors-sujet) — ce n'est pas un défaut à corriger Doc 01 : le taux de non-classés est un résultat, pas un bug
2 Gabarit d'arborescence commun à dérive orthographique (3-Répondu, 3- Répondu, 03 - Répondu…) Confirme doc 01 §4 ; atténue statut_mapping (cf. §5)
3 Codes affaire normalisés & datables — la vraie clé Confirme doc 01 §4 ; à ériger en clé d'ingestion
4 On ne sait pas qui a gagné : 1 382 mémoires perdus vs 8 gagnés identifiables Valide (et aggrave) mes caveats docs 03 §7 / 05 §1.5
5 La trame Serpe est morte depuis 2022 (90 % en 2020 → 6 % en 2023) Corrige mon doc 03 (« template maître ») — cf. §2
6 Ce sont les clients qui imposent la structure, en paragraphes numérotés (pas styles Word) Recentre l'architecture sur le cadre — cf. §3
7 Le cadre contient le barème (points/rubrique) — 37 % des cadres Insight majeur : le barème pilote l'effort — cf. §3

2. Réconciliation — ce que je corrige

Mon « template maître » (doc 03) était vrai pour 2020, obsolète depuis 2022. Les mémoires IIBSN/DIRA que j'ai lus (quasi identiques) datent de 2020, l'apogée de l'ancienne trame (« Contexte / Avantages / Réponses aux critères »). Cette trame s'est effondrée : les clients imposent désormais leur plan.

Ce qui reste vrai et solide : les thèmes de fond sont stables quelle que soit l'année et l'agence — Moyens humains 96 %, Matériels 92 %, Environnement 91 %, Méthodologie 90 %, Sécurité 88 %. C'est sur ces thèmes (pas sur une structure figée) que capitalise la bibliothèque de blocs.

→ La bonne formule n'est donc pas « générer la trame Serpe », mais : le cadre client donne le plan et le barème ; les blocs Serpe (par thème) remplissent chaque rubrique ; le barème alloue l'effort.

3. L'architecture corrigée (celle de l'audit, que j'adopte)

DCE reçu
  ├─► CADRE de mémoire ──► parseRubriques() ──► [{label, points, theme}]
  │      (paragraphes,        (src/cadre.js)         │  37 % ont le barème
  │       pas styles Word)                           │
  └─► RC / CCTP / DQE ──► contexte (client, lieu, lots, contraintes)
   blocs.jsonl ──► sélection par THÈME ──► budget de mots ∝ POINTS
   (1 776 blocs, 13 thèmes)                           │
                              ★ ÉTAPE MANQUANTE = LE CŒUR DU POC :
                              réécriture LLM (Gemini) : fondre les blocs
                              en prose cohérente, adaptée au client/chantier
                                            sortie .docx (mise en forme)

Une rubrique à 45 points mérite 3 pages, une à 5 points un paragraphe. Aucune approche par similarité de documents ne fournit cette information — c'est le cadre qui la donne. C'est l'apport central.

4. Ce qui est déjà construit vs ce qui manque

Déjà fait (réutilisable) Manquant (à construire)
Crawl read-only des 12 drives (index de 384 023 objets) Réécriture LLM (fondre les blocs en prose) ★
Classification 4 axes (docType/phase/statut/resultat), pure & rejouable Sortie .docx aux standards Serpe (non accessoire)
blocs.jsonl : 1 776 blocs, 13 thèmes, 3,1 Mo Intégration des visuels (plans, photos, Gantt)
Parseur de cadre (src/cadre.js, sur paragraphes) + barème Traitement des références (structurées, pas prose — §5)
Démo d'assemblage bout-en-bout sans LLM (DEMO.md) Thème Continuité/astreinte/urgence vide
Modules : themes.js, cadre.js, mojibake.js, classify.js Sortie de la donnée win/loss (demande partie à Serpe)

5. Impact sur la refonte de l'app (révision docs 06 & 07)

5.1 L'éditeur devient piloté par le cadre + le barème. Concrètement, la maquette du doc 06 §5 évolue : les sections ne viennent plus d'une trame Serpe mais du cadre client parsé, chaque rubrique portant ses points, et l'app affichant le budget de mots alloué et l'état de remplissage.

┌──────────────────────────────────────────────────────────────────────────┐
│ Rédiger — C230107 · Entretien EV · CD16      Cadre : détecté (31 rubriques)│
│ Barème total : 103 pts   ·   Budget cible : 8 000 mots                     │
├───────────────┬──────────────────────────────────────────────────────────┤
│ RUBRIQUES      │  A – Gestion et valorisation des déchets                 │
│ (issues du     │  9 pts → budget ~700 mots · Thème : Environnement        │
│  CADRE client) │                                                          │
│ ● 1 Perf. tech │  Blocs candidats (biblio, par thème) :        [5 trouvés]│
│   20 pts ⚠ non │   ☑ Revalorisation déchets verts (234 mots) — AFF-MULTI  │
│      rattachée │   ☑ Gestion des déchets (224 mots) — 2024                │
│ ✓ 2 Perf.envt  │   ☐ SOSED gestion déchets (46 mots)                      │
│   20 pts→1553m │      ↳ source : Mémoire DYNA HERBLAY ↗ (traçabilité)      │
│ ● A Déchets    │                                                          │
│   9 pts→700m   │  [ ✨ Rédiger la rubrique (Gemini) ]  budget 700 mots     │
│ ○ B Moyens     │  ──────────────────────────────────────────────────────  │
│   7 pts→544m   │  « La valorisation des déchets verts s'organise en trois │
│ ⚠ Candidat     │  phases — broyage, aération, criblage — sur nos plate-   │
│   7 pts (à réd)│  formes… » [prose fondue, éditable]                      │
│ ...            │  Sources : 3 blocs · adaptée à CD16 / entretien EV       │
├───────────────┴──────────────────────────────────────────────────────────┤
│ 25/31 rubriques couvertes · 6 à rédiger · [ Aperçu ]  [ Exporter .docx ]  │
└──────────────────────────────────────────────────────────────────────────┘

5.2 Deux natures de blocs, deux sources (précision de mes docs 03 §6 / 04) : - Corpus brut (blocs.jsonl) = matière à sélectionner puis réécrire par Gemini pour les rubriques variables (méthodologie, prestations, environnement). Ce n'est PAS une bibliothèque curée : 1 776 extraits, beaucoup de quasi-doublons, majorité d'affaires perdues/inconnues → à traiter comme du RAG, pas comme une vérité. - Bibliothèque canonique (à constituer, mon doc 04 §1) = versions de référence des blocs stables (présentation groupe, RSE, sécurité, certifs). Signal fort : les thèmes « Présentation entreprise » (33 blocs) et « Références » (6 blocs) sont sous-représentés dans le corpus précisément parce qu'ils devraient venir d'une source unique de vérité curée, pas d'extraction. → mon « quick win source de vérité » reste valide et se combine avec le corpus RAG.

5.3 Les références se traitent à part. Les 234 fichiers REFERENCE_CHANTIER sont des attestations/certificats scannés, pas de la prose (d'où seulement 6 blocs de texte alors que les cadres notent les références jusqu'à 15 pts). → table references_clients structurée (doc 07) + pièces jointes, pas un thème de blocs. À présenter en sélection (MOA/objet/montant/an/attestation), pas en génération de texte.

5.4 Pas de base vectorielle pour le POC. blocs.jsonl (3,1 Mo) tient dans un bundle Worker ou en KV. La sélection par thème + filtres (année, agence, mots) suffit. On garde pgvector pour plus tard (recherche fine d'affaires similaires), pas pour le MVP.

5.5 Module D — Observabilité du fonds documentaire (nouveau, issu d'une demande). Une page qui restitue l'audit dans l'app : volumétrie par agence, répartition par type de document, variantes de nomenclature détectées (3-Répondu / 3- Répondu / 03 - Répondu…), dossiers vides, taux de non-classés, doublons probables — et des suggestions d'amélioration adressées à Serpe (homogénéiser les libellés de statut, marquer les affaires gagnées, centraliser le dossier admin…).

Garde-fou (règle d'or §0) : l'app rapporte et suggère, elle n'agit jamais sur le Drive. L'homogénéisation de la nomenclature reste une recommandation que Serpe applique — jamais une action automatique de notre côté. Cette page est alimentée par l'index.jsonl de l'audit (lecture seule), pas par un nouveau parcours du Drive.

Valeur : c'est un quick win supplémentaire, purement read-only, qui démontre la maîtrise du fonds et prépare le terrain (une nomenclature plus homogène = ingestion plus fiable). À ranger avec le Module A (analyse read-only).

6. Impact sur le schéma de données (révision doc 07)

  • blocs : aligner sur le schéma réel de blocs.jsonltheme (13 valeurs), titre, niveau, texte, mots, annee, resultat (PERDU|INCONNU|GAGNE|SANS_SUITE), agence, sourceId, sourceNom, sourceLien. Séparer corpus (importé, RAG) et bibliothèque canonique (curée, versionnée) — deux tables ou un flag canonique boolean.
  • cadres / rubriques_cadre (nouveau) : rubrique, points, theme (mappé), ordre, ao_id. C'est ce qui pilote l'éditeur (remplace/complète criteres_ao du doc 07).
  • statut_mapping : rétrograder de mécanisme principal à surcharge. La reconnaissance par motifs (4 axes de l'audit) couvre les 12 agences sans mapping ; statut_mapping ne sert qu'aux cas résiduels non reconnus.
  • appels_offres.reference_affaire : clé d'ingestion + jointure Zoho.
  • Ne pas stocker les attestations en base : elles vivent sur le portail Attestations Légales (doc 04) → lien, pas duplication.

7. Proposition de suite — être force de proposition

Étape immédiate recommandée (validée par l'audit) : un vertical slice sur un seul thème. Prendre Moyens humains (311 blocs, le mieux fourni) et faire la chaîne complète : lire le cadre → sélectionner les blocs → appeler Gemini pour fondre en une section rédigée adaptée au clientsortir en .docx.

C'est la seule question qui compte encore : le résultat est-il meilleur qu'une page blanche pour le chargé d'affaires ? Réponse en une journée. Si oui, on généralise aux 12 thèmes ; sinon, on l'a su vite.

Plan par étapes que je propose (ordre de valeur × risque) :

# Étape Livrable Dépend de
1 Vertical slice Gemini (Moyens humains) : cadre → blocs → réécriture → .docx Preuve « mieux qu'une page blanche » blocs.jsonl, cadre.js
2 Ingestion read-only : importer blocs.jsonl + index → Supabase/KV, clé = code affaire Corpus interrogeable dans l'app Étape 1 validée
3 Module A — Analyse read-only : carte d'identité AO + synthèses + stats (doc 05) Démo de valeur direction Ingestion
4 Bibliothèque canonique (source de vérité : présentation, RSE, sécurité, certifs) Quick win, blocs figés fiables — (parallélisable)
4bis Module D — Observabilité du fonds (restitution audit + suggestions, read-only) Quick win read-only, prépare l'ingestion index.jsonl audit (parallélisable)
5 Module B — Éditeur cadre-piloté (maquette §5.1) : parse cadre → budget → blocs → génération par rubrique Cœur métier Étapes 1-4
6 Références & visuels : records structurés + assets insérables Rubriques notées mais non-prose Module B
7 Win/loss : brancher l'export Zoho (si obtenu) par code affaire Passer de « conforme » à « compétitif » Donnée Serpe

Deux propositions supplémentaires de ma part : - Séparer nettement « conforme » et « compétitif ». Le POC atteignable aujourd'hui produit un mémoire complet et conforme (couvre les rubriques du cadre). Le compétitif (apprendre des gagnants) est bloqué par la donnée win/loss → le poser comme jalon 2 explicite, ne pas le promettre au jalon 1. - Rendre la traçabilité visible dans l'UI (chaque phrase générée → lien vers le mémoire source). C'est peu coûteux et c'est le facteur d'adoption n°1 selon l'audit.

8. Angles morts consolidés (à lever avec Serpe)

  1. Donnée win/loss : export Zoho code affaire → issue (note déjà partie, analyse_doc/note-serpe-donnees-resultats.md). Débloque ~1 500 mémoires.
  2. Vrais RC/cadres récents annotés : valider les pondérations et le mapping rubrique→thème sur des cas réels (43 % des rubriques ne se rattachent à aucun thème aujourd'hui).
  3. Formats legacy sur Workers : textutil (.doc/.odt) n'existe pas sur Cloudflare Workers → prévoir une alternative d'extraction ou écarter le legacy.
  4. Thème Continuité/astreinte/urgence vide : premier bloc canonique à créer si un cadre l'exige.