# SPEC-TEST-SUPERVISOR-10-CASES — Rapport Final **Date** : 28-29/05/2026 (Session 147) **Tag** : TEST-SUPERVISOR-280526 **Statut** : COMPLETE — 10/10 detectors valides, cleanup termine --- ## 1. Resume executif Les 10 detectors supervisor (D1-D10) fonctionnent end-to-end. 10 cas test ont ete seedes, le trigger a produit 10 AgentAction EXECUTED, et le router a dispatche 25 NotificationDelivery sur 4 canaux (ERP_IN_APP, PWA_PUSH, TELEGRAM, EMAIL). Louis a recu 5 messages Telegram via le bot Август. L'escalation multi-canal fonctionne comme concu. Cleanup integralement verifie (0 rows restantes). --- ## 2. Phase 1 — Preparation **Override** : Fonction `getTestOverrideUserId()` dans `supervisor.cron.ts` — route tous les reminders vers Louis quand `SUPERVISOR_TEST_TARGET_USER_ID` + `SUPERVISOR_TEST_TAG` sont set. **Route admin** : `POST /api/v1/admin/agent/supervisor/trigger-now` avec body `{"mode":"digest"}` pour forcer le mode digest (toutes anomalies, pas juste top 1). **Soak initial** : T+17h, verdict SOAK OK (7 deliveries, 0% failure, 123ms latence). --- ## 3. Phase 2 — Seed 10 cas | # | Detector | Objet cree | ID | Stagnation | |---|----------|-----------|-----|-----------| | D1 | Order AWAITING_ESTIMATE sans smeta | Order | #26 | createdAt -3j | | D2 | Smeta FINANCIAL_REVIEW | Order+Smeta | #27+#16 | submittedAt -3j | | D3 | Order LAUNCHED sans smeta approuvee | Order+Smeta DRAFT | #28 | statusHistory -4j | | D4 | Tender DRAFT stale | Tender | #4 | createdAt -3j | | D5 | Tender SENT sans offres | Tender | #5 | updatedAt -4j | | D6 | PO DRAFT non confirme | PO | #4 | createdAt -3j | | D7 | PO CONFIRMED sans email | PO | #5 | updatedAt -3j | | D8 | PO SENT depasse livraison | PO | #6 | expectedDeliveryDate -5j | | D9 | SDN DRAFT non signe | SDN | #2 | createdAt -3j | | D10 | ClientInstallment echeance depassee | Installment | #1 | dueDate -10j | **Inventaire** : 24 rows taguees (10 orders, 2 smetas, 2 PRs, 2 tenders, 3 POs, 1 SDN, 1 invoice, 1 installment, 1 client, 1 supplier). --- ## 4. Phase 3 — Trigger + observation ### Premier run (pinch mode, 20:48 UTC) - **1** REMINDER_SENT dispatche (mode pinch = top 1 seulement) - Status: FAILED — `Handler "REMINDER_SENT" not found in registry` - Cause: le script externe creait un AgentRuntime SANS registerAllHandlers() ### Fix et second run via route admin (digest mode, 20:52 UTC) - **10** REMINDER_SENT EXECUTED - Route `POST /admin/agent/supervisor/trigger-now` avec `{"mode":"digest"}` - Override actif: tous routes vers Louis ### Deliveries resultantes (25 total) | Canal | Count | Status | Detail | |-------|-------|--------|--------| | ERP_IN_APP | 10 | 5 SENT + 5 PENDING | Premier canal, toujours disponible | | PWA_PUSH | 5 | 5 SENT | Escalation depuis ERP_IN_APP non-acquitte | | TELEGRAM | 5 | 5 SENT | Escalation depuis PWA_PUSH non-acquitte | | EMAIL | 5 | 5 EXPIRED | Escalation depuis TELEGRAM, SMTP timeout | **Observation cle** : l'escalation fonctionne — ERP_IN_APP → PWA_PUSH → TELEGRAM → EMAIL. 5 des 10 ont ete acquittes en ERP_IN_APP avant d'escalader, d'ou 5 (pas 10) sur les canaux suivants. --- ## 5. Phase 4 — Validation Louis Louis a confirme la reception de 5 messages Telegram via le bot Август. Les messages sont en russe formel, avec tonalite appropriee ("Хотим мягко обратить ваше внимание", "Обращаем ваше внимание"). --- ## 6. Phase 5 — Cleanup | Etape | Rows supprimees | |-------|----------------| | NotificationDelivery | 25 | | AgentEngagement | 10 | | AgentAuditLog | 10 | | AgentAction | 10 | | ClientInstallment | 1 | | ClientInvoice | 1 | | SupplierDeliveryNote | 1 | | PurchaseOrder | 3 | | PurchaseRequirement | 2 | | Tender | 2 | | Smeta | 2 | | OrderStatusHistory | 2 | | Order | 10 | | Client | 1 | | Supplier | 1 | | **TOTAL** | **81** | **Verification** : `COUNT(*) WHERE tag = 0` sur toutes les tables. Confirme. **Env vars** : `SUPERVISOR_TEST_TARGET_USER_ID` et `SUPERVISOR_TEST_TAG` supprimes. `ROUTER_USE_FOR_SUPERVISOR=true` conserve (soak). **Restart final** : T0 nouveau soak = 22:25 UTC 28/05 (01:25 MSK 29/05). Backend clean, handlers enregistres, pas de test override. --- ## 7. Observations qualitatives - **Escalation multi-canal fonctionne** : la chaine ERP_IN_APP → PWA_PUSH → TELEGRAM → EMAIL est validee en prod staging - **Mode pinch vs digest** : en dehors des heures 8-9 MSK, seul le top 1 est dispatche — c'est voulu mais merite une note dans la doc utilisateur - **EMAIL EXPIRED** : les 5 emails ont timeout (SMTP Beget). Dette connue, pas de regression - **PWA_PUSH SENT mais invisible** : Edge/WNS bloque (confirme dans la spec precedente), Chrome OK - **Anti-doublon 2h** : fonctionne correctement — le premier run pinch n'a pas bloque le second run digest car le premier avait status FAILED - **Tonalite** : appropriee pour un premier rappel (tone "soft"), en russe formel avec "вы" --- ## 8. Recommandations | Priorite | Item | Description | |----------|------|-------------| | P1 | SEED-STAGING-FUNNEL | Enrichir le seed staging avec des donnees a chaque etape du funnel pour que le supervisor ait matiere a detecter en conditions reelles | | P2 | EMAIL-SMTP-FIX | Investiguer pourquoi les emails EXPIRED (timeout SMTP Beget). Probablement meme cause que le bug IMAP connu | | P2 | D11-D12-PR-STALE | Ajouter detectors pour PRs DRAFT > N jours et PRs CONFIRMED > N jours sans tender | | P3 | TRIGGER-NOW-KEEP | Garder la route admin `supervisor/trigger-now` en production (utile pour debug et validation) | | P3 | WNS-EDGE-FIX | Investiguer pourquoi WNS rejette pushManager.subscribe() sur la machine Louis (service WpnService) |