Skip to content

fix(genai,#15044): T03 — contraintes reelles (Literal + date) pour l'exercice 2, exemple guide de resolution des dates relatives - #15138

Merged
myia-ai-01 merged 2 commits into
mainfrom
feature/15044-genai-t03-structured-outputs
Sep 8, 2026
Merged

myia-ai-01 merged 2 commits into
mainfrom
feature/15044-genai-t03-structured-outputs

Conversation

@jsboige

@jsboige jsboige commented Sep 7, 2026 •

Copy link
Copy Markdown
Owner

Grain: MED/notebook-python — lane myia-po-2023:CoursIA — prev: MED/notebook-python #15074

T03/G08 : l'exercice 2 enseignait Field(description=...) la ou une contrainte reelle est exigee

Closes #15044

Reassessed by myia-po-2023:CoursIA: CONFIRMED (fille de l'audit Astra #3, #15035). Reverification firsthand avant le fix : le squelette commite proposait priorite: str = Field(description="Priorite: haute, moyenne, basse") et date: str = Field(description="Date au format YYYY-MM-DD ou texte relatif") (cellules 24/25) — un str avec description accepte n'importe quoi. Probe pre-fix execute : AncienStub(date_evenement="pas-une-date", priorite="banane").model_dump() passe sans erreur. Le finding est exact.

Correction (le contrat de l'issue, point par point)

  1. Enonce reecrit (cellule 24) : l'exercice exige desormais un veritable choix de Literal/enumeration pour la priorite ET le type, un type date (ou un field_validator) pour la date. Le point cle est enseigne explicitement : la description aide le modele, le type contraint le validateur.
  2. Squelette du stub reecrit (cellule 25) : Literal["reunion", "deadline", "livraison", "presentation"], Literal["haute", "moyenne", "basse"], champ date_evenement: date + champ date_reference: date qui materialise « aujourd'hui ». Reste un exercice (stub C.1 : print("Exercice a completer"), tous les # TODO etudiant / # Etape N conserves) — la solution n'est pas donnee.
  3. Date de reference et infos manquantes : l'enonce demande de traiter explicitement les expressions relatives (« lundi prochain », « 30 mars ») contre une reference fournie, et de signaler l'ambigu plutot que promettre une date absolue deterministe depuis un contexte incomplet.
  4. Exemple guide resolu (2 cellules nouvelles, 26-27) : demonstration executable et determine (sans appel LLM) qui montre ce que le validateur fait vraiment — les cas de rejet demandes par l'acceptation.

Sortie reelle de la cellule exemple guide (commitee)

1. Le JSON schema expose les contraintes (enums) :
   priorite : ['haute', 'moyenne', 'basse']
   type     : ['reunion', 'deadline', 'livraison', 'presentation']
   date     : string / date

2. Le validateur REJETTE ce que Field(description=...) laissait passer :
   priorite 'banane' : REJETE -> ('priorite',) literal_error
   date invalide     : REJETE -> ('date_evenement',) date_from_datetime_parsing

3. Resolution d'une expression relative contre une date_reference :
   date_reference = 2026-03-30
   'lundi prochain' -> 2026-04-06
   'vendredi' -> 2026-04-03
   '30 mars' -> 2026-03-30
   'le 30 mars' -> expression relative non resolvable (ambigu) : le 30 mars

4. Modele valide avec la date resolue (champ date_evenement en type date) :
   evenement valide : Reunion de sprint | 2026-04-06 | haute

Les cas de l'acceptation verbatim sont tous rendus : priorite inconnue et date invalide rejetees ; l'evenement relatif produit un resultat justifie par une reference explicite (2026-04-06 = reference + 7 j) ; l'expression avec article (« le 30 mars ») reste signalee comme ambiguë.

Re-execution reelle (C.2)

Notebook entier re-execute (notebook_tools.py execute --kernel python3 --cwd GenAI, python 3.13.14 / pydantic 2.13.4 / openai 2.43.0, cle OpenAI vivante, BATCH_MODE=false) : 13 cellules code, 0 execution_count null, 0 erreur, 74,9 s — appels API reels (gpt-5-mini).

Post-merge re-execution : apres resolution du conflit avec #15065 (voir ci-dessous), re-execution complete rejouee : 13 cellules code, 0 null, 0 erreur, 57,3 s — sorties et execution_count de la tete courante (commit 7e8410e461).

Verifications

  • Diff source aligne par ID de cellule contre origin/main : strictement confine — cellules 24 (markdown) et 25 (code) reecrites, 2 cellules nouvelles inserees en 26-27, aucune suppression, aucun reordonnancement, aucune autre cellule touchee (40 -> 42 cellules).
  • C.1 : 0 raise NotImplementedError / assert False / 1/0 dans le notebook.
  • Aucune fuite de chemin dans les outputs (scan absolu Windows/MSYS) ; metadata.papermill.input/output_path normalises au basename (exception documentee).
  • Ratchets rejoues contre origin/main (merge-base 96a9ad68c4, apres commit) : check_output_failure_text.py 1 changed / 0 regressed, check_output_flood.py 1 changed / 0 regressed, check_cell_source_parses.py 0 finding.
  • Catalogue byte-identique a main.
  • Resolution de conflit avec fix(genai,#15036): retrait du monkeypatch pydantic non idempotent — 11 notebooks Texte re-executees #15065 (transparent) : fix(genai,#15036): retrait du monkeypatch pydantic non idempotent — 11 notebooks Texte re-executees #15065 (G01, retrait du monkeypatch pydantic — MERGEE pendant la vie de cette PR) touchait bien ce notebook ; mon pre-claim check avait conclu a tort au disjoint (la requete gh pr view 15065 --json files erreur sur un array, et le grep a compte 0 sur une sortie vide — faux negatif documente). Conflit resolu deliberement, ancre sur les IDs de cellules : version main conservee (retrait du monkeypatch + ses re-executions), mes 2 cellules reecrites reappliquees par ID, mes 2 cellules nouvelles reinsecrees apres le stub, re-execution complete post-merge. Le diff source aligne par ID contre le NOUVEAU main reste strictement confine : ed4f3286 + 2af530e9 reecrites, 2 ajouts, 0 suppression.
  • Claim : commentaire issue 5576408166 (2026-09-08T00:57Z), pre-claim check fait (0 PR ouverte citant 15044, 0 commentaire de claim concurrent).

Diagnostic derive

Verdict : CAUSE_FIXED — l'exercice enseignait un pattern qui ne valide pas (description sur str), laissant l'etudiant croire que priorite et date etaient contraintes alors que le validateur acceptait n'importe quelle chaine. Le contrat est desormais coherent : Literal pour les ensembles fermes, type date + date_reference pour les dates (absolues ou resolues contre une reference explicite), ambiguite signalee, et un exemple guide execute qui rend chaque rejet observable dans la sortie commitee.

…exercice 2, exemple guide de resolution des dates relatives

L'exercice 2 proposait Field(description=...) sur des str pour la priorite
(ensemble ferme) et la date : la description aide le modele mais ne valide
rien (priorite='banane' et date='pas-une-date' passes). Reecriture de
l'enonce et du squelette vers Literal[] + type date + date_reference
fournie explicitement, traitement des infos manquantes, et exemple guide
resolu qui demontre : enums dans le JSON schema, rejets ValidationError,
resolution deterministe de 'lundi prochain'/'30 mars' contre la reference,
signalement de l'ambigu. Notebook re-execute (13 cellules code, 0 erreur,
74.9 s, appels API reels).

Closes #15044

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
…solution par IDs de cellules

Le merge de #15065 sur main retirait la paire (markdown intro + patch
pydantic) de ce meme notebook, deplacee d'un indice en aval. Resolution
deliberee, ancree sur les IDs : version main conservee (monkeypatch retire,
ses re-executions gardees), mes cellules reappliquees par ID (ed4f3286,
2af530e9 reecrites ; exemple-guide-validation[-code] reinsecrees apres le
stub). Re-exec complete post-merge : 13 cellules code, 0 null, 0 erreur,
57,3 s. Ratchets verts contre origin/main.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
@github-actions

github-actions Bot commented Sep 8, 2026

Copy link
Copy Markdown
Contributor

⚠️ Prose/output review needed in the notebooks this PR changed: a numeric value is not anchored, an explicit relation is contradicted, or its evidence is missing. These cases remain distinct in the JSON report; the signal is advisory, NOT a merge gate.

Scope = notebooks CHANGED in this PR, not the whole corpus. Explicit claim-check relations resolve only against named CLAIM_METRICS from the local output window and are classified SUPPORTED, CONTRADICTED, or UNPROVEN.
The markdown-claims-output-report run artifact contains the structured JSON report. See python scripts/check_markdown_claims_output.py --help for re-running locally.
Detector rationale: c.290 / c.331 / PR #11435 numeric pathology, extended with low-noise relational evidence.

@github-actions

github-actions Bot commented Sep 8, 2026

Copy link
Copy Markdown
Contributor

Golden-Set Execution (H.7 P3)

✅ 8/8 notebooks passed (certified reproducible)

Notebook Status Time
2.1-Workflow-ML.ipynb ✅ SUCCESS 2.8s
2.2-Descente-de-gradient.ipynb ✅ SUCCESS 3.2s
2.3-Regression-lineaire-logistique.ipynb ✅ SUCCESS 3.4s
2.4-Arbres-Forets-Ensembles.ipynb ✅ SUCCESS 3.2s
Search-01-StateSpace.ipynb ✅ SUCCESS 2.8s
SL-1-LogicalLearning.ipynb ✅ SUCCESS 2.0s
rl_4_multi_armed_bandits.ipynb ✅ SUCCESS 14.0s
GameTheory-04c-NashExistence-Python.ipynb ✅ SUCCESS 2.4s

Pinned lockfile: scripts/notebook_tools/golden_set.lock.txt (H.7 P3, axe A #4208)

@github-actions

github-actions Bot commented Sep 8, 2026

Copy link
Copy Markdown
Contributor

Notebook PR Validation: PASS

  • Notebooks checked: 1
  • Code cells validated: 13
  • Result: All passed

Checks: H.1 (no errors), H.3 (execution_count), C.1 (no banned patterns)
Non-Python kernels (.NET/Lean): C.1 + errors only (execution_count advisory)
QuantConnect notebooks: C.1 + errors only (require QC Cloud for execution)

@myia-ai-01
myia-ai-01 merged commit 6296416 into main Sep 8, 2026
66 of 69 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

G08 (P1) -- T03 : une description de champ ne contraint ni la priorite ni la date

2 participants