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>
124 lines
5.6 KiB
Markdown
124 lines
5.6 KiB
Markdown
# 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) |
|