Files
siop2/apps/mobile
pr-daaif 45ae491827 feat(r5.2): assistant au contrat + suggestion de codes de bilan
apps/ai : /internal/ask — seuil de pertinence, extraits sourcés ou
refus honnête portant la taille du corpus cherché (D2), rédaction via
le Generateur opt-in ; /internal/suggest — similarité sémantique entre
la description libre et les libellés ACTIFS des référentiels, un code
par champ, confiance FORTE/MOYENNE, « N bilans similaires sur ce
parc ». Sans LLM : déterministe, explicable. 23 pytest.

Contrat (74 opérations) : POST /assistant/ask → AssistantAnswer
(EXTRACTIVE/GENERATED/REFUSAL, extraits cités, corpus cherché) et
POST /assistant/suggest-bilan (codes existants seulement) ; clients
web/mobile régénérés.

API NestJS : module assistant — proxy vers siop2-ai (AI_SERVICE_URL/
AI_SERVICE_TOKEN, ADR-004 §4), permissions matrice (ask=view,
suggest=edit), traduction interne→contrat, 503 propre si service
éteint. 6 e2e sur stub HTTP (76 tests API).

Bug débusqué par la vraie chaîne : fastembed ne norme pas ses
vecteurs — la similarité des suggestions dépassait 1 (pgvector
normalisait dans son opérateur, masquant l'écart). Normalisation à
l'encodage + réindexation : bilans en tête (0.41), refus hors corpus,
scores cosinus ≤ 1.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-17 15:05:08 +01:00
..

@siop/mobile — l'app du technicien (R4)

Expo (SDK 57), offline-first, périmètre fermé : Ma journée, scan, préventif, synchro — la gestion reste web, le demandeur reste sur le portail QR public. Maquettes validées : docs/02-design/maquettes/maquette-r4.html (+ décisions D1-D5 au journal du 17/07/2026).

Lancer

# API locale d'abord (apps/api : pnpm dev), puis :
pnpm --filter @siop/mobile start          # QR Expo Go (téléphone sur le MÊME réseau)
EXPO_PUBLIC_API_URL=http://192.168.x.y:3000 pnpm --filter @siop/mobile start
  • EXPO_PUBLIC_API_URL : URL de l'API vue depuis le téléphone (IP LAN, pas localhost). Défaut : http://localhost:3000 (suffisant pour expo start --web).
  • Vérification navigateur : expo start --web + CORS_ORIGINS=http://localhost:8081 côté API (les apps natives n'envoient pas d'Origin — CORS ne concerne que le web).

Ce que porte R4.1 (socle)

  • Connexion e-mail/mot de passe + sélecteur démo (ADR-002 : n'existe que si l'API l'expose).
  • Coquille tabbar (onglets à venir marqués R4.2/R4.3) + Ma journée : OT triés priorité puis échéance (src/lib/journee.ts, testé), urgence en tête, pastille de synchro.
  • Lecture hors-ligne (D1) : cache TanStack persisté dans AsyncStorage (7 jours), NetInfo pilote onlineManager + bandeau. L'écriture en file arrive en R4.3.
  • Client typé généré depuis docs/openapi.json (pnpm generate:client) — règle d'or ADR-001.
  • Jeton dans SecureStore (trousseau) ; AsyncStorage en repli web de dev.

Tests

pnpm --filter @siop/mobile test (jest-expo — logique pure : tri, tokens) ; typecheck et le lint racine s'appliquent (job CI mobile).