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)¶
- On n'écrit JAMAIS sur le Drive. Scope
drive.readonlyseul, garde-fous runtime (src/auth.js) + test qui interditfiles.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). - Jamais de chemin en dur. Reconnaissance par motifs sur libellés normalisés (couvre les 12 agences sans mapping par agence).
- Le code affaire
[Lettre][AA][NNNN]est la clé de jointure (Drive ↔ Zoho) et le seul proxy de date fiable (modifiedTimeest corrompu par une migration : 151 fichiers à la même date de 2020). - Conserver
sourceId/sourceLiende 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.jsonlde 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 deblocs.jsonl—theme(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 flagcanonique boolean.cadres/rubriques_cadre(nouveau) :rubrique,points,theme(mappé),ordre,ao_id. C'est ce qui pilote l'éditeur (remplace/complètecriteres_aodu 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_mappingne 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 client → sortir 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)¶
- 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. - 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).
- Formats legacy sur Workers :
textutil(.doc/.odt) n'existe pas sur Cloudflare Workers → prévoir une alternative d'extraction ou écarter le legacy. - Thème
Continuité/astreinte/urgencevide : premier bloc canonique à créer si un cadre l'exige.