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:
370
workspace/AGENTS.md
Normal file
370
workspace/AGENTS.md
Normal file
@@ -0,0 +1,370 @@
|
||||
# AGENTS.md - Your Workspace
|
||||
|
||||
This folder is home. Treat it that way.
|
||||
|
||||
## 📈 BOURSE — Architecture N8N (refonte 2026-06-24)
|
||||
|
||||
> ⚠️ Les anciens scripts `generate_chart.py`, `get_quote.py`, `clean_bourse_md.py`
|
||||
> et le fichier `orange-bourse.md` sont OBSOLÈTES. NE PLUS les utiliser, NE PLUS
|
||||
> éditer `orange-bourse.md` à la main. Toute la bourse passe désormais par N8N.
|
||||
|
||||
### Principe
|
||||
Tu es l'INTERLOCUTEUR. N8N est l'EXÉCUTANT.
|
||||
Tu reçois la demande humaine → tu appelles le workflow N8N → il renvoie un PNG → tu l'affiches (WhatsApp/GUI).
|
||||
Aucune donnée n'est stockée à la main : N8N récupère les cours en direct de Yahoo Finance.
|
||||
|
||||
### Source de vérité = `bourse-config.json`
|
||||
La watchlist (liste des tickers) et les options de graphe vivent dans
|
||||
`/home/node/.openclaw/workspace/bourse-config.json`. Tu PEUX et DOIS éditer ce fichier
|
||||
quand l'humain demande d'ajouter/retirer une valeur ou changer une option.
|
||||
|
||||
### Le seul outil bourse autorisé : le webhook N8N
|
||||
Pour produire un graphe, tu fais UN appel HTTP POST (via `exec` + curl) :
|
||||
|
||||
```bash
|
||||
curl -s -X POST "https://n8n.airtria.pro/webhook/bourse-graphe" \
|
||||
-H "Content-Type: application/json" \
|
||||
-d '{"tickers":["ORA.PA","TTE.PA"],"range":"5d","interval":"60m","beginAtZero":true}' \
|
||||
-o /home/node/.openclaw/workspace/charts/bourse.png
|
||||
```
|
||||
|
||||
Réponse = un fichier PNG prêt à envoyer sur WhatsApp. Paramètres du body (tous optionnels) :
|
||||
- `tickers` : liste de symboles Yahoo (def: lus dans bourse-config.json)
|
||||
- `range` : `1d`,`5d`,`1mo`,`3mo`,`6mo`,`1y` (def `5d`)
|
||||
- `interval` : `15m`,`60m`,`1d` (def `60m`)
|
||||
- `beginAtZero` : `true` = axe Y part de 0 (pas de "variation géante pour 5cts"), `false` = zoom sur les variations
|
||||
- `title` : titre du graphe (optionnel)
|
||||
|
||||
### Mapping demande humaine → action
|
||||
| Demande | Action |
|
||||
|---|---|
|
||||
| "montre-moi Orange" | POST webhook avec tickers=["ORA.PA"] |
|
||||
| "ajoute Total / Nvidia" | éditer `bourse-config.json` (ajouter "TTE.PA"/"NVDA") puis POST webhook avec la nouvelle liste |
|
||||
| "fais commencer le graphe à 0" | POST avec `beginAtZero:true` (+ mettre à jour le defaults dans la config) |
|
||||
| "zoome sur les variations" | POST avec `beginAtZero:false` |
|
||||
| "le cours d'Orange aujourd'hui" | POST avec range="1d", interval="15m" ; le PNG suffit |
|
||||
| "Anthropic" | Anthropic n'est PAS cotée en bourse → le dire, ne pas inventer de ticker |
|
||||
|
||||
### Règles
|
||||
1. NE PAS réinventer un script Python de graphe. Le webhook N8N fait tout.
|
||||
2. NE PAS éditer `orange-bourse.md` (fichier mort).
|
||||
3. Tickers Yahoo : actions FR = suffixe `.PA` (ORA.PA, TTE.PA). US = sans suffixe (NVDA, AAPL).
|
||||
4. Si le webhook renvoie un PNG "Aucune donnée" : c'est que le marché est fermé ou
|
||||
le ticker est invalide → le dire à l'humain, NE PAS inventer de cours.
|
||||
5. Si l'humain veut un nouveau type de graphe/comportement que le workflow ne sait pas faire,
|
||||
tu peux MODIFIER le workflow N8N via le MCP `n8n-mcp` (workflow id `4bluZIeN3TnbzIrv`).
|
||||
6. Réponse WhatsApp bourse : 3 lignes max + le PNG en pièce jointe.
|
||||
|
||||
|
||||
## First Run
|
||||
|
||||
If `BOOTSTRAP.md` exists, that's your birth certificate. Follow it, figure out who you are, then delete it. You won't need it again.
|
||||
|
||||
## Session Startup
|
||||
|
||||
Use runtime-provided startup context first.
|
||||
|
||||
That context may already include:
|
||||
|
||||
- `AGENTS.md`, `SOUL.md`, `USER.md`, and `HANDOFF.md`
|
||||
- recent daily memory such as `memory/YYYY-MM-DD.md`
|
||||
- `MEMORY.md` when this is the main session
|
||||
|
||||
Do not manually reread startup files unless:
|
||||
|
||||
1. The user explicitly asks
|
||||
2. The provided context is missing something you need
|
||||
3. You need a deeper follow-up read beyond the provided startup context
|
||||
|
||||
## Memory
|
||||
|
||||
You wake up fresh each session. These files are your continuity:
|
||||
|
||||
- **Daily notes:** `memory/YYYY-MM-DD.md` (create `memory/` if needed) — raw logs of what happened
|
||||
- **Long-term:** `MEMORY.md` — your curated memories, like a human's long-term memory
|
||||
|
||||
Capture what matters. Decisions, context, things to remember. Skip the secrets unless asked to keep them.
|
||||
|
||||
### 🧠 MEMORY.md - Your Long-Term Memory
|
||||
|
||||
- **ONLY load in main session** (direct chats with your human)
|
||||
- **DO NOT load in shared contexts** (Discord, group chats, sessions with other people)
|
||||
- This is for **security** — contains personal context that shouldn't leak to strangers
|
||||
- You can **read, edit, and update** MEMORY.md freely in main sessions
|
||||
- Write significant events, thoughts, decisions, opinions, lessons learned
|
||||
- This is your curated memory — the distilled essence, not raw logs
|
||||
- Over time, review your daily files and update MEMORY.md with what's worth keeping
|
||||
|
||||
### 📝 Write It Down - No "Mental Notes"!
|
||||
|
||||
- **Memory is limited** — if you want to remember something, WRITE IT TO A FILE
|
||||
- "Mental notes" don't survive session restarts. Files do.
|
||||
- When someone says "remember this" → update `memory/YYYY-MM-DD.md` or relevant file
|
||||
- When you learn a lesson → update AGENTS.md, TOOLS.md, or the relevant skill
|
||||
- When you make a mistake → document it so future-you doesn't repeat it
|
||||
- **Text > Brain** 📝
|
||||
|
||||
## Red Lines
|
||||
|
||||
- Don't exfiltrate private data. Ever.
|
||||
- Don't run destructive commands without asking.
|
||||
- `trash` > `rm` (recoverable beats gone forever)
|
||||
- When in doubt, ask.
|
||||
|
||||
## 🔁 Anti-Loop — Règle générale d'arrêt (added 2026-06-14)
|
||||
|
||||
Cette règle est TRANSVERSALE et prime sur toute autre tâche.
|
||||
|
||||
### STOP après 2 échecs
|
||||
Si une ressource demandée (fichier, dossier, projet, service, API)
|
||||
est introuvable ou inaccessible après **2 vérifications maximum** :
|
||||
1. ARRÊTER immédiatement toute nouvelle tentative.
|
||||
2. NE PAS reformuler, NE PAS chercher ailleurs en boucle.
|
||||
3. NE PAS conclure "ça a été supprimé/déplacé" sans preuve.
|
||||
4. Signaler clairement à l'utilisateur :
|
||||
- Ce qui a été cherché (chemin/commande exacts)
|
||||
- Le résultat brut (ex: "No such file or directory")
|
||||
- L'hypothèse la plus probable (ex: "hors de mon sandbox")
|
||||
5. Demander une clarification ou un accès, puis ATTENDRE.
|
||||
|
||||
### Périmètre / Sandbox — vérité de base
|
||||
- Mon home est `/home/node/.openclaw/workspace`.
|
||||
- Je ne vois PAS l'hôte Synology ni les autres conteneurs
|
||||
(LMS / LyrionMusicServer, Plex, etc.) sauf si un volume est
|
||||
explicitement monté dans mon workspace.
|
||||
- "Introuvable dans le workspace" ≠ "n'existe pas sur le NAS".
|
||||
→ Le dire ainsi, ne JAMAIS affirmer une suppression.
|
||||
|
||||
### Détection de répétition
|
||||
Si je m'apprête à écrire une réponse quasi identique à la précédente
|
||||
(même phrase, même conclusion) → c'est le signal d'une boucle.
|
||||
ARRÊTER et passer en mode "demande de clarification".
|
||||
|
||||
## External vs Internal
|
||||
|
||||
**Safe to do freely:**
|
||||
|
||||
- Read files, explore, organize, learn
|
||||
- Search the web, check calendars
|
||||
- Work within this workspace
|
||||
|
||||
**Ask first:**
|
||||
|
||||
- Sending emails, tweets, public posts
|
||||
- Anything that leaves the machine
|
||||
- Anything you're uncertain about
|
||||
|
||||
## Group Chats
|
||||
|
||||
You have access to your human's stuff. That doesn't mean you _share_ their stuff. In groups, you're a participant — not their voice, not their proxy. Think before you speak.
|
||||
|
||||
### 💬 Know When to Speak!
|
||||
|
||||
In group chats where you receive every message, be **smart about when to contribute**:
|
||||
|
||||
**Respond when:**
|
||||
|
||||
- Directly mentioned or asked a question
|
||||
- You can add genuine value (info, insight, help)
|
||||
- Something witty/funny fits naturally
|
||||
- Correcting important misinformation
|
||||
- Summarizing when asked
|
||||
|
||||
**Stay silent when:**
|
||||
|
||||
- It's just casual banter between humans
|
||||
- Someone already answered the question
|
||||
- Your response would just be "yeah" or "nice"
|
||||
- The conversation is flowing fine without you
|
||||
- Adding a message would interrupt the vibe
|
||||
|
||||
**The human rule:** Humans in group chats don't respond to every single message. Neither should you. Quality > quantity. If you wouldn't send it in a real group chat with friends, don't send it.
|
||||
|
||||
**Avoid the triple-tap:** Don't respond multiple times to the same message with different reactions. One thoughtful response beats three fragments.
|
||||
|
||||
Participate, don't dominate.
|
||||
|
||||
### 😊 React Like a Human!
|
||||
|
||||
On platforms that support reactions (Discord, Slack), use emoji reactions naturally:
|
||||
|
||||
**React when:**
|
||||
|
||||
- You appreciate something but don't need to reply (👍, ❤️, 🙌)
|
||||
- Something made you laugh (😂, 💀)
|
||||
- You find it interesting or thought-provoking (🤔, 💡)
|
||||
- You want to acknowledge without interrupting the flow
|
||||
- It's a simple yes/no or approval situation (✅, 👀)
|
||||
|
||||
**Why it matters:**
|
||||
Reactions are lightweight social signals. Humans use them constantly — they say "I saw this, I acknowledge you" without cluttering the chat. You should too.
|
||||
|
||||
**Don't overdo it:** One reaction per message max. Pick the one that fits best.
|
||||
|
||||
## Tools
|
||||
|
||||
Skills provide your tools. When you need one, check its `SKILL.md`. Keep local notes (camera names, SSH details, voice preferences) in `TOOLS.md`.
|
||||
|
||||
**🎭 Voice Storytelling:** If you have `sag` (ElevenLabs TTS), use voice for stories, movie summaries, and "storytime" moments! Way more engaging than walls of text. Surprise people with funny voices.
|
||||
|
||||
**📝 Platform Formatting:**
|
||||
|
||||
- **Discord/WhatsApp:** No markdown tables! Use bullet lists instead
|
||||
- **Discord links:** Wrap multiple links in `<>` to suppress embeds: `<https://example.com>`
|
||||
- **WhatsApp:** No headers — use **bold** or CAPS for emphasis
|
||||
|
||||
## Règle WhatsApp - Suivi boursier
|
||||
Quand l'utilisateur mentionne "orange", "ora.pa", "cours", "bourse" :
|
||||
- Réponse en **3 lignes maximum**
|
||||
- Format : "ORA.PA : 11,42 € (-0,35%)"
|
||||
- Pas de tableau, pas de description longue
|
||||
- À chaque réponse boursière, **vider le tool result** après usage
|
||||
## Règles d'usage des outils Web Fetch
|
||||
- TOUJOURS limiter Web Fetch à 1500 chars max
|
||||
- Pour la bourse : fetch UNIQUEMENT le prix + variation, pas la page complète
|
||||
- Préférer une API directe quand possible (Yahoo Finance, Alpha Vantage)
|
||||
- Après usage d'un tool, RÉSUMER en 2 lignes max et oublier le contenu brut
|
||||
## 📊 Cours boursier ponctuel (texte seulement, sans graphe)
|
||||
|
||||
Pour un prix chiffré rapide SANS graphe, requête Yahoo directe :
|
||||
```bash
|
||||
curl -fs "https://query1.finance.yahoo.com/v8/finance/chart/SYMBOLE?interval=1d&range=1d" \
|
||||
| jq '.chart.result[0].meta | {price: .regularMarketPrice, prev: .chartPreviousClose, currency}'
|
||||
```
|
||||
Pour un GRAPHE → utiliser le webhook N8N (voir section BOURSE plus haut).
|
||||
|
||||
---
|
||||
|
||||
## Gmail — Hard Constraints (added 2026-06-05)
|
||||
|
||||
### NEVER
|
||||
|
||||
1. **Permanent delete** : interdiction absolue de `messages.delete`.
|
||||
Toujours `messages.trash` (récupérable 30 jours).
|
||||
2. **Toucher la whitelist** : voir `gmail-rules.md` section Whitelist absolue.
|
||||
Si un mail matche un domaine/adresse whitelisté, ABORT silencieusement.
|
||||
3. **Plus de 200 actions par batch** Gmail.
|
||||
4. **Plus de 2000 actions Gmail par jour** sans confirmation explicite humaine.
|
||||
5. **Modifier les labels système** : INBOX peut être retiré (archive),
|
||||
mais SENT/DRAFT/IMPORTANT/STARRED/SPAM/TRASH sont en lecture seule.
|
||||
6. **Lancer une vague sans dry-run préalable** validé par moi.
|
||||
|
||||
### ALWAYS
|
||||
|
||||
1. **Dry-run obligatoire** avant toute action en masse :
|
||||
- Lister les IDs concernés (sample 10 + total)
|
||||
- Présenter à validation humaine
|
||||
- Exécuter seulement après "go" explicite
|
||||
2. **Logger chaque batch** dans `gmail-housekeeping.md` :
|
||||
- Timestamp, règle ID, IDs touchés, action, résultat
|
||||
3. **Respecter `gmail-rules.md`** comme source de vérité unique
|
||||
pour les règles de tri.
|
||||
4. **Vérifier la whitelist au runtime**, pas seulement au design.
|
||||
La whitelist peut évoluer, l'agent doit la relire à chaque vague.
|
||||
5. **En cas de doute** sur un mail (matche partiellement whitelist,
|
||||
pattern ambigu, expéditeur inconnu) → laisser dans inbox + log dans
|
||||
`gmail-doubts.md` pour revue humaine.
|
||||
6. **Pause 5s** entre 2 batchs `gog gmail trash` ou `gog gmail archive`.
|
||||
|
||||
### Format des logs Gmail
|
||||
|
||||
`gmail-housekeeping.md` (append-only) :
|
||||
|
||||
```
|
||||
## 2026-06-XX HH:MM — Vague 1.03 (Quora)
|
||||
- Query: from:quora.com in:inbox older_than:90d
|
||||
- Matched: 487 threads
|
||||
- Sample (10): [id1, id2, ...]
|
||||
- Action: trash
|
||||
- Status: dry-run validated by Thierry at HH:MM
|
||||
- Executed: HH:MM, batch 1/3 (200 OK), batch 2/3 (200 OK), batch 3/3 (87 OK)
|
||||
- Total moved to trash: 487
|
||||
```
|
||||
|
||||
|
||||
## 💓 Heartbeats - Be Proactive!
|
||||
|
||||
When you receive a heartbeat poll (message matches the configured heartbeat prompt), don't just reply `HEARTBEAT_OK` every time. Use heartbeats productively!
|
||||
|
||||
You are free to edit `HEARTBEAT.md` with a short checklist or reminders. Keep it small to limit token burn.
|
||||
|
||||
### Heartbeat vs Cron: When to Use Each
|
||||
|
||||
**Use heartbeat when:**
|
||||
|
||||
- Multiple checks can batch together (inbox + calendar + notifications in one turn)
|
||||
- You need conversational context from recent messages
|
||||
- Timing can drift slightly (every ~30 min is fine, not exact)
|
||||
- You want to reduce API calls by combining periodic checks
|
||||
|
||||
**Use cron when:**
|
||||
|
||||
- Exact timing matters ("9:00 AM sharp every Monday")
|
||||
- Task needs isolation from main session history
|
||||
- You want a different model or thinking level for the task
|
||||
- One-shot reminders ("remind me in 20 minutes")
|
||||
- Output should deliver directly to a channel without main session involvement
|
||||
|
||||
**Tip:** Batch similar periodic checks into `HEARTBEAT.md` instead of creating multiple cron jobs. Use cron for precise schedules and standalone tasks.
|
||||
|
||||
**Things to check (rotate through these, 2-4 times per day):**
|
||||
|
||||
- **Emails** - Any urgent unread messages?
|
||||
- **Calendar** - Upcoming events in next 24-48h?
|
||||
- **Mentions** - Twitter/social notifications?
|
||||
- **Weather** - Relevant if your human might go out?
|
||||
|
||||
**Track your checks** in `memory/heartbeat-state.json`:
|
||||
|
||||
```json
|
||||
{
|
||||
"lastChecks": {
|
||||
"email": 1703275200,
|
||||
"calendar": 1703260800,
|
||||
"weather": null
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
**When to reach out:**
|
||||
|
||||
- Important email arrived
|
||||
- Calendar event coming up (<2h)
|
||||
- Something interesting you found
|
||||
- It's been >8h since you said anything
|
||||
|
||||
**When to stay quiet (HEARTBEAT_OK):**
|
||||
|
||||
- Late night (23:00-08:00) unless urgent
|
||||
- Human is clearly busy
|
||||
- Nothing new since last check
|
||||
- You just checked <30 minutes ago
|
||||
|
||||
**Proactive work you can do without asking:**
|
||||
|
||||
- Read and organize memory files
|
||||
- Check on projects (git status, etc.)
|
||||
- Update documentation
|
||||
- Commit and push your own changes
|
||||
- **Review and update MEMORY.md** (see below)
|
||||
|
||||
### 🔄 Memory Maintenance (During Heartbeats)
|
||||
|
||||
Periodically (every few days), use a heartbeat to:
|
||||
|
||||
1. Read through recent `memory/YYYY-MM-DD.md` files
|
||||
2. Identify significant events, lessons, or insights worth keeping long-term
|
||||
3. Update `MEMORY.md` with distilled learnings
|
||||
4. Remove outdated info from MEMORY.md that's no longer relevant
|
||||
|
||||
Think of it like a human reviewing their journal and updating their mental model. Daily files are raw notes; MEMORY.md is curated wisdom.
|
||||
|
||||
The goal: Be helpful without being annoying. Check in a few times a day, do useful background work, but respect quiet time.
|
||||
|
||||
## Make It Yours
|
||||
|
||||
This is a starting point. Add your own conventions, style, and rules as you figure out what works.
|
||||
|
||||
## Related
|
||||
|
||||
- [Default AGENTS.md](/reference/AGENTS.default)
|
||||
128
workspace/HANDOFF.md
Normal file
128
workspace/HANDOFF.md
Normal file
@@ -0,0 +1,128 @@
|
||||
# HANDOFF — OpenClaw — État global
|
||||
|
||||
**Date :** 2026-06-25
|
||||
**Session :** Passage du HANDOFF bourse-only à un dashboard multi-domaines.
|
||||
**Statut global :** 🟢 opérationnel — Bourse N8N en prod, Gmail actif, WhatsApp appairé.
|
||||
|
||||
---
|
||||
|
||||
## 📋 En-tête / Statut global
|
||||
|
||||
| Item | Valeur |
|
||||
|---|---|
|
||||
| Prochaine priorité | Valider le fix du cron `orange-cloture` (prochain run 26/06 17:40) |
|
||||
| Dernière refonte majeure | Bourse via N8N + passage modèle Thinking (voir handoff dédié) |
|
||||
| Backend LLM | `vllm/qwen3-vl` (Thinking), `maxTokens: 16384`, `contextWindow: 65536` |
|
||||
| WhatsApp | Appairé pour `+33607148216` |
|
||||
| GUI / Reasoning | Défaut conseillé **Medium** ; max tokens GUI à régler manuellement |
|
||||
|
||||
---
|
||||
|
||||
## 📊 Tableau de bord par domaine
|
||||
|
||||
| Domaine | État | Source de vérité | Prochaine action | Dernier événement |
|
||||
|---|---|---|---|---|
|
||||
| **Bourse** | 🟢 Actif | `workspace/bourse-config.json` + workflow N8N `4bluZIeN3TnbzIrv` | Valider fix `orange-cloture` (timeout 600s + prompt simplifié) au prochain run 26/06 17:40 | Refonte N8N 2026-06-24 |
|
||||
| **Gmail** | 🟢 Actif | `workspace/gmail-rules.md` + filtres natifs Phase E | Phase F : archive Philippot + Ulys (restes) ; surveiller filtres Phase E | Filtres Phase E créés 2026-06-25 ✅ |
|
||||
| **WhatsApp** | 🟢 Actif | `openclaw.json` (canal `custom-1`) + `workspace/USER.md` | Maintenir appairage / validation envoi images | Appairage confirmé |
|
||||
| **LLM / Infra** | 🟢 Actif | `openclaw.json` (`vllm/qwen3-vl`, `reasoning: true`) | Surveillance timeouts vs Thinking ; régler max tokens GUI | `maxTokens` porté à 16384 |
|
||||
| **Voice / TTS** | ⚫ Désactivé | `openclaw.json` (skills `sag`, `voice-*`, `openai-whisper` off) | Rien à faire sauf demande explicite | Désactivé |
|
||||
| **Heartbeat** | ⚫ Désactivé | `workspace/HEARTBEAT.md` vide, `agents.defaults.heartbeat.every: "0"` | Rien à faire sauf activation explicite | Désactivé |
|
||||
|
||||
---
|
||||
|
||||
## 📈 Bourse — Résumé opérationnel
|
||||
|
||||
- **Principe** : agent = interlocuteur ; N8N = exécutant. Aucune donnée boursière n'est éditée à la main.
|
||||
- **Workflow N8N** : `Bourse — Graphe multi-tickers (v3)` — ID `4bluZIeN3TnbzIrv`
|
||||
- **Webhook** : `POST https://n8n.airtria.pro/webhook/bourse-graphe`
|
||||
- **Watchlist** : définie dans `workspace/bourse-config.json` (actuellement `ORA.PA`, `TTE.PA`)
|
||||
- **Cron actif** : `orange-cloture` (`40 17 * * 1-5` Europe/Paris) → appelle le webhook et envoie le PNG sur WhatsApp.
|
||||
- **Crons historiques obsolètes** : `orange-ouverture`, `orange-intraday`, `orange-chart-update` — tous **désactivés** dans `state/openclaw.sqlite` (ne pas les réactiver).
|
||||
- **Détail de la refonte** : voir `handoffs/HANDOFF-2026-06-24-BOURSE-N8N.md`
|
||||
|
||||
---
|
||||
|
||||
## 📬 Gmail — Résumé opérationnel
|
||||
|
||||
- **CLI** : `gog` v0.21.0, OAuth persisté.
|
||||
- **Règles** : `workspace/gmail-rules.md`
|
||||
- **Logs d'actions** : `workspace/gmail-housekeeping.md`
|
||||
- **Cron actif** : `daily-email-report` (`30 8 * * *` Europe/Paris) → résumé quotidien sur WhatsApp.
|
||||
- **Filtres Phase E** : 18 filtres natifs créés (2026-06-25) → labels `Promos`, `Dev-Tools`, `Social`, plus `Receipts`/`Newsletters` existants.
|
||||
- **Next steps** : Phase F (restes Philippot/Ulys), surveiller l’efficacité des filtres Phase E.
|
||||
|
||||
---
|
||||
|
||||
## 📱 WhatsApp
|
||||
|
||||
- **Compte** : `custom-1`
|
||||
- **Numéro autorisé** : `+33607148216`
|
||||
- **Capacités confirmées** : texte, image PNG/JPEG, commande `/new`.
|
||||
- **Format bourse** : 3 lignes max + PNG en pièce jointe.
|
||||
|
||||
---
|
||||
|
||||
## ⚠️ Risques & vigilance partagés
|
||||
|
||||
1. **Cron `orange-cloture` en timeout corrigé** : timeout porté de 240 s à 600 s, prompt simplifié, compteurs d'erreur réinitialisés. Prochain run : 26/06 17:40. Le webhook N8N a été testé : ~1,3 s pour obtenir le PNG.
|
||||
2. **MCP N8N** : les outils `update_workflow` / `activate` sont buggés. Préférer l'API REST N8N directe (`PUT /workflows/{id}` puis `POST /workflows/{id}/activate`).
|
||||
3. **Divergence modèles** : `agents/main/agent/models.json` référence encore des modèles Codex/GPT, alors que le runtime utilise `vllm/qwen3-vl`. Risque de confusion GUI.
|
||||
4. **Ownership fichiers** : ✅ résolu le 25/06 — plus de fichiers `root` hors `node_modules` / `.git`.
|
||||
5. **Fichiers obsolètes bourse** : `orange-bourse.md`, `get_quote.py`, `generate_chart.py`, `clean_bourse_md.py` sont archivés dans `workspace/_archive-bourse-20260624/`. **Ne pas les réutiliser.**
|
||||
|
||||
---
|
||||
|
||||
## 📅 Journal d'exécution récent
|
||||
|
||||
| Date (Paris) | Domaine | Événement | Résultat |
|
||||
|---|---|---|---|
|
||||
| 2026-06-25 08:30 | Gmail | `daily-email-report` | ✅ livré WhatsApp |
|
||||
| 2026-06-25 17:40 | Bourse | `orange-cloture` | ⚠️ timeout |
|
||||
| 2026-06-25 ~19:30 | Gmail | Audit Phase E (2000 threads sample) | ✅ rapport dans `workspace/gmail-phase-e-audit-20260625.md` |
|
||||
| 2026-06-25 ~20:00 | Gmail | 18 filtres natifs Phase E + cleanup ~889 messages | ✅ |
|
||||
| 2026-06-25 ~20:15 | Gmail | Phase F — Philippot + Ulys inbox vides | ✅ |
|
||||
| 2026-06-24 | Bourse | Refonte N8N validée | ✅ graphes testés, workflow actif |
|
||||
|
||||
---
|
||||
|
||||
## ✅ TODOs actifs (cross-domaines)
|
||||
|
||||
| # | Action | Domaine | Priorité | Statut |
|
||||
|---|---|---|---|---|
|
||||
| 1 | Valider le cron `orange-cloture` après fix (timeout 600s, prochain run 26/06 17:40) | Bourse | Haut | ⏳ |
|
||||
| 2 | Phase F Gmail : archive Philippot + Ulys (restes non filtrés) | Gmail | Moyen | ✅ |
|
||||
| 3 | Surveiller l’efficacité des filtres Phase E (1–2 semaines) | Gmail | Moyen | ⏳ |
|
||||
| 4 | Régler le max tokens GUI à ~8192 (navigateur) | LLM/GUI | Haut | ⏳ |
|
||||
| 5 | Tester "2 graphes séparés zoomés" | Bourse | Moyen | ⏳ |
|
||||
|
||||
---
|
||||
|
||||
## 📚 Liens rapides (source de vérité)
|
||||
|
||||
| Besoin | Fichier |
|
||||
|---|---|
|
||||
| Comportement + hard constraints | `workspace/AGENTS.md` |
|
||||
| Skills / syntaxe des commandes | `workspace/TOOLS.md` |
|
||||
| Mémoire long terme | `workspace/MEMORY.md` |
|
||||
| État global / transfert | `workspace/HANDOFF.md` (ce fichier) |
|
||||
| Watchlist bourse | `workspace/bourse-config.json` |
|
||||
| Règles Gmail | `workspace/gmail-rules.md` |
|
||||
| Jobs cron | `state/openclaw.sqlite` (table `cron_jobs`) |
|
||||
|
||||
---
|
||||
|
||||
## 🚀 Reprise rapide pour une nouvelle session
|
||||
|
||||
1. Lire `workspace/AGENTS.md` (comportement + red lines).
|
||||
2. Lire `workspace/HANDOFF.md` (état global + TODOs).
|
||||
3. Aller au domaine concerné : `workspace/TOOLS.md` pour la syntaxe, `workspace/bourse-config.json` pour la bourse, `workspace/gmail-rules.md` pour Gmail.
|
||||
4. Vérifier les TODOs non résolus ci-dessus avant de commencer une tâche.
|
||||
|
||||
---
|
||||
|
||||
## 🗂️ Historique des handoffs détaillés
|
||||
|
||||
- `handoffs/HANDOFF-2026-06-09.md` — Session initiale / contexte global
|
||||
- `handoffs/HANDOFF-2026-06-09-GMAIL.md` — Refonte Gmail / GOG
|
||||
- `handoffs/HANDOFF-2026-06-24-BOURSE-N8N.md` — Refonte Bourse N8N + Thinking (détail complet)
|
||||
158
workspace/MEMORY.md
Normal file
158
workspace/MEMORY.md
Normal file
@@ -0,0 +1,158 @@
|
||||
# Mémoire opérationnelle — MEMORY.md
|
||||
|
||||
> Connaissances persistantes pour l'agent. Lu à chaque création de session.
|
||||
|
||||
---
|
||||
|
||||
## Identité du système
|
||||
|
||||
**OpenClaw** : v2026.6.5 (mis à jour le 11/6/2026)
|
||||
**Hébergement** : Synology DS920+ ARCHIVE3 (RAM 20Gi, /volume1/docker/)
|
||||
**LLM backend** : `Qwen/Qwen3-VL-30B-A3B-Thinking-FP8` servi par vLLM sur DGX Spark, `--served-model-name=qwen3-vl`
|
||||
**Utilisateur principal** : Thierry Tallagrand (`+33607148216`)
|
||||
**Vision projet** : système d'orchestration personnelle (bourse via N8N, mail multi-comptes, photos→sheets, WhatsApp/GUI).
|
||||
|
||||
---
|
||||
|
||||
## Capacités opérationnelles
|
||||
|
||||
### Gmail (gog CLI v0.21.0) — ACTIF
|
||||
- ✅ **Envoyer mail** : `gog gmail send --to ... --subject "..." --body "..." --attach <fichier>`
|
||||
- ✅ **Lire/chercher** : `gog gmail search "..." -j --max N`
|
||||
- ✅ **Brouillons** : `gog gmail drafts create/list/send/delete`
|
||||
- ✅ **Trier** : `gog gmail trash/archive` (toujours `--dry-run` d'abord)
|
||||
- ✅ **Labels** : `gog gmail labels list`, `gog gmail messages modify --add-label/--remove-label`
|
||||
|
||||
### WhatsApp — ACTIF
|
||||
- ✅ Envoi messages texte vers l'utilisateur principal
|
||||
- ✅ Envoi images PNG/JPEG — SVG interdits
|
||||
- ✅ Commande `/new` pour nouvelle session DM
|
||||
|
||||
### Bourse — Workflow N8N (refonte 2026-06-24)
|
||||
- ✅ **Graphe** : webhook N8N `POST https://n8n.airtria.pro/webhook/bourse-graphe` (workflow `4bluZIeN3TnbzIrv`)
|
||||
- ✅ **Watchlist** : éditable dans `workspace/bourse-config.json`
|
||||
- ✅ **Prix texte rapide** : `curl -fs "https://query1.finance.yahoo.com/v8/finance/chart/SYMBOLE?interval=1d&range=1d" | jq '.chart.result[0].meta | {price: .regularMarketPrice, prev: .chartPreviousClose, currency}'`
|
||||
- ✅ **Cron** : `orange-cloture` (40 17 * * 1-5) via le workflow N8N
|
||||
- ⚠️ **OBSOLÈTES** (ne plus utiliser) : `orange-bourse.md`, `get_quote.py`, `generate_chart.py`, `clean_bourse_md.py` — archivés dans `workspace/_archive-bourse-20260624/`
|
||||
|
||||
### Filesystem & exec
|
||||
- ✅ Lecture/écriture dans `/home/node/.openclaw/workspace/`
|
||||
- ✅ Exec `python3`, `node`, `curl`, `jq`, `git`
|
||||
- ✅ Aucun `pip install` runtime
|
||||
|
||||
### Web
|
||||
- ✅ `web_fetch` (1500 chars max), `web_search` (10 résultats max)
|
||||
|
||||
---
|
||||
|
||||
## Hard constraint GLOBAL — Anti-amnésie
|
||||
|
||||
**L'agent NE DIT JAMAIS "je ne peux pas faire X" sans vérification.**
|
||||
|
||||
Procédure obligatoire avant tout refus :
|
||||
1. Chercher X dans `TOOLS.md` (sections 1-9)
|
||||
2. Si X est documenté → tenter la commande et rapporter le résultat
|
||||
3. Si erreur → rapporter l'erreur EXACTE, pas l'incapacité
|
||||
4. Si vraiment non documenté → demander précision à l'utilisateur
|
||||
|
||||
**Exemples de refus INTERDITS** :
|
||||
- "Je ne peux pas envoyer un mail" (faux : Gmail send actif)
|
||||
- "Je n'ai pas accès à Gmail" (faux : auth persistée)
|
||||
- "Je suis un assistant sans capacités" (faux : voir `TOOLS.md`)
|
||||
- "Gmail à venir" (faux : opérationnel depuis 9/6/2026)
|
||||
- "Je ne peux pas tracer un graphe boursier" (faux : webhook N8N actif depuis 24/6/2026)
|
||||
|
||||
---
|
||||
|
||||
## Bourse — Architecture N8N (source de vérité actuelle)
|
||||
|
||||
### Principe
|
||||
Agent = interlocuteur. N8N = exécutant. Aucune donnée n'est editée à la main.
|
||||
|
||||
### Source de vérité
|
||||
- Fichier : `workspace/bourse-config.json`
|
||||
- Tickers FR : suffixe `.PA` (ORA.PA, TTE.PA)
|
||||
- Tickers US : sans suffixe (NVDA, AAPL)
|
||||
- Aliases et options par défaut définis dans le JSON
|
||||
|
||||
### Crons actifs
|
||||
- `orange-cloture` (`40 17 * * 1-5` Europe/Paris) : appelle le webhook N8N et envoie le PNG sur WhatsApp.
|
||||
- Actuellement en timeout — voir `workspace/HANDOFF.md` TODOs.
|
||||
|
||||
### Crons bourse obsolètes (désactivés dans SQLite)
|
||||
- `orange-ouverture`
|
||||
- `orange-intraday`
|
||||
- `orange-chart-update`
|
||||
|
||||
### Format réponse standard
|
||||
- Cours simple : `ORA.PA : 17,86€ (+1,16%)`
|
||||
- Indisponible/marché fermé : dire "Aucune donnée", ne pas inventer
|
||||
- Graphe : 3 lignes max + PNG attaché
|
||||
|
||||
---
|
||||
|
||||
## Gmail — Suivi des phases
|
||||
|
||||
### Phase terminées
|
||||
- Re-auth OAuth + GOG_HOME persisté (2026-06-09)
|
||||
- Phase D : 12 401 mails trashés
|
||||
|
||||
### Phases terminées
|
||||
- Phase E : filtres natifs Gmail anti-spam (2026-06-25) — 18 filtres créés, ~889 messages archivés
|
||||
- Phase F : archive Philippot + Ulys (2026-06-25) — inbox vides, futurs messages filtrés
|
||||
|
||||
### Phases en attente
|
||||
- Phase G : longue traîne newsletters
|
||||
|
||||
### Cron actif
|
||||
- `daily-email-report` (`30 8 * * *` Europe/Paris) → résumé quotidien WhatsApp des dernières 24h
|
||||
|
||||
---
|
||||
|
||||
## TODO actuel
|
||||
|
||||
### Haute priorité
|
||||
- Stabiliser le cron `orange-cloture` (timeouts)
|
||||
- Régler le max tokens GUI à ~8192 (navigateur)
|
||||
|
||||
### Moyenne priorité
|
||||
- Tester "2 graphes séparés zoomés" (2× `beginAtZero:false`)
|
||||
- Surveiller l’efficacité des filtres Phase E (1–2 semaines)
|
||||
- Phase G Gmail : longue traîne newsletters
|
||||
|
||||
### Basse priorité
|
||||
- Aligner `agents/main/agent/models.json` avec `vllm/qwen3-vl`
|
||||
- Augmenter `OPENCLAW_CRON_JOB_TIMEOUT_MS` si le Thinking déborde
|
||||
|
||||
---
|
||||
|
||||
## Apprentissages structurants
|
||||
|
||||
### Sessions précédentes
|
||||
- **9/6/2026** : Re-auth OAuth Gmail + GOG_HOME persisté (test compose down/up validé)
|
||||
- **10/6/2026** : Fix cron orange-intraday (prompt "OK" → vrai cours), RAM upgrade 16GB
|
||||
- **10/6/2026** : Découverte SVG incompatible WhatsApp + bug tri chronologique
|
||||
- **23/6/2026** : Migration du cron email horaire (`hourly-email-check`) vers un rapport quotidien (`daily-email-report`) à 8h30 Europe/Paris. Source de vérité : `state/openclaw.sqlite` (pas les JSON obsolètes). Format : résumé court global + détail des messages importants.
|
||||
- **24-25/6/2026** : Refonte bourse via N8N — suppression des scripts Python, du fichier `orange-bourse.md` et des workflows cassés ; passage au modèle Thinking.
|
||||
- **25/6/2026** : Phase E Gmail (filtres natifs) + Phase F (archive Philippot/Ulys) terminées. Audit via SSH sur Synology + `gog` dans container `openclaw-gateway`.
|
||||
|
||||
### Patterns à respecter
|
||||
- Test après chaque modification (checklist comportementale)
|
||||
- Backup AVANT chaque mutation (`.bak-<TS>` avec timestamp)
|
||||
- 3 couches doivent rester alignées : Tools/Skills (`TOOLS.md`) + Knowledge (`MEMORY.md`) + Identity (`SOUL.md` / `IDENTITY.md`)
|
||||
- L'agent ne modifie jamais des fichiers directement quand un outil/service est la source de vérité (cas bourse : `bourse-config.json` OK, mais les prix viennent de Yahoo via N8N)
|
||||
|
||||
---
|
||||
|
||||
## Méta : où trouver quoi
|
||||
|
||||
| Sujet | Fichier de référence |
|
||||
|---|---|
|
||||
| Skills opérationnels (syntaxe gog, webhook, etc.) | `TOOLS.md` |
|
||||
| Comportement, hard constraints | `AGENTS.md` |
|
||||
| Identité, persona | `SOUL.md`, `IDENTITY.md` |
|
||||
| État global / transfert inter-sessions | `HANDOFF.md` |
|
||||
| Mode batch/cron silencieux | `HEARTBEAT.md` |
|
||||
| Règles métier Gmail | `gmail-rules.md` |
|
||||
| Données bourse (watchlist + options) | `bourse-config.json` |
|
||||
| Mémoire évolutive (ce fichier) | `MEMORY.md` |
|
||||
287
workspace/TOOLS.md
Normal file
287
workspace/TOOLS.md
Normal file
@@ -0,0 +1,287 @@
|
||||
# Outils opérationnels (TOOLS.md)
|
||||
|
||||
> **Source de vérité skills.** Ce fichier liste les capacités RÉELLEMENT
|
||||
> disponibles pour l'agent. Si une capacité y figure, l'agent PEUT et DOIT
|
||||
> l'utiliser. Si l'utilisateur demande une action documentée ici, l'agent
|
||||
> NE DOIT PAS répondre "je ne peux pas".
|
||||
|
||||
---
|
||||
### 1.0 IMPORTANT — Comment l'agent invoque les commandes gog
|
||||
|
||||
`gog` n'est PAS un tool natif d'OpenClaw. C'est une commande CLI installée
|
||||
dans le container PATH. L'agent DOIT l'invoquer via le tool natif `exec`
|
||||
(ou son alias `bash`) avec la commande gog complète comme argument.
|
||||
|
||||
INTERDIT (l'agent essaye d'appeler `gog` comme tool → ÉCHEC garanti) :
|
||||
tool: gog
|
||||
args: { "operation": "send", "to": "...", "subject": "..." }
|
||||
|
||||
OBLIGATOIRE (l'agent appelle `exec` avec la commande gog complète) :
|
||||
tool: exec
|
||||
args: { "command": "gog gmail send -a tallagrand.thierry@gmail.com --to ... --subject ... --body ..." }
|
||||
|
||||
Toutes les commandes documentées ci-dessous (sections 1.1 à 1.6) doivent
|
||||
être invoquées via `exec` ou `bash` avec la commande complète comme argument.
|
||||
|
||||
### Pattern général pour TOUTE commande CLI dans ce fichier
|
||||
|
||||
Cette règle s'applique aussi à : `python3`, `curl`, `jq`, `git`, `node`,
|
||||
et tout binaire installé dans le container.
|
||||
|
||||
Bon réflexe :
|
||||
tool: exec, args: { "command": "<binaire> <arguments>" }
|
||||
|
||||
Mauvais réflexe :
|
||||
tool: <binaire>, args: { ... }
|
||||
|
||||
|
||||
## 1. Gmail — gog CLI v0.21.0 (OPÉRATIONNEL)
|
||||
|
||||
**Statut** : ACTIF depuis 9 juin 2026. Auth OAuth Google persistée.
|
||||
**Compte** : tallagrand.thierry@gmail.com
|
||||
**Path keyring** : /home/node/.openclaw/gogcli/data/keyring/
|
||||
**Doc complète** : workspace/gmail-rules.md
|
||||
|
||||
### 1.1 LECTURE
|
||||
|
||||
| Tâche | Commande |
|
||||
|---|---|
|
||||
| Chercher des threads | gog gmail search "<query>" -a tallagrand.thierry@gmail.com -j --max N |
|
||||
| Lister labels | gog gmail labels list -a tallagrand.thierry@gmail.com |
|
||||
| Détail d'un thread | gog gmail thread get <id> -a tallagrand.thierry@gmail.com -j |
|
||||
| Détail d'un message | gog gmail messages get <id> -a tallagrand.thierry@gmail.com -j |
|
||||
|
||||
### 1.2 ENVOI (capacité ACTIVE)
|
||||
|
||||
Syntaxe :
|
||||
|
||||
gog gmail send -a tallagrand.thierry@gmail.com --to <destinataire> --subject "<sujet>" --body "<corps>"
|
||||
|
||||
Flags utiles :
|
||||
- --cc=<email>, --bcc=<email> : copies
|
||||
- --body-html="<html>" : version HTML (alternative à --body)
|
||||
- --attach=<path> : pièce jointe (répétable, ex: graphe PNG)
|
||||
- --reply-to-message-id=<id> : répondre à un mail spécifique
|
||||
- --dry-run : simuler sans envoyer
|
||||
- -j : sortie JSON
|
||||
|
||||
Exemple concret avec attachement :
|
||||
|
||||
gog gmail send -a tallagrand.thierry@gmail.com --to tallagrand.thierry@gmail.com --subject "Cours ORA" --body "ORA.PA : 17,86€ (+1,16%)" --attach /home/node/.openclaw/workspace/charts/ora-2026-06-11-1700.png
|
||||
|
||||
### 1.3 BROUILLONS (alternative prudente)
|
||||
|
||||
| Tâche | Commande |
|
||||
|---|---|
|
||||
| Créer un brouillon | gog gmail drafts create -a <email> --to <dest> --subject "..." --body "..." |
|
||||
| Lister brouillons | gog gmail drafts list -a <email> |
|
||||
| Envoyer un brouillon | gog gmail drafts send <draftId> -a <email> |
|
||||
| Supprimer brouillon | gog gmail drafts delete <draftId> -a <email> |
|
||||
|
||||
### 1.4 MUTATIONS — `--dry-run` OBLIGATOIRE avant mass action
|
||||
|
||||
| Tâche | Commande |
|
||||
|---|---|
|
||||
| Mettre à la corbeille | gog gmail trash "<query>" -a <email> --dry-run puis --force |
|
||||
| Archiver | gog gmail archive "<query>" -a <email> --dry-run puis --force |
|
||||
| Modifier labels | gog gmail messages modify <id> -a <email> --add-label X --remove-label Y |
|
||||
|
||||
### 1.5 Mapping question utilisateur → action
|
||||
|
||||
| Question | Commande à utiliser |
|
||||
|---|---|
|
||||
| "Envoie un mail à X avec sujet Y et corps Z" | gog gmail send --to X --subject "Y" --body "Z" |
|
||||
| "Envoie-moi un mail" | gog gmail send --to tallagrand.thierry@gmail.com ... |
|
||||
| "Combien de mails j'ai aujourd'hui" | gog gmail search "in:inbox newer_than:1d" -j --max 100 |
|
||||
| "Trie mes promos vieilles" | gog gmail trash "category:promotions older_than:30d" --dry-run |
|
||||
| "Liste les mails de X" | gog gmail search "from:X" -j --max N |
|
||||
|
||||
### 1.6 Hard constraints Gmail
|
||||
|
||||
- INTERDIT : "je ne peux pas envoyer un mail" — la capacité EST active
|
||||
- INTERDIT : "Gmail à venir" — c'est OPÉRATIONNEL depuis 9/6/2026
|
||||
- Si une commande échoue, RAPPORTER l'erreur réelle (stderr)
|
||||
- 2 erreurs syntax/auth max → STOP, demander à l'utilisateur
|
||||
- --dry-run avant action en masse (>5 mails)
|
||||
- Container headless : pas de browser disponible
|
||||
|
||||
---
|
||||
|
||||
## 2. WhatsApp — Plugin OpenClaw
|
||||
|
||||
### 2.1 Capacités confirmées
|
||||
- Envoi message texte vers utilisateur (+33607148216)
|
||||
- Envoi image PNG/JPEG (à valider Phase E.5)
|
||||
- Commande slash /new : nouvelle session DM (testée 10/6 OK)
|
||||
|
||||
### 2.2 Format restrictions
|
||||
- AUTORISÉS : PNG, JPEG, WebP, PDF, Office docs, archives
|
||||
- INTERDIT : SVG (rejeté par WhatsApp Cloud API avec OutboundDeliveryError)
|
||||
|
||||
### 2.3 Mapping question → action
|
||||
|
||||
| Question | Action |
|
||||
|---|---|
|
||||
| "Envoie-moi un message WhatsApp" | tool whatsapp send_message |
|
||||
| "Envoie le graphe sur WhatsApp" | tool whatsapp send_message + image PNG attachée |
|
||||
| Cron horaire bourse | delivery.mode=announce → dernière réponse agent envoyée auto |
|
||||
|
||||
### 2.4 Hard constraint
|
||||
- Si erreur "OutboundDeliveryError image/svg+xml" : convertir en PNG
|
||||
- Si l'envoi WhatsApp échoue : rapporter l'erreur exacte, ne pas re-tenter en boucle
|
||||
|
||||
---
|
||||
|
||||
## 3. Bourse — Workflow N8N (REFONTE 2026-06-24)
|
||||
|
||||
> ⚠️ OBSOLÈTES (ne plus utiliser) : `generate_chart.py`, `get_quote.py`,
|
||||
> `clean_bourse_md.py`, `orange-bourse.md`. Toute la bourse passe par N8N.
|
||||
|
||||
### 3.1 Webhook graphe (outil principal)
|
||||
- URL : `https://n8n.airtria.pro/webhook/bourse-graphe` (POST JSON)
|
||||
- Workflow N8N id : `4bluZIeN3TnbzIrv` ("Bourse — Graphe multi-tickers (v3)")
|
||||
- Renvoie : un PNG (image/png) prêt pour WhatsApp
|
||||
- Body JSON (tout optionnel) :
|
||||
- `tickers` : liste de symboles Yahoo, ex ["ORA.PA","TTE.PA","NVDA"]
|
||||
- `range` : 1d|5d|1mo|3mo|6mo|1y (def 5d)
|
||||
- `interval` : 15m|60m|1d (def 60m)
|
||||
- `beginAtZero` : true (axe Y depuis 0) | false (zoom variations)
|
||||
- `title` : titre optionnel
|
||||
- Gestion marché fermé / ticker invalide : renvoie un PNG "Aucune donnée"
|
||||
(jamais d'invention de cours).
|
||||
|
||||
Exemple :
|
||||
```bash
|
||||
curl -s -X POST "https://n8n.airtria.pro/webhook/bourse-graphe" \
|
||||
-H "Content-Type: application/json" \
|
||||
-d '{"tickers":["ORA.PA","TTE.PA"],"beginAtZero":true}' \
|
||||
-o /home/node/.openclaw/workspace/charts/bourse.png
|
||||
```
|
||||
|
||||
### 3.2 Watchlist = bourse-config.json
|
||||
- Path : `/home/node/.openclaw/workspace/bourse-config.json`
|
||||
- Source de vérité des tickers suivis + options par défaut.
|
||||
- L'agent ÉDITE ce fichier pour ajouter/retirer une valeur.
|
||||
|
||||
### 3.3 Prix texte rapide (sans graphe)
|
||||
- `curl -fs "https://query1.finance.yahoo.com/v8/finance/chart/SYMBOLE?interval=1d&range=1d" | jq '.chart.result[0].meta'`
|
||||
|
||||
### 3.4 Modifier le comportement du graphe
|
||||
- Via MCP `n8n-mcp` (update_workflow) ou l'API n8n, workflow id `4bluZIeN3TnbzIrv`.
|
||||
- Node JS "Fetch + Build QuickChart" = logique fetch+rendu. Rendu via QuickChart `version:"4"`.
|
||||
|
||||
---
|
||||
|
||||
## 4. Filesystem workspace
|
||||
|
||||
### 4.1 Path racine
|
||||
/home/node/.openclaw/workspace/
|
||||
|
||||
### 4.2 Capacités
|
||||
- Lecture/écriture de tout fichier dans workspace
|
||||
- Exec scripts python3, bash dans workspace/scripts/
|
||||
- PAS d'install pip durant runtime (figé Dockerfile : yfinance, requests)
|
||||
|
||||
### 4.3 Fichiers structurants
|
||||
| Fichier | Rôle |
|
||||
|---|---|
|
||||
| MEMORY.md | Connaissances persistantes |
|
||||
| AGENTS.md | Comportement, hard constraints |
|
||||
| SOUL.md / IDENTITY.md | Identité, persona |
|
||||
| TOOLS.md (ce fichier) | Skills opérationnel |
|
||||
| HEARTBEAT.md | Mode batch/cron silencieux |
|
||||
| gmail-rules.md | Règles métier Gmail |
|
||||
| HANDOFF.md | État global / transfert inter-sessions |
|
||||
| bourse-config.json | Watchlist + options du graphe bourse (obsolète : orange-bourse.md) |
|
||||
|
||||
---
|
||||
|
||||
## 5. Outils système disponibles
|
||||
|
||||
### 5.1 Dans le container
|
||||
- python3 (3.11), pip3 (figé build-time)
|
||||
- node (Node.js), npm
|
||||
- curl, jq, git, tini
|
||||
- gog (Google APIs CLI v0.21.0)
|
||||
|
||||
### 5.2 Web
|
||||
- web_fetch : ~1500 chars max par fetch
|
||||
- web_search : 10 résultats max
|
||||
- Toutes URLs publiques HTTPS
|
||||
|
||||
---
|
||||
|
||||
## 6. Bourse — Pipeline (refonte N8N 2026-06-24)
|
||||
|
||||
### 6.1 Architecture
|
||||
- L'agent reçoit la demande → POST webhook N8N (section 3.1) → PNG → WhatsApp.
|
||||
- Watchlist dans `bourse-config.json` (section 3.2).
|
||||
- Cron clôture (40 17 * * 1-5, Europe/Paris) : appelle le webhook et envoie le PNG WhatsApp.
|
||||
|
||||
### 6.2 Format réponse standard
|
||||
- Avec graphe : 3 lignes texte + PNG attaché.
|
||||
- Prix simple : `ORA.PA : 16,89€ (-0,68%)`.
|
||||
- Marché fermé/indispo : le PNG "Aucune donnée" + le dire, ne pas inventer.
|
||||
|
||||
---
|
||||
|
||||
## 7. Hard constraint GLOBAL — Anti-amnésie
|
||||
|
||||
L'agent NE DOIT JAMAIS dire "je ne peux pas faire X" sans avoir vérifié
|
||||
dans ce fichier (TOOLS.md) si X est une capacité documentée.
|
||||
|
||||
### Procédure mentale obligatoire avant de refuser :
|
||||
1. Vérifier dans TOOLS.md si X est documenté
|
||||
2. Si oui → tenter la commande, rapporter le résultat (succès ou erreur exacte)
|
||||
3. Si erreur, demander de l'aide à l'utilisateur (pas prétendre l'incapacité)
|
||||
4. Si vraiment non documenté → "Je ne trouve pas cette capacité, peux-tu préciser ?"
|
||||
|
||||
### Exemples de refus INTERDITS
|
||||
- "Je ne peux pas envoyer de mail" (faux : voir section 1.2)
|
||||
- "Je n'ai pas accès à Gmail" (faux : voir section 1)
|
||||
- "Gmail est à venir" (faux : opérationnel depuis 9/6/2026)
|
||||
- "Je suis dans un environnement sécurisé sans capacité" (faux : capacités listées ci-dessus)
|
||||
|
||||
### Nouvelle obligation (11/6/2026 post-test)
|
||||
|
||||
L'agent NE DOIT JAMAIS dire "tool 'gog' isn't available" ou équivalent.
|
||||
`gog` n'est jamais un tool, c'est une commande shell.
|
||||
Si l'agent voit "gog" dans une instruction, il DOIT utiliser `exec` :
|
||||
tool: exec, args: { "command": "gog gmail send ..." }
|
||||
|
||||
Idem pour python3, curl, jq, git, node, et tout binaire CLI :
|
||||
ces commandes passent TOUJOURS par `exec` ou `bash`, jamais comme tool direct.
|
||||
|
||||
---
|
||||
|
||||
## 8. Procédure d'ajout d'outil
|
||||
1. Documenter dans TOOLS.md (ce fichier) avec syntaxe exacte
|
||||
2. Ajouter mapping question→action (section 1.5, 2.3, etc.)
|
||||
3. Ajouter hard constraint si nécessaire
|
||||
4. Tester en dashboard ou WhatsApp /new
|
||||
5. Backup TOOLS.md avant modification (.bak-<TS>)
|
||||
|
||||
---
|
||||
|
||||
## 9. Gmail daily cron
|
||||
|
||||
### 9.1 Job actif
|
||||
|
||||
| Cron | Schedule | Rôle | Canal |
|
||||
|---|---|---|---|
|
||||
| `daily-email-report` | `30 8 * * *` Europe/Paris | Résumé quotidien Gmail des dernières 24h | WhatsApp `announce` vers `+33607148216` |
|
||||
|
||||
### 9.2 Format de réponse attendu
|
||||
|
||||
- Ligne 1 : résumé global court (ex: « Gmail : 3 nouveaux, 1 important »).
|
||||
- Lignes suivantes : détail UNIQUEMENT les messages importants (livraisons, rendez-vous, alertes, factures).
|
||||
- Pour chaque message important : expéditeur, sujet, date/heure d'arrivée.
|
||||
- Maximum 5 messages détaillés.
|
||||
- Réponse en français.
|
||||
- Ignorer les promotions et newsletters dans le détail.
|
||||
|
||||
### 9.3 Source de vérité
|
||||
|
||||
- Le job est défini dans `state/openclaw.sqlite`, table `cron_jobs`.
|
||||
- Les fichiers `cron/jobs.json*` sont des migrations obsolètes d'anciens jobs bourse. Ne PAS les utiliser pour modifier ce cron.
|
||||
|
||||
8
workspace/cron/README.md
Normal file
8
workspace/cron/README.md
Normal file
@@ -0,0 +1,8 @@
|
||||
# Cron legacy directory
|
||||
|
||||
> ⚠️ Les fichiers `jobs.json*` et `orange-monitor-state.json` ont été archivés dans
|
||||
> `workspace/_archive-bourse-20260624/legacy-cron/` car ils constituent des migrations obsolètes.
|
||||
>
|
||||
> **Source de vérité actuelle :** `state/openclaw.sqlite`, table `cron_jobs`.
|
||||
>
|
||||
> Ne pas rééditer les fichiers JSON ici : le runtime lit les jobs depuis SQLite.
|
||||
181
workspace/gmail-housekeeping.md
Normal file
181
workspace/gmail-housekeeping.md
Normal file
@@ -0,0 +1,181 @@
|
||||
|
||||
## 2026-06-05 20:23:00 — Vague 1 batch run
|
||||
|
||||
| Règle | Description | Total trashed | Batchs |
|
||||
|---|---|---:|---:|
|
||||
| V1.01 | Rustica | 0 | 1 |
|
||||
| V1.02 | TAAFT | 240 | 1 |
|
||||
| V1.03 | Quora | 720 | 3 |
|
||||
| V1.04 | Bricomarché | 0 | 1 |
|
||||
| V1.05 | Beehiiv | 1 | 1 |
|
||||
| V1.06 | Carrefour | 218 | 1 |
|
||||
| V1.07 | Cdiscount | 240 | 1 |
|
||||
| V1.08 | Weldom | 275 | 1 |
|
||||
| V1.09 | Suunto | 0 | 1 |
|
||||
| V1.10 | Samsung | 9 | 1 |
|
||||
| V1.11 | Ollama | 0 | 1 |
|
||||
| V1.12 | RedHat | 0 | 1 |
|
||||
| V1.13 | eBay | 136 | 1 |
|
||||
| V1.14 | AliExpress | 384 | 2 |
|
||||
| V1.15 | Avis | 10 | 1 |
|
||||
| V1.16 | LinkedIn updates | 754 | 3 |
|
||||
| V1.17 | LinkedIn notifs | 983 | 4 |
|
||||
| V1.18 | LinkedIn messages | 1365 | 5 |
|
||||
| V1.19 | Facebook | 0 | 1 |
|
||||
|
||||
**Total Vague 1 trashed: 5335 messages**
|
||||
|
||||
## 2026-06-05 21:34:45 — Vague 1bis (tranche 6m→1y)
|
||||
|
||||
| Règle | Description | Total trashed | Batchs |
|
||||
|---|---|---:|---:|
|
||||
| V1.01 | Rustica | 82 | 1 |
|
||||
| V1.02 | TAAFT | 160 | 1 |
|
||||
| V1.03 | Quora | 631 | 3 |
|
||||
| V1.04 | Bricomarché | 55 | 1 |
|
||||
| V1.05 | Beehiiv | 0 | 1 |
|
||||
| V1.06 | Carrefour | 32 | 1 |
|
||||
| V1.07 | Cdiscount | 36 | 1 |
|
||||
| V1.08 | Weldom | 49 | 1 |
|
||||
| V1.09 | Suunto | 12 | 1 |
|
||||
| V1.10 | Samsung | 16 | 1 |
|
||||
| V1.11 | Ollama | 2 | 1 |
|
||||
| V1.12 | RedHat | 15 | 1 |
|
||||
| V1.13 | eBay | 64 | 1 |
|
||||
| V1.14 | AliExpress | 84 | 1 |
|
||||
| V1.15 | Avis | 6 | 1 |
|
||||
| V1.16 | LinkedIn updates | 77 | 1 |
|
||||
| V1.17 | LinkedIn notifs | 90 | 1 |
|
||||
| V1.18 | LinkedIn messages | 133 | 1 |
|
||||
| V1.19 | Facebook | 103 | 1 |
|
||||
|
||||
**Total Vague 1bis (6m→1y) trashed: 1647 messages**
|
||||
|
||||
## 2026-06-06 01:07:10 — Vague 1ter (tranche 30j→6m)
|
||||
|
||||
| Règle | Description | Total trashed | Batchs |
|
||||
|---|---|---:|---:|
|
||||
| V1.01 | Rustica | 232 | 1 |
|
||||
| V1.02 | TAAFT | 155 | 1 |
|
||||
| V1.03 | Quora | 551 | 2 |
|
||||
| V1.04 | Bricomarché | 49 | 1 |
|
||||
| V1.05 | Beehiiv | 64 | 1 |
|
||||
| V1.06 | Carrefour | 29 | 1 |
|
||||
| V1.07 | Cdiscount | 35 | 1 |
|
||||
| V1.08 | Weldom | 36 | 1 |
|
||||
| V1.09 | Suunto | 33 | 1 |
|
||||
| V1.10 | Samsung | 30 | 1 |
|
||||
| V1.11 | Ollama | 23 | 1 |
|
||||
| V1.12 | RedHat | 25 | 1 |
|
||||
| V1.13 | eBay | 16 | 1 |
|
||||
| V1.14 | AliExpress | 65 | 1 |
|
||||
| V1.15 | Avis | 21 | 1 |
|
||||
| V1.16 | LinkedIn updates | 66 | 1 |
|
||||
| V1.17 | LinkedIn notifs | 44 | 1 |
|
||||
| V1.18 | LinkedIn messages | 138 | 1 |
|
||||
| V1.19 | Facebook | 259 | 1 |
|
||||
|
||||
**Total Vague 1ter (30j→6m) trashed: 1871 messages**
|
||||
|
||||
## 2026-06-06 01:27:51 — Vague Synology (notifs www.airtria.net)
|
||||
Query: subject:"[www.airtria.net]" in:inbox
|
||||
|
||||
|
||||
**Total Synology trashed: 1160 messages**
|
||||
|
||||
## 2026-06-06 01:45:19 — Vague Synology ALL variants
|
||||
| SynPRO | 210 trashed |
|
||||
| SynNET | 0 trashed |
|
||||
| SynIP1 | 1889 trashed |
|
||||
|
||||
## 2026-06-06 02:09:21 — Vague 1quinquies (7j→30j) + 4 nouvelles règles
|
||||
|
||||
| Règle | Description | Total trashed | Batchs |
|
||||
|---|---|---:|---:|
|
||||
| V1.01 | Rustica | 37 | 1 |
|
||||
| V1.02 | TAAFT | 23 | 1 |
|
||||
| V1.03 | Quora | 85 | 1 |
|
||||
| V1.04 | Bricomarché | 9 | 1 |
|
||||
| V1.05 | Beehiiv | 11 | 1 |
|
||||
| V1.06 | Carrefour | 7 | 1 |
|
||||
| V1.07 | Cdiscount | 8 | 1 |
|
||||
| V1.08 | Weldom | 5 | 1 |
|
||||
| V1.09 | Suunto | 4 | 1 |
|
||||
| V1.10 | Samsung | 3 | 1 |
|
||||
| V1.11 | Ollama | 2 | 1 |
|
||||
| V1.12 | RedHat | 3 | 1 |
|
||||
| V1.13 | eBay | 5 | 1 |
|
||||
| V1.14 | AliExpress | 21 | 1 |
|
||||
| V1.15 | Avis | 3 | 1 |
|
||||
| V1.16 | LinkedIn updates | 10 | 1 |
|
||||
| V1.17 | LinkedIn notifs | 7 | 1 |
|
||||
| V1.18 | LinkedIn messages | 25 | 1 |
|
||||
| V1.19 | Facebook | 3 | 1 |
|
||||
| V1.20 | VPAuto | 6 | 1 |
|
||||
| V1.21 | Substack airepo | 4 | 1 |
|
||||
| V1.22 | Intermarché | 5 | 1 |
|
||||
| V1.23 | k8slens | 3 | 1 |
|
||||
|
||||
**Total Vague 1quinquies trashed: 289 messages**
|
||||
|
||||
---
|
||||
|
||||
## 2026-06-25 — Phase E : filtres natifs Gmail + cleanup
|
||||
|
||||
### Labels créés
|
||||
- `Promos` (Label_11)
|
||||
- `Dev-Tools` (Label_12)
|
||||
- `Social` (Label_13)
|
||||
|
||||
### Filtres créés : 18
|
||||
|
||||
| ID | Query | Label |
|
||||
|---|---|---|
|
||||
| E01 | `from:linkedin.com OR from:e.linkedin.com` | Social |
|
||||
| E02 | `from:facebookmail.com` | Social |
|
||||
| E03 | `from:clients.ulys.com` | Receipts |
|
||||
| E04 | `from:les-patriotes.fr` | Newsletters |
|
||||
| E05 | `from:rustica-info.fr` | Newsletters |
|
||||
| E06 | `from:mail.theresanaiforthat.com` | Newsletters |
|
||||
| E07 | `from:quora.com` | Newsletters |
|
||||
| E08 | `from:airepo@substack.com` | Newsletters |
|
||||
| E09 | `from:vpauto.fr OR from:mail.vpauto.eu` | Promos |
|
||||
| E10 | `from:communication.andre.fr` | Promos |
|
||||
| E11 | `from:fr-news.adidas.com` | Promos |
|
||||
| E12 | `from:eu1.tocampaigns.com` | Promos |
|
||||
| E13 | `from:mkt.norauto.fr` | Promos |
|
||||
| E14 | `from:news.intermarche.com` | Promos |
|
||||
| E15 | `from:monmagasinvert.fr` | Promos |
|
||||
| E16 | `from:dlink.com` | Promos |
|
||||
| E17 | `from:messages.mongodb.com` | Dev-Tools |
|
||||
| E18 | `from:k8slens.dev` | Dev-Tools |
|
||||
|
||||
### Cleanup rétroactif Phase E (archivés hors inbox)
|
||||
|
||||
| Query | Archivés |
|
||||
|---|---:|
|
||||
| `from:linkedin.com OR from:e.linkedin.com in:inbox` | 200 |
|
||||
| `from:facebookmail.com in:inbox` | 43 |
|
||||
| `from:clients.ulys.com in:inbox` | 87 |
|
||||
| `from:les-patriotes.fr in:inbox` | 252 |
|
||||
| `from:rustica-info.fr in:inbox` | 42 |
|
||||
| `from:mail.theresanaiforthat.com in:inbox` | 26 |
|
||||
| `from:vpauto.fr OR from:mail.vpauto.eu in:inbox` | 50 |
|
||||
| `from:communication.andre.fr in:inbox` | 3 |
|
||||
| `from:fr-news.adidas.com in:inbox` | 50 |
|
||||
| `from:eu1.tocampaigns.com in:inbox` | 38 |
|
||||
| `from:news.intermarche.com in:inbox` | 48 |
|
||||
| `from:dlink.com in:inbox` | 50 |
|
||||
| **Total Phase E archivés** | **~889** |
|
||||
|
||||
### Phase F complément (2026-06-25)
|
||||
|
||||
- `from:clients.ulys.com in:inbox` : 0 restant ✅
|
||||
- `from:les-patriotes.fr in:inbox` : 0 restant ✅
|
||||
- Phase F terminée : Philippot + Ulys complètement sortis de l’inbox et filtrés à l’arrivée.
|
||||
|
||||
### Audit
|
||||
|
||||
- Rapport : `workspace/gmail-phase-e-audit-20260625.md`
|
||||
- Échantillon audité : 2000 threads
|
||||
|
||||
176
workspace/gmail-phase-e-audit-20260625.md
Normal file
176
workspace/gmail-phase-e-audit-20260625.md
Normal file
@@ -0,0 +1,176 @@
|
||||
# Gmail Phase E — Audit expéditeurs résiduels
|
||||
|
||||
Date : 2026-06-25 17h40 UTC
|
||||
|
||||
Échantillon : 2000 threads (500 par catégorie)
|
||||
|
||||
| Catégorie | Threads analysés |
|
||||
|---|---:|
|
||||
| Promotions | 500 |
|
||||
| Social | 500 |
|
||||
| Updates | 500 |
|
||||
| Older than 30d | 500 |
|
||||
|
||||
## Top 25 expéditeurs non-whitelist
|
||||
|
||||
| Rang | Threads | Expéditeur |
|
||||
|---|---|---|
|
||||
| 1 | 109 | LinkedIn <linkedin@e.linkedin.com> |
|
||||
| 2 | 65 | LinkedIn <jobs-listings@linkedin.com> |
|
||||
| 3 | 56 | ULYS <info@clients.ulys.com> |
|
||||
| 4 | 53 | "André" <contact@communication.andre.fr> |
|
||||
| 5 | 45 | adidas <adidas@fr-news.adidas.com> |
|
||||
| 6 | 29 | LinkedIn <messages-noreply@linkedin.com> |
|
||||
| 7 | 29 | Florian Philippot <florian.philippot@les-patriotes.fr> |
|
||||
| 8 | 28 | D-Link <uki-marketing@dlink.com> |
|
||||
| 9 | 28 | VPauto <actu@vpauto.fr> |
|
||||
| 10 | 27 | Rustica - La news du Jour <nepasrepondre@rustica-info.fr> |
|
||||
| 11 | 26 | "TAAFT - There's An AI For That" <hi@mail.theresanaiforthat.com> |
|
||||
| 12 | 25 | Cabesto <cabesto@eu1.tocampaigns.com> |
|
||||
| 13 | 24 | Norauto <norauto.france@mkt.norauto.fr> |
|
||||
| 14 | 22 | "Sélection Quora" <french-quora-digest@quora.com> |
|
||||
| 15 | 22 | Chargemap <hello@chargemap.com> |
|
||||
| 16 | 21 | Google <no-reply@accounts.google.com> |
|
||||
| 17 | 20 | MongoDB <mongodbteam@messages.mongodb.com> |
|
||||
| 18 | 20 | LinkedIn <news-noreply@linkedin.com> |
|
||||
| 19 | 20 | AI Blueprint <airepo@substack.com> |
|
||||
| 20 | 19 | Point Vert - Magasin Vert <noreply.marketing@monmagasinvert.fr> |
|
||||
| 21 | 17 | "Intermarché" <intermarche@news.intermarche.com> |
|
||||
| 22 | 17 | VPauto <vpauto@mail.vpauto.eu> |
|
||||
| 23 | 16 | "Booking.com" <email.campaign@sg.booking.com> |
|
||||
| 24 | 16 | Team Lens <no-reply@k8slens.dev> |
|
||||
| 25 | 16 | LinkedIn <news@linkedin.com> |
|
||||
|
||||
## Top 20 domaines non-whitelist
|
||||
|
||||
| Rang | Threads | Domaine |
|
||||
|---|---|---|
|
||||
| 1 | 348 | linkedin.com |
|
||||
| 2 | 133 | e.linkedin.com |
|
||||
| 3 | 69 | quora.com |
|
||||
| 4 | 67 | clients.ulys.com |
|
||||
| 5 | 53 | communication.andre.fr |
|
||||
| 6 | 45 | fr-news.adidas.com |
|
||||
| 7 | 45 | google.com |
|
||||
| 8 | 42 | rustica-info.fr |
|
||||
| 9 | 39 | facebookmail.com |
|
||||
| 10 | 31 | vpauto.fr |
|
||||
| 11 | 30 | dlink.com |
|
||||
| 12 | 29 | les-patriotes.fr |
|
||||
| 13 | 26 | mail.theresanaiforthat.com |
|
||||
| 14 | 25 | eu1.tocampaigns.com |
|
||||
| 15 | 24 | mkt.norauto.fr |
|
||||
| 16 | 22 | chargemap.com |
|
||||
| 17 | 21 | accounts.google.com |
|
||||
| 18 | 20 | messages.mongodb.com |
|
||||
| 19 | 20 | substack.com |
|
||||
| 20 | 19 | monmagasinvert.fr |
|
||||
|
||||
## Détail top 15 expéditeurs
|
||||
|
||||
### LinkedIn <linkedin@e.linkedin.com> — 109 threads (Social:109)
|
||||
Sujets d'exemple :
|
||||
- `2025-10-09 10:17` Demande d'expertise de LinkedIn
|
||||
- `2025-08-13 22:28` thierry, merci de compter parmi nos membres
|
||||
- `2025-03-12 17:23` thierry, merci de compter parmi nos membres
|
||||
|
||||
### LinkedIn <jobs-listings@linkedin.com> — 65 threads (Social:65)
|
||||
Sujets d'exemple :
|
||||
- `2024-06-20 14:10` Poste de French Freelance Translator Remote chez Top Language Jobsdisponible
|
||||
- `2024-02-15 13:14` Centific recrute : Part-Time Work From Home as Internet Evaluator Anywhere in France: Project Milkyw
|
||||
- `2023-08-31 14:05` Poste de RESPONSABLE R&D IT (F/H) chez Randstad Search : recrute activement
|
||||
|
||||
### ULYS <info@clients.ulys.com> — 56 threads (Promotions:33, Older than 30d:19, Updates:4)
|
||||
Sujets d'exemple :
|
||||
- `2026-06-25 16:59` Coup de chaud sur les prix ⚡
|
||||
- `2026-06-16 18:01` 📩 La Pause Ulys #6 | Nos conseils pour réussir votre été 👀🌞
|
||||
- `2026-05-17 18:02` Faites le plein de RÉCOMPENSES à partager 📢♥️
|
||||
|
||||
### "André" <contact@communication.andre.fr> — 53 threads (Promotions:39, Older than 30d:14)
|
||||
Sujets d'exemple :
|
||||
- `2026-06-25 16:30` Soldes : le savoir-faire italien à −70 %
|
||||
- `2026-06-24 16:31` Top départ pour les Soldes André 🚀
|
||||
- `2026-06-21 08:34` Bonne fête à tous les papas (et -50% pour lui)
|
||||
|
||||
### adidas <adidas@fr-news.adidas.com> — 45 threads (Promotions:28, Older than 30d:17)
|
||||
Sujets d'exemple :
|
||||
- `2026-06-25 09:16` Jusqu'à -30 %, en ligne et en magasin
|
||||
- `2026-06-15 14:12` L'été commence ici
|
||||
- `2026-05-01 12:09` Prêt(e) pour les festivals ?
|
||||
|
||||
### LinkedIn <messages-noreply@linkedin.com> — 29 threads (Social:29)
|
||||
Sujets d'exemple :
|
||||
- `2026-06-25 20:09` thierry, ajoutez Stanislas Zimmermann - Learning & Development Manager
|
||||
- `2026-06-25 16:24` Nouvelle compétence disponible : Résolution de casse-têtes 🧩
|
||||
- `2026-06-25 00:08` 7 personnes ont consulté votre profil
|
||||
|
||||
### Florian Philippot <florian.philippot@les-patriotes.fr> — 29 threads (Updates:17, Older than 30d:12)
|
||||
Sujets d'exemple :
|
||||
- `2026-06-25 11:01` La vérité triomphe !
|
||||
- `2026-06-18 11:00` Une bascule historique !
|
||||
- `2026-06-11 11:00` La révolte populaire !
|
||||
|
||||
### D-Link <uki-marketing@dlink.com> — 28 threads (Promotions:21, Older than 30d:7)
|
||||
Sujets d'exemple :
|
||||
- `2026-06-23 15:44` THIERRY Check out our Prime Day Deals
|
||||
- `2026-06-16 10:46` THIERRY Experience Next-Generation 5G Connectivity with the F530
|
||||
- `2026-06-09 11:38` Webinar - Bring Surveillance Back Into Focus
|
||||
|
||||
### VPauto <actu@vpauto.fr> — 28 threads (Promotions:23, Older than 30d:5)
|
||||
Sujets d'exemple :
|
||||
- `2026-05-09 09:01` +240 véhicules à vendre ce lundi à Lorient ! 📅
|
||||
- `2026-05-05 18:08` 💫 Jeudi : +160 véhicules en vente multi-sites
|
||||
- `2026-05-04 18:31` +800 véhicules à vendre cette semaine chez VPauto 🤯
|
||||
|
||||
### Rustica - La news du Jour <nepasrepondre@rustica-info.fr> — 27 threads (Promotions:19, Updates:8)
|
||||
Sujets d'exemple :
|
||||
- `2026-06-25 11:40` Arrosage tomates : les meilleures techniques pour des fruits juteux
|
||||
- `2026-06-24 13:37` Récolte du potager : faut‑il cueillir le matin ou le soir pour un meilleur goût ?
|
||||
- `2026-06-23 11:41` Taille courge : maîtrisez la croissance pour de beaux légumes !
|
||||
|
||||
### "TAAFT - There's An AI For That" <hi@mail.theresanaiforthat.com> — 26 threads (Updates:25, Promotions:1)
|
||||
Sujets d'exemple :
|
||||
- `2026-06-03 23:55` 🦾 May's Hottest AI Tools
|
||||
- `2026-06-25 00:55` 🦾 OpenAI Cooks Up Jalapeño
|
||||
- `2026-06-24 00:39` 🦾 GPT-5 Cracked a 3-Year Mystery
|
||||
|
||||
### Cabesto <cabesto@eu1.tocampaigns.com> — 25 threads (Promotions:22, Older than 30d:3)
|
||||
Sujets d'exemple :
|
||||
- `2026-03-19 08:50` Thierry, on a sélectionné des promos rien que pour toi !
|
||||
- `2026-03-11 06:48` Découvre nos nouveautés pour toi Thierry 😉
|
||||
- `2026-03-05 11:30` Thierry, on a sélectionné des promos rien que pour toi !
|
||||
|
||||
### Norauto <norauto.france@mkt.norauto.fr> — 24 threads (Promotions:18, Older than 30d:6)
|
||||
Sujets d'exemple :
|
||||
- `2026-06-08 08:13` Reprenez la route au meilleur prix
|
||||
- `2026-04-07 08:27` Facilité, prix et services : plus de raison d’attendre
|
||||
- `2026-04-01 07:00` 10€ de remise sur votre vidange
|
||||
|
||||
### "Sélection Quora" <french-quora-digest@quora.com> — 22 threads (Updates:21, Promotions:1)
|
||||
Sujets d'exemple :
|
||||
- `2026-06-12 20:06` La France blanche et chrétienne n’a jamais existé » : L’extrême droite fantasme une F...
|
||||
- `2026-06-24 22:07` Le Français parle toujours de s'expatrier en Espagne ou au Portugal, pourquoi pas en ...?
|
||||
- `2026-06-23 21:07` Combien de musulmans y a-t-il en France ?
|
||||
|
||||
### Chargemap <hello@chargemap.com> — 22 threads (Promotions:16, Older than 30d:5, Updates:1)
|
||||
Sujets d'exemple :
|
||||
- `2026-05-22 17:02` Long trajet : les 5 réflexes indispensables
|
||||
- `2026-05-17 14:00` -10% chez Atlante ⚡️
|
||||
- `2026-04-27 14:00` -10% chez Plug Inn fast charge ⚡️
|
||||
|
||||
## Recommandations filtres Phase E
|
||||
|
||||
### Filtres à créer (Archive + Label)
|
||||
|
||||
| Expéditeur / Domaine | Action proposée | Note |
|
||||
|---|---|---|
|
||||
| @linkedin.com / @e.linkedin.com | Archive + Label `Social` | Encore très présent malgré Phase D |
|
||||
| @clients.ulys.com | Archive + Label `Receipts` | Prévu Phase F, peut être anticipé |
|
||||
| @les-patriotes.fr | Archive + Label `Newsletters` | V2.01 existante |
|
||||
| @rustica-info.fr, @mail.theresanaiforthat.com, @quora.com, @substack.com | Archive + Label `Newsletters` | Newsletters récurrentes |
|
||||
| @vpauto.fr, @mail.vpauto.eu | Archive + Label `Promos` | Enchères/promos auto |
|
||||
| @communication.andre.fr, @fr-news.adidas.com, @eu1.tocampaigns.com, @mkt.norauto.fr, @monmagasinvert.fr | Archive + Label `Promos` | E-com / promo |
|
||||
| @dlink.com | Archive + Label `Promos` | Marketing D-Link |
|
||||
| @messages.mongodb.com, @k8slens.dev | Archive + Label `Dev-Tools` | Tech tools updates |
|
||||
| @chargemap.com | à vérifier | Lié VE / recharge — peut mériter label `Charge-VE` |
|
||||
| @accounts.google.com | NE PAS FILTRER | Sécurité / alertes Google |
|
||||
199
workspace/gmail-rules.md
Normal file
199
workspace/gmail-rules.md
Normal file
@@ -0,0 +1,199 @@
|
||||
# Gmail Rules — Plan de ménage
|
||||
|
||||
_Généré le 2026-06-05 par Phase C (validation humaine)._
|
||||
_Source : `gmail-audit.md` (sample 3000 threads), validations Thierry._
|
||||
|
||||
## Légende
|
||||
|
||||
- 🟢 **Vague 1 — Trash** : aucune valeur, jamais lu, désabo Gmail natif ensuite
|
||||
- 🟡 **Vague 2 — Archive** : pas de valeur active mais on garde (taggé)
|
||||
- 🔴 **Whitelist absolue** : ne JAMAIS toucher
|
||||
- 🟣 **Spécial** : traitement dédié (digest VE, etc.)
|
||||
|
||||
## 🔴 Whitelist absolue (NE JAMAIS TOUCHER)
|
||||
|
||||
Toute action Gmail (trash, archive, label) est INTERDITE sur ces sources.
|
||||
|
||||
### Banques
|
||||
- `@cic.fr`, `@e-cic.fr`
|
||||
- `@bpgo.fr` (Banque Pop Grand Ouest)
|
||||
- `@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 whitelist
|
||||
- `@vwfs.com`, `@volkswagen.fr`
|
||||
- `@jeep.com` (cf. règle 🟣 V01 ci-dessous)
|
||||
- `@ze-watt.fr`, `@ze-watt.com`
|
||||
- `@zeromotorcycles.com`
|
||||
|
||||
### Club plongée
|
||||
- `@gissacg.fr`, `@lists.gissacg.fr`
|
||||
- `president@gissacg.fr`
|
||||
|
||||
### Sociétés AIRTRIA
|
||||
- `@airtria.net`, `@airtria.fr`
|
||||
|
||||
### Solaire pro
|
||||
- `@laboutique-solaire-pro.com`
|
||||
|
||||
### Identités personnelles
|
||||
- `tallagrand.thierry@gmail.com` (mes propres SENT)
|
||||
- `thierry.tallagrand@me.com` (mon adresse iCloud)
|
||||
|
||||
### Labels système protégés
|
||||
- `IMPORTANT`, `STARRED`, `SENT`, `DRAFT`
|
||||
- `Personal`, `Travail`, `Achats`, `Receipts`, `Notes`
|
||||
|
||||
---
|
||||
|
||||
## 🟢 Vague 1 — Trash en masse
|
||||
|
||||
**Stratégie** : `gog gmail trash` par batch de 200, pause 5s entre batchs.
|
||||
**Critère commun** : `older_than:90d` pour ne pas trasher les arrivées récentes au cas où.
|
||||
**Réversibilité** : Trash Gmail garde 30 jours.
|
||||
|
||||
### Règles V1
|
||||
|
||||
| ID | Query Gmail | Sample | Estimation totale |
|
||||
|---|---|---:|---:|
|
||||
| **V1.01** | `from:nepasrepondre@rustica-info.fr in:inbox older_than:90d` | 196 | ~400 |
|
||||
| **V1.02** | `from:hi@mail.theresanaiforthat.com in:inbox older_than:90d` | 123 | ~200 |
|
||||
| **V1.03** | `from:quora.com in:inbox older_than:90d` | 240 | ~600 |
|
||||
| **V1.04** | `from:no-reply@info.bricomarche.com in:inbox older_than:90d` | 44 | ~100 |
|
||||
| **V1.05** | `from:beehiiv.com in:inbox older_than:90d` (FutureBlueprint+ai-signal) | 56 | ~150 |
|
||||
| **V1.06** | `from:carrefour@email.carrefour.fr in:inbox older_than:90d` | 37 | ~100 |
|
||||
| **V1.07** | `from:cds.newsletter-cdiscount.com in:inbox older_than:90d` | 32 | ~80 |
|
||||
| **V1.08** | `from:n.weldom.fr in:inbox older_than:90d` | 30 | ~80 |
|
||||
| **V1.09** | `from:news.suunto.com in:inbox older_than:90d` | 26 | ~60 |
|
||||
| **V1.10** | `from:crm.samsung.fr in:inbox older_than:90d` | 26 | ~60 |
|
||||
| **V1.11** | `from:ollama.com in:inbox older_than:90d` | 25 | ~60 |
|
||||
| **V1.12** | `from:go.explore.redhat.com in:inbox older_than:90d` | 24 | ~60 |
|
||||
| **V1.13** | `from:reply.ebay.fr in:inbox older_than:90d` | 23 | ~60 |
|
||||
| **V1.14** | `from:aliexpress.com in:inbox older_than:90d` (selections+deals) | 53 | ~150 |
|
||||
| **V1.15** | `from:news_frfr@avis-comms.international in:inbox older_than:90d` | 21 | ~50 |
|
||||
| **V1.16** | `from:updates-noreply@linkedin.com in:inbox older_than:90d` | 53 | ~120 |
|
||||
| **V1.17** | `from:notifications-noreply@linkedin.com in:inbox older_than:90d` | 25 | ~60 |
|
||||
| **V1.18** | `from:messages-noreply@linkedin.com in:inbox older_than:90d` | 117 | ~250 |
|
||||
| **V1.19** | `from:facebookmail.com in:inbox older_than:90d` | 145 | ~350 |
|
||||
|
||||
**Estimation totale Vague 1 : ~3000 threads à trasher** (sur ta boîte de 12 703).
|
||||
|
||||
---
|
||||
|
||||
## 🟡 Vague 2 — Archive avec label
|
||||
|
||||
**Stratégie** : `gog gmail archive` (retire INBOX) + apply label.
|
||||
**Réversibilité** : zéro destruction, juste sortie de l'inbox.
|
||||
|
||||
### Règles V2
|
||||
|
||||
| ID | Query Gmail | Action | Sample | Note |
|
||||
|---|---|---|---:|---|
|
||||
| **V2.01** | `from:florian.philippot@les-patriotes.fr in:inbox` | Archive + label `Newsletters` | 18 | Politique perso |
|
||||
| **V2.02** | `from:info@clients.ulys.com in:inbox older_than:30d` | Archive + label `Receipts` | 23 | Télépéage VINCI |
|
||||
|
||||
**Estimation totale Vague 2 : ~50 threads à archiver.**
|
||||
|
||||
Note : la 2ème passe Q8 enrichira cette liste avec la longue traîne newsletters tech.
|
||||
|
||||
---
|
||||
|
||||
## 🟣 Spécial — Catégorie 2 (digest VE)
|
||||
|
||||
### Règle V01
|
||||
|
||||
`from:uconnectservices@jeep.com` (172 sample / ~400 boîte totale) :
|
||||
- **Phase D (immédiat)** : aucune action, on les laisse dans inbox.
|
||||
- **Phase F+ (digest VE)** : agent quotidien parse les mails Jeep, génère
|
||||
`charge-vehicule.md` + notif WhatsApp synthèse, puis archive automatiquement
|
||||
les mails parsés avec label `Charge-VE`.
|
||||
|
||||
**Pas d'action Phase D**.
|
||||
|
||||
---
|
||||
|
||||
## Phase E — Filtres natifs Gmail (2026-06-25)
|
||||
|
||||
Objectif : empêcher les newsletters / promos récurrentes d’atterrir dans l’inbox.
|
||||
Méthode : filtres natifs Gmail (`Settings > Filters and Blocked Addresses`) créés via `gog gmail filters create`.
|
||||
Action par défaut : **archiver** (`removeLabelIds: [INBOX, UNREAD]`) + **appliquer un label**.
|
||||
|
||||
### Labels créés
|
||||
- `Promos` (id Label_11)
|
||||
- `Dev-Tools` (id Label_12)
|
||||
- `Social` (id Label_13)
|
||||
|
||||
### Filtres actifs
|
||||
|
||||
| # | Query | Label | Type |
|
||||
|---|---|---|---|
|
||||
| E01 | `from:linkedin.com OR from:e.linkedin.com` | `Social` | Social |
|
||||
| E02 | `from:facebookmail.com` | `Social` | Social |
|
||||
| E03 | `from:clients.ulys.com` | `Receipts` | Télépéage |
|
||||
| E04 | `from:les-patriotes.fr` | `Newsletters` | Politique |
|
||||
| E05 | `from:rustica-info.fr` | `Newsletters` | Jardinage |
|
||||
| E06 | `from:mail.theresanaiforthat.com` | `Newsletters` | Tech/IA |
|
||||
| E07 | `from:quora.com` | `Newsletters` | Tech/QA |
|
||||
| E08 | `from:airepo@substack.com` | `Newsletters` | Tech/IA |
|
||||
| E09 | `from:vpauto.fr OR from:mail.vpauto.eu` | `Promos` | Auto |
|
||||
| E10 | `from:communication.andre.fr` | `Promos` | E-com |
|
||||
| E11 | `from:fr-news.adidas.com` | `Promos` | E-com |
|
||||
| E12 | `from:eu1.tocampaigns.com` | `Promos` | E-com (Cabesto) |
|
||||
| E13 | `from:mkt.norauto.fr` | `Promos` | Auto |
|
||||
| E14 | `from:news.intermarche.com` | `Promos` | E-com |
|
||||
| E15 | `from:monmagasinvert.fr` | `Promos` | E-com |
|
||||
| E16 | `from:dlink.com` | `Promos` | Tech |
|
||||
| E17 | `from:messages.mongodb.com` | `Dev-Tools` | Dev |
|
||||
| E18 | `from:k8slens.dev` | `Dev-Tools` | Dev |
|
||||
|
||||
### Cleanup rétroactif (2026-06-25)
|
||||
- ~687 messages archivés manuellement depuis l’inbox (batchs limités à 200 max, pause 6 s).
|
||||
- Voir `gmail-housekeeping.md` pour le détail.
|
||||
|
||||
---
|
||||
|
||||
## 📋 2ème passe (Q8) — Longue traîne
|
||||
|
||||
À lancer après Vague 1 + Vague 2 stabilisées.
|
||||
|
||||
```bash
|
||||
# Script proposé : gmail_audit.py --query "category:promotions OR category:updates older_than:6m" --sample 5000
|
||||
|
||||
|
||||
---
|
||||
|
||||
## Mises à jour 6 juin 2026 (Phase D execution)
|
||||
|
||||
### Whitelist enrichie (à ajouter à la whitelist principale)
|
||||
|
||||
#### Synology infrastructure
|
||||
- `from:sns@synologynotification.com` (Active Insight - alertes critiques disque/storage)
|
||||
- `from:noreply@c2.synology.com` (C2 backup subscription)
|
||||
|
||||
#### Finance
|
||||
- `from:noreply@amundi-esr.com` (épargne salariale PEE/PERCO - transactionnel)
|
||||
- `from:r.clientele@vwfs.com` (VW Financial Services)
|
||||
|
||||
#### Famille & cercle proche
|
||||
- `frederic.tallagrand@*` (famille)
|
||||
- `@arimair.fr` (plongée copain)
|
||||
|
||||
### 4 nouvelles règles Vague 1 (ajoutées en cours d'exécution)
|
||||
- V1.20 : `from:vpauto@mail.vpauto.eu` (enchères auto)
|
||||
- V1.21 : `from:airepo@substack.com` (newsletter IA Substack)
|
||||
- V1.22 : `from:intermarche@news.intermarche.com` (promo)
|
||||
- V1.23 : `from:no-reply@k8slens.dev` (newsletter Lens K8s)
|
||||
|
||||
### Synology trash variants (3 patterns)
|
||||
- `subject:"[www.airtria.net]"` (ARCHIVE2 → 1 160 mails)
|
||||
- `subject:"[www.airtria.pro]"` (ARCHIVE3 → 210 mails)
|
||||
- `subject:"[10.10.10.50]"` (ARCHIVE originel → 1 889 mails)
|
||||
|
||||
Reference in New Issue
Block a user