Repository navigation
Fix(ci,#24676): les controles reels de list_closed_unmerged lisent un snapshot epingle, sans reseau - #25110
Fix(ci,#24676): les controles reels de list_closed_unmerged lisent un snapshot epingle, sans reseau#25110jsboige wants to merge 1 commit into
Conversation
Les controles test_real_* lisaient le depot vivant (API, timeline, ls-remote, objets git) : leur verdict changeait avec le depot, sans qu'une ligne du produit change, et ils sortaient en skip hors reseau. Ils lisent desormais scripts/ci/tests/fixtures/list_closed_unmerged_prs_snapshot.json (capture GET du 2026-11-07 ; projection, regles d'absence et main de reference dans le bloc _meta). Seules les fonctions d'acces sont remplacees (monkeypatch) ; l'oracle tourne tel quel. Le produit scripts/ci/list_closed_unmerged_prs.py n'est pas modifie. Verdicts attendus inchanges : test_real_20374 -> ACCIDENTAL_EMPTY_CLOSE, test_real_24196 -> SUPERSEDED. test_real_20374 n'accepte plus le repli UNKNOWN. Le controle negatif de fenetre lit une fenetre courte (depuis 2026-11-04T17:00Z, environ 72 h avant la capture) : seules les pages que closed_unmerged lit pour cette fenetre (1 a 15) et les PR de la fenetre sont epinglees, plus 20374 et 24196. Bodies et commentaires conserves sans troncature. Deux assertions font rougir le test si la fenetre devient vide ou ne contient plus de fermeture a successeur nomme ou a raison d'abandon. Fixture de 291 Ko. See #24676 Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LRbWZZHE9jZscr8ya3niWA
|
No organ-duplication: no added def/class collides with another series organ API (scripts/audit/organ_api_index.yaml). Detector: |
Path-collision (organ #13359/#13615)Cette PR #25110 (
Le verdict terminal (#15578) signale qu'un cote de la paire est deja sur |
See #24676
Hors flotte (exemption #17713).
Summary
scripts/ci/tests/test_list_closed_unmerged_prs.pylisent un snapshot épinglé,scripts/ci/tests/fixtures/list_closed_unmerged_prs_snapshot.json, au lieu du dépôt vivant.test_real_20374_is_accidental_empty_closeettest_real_24196_is_supersededgardent leurs assertions ; seules leurs données sont épinglées.test_a_real_deliberate_close_is_not_orphanedporte désormais une fenêtre de 72 h avant la capture (WINDOW_SINCE = 2026-11-04T17:00Z). Il est non trivial : deux assertions font rougir le test si la fenêtre n'a aucune fermeture à successeur nommé ou aucune à raison d'abandon.ls -lci-dessous), limitée aux pages et aux PRs que les trois contrôles lisent : voir « Taille ».scripts/ci/list_closed_unmerged_prs.pyn'est pas modifié. Les bodies et commentaires conservés ne sont pas tronqués.skipnixfail. Le repliUNKNOWNtoléré danstest_real_20374est supprimé.Changes
scripts/ci/tests/test_list_closed_unmerged_prs.py: section 5 réécrite. La fixturepinnedremplacetimeline,comments,obs.remote_branches,obs.content_diffet le seulgit merge-baseattendu ; tout autre appel git ou donnée non épinglée lève une erreur, sans repli réseau. Commande et date de capture dans le commentaire de section 5.scripts/ci/tests/fixtures/list_closed_unmerged_prs_snapshot.json:_metadécrit la fenêtre (window_since), les pages lues (pages_read: 1 à 15, arrêt parclosed_unmerged), la projection et la capture. Contenu : 15 pages de l'API (items compacts), 22 PR de la fenêtre et 20374, 24196 (timeline réduite aux événementsclosedethead_ref_force_pushed, commentaires à ±1800 s de la fermeture, logins remplacés paractor-NN), têtes de branches,merge-baseetcontent_diffcontreorigin/main=e6397230f43765afa9612bc8f4935f53409d3eaa.Fenêtre et contrôle non trivial
Mesuré sur le snapshot,
closed_unmergedpuisevaluate_pr, fenêtre 2026-11-04T17:00Z :Mutation de contrôle : fenêtre déplacée au 2026-11-07T12:00Z (vide de cas), copie temporaire du test, supprimée ensuite :
Taille
Répartition : pages d'API 125 Ko (15 × 100 items : il faut les 100 items par page pour reproduire la pagination et la règle d'arrêt), bodies 100 Ko et commentaires 42 Ko conservés tels quels, contenu git 10 Ko. Descendre sous 150 Ko imposerait soit de réduire les pages (changement de ce que le produit lit), soit de tronquer les bodies que l'oracle lit (interdit). Le plafond de 300 Ko est respecté.
Validation
Commande demandée, sans réseau (
GH_TOKEN=invalid HTTPS_PROXY=http://127.0.0.1:9), sur le commit de cette PR :Avant modification, sans réseau :
43 passed, 3 skipped(les trois contrôles réels enSKIPPED, gardeneeds_gh). Garde levée sur le HEAD d'origine, hors réseau :3 failed(RuntimeError: gh failed ... connection refused). En ligne, les deux contrôles nommés de la version d'origine passent (2 passed in 7.44s) avec les mêmes verdicts que le snapshot.Comparaison de la fenêtre au dépôt vivant : non effectuée. Un calcul en ligne sur la fenêtre initiale du 2026-10-09 a été interrompu sans résultat ; aucun chiffre vivant n'est revendiqué.
Contrôles d'hygiène : aucun émoji littéral dans la fixture (échappés en JSON) ni dans le test ; chemins de profil Windows ramenés à
C:\Users\<utilisateur>; l'identifiant restant est le login public du mainteneur, dans les URL et les textes de PR.Captures : lectures GET uniquement (pages de PR, timelines, commentaires,
ls-remote, fetch des têtes de branches par SHA). La réduction de cette PR n'a fait aucune lecture réseau. Le token a été lu viagh auth token; une PR (#21261) était refusée par le proxy surgh api, elle a été relue par GET HTTP direct. Aucune écriture vers GitHub.Verdicts
test_real_*dépendent de l'état vivant du dépôtSKIPPED(gardeneeds_gh). Garde levée, HEAD d'origine :3 failed. Le contrôle 20374 acceptaitUNKNOWNpour un clone superficiel. La tête distante defeature/20316-dynamics-t3est0d6b2d08, la tête de PR est1b23a54a.test_real_20374ettest_real_24196passent (2 passed in 7.44s). Snapshot :ACCIDENTAL_EMPTY_CLOSE(19 fichiers, 33 s après un force-push du même acteur),SUPERSEDED(successeur #24354 puis #24361).obs.content_diffdépend du répertoire courant (scripts/orphan_branch_scan.py)git diff -- <chemin>est relatif au cwd. Depuisscripts/,content_diffrendSAMEpourGameTheory-16h-Cooperation-LLM-Python.ipynb(fix/gt16h-counteraudit) alors que la racine rend 3 insertions / 3 deletions ; pourfeature/20316-dynamics-t3(tête0d6b2d08) : 12 fichiers depuisscripts/, 19 depuis la racine. Traitement dans une PR séparée.closed_unmerged(plafond à 50 pages) peut manquer des PRupdated_at=2026-10-16T12:27:01Z, après le début de la fenêtre : les pages suivantes ne sont jamais lues. La fenêtre réduite (15 pages) n'est pas concernée.Review Checklist
grep -c "needs_gh\|_gh_ready\|_fetch_pr_head\b\|_local_object_present" scripts/ci/tests/test_list_closed_unmerged_prs.pyrend0; le produitscripts/ci/list_closed_unmerged_prs.pyn'est pas modifié.Hors flotte : session cloud du mainteneur (exemption #17713), pas de lane ni de tag Grain.
Generated by Claude Code