Gmail Phase E/F + HANDOFF global + cleanup cron/root
- Réécriture HANDOFF.md dashboard multi-domaines - Mise à jour MEMORY.md / TOOLS.md / AGENTS.md - Cleanup fichiers cron obsolètes + fichiers root - Gmail Phase E : audit, 18 filtres natifs, labels Promos/Dev-Tools/Social - Gmail Phase F : archive Philippot + Ulys terminée
This commit is contained in:
328
handoffs/HANDOFF-2026-06-09-GMAIL.md
Normal file
328
handoffs/HANDOFF-2026-06-09-GMAIL.md
Normal file
@@ -0,0 +1,328 @@
|
||||
# Handoff — OpenClaw / Gmail Housekeeping
|
||||
|
||||
> _Document de reprise pour une nouvelle session (humain ou agent IA)._
|
||||
> _Dernière mise à jour : 9 juin 2026._
|
||||
> _Mainteneur : Thierry Tallagrand._
|
||||
|
||||
---
|
||||
|
||||
## 🎯 TL;DR (à lire en premier)
|
||||
|
||||
Le projet **OpenClaw** est un orchestrateur multi-agents tournant sur Synology NAS
|
||||
(ARCHIVE3) qui pilote des comptes Google de Thierry via gateway gog.
|
||||
|
||||
**État actuel** : **Phase D Gmail housekeeping ✅ TERMINÉE** le 6 juin 2026.
|
||||
12 401 mails trashés en 6 vagues. Boîte 12 703 → ~4 600.
|
||||
|
||||
**Prochaines phases prévues** :
|
||||
- Phase E : filtres Gmail natifs (auto-trash à l'arrivée)
|
||||
- Phase F : Vague 2 (archive Philippot + Ulys + labels)
|
||||
- Phase G : 2ème passe Q8 (longue traîne newsletters tech)
|
||||
- Phase H : digest VE (parsing Jeep uconnect)
|
||||
|
||||
---
|
||||
|
||||
## ⏰ Dates critiques
|
||||
Date Événement Action
|
||||
6 juillet 2026 Auto-purge Gmail Trash (30j) des mails Phase D Restaurer AVANT cette date si erreur
|
||||
12 juin 2026 Token OAuth gmail.modify expire (Testing GCP, 7j) gog auth add --gmail-scope=full --manual --force-consent
|
||||
9 juin 2026 Aujourd'hui — reprise après pause Vérifier gmail-doubts.md si existant
|
||||
|
||||
Export as CSV
|
||||
|
||||
|
||||
---
|
||||
|
||||
## 🏗️ Architecture
|
||||
|
||||
### Hôte
|
||||
- Synology ARCHIVE3 (DSM, hostname `ARCHIVE3`)
|
||||
- Filesystem : `/volume1/docker/openclaw-data/workspace/`
|
||||
- User : 1000:1000 (Thierry)
|
||||
- TZ : Europe/Paris
|
||||
|
||||
### Containers Docker
|
||||
- openclaw-gateway (daemon principal, expose gog CLI)
|
||||
- openclaw-cli, openclaw-plugins, openclaw-dockerproxy
|
||||
- gitea (versioning local), openvpn2 (VPN)
|
||||
|
||||
### Compte Google authentifié
|
||||
- Email : tallagrand.thierry@gmail.com
|
||||
- Project GCP : 666305633659 (test users mode = refresh tokens 7j)
|
||||
- Scopes : gmail.modify + gmail.settings.basic + gmail.settings.sharing + userinfo.email + openid
|
||||
- Token expire : **12 juin 2026**
|
||||
|
||||
### Infrastructure mail historique (3 NAS Synology)
|
||||
- ARCHIVE → `[10.10.10.50]` (originel, IP locale)
|
||||
- ARCHIVE2 → `[www.airtria.net]`
|
||||
- ARCHIVE3 → `[www.airtria.pro]` (NAS actuel)
|
||||
|
||||
---
|
||||
|
||||
## 📂 Fichiers clés
|
||||
Fichier Rôle
|
||||
workspace/AGENTS.md Rules globales (NEVER/ALWAYS Gmail+WhatsApp, Heartbeats)
|
||||
workspace/MEMORY.md Mémoire persistante session par session
|
||||
workspace/gmail-audit.md Audit initial 3000 threads (Phase B)
|
||||
workspace/gmail-rules.md Règles trash/archive/whitelist (Phase C, source de vérité)
|
||||
workspace/gmail-housekeeping.md Log append-only actions Gmail (Phase D)
|
||||
workspace/handoff.md Ce fichier
|
||||
workspace/scripts/gmail_trash_v1.sh Vague 1 (>1y)
|
||||
workspace/scripts/gmail_trash_v1_6m.sh Vague 1bis (6m→1y)
|
||||
workspace/scripts/gmail_trash_v1ter.sh Vague 1ter (30j→6m)
|
||||
workspace/scripts/gmail_trash_v1quinquies.sh Vague 1quinquies (7j→30j) + 4 nouvelles règles
|
||||
workspace/scripts/gmail_trash_synology.sh Synology .net
|
||||
workspace/scripts/gmail_trash_synology_all.sh Synology .pro + IP10 + .net
|
||||
|
||||
Export as CSV
|
||||
|
||||
|
||||
---
|
||||
|
||||
## 📊 Bilan Phase D (5-6 juin 2026)
|
||||
Vague Filtre temporel Trashed
|
||||
Vague 1 older_than:1y 5 335
|
||||
Vague 1bis 6m → 1y 1 647
|
||||
Vague 1ter 30j → 6m 1 871
|
||||
Synology .net toutes périodes 1 160
|
||||
Synology .pro+IP10 toutes périodes 2 099
|
||||
Vague 1quinquies 7j → 30j 289
|
||||
TOTAL 12 401
|
||||
|
||||
Export as CSV
|
||||
|
||||
|
||||
Boîte 12 703 → ~4 600 (-64%). Hits rate-limit : 0.
|
||||
|
||||
### Top performers
|
||||
- LinkedIn (3 règles) : 3 502+
|
||||
- Synology auto-notifs (3 variants) : 4 419
|
||||
- Quora : 1 436+
|
||||
- AliExpress : 469
|
||||
- TAAFT : 418
|
||||
- Rustica : 351
|
||||
- Facebook : 365
|
||||
- Cdiscount : 276
|
||||
- Carrefour : 257
|
||||
|
||||
---
|
||||
|
||||
## 🔴 Whitelist absolue (NE JAMAIS toucher)
|
||||
|
||||
Source de vérité : gmail-rules.md.
|
||||
|
||||
### Banques
|
||||
@cic.fr, @e-cic.fr, @bpgo.fr, @cmb.fr
|
||||
|
||||
### Admin & légal
|
||||
@impots.gouv.fr, @dgfip.finances.gouv.fr, @digiposte.fr, @ameli.fr
|
||||
|
||||
### Telco perso
|
||||
@orange.com, @orange.fr, @neuf.fr
|
||||
|
||||
### Véhicules
|
||||
@vwfs.com, @volkswagen.fr, @jeep.com (cf. règle V01 digest VE),
|
||||
@ze-watt.fr/.com, @zeromotorcycles.com, r.clientele@vwfs.com
|
||||
|
||||
### Plongée
|
||||
@gissacg.fr, @lists.gissacg.fr, president@gissacg.fr, @arimair.fr
|
||||
|
||||
### AIRTRIA
|
||||
@airtria.net, @airtria.fr, @laboutique-solaire-pro.com
|
||||
|
||||
### Identités personnelles
|
||||
tallagrand.thierry@gmail.com, thierry.tallagrand@me.com,
|
||||
Frederic Tallagrand (famille)
|
||||
|
||||
### Synology infrastructure (CRITIQUE — alertes opérationnelles)
|
||||
- sns@synologynotification.com (Active Insight - alertes disque/storage)
|
||||
- noreply@c2.synology.com (C2 backup subscription)
|
||||
|
||||
### Finance
|
||||
- noreply@amundi-esr.com (épargne salariale PEE/PERCO)
|
||||
|
||||
### Labels système Gmail protégés
|
||||
IMPORTANT, STARRED, SENT, DRAFT, Personal, Travail, Achats, Receipts, Notes
|
||||
|
||||
---
|
||||
|
||||
## 🛡️ Hard constraints opérationnels
|
||||
|
||||
### NEVER
|
||||
1. messages.delete permanent (toujours messages.trash)
|
||||
2. Toucher la whitelist (abort silencieux si match)
|
||||
3. >200 actions par batch Gmail (en pratique 300 OK)
|
||||
4. >2000 actions par jour sans confirmation humaine
|
||||
5. Modifier labels système (INBOX retirable mais pas SENT/DRAFT/IMPORTANT)
|
||||
6. Lancer une vague sans dry-run préalable validé
|
||||
|
||||
### ALWAYS
|
||||
1. Dry-run obligatoire avant toute action en masse
|
||||
2. Logger chaque batch dans gmail-housekeeping.md
|
||||
3. Respecter gmail-rules.md comme source de vérité unique
|
||||
4. Vérifier la whitelist au runtime (pas seulement au design)
|
||||
5. Pause 5s entre 2 batchs gog gmail trash/archive
|
||||
6. En cas de doute : laisser dans inbox + log dans gmail-doubts.md
|
||||
|
||||
### Limites runtime utilisées (Phase D)
|
||||
- maxBatchSize: 300
|
||||
- pauseBetweenBatchesMs: 5000
|
||||
- Détection auto rate-limit 403 + retry 60s
|
||||
- Hits rate-limit observés : 0 sur 12 401 actions
|
||||
|
||||
---
|
||||
|
||||
## 🔧 Patterns gog éprouvés
|
||||
|
||||
Recherche read-only :
|
||||
sudo docker exec openclaw-gateway gog gmail search "QUERY" -a tallagrand.thierry@gmail.com --max 500 -j
|
||||
|
||||
Trash avec query + cap :
|
||||
sudo docker exec openclaw-gateway gog gmail trash -a tallagrand.thierry@gmail.com --query "QUERY" --max 300 --force
|
||||
|
||||
Re-auth OAuth :
|
||||
sudo docker exec openclaw-gateway gog auth remove tallagrand.thierry@gmail.com
|
||||
sudo docker exec -it openclaw-gateway gog auth add tallagrand.thierry@gmail.com --services=gmail --gmail-scope=full --manual --force-consent
|
||||
|
||||
Vérification auth :
|
||||
sudo docker exec openclaw-gateway gog auth list
|
||||
sudo docker exec openclaw-gateway gog gmail labels list -a tallagrand.thierry@gmail.com
|
||||
|
||||
---
|
||||
|
||||
## 🟣 Cas spécial — Jeep uconnect (digest VE)
|
||||
|
||||
from:uconnectservices@jeep.com (~400 mails) :
|
||||
- Phase D : aucune action (laissés en inbox)
|
||||
- Phase H : agent quotidien parse les mails, génère charge-vehicule.md + notif WhatsApp synthèse, archive auto avec label Charge-VE
|
||||
|
||||
---
|
||||
|
||||
## 🟡 Phase F (Vague 2 — à faire)
|
||||
|
||||
Archive + label, pas de destruction :
|
||||
ID Source Action Volume estimé
|
||||
V2.01 florian.philippot@les-patriotes.fr Archive + label Newsletters ~30
|
||||
V2.02 info@clients.ulys.com Archive + label Receipts ~50
|
||||
|
||||
Export as CSV
|
||||
|
||||
|
||||
---
|
||||
|
||||
## 🔵 Phase E (filtres Gmail natifs — à faire)
|
||||
|
||||
Objectif : plus jamais d'accumulation. Filtres Gmail qui trashent automatiquement les mails matchant nos 23 règles V1 dès l'arrivée.
|
||||
|
||||
Approches possibles :
|
||||
1. gog filters create (à explorer via gog gmail filters --help)
|
||||
2. Gmail API directe : users.settings.filters.create (Python)
|
||||
3. Gmail UI web : 23 clics manuels (lent mais sûr)
|
||||
|
||||
Pré-requis : Phase D doit avoir tourné 30 jours sans regret.
|
||||
|
||||
---
|
||||
|
||||
## 🟠 Phase G (2ème passe Q8 — longue traîne)
|
||||
|
||||
Identifier expéditeurs hors top 30 actuels (Medium, Substack, Frandroid, dev.to, mailchimp génériques).
|
||||
|
||||
Audit longue traîne :
|
||||
sudo docker exec openclaw-gateway gog gmail search "category:promotions OR category:updates older_than:6m" -a tallagrand.thierry@gmail.com --max 5000 -j > /tmp/longue-traine.json
|
||||
|
||||
---
|
||||
|
||||
## 🐛 Quirks / pièges connus
|
||||
|
||||
### Horloge système
|
||||
Le serveur expose un current_time parfois bloqué ou avec coquille UTCUTC.
|
||||
Source de vérité = horloge système host (date sur ARCHIVE3) ou contexte conversationnel.
|
||||
|
||||
### Bug KeyError 'subject' dans gog gmail search
|
||||
Certains threads n'ont pas de subject. Toujours utiliser t.get('subject', '').
|
||||
|
||||
### from:me ne fonctionne pas dans gog
|
||||
Utiliser l'email complet à la place.
|
||||
|
||||
### Compteurs Gmail web vs API
|
||||
- Compteur "Boîte de réception" gauche = fiable
|
||||
- Compteur "1-50 sur N" en haut = inclut SENT en vue Principale
|
||||
- Compteurs catégories (Promotions/Notifications/etc.) = INCLUENT TRASH, jamais représentatifs.
|
||||
|
||||
### Dry-run gog gmail trash
|
||||
Le --dry-run ne pré-fetch PAS les message_ids. Pour validation, faire un gog gmail search séparé avec la même query.
|
||||
|
||||
---
|
||||
|
||||
## 📋 Checklist de reprise (pour nouvelle session)
|
||||
|
||||
[ ] Vérifier date système : date sur ARCHIVE3
|
||||
[ ] Vérifier état token : gog auth list (si expire <24h, relancer flow OAuth)
|
||||
[ ] Lire gmail-housekeeping.md (dernières actions)
|
||||
[ ] Lire MEMORY.md (état général)
|
||||
[ ] Vérifier gmail-doubts.md (mails à relire)
|
||||
[ ] Vérifier inbox count : gog gmail search "in:inbox" --max=1 -j
|
||||
[ ] Décider phase suivante : E, F, G ou H
|
||||
[ ] Si action destructive → dry-run d'abord, valider, puis exécuter
|
||||
|
||||
---
|
||||
|
||||
## 🔗 Liens / refs
|
||||
|
||||
- gog CLI : gog gmail {search|trash|archive|labels} --help
|
||||
- Gmail search syntax : https://support.google.com/mail/answer/7190
|
||||
- Gmail API quotas : https://developers.google.com/gmail/api/reference/quota
|
||||
- GCP project : 666305633659 (mode Testing, refresh 7j)
|
||||
|
||||
---
|
||||
## 10 juin 2026 ~01:00-01:35 UTC+2 — Auth Gmail re-faite + persistance
|
||||
|
||||
### Contexte
|
||||
Token OAuth expirant 12/6/2026. Découverte que le keyring vivait dans
|
||||
/home/node/.local/share/gogcli/ (couche writable container) = perdu à chaque
|
||||
compose down/up.
|
||||
|
||||
### Actions
|
||||
- Re-auth gog complète via `gog auth add tallagrand.thierry@gmail.com
|
||||
--services=gmail --manual --gmail-scope=full --force-consent`
|
||||
- Ajout de GOG_HOME=/home/node/.openclaw/gogcli dans compose.yaml (env)
|
||||
- Migration credentials.json + keyring/ vers gogcli/data/
|
||||
- Permissions 1000:1000, files 600, dirs 700
|
||||
- Test ULTIME compose down+up : auth survit ✅
|
||||
|
||||
### Garanties acquises
|
||||
- Refresh token persisté dans /volume1/docker/openclaw-data/gogcli/data/keyring/
|
||||
- Survit aux compose restart, stop+start, down+up, --force-recreate
|
||||
- GOG_KEYRING_PASSWORD doit rester identique (sinon keyring illisible)
|
||||
|
||||
### TODO
|
||||
- Investiguer config.path warning (non critique, gog créera /gogcli/config/
|
||||
à la prochaine écriture config)
|
||||
- Mettre à jour scripts/generate_gmail_token.sh (référence à `gog auth
|
||||
generate-token` qui n'existe pas — la vraie commande est `gog auth add ... --manual`)
|
||||
- Référencer la nouvelle syntaxe gog dans MEMORY.md (procédure compacte
|
||||
~1100 chars proposée plus haut, à appliquer une fois reposé)
|
||||
|
||||
## ✅ Validation finale 10 juin 2026 ~02:13-02:18 UTC+2
|
||||
|
||||
Test fonctionnel complet via WhatsApp DM (session fraîche post-/new) :
|
||||
|
||||
### Questions/réponses
|
||||
| Question | Comportement | Latence |
|
||||
|---|---|---|
|
||||
| "Combien de mails aujourd'hui ?" | 1 appel gog gmail search → "2 messages" | ~1min |
|
||||
| "et hier ?" | Réutilise contexte + 1 appel | ~5s |
|
||||
| "donne la liste" | Format structuré avec dates + étiquettes | ~30s |
|
||||
| "et liste des mails de lundi" | Recherche multi-jours, format détaillé | ~1min |
|
||||
|
||||
### Test dashboard
|
||||
"fait un classement par catégorie des mails depuis le 1juin 2026 et le 10 juin 2026"
|
||||
→ Réponse multi-section (Newsletters/Actualités/Réseaux/Personnel/Systèmes/Autres)
|
||||
→ Classification sémantique propre, ~30 mails listés
|
||||
→ Aucune boucle, aucune saturation
|
||||
|
||||
### Conclusion
|
||||
- Phase D bilan classement Gmail : **PHASE LECTURE COMPLÈTEMENT OPÉRATIONNELLE**
|
||||
- Phase E (mutations en masse) : prête à être lancée, syntaxe validée par l'agent
|
||||
- Aucune intervention manuelle nécessaire pour les questions Gmail standard
|
||||
|
||||
Reference in New Issue
Block a user