From obs
Sorts, summarizes, merges, and files emails exported as Markdown in C:/Users/fxgui/Public/Notes/Thunderbird/. Scans a scope (all of Thunderbird/ or a sub-branch), applies the rules in mail-config.yaml, proposes validatable action batches, then executes classify / delete / merge / summarize / flag-phishing. Detects duplicates, applies prune rules, identifies phishing, and logs each session. Use when the user invokes /obs:mail. Do NOT use for project management — use obs:project instead.
How this skill is triggered — by the user, by Claude, or both
Slash command
/obs:mailsonnetThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Processes emails exported as Markdown in `C:/Users/fxgui/Public/Notes/Thunderbird/`.
Processes emails exported as Markdown in C:/Users/fxgui/Public/Notes/Thunderbird/.
Scans the scope, analyzes each file, proposes validatable action batches
batch by batch, executes them, and produces a final report.
| # | Action | Role | Input |
|---|---|---|---|
| 01 | scan | List all .md files in the scope and load mail-config.yaml | scope (optional) |
| 02 | analyze | Classify each email according to the two decision passes | file list + config |
| 03 | propose | Group decisions into batches and wait for validation | list of decisions |
| 04 | execute | Apply a validated batch (classify/delete/merge/summarize/intact/flag-phishing) | validated batch |
| 05 | report | Produce the final processing report | accumulated results |
Internal pipeline — the user never picks an action directly. The flow is always:
01-scan → 02-analyze → 03-propose → [04-execute → 03-propose]* → 05-report
The invocation /obs:mail [branche] always triggers the full pipeline.
C:/Users/fxgui/Public/Notes/Thunderbird/<root>/mail-config.yaml<root>/.archive/YYYY-MM-DD/<root>/mail-sessions.log.mdMandatory YAML frontmatter:
from: "[email protected]"
to: "destinataire"
date: 2026-04-09T15:53:35+00:00
subject: Sujet du mail
subject_hash: a00eae
tags: [INBOX]
attachments: []
Body in Markdown (HTML artifacts possible).
Naming: email_YYYY-MM-DD_<exp>_<sujet>_to_<dest>[_N].md
Apply both passes independently for each file.
Files with processed: true in their frontmatter are excluded from the scan (except with the --reprocess flag).
Pass A — content decision (decreasing priority):
suppress match (sender or branch) → action = deletesubject_hash + same from + same date as another file → action = delete (keep the oldest; on a date tie → first alphabetically)prune match AND date < (today - days) → action = delete; days: 0 = always deletepreserve match (sender or branch) AND no contrary exception → action = intactfrom+to+subject, not preserve) → action = mergesummarizePass B — placement decision (independent of A):
ATrier/) → add classify toward the proposed branchA file can have a content action (A) and a placement action (B).
Example: a preserve email at root → intact + classify.
Same from + same to + same normalized subject (without Re:, Fwd:, RE:, FW:, case ignored) → same thread.
If merge_by_domain: true in mail-config.yaml: normalize from to the root domain before comparison.
Rule: extract the last two segments of the domain (e.g. mail.mondialrelay.com → mondialrelay.com).
Country TLDs are kept as-is (mondialrelay.fr ≠ mondialrelay.com).
---
from: [email protected]
to: destinataire
date_start: YYYY-MM-DD
date_end: YYYY-MM-DD
subject: Sujet normalisé
thread_count: N
---
- YYYY-MM-DD — Titre ou sujet du message — https://lien-si-présent
- YYYY-MM-DD — Titre ou sujet du message — (pas de lien)
summarize| Type | Detection criteria | Data to keep |
|---|---|---|
| Transactionnel | livraison, commande, facture, paiement, ticket | montant · référence · date · statut |
| Newsletter/update | Kickstarter, Patreon, blog, newsletter | date · titre · liens d'update |
| Notification/alerte | login, sécurité, espace disque, alerte | service · date · action requise si présente |
| Promotionnel | offre, promo, réduction (hors suppress) | offre · date d'expiration si présente |
Keep the full frontmatter (from/to/date/subject) in all cases. Replace the body with the key data according to the type, in Markdown list format.
If the display name in from (e.g. "Google" <[email protected]>) contains a known brand name but the address domain does not match → action = flag-phishing.
Default brand list: google, paypal, amazon, apple, microsoft, netflix, impots, ameli, caf, pole-emploi.
Extensible via mail-config.yaml (key phishing_brands).
processed tagAfter any action except intact (classify, delete, merge, summarize, flag-phishing), add processed: true in the frontmatter of the resulting file.
intact files are not marked — they remain in the scope of subsequent sessions.
Files with processed: true are excluded from the scan by default. Included with the --reprocess flag.
05-report prepends an entry at the top of mail-sessions.log.md for each session:
## Session YYYY-MM-DD HH:MM — <périmètre>
- Classify : N · Delete : N · Merge : N · Summarize : N · Intact : N · Phishing : N
- Doublons supprimés : N
- Fichiers epoch signalés : N
- Branches créées : <liste ou "aucune">
Generate this template if mail-config.yaml is absent:
# Emails et branches à conserver intacts (ne pas résumer, ne pas fusionner)
preserve:
senders: [] # ex: - domain: gmail.com
branches: [] # ex: - Banque/
# Emails et branches à supprimer (spam, notifications sans valeur)
suppress:
senders: [] # ex: - domain: klaviyo.com
branches: [] # ex: - Publicités/Spam/
# Exceptions aux règles preserve/suppress
exceptions: [] # ex: - address: [email protected]\n action: preserve
# Suppression automatique par âge (days: 0 = toujours supprimer)
prune: []
# ex:
# - branch: Publicités/Spam/
# days: 0
# - sender:
# domain: jeveuxtravailler.com
# days: 7
# Fusionner les threads par domaine racine plutôt que par adresse exacte
merge_by_domain: false
# Marques à surveiller pour la détection phishing (complète la liste par défaut)
phishing_brands: []
# ex: - bnp
# - credit-agricole
The scan and analyze actions delegate via Agent().
Email content never appears in the main chat.
Only file names and proposed decisions bubble up.
.archive/YYYY-MM-DD/.classify execution, never before.npx claudepluginhub rebellioussmile/my-claude-marketplace --plugin obsSearches MemPalace before answering questions about past work, people, projects, or prior decisions. Returns verbatim stored content instead of guessing from model memory.
Guides Payload CMS config (payload.config.ts), collections, fields, hooks, access control, APIs. Debugs validation errors, security, relationships, queries, transactions, hook behavior.
Implements vector databases with Pinecone, Weaviate, Qdrant, Milvus, pgvector for semantic search, RAG, recommendations, and similarity systems. Optimizes embeddings, indexing, and hybrid search.