fix(mobile): dictée validée sur iPhone physique — 2 bugs réels corrigés

setAudioModeAsync({allowsRecording:true}) manquant avant recorder.record()
(RecordingDisabledException iOS) ; EXPO_USE_PRECOMPILED_MODULES/
RCT_USE_PREBUILT_RNCORE jamais persistés dans .env (documentés dans ADR-005
mais seulement exportés en shell ad-hoc) — corrigé pour que tout rebuild
depuis zéro ne reproduise plus le crash dyld. Recette terrain complète
vérifiée : dictée → note → clôture → réindexation → recherche sémantique.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
pr-daaif
2026-08-01 22:09:04 +01:00
parent 59ed6f3952
commit 4af3f5668a
5 changed files with 68 additions and 5 deletions

View File

@@ -80,6 +80,18 @@
- Implémentée et vérifiée le 22/07/2026 : transcription réelle (français, voix de
synthèse) juste et rapide en local, bout en bout via l'API NestJS, et dans l'image
Docker de production construite pour l'occasion (modèle embarqué, aucun téléchargement
au démarrage). **Reste** : le test tactile sur iPhone physique (bouton dicter, permission
micro) n'a pas pu se jouer — blocage USB persistant malgré câble/port/redémarrage
multiples, reporté comme la recette Android (attend un accès matériel qui fonctionne).
au démarrage). Le test tactile sur iPhone physique n'avait pas pu se jouer ce jour-là
(blocage USB), reporté.
- **Recette terrain sur iPhone physique complétée le 01/08/2026** : micro, dictée réelle,
transcription fidèle, sauvegarde dans le bilan, clôture, puis retrouvée par la recherche
sémantique après réindexation — la chaîne complète (D5) est validée sur vrai matériel.
Deux bugs réels trouvés et corrigés en route :
1. `expo-audio` sur iOS refuse `recorder.record()` tant que la session audio n'a pas
été explicitement autorisée à enregistrer — `RecordingDisabledException`, corrigée
par un appel à `setAudioModeAsync({ allowsRecording: true })` avant l'enregistrement
(et remis à `false` après, par hygiène — le micro ne reste pas « armé »).
2. Le contournement des modules Expo/RN précompilés (`EXPO_USE_PRECOMPILED_MODULES=0`,
`RCT_USE_PREBUILT_RNCORE=0` — ADR-005) n'avait **jamais été rendu permanent** dans
`apps/mobile/.env`, contrairement au correctif FormData voisin : une reconstruction
ultérieure sans ces variables aurait reproduit le crash au lancement déjà documenté.
Désormais committé aux côtés de `EXPO_PUBLIC_USE_RN_FETCH`.

View File

@@ -4,6 +4,39 @@ Trace chronologique des sessions (la plus récente en premier). Le **playbook**
---
## 2026-08-01 — Pr. Daaif (+ Claude) — Dictée validée sur iPhone physique (ADR-004 §5)
**Actions**
- Reprise du reste laissé le 22/07 : le test tactile de la dictée sur iPhone, alors bloqué par une connexion
USB qui ne se rétablissait pas. Diagnostic cette fois : `system_profiler` (l'outil utilisé pour vérifier la
détection USB) était lui-même en panne et renvoyait un faux négatif silencieux — `ioreg` a révélé que
l'iPhone était en réalité détecté. Le vrai câble/port n'a jamais été le problème.
- Une fois l'app reconstruite (certificat gratuit expiré après plus d'une semaine — régénéré via le pipeline
officiel `expo run:ios`, jamais par un contournement manuel), **deux bugs réels trouvés et corrigés** :
1. `expo-audio` sur iOS refuse d'enregistrer sans un appel explicite à `setAudioModeAsync({ allowsRecording:
true })` avant `recorder.record()` — absent du code initial, jamais détecté hors d'un vrai appareil.
2. Le correctif des modules Expo/RN précompilés (ADR-005, `EXPO_USE_PRECOMPILED_MODULES=0` /
`RCT_USE_PREBUILT_RNCORE=0`) n'avait **jamais été committé** dans `apps/mobile/.env`, contrairement au
correctif FormData voisin déjà permanent — un vrai trou qui aurait refait planter l'app à la prochaine
reconstruction depuis zéro. Corrigé : les deux variables vivent maintenant côte à côte dans `.env`.
- **Recette réelle bout en bout** : micro → dictée d'une phrase → transcription fidèle (`faster-whisper` réel)
→ relecture → sauvegarde dans le bilan → clôture de l'OT → réindexation du corpus → **le contenu dicté
retrouvé par la recherche sémantique** (score 0,476). La boucle complète de l'idée d'origine (« cette
transcription devrait alimenter le corpus ») est validée sur vrai matériel, vraie voix, vrai réseau.
- Infra locale relancée depuis zéro après une semaine d'inactivité (Docker, conteneurs `siop2-*`, API,
service IA) — occasion de vérifier que le redémarrage à froid fonctionne proprement.
**Décisions**
- Aucune — cette session referme un reste déjà décidé, sans nouvelle décision de conception.
**Prochaine étape** : recette Android sur appareil physique (toujours en attente d'un appareil) ; redéploiement
Dokploy (`AI_SERVICE_TOKEN`) ; calibrage `AI_SEUIL_*` et qualité darija sur corpus SPELEV réel ; secret
`DOKPLOY_WEBHOOK_URL`.
---
## 2026-07-22 — Pr. Daaif (+ Claude) — Dictée implémentée : audio → transcription locale → corpus (ADR-004 §5)
**Actions**