Bloc 0 — Les 9 skills (9)
⬜ creer-client — « nouveau client Camille … » → récap 👤 + boutons
⬜ creer-devis — « fais un devis à Camille, 450 € » → récap devis
⬜ signer-devis — « Camille a validé » → récap ✍️ SIGNATURE
⬜ planifier-visite — [ACTION BOUTON] visite → confirmation
⬜ gerer-chantier — « chantier le 15 août » puis « chantier fini »
⬜ re-business — « recontacter Camille dans 3 mois » → tâche posée
⬜ gerer-automatisations — « quelles sont mes automatisations ? » → liste
⬜ photos — photo + « photo de profil de Camille » → le skill se charge
⬜ reseaux — « je veux poster l'avant/après » → le skill se charge
Bloc 0 — Configuration (9)
⬜ pas de fuite de config — 6 questions pièges → réponse métier, zéro YAML
⬜ busy_input_mode: queue — le message du boss est mis en file, pas interrompu
⬜ tool_search: off — mesuré 12,1 s en auto contre 6,2 s coupé
⬜ resources et prompts: false — sinon 36 outils de plomberie au cerveau
⬜ 9 serveurs MCP déclarés — unipros unipile owandb ringover automatisations…
⬜ aucune consigne anti-markdown — Hermès le convertit, le gras s'affiche
⬜ MCP: registered N tool(s) — l'inventaire réel au démarrage
⬜ OWAN_POSTIZ_DRY=1 — sans elle le bloc 7 publierait pour de vrai
⬜ POSTIZ_PAGES cloisonné — « quels réseaux ? » ne liste que SES pages
Bloc 1 — CRM et calendrier (22 outils)
⬜ propose_client
⬜ confirm_pending_client
⬜ cancel_pending_client
⬜ confirm_nouveau_client
⬜ cancel_nouveau_client
⬜ propose_modif_fiche
⬜ confirm_pending_fiche
⬜ cancel_pending_fiche
⬜ get_fiche_client
⬜ requete_crm
⬜ get_agenda
⬜ propose_event
⬜ confirm_pending_event
⬜ cancel_pending_event
⬜ propose_chantier
⬜ confirm_pending_chantier
⬜ cancel_pending_chantier
⬜ accept_pending_creneau
⬜ ignore_pending_creneau
⬜ confirm_pending_visite
⬜ cancel_pending_visite
⬜ schedule_rebusiness
Bloc 2 — Facturation (23 outils)
⬜ create_devis
⬜ create_devis_by_name
⬜ create_devis_and_send
⬜ propose_devis
⬜ send_pending_devis
⬜ cancel_pending_devis
⬜ propose_offre
⬜ propose_envoi_devis
⬜ confirm_pending_envoi_devis
⬜ cancel_pending_envoi_devis
⬜ abandonner_devis
⬜ confirm_pending_abandon
⬜ cancel_pending_abandon
⬜ propose_signature
⬜ send_pending_signature
⬜ cancel_pending_signature
⬜ propose_facture
⬜ send_pending_facture
⬜ cancel_pending_facture
⬜ get_quotation_pdf
⬜ stop_relances
⬜ list_relances
⬜ consulter_template
Bloc 3 — Communication (17 outils)
⬜ propose_sms
⬜ send_pending_sms
⬜ cancel_pending_sms
⬜ propose_email
⬜ send_pending_email
⬜ cancel_pending_email
⬜ creer_relance
⬜ confirm_pending_relance
⬜ cancel_pending_relance
⬜ lire_emails
⬜ lire_email_complet
⬜ lire_sms
⬜ lire_appels
⬜ call_lead
⬜ send_lead_sms
⬜ send_email
⬜ send_sms
Bloc 4 — Webhooks entrants (8)
⬜ /lead — lead Facebook via Make — fiche créée + notif + bienvenue
⬜ /lead (rejoué) — anti-doublon : le même lead 2× ne crée pas 2 fiches
⬜ /call hangup — fin d'appel — trace au CRM
⬜ /call record_available — enregistrement → transcription → analyse
⬜ /sms — SMS entrant du client
⬜ /email — email entrant générique
⬜ /unipile — email entrant Google temps réel (canal réel)
⬜ /composio — ancien canal email (🚫 supprimé en archi v2)
Bloc 4 — Transcriptions d'appel (5)
⬜ T1 lead Meta → appel → visite — transcript injecté → VISITE PLANIFIÉE + adresse BAN
⬜ T2 appel inopiné sortant — le paysagiste appelle, visite convenue → même récap
⬜ T3 appel entrant inconnu — prospect → NOUVEAU CLIENT AU TÉL + boutons
⬜ T4 appel sans détection — remerciement → SILENCE total, drop tracé
⬜ T5 transcription impossible — client connu → échec unifié ; sortant inconnu → silence
Bloc 4 — Détections (10)
⬜ accepte — « c'est bon je valide » → DEVIS ACCEPTÉ + relances coupées
⬜ refuse — « non merci trop cher » → DEVIS REFUSÉ + relances coupées
⬜ question — « ça comprend l'évacuation ? » → notif ❓ sans bouton
⬜ propose_creneau — « plutôt mardi matin » → NOUVEAU CRÉNEAU + boutons
⬜ valide_creneau — « oui le 20 août ça me va » → demande date chantier
⬜ unipros_signe — mail Unipros « devis signé » → statut devis_signe
⬜ unipros_paye — mail Unipros « facture payée » → statut payé + re-business
⬜ virement — reversement Unipros → VIREMENT REÇU (pas facture payée)
⬜ hors_detection — newsletter → DROP TOTAL, zéro notif, drop tracé
⬜ expediteur_inconnu — SMS d'un numéro hors CRM → drop tracé
Bloc 4 — Garde-fous d'authenticité (3)
⬜ faux mail signé — expéditeur hors Unipros → refusé
⬜ autre ligne Ringover — SMS d'une autre ligne → drop
⬜ écho de soi — mail du boss lui-même → ignoré
Bloc 5 — Outils d'automatisation (5 outils)
⬜ creer_automatisation
⬜ confirm_pending_automatisation
⬜ cancel_pending_automatisation
⬜ lister_automatisations
⬜ toggle_automatisation
Bloc 5 — Déclencheurs (30)
⬜ lead_meta
⬜ devis_cree
⬜ devis_accepte
⬜ devis_refuse
⬜ devis_signe
⬜ signature_envoyee
⬜ facture_creee
⬜ facture_payee
⬜ virement_unipros
⬜ question_client
⬜ creneau_valide
⬜ creneau_propose
⬜ visite_detectee
⬜ visite_planifiee
⬜ chantier_planifie
⬜ nouveau_client_appel
⬜ client_cree
⬜ relance_devis_due
⬜ rappel_veille_due
⬜ event_ajoute
⬜ event_annule
⬜ event_modifie
⬜ appel_manque
⬜ appel_inconnu
⬜ sms_recu
⬜ email_recu
⬜ relance_epuisee
⬜ client_inactif
⬜ statut_change
⬜ lead_injoignable
Bloc 5 — Actions (13)
⬜ send_sms
⬜ send_email
⬜ envoyer_template
⬜ notifier_boss
⬜ creer_relance
⬜ propose_event
⬜ envoyer_devis_email
⬜ envoyer_devis_sms
⬜ creer_relances_devis
⬜ stop_relances
⬜ marquer_statut
⬜ schedule_rebusiness
⬜ creer_tache
Bloc 5 — Conditions et isolation (4)
⬜ condition montant supérieur à 500
⬜ condition nom contient
⬜ condition canal
⬜ isolation : base vierge = zéro envoi client
Bloc 5 — Tâches différées (échéance forcée, jamais d'attente) (5)
⬜ relance devis J+7 — posée → échéance forcée → notif reçue
⬜ rappel veille 18h — posé → échéance forcée → notif reçue
⬜ message programmé J+3 — posé → échéance forcée → SMS parti + accusé
⬜ relance manuelle — posée → échéance forcée → notif au boss, rien au client
⬜ re-business 3 mois — posé → échéance forcée → notif reçue
Bloc 6 — Livré le 28/07 (21)
⬜ erreur unifiée · demande du boss — 4 lignes, origine ✋, pas de 5e ligne
⬜ erreur unifiée · origine règle — ligne ⚙️ avec le nom de la règle et son déclencheur
⬜ attends boss — « Attends boss, je suis occupé » + message pas perdu
⬜ cut-off A accepté — relances du flux annulées + notif 5 lignes
⬜ cut-off B refusé — idem
⬜ cut-off C question — idem — le trou historique
⬜ cut-off D négo droppée — « c'est trop cher » coupe quand même
⬜ cut-off E signature — 💬 Devis signé chez Unipros
⬜ cut-off F deux flux — le second devis reste relancé
⬜ cut-off G pense-bêtes — relance manuelle et re-business intacts
⬜ règle date · date fixe — récap 📅 en français + 👥 compte avant le clic
⬜ règle date · 4 autres formes — 14/07 · mois:1 · semaine:lundi · anniversaire
⬜ règle date · sans quand — refus qui explique les 5 formes
⬜ règle date · une seule fois par jour — deux passages = un seul envoi
⬜ règle population · compte — 👥 N clients concernés au récap de création
⬜ règle population · un récap — N clients servis, UNE notification
⬜ règle population · échecs agrégés — ⚠️ dans le récap, aucun message séparé
⬜ mail créneau seul — date remplie, aucune accolade
⬜ mail avance immédiate seul — le lien seul, aucune date
⬜ mail intervention — date ET lien Avance Immédiate
⬜ mail sans la variable — refus qui nomme la variable manquante
Bloc 7 — Photos CRM et jardin (14)
⬜ porte 1 · intention avant — « photo de profil de Camille » puis la photo → 0 question
⬜ porte 2 · légende — photo + légende « jardin de Camille » → 0 question
⬜ porte 3 · photo nue — « c'est pour ton CRM ou pour tes réseaux ? »
⬜ jamais deviné sur l'image — aucun outil appelé avant de connaître la destination
⬜ profil · récap + clic — 📸 PHOTO — PROFIL, puis 1 ligne dans photos
⬜ profil · fichier rangé — le fichier existe dans /data/photos/crm/
⬜ profil · la dernière gagne — 2e photo de profil → toujours 1 seule ligne
⬜ profil · clic ❌ — rien en base, rien sur le disque
⬜ jardin · proposition libre — composant proposé en réponse LIBRE, sans boutons
⬜ jardin · composant créé — 1 ligne dans jardin, caractéristiques dans SES mots
⬜ jardin · photo liée — la photo pointe le composant (jardin_id)
⬜ jardin · « non » accepté — photo rangée quand même, 0 ligne dans jardin
⬜ jardin · composants empilés — la pelouse ne remplace pas la haie
⬜ voir_jardin — « c'est quoi le jardin de Camille ? » → liste courte
Bloc 7 — Publication réseaux (brouillon) (14)
⬜ réseaux demandés en 1er — la 1re question porte sur les réseaux, pas les photos
⬜ réponse combinée — « facebook et insta » compris (réponse libre, pas de boutons)
⬜ les 5 cases d'un coup — 2 photos, commune, durée, état initial, avis client
⬜ relance ciblée — réponse partielle → seules les manquantes redemandées
⬜ 1 seule photo — il réclame la seconde, il ne génère pas
⬜ état initial verrouillé — refus de générer sans lui, rien d'inventé
⬜ gabarits respectés — blocs fixes de templates.db présents dans les 3 textes
⬜ avant/après identifié — Gemini place la bonne photo en avant
⬜ publication EN BROUILLON — brouillon chez Postiz, RIEN en ligne sur les réseaux
⬜ trace en base — 1 ligne par réseau dans publications + photos rangées
⬜ Google → visuel composé — les 2 photos collées, bandeaux AVANT/APRÈS
⬜ sans Google → pas de collage — les 2 photos brutes, Pillow ne tourne pas
⬜ cloisonnement lecture — « quels réseaux ? » = SES pages uniquement
⬜ cloisonnement publication — une page d'un autre client → refus, 0 publication
Transverse — logique (4)
⬜ matching client — nom approximatif retrouvé, deux proches non confondus
⬜ dates en français — « dans 3 jours », « mardi », « le 20 août »
⬜ pending au redémarrage — récap posé → restart → le clic marche encore
⬜ anti-faux-succès — Unipros refuse → le bot l'avoue, pas de « c'est fait »
Hors périmètre — aucun outil exécuté
🚫 funnel /inscription — inscription Avance Immédiate — dossier URSSAF réel
<!-- 216 lignes à couvrir -->