Seed 10 tagged cases (D1-D10), triggered via admin route in digest mode: 10 AgentAction EXECUTED, 25 NotificationDelivery across 4 channels (ERP_IN_APP/PWA_PUSH/TELEGRAM/EMAIL). Escalation chain validated. All test data cleaned up (81 rows deleted, 0 remaining). Override function kept for future test runs. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
5.6 KiB
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-nowavec{"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 |
| 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) |