Vision — module Webmail du Calendrier Grainerie
Projet : PRISME — France 2030 · Calendrier Grainerie v3
Statut : vision produit & technique — TRL 4–5 (POC intégré, production PostgreSQL en cours)
Sources code :
Complète : Expérimentations actuelles · IA fédérée Marty · Autonomie & outils souverains
1. Intention — pourquoi un webmail dans l'agenda ?
La Grainerie traite chaque jour des flux mails liés aux résidences, productions, privatisations, logistique, Europe et relations filière. Ces messages ne sont pas déconnectés du planning : ils déclenchent des actions sur Baserow, le calendrier, la préparation technique, les demandes publiques.
Problème adressé : basculer entre Outlook/Gmail, le Calendrier et Baserow fragmente l'attention ; les réponses répétitives consomment du temps ; les données partent vers des GPAI cloud si l'on branche des assistants tiers.
Réponse imaginée : un module webmail dans l'application Qwik, accessible aux utilisateurs Baserow authentifiés, qui :
- Synchronise les boîtes IMAP en arrière-plan (cache serveur, pas de rechargement intégral à chaque ouverture).
- Regroupe les messages par besoin d'action (répondre, classer, archiver, réunion, pièce jointe…).
- Propose des scénarios et des champs visibles selon le contexte (logique QCM compacte, navigation clavier type Typeform).
- Assist via Marty : analyse, suggestions, templates — sans envoyer le corps des mails au réseau fédéré.
- Garde l'humain aux commandes : pas d'action destructive sans validation explicite.
Formulation :
2. Expérience utilisateur imaginée
2.1 Page webmail
flowchart LR
subgraph ui["Interface /webmail"]
G["Groupes<br/>reply_needed · meeting · archive…"]
C["Cartes compactes<br/>sélection multiple"]
T["Toolbar sticky<br/>actions de lot"]
E["Éditeur inline<br/>si champ manquant"]
M["Modal aperçu<br/>mail · brouillon · prompt"]
end
U["Utilisateur authentifié"] --> G
G --> C
C --> T
T --> E
E --> M| Comportement | Détail |
|---|---|
| Regroupement | Groupes calculés côté serveur (reply_needed, classification, archive_ready, meeting, attachment_needed, manual_review…) |
| Focus | Une carte active pour le clavier ; sélection multiple indépendante |
| Scénarios | Actions dérivées d'un scénario (reply_then_classify, meeting_response, attach_and_reply…) — pas d'une liste brute |
| Actions isolées | Suppression et « marquer lu » en parcours séparé, jamais mélangées silencieusement |
| Pièces jointes | Upload local contrôlé pour enrichir un prompt ou une réponse |
2.2 Parcours multi-comptes (production)
- Ouverture webmail — état vide guidé si aucun compte.
- Ajout compte IMAP/SMTP (preset ou saisie).
- Test connexion backend — mot de passe jamais renvoyé au client après enregistrement.
- Identifiants chiffrés en base PostgreSQL.
- Premier job sync IMAP en arrière-plan → UI
syncingpuis propositions dès les premières briques. - Syncs suivantes : invalidation ciblée des seules briques impactées.
3. Architecture technique — sync par briques
L'idée centrale : ne pas retélécharger toute la boîte à chaque fois. La sync IMAP est découpée en briques indépendantes, chacune avec hash, date et stratégie de recalcul.
flowchart TB
IMAP["Serveur IMAP<br/>fournisseur mail"]
W["Worker IMAP<br/>imap-sync-worker"]
PG[("PostgreSQL<br/>cache webmail")]
API["Routes /api/webmail/*"]
UI["Page Qwik /webmail"]
IMAP <-->|"briques"| W
W --> PG
UI --> API
API --> PG
W -->|"assistant-analysis"| PG| Brique | Contenu mis en cache |
|---|---|
folder-list | Dossiers, UIDVALIDITY, compteurs |
message-envelope | UID, Message-ID, sujet, expéditeur, flags |
message-body-preview | Extrait texte, hash corps |
message-body-full | Corps complet à la demande |
attachments-index | Métadonnées PJ |
attachments-binary | Binaire optionnel, rétention courte |
thread-index | Fils, In-Reply-To, références |
assistant-analysis | Groupe, scénario, confiance, actions proposées |
user-state | Traité, template choisi, brouillon |
Modules code (README) : imap sync plan, sync brick *, cache invalidation, imap sync cursors, observability.
Décision infra (mai 2026) : stockage production uniquement PostgreSQL (postgres:16, Configuration (docker compose.webmail)) — remplace SQLite POC et l'ancienne cible HFSQL documentée en avril 2026.
4. Marty — suggestions et templates (L0 → L3)
Le réseau fédéré Marty sert deux objectifs distincts dans le webmail :
| Objectif | Mécanisme | Ce qui ne part pas au réseau |
|---|---|---|
| Suggestions de traitement | Signaux anonymisés, modèles partagés, fusion local/fédéré | Corps des mails, PJ, identifiants |
| Templates par défaut | Initialisation depuis modèles fédérés, personnalisation locale | Contenu brut des messages |
Niveaux de personnalisation (spec §2.8) :
| Niveau | Source | Rôle |
|---|---|---|
| L0 | Templates génériques embarqués | Socle par scénario |
| L1 | Choix et corrections utilisateur | Apprentissage local |
| L2 | Suggestions fédérées anonymisées | Propositions / pondérations |
| L3 | Template final | Validé explicitement avant usage |
Garde-fou code : mergeSuggestionWithLocal — la suggestion fédérée n'est appliquée que si sa confiance dépasse le template local ; sources affichées (federated vs local) dans l'UI.
Fichiers : Suggestions fusion local / fédéré, Signaux d'apprentissage réseau, Templates e-mail (sources L0–L3) — tickets WEBMAIL-037 à 039.
Voir IA fédérée Marty §4.2.
5. Sécurité, droits et RGPD
| Principe | Implémentation imaginée |
|---|---|
| Accès | webmail et * réservés aux utilisateurs Baserow authentifiés — pas d'accès Guest ni public |
| Secrets | credentials, credential encryption — chiffrement côté serveur |
| Quotas | quotas — comptes, PJ, volume sync |
| Audit | audit log — journal des actions sensibles |
| RGPD | security rgpd — export / suppression ; pas de corps brut dans l'export |
| Permissions | permissions, field visibility — rôles et champs par scénario |
| Consentement Marty | Groupe federated du panneau consentement — pas de contribution sans opt-in |
Alignement PRISME : objectif 3 du dossier — droits, traçabilité, IA responsable (Objectif 3 — droits).
6. Place dans l'écosystème PRISME
flowchart TB
subgraph grainerie["La Grainerie — site pilote"]
CAL["Calendrier v3<br/>planning · résidences"]
WM["Webmail /webmail<br/>courrier métier"]
MARTY["Marty<br/>assistant · edge"]
end
subgraph data["Données souveraines"]
BR["Baserow"]
PG[("PostgreSQL")]
SOG["Serveur Outils Grainerie"]
end
subgraph filiere["Horizon filière PRISME"]
PIL["Structures pilotes CIRC-INO"]
MESH["PRISME-Mesh · fédération"]
end
CAL <--> WM
WM --> MARTY
CAL --> BR
WM --> PG
MARTY --> SOG
WM -.->|"commun potentiel<br/>TRL 6–7"| PIL
MARTY --> MESH| Dimension | Aujourd'hui (Grainerie) | PRISME (cible) |
|---|---|---|
| Usage | Équipes internes, résidences, régie | Mutualisation filière cirque / SV |
| Hébergement | Serveur Outils Grainerie | Package edge + infogérance Le Filament |
| IA | Marty local + signaux fédérés webmail | Réseau CIRC-INO, consentement granulaire |
| Licence | CC BY-NC-SA 4.0 (application) | Communs documentés, pas de rente données |
TRL estimé : 4–5 — code en production partielle (routes API, tests Vitest, worker PG) ; écarts fixtures/spec documentés (audit #3137, mai 2026).
7. État d'avancement & écarts assumés
| Zone | Vision (spec) | Réalité code (mai–juil. 2026) |
|---|---|---|
| UI | Composants PascalCase dédiés | Page Composant interface + composants kebab-case |
| Stockage | PostgreSQL multiuser | webmail pg repository, schéma 001-initial-schema.sql — fixtures encore en dev sans PG |
| Worker | Service Docker webmail-worker | imap sync worker + imap worker.mjs |
| Marty | Templates L0–L3 + fédéré | WEBMAIL-037–039 livrés ; consentement v1.2 |
| RGPD | Export opérationnel | Route export-rgpd — enrichissement en cours |
| Infra | Profil Configuration (docker compose.webmail) | AG-5 planifié — preuve worker 24 h |
Honnêteté dossier : le Webmail est une innovation réelle mais non généralisée filière au stade candidature — pilote interne, comme l'edge Nœud IA POC.
8. Ce que je n'ai pas voulu
- Un SaaS mail extractif ni une dépendance Gmail/Outlook pour le cœur métier.
- Une automatisation opaque (suppression, envoi massif sans validation).
- Un entraînement fédéré sur le contenu brut des mails.
- Une sync temps réel multi-opérateurs sur le même message (hors périmètre production initiale).
- Une migration brutale Python → TypeScript : transition progressive depuis le POC
mail-assistant.
9. Formulation dossier (extrait)
10. Références
| Téléchargement |
|---|
| README module |
| Spec technique |
| Plan stack agenda |
| Marty fédéré |
| Expérimentations |
| F04 Pôles — IA |
Document de travail — juillet 2026 — vision produit alignée sur la spec du 26/04/2026 et l'audit code du 27/05/2026.