IAMaîtriser l'IA générative Plan du corpus
Accueil/Skills (Agent Skills)/Creer sa premiere skill, pas a pas

Creer sa premiere skill, pas a pas

On construit ensemble une skill reelle, convention-sql-equipe, qui impose ton style SQL a toutes les requetes generees.

Temps de lecture : 18 min | Niveau : Debutant / Intermediaire

Ce que tu sauras faire apres

  • Reperer le savoir-faire qui merite d'etre capitalise en premier.
  • Creer l'arborescence d'une skill, sous Windows comme sous Unix, et la faire reconnaitre par l'agent.
  • Ecrire un SKILL.md complet avec son fichier de reference.
  • Tester le declenchement automatique et le declenchement manuel.
  • Iterer sur une skill qui ne se declenche pas ou qui obeit mal.

Etape 0 : choisir quoi capitaliser

Ne commence pas par la skill la plus ambitieuse. Commence par la plus repetee. Trois signaux :

  1. Tu le reexpliques plus d'une fois par semaine.
  2. Tu corriges toujours la meme chose : l'agent produit du code correct, mais pas dans ton style.
  3. Un nouveau collegue aurait besoin de la meme explication.
Savoir-faireFrequenceBon candidat ?
Style SQL et nommage de l'equipeTous les joursOui, on commence par la
Documentation d'un modele dbtPlusieurs fois par semaineOui
Deployer en productionRare, et dangereuxOui, mais avec disable-model-invocation: true
Expliquer ce qu'est un JOINJamaisNon, l'agent le sait deja

La regle de la doc officielle. N'ajoute que le contexte que l'agent n'a pas deja. Il connait SQL. Il ne connait pas ta convention de nommage.


Etape 1 : creer l'arborescence

On fait une skill projet, pour qu'elle soit commitee et partagee.

Sous macOS, Linux ou Git Bash :

mkdir -p .claude/skills/convention-sql-equipe/reference

Sous Windows, dans PowerShell :

New-Item -ItemType Directory -Force .claude/skills/convention-sql-equipe/reference

Conseil. Cree ce dossier avant de lancer claude. Si .claude/skills/ n'existe pas au demarrage de la session, Claude Code ne le surveille pas et tu devras faire /reload-skills a chaque modification.

.claude/skills/convention-sql-equipe/
├── SKILL.md
└── reference/
    ├── style-sql.md
    └── squelette.sql

Pourquoi separer des le depart ? Le SKILL.md dit quoi faire et reste court. La reference dit exactement comment, avec tous les details que l'agent n'ouvrira que s'il en a besoin.


Etape 2 : ecrire le SKILL.md

Fichier .claude/skills/convention-sql-equipe/SKILL.md :

---
name: convention-sql-equipe
description: Applique les conventions SQL de l'equipe data (nommage des tables, colonnes
  et CTE, formatage, interdictions) a toute requete ecrite ou relue. A utiliser des que
  l'utilisateur ecrit, corrige ou relit du SQL, un modele dbt, une vue, une CTE, ou
  mentionne BigQuery, Snowflake, un fichier .sql ou le dossier models/.
allowed-tools: Read, Grep, Glob
---

# Conventions SQL de l'equipe data

## Regles non negociables

1. Jamais de `SELECT *` en dehors d'une CTE d'exploration temporaire.
2. Toujours filtrer les lignes de test : `WHERE is_test = FALSE`.
3. Les montants sont stockes en centimes : diviser par 100 et suffixer la colonne
   en `_eur`.
4. Toute jointure precise son type en toutes lettres : `INNER JOIN`, `LEFT JOIN`.
   Jamais `JOIN` tout court.
5. Aucune valeur en dur en production : passer par une CTE nommee `parametres`.

## Procedure

Quand tu ecris ou relis une requete :

- [ ] Etape 1 : lire [reference/style-sql.md](reference/style-sql.md)
- [ ] Etape 2 : ecrire ou corriger la requete
- [ ] Etape 3 : relire la requete contre les 5 regles non negociables
- [ ] Etape 4 : si une regle est violee, corriger et recommencer l'etape 3
- [ ] Etape 5 : livrer la requete finale

Ne livre jamais une requete qui n'a pas passe l'etape 3.

## Squelette de requete

Pars toujours du squelette de [reference/squelette.sql](reference/squelette.sql) :
CTE `parametres`, puis une CTE de filtrage, puis une CTE `final`, et la requete se
termine par `select * from final`.

## Ressources

