- 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>
69 lines
3.6 KiB
Markdown
69 lines
3.6 KiB
Markdown
# 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
|
|
- [x] v0.2.1 — Cooldown post-swap + log forensique (trigger_session, pattern, snippet)
|
|
- [x] v0.2.2 — Confirmation 2-polls pour les hits sans reset time
|
|
- [x] v0.2.3 — Veto 5xx (`api_error` / `overloaded_error` / `internal server error`)
|
|
et retrait du pattern générique `"rate limit"` (remplacé par `rate_limit_error`)
|
|
- [x] Documentation : `docs/architecture.md` §2.2.1 "False-positive protection"
|
|
- [x] Tests unitaires exhaustifs (14 cas pour `isQuotaExhausted` dont les 3 veto 5xx)
|
|
- [x] Déploiement prod : `/usr/local/bin/claude-failover` + service redémarré
|
|
- [x] Push sur Forgejo `origin/main` (commits `7c5f838` et `62e98cb`)
|
|
|
|
## Prochaines Étapes
|
|
- [ ] **Optionnel** : préserver les sessions dédiées (ccl-1-conformvault,
|
|
ccl-2-scanyze) lors d'un swap légitime — actuellement `killAllPoolSessions`
|
|
les 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 `SwapRequested` est émis pour
|
|
que l'opérateur soit au courant sans lire les logs. Le `notifier.Telegram`
|
|
existe déjà — il suffit de câbler.
|
|
- [ ] **Optionnel** : exposer `/quota/status` via `internal/api` avec les champs
|
|
`last_swap_at`, `suspected_hit_at`, `cooldown_remaining` pour 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ées `ccl-1-conformvault`, `ccl-2-scanyze`.
|
|
|
|
## Fichiers Modifiés (cette série de fixes)
|
|
- `internal/quota/monitor.go` — quotaPatterns, serverErrorPatterns, suspectedHitAt, cooldown
|
|
- `internal/quota/monitor_test.go` — 14 sous-tests isQuotaExhausted + 3 tests poll
|
|
- `internal/state/state.go` — LastSwapAt/From/To + RecordSwap + LastSwapInfo
|
|
- `internal/switcher/account_switcher.go` — appel `state.RecordSwap()` après swap
|
|
- `docs/architecture.md` — §2.2.1 False-positive protection
|
|
- `VERSION.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é |
|