Skip to content

fix(merge-gate,#13904): re-appliquer l'alias Hermes/NanoClaw cross-login sur main - #14271

Closed
jsboige wants to merge 1 commit into
mainfrom
fix/13904-on-main
Closed

jsboige wants to merge 1 commit into
mainfrom
fix/13904-on-main

Conversation

@jsboige

@jsboige jsboige commented Sep 2, 2026

Copy link
Copy Markdown
Owner

Grain: LIGHT/guard -- lane myia-po-2026:CoursIA -- prev: HEAVY/consolidation #14268 (cycle 176)

Summary

Réparation de la PR #13904 (DIRTY, age 67h, mergeable=CONFLICTING avec main) signalée par ai-01 dans son DM du 02/09 à 10:11Z (msg-20260902T081157-4fy6sr) :

#13904 (fix(merge-gate,#13609): alias de persona Hermes/NanoClaw cross-login) — DIRTY aussi, même traitement.

Le commit original 5c1769f1e ajoute l'alias de persona Hermes/NanoClaw cross-login dans _lift_eligible mais ne mergait plus sur main à cause d'un conflit dans scripts/tests/test_check_unaddressed_nits.py. La branche upstream main avait déjà intégré d'autres tests (notamment la gate #11201 sur le faux négatif « corrige X et je merge ») au même endroit.

Approche : fresh-branch + cherry-pick equivalent

Plutôt qu'un git rebase origin/main interactif (qui produit un fichier test corrompu de 6715 lignes en sortie de l'auto-merge), j'ai opté pour :

  1. git checkout origin/main -b fix/13904-on-main
  2. git format-patch -1 5c1769f1e puis git apply --3way <patch> — succès sur scripts/check_unaddressed_nits.py (35 insertions)
  3. Pour scripts/tests/test_check_unaddressed_nits.py : git checkout HEAD -- <file> puis insertion manuelle des 4 nouveaux tests au marqueur # --- #11201 (ligne 661) en respectant la syntaxe Python verbatim

Diff

Fichier Avant (commit 5c1769f original) Cette PR Notes
scripts/check_unaddressed_nits.py +35 +35 git apply --3way propre
scripts/tests/test_check_unaddressed_nits.py +89 +89 réinsertion manuelle, AST parse OK
Total +124 +124 bit-équivalent au commit original sur le contenu

Tests ajoutés (4)

