Files
nas-runbooks/hermes-tt/ria-179-articles-fiabilite-citation.md
T

11 KiB
Raw Blame History

RIA (Reglement Interieur Achats) — 179 articles verbatim dans le RAG, fiabilite citation

Instance auteur : hermes-tt Date : 2026-08-06 Tags : [ria, rag, nyora-notes-tt, fts, achats] Statut : valide


Probleme

Ingestion du RIA (reglement interieur achats TT, 179 articles) dans NyoraNotes REST (:8787) avec exigence stricte de Nabil : toute question RIA doit retourner l'article ou les articles correspondants, cites VERBATIM sans aucune modification. Audit demande apres l'ingestion initiale pour valider avant mise en confiance operationnelle.

Verification manuelle a revele que 12 des 179 fichiers articles/article-NNN.txt (et les notes NyoraNotes correspondantes) se terminaient par les premieres lignes du TITRE/Chapitre/Section qui introduit le groupe d'articles SUIVANT, au lieu que ce texte de structure reste attache a la suite. Consequence demontree en conditions reelles : la recherche FTS pénalité retard remontait l'article 97 en position 2 (score -7.3) alors que l'article 97 traite en realite des delais de signature de contrat, sans rapport avec les penalites — il ne remontait que parce que son fichier se terminait par "Section 1 - Delais et penalites de retard" (titre de la section qui commence a l'article 98).


Contexte et contraintes

  • Source : reglement-interieur-achats-TT.docx, hash MD5 a6b534bb06473ce2ab6ac0f13ca4b0ea (verifie).
  • Extraction mecanique DOCX->XML vers 179 fichiers article-NNN.txt (parse_ria_articles.py) + fichier canonique RIA_INTEGRAL_179_articles.txt.
  • Le fichier canonique integral N'EST PAS affecte (les headers TITRE/Chapitre y sont normaux et attendus, c'est un document continu).
  • Seuls les fichiers PAR ARTICLE (split) sont concernes, car le parseur attachait le header de section suivant a la fin de l'article precedent plutot qu'au debut du suivant.
  • Ingestion NyoraNotes : 179 notes "RIA — Article N" + 1 note index = 180 notes, tags ria, hermes-tt, article.

Ce qui NE fonctionne PAS

Tentative Erreur obtenue Raison de l'echec
Faire confiance au rapport d'ingestion sans re-verifier le contenu reel des fichiers Aucune erreur visible dans le rapport — le defaut n'apparait qu'en testant des requetes FTS reelles Le rapport verifiait "la question renvoie le bon article en position 1" mais pas "aucun autre article n'est pollue par du texte hors-sujet"
Se fier au seul comptage (179 fichiers, 180 notes, sequence 1-179 complete) Comptage correct, mais insuffisant Un comptage exact ne garantit pas la purete du contenu de chaque fichier

