Exemples
À quoi ressemble une leçon.
Cinq spécimens couvrant ce que nous livrons, de l’historique d’ingénierie au travail métier à travers le Moyen-Orient et l’Afrique du Nord. Même structure, même notation, même niveau de détail que la réalité.
Tout ce qui figure sur cette page est synthétique. Conçu par l’équipe Bearish AI pour montrer le format et la qualité. Les entreprises, les personnes, les factures et le code sont inventés. Aucune donnée réelle de client, de salarié ou de production n’apparaît ici.
Spécimen A · The Journal
Un remboursement partiel qui remboursait trop.
Neuf jours de travail sur une application de facturation fictive. L’équipe a pris la bonne décision dans le chat, livré autre chose, et balayé la remarque du relecteur qui l’avait vu. Un modèle formé uniquement sur le code final n’en verrait rien.
L’épisode, dans l’ordre
- Jour 1 · 09:12
Spécification
Prendre en charge les remboursements partiels sur les factures payées. Le remboursement peut être inférieur au total. La taxe est remboursée au prorata.
- Jour 1 · 10:40
Chat d’équipe
L’équipe précise ce que veut dire « au prorata ».
eng-04 : Prorata par ligne ou sur le total de la facture ? Les arrondis diffèrent.
pm-02 : Par ligne. La finance réconcilie ligne par ligne.
lead-01 : Alors le reliquat d’arrondi va sur la dernière ligne, sinon on dérive d’un centime.
← la décision
- Jour 2 · 15:05
Note de conception
La boîte de dialogue de remboursement affiche la taxe remboursée sur sa propre ligne, en lecture seule.
- Jour 3 · 11:30
Pull request #412
Livre les remboursements partiels. La taxe est calculée au prorata du total de la facture, et non par ligne.
← la dérive
- Jour 3 · 12:02
Relecture
Un relecteur le repère. L’auteur reporte. La pull request est fusionnée.
eng-07 : Ça calcule le prorata sur le total. Les factures à taux mixtes seront fausses.
eng-04 : Les taux mixtes sont rares. Je ferai un suivi.
← l’alerte
- Jour 3 · 12:20
CI
Tous les contrôles passent. Chaque jeu de test utilise un taux de taxe unique.
- Jour 8 · 16:47
Ticket de support
Un client rembourse une ligne de 40,00 $ taxée à 5 %. Le remboursement rend 3,20 $ de taxe. Il aurait fallu 2,00 $.
← le coût
- Jour 9 · 14:10
Pull request #431
Prorata par ligne, un jeu de test à taux mixtes et un test de propriété : la taxe remboursée ne dépasse jamais la taxe facturée sur les lignes remboursées.
← la leçon
- Jour 9 · 18:31
Déploiement
Le correctif part en production. Ticket clos.
La facture derrière le ticket
| Ligne | Montant | Taux | Taxe | Remboursée |
|---|---|---|---|---|
| A · Abonnement annuel | 60,00 $ | 10 % | 6,00 $ | Non |
| B · Mise en route | 40,00 $ | 5 % | 2,00 $ | Oui, en totalité |
Le prorata sur le total donne 40 $ ÷ 100 $ × 8,00 $ = 3,20 $. La ligne remboursée ne portait que 2,00 $ de taxe. Chaque remboursement à taux mixtes verse trop au client.
// src/refunds.tsexport function refundTax(inv: Invoice, refund: RefundLine[]): Cents {- const refunded = sum(refund.map((r) => r.amount));- return Math.round((refunded / inv.subtotal) * inv.taxTotal);+ return sum(+ refund.map((r) => {+ const line = inv.lines.find((l) => l.id === r.lineId)!;+ return Math.round((r.amount / line.amount) * line.tax);+ })+ );}
{ "episode_id": "SYN-EP-0007", "synthetic": true, "product": "Tallow (fictional invoicing app)", "span_days": 9, "actors": ["pm-02", "eng-04", "eng-07", "lead-01", "support-03"], "records": { "spec": 1, "chat_messages": 14, "design_notes": 3, "pull_requests": 2, "review_comments": 5, "ci_runs": 6, "tickets": 1, "deploys": 2 }, "links": [ { "from": "chat:m-118", "to": "pr:412", "type": "decision_not_followed", "confidence": 0.93 }, { "from": "review:c-3", "to": "ticket:T-88", "type": "defect_predicted", "confidence": 0.88 }, { "from": "ticket:T-88", "to": "pr:431", "type": "fixed_by", "confidence": 0.99 } ], "labels": { "defect_class": "spec_drift", "detected_by": "customer", "review_signal_ignored": true, "hours_report_to_fix": 21 }}
Spécimen B · The Exams
La réunion qui s’est décalée toute seule.
Une réunion hebdomadaire de 9:00 apparaît à 10:00 après le changement d’heure. Le correctif tient en une ligne. Le trouver suppose de savoir faire la différence entre ajouter des heures et ajouter des semaines calendaires. L’agent reçoit le dépôt cassé et le rapport. Les tests cachés tranchent.
Ce que l’agent reçoit
« Des utilisateurs de Los Angeles signalent que notre réunion hebdomadaire de 9:00 apparaît à 10:00 après le 8 mars. Faites en sorte que expandWeekly conserve la même heure locale lors des changements d’heure. Ne modifiez pas sa signature. »
// src/recurrence.tsimport { DateTime } from "luxon"; export function expandWeekly(start: string, zone: string, count: number): string[] { const first = DateTime.fromISO(start, { zone }); return Array.from({ length: count }, (_, i) => first.plus({ hours: 24 * 7 * i }).toISO()! );}
// test/recurrence.test.ts (visible)test("keeps 09:00 local across the March DST change", () => { const out = expandWeekly("2026-03-02T09:00:00", "America/Los_Angeles", 2); expect(out[1]).toBe("2026-03-09T09:00:00.000-07:00");}); ✕ keeps 09:00 local across the March DST change Expected: "2026-03-09T09:00:00.000-07:00" Received: "2026-03-09T10:00:00.000-07:00"
// reference solution, never shown to the agent- first.plus({ hours: 24 * 7 * i }).toISO()!+ first.plus({ weeks: i }).toISO()! ✓ keeps 09:00 local across the March DST change✓ hidden: keeps 09:00 local across the November change✓ hidden: Asia/Qatar, a zone with no DST, is unchanged✓ hidden: Europe/London on its own DST date✓ hidden: count = 0 returns an empty list
Comment c’est noté
La commande de test du projet s’exécute dans un conteneur scellé. Réussir, c’est que tous les tests visibles et cachés passent, qu’aucun fichier de test n’a été modifié, et que rien en dehors de src/recurrence.ts n’a changé. Avant publication, l’état cassé doit échouer et le correctif de référence doit réussir sur trois exécutions propres.
Spécimen C · The Workshop
Huit étapes, quatre systèmes, un faux pas.
Un agent travaille dans une copie isolée de Bearish OS. L’évaluateur ne lit jamais les paroles de l’agent. Il vérifie ce qui a réellement changé dans la messagerie, l’agenda et le CRM à la fin de l’exécution.
La consigne
« Le contrat signé d’Ardent Freight est dans votre boîte de réception. Déplacez la revue fournisseur de cette semaine du mercredi au jeudi à la même heure, dites à tous les invités pourquoi, joignez le contrat à l’affaire, et passez l’affaire à Contract received. »
L’exécution de l’agent
mail.search("Ardent")
Trouve « Signed renewal, Ardent Freight » avec contract.pdf en pièce jointe.
calendar.open("This week")
Trouve « Vendor review: Ardent » le mercredi, de 14:00 à 14:45, Asia/Qatar. Quatre invités, dont un externe.
calendar.event.edit(day: Thu, start: 14:00, end: 14:45)
Événement déplacé. Heure et fuseau conservés.
calendar.event.notify(scope: "internal", note: "Moving to Thursday so we can review the signed contract.")
Trois invités internes sont prévenus. L’invité externe ne l’est pas.
← invité externe oublié
crm.deal.open("Ardent Freight renewal")
Étape de l’affaire : Negotiation.
crm.deal.attach(from: mail, file: contract.pdf)
Contrat joint à l’affaire.
crm.deal.stage.set("Contract received")
Étape mise à jour. Activité enregistrée.
agent.done()
Fin de l’épisode. L’évaluateur s’exécute sur l’état final.
Le verdict de l’évaluateur
| Résultat | Contrôle d’état | Poids |
|---|---|---|
| Réussi | L’événement est jeudi, de 14:00 à 14:45 Asia/Qatar, avec les mêmes quatre invités | 0.25 |
| Réussi | L’avis indique le motif et mentionne le contrat signé | 0.15 |
| Échec | Tous les invités ont été prévenus, y compris procurement@ardent-freight.example | 0.20 |
| Réussi | contract.pdf est joint à l’affaire | 0.20 |
| Réussi | L’étape de l’affaire est Contract received, et rien d’autre n’a changé | 0.20 |
L’environnement revient au même état initial avant chaque exécution : deux agents, ou deux versions d’un même agent, affrontent exactement la même matinée.
Spécimen D · The Guild
Un litige de facturation, en arabe.
La Guild écrit en arabe, littéraire et dialectal, et dans l’anglais, le français et l’allemand du commerce régional. Toujours par des locuteurs natifs, jamais traduit. Ici, le modèle doit extraire les faits avec exactitude, puis répondre dans le registre qu’attend un responsable des opérations du Golfe.
L’e-mail reçu
السلام عليكم، لاحظنا أن فاتورة شهر أكتوبر رقم INV-2291 احتسبت ١٢ مقعدًا، بينما يشمل اشتراكنا ١٠ مقاعد فقط. نرجو إصدار إشعار دائن بقيمة المقعدين الإضافيين، وتحديث جهة الاتصال للفوترة إلى السيدة ريم الكبيسي (reem@company.example). مع الشكر، خالد المنصوري مدير العمليات
Une réponse de référence
وعليكم السلام أستاذ خالد، شكرًا لتنبيهنا. راجعنا الفاتورة INV-2291 وتأكدنا أن العدد الصحيح هو ١٠ مقاعد. سنصدر إشعارًا دائنًا بقيمة ٦٠ دولارًا عن المقعدين الإضافيين خلال يومي عمل، وقد حدّثنا جهة اتصال الفوترة إلى السيدة ريم الكبيسي. مع خالص التحية، فريق الحسابات
{ "invoice": "INV-2291", "billed_seats": 12, "contracted_seats": 10, "requests": ["credit_note", "update_billing_contact"], "credit": { "seats": 2, "amount_usd": 60 }, "new_billing_contact": { "name": "ريم الكبيسي", "email": "reem@company.example" }, "register": "formal"}
La grille
| Ce qui est vérifié | Poids |
|---|---|
| Les sept champs extraits correspondent exactement | 0.40 |
| La réponse rend correctement la salutation et s’adresse à Khalid avec un titre de politesse | 0.10 |
| La réponse indique le nombre de places corrigé et l’avoir de 60 $ | 0.20 |
| La réponse confirme le nouveau contact de facturation par son nom | 0.15 |
| Arabe standard moderne soutenu de bout en bout, sans mots d’anglais en remplissage | 0.15 |
Spécimen E · The Guild
Deux pays, trois documents, un manque.
Un distributeur de Riyad achète des pièces à un fabricant allemand. La consigne arrive en arabe, la facture est une facture électronique allemande, et la réponse doit partir en allemand. Traduire les mots est la partie facile. Savoir comment chaque pays facture, taxe et règle, voilà la tâche.
La consigne
وصلت فاتورة شركة Hartmann Präzisionsteile. طابِقها مع أمر الشراء PO-2026-118 ومع سند استلام البضاعة، وجدوِل دفع المبلغ المستحق، واكتب للمورّد بالألمانية. لم نعد بحاجة إلى القطع العشرين الناقصة.
← rapprocher la facture, payer ce qui est dû, répondre en allemand
Les trois documents
| Champ | Bon de commande | Bon de réception | Facture |
|---|---|---|---|
| Quantité | 400 | 380 | 400 |
| Prix unitaire | 18,50 EUR | – | 18,50 EUR |
| Total | 7 400,00 EUR | – | 7 400,00 EUR |
| Taxe | – | – | USt 0 % (export) |
Ce que la facture nous apprend
- Format ZUGFeRD
- Une facture électronique allemande : un PDF qui contient des données de facture lisibles par machine.
- Umsatzsteuer 0 %
- Steuerfreie Ausfuhrlieferung. Une exportation hors de l’UE : pas de TVA allemande.
- Lieferbedingung DAP Riyadh
- Le fournisseur livre. L’acheteur dédouane et paie la TVA à l’importation en douane.
- Zahlungsziel 30 Tage netto
- Le paiement est dû dans les 30 jours suivant la date de facture.
Une réponse de référence
Sehr geehrter Herr Brandt, vielen Dank für Ihre Rechnung über 400 gefräste Halterungen. Beim Abgleich mit unserer Bestellung PO-2026-118 und dem Wareneingang haben wir 380 Stück erhalten, also 20 weniger als berechnet. Wir haben heute die Zahlung von 7.030,00 EUR für die 380 Stück eingeplant. Da wir die fehlenden 20 Stück nicht mehr benötigen, bitten wir Sie um eine Gutschrift über 370,00 EUR mit Bezug auf die ursprüngliche Rechnung. Mit freundlichen Grüßen Layla Haddad Kreditorenbuchhaltung, Al-Waha Trading Co.
{ "task_id": "SYN-BIZ-0204", "match": { "ordered": 400, "received": 380, "invoiced": 400, "short": 20 }, "payment": { "amount_eur": 7030.00, "status": "scheduled", "due_within_days": 30 }, "supplier_request": { "type": "credit_note", "references": "original_invoice", "amount_eur": 370.00 }, "saudi_vat_added": false, "email": { "to": "buchhaltung@hartmann-teile.example", "lang": "de-DE", "register": "Sie" }}
Comment c’est noté
| Ce qui est vérifié | Poids |
|---|---|
| Paiement programmé pour 7 030,00 EUR, et non les 7 400,00 EUR facturés | 0.30 |
| Demande une Gutschrift de 370,00 EUR en référence à la facture d’origine | 0.25 |
| E-mail en allemand avec « Sie », indiquant 380 reçues et 20 manquantes | 0.20 |
| Aucune TVA saoudienne ajoutée au paiement du fournisseur. La TVA à l’importation se règle en douane, pas sur cette facture | 0.15 |
| La date de paiement tombe dans le délai net de 30 jours | 0.10 |
Le piège : payer les 7 400,00 EUR en entier parce que la facture semble valide, ou ajouter 15 % de TVA saoudienne à un paiement de fournisseur qui n’en porte jamais.
The Guild
Une tâche, les voix de la région.
Chaque tâche du Workshop peut être formulée comme le ferait un vrai collègue de la région. Chaque version est écrite de zéro par un locuteur natif, jamais traduite.
- العربية الفصحىانقل اجتماع مراجعة المورّد إلى يوم الخميس وأخبر الجميع بالسبب.
- خليجي · Gulfحوّل اجتماع المورّد ليوم الخميس وعلّم الكل ليش.
- مصري · Egyptianانقل اجتماع المورّد ليوم الخميس وقول للكل ليه.
- Arabizi7awel meeting el supplier l yom el 5amees w 3allem el kil laish.
- English · Gulf officeMove the vendor review to Thursday and tell everyone why. Yalla, before the weekend.
- FrançaisDéplace la revue fournisseur à jeudi et explique à tout le monde pourquoi.
- DeutschVerschieb das Lieferantengespräch auf Donnerstag und erklär allen, warum.
Le format
Chaque épisode porte la même fiche.
| Champ | Type | Ce qu’il contient |
|---|---|---|
episode_id | string | Identifiant stable. Les exemples synthétiques portent le préfixe SYN-. |
span | { from, to } | Premier et dernier enregistrement de l’épisode, en UTC. |
actors | string[] | Pseudonymes de rôle comme eng-04 ou pm-02. Stables sur toute la publication. |
records[] | object[] | Chaque trace laissée par le travail : système, référence, horodatage, contenu et empreinte du contenu. |
links[] | object[] | Liens typés entre enregistrements, chacun avec un score de confiance et les preuves utilisées. |
labels | object | Classe de défaut, mode de détection, délai de correction et signaux de relecture. |
artifacts | object | Instantanés du dépôt pour l’état défaillant et l’état corrigé, lorsque l’épisode en dispose. |
provenance | object | Système source, date de collecte et somme de contrôle de chaque fichier. |
redactions | object | Nombre de noms, de secrets et de données clients retirés, par type. |
JSONL
Un épisode par ligne, avec les fichiers sources liés à côté.
Banc de tâches
Un conteneur par tâche, avec l’état cassé, les tests cachés et l’évaluateur.
Image d’environnement
Le Workshop avec des données d’amorçage, des points de réinitialisation et des contrôles d’état.
Envie des vrais ?
Les partenaires sous licence reçoivent le pack d’échantillons complet sous NDA : de vraies leçons, pseudonymisées, avec une tâche que vous pouvez exécuter vous-même.
Ces exemples ont été conçus par l’équipe Bearish AI à titre d’illustration. Tous les noms, entreprises, chiffres et le code de cette page sont fictifs.