33800 Docs

← Retour

Audit critique ulias-org + Plan de fix

Date : 14/02/2026 Status : EN ATTENTE VALIDATION


Constat utilisateur

  1. La derniere conversation reste en "pending" apres execution
  2. L'objectif "envoie un mail avec les projets GitLab" ne fonctionne pas : il retourne la liste des outils AI au lieu de faire la tache, et pas de mail recu
  3. Aucun feedback visuel pendant l'execution : "on ne voit pas ce que tu es en train de faire"
  4. Le routing doit etre generique : on peut envoyer un mail via Mailjet mais aussi Gmail API, le systeme doit choisir intelligemment

Problemes identifies (par ordre de criticite)

P1 - CRITIQUE : Objectif orphelin en "pending" (backend)

Fichier : director/index.ts Lignes : 117-126, 196-208

Le bug : Quand un objectif declenche un briefing :

  1. handleMessage() cree l'objectif #1 en DB (status: pending) → ligne 199
  2. Briefing demarre, les questions sont posees
  3. L'utilisateur repond "go" → handleBriefingMessage() ligne 126 appelle handleMessage(enrichedPrompt, onEvent, { skipBriefing: true })
  4. Ce 2eme appel cree un objectif #2 en DB → nouvelle ligne 199
  5. L'objectif #2 s'execute et se termine (completed)
  6. L'objectif #1 reste pending pour toujours → orphelin

Fix : Stocker le objectiveDbId original dans le briefing session. Quand handleBriefingMessage confirme, passer cet ID via opts.reuseObjectiveId pour que handleMessage le reutilise au lieu d'en creer un nouveau.

Fichiers modifies : director/index.ts (opts, createObjective conditionnel, stockage dans briefing)


P2 - CRITIQUE : Multi-step ne passe pas le bon contexte (backend)

Fichier : director/index.ts Lignes : 452-461

Le bug : Dans handleMultiStep, le previous_result de la sous-tache 1 est passe a la sous-tache 2 comme texte brut tronque a 4000 chars. Problemes :

Fix :

Fichiers modifies : director/index.ts (handleMultiStep description enrichie)


P3 - CRITIQUE : Events de progression invisibles (frontend)

Fichier : ulias-org-web/src/components/chat/EventCard.tsx Lignes : 269, 332, 338

Le bug : Les events thinking, tool_call, tool_result sont rendus avec :

L'utilisateur ne voit strictement rien pendant que l'agent travaille, puis la reponse finale apparait d'un coup.

Fix :

Fichiers modifies : EventCard.tsx (3 lignes de CSS)


P4 - HAUTE : Indicateur de streaming statique (frontend)

Fichier : ulias-org-web/src/components/chat/ChatMessages.tsx Lignes : 234-238

Le bug : Pendant l'execution, le seul feedback est un texte statique "Reflexion en cours..." qui ne change jamais. L'utilisateur ne sait pas :

Fix : Rendre l'indicateur de streaming dynamique en trackant le dernier event recu. Afficher un message contextuel :

Fichiers modifies : ChatMessages.tsx (signal lastEvent + affichage dynamique)


P5 - HAUTE : Routing pas generique — doit etre instance-aware (backend)

Fichiers : agents/interpreter.ts, director/index.ts

Le probleme fondamental : Le routing est hardcode. Exemples :

Le systeme ne sait pas quelles instances le user a et ce qu'elles peuvent faire.

Le fix architectural :

  1. Le routing prompt doit etre dynamique : buildRoutingPrompt() recoit les instances du user et genere un prompt qui liste les capacites reelles.
Aujourd'hui dans interpreter.ts:
  buildRoutingPrompt()  ← statique, hardcode

Apres fix:
  buildRoutingPrompt(userInstances)  ← dynamique, base sur les instances
  1. L'interpreter recoit le UserContext : route(message)route(message, userCtx) pour acceder aux instances.

  2. Le prompt genere une section "CAPABILITIES" dynamique :

AVAILABLE CAPABILITIES (based on user's connected instances):
- Email: Mailjet (transactionnel, no-reply@gouroubleu84.com), Gmail (personnel, OAuth)
- Storage: Nextcloud, User Storage (interne), Google Drive
- Media: Jellyfin (local, films/series)
- Git: GitLab-33800 (local CI/CD)
- AI: AI Orchestrator (Ollama, GPU local)
- DB: Supabase
- Notifications: ntfy (push)
- Logs: Loki/Grafana

When multiple instances can fulfill a request, choose the most appropriate:
- Email formal/transactionnel → Mailjet
- Email personnel → Gmail
- Video locale → Jellyfin
- If ambiguous, prefer the most specific instance for the task.
  1. Pas de hardcodage dans le routing prompt : Les sections COMMUNICATION ROUTING, SPECIALIST ROUTING etc. sont generees a partir des tags des instances (mail, storage, media, etc.) et des outils disponibles des agents.

Impact :

Fichiers modifies :


Plan d'execution

Ordre Fix Fichier(s) Risque
1 P3 - Events invisibles EventCard.tsx Nul (CSS)
2 P4 - Streaming dynamique ChatMessages.tsx Faible
3 P1 - Objectif orphelin director/index.ts Moyen
4 P2 - Multi-step contexte director/index.ts Moyen
5 P5 - Routing instance-aware interpreter.ts, director/index.ts Moyen

Projets impactes : ulias-org (backend), ulias-org-web (frontend) Commits : 1 par projet Deploy : CI/CD automatique apres push


Test de validation

Apres deploy, tester via WebSocket :

  1. "Fais l'etat des lieux des outils AI" → doit voir les events en temps reel + resultat
  2. "Envoie un mail a gouroubleu@gmail.com avec les 10 derniers projets GitLab" → multi-step: projets recuperes puis mail envoye avec les BONS projets (routing detecte Mailjet + Gmail, choisit)
  3. Creer un projet (briefing) → repondre aux questions → "go" → l'objectif original passe a completed, pas d'orphelin
  4. Verifier routing dynamique : GET /api/capabilities doit montrer les capabilities detectees depuis les instances du user

Fichiers modifies (resume)

Projet Fichier Changements
ulias-org-web components/chat/EventCard.tsx Retirer opacity-60/70 des events progress
ulias-org-web components/chat/ChatMessages.tsx Streaming indicator dynamique
ulias-org director/index.ts Fix objectif orphelin + contexte multi-step + passer userCtx a interpreter
ulias-org agents/interpreter.ts Routing dynamique base sur instances user