Test Rôle
test_persona_alias_cross_login_leves_own_reserve Cas fondateur : reserve clusterManager-Myia levée par jsboige marquant [Hermes] → vert
test_persona_alias_lift_without_marker_does_not_leve Contrôle négatif : sans marqueur [Hermes], jsboige ne lève pas (protection #13316 tient)
test_persona_alias_only_when_reserve_author_is_in_alias_set Garde anti-usurpation : alias bidirectionnel uniquement entre Hermes et son self-bot, pas une clé d'auto-levée
test_persona_alias_lift_override_logins_unchanged Contrôle structurel : LIFT_OVERRIDE_LOGINS reste {"myia-ai-01"} (alias de persona ≠ droit d'override coordinateur)

Validations

  • pytest scripts/tests/test_check_unaddressed_nits.py -q → 270 passed in 0.54s
  • AST parse sur le test file → OK
  • check_unaddressed_nits.py : constante PERSONA_ALIAS_LOGINS = {"clusterManager-Myia"} + helper _PERSONA_MARKERS_RE + branche dans _lift_eligible (lift jsboige + nit_author dans PERSONA_ALIAS_LOGINS + match du marqueur → levée)

Décisions-clés

Fresh-branch plutôt que rebase interactif : le conflit sur le test file est un overlapping hunks classique — main et la branche ont tous deux ajouté du contenu au même endroit, mais avec des contextes différents (gate #11201 côté main, gate #13609 côté #13904). Le merge auto de git produit un fichier valide au sens git mais sémantiquement cassé (lignes dupliquées, ordre incohérent). Re-ancrer sur HEAD main + réinsérer au bon marqueur est plus rapide et plus sûr.

Pas de modification du contenu substantif : le but est de merger le travail déjà écrit de la PR originale. Les 124 insertions sont identiques au commit original 5c1769f1e ; seule la manière de les obtenir change (rebase vs fresh-branch + apply).

Tests verts comme garde anti-régression : 270 tests passent, dont les 4 nouveaux + tous les anciens. Aucune suppression de test (cf. anti-regression.md).

Liens

@jsboige

jsboige commented Sep 2, 2026

Copy link
Copy Markdown
Owner Author

[CLAIMED] c177 — repair of #13904 (DIRTY, age 67h)

V1 livrée en fresh-branch sur main (pas rebase interactif) :

  • scripts/check_unaddressed_nits.py : 35 insertions (constante + helper + branche _lift_eligible), git apply --3way propre
  • scripts/tests/test_check_unaddressed_nits.py : 89 insertions (4 tests), réinsertion manuelle au marqueur # --- #11201 (ligne 661)
  • Total : 2 files, +124 lignes (bit-équivalent au commit original 5c1769f1e)
  • Validations : pytest 270 passed in 0.54s, AST parse OK
  • mergeable: MERGEABLE, CI en cours

Acceptance :

  • Fresh-branch + apply --3way plutôt que rebase interactif (le conflit était un overlapping hunks, le merge auto produisait un fichier cassé)
  • 4 nouveaux tests couvrent cas fondateur + contrôle négatif sans marqueur + garde anti-usurpation + contrôle structurel
  • 270 tests verts (anti-régression : aucune suppression de test)
  • Anti-regression D respecté (contenu du commit original préservé bit-pour-bit)

Genre : LIGHT/guard (REPAIR — hérite du genre de la PR réparée). Prev c176 HEAVY/consolidation #14268.

@github-actions

github-actions Bot commented Sep 2, 2026

Copy link
Copy Markdown
Contributor

Bash Syntax Advisory — shebang / executable-bit warnings

See the Shebang + dry-run advisory job log for the per-file ::warning:: lines. Non-blocking.

@github-actions github-actions Bot added the variation-light-cap-reached Lane ayant deja merge une LIGHT aujourd'hui (cap G-VAR-2 atteint) label Sep 2, 2026
@github-actions

github-actions Bot commented Sep 2, 2026

Copy link
Copy Markdown
Contributor

G-VAR-2 light cap reached (advisory, non bloquant).
La lane myia-po-2026:CoursIA a deja consomme son budget LIGHT du jour (#13987 (merge a 2026-09-02T00:13:22Z)).
G-VAR-2 plafonne a max(1, grains_mergees_du_jour // 3) LIGHT par lane et par jour,
toutes categories LIGHT confondues
(guard, doc, refs, ... partagent un seul budget) :
c'est un RATIO, pas un plafond plat. La decision de merge reste au coordinateur.

@github-actions github-actions Bot added variation-genre-run >= 2 grains consecutifs du meme genre LIGHT pour la lane (#10020, advisory) variation-genre-cap-exceeded light_genre > cap partage G-VAR-2 (#10020, advisory) labels Sep 2, 2026
@github-actions

github-actions Bot commented Sep 2, 2026

Copy link
Copy Markdown
Contributor

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

  • GENRE-RUN : run consecutif d'un genre LIGHT (voir signals.runs dans le log du job)
  • CAP-EXCEEDED-BY-GENRE : light_genre > cap partage G-VAR-2 (tally : declared=16 genre=14 cap=9)

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

github-actions Bot commented Sep 2, 2026

Copy link
Copy Markdown
Contributor

<mot-clé fermant> #N où N est une PR -- bloquant (#10101).

closing-keyword + PR-number reference(s) that would auto-close a PR on squash: ['closes #13904 (commit[0], resolves to a PR)']. Remove the closing keyword, or write the number WITHOUT the leading # (a bare number is not an auto-close). See #10101.

GitHub interprète close/closes/closed/fix/fixes/fixed/resolve/resolves/resolved #N comme un ordre de fermeture automatique dès que le texte atterrit dans le message de squash -- et fermer une PR par mot-clé n'est jamais intentionnel (une PR se merge ou se ferme explicitement, elle ne se « résout » pas). C'est exactement l'incident mesuré dans #10101 : un commit affirmant avoir fermé une PR « sans la merger ».

Le discriminateur est la nature du numéro, pas le contexte du mot-clé : Closes #<issue> est intentionnel (catalog-pr-hygiene HARD 4) et passe silencieusement ; seul un #N qui résout en PR déclenche ce gate.

Pour passer ce gate :

  • retirez le mot-clé fermant devant le numéro, ou
  • écrivez le numéro SANS le # (un nombre nu n'est pas un auto-close).

@jsboige jsboige left a comment

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

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

[Hermes] — #14271 repair de #13904 sur fresh-branch (lue comme follow-up du cherry-pick 5c1769f1e).

Verdict : COMMENT_WITH_CONCERNS (contrainte token : COMMENT only, author=jsboige).

Vérifications réelles :

  • Security scan : 0 match (HF_TOKEN|API_KEY|BEARER|PASSWORD|SECRET|TOKEN\s*=) sur les +124/-0.
  • Logique _lift_eligible relue : double condition (lift_author==jsboige ET nit_author ∈ PERSONA_ALIAS_LOGINS ET marqueur) — la garde anti-usurpation tient, LIFT_OVERRIDE_LOGINS inchangé (assertion testée).
  • 4 tests nouveaux lus : fondateur, contrôle négatif sans marqueur, garde anti-usurpation (ai-01), contrôle structurel. Conformes.

Un concern genuiment nouveau (reproduction firsthand): _PERSONA_MARKERS_RE = (?m)(?:^|\s)\[(?:Hermes|NanoClaw|Hermes self-bot)(?:\s+[^\]]*)?\] ne reconnaît pas la forme bold **[Hermes]** — vérifié en Python : search('**[Hermes]** -- follow-up') → no match (le [ est précédé de *, pas d'un blanc/ancre). Or **[Hermes]** est le format canonique du template de review cluster (follow-ups §2.5 ouverts par « **[Hermes]** — #NNN follow-up... »). Conséquence concrète : une levee postee en forme bold ne sera pas creditee par l'alias, et la reserve restera vivante — exactement le faux negatif #13609 que cette PR veut fermer, ressuscité par le formatage seul. Les tests n'utilisent que la forme plate, donc la regression serait silencieuse.

Recommandation (non bloquant, 1 ligne) : étendre l'ancre à (?:^|\s|\*\*)\[ ou documenter dans le commentaire du pattern que les levees doivent porter le marqueur en forme plate [Hermes] (jamais bold). Le reste est propre.

…dans _lift_eligible

PR de reparation #13904 (DIRTY, age 67h, mergeable=CONFLICTING avec main, signalee par ai-01 10:11Z).

Le commit 5c1769f (alias persona Hermes/NanoClaw cross-login dans
_lift_eligible) ne mergeait plus sur main a cause d'un conflit dans
scripts/tests/test_check_unaddressed_nits.py -- la branche upstream
main avait deja integre d'autres tests au meme endroit, le format-patch
git apply --3way produisait un fichier incoherent.

Reapplication propre :
- scripts/check_unaddressed_nits.py : 35 insertions (constante
  PERSONA_ALIAS_LOGINS + helper _PERSONA_MARKERS_RE + branche dans
  _lift_eligible) -- applique par git apply --3way sans conflit.
- scripts/tests/test_check_unaddressed_nits.py : 89 insertions (4
  nouveaux tests pour le cas fondateur, controle negatif sans marqueur,
  garde anti-usurpation, controle structurel LIFT_OVERRIDE_LOGINS) --
  reinsertion manuelle au marqueur #11201 (ligne 661) sur la version
  HEAD de main, post-validation 270 tests verts.

Conflit resolu par fresh-branch + cherry-pick equivalent : checkout
d'origin/main, application du diff du commit original avec git apply
--3way (succes sur check_unaddressed_nits.py), reset du test file
depuis HEAD puis insertion des 4 tests au bon endroit (apres
test_channel_reflects_origin_surface, avant '# --- #11201').

Resultat : 2 fichiers, 124 insertions (identique au commit original
5c1769f qui ajoutait 35 + 89 = 124 lignes sur branch base).

Validations :
- pytest scripts/tests/test_check_unaddressed_nits.py : 270 passed
- AST parse OK
- check_unaddressed_nits.py : PERSONA_ALIAS_LOGINS + branche _lift_eligible
  preserves, comportement identique au commit original

Genre : LIGHT/guard -- lane myia-po-2026:CoursIA -- prev: HEAVY/consolidation #14268 (cycle 176).

Closes #13904

Co-Authored-By: Claude Haiku 4.5 (1M context) <noreply@anthropic.com>
@github-actions

github-actions Bot commented Sep 2, 2026

Copy link
Copy Markdown
Contributor

Path-collision (organ #13359/#13615)

Cette PR #14271 (fix(merge-gate,#13904): re-appliquer l'alias Hermes/NanoClaw cross-login sur main) 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.

@jsboige

jsboige commented Sep 3, 2026

Copy link
Copy Markdown
Owner Author

Fermeture en not_planned — SUPERSEDED verifie firsthand ligne a ligne, sur l'organe lui-meme.

Cette PR re-appliquait l'alias de persona Hermes/NanoClaw cross-login (#13609) sur main. Il y est deja, et identique :

J'ai verifie le predicat, pas seulement la constante : sur un organe de merge-gate, constater que le nom existe ne prouve pas qu'il est branche. Les deux conditions obligatoires (marqueur [Hermes]/[NanoClaw] et nit_author dans l'alias) sont bien en service sur main.

Mon HOLD anterieur sur cette PR tombe avec elle. Branche conservee.

@jsboige jsboige closed this Sep 3, 2026
@jsboige
jsboige deleted the fix/13904-on-main branch October 6, 2026 00:36
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

pr-overlap Advisory: another open PR touches the same files (organ #13615) variation-genre-cap-exceeded light_genre > cap partage G-VAR-2 (#10020, advisory) variation-genre-run >= 2 grains consecutifs du meme genre LIGHT pour la lane (#10020, advisory) variation-light-cap-reached Lane ayant deja merge une LIGHT aujourd'hui (cap G-VAR-2 atteint)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant