diff --git a/CLAUDE.md b/CLAUDE.md index 2dcaf7d..63a3aa4 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -7,17 +7,16 @@ read it for anything descriptive; this file is only conventions and traps. FastAPI service: audio over `/ws` → local transcription (faster-whisper) → claim extraction/verification via the Anthropic API. Plus an admin API under `/admin/*`. -## Tracking files (TODO.md, README.md) +## Tracking files (README.md) -- Read them at the start of a task for **direction and intent** — where the project +- Read `README.md` at the start of a task for **direction and intent** — where the project is headed and the why behind choices. -- Treat their **progress/done state as a hint, not the truth**: a task marked done +- Treat its **progress/done state as a hint, not the truth**: something described as done may not be, or may have drifted. Verify against the code before relying on it. When they disagree, **the code wins** — flag the gap, don't edit code to match the docs. -- Update these files **only when I ask** (or at the end of a task I've validated). - No speculative or routine updates. Exception: when I point to a specific TODO item - and ask you to handle it, update that line automatically (check it off / amend it) - as part of completing the task — no need to ask first. +- Update `README.md` **only when I ask** (or at the end of a task I've validated). + No speculative or routine updates. +- The backlog lives in **GitHub Issues**, not in a tracked file — there is no `TODO.md`. ## Commands diff --git a/TODO.md b/TODO.md deleted file mode 100644 index e295266..0000000 --- a/TODO.md +++ /dev/null @@ -1,19 +0,0 @@ -# TODO — Backend - -Liste des features, métier comme tech, à implémenter. La source de vérité reste le code, pas ce fichier. - -## Features métier - -- [ ] **Dédoublonnage des claims** : un même fait répété sur plusieurs chunks de 5 s crée aujourd'hui des claims distincts. Détecter les quasi-doublons (similarité du `text`) et fusionner / ne pas re-vérifier — économise des appels Anthropic. -- [ ] **Cache de vérification** : mémoriser le résultat d'un claim déjà vérifié (clé = texte normalisé) pour ne pas repayer un appel sur une affirmation identique. -- [ ] **Multilingue (prompt Claude)** : la transcription tourne toujours en auto-détection ; la langue choisie par session sert de *filtre* (les chunks d'une autre langue sont ignorés, voir `core/languages.py` + `ConfigMessage` + le filtre dans `session.py`). Reste à adapter `SYSTEM_PROMPT` et l'enum de catégories de `claim_extractor.py` à la langue de la session — actuellement figés FR, donc les claims sortent en français même pour un audio non francophone. - -## Tests (priorité haute) - -- [ ] `session.py` : `_make_claim`, `_spawn_claims` (skip si < `MIN_WORDS`), le cycle pending → claim/remove_claim. Mocker `extract_and_verify` et le `WebSocket`. (Partiel : `_ensure_persisted` couvert par `test_session_persistence`.) -- [ ] Auth : `/admin/login` (bon mot de passe → JWT, mauvais → 401), expiration du token, `require_admin` qui rejette un token absent/invalide/expiré. -- [ ] Routes admin : un test d'intégration par route via `TestClient`, avec `require_admin` overridé (`app.dependency_overrides`). (Fait pour `/sessions/*` dans `test_sessions_route`.) - -## Observabilité - -- [ ] Exposer des métriques agrégées (claims/min, ratio web_search, latence moyenne transcription + vérification) en plus du statut de session brut.