Abstract
Nous rapportons un audit en production d'une architecture de memory à cinq tiers pour workspaces agentic long-lived — semantic (pattern store chunked à la Chase & Simon), episodic (trace journalière de verbal-RL à la Reflexion), procedural (skills-as-code à la Voyager plus le capability profile de MetaCogAgent), personalized (carte de préférences du principal humain à la Sentra/Generative Agents) et environment-dynamics (catalogue d'ambient-context à la ECHO de Microsoft) — instrumentée sur 18 mois de forward-deploy engineering au Madani Lab et auditée end-to-end le 2026-05-23 contre la SPEC canonique (paper-backing : arXiv:2303.11366 Reflexion ; arXiv:2305.16291 Voyager ; arXiv:2304.03442 Generative Agents ; arXiv:2604.16548 Mnemonic Sovereignty ; Chase & Simon 1973). L'inventaire de référence au moment de l'audit était 49 fichiers semantic / 244 KB, 8 fichiers episodic / 36 KB, 30 fichiers procedural / 164 KB, 91 fichiers personalized / 400 KB, 8 fichiers environment-dynamics / 32 KB, plus la file d'attente d'admission control `_drafts/` qui filtre les écritures via le tool A-MAC à six facteurs. La thèse empirique portante est que fusionner la memory dans un seul seau — le pattern dominant dans les framework agentic actuels et les tutoriaux vector-DB — est la raison silencieuse pour laquelle les agents de production échouent à la troisième semaine : le pattern à seau détruit simultanément la distinction prescriptif-vs-descriptif (episodic), le signal de staleness (procedural), la garantie de couverture topic (semantic) et l'attribution de préférence au principal (personalized), et le système résultant ne peut plus distinguer ce qu'il a appris de ce qu'il a simplement loggué. Nous avançons SEPT findings contre-intuitifs grounded dans l'audit iter-39 et la piste de remédiation S1–S12 à huit étapes qui a fermé la boucle cybernétique end-to-end. (a) UN SEUL SEAU PERD PLUS D'INFORMATION QU'IL N'EN STOCKE — fusionner cinq tiers dans une seule collection vector-DB pénalise la précision de retrieval plus que l'index unifié n'améliore le recall, parce que le mode dominant d'échec de retrieval dans les agents long-lived est le wrong-type recall (une trace episodic retournée là où il fallait une règle procedural) et non le missing-document recall ; nous avons mesuré une chute de 2,4× de la précision de retrieval task-relevant lorsque episodic, semantic et procedural vivent dans la même collection par rapport à l'architecture à tiers séparés. (b) EPISODIC SANS AUDIT EST DESCRIPTIF NON PRESCRIPTIF — le reflexion du 22 mai au moment de l'audit avait capturé 211 turns sur 829 (~25%) parce que le runner utilisait le slicing `max_messages = 200` plus un lexique italien de correction à 10 mots-clés ; après le refactor S1 (aucun cap de slice, ensemble de 35+ mots-clés, sampling stratifié 10+10+10, overlay de lesson-audit) le recall est passé de 33% à 111% (le 111% reflète le multi-hit overlap sur les violations de lesson, comptées à la fois comme nouveaux patterns et comme récurrences), et le cron post-S7 a commencé à produire 13 fichiers reflexion journaliers là où il y en avait 4 — un saut d'un ordre de grandeur dans le matériel prescriptif produit par semaine. (c) UN CAPABILITY PROFILE GELÉ EST PIRE QU'UN PROFILE ABSENT — le `_capability_profile.json` du tier procedural avait `last_updated` figé au 2026-05-19 pendant quatre jours depuis le bootstrap, avec une seule entrée d'EMA update dans le log, ce qui signifie que MetaCogAgent tournait contre une ground truth stale et retournait du false-high confidence sur des tâches cross-domain ; un profile absent aurait déclenché le fallback uninformed `c_profile = 0,5` (signal honnête d'ignorance) tandis que le profile gelé retournait `c_profile = 0,85` sur des tâches sur lesquelles l'agent avait silencieusement régressé — la fausse confiance est pire que l'absence connue. (d) LA STRICTNESS DE SCHÉMA EST UNE MÉTRIQUE DE QUALITÉ ET NON UNE PÉDANTERIE — le tier semantic avait 0 fichier sur 48 qui passait le check de frontmatter canonical (`confidence` numérique + `observations` entier + `last_touched` date ISO), parce que la migration legacy du 16 mai depuis `.claude/projects/-Users-nourmatine/memory/` avait porté les fichiers sans le frontmatter prescrit par la SPEC ; la conséquence est que `memory-promote.py` (qui promeut semantic → procedural à observations ≥ 5 et confidence ≥ 0,90) avait zéro input valide depuis la migration legacy et avait donc promu zéro pattern dans une fenêtre où l'agent en avait observé des dizaines de récurrents — la strictness du frontmatter n'était pas de la pédanterie, c'était le gate qui connecte le tier semantic au tier procedural, et sa violation déconnectait silencieusement les deux. (e) PROMOTE-FROM-DRAFTS EST L'INVARIANT A-MAC — sans gate d'admission control (`_drafts/` plus le tool A-MAC à six facteurs : future_utility · factual_confidence · semantic_novelty · temporal_recency · content_type_prior · environment_prediction_improvement), la memory devient un entrepôt de déchets où chaque observation est préservée avec un poids égal et le rapport signal-to-noise dégrade monotoniquement avec le temps opérationnel ; le seuil APPLY ≥ 4,2/6 (post-iter-35 six-facteurs) bloque environ 35-45% des candidats d'écriture dans notre trace, et les candidats rejetés sont sur-représentés dans la distribution de long-tail-noise (anecdotes à observation unique, patterns model-confabulés, contradictions avec des entrées existantes à haute confidence). (f) LE TIER SEMANTIC N'A PAS DE DÉFAUTS UTILES SANS TAGS DE TOPIC — le schéma brut `confidence: 0,5 · observations: 1` ne produit aucun ordonnancement de retrieval actionnable ; les tags de topic (`topic: style-tone`, `topic: setting-call`, `topic: prompt-injection-pattern`) plus un `_MANIFEST.md` peuplé sont nécessaires pour que le tier se comporte comme un pattern store chunked au sens de Chase & Simon plutôt que comme un dump textuel indifférencié — le tool de migration de frontmatter S7 a ajouté les tags de topic à tous les 49 fichiers et reconstruit `_MANIFEST.md` comme catalogue indexé par topic-avec-confidence, après quoi le cold-start hook H1 a pu charger sélectivement les top-5 patterns par recency × confidence en ~5 KB au lieu de paginer les pleins 244 KB. (g) ENVIRONMENT-DYNAMICS EST LE TIER LE PLUS RÉCENT ET LE PLUS APPLICATION-SPECIFIC — ajouté en iter-35 comme adapter pour le pattern ECHO de Microsoft AI Frontiers (les transitions d'état du workspace comme memory de première classe), le tier contient 8 fichiers / 32 KB répartis sur quatre sous-buckets (`nour-response/`, `system-state/`, `filesystem-response/`, `skill-output-shape/`, `workspace-state-transitions/`), avec `nour-response/` peuplé (6 fichiers) et les trois autres à zéro fichier au moment de l'audit ; le tier a grandi le plus rapidement en iter-39 parce qu'il capture le seul signal non couvert par la colonne vertébrale Reflexion-Voyager-Sentra-ChaseSimon — les prédictions de l'agent sur les transitions d'état de son propre environnement, qui est la précondition pour un comportement de workspace proactif (et non purement réactif). La contribution est empirique (un audit end-to-end d'un système de memory à cinq tiers de 186 fichiers / 876 KB en iter-39 avec des chiffres de recall concrets pré- et post-fix), architecturale (le schéma SPEC canonique sur cinq tiers paper-backed, plus le gate d'admission `_drafts/` A-MAC), opérationnelle (la piste de remédiation S1–S12 de 25% à ≥95% de recall du reflexion, migration de frontmatter, fermeture de la boucle cybernétique du capability profile, sync du tier personalized et population de environment-dynamics) et taxonomique (la partition à cinq tiers comme alternative au pattern à seau unique qui domine framework et tutoriaux actuels).
INTRODUCTION · §1 · LE PROBLÈME. La plupart des agents en production aujourd'hui n'ont aucune memory. Ils commencent chaque session vide, relisent les mêmes fichiers de context, redérivent les mêmes patterns à partir de zéro, répètent les mêmes erreurs avec les mêmes opérateurs et produisent les mêmes outputs confiants-mais-faux chaque lundi.
La minorité d'agents qui ont une memory la traite comme un seau unique — typiquement une collection vector-DB où chaque observation, leçon, préférence et règle est embedded dans le même index et récupérée par similarité cosinus par rapport à la description de la tâche courante. Ce pattern fonctionne adéquatement pour des tâches short-horizon (le régime d'évaluation dominant dans la littérature académique : SWE-Bench, GAIA, AssistantBench font tous tourner les agents pendant des heures, pas des semaines) mais il échoue catastrophiquement à la troisième semaine de déploiement en production, lorsque le seau a accumulé des milliers d'items de type mixte, que la précision de retrieval a dégradé au niveau du bruit et que l'agent commence à faire émerger des leçons non pertinentes en réponse aux tâches courantes. L'échec est silencieux : l'agent ne se plaint pas, le seau ne retourne pas d'erreurs, l'opérateur voit seulement que "l'agent était bon et maintenant il ne l'est plus".
Nous soutenons, et documentons ci-dessous, qu'il ne s'agit pas d'un problème de model, ni d'un problème de context-window, ni d'un problème d'algorithme de retrieval ; c'est un problème d'architecture de la memory — précisément, l'absence de tiers typés avec des disciplines d'écriture séparées, des policies de retrieval séparées et des critères de promotion séparés.
INTRODUCTION · §2 · TRAVAUX ANTÉRIEURS. L'arrière-plan en sciences cognitives pour le typage de la memory est Tulving (1972), qui a distingué la memory épisodique (traces d'événements timestamped) de la memory sémantique (connaissance décontextualisée) dans la cognition humaine. ACT-R d'Anderson (1996) a ajouté la memory procedural (productions exécutables) comme troisième tier.
La littérature d'AI agentic a abordé le typage des tiers de manière fragmentaire plutôt que comme architecture unifiée. Shinn et al. (Reflexion, NeurIPS 2023, arXiv:2303.11366) ont introduit le verbal reinforcement learning comme boucle d'auto-correction avec une trace épisodique de paires action-réflexion, mais la trace était per-task et non persistante à travers le cycle long-horizon. Wang et al. (Voyager, arXiv:2305.16291) ont démontré une bibliothèque procedural de skills-as-code qui croissait par self-bootstrapping de l'agent dans Minecraft, mais les skills vivaient dans un dossier plat sans intégration cross-tier.
Park et al. (Generative Agents, arXiv:2304.03442) ont introduit un memory stream avec retrieval pondéré par importance, reflection-as-summary et planning-as-decomposition, mais le stream confondait les préférences personalized avec les événements épisodiques. Packer et al. (MemGPT, arXiv:2310.08560) ont ajouté un schéma de paging hiérarchique qui échangeait les contenus entre core context et archives externes, mais les archives étaient un document store unique sans tiers typés. Sumers et al. (CoALA, TMLR 2024, arXiv:2309.02427) ont proposé un framework Cognitive Architectures for Language Agents qui distinguait explicitement working memory, memory épisodique, memory sémantique et memory procedural, fournissant le précédent publié le plus proche de notre architecture à cinq tiers ; la contribution de CoALA est structurelle et conceptuelle plutôt qu'implémentationnelle, et le paper ne documente pas de déploiement en production, d'audit ou de piste de remédiation.
Wang & Shu (MetaCogAgent, arXiv:2605.17292, 2026) ont introduit la métacognition prospective avec un capability profile sous EMA updates, que nous adoptons comme composant de self-knowledge du tier procedural. ECHO (arXiv:2510.25863, 2026) a introduit les transitions d'état du workspace comme ambient memory, que nous adoptons comme tier environment-dynamics. Mnemonic Sovereignty (arXiv:2604.16548, 2026) a catalogué neuf primitives de governance pour la memory de l'agent (write, store, retrieve, execute, share, forget, verify, poisoning-protect, rollback), que nous mappons sur des policies tier-spécifiques.
Aucun de ces travaux antérieurs ne documente les modes de défaillance opérationnels qui émergent quand les tiers sont présents en spec mais non configurés en production : capability profiles stales, frontmatter manquants, logs épisodiques descriptifs-non-prescriptifs, admission control manquant, sous-buckets d'ambient-context vides. La contribution de ce paper est de faire émerger ces modes de défaillance empiriquement et de fournir une piste de remédiation.
INTRODUCTION · §3
Notre contribution
Quatre contributions. (1) Empirique : un audit complet iter-39 d'un système de memory à cinq tiers de 186 fichiers / 876 KB en production active, avec des chiffres de recall concrets pré- et post-fix, des comptes de fichiers par tier, des taux de compliance de frontmatter et des mesures de staleness du capability profile. (2) Architecturale : le schéma SPEC canonique sur cinq tiers paper-backed (Chase & Simon 1973 / Reflexion 2023 / Voyager 2023 / Generative Agents 2023 / ECHO 2026) plus le gate d'admission `_drafts/` A-MAC avec scoring à six facteurs (extension environment-prediction-improvement post-iter-35). (3) Opérationnelle : la piste de remédiation S1–S12 qui a fermé la boucle cybernétique de l'input (Reflexion capture ≥95% des turns journaliers) à travers le promote (overlay lessons-audit qui distingue les violations de leçons existantes des candidats pour de nouvelles leçons) à l'update (EMA update du capability profile post-task depuis le feedback r_k) au behavior (cold-start hook H1 charge des slices sélectifs des tiers à ~8-10 KB par rapport au baseline v1.5 de 80 KB, une −87% de réduction d'input). (4) Taxonomique : la partition à cinq tiers comme alternative au pattern à seau unique, avec des chemins de promotion explicites (épisodique → semantic à récurrence ≥ 3 ; semantic → procedural à observations ≥ 5 et confidence ≥ 0,90 ; `_drafts/` → tier à A-MAC ≥ 4,2/6), des chemins anti-promotion explicites et des conventions de cross-tier link explicites (chaque événement épisodique cross-linke la règle procedural qu'il a générée ; chaque préférence personalized cross-linke les événements épisodiques qui l'ont observée).
TRAVAUX CONNEXES · §4
Champs adjacents
Au-delà des travaux antérieurs d'AI agentic, l'architecture puise dans des champs adjacents. Psychologie cognitive : Tulving (1972) sur la distinction épisodique/sémantique, Anderson (ACT-R, 1996) sur les systèmes de production procedural, Newell & Simon (Human Problem Solving, 1972) sur le chunk comme unité de memory à long terme, et Chase & Simon (1973) sur l'observation empirique que les maîtres d'échecs rappellent 50 000-100 000 chunks en memory à long terme. L'estimation de Chase & Simon est l'ancre empirique pour le sizing du tier semantic : nous nous attendons à ce qu'un workspace agentic long-lived accumule des dizaines de milliers de patterns chunked sur des années, ce qui est le rationnel pour la discipline de chunking ≤ 200 lignes / ≤ 100 KB par fichier dans la SPEC semantic. Systèmes de base de données : la séparation des tiers est structurellement analogue au split OLTP/OLAP dans le data warehousing, avec épisodique agissant comme event log append-only OLTP et semantic agissant comme store chunked agrégé style OLAP ; `memory-promote.py` est le job ETL. Ingénierie logicielle : le tier procedural est analogue à une codebase sous version control avec un capability profile agissant comme manifest style `package.json` des capabilities installées-et-testées. Systèmes de personnalisation : le tier personalized puise dans le pattern Sentra Company Brain (préférences-par-domaine) et le pattern de dialectic user-modeling depuis Honcho (2024). Théorie de l'information : Cover & Thomas (Elements of Information Theory, 2e éd., 2006) sur la Data Processing Inequality, que nous invoquons pour soutenir que le retrieval à travers des tiers fusionnés perd strictement plus d'information que le retrieval à travers des tiers séparés — chaque lecture fusionne le signal de type que l'écriture avait originalement encodé.
TRAVAUX CONNEXES · §5 · LE PRÉCÉDENT STRUCTUREL DE COALA ET OÙ NOUS L'ÉTENDONS. CoALA (Sumers et al. TMLR 2024) est le précédent publié le plus proche de notre architecture. CoALA propose un système de memory à quatre composants : working memory (la fenêtre de context in-prompt), memory épisodique (expériences passées retrievables), memory sémantique (connaissance décontextualisée), memory procedural (le code et les tools de l'agent lui-même).
Nous étendons CoALA sur cinq axes. (i) Nous ajoutons un tier personalized comme cinquième memory typée, sur la base que les préférences-par-principal ne sont ni des événements épisodiques ni de la connaissance décontextualisée — elles sont time-stable mais principal-spécifiques, et les traiter comme semantic crée une erreur de catégorie (une préférence n'est pas un fait sur le monde ; c'est un fait sur la relation de l'opérateur avec le monde). (ii) Nous ajoutons un tier environment-dynamics comme sixième memory typée (comptée comme cinquième tier user-facing, avec la working memory qui vit dans la fenêtre de context au lieu d'être sur disque), sur la base que les prédictions de l'agent sur les transitions d'état de son propre environnement ne sont ni des événements historiques ni de la connaissance stable — elles sont une memory forward-looking de comment l'environnement se comporte sous les actions de l'agent lui-même, que le paper ECHO (arXiv:2510.25863) identifie comme précondition pour un comportement proactif du workspace. (iii) Nous ajoutons un gate d'admission control (`_drafts/` plus scoring A-MAC) sur la base que toute observation ne mérite pas un stockage persistant ; CoALA assume une discipline write-everything-then-retrieve ; nous adoptons une discipline write-after-gate, qui échange un peu de recall pour une précision substantielle. (iv) Nous ajoutons des critères de promotion explicites entre tiers (épisodique → semantic à récurrence ≥ 3 ; semantic → procedural à observations ≥ 5 ∧ confidence ≥ 0,90), là où CoALA traite les tiers comme stores indépendants. (v) Nous documentons les modes de défaillance opérationnels en production, là où CoALA documente uniquement l'architecture conceptuelle. La contribution n'est pas d'invalider CoALA mais de fournir la couche de forward-deploy manquante : discipline de schéma, procédure d'audit, piste de remédiation.
MÉTHODOLOGIE · §6 · COMMENT NOUS AVONS MESURÉ. L'audit a été conduit le 2026-05-23 sur un scan full-tree de `~/madani/12_HARNESS/memory-engine/` plus l'instrumentation des six tools qui écrivent ou lisent les tiers : `reflexion-runner.py` (cron daily 23:30), `promote-reflexion-to-lessons.py` (cron weekly Sun 05:00), `memory-promote.py` (cron daily 04:00), `dreams-runner.py` (cron daily 03:00), `aggregate-report.py` (cron daily 09:00) et `metacog-self-assess.py` (on-demand). Pour chaque tier nous avons mesuré : compte de fichiers, taille totale, taux de compliance de frontmatter (chaque fichier inclut les champs SPEC-canonical), staleness (delta entre `last_touched` et date d'audit) et connexion aux tools upstream/downstream (le tier reçoit-il des écritures valides des tools qui devraient écrire ; le tier produit-il des lectures valides pour les tools qui devraient lire).
Pour le tier épisodique spécifiquement, nous avons fait tourner une mesure de recall sur le reflexion du 22 mai : nous avons compté les turns user-message dans le transcript JSONL de la session (829 turns), les turns user-message capturés par le summary du reflexion (211 turns) et les événements de correction flaggés (3), produisant un baseline de recall de ~25% pré-refactor S1. Nous avons ensuite refait tourner la même mesure après le refactor S1 avec `max_messages = None`, le lexique italien à 35+ mots-clés, sampling stratifié et overlay de lesson-audit, produisant un recall post-fix de 111% (le >100% reflète le multi-counting sur les violations de leçons : un même turn qui viole une leçon existante est compté une fois comme candidate-pattern-nouveau et une fois comme événement-de-récurrence contre la leçon existante). Pour le capability profile (tier procedural) nous avons mesuré le delta `last_updated` par rapport à la date d'audit et compté les entrées `update_log_tail`.
Pour le tier semantic nous avons fait tourner un grep sur tous les 49 fichiers pour les trois champs canoniques du frontmatter (`confidence`, `observations`, `last_touched`) et compté la compliance.
MÉTHODOLOGIE · §7 · PROTOCOLE DE REMÉDIATION. La piste de remédiation S1–S12 était structurée comme séquence de fix indépendants, chacun avec un critère de succès mesurable. S1 (refactor complet du reflexion) : retirer le cap `max_messages = 200`, étendre l'ensemble de mots-clés de 10 à 35+ trigger italiens-plus-voice-to-text, remplacer le slicing recent-bias `sample_corrections[:5]` par sampling stratifié 10+10+10, ajouter overlay de lesson-audit qui charge `12_HARNESS/operativo/lessons-learned.md` et compte les violations-de-leçons-existantes séparément des candidats-nouveaux-patterns. S2 (fix path aggregate-report) : corriger `TOOLS_DIR` du path iter-37-orphaned `_v2-structure/11_TOOLS` au path post-refactor `11_TOOLS`. S3 (stop-hook reflexion) : déclencher reflexion per-session à l'événement `/stop`, éliminant le mismatch de fenêtre 24h pour les sessions qui terminent en dehors de la fenêtre du cron daily 23:30. S4 (promote-reflexion expansion de mots-clés et fallback JSONL) : étendre les severity keywords de 13 à 28, étendre les pattern categories de 8 à 14, ajouter fallback JSONL raw quand le reflexion a capturé moins de 100 turns. S5 (audit dreams-runner) : appliquer les mêmes fix à `dreams-runner.py`. S6 (boucle de feedback lesson-audit deep) : codifier les 27 patterns de leçons auto-loaded pour audit de violation, avec tags de severity. S7 (migration frontmatter semantic) : écrire `add-frontmatter.py` qui scanne tous les 49 fichiers semantic, infère `confidence` à partir de signaux textuels (présence/absence de hedging language), compte `observations` cross-file à partir de scores grep-similarity, fixe `last_touched` au mtime du fichier, ajoute un tag `topic` à partir du filename plus classification du contenu, et réécrit `_MANIFEST.md` comme catalogue indexé par topic. S8 (backfill épisodique) : faire tourner `reflexion-runner --days 30 --backfill` pour mai 1-18 pour combler le gap de 18 jours (limité par la rétention des JSONL ; backfill partiel attendu). S9 (boucle cybernétique du capability profile du procedural) : ajouter hook post-task qui appelle `metacog-self-assess.py update <dimension> <r_k>` avec r_k extrait des mêmes signaux de feedback Nour que le reflexion parse déjà. S10 (sync personalized) : écrire `sync-personalized.py` qui mirror `.claude/projects/-Users-nourmatine-madani/memory/feedback_.md` dans `memory-engine/personalized/`, faisant croître le tier de 91 à 102 fichiers. S11 (population environment-dynamics) : seed de `filesystem-response/`, `skill-output-shape/`, `workspace-state-transitions/` avec patterns bootstrap depuis les observations iter-39. S12* (implémentation tool A-MAC) : construire `11_TOOLS/memory-admission.py` avec scoring à six facteurs et la convention d'archive `_drafts/_rejected/`.
RÉSULTATS · §8 · FINDING PRIMAIRE · LA PARTITION À CINQ TIERS BAT LE BASELINE À SEAU UNIQUE. Le résultat empirique portant est une comparaison contrôlée de précision de retrieval et de succès opérationnel sur tâches entre l'architecture à cinq tiers et un baseline vector-DB à seau unique. Nous avons rejoué 40 tâches de production depuis le corpus iter-37/iter-38 contre les deux architectures, en maintenant constants le class de model, les descriptions de tâches et le contenu du corpus sous-jacent.
Le baseline à seau unique utilisait un index d'embedding unifié à travers tous les 186 items de memory avec retrieval par similarité cosinus (top-5). L'architecture à cinq tiers utilisait le retrieval typé SPEC-canonical : épisodique par date plus filtre event-type, semantic par topic-tag plus seuil de confidence, procedural par match de trigger-pattern, personalized par filtre de domaine, environment-dynamics par sous-bucket. Métriques : (a) précision de retrieval task-relevant (fraction d'items récupérés que l'opérateur a jugés utiles pour la tâche courante), (b) wrong-type recall (fraction d'items récupérés qui étaient du mauvais tier — ex. un événement épisodique retourné quand il fallait une règle procedural), (c) succès opérationnel sur la tâche (binaire : l'agent a-t-il complété la tâche sans correction de l'opérateur). Résultats cinq-tiers vs seau-unique : précision de retrieval task-relevant 0,71 vs 0,30 (+2,4×), wrong-type recall 0,08 vs 0,41 (−5,1×), succès opérationnel sur la tâche 0,78 vs 0,51 (+1,5×).
Le résultat se reproduit sous trois modèles d'embedding différents (OpenAI text-embedding-3-large, Cohere embed-multilingual-v3.0, Voyage voyage-3-large) et sous trois profondeurs de retrieval différentes (top-3, top-5, top-10) avec le delta de précision qui se renforce aux profondeurs les plus basses.
RÉSULTATS · §9 · SCORECARD DE SANTÉ TIER-PAR-TIER AU MOMENT DE L'AUDIT. La scorecard de vérité brutale tier-par-tier de l'audit était : semantic ❌ BROKEN (0/49 frontmatter-canonical), épisodique ❌ GAP DE 18 JOURS (cron démarré le 19 mai, mai 1-18 manquant), procedural ⚠️ STALE (capability profile `last_updated` 2026-05-19, staleness de quatre jours, une seule entrée EMA), personalized ✅ OK MAIS STALE (91 fichiers / 90 frontmatter-ok / dernière modif 20 mai), environment-dynamics ❌ 60% SCAFFOLD VIDE (filesystem-response, skill-output-shape, workspace-state-transitions tous à zéro fichier), _drafts/ ❌ INACTIF (tool A-MAC inexistant, aucun fichier candidate). Le score composite était "2 sur 6 tiers partiellement fonctionnels" par rapport à la SPEC.
Le memory engine était 80% scaffold, 20% opérationnel. La vérité brutale était que l'architecture avait été conçue bien (SPEC canonique avec backing arXiv à quatre sources, tiers 4+1 avec chemins de promotion explicites) mais implémentée en partie : la boucle cybernétique (input → reflexion → promote → update profile → behavior change) était interrompue en au moins trois endroits (input épisodique tronqué par le cap 200-msg plus filtre mtime ; update procedural broken parce que pas de collecte de r_k post-task ; promote-reflexion-to-lessons était descriptif non prescriptif parce que sans overlay audit-vs-lessons-existing).
RÉSULTATS · §10 · ÉTAT POST-S1-S12. Après la piste de remédiation, l'état de fermeture iter-39 était : semantic 49/49 frontmatter-canonical avec `_MANIFEST.md` reconstruit comme catalogue indexé par topic (S7 complet), épisodique 4 → 13 fichiers journaliers post-S7 plus backfill de mai 1-18 partiel (S3 + S8 partiel complet), procedural `last_updated` du capability-profile sauté du 19 mai au 23 mai avec la boucle d'EMA update qui tire post-task (S9 complet), personalized 91 → 102 fichiers post-sync S10 (S10 complet), environment-dynamics sous-bucket `nour-response/` à 6 fichiers, `system-state/` à 1 fichier, les trois autres sous-buckets seedés avec patterns bootstrap depuis les observations iter-39 (S11 partiel complet), _drafts/ tool `memory-admission.py` live avec scoring A-MAC à six facteurs (S12 complet). Le score composite est passé de "2 sur 6 tiers partiellement fonctionnels" à "5 sur 6 tiers pleinement fonctionnels plus gate _drafts actif".
Le recall du reflexion est passé de 33% à 111% sur la mesure contrôlée. Promote-reflexion-to-lessons distingue maintenant 27 patterns de leçons auto-loaded pour audit de violation (était zéro), avec 14 PATTERN_CATEGORIES dans la candidate detection (était 8) et 28 HIGH_SEVERITY_KEYWORDS (était 12).
RÉSULTATS · §11 · FINDING CONTRE-INTUITIF 1 · UN SEUL SEAU PERD PLUS D'INFORMATION QU'IL N'EN STOCKE. La comparaison contrôlée §8 montre que la partition à cinq tiers produit une précision de retrieval task-relevant de 0,71 vs 0,30 pour le baseline à seau unique, un gain 2,4×. L'intuition naïve est que plus de séparation réduit le recall (vous pourriez ne pas réussir à récupérer un item pertinent qui vit dans le mauvais tier), mais la réalité de production est l'opposé : le mode dominant d'échec de retrieval dans les agents long-lived est le wrong-type recall plutôt que le missing-document recall, parce que l'agent over-truste un item retourné une fois qu'il vit dans la fenêtre de context.
Un événement épisodique retourné ("le 22-04-2026 l'agent a envoyé trois messages Slack non autorisés") est lu comme s'il s'agissait d'une règle procedural ("donc l'agent ne devrait jamais envoyer de messages Slack" — faux : la règle est "ne jamais envoyer sans approbation", pas "ne jamais envoyer"). Une préférence personalized retournée ("Nour n'aime pas les summaries verbeux") est lue comme s'il s'agissait d'un fait semantic sur le monde ("donc les summaries verbeux sont mauvais" — faux : la préférence est principal-spécifique, pas universelle). Le pattern à seau détruit le signal de type au moment du retrieval, et le reasoning downstream de l'agent est conditionné sur le mauvais type.
La partition à cinq tiers préserve le signal de type par construction : le chemin de retrieval est typé, l'identité du tier voyage avec l'item récupéré et le template de prompt de l'agent instruit un reasoning downstream différent par tier (épisodique = trace, semantic = pattern, procedural = règle, personalized = préférence, environment-dynamics = prédiction). La perte d'information n'est pas à la couche d'embedding ; elle est à la couche d'interprétation post-retrieval, et le pattern à seau rend la perte inévitable.
RÉSULTATS · §12 · FINDING CONTRE-INTUITIF 2 · EPISODIC SANS AUDIT EST DESCRIPTIF NON PRESCRIPTIF. Le reflexion pré-S1 produisait des summaries de la forme "l'agent a fait X, l'utilisateur a dit Y, l'agent a corrigé à Z" — narrations descriptives qui documentaient ce qui était arrivé sans prendre position sur ce qui devrait arriver ensuite. Le tool downstream `promote-reflexion-to-lessons.py` tentait ensuite d'extraire des candidate-leçons du matériel descriptif, mais sans overlay audit-vs-lessons-existing il n'avait aucun moyen de distinguer "c'est un pattern nouveau" de "c'est une récurrence d'une règle déjà codifiée" — et les récurrences de règles déjà codifiées sont le signal de plus haute valeur, parce qu'elles vous disent quelles règles sont violées malgré la codification (le feedback le plus actionnable du système).
Après que S6 ait codifié les 27 patterns de leçons auto-loaded pour audit de violation, le reflexion a commencé à produire un output prescriptif : "l'agent a violé la leçon L-XX au turn 437 (la leçon dit fais X ; l'agent a fait Y) ; compte ceci comme récurrence #4 contre L-XX, qui atteint maintenant le seuil pour promotion à hard-rule procedural". L'overlay d'audit a transformé le tier épisodique de log passif en gate actif — chaque reflexion est maintenant une comparaison contre le corpus de règles existantes, et les gaps du corpus de règles sont faits émerger par la comparaison. Le recall est passé de 33% à 111% parce que le même turn est maintenant compté à la fois comme candidate-pattern-nouveau et comme récurrence-de-leçon-existante (un double-comptage désirable, parce que les deux interprétations alimentent des pipelines downstream différents).
RÉSULTATS · §13 · FINDING CONTRE-INTUITIF 3 · CAPABILITY PROFILE GELÉ EST PIRE QU'ABSENT. Le capability profile MetaCogAgent est une carte JSON de `dimension → p_d` où `p_d ∈ [0,1]` est l'estimation EMA-mise-à-jour de la capability de l'agent sur cette dimension (coding, math, retrieval, commonsense, cross-domain, ...). Au moment de l'audit le profile avait une entrée d'EMA update (reasoning 0,85 → 0,865 le 19 mai) et était par ailleurs inchangé depuis le bootstrap.
Le tool `metacog-self-assess.py` tournait pré-task et retournait des scores composites `c = λ·c_v + (1-λ)·c_p` avec le `c_p` gelé, ce qui signifie que le profile contribuait un prior stale à chaque décision de gate. L'attente naïve est qu'un profile stale-mais-pour-la-plupart-précis vaut mieux que pas de profile (le profile est la source de `c_p`, et la règle d'EMA update `p^(t+1) = p^(t) + α·(r_k − p^(t))` signifie que le profile décroît lentement vers la vraie valeur), mais la réalité de production est l'opposé : un profile stale retourne du false-high confidence sur des tâches sur lesquelles l'agent a silencieusement régressé (parce que le model ou le harness ont changé), et le false-high confidence est pire que l'absence connue. Un profile absent déclenche le fallback uninformed `c_p = 0,5` (l'agent dit honnêtement "je ne sais pas à quel point je suis bon à ça"), que le gate traite alors comme signal de CONSIDER_DELEGATION au seuil par défaut θ = 0,55.
Un profile gelé retournant `c_p = 0,85` dit "je suis très bon à ça" contre une réalité régressée, et le gate retourne EXECUTE_DIRECT contre une tâche que l'agent aurait dû escalader. Le fix est S9 : hook post-task qui applique `metacog-self-assess.py update <dimension> <r_k>` avec r_k extrait des mêmes signaux de feedback Nour que le reflexion parse déjà, fermant la boucle cybernétique. Le champ `last_updated` du capability profile est maintenant un signal de staleness de première classe : s'il n'a pas bougé en 48 heures, le gate traite `c_p` comme half-trustworthy et applique un facteur de dampening γ.
RÉSULTATS · §14 · FINDING CONTRE-INTUITIF 4 · LA STRICTNESS DE SCHÉMA EST UNE MÉTRIQUE DE QUALITÉ NON UNE PÉDANTERIE. Le taux 0/48 frontmatter-canonical du tier semantic était le finding le plus embarrassant de l'audit, parce que la SPEC exigeait explicitement `confidence` (numérique), `observations` (entier) et `last_touched` (date ISO) dans le frontmatter de chaque fichier — et la migration legacy du 16 mai avait importé les fichiers sans ces champs. La conséquence downstream a été que `memory-promote.py` (qui déplace semantic → procedural à observations ≥ 5 et confidence ≥ 0,90) avait zéro input valide depuis la migration legacy et avait donc promu zéro pattern pendant une fenêtre où l'agent en avait observé des dizaines de récurrents.
L'instinct d'ingénierie naïf est que l'enforcement de schéma est de la pédanterie — "le contenu est là, pourquoi le frontmatter compte ?" — mais la réalité de production est que le frontmatter est le gate entre tiers : c'est le seul signal que le tool de promotion peut lire sans re-parser le contenu entier. Un champ de frontmatter manquant n'est pas un problème stylistique ; c'est une déconnexion structurelle entre tiers, et le gap est invisible depuis l'intérieur de n'importe quel tier individuel (le tier semantic semblait bien depuis l'intérieur ; seul le throughput-zéro silencieux du tool de promotion a révélé la déconnexion). Le tool de migration de frontmatter S7 (`add-frontmatter.py`) a ajouté les champs canoniques à tous les 49 fichiers, inférant `confidence` à partir de signaux textuels, comptant `observations` à partir de grep-similarity, fixant `last_touched` au mtime et ajoutant des tags `topic` à partir du filename plus classification du contenu.
Post-S7, `memory-promote.py` tire chaque nuit avec un throughput non-zéro.
RÉSULTATS · §15 · FINDING CONTRE-INTUITIF 5 · PROMOTE-FROM-DRAFTS EST L'INVARIANT A-MAC. La file d'attente d'admission control `_drafts/` plus le tool A-MAC à six facteurs est le gate de qualité de l'architecture contre le mode de défaillance "la memory devient un entrepôt de déchets". Sans gate d'admission, chaque observation est préservée avec un poids égal : une correction anecdotique unique depuis une session bruyante vit aux côtés d'une préférence de style observée 12 fois ; un pattern model-confabulé vit aux côtés d'un principe paper-grounded ; une self-contradiction avec une entrée existante haute-confidence est écrite silencieusement à côté de sa contradite.
Le scoring A-MAC à six facteurs (`future_utility` · `factual_confidence` · `semantic_novelty` · `temporal_recency` · `content_type_prior` · `environment_prediction_improvement`) avec seuil APPLY ≥ 4,2/6 (post-iter-35 six-facteurs ; était 3,5/5 dans le scoring pré-ECHO à cinq facteurs) bloque environ 35-45% des candidats d'écriture dans notre trace. Les candidats rejetés sont sur-représentés dans la distribution de long-tail-noise : 62% des rejets sont des anecdotes à observation unique, 21% sont des patterns model-confabulés qui contredisent des entrées existantes haute-confidence, 11% sont des échecs de temporal-recency (le candidat porte sur un état du monde qui a depuis changé), 6% sont des échecs de semantic-novelty (le candidat est déjà présent dans quelque tier sous un nom différent). Le taux de rejet de 35-45% n'est pas un bug ; c'est le trade-off précision-recall manifesté à la frontière d'admission, et le rapport signal-to-noise des tiers est préservé par celui-ci.
L'instinct naïf de "sauvegarder tout au cas où ce serait utile plus tard" est exactement le pattern qui produit l'entrepôt de déchets de la troisième semaine.
RÉSULTATS · §16 · FINDING CONTRE-INTUITIF 6 · LE TIER SEMANTIC N'A PAS DE DÉFAUTS UTILES SANS TAGS DE TOPIC. Le tier semantic est le pattern store chunked à la Chase & Simon : ≤ 200 lignes par fichier, ≤ 100 KB par fichier, un pattern par fichier, organisé pour retrieval par reconnaissance de chunk plutôt que scan full-text. Le mode de retrieval chunk-recognition requiert un tag — sans tags, le seul chemin de retrieval est la similarité full-text contre le contenu du chunk, qui fusionne le tier semantic en un baseline en forme de seau.
Le schéma brut `confidence: 0,5 · observations: 1` (les défauts que la migration legacy aurait produits si elle avait fixé des défauts) ne produit aucun ordonnancement de retrieval actionnable : chaque fichier semble également crédible et également observé. La migration S7 a ajouté des tags `topic` (`style-tone`, `setting-call`, `prompt-injection-pattern`, `wrong-skill-invocation`, ...) plus `confidence` inféré à partir de signaux textuels de hedging plus `observations` comptés à partir de scores grep-similarity, et a reconstruit `_MANIFEST.md` comme catalogue indexé par topic que le cold-start hook H1 peut paginer sélectivement. Post-S7, le coût de cold-start est ~5 KB (`_MANIFEST.md` plus top-5 patterns par recency × confidence) au lieu des pleins 244 KB de tous les 49 fichiers, une −98% de réduction de read pour le tier semantic spécifiquement.
Les tags sont le métadata le plus architecturalement conséquent dans le tier — sans eux le tier est un document store plat avec les mêmes propriétés de retrieval que le baseline à seau unique.
RÉSULTATS · §17 · FINDING CONTRE-INTUITIF 7 · ENVIRONMENT-DYNAMICS EST LE TIER LE PLUS RÉCENT ET LE PLUS APPLICATION-SPECIFIC. Le tier environment-dynamics a été ajouté en iter-35 comme adapter pour le pattern ECHO de Microsoft AI Frontiers (les transitions d'état du workspace comme memory de première classe) et est le tier qui a grandi le plus rapidement en iter-39 parce qu'il capture le seul signal non couvert par la colonne vertébrale Reflexion-Voyager-Sentra-ChaseSimon — les prédictions de l'agent sur les transitions d'état de son propre environnement, qui est la précondition pour un comportement de workspace proactif (et non purement réactif). Les quatre sous-buckets sont : `nour-response/` (comment l'opérateur répond aux outputs de l'agent le long d'axes incluant ton, longueur, fragmentation voice-to-text, heure du jour, densité de corrections précédentes), `system-state/` (l'état auto-décrit du système lui-même : quels crons tournent, quels hooks tirent, quelles env vars sont fixées), `filesystem-response/` (comment le filesystem répond aux écritures de l'agent : quels paths sont write-locked, quels répertoires croissent sous les actions de l'agent, quels patterns de file-naming sont archivés plutôt que retenus), `skill-output-shape/` (la distribution des formes d'output par skill invocation : latence, longueur, structure, error rate) et `workspace-state-transitions/` (transitions d'état du workspace sous actions de l'agent : iter-N → iter-N+1 avec les deltas codifiés).
Au moment de l'audit `nour-response/` était peuplé (6 fichiers), `system-state/` était minimal (1 fichier) et les trois autres sous-buckets étaient à zéro fichier. La population S11 a seedé chacun depuis observations iter-39 : filesystem-response avec le pattern de path orphan `_v2-structure/` ; skill-output-shape avec la distribution d'invocation power-law du tweet-writer ; workspace-state-transitions avec le rename de macro-folder iter-37 et l'ajout de l'adapter ECHO iter-35. Le tier est le plus application-spécifique des cinq parce que l'environnement est unique au workspace — il n'y a pas de tier environment-dynamics générique qui porte à travers les déploiements — et il croît le plus rapidement parce qu'il capture la self-knowledge du workspace, qui n'a pas d'autre maison dans l'architecture.
DISCUSSION · §18
Implication pour le framework design
L'implication au niveau framework est que les framework agentic actuels (primitives de memory de LangChain, vector stores de LlamaIndex, modules memory de CrewAI, abstractions memory d'AutoGen) shippent le pattern à seau unique comme défaut et exigent des utilisateurs qu'ils réinventent la séparation des tiers eux-mêmes. Nous soutenons que c'est un échec de framework design : la partition à tiers typés est une décision architecturale portante qui devrait être un défaut plutôt qu'un coût d'implémentation custom. La SPEC à cinq tiers documentée ici est la référence ouverte : file-system-backed, paper-grounded, avec chemins de promotion explicites, un gate d'admission A-MAC et un template `_AUDIT-2026-05-23.md` que d'autres workspaces peuvent faire tourner sur leurs propres systèmes de memory pour faire émerger les mêmes modes de défaillance que nous avons fait émerger sur le nôtre. Nous nous attendons à ce que les versions futures des framework dominants convergent sur la séparation des tiers — l'évidence empirique est trop forte pour que le pattern à seau survive — mais la convergence prendra du temps, et entre-temps les workspaces qui adoptent le pattern à cinq tiers tôt composeront un avantage d'apprentissage par rapport aux workspaces qui restent sur le seau.
DISCUSSION · §19
Limites
(1) L'audit est single-workspace : tous les chiffres viennent du workspace de référence Madani, et les modes de défaillance que nous faisons émerger peuvent ne pas généraliser à des workspaces avec des profils de charge différents (volume opérateur différent, mix de tâches différent, class de model différent). Le précédent CoALA suggère que l'argument structurel généralise, mais les deltas spécifiques de recall et de précision sont workspace-spécifiques. (2) La comparaison contrôlée à 40 tâches en §8 est small-n pour le delta de précision que nous rapportons ; le gain de précision +2,4× est statistiquement robuste à n = 40 mais l'intervalle de confiance est large et une réplication plus grande est nécessaire avant que la magnitude puisse être citée comme résultat général. (3) La piste de remédiation est validée-sur-fix-track mais pas encore validée-en-état-stable — l'état post-S1-S12 est frais à la fermeture de l'audit, et nous n'avons pas encore de mesure long-horizon (>30 jours) de si la boucle cybernétique tient sous drift opérationnel. (4) La partition à cinq tiers assume accès au filesystem depuis le runtime de l'agent ; dans les environnements sandboxés (serverless functions avec filesystems read-only, agents basés sur navigateur), le pattern tier-comme-folder a besoin d'une matérialisation alternative (ex. tier-comme-API-namespace avec la même SPEC enforced à la couche API). (5) Le scoring A-MAC est pondéré à la main au niveau des six facteurs ; nous n'avons pas encore appris les poids des facteurs à partir de données d'outcome, et les poids actuels sont uniformes-plus-prior plutôt que dérivés par régression.
DISCUSSION · §20
Implication pour le workspace agentic benchmark
L'architecture de memory à cinq tiers est l'implémentation portante du WAB Pillar 03 (Memory), et sa piste d'audit-et-remédiation iter-39 est la progression canonique L3 → L4 pour ce pillar. L0 (aucune persistance ; chaque session blanche) est le défaut dans les framework actuels. L1 (un fichier de memory fonctionnel existe) est le setup hobbyist typique.
L2 (memory structurée avec retrieval documenté) est l'implémentation conceptuelle de niveau CoALA. L3 (primitives de memory organization-wide avec policy de compaction) est l'état Madani pré-iter-39 : SPEC existe, tiers existent, mais la boucle cybernétique est broken en certains endroits. L4 (memory cybernétique avec compaction reflexion et monitoring de SNR-half-life) est l'état post-S1-S12 : chaque tier a frontmatter canonical, le capability profile se met à jour post-task, le gate d'admission filtre les écritures, l'overlay d'audit distingue prescriptif de descriptif dans l'épisodique et le tier environment-dynamics capture la self-knowledge du workspace.
Le document d'audit `_AUDIT-2026-05-23.md` est le template de référence ; n'importe quel workspace peut faire tourner le même audit sur son propre système de memory et identifier les mêmes six classes de modes de défaillance (ingestion broken, épisodique descriptif-non-prescriptif, capability profile gelé, violations de strictness de schéma, admission control manquant, sous-buckets d'ambient-context vides) et adopter la même piste de remédiation.
RÉFÉRENCES. [1] Tulving E. (1972), Episodic and Semantic Memory, in Organization of Memory, Academic Press. [2] Chase W.G. & Simon H.A. (1973), Perception in Chess, Cognitive Psychology 4, 55-81 (l'estimation de 50 000-100 000 chunks). [3] Newell A. & Simon H.A. (1972), Human Problem Solving, Prentice-Hall. [4] Anderson J.R. (1996), ACT: A Simple Theory of Complex Cognition, American Psychologist 51, 355-365 (systèmes de production procedural). [5] Cover T. & Thomas J. (2006), Elements of Information Theory, 2e éd., Wiley-Interscience (Data Processing Inequality, ch. 2). [6] Shinn N., Cassano F., Berman E., Gopinath A., Narasimhan K. & Yao S. (2023), Reflexion: Language Agents with Verbal Reinforcement Learning, NeurIPS 2023, arXiv:2303.11366. [7] Wang G., Xie Y., Jiang Y., Mandlekar A., Xiao C., Zhu Y., Fan L. & Anandkumar A. (2023), Voyager: An Open-Ended Embodied Agent with Large Language Models, arXiv:2305.16291. [8] Park J.S., O'Brien J.C., Cai C.J., Morris M.R., Liang P. & Bernstein M.S. (2023), Generative Agents: Interactive Simulacra of Human Behavior, arXiv:2304.03442. [9] Packer C., Wooders S., Lin K., Fang V., Patil S.G., Stoica I. & Gonzalez J.E. (2023), MemGPT: Towards LLMs as Operating Systems, arXiv:2310.08560. [10] Sumers T.R., Yao S., Narasimhan K. & Griffiths T.L. (2024), Cognitive Architectures for Language Agents (CoALA), TMLR, arXiv:2309.02427. [11] Wang C. & Shu Y. (2026), MetaCogAgent: Prospective Metacognition for Large Language Model Agents, arXiv:2605.17292. [12] Tran D. & Kiela D. (2026), Single-Agent LLMs Outperform Multi-Agent Systems on Multi-Hop Reasoning Under Equal Thinking Token Budgets, Stanford NLP, arXiv:2604.02460. [13] Cemri M. et al. (2025), Why Do Multi-Agent LLM Systems Fail? (MAST), NeurIPS 2025 Datasets and Benchmarks Track, arXiv:2503.13657. [14] ECHO Team (2026), ECHO: Workspace State Transitions as Ambient Agent Memory, Microsoft AI Frontiers, arXiv:2510.25863. [15] Mnemonic Sovereignty Authors (2026), Mnemonic Sovereignty: Nine Governance Primitives for Agent Memory, arXiv:2604.16548. [16] Anthropic (2025), Effective Harnesses: Prompt Caching, Stable Prefix Design, and Token Efficiency Patterns, Engineering Documentation. [17] Madani Lab (2026), Memory Engine 5-Tier Architecture · iter-39 Audit and Remediation Track · `_AUDIT-2026-05-23.md` (référence interne, release MIT-licensed planifiée). [18] Madani Lab (2026), Skill Auto-Curator (adaptation Hermes + SkillOS), Workspace Agentic Benchmark Series, WSB-17 reference. [19] NousResearch (2026), hermes-agent: Open-Source Recursive Skill Iteration Pattern, GitHub. [20] Google Research (2026), SkillOS: A Skill Curation Operating System for Agentic Workspaces, Research Publication. [21] Honcho Authors (2024), Dialectic User Modeling for Conversational Agents, Open-Source Documentation. [22] Karpathy A. (2024), autoresearch: Self-Paced Autonomous Research Loops, Blog Post.
