A
Admin

Run #3360

Cron: Pool Health Check · agent pool-094

Status
success
Tokens
561 / 2335
Cost
$0.000000
Duration
69.6s
Validation
{
  "ok": true,
  "failed": [],
  "hallucinated": [],
  "context_errors": []
}
Params
{}
Prompt resolved
Tu es un agent de monitoring du pool agencecom.

Lessons pertinentes:
LESSONS APPRISES PERTINENTES :
- L453-HUB: Health endpoints K8s : separer liveness no-DB / readiness DB-1s alert / startup cached
- L328-CROSS-S150-blocD2-deploy: Bloc D2 cache layer DEPLOYED Sprint 2 P2 — REUSE Redis 7.0.15 BSD existing Contabo (skip Valkey doublon) + smoke 5/5 PASS via /api/memory/cache/health endpoint dedie
- L-S199-LL2-V52-SPEC-REVIEW: L-S199-LL2 — Review V5.2 Monitoring spec (3 BLOCKERS + 15 medium + 5 low = 23 findings, GO sous condition)
- L-S199-CROSS-V52-SPEC-DRAFTED: L-S199-CROSS-V52-SPEC-DRAFTED — V5.2 Monitoring event-driven spec push DB
- L-S189-LL2-observateur-recap: L-S189-LL2 — Observateur PHASE 1 recap 13+ cycles SILENT + cron clôture

Donnees pool actuelles:
[missing:pool_status]

CONTRAINTE STRICTE -- Tables autorisees UNIQUEMENT :
- agencecom.agents (id, name, agent_level, status, current_session_id, error_count_last_hour, total_sessions, total_errors, total_cost_usd, quarantined_until, acquired_at, last_released_at)
- agencecom.agent_task_runs (id, agent_id, status, started_at, completed_at, error_message, llm_tokens_in, llm_tokens_out, cost_usd, validation_result)

Toute autre table (v_agents_critical, agent_pool, healthcheck_config, error_log, file_locks, zombie_agents, agent_audit, v_agent_timeout_health, v_agents_timeout_risk, agent_health_log, redis_health_ping, auto_quarantine, missions, health_checks, agent_health, internal) NEXISTE PAS -- ne reference jamais de table absente de cette liste.

Identifie les agents zombies (busy >1h sans completion via started_at + status), error_count_last_hour > 5, ou drift quarantine (quarantined_until > now).
Donne 3 recommandations concretes en markdown bullet points avec actions SQL utilisant SEULEMENT les 2 tables autorisees ci-dessus.
LLM Response
**Analyse de l’état du pool – anomalies Zombies / Erreurs / Quarantaine**  
Sur la base des seules tables `agencecom.agents` et `agencecom.agent_task_runs`, voici les diagnostics et actions correctives immédiates.

---

### 1. 🧟 **Agents zombies : session « busy » > 1 h sans tâche achevée**  
Un agent devient zombie lorsqu’il est en statut `'busy'` (colonne `status`), qu’une tâche est restée en cours (`agent_task_runs.status = 'running'`) plus d’une heure et que cette tâche n’a jamais été complétée (`completed_at IS NULL`). Ces agents bloquent des ressources sans produire de valeur.

**🔧 Recommandation :**  
- Détecter les zombies avec la requête ci-dessous, puis soit **libérer manuellement** la session (`UPDATE agents SET status = 'idle', current_session_id = NULL`), soit **annuler la tâche** orpheline et libérer l’agent dans la même transaction.

**SQL de détection :**
```sql
SELECT a.id AS agent_id, a.name, a.status, r.id AS run_id, r.started_at
FROM agencecom.agents a
JOIN agencecom.agent_task_runs r ON a.id = r.agent_id
WHERE a.status = 'busy'
  AND r.status = 'running'
  AND r.started_at < NOW() - INTERVAL '1 hour'
  AND r.completed_at IS NULL;
```

