Ce que vous saurez faire
- Distinguer la perte due au compactage de la perte entre sessions, et choisir la solution adaptée à chacune.
- Écrire une règle de consultation et une règle d'enregistrement dans le fichier d'instructions que charge l'agent.
- Ajouter un hook Stop qui bloque la fin d'une session ayant modifié des fichiers sans rien enregistrer.
- Tester le hook avec une transcription synthétique avant de s'y fier.
- Partager une même base de mémoire entre Claude Code, OpenCode et Kimi Code.
Points clés
- Claude Code oublie le contexte entre les sessions parce que chaque session démarre avec une fenêtre de contexte vide ; la mémoire inter-sessions pousse l'agent à consulter les décisions passées avant de travailler et à enregistrer les nouvelles ensuite.
- L'oubli au sein d'une session (le compactage) et l'oubli entre les sessions sont deux problèmes distincts, et seul le second se règle avec une routine de mémoire.
- Les fichiers de mémoire intégrés sont du contexte, pas une contrainte : nous faisons tourner un hook Stop qui renvoie l'agent au travail quand il a modifié des fichiers sans rien enregistrer.
- Le hook compte les appels par leur nom : il prouve qu'un enregistrement a eu lieu, jamais qu'il était bon.
- OpenCode et Kimi Code lisent les mêmes règles et atteignent la même base de mémoire ; nous n'y faisons tourner aucun hook de mémoire.
Claude Code oublie le contexte entre les sessions, car chaque session démarre avec une fenêtre de contexte vide. Au sein d'une même session, une fenêtre pleine est compactée : les échanges les plus anciens deviennent un résumé. D'une session à l'autre, rien ne passe, sauf ce qui a été écrit.
La mémoire inter-sessions est une routine qui pousse un agent de code IA à consulter les décisions passées avant de travailler et à enregistrer les nouvelles ensuite, pour qu'une nouvelle fenêtre de contexte démarre informée. Nous la faisons tourner sous forme de boucle dans Claude Code, imposée par un hook Stop (un script que Claude Code exécute chaque fois qu'il termine une réponse). OpenCode et Kimi Code partagent les mêmes règles et la même base de mémoire.

Pourquoi Claude Code oublie, et ce que fait notre boucle de mémoire
Claude Code n'oublie pas par accident. Chaque session démarre vide par conception : la solution est donc une routine, pas un fichier plus gros.
La documentation d'Anthropic(s’ouvre dans un nouvel onglet), 2026 : « Chaque session Claude Code commence avec une fenêtre de contexte vierge. » Deux fonctionnalités intégrées donnent à Claude Code une mémoire d'une session à l'autre :
| Fonctionnalité intégrée | Ce qu'elle transporte | Source (2026) |
|---|---|---|
| CLAUDE.md | Les instructions que vous écrivez, chargées au début de chaque conversation. Le fichier à la racine du projet est relu sur le disque après /compact | Anthropic, Memory(s’ouvre dans un nouvel onglet) |
| Mémoire automatique | Des notes que Claude écrit lui-même, conservées par dépôt. Les 200 premières lignes ou les 25 premiers Ko de MEMORY.md se chargent au démarrage de la session | Anthropic, Memory(s’ouvre dans un nouvel onglet) |
| Les deux | « Claude les traite comme du contexte, pas comme une configuration imposée. » | Anthropic, Memory(s’ouvre dans un nouvel onglet) |
Le contexte, l'agent le soupèse ; ce n'est pas une étape qu'il est obligé de suivre. Nous avons donc ajouté une boucle par-dessus, avec une base de mémoire partagée que l'agent atteint via MCP :
| Élément | Ce qui se passe |
|---|---|
| Déclencheur | Une session commence à travailler sur un sujet qu'elle ne connaît pas encore |
| Rappel, travail, enregistrement | Consulter les mémoires et les routes, faire la tâche, enregistrer ce qui a été appris |
| Contrôle | Un hook Stop, à presque chaque arrêt, renvoie l'agent au travail s'il a modifié des fichiers sans rien enregistrer |
| Résultats | Des mémoires, des routes et des notes de tâche que la session suivante retrouve |
La base de mémoire est notre cerveau d'entreprise ; le classement des notes correspond à la couche 1 de notre système qui s'améliore tout seul.
La version à copier (hook, entrée de configuration et test) se trouve dans Construire votre propre boucle.
Pourquoi nous l'avons construite : une règle écrite se fait ignorer
Nous avons écrit la règle, et l'agent l'a ignorée. Une règle qui compte sur l'agent pour se souvenir de la suivre n'est qu'une suggestion.
La règle figurait dans le fichier d'instructions : consulter avant d'explorer, enregistrer après. Des sessions sautaient la consultation et relisaient du code qu'une session précédente avait déjà cartographié. Des sessions modifiaient des fichiers et se terminaient sans rien noter, si bien que la suivante redécouvrait la même réponse.
La mémoire existait et les outils fonctionnaient. Il manquait un moment où sauter l'étape avait un coût. Une personne approuve le travail qui compte (notre modèle de gouvernance), mais personne ne surveille la fin de chaque session.
Découvrez comment ConvOps donne à chaque agent une mémoire unique qu'il consulte avant de travailler(s’ouvre dans un nouvel onglet), et conserve les notes que chaque session laisse derrière elle.
Comment tourne la boucle de mémoire
Le rappel coûte un appel. L'enregistrement coûte un appel. Le seul point coûteux, c'est d'obtenir les deux à chaque fois : c'est la mission que nous avons confiée au hook.

Comment un hook Stop décide. Il lit la transcription (le fichier où Claude Code consigne chaque message et chaque appel d'outil) et se termine par un code de sortie, un nombre qui indique à Claude Code quoi faire ensuite. Le code 0 laisse la session se terminer. Le code 2 « empêche Claude de s'arrêter et poursuit la conversation » (Anthropic, Hooks(s’ouvre dans un nouvel onglet), 2026), et l'agent lit le message du hook. Notre protection contre la suppression utilise le même code de sortie sur les appels d'outils.
| Étape | Qui l'exécute | Point de contrôle |
|---|---|---|
| Rappel | L'agent, context_query, avant d'explorer tout ce qu'il ne connaît pas déjà. Un seul appel renvoie des mémoires (ce que nous savons) et des routes (où se trouvent les choses) | Les réponses déjà connues s'en passent |
| Travail | L'agent | Aucun |
| Enregistrement | L'agent, memory_store, après chaque action. Pour remplacer une note : enregistrer la nouvelle, puis oublier l'ancienne. Sur une action de tâche, une note context= enregistre 2 à 3 lignes dans le même appel | S'en passer exige une raison |
| Route | L'agent, après avoir exploré des fichiers | Aucun |
| Contrôle | Le hook Stop | Le code 2 renvoie l'agent au travail |
Ce que vérifie le hook Stop de mémoire
Chaque seuil indiqué ici est celui qu'applique notre hook.
| Règle | Valeur exacte | Pourquoi elle existe |
|---|---|---|
| Quand il s'exécute | À chaque événement Stop, avec un délai de 15 secondes (600 par défaut, Anthropic, Hooks(s’ouvre dans un nouvel onglet), 2026) | C'est le dernier moment où l'on peut retenir une session |
| Ce qu'il lit | Le name de chaque appel d'outil dans la transcription | Ce que l'agent a fait, pas ce qu'il a dit |
| Garde anti-boucle | stop_hook_active vaut true : code 0 | Un hook qui bloque sa propre nouvelle tentative ne laisse jamais une session se terminer |
| Les petites sessions passent | Moins de 3 appels d'outils : code 0 | Une réponse en deux appels n'a rien qui mérite d'être enregistré |
| Intervalle | Au moins 2 entrées assistant dans la transcription depuis le dernier contrôle. Claude Code écrit une entrée par bloc de contenu, donc le contrôle s'exécute à presque chaque arrêt | Chaque contrôle n'examine que ce qui est nouveau |
| Modifié, rien enregistré | Un appel Edit, Write, MultiEdit ou NotebookEdit et zéro appel memory_store, sans attendre la règle de lecture seule ci-dessous | Une modification de fichier mérite un pourquoi écrit |
| Aucune consultation au premier contrôle | Aucun appel context_query ni route_query | La règle, c'est le rappel d'abord ; les contrôles suivants ne la répètent pas |
| Ordre du rappel | Zéro rappel et zéro enregistrement, des enregistrements sans rappel, ou un enregistrement depuis le dernier contrôle survenu avant le premier rappel | Sans consultation préalable, l'agent ne voit pas la note à remplacer et écrit donc un doublon |
| Règle de lecture seule | Rappel effectué, rien d'enregistré, aucune modification, au moins 4 entrées dans la transcription | Explorer des fichiers est un travail qui mérite d'être enregistré |
| Ce qui compte | Rappel : les noms contenant memory_recall ou context_query. Enregistrement : les noms contenant memory_store | Se fier aux noms rend le hook indépendant de la base de mémoire |
Chaque règle enfreinte ajoute un message, le blocage se termine par « This is mandatory. », et le hook sort avec le code 2.
Ce que le hook ne voit pas
Nous faisons davantage confiance au hook parce que nous savons exactement où il est aveugle.
- Il compte les appels d'outils par leur nom. Il ne lit jamais ce qu'un rappel a renvoyé ni si un enregistrement était bon.
- Seul
memory_storecompte comme un enregistrement. Une session qui n'écrit que des notescontext=et modifie des fichiers est quand même renvoyée au travail. - Les modifications faites par le shell lui échappent. Un
sedou un heredoc n'est pas une modification pour le hook ; seuls les quatre outils de modification natifs le sont. - La transcription peut être en retard. La documentation des hooks(s’ouvre dans un nouvel onglet) d'Anthropic indique qu'elle est écrite de façon asynchrone : un enregistrement de dernière seconde est donc compté au contrôle suivant.
- Il ne s'exécute que dans Claude Code ; voir les sections OpenCode et Kimi Code.
Les hooks portent les règles qui ne doivent jamais dépendre de la mémoire (la couche des hooks). Celui-ci impose les appels, pas la mémoire.
Comment Claude Code se souvient d'une session à l'autre
Le moment utile n'est pas l'enregistrement. C'est le lendemain matin, quand une session qui n'a jamais vu le travail du lundi s'ouvre avec la leçon du lundi.
Copperfern est une boutique en ligne fictive d'articles pour la maison ; ses noms, ses fichiers et ses notes sont inventés, mais les seuils et les messages sont réels.
Lundi. Maya, qui gère les opérations, crée une tâche : « Les commandes espagnoles ont un centime d'écart au paiement. » L'agent de code lance context_query("spanish vat checkout rounding") et ne trouve rien sur l'arrondi. Il lit shop/checkout/tax.py, constate que la TVA est arrondie une seule fois sur le total de la commande, modifie le fichier et son test pour arrondir ligne par ligne, puis tente de s'arrêter.
Le hook s'exécute : 5 appels d'outils, assez de nouvelles entrées depuis le dernier contrôle. Une consultation a eu lieu, donc seul le contrôle des modifications se déclenche. Le hook bloque l'arrêt avec ce message, qui exige d'enregistrer la modification :
KNOWLEDGE CHECK: Modified 2 file(s) but stored nothing. memory_store() the change/decision (supersede if updating). If you explored files, create_route()/update_route() in ConvOps. This is mandatory.
Code 2. L'agent enregistre un piège à connaître (catégorie gotchas), importance 7, étiquettes shop, checkout, vat. La note dit : « La TVA espagnole s'arrondit ligne par ligne, pas sur le total de la commande ; arrondir le total crée un écart d'un centime sur les commandes de plusieurs articles. » Il enregistre une route : « L'arrondi de la TVA se trouve dans shop/checkout/tax.py ». Il tente à nouveau de s'arrêter. stop_hook_active vaut true, et la session se termine.

Mardi. Nouvelle tâche : « Ajouter la TVA sur la ligne d'emballage cadeau. » Nouvelle session, fenêtre vide : rien du lundi n'y figure. L'agent lance context_query("vat gift wrap checkout"), et le piège du lundi revient avec la route. Il ouvre directement shop/checkout/tax.py et arrondit la TVA de l'emballage cadeau sur sa propre ligne.
Il s'avère que la livraison est elle aussi une ligne à part. L'agent enregistre le piège affiné, « La TVA espagnole s'arrondit ligne par ligne ; l'emballage cadeau et la livraison comptent chacun comme une ligne. », puis oublie l'enregistrement du lundi avec memory_forget, une suppression logique réversible. À l'arrêt, la consultation a précédé l'enregistrement et la modification a son enregistrement : code 0. Seule la note affinée répond à la consultation suivante.

Ce que la boucle laisse derrière elle
Une mémoire vaut exactement ce que la session suivante peut en tirer sans poser de question : un fait, sa raison, un type et une importance honnête.
Un enregistrement de mémoire, tel que l'agent le stocke :
content: Spanish VAT rounds per line, not per order total; rounding the
total is off by a cent on multi-item orders.
category: gotchas
importance: 7
tags: shop, checkout, vat
task_id: cf-131
Le contenu porte le fait et sa raison. L'importance mesure ce que la session suivante perd si elle passe à côté de la note : la plupart se situent entre 4 et 6, et celle-ci vaut 7 parce qu'un total faux atteint les clients. Deux à cinq étiquettes la rendent trouvable.
Une route indique où se trouve quelque chose :
title: VAT rounding
description: VAT rounding lives in shop/checkout/tax.py
paths: shop/checkout/tax.py, tests/test_tax.py
Une note context=, écrite dans le même appel qu'une mise à jour de tâche, est stockée comme une mémoire liée à la tâche (importance 4 par défaut ; sous 40 caractères, elle n'est pas stockée) :
Rounded VAT per line, not per order; Spanish totals were a cent off on
multi-item orders.
Aucun champ ne remplace un enregistrement. L'agent enregistre la nouvelle note et oublie l'ancienne. Une personne peut aussi remplacer une note depuis la page du cerveau, qui relie le nouvel enregistrement à l'ancien et retire l'ancien du rappel.
Ce qui tourne mal avec un hook de mémoire
Notre contrôle a échoué deux fois, dans des sens opposés : une fois il a laissé passer des modifications en silence, une autre fois il a bloqué indéfiniment. Vérifiez les deux cas sur votre propre hook.
Il a laissé passer des modifications. Le seul contrôle « rien enregistré » attendait qu'une session dépasse une longueur minimale. Une courte session Copperfern modifie le modèle d'étiquette d'expédition et se termine proprement sans rien noter ; la session suivante refait la même enquête. La règle qui en est sortie : les modifications sans enregistrement sont signalées au contrôle suivant, sans cette attente. Le plancher de 3 appels et l'intervalle s'appliquent toujours.
Il a bloqué indéfiniment. Le contrôle « enregistrement avant rappel » comparait le premier enregistrement au premier rappel sur toute la session. Une session enregistre une note avant sa première consultation, puis consulte correctement, et elle est quand même renvoyée au travail à chaque arrêt, jusqu'à être abandonnée. La règle qui en est sortie : chaque contrôle ne regarde que ce qui s'est passé depuis le contrôle précédent, si bien qu'un faux pas initial est signalé au contrôle qui le couvre, et non à chaque arrêt ultérieur.
Notre commentaire de code dit pourquoi : « un signalement qu'aucun comportement ultérieur ne peut satisfaire est une rengaine, pas un garde-fou ». Cette règle a désormais un test qui pilote le vrai hook avec une transcription synthétique, un faux journal de session.

Nous avons resserré la règle de consultation. Elle s'appliquait à chaque message. Elle s'applique désormais avant d'explorer ou de travailler sur un sujet qui n'est pas déjà connu ; enregistrer après chaque action reste obligatoire. Une session à qui l'on demande « quelle heure est-il à Madrid ? » ne lance aucune consultation ; une session sur le point de lire le code du paiement en lance toujours une.
Construire votre propre boucle de mémoire dans Claude Code
Commencez par une règle que le hook peut compter : si une session a modifié des fichiers, elle note quoi et pourquoi avant de se terminer.
D'abord, connectez la base de mémoire. Nous utilisons ConvOps ; une seule commande l'ajoute à Claude Code :
claude mcp add --transport http convops https://mcp.convops.app/
Ajoutez ensuite ces deux lignes à votre CLAUDE.md. Gardez ce fichier court (ce qu'il faut couper d'un CLAUDE.md trop long) : le hook porte le contrôle, le fichier porte l'habitude.
Before exploring or working on anything you don't already know, query the memory store first. Known answers and chat skip the lookup.
After every action, store what you learned and why, with a type, an honest importance and two to five tags. To replace a note, store the new one, then forget the old one.
Cette version réduite de notre hook (Claude Code 2.1.301) conserve la garde anti-boucle, le plancher de 3 appels, l'intervalle, le contrôle des modifications et la consultation au premier contrôle. Enregistrez-la sous ~/.claude/hooks/memory-gate.py :
"""Stop hook: send the agent back when it edited files and stored nothing."""
import json, os, sys, tempfile
MIN_TOOL_CALLS = 3
INTERVAL = 2
EDIT_TOOLS = ("Edit", "Write", "MultiEdit", "NotebookEdit")
hook = json.load(sys.stdin)
if hook.get("stop_hook_active"):
sys.exit(0) # the retry after a block is not checked
names, entries = [], 0
with open(hook["transcript_path"]) as f:
for line in f:
entry = json.loads(line)
if entry.get("type") != "assistant":
continue
entries += 1
for block in entry.get("message", {}).get("content", []):
if isinstance(block, dict) and block.get("type") == "tool_use":
names.append(block["name"])
if len(names) < MIN_TOOL_CALLS:
sys.exit(0)
counter = os.path.join(tempfile.gettempdir(), f"memory_gate_{hook['session_id']}")
last = int(open(counter).read()) if os.path.exists(counter) else 0
if entries - last < INTERVAL:
sys.exit(0)
open(counter, "w").write(str(entries))
edits = sum(n in EDIT_TOOLS for n in names)
stores = sum("memory_store" in n for n in names)
lookups = sum("context_query" in n or "route_query" in n for n in names)
problems = []
if edits and not stores:
problems.append(f"Modified {edits} file(s) but stored nothing. Store the change and why.")
if last == 0 and not lookups:
problems.append("No lookup at the first check. Query the memory store first.")
if problems:
print("KNOWLEDGE CHECK: " + " | ".join(problems) + " This is mandatory.", file=sys.stderr)
sys.exit(2)
Déclarez-le sous Stop dans .claude/settings.json :
{
"hooks": {
"Stop": [
{
"hooks": [
{ "type": "command", "command": "python3 ~/.claude/hooks/memory-gate.py", "timeout": 15 }
]
}
]
}
}
Testez-le avec une transcription synthétique avant de vous y fier. Celle-ci contient une consultation et deux modifications, elle doit donc renvoyer le code 2 :
printf '%s\n' \
'{"type":"assistant","message":{"content":[{"type":"tool_use","name":"context_query"}]}}' \
'{"type":"assistant","message":{"content":[{"type":"tool_use","name":"Edit"}]}}' \
'{"type":"assistant","message":{"content":[{"type":"tool_use","name":"Edit"}]}}' \
> copperfern-test.jsonl
echo '{"session_id":"test-001","transcript_path":"copperfern-test.jsonl"}' \
| python3 ~/.claude/hooks/memory-gate.py; echo "exit $?"
Utilisez un nouveau session_id à chaque exécution, car le fichier compteur retient le dernier contrôle. Ajoutez ensuite une ligne memory_store : le code attendu est alors 0.
La mémoire d'OpenCode entre les sessions
Les sessions OpenCode 1.18.31 démarrent elles aussi à vide. Nous leur donnons le même texte et la même base de mémoire.
Nos fichiers AGENTS.md sont des liens symboliques vers CLAUDE.md : OpenCode lit donc les mêmes règles de rappel et d'enregistrement (un seul fichier pour les deux). Notre opencode.json fait pointer son bloc mcp vers la même base ConvOps, si bien qu'une note enregistrée depuis Claude Code revient lors d'une consultation dans OpenCode. Nous n'exécutons aucun hook de mémoire dans OpenCode. Il dispose pourtant d'une interface de plugins qui le permettrait (plugins(s’ouvre dans un nouvel onglet)) ; notre protection contre la suppression en montre la forme.
La mémoire de Kimi Code entre les sessions
Kimi Code 0.31.1 reçoit le même texte et la même base de mémoire. Il lit l'AGENTS.md en lien symbolique, et notre .kimi-code/mcp.json déclare le même serveur ConvOps : ses consultations renvoient donc ce que Claude Code et OpenCode ont enregistré. Nous n'exécutons aucun hook de mémoire dans Kimi Code. Il accepte des entrées [[hooks]] dans sa configuration utilisateur (hooks de Kimi Code(s’ouvre dans un nouvel onglet)), et le guide sur la protection contre la suppression en montre un.
Créez un compte ConvOps gratuit et connectez Claude Code, OpenCode ou Kimi Code à une mémoire unique(s’ouvre dans un nouvel onglet), puis ajoutez la règle de consultation, la règle d'enregistrement et le hook Stop.
Étapes
Connecter une base de mémoire via MCP
Choisissez une base de mémoire que votre agent atteint en tant que serveur MCP, pour que chaque session et chaque outil lisent et écrivent les mêmes notes. Nous utilisons ConvOps : créez un compte gratuit sur my.convops.app/register et ajoutez-le à Claude Code comme serveur MCP.
Écrire la règle de consultation
Ajoutez une ligne à CLAUDE.md : avant d'explorer ou de travailler sur tout sujet qui n'est pas déjà connu, interroger d'abord la base de mémoire. Les réponses déjà connues et la simple conversation se passent de consultation.
Écrire la règle d'enregistrement
Ajoutez une ligne à CLAUDE.md : après chaque action, enregistrer ce qui a été appris et pourquoi, avec un type, une importance honnête et deux à cinq étiquettes. Pour remplacer une note, enregistrer la nouvelle, puis oublier l'ancienne.
Ajouter le hook Stop
Enregistrez le script du hook sous ~/.claude/hooks/memory-gate.py. Il ignore la nouvelle tentative qui suit un blocage et les sessions de moins de 3 appels d'outils, effectue au plus un contrôle toutes les 2 entrées assistant de la transcription, et sort avec le code 2 quand la session a modifié des fichiers sans rien enregistrer.
Le déclarer sous Stop
Ajoutez le hook à la liste Stop de .claude/settings.json avec un délai de 15 secondes, pour qu'il s'exécute chaque fois que Claude Code termine une réponse.
Le tester avec une transcription synthétique
Écrivez une courte transcription JSONL contenant une consultation et deux modifications, envoyez une charge utile au script et attendez le code 2. Ajoutez une ligne memory_store, utilisez un nouveau session_id et attendez le code 0.
Questions fréquentes
Qu'est-ce que la mémoire inter-sessions pour un agent de code IA ?
La mémoire inter-sessions est une routine qui pousse un agent de code IA à consulter les décisions passées avant de travailler et à enregistrer les nouvelles ensuite, pour qu'une nouvelle fenêtre de contexte démarre informée. ConvOps héberge la base partagée : l'agent l'interroge via MCP avant d'explorer, puis y écrit des mémoires, des routes et des notes de tâche après chaque action. Chez Neomanex, un hook Stop dans Claude Code renvoie l'agent au travail quand il a modifié des fichiers sans rien enregistrer.
Qui a besoin d'une mémoire inter-sessions ?
Les développeurs et les responsables techniques en ont besoin quand leurs sessions Claude Code, OpenCode ou Kimi Code refont du travail ou rouvrent des décisions qu'une session précédente avait déjà tranchées. ConvOps conserve ces décisions dans une base unique que chaque session et chaque outil peuvent interroger. Résultat : la session suivante démarre avec ce que la précédente a appris, au lieu de relire le même code pour le redécouvrir.
Claude Code conserve-t-il le contexte d'une session à l'autre ?
Claude Code ne garde que ce qui est écrit, c'est pourquoi Neomanex stocke les leçons de chaque session dans ConvOps. Chaque session Claude Code démarre avec une fenêtre de contexte vide. CLAUDE.md et la mémoire automatique se chargent au démarrage, et la documentation d'Anthropic précise que Claude les traite comme du contexte, pas comme une configuration imposée. Tout ce que l'agent apprend d'autre est perdu s'il n'est pas enregistré là où la session suivante le cherche.
Comment faire en sorte que Claude Code se souvienne d'une session à l'autre ?
Créez un compte ConvOps gratuit sur my.convops.app/register, puis connectez-le à Claude Code comme serveur MCP. Ajoutez deux lignes à CLAUDE.md : consulter la base avant d'explorer tout ce qui n'est pas déjà connu, et enregistrer ce qui a été appris après chaque action. Ajoutez ensuite un hook Stop qui bloque la fin d'une session ayant modifié des fichiers sans rien enregistrer, et testez-le avec une transcription synthétique.
OpenCode se souvient-il d'une session à l'autre ?
Les sessions OpenCode démarrent sans état, c'est pourquoi Neomanex connecte OpenCode à ConvOps via MCP, la même base que celle de Claude Code. Nos fichiers AGENTS.md sont des liens symboliques vers CLAUDE.md : OpenCode lit donc les mêmes règles de consultation et d'enregistrement. La limite : nous n'exécutons aucun hook de mémoire dans OpenCode, donc l'enregistrement dépend de la rigueur avec laquelle l'agent suit le texte. OpenCode dispose d'une interface de plugins pour un tel hook ; nous n'en faisons pas tourner.
Un hook peut-il obliger Claude Code à enregistrer ce qu'il a appris ?
Un hook impose l'appel, pas la qualité. Dans notre configuration, un hook Stop de Claude Code compte les appels memory_store par leur nom et bloque l'arrêt avec le code 2 quand une session a modifié des fichiers sans rien enregistrer, et ConvOps reçoit l'enregistrement. Le hook ne lit jamais ce qui a été enregistré : une note faible passe donc. Seul memory_store compte, et les modifications faites par le shell lui échappent.
Claude Code partage-t-il le contexte entre les conversations ?
Des sessions Claude Code distinctes ne partagent pas de fenêtre de contexte, mais elles peuvent partager une base de mémoire, et la nôtre, c'est ConvOps. Ce qu'une session enregistre dans ConvOps, une autre le retrouve dès sa première consultation, même dans OpenCode ou Kimi Code. CLAUDE.md et la mémoire automatique se chargent aussi dans chaque session du même dépôt, comme du contexte que l'agent prend en compte plutôt que comme des règles qu'il doit suivre.
