docs(memory): notes projet tâches de fond, tickets V1 et checkpoints ticket #1
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>
This commit is contained in:
79
.ideai/memory/inter-agent-live-context-shared-per-agent.md
Normal file
79
.ideai/memory/inter-agent-live-context-shared-per-agent.md
Normal file
@ -0,0 +1,79 @@
|
||||
---
|
||||
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]].
|
||||
Reference in New Issue
Block a user