Solution validee

  1. Detection : scanner les 6 dernieres lignes non-vides de chaque fichier article-NNN.txt, chercher un match sur ^(TITRE|Chapitre|Section\s+\d) en debut de ligne complete.
  2. 12 fichiers concernes : 2, 5, 41, 97, 109, 127, 132, 142, 148, 152, 164, 172.
  3. Pour chacun : tronquer le fichier a la derniere ligne substantielle de l'article (avant le header), reecrire le fichier local.
  4. Recuperer l'ID de la note NyoraNotes correspondante (GET /notes?tag=ria&limit=100&page=N, filtrer par titre "RIA — Article N").
  5. PUT /notes/{id} avec le nouveau contenu (# RIA — Article N + texte article corrige).
  6. Aucune reindexation FTS manuelle necessaire : la recherche reflete le contenu corrige immediatement apres le PUT (verifie sur article 97 / requete "penalite retard").

Verification

curl -s -H "Authorization: Bearer $TOKEN" --get http://localhost:8787/search --data-urlencode "q=penalite retard"
# Attendu : article 99 en position 1, article 97 absent du top (ou present uniquement si legitimement pertinent)

Confirme le 06/08/2026 : article 97 n'apparait plus dans les 5 premiers resultats pour "penalite retard", le classement restant (99, 129, 30, 40, 105) est desormais coherent avec le contenu reel de chaque article.


Pieges specifiques DSM / NAS

  • mcp-nas : la commande docker n'est PAS disponible directement dans le shell du container mcp-nas (pas de docker.sock monte, pas de binaire docker). Il faut passer par ssh nas-host (alias configure vers Best0f@172.17.0.1:22222) puis utiliser le binaire complet /usr/local/bin/docker.
  • L'API NyoraNotes REST pagine avec le parametre page (1-indexe), PAS offset — passer offset est silencieusement ignore et retourne toujours la page 1.
  • limit est plafonne a 100 par l'API (le depasser renvoie une 422 Pydantic, pas une troncature silencieuse).
  • Le hash affiche dans les noms de fichiers du pipeline OneDrive (ex. ...a6b534bb.md) est un MD5, pas un SHA256.

References

  • Skill : gsd-ao-evaluation/references/ria-articles-cles.md (procedure de citation verbatim, articles cles, structure du RIA)
  • Fichier canonique : /opt/data/workspace/reference/RIA/RIA_INTEGRAL_179_articles.txt
  • Memoire hermes-tt : /opt/data/memories/MEMORY.md (entree RIA ajoutee 06/08/2026)

Addendum 06/08/2026 — purge du fichier memoire orphelin

Constat (demande Nabil) : hermes-tt possede DEUX fichiers "MEMORY.md" :

  • /opt/data/memories/MEMORY.md — le vrai fichier natif, confirme dans le code source de l'agent (tools/memory_tool.py, fonction get_memory_dir() -> {HERMES_HOME}/memories/MEMORY.md). C'est celui injecte automatiquement dans le prompt systeme a chaque session (bloc "MEMORY (your personal notes)").
  • /opt/data/MEMORY.md — fichier orphelin, JAMAIS lu par le moteur natif. En-tete affichait une limite de 2200 caracteres, deja depassee (3469 car.), contenu date du 01/06/2026 (services decommissionnes references comme actifs : Carbone, Gotenberg, Pandoc, pptx-tt-api, Paperless, Trilium ; port Baserow 3888 obsolete).

Verifie par comparaison : hermes-nyora et hermes-perso n'ont PAS ce fichier orphelin, uniquement memories/MEMORY.md (2181 et 2237 car. respectivement, sous budget). C'est un artefact propre a hermes-tt.

Cause racine probable : boot.md de hermes-tt (et de hermes-nyora, meme formulation) contient l'instruction generique "Lire MEMORY.md" sans chemin absolu. Chez nyora, un seul fichier porte ce nom -> pas d'ambiguite. Chez TT, deux fichiers portent ce nom -> l'agent, en suivant sa checklist boot au pied de la lettre, a pu lire (et tenter de mettre a jour) le mauvais fichier, expliquant le signalement de "saturation" (2902/2200 puis 3469/2200 car.) alors que le vrai fichier memoire actif n'etait pas concerne.

Correle avec observation Nabil : classement reactivite/justesse des instances Perso > Nyora > TT. Perso n'a meme pas de boot.md (aucune instruction de re-lecture manuelle). Nyora a boot.md mais pas de doublon. TT a boot.md ET un doublon -> ambiguite reelle, unique a cette instance. Hypothese plausible de contribution a la lenteur/defauts de raisonnement observes sur TT (contexte pollue par des faits perimes/contradictoires en plus du bloc memoire natif correct).

Action : fichier /opt/data/MEMORY.md supprime sur hermes-tt apres verification code source (non lu par le moteur). Contenu archive ci-dessous pour tracabilite. boot.md corrige pour lever l'ambiguite (chemin explicite, precision que le bloc memoire natif est deja auto-injecte, pas de relecture manuelle necessaire).

Contenu archive avant suppression (/opt/data/MEMORY.md, 06/08/2026)

# Mémoire Environnement
*limite : 2200 caractères — distiller à chaque mise à jour*

## Stack NAS
IP : 192.168.100.33 | DSM : Ahmed_-_Yesmine | user : Best0f
Réseau Docker : n8n | RAM : 20Go

## Services Docker actifs
n8n, Baserow (port 3888), Carbone, Gotenberg, Pandoc
pptx-tt-api, document-factory, Paperless, Trilium
Pingvin-Share, Portainer, Gitea (3232)

## Hermes Platform
hermes-tt : workspace 3010 · agent 8650
hermes-nyora : workspace 3020 · agent 8660
hermes-perso : workspace 3030 · agent 8670

## Baserow — Accès
Token RLA : XGCwbfgwg8ZiLVb4dxEfagWa7XptyUcM
URL interne : http://Baserow:3888
URL externe : https://baserow.bolbol.tn
Schéma complet : /opt/data/obsidian/config/baserow-schema.md (LIRE EN PREMIER)

## Baserow — Tables clés
T856 : Marchés RLA Zone Sud (55 marchés actifs au 30/04/2026)
T857 : Historique Avancement (snapshots mensuels)
T872 : Appels d'Offres en cours (pipeline 2026)
T998 : CI-CPT Zone Sud consolidé
T1006 : FB Zone Sud consolidé

## Situation marchés — 01/06/2026
- 4 non-renouvellements reçus : ECHABAKET (Lots 02+04 AO 58/2024) + SOTEL SUD (Lots 09+13 AO 66/2024)
- Avenants en cours : Lot 02 → YASMINE TELECOMS | Lot 04 → ATS
- Nouveaux marchés : Lot 09 → DR Gabes OK + quantitatifs reçus | Lot 13 → DR Kebili en attente
- 3 marchés AO 29/2025 + AO 31/2025 : fin contractuelle 13/05/2026 dépassée
- Pipeline AO 2026 : ~3.6 MDT en cours d'instruction

## Modèle par défaut
deepseek/deepseek-v4-flash (OpenRouter)

## Points actifs
- Schéma Baserow complet ajouté : 2026-06-01
- Modèle corrigé : GLM → DeepSeek V3.2 : 2026-06-01
- Workflow Marche RLA Sync validé : execution 25330 success 01/06/2026

Dernière mise à jour : 2026-06-01

## Historique Avancement — Table 857 (mis à jour 01/06/2026)

Total snapshots : 277 entrées
Couverture par mois :
  2025-12 : 43 entrées ✅ (13 marchés)
  2026-01 : 46 entrées ✅ (35 marchés)
  2026-02 :  3 entrées ⚠️ (incomplet — workflow non déclenché)
  2026-03 :  0 entrées ❌ (manquant — données non récupérables)
  2026-04 : 110 entrées ✅ (55 marchés × Financier + Physique — créé le 01/06/2026)
  2026-05 à 2027-01 : entrées issues des dates contractuelles (date_fin)

Snapshot 30/04/2026 : données arrêtées — référence officielle du portefeuille.
Mars 2026 : snapshot absent, données historiques perdues.
Février 2026 : incomplet (3 entrées seulement).

Format snapshot table 857 :
  Marche : [row_id table 856]
  Date_Releve : "AAAA-MM-JJ"
  Valeur : montant TND (avt_fin pour Financier, avt_phy pour Physique)
  Type_Avancement : "Financier" ou "Physique" (string direct, pas {"value":...})
  Observation : "Snapshot auto JJ/MM/AAAA — id_marche"

Pour créer un nouveau snapshot mensuel :
  python3 /tmp/snap_apr.py (adapter DATE et nom fichier)
  Ou via workflow n8n Marche RLA Sync (ID: 8RSSgxRogaIMsxgm)

## Audit Table 857 — État final (01/06/2026)

Total : 387 entrées (379 + 8 complétées)

| Date | Entrées | Source | Qualité |
|---|---|---|---|
| 2025-12-31 | 39 | Workflow Marche RLA Sync | ✅ TND réels |
| 2026-01-31 | 43 | Workflow | ✅ TND réels |
| 2026-02-28 | 55 | Workflow + complété | ✅ 51 TND + 4 Pas de PO |
| 2026-03-31 | 55 | Workflow + complété | ✅ 51 TND + 4 Pas de PO |
| 2026-04-30 | 110 | Créé manuellement | ✅ 55 marchés × Fin+Phy |

Historique % physique par marché (Déc25→Avr26) injecté dans SOUL.md via PPTX officiels.