**SQL de correction (libération des zombies) :**
```sql
-- Annuler la tâche zombie et libérer l'agent
UPDATE agencecom.agent_task_runs
SET status = 'cancelled', completed_at = NOW(), error_message = 'Zombie timeout – auto-cancelled by monitoring'
WHERE id IN (
    SELECT r.id
    FROM agencecom.agents a
    JOIN agencecom.agent_task_runs r ON a.id = r.agent_id
    WHERE a.status = 'busy'
      AND r.status = 'running'
      AND r.started_at < NOW() - INTERVAL '1 hour'
      AND r.completed_at IS NULL
);

-- Réinitialiser les agents associés
UPDATE agencecom.agents
SET status = 'idle', current_session_id = NULL
WHERE id IN (
    SELECT DISTINCT a.id
    FROM agencecom.agents a
    JOIN agencecom.agent_task_runs r ON a.id = r.agent_id
    WHERE a.status = 'busy'
      AND r.status = 'running'
      AND r.started_at < NOW() - INTERVAL '1 hour'
      AND r.completed_at IS NULL
);
```

---

### 2. 🚨 **Agents en surchauffe d’erreurs : `error_count_last_hour > 5`**  
Ces agents dépassent le seuil critique d’erreurs en une heure et risquent d’enchaîner les échecs en cascade. Il faut les isoler temporairement et analyser les tâches fautives.

**🔧 Recommandation :**  
- Mettre en quarantaine les agents incriminés pendant 30 minutes (`quarantined_until = NOW() + INTERVAL '30 minutes'`, `status = 'quarantined'`) et forcer le vidage de leur session en cours.  
- Consulter les dernières tâches ayant échoué pour identifier un éventuel bug déterministe.

**SQL de mise en quarantaine :**
```sql
-- Repérer les agents à haut taux d'erreur
SELECT id, name, error_count_last_hour, status
FROM agencecom.agents
WHERE error_count_last_hour > 5;

-- Appliquer une quarantaine automatique de 30 min
UPDATE agencecom.agents
SET status = 'quarantined',
    quarantined_until = NOW() + INTERVAL '30 minutes',
    current_session_id = NULL
WHERE error_count_last_hour > 5
  AND (quarantined_until IS NULL OR quarantined_until <= NOW());

-- Lister les tâches en échec de ces agents pour diagnostic
SELECT r.agent_id, r.id AS run_id, r.error_message, r.started_at
FROM agencecom.agent_task_runs r
WHERE r.agent_id IN (
    SELECT id FROM agencecom.agents WHERE error_count_last_hour > 5
)
AND r.status = 'failed'
ORDER BY r.started_at DESC;
```

---

### 3. ⏳ **Quarantaine dérivante : agents avec `quarantined_until > NOW` mais statut incohérent ou sans suivi**  
Un agent peut rester en quarantaine sans que son statut le reflète, ou au contraire être marqué `'quarantined'` alors que la date de fin est dépassée. Cela fausse la disponibilité réelle du pool.

**🔧 Recommandation :**  
- Vérifier l’alignement entre `quarantined_until` et `status`.  
- Remettre en service les agents dont la quarantaine est expirée mais toujours bloqués, ou forcer le statut `'quarantined'` pour ceux qui sont encore dans la fenêtre active.

**SQL de normalisation :**
```sql
-- 1. Agents avec quarantined_until > NOW mais statut différent de 'quarantined' → forcer le statut
UPDATE agencecom.agents
SET status = 'quarantined', current_session_id = NULL
WHERE quarantined_until > NOW()
  AND status != 'quarantined';

-- 2. Agents avec statut 'quarantined' mais quarantined_until dépassé (expiré) → réactiver
UPDATE agencecom.agents
SET status = 'idle',
    quarantined_until = NULL
WHERE status = 'quarantined'
  AND (quarantined_until IS NULL OR quarantined_until <= NOW());
```

---

**🔎 Synthèse** – Ces trois actions automatisables (zombies, erreurs, quarantaine) nettoient le pool en temps réel sans jamais déborder des deux tables autorisées. Elles peuvent être planifiées dans un cron ou un déclencheur périodique.