--- 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//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.