Skip to content

Latest commit

 

History

3 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

✈️ Votre IA écrit comme un post LinkedIn. Faites-la écrire comme un manuel Airbus.

An agent skill that forces LLMs to write technical French in a controlled language:
the français rationalisé that GIFAS built for aerospace maintenance docs, on top of the numbered rules of ASD-STE100.
Le conditionnel, le subjonctif et « il est important de noter que » meurent en même temps. 💀

84.9% fewer violations, measured 7 models benchmarked Agent Skills version 1.0.0 MIT

See it · Install · The rules · Provenance · Benchmarks · FAQ

French port of AminBlg/SimpleEnglish, the original project this is inspired by and derived from.


English docs, French output. This README is in English so it reaches people. Everything the model reads - the skill, the output style, the system prompt, the reference files - is written in French, because instructions in the target language produce better output in that language.

Works in every harness that speaks the Agent Skills standard: Claude Code, Cursor, VS Code Copilot, OpenAI Codex, Gemini CLI, Goose, OpenCode, and ~25 more. One folder, no dependencies, MIT.

🔥 Avant / après

Left column is real unedited claude-opus-5 output. Right column is the same model with the skill loaded. Same prompt on both sides. Regenerate with evals/run_readme_pairs.py; raw JSON in evals/results/readme/raw/.

