Aller au contenu

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.

SYN-EP-00077 systèmes reliésdéfaut : dérive de spécificationTypeScript

L’épisode, dans l’ordre

  1. 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.

  2. 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

  3. 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.

  4. 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

  5. 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

  6. Jour 3 · 12:20

    CI

    Tous les contrôles passent. Chaque jeu de test utilise un taux de taxe unique.

  7. 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

  8. 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

  9. Jour 9 · 18:31

    Déploiement

    Le correctif part en production. Ticket clos.

La facture derrière le ticket

LigneMontantTauxTaxeRemboursée
A · Abonnement annuel60,00 $10 %6,00 $Non
B · Mise en route40,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.

SYN-TASK-0142Niveau 1fail → pass4 tests cachés

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.

SYN-ENV-0031Niveau 3utilisation d’ordinateurnoté sur l’état

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

  1. mail.search("Ardent")

    Trouve « Signed renewal, Ardent Freight » avec contract.pdf en pièce jointe.

  2. calendar.open("This week")

    Trouve « Vendor review: Ardent » le mercredi, de 14:00 à 14:45, Asia/Qatar. Quatre invités, dont un externe.

  3. calendar.event.edit(day: Thu, start: 14:00, end: 14:45)

    Événement déplacé. Heure et fuseau conservés.

  4. 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é

  5. crm.deal.open("Ardent Freight renewal")

    Étape de l’affaire : Negotiation.

  6. crm.deal.attach(from: mail, file: contract.pdf)

    Contrat joint à l’affaire.

  7. crm.deal.stage.set("Contract received")

    Étape mise à jour. Activité enregistrée.

  8. agent.done()

    Fin de l’épisode. L’évaluateur s’exécute sur l’état final.

Le verdict de l’évaluateur

0,804 contrôles sur 5 réussis, pondérés
RésultatContrôle d’étatPoids
RéussiL’événement est jeudi, de 14:00 à 14:45 Asia/Qatar, avec les mêmes quatre invités0.25
RéussiL’avis indique le motif et mentionne le contrat signé0.15
ÉchecTous les invités ont été prévenus, y compris procurement@ardent-freight.example0.20
Réussicontract.pdf est joint à l’affaire0.20
RéussiL’é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.

SYN-AR-0019arabe standard moderneextraction + réponsenoté par grille

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 exactement0.40
La réponse rend correctement la salutation et s’adresse à Khalid avec un titre de politesse0.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 nom0.15
Arabe standard moderne soutenu de bout en bout, sans mots d’anglais en remplissage0.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.

SYN-BIZ-0204Niveau 3arabe → allemandrapprochement en trois pointsnoté sur l’état et par grille

La consigne

وصلت فاتورة شركة Hartmann Präzisionsteile. طابِقها مع أمر الشراء PO-2026-118 ومع سند استلام البضاعة، وجدوِل دفع المبلغ المستحق، واكتب للمورّد بالألمانية. لم نعد بحاجة إلى القطع العشرين الناقصة.

← rapprocher la facture, payer ce qui est dû, répondre en allemand

Les trois documents

ChampBon de commandeBon de réceptionFacture
Quantité400380400
Prix unitaire18,50 EUR–18,50 EUR
Total7 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és0.30
Demande une Gutschrift de 370,00 EUR en référence à la facture d’origine0.25
E-mail en allemand avec « Sie », indiquant 380 reçues et 20 manquantes0.20
Aucune TVA saoudienne ajoutée au paiement du fournisseur. La TVA à l’importation se règle en douane, pas sur cette facture0.15
La date de paiement tombe dans le délai net de 30 jours0.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.

ChampTypeCe qu’il contient
episode_idstringIdentifiant stable. Les exemples synthétiques portent le préfixe SYN-.
span{ from, to }Premier et dernier enregistrement de l’épisode, en UTC.
actorsstring[]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.
labelsobjectClasse de défaut, mode de détection, délai de correction et signaux de relecture.
artifactsobjectInstantanés du dépôt pour l’état défaillant et l’état corrigé, lorsque l’épisode en dispose.
provenanceobjectSystème source, date de collecte et somme de contrôle de chaque fichier.
redactionsobjectNombre 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.