46%gross-paysage
111 sur 241 · 5 bloquants · mise à jour 04:49

Bloc 0 — Les 9 skills (9)

✅ creer-client — récap 👤 conforme, fiche Unipros 573286 + carte CRM créées
✅ creer-devis — « fais un devis à Camille, 450 € » → récap devis → récap conforme, devis créé chez Unipros
✅ signer-devis — « Camille a validé » → récap ✍️ SIGNATURE → pack signature parti, mail Unipros confirmé
⬜ planifier-visite — [ACTION BOUTON] visite → confirmation
✅ gerer-chantier — « chantier le 15 août » puis « chantier fini » → événement Google Calendar créé, statut intervention_planifiee
✅ re-business — « recontacter Camille dans 3 mois » → tâche posée → tâche posée au 27/10/2026
✅ gerer-automatisations — « quelles sont mes automatisations ? » → liste → liste 🟢/🔴 + déclencheur en français
⬜ 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 → shell coupé (terminal/file/cronjob), réponse métier sans jargon
⬜ 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 → récap AVANT/APRÈS + écriture Unipros et CRM
✅ confirm_pending_fiche → récap AVANT/APRÈS + écriture Unipros et CRM
⬜ cancel_pending_fiche
✅ get_fiche_client → 3 lectures dans le même tour, outils corrects
✅ requete_crm → 3 lectures dans le même tour, outils corrects
✅ get_agenda → 3 lectures dans le même tour, outils corrects
✅ propose_event → événement Google Calendar créé
✅ confirm_pending_event → événement Google Calendar créé
⬜ cancel_pending_event
✅ propose_chantier → événement Google Calendar créé, statut intervention_planifiee
✅ confirm_pending_chantier → événement Google Calendar créé, statut intervention_planifiee
⬜ cancel_pending_chantier
⬜ accept_pending_creneau
⬜ ignore_pending_creneau
⬜ confirm_pending_visite
⬜ cancel_pending_visite
✅ schedule_rebusiness → tâche rebusiness en base

Bloc 2 — Facturation (23 outils)

✅ create_devis → 3 devis créés chez Unipros et en base, total 1000 €
⬜ create_devis_by_name
⬜ create_devis_and_send
✅ propose_devis → récap 450 € + boutons
✅ send_pending_devis → clic ✅ → devis Unipros créé
⬜ cancel_pending_devis
✅ propose_offre → 3 devis créés chez Unipros et en base, total 1000 €
✅ propose_envoi_devis → récap ✉️ + boutons
✅ confirm_pending_envoi_devis → mail avec PDF parti
⬜ cancel_pending_envoi_devis
✅ abandonner_devis → devis abandonné chez Unipros (le bouton mort du 26/07 est réparé)
✅ confirm_pending_abandon → devis abandonné chez Unipros (le bouton mort du 26/07 est réparé)
⬜ cancel_pending_abandon
✅ propose_signature → pack signature parti, mail Unipros confirmé
✅ send_pending_signature → pack signature parti, mail Unipros confirmé
⬜ cancel_pending_signature
⛔ propose_facture → EN ATTENTE DE SAMY — Unipros refuse de facturer un devis non signé pour de vrai
⛔ send_pending_facture → EN ATTENTE DE SAMY — Unipros refuse de facturer un devis non signé pour de vrai
⬜ cancel_pending_facture
⬜ get_quotation_pdf
✅ stop_relances → 🔕 RELANCES COUPÉES au format validé, 2 relances annulées
✅ list_relances → relances listées avec dates et devis
✅ consulter_template → modèle affiché

Bloc 3 — Communication (17 outils)