🤖 Sans le skill ✈️ Avec le skill
sqlpipe copie vos tables Postgres vers S3 en une seule commande, sans script intermédiaire ni export manuel. Vous indiquez la base source, les tables à transférer et le bucket de destination : l'outil s'occupe de la lecture, de la conversion et de l'envoi. Avant de commencer, assurez-vous de disposer d'identifiants AWS valides et autorisés à écrire dans le bucket visé (via les variables d'environnement, votre profil ~/.aws/credentials ou un rôle IAM) — sans quoi le transfert échouera dès la première écriture. sqlpipe copie des tables Postgres vers S3. L'outil lit une table source, puis écrit les données dans un compartiment S3. Vous le lancez en ligne de commande avec un fichier de configuration.

Avant de commencer, s'assurer que les identifiants AWS sont corrects. Le compte doit avoir le droit d'écrire dans le compartiment cible.
Échec de la connexion à la base de données : authentification refusée pour l'utilisateur « app » (mot de passe incorrect). ERREUR : la connexion à la base de données a échoué. Le mot de passe de l'utilisateur app est incorrect.

Corriger le mot de passe de l'utilisateur app dans la configuration. Puis relancer l'application.
Le 18 août, entre 14 h 02 et 14 h 31 UTC, environ 12 % des requêtes ont échoué. La cause est un déploiement effectué à 14 h 00, qui supprimait par erreur l'étape de préchauffage du cache : les instances redémarrées ont donc démarré avec un cache vide, ce qui a saturé les services en aval et provoqué des erreurs sur une partie du trafic. Le déploiement a été annulé à 14 h 27 et le service est revenu à la normale à 14 h 31. Nous rétablissons l'étape de préchauffage et ajoutons un contrôle automatique pour empêcher qu'un déploiement puisse la supprimer à nouveau. Nous vous prions de nous excuser pour la gêne occasionnée. Incident du 18 août : échecs de requêtes

Entre 14 h 02 et 14 h 31 UTC, 12 % des requêtes ont échoué. Un déploiement à 14 h 00 a supprimé l'étape de préchauffage du cache. Le retour arrière à 14 h 27 a rétabli cette étape. Le service est revenu à son état normal à 14 h 31.

Three single generations, noisy in both directions - on the error message the skill's version scores one violation worse than the already-clean baseline, because it writes « a échoué » where its own doctrine wants « échoue ». The measured effect is the 112-generation grid in RESULTS.md: 84.9% fewer violations, 45 of 56 blind-judge wins.

More hand-written pairs in examples/before-after.md: READMEs, error messages, incident reports, release notes, troubleshooting.

📦 Install

npx skills add quantumsheep/simple-french

That is it. The skills CLI detects your agents (Claude Code, Cursor, Codex, Copilot, Gemini CLI, and more) and installs it for the ones you pick. Try before installing:

npx skills use quantumsheep/simple-french@simple-french

Claude Code plugin: this repo is also a plugin marketplace.

claude plugin marketplace add quantumsheep/simple-french && claude plugin install simple-french@simple-french

Or inside Claude Code: /plugin marketplace add quantumsheep/simple-french, then /plugin install simple-french@simple-french.

Output style (Claude Code): the plugin also ships simple-french as an output style. The skill triggers when a writing task fits; the style is always on, for every reply. After you install the plugin, run /config, open Output style, and pick simple-french.

No SKILL.md support at all? Paste prompts/system-prompt.md into your system prompt, AGENTS.md, or .cursorrules. There is a ~60-token version for tight budgets.

Then ask for any technical writing in French, or say: « réécris ça avec simple-french ».

🖱️ No terminal? (claude.ai, ChatGPT, Gemini)

Claude.ai (paid plans) supports skills natively:

  1. Download the skill file: open SKILL.md and save it (Ctrl+S / Cmd+S).
  2. In claude.ai, go to Settings → Capabilities and turn on code execution.
  3. Go to Settings → Customize → Skills → Upload and upload the saved SKILL.md.
  4. Toggle the skill on.

ChatGPT: no skill support, so use the prompt version. Copy the block from prompts/system-prompt.md into Settings → Personalization → Custom Instructions, or into a Project or Custom GPT.

Gemini: create a Gem and paste the same block into its instructions.

📏 The rules

Three layers, each with a different job. The skill says which layer a rule comes from, and never cites a number that is not in the file.

Layer A - the numbered catalogue (ASD-STE100)

53 rules, 9 sections, paraphrased in French with software examples. Kept numbered because stable numbering is the fix for the failure mode this project exists to prevent: agents working from memory invent rule numbers.

Layer B - la doctrine du français rationalisé (GIFAS)

The verb system. This is where French diverges hardest from English, and it is brutally short:

Allowed Banned
infinitif présent · infinitif d'ordre · présent de l'indicatif · futur de l'indicatif subjonctif · passé composé · plus-que-parfait · futur antérieur · passé simple · imparfait · conditionnel · participe présent · gérondif

The past participle survives only as an adjective (la réponse mise en cache). Modals reduce to pouvoir and devoir.

Layer C - the 12 rules English does not have

Rule What it kills 🪦
FR-1 · vouvoiement only « tu peux relancer ta migration »
FR-2 · instructions à l'infinitif mixing « Lancer » and « Lancez » in one procedure
FR-3 · no subjonctif « il faut que vous configuriez »
FR-4 · no conditionnel « il conviendrait de », « il serait souhaitable de » - the French hedge
FR-5 · no participe présent as a verb « ..., permettant de »
FR-6 · no nominalisation « procéder à la vérification de » → « vérifier »
FR-7 · no passive with an agent « est écrit par le service »
FR-8 · accents on capitals EtatÉtat
FR-9 · French typography espace insécable, guillemets « »
FR-10 · French numbers 2.5 GB2,5 Go
FR-11 · no anglicisme supporter, librairie, digital, initier, impacter
FR-12 · keep « que » and the articles « Vérifier existence fichier »

Plus the limits that carry over: 20 words per instruction, 25 per description. French runs ~20% longer than English for the same content, so keeping the English numbers makes the rule stricter - the only way to hit 20 words in French is to delete the nominalisations. That is the point.

Full set with examples: SKILL.md. Yes, this README breaks half of them. Marketing is explicitly out of scope. The skill knows that and stays in the docs. 😌

🧭 Provenance

The honest version, because the whole pitch is "this is not vibes":

  • Le français rationalisé is real. GIFAS - the French aerospace and defence industry association - has distributed it since 1990, explicitly as a translation and adaptation of Simplified English, with guide versions in 1996 and 1999. It is published as Guide du français rationalisé, and STUDEC ships a commercial checker for it.
  • But it is not free, and it stopped in 1999.
  • ASD-STE100 Issue 9 (January 2025) is free and maintained.
  • This repo is a port, not an original idea. AminBlg/SimpleEnglish built the skill for English first. This project is inspired by it and derived from it (MIT), and it keeps the same structure: skill, output style, condensed prompt, deterministic linter, reproducible benchmark.

So the layering is not a workaround, it is the actual lineage: GIFAS supplies the verb doctrine and the ancestry, ASD-STE100 supplies the numbered catalogue that can be cited and checked, and FR-1FR-12 supply what neither covers. No spec text and no dictionary content are reproduced from either standard.

🧰 Not just docs

The skill ships adaptations (use-cases.md) for:

  • 🚨 Messages d'erreur: l'état constaté → la cause → l'ordre qui corrige. No « Oups », no « Veuillez vous assurer », no apology.
  • 📟 Procédures d'exploitation: the home turf. A runbook is a maintenance manual.
  • 🧯 Rapports d'incident: the strongest case, and the one the rules moved most. French defaults to passé composé and conditionnel - « un incident aurait affecté ». Both are banned, so a dated fact goes in the present and the text says what is known. Measured: temps_compose in incident reports went from 23 violations to 0.
  • 📣 Notes de version: breaking changes as warnings - ordre d'abord, risque ensuite.
  • 🤖 Your AGENTS.md / prompts: a system prompt is a procedure for a reader that cannot ask questions. Models read a hedge as optional. This bans the conditionnel outright.
  • 🌍 Translation prep: GIFAS built le français rationalisé precisely so French docs translate to Simplified English without rework.

Where it refuses to go: marketing copy, blog voice, brand writing. Flat on purpose. ✋

📊 Benchmarks

84.9% fewer violations per 100 words with the skill on, averaged across 7 models × 8 writing tasks (112 generations, measured).

Model Baseline viol/100w Skill viol/100w Reduction Baseline sent. len Skill sent. len
claude-opus-5 1.93 0.23 88.1% 13.7 9.9
claude-opus-4-8 2.6 0.11 95.8% 16.3 9.7
claude-opus-4-7 2.8 0.24 91.4% 17.6 10.8
claude-opus-4-6 1.68 0.48 71.4% 11.9 9.3
claude-opus-4-5-20251101 2.64 0.23 91.3% 12.8 9.8
claude-sonnet-5 3.1 0.54 82.6% 18.4 12.4
claude-sonnet-4-6 2.05 0.54 73.7% 16.3 11.4

A blind pairwise judge (both text orders, no labels) preferred the skill output in 45 of 56 pairs, with 2 ties and 9 losses. Mean rubric score: 8.38 with the skill, 6.21 without.

Deterministic regex linter (evals/fr_lint.py), same 14 violation classes for both conditions, reasoning effort pinned to low. Full method, the honest-caveat list, and the raw responses are in evals/results/RESULTS.md.

Reproduce with python3 evals/run_bench.py - needs only a logged-in Claude Code CLI, no API key. The runner is resumable.

A separate Pi cross-check runner ships in evals/run_pi_bench.py. It is ported to French but not run, because it needs Pi access. Better no Pi table than a stale one.

🧾 Receipts

  • The linter has a precision guard. A clean French fixture must score exactly 0 violations, and that is asserted on every --self-test. Three real defects were caught this way while writing the skill: feminine past participles (a construite, a mise) were invisible; avoir + any short word (a ni, a si, a plus de trois) scored as passé composé; and « il a si peu de temps » counted as a trailing condition when that si is the intensifier, not the conditional.
  • The skill cannot cite a rule it does not define. A cross-reference check parses every rule number in the reference files and fails if one is absent from SKILL.md - 73 rules defined, zero orphans. This is the exact failure the upstream English project recorded: a baseline agent confidently citing "Rule 3.1: short sentences" when the real Rule 3.1 is about verb forms.
  • The skill obeys its own rules. Running fr_lint.py against SKILL.md found seven violations in its own prose - four passé composé, one passive with agent, two semicolon paragraphs - all fixed. Everything the linter still reports sits inside a deliberate Avant : counter-example.

❓ FAQ

Does this make output certified? No. Nothing does. ASD certifies no tool, and GIFAS does not either. Default mode is pragmatic: structural rules plus your domain vocabulary. Strict mode gets close; word-level rulings live in the official standards.

Why not just use the GIFAS guide directly? Because it is not free and its last known version is 1999. The enforceable layer has to be the one that is free, maintained, and citable - and ASD-STE100 is the standard le français rationalisé was derived from in the first place.

Will my docs sound robotic? They will sound like an Airbus manual: flat and impossible to misread. For docs that is the whole point. Keep your voice for your blog. ✍️

Why not just prompt « écris clairement »? « Clairement » is an opinion. « Pas plus de 20 mots par phrase » is a spec. Agents follow specs. 📐

Does it work on English too? No - this is the French port. For English, use AminBlg/SimpleEnglish, the upstream this is derived from.

⚖️ License and status

MIT for everything here. Derived from AminBlg/SimpleEnglish (MIT).

The repo paraphrases rules for teaching and reproduces zero spec text or dictionary content from ASD-STE100 or from the Guide du français rationalisé. Unofficial project, not affiliated with or endorsed by ASD, STEMG, or GIFAS. ASD-STE100 is a registered trademark of ASD.

About

Controlled technical French for LLMs: français rationalisé (GIFAS) + ASD-STE100, benchmarked.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Contributors

Languages