---
name: conversation-rotation-safety-design
description: memory note conversation-rotation-safety-design
metadata:
  type: project
---
---
name: conversation-rotation-safety-design
description: Cadrage initial pour la compression/rotation automatique non interruptive des conversations d'agents.
metadata:
  type: project
---

# Conversation Rotation Safety Design

Objectif : reduire le cout token des conversations longues sans degrader la stabilite des agents ni les contacts inter-agents.

Socle existant a reutiliser :
- log canonique `.ideai/conversations/<conversationId>/log.jsonl` ;
- `handoff.md` incremental ;
- injection du handoff au lancement/relaunch ;
- `LeafCell.conversation_id` = id logique IdeA de paire, distinct du resumable provider ;
- `providers.json` pour `(pair_conversation_id, provider_key) -> engine_session_id` ;
- `InputMediator.busy_state(agent)` et FIFO par agent ;
- `ask_agent` avec lock de tour par agent + wait-for graph anti-deadlock ;
- attach/detach cellule deja modelise : la cellule est une vue, `TerminalSessions::rebind_agent_node` existe ;
- frontend write-portal sait deja compter la saisie humaine et declarer `set_front_attached`.

Regle produit centrale : rotation automatique opportuniste, jamais interruptive. IdeA ne compacte/rote une session qu'a un point sur.

Conditions minimales avant rotation :
- agent `Idle` (`InputMediator.busy_state == Idle`) ;
- aucune delegation/ticket/reply en cours ;
- aucun contact entrant en cours, sinon queue ou ancienne session jusqu'a bascule ;
- checkpoint durable OK : prompt/response appendes au log + `handoff.md` a jour ;
- cellule stable : pas d'attach/detach ou changement de layout en cours ;
- utilisateur non en train d'ecrire : focus/buffer non vide/frappe recente/IME composition/prompt interactif detectable ;
- nouvelle session demarree detached/background et prete avant bascule ;
- bascule atomique routing logique + attachement cellule ; ancienne session retiree ensuite.

Etat cible conceptuel :
`RotationRequested -> WaitForAgentIdle -> WaitForNoDelegation -> WaitForNoIncomingRoute -> WaitForCellStable -> WaitForUserInputClear -> Checkpointing -> StartReplacementDetached -> AttachReplacementToCell -> SwitchRouting -> RetireOldSession`.

Premier lot recommande : fondation non destructive.
- Ajouter modeles/policy de `ConversationRotation` et raisons de blocage.
- Ajouter query/use case d'evaluation qui retourne `Ready` ou `Blocked(reasons)` sans tuer ni relancer.
- Exposer les signaux manquants de cellule/saisie depuis le frontend vers backend, d'abord comme etat consultable.
- Publier des events de statut de rotation uniquement informatifs.
- Ne pas implementer la bascule physique avant que les tests de surete soient verts.