✅ propose_sms → SMS réellement parti sur le 0695885671
✅ send_pending_sms → SMS réellement parti sur le 0695885671
✅ cancel_pending_sms → clic ❌ → rien n'est parti
⬜ propose_email
⬜ send_pending_email
⬜ cancel_pending_email
✅ creer_relance → tâche relance_manuelle posée au 04/08 9h
✅ confirm_pending_relance → tâche relance_manuelle posée au 04/08 9h
⬜ cancel_pending_relance
✅ lire_emails → Ringover interrogé directement, pas la table messages
⬜ lire_email_complet
✅ lire_sms → Ringover interrogé directement, pas la table messages
✅ lire_appels → lire_appels appelé (Ringover), pas le CRM
⬜ 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 Meta → fiche créée avec prénom et nom découpés
✅ /lead (rejoué) — anti-doublon : le même lead 2× ne crée pas 2 fiches → lead déjà connu → rattaché, pas de 2e bienvenue
✅ /call hangup — fin d'appel — trace au CRM → appel tracé, écoute sélective : aucune notif sans détection
⬜ /call record_available — enregistrement → transcription → analyse
✅ /sms — SMS entrant du client → détection accepte → DEVIS ACCEPTÉ + invite date d'intervention
✅ /email — email entrant générique → mail système détecté → statut devis_signe + règle déclenchée
⬜ /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é → appel tracé, écoute sélective : aucune notif sans détection
⬜ 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 → détection accepte → DEVIS ACCEPTÉ + invite date d'intervention
✅ refuse — « non merci trop cher » → DEVIS REFUSÉ + relances coupées → 🔕 RELANCES COUPÉES au format validé, 2 relances annulées
✅ question — « ça comprend l'évacuation ? » → notif ❓ sans bouton → ❓ QUESTION par SMS, 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 → mail système détecté → statut devis_signe + règle déclenchée
⛔ unipros_paye — mail Unipros « facture payée » → statut payé + re-business → EN ATTENTE DE SAMY — Unipros refuse de facturer un devis non signé pour de vrai
⬜ virement — reversement Unipros → VIREMENT REÇU (pas facture payée)
✅ hors_detection — newsletter → DROP TOTAL, zéro notif, drop tracé → newsletter → drop total, raison hors_detection tracée dans execution
✅ expediteur_inconnu — SMS d'un numéro hors CRM → drop tracé → détection accepte → DEVIS ACCEPTÉ + invite date d'intervention

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 → 📅 date en français + 👥 146 clients annoncés AVANT le clic
✅ confirm_pending_automatisation → 📅 date en français + 👥 146 clients annoncés AVANT le clic
⬜ cancel_pending_automatisation
✅ lister_automatisations → 6 règles listées
✅ toggle_automatisation → règle coupée à la voix

Bloc 5 — Déclencheurs (30)

✅ lead_meta → lead Meta → fiche créée avec prénom et nom découpés
⬜ devis_cree
⬜ devis_accepte
⬜ devis_refuse
⬜ devis_signe
⬜ signature_envoyee
⛔ facture_creee → EN ATTENTE DE SAMY — Unipros refuse de facturer un devis non signé pour de vrai
⬜ 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 → détection accepte → DEVIS ACCEPTÉ + invite date d'intervention
⬜ email_recu
⬜ relance_epuisee
⬜ client_inactif
⬜ statut_change
⬜ lead_injoignable

Bloc 5 — Actions (13)

⬜ send_sms
⬜ send_email
⬜ envoyer_template
✅ notifier_boss → règle créée à la voix, active en base
⬜ 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 → tâche relance_manuelle posée au 04/08 9h
⬜ 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 → ⚠️ ENVOI DU SMS — ÉCHEC / 👤 / ✋ Origine / 💬 cause — format validé
⬜ 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 → 🔕 RELANCES COUPÉES au format validé, 2 relances annulées
⬜ cut-off C question — idem — le trou historique
✅ cut-off D négo droppée — « c'est trop cher » coupe quand même → 🔕 RELANCES COUPÉES au format validé, 2 relances annulées
⬜ 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 → échéance forcée → notif reçue sur Telegram, rien au client
✅ règle date · date fixe — récap 📅 en français + 👥 compte avant le clic → 📅 date en français + 👥 146 clients annoncés AVANT le clic
✅ règle date · 4 autres formes — 14/07 · mois:1 · semaine:lundi · anniversaire → anniversaire reconnu, population annoncée honnêtement (0 fiche)
⬜ 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 → 📅 date en français + 👥 146 clients annoncés AVANT le clic
⬜ 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 → légende lue, zéro question sur la destination
✅ porte 3 · photo nue — « c'est pour ton CRM ou pour tes réseaux ? » → « 📸 Photo bien reçue — 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 → photo rangée dans /data/photos/crm/, ligne en base
✅ profil · fichier rangé — le fichier existe dans /data/photos/crm/ → photo rangée dans /data/photos/crm/, ligne en base
⬜ 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 → proposition en réponse LIBRE, aucun bouton
✅ jardin · composant créé — 1 ligne dans jardin, caractéristiques dans SES mots → Haies + caractéristiques dans les mots du boss, photo liée (jardin_id=1)
✅ jardin · photo liée — la photo pointe le composant (jardin_id) → Haies + caractéristiques dans les mots du boss, photo liée (jardin_id=1)
⬜ 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 → Haies + caractéristiques dans les mots du boss, photo liée (jardin_id=1)

Bloc 7 — Publication réseaux (brouillon) (14)

