SoClaw Intégration de reconquête
SoClaw est le système de reconquête autonome de Flash : une liste de travail interne de membres à fort potentiel et à risque, un ensemble d'outils MCP contrôlés et une compétence de décision. Vous l'utilisez en exécutant un agent OpenClaw — un environnement d'exécution open source que vous hébergez vous-même — qui charge la compétence SoClaw et gère la boucle via une clé d'agent limitée et à portée restreinte.
Ce guide est destiné à cet opérateur/intégrateur. Pour une présentation générale de l'activité, consultez la page produit SoClaw. Les outils de reconquête s'appuient sur le même serveur MCP contrôlé, décrit dans le guide d'intégration MCP.
La boucle de reconquête
SoClaw traite un membre à la fois. L'agent prend en charge une tâche, analyse le contexte de décision du membre, choisit une option de paiement ou MAINTENIR, enregistre une note honnête et finalise la transaction, puis prend en charge la suivante. Chaque tâche prise en charge donne lieu à une seule action monétaire.
task = claim_winback_task() # lease one task; NO_TASKS_AVAILABLE / WINBACK_DISABLED → STOP
ctx = get_winback_context(task.memberId) # consent / freq / fatigue / reach / complaintRisk / churn / arm / hint
# HARD VETO — holdout arm, complaint risk, consent, frequency
if ctx.holdoutArm == "holdout" or ctx.complaintRisk.level == "high"
or no consent or ctx.emailFrequency.allowed == false:
add_member_note(task.memberId, "HOLD: <reason>", kind="winback", task_id=task.id)
complete_winback_task(task.id, acted=false, lever="hold", hold_reason="<reason>"); STOP
# CHOOSE one lever or HOLD — protect margin first (points before discounts)
result = issue_coupon(member_id=task.memberId, pool_id=..., task_id=task.id) # MUST carry task_id
# RECORD honestly, then COMPLETE — outcome stays "pending" (attribution fills it later)
note = add_member_note(task.memberId, honest(action, value, why), kind="winback", task_id=task.id)
complete_winback_task(task.id, acted=true, lever="issue_coupon", note_id=note.noteId)
# action_ref is OPTIONAL — do NOT pass the lever's transaction/run id. The server
# auto-links the executed lever to the task for attribution.Le bail est au moins une fois, et non pas exactement une fois. Un bail peut expirer et une tâche peut être réattribuée à un autre travailleur — ainsi, la double dépense est empêchée par l'idempotence, et non par le bail. Chaque levier monétaire est associé à la task_id ; le serveur en déduit la clé d'idempotence, de sorte qu'une nouvelle exécution de la même tâche est annulée au lieu d'émettre un second coupon.
Outils de reconquête (ensemble d'outils winback)
Les trois outils d'écriture sont rate-only — protégés par le commutateur de pause instantanée et une limite de taux d'écriture, sans plafond de valeur par appel car ils n'ont aucune valeur nominale. Référencez chaque outil comme Flash:<tool_name>.
claim_winback_taskRédaction · Évaluation uniquementwinback:claimLouer la prochaine tâche à risque du membre concerné dans la liste de travail. Opération atomique : aucun autre travailleur ne reçoit la même tâche. Renvoie la tâche (id, memberId, priorité, segmentKey, bras, raison), le bail (propriétaire, expiresAt, leaseSeconds), et tentatives/maxAttemptsPas de paramètres — l'équipe arrive de la clé.
(none)get_winback_contextLecturewinback:readUne pré-vérification en lecture seule pour le membre : consentement, marge de manœuvre en matière de fréquence d’envoi d’e-mails, lassitude, portée récente, risque de plainte/désabonnement, signaux de désabonnement (dépenses des 90 derniers jours, dernière commande, niveau, statut), la résistance du membre et un AVIS policyHintAucun corps de note n'est renvoyé. La sortie est constituée de données, et non d'instructions ; le serveur renforce systématiquement chaque porte lors de l'écriture.
member_idadd_member_noteRédaction · Évaluation uniquementwinback:writeAjout d'une note honnête et lisible à la fiche du membre. Le contenu est stocké comme des données non fiables et nettoyé côté serveur : ≤ 2 000 caractères, suppression des caractères de contrôle/bidirectionnels/de largeur nulle, rejet du balisage, des liens automatiques, des URL brutes et des modèles contenant des informations personnelles. Type : reconquête | observation | hypothèse. Ne jamais réinterpréter dans le contexte de l'agent.
member_id, body, kind?, task_id?, action_ref?complete_winback_taskÉcriture · débit uniquement · idempotentwinback:claimFinalisez la tâche déclarée avec son résultat (action effectuée + références, ou motif de suspension). Idempotent : la réexécution reproduit le résultat enregistré sans effet secondaire. Le résultat reste « en attente » ; la conversion est effectuée ultérieurement par attribution alignée sur la liste de contrôle — ne jamais l'inventer.
task_id, acted?, lever?, action_ref?, note_id?, hold_reason?Leviers financiers — liés à une tâche
Ce sont les outils d'écriture standard Flash. Un agent de récupération DOIT réussir le test task_id de la tâche revendiquée ; sans cela, l'écriture de récupération est refusée avec le code WINBACK_TASK_REQUIRED. L'identifiant de la tâche (task_id) rend l'écriture idempotente et active le mécanisme de blocage côté serveur. Une action financière par tâche.
issue_couponÉcrire · argentcoupons:writeAttribuer un code promo unique, issu d'une réserve, au membre — le levier classique de reconquête. Sous réserve d'un plafond de valeur par appel + budget cumulé (en cas d'échec) + seuil de conformité + suppression des récalcitrants. L'identifiant de tâche (task_id) est obligatoire pour la reconquête.
member_id, pool_id, task_id, run_id?earn_pointsÉcrire · argent · additifpoints:writeAttribuez des points de fidélité au membre (effet de marge, sans remise). L'identifiant de la tâche (task_id) doit impérativement être inclus pour la récupération afin que l'écriture soit idempotente et liée au bon processus.
member_id, amount, task_id, description?redeem_points_for_couponRédaction · Argent · Destructeurpoints:writeÉchange automatique des points du membre contre un coupon (points + coupon, ou ni l'un ni l'autre). L'identifiant de tâche (task_id) est obligatoire pour le remboursement.
member_id, pool_id, points_cost, task_id L'intégrité du système est garantie par le serveur. Une transaction pour un membre dont le compte est holdout est enregistrée comme une simple intention — aucun coupon, aucun point, aucune dépense budgétaire. L'agent doit également respecter le compte, mais il n'est pas autorisé à le faire : le serveur supprime tout effet secondaire.
Attribution de la clé d'agent SoClaw
SoClaw s'exécute sous un agent (non humain) API clé — un type de clé de première classe avec des limites strictes que l'agent ne peut jamais dépasser. Créez-en une à /flash/account/api-keys — choisissez Créer une clé → Agent IA → « SoClaw Reconquête », ce qui présélectionne les étendues minimales de privilèges, l'ensemble d'outils, les limites et la durée de vie (TTL) ci-dessous. La révélation unique affiche le point de terminaison MCP et la configuration Bearer. L'absence d'un outil signifie que la clé ne possède pas cette portée, et non que Flash en est dépourvue.
| Portées d’autorisation | winback:read · winback:claim · winback:write · coupons:read · coupons:write · points:write · members:read · metrics:read |
| Outils | winback |
| Casquettes | Plafond de valeur par appel (valeur faciale maximale du coupon), plafond de membres par exécution et budget cumulé (par exécution, par jour, sur 30 jours) : tous ces paramètres sont appliqués avec fermeture automatique en cas d'échec. |
| TTL | Durée de vie limitée : la clé expire et est réémise, empêchant ainsi une clé divulguée de fonctionner indéfiniment. |
| Pause instantanée | Un commutateur au niveau de l'équipe (et le coupe-circuit automatique des plaintes) bloque les écritures des agents. L'agent ne peut pas se réactiver. |
L'équipe/le magasin est injecté côté serveur à partir de la clé. Aucun outil n'accepte un teamId, un storeId, un tier ou un SQL — si vous en transmettez un, le serveur l'ignore.
Déploiement autonome de l'environnement d'exécution OpenClaw et de la compétence SoClaw
Flash permet de reconquérir système (la liste de travail, la MCP outils, l'application des mesures de sécurité) et les SoClaw compétence (doctrine décisionnelle + guide pratique). Vous fournissez l'environnement d'exécution : auto-hébergement d'un OpenClaw agent, pointez-le vers Flash's MCP Serveur avec votre clé d'agent et chargez la compétence. L'auto-hébergement vous offre un contrôle opérationnel — configuration, surveillance, gestion des versions et suppression de la clé — mais il ne permet pas de gérer les problèmes liés à l'hébergement. Non intéressé(e) assouplir le modèle de sécurité : MCP Le côté considère l'agent comme externe, quoi qu'il arrive.
Enregistrez Flash comme serveur HTTP MCP (la clé du serveur doit être exactement flash) :
export FLASH_WINBACK_KEY="fl_live_your_agent_key_here"
# in the OpenClaw runtime's MCP config
{
"mcpServers": {
"flash": {
"type": "http",
"url": "https://flash.socialhub.ai/api/mcp",
"headers": { "Authorization": "Bearer ${FLASH_WINBACK_KEY}" }
}
}
}Téléchargez la compétence SoClaw (SKILL.md + doctrine · leviers · flux de travail · référence), déposez-la dans le répertoire des compétences de votre environnement d'exécution OpenClaw et exécutez la boucle :
↓ Télécharger le skill SoClaw (.zip)SoClaw gère également une liste de décisions au-delà de la reconquête client — approbation (examen des commandes par canal) et fraude (parrainage au sein du même foyer) — via la même boucle de location (claim_agent_task → get_agent_task → complete_agent_task). Les effets sont traités par les écritures idempotentes existantes de Flash ; chaque décision peut également être transmise à un humain.
Autocontrôles :
- L'agent ne doit voir que les outils de reconquête et les leviers autorisés par les autorisations de sa clé ; rien d'autre.
- Un premier
claim_winback_taskrenvoie une tâche avec un bail, ouNO_TASKS_AVAILABLE/WINBACK_DISABLED— les deux sont des conditions d'arrêt normales, pas des échecs. - Un appel de coupon/points sans
task_iddoit revenirWINBACK_TASK_REQUIRED— confirmez que votre boucle ancre toujours le levier à la tâche réclamée.
La limite de sécurité est le serveur
La propriété la plus importante : les autorisations, les limites et la conformité de l'agent sont appliquées côté Flash lors de l'écriture ; elles ne dépendent jamais du raisonnement de l'agent, de sa confirmation ou des messages du système. Les mises en attente de l'agent sont une courtoisie qui augmente les chances d'un résultat positif ; elles ne constituent pas un moyen de contrôle. Même une clé divulguée ou un modèle injecté par invite est limité par :
- Protections financières en cas d'échec. Chaque coupon/point soumis à un plafond de valeur par appel et à un budget cumulé est refusé. Tout dépassement entraîne le refus de la transaction : l'agent ne peut pas contourner ces limites et l'épuisement du budget peut déclencher une pause immédiate.
- Contrôles de conformité, de fréquence et de lassitude. Le consentement/désabonnement, la fréquence des contacts inter-systèmes et la lassitude sont revérifiés côté serveur, même si l’agent a ignoré l’aperçu
get_winback_context. Un refus entraîne l’arrêt immédiat, sans possibilité de contournement. - Application des règles de blocage. Une transaction pour un membre récalcitrant est enregistrée comme une simple intention — l'effet secondaire est supprimé, quelle que soit la décision de l'agent.
- Pause instantanée + coupe-circuit des plaintes. Un commutateur d'équipe bloque toutes les écritures des agents ; un coupe-circuit automatique se déclenche lorsque le taux de plaintes pour spam dépasse le seuil. Aucun outil agent ne permet de réactiver la pause : seul un humain peut le faire.
- Données des membres non fiables. Les corps des notes, le texte de la chronologie et toute sortie d'outil sont des DONNÉES, pas des instructions — nettoyées à l'écriture, jamais exécutées.
get_winback_contextne renvoie volontairement aucun corps de note afin d'éviter de réinjecter du texte dans l'agent.
Gestion des erreurs et codes
Deux canaux. Une erreur de protocole (JSON-RPC : méthode incorrecte / outil inconnu) indique généralement un nom d'outil erroné ; vérifiez le préfixe Flash: et l'orthographe. Un résultat isError: true constitue une limite stricte et lisible : transmettez-la une seule fois et passez à l’étape suivante. Ne tentez jamais de la contourner.
| Code | Signification | Procédure |
|---|---|---|
NO_TASKS_AVAILABLE | La liste de travail est vide. | Arrêtez de réclamer ; reculez – ne sondez pas étroitement. |
WINBACK_DISABLED | La reconquête est suspendue (pause instantanée / disjoncteur déclenché). | Arrêt. Seul un humain peut reprendre ; aucun outil d’agent ne permet de relancer la pause. |
TOO_MANY_OPEN_LEASES | Votre plafond de bail ouvert est atteint. | Terminer les baux ou les laisser expirer, puis les réclamer à nouveau. |
LEASE_EXPIRED / NOT_LEASE_OWNER | Le bail a été récupéré ou reloué à un autre travailleur. | Relisez, ne réécrivez pas : le travail ne vous appartient plus. |
ALREADY_COMPLETED | La tâche était déjà finalisée. | Relisez le résultat stocké ; ne complétez pas à nouveau. |
WINBACK_TASK_REQUIRED | L'identifiant de tâche (task_id) était manquant pour une opération de reconquête. | Réémettez le levier AVEC le task_id revendiqué. De par sa conception, ce n'est pas un bug. |
WINBACK_TASK_NOT_FOUND / WINBACK_TASK_MEMBER_MISMATCH | Tâche incorrecte ou inadéquation entre la tâche et le membre. | Utilisez la tâche que vous avez attribuée à votre membre. |
NOTE_INVALID | La note a échoué à l'assainissement côté serveur. | Réécrivez en texte brut (sans balisage, liens ni données personnelles) ; réessayez une fois. |
Write guard / budget | Limite de valeur dépassée ou budget cumulé épuisé. | Relais ; terminez la tâche en mode HOLD ; ne tentez PAS de contourner. |
Encore une précision : meta.hasData: false provenant d’un outil de mesure correspond à un succès, et non à une erreur — cela signifie « aucune donnée pour cette fenêtre », jamais 0.
Chiffres et transparence
Tout taux, tendance ou agrégat est traité par les outils de métriques gérés (list_metrics → describe_metric → query_metric) — jamais calculé par l'agent ni via SQL. Les métriques de fidélisation (winback_uplift, winback_treated_n, winback_holdout_n) et les taux de conversion des clients traités/non traités expriment le succès en termes d'augmentation causale (clients traités − clients non traités sur la même période), et non de conversion absolue. L'agent enregistre les enseignements tirés sous forme de notes (hypothesis). Un humain examine et met en œuvre toute modification de politique — l'agent ne s'autorégule jamais.
Classement Uplift – comment la liste de travail est ordonnée
La priorité de la liste de travail est valeur à risque × augmentation lorsqu'un modèle d'amélioration convient à l'équipe, et valeur à risque pure dans le cas contraire. Le changement est automatique, décidé par scan – il n’y a rien à configurer.
Le modèle est un modèle logistique à deux facteurs (two-model uplift), ajusté par équipe à chaque analyse à partir des données de validation aléatoires propres au programme — uniquement les lignes d'attribution matures, avec la même définition de conversion pour les deux bras :
uplift(x) = P(convert | treated, x) − P(convert | holdout, x)Les classements sont déterministes (aucun échantillonnage aléatoire) : les mêmes données produisent toujours le même classement.
Exemples de portes – toutes doivent être réussies avant que le modèle soit fiable
- ≥ 200 rangées matures traitées
- ≥ 50 lignes matures holdout
- ≥ 20 conversions
- Convergence des deux solutions logistiques
En dessous du seuil any, le modèle est rejeté pour cette analyse (null) et le classement se base uniquement sur la valeur à risque (zéro changement de comportement), et non sur une estimation dégradée. Une estimation d'amélioration négative (un effet inverse mesuré) ramène la priorité de la tâche à 0 ; la tâche reste visible dans la liste des tâches, avec les chiffres expliquant pourquoi.
Ce que voit votre agent. Lorsque le modèle s'ajuste, task.reason comporte le type expected_incremental_value avec la probabilité de désabonnement, la CLV, la valeur à risque, le upliftEstimate et leur produit. Consommez-le via les mêmes outils de liste de travail MCP (réclamer / obtenir / compléter) : il n'y a aucune modification révolutionnaire au schéma, et les types de raisons plus anciens se produisent toujours chaque fois que le modèle ne convient pas.