Les étages
Le portier Authentification
Tout ce qui entre passe par un en-tête « Authorization: Bearer ». Jamais un cookie — un navigateur joint un cookie tout seul à une requête venue d'ailleurs, jamais un en-tête. Ce seul choix retire toute une famille d'attaques au lieu de la contrer.
Sans jeton, Dominic REFUSE de démarrer ailleurs que sur la boucle locale. Ce n'est pas un avertissement de plus : c'est ce qui rend impossible de déployer en oubliant la variable.
Le registre d'outils RegistreOutils
Il rassemble tout ce que le modèle a le droit d'appeler, et il n'enregistre jamais l'outil nu : il enregistre son contrôle. Le modèle ne peut donc pas le contourner — il n'y a pas d'autre chemin.
Deux outils qui déclareraient la même action font ÉCHOUER le démarrage. Sans ça, un « oui » de ta part exécuterait le premier avec les arguments de l'autre.
Le contrôleur OutilControle
C'est ici que « la frontière des outils est la frontière des règles » cesse d'être une phrase. Une LECTURE s'exécute et se consigne ; un EFFET DE BORD ne s'exécute pas : il devient une intention, et la policy tranche.
Savoir ce que Dominic a CONSULTÉ fait partie de ce qu'on doit pouvoir vérifier : une lecture n'est pas anodine quand elle porte sur dix ans de courrier.
Les règles PolicyEngine
Il décide, et il ne fait rien d'autre : il ne crée pas d'intention, n'écrit pas d'audit, n'exécute rien. Trois issues — autorisé, soumis à ton accord, interdit.
Cette étroitesse est ce qui le rend éprouvable en entier. Un moteur de décision qui agirait aussi ne se testerait plus qu'en l'exécutant.
L'accord et sa fenêtre ExecuteurIntentions
Ton « oui » n'exécute pas : il ouvre une fenêtre d'une minute. Pendant ce temps, « annule » ramène tout à zéro sans qu'il se soit rien passé. ⚠️ Et un refus répond TOUJOURS, même quand il n'y a plus rien à annuler — « il n'y a rien à annuler » est une réponse, se taire n'en est pas une.
Mieux qu'une seconde confirmation : une confirmation de plus se donne machinalement, une minute laisse le temps de se raviser. ⚠️ Les actions à enjeu gardent leur fenêtre entière, toujours. ⚠️ Un « non » n'est pas symétrique d'un « oui » : un oui sans objet peut repartir au modèle, un non jamais — sinon le modèle repropose ce que tu viens de refuser (mesuré le 10/09).
La porte de sortie PorteSortie
La SEULE porte par laquelle un texte personnel quitte la machine. Elle consigne AVANT d'appeler, jamais après.
⚠️ Les embeddings, eux, sont calculés sur la machine et ne sortent jamais. La mémoire est indexée chez toi ; seule la rédaction est sous-traitée.
Le juge Juge
Un second regard sur la réponse avant qu'elle ne t'arrive. Il relit ce que le modèle a écrit à côté de ce que les outils ont réellement rendu, et il coupe ce qui n'y est pas.
Il existe parce que Dominic « répond avec assurance et se trompe ». On ne rend pas un modèle fiable : on dépense un appel de plus à le vérifier — et cet appel-là coûte des centimes.
Le journal AuditJournal
Un seul point d'écriture, et aucune suppression. La trace s'écrit dans la même transaction que l'action qu'elle relate.
Le jour où quelqu'un voudra effacer une ligne, il ne trouvera pas de méthode. La surface de l'API dit la garantie de la base.
La mémoire MemoryService
Courriels, rendez-vous et documents découpés, indexés, retrouvés par le sens et non par les mots exacts. Le modèle d'embeddings n'apparaît que derrière une interface.
Changer de fournisseur d'embeddings ne touche pas une ligne ici — le coût n'est pas la réécriture, c'est la réindexation. D'où la colonne qui note, pour chaque fragment, quel modèle l'a produit.
Qui est qui Entites
Le carnet dit des adresses ; celui-ci dit des LIENS — « mon frère », « le garage ». C'est ce qui permet de dire « appelle mon frère » au lieu d'épeler un numéro.
Il se nourrit aussi de ce que tu confirmes : le brief du matin demande « qui est-ce ? » à propos de quelqu'un avec qui tu échanges beaucoup et que Dominic ne sait pas nommer.
Le veilleur Anticipateur
Ce qui regarde DEVANT. Il repère ce qui vient — une échéance, un anniversaire — et propose de poser un rappel.
⚠️ Il PROPOSE, il n'agit pas. Tout ce qu'il sait faire est un rappel par notification : jamais un courriel, jamais un SMS, jamais un appel. C'est la seule chose du système qui bouge sans que tu l'aies demandée, et sa laisse est courte.
Les détecteurs Detecteurs
Les deux choses que le code sait remarquer tout seul : une conversation qui tourne en rond, et une application dont les messages sont systématiquement écartés.
⚠️ Deux, et pas dix. Un détecteur n'a le droit d'exister que s'il répond à une question à laquelle rien d'autre ne répond déjà — sinon le brief le redirait deux fois. Et chacun REFERME ce qu'il ne voit plus : un détecteur qui accumule finit par ne plus rien dire.
Ce qu'il retient de vos discussions FilIngestService
Six heures après que tu as cessé d'écrire dans un fil, il devient cherchable : Dominic pourra y revenir dans trois semaines sans que tu aies eu à lui demander de « noter » quoi que ce soit.
⚠️ Il garde les deux voix SÉPARÉES, et c'est tout le point. Ce que tu as écrit, tu l'as écrit. Ce que Dominic avait répondu était une affirmation de sa part, à cette date-là — pas un fait établi. Un extrait retrouvé le dit en toutes lettres, pour qu'il ne relise pas sa propre supposition comme une preuve. ⚠️ Et rien ne sort de la machine : le calcul qui rend un texte cherchable tourne en local.
L'ordonnanceur Ordonnanceur
Trois rythmes : relever le courrier toutes les quinze minutes, rendre cherchables les fils clos toutes les heures, composer le brief une fois le matin.
⚠️ L'écart entre l'ingestion et le brief n'est pas décoratif, et ce qui garantit l'ordre est le fil d'exécution UNIQUE. « Optimiser » en montant la taille du pool casserait précisément cette garantie.
Le sonneur SonneurDeRappels
Ce qui fait qu'un rappel finit par arriver. Il regarde toutes les trente secondes ce qui est échu et le pousse sur le canal prévu.
⚠️ Actif par défaut, alors que l'ordonnanceur ne l'est pas — et l'exception se justifie par la règle : il n'initie rien, il achève une décision que tu as déjà prise.
La veille Veille
Ce qui est arrivé pendant que tu ne regardais pas. Le téléphone demande, à son rythme.
⚠️ Un courriel n'est PAS une notification : il arrive par IMAP, sur le serveur, et le téléphone n'en sait rien. Sans cette route, une invitation reçue à 8 h attendrait que tu penses à demander.
Le brief BriefService
Le matin : ce qui t'attend, ce qui est en retard, ce que le veilleur propose, et un signal s'il y en a un.
⚠️ Les dates ne passent PAS par le modèle. Elles sont calculées puis remises déjà rédigées. Un modèle qui décale une réunion d'une heure produit une erreur plausible — donc invisible jusqu'à ce qu'on arrive au mauvais moment.
La configuration
Plusieurs boîtes aux lettres
4 boîtes configurées, dont 4 peuvent envoyer.
Chaque boîte se déclare sous dominic.mail.accounts avec son étiquette, son serveur, son identifiant — et le nom de la variable d'environnement qui porte son mot de passe. Jamais le mot de passe : un fichier de configuration se versionne, se copie, se joint à un rapport de bogue.
⚠️ Lire et écrire sont deux droits séparés. smtp-host absent veut dire lecture seule, et peut-envoyer est faux par défaut — sans lui, Dominic choisirait tout seul de quelle identité tu t'exprimes auprès d'un tiers.
⚠️ Plusieurs boîtes peuvent émettre ici. Quand rien ne désigne laquelle, Dominic refuse au lieu de trancher : il a déjà choisi une fois par ordre alphabétique, et c'était la mauvaise adresse.
⚠️ La lecture du courrier est en EXAMINE — ouverture sans marquer comme lu. Dominic ne supprime rien, ne déplace rien, ne marque rien. La seule écriture est la copie d'un envoi dans « Éléments envoyés ».
Plusieurs agendas
2 serveurs d'agenda configurés, fenêtre de 30 jours en arrière et 90 en avant, fuseau Europe/Paris.
Un serveur se déclare sous dominic.agenda.accounts par sa racine CalDAV — pas par le chemin de ses agendas : ces chemins sont opaques et se découvrent. Un même serveur peut porter plusieurs agendas, et ils sont tous relevés.
⚠️ La fenêtre en arrière sert à répondre à « c'était quand, déjà ? » ; celle en avant, à préparer. Les élargir coûte du temps de synchronisation à chaque passage, pas de la place.
⚠️ Dominic peut créer, déplacer et annuler un rendez-vous — jamais créer un agenda. Cette opération-là est délibérément absente du code.
Les messages du téléphone
2 application(s) captées, dont 3 comptées sans leur texte.
La liste vit dans dominic.notifications.applications, et c'est une liste blanche : l'accès aux notifications d'Android voit tout — les codes à usage unique, les alertes bancaires, tout le reste. Une liste noire laisserait passer par défaut ce qu'on n'a pas pensé à nommer, c'est-à-dire l'essentiel.
⚠️ Le filtre est appliqué deux fois : sur le téléphone avant d'émettre, et sur le serveur avant d'écrire. Seule la seconde tient si le téléphone ment.
⚠️ sans-texte nomme celles dont on garde l'expéditeur et l'heure, jamais le contenu — de quoi savoir avec qui tu échanges, sans stocker un fil d'actualité. Le texte est forcé à vide par le serveur : une décision de vie privée ne se délègue pas au client.
⚠️ SMS et appels, eux, ne sont que comptés : ni contenu, ni numéro complet — les huit derniers chiffres, et la base elle-même refuse davantage.
Ce qui est branché dehors
en marcheLa recherche webpar un moteur auto-hébergé : aucun tiers ne voit une requête venir de toi
en marcheVols et hôtelsconsultation seule — Dominic ne réserve pas et ne paie pas
⚠️ Les deux sont vides par défaut, donc éteints. Rien ne se branche sur l'extérieur parce qu'un code le prévoit : il faut l'écrire.
Son intelligence, et d'où elle vient
Un modèle seul sait parler. Ce qui suit est ce qui le rend utile chez toi — et rien de tout cela n'est dans le modèle.
Il agit, il ne raconte pas72 outils réels, dont 40 qui te demandent avant d'agir. Quand Dominic dit qu'il a envoyé un courriel, c'est qu'un outil l'a envoyé — sinon il dit qu'il n'a pas pu. La différence entre les deux se lit dans le journal.
Il se souvient par le SENSTes courriels, tes rendez-vous et tes documents sont découpés et indexés par des vecteurs calculés sur ta machine. « Où en est le dossier de la toiture » retrouve un message qui ne contient ni « dossier » ni « toiture ». Rien de cet index ne sort jamais.
Il se relitLe juge compare la réponse à ce que les outils ont vraiment rendu, et coupe ce qui n'y est pas. C'est un appel de plus, et il est là parce qu'un assistant qui se trompe avec assurance est pire qu'un assistant qui ne sait pas.
Il ne compte pas les jours de têteLes dates sont calculées par le code puis remises au modèle déjà rédigées. Un modèle qui décale une réunion d'une heure produit une erreur plausible — celle qu'on ne voit qu'en arrivant au mauvais moment.
Il regarde devantLe veilleur repère ce qui vient et propose ; les détecteurs remarquent ce que tu ne verrais qu'en lisant les journaux. Aucun des deux n'agit : ils te mettent une chose sous les yeux au bon moment.
Il apprend qui est quiPas des préférences devinées : des liens que tu confirmes. « Mon frère », « le garage » — et c'est ce qui permet ensuite de parler comme on parle, sans épeler un numéro.
Il sait dire nonUn outil manquant, un nom ambigu, deux boîtes qui pourraient émettre : Dominic refuse au lieu de choisir. ⚠️ C'est ce qui coûte le plus de code, et c'est ce qui fait qu'on peut lui faire confiance sur le reste.
⚠️ Ce que Dominic ne fait pas, et par construction : il ne réserve rien, ne paie rien, n'efface aucune note, n'envoie rien sans ton accord, et ne choisit jamais lui-même un destinataire, une adresse web ou un fichier.