- Conventions detaillees et anti-patterns : [reference/style-sql.md](reference/style-sql.md)
- Squelette de requete : [reference/squelette.sql](reference/squelette.sql)

Pourquoi c'est ecrit comme ca

ChoixRaison
Description avec BigQuery, Snowflake, .sql, models/Ce sont les mots que tu tapes vraiment : ils declenchent la skill
5 regles dans le SKILL.md, le reste en referenceLes regles critiques sont toujours la ; le detail est charge a la demande
Une checklist a cocherFormat recommande officiellement : l'agent saute moins d'etapes
L'etape 4 renvoie a l'etape 3C'est le motif « valider, corriger, recommencer », qui ameliore nettement la qualite
allowed-tools: Read, Grep, GlobLecture seule : cette skill conseille, elle ne deploie rien

Etape 3 : ecrire les fichiers de reference

reference/style-sql.md depasse 100 lignes une fois complete, donc il commence par un sommaire, comme la doc le recommande.

# Conventions SQL detaillees

## Sommaire
- Nommage des objets
- Nommage des colonnes
- Formatage
- Anti-patterns interdits
- Cas particuliers dbt

## Nommage des objets

| Type | Prefixe | Exemple |
| --- | --- | --- |
| Modele de staging | `stg_` | `stg_commandes` |
| Modele intermediaire | `int_` | `int_commandes_enrichies` |
| Table de faits | `fct_` | `fct_ventes_journalieres` |
| Table de dimension | `dim_` | `dim_client` |

Tout en snake_case, en minuscules, au singulier sauf les tables de faits.

## Nommage des colonnes

| Contenu | Convention | Exemple |
| --- | --- | --- |
| Identifiant technique | suffixe `_id` | `client_id` |
| Date sans heure | prefixe `date_` | `date_commande` |
| Horodatage UTC | suffixe `_at_utc` | `created_at_utc` |
| Montant en euros | suffixe `_eur` | `montant_ttc_eur` |
| Montant brut en centimes | suffixe `_cents` | `montant_ttc_cents` |
| Booleen | prefixe `is_` ou `has_` | `is_test` |
| Comptage | prefixe `nb_` | `nb_commandes` |

## Formatage

- Mots-cles SQL en minuscules, une colonne par ligne dans le `select`.
- Alias toujours explicites avec `as`. Indentation a 4 espaces.
- Une CTE par bloc, separee par une ligne vide.
- La requete se termine toujours par `select * from final`.

## Anti-patterns interdits

| Interdit | Pourquoi | A la place |
| --- | --- | --- |
| `select *` en production | Casse au moindre changement de schema | Lister les colonnes |
| `JOIN` sans type | Ambigu a la relecture | `inner join` ou `left join` |
| Sous-requetes a plus de 2 niveaux | Illisible, indebogable | Des CTE nommees |
| Date en dur dans le `where` | Non reutilisable | Une CTE `parametres` |
| Alias d'une lettre | Illisible | Un alias parlant : `cmd`, `cli` |
| Oublier `is_test = false` | Fausse tous les chiffres | Le filtre systematique |

## Cas particuliers dbt

- Toujours `{{ ref('nom_modele') }}`, jamais le nom de table en dur.
- Toujours `{{ source('schema', 'table') }}` pour les sources brutes.
- Tout nouveau modele a une entree dans le `schema.yml` du dossier, avec au
  minimum une `description` et les tests `unique` + `not_null` sur la cle primaire.

Et reference/squelette.sql :

with parametres as (
    select
        date '2026-01-01' as date_debut,
        date '2026-12-31' as date_fin
),

commandes_filtrees as (
    select
        commande_id,
        client_id,
        date_commande,
        montant_ttc_cents / 100.0 as montant_ttc_eur
    from stg_commandes
    cross join parametres
    where is_test = false
      and date_commande between parametres.date_debut and parametres.date_fin
),

final as (
    select
        date_trunc(date_commande, month) as mois,
        count(distinct commande_id)      as nb_commandes,
        sum(montant_ttc_eur)             as chiffre_affaires_eur
    from commandes_filtrees
    group by 1
)

select * from final

Etape 4 : tester

Si .claude/skills/ existait deja quand tu as lance claude, il n'y a rien a faire : Claude Code surveille ce dossier et voit ta nouvelle skill tout de suite. Si tu viens de creer ce dossier pendant la session, tape d'abord /reload-skills.

Test 1, declenchement manuel. Tape /convention-sql-equipe. Si la skill apparait dans l'autocompletion et se charge, le frontmatter est valide.

