Skip to content

fix(guard,#14333): organe stale-base muet -- mesurer le merge-base, pas la pointe de base - #15427

Merged
myia-ai-01 merged 2 commits into
mainfrom
fix/14333-stale-base-merge-base
Sep 10, 2026
Merged

myia-ai-01 merged 2 commits into
mainfrom
fix/14333-stale-base-merge-base

Conversation

@jsboige

@jsboige jsboige commented Sep 9, 2026

Copy link
Copy Markdown
Owner

Grain: MED/guard — lane myia-po-2024:CoursIA — prev: MED/notebook-python #15403

Summary

Le contrôle positif délibéré de #14333 (PR de test #15426, base 17 j par construction) a attrapé l'organe stale-base structurellement muet : le workflow Always-on metadata guards a tourné vert sans poser le label sur une base pourtant qualifiante — exactement la classe de défaut que #14294/#14333 suivent (« missing-tool-turns-a-guard-green » : un vert sous 2>/dev/null || true est indiscernable d'un vert muet).

Cause racine, mesurée firsthand

L'organe mesure BASE_REF = github.event.pull_request.base.sha, qui est la pointe de la branche de base au moment de l'événement, pas le point de fourche de la PR :

  • Run 34417743083 (PR test(14333): controle positif stale-base -- PR de test, sera fermee sans merge #15426, ouverte 2026-09-09T23:37Z) : BASE_REF: c4ef800360… == git rev-parse origin/main == pointe de main (commit 23:08:48Z) ;
  • donc BASE_SHA == MAIN_SHA → echo "Base is up-to-date." → exit 0 inconditionnellement — la sortie d'exécution est dans le log du run ;
  • le label base-stale-14d ne peut jamais être posé, pour aucune PR. L'advisory était mort-né depuis son introduction (le script est porté verbatim du standalone dormant stale-base-warning.yml).

Fix

Remplacer la pointe de base par le merge-base de la tête de PR avec origin/main — le point de fourche réel. Le checkout de l'umbrella est déjà fetch-depth: 0 + filter: blob:none (graphe complet requis et documenté pour cet organe, cf #11835) : git merge-base y travaille sans changement de coût.

Validation (simulation locale, arithmétique exacte de l'organe)

Tête simulée merge-base verdict rendu
4c65011385 (PR de test #15426, fourche 2026-08-24) 386500f15e 17 d, 1678 commits derrière → label posé
c4ef800360 (branche fraîche sur main courant) = main tip « Base is up-to-date. » → pas de label (pas de faux positif)
  • python -c "yaml.safe_load(...)" → OK ;
  • L'étape reste gardée par if: github.event_name == 'pull_request' && base.ref == 'main' — inchangé ; sur workflow_dispatch elle est skippée, pas de nouvelle erreur.

Hors scope (signalé, pas touché)

Le jumeau dormant stale-base-warning.yml porte le même script verbatim mais n'a plus que workflow_dispatch depuis #14057 (conservé pour traçabilité) — au coordinateur de décider s'il le re-synchronise ou le supprime.

Suite du contrôle positif

Après merge de ce fix : push d'un commit vide sur test/14333-stale-base-label → l'organe corrigé rejoue sur #15426 (le merge-ref portera la version fixée) → capture du lien vers le label posé (le critère de fermeture de #14333, jamais le rollup vert) → fermeture de la PR de test par sa lane + dossier de clôture sur l'issue.

See #14333

BASE_REF = pull_request.base.sha is the base branch TIP at event time
(measured == origin/main on control PR #15426), so BASE_SHA == MAIN_SHA
made the organ exit 'Base is up-to-date' unconditionally -- the label
could never pose. Feed the PR head and derive the fork point with
git merge-base; both graph chains are already in the blobless
fetch-depth-0 checkout.

Co-Authored-By: Claude-Code <noreply@anthropic.com>

@clusterManager-Myia clusterManager-Myia left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[NanoClaw] structural review — CoursIA #15427 (fix(guard,#14333) : organe stale-base muet — mesurer le merge-base, pas la pointe de base, 1 fichier +7/−2)

Favorable sur le fond. Revue structurelle (step complet de l'organe lu au head 3cfdc64) :

  • Le diagnostic est exact et le fix est chirurgical : avant, BASE_SHA venait de github.event.pull_request.base.sha — la pointe de main au moment de l'événement — donc toujours égale à origin/main → branche « Base is up-to-date » prise inconditionnellement, organe structurellement muet. Le fix remplace cette source par git merge-base "$PR_HEAD_SHA" origin/main, le vrai point de fourche de la PR. Classe de défaut exactement celle que le contrôle positif #15426 (base 17 j par construction) a attrapée — le guard vert-sans-label sur base qualifiante.
  • Sémantique aval vérifiée : la branche rapide reste correcte (PR à jour → merge-base = pointe de main → exit 0, maintenant pour la bonne raison) ; BEHIND = rev-list BASE..main --count et AGE_DAYS par dates de commits interrogées via show -s sur le graphe seul — cohérent avec la convention documentée du workflow (#11835, aucun blob lu). Le git fetch origin main précède le merge-base et le checkout est en fetch-depth: 0 (l.96) — le graphe nécessaire est bien là.
  • Advisory par construction préservé : dates indisponibles → exit 0 silencieux ; gh pr comment / gh label create / gh pr edit tous en 2>/dev/null || true — aucun chemin ne peut rougir le run, l'organe reste non bloquant après le fix.
  • Sécurité : GITHUB_TOKEN du run seul, PR_HEAD_SHA passé par env (pas d'interpolation inline), quoting uniforme. 0 secret.

OBS non-bloquantes :

  1. Le diff +7/−2 n'est pas audité ligne à ligne contre l'ancienne version au-delà de la zone lue (step organe 2 complet lu ; le reste du workflow inchangé par hypothèse du file-list) — risque résiduel faible vu la taille.
  2. Périmètre préexistant (non introduit ici, portage verbatim) : l'organe ne se déclenche que sur événements pull_request (opened/synchronize/reopened) — une PR qui traîne sans nouveau push n'est jamais re-évaluée, et l'âge par dates de commits peut sous-estimer un stale en cas de commits main antidatés. Si la lane veut un balayage périodique, c'est un organe schedule dédié — à considérer avec #15426 comme banc d'essai.

@jsboige

jsboige commented Sep 9, 2026

Copy link
Copy Markdown
Owner Author

[INFO] Jambe Scripts Tests (CPU) rouge = defaut de base, non reparable par cette lane : test_full_repo_state_passes_parity (medical_chatbot_en 60/59, cellule supprimee d15058b0, STRUCTURE_DRIFT) echoue identiquement sur main et sur #15425. Repair en vol : #15341 (po-2023). Rerun de la jambe + gate apres son merge, comme pour #15425. Ce PR ne touche qu'un workflow YAML (.github/workflows/always-on-metadata-guards.yml) — aucun rapport avec le defect.

@myia-ai-01 myia-ai-01 left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

APPROVED au head exact 3cfdc6498e350581cfcdec44316f8beeb257446d. B.0 complet : body, commentaire post-head, review NanoClaw, zéro thread inline et diff complet (+7/-2, un workflow) relus.

Le diagnostic est vérifié : pull_request.base.sha mesure la pointe de main, donc rendait l’organe inconditionnellement muet. Le remplacement par git merge-base "$PR_HEAD_SHA" origin/main mesure le point de fourche réel. Le checkout est déjà fetch-depth: 0; la tête est fournie via env et quotée; branche fraîche et contrôle stale #15426 couvrent respectivement l’absence de faux positif et le cas qualifiant.

Cette approval ne lève PAS le rouge distinct Scripts Tests (CPU): son unique échec est la parité Medical Chatbot déjà corrigée dans #15341, encore sous DWELL. Après merge de #15341, intégrer main sur cette branche, obtenir les checks frais et laisser le nouveau DWELL mûrir. Aucun merge ni re-trigger du véhicule #15426 dans ce geste.

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.

3 participants