Synchronise le template avec les décisions fondatrices 2025-2026 : - 018 : migration Rust strangler fig toolkit - 023 : Cortex/Cosmos product vision - 025 : cortex composition operator - 026 : IPC context packet access matrix - 027 : ambient autonomy engine - 028 : learning loop detect-iterate - 029 : Cosmos frontend brain - 030 : boot mode empirical validation - 031 : distribution model - 032 : execution mode vs workflow - 033/033a : embedding language strategy + zone filter - 034 : infra separation local/VPS/template - 035 : session pilote mode (ADR-035) Dépersonnalisation : keys/brain.<OWNER_DOMAIN>, deciders: [<owner>]
5.4 KiB
scope, name, title, status, date, deciders
| scope | name | title | status | date | deciders | |
|---|---|---|---|---|---|---|
| kernel | ADR-026 | IPC — Context packet, signal vocabulary, access matrix inter-agents | accepted | 2026-03-18 |
|
ADR-026 — IPC : context packet + signal vocabulary + access matrix
Insight fondateur
Le
×de la formule Cosmos ne définit pas seulement le FORMAT de ce qui voyage — il définit ce que chaque agent a le DROIT de recevoir selon le signal reçu.
Le G du modèle PCG se précise ici :
P = comment l'agent se comporte internally
C = ce qu'il charge au boot (session-*.yml)
G = ce qu'il peut recevoir et émettre via × (access matrix)
Le Gate n'est pas seulement "quel tier débloque cet agent" — c'est le périmètre exact de sa communication inter-agents.
Le context packet — format kernel (invariant)
packet:
from: agent_name # qui émet
to: agent_name | broadcast # destinataire
signal: SPAWN | RETURN | BLOCKED_ON | CHECKPOINT | HANDOFF | ESCALATE | ERROR
scope:
files: [] # fichiers concernés (chemins exacts)
zone: kernel | project | personal # zone BSI
payload:
context: {} # ce que l'émetteur a découvert
decision: null # décision prise (si applicable)
options: [] # options proposées (ESCALATE uniquement)
result: null # résultat retourné (RETURN uniquement)
return_to: agent_name # où renvoyer
session_id: string # claim BSI actif
Règle d'or : chaque signal ne remplit qu'un sous-ensemble du payload. Un agent ne reçoit jamais plus que ce que son signal autorise.
Signal vocabulary — complet et exhaustif
| Signal | Sens | Payload autorisé | Existait |
|---|---|---|---|
SPAWN |
parent → enfant : démarre une tâche | scope + context initial | implicite ✗ |
RETURN |
enfant → parent : tâche terminée | result uniquement | implicite ✗ |
CHECKPOINT |
agent → BSI : état sauvegardé | context snapshot | ✓ |
HANDOFF |
session N → session N+1 : passage de relai | context + decision | ✓ |
BLOCKED_ON |
agent → pilote : bloqué techniquement | description blocage | ✓ |
ESCALATE |
agent → pilote : décision humaine requise | options de décision | ✗ nouveau |
ERROR |
agent → parent : échec non récupérable | error description | ✗ nouveau |
Distinction BLOCKED_ON vs ESCALATE :
BLOCKED_ON= bloqué techniquement (fichier absent, permission manquante) → attente déblocageESCALATE= ambiguïté de valeur (choix architectural, décision métier) → humain décide
Access matrix — qui reçoit quoi
| Agent | Reçoit de | Envoie à | Zones autorisées | Signals autorisés |
|---|---|---|---|---|
orchestrator |
human, tout agent | tout agent | toutes | tous |
debug |
orchestrator, human | orchestrator | project + scope-only | SPAWN, RETURN, BLOCKED_ON |
security |
orchestrator, code-review | orchestrator | project | SPAWN, RETURN, ESCALATE |
coach |
human | human | personal + reference | ESCALATE, CHECKPOINT |
scribe |
orchestrator, human | orchestrator | selon scope déclaré | SPAWN, RETURN |
audit |
human | human | kernel (lecture) | RETURN, ESCALATE |
Cette matrice est extensible — chaque agent déclare son access profile dans son frontmatter. Elle est vérifiable — l'opérateur × rejette tout packet qui viole la matrice.
Signal → payload autorisé
Le signal contraint ce qui peut être packagé. Aucune exception.
SPAWN → scope.files + scope.zone + payload.context
RETURN → payload.result uniquement (jamais le contexte source)
BLOCKED_ON → payload.context (description blocage)
ESCALATE → payload.options (liste de choix, pas de contexte complet)
ERROR → payload.context (erreur uniquement)
CHECKPOINT → payload.context (snapshot complet, vers BSI uniquement)
HANDOFF → payload.context + payload.decision (vers session suivante uniquement)
Pourquoi RETURN ne passe pas le contexte source : Évite les fuites — un agent enfant ne peut pas "rapporter" ce qu'il a vu dans une zone hors de son scope de départ.
Frontmatter agent — extension PCG
Chaque agent déclare son Gate IPC dans son frontmatter :
brain:
# ... champs existants ...
ipc:
receives_from: [orchestrator, human] # qui peut lui SPAWN
sends_to: [orchestrator] # à qui il peut RETURN/ESCALATE
zone_access: [project] # zones autorisées en lecture
signals: [SPAWN, RETURN, BLOCKED_ON] # signals qu'il émet
Deux faces de ×
× = context packet + signal vocabulary ← kernel, invariant (cet ADR)
+ routing table ← instance, configurable Cosmos
La routing table (qui parle à qui dans une instance donnée) est éditée via Cosmos UI. Elle ne peut pas violer la access matrix du kernel — elle l'instancie.
Ce que cet ADR ne définit pas
- Routing table format (
profil/routing.yml) → à créer par instance - Cosmos UI agent graph → produit
- Ambient layer signals → ADR-027
Changelog
| Date | Note |
|---|---|
| 2026-03-18 | Création — context packet, signal vocabulary complet (ESCALATE + ERROR nouveaux), access matrix, PCG Gate précisé, frontmatter agent extension |