Test 2, declenchement automatique. C'est le vrai test. Ecris une demande sans jamais nommer la skill :

Ecris-moi une requete qui donne le chiffre d'affaires mensuel par region
sur l'exercice en cours, a partir de stg_commandes et dim_magasin.

Ce que tu dois observer : l'agent ouvre la skill sans que tu le demandes, les CTE parametres et final sont la, le filtre is_test = false est present, et les montants sont divises par 100 avec un suffixe _eur.

AVANT / APRES

Avant la skill, sur la meme demande :

SELECT region, DATE_TRUNC(date_commande, MONTH) AS m, SUM(montant_ttc_cents) AS ca
FROM stg_commandes c JOIN dim_magasin d ON c.magasin_id = d.magasin_id
WHERE date_commande >= '2026-01-01'
GROUP BY 1, 2

Ce qui ne va pas : montants en centimes (chiffres faux d'un facteur 100), JOIN sans type, date en dur, pas de filtre sur les lignes de test, alias m et ca illisibles.

Apres la skill, la requete sort deja au bon format, avec la CTE parametres, le filtre de test, les montants en euros et des alias parlants. Tu ne repasses plus derriere.


Etape 5 : iterer

Une skill ne marche presque jamais parfaitement du premier coup. La doc decrit une methode a deux roles.

  • Claude A : l'instance avec qui tu construis la skill.
  • Claude B : une instance fraiche, avec la skill chargee, a qui tu donnes de vraies taches.

La boucle : utilise la skill sur du travail reel, observe ou Claude B derape, reviens vers Claude A avec l'observation precise, applique, reteste.

Panne 1 : la skill ne se declenche pas. Le probleme est presque toujours dans la description, qui ne contient pas les mots que tu tapes.

J'ai ecrit cette skill mais elle ne se declenche pas quand je demande
[TA_DEMANDE_TYPE_MOT_POUR_MOT].
Voici la description actuelle : [COLLE_LA_DESCRIPTION].
Reecris-la a la troisieme personne pour qu'elle se declenche sur ce type de demande,
en integrant les mots declencheurs que j'emploie vraiment. Garde-la sous 3 phrases.

Panne 2 : la skill se declenche mais une regle est ignoree. La doc suggere de rendre la regle plus visible, ou d'employer un verbe plus fort (« DOIT filtrer » plutot que « filtre toujours »).

Quand cette skill est active et que je demande [TYPE_DE_DEMANDE], l'agent oublie
systematiquement [LA_REGLE_OUBLIEE].
Voici le SKILL.md actuel : [COLLE_LE_FICHIER].
Propose une reorganisation pour rendre cette regle impossible a manquer.
Ne rallonge pas le fichier de plus de 10 lignes.

Template : faire ecrire la skill par l'agent

Tu n'as pas besoin de partir d'une page blanche : les modeles connaissent nativement le format des skills.

On vient de faire ensemble : [RESUME_DE_LA_TACHE].
Pendant cet echange, je t'ai donne ces informations que je redonne a chaque fois :
- [INFO_1 : schema, table, convention]
- [INFO_2]
- [INFO_3]

Cree une skill qui capture ca.
Contraintes :
- nom en minuscules avec tirets, sans accent
- description a la troisieme personne, ce que ca fait ET quand l'utiliser, avec ces
  mots declencheurs : [MOT_1], [MOT_2], [MOT_3]
- SKILL.md sous 80 lignes : mets le detail dans reference/[NOM_FICHIER].md
- n'explique pas ce que tu sais deja faire, ne garde que mes regles a moi
- ecris les fichiers dans .claude/skills/[NOM_DE_LA_SKILL]/

A retenir

  • Commence par le savoir-faire que tu reexpliques le plus souvent.
  • Deux fichiers des le depart : un SKILL.md court, une reference/ detaillee.
  • Une checklist plus une boucle « valider, corriger, recommencer » ameliorent beaucoup la sortie.
  • Teste toujours le declenchement automatique, avec une demande naturelle qui ne nomme pas la skill. /reload-skills n'est necessaire que si le dossier de skills n'existait pas au demarrage de la session.
  • Une skill qui ne part pas, c'est un probleme de description 9 fois sur 10.
  • Tu peux demander a l'agent d'ecrire la skill : il connait le format nativement.

Sources

Corpus personnel de formation · genere le 26/09/2026 · source : 03-creer-sa-premiere-skill.md