Skip to content
Rationale

Fonctionnement

Comment Rationale fonctionne, et ce qui quitte votre machine

Chaque étape de Rationale, ce qu'elle exécute sur votre machine, et ce qui la quitte. La page d'accueil montre les quatre étapes ; cette page dit ce que chacune fait, quelles commandes s'exécutent, quels hooks sont installés et, pour chaque événement, ce qui quitte votre machine et ce qui ne la quitte jamais, vérifié dans le code du client (0.9.0) et l'API à laquelle il parle.

Vérifié le 6 octobre 2026 · client 0.9.0

En bref

  • Les décisions sont extraites sur la machine de chaque personne par la CLI de l'agent qu'elle utilise déjà (claude -p ou codex exec). La transcription va au fournisseur de cet agent, comme c'était déjà le cas, et jamais à Rationale.
  • Rationale reçoit les décisions extraites, de courtes citations des propres mots de la personne et des métadonnées : identifiant et titre de session, numéros de tour, dépôt, branche, commit, heure, modèle et coût.
  • Avant qu'un agent modifie un fichier, les décisions concernées lui parviennent. Les chemins sont comparés sur votre machine ; un chemin qui ne correspond à rien ne la quitte jamais.
  • Quatre hooks, écrits une fois dans les réglages de Claude Code. rationale uninstall les retire.
  • Claude Code aujourd'hui, Codex en bêta, tout client MCP pour lire et enregistrer. Cursor ensuite.

1 · Capturer : quand un tour se termine

Installez le client une fois par ordinateur. Dès lors, chaque fois que votre agent termine un tour, il exécute le hook Stop du client (Claude Code ; Codex une fois que vous avez fait confiance aux hooks). Le hook lance une capture en arrière-plan et rend la main aussitôt, si bien que l'agent n'attend jamais. Un watcher fait de même chaque minute pour tout tour qu'un hook aurait manqué : un plantage, une fenêtre fermée, une session inactive depuis une minute avec de nouveaux tours.

La capture lit la transcription de la session sur votre machine et construit un delta compact des nouveaux tours : vos messages, les réponses de l'agent et les outils qu'il a appelés, avec leur entrée coupée à 200 caractères. La sortie des outils, le raisonnement et le texte que l'agent injecte de lui-même restent dehors. Jusqu'à 120 tours tiennent dans un bloc, avec jusqu'à 30 tours antérieurs en contexte de lecture seule, pour qu'un bloc court ne soit pas lu isolément.

Le delta va à la CLI de l'agent sur votre machine, connectée avec votre compte : claude -p pour une session Claude Code, codex exec pour une session Codex. Une session Codex ne va jamais chez Anthropic, et une session Claude Code ne va jamais chez OpenAI. Pour Claude Code l'appel est minimal : un system prompt, un schéma JSON, aucun outil, aucun réglage, aucun hook, aucun serveur MCP, aucun fichier de session, de sorte qu'il n'apparaît jamais dans votre historique. Pour Codex, c'est le codex exec documenté, éphémère, en lecture seule, dans un dossier vide, avec les hooks du client désactivés.

Seules les sessions dans un dépôt listé par l'un de vos projets sont capturées. Le client demande à Rationale lequel de vos espaces de travail liste le remote git du dépôt et garde la réponse dix minutes. Aucun projet : rien n'est extrait ni envoyé. Deux espaces de travail : rien non plus, et rationale status les nomme tous les deux. Une extraction qui échoue est retentée après 5, puis 15, puis 60 minutes tant que le même bloc échoue, et ne bloque jamais l'agent.

Ce qui parvient à Rationale est le résultat : les décisions, plus l'identifiant et le titre de la session, les numéros de tour, le dépôt, la branche, le commit, l'heure du dernier tour, l'agent, le modèle, la durée, les tokens et le coût équivalent. Le point d'entrée qui reçoit une capture n'a aucun champ qui pourrait porter une transcription.

