Skill propriétaire de la gestion des fiches clients du cabinet (lifecycle complet du dossier `clients/<slug>/` et de l'entrée `clients.json`). INVOKE SYSTEMA...
> Skill maison du domaine comptable. Propriétaire unique des fiches clients (raison sociale, SIREN, contacts, domaines, statut) et du dossier physique clients//.
> Détails techniques dans references/ (chargés à la demande).
Pourquoi ce skill existe
organisation-documents crée des fiches clients en réflexe quand une PJ entrante a un signal exploitable (auto-création silencieuse en draft-auto-created). C'est très bien pour le pipeline automatique, mais ça ne couvre pas :
Les demandes utilisateur explicites (« crée moi un client ACME », « renomme foo-corp en foo-sa », « fusionne ces deux fiches doublonnées »).
La validation des drafts auto-créés (passage de draft-auto-created → active).
Les mises à jour de fiche (ajout de SIREN après lookup INSEE, ajout d'un domaine secondaire, correction d'adresse).
Les opérations RGPD (archivage soft-delete, purge après grâce 30 j).
Ce skill est le seul à écrire dans clients.json et à créer/déplacer/archiver des dossiers clients//. Tous les autres skills (organisation-documents, rapprochement-bancaire, relances, facturation) peuvent lire ces fichiers mais doivent passer par ce skill pour toute mutation au niveau fiche.
Exception unique : organisation-documents est autorisé à appeler ce skill (ou à exécuter sa procédure create) pour créer un draft auto. Voir references/cohabitation.md.
Quand utiliser ce skill
Règle d'or : dès que l'utilisateur prononce un verbe qui agit sur une fiche client en tant qu'entité (pas un document), c'est ce skill. Si le doute existe entre fiches-clients et organisation-documents : organisation-documents traite des pièces (factures, relevés…), clients traite des fiches (entités juridiques).
« crée un client », « ajoute le client », « nouveau client X »
create
« renomme acme en acme-sa »
rename
« fusionne acme et acme-sa »
merge
« archive le client », « supprime le client » (RGPD)
archive (soft-delete)
« valide la fiche de Foo », « confirme la fiche draft »
validate-draft
« rejette / ignore cette fiche draft »
reject-draft
« ajoute le SIREN / SIRET / e-mail / domaine / IBAN à acme »
update
« liste les clients », « combien de clients », « cherche le client foo »
list / find
Déclencheurs implicites :
Après que organisation-documents a logué un draft-auto-created dans son rapport, si l'utilisateur répond « OK valide » ou « non c'est pas ce client » → validate-draft ou reject-draft.
Si une pièce dans .pending-attribution/ reçoit une réponse utilisateur « crée le client nouveau-client » → create (puis organisation-documents peut classer la pièce).
Ne pas utiliser pour : classer un document (→ organisation-documents), modifier index.json ou audit.log ailleurs que pour la création d'une fiche (chaque skill maintient ses propres logs métier), envoyer une relance (→ relances).
Mode d'exécution
Inline only
Toutes les opérations de ce skill sont inline. Pas de subagent, pas de TaskFlow. Une création de fiche prend < 5 s, une fusion < 10 s. Aucune raison de déléguer.
rename / archive : ≤ 10 s (renommage de dossier + propagation index).
merge : ≤ 20 s (re-indexation des deux clients fusionnés).
list / find : ≤ 2 s.
Communication
Une ligne avant, une ligne après. Style comptable, pas développeur : « Client ACME SA créé » et non « Entry inserted into clients.json with slug acme-sa ». Voir section Communication avec le comptable.
Procédures
Procédure create — créer une fiche client
Quand : verbe utilisateur explicite (crée, ajoute, nouveau client) OU invocation par organisation-documents en auto-création.
Étapes :
Identifier la source : user (commande explicite) ou auto (organisation-documents). Affecte le statut initial.
Extraire les signaux depuis la commande utilisateur ou le contexte appelant :
Raison sociale obligatoire (au minimum un texte lisible).
Optionnels : SIREN, SIRET, forme juridique, e-mail de contact, domaine, téléphone, adresse, IBAN.
Le slug n'existe pas déjà dans clients.json. Sinon → demander à l'utilisateur s'il s'agit du même client (proposer merge) ou suggérer un suffixe (acme-sa-2).
Si SIREN fourni : aucun autre client n'a le même SIREN. Sinon → proposer merge ou erreur.
Créer le dossier physique :
```
~/.openclaw/workspace/clients//
├── audit.log # fichier vide créé immédiatement
└── index.json # { "documents": [] }
```
Pas de sous-dossiers //… à ce stade — ils sont créés à la demande par organisation-documents quand un document arrive. Pas de company.json non plus tant que l'utilisateur n'a pas fourni d'infos juridiques (créé en lazy par update ou par le skill facturation).
Rapporter à l'utilisateur. Format : ✅ Client créé. + une ligne si signaux manquants (« pense à compléter le SIREN »).
Procédure validate-draft — confirmer une fiche draft-auto-created
Quand : utilisateur confirme un draft. Souvent juste après un rapport organisation-documents qui a auto-créé.
Étapes :
Charger l'entrée clients.json correspondante.
Vérifier que statut === "draft-auto-created" (sinon erreur : déjà active).
Mettre à jour : statut: "active", aValider: false, confiance: 1.0, dateValidation: , auteurValidation: "user".
Loguer dans audit.log : validate-draft actor=user slug=.
Rapporter : ✅ Fiche validée.
Procédure reject-draft — rejeter une fiche draft-auto-created
Quand : utilisateur dit « non c'est pas un client », « ignore cette fiche ».
Étapes :
Vérifier qu'aucun document n'est déjà classé sous clients// :
Si clients//index.json contient des documents → escalader : « Cette fiche a déjà N documents classés, je dois savoir où les rattacher avant de supprimer. »
Si vide → continuer.
Supprimer le dossier clients// (le draft n'a jamais été utilisé, on peut purger sans soft-delete).
Retirer l'entrée de clients.json.
Loguer (dans un audit log global du workspace, pas dans le dossier supprimé) : reject-draft actor=user slug=.
Rapporter : ✅ Fiche rejetée.
Procédure update — mettre à jour des champs
Quand : verbe utilisateur ciblé (« ajoute le SIREN », « change l'adresse », « ajoute un domaine »).
Étapes :
Charger l'entrée clients.json.
Appliquer les modifications uniquement sur les champs cités. Ne pas toucher au reste.
Si modification de siren : vérifier l'unicité (aucun autre client n'a ce SIREN). Optionnel : lookup INSEE via scripts/fetch_company.py de organisation-documents pour confirmer la raison sociale.
Si ajout d'un domain : vérifier qu'aucun autre client n'a ce domaine (sinon escalader).
Si ajout de champs juridiques (SIREN, SIRET, forme, capital, IBAN) → créer ou mettre à jourclients//company.json (cf. schéma dans organisation-documents/data/company.example.json).
Loguer chaque champ modifié dans audit.log : update field=siren old=null new=123456789 actor=user.
Rapporter : ✅ Fiche mise à jour (SIREN ajouté).
Procédure rename — renommer un client (slug ou raison sociale)
Quand : « renomme foo-corp en foo-sa », « la raison sociale est en fait ACME SAS pas ACME SA ».
Cas 1 — Renommage raison sociale uniquement (slug inchangé) :
Mettre à jour raisonSociale dans clients.json.
Loguer.
Rapporter.
Cas 2 — Renommage slug (impacte le dossier physique) :
Vérifier que le nouveau slug n'existe pas déjà.
Renommer le dossier : clients// → clients//.
Mettre à jour clients.json : slug et tous les cheminDrive / cheminLocal dans les entrées d'index liées (cf. § Propagation ci-dessous).
Mettre à jour index-global.json : tous les cheminDrive qui commencent par clients// → clients//.
Loguer dans le nouveau audit.log : rename old-slug= new-slug= actor=user.
Rapporter : ✅ Client renommé : → .
Procédure merge — fusionner deux fiches doublonnées
Quand : « fusionne acme et acme-sa » (souvent après une auto-création doublonnée).
Convention : l'utilisateur indique la fiche cible (celle qui survit) et la fiche source (celle qui est absorbée). Par défaut, la fiche active est cible et la draft-auto-created est source. Si les deux sont actives, demander.
Étapes :
Vérifier que les deux fiches existent.
Fusionner les champs : pour chaque champ, garder la valeur de la cible si présente, sinon prendre celle de la source. Conserver l'union pour les listes (domains, contacts).
Déplacer tous les documents de clients// vers clients// en préservant l'arborescence //…. Conflits de nom (deux fichiers même chemin) → suffixer le second _2.
Concaténer les index : clients//index.json reçoit les entrées de la source (avec cheminDrive mis à jour).
Mettre à jour index-global.json : tous les clientId = source → cible, tous les chemins recalculés.
Supprimer le dossier source et retirer son entrée de clients.json.
Loguer dans clients//audit.log : merge source= docs-moved= actor=user.
Rapporter : ✅ Fusion → : N pièces réattachées.
Procédure archive — archiver une fiche (RGPD soft-delete)
Quand : « archive le client foo », « supprime le client foo » (jamais de hard-delete via cette voie ; la suppression hard est manuelle après les 30 j de grâce).
Étapes :
Mettre statut: "archived", dateArchivage: , purgeNonPasseAvant: dans clients.json.
Déplacer le dossier clients// → clients//_archive-suppression/ (soft-delete avec grâce 30 j, comme spécifié dans organisation-documents/SKILL.md § Garde-fous).
Loguer : archive actor=user grace-until=.
Rapporter : ✅ Client archivé. Restauration possible jusqu'au .
Pas de hard-delete automatique. La purge effective après 30 j est un processus séparé (ops manuel ou cron skill futur), pas dans ce skill.
Procédure list / find
Quand : « liste les clients », « cherche foo ».
Étapes :
Lire clients.json.
Filtrer (selon prompt) par slug / raison sociale / SIREN / statut.
préférer le domaine quand disponible (trendex.tech → trendex-tech), sinon raison sociale slugifiée (ACME SA → acme-sa)
Pas de slug réservé. Aucun dossier _cabinet, _non-attribue, _temp ne doit être créé via ce skill. Le parking technique .pending-attribution/ vit hors clients/ et n'est pas géré par ce skill (il appartient à organisation-documents).
Collision : si le slug dérivé existe déjà pour un autre client (SIREN différent, raison sociale différente), suffixer un numéro (acme-sa-2). Si même client, proposer merge et ne pas créer.
Mêmes règles que organisation-documents (vocabulaire métier, pas de jargon technique). Voir organisation-documents/SKILL.md § Communication pour la doctrine complète. Spécificités de ce skill :
Collision de slug avec un autre client (SIREN différent) → proposer merge ou suffixe.
Collision de SIREN sur deux fiches → escalader.
Demande d'archivage d'un client qui a des relances en cours dans le mois → confirmer.
Garde-fous
Pas de hard-delete depuis ce skill. Toujours soft-delete avec grâce 30 j.
Pas de modification de documents : ce skill ne renomme jamais une facture, ne déplace jamais un fichier dans //… à l'unité — il déplace uniquement au niveau dossier client (rename, merge, archive).
Cohérence clients.json ↔ système de fichiers : après chaque opération mutative, l'invariant slug existe dans clients.json ⇔ dossier clients// existe doit tenir. Vérifier en fin de procédure.
Audit trail systématique : toute mutation (create, update, rename, merge, archive, validate-draft, reject-draft) est loguée dans clients//audit.log (UTC + acteur + champs modifiés).
Aucune donnée client ne quitte le container LXD. Mêmes contraintes RGPD que organisation-documents.
Lookup INSEE : autorisé via organisation-documents/scripts/fetch_company.py pour résoudre une raison sociale en SIREN, mais avec consentement utilisateur si appelé en dehors d'un flux où l'utilisateur a déjà partagé la raison sociale.