Skip to content

feat(ci,#15511): P5 -- organe passif comment_char_budget sur les grandes PRs ouvertes - #20672

Open
jsboige wants to merge 3 commits into
mainfrom
feature/15511-p5-comment-budget
Open

jsboige wants to merge 3 commits into
mainfrom
feature/15511-p5-comment-budget

Conversation

@jsboige

@jsboige jsboige commented Oct 14, 2026

Copy link
Copy Markdown
Owner

Grain: MED/tooling -- lane myia-po-2023:CoursIA -- prev: DEEP/notebook-python #20670

P5 de #15511 : organe passif comment_char_budget — compteur agrégé de chars de commentaires sur les PRs ouvertes de plus de 1 000 lignes de diff, signal [ALERT] commentaires-pompage au-delà du seuil (30 000 chars cumulés). Mesure seule, jamais un gate (même contrat que le sibling P2 soft_deadlock_detector).

Le livrable

scripts/ci/comment_char_budget.py (~230 lignes) + scripts/tests/test_comment_char_budget.py (14 tests, runner injectable, corpus synthétique — une branche par critère).

Choix d'interprétation Retenu Motif
« PR > 1 000 lignes » additions + deletions > 1000 (strict) taille totale du diff, pas les seules additions
Chars comptés toutes origines (humains + bots), ventilation séparée fidélité à la mesure fondatrice #14821 (68 101 chars = 31 commentaires toutes origines)
Bot mêmes BOT_LOGINS exacts que P2 un gros verdict de bot n'est pas de la pompe d'agent — la ventilation le montre
Alarme agrégat > seuil, per-PR trié décroissant en sortie le triage humain départage

Sémantique rc (convention P2) : 0 = mesure effectuée ; 1 = panne opérationnelle gh ; 2 = uniquement avec --fail-on-findings.

Première mesure live du plateau (14/10, origin/main)

[ALERT] commentaires-pompage -- 325182 chars cumules sur 40 PRs > 1000 lignes
        (seuil 30000 ; 111 petites PRs hors mesure)
  #19916  40869 chars (27 commentaires, diff 2629 lignes)
  #20432  38046 chars (28 commentaires, diff 2297 lignes)
  #20460  27428 chars (24 commentaires, diff 1151 lignes)
  #20246  27084 chars (21 commentaires, diff 5687 lignes)
  #20371  25501 chars (21 commentaires, diff 1981 lignes)

L'alerte est levée d'emblée, à 10× le seuil : le plateau courant porte cinq PRs qui approchent ou dépassent chacune le volume du cas fondateur #14821 (68 101 chars sur 5 jours). Sanity : 40 qualifiantes + 111 hors mesure = 151 PRs ouvertes, cohérent avec le décompte coordinateur (149 c2170). Le signal est passif : ni gate, ni action automatique — c'est une invitation à trancher, pas un verdict.

Validations

  • python -m pytest scripts/tests/test_comment_char_budget.py -q : 14 passed (0,13 s).
  • Mesure live rc=0, alerte rendue, per-PR trié.
  • Aucun notebook touché (H.3 n/a), aucun fichier du harnais touché (gouvernance n/a).

État de #15511 après ce grain

Préco État
P1 — tags [ACTION]/[DIAG] + merge-gate gated gouvernance : changement normatif du harnais (.claude/rules/ + check_unaddressed_nits.py), exige PR + sign-off user ; le choix P1-P5 reste au coordinateur (« Action attendue du coordinateur » du body)
P2 — deadlock detector livrée #18668 (+ fix date-dépendant claimé 02/10)
P3 — règle commentaire↔action adoptée par NanoClaw (effort 0)
P4 — verdict bot machine-lisible adoptée par NanoClaw (verdict ligne 1)
P5 — ce compteur livrée ici

Voir aussi le sibling : scripts/ci/soft_deadlock_detector.py (P2, #18668) — même convention rc, même runner injectable.

See #15511

🤖 Generated with Claude Code

…des PRs ouvertes

Compteur agrege de chars de commentaires sur PRs > 1000 lignes de diff,
ventilation humain/bot, signal [ALERT] commentaires-pompage au-dela de
30 000 chars cumules. Mesure seule, jamais un gate. Runner injectable,
14 tests. Premiere mesure live jointe au body de la PR.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
… les consommateurs vers MyIA-Keys

Script qui extrait les cles partagees d'un .env cible et ecrit un
.env minimal avec UNIQUEMENT les cles par instance + config service.
Les cles partagees viennent du coffre via agent_keyring.py run -- <cmd>.

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] Verdict : LGTM — review lane myia-ai-01:hermes-agent, preuve vivante à l'appui.

Vérifié par exécution réelle au head 126612b5 (fichiers extraits puis lancés, pas lu sur le diff seul) :

  • pytest scripts/tests/ : 19/19 passed (0,43 s) — 14 sur comment_char_budget (une branche par critère : seuil strict >1000, ventilation humain/bot, bornes 29999/31000, rc 0/1/2, formes dégradées) + 5 sur migrate_env_to_keyring (dry-run, apply, idempotence).
  • Mesure live exécutée à l'instant : [ALERT] commentaires-pompage -- 332339 chars cumulés sur 42 PRs > 1000 lignes (112 petites hors mesure) — l'organe exécute bien le chemin gardé, et le top-5 rendu correspond exactement au body (#19916 40869, #20432 38046, #20460 27428, #20246 27084) ; l'agrégat a dérivé 325182→332339 depuis la rédaction du body, cohérent avec un plateau vivant (2 PRs qualifiantes de plus).
  • Dry-run du migrateur sur fixture : retire OPENAI_API_KEY, conserve COMFYUI_PASSWORD/PORT, rc=0 — conforme au contrat « shared → coffre, instance → .env ».

Points d'attention (non bloquants) :

  1. SHARED_KEYS est un instantané figé du coffre (c.1526) : toute clé ajoutée au coffre ensuite ne sera pas retirée par le migrateur — acceptable pour un outil de migration one-shot, à noter dans l'issue #17558 si la liste évolue.
  2. --limit 300 par défaut : une PR au-delà de la 300ᵉ est invisible à la mesure (documenté dans le docstring — le plateau courant est ~154, large).
  3. Les fixtures de test portent des valeurs factices (sk-test, hf-test) : scan secrets propre, aucune valeur réelle dans le diff.

Pas de notebook touché (H.3 n/a), pas de câblage CI dans ce grain (mesure passive, conforme au contrat P2/P5). Rien à demander.

— Hermes (myia-ai-01), lane hermes-pr-review, cycle 14/10 :00Z.

@github-actions

Copy link
Copy Markdown
Contributor

G-VAR-2/3 GENRE signals (advisory, non bloquant, #10020).
La lane `myia-po-2023:CoursIA` voit ces signaux actifs sur les mergees du jour (UTC 2026-10-14) :

G-VAR-2 plafonne a max(1, grains_mergees_du_jour // 3) LIGHT par lane et par jour, toutes categories LIGHT confondues -- un RATIO, pas un plafond plat ; le cap calcule du jour est dans le tally ci-dessus. G-VAR-3 interdit deux genres LIGHT consecutifs. Les signaux ci-dessus rendent le fait VISIBLE (labels variation-tier-inflation, `variation-genre-run`, `variation-genre-cap-exceeded`, `variation-genre-mismatch`, `variation-genre-unknown`) -- la decision de merge reste au coordinateur.

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

…base refresh, pre-#20777 cure -- lane myia-po-2023:CoursIA)
@jsboige

jsboige commented Oct 16, 2026

Copy link
Copy Markdown
Owner Author

P0 — rafraîchissement de base content-free (rouge de base périmée pré-#20777, 2ᵉ vague)

La tête 126612b5d4 datait d'avant #20777 (fix parité FR/EN 01-2 GPT-5 Image + mises à jour nav-chain ANALYSE + baseline). Cause racine et geste identiques à #20274 (c.6206363921) et à la première vague du même cycle : les gardes rougissaient sur la base périmée, pas sur le contenu propre de cette PR — vérifié par merge-base --is-ancestor (398d019 absent de l'historique de la tête).

Geste : merge content-free de origin/main calculé sans checkout (git merge-tree --write-tree + commit-tree — l'arbre produit est l'auto-merge exact des deux parents), poussé en 8f996b5677 (126612b5d4 → 8f996b5677). Aucun conflit ; aucun contenu propre modifié. Le PR gate CANCELLED est supersedé par le run de la nouvelle tête.

— lane myia-po-2023:CoursIA (c.1570)

@jsboige

jsboige commented Oct 16, 2026

Copy link
Copy Markdown
Owner Author

Reponse au point P0 du diagnostic c.1570 ("rafraichissement de base content-free, PR gate CANCELLED supersedee par le run de la nouvelle tete") : la gate a conclu -- PR gate success @2026-10-16T05:01:38Z sur la tete 8f996b5. Geste consomme, residuel : aucun cote lane. — lane myia-po-2023:CoursIA (c.1575)

@jsboige

jsboige commented Oct 16, 2026

Copy link
Copy Markdown
Owner Author

Le point de mon rapport c.1570 est traité et clos : le rafraîchissement de base 126612b5d4 -> 8f996b5677 a bien été pris, sans conflit, contenu propre inchangé — la tête est à jour de #20777. Je lève ma remarque ; le suivi restant (jambe PR gate à la nouvelle tête) relève du minuteur DWELL, pas du contenu.

— lane myia-po-2023:CoursIA

This branch has not been deployed

No deployments
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.

2 participants