2 · Enregistrer : ce que contient une décision

Une décision n'est pas un résumé de la session. Elle a une question, le choix, les critères qui l'ont guidé avec leur poids, les options écartées et pourquoi, des hypothèses, et ce qui amènerait l'équipe à la réexaminer. Elle est ancrée à des chemins du dépôt et à des identifiants (une classe, une table, une clé de ticket), et dit de quoi elle relève : business, produit ou technique. Les propres mots de la personne qui l'a décidée sont cités.

Toute décision est enregistrée comme inférée : un agent l'a extraite. Elle ne devient confirmée que par une personne : un clic dans l'application, ses propres mots dans une session (le client vérifie la citation dans la transcription avant de l'envoyer, si bien qu'un agent disant que quelqu'un a confirmé ne suffit pas), ou la fusion de la pull request qui la portait. Les deux origines restent visibles, et les agents voient la différence.

Les décisions sont numérotées par espace de travail (D-42), conservées en versions immuables et chiffrées au repos. Le serveur ne lit que des identifiants, des états, des ancrages et des horodatages. Chaque lecture et chaque confirmation est écrite dans le journal d'audit de l'espace de travail. L'extracteur signale aussi quand la personne a confirmé, corrigé ou retiré une décision antérieure dans la conversation, et quand l'agent l'a interrogée sur l'une d'elles.

Une session qui n'a nommé aucune tâche envoie ses décisions dans la boîte de réception du projet, où l'équipe les relie, les garde ou les retire. Une répétition d'une décision déjà enregistrée est reliée, pas enregistrée deux fois.

3 · Donner le contexte : #handle, notes et MCP

Une tâche est un #handle : un slug lisible, unique dans l'espace de travail, auquel tout se rattache : sessions, décisions, passations, pull requests, tickets. Tapez-le dans n'importe quel prompt et le hook UserPromptSubmit envoie à Rationale le handle, le dépôt et la branche, rien d'autre du prompt. En retour vient le contexte de la tâche : son état, ses décisions actives par domaine, ses dernières passations et ses pull requests ouvertes. La session est reliée à la tâche, si bien que ses captures suivantes y atterrissent.

Une branche nommée d'après le handle relie aussi la session, sans rien taper. Quand une session démarre, le hook SessionStart récupère vos notes : des consignes permanentes que vous avez données à vos agents (« réponds-moi en espagnol », « ne touche jamais aux contrôleurs v1 ») pour l'espace de travail et le projet de ce dépôt, en moins de 300 tokens et deux secondes. Pour cela, seul le remote du dépôt quitte votre machine.

Les assistants qui n'ont pas de hooks se connectent par MCP : Claude (claude.ai et l'application de bureau), ChatGPT, Cursor, Claude Code et Codex eux-mêmes, et tout client qui parle le protocole. Le serveur distant à https://mcp.rationalehq.com/mcp utilise OAuth 2.1 avec PKCE : collez l'URL, connectez-vous une fois, autorisez vos espaces de travail. Il n'y a pas de clés d'API. Ses outils sont context_for, search, list_tasks, list_inbox, list_notes, pull_request_for, record_decision, record_outcome, record_handoff, record_note, remove_note, open_task, set_visibility, answer_overlap et suggest_same_person ; chacun déclare s'il lit ou écrit, pour que votre client puisse vous demander avant une écriture.

Les décisions business viennent en premier, présentées comme des contraintes que les choix produit et techniques n'annulent pas. Tout ce qu'un agent enregistre par MCP est inféré, avec les mots de la personne cités, parce que rien ne peut vérifier une conversation que Rationale n'a pas vue.

4 · Alerter : avant la modification, pas en revue

Le hook PostToolUse s'exécute après chaque appel d'outil et se termine en quelques millisecondes pour les outils qu'il ne surveille pas. Il surveille Read, Edit, Write, MultiEdit et NotebookEdit, et les commandes Bash qui nomment un fichier, parce que les agents lisent avec cat, sed et grep aussi souvent qu'avec Read ; pour Codex, les commandes shell et apply_patch. La lecture est le moment qui compte : le modèle doit encore écrire sa modification.

