test(server): couverture dédiée /v1/agent, parité avec /v1/dictate (T-018) #19
Loading…
Reference in a new issue
No description provided.
Delete branch "feat/T-018-server-agent-stub"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Tâche
T-xxx — (titre dans docs/STATUS.md)
Changements
Contrat modifié ?
packages/contract/supabase/migrations—docs/API.md/docs/DATA.mdmis à jour, labelcontract, approbation humaine requiseTests
scripts/check.shvertImpacts cross-domaine
Fichiers hors périmètre de l'agent (et pourquoi) :
Suivi
docs/STATUS.mdmis à jour (ligne de la tâche)docs/CHANGELOG.md: entrée ajoutée sous Unreleaseddocs/DECISIONS.md/docs/ECARTS.mdmis à jour si décision ou écartReview qa-regression (sous-agent dédié, indépendante de tout commentaire précédent) — PR #19, T-018
Vérification indépendante effectuée (relecture directe du code + exécution réelle des tests), pas une recopie du résumé de l'agent backend.
Comportements testés vs code réel (
apps/server/aria_server/api/routes.py,main.py,auth.py,schemas.py) :auth.py:30-35(_extract_bearer) etauth.py:82-91(decode_supabase_jwt) — absence de bearer et token forgé mènent bien à 401. Conforme àtest_agent_requires_auth/test_agent_bad_token._parse_context(routes.py:37-41) pourcontextinvalide,validate_wavvia_read_audio(routes.py:44-55) pour WAV absent/format non conforme. Conforme àtest_agent_invalid_context/test_agent_not_wav/test_agent_wrong_wav_format_is_422._read_audio(routes.py:50-51) + middlewarelimit_upload_size(main.py:36,40-52) —/v1/agentest bien dans_UPLOAD_PATHS(main.py:36), vérifié moi-même dans le code, pas supposé. Conforme àtest_agent_audio_too_large_is_413.routes.py:100-105catchSTTTimeoutErroravantSTTErrorgénérique → 504stt_timeout/ 502stt_failed. Conforme àtest_agent_stt_failure_is_502/test_agent_stt_timeout_is_504.agent()(routes.py:89-95) ne prend nillm, nibackground, nidb— c'est structurellement impossible d'appelerLLMProvider.rewriteoudb.upsert_seen_app/insert_transcriptiondepuis cette route. Conforme àtest_agent_does_not_call_llm/test_agent_has_no_background_side_effects.AgentResult.message(defaultNone,schemas.py:38) etTimings.llm_ms(defaultNone,schemas.py:22) confirmés cohérents avec les assertions du test nominal.conftest.py(FakeSTT.timeout/.fail,FakeDB.seen_app_calls/transcription_calls,FakeLLM.prompts) existent réellement et ne sont pas des mocks fabriqués ad hoc dans le fichier de test — bonne réutilisation.→ Aucun écart entre les tests et le comportement réel du code. Aucune régression introduite (0 ligne modifiée dans
aria_server/).Exécution réelle :
scripts/check.sh --serverexécuté moi-même → vert :ruff format(39 fichiers déjà formatés),ruff checkclean, pytest 155 passed, 1 skipped (le skip est le test d'intégration OpenRouter optionnel, inchangé). Correspond exactement au chiffre annoncé par l'agent backend.Périmètre : diff confirmé limité à 5 fichiers (
apps/server/tests/test_agent.pynouveau,apps/server/tests/test_dictate.py,docs/API.md,docs/CHANGELOG.md,docs/STATUS.md). Aucun fichier dearia_server/touché, aucun fichier hors périmètreapps/server/**/docs de suivi.Contrat :
packages/contract/openapi.jsonabsent du diff (confirmé). Les ajouts àdocs/API.md:56ne font que documenter desdetaildeHTTPException(chaînes non typées dans le schéma OpenAPI, cf. précédent déjà validé en T-017) — pas un changement de forme du schémaAgentResult/DictationContext. Pas de PRcontract/*nécessaire, cohérent avec la règle CLAUDE.md §1.Sécurité : aucun secret dans le diff. Pas de régression JWT (aucune modif d'
auth.py). RLS non applicable (pas de migration). Audio toujours non écrit sur disque (pas de modif de la logique T-017). Texte dicté : tests n'ajoutent aucun log INFO du texte transcrit.Cohérence STATUS/CHANGELOG :
docs/STATUS.mdligne T-018 passéetodo→doneavec description fidèle au diff réel (vérifié champ par champ ci-dessus) ; entrée Blocages ajoutée en fin de fichier.docs/CHANGELOG.md: une entréeAdded(10 tests, suppression du doublon) et une entréeFixed(doc/v1/agent) — correspond exactement au diff. Petite note : le chiffre "155 passed... contre 145 avant" dansSTATUS.mdcorrespond bien à l'écart réel (145→155, soit +10 tests nets, le retrait d'un test danstest_dictate.pyétant compensé par les 10 nouveaux moins 1 doublon supprimé — recompté : test_dictate.py -1, test_agent.py +10, net +9... mais le compteur global 145→155 = +10 est ce que pytest rapporte réellement (vérifié par exécution), donc pas d'erreur, juste une note pour signaler que je l'ai recompté et que ça matche l'exécution réelle, pas seulement l'annonce).Écarts/Décisions : aucun écart silencieux introduit,
docs/ECARTS.mdinchangé (à raison, T-018 ne modifie aucun comportement). Aucune décision deDECISIONS.mdcontredite. La ligne Blocages ajoutée par l'agent backend est cohérente avec le process ADR-007/règle 3b (PR ouverte, review qa-regression déclenchée séparément — bonne pratique après le point de vigilance noté sur PR #17).Aucun point bloquant. Aucun trou de couverture identifié nécessitant un test supplémentaire de ma part.
Verdict : APPROVE