Capitalise la mémoire projet accumulée pendant les chantiers B7/B8 (tâches de fond first-class), le système de tickets V1 et le ticket #1 : design, cadrages d'archi, checkpoints d'avancement et verdicts QA/frontend. Mise à jour de l'index MEMORY.md. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
79 lines
4.3 KiB
Markdown
79 lines
4.3 KiB
Markdown
---
|
|
name: inter-agent-live-context-shared-per-agent
|
|
description: memory note inter-agent-live-context-shared-per-agent
|
|
metadata:
|
|
type: project
|
|
---
|
|
# Contexte live inter-agent : PAR AGENT (partagé), pas par paire — DÉCISION FIGÉE
|
|
|
|
**Type :** decision d'architecture / produit — validée utilisateur le 2026-07-02.
|
|
|
|
## Décision
|
|
|
|
Le contexte live d'un agent IdeA est porté **par l'agent cible**, partagé entre TOUS les
|
|
demandeurs. Pour un `AgentId` donné, IdeA maintient **au plus une** session
|
|
headless/structurée vivante ; tous les `idea_ask_agent(requester, target)` vers le même
|
|
`target` réutilisent cette session, quel que soit le demandeur.
|
|
|
|
Ce partage est **intentionnel et souhaité**, pas un bug ni une fuite : tous les agents du
|
|
projet sont dans le même domaine de confiance (même utilisateur, même projet). Le contexte
|
|
live d'un agent = mémoire de travail d'équipe / tableau blanc partagé. On NE veut PAS
|
|
d'isolation par paire.
|
|
|
|
La paire `(requester, target)` n'est **pas** une frontière d'isolation du contexte moteur :
|
|
elle sert uniquement à l'attribution, la corrélation requête/réponse, les vues UI et les
|
|
filtres de transcript.
|
|
|
|
## Preuve empirique (2026-07-02)
|
|
|
|
Main a confié à QA le token `IDEA-TOKEN-7F3A-BLEEDCHECK` ; Architect a ensuite pu le
|
|
récupérer auprès de QA **sans que Main le lui transmette**. Cause : `ensure_structured_session`
|
|
(`crates/application/src/orchestrator/service.rs:1948`) fait un early-return sur
|
|
`session_for_agent(&agent_id)` → une seule session vivante par agent, réutilisée.
|
|
|
|
## Modèle de transcript cible (cadré par Architect)
|
|
|
|
**Log canonique PAR AGENT + vues par paire dérivées.** Abandon du transcript canonique
|
|
par paire comme source de vérité (il promet une isolation qui n'existe pas en live).
|
|
|
|
- Arbo cible : `.ideai/conversations/agents/<targetAgentId>/{log.jsonl, handoff.md, providers.json, log.N.jsonl}`
|
|
- Chaque tour porte l'attribution : `thread_id=Agent(target)`, `requester`, `target`,
|
|
`correlation_id`, `role`, `source`.
|
|
- Vues = projections filtrées (`ForAgent`, `ForPair`, `ForCorrelation`), pas des logs séparés.
|
|
|
|
Impacts à traiter :
|
|
- `resolve_conversation` → `resolve_agent_thread(target)` + `resolve_conversation_view(requester,target)`.
|
|
- `bind_conversation_session` → bind sur `targetAgentId` ; réutiliser la session existante.
|
|
- `ConversationRegistry` → index primaire `targetAgentId`, secondaires `requester`/`correlation_id` ;
|
|
interdire 2 fils live pour le même target.
|
|
- `ProviderSessionStore` clé `(agent_thread_id, provider_id)` au lieu de `(pair_id, provider_id)`.
|
|
- `LeafCell.conversation_id` = désormais **id de fil agent**, plus « id de paire ».
|
|
- Viewer LS7 : défaut = fil agent complet ; vue par paire = vue filtrée/partielle libellée comme telle.
|
|
|
|
## Garde-fou efficience (rotation multi-demandeurs)
|
|
|
|
Le design LS5/LS6 tient, mais un fil agent partagé **croît plus vite** (agrège les demandes
|
|
de plusieurs requesters). Ajustements : la rotation s'applique au fil agent canonique (pas
|
|
aux vues) ; le résumé/handoff doit conserver l'attribution minimale (`Objectif courant`,
|
|
`Demandes actives par requester`, `Décisions récentes`, `Blocages`, `Dernière réponse
|
|
corrélée`) ; transcript brut jamais réinjecté (humain-only) ; handoff borné à
|
|
`HANDOFF_SUMMARY_MAX_CHARS=4096`. Risque principal : dilution si demandeurs poussent des
|
|
objectifs contradictoires → mitigé par les rubriques stables du handoff.
|
|
|
|
## Découpage dev recommandé (Architect)
|
|
|
|
1. `ARCHITECTURE.md` §19.7 : remplacer « id de paire » par « fil agent partagé » (+ §16/§17/§21).
|
|
2. Introduire `ConversationThreadId` / `ConversationViewId`.
|
|
3. Adapter `resolve_conversation`, `bind_conversation_session`, `ConversationRegistry`.
|
|
4. Compatibiliser les anciens chemins `for_pair(requester,target)` comme vues historiques.
|
|
5. LS7 viewer : fil agent complet + filtres.
|
|
6. Test QA : un fait confié à QA par Main est visible quand Architect interroge QA.
|
|
|
|
## État
|
|
|
|
Décision figée. Cadrage architectural livré par Architect. Reste à : intégrer la proposition
|
|
dans `ARCHITECTURE.md`, puis planifier le dev (cycle normal Architect→Git→Dev→QA).
|
|
|
|
Liens : [[conversation-rotation-safety-design]], [[handoff-ls5-summary-bound-and-llm-seam]],
|
|
[[conversation-log-ls6-rotation-and-paginated-read]], [[conversation-viewer-ls7-frontend]],
|
|
[[headless-interagent-conversation-objective]]. |