Un deuxième et un troisième avis, dans Claude.
Kirat permet à Claude de réunir un conseil avec ChatGPT et Gemini. Trois familles de modèles prennent position indépendamment, puis votent. La majorité décide, et la dissidence reste consignée. S’il n’y a pas de majorité, Kirat le dit au lieu de forcer un accord.
Claude Desktop (macOS/Windows) et Claude Code ; sessions cloud Claude Code avec une configuration unique — ni le chat dans le navigateur, ni le chat mobile (où il fonctionne)
Vos propres clés OpenAI et Gemini — aucun serveur, aucun compte chez nous
Achat unique — sans abonnement, 256 tests automatisés
Un modèle, un angle mort.
L’autorelecture flatte
Un modèle qui vérifie son propre travail se trouve convaincant. Une deuxième passe du même modèle n’est pas une vérification indépendante.
Plus de tours n’est pas la solution
Kirat limite le débat à deux tours, dans le code, pas dans un prompt. Un modèle ne peut pas contourner la limite à force d’arguments. S’il n’y a toujours pas de majorité, on vous le dit.
Des familles différentes échouent différemment
Kirat soumet la même question à Claude, ChatGPT et Gemini et vous montre la division — y compris qui n’était pas d’accord, et pourquoi.
Trois positions. Un vote. Chaque objection conservée.
Des positions indépendantes
ChatGPT et Gemini prennent chacun position sans voir celle des autres. Claude soumet sa propre position en tant que troisième votant. Pas d’ancrage, pas de théâtre du consensus.
Un vote consigné
Une majorité des deux tiers décide. Si des membres font défaut et que les autres sont divisés, un responsable de domaine désigné départage. Sans majorité, le résultat indique needs_human. La dissidence est renvoyée avec le résultat.
Conçu pour résister aux API
Garde-fou budgétaire, limite de deux tours, disjoncteur (circuit breaker), délais d’attente par fournisseur calculés à partir du débit mesuré, tickets en arrière-plan pour les longues exécutions. Tout dans le code, rien dans les prompts.
Vous demandez en langage courant. Claude fait l’appel :
// un vrai appel et une vraie réponse — rien de mis en scène kirat_vote({ question: "Cap the coupled effort default, or leave it at maximum?", options: ["cap at high", "decouple", "leave as is"], ownPosition: { position: "cap at high", reasoning: "…", confidence: 72 } }) → outcome: "completed" decision: "cap at high" decisionPath: "unanimous" rounds: 1 votes: openai 94, gemini 92, claude 72 cost: $0.021
Autres résultats : needs_human (pas de majorité — c’est vous qui décidez), domain_decision, limited, budget_exhausted. Les valeurs de confiance sont l’auto-évaluation de chaque modèle.
Neuf outils appelés par Claude
7 payants · 2 gratuits| Pos. | Outil | Fonction | Coût |
|---|---|---|---|
| 01 | kirat_vote | Décision par vote : chaque membre prend position, puis une majorité des deux tiers, le responsable du domaine ou needs_human. | payant |
| 02 | kirat_review | Revue de code. Chaque constat est vérifié par l’autre famille de modèles. | payant |
| 03 | kirat_create | Critiquer votre brouillon, laisser un membre rédiger, ou classer de courtes variantes. | payant |
| 04 | kirat_brainstorm | Des idées divergentes sur trois pistes — dans le cadre, à côté, hors des règles — classées anonymement. | payant |
| 05 | kirat_decide | Décision déléguée pour des choix de travail réversibles, avec veto et limite quotidienne. | payant |
| 06 | kirat_ask | Interroger un seul membre. Pas de conseil. | payant |
| 07 | kirat_image | Génération d’images par les deux fournisseurs, notées par un jury anonyme. | payant |
| 08 | kirat_result | Récupérer les tâches en arrière-plan et les résultats récents. | gratuit |
| 09 | kirat_status | Budget, dépenses, membres disponibles, réglages. | gratuit |
kirat_image et l’entrée d’images fonctionnent avec des fichiers sur votre ordinateur, ils conviennent donc surtout à Claude Code.Regardez le conseil travailler.
De vrais enregistrements des outils de Kirat, réalisés le 13 octobre 2026 avec la version que vous achetez. Choisissez un outil et regardez le conseil travailler : positions indépendantes, vérifications croisées, classements anonymes et dissidence. Ceci est une rediffusion : rien de ce sur quoi vous cliquez ici n’appelle un modèle, et rien ne quitte cette page.
Choisir un outil
Cinq questions de domaines différents. Choisissez-en une.
Contexte envoyé : Développeur solo. Outil de facturation pour freelances, 19 USD par mois, essai gratuit de 14 jours, 30 clients payants au bout de 5 mois. Les inscriptions viennent surtout de deux articles de blog bien classés sur Google. Environ 12 % des essais se convertissent. Le support prend déjà environ 5 heures par semaine. Le développeur a un emploi principal et environ 10 heures par semaine pour le produit.
Options : Ajouter une offre gratuite · Rester uniquement payant, prolonger l’essai à 30 jours · Rester uniquement payant, ne rien changer
Contexte envoyé : Nous sommes une petite agence digitale. Le client vend environ 1 800 produits d’ameublement en Allemagne, en Autriche et en Suisse, compte 3 employés et aucun développeur en interne. La boutique actuelle est une installation WooCommerce auto-hébergée, vieille de 6 ans, avec 31 plugins, des pages lentes et deux incidents de sécurité au cours de l’année écoulée. Le chiffre d’affaires est d’environ 1,2 million d’EUR par an. Le client veut moins de maintenance et moins d’urgences ; il utilise un ERP local qui exporte les données produits en CSV. Budget de la refonte : 25 000 EUR.
Options : Reconstruire sur WooCommerce · Migrer vers Shopify
Contexte envoyé : Boulangerie de 6 employés dans une ville allemande de 40 000 habitants. Les gâteaux sur mesure et les précommandes dégagent la meilleure marge. Aujourd’hui, les commandes arrivent uniquement par téléphone et par e-mail ; le site web affiche les horaires d’ouverture et un formulaire de contact, rien pour commander. Le profil Google Business affiche 4,7 étoiles pour 120 avis. Aucune publicité payante jusqu’ici. Budget : 3 000 EUR pour le prochain trimestre ; le propriétaire a peu de temps.
Options : Google Ads · Une vraie page de commande en ligne · Répartir à parts égales entre les deux
Contexte envoyé : Équipe de 8 ingénieurs. Un monolithe TypeScript d’environ 60 000 lignes, une base de données Postgres, déployé plusieurs fois par jour. Le module de facturation change chaque semaine et a causé 5 des 8 derniers incidents en production, principalement parce que d’autres modules lisent et écrivent directement dans les tables de facturation. Personne dans l’équipe n’a exploité de système distribué en production. La direction veut moins d’incidents d’ici deux trimestres.
Options : Extraire la facturation dans un service maintenant · Renforcer d’abord les frontières à l’intérieur du monolithe
Contexte envoyé : Sélection sur titre et résumé d’environ 3 000 références pour une revue systématique en recherche sur les services de santé, en vue d’une publication. Protocole actuel : deux évaluateurs humains indépendants, conflits résolus par discussion. Le temps du personnel est compté. La revue suit PRISMA, et les relecteurs du journal demanderont comment la sélection a été faite. Manquer une étude pertinente (fausse exclusion) est pire qu’en inclure une non pertinente.
Options : Oui, remplacer le second évaluateur humain · Utiliser le LLM comme évaluateur supplémentaire ; les humains résolvent les conflits · Non, garder deux évaluateurs humains et aucun LLM
Enregistré le 13 octobre 2026 avec kirat_vote au niveau d’effort standard ; chaque séance a duré moins de 20 secondes et coûté moins de $0.02. Les questions, options et contextes sont ceux qui ont été envoyés, traduits ici ; le raisonnement est reproduit en intégralité. Tous les raisonnements affichés ici sont traduits : les modèles ont répondu en anglais et, en partie, en allemand (Gemini quatre fois, ChatGPT une fois). Sur la question de l’offre gratuite, Claude a perdu le vote 2:1, et son objection est restée consignée. Les valeurs de confiance sont l’auto-évaluation de chaque modèle.
Cinq extraits de code de domaines différents, chacun envoyé exactement tel qu’affiché. ChatGPT et Gemini les examinent en parallèle, Claude ajoute deux constats de son cru, et chaque constat est vérifié par l’autre famille de modèles. Seuls les constats confirmés comptent. Choisissez-en un.
Axe : sécurité et exactitude d’un webhook de paiement
Code envoyé :
// routes/webhooks.js — payment webhook of a solo invoicing SaaS (Node 20, Express 4, Stripe, pg)
const express = require('express');
const { db } = require('../db');
const router = express.Router();
router.post('/webhooks/stripe', express.json(), async (req, res) => {
const event = req.body;
if (event.type === 'invoice.paid') {
const invoice = event.data.object;
const userId = invoice.metadata.userId;
await db.query('UPDATE users SET plan = $1, paid_until = $2 WHERE id = $3',
['pro', new Date(invoice.period_end * 1000), userId]);
await db.query('INSERT INTO payments (user_id, amount) VALUES ($1, $2)',
[userId, invoice.amount_paid / 100]);
}
if (event.type === 'customer.subscription.deleted') {
await db.query("UPDATE users SET plan = 'free' WHERE stripe_customer = '" + event.data.object.customer + "'");
}
res.sendStatus(200);
});
module.exports = router;
- critique
Le webhook traite le corps de la requête sans vérifier la signature Stripe. N’importe quel appelant externe peut ainsi envoyer de faux événements `invoice.paid` ou `customer.subscription.deleted` et activer ou rétrograder des comptes utilisateurs. Le parseur JSON écarte en outre le corps brut non modifié dont la vérification de signature Stripe a besoin.
Correctif : Utiliser `express.raw({ type: 'application/json' })` pour cette route et appeler `stripe.webhooks.constructEvent(req.body, req.headers['stripe-signature'], webhookSecret)` avant tout traitement. Veiller à ce qu’aucun parseur JSON global ne soit déjà appliqué auparavant à cette route ; rejeter les signatures invalides avec 400.
- critique
Absence de validation de la signature du webhook Stripe. Un attaquant peut envoyer à ce point de terminaison n’importe quels faux événements de webhook afin de passer indûment des comptes en Pro ou de manipuler des entrées de la base de données.
Correctif : Utilisez stripe.webhooks.constructEvent() avec le secret du webhook Stripe pour vérifier l’authenticité et l’intégrité de chaque événement.
- critique
Vulnérabilité d’injection SQL due à la concaténation directe d’entrées utilisateur (event.data.object.customer) dans la chaîne de requête SQL.
Correctif : Utilisez des requêtes paramétrées comme pour les instructions précédentes : db.query('UPDATE users SET plan = $1 WHERE stripe_customer = $2', ['free', event.data.object.customer]).
- critique
Le webhook ne vérifie jamais la signature Stripe, et express.json() écarte le corps brut nécessaire pour le faire. N’importe qui peut envoyer par POST un faux événement invoice.paid et faire passer gratuitement n’importe quel compte en pro.
Correctif : Utilisez express.raw({ type: 'application/json' }) sur cette route et construisez l’événement avec stripe.webhooks.constructEvent(req.body, req.headers['stripe-signature'], endpointSecret) ; rejetez la requête en cas d’échec.
- élevée
L’ID client est inséré directement dans une instruction SQL. Une valeur comme `' OR 1=1 --` peut manipuler la clause WHERE et faire passer tous les utilisateurs au forfait gratuit ; selon la configuration de la base de données, des injections SQL plus poussées sont possibles.
Correctif : Paramétrer entièrement la requête : `UPDATE users SET plan = 'free' WHERE stripe_customer = $1` avec `[event.data.object.customer]`. Authentifier en plus l’événement par la signature Stripe.
- élevée
Il n’y a aucun contrôle d’idempotence. Stripe livre les webhooks au moins une fois et les répète en cas de timeout ou d’erreur. Le même événement `invoice.paid` peut donc créer plusieurs fois des entrées de paiement identiques.
Correctif : Enregistrer l’ID d’événement Stripe ou l’ID de facture dans l’enregistrement de paiement, le protéger par une contrainte UNIQUE et exécuter de façon atomique le traitement de l’événement et le paiement sous forme d’insert/upsert. Confirmer avec 200 les événements déjà traités, sans répéter l’opération métier.
- élevée
Le handler `async` ne transmet pas les erreurs. Express 4 n’intercepte pas automatiquement les promesses rejetées des handlers de route asynchrones. Une erreur de base de données ou un objet `invoice.paid` incomplet entraîne donc un rejet de promesse non géré et peut, sous Node 20, mettre fin au processus au lieu de renvoyer une réponse d’erreur de façon contrôlée.
Correctif : Entourer le handler d’un `try/catch` et transmettre les erreurs à `next(err)`, ou utiliser un wrapper async. Valider la structure des entrées avant d’y accéder et, en cas d’erreurs de traitement temporaires, renvoyer de façon contrôlée un statut 5xx afin que Stripe livre à nouveau.
- élevée
L’utilisation de express.json() pour le point de terminaison du webhook analyse au préalable le corps en JSON. Or la vérification de signature de Stripe a besoin du corps brut non modifié.
Correctif : Utilisez express.raw({ type: 'application/json' }) au lieu de express.json() pour le handler de route du webhook Stripe.
- moyenne
La mise à jour de l’utilisateur et l’entrée de paiement sont deux opérations de base de données validées indépendamment. Si l’INSERT échoue après un UPDATE réussi, l’utilisateur obtient le forfait Pro alors qu’aucun enregistrement de paiement correspondant n’existe.
Correctif : Exécuter les deux opérations, avec le marqueur d’idempotence, dans une transaction de base de données sur le même client, et tout annuler en cas d’erreur.
- moyenne
Le traitement ne tient pas compte du fait que Stripe peut livrer les événements en dehors de leur ordre de création. Un `invoice.paid` plus ancien arrivé en retard peut faire reculer `paid_until` ; un `customer.subscription.deleted` arrivé en retard peut repasser à `free` un utilisateur réactivé entre-temps.
Correctif : Rapprocher l’état actuel de l’abonnement à l’aide d’ID Stripe stables, par exemple en l’interrogeant chez Stripe, et persister les transitions d’état ou l’horodatage du dernier événement traité. Au minimum, ne mettre à jour `paid_until` que vers l’avant et ne pas appliquer aveuglément les événements de suppression à l’état actuel de l’utilisateur.
- moyenne
`amount_paid / 100` suppose sans vérification que la devise a exactement deux décimales. C’est faux, par exemple, pour le JPY. De plus, la devise n’est pas enregistrée avec le montant, si bien que celui-ci n’a pas d’unité univoque dans l’enregistrement de paiement.
Correctif : Enregistrer de préférence les montants inchangés dans la plus petite unité monétaire, avec `invoice.currency`. Si des unités monétaires principales sont nécessaires, effectuer la conversion à l’aide de l’exposant propre à chaque devise.
- moyenne
Absence de gestion des exceptions dans une route Express 4 asynchrone. En cas d’erreur de base de données ou de champs manquants, cela entraîne un rejet de promesse non géré, qui peut faire planter l’application.
Correctif : Ajoutez un bloc try-catch et transmettez les erreurs à next(err), ou utilisez un utilitaire comme express-async-handler.
- moyenne
Aucune validation de la présence de invoice.metadata.userId. Si le champ metadata ou userId est absent ou undefined, les requêtes SQL échouent ou travaillent avec des valeurs invalides.
Correctif : Vérifiez explicitement, avant d’exécuter les requêtes de base de données, que invoice.metadata et invoice.metadata.userId sont présents et valides.
- moyenne
Stripe répète les webhooks et peut livrer le même événement plus d’une fois. Chaque livraison insère une nouvelle ligne de paiement, si bien que les rapports de chiffre d’affaires comptent en double.
Correctif : Enregistrez event.id (ou l’ID de facture) avec une contrainte d’unicité et ignorez les événements déjà traités.
Axe : sécurité et exactitude d’un plugin d’import WooCommerce
Code envoyé :
<?php
// erp-import.php — custom plugin: imports the ERP's CSV export into WooCommerce (WordPress 6, WooCommerce 9)
add_action('wp_ajax_erp_import', 'erp_import');
add_action('wp_ajax_nopriv_erp_import', 'erp_import');
function erp_import() {
global $wpdb;
$path = $_POST['file'];
$rows = array_map('str_getcsv', file($path));
foreach ($rows as $row) {
[$sku, $name, $price, $stock] = $row;
$id = $wpdb->get_var("SELECT post_id FROM {$wpdb->postmeta} WHERE meta_key = '_sku' AND meta_value = '$sku'");
if (!$id) continue;
update_post_meta($id, '_price', $price);
update_post_meta($id, '_regular_price', $price);
update_post_meta($id, '_stock', $stock);
wp_update_post(['ID' => $id, 'post_title' => $name]);
}
echo 'Imported ' . count($rows) . ' rows';
wp_die();
}
- critique
L’import est accessible publiquement via `wp_ajax_nopriv_erp_import` ; même pour le hook authentifié, les vérifications de capability et de nonce manquent. Des utilisateurs anonymes ou des attaques CSRF peuvent ainsi modifier noms de produits, prix et stocks.
Correctif : Supprimer le hook `nopriv`, vérifier avant tout traitement une capability adaptée comme `manage_woocommerce` et sécuriser la requête avec `check_ajax_referer()`.
- critique
Le hook wp_ajax_nopriv_erp_import donne aux visiteurs non authentifiés accès à la fonction d’import.
Correctif : Supprimer le hook nopriv et vérifier l’autorisation au moyen de current_user_can('manage_options').
- critique
Le chemin de fichier issu de $_POST['file'] est transmis sans vérification à file(), ce qui permet le path traversal et la lecture arbitraire de fichiers (LFI).
Correctif : Gérer les envois de fichiers via $_FILES, ou valider strictement le chemin saisi en le limitant aux répertoires autorisés (p. ex. wp_upload_dir()).
- critique
Vulnérabilité d’injection SQL, car $sku est inséré directement dans la requête SQL sans être nettoyé.
Correctif : Utiliser des requêtes préparées avec $wpdb->prepare().
- critique
L’import est enregistré pour wp_ajax_nopriv, et il n’y a ni vérification de capability ni nonce. N’importe quel visiteur peut le déclencher et écraser prix, stocks et noms de produits.
Correctif : Supprimez le hook nopriv, vérifiez current_user_can('manage_woocommerce') et vérifiez un nonce avec check_ajax_referer() avant toute autre action.
- élevée
Le chemin fourni par le client est transmis sans vérification à `file()`. Cela permet de traiter n’importe quel fichier local lisible et, selon `allow_url_fopen`, des URL externes ou internes, ce qui rend possibles des accès indésirables aux fichiers et une SSRF aveugle.
Correctif : N’accepter aucun chemin librement choisi. Utiliser uniquement des ID d’envoi connus côté serveur, vérifier le chemin canonique par rapport à un répertoire d’import fixe et n’autoriser que des fichiers CSV locaux ordinaires.
- élevée
`$sku` provient du CSV et est interpolé directement dans le SQL. Une valeur de SKU contenant des métacaractères SQL peut manipuler la requête et, entre autres, choisir n’importe quel ID de post comme cible de la mise à jour.
Correctif : Paramétrer la requête avec `$wpdb->prepare()`, par exemple avec `meta_value = %s`, ou utiliser la fonction WooCommerce de recherche de produit par SKU.
- élevée
`file()` charge toute l’entrée en mémoire et `array_map()` crée en plus le tableau analysé complet. Sans limite de taille, une ressource distante volumineuse ou sans fin peut épuiser la mémoire, le temps d’exécution et les workers PHP ; l’accessibilité publique aggrave encore ce point.
Correctif : Limiter la taille du fichier et le nombre de lignes, ouvrir le fichier localement avec `fopen()` et traiter les enregistrements en streaming via `fgetcsv()`. Mettre en place en plus des limites de débit ou une tâche d’arrière-plan contrôlée.
- élevée
Absence de protection CSRF (validation de nonce).
Correctif : Appeler check_ajax_referer() au début de la fonction.
- élevée
Le chemin du fichier vient directement de la requête et est transmis à file(). Un attaquant peut lire n’importe quel fichier lisible par le serveur web, ou une URL distante si allow_url_fopen est activé.
Correctif : Acceptez un fichier envoyé via wp_handle_upload() ou lisez uniquement depuis un répertoire d’import fixe ; ne prenez jamais un chemin depuis la requête.
- moyenne
Le code suppose que chaque ligne possède exactement quatre colonnes exploitables. Les lignes vides ou endommagées produisent des valeurs manquantes, ce qui génère des avertissements et peut mettre involontairement le nom, le prix ou le stock à des valeurs vides.
Correctif : Vérifier le nombre de colonnes et les champs obligatoires avant la déstructuration, ignorer les lignes vides et rejeter les enregistrements erronés avec un message d’erreur clair.
- moyenne
La combinaison de `file()` et `str_getcsv()` analyse chaque ligne physique séparément. Des champs CSV valides contenant des sauts de ligne sont ainsi découpés en plusieurs enregistrements erronés.
Correctif : Lire le CSV en flux avec `fgetcsv()` ; cette fonction traite les champs multilignes correctement placés entre guillemets par-delà les limites d’enregistrement.
- moyenne
Le prix et le stock sont enregistrés sans vérification comme des chaînes quelconques. Des valeurs non numériques, de mauvais formats décimaux ou des stocks non admissibles peuvent endommager les données produit et conduire à des calculs incohérents.
Correctif : Valider le prix et le stock avant l’écriture et les normaliser avec des helpers WooCommerce comme `wc_format_decimal()` et `wc_stock_amount()` ; refuser les valeurs invalides ou non admissibles sur le plan métier.
- moyenne
Les données WooCommerce sont modifiées directement en tant que post meta. Les états associés comme `_stock_status`, les tables de lookup produit et, le cas échéant, les caches ne sont donc pas synchronisés de façon fiable avec les nouveaux prix et stocks.
Correctif : Charger le produit via `wc_get_product()`, utiliser les méthodes CRUD comme `set_regular_price()`, `set_price()` et `set_stock_quantity()`, définir le statut de stock ou `manage_stock` selon les règles métier, puis appeler `save()`.
- moyenne
La recherche par SKU examine toutes les métadonnées de post et ne vérifie ni le type de post ni si l’ID trouvé est réellement un produit ou une variation WooCommerce. En cas de métadonnées `_sku` en double ou détournées de leur usage, c’est en outre un résultat non déterministe qui est mis à jour.
Correctif : Utiliser `wc_get_product_id_by_sku()`, puis valider le résultat avec `wc_get_product()` ainsi qu’avec le type de produit attendu ; traiter les SKU en double comme des erreurs d’import.
- moyenne
Les valeurs de retour de `update_post_meta()` et `wp_update_post()` sont ignorées. L’import peut échouer en partie ou s’interrompre, mais il annonce malgré tout le nombre total de lignes lues comme importées avec succès.
Correctif : Consigner succès et erreurs par produit, utiliser `wp_update_post(..., true)`, ne compter que les enregistrements réellement mis à jour et renvoyer une réponse d’erreur structurée. Pour les gros imports, prévoir une tâche d’arrière-plan pouvant être reprise.
- moyenne
Pour chaque ligne CSV, au moins une requête de recherche et plusieurs opérations d’écriture individuelles sont exécutées de façon synchrone. Les gros imports entraînent donc de nombreux allers-retours avec la base de données, peuvent dépasser le délai de la requête et laisser un catalogue mis à jour seulement en partie.
Correctif : Exécuter l’import en lots limités, comme processus d’arrière-plan, résoudre les SKU de façon groupée et enregistrer la progression ainsi que l’état de reprise.
- moyenne
file() lit tout le fichier d’un coup en mémoire vive, ce qui entraîne des erreurs d’épuisement de la mémoire pour les gros fichiers CSV.
Correctif : Lire le fichier ligne par ligne en streaming via fopen() et fgetcsv().
- moyenne
La déstructuration de tableau suppose que chaque ligne contient au moins 4 éléments ; sinon, des warnings PHP ou des erreurs d’index non initialisé se produisent.
Correctif : Vérifier avec count($row), avant le dépaquetage, qu’il y a suffisamment de colonnes.
- moyenne
Les requêtes de base de données et les mises à jour de posts sont effectuées une par une dans une boucle (problème N+1), ce qui ralentit fortement l’exécution.
Correctif : Découper l’import en lots et regrouper les requêtes/mises à jour.
- faible
Les erreurs de `file()` ne sont pas vérifiées. Pour un chemin manquant, illisible ou non pris en charge, `file()` renvoie `false`, sur quoi `array_map()` peut lever une `TypeError` dans les versions actuelles de PHP.
Correctif : Vérifier explicitement l’ouverture et la lecture, ne pas utiliser les avertissements PHP comme flux de contrôle et, en cas d’erreur, renvoyer une réponse HTTP ou `wp_send_json_error()` appropriée.
Axe : sécurité et exactitude d’un flux de commande et de paiement
Code envoyé :
// routes/order.js — order endpoint of the bakery's ordering page (Node 20, Express 4, pg)
const express = require('express');
const { pool } = require('../db');
const { sendConfirmation } = require('../mail');
const router = express.Router();
router.post('/order', async (req, res) => {
const { cakeId, pickupDate, name, email, price, note } = req.body;
const cake = await pool.query(`SELECT * FROM cakes WHERE id = ${cakeId}`);
if (!cake.rows.length) return res.status(404).send('Unknown cake');
const order = await pool.query(
'INSERT INTO orders (cake_id, pickup_date, name, email, amount, note) VALUES ($1, $2, $3, $4, $5, $6) RETURNING id',
[cakeId, pickupDate, name, email, price, note]
);
sendConfirmation(email, order.rows[0].id);
res.redirect(`/pay?order=${order.rows[0].id}&amount=${price}`);
});
module.exports = router;
- critique
cakeId est interpolé directement dans la chaîne SQL. Un attaquant peut injecter des expressions SQL ou des instructions supplémentaires, et ainsi lire ou modifier des données, ou surcharger la base de données.
Correctif : Paramétrer aussi cette requête, p. ex. `SELECT ... FROM cakes WHERE id = $1` avec `[cakeId]`, et vérifier en plus que cakeId a le type attendu.
- critique
Vulnérabilité d’injection SQL due à l’interpolation directe de cakeId par template string dans la requête SQL.
Correctif : Utilisez une requête SQL paramétrée : pool.query('SELECT * FROM cakes WHERE id = $1', [cakeId]).
- critique
Manipulation du prix possible côté client. Le prix est repris de req.body, puis directement enregistré et traité.
Correctif : Lisez le prix côté serveur dans la base de données (cake.rows[0].price) et ne faites pas confiance à la valeur envoyée par le client.
- critique
cakeId, issu du corps de la requête, est interpolé dans la chaîne SQL : injection SQL.
Correctif : Utilisez une requête paramétrée : SELECT * FROM cakes WHERE id = $1.
- élevée
Le montant enregistré et transmis au flux de paiement provient entièrement de `req.body.price`. Un client peut saisir, pour n’importe quel gâteau, un montant manipulé, négatif ou très faible.
Correctif : Déterminer le prix exclusivement côté serveur, à partir du gâteau choisi ou d’une version de prix immuable. Créer chez le prestataire de paiement une session de paiement côté serveur avec ce montant, et vérifier à nouveau côté serveur le montant attendu lors de la confirmation du paiement.
- élevée
La commande est créée et une confirmation est envoyée avant qu’un quelconque paiement réussi ait été prouvé. Les opérations interrompues ou volontairement impayées apparaissent ainsi comme des commandes confirmées et peuvent être générées à volonté.
Correctif : Créer d’abord les commandes avec un statut tel que `pending_payment`. Ne passer à `paid` qu’après une notification authentifiée du prestataire de paiement, traitée de façon idempotente, puis envoyer la confirmation ou déclencher la production ou la réservation.
- élevée
Absence de gestion des erreurs dans une route Express 4 asynchrone. Les erreurs de base de données ou d’exécution entraînent des rejets de promesses non gérés.
Correctif : Utilisez un bloc try/catch et transmettez les erreurs avec next(err), ou utilisez un paquet comme express-async-errors.
- élevée
Le montant est pris côté client (price dans le corps de la requête) : un client peut donc fixer son propre prix.
Correctif : Lisez le prix côté serveur dans la ligne de la table cakes et ignorez toute valeur venant du client.
- moyenne
Le handler asynchrone ne transmet pas les erreurs. Express 4 ne traite pas automatiquement les promesses rejetées des handlers `async` ; des erreurs de base de données ou des erreurs synchrones d’envoi de mail peuvent donc entraîner des requêtes sans réponse et des rejets non gérés.
Correctif : Entourer le handler d’un `try/catch` et transmettre les erreurs à `next(err)`, ou utiliser un wrapper async éprouvé. Configurer en outre une gestion centralisée des erreurs.
- moyenne
Le résultat de `sendConfirmation` n’est ni attendu avec await ni traité d’une autre manière en cas d’erreur. Un rejet de promesse peut rester non géré ; en même temps, le client reçoit déjà une réponse de succès alors que l’envoi du mail a pu échouer.
Correctif : Effectuer l’envoi après confirmation du paiement via une outbox persistante ou une file de tâches avec nouvelles tentatives. Au minimum, attendre la promesse avec await et journaliser ou traiter les erreurs de façon contrôlée.
- moyenne
Il n’y a aucune protection d’idempotence. Les répétitions du navigateur, les doubles clics ou les nouvelles tentatives réseau créent chacun une nouvelle commande et, le cas échéant, plusieurs confirmations ou tentatives de paiement.
Correctif : Accepter une clé d’idempotence ou un ID de session de checkout, la protéger par une contrainte d’unicité et, en cas de répétition, renvoyer la commande déjà existante.
- moyenne
pickupDate, name, email, price et note sont traités sans validation métier ni syntaxique. Des dates de retrait passées ou invalides, des données client manquantes et des valeurs de champ inadaptées peuvent ainsi être enregistrées ; de plus, les erreurs de base de données ne surviennent que tard et de façon incontrôlée.
Correctif : Utiliser un schéma de requête avec types, champs obligatoires, limites de longueur et formats normalisés. Vérifier les dates de retrait au regard du fuseau horaire, du délai de préparation et des règles d’ouverture ou de capacité applicables ; ne pas accepter le prix comme saisie du client.
- moyenne
L’appel asynchrone de sendConfirmation n’est ni attendu avec await ni protégé contre les erreurs.
Correctif : Placez await devant sendConfirmation et gérez les erreurs possibles lors de l’envoi de l’e-mail.
- faible
Validation incomplète des entrées pour des champs comme email, pickupDate, name et note.
Correctif : Mettez en place une validation par schéma (p. ex. avec Zod ou express-validator) avant de traiter les données de la requête.
Axe : exactitude et intégrité des données d’une fonction de facturation
Code envoyé :
// billing/applyCredit.ts — billing module in the monolith (TypeScript, node-postgres)
import { pool } from '../db';
export async function applyCredit(customerId: string, invoiceId: string, creditCents: number) {
const inv = await pool.query('SELECT total_cents, status FROM invoices WHERE id = $1', [invoiceId]);
const balance = await pool.query('SELECT credit_cents FROM customers WHERE id = $1', [customerId]);
const available = balance.rows[0].credit_cents;
if (creditCents > available) throw new Error('Not enough credit');
const newTotal = inv.rows[0].total_cents - creditCents;
await pool.query('UPDATE invoices SET total_cents = $1 WHERE id = $2', [newTotal, invoiceId]);
await pool.query('UPDATE customers SET credit_cents = credit_cents - $1 WHERE id = $2', [creditCents, customerId]);
if (newTotal <= 0) {
await pool.query("UPDATE invoices SET status = 'paid' WHERE id = $1", [invoiceId]);
}
return newTotal * 1.19 / 100;
}
- critique
Absence de transaction de base de données et de verrou de ligne. Lors de requêtes parallèles, des race conditions (p. ex. double dépense du crédit) et, en cas d’erreur, des mises à jour incomplètes peuvent survenir.
Correctif : Utilisez un client du pool avec BEGIN/COMMIT et employez SELECT FOR UPDATE pour verrouiller et mettre à jour les lignes de façon atomique.
- élevée
Les trois mises à jour liées ne sont pas exécutées dans une transaction de base de données. Si le débit du crédit client ou le changement de statut échoue, la facture peut déjà avoir été réduite sans que le crédit ait été correctement débité ou que le statut ait été défini.
Correctif : Obtenir un client dédié du pool et exécuter toutes les vérifications et mises à jour entre BEGIN et COMMIT ; utiliser ROLLBACK en cas d’erreur.
- élevée
La facture est d’abord lue, puis écrasée plus tard avec une valeur calculée en absolu. Deux appels parallèles peuvent lire la même valeur de départ, puis s’écraser mutuellement ; les deux débits de crédit ont pourtant lieu, alors qu’une seule imputation reste entièrement visible dans la facture.
Correctif : Verrouiller la facture concernée dans la même transaction avec SELECT ... FOR UPDATE, ou modifier le montant de façon atomique via UPDATE ... SET total_cents = total_cents - $1 avec des conditions adaptées.
- élevée
La vérification et le débit du crédit client ne sont pas atomiques. Des appels parallèles peuvent voir tous deux la même couverture disponible, puis faire passer le crédit sous zéro.
Correctif : Verrouiller l’enregistrement client de manière transactionnelle ou utiliser un UPDATE conditionnel, par exemple UPDATE customers SET credit_cents = credit_cents - $1 WHERE id = $2 AND credit_cents >= $1 RETURNING credit_cents, et exiger exactement une ligne renvoyée.
- élevée
Le code ne vérifie pas que la facture appartient au client indiqué. Le crédit d’un client peut ainsi être appliqué à n’importe quelle facture désignée par invoiceId.
Correctif : Interroger et mettre à jour la facture et le client via la relation de propriété, par exemple avec WHERE invoices.id = $1 AND invoices.customer_id = $2 ; interrompre en l’absence de correspondance.
- élevée
Le crédit à appliquer n’est pas limité au montant restant dû de la facture. Si creditCents est supérieur à total_cents, un montant de facture négatif est enregistré et du crédit client excédentaire est consommé.
Correctif : N’autoriser que des montants allant jusqu’à la valeur restant due de la facture, ou déterminer le montant réellement utilisé comme min(creditCents, total_cents) et ne débiter que celui-ci du crédit client.
- élevée
Les valeurs négatives, non entières ou non représentables de façon sûre ne sont pas rejetées. En particulier, une valeur creditCents négative augmente le montant de la facture et en même temps, par la soustraction d’une valeur négative, le crédit client.
Correctif : Avant tout accès à la base de données, exiger Number.isSafeInteger(creditCents) && creditCents > 0 ; traiter systématiquement les montants comme des valeurs entières en centimes.
- élevée
Le statut de facture lu est entièrement ignoré. Du crédit peut ainsi être appliqué même à des factures déjà payées, annulées ou qui ne sont plus modifiables pour une autre raison ; un justificatif déjà payé peut de ce fait devenir négatif.
Correctif : Définir explicitement les statuts de départ admissibles et les vérifier de façon atomique dans la condition de l’UPDATE, par exemple AND status = 'open'. En l’absence de résultat, interrompre l’opération.
- élevée
Accès à balance.rows[0] et inv.rows[0] sans vérification préalable. Si un client ou une facture est introuvable, l’application plante avec une TypeError non gérée.
Correctif : Vérifiez inv.rows.length et balance.rows.length avant l’accès et levez un message d’erreur explicite.
- élevée
Absence de validation des valeurs négatives pour creditCents. Une valeur négative contourne la vérification (creditCents > available) et entraîne des ajustements erronés du crédit ou de la facture.
Correctif : Assurez-vous que creditCents est un entier positif supérieur à 0.
- élevée
Les lectures et les trois mises à jour s’exécutent hors transaction et sans verrous de ligne. Deux appels simultanés peuvent tous deux passer la vérification du crédit et dépenser deux fois le même crédit, et un plantage entre les mises à jour laisse la facture et le solde de crédit incohérents.
Correctif : Exécutez tout dans une seule transaction sur un même client, verrouillez les lignes avec SELECT ... FOR UPDATE et ne validez qu’une fois toutes les mises à jour réussies.
- élevée
La fonction ne vérifie jamais que la facture appartient au client ni qu’elle est encore ouverte. Le crédit d’un client peut être appliqué à la facture d’un autre client, ou à une facture déjà payée.
Correctif : Sélectionnez la facture avec WHERE id = $1 AND customer_id = $2 AND status = 'open' et échouez si aucune ligne n’est renvoyée.
- moyenne
L’existence de la facture et du client n’est pas vérifiée. Pour des ID inconnus, les accès à rows[0] entraînent des erreurs d’exécution au lieu d’une erreur métier contrôlée ; en outre, les deux requêtes sont exécutées inutilement avant que le problème n’apparaisse.
Correctif : Vérifier rowCount ou rows.length pour les deux requêtes et lever une erreur not-found définie ; intégrer la vérification dans la transaction et, si possible, dans une requête relationnelle.
- moyenne
La valeur de retour ne correspond ni au montant en centimes enregistré ni à une simple conversion dans l’unité monétaire principale : elle ajoute forfaitairement 19 pour cent et utilise l’arithmétique à virgule flottante. L’appelant peut ainsi recevoir une valeur différente, sur le plan fiscal et de l’arrondi, du reste de facture réellement enregistré.
Correctif : Renvoyer inchangé le montant restant en centimes, ou définir une valeur de retour clairement typée. Si un calcul de taxe est nécessaire sur le plan métier, tirer le taux de taxe et la règle d’arrondi des données de la facture et calculer en arithmétique entière ou décimale.
- moyenne
Utilisation de l’arithmétique à virgule flottante IEEE 754 (newTotal * 1.19 / 100) pour des calculs financiers. Cela entraîne des erreurs de précision et d’arrondi.
Correctif : Calculez systématiquement en centimes avec des entiers (BigInt/Math.round) ou utilisez une bibliothèque d’arithmétique décimale exacte.
- faible
Une commande UPDATE séparée pour le statut de la facture crée des allers-retours inutiles avec la base de données.
Correctif : Regroupez la mise à jour de total_cents et de status dans une seule requête UPDATE.
Axe : exactitude d’une analyse de sélection pour une revue systématique
Code envoyé :
# screening/agreement.py — compares two screeners' include/exclude decisions (Python 3.12, pandas)
import pandas as pd
a = pd.read_csv('screener_a.csv') # columns: record_id, decision ('include'/'exclude')
b = pd.read_csv('screener_b.csv')
merged = a.merge(b, on='record_id', suffixes=('_a', '_b'))
agree = (merged.decision_a == merged.decision_b).mean()
p_inc_a = (merged.decision_a == 'include').mean()
p_inc_b = (merged.decision_b == 'include').mean()
expected = p_inc_a * p_inc_b + (1 - p_inc_a) * (1 - p_inc_b)
kappa = (agree - expected) / (1 - expected)
conflicts = merged[merged.decision_a != merged.decision_b]
excluded = merged[merged.decision_a == 'exclude']
print(f'Records screened: {len(a)}')
print(f"Cohen's kappa: {kappa:.2f}")
excluded.record_id.to_csv('excluded.csv', index=False)
conflicts.to_csv('conflicts.csv', index=False)
- élevée
La jointure interne par défaut supprime toutes les valeurs record_id qui n’apparaissent que dans l’un des deux fichiers. Le kappa et les conflits ne sont donc calculés que sur l’intersection, sans rendre visibles les sélections manquantes. En même temps, « Records screened » à la ligne 18 indique la longueur de a au lieu de l’intersection réellement analysée.
Correctif : Utiliser une jointure externe avec indicateur de merge, comparer explicitement les ensembles d’ID et signaler séparément les décisions manquantes, ou les traiter comme des erreurs de données. Pour chaque indicateur, afficher le dénominateur réellement utilisé.
- élevée
L’unicité de record_id n’est pas vérifiée. Des ID en double conduisent, lors du merge, à un produit cartésien many-to-many et pondèrent plusieurs fois certaines études, ce qui fausse la concordance, les prévalences, le kappa et les fichiers de sortie.
Correctif : Avant le merge, vérifier dans les deux fichiers que record_id n’est pas nul et est unique, et interrompre en cas de doublons. Utiliser en plus merge(..., validate='one_to_one').
- élevée
Les valeurs de décision ne sont pas validées. Les valeurs manquantes, fautes de frappe, différences de casse ou catégories supplémentaires sont traitées implicitement comme « exclude » lors du calcul de la prévalence des inclusions, tandis que la concordance observée compare des valeurs exactes. Le calcul ne correspond alors plus à un kappa de Cohen binaire et peut produire des résultats contradictoires.
Correctif : Normaliser decision de façon contrôlée avant l’analyse et s’assurer que chaque valeur vaut exactement 'include' ou 'exclude'. Traiter séparément les valeurs manquantes ou inconnues comme des erreurs de données ou une sélection incomplète.
- élevée
excluded contient tous les enregistrements exclus par l’examinateur A, y compris les conflits dans lesquels l’examinateur B a décidé « include ». Ces enregistrements sont donc écrits à la fois dans excluded.csv et dans conflicts.csv. Si excluded.csv doit représenter les références définitivement exclues, des conflits non résolus peuvent être retirés à tort de la revue.
Correctif : En l’absence de règle de priorité documentée, ne sélectionner que les exclusions concordantes, soit (decision_a == 'exclude') & (decision_b == 'exclude'). Conserver les conflits uniquement dans conflicts.csv jusqu’à la décision par consensus.
- élevée
Filtrage erroné des études exclues : 'excluded' ne tient compte que de la décision de l’examinateur A ('merged.decision_a == "exclude"'). En cas de conflit (l’examinateur A exclut, l’examinateur B inclut), l’étude est comptée à tort comme exclue.
Correctif : N’exporter les exclusions que si les deux examinateurs ont choisi 'exclude' de façon concordante (p. ex. '(merged.decision_a == "exclude") & (merged.decision_b == "exclude")'), ou attendre la résolution du conflit.
- élevée
excluded.csv contient chaque enregistrement exclu par l’examinateur A, y compris les conflits où l’examinateur B l’a inclus. Ces enregistrements sont écartés avant la discussion des conflits, ce qui est exactement la fausse exclusion que le protocole doit éviter.
Correctif : N’excluez que les enregistrements exclus par les deux examinateurs : merged[(merged.decision_a == 'exclude') & (merged.decision_b == 'exclude')] ; envoyez d’abord chaque conflit en résolution.
- moyenne
Si les deux examinateurs n’utilisent que la même catégorie, expected vaut 1 et le dénominateur du kappa vaut 0. Le résultat devient NaN ou peut produire un avertissement de division par zéro ; la sortie formatée « nan » n’explique pas que le kappa n’est mathématiquement pas défini. Une intersection analysée vide conduit elle aussi à des indicateurs NaN non significatifs.
Correctif : Avant la division, vérifier qu’il existe bien des décisions valides appariées et que 1 - expected est supérieur à 0. Dans les cas dégénérés, indiquer explicitement le kappa comme « non défini » et rapporter les fréquences sous-jacentes.
- moyenne
Division par zéro possible pour le kappa de Cohen lorsque la valeur attendue par hasard 'expected' vaut 1 (p. ex. lorsque les deux examinateurs choisissent la même catégorie pour 100 % des enregistrements).
Correctif : Intercepter avant le calcul le cas '1 - expected == 0' et attribuer alors une valeur définie (p. ex. 1.0 ou NaN).
- moyenne
Rejet silencieux d’enregistrements par la jointure interne par défaut. Si l’examinateur A et l’examinateur B ont évalué des ensembles différents de 'record_id', les divergences dans les études traitées ne sont pas signalées. De plus, 'len(a)' dans la sortie console ne correspond alors pas au nombre d’études réellement appariées.
Correctif : Vérifier que 'len(a) == len(b) == len(merged)' est vrai, ou effectuer une jointure externe afin d’afficher explicitement les enregistrements évalués de façon incomplète.
- moyenne
Le merge interne écarte silencieusement les enregistrements qu’un seul examinateur a tranchés, et le nombre affiché utilise len(a). Les enregistrements non examinés disparaissent à la fois de la concordance et des chiffres PRISMA.
Correctif : Faites le merge avec how='outer', indicator=True, et échouez ou signalez-le dès qu’un enregistrement n’a pas de décision de l’un ou l’autre examinateur.
- faible
Absence de nettoyage des entrées et de traitement des valeurs manquantes dans la colonne 'decision'. La casse, les espaces ou les valeurs NaN entraînent des comparaisons erronées.
Correctif : Nettoyer les valeurs de colonne avant la comparaison (p. ex. avec '.str.strip().str.lower()') et garantir la sûreté des types de données.
Affichés : chaque constat confirmé avec son correctif, tels que les membres les ont rédigés ; le raisonnement des vérificateurs est réduit à leur verdict. Les doublons ne sont pas fusionnés : un même problème peut donc apparaître plusieurs fois lorsque plusieurs membres le signalent. Le code, l’axe et les constats propres à Claude ont été envoyés en anglais, et les membres ont rédigé leurs constats en allemand ; l’axe et tous les constats sont traduits ici.
Cinq briefs d’idées de domaines différents. ChatGPT et Gemini travaillent sur trois pistes, Claude ajoute une idée, et les deux membres notent chaque idée anonymement (de 1 à 10 chacun, jusqu’à 20 points). Choisissez-en un.
Sujet : Idées pour qu’un développeur solo transforme davantage de lecteurs de deux articles de blog bien classés sur Google en inscriptions à l’essai d’un outil de facturation pour freelances
Contexte envoyé : Outil de facturation pour freelances, 19 USD par mois, essai gratuit de 14 jours, 30 clients payants après 5 mois. Les inscriptions viennent surtout de deux articles de blog qui se classent sur Google (comment rédiger une facture de freelance ; comment relancer les retards de paiement). Environ 12 % des essais se convertissent. Le développeur a un emploi principal et environ 10 heures par semaine pour le produit. IMPÉRATIF : aucune publicité payante. IMPÉRATIF : au plus 3 heures par semaine pour ceci.
- 1
Remplacer le compte à rebours de 14 jours par trois vrais envois
Tester un essai qui se termine après trois factures ou relances de paiement envoyées, plutôt qu’après 14 jours calendaires. Cela enfreint délibérément l’hypothèse souple selon laquelle un essai limité dans le temps est approprié : les freelances ne facturent pas forcément pendant une fenêtre arbitraire de deux semaines, si bien que l’essai actuel peut expirer avant que le produit ait prouvé sa valeur. Garder inchangé le forfait mensuel à 19 $ et comparer, par cohorte, la conversion de l’activation au paiement.
- 2
Accomplir la tâche dans l’article
Intégrer un mini-générateur de factures dans « comment rédiger une facture de freelance » : les lecteurs saisissent client, montant, date d’échéance et conditions de paiement, puis voient un aperçu terminé. « Envoyer ou enregistrer cette facture » crée un essai avec ces informations déjà chargées, ce qui supprime l’écart entre apprendre et faire. Le construire par tranches hebdomadaires plafonnées à trois heures, puis maintenir l’entretien proche de zéro.
- 3
Transformer l’article sur les relances en console de recouvrement
Comme substitution en une étape du générateur de factures intégré, permettre aux lecteurs de saisir un montant en souffrance et une date d’échéance pour générer une séquence de relance datée en trois messages. Démarrer un essai enregistre le débiteur, planifie les messages et ouvre le premier brouillon prêt à l’envoi. Cela préserve le motif le plus fort — un résultat utile avant l’inscription — tout en correspondant à l’intention du second article.
- 4
Placer le moment de conversion dans le calendrier du débiteur
Proposer dans l’article sur les retards de paiement un fichier .ics généré, avec des rappels pour la date d’échéance et des relances de plus en plus fermes aux jours 1, 7 et 14. Chaque événement du calendrier contient un lien profond qui ouvre le workflow de relance correspondant avec les dates pré-remplies, ramenant le lecteur au moment où le problème est réel plutôt que lorsqu’il ne fait que se renseigner. Cela ne nécessite aucune collecte d’adresses e-mail et peut fonctionner sans surveillance.
- 5
Forfait gratuit permanent pour un client au lieu d’une période d’essai
Cette idée enfreint la contrainte souple de la version d’essai de 14 jours et la remplace par un forfait freemium pour exactement un client actif. Les freelances utilisent le produit gratuitement et durablement pour leur premier client, et passent sans heurt au forfait à 19 dollars dès qu’un deuxième client s’ajoute.
- 6
Orienter les lecteurs selon leur problème immédiat
Remplacer les bannières d’essai génériques par trois choix intégrés au texte, comme « J’ai besoin de ma première facture », « Je facture régulièrement » et « Un client est déjà en retard ». Chaque choix ouvre un état d’onboarding correspondant plutôt que la même page d’accueil, et les ID de section de l’article peuvent présélectionner des valeurs par défaut pertinentes. Mesurer l’activation effective de l’essai, pas seulement les clics sur le CTA, et tester un parcours par semaine.
- 7
Publier trois relookings de factures analysés à la loupe
Avec autorisation, transformer trois factures de clients anonymisées en études de cas statiques avant/après montrant exactement ce qui a changé et pourquoi. Insérer chaque relooking à côté du conseil correspondant dans l’article bien classé, avec un CTA qui ouvre la même structure corrigée sous forme de modèle d’essai modifiable. Des preuves précises issues d’une petite base de clients peuvent être plus crédibles que des témoignages généraux.
- 8
Permettre aux lecteurs d’emporter leur progression d’un article à l’autre
Enregistrer localement dans le navigateur la devise choisie par le lecteur, l’étape de la facture et la date d’échéance, puis utiliser cet état lorsqu’il passe d’un article à l’autre. Quelqu’un qui a créé un plan de facture peut ensuite voir une invite contextuelle comme « Votre facture a maintenant 3 jours de retard — ouvrez la relance préparée », avec un onboarding d’essai pré-rempli. Cela crée un parcours léger sur deux articles sans exiger de compte ni de production continue de contenu.
- 9
Configurateur interactif de lettres de relance
Complétez l’article sur la relance des paiements en retard par un générateur de lettres de relance graduées. Après la saisie du texte, le modèle est généré, combiné avec le CTA invitant à configurer, dans l’accès d’essai, des rappels de paiement automatiques pour les factures futures.
- 10
Lien magique d’envoi immédiat sans inscription préalable
Mutation du générateur intégré au contenu : le lecteur saisit les données de facture directement dans l’article de blog et clique sur Envoyer la facture immédiatement. Le système crée sans heurt, en arrière-plan, un compte d’essai et envoie directement l’e-mail ; le mot de passe n’est défini qu’ensuite.
- 11
Générateur de factures en direct dans l’article de blog
Intégrez un outil de formulaire simple et interactif directement dans l’article sur la rédaction des factures. Les lecteurs saisissent leurs données de facture et peuvent télécharger immédiatement et gratuitement le PDF terminé. Un bouton bien visible propose d’envoyer la facture numériquement en un clic et de suivre le statut du paiement dans l’accès d’essai de 14 jours.
- 12
Relance ponctuelle payée à l’usage au lieu d’un abonnement mensuel
Cette idée enfreint la contrainte souple du modèle d’abonnement SaaS pur à 19 dollars par mois. Les lecteurs de l’article sur les retards de paiement peuvent, moyennant des frais uniques de 5 dollars, faire envoyer une lettre de relance juridiquement solide avec un lien de suivi, les frais étant entièrement déduits en cas de souscription ultérieure d’un abonnement.
- 13
Un modèle qui s’ouvre dans l’outil
Proposer le modèle de facture de l’article comme facture prête à l’emploi dans l’outil : un clic ouvre un compte d’essai pré-rempli au lieu d’un téléchargement de fichier.
- 14
Exit-intent axé sur le problème avec séquence d’e-mails automatisée
Mettez en place sur l’article sur les retards de paiement une pop-up d’exit-intent qui propose, en échange d’une adresse e-mail, un modèle d’e-mail d’urgence pour les clients en retard de paiement. Une séquence automatisée de trois e-mails explique ensuite de façon passive comment des workflows automatisés réduisent les retards de paiement, et renvoie vers l’accès d’essai.
Sujet : Idées pour qu’une petite agence digitale transforme une refonte ponctuelle de boutique en contrat de maintenance récurrent que le client souhaite vraiment
Contexte envoyé : Agence de 4 personnes. Le client vend environ 1 800 produits de mobilier en Allemagne, en Autriche et en Suisse, compte 3 employés et aucun développeur interne, pour un chiffre d’affaires d’environ 1,2 million d’EUR par an. L’ancienne boutique WooCommerce auto-hébergée comptait 31 plugins et a subi deux incidents de sécurité l’an dernier ; le client veut moins de maintenance et moins d’urgences. Un ERP local exporte les données produit en CSV. Budget de la refonte : 25 000 EUR. IMPÉRATIF : aucun verrouillage ; le client doit pouvoir partir à tout moment avec toutes les données et tous les accès. IMPÉRATIF : aucune embauche supplémentaire à l’agence.
- 1
Rupture de budget : l’exploitation avant l’éclat du lancement
Cette idée enfreint délibérément la contrainte souple du budget de refonte de 25 000 EUR : on propose par exemple 22 000 EUR pour un lancement volontairement épuré, plus 12 000 EUR pour une première année d’exploitation contractuellement engagée. En contrepartie, les fonctionnalités « nice-to-have » sont retirées du projet initial ; on finance à la place le durcissement de l’import, des tests de restauration, la surveillance et des améliorations mensuelles. Le volume total plus élevé en vaut la peine, car le client n’achète pas à nouveau une boutique apparemment terminée dont les coûts d’exploitation réels n’apparaissent qu’après le lancement ; tous les accès, données et livrables restent transférables à tout moment.
- 2
Contrôleur d’entrée des produits CSV
Avant chaque import depuis l’ERP, un pipeline automatisé vérifie le CSV : prix manquants, doublons, variantes invalides, erreurs d’images, logique fiscale DACH et variations de stock suspectes. Le contrat mensuel comprend la maintenance des règles, la surveillance des imports et un rapport d’erreurs compréhensible pour les trois employés. La maintenance technique devient ainsi un bénéfice commercial direct : moins de produits erronés, de demandes de précision et d’achats abandonnés.
- 3
Dividende de fiabilité
Le client paie un forfait de base modéré pour la surveillance et la maintenance ; un montant trimestriel supplémentaire n’est dû que si des objectifs de fiabilité convenus, comme des imports réussis, une restauration testée et des délais de réaction, ont été atteints. Les pannes évitables causées par l’agence génèrent des avoirs de service au lieu d’heures d’urgence facturables. Ce modèle aligne les incitations économiques sur la prévention et ôte au client la crainte que l’agence profite des problèmes.
- 4
Charte de maintenance prête pour la sortie
Le contrat est délibérément vendu comme un produit anti-verrouillage : surveillance, mises à jour, sauvegardes, contrôles de sécurité et deux petites modifications par mois pour environ 1 200–1 500 EUR. Tous les comptes appartiennent au client, le code et les scripts d’import sont dans son dépôt ; il reçoit en outre chaque mois une documentation, un export des données et un dossier de passation utilisable en cas de résiliation. Le client paie ainsi pour une capacité d’exploitation démontrable plutôt que pour une dépendance.
- 5
Train de versions saisonnier
Au lieu de tickets de support au fil de l’eau, il y a quatre versions commerce planifiables par an, par exemple pour le mobilier de jardin, la fin de l’été, la Black Week et Noël. Le contrat inclut pour chaque version un petit lot UX ou merchandising, des tests de régression ainsi que la maintenance technique entre deux versions. Le client voit ainsi un développement visible, et l’effort reste regroupable pour l’agence de quatre personnes.
- 6
Le test de sortie trimestriel
Une fois par trimestre, l’agence fournit un export complet des données produits, clients, commandes et contenus, et effectue dans un environnement de test neutre un redémarrage documenté. Ce que l’on paie, c’est précisément la sortie régulièrement prouvée : la liste des accès, le protocole de restauration et le manuel de passation appartiennent au client. Le critère strict d’absence de verrouillage passe ainsi du statut d’objection à celui d’argument de vente inhabituel pour le contrat.
- 7
Charte de maintenance plus bourse de croissance
Petite mutation de la Charte de maintenance prête pour la sortie : les heures de modification incluses ne sont pas planifiées de façon fixe, mais réparties chaque mois entre exploitation, qualité des données et améliorations de la conversion ; le volume non utilisé est reporté d’un trimestre au plus. Un comité commun de 30 minutes décide de leur affectation en fonction des risques et des opportunités de chiffre d’affaires. Le contrat reste prêt pour la sortie, mais ressemble moins à une assurance et davantage à une équipe digitale externe flexible.
- 8
Contrat de synchronisation ERP et de sécurité du catalogue
L’agence prend en charge la surveillance et la maintenance continues de l’interface entre le CSV de l’ERP local et la boutique en ligne. Les imports de données erronés, les variantes de meubles manquantes ou les prix faux sont interceptés automatiquement avant leur mise en ligne. Cela décharge entièrement l’équipe client de 3 personnes de la charge opérationnelle de la gestion des données.
- 9
Forfait d’enrichissement des données produit assisté par IA
Mutation de l’idée d’interface ERP : l’agence ne se contente pas de maintenir l’import CSV, elle enrichit automatiquement les données brutes, au moyen de scripts d’IA, d’attributs structurés, de textes SEO et d’indications de délais de livraison propres à la région DACH. Cela épargne au client un travail de saisie manuel et accroît la visibilité sur le marché du meuble sans embauche supplémentaire à l’agence.
- 10
Contrat de maintenance avec régression visuelle basée sur CI/CD
Au lieu de mises à jour risquées en production, l’agence met en place un pipeline de staging qui vérifie de façon automatisée, visuellement et fonctionnellement, les mises à jour mensuelles des plugins. Le client reçoit un rapport de transparence mensuel et des délais de réaction garantis en cas de failles de sécurité. Cela garantit une stabilité absolue sans les urgences passées.
- 11
Peaufinage trimestriel de la conversion et de l’UX
En complément de la maintenance de base, le contrat comprend des contingents d’heures fixes pour l’optimisation des fonctions de checkout et de l’affichage des variantes de meubles. L’agence analyse chaque mois le comportement des utilisateurs dans la région DACH et met en œuvre des ajustements à fort rendement. Le contrat passe ainsi de simple poste de coût à moteur de chiffre d’affaires.
- 12
Garantie de mise à jour sûre et de rollback instantané
Mutation du contrat de maintenance CI/CD : le contrat se concentre exclusivement sur un SLA garanti zéro interruption, avec restauration automatisée de snapshot en 15 minutes en cas d’incident. Cela répond directement à la crainte du client après les deux incidents de sécurité, avec un effort manuel courant minimal.
- 13
Pack croissance avec participation au chiffre d’affaires au lieu d’un budget fixe
Enfreint l’hypothèse souple d’un budget de refonte unique et rigide de 25 000 EUR : les coûts de refonte sont abaissés à 10 000 EUR, couplés à un contrat mensuel avec une petite participation au chiffre d’affaires supplémentaire. Cela en vaut la peine, car le client réduit son risque d’investissement et l’agence participe directement à la croissance de la boutique à 1,2 million d’EUR.
- 14
Service de maintenance à architecture headless
Enfreint la contrainte souple d’une configuration monolithique classique (comme WooCommerce standard) : le frontend est découplé du backend, si bien que les failles de sécurité des plugins ne peuvent plus attaquer directement le site. Cela en vaut la peine, car les urgences sont éliminées structurellement et le client reste portable à tout moment grâce à la stack open source et à un accès Git complet.
- 15
Rapport de maintenance mensuel d’une page
Un rapport mensuel d’une page avec la disponibilité, la vitesse des pages, les mises à jour appliquées et les incidents évités, pour que le client voie ce que paie le contrat.
Sujet : Idées pour qu’une boulangerie locale obtienne plus de précommandes de gâteaux sur mesure via sa nouvelle page de commande en ligne, sans publicité payante
Contexte envoyé : Boulangerie de 6 employés dans une ville allemande de 40 000 habitants. Les gâteaux sur mesure et les précommandes dégagent la meilleure marge. Une nouvelle page de commande en ligne (choix du gâteau, date de retrait, prépaiement) sera mise en ligne le mois prochain ; jusqu’ici, les commandes arrivaient uniquement par téléphone et par e-mail. Le profil Google Business affiche 4,7 étoiles pour 120 avis. Le propriétaire a peu de temps : les idées doivent donc fonctionner avec au plus 2 heures par semaine. IMPÉRATIF : aucune publicité payante ce trimestre. IMPÉRATIF : aucun personnel supplémentaire.
- 1
Le pilote automatique annuel des anniversaires
Au moment du paiement, les clientes et clients peuvent indiquer volontairement l’occasion et le mois pour un rappel l’année suivante. Un e-mail automatisé envoyé 21 jours avant mène à la page de commande pré-remplie ; chaque commande prépare ainsi une commande future, sans prospection continue et avec un consentement en bonne et due forme.
- 2
De vrais créneaux de gâteaux plutôt que des posts généraux
La page de commande affiche les créneaux de production réellement restants sur les quatre prochaines semaines, par exemple « Encore 2 gâteaux personnalisés possibles pour samedi ». Un post hebdomadaire sur Google Business renvoie directement vers cette vue ; la mise à jour et le post prennent ensemble 20 minutes au plus et créent une urgence crédible, sans remise.
- 3
Le gâteau voyage comme son propre support publicitaire
Chaque gâteau retiré reçoit une petite carte « Commander à nouveau ou adapter ce gâteau » avec un code QR menant à la variante correspondante. La carte est posée bien en vue au moment de la découpe, si bien que ce sont précisément les invités présents à l’anniversaire ou au mariage qui découvrent le chemin de commande ; un jeu de cartes créé une seule fois ne demande quasiment aucun effort hebdomadaire.
- 4
Une permanence gâteaux unique pour le lancement
Le premier samedi après le lancement, une permanence gâteaux ouverte a lieu pendant quatre heures : les visiteurs choisissent goût et style à l’aide de cartes d’échantillons, puis passent eux-mêmes leur commande via des codes QR mis à disposition. Cela enfreint délibérément la contrainte souple d’au plus deux heures d’effort cette semaine-là ; l’effort supplémentaire en vaut la peine, car il produit en même temps de vraies commandes, des problèmes d’utilisation observés et des photos ou questions de clients réutilisables — sans personnel supplémentaire ni publicité payante.
- 5
Des partenaires d’occasion plutôt que des influenceurs
Lieux de jeux pour enfants, photographes, fleuristes, lieux de mariage et locaux associatifs reçoivent chacun un petit présentoir à code QR menant à une sélection de gâteaux préconfigurée pour leur occasion. En contrepartie, la boulangerie cite ces partenaires sur une page locale de recommandations ; cinq demandes ciblées par mois suffisent, sans commissions ni portée payante.
- 6
Un roulement de gâteaux pour bureaux et associations
Les bureaux, cabinets et associations locaux disposent d’une page où plusieurs anniversaires ou rendez-vous récurrents peuvent être regroupés et prépayés les uns après les autres. Des roulements trimestriels, une fois mis en place, transforment des occasions isolées en commandes en série planifiables ; la prospection peut être limitée à deux organisations par semaine.
- 7
Permanence gâteaux hybride sur la tablette de la boutique
Enfreint délibérément la contrainte souple « Commande exclusivement en ligne » en proposant le vendredi 1 heure de conseil en boutique, pendant laquelle les commandes sont saisies ensemble sur la tablette. Cela en vaut la peine, car les clients indécis et plus âgés sont familiarisés pas à pas avec le nouveau système en ligne.
- 8
Les avis deviennent une aide au choix
Petite recombinaison du matériau existant le plus fort : douze phrases parlantes tirées des 120 avis Google sont associées à des styles de gâteaux correspondants, chacune avec un lien de commande direct. Les 4,7 étoiles ne sont ainsi pas seulement affichées comme signal de confiance, elles aident au choix du produit ; après une mise en place unique, la page ne demande pratiquement aucune maintenance.
- 9
Présentoir de gâteaux modèles avec liens profonds vers la boutique
Une galerie photo physique des plus beaux gâteaux, dans l’espace de vente, comporte pour chaque image un code QR spécifique qui ouvre la boutique en ligne avec exactement ce modèle de gâteau présélectionné. Mutation de l’idée 1 : relier l’exposition en boutique à un lien profond direct dans la boutique en ligne.
- 10
Optimisation du profil Google et liens d’avis automatisés
Le solide profil Google (4,7 étoiles) est complété par le bouton officiel « Commander en ligne » et alimenté chaque semaine avec une photo de gâteaux récents. Lors du retrait, les clients reçoivent un modèle par e-mail avec un lien vers la page d’avis et de nouvelle commande. Prend moins de 30 minutes par semaine.
- 11
Code QR d’accroche sur les tickets de caisse et les sacs à pain
Un code QR bien visible est imprimé sur chaque ticket de caisse et sur les emballages, menant directement au configurateur de gâteaux en ligne (« Planifiez en ligne le gâteau de vos rêves pour votre fête »). Cela transforme la clientèle de passage quotidienne en clients qui précommandent en ligne, sans effort supplémentaire à la vente.
- 12
Partenariat B2B avec des lieux événementiels locaux
Des présentoirs et des flyers avec un code de réservation direct pour le site web sont placés chez des restaurants locaux, des granges événementielles et des organisateurs de mariage. Les clients qui font la fête réservent leur gâteau directement en ligne, tandis que le lieu reçoit une petite indemnité ou une recommandation en retour.
- 13
Calendrier d’anniversaires pour crèches et écoles
Coopération avec les jardins d’enfants locaux au moyen de flyers d’information destinés aux comités de parents, contenant un code de réduction fixe pour les gâteaux à motifs pour enfants. Mutation de l’idée 3 : au lieu de partenaires B2B généraux, l’occasion très fréquente qu’est l’anniversaire d’enfant est ciblée de façon automatisée.
- 14
Mini-atelier mensuel de gâteaux à motifs
Enfreint délibérément la contrainte souple « 2 heures d’effort par semaine au maximum », puisqu’un atelier de 4 heures a lieu une fois par mois. Cela en vaut la peine, car les participants jouent le rôle d’ambassadeurs de la marque, produisent des contenus enthousiastes pour les réseaux sociaux et passent, c’est garanti, leurs commandes suivantes via la boutique en ligne.
- 15
Un lien de commande sur chaque boîte à gâteau
Imprimez sur les boîtes à gâteaux et les tickets de caisse un code QR menant à la page de commande, afin que chaque client qui achète déjà un gâteau puisse en commander un pour le prochain anniversaire sans téléphoner.
Note de Kirat à Claude : Meilleure idée rule_breaker seulement au rang 4 : « Une permanence gâteaux unique pour le lancement » — elle enfreint délibérément une contrainte souple. Défendez-la une fois sous sa meilleure forme avant de l’écarter.
Sujet : Idées pour réduire en deux trimestres les incidents de production causés par le module de facturation, sans l’extraire dans un service séparé
Contexte envoyé : Équipe de 8 ingénieurs. Un monolithe TypeScript d’environ 60 000 lignes, une base de données Postgres, déployé plusieurs fois par jour. Le module de facturation change chaque semaine et a causé 5 des 8 derniers incidents de production, surtout parce que d’autres modules lisent et écrivent directement dans les tables de facturation. Personne dans l’équipe n’a exploité de système distribué en production. La direction veut moins d’incidents d’ici deux trimestres. IMPÉRATIF : pas de réécriture du module de facturation. IMPÉRATIF : le travail sur les fonctionnalités de facturation continue chaque semaine.
- 1
Pare-feu de base de données autour des tables de facturation
Créer des rôles Postgres distincts pour les chemins de code du monolithe liés à la facturation et pour les autres, puis retirer au rôle applicatif général les écritures directes dans les tables de facturation. Faire passer toutes les mutations par un petit ensemble de procédures stockées ou de fonctions transactionnelles relues, en ajoutant d’abord une journalisation d’audit temporaire pour découvrir et migrer les appelants sans arrêter le travail hebdomadaire sur les fonctionnalités.
- 2
Invariants financiers exécutables
Encoder une courte liste d’invariants — comme des factures finalisées immuables, des écritures comptables équilibrées, une création de débit idempotente et des transitions d’état valides — sous forme de contraintes de base de données là où c’est sûr, et de sondes planifiées en production ailleurs. Exécuter les mêmes sondes en CI contre des fixtures anonymisées ayant la forme de la production, transformant la connaissance des incidents en fils déclencheurs permanents plutôt qu’en extension générale des tests.
- 3
Le rejeu des incidents comme parcours d’épreuves avant la mise en production
Convertir les cinq incidents de facturation en scénarios de rejeu déterministes à partir des formes de requêtes capturées et de lignes assainies, puis exiger que chaque modification de la facturation y survive. Ajouter des tests génératifs qui permutent nouvelles tentatives, événements en double, ordre des transactions et défaillances partielles autour de ces scénarios précis, en ciblant le voisinage des défaillances plutôt qu’en tentant une couverture exhaustive du monolithe.
- 4
Appliquer la frontière de la facturation en mode fantôme
Comme mutation moins risquée du pare-feu de base de données, conserver d’abord les permissions actuelles mais journaliser chaque requête touchant les tables de facturation avec son module, son point d’appel et son ID de transaction. Au bout de quatre semaines, transformer les écritures inattendues en échecs de CI, puis en erreurs de production module par module ; cela remplace un basculement immédiat des permissions par une application progressive.
- 5
Tableau de commande du rayon d’impact de la facturation
Placer les comportements de facturation risqués — pas le module entier — derrière des kill switches côté serveur et des déploiements par pourcentage, avec des tableaux de bord indexés sur les anomalies de factures, de paiements et de rapprochement. Chaque fonctionnalité hebdomadaire est livrée avec un chemin de désactivation testé, afin que les intervenants puissent désactiver le nouveau comportement sans annuler des déploiements du monolithe sans rapport ni défaire des migrations de schéma.
- 6
Encapsulation par schéma Postgres et Row Level Security
Isolez les tables de facturation dans un schéma Postgres dédié (billing.*) et retirez aux autres rôles de base de données l’accès direct en écriture et en lecture. Les modules n’y accèdent que via des vues SQL définies ou des interfaces stockées. Cela élimine la cause principale des incidents directement au niveau de la base de données.
- 7
Tests de contrat et pipeline fantôme pour les versions de la facturation
Mettez en place dans le pipeline CI des tests de contrat consumer-driven automatisés pour toutes les interfaces de facturation. En complément, les modifications de la facturation portant sur des calculs critiques s’exécutent en production en mode fantôme, sans effets de bord, avec comparaison automatique des différences.
- 8
Une seconde base de données comme instrument de sécurité
Enfreindre délibérément l’hypothèse souple d’« une seule base de données Postgres » en ajoutant une base fantôme en lecture seule alimentée par réplication logique, tout en gardant la facturation dans le monolithe et en conservant la base principale comme seule base en écriture. Exécuter les nouvelles lectures de facturation et les contrôles de rapprochement contre les deux bases, comparer les résultats avant l’exposition, et utiliser la base fantôme pour les requêtes d’investigation afin que le diagnostic d’incident ne puisse ni surcharger ni modifier accidentellement la production.
- 9
Linting strict des frontières de modules et façade d’API publique
Introduisez un linting d’architecture via dependency-cruiser qui interdit, à l’étape de build, les imports directs d’éléments internes de la facturation dans d’autres modules. La communication ne doit passer que par une interface BillingFacade unique et typée, afin de bloquer immédiatement les couplages insidieux.
- 10
Passeports de modification de la facturation
Exiger que chaque pull request liée à la facturation porte un passeport vérifié par machine : tables concernées, invariants, compatibilité des migrations, chemin de rollback et une requête de production prouvant la bonne santé après déploiement. Une barrière CODEOWNERS et une relecture de 15 minutes par un responsable facturation désigné par roulement gardent le processus assez léger pour des modifications hebdomadaires, tout en concentrant l’examen sur les effets inter-modules.
- 11
Vues Postgres en lecture seule générées automatiquement pour les modules externes
Une mutation de l’encapsulation par schéma : au lieu de refactorings d’API coûteux, des vues Postgres protégées en écriture sont mises à disposition automatiquement pour les requêtes externes. Les modules externes ne lisent que ces vues stables, tandis que les accès directs aux tables sont bloqués par des permissions de base de données.
- 12
Bus d’événements asynchrone in-process pour des read models
Au lieu que des modules externes interrogent directement les tables de facturation, le module de facturation émet des événements en mémoire lors des changements d’état. Les modules destinataires construisent leurs propres projections locales. Cela découple entièrement les accès en lecture des tables de facturation, sans introduire de systèmes distribués.
- 13
Gel des fonctionnalités de deux semaines pour encapsuler la facturation
Enfreint la contrainte souple d’une production continue et hebdomadaire de fonctionnalités, pendant exactement deux semaines. Toute l’équipe se concentre sur la séparation des couplages de base de données. L’effort ponctuel crée la base pour réduire durablement le nombre d’incidents pendant les 5 mois restants.
- 14
Un rôle de base de données par module
Donnez à la facturation son propre schéma et son propre rôle Postgres, et retirez aux autres modules l’accès en écriture aux tables de facturation, afin que les écritures directes échouent en staging avant d’atteindre la production.
- 15
Partitionnement physique de la base dans une seconde instance Postgres
Enfreint la contrainte souple de l’architecture à base de données unique, mais conserve le code monolithique. Les données de facturation migrent vers leur propre instance de base de données, ce qui rend techniquement impossibles les jointures SQL transversales. La complexité opérationnelle reste minimale, car le code reste monolithique.
Note de Kirat à Claude : Meilleure idée rule_breaker seulement au rang 8 : « Une seconde base de données comme instrument de sécurité » — elle enfreint délibérément une contrainte souple. Défendez-la une fois sous sa meilleure forme avant de l’écarter.
Sujet : Idées pour réduire le temps de personnel consacré à la sélection sur titre et résumé d’environ 3 000 références, sans affaiblir la rigueur d’une revue systématique
Contexte envoyé : Revue systématique en recherche sur les services de santé, destinée à publication. Protocole actuel : deux examinateurs humains indépendants, conflits résolus par discussion. Le temps du personnel est limité. Les relecteurs de la revue demanderont comment la sélection a été faite. Manquer une étude pertinente (fausse exclusion) est pire qu’en inclure une non pertinente. IMPÉRATIF : la méthode doit pouvoir être rapportée selon PRISMA 2020. IMPÉRATIF : le taux de fausses exclusions ne doit pas augmenter.
- 1
Barrière d’exclusion à deux humains
Faire examiner chaque référence par l’examinateur A, mais transmettre directement à l’étape suivante ses inclusions et ses décisions incertaines ; l’examinateur B n’évalue de façon indépendante que les exclusions proposées par A. N’exclure une référence que lorsque les deux humains l’excluent indépendamment, et faire avancer automatiquement chaque désaccord, ce qui élimine la plupart des discussions de conflits. Cela enfreint délibérément l’hypothèse souple du protocole actuel selon laquelle deux humains doivent évaluer chaque référence ; cela en vaut la peine, car cela économise du temps de sélection tout en permettant structurellement davantage de fausses inclusions, mais aucune fausse exclusion supplémentaire, et c’est simple à décrire dans la section PRISMA sur le processus de sélection.
- 2
Sprint de calibrage avec registre des cas limites
Faire sélectionner un premier lot stratifié en double et de façon indépendante, résoudre les conflits et transformer les ambiguïtés récurrentes en règles opérationnelles courtes, avec des exemples positifs et négatifs. Figer les règles avant de continuer ; ne conserver les décisions du pilote que si les critères d’éligibilité n’ont pas changé, sinon les réexaminer. Cela préserve la double sélection indépendante tout en réduisant ensuite le temps de délibération et de résolution des conflits, et le calibrage peut être rapporté selon PRISMA.
- 3
Une console binaire rapide, pas une mini-extraction de données
Donner aux deux examinateurs une interface en aveugle, pilotée au clavier, limitée à inclure, exclure ou incertain, avec le titre et le résumé complets toujours visibles ; reporter le codage détaillé et les motifs d’exclusion à l’examen du texte intégral. PRISMA 2020 n’exige pas de motifs par référence à l’étape titre et résumé. Le processus de décision reste inchangé, mais le temps évitable de lecture, de clics et de documentation diminue.
- 4
Soupape machine à inclusion seule
Comme mutation en une étape de la barrière d’exclusion à deux humains, faire passer les exclusions proposées par A par un classifieur validé qui peut seulement libérer des références vers l’inclusion, jamais les exclure ; l’examinateur B examine de façon indépendante tout ce que le classifieur ne libère pas. L’exclusion finale exige toujours des décisions concordantes de deux humains, si bien qu’une erreur de la machine peut ajouter des textes intégraux mais ne peut pas créer de fausse exclusion. Rapporter selon PRISMA le modèle, la version, les entrées, les seuils, la validation et son rôle strictement limité à l’inclusion.
- 5
Sélection asymétrique des exclusions
Un premier examinateur classe intégralement les 3 000 références. Le second examinateur vérifie exclusivement les références exclues par le premier, afin de repérer les faux négatifs (les inclusions sont acceptées directement). Cela réduit presque de moitié l’effort du second examinateur, maintient le risque de fausses exclusions extrêmement bas et satisfait à toutes les exigences PRISMA.
- 6
Contourner la sélection pour les strates à fort rendement
Déclarer à l’avance des sous-ensembles à fort rendement — comme les références issues d’un bloc de recherche très spécifique, les descendants directs d’études éligibles connues, ou les références déjà incluses dans une revue étroitement alignée — et les envoyer toutes directement à la récupération du texte intégral, sans décision sur titre et résumé. Cela enfreint délibérément le protocole souple à deux examinateurs pour ces références, mais ne peut pas augmenter les fausses exclusions, puisque rien dans le sous-ensemble n’est exclu ; la contrepartie est un travail supplémentaire sur les textes intégraux. Rapporter explicitement la règle de contournement et les effectifs qui en résultent dans le diagramme de flux PRISMA et dans les méthodes de sélection.
- 7
Sélection priorisée par apprentissage actif
Les deux examinateurs humains utilisent un outil d’apprentissage actif (comme ASReview) qui place en tête les titres/résumés pertinents. Dès qu’un critère d’arrêt statistiquement validé est atteint (p. ex. 500 références non pertinentes d’affilée), la sélection est arrêtée. La procédure économise jusqu’à 70 % du temps, peut être documentée conformément à PRISMA 2020 et maintient, grâce au calibrage de l’algorithme, un taux minimal de fausses exclusions.
- 8
Déduplication strictement exacte avant la sélection
Ne supprimer que les références dont l’identité est prouvée par DOI, numéro d’accession en base de données ou correspondance bibliographique normalisée exacte ; conserver la copie aux métadonnées les plus riches et se contenter de signaler les quasi-doublons incertains. Les deux examinateurs sélectionnent ensuite de façon indépendante chaque référence unique restante, tandis que PRISMA rapporte les doublons supprimés avant la sélection. Cela réduit le volume sans créer de voie permettant d’exclure une étude unique.
- 9
Cascade humain-IA avec filet de sécurité IA
Une mutation de la sélection asymétrique des exclusions : un examinateur humain traite seul toutes les références, tandis qu’un modèle d’IA réglé pour une sensibilité maximale vérifie exclusivement les exclusions humaines. Ce n’est qu’en cas de divergence qu’un second humain revérifie. Cela réduit les capacités humaines nécessaires de plus de 50 % avec une couverture complète.
- 10
Second examinateur IA entièrement automatique
Enfreint la contrainte souple selon laquelle deux personnes humaines doivent obligatoirement effectuer la sélection. Un grand modèle de langage (LLM) assume le rôle de second examinateur indépendant avec un prompting zéro faux négatif. Cela en vaut la peine, car le temps de travail humain est divisé par deux et les LLM atteignent de manière avérée des taux de rappel élevés dans la sélection des résumés ; PRISMA 2020 autorise explicitement la mention d’outils d’IA.
- 11
Sélection simple adaptée au risque avec triage par niveau de confiance
Enfreint la contrainte souple d’une double sélection systématique pour l’ensemble des données. Lorsque le premier examinateur indique un niveau de confiance subjectif élevé et que des motifs d’exclusion clairs existent, le second examinateur n’intervient pas ; seuls les cas incertains passent en double sélection. Cela économise jusqu’à 60 % du temps de personnel, tandis que le risque d’études manquées reste minimal grâce à la concentration des ressources sur les zones grises.
- 12
D’abord un tour de calibrage
Les deux examinateurs examinent les mêmes 100 références, discutent chaque conflit et affinent les critères d’éligibilité avant le tour principal, si bien que les conflits et relectures ultérieurs diminuent.
- 13
Sélection éclair binarisée avec triage par IA
Mutation de la priorisation par apprentissage actif : l’équipe utilise une interface simplifiée d’évaluation rapide (uniquement des clics pour « Inclusion/Incertain » contre « Exclusion »). Un modèle d’IA analyse en arrière-plan les incertitudes et n’envoie que les cas douteux en double vérification approfondie. Réduit drastiquement la charge cognitive et le temps de lecture par résumé.
- 14
Pré-filtrage déterministe par algorithmes de correspondance
Des filtres de recherche conservateurs et des scripts écartent au préalable les références clairement inadaptées (p. ex. mauvais plan d’étude ou population non humaine). Les deux examinateurs ne vérifient ces exclusions automatisées que sur un échantillon représentatif (p. ex. 10 %). Cela réduit le volume total à sélectionner manuellement, conformément à PRISMA et sans perte de sensibilité.
Toutes les idées, complètes et dans l’ordre du classement. L’idée de Claude participe anonymement et à égalité. Le sujet et le contexte ont été envoyés en anglais, les notes de Kirat sont en anglais et les membres ont rédigé leurs idées en anglais ou en allemand ; tous ces textes sont traduits ici.
Cinq titres de pages et de documents, de domaines différents. Chaque membre rédige une variante, le brouillon de Claude y participe, et les deux membres notent les trois anonymement. Choisissez-en un.
Brief : Titre pour la page de tarifs d’un petit outil de facturation pour freelances (19 USD par mois, essai gratuit de 14 jours). Public : freelances qui rédigent aujourd’hui leurs factures dans Word ou Excel. Objectif : faire paraître l’essai sans risque et intéressant. Format : un seul titre, en anglais.
Critères : 8 mots max. · concret, sans superlatifs · mentionne le temps gagné ou le fait d’être payé · pas de points d’exclamation
- 1
"Get paid without Word—free for 14 days"
S’adresse directement aux utilisateurs de Word, met en avant le fait d’être payé et rend concret l’essai sans risque.
- 2
"Send invoices in minutes. Get paid on time."
Le propre brouillon de l’orchestrateur.
- 3
"Replace Word and Excel. Get paid days faster."
S’adresser directement au workflow manuel actuel offre un contraste immédiat et présente l’essai comme une amélioration rapide et sans risque de la trésorerie, sans recourir à un battage générique.
Brief : Titre pour la landing page d’une petite agence digitale consacrée aux refontes de boutiques pour les vendeurs de meubles sous WooCommerce. Public : propriétaires de boutiques de meubles de taille moyenne sans développeurs internes. Objectif : faire réserver un audit gratuit de la boutique. Format : un seul titre, marché allemand, mais à rédiger en anglais.
Critères : 10 mots max. · nomme la difficulté du lecteur, pas l’agence · pas de jargon comme « headless » ou « omnichannel » · pas de superlatifs
- 1
"Losing furniture buyers to a slow, frustrating WooCommerce store?"
Cible directement la principale frustration du propriétaire — les ventes perdues à cause des mauvaises performances de la boutique — sans jargon technique ni langage d’agence autosatisfait.
- 2
"Is your WooCommerce shop turning furniture buyers away?"
Nomme directement la difficulté centrale et s’adresse aux vendeurs de meubles sans jargon.
- 3
"Fewer shop emergencies, more time for your furniture."
Le propre brouillon de l’orchestrateur.
Brief : Titre pour la nouvelle page de commande en ligne de gâteaux sur mesure de la boulangerie. Public : clients locaux qui commandaient jusqu’ici par téléphone. Objectif : rendre la commande en ligne simple et personnelle. Format : un seul titre, marché allemand, mais à rédiger en anglais.
Critères : 8 mots max. · concret, sans superlatifs · mentionne le retrait ou l’occasion · sonne comme une boulangerie locale, pas comme une chaîne
- 1
"Your celebration cake, baked here for pickup."
Chaleureux, concret et personnel : « baked here » fait local, tandis que « for pickup » rend le processus en ligne simple.
- 2
"Order your custom birthday cake, pick up fresh."
Le titre nomme concrètement l’occasion ainsi que le retrait et, par la promesse de fraîcheur, transmet une qualité artisanale locale sans formules impersonnelles.
- 3
"Your cake, your date. Order in two minutes."
Le propre brouillon de l’orchestrateur.
Brief : Titre pour une proposition technique interne : renforcer les frontières du module de facturation à l’intérieur du monolithe avant d’envisager un service séparé. Public : 8 ingénieurs et la direction, qui veulent moins d’incidents. Objectif : faire lire et approuver la proposition. Format : un seul titre, en anglais.
Critères : 10 mots max. · énonce la décision, pas seulement le sujet · pas de mots à la mode · compréhensible pour des non-ingénieurs
- 1
"Fix billing's boundaries first, split it later if needed"
Le propre brouillon de l’orchestrateur.
- 2
"Keep Billing Together, but Isolate It to Prevent Incidents"
Le titre énonce la décision de garder la facturation dans le monolithe tout en renforçant ses frontières, et relie ce choix à l’objectif commun de réduire les incidents.
- 3
"Strengthen Billing Boundaries in Current App Before Splitting Service"
Le titre pose une décision d’orientation claire, évite un jargon technique superflu comme « monolithe » pour la direction et aborde directement l’objectif commun de stabilité.
Brief : Titre pour un article méthodologique sur l’utilisation d’un LLM comme examinateur supplémentaire dans une revue systématique en recherche sur les services de santé. Public : chercheurs et relecteurs de revues. Objectif : exact et citable, sans battage. Format : un seul titre, éventuellement suivi d’un sous-titre après deux-points, en anglais.
Critères : 20 mots max. · nomme la méthode et le contexte · aucune affirmation allant au-delà des données · pas de mots tape-à-l’œil comme « revolutionize »
- 1
"Large Language Model–Assisted Study Selection in Health Services Research: A Method for Additional Screening in Systematic Reviews"
Le titre identifie la méthode de sélection, le contexte de la revue systématique et le domaine de la recherche sur les services de santé, sans laisser entendre de performance ni de bénéfice.
- 2
"An LLM as additional screener: a prospective comparison in a health services systematic review"
Le propre brouillon de l’orchestrateur.
- 3
"Large Language Models as Auxiliary Screeners in Health Services Research Systematic Reviews: A Methodological Evaluation"
Le titre nomme précisément le domaine d’application et la méthodologie, renonce aux mots accrocheurs et adopte un ton factuel et citable pour un environnement de publication scientifique.
Les titres sont affichés tels qu’ils ont été écrits, en anglais, comme le demandaient les briefs. La justification de l’entrée de Claude est le libellé propre à Kirat. Les briefs et les critères ont été envoyés en anglais, et les justifications ont été rédigées en anglais ou en allemand ; ces textes sont traduits ici.
Cinq briefs d’images de domaines différents. OpenAI et Google génèrent chacun une image, et les deux membres notent les deux images anonymement. Choisissez-en un.
Brief : Image principale pour la landing page d’un petit outil de facturation pour freelances : un bureau à domicile bien rangé le matin, avec un ordinateur portable (écran détourné ou flou, aucune interface lisible), une tasse de café et un carnet papier. Lumière naturelle du jour, style photo documentaire calme, pas de texte, pas de logos, pas de visages.
Critères : ressemble au vrai espace de travail d’un freelance, pas à un bureau de banque d’images · calme et épuré · laisse un espace calme pour un titre · aucun texte, logo ni écran lisible
gpt-5.6 · 9/10 Poste de travail à domicile très calme et crédible, avec une lumière naturelle du matin, un écran détourné et une grande surface de mur libre pour un titre. Paraît un peu mis en scène, mais remplit presque entièrement la commande.
gemini-3.6-flash · 9/10 Atmosphère de lumière matinale très claire et naturelle. L’ordinateur portable détourné résout parfaitement le problème de l’écran, sans effet de flou artificiel. La surface de mur claire offre un espace idéal pour du texte.
gpt-5.6 · 6/10 Chaleureux et authentique, avec un écran flou ; on voit toutefois dans l’image du texte bien visible sur le carnet ainsi que des notes manuscrites. De plus, la composition est plus chargée et offre moins de surface calme pour un titre.
gemini-3.6-flash · 7/10 Mise en place très chaleureuse et réaliste. Toutefois, l’écran adouci artificiellement attire un peu l’attention, et la composition dans son ensemble offre un peu moins de surface calme pour un titre.
Brief : Photo produit pour une boutique en ligne de meubles : une table de salle à manger en chêne massif avec quatre chaises, dans un salon d’Europe centrale lumineux et d’apparence réelle. Lumière naturelle du jour, style intérieur éditorial, pas de texte, pas de logos, pas de personnes.
Critères : la table est clairement le sujet · texture et couleur du bois fidèles à la réalité · ressemble à un vrai intérieur, pas à un rendu 3D · aucun texte ni logo
gpt-5.6 · 9/10 Ambiance d’intérieur d’Europe centrale très crédible et lumineuse, avec lumière naturelle du jour, quatre chaises et une structure de chêne réaliste ; la décoration un peu abondante détourne très légèrement l’attention de la table.
gemini-3.6-flash · 9/10 Atmosphère chaleureuse très réussie, avec une lumière du jour authentique et un veinage du bois réaliste. Remplit excellemment toutes les consignes.
gpt-5.6 · 8/10 La table en chêne massif est clairement mise en scène, quatre chaises sont présentes, la couleur et le veinage du bois sont convaincants ; l’ensemble paraît toutefois un peu trop impeccable et légèrement proche d’un rendu.
gemini-3.6-flash · 9/10 La table de salle à manger est clairement au centre, le bois de chêne et les textures paraissent extrêmement naturels et photoréalistes. Style éditorial parfait pour la boutique en ligne.
Brief : Image principale pour la nouvelle page de commande en ligne de gâteaux sur mesure d’une petite boulangerie locale : un gâteau d’anniversaire terminé sur un comptoir en bois, dans une boulangerie familiale lumineuse et d’apparence réelle, prêt à être retiré dans une simple boîte à gâteau en carton. Lumière naturelle du jour, style photo documentaire, pas de texte, pas de logos, pas de visages.
Critères : ressemble à une vraie boulangerie locale, pas à une chaîne ni à une photo de banque d’images · le gâteau est clairement le sujet · laisse un espace calme pour un titre · aucun texte ni logo dans l’image
gpt-5.6 · 8/10 Le gâteau est clairement le motif principal, boîte en carton simple, lumière naturelle du jour et environnement de boulangerie locale plausible. Aucun texte ni logo visible ; la surface calme du couvercle convient à un titre, même si l’image paraît un peu trop mise en scène.
gemini-3.6-flash · 9/10 Remplit parfaitement le brief : totalement exempte de texte et de logos, le gâteau est clairement au centre, lumière naturelle claire et atmosphère très authentique. Le couvercle en carton ouvert offre une surface calme idéale pour des titres.
gpt-5.6 · 4/10 Le gâteau et la boîte de retrait sont clairement mis en scène, la boulangerie artisanale paraît crédible. Enfreint toutefois nettement la consigne « no text » : inscription sur le décor du gâteau, tableaux de menu et ticket de caisse ; de plus, il manque une surface calme pour un titre.
gemini-3.6-flash · 3/10 Enfreint la consigne stricte « pas de texte dans l’image » avec le pic « HAPPY BIRTHDAY » et les tableaux inscrits à l’arrière-plan. L’arrière-plan est aussi un peu trop chargé.
Brief : Image de couverture pour un article de blog technique interne sur le démêlage d’un module de facturation hors d’un monolithe : une illustration abstraite et calme d’un bloc clairement délimité, mis à l’écart d’un amas dense de blocs interconnectés. Style flat, couleurs sourdes, pas de texte, pas de logos.
Critères : l’idée d’une frontière claire se lit au premier coup d’œil · calme, pas dramatique · fonctionne en petite taille · aucun texte ni logo
gpt-5.6 · 9/10 L’unité isolée avec sa délimitation en pointillés est immédiatement reconnaissable et s’oppose clairement à l’amas dense et interconnecté de blocs. Palette calme et sourde ; bien lisible même en petit. Léger ombrage spatial au lieu d’un style flat cohérent.
gemini-3.6-flash · 7/10 Bonne représentation du bloc isolé avec une frontière en pointillés, style calme et lisibilité claire même en vue réduite.
gpt-5.6 · 6/10 L’élément détaché et le réseau complexe transmettent en principe le découplage, mais la frontière ressemble davantage à un cadre d’écran qu’à une frontière de module clairement définie. L’amas est très morcelé et perd en lisibilité en petite taille ; dans l’ensemble, l’image reste toutefois calme et sans logos ni texte lisible.
gemini-3.6-flash · 4/10 L’accent est mis sur un écran de tablette plutôt que sur un bloc séparé, et l’enchevêtrement paraît moins structuré.
Brief : Image de couverture pour une conférence sur la sélection assistée par IA dans les revues systématiques : une pile soignée de résumés de recherche imprimés sur un bureau, certains triés dans deux bacs, douce lumière du jour, style photo documentaire. Aucun texte lisible, pas de logos, pas de visages.
Critères : sérieux et scientifique, sans battage · pas de robots ni de cerveaux lumineux · l’idée de tri est visible · aucun texte lisible ni logo
gpt-5.6 · 9/10 Scène de bureau sérieuse et documentaire avec une douce lumière du jour ; deux bacs et des onglets de couleur transmettent clairement le tri. Aucun logo ni texte clairement lisible, aucune personne.
gemini-3.6-flash · 9/10 Très bien réalisé. Grande qualité photographique dans un style documentaire, le concept de tri avec piles et bacs est clairement compréhensible, sans texte lisible ni visages.
gpt-5.6 · 5/10 Le contexte de travail scientifique et le tri sont nettement reconnaissables. Les étiquettes lisibles des bacs enfreignent toutefois la consigne « pas de texte lisible » ; de plus, on voit à l’arrière-plan une personne au visage reconnaissable, quoique flou.
gemini-3.6-flash · 4/10 Le motif convient en principe, mais une personne/un visage est visible à l’arrière-plan et les bacs comportent du texte erroné, en partie lisible (INCLVDED/EACLVDED).
Images générées par IA, réduites et sans autre retouche. Les coûts marqués ≈ proviennent d’exécutions lancées en parallèle : le coût d’image propre à chaque exécution, plus une part égale des appels d’évaluation. Le classement est une présélection, et le choix final vous revient. Les briefs et les critères ont été envoyés en anglais, et les évaluations ont été rédigées en allemand ; ces textes sont traduits ici.
Deux clés, une installation, une question.
Kirat n’est pas un service auquel on s’abonne. Il fonctionne sur votre ordinateur (ou dans votre propre environnement cloud Claude Code), dans Claude, avec vos propres clés API. Il n’y a pas de serveur Kirat ni de compte chez nous. Tout ce que vous donnez à Kirat va directement à OpenAI et Google, sous vos comptes — depuis votre ordinateur ou, dans les sessions cloud Claude Code, depuis votre propre environnement cloud via le proxy réseau d’Anthropic pour cet environnement. Nous ne voyons jamais vos clés ni vos questions.
Deux clés API
Une clé API OpenAI et une clé API Google Gemini, toutes deux avec la facturation activée. Ce qui prend du temps ici, ce sont les formulaires d’inscription et de facturation des fournisseurs. Un projet séparé chez le fournisseur, avec une limite de dépenses, est une bonne idée.
Vous avez déjà les deux clés ? Passez à l’étape 2.
Installer
Claude Desktop : décompressez le téléchargement. Ouvrez Settings → Extensions → Advanced settings → Install Extension… et choisissez le fichier .mcpb. Saisissez les deux clés dans la boîte de dialogue. Desktop embarque son propre Node, il n’y a donc rien d’autre à installer.
Claude Code : décompressez le téléchargement et déplacez le dossier kirat extrait dans votre dossier personnel, de sorte que ~/kirat/claude-code existe. Exécutez ensuite les commandes ci-dessous. Nécessite Node.js 20 ou une version ultérieure.
Sessions cloud Claude Code : une configuration unique de votre environnement cloud, avec des limites — voir ci-dessous.
Demander
Vérifiez l’installation : Utilise l’extension Kirat et appelle kirat_status.
Posez ensuite une vraie question : Demande au conseil Kirat : Postgres ou SQLite ? Donne aussi ta propre position.
# dans Claude Code, une fois que ~/kirat/claude-code existe /plugin marketplace add ~/kirat/claude-code /plugin install kirat@kirat # saisissez les deux clés quand elles sont demandées ; pour les modifier plus tard : /plugin configure kirat@kirat
Claude Desktop vous avertira que l’extension n’est pas vérifiée par Anthropic. Cet avertissement est normal pour toute extension installée à partir d’un fichier — voir la FAQ.
Vérifiez ceci avant d’acheter.
Kirat est un programme, pas un service. Il ne fonctionne que là où Claude exécute des outils sur une machine où Kirat est installé : votre ordinateur, une machine distante via SSH, ou un environnement cloud Claude Code que vous configurez une fois.
Fonctionne dans
- Les chats Claude Desktop sur macOS et Windows Utilise l’extension
.mcpb. - Claude Code dans un terminal ou VS Code Utilise le plugin Claude Code. Nécessite Node.js 20 ou ultérieur ; son installation nécessite une fois l’outil en ligne de commande
claude. - Les sessions locales dans l’onglet Code de Claude Desktop Également le plugin Claude Code. L’extension
.mcpbest faite pour les chats, pas pour les sessions de l’onglet Code. - Les sessions SSH Le plugin, installé sur la machine distante.
- Les sessions cloud Claude Code — de façon limitée, avec une configuration unique de l’environnement cloud Sessions cloud de l’onglet Code, Claude Code sur le web ou dans l’application mobile. Une fois par environnement cloud :
- Collez le bloc du téléchargement (
cloud/setup.sh) en haut du script de configuration de l’environnement. - Ajoutez vos deux clés comme variables d’environnement. Nous recommandons les noms
KIRAT_OPENAI_API_KEYetKIRAT_GEMINI_API_KEY: ils n’entrent pas en conflit avec la propreOPENAI_API_KEYd’un projet. Kirat accepte aussiOPENAI_API_KEYetGEMINI_API_KEY. - Accès réseau : s’il est sur Full, il n’y a rien à changer. Sinon, réglez-le sur Custom (dans les applications plus récentes : Limited) avec la liste par défaut des gestionnaires de paquets, plus
api.openai.comet l’hôte de téléchargement de Kirat.
- Collez le bloc du téléchargement (
Ne fonctionne pas dans
- Le chat dans le navigateur (claude.ai)
- Le chat dans les applications mobiles Claude Claude Code dans l’application mobile s’exécute comme session cloud ; cela fonctionne avec la configuration cloud.
- Les tâches Cowork exécutées dans le cloud
- Les réseaux, sur votre propre ordinateur, qui exigent un proxy HTTP Les environnements cloud Claude Code fonctionnent.
- Les organisations qui limitent les extensions Desktop à une liste autorisée Les installations manuelles sont bloquées ; demandez à votre administrateur.
Limites du cloud — à vérifier avant d’acheter
- Toute personne qui utilise l’environnement peut lire ses variables d’environnement — y compris vos deux clés. Ne partagez pas l’environnement avec des personnes qui ne doivent pas les utiliser.
- Le budget quotidien se compte par session. Chaque session cloud repart de zéro ; le budget quotidien de Kirat se compte donc par session, et non sur l’ensemble de vos sessions de la journée. Définissez des limites de dépenses chez OpenAI et Google : dans le cloud, ce sont elles votre véritable plafond.
- Les tâches en arrière-plan et les résultats récents prennent fin avec la session. Ils sont perdus lorsque la machine de la session s’arrête.
- Deux hôtes à autoriser. Outre
api.openai.com, l’accès réseau de l’environnement doit autoriser l’hôte de téléchargement de Kirat (Gemini est couvert par la liste par défaut). - Une configuration échouée peut rester en cache. Si la configuration échoue, la session démarre quand même, simplement sans Kirat — et l’état d’échec peut rester en cache pour les nouvelles sessions jusqu’à ce que vous modifiiez le script de configuration (toute modification le fait réexécuter par les nouvelles sessions).
Pourquoi l’extension n’atteint jamais une session cloud : les sessions cloud s’exécutent sur les serveurs d’Anthropic, dans un environnement cloud, et ne peuvent pas atteindre un programme sur votre ordinateur — même si Claude Desktop affiche Kirat comme activé sous « + → Connectors » dans une telle session. Une session cloud ne dispose de Kirat que si son environnement cloud a la configuration Kirat.
De quel type de session de l’onglet Code s’agit-il ? Le sélecteur d’environnement dans la zone de saisie l’indique : Local, SSH, WSL ou le nom d’un environnement cloud. Les sessions Local et SSH utilisent le plugin ; un environnement cloud nécessite la configuration cloud.
Non testé : les sessions WSL et les tâches Cowork locales.
Cet encadré existe parce que le conseil l’a demandé. Lorsqu’il a voté le 8 octobre 2026 pour livrer Kirat sous forme d’extension de bureau, l’une de ses conditions était que ces limites soient clairement visibles avant l’achat. Voir la décision. Lorsqu’il a ensuite voté pour la prise en charge des sessions cloud Claude Code, il a posé la même condition pour les limites du cloud.
Les pièces justificatives.
N’importe qui peut affirmer qu’un conseil fonctionne. Voici de vraies séances du conseil sur Kirat lui-même, des mesures issues d’exécutions en production et les échecs qui ont changé la conception.
Décision historique, août 2026. Ce vote portait sur le plan initial : vendre Kirat sous forme de manuel de construction. Ce plan a changé depuis, et la dissidence ci-dessous a orienté la suite.
Un membre a voté contre toute vente du produit. Son raisonnement est resté consigné, et la dissidence a orienté la suite : Kirat est aujourd’hui une extension prête à installer, pas un manuel de construction. C’est tout l’intérêt d’un conseil — vous obtenez l’objection, pas seulement le verdict.
| Mesure | Valeur |
|---|---|
| Débit de sortie médian | gpt-5.6 ≈ 48 tok/s gemini-3.6-flash ≈ 196 tok/s |
| Part du raisonnement dans un appel génératif gpt-5.6 | ≈ 90 % |
| Coût d’une décision du conseil | $0.02–$0.15 |
| Durée réelle d’une décision | 8 s – 3 min |
Génération d’images (kirat_image) | environ $0.05–$0.15 par appel |
| Toutes les séances documentées de décision produit | moins de $0.70 au total |
| Tests automatisés | 256, exécutés sans accès réseau |
MÉTHODE — débit mesuré en août 2026 sur les API en production depuis un seul conteneur dans l’UE : médiane des tokens de sortie par seconde sur des exécutions en production, pas un benchmark synthétique. Le coût par décision dépend du niveau d’effort et de la taille de l’entrée. Vos chiffres varieront selon la combinaison de modèles, la taille des prompts et les tarifs des fournisseurs. Les données de benchmark derrière ces chiffres font partie du Blueprint.
Un écart de débit de 4× explique pourquoi un délai d’attente unique ne pouvait pas convenir aux deux fournisseurs. Cette mesure a façonné la conception — voir l’onglet des échecs.
Nous publions les échecs qui ont changé la conception, avec symptômes et correctifs. Les deux derniers proviennent des versions candidates de l’extension en octobre 2026.
« La limitation doit être clairement visible avant l’achat : Claude Desktop sur macOS/Windows uniquement, pas dans le navigateur, pas sur mobile. »
C’est pourquoi l’encadré Où il fonctionne figure au-dessus du prix. Des votes ultérieurs ont étendu la prise en charge à Claude Code et, avec une configuration unique, aux sessions cloud Claude Code, avec la même condition pour leurs limites.
Ce vote a corrigé une condition antérieure. Cette condition reposait sur des faits incomplets que Claude avait fournis au conseil.
Le format que vous achetez a lui aussi été soumis au conseil. Toutes les séances documentées de décision produit ont coûté ensemble moins de $0.70. Les valeurs de confiance sont l’auto-évaluation de chaque modèle.
Un achat. Les deux formats.
Sans abonnement, sans licence par poste, sans compte chez nous. Kirat fonctionne sur votre ordinateur ou dans votre propre environnement cloud ; vous ne louez aucun service chez nous.
- 01Extension Claude Desktop (
.mcpb) pour macOS et Windows - 02Plugin Claude Code — même serveur, mêmes fonctions
- 03Script de configuration cloud pour les sessions cloud Claude Code
- 04Neuf outils : vote, revue, création, brainstorming, décision, question, image — plus résultat et statut
- 05Garde-fou budgétaire avec plafond quotidien, limite de deux tours, disjoncteur, tickets en arrière-plan
- 06Licence pour une personne, vos propres appareils et environnements cloud
- 07Mises à jour de compatibilité si possible — gratuites, mais sans garantie
Fonctionne dans Claude Desktop (macOS/Windows) et Claude Code ; sessions cloud Claude Code avec une configuration unique — ni le chat dans le navigateur, ni le chat mobile. Où il fonctionne · Limites du cloud
Acheter Kirat- 01La spécification : des exigences structurées pour les outils
- 02Les décisions d’architecture, avec le raisonnement derrière chacune
- 03La liste de contrôle de recette qu’un agent peut utiliser pour se vérifier
- 04Les données de benchmark derrière les chiffres de ce site
Pas de code, pas d’extension installable.
Acheter le BlueprintAchat unique · Paiement via Lemon Squeezy, merchant of record (vendeur), TVA gérée lors du paiement · Remboursements : voir les Conditions
L’utilisation des API est payée directement à OpenAI et Google, sous vos comptes — $0.02–$0.15 par décision du conseil selon nos mesures.
Kirat n’est pas pour vous si…
- —vous utilisez Claude uniquement comme chat dans le navigateur ou sur votre téléphone. Kirat fonctionne dans Claude Desktop (macOS/Windows) et Claude Code, et dans les sessions cloud Claude Code avec une configuration unique — pas dans ces chats.
- —vous voulez un SaaS avec une hotline d’assistance.
- —vous ne voulez pas de comptes API ni de facturation chez deux fournisseurs.
- —vous prenez une poignée de décisions par mois. Deux onglets de navigateur sont gratuits et vous serviront tout aussi bien.
- —vous vous attendez à ce que trois modèles coûtent autant qu’un seul. Les séances du conseil consomment de vrais tokens API — de $0.02 à $0.15 par décision selon nos mesures.
- —vous voulez une réponse qui sonne sûre d’elle. Le rôle d’un conseil est de vous montrer la division, et parfois la division est la réponse.
- —vos données ne doivent pas aller chez OpenAI ou Google. Tout ce que vous donnez à Kirat va aux deux, sous vos comptes et selon leurs conditions.
- —votre organisation bloque les extensions ou exige un proxy HTTP.
Pas besoin d’être développeur.
Si vous savez installer une extension Claude et créer deux clés API, vous pouvez utiliser Kirat. Vous demandez en langage courant ; Claude appelle les outils.
Quant à ce que les agents peuvent construire : Kirat lui-même compte 11 351 lignes de TypeScript, code source et tests, en 38 commits — chaque commit écrit par un agent IA (Claude), aucun à la main.
Avant d’acheter.
En quoi est-ce différent de llm-council ou PAL MCP ?
Regardez d’abord les deux. llm-council est une application web open source ; son auteur la décrit comme volontairement non maintenue. PAL MCP est un serveur MCP gratuit et open source que l’on installe via le terminal ; il prend en charge de nombreux fournisseurs et possède son propre outil de consensus. Vérifiez leur état actuel. Si l’un d’eux couvre vos besoins, utilisez-le.
La différence de Kirat, c’est le paquet : il s’installe via la boîte de dialogue d’extensions propre à Claude Desktop, avec vos clés dans le stockage sécurisé du système d’exploitation, et il apporte un garde-fou budgétaire avec plafond quotidien, une limite de deux tours, un départage par domaine, des tickets en arrière-plan, la gestion des échecs, 256 tests, des champs de résultat en anglais et une utilisation en langage courant.
Faut-il être développeur ?
Non. Si vous savez installer une extension Claude et créer deux clés API, vous pouvez utiliser Kirat. Vous demandez à Claude en langage courant — Demande au conseil Kirat : Postgres ou SQLite ? Donne aussi ta propre position.
— et Claude appelle les outils.
De quoi ai-je besoin ?
Claude Desktop sur macOS ou Windows. Il embarque son propre Node, vous n’installez donc rien d’autre. Ou Claude Code avec Node.js 20 ou ultérieur. Pour les sessions cloud Claude Code, une configuration unique de votre environnement cloud (voir ci-dessous).
Plus une clé API OpenAI et une clé API Google Gemini, toutes deux avec la facturation activée. Kirat fonctionne aussi avec une seule clé : le conseil n’a alors qu’un membre externe, et chaque résultat nomme la clé manquante.
Combien coûte l’utilisation, et qu’est-ce qui empêche une facture qui s’emballe ?
Vous payez directement OpenAI et Google pour ce que vous utilisez. Selon nos mesures, une décision du conseil coûte $0.02–$0.15, selon le niveau d’effort et la taille de l’entrée, et prend de 8 secondes à 3 minutes. La génération d’images coûte environ $0.05–$0.15 par appel.
Le garde-fou budgétaire réserve le coût du pire cas avant chaque appel et bloque les appels qui pourraient dépasser votre budget quotidien — $5 par jour UTC par défaut, réglable. Il fonctionne au mieux, sans garantie ; définissez donc aussi des limites de dépenses chez les fournisseurs. kirat_status affiche le budget et les dépenses, et ne coûte rien.
Où vont mes données et mes clés ?
Vos données : tout ce que vous donnez à Kirat (questions, contexte, code, images) va directement à OpenAI et Google, sous vos comptes et selon leurs conditions — depuis votre ordinateur ou, dans les sessions cloud Claude Code, depuis votre propre environnement cloud via le proxy réseau d’Anthropic pour cet environnement. Il n’y a pas de serveur Kirat, pas de compte chez nous et aucune télémétrie. Nous ne voyons jamais vos clés ni vos données.
Vos clés : vous les saisissez dans la boîte de dialogue d’installation ou de réglages de Claude lui-même. Claude Desktop les stocke dans le stockage sécurisé de votre système d’exploitation (Trousseau macOS, Gestionnaire d’identification Windows). Claude Code les stocke dans le Trousseau macOS ; sous Windows et Linux dans ~/.claude/.credentials.json, lisible uniquement par votre utilisateur. Nous recommandons un projet séparé chez le fournisseur, avec une limite de dépenses.
Dans les sessions cloud Claude Code : Kirat s’exécute dans votre environnement cloud, et les clés sont des variables d’environnement de cet environnement, lisibles par toute personne qui l’utilise.
Sur votre ordinateur : Kirat conserve dans votre dossier personnel un dossier .kirat contenant le compteur de coûts quotidien, le journal des coûts, les 20 derniers résultats (ils contiennent vos questions et réponses), le journal des décisions déléguées et les images générées. Vous pouvez le supprimer à tout moment. Toutes les sessions Kirat de l’ordinateur le partagent, Desktop comme Code.
Où fonctionne-t-il ? Chats Desktop, onglet Code, navigateur, téléphone, cloud ?
En bref : Claude Desktop (macOS/Windows) et Claude Code ; sessions cloud Claude Code avec une configuration unique — ni le chat dans le navigateur, ni le chat mobile. Kirat est un programme, pas un service. Il ne fonctionne que là où Claude exécute des outils sur une machine où Kirat est installé :
- Les chats Claude Desktop sur macOS et Windows — avec l’extension
.mcpb. - Claude Code dans un terminal ou VS Code, et les sessions locales dans l’onglet Code de Claude Desktop — avec le plugin Claude Code. Il nécessite Node.js 20 ou ultérieur, et son installation nécessite une fois l’outil en ligne de commande
claude. L’extension.mcpbest faite pour les chats, pas pour les sessions de l’onglet Code. - Les sessions SSH — avec le plugin installé sur la machine distante.
- Les sessions cloud Claude Code (sessions cloud de l’onglet Code, Claude Code sur le web ou dans l’application mobile) — avec une configuration unique de votre environnement cloud, et avec des limites (voir la question suivante).
Non pris en charge : le chat dans le navigateur (claude.ai) ou dans les applications mobiles, et les tâches Cowork exécutées dans le cloud. L’extension sur votre ordinateur n’atteint jamais une session cloud, même si Claude Desktop y affiche Kirat comme activé sous « + → Connectors ». Pour savoir dans quel type de session de l’onglet Code vous êtes, regardez le sélecteur d’environnement dans la zone de saisie : Local, SSH, WSL ou le nom d’un environnement cloud.
Non testé : les sessions WSL et les tâches Cowork locales.
Les réseaux, sur votre propre ordinateur, qui exigent un proxy HTTP ne sont pas pris en charge ; les environnements cloud Claude Code fonctionnent. Si votre organisation limite les extensions Desktop à une liste autorisée, les installations manuelles sont bloquées ; demandez à votre administrateur.
Comment Kirat fonctionne-t-il dans les sessions cloud Claude Code, et quelles sont les limites ?
Les sessions cloud — sessions cloud de l’onglet Code, Claude Code sur le web ou dans l’application mobile — s’exécutent sur les serveurs d’Anthropic dans un environnement cloud. L’extension sur votre ordinateur ne peut pas les atteindre. À la place, vous configurez l’environnement cloud une fois :
- collez le bloc du téléchargement (
cloud/setup.sh) en haut du script de configuration de l’environnement ; - ajoutez vos deux clés comme variables d’environnement — nous recommandons les noms
KIRAT_OPENAI_API_KEYetKIRAT_GEMINI_API_KEY, qui n’entrent pas en conflit avec la propreOPENAI_API_KEYd’un projet (Kirat accepte aussiOPENAI_API_KEYetGEMINI_API_KEY) ; - accès réseau : s’il est sur Full, il n’y a rien à changer ; sinon, réglez-le sur Custom (dans les applications plus récentes : Limited) avec la liste par défaut des gestionnaires de paquets, plus
api.openai.comet l’hôte de téléchargement de Kirat.
Le script télécharge exactement votre version de Kirat, vérifie sa somme de contrôle SHA-256 et l’installe. C’est une configuration unique, pas un simple clic. Nous l’avons testée dans un conteneur cloud.
Les limites : toute personne qui utilise l’environnement peut lire ses variables d’environnement, y compris vos clés. Chaque session cloud repart de zéro, le budget quotidien de Kirat se compte donc par session — définissez des limites de dépenses chez OpenAI et Google ; dans le cloud, ce sont elles votre véritable plafond. Les tâches en arrière-plan et les résultats récents prennent fin avec la session. Outre api.openai.com, l’accès réseau de l’environnement doit autoriser l’hôte de téléchargement de Kirat (Gemini est couvert par la liste par défaut). Si la configuration échoue, la session démarre quand même, simplement sans Kirat — et l’état d’échec peut rester en cache pour les nouvelles sessions jusqu’à ce que vous modifiiez le script de configuration (toute modification le fait réexécuter par les nouvelles sessions).
L’adresse de téléchargement dans le script de configuration fait partie de votre achat, comme le ZIP ; ne la publiez pas. La licence couvre vos propres environnements cloud. Un environnement cloud partagé avec d’autres nécessite une licence par personne.
Quels modèles utilise-t-il ? Et si un fournisseur en retire un ?
Par défaut gpt-5.6 d’OpenAI et gemini-3.6-flash de Google, avec Claude comme troisième votant.
Les noms de modèles et les prix sont des réglages. Si un fournisseur retire un modèle, vous saisissez le nouveau nom et ses deux prix. Aucune mise à jour nécessaire.
Claude Desktop indique que l’extension n’est pas vérifiée par Anthropic. Est-ce un problème ?
Cet avertissement est normal. Claude Desktop l’affiche pour les extensions installées à partir d’un fichier, et Kirat est installé à partir d’un fichier — il n’est ni vérifié ni signé par Anthropic.
Comment fonctionnent les mises à jour ?
Dans Claude Desktop, installez le nouveau .mcpb de la même manière que le premier. Vos clés et réglages sont conservés.
Les mises à jour de compatibilité sont gratuites lorsque c’est possible, mais sans garantie. Des nouvelles versions majeures peuvent être vendues séparément.
Ai-je droit à une assistance ?
Pour les problèmes d’achat, de téléchargement et d’installation : oui, par e-mail — les coordonnées figurent dans les Mentions légales. Il n’y a pas de conseil à la mise en œuvre ni de délai de réponse garanti.
Que permet la licence ?
Une personne, sur un nombre quelconque de vos propres appareils et dans vos propres environnements cloud. Un environnement cloud partagé avec d’autres nécessite une licence par personne. Pas de revente ni de redistribution. Kirat est un logiciel propriétaire, pas open source.
Utiliser ce que produit le conseil dans votre propre travail, y compris commercial, est autorisé. Les conditions complètes figurent dans les Conditions.
À quoi sert le Blueprint ? En ai-je besoin ?
Vous n’en avez pas besoin pour utiliser Kirat. Le Blueprint s’adresse à ceux qui veulent construire ou adapter leur propre serveur de conseil avec un agent de code.
Il s’agit uniquement de documents — pas de code, pas d’extension installable : la spécification (des exigences structurées pour les outils), les décisions d’architecture avec le raisonnement derrière chacune, la liste de contrôle de recette qu’un agent peut utiliser pour se vérifier, et les données de benchmark derrière les chiffres de ce site. Il n’y a pas de prix groupé.