- WORK_IN_PROGRESS.md captures the v0.2.1→v0.2.3 incident, root cause, and the optional follow-ups (preserve dedicated sessions during swap, Telegram alert on SwapRequested, /quota/status endpoint). - architecture.md §2.2.1 describes the four-layer defense: strict patterns, 5xx veto, two-poll confirmation, post-swap cooldown. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
3.6 KiB
3.6 KiB
Travaux en Cours - claude-failover
Dernière mise à jour
2026-04-15 19:30:00
Version Actuelle
0.2.3
Demande Actuelle
Aucune — v0.2.3 shippée, service stable.
Étapes Complétées
- v0.2.1 — Cooldown post-swap + log forensique (trigger_session, pattern, snippet)
- v0.2.2 — Confirmation 2-polls pour les hits sans reset time
- v0.2.3 — Veto 5xx (
api_error/overloaded_error/internal server error) et retrait du pattern générique"rate limit"(remplacé parrate_limit_error) - Documentation :
docs/architecture.md§2.2.1 "False-positive protection" - Tests unitaires exhaustifs (14 cas pour
isQuotaExhausteddont les 3 veto 5xx) - Déploiement prod :
/usr/local/bin/claude-failover+ service redémarré - Push sur Forgejo
origin/main(commits7c5f838et62e98cb)
Prochaines Étapes
- Optionnel : préserver les sessions dédiées (ccl-1-conformvault,
ccl-2-scanyze) lors d'un swap légitime — actuellement
killAllPoolSessionsles tue aussi. Interruption désagréable pour le travail interactif. Options : skip dedicated dans le kill, OU auto-relaunch avec--resume <uuid>après kill. Non-bloquant tant que les vrais quota hits sont rares. - Optionnel : telegram alert quand
SwapRequestedest émis pour que l'opérateur soit au courant sans lire les logs. Lenotifier.Telegramexiste déjà — il suffit de câbler. - Optionnel : exposer
/quota/statusviainternal/apiavec les champslast_swap_at,suspected_hit_at,cooldown_remainingpour le dashboard.
Contexte Important
- Symptôme en prod (2026-04-15) : daemon faisait des swaps compte1↔compte2
en boucle (intervalle descendant à 1 min), tuant les sessions interactives
ccl-1 et ccl-2 en permanence.
reset=""sur tous les events. - Cause racine identifiée via le log forensique v0.2.1 : les 500 d'Anthropic
contenaient le texte "rate limit" dans leur payload. Snippet capturé :
API Error: 500 {"type":"error","error":{"type":"api_error",...}}. Le monitor les confondait avec de vrais 429. - Config
reactivate_cooldown: "5m"existait déjà dans config.yaml mais n'était consommée que par le dispatcher — pas par le monitor. v0.2.1 a branché le monitor dessus. - Comptes disponibles :
compte1(Claude Max),compte2(Claude Team). Symlink actuel :~/.claude → .claude-compte2. - Sessions tmux gérées : pool autonome
ccl-auto-*(min=2, max=10) + dédiéesccl-1-conformvault,ccl-2-scanyze.
Fichiers Modifiés (cette série de fixes)
internal/quota/monitor.go— quotaPatterns, serverErrorPatterns, suspectedHitAt, cooldowninternal/quota/monitor_test.go— 14 sous-tests isQuotaExhausted + 3 tests pollinternal/state/state.go— LastSwapAt/From/To + RecordSwap + LastSwapInfointernal/switcher/account_switcher.go— appelstate.RecordSwap()après swapdocs/architecture.md— §2.2.1 False-positive protectionVERSION.md— changelog 0.2.1 → 0.2.3
Bugs Connus
- Sessions dédiées tuées lors d'un swap légitime : comportement documenté et voulu (respawn sur le nouveau compte), mais coupe brutalement le travail interactif en cours. Voir Prochaines Étapes.
Historique des Demandes (Récentes)
| Date | Version | Demande | Status |
|---|---|---|---|
| 2026-04-15 | 0.2.1 | Casser le ping-pong + logs forensiques | Terminé |
| 2026-04-15 | 0.2.2 | Confirmation 2-polls pour absorber les flashes | Terminé |
| 2026-04-15 | 0.2.3 | Veto 5xx + patterns stricts (root cause) | Terminé |