You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Sécurité :
- H1 PanicStep.exportsWipe distinct de tmpPurge (rapport panique sans
ambiguïté). PanicReport.steps sépare maintenant la purge du cache
d'exports et celle de getTemporaryDirectory().
- B3 RagService._sanitize : cap dur 16 000 caractères en entrée des
passes regex. Anti-DoS UX sur input IA pathologique. Le contenu de
note est déjà tronqué en amont (8 ko) mais le userPrompt libre
n'avait aucun cap.
- M3 BacklinksService cache TTL titre→id sur Stopwatch monotone
(anti-rollback root). Aligné avec doctrine MonotonicClock sur tout TTL.
Performance device low-end (POCO C75, 2 Go RAM, cible F-Droid) :
- M2 split du cap historique noteContentIndexLimit (200 000) en deux
constantes contextuelles : noteContentEmbeddingLimit = 8192 (MiniLM
cut à 512 tokens donc ~2 ko utiles, 4× marge) et
noteContentBacklinksLimit = 50000 (regex parse pure, marge confort).
Économie RAM directe sur la sérialisation isolate.
- B5 documentation explicite de la divergence intentionnelle entre
IndexingService._writeDebounce = 3 s (passes MiniLM coûteuses) et
BacklinksService._writeDebounce = 500 ms (regex pure, suivi temps réel).
UI / accessibilité :
- M1 ColorScheme Material 3 : tokens errorContainer, onErrorContainer,
primaryContainer, onPrimaryContainer, secondaryContainer,
surfaceContainerHighest, onSurfaceVariant, outline déclarés
explicitement (WCAG AA garanti sur palette GitHub custom).
- M4 SnackbarExt : helpers canoniques showErrorSnack / showSuccessSnack
qui posent automatiquement la paire (backgroundColor, foregroundColor)
cohérente — ferme la porte aux usages où un caller omettait
foregroundColor sur fond errorContainer.
- B2 HapticFeedback ajouté sur lock manuel de coffre (lightImpact) et
sur le bouton "Terminé" éditeur (mediumImpact). L'autosave debounce
500 ms reste sans haptique pour ne pas saturer pendant la frappe.
Tests :
- M6 + I1 nouveau test/audit_v1_1_4_test.dart : garde-régression sur
PanicStep.exportsWipe distinct de tmpPurge, séquence panique
(exportsWipe → tmpPurge), noteContentEmbeddingLimit/BacklinksLimit,
RagService._sanitize cap 16 000, drift detection AppConstants.appVersion.
- test/panic_service_test.dart mis à jour pour valider la nouvelle
séquence avec exportsWipe en avant-dernier step.
Audit anti-régression :
- 6 findings auto-invalidés après lecture exhaustive du code :
M5 (NoteCard _dfCache déjà keyé sur localeCode), B1
(EmbedderCoordinator.dispose existait déjà avec lastError.dispose),
B4 (AiChatScreen TextField avait déjà autocorrect/enableSuggestions
désactivés). Audit honnête — pas d'invention.
versionCode 44 → 45, versionName 1.1.3 → 1.1.4.
AppConstants.appVersion synchro pubspec.yaml.
Aucun changement de format .notes / DB / vault.
Cert SHA-256 ddb385de…642e9 stable.
flutter analyze 0 issue, 84/84 tests verts.
APK arm64 220.8 Mo (Gemma bundled), armeabi 71 Mo, x86_64 78 Mo.
Fastlane FR+EN 45.txt (471 / 437 chars, cap 500 OK).
Workaround AGP 8.x + Kotlin lazy : config-cache désactivé dans
android/gradle.properties.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
0 commit comments