Dépannage — Diagnostic des problèmes
Authentification
401 — Token invalide
- Symptôme : L'API retourne "Missing authorization" ou le tableau de bord affiche "Unauthorized"
- Causes : Token absent, expiré (TTL 24 heures), ou format d'en-tête incorrect
- Solution : Se reconnecter. Pour SSE/WebSocket le token est passé via
?token=. Le JWT est renouvelé toutes les 24 heures
401 — Email non vérifié
- Symptôme : Login réussi, mais retourne
requires_verification: true - Causes : Le lien dans l'email de vérification n'a pas été cliqué (TTL 24 heures)
- Solution : Vérifier l'email, cliquer le lien. Ou demander à un admin de vérifier manuellement. Les utilisateurs OAuth sont vérifiés automatiquement
403 — Pas d'accès au projet
- Symptôme : Les opérations fichiers ou le terminal WebSocket retournent Forbidden
- Causes : Multi-tenancy — l'utilisateur n'est pas propriétaire du projet. Ou tentative de path traversal bloquée
- Solution : Vérifier la propriété du projet. Le terminal interactif est uniquement accessible admin/CEO
Workers et bots
Le worker ne répond pas
- Symptôme : Message envoyé, mais pas de réponse
- Causes : Processus Claude occupé, session tmux tombée, port occupé
- Diagnostic : Vérifier /health ou /ping dans Telegram. Dans le CRM — icône de statut à côté du worker
- Solution : Cliquer STOP et réessayer. Ou redémarrer via CRM Paramètres → Restart
Status: "degraded"
- Symptôme : Le health check retourne
status: "degraded"au lieu de "ok" - Causes : 3+ erreurs consécutives du subprocess Claude
- Solution : Attendre — le watchdog redémarrera automatiquement. Ou redémarrer manuellement via /watchdog dans Telegram
Timeout (5 minutes)
- Symptôme : Le bot retourne "Claude timeout (5 min limit)"
- Causes : Tâche trop complexe pour un seul message, fichiers volumineux
- Solution : Décomposer la tâche en étapes plus petites. Changer le modèle pour un plus rapide (Haiku)
Max turns reached
- Symptôme : "Reached max turns" — Claude s'est arrêté après N étapes
- Causes : La tâche nécessite plus de tool calls que la limite (défaut 20 pour Developer, 10 pour Consultant)
- Solution : Décomposer la tâche. Ou augmenter max_turns via Worker Studio
Watchdog a désactivé le bot
- Symptôme : "Permanently disabled after 10 consecutive failures"
- Causes : 10 échecs consécutifs (token absent, fichiers supprimés, port occupé)
- Solution : Corriger la cause racine, puis redémarrer via Master Bot /deploy ou CRM Restart
NotebookLM Bridge
La recherche sémantique ne fonctionne pas
- Symptôme :
arc kb searchou l'onglet NotebookLM retourne une erreur - Diagnostic : Vérifier /health —
google_auth: true? - Causes : L'autorisation Google a expiré, le service Bridge n'est pas lancé
- Solution : Redémarrer le service Bridge. Renouveler l'auth Google
Données obsolètes dans la recherche
- Symptôme : La recherche retourne des informations périmées
- Causes : Cache (TTL 5 minutes) ou sources non synchronisées
- Solution : Lancer
arc memory refreshpour une resynchronisation complète
File d'attente de synchronisation pleine (429)
- Symptôme : Sync retourne HTTP 429
- Causes : Plus de 200 éléments dans la file
- Solution : Attendre 2-3 minutes — la file est traitée au rythme de 1 élément / 2 secondes
Frontend et connexions
WebSocket se déconnecte
- Symptôme : Le terminal ou le chat se déconnecte avec le code 1008
- Causes : Le token JWT a expiré pendant la session (TTL 24 heures)
- Solution : Rafraîchir la page (F5) — le token se renouvellera automatiquement
Le streaming SSE ne fonctionne pas
- Symptôme : La réponse du worker n'apparaît pas en temps réel
- Causes : Projet introuvable dans le registre, ou buffering nginx activé
- Solution : Vérifier le nom du projet. SSE nécessite
proxy_buffering offdans nginx
Erreur CORS
- Symptôme : La console du navigateur affiche CORS blocked
- Causes : Origin absent de la liste blanche CRM_ALLOWED_ORIGINS
- Solution : Ajouter l'origin dans la variable CRM_ALLOWED_ORIGINS et redémarrer le Master Bot
Message tronqué
- Symptôme : La réponse dans Telegram est coupée
- Causes : Limite Telegram de 4 096 caractères
- Solution : Le bot divise automatiquement en parties [1/3] [2/3] [3/3]. Si non — bug dans la logique de split
Base de données
"Database not initialized"
- Symptôme : Le bot plante avec l'erreur "Database not initialized. Call initDb() first."
- Causes : initDb() n'a pas été appelé avant la première requête, ou le fichier DB a été supprimé
- Solution : Redémarrer le Master Bot — il initialise automatiquement la DB et exécute les migrations
"Database locked"
- Symptôme : Erreurs 500 aléatoires sous charge élevée
- Causes : SQLite écrit simultanément depuis plusieurs processus
- Solution : Le mode WAL est activé par défaut. Redémarrer les processus obsolètes
Référence rapide
| Problème | Première chose à vérifier | Solution rapide |
|---|---|---|
| Bot ne répond pas | /health ou /ping |
Restart via CRM |
| 401 Unauthorized | Heure de création du token | Se reconnecter |
| 403 Forbidden | Propriété du projet | Vérifier owner_id |
| Status degraded | consecutiveFailures |
Attendre le watchdog |
| Timeout 5m | Complexité de la tâche | Décomposer en étapes |
| Erreur Bridge | google_auth dans /health |
arc memory refresh |
| CORS blocked | CRM_ALLOWED_ORIGINS | Ajouter l'origin |
| WebSocket disconnect | Durée de vie JWT (24h) | Rafraîchir la page |
Commandes utiles pour le diagnostic
# Health checks
curl -s http://localhost:19210/api/master/health | jq .
curl -s http://localhost:19211/api/child/health | jq .
# Vérification des sessions tmux
tmux list-sessions
# Logs du Master Bot
tmux capture-pane -t citadel-master -p | tail -20
# Logs du Child Bot
tmux capture-pane -t ws-arc-v2 -p | tail -20
# Vérification des ports
ss -tlnp | grep '192[0-9][0-9]'
# État de la base de données
sqlite3 data/citadel.db "PRAGMA integrity_check;"
Application des docs (Phase 49.1+)
git push bloqué avec "doc-coverage check failed"
Le hook pre-push exige la mise à jour des docs quand le code change. STDERR indiquera quels fichiers doivent être mis à jour.
Solutions rapides :
- Auto-draft :
arc wrapup --generate→ remplir les TODO → commit - Manuel : voir le mapping dans
CLAUDE.md(Documentation Law) - Contournement d'urgence :
git push --no-verify(laisse une trace dans git log)
Le hook ne se lance pas sur un nouveau clone
bash scripts/setup-hooks.sh # une fois par clone
git config core.hooksPath # vérifier que = ".githooks"
Intégration GitHub (Phase 49.3)
Webhook retourne 401
Content-Type: application/jsondans le webhook GitHub (pasform-urlencoded)- Le secret doit correspondre à la sortie de
arc github link - Secret perdu → supprimer le webhook dans l'UI GitHub +
arc github unlink, en créer un nouveau
Feed GitHub de la barre latérale vide
- ContextRail visible ≥1280px viewport
- Rafraîchissement forcé (Ctrl+Shift+R)
- Vérification DB :
sqlite3 data/citadel.db "SELECT COUNT(*) FROM github_events WHERE project_name='<name>';"
Rate limit "429 Rate limited"
Cap = 100 req/min/projet. Augmenter dans shared/routes/github.ts:RATE_MAX.
Plus de détails : Configuration de l'intégration GitHub.