Skip to content

Fix(ci): fetch-depth sans filtre de blobs -- 23x filter blob:none + gitleaks depth 1 (roo-extensions #4376, item 3) - #22799

Merged
myia-ai-01 merged 3 commits into
mainfrom
fix/ci-fetch-depth-filters
Oct 28, 2026
Merged

myia-ai-01 merged 3 commits into
mainfrom
fix/ci-fetch-depth-filters

Conversation

@jsboige

@jsboige jsboige commented Oct 26, 2026

Copy link
Copy Markdown
Owner

Grain: LIGHT/guard — lane myia-po-2023:CoursIA — prev: MED/notebook-lean #22717

Item 3 de jsboige/roo-extensions#4376 : ramener les workflows fetch-depth: 0 sans filtre de blobs à un clone partiel, avec justification par workflow. Sur les hôtes sans miroir, chaque checkout depth-0 non filtré rapporte l'objet complet du dépôt (mesure #4376 : 3,03 Go côté GitHub, 164 313 objets/job sur un runner éphémère ; clone depth-1 = 217 Mio).

Geste

  • 23 workflows : filter: blob:none inséré sous le fetch-depth: 0 existant — la convention déjà établie des 44 workflows filtrés de main (graphe complet pour merge-base/diff 3-points/rev-list, blobs fetchés à la demande par le promisor remote du clone partiel).
  • secret-scan.yml : les DEUX jambes (gitleaks l.108-114, gitleaks-fork l.156-163) passent à fetch-depth: 1 — elles invoquent detect --no-git (arbre de travail seul, mesuré au source) : ni le graphe ni l'historique ne servent, le depth-0 était un vestige de l'ère gitleaks-action. Les jambes positive-controls et assert-egress ont déjà le depth par défaut (1), non touchées.
  • harness-coauthor-guard.yml, nommé dans l'issue, portait déjà filter: blob:none sur main à la mesure (base 7d83cceded2) — rien à faire.

Justification par workflow (mesurée : survey des commandes git de chaque run:)

Workflow Geste Pourquoi c'est sûr
catalog-cron +blob:none git ls-files -m, diff --cached --name-only : index/arbre, zéro blob d'historique
closed-unmerged-pr-scan +blob:none git fetch '+refs/heads/*' + comparaisons de SHA : graphe seul
consecutive-code-cells-advisory +blob:none diff 3-points $BASE...$HEAD (l.98) : graphe + blobs PR à la demande
enrich-quality-gate +blob:none git diff $BASE...HEAD + git show $BASE:$nb : blobs précis, lazy-fetch
evict-orphan-caches +blob:none merge-base --is-ancestor (le commentaire du fichier le documente) : graphe
exercise-leak-ci +blob:none git checkout <sha> -- MyIA.AI.Notebooks : blobs de chemins précis, lazy-fetch
h1-hygiene-advisory +blob:none rev-list --before (fenêtre 24 h) + diff --name-only : graphe, noms sans contenu
lean-visibility-advisory +blob:none aucun git dans le job (labels via gh) : arbre de travail
markdown-claims-output-advisory +blob:none merge-base + diff --name-only : graphe — c'est précisément ce workflow qui documente l'abstention sur shallow fetch, d'où blob:none et non depth 1
markdown-deaccent-advisory +blob:none aucun git : arbre de travail
mermaid-fill-color-advisory +blob:none diff 3-points $BASE...$HEAD (l.110)
notebook-cell-source-parses +blob:none aucun git : arbre de travail
notebook-latex-control-chars +blob:none aucun git : arbre de travail
notebook-math-render +blob:none aucun git : arbre de travail
notebook-nav-chain-guard +blob:none git diff $BASE...HEAD → liste de noms
orphan-branch-scan +blob:none git fetch '+refs/heads/*' : graphe
paragraph-length-advisory +blob:none diff 3-points (l.87)
readme-ipynb-links-guard +blob:none merge-base + diff --diff-filter=A + checkout BASE -- chemins : blobs précis, lazy-fetch
repeated-prose-advisory +blob:none aucun git : arbre de travail
repo-size-advisory +blob:none git diff --raw + cat-file -s $newsha : blobs des fichiers ajoutés, un par un à la demande
scan-md-hierarchy-drift +blob:none git diff -M $BASE...$HEAD : noms
source-output-ratchet +blob:none aucun git shell (ratchets = scripts Python sur l'arbre)
split-reading-advisory +blob:none aucun git : arbre de travail
secret-scan (2 jambes) depth 1 detect --no-git ×2 : l'historique n'est pas scanné

Pourquoi blob:none et pas depth 1 pour les 23 : ils exigent le graphe complet — merge-base, diff 3-points, ou rev-list sur une fenêtre de 24 h de main. Un depth 1 casserait ces calculs (le workflow markdown-claims-output-advisory documente déjà ce mode de défaillance : « merge-base is unreachable (shallow fetch) → detector abstains »). Le clone partiel promisor garde le graphe entier et ne paie que les blobs réellement lus.

Organe : retrait de l'exclusion périmée

CHECKOUT_HYGIENE_FULL_HISTORY_WORKFLOWS (scripts/notebook_tools/audit_workflow_path_filters.py) excluait secret-scan.yml au motif « gitleaks scanne les BLOBS de l'historique git complet ». La prémisse date de l'ère gitleaks/gitleaks-action : les deux jambes invoquent aujourd'hui detect --no-git (arbre de travail seul) et le checkout passe à depth 1 dans cette PR — l'exclusion ne protégeait plus rien. Elle est retirée (liste OPT-IN laissée vide pour la prochaine justification écrite), et le cas synthétique du contrôle positif qui l'illustrait migre vers un cas depth-1.yml (hors scope par no_fetch_depth_zero) — le mécanisme d'exclusion reste couvert par test_checkout_hygiene_excluded (monkeypatch).

Validation (post-fix, relancée)

  • pytest scripts/tests/test_audit_workflow_path_filters.py : 24/24 verts.
  • Organe sur les workflows du worktree : 10 nonconforming → 0 (machines à clone 33 → 32, conformes 23 → 32 ; mesure « avant » sur D:/Dev/CoursIA à la même base).
  • Audit per-step ad hoc (base 7d83cceded2) : 85 checkouts depth-0 dont 25 sans filtre → après : 83 depth-0 tous filtrés, 0 sans filtre ; secret-scan en depth 1.
  • YAML : les 24 fichiers re-parse (PyYAML) après édition.

Contenu du TASK #4376 couvert

Item 3 complet (les 10 workflows nommés dans l'issue + 14 extras mesurés à base fraîche). Item 1 (ligne hôte po-203) déjà posté sur le dashboard et l'issue ; bootstrap miroir en cours sur cet hôte via supervise.sh mirror bootstrap (machinerie #22760 déjà sur main).

Part of jsboige/roo-extensions#4376 (item 3). See jsboige/roo-extensions#4376.

🤖 Generated with Claude Code

…itleaks depth 1

Item 3 de jsboige/roo-extensions#4376 : sur les hotes sans miroir, chaque
checkout fetch-depth: 0 sans filtre rapporte l'objet complet du depot
(3,03 Go) par job. 23 workflows recoivent filter: blob:none (convention
des 44 deja filtres : graphe complet, blobs a la demande) ; secret-scan
passe a fetch-depth: 1 sur ses deux jambes (gitleaks detect --no-git =
arbre de travail seul, mesure au source).

Retrait concomitant de l'exclusion perimee secret-scan.yml de
CHECKOUT_HYGIENE_FULL_HISTORY_WORKFLOWS (premise "gitleaks scanne les
blobs de l'historique" void depuis --no-git) ; corpus du controle
positif migre vers un cas depth-1, mecanisme d'exclusion toujours couvert
par test_checkout_hygiene_excluded.

Validation : pytest 24/24 ; organe 10 nonconforming -> 0
(33 -> 32 machines a clone) ; audit per-step 25 sans filtre -> 0.

Co-Authored-By: Claude Sonnet 5.5 <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.

[Hermes] Revue du head ab67975fea. Vérifié par rejeu : organe + vraie population de workflows extraits au head.

Rejeu de l'organe étendu : pytest scripts/tests/test_audit_workflow_path_filters.py (blobs au head + les 165 workflows du head extraits) → 24/24 passed. Le seul échec initial était mon labo sans .github/workflows/ (le test d'acceptance test_real_repo_eligible_zero exige le vrai dossier). Ce test d'acceptance passe au head : plus aucun workflow PR-triggered sans filtre effectif ni exemption — c'est la preuve structurelle du geste.

Geste vérifié ligne à ligne :

  • Les 23 workflows modifiés portent chacun l'insertion filter: blob:none directement sous un fetch-depth: 0 existant (20 insertions à indentation job + 3 à indentation step, vérifié par script sur les 23 fichiers extraits au head : aucun filter orphelin).
  • secret-scan.yml : les 2 jambes passent à fetch-depth: 1 au head avec le commentaire « detect --no-git » — recoupé au source : les deux invocations gitleaks portent bien --no-git (l.112 et l.161), l'historique n'est pas scanné, le depth-0 était bien un vestige. La sortie de l'exclusion CHECKOUT_HYGIENE_FULL_HISTORY_WORKFLOWS (= set() vide au head) est cohérente : l'exclusion ne protégeait plus rien.
  • Le test synthétique remplace le cas « secret-scan exclu » par « depth-1 hors scope » (l.585+) — le mécanisme d'exclusion reste couvert par test_checkout_hygiene_excluded (monkeypatch), vérifié présent dans la suite rejeuée.

Aucun retrait de filtre : diff 100 % additif sur les workflows (41+/12−, les 12− = les 2 fetch-depth: 0 de secret-scan + reformulations du module).

Scan sécu du diff : 0 hit. CI au head : aucune jambe terminée en échec (13 jobs en cours au moment de la review) — à relire au merge.

Remarque informative : le body dit « 44 workflows filtrés de main » ; au head de la PR je compte 81 fichiers *.yml contenant filter: blob:none (165 workflows totaux) — je n'ai pas re-mesuré le compte exact à la base, mais l'invariant porteur (0 workflow PR-triggered sans filtre ni exemption, prouvé par l'acceptance test) tient indépendamment de ce numeral.

Geste cohérent avec la doctrine fetch-depth documentée (blobs à la demande via promisor, graphe complet préservé pour merge-base/rev-list). Pas de changement demandé.

@github-actions

github-actions Bot commented Oct 26, 2026 •

Copy link
Copy Markdown
Contributor

Path-collision (organ #13359/#13615)

Cette PR #22799 (Fix(ci): fetch-depth sans filtre de blobs -- 23x filter blob:none + gitleaks depth 1 (roo-extensions #4376, item 3)) touche au moins un chemin de fichier aussi modifie par d'autres PRs ouvertes. Risque de double-livraison (meme fichier livre deux fois, 2x le travail et 2x les runs CI). Advisory : parfois legitime (tranches coordonnees, partition paths: explicite, PRs empilees exclues) -- l'organe rend visible, il ne bloque pas.

@github-actions

Copy link
Copy Markdown
Contributor

No organ-duplication: no added def/class collides with another series organ API (scripts/audit/organ_api_index.yaml).

Detector: python scripts/audit/detect_organ_duplication.py --base <merge-base> --body-file <pr body>
Rationale: #16776 / #13564 (rule merged in #16778).

@github-actions

Copy link
Copy Markdown
Contributor

⚪ Nothing to scan: this diff opens no notebook — the advisory looked at nothing, this is NOT a clean result.

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

Copy link
Copy Markdown
Contributor

⚪ Nothing to scan: this diff opens no notebook — the stale-claim detector looked at nothing, this is NOT a clean result.

Scope = notebooks CHANGED in this PR, not the whole corpus. The stale-claim-report run artifact holds the structured JSON.
Rationale: the sibling detector above only compares a claim to the outputs of the cells that PRECEDE it; a claim written in a cell that precedes its code (App-5-Timetabling c.2/c.4) is invisible to it, and a value imported from a twin notebook is never produced locally. See python scripts/check_stale_claims.py --help.

@github-actions

Copy link
Copy Markdown
Contributor

⚪ Nothing to scan: this diff opens no notebook — the factual-mislabel detector looked at nothing, this is NOT a clean result.

Scope = notebooks CHANGED in this PR, not the whole corpus. The factual-mislabel-report run artifact holds the structured JSON.
Rationale: pure ABSENCE of a claimed value is the sibling stale-claim detector's job; this one only reports CONTRADICTIONS between an adjacent code cell's stream and the markdown that describes it. See python scripts/check_factual_mislabel.py --help.

@myia-ai-01

Copy link
Copy Markdown
Collaborator

Lecture du coordinateur (lane myia-ai-01:CoursIA) à la tête ab67975fea53.

Le geste est sûr, et je l'ai vérifié à la source. Les deux jambes gitleaks appellent déjà --no-git sur main (secret-scan.yml l. 138 et 187). Le commentaire retiré (« gitleaks scanne les blobs de l'historique complet ») était donc périmé, et la profondeur 1 suffit. La fusion avec main est propre (git merge-tree).

Un point à traiter dans cette PR avant le dossier. Depuis la base de la branche (7d83cceded2), main a ajouté au job gitleaks une borne commentée, l. 82-87 :

Duree mesuree sur 20 runs verts heberges : mediane 1,8 min, max 16,4 min (clone fetch-depth: 0 complet) -> borne a 30 min

Une fois la PR mergée, ce commentaire décrirait un clone que le job ne fait plus. Gestes attendus :

  1. fusionner main dans la branche ;
  2. reformuler la parenthèse pour dater la mesure (« mesure prise sous l'ancien clone complet, avant Fix(ci): fetch-depth sans filtre de blobs -- 23x filter blob:none + gitleaks depth 1 (roo-extensions #4376, item 3) #22799 »). La borne de 30 min peut rester, c'est un majorant ;
  3. dire ici que c'est fait.

Ensuite, dossier du secrétariat à la nouvelle tête. La PR touche .github/ : je la merge moi-même.

jsboige and others added 2 commits October 28, 2026 10:18
…uree

La borne elle-meme ne change pas (`timeout-minutes: 30`) : ce qui change est
ce qu'elle pretend. Le commentaire citait une duree mesuree sur un clone
`fetch-depth: 0` complet, or ce job passe a `fetch-depth: 1` dans cette PR
(gitleaks detect --no-git ne lit que l'arbre de travail).

La mesure est datee a sa source : commit eae2eb2 (PR #22953, 2026-10-27),
qui a introduit le bloc -- 20 runs verts heberges, mediane 1,8 min, max
16,4 min.

Le commentaire dit desormais sur quelle forme la mesure a ete prise, et que
la duree sur `fetch-depth: 1` n'a pas ete re-mesuree. La borne reste ce
qu'elle a toujours ete : une borne de securite contre le run fige qui tient
un slot 6 h, pas une prevision de duree.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
@jsboige

jsboige commented Oct 28, 2026

Copy link
Copy Markdown
Owner Author

[LIVRÉ] lane myia-po-2023:CoursIA — main fusionné, borne datée, tête 2821cbf0577

Les trois points du dispatch c2723 sont traités.

1. main fusionné — merge c83f4262158. La fusion a apporté le bloc timeout-minutes: 30 qui n'existait pas dans la branche : c'est précisément lui qui portait la phrase devenue fausse. L'ordre comptait, la correction n'était pas possible avant.

2. La borne datée (.github/workflows/secret-scan.yml, job gitleaks). La borne ne bouge pas — ce qui change est ce qu'elle prétend :

Avant Après
« Duree mesuree sur 20 runs verts heberges : mediane 1,8 min, max 16,4 min (clone fetch-depth: 0 complet) » mesure datée au 2026-10-27 (commit eae2eb24d1, #22953), sur la forme fetch-depth: 0, et il est écrit que la durée sur fetch-depth: 1 n'a pas été re-mesurée

La date n'est pas inventée : je l'ai lue au commit qui a introduit le bloc (git log -S "mediane 1,8 min" → eae2eb24d1, 2026-10-27T16:23Z).

Ce que la phrase redevient explicitement : une borne de sécurité contre le run figé qui tient un slot 6 h — pas une prévision de durée. C'était déjà son rôle ; ça ne l'était plus dans la formulation.

3. Mesures post-fusion

  • 2821cbf0577 = tête poussée, vérifiée par git ls-remote (identique au HEAD local) ;
  • YAML relu par yaml.safe_load : jobs.gitleaks.timeout-minutes = 30, steps[0].with.fetch-depth = 1 ;
  • diff du commit : 1 fichier, +8/−3, commentaire seul — aucun job, aucun runs-on, aucun fetch-depth modifié par cette correction.

Ce que je n'ai pas fait, et pourquoi. Je n'ai pas re-mesuré la durée réelle sur fetch-depth: 1. Il faudrait 20 runs verts pour reproduire le protocole d'origine, et la borne n'en dépend pas : un fetch-depth: 1 ne peut pas être plus lent qu'un fetch-depth: 0 sur le même job. Le commentaire le dit au lieu de laisser croire à une mesure fraîche.

Reste au secrétariat le dossier, et à ai-01 le merge (.github/).

@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.

Lu à la tête 2821cbf. Le même geste dans 23 workflows (filter: blob:none, une ligne chacun) : un seul domaine, d'où les 25 fichiers. Le seul changement de fond est secret-scan.yml, qui passe en fetch-depth: 1. C'est sûr parce que les deux jambes lancent gitleaks detect --no-git (l.143 et l.192), c'est-à-dire l'arbre de travail seul. La borne de 30 min est datée et dite non re-mesurée sur la nouvelle forme (l.86-93). audit_workflow_path_filters.py vide l'exclusion devenue sans objet, et son test change de fixture en conséquence. Les 42 checks sont verts au dernier run, B.0 rc=0.

@myia-ai-01
myia-ai-01 merged commit d5ebab8 into main Oct 28, 2026
42 of 43 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.

3 participants