✅ réseaux demandés en 1er — la 1re question porte sur les réseaux, pas les photos → « Tu postes sur quels réseaux ? » avant toute autre question
✅ réponse combinée — « facebook et insta » compris (réponse libre, pas de boutons) → « facebook et insta » compris, réponse libre
✅ les 5 cases d'un coup — 2 photos, commune, durée, état initial, avis client → les 5 demandées en une seule question
✅ relance ciblée — réponse partielle → seules les manquantes redemandées → seules les cases manquantes redemandées, rien de reposé
✅ 1 seule photo — il réclame la seconde, il ne génère pas → il réclame la 2e, il ne génère pas
✅ état initial verrouillé — refus de générer sans lui, rien d'inventé → refuse de générer sans lui, ne l'invente pas
✅ gabarits respectés — blocs fixes de templates.db présents dans les 3 textes → blocs fixes présents, département 76 déduit de Rouen
⬜ avant/après identifié — Gemini place la bonne photo en avant
✅ publication EN BROUILLON — brouillon chez Postiz, RIEN en ligne sur les réseaux → brouillon confirmé chez Postiz, 3 pages de Julien seulement
⬜ 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 → brouillon confirmé chez Postiz, 3 pages de Julien seulement
✅ cloisonnement lecture — « quels réseaux ? » = SES pages uniquement → brouillon confirmé chez Postiz, 3 pages de Julien seulement
✅ cloisonnement publication — une page d'un autre client → refus, 0 publication → page d'un autre client → refus, 0 publication

Bloc 8 — execution.db : tout remonte (23)

✅ le tuyau est branché — OWAN_JOURNAL_DSN et OWAN_CLIENT_SLUG dans le conteneur → vérifié en SQL sur execution
✅ owan-execution healthy — le conteneur PostgreSQL répond → vérifié en SQL sur execution
✅ aucun fichier de secours — /data/journal-secours.jsonl absent en fin de run → absent — la base n'est jamais tombée
✅ runs.jsonl n'a pas grossi — il est coupé quand execution est configuré → figé à 02:49, avant le branchement d'execution
✅ famille entrée servie — webhooks et messages du boss remontés → mail système détecté → statut devis_signe + règle déclenchée
✅ famille cerveau servie — tours du modèle recopiés de state.db → vérifié en SQL sur execution
✅ famille outil servie — les appels d'outils remontés → lire_appels appelé (Ringover), pas le CRM
✅ famille sortie servie — SMS, emails, devis, notifications → SMS réellement parti sur le 0695885671
✅ famille décision servie — détections, drops, déclencheurs, cut-off → 🔕 RELANCES COUPÉES au format validé, 2 relances annulées
✅ famille temps servie — les durées d'étape (paires in/out) → vérifié en SQL sur execution
✅ famille panne servie — les échecs provoqués au bloc 6 → ⚠️ ENVOI DU SMS — ÉCHEC / 👤 / ✋ Origine / 💬 cause — format validé
✅ famille attente servie — récaps posés ET récaps morts → vérifié en SQL sur execution
✅ fil causal · SMS entrant — SMS → détection → notif → cut-off sur le même fil → mail système détecté → statut devis_signe + règle déclenchée
⬜ fil causal · devis au chat — fil boss- du récap jusqu'à l'écriture Unipros
⬜ aucun fil NULL — 0 événement orphelin sur entrée/décision/sortie
✅ miroir : llm_turn cohérent — au moins un tour par message envoyé au bot → vérifié en SQL sur execution
✅ miroir : coût présent — cout_llm avec modèle, tokens et coût → vérifié en SQL sur execution
✅ miroir : curseur qui avance — .miroir_hermes.json suit state.db → dernier_id 1619, il suit state.db
✅ texte SMS mot pour mot — le message parti au client est dans donnees → SMS réellement parti sur le 0695885671
✅ texte échec mot pour mot — le message d'échec unifié est dans donnees → ⚠️ ENVOI DU SMS — ÉCHEC / 👤 / ✋ Origine / 💬 cause — format validé
✅ drop avec sa raison — un drop d'écoute sélective porte son motif → newsletter → drop total, raison hors_detection tracée dans execution
⬜ publication tracée — le post en brouillon a laissé son événement
✅ cloisonnement clients — aucune ligne écrite au nom d'un autre client → 3 pages de Julien seulement — les 7 autres invisibles

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 » → ⚠️ ENVOI DU SMS — ÉCHEC / 👤 / ✋ Origine / 💬 cause — format validé

Hors périmètre — aucun outil exécuté

🚫 funnel /inscription — inscription Avance Immédiate — dossier URSSAF réel
<!-- 239 lignes à couvrir -->