Le hook garde un index des décisions ancrées du dépôt, rafraîchi en arrière-plan au démarrage de la session et après chaque tour : pour chaque décision son numéro, ses chemins, ses identifiants, son domaine, son commit et l'essentiel (question et choix). Il compare le chemin du fichier à cet index sur votre machine et, pour les décisions qui nomment une classe, une table ou une clé de ticket, lit le fichier ici (texte, 512 Ko au plus) pour les y chercher. Le contenu ne sort jamais. Un fichier qui ne correspond à rien ne provoque aucune requête.

En cas de correspondance, une seule requête demande à Rationale le texte de l'alerte : le dépôt, le chemin relatif au dépôt, comment chaque décision a correspondu, quelles décisions l'agent a déjà dans son contexte et, après la modification d'un fichier que la pull request ouverte de quelqu'un d'autre change aussi, les lignes qui viennent de changer. La réponse arrive en moins de deux secondes : au plus trois décisions en entier et les autres par numéro, qui a décidé chacune, si une personne l'a confirmée, et combien de commits ont touché le fichier depuis. Si Rationale est lent ou indisponible, l'agent reçoit l'essentiel depuis l'index local. Chaque alerte montrée est une lecture auditée.

Une fois par fichier et par session ; de nouveau si les décisions changent. Un fichier dont toutes les décisions sont déjà dans le contexte de l'agent ne reçoit pas d'alerte. C'est du contexte, jamais un blocage : le hook ne change jamais les permissions de l'agent et ne l'arrête jamais. Un hook qui échoue se termine silencieusement.

Ce qui quitte votre machine

Une ligne par événement. Chaque ligne a été vérifiée dans le code du client (rationale-client 0.9.0) et dans l'API qui reçoit chaque requête. Là où votre propre CLI s'exécute, la ligne dit ce qui va au fournisseur de votre agent : ce trafic va là où vos sessions vont déjà, avec votre propre compte.

