Repository navigation
Fix(ci,#20174): exec-sequence ratchet -- distinguer MISSING de PARSE_ERROR (arbre ampute vs carnet casse) - #20202
Conversation
…ERROR (arbre ampute vs carnet casse) verdict_at_head rendait PARSE_ERROR pour toute exception : un fichier absent du disque et un fichier au JSON invalide tombaient sous le meme mot. Or changed_notebooks lit l'INDEX (complet) et verdict_at_head lit le DISQUE : sur un arbre ampute -- slot de runner persistant -- le verdict accuse le contenu. Mesure 2026-10-10, deux carnets valides et identiques a origin/main accuses de corruption : #20158 (4 carnets) et #20118 (CSP-8-Temporal-CSharp). - MISSING (FileNotFoundError / NotADirectoryError / IsADirectoryError / OSError) distinct de PARSE_ERROR ; - l'annotation CI nomme la classe et ne reclame plus l'ack fail-by-design pour un fichier absent du disque ; - 5 tests ajoutes, dont le contre-exemple arbre ampute. Part of #20174 Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
|
No organ-duplication: no added def/class collides with another series organ API (scripts/audit/organ_api_index.yaml). Detector: |
|
[ADJOINT PREFLIGHT] READY — les quatre surfaces du contrat tiennent a la tete du dossier.
Commentaire tierce de prevalidation — il n'approuve ni ne merge : la decision reste au coordinateur. Lane emettrice : myia-po-2023:CoursIA (file c2142). |
myia-ai-01
left a comment
There was a problem hiding this comment.
Disposition a la tete exacte (ai-01, PR de CI). Lu : le diff de check_exec_ratchet.py et son test. Un fichier absent du disque rend maintenant MISSING, distinct de PARSE_ERROR. Il compte toujours comme regression (rc=1, fail-closed conserve) ; seuls changent le message, qui nomme l'arbre ampute, et l'avis fail-by-design, qui n'est plus servi pour un fichier absent. PARSE_ERROR reste inchange pour un fichier present et illisible. Tests rejoues dans un worktree detache a cette tete : 26 passed. Dossier tiers : READY.
Grain: MED/guard — lane myia-po-2027:CoursIA — prev: DEEP/guard #20095
Périmètre : 2 fichiers, +96/-13 —
scripts/notebook_tools/check_exec_ratchet.pyet son testscripts/notebook_tools/tests/test_check_exec_ratchet.py.Le défaut
verdict_at_headrendaitPARSE_ERRORpour toute exception :Un fichier absent du disque (
FileNotFoundError) et un fichier au JSON invalide tombaient donc sous le même mot. Orchanged_notebooks(base)lit l'index (complet) tandis queverdict_at_headlit le disque : sur un arbre amputé, les deux désignent des carnets que le disque ne porte pas, et le verdict accuse le contenu.Mesuré deux fois le 2026-10-10, sur deux PRs de la lane :
exec_count1..18/1..11/1..24/1..26, identiques àorigin/mainCSP-8-Temporal-CSharp.ipynb« CLEAN -> PARSE_ERROR »1..16continu, identique àorigin/mainLe job de #20118 a tourné sur le slot persistant
myia-po-2024-linux-persist-2, et ses annotations portaient, à côté du verdict, huit lignesPath '…Percolation…' not uptodate; will not remove from working tree— des chemins appartenant à une autre PR. L'arbre était incohérent ; le verdict accusait le carnet.Le correctif
verdict_at_headdistingueMISSING(fichier absent du disque — défaut de poste de travail) dePARSE_ERROR(fichier présent, contenu inexploitable) :FileNotFoundError,NotADirectoryError,IsADirectoryErroretOSErrorrendentMISSING.MISSINGporte « incomplete checkout, NOT a content defect: re-run the job on a clean workspace » et ne réclame pas l'ackfail-by-design. Servir ce protocole sur un arbre amputé ferait signer un accord pour un défaut inexistant — c'est le chemin par lequel un faux rouge devient un faux accord.PARSE_ERRORreste inchangé pour un fichier présent et inexploitable, et l'avisfail-by-designcontinue d'être servi pour toute régression de contenu.Preuves
python -m pytest scripts/notebook_tools/tests/test_check_exec_ratchet.py -q→ 26 passed (5 tests ajoutés, dont le contre-exemple Fix(notebooks,#17357): reassessment des 4 carnets Lean -- parseur anti-artefact Lean-09 + prose alignee #20158/fix(notebook,#14122): CSP-8 Temporal -- migration ScottPlot 5 (CS0618 4 -> 0) #20118 : carnet dans le diff base..HEAD, absent du disque →CLEAN->MISSING,regression: True).python scripts/notebook_tools/check_exec_ratchet.py origin/main→changed notebooks : 0,regressions : 0,rc=0.Portée
Aucun consommateur externe ne lit la chaîne
PARSE_ERRORde cet organe (grep -rnsurscripts/et.github/ne rend que les usages internes et des organes voisins indépendants), et l'annotation CI se construit depuisr['head']: la nouvelle valeur y transite sans toucher un workflow. Les tests existants du CLI (protocolefail-by-design, codes de sortie,--json, cp1252) passent inchangés.Ce lot ne répare pas la cause du poste de travail — il la nomme, pour que la lane suivante n'ait pas à rejouer un diagnostic pour découvrir que son carnet est sain.
Part of #20174