Repository navigation
fix(genai,#15044): T03 — contraintes reelles (Literal + date) pour l'exercice 2, exemple guide de resolution des dates relatives - #15138
Conversation
…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>
|
Scope = notebooks CHANGED in this PR, not the whole corpus. Explicit |
Golden-Set Execution (H.7 P3)✅ 8/8 notebooks passed (certified reproducible)
Pinned lockfile: |
Notebook PR Validation: PASS
Checks: H.1 (no errors), H.3 (execution_count), C.1 (no banned patterns) |
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")etdate: str = Field(description="Date au format YYYY-MM-DD ou texte relatif")(cellules 24/25) — unstravec 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)
Literal/enumeration pour la priorite ET le type, un typedate(ou unfield_validator) pour la date. Le point cle est enseigne explicitement : la description aide le modele, le type contraint le validateur.Literal["reunion", "deadline", "livraison", "presentation"],Literal["haute", "moyenne", "basse"], champdate_evenement: date+ champdate_reference: datequi materialise « aujourd'hui ». Reste un exercice (stub C.1 :print("Exercice a completer"), tous les# TODO etudiant/# Etape Nconserves) — la solution n'est pas donnee.Sortie reelle de la cellule exemple guide (commitee)
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, 0execution_countnull, 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_countde la tete courante (commit7e8410e461).Verifications
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).raise NotImplementedError/assert False/1/0dans le notebook.metadata.papermill.input/output_pathnormalises au basename (exception documentee).origin/main(merge-base96a9ad68c4, apres commit) :check_output_failure_text.py1 changed / 0 regressed,check_output_flood.py1 changed / 0 regressed,check_cell_source_parses.py0 finding.gh pr view 15065 --json fileserreur 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+2af530e9reecrites, 2 ajouts, 0 suppression.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 :Literalpour les ensembles fermes, typedate+date_referencepour 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.