QuandQuitte votre machineNe la quitte jamais
Un tour se termine (hook Stop ; le watcher pour les tours manqués)Au fournisseur de votre agent, via votre propre claude -p ou codex exec : les nouveaux tours sous forme compacte (vos messages, les réponses de l'agent, les outils qu'il a appelés avec leur entrée tronquée), avec jusqu'à 30 tours antérieurs en contexte. À Rationale : les décisions trouvées, avec les mots de la personne cités et les chemins auxquels elles sont ancrées ; quelles décisions antérieures la personne a confirmées, corrigées ou retirées, avec la citation et son tour ; identifiant et titre de session, numéros de tour, remote du dépôt, branche, commit, heure du dernier tour, agent, modèle, durée, tokens, coût équivalent, version du client.La transcription. La sortie des outils et le raisonnement, pas même à votre fournisseur. Les valeurs de secrets : refusées à l'écriture, masquées dans les citations. Une session Codex ne va jamais chez Anthropic ; une session Claude Code jamais chez OpenAI.
L'agent lit ou modifie un fichier (PostToolUse : Read, Edit, Write, MultiEdit, NotebookEdit, commandes Bash nommant un fichier ; commandes shell et apply_patch pour Codex)Rien, sauf si le chemin ou le contenu du fichier correspond à l'index local, ou si le chemin figure dans la pull request ouverte d'un collègue. Alors, à Rationale : le remote du dépôt, le chemin relatif au dépôt, comment chaque décision a correspondu (numéro, type, ancrage, commits depuis), les décisions déjà dans le contexte de l'agent, l'outil, l'identifiant de session et, après la modification d'un fichier présent dans la pull request de quelqu'un, les plages de lignes qui viennent de changer.Le contenu du fichier : les identifiants sont cherchés en le lisant ici, 512 Ko au plus. Les chemins qui ne correspondent à rien. La commande et sa sortie.
Vous tapez #handle dans un prompt (UserPromptSubmit)Le handle (jusqu'à trois par prompt), le remote du dépôt, la branche, l'identifiant de session, l'agent. Le contexte de la tâche revient.Le prompt. Un prompt sans #handle ne provoque aucune requête.
Une session démarre (SessionStart, aussi après /clear ou une compaction)Le remote du dépôt, l'identifiant de session et l'agent, pour récupérer vos notes (deux secondes au plus). En arrière-plan : le remote et l'empreinte de l'index détenu, pour rafraîchir les décisions ancrées (unchanged revient quand rien n'a bougé) ; et le remote seul, pour demander quel espace de travail le liste (en cache dix minutes).Le dossier de travail, vos fichiers, l'environnement.
Un client MCP appelle un outil (Claude, ChatGPT, Cursor ou tout client, via mcp.rationalehq.com)Ce que l'agent passe à l'outil : un #handle, des chemins ou des refs, un nom de projet, des numéros de décision, des mots de recherche, ou ce qu'il enregistre (une décision, un résultat, une passation, une note, une tâche, avec les mots de la personne cités). Par MCP il n'y a pas d'index local : les chemins que l'agent passe à context_for parviennent à Rationale tels quels. Chaque décision lue ou écrite est un événement audité.La conversation. Le code. Une requête de recherche n'est ni stockée ni journalisée.
Une synthèse est due (le watcher demande une fois par heure ; une fois par jour et par projet, ou après dix nouvelles décisions)À Rationale : une demande de réservation, vide. Rationale renvoie les tâches du projet, les dernières passations, les sujets précédents et les décisions actives sous forme courte. Au fournisseur de votre agent, via claude -p (ou codex exec sur une machine sans Claude Code) : cette entrée, jamais une transcription. À Rationale : l'état (fait, en cours, à venir), les sujets avec les décisions que chacun couvre et où l'IA les a placés, où en est chaque tâche, les tensions entre décisions, un domaine et des identifiants pour les décisions qui n'en ont pas, les conditions de réexamen désormais remplies, plus modèle, durée, tokens et coût.Transcriptions, code, fichiers.
Une session devient silencieuse (le watcher, 30 minutes sans nouveau tour, seulement les sessions avec des décisions)Au fournisseur de votre agent : les 60 derniers tours de la session sous forme compacte, via la même CLI. À Rationale : la passation qu'il a écrite (résumé, prochaines étapes, questions ouvertes), l'identifiant de session et l'agent.Les tours eux-mêmes. Une session sans décisions ne reçoit pas de passation ; une session pour laquelle Rationale n'a pas de tâche n'est plus interrogée.
Vous déployez (rationale deploy production, optionnel, pour les équipes qui déploient depuis leurs machines)Le remote du dépôt, l'environnement, le sha du commit et sa branche, jusqu'à 500 shas de commits atteignables depuis lui, le nom de l'outil. Rationale marque les pull requests et les décisions qui sont en production.Messages de commit, diffs, code.
Vous vous connectez (rationale init, rationale login)Le nom de votre machine (le nom de l'ordinateur sur macOS, sinon le hostname) et la version du client, pour démarrer le flux d'appareil. Vous saisissez un code dans le navigateur, connecté à Rationale. Le jeton de l'appareil arrive une fois et est enregistré lisible par vous seul (~/.config/rationale/config.json, mode 600).Un mot de passe : il n'y en a pas. Rationale connecte les personnes par lien envoyé par e-mail.
Vous collez un fil (rationale record, un fil Slack ou des notes de réunion, optionnel)Au fournisseur de votre agent : le texte, via le même extracteur. À Rationale : les décisions trouvées et le titre que vous avez donné, comme une capture d'un seul tour marquée paste.Le texte lui-même.
Chaque requête à RationaleLa version du client (User-Agent), quels agents exécutent ses hooks sur cette machine (claude_code=4/4, codex=0/4 : des noms et des comptes) et, une fois après chaque mise à jour, son code de résultat (ok, mauvaise signature, retour arrière). Comme tout serveur, Rationale voit l'adresse IP d'où vient une requête. Avec le rafraîchissement de l'index, des compteurs par dépôt : lectures et modifications vérifiées et correspondantes, répétitions, délais dépassés, identifiants d'alertes que l'agent a citées ou suivies d'une autre modification, temps de réponse.Rien d'une session. Les chemins : les compteurs ne sont que des comptes et des identifiants.
Toutes les six heures, la vérification des mises à jour (le watcher, jamais un hook)Un GET du manifeste signé de la version et de sa signature depuis app.rationalehq.com/client, qui redirige vers les fichiers sur GitHub, avec la version du client dans le User-Agent. Le binaire est téléchargé à côté de l'actuel, vérifié (signature minisign, taille, sha256, une exécution de --version de deux secondes) et permuté ; le précédent est conservé pour rationale update --rollback.Rien sur vous ni sur vos sessions. Les installations Homebrew signalent seulement qu'une version plus récente existe.

Le contenu des décisions, des notes et des passations est chiffré au repos avec des clés conservées à part de la base de données. Notre équipe voit des identifiants, des états et des ancrages, jamais le contenu, et chaque consultation par notre équipe est écrite dans votre journal d'audit. La page sécurité donne la vue technique ; la politique de confidentialité, la vue juridique.

Installer en deux minutes

Une commande, sans sudo, macOS ou Linux. Elle dépose un binaire dans ~/.local/bin/rationale et rien d'autre : pas encore de hooks, pas de connexion.

curl -fsSL https://rationalehq.com/install.sh | sh

Ou avec Homebrew :

brew tap rationalehq/tap https://github.com/jorgebasilio/homebrew-tap
brew install rationalehq/tap/rationale

Puis, dans un dépôt que votre espace de travail liste :

rationale init
  1. Connectez-vous depuis le navigateur. Le terminal affiche un code et ouvre la page de connexion de l'application. Une connexion par espace de travail ; rationale login en ajoute une autre.
  2. Ce dépôt. Il vérifie lequel de vos espaces de travail liste le remote git de ce dépôt. Listé par un seul : capturé. Par aucun : il le dit et demande si vous venez de le lister.
  3. Les agents sur cette machine. Il écrit les quatre hooks dans le ~/.claude/settings.json de Claude Code (une sauvegarde est conservée ; vos propres entrées restent intactes) et, si Codex est présent, dans ~/.codex/hooks.json, et vous explique l'étape de confiance que Codex exige. Cursor est détecté et signalé, pas encore capturé.
  4. Watcher. Un job launchd sur macOS, un timer utilisateur systemd sur Linux, toutes les minutes : il capture tout tour qu'un hook a manqué, écrit les passations, lance les synthèses et vérifie les mises à jour. Sans session utilisateur systemd, les hooks capturent quand même chaque tour.

C'est fait. Travaillez comme d'habitude. rationale status montre à tout moment les connexions, l'espace de travail de ce dépôt, les hooks, le watcher et la dernière session. Pour lire et enregistrer depuis Claude, ChatGPT ou Cursor, ajoutez le serveur MCP ; la documentation donne les étapes pour chaque client. Pour Claude Code :

claude mcp add --scope user --transport http rationale https://mcp.rationalehq.com/mcp

Les hooks, et comment les retirer

rationale init ajoute quatre entrées à l'objet hooks de ~/.claude/settings.json. Chacune exécute le binaire installé avec le nom de l'événement ; le binaire décide quoi faire, si bien qu'une mise à jour ne réécrit jamais vos réglages. Les délais sont le maximum qu'un hook peut prendre ; ils rendent la main bien avant.

HookS'exécute quandCe qu'il faitDélai
StopL'agent termine un tourLance une capture des nouveaux tours en arrière-plan et rend la main10 s
UserPromptSubmitVous envoyez un promptAvec un #handle : relie la session à la tâche et ajoute le contexte de la tâche. Sinon rien.15 s
PostToolUseAprès chaque appel d'outil (sans matcher)Une lecture ou une modification de fichier : comparée en local, les décisions ancrées ajoutées en cas de correspondance. Tout autre outil : se termine aussitôt.3 s
SessionStartUne session démarre ou reprend, ou après /clear ou une compactionAjoute vos notes ; rafraîchit l'index des ancrages en arrière-plan5 s

Une entrée ressemble à ceci ; la commande est le chemin absolu du binaire, jamais une recherche dans le PATH :

"Stop": [{ "hooks": [{ "type": "command", "command": "/Users/you/.local/bin/rationale hook claude-code stop", "timeout": 10 }] }]

Un hook ne bloque jamais l'agent : toute erreur est absorbée et le hook se termine avec 0 ; un plantage se termine avec un code que Claude Code affiche comme une erreur non bloquante. Les hooks ne font rien dans un dépôt qu'aucun projet ne liste. Pour Codex, les quatre entrées vont dans ~/.codex/hooks.json, sans matcher non plus ; Codex ne les exécute qu'une fois que vous leur avez fait confiance (/hooks dans la CLI, Review hooks dans l'application), et le client n'écrit jamais cette confiance à votre place.

Pour tout retirer :

rationale uninstall

Il retire les quatre hooks de Claude Code et de Codex, en conservant une sauvegarde de chaque fichier de réglages, et retire le watcher. Révoquez ensuite l'appareil sur la page Devices de l'application, ce qui invalide son jeton. La configuration reste dans ~/.config/rationale/ et l'état local dans ~/.local/state/rationale/ jusqu'à ce que vous les supprimiez ; le binaire est un seul fichier que vous pouvez effacer.

Agents et connecteurs aujourd'hui

Ce qui est en production, ce qui est en bêta et ce qui vient ensuite. Nous nommons ce que nous ne couvrons pas plutôt que de le laisser supposer.

Agent ou outilÉtatCe qui fonctionne
Claude CodeEn productionCapture après chaque tour, alertes avant les modifications (Read, Edit, Write, MultiEdit, NotebookEdit, Bash), contexte par #handle, notes au démarrage de la session, passations, synthèses
Codex (la CLI, l'application de bureau ChatGPT et l'extension IDE)BêtaCapture et contexte une fois que vous avez fait confiance aux hooks ; alertes sur les commandes shell et apply_patch ; extraction avec codex exec sur votre propre compte ChatGPT, qui se met en pause un jour de lui-même si OpenAI signale une activité inhabituelle
Claude (claude.ai et l'application de bureau), ChatGPT, Cursor, tout client MCPEn productionLire les décisions de votre équipe et en enregistrer de nouvelles via le serveur MCP distant. Pas de capture ni d'alertes avant la modification : cela vient des hooks.
Capture dans CursorEnsuiteCursor est détecté et signalé par rationale init ; ses sessions ne sont pas encore capturées
Gemini CLIEnsuitePas construit
GitHubEn productionUne GitHub App sur les organisations de votre choix : pull requests, revues et issues reliées aux décisions sur les fichiers qu'elles changent ; la fusion d'une pull request confirme les décisions capturées sur sa branche
JiraEn productionOAuth avec votre site Atlassian : les tickets et les epics deviennent des tâches, les décisions suivent le ticket
Sans trackerEn productionLes tâches vivent dans Rationale ; les agents les ouvrent quand vous le demandez
Linear, SlackEnsuitePas construits. Dites-nous ce que votre équipe utilise en demandant l'accès.

Accès anticipé : demandez l'accès et nous configurons votre espace de travail avec vous, sous un jour ouvré.

Autre chose : support@rationalehq.com