docs: add WORK_IN_PROGRESS.md and document false-positive protection
- 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>
This commit is contained in:
parent
62e98cb9e7
commit
5cad53ac7a
2 changed files with 105 additions and 0 deletions
69
WORK_IN_PROGRESS.md
Normal file
69
WORK_IN_PROGRESS.md
Normal file
|
|
@ -0,0 +1,69 @@
|
|||
# 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é |
|
||||
Loading…
Add table
Add a link
Reference in a new issue