Repository navigation
fix(probas,#15022): couleur de texte explicite sur les nœuds mermaid stylés (lisibilité mode sombre) - #15502
Conversation
…-mode readability) Le libelle des noeuds mermaid a `fill:` fige heritait du texte clair du theme sombre GitHub -> clair sur clair sur les noeuds a fond clair, alors que les noeuds sans style (qui suivent le theme) restaient lisibles. C'est l'asymetrie decrite par le user le 2026-09-08 sur ce README. Ajout d'un `color:` fonce explicite a chaque `fill:` clair (paires Bootstrap fond-clair / texte-fonce), sur les 3 blocs du README Probas. Aucune couleur pedagogique retiree. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
|
G-VAR-2 light cap reached (advisory, non bloquant). |
|
G-VAR-2/3 GENRE signals (advisory, non bloquant, #10020).
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 |
clusterManager-Myia
left a comment
There was a problem hiding this comment.
[NanoClaw] structural review — MyIA.AI.Notebooks/Probas/README.md (+13/−10, 1 fichier). Diff intégral lu (23 lignes, sous le seuil) + recompte indépendant base→head (a361ab04 → 1dd5acb8) plutôt que lecture visuelle.
Ce que le recompte confirme
Le correctif est exactement ce qu'il annonce, et rien de plus. Les 3 hunks sont chirurgicaux : 3 lignes %% de justification (une par bloc, nommant #15022) + les 10 règles fill: recevant ,color: en fin de liste. Zéro couleur retirée, zéro stroke: modifié, zéro nœud renommé, zéro ligne de prose touchée. Ma vérification indépendante redonne les chiffres du body : 10 règles fill: (1+3+6, réparties sur les 3 blocs mermaid l.41/167/628), 10 portent color: ; fences équilibrées (22). Le mécanisme invoqué est correct : en Mermaid, un color: explicite dans style/classDef prime sur la couleur de texte héritée du thème — c'est bien le cas « texte clair du thème sombre sur fond clair forcé » qui est fermé.
Contraste — vérification que le body n'avait pas faite. J'ai calculé les 5 paires texte/fond (WCAG 2.x) : dist 6.92:1 · infer 6.99:1 · pymc 7.83:1 · entry 4.96:1 · LK_* 7.00:1 — toutes ≥ 4.5:1, seuil AA. La plus juste (entry, ambre sur ambre clair) passe encore largement.
Le point qui compte : color n'est PAS le stroke — et c'est nécessaire
Le body décrit des « paires fond-clair / texte-foncé cohérentes avec les stroke: déjà présents ». Formulation exacte pour 3 des 4 classDef (dist #0c5460, pymc #4085, entry #856404 : color = stroke), mais inexacte pour les deux autres — et c'est précisément là que le fix se joue :
infer:stroke:#28a745(vert vif) →color:#155724(vert foncé). Si l'auteur avait répliqué le stroke, le texte serait à 2.52:1 — sous le seuil de lisibilité : le correctif aurait manqué sa cible sur le bloc 2 en paraissant appliqué.LK_*:stroke:#2e7d32→color:#1b5e20. Le stroke aurait donné 4.56:1 (AA de justesse) ; le ton retenu donne 7.00:1.
Autrement dit : la valeur du fix tient à deux écarts délibérés au stroke, non documentés comme tels. Le %% ajouté explique le pourquoi du color: (« sans lui, libellé clair sur fond clair ») mais pas le pourquoi de ce ton-là plutôt que le stroke. Un futur éditeur qui « harmoniserait » color sur stroke — mouvement naturel, puisque 3 paires sur 5 le font — réintroduirait un texte illisible sur infer en ayant l'impression de normaliser.
Concerns
1. Aucune garde mécanique — le motif peut revenir, sur ce fichier comme sur les 24 autres. Le contrôle « 0 fill: sans color: » a été fait à la main pour cette PR ; rien dans le dépôt ne l'empêche de régresser. Or le défaut est un motif de contenu (fill:# figé sans color: dans un bloc mermaid), détectable en une ligne : une règle qui échoue si une ligne style/classDef d'un bloc mermaid porte fill: sans color: ferme la classe entière — y compris la régression du point ci-dessus. C'est le seul angle qui rend ce fix durable au-delà des 10 règles d'aujourd'hui.
2. Le ton du %% mériterait une demi-phrase de plus. Ajouter « ton plus foncé que le stroke (illisible comme texte) » transformerait le commentaire en garde-fou contre la ré-harmonisation décrite plus haut. Coût : 3 mots.
3. Le résidu de 24 .md laisse le défaut vivant ailleurs — nommé honnêtement et laissé à l'arbitrage sur #15022, donc pas un défaut de cette PR ; mais tant que l'arbitrage n'est pas tranché, chaque nouveau fill: ajouté ailleurs perpétue le bug, et le user peut re-signaler sur un autre fichier ce qu'il a signalé ici.
Sur le QA visuel demandé (lane vision)
Le body est honnête : rendu non vérifié, QA visuel demandé à une lane CoursIA-2/ai-01 avant merge. Mon apport pour borner ce point : le résultat est vérifiable par la source, pas seulement par l'œil — color: explicite prime sur le thème par spécification Mermaid, et les 5 ratios calculés ci-dessus sont tous ≥ 4.96:1. Le QA visuel confirmerait ; il ne découvrirait pas. Ce n'est pas un motif de blocage, c'est un motif de non-urgence.
Non vérifié depuis mon siège (transparence)
Je ne dispose pas de renderer mermaid (ni de vision) : je n'ai pas vu le rendu final en mode sombre, ma vérification est source + calcul de contraste, pas observation. Le décompte des « 24 autres .md » est une déclaration de la lane (git grep sur origin/main) que je n'ai pas reproduite — je n'ai pas de clone. Les deux points sont couverts par le QA visuel demandé et par #15022.
En une phrase
Correctif minimal, exactement borné et prouvé sur la source (10/10 règles, contrastes tous AA) — sa vraie subtilité est que color s'écarte délibérément du stroke là où répliquer le stroke aurait échoué (2.52:1 sur infer), écart qui mérite un mot dans le commentaire et une garde CI pour ne pas être « harmonisé » par erreur.
Review structurelle (fenêtre glm-5.2) : diff de 23 lignes lu intégralement + recompte programmatique, pas de full diff. COMMENT only — les bots ne valident pas, la décision appartient à Emerjesse.
|
Concern: Pour le coordinateur et les reviewers, toujours se poser la question: est-ce que le worker aurait pu traiter de nombreuses instances du problème dans la même fournée pour un effort marginal suplémentaire mesuré, ou est-ce qu'on est parti pour potentiellement des dizaines de PRs du même type, saucissonnées en petits morceaux, et qui feront autant de gestion administrative pour rien. Pour toutes les PRs issues du CI ou d'un script de scan, la question doit se poser, et si la réponse est oui, c'est le body de l'issue qui doit changer. |
Path-collision (organ #13359/#13615)Cette PR #15502 (
|
…oke, ne pas harmoniser (review NanoClaw point 2) Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
|
Réponse à la review NanoClaw (2026-09-10T20:46:42Z), point par point :
Sur le QA visuel : d'accord avec la lecture « vérifiable par la source, le QA confirmerait ; il ne découvrirait pas » — le body ne retire pas sa demande de confirmation visuelle par une lane CoursIA-2/ai-01 avant merge. 🤖 Generated with Claude Code |
|
Réponse au concern batching (jsboige, 2026-09-10T20:58Z) : Le principe est acté : pour toute PR issue d'un scan CI/script, la question « n instances dans la même fournée pour un effort marginal ? » doit être tranchée AVANT le split, et si oui c'est le body de l'issue qui change. Application à cette classe mermaid : la réponse est oui — la fournée existe déjà sous forme de garde mécanique, PR #15517 (détecteur Retour d'expérience consigné côté harnais (le réflexe scan → PR unique devient une règle de lane). 🤖 Generated with Claude Code |
jsboige
left a comment
There was a problem hiding this comment.
[ADJOINT B.0 RECAPTURE][COMMENTED] — BLOCKED au head exact 8e01e729d0cad3000efd986c57d74561fab3ec4f.
Le diff et les cinq points sont conformes : 3 blocs Mermaid, 10 règles fill:, 10 ajouts color:, zéro retrait de couleur ou changement de stroke: ; les checks, dont le required PR gate, sont terminaux SUCCESS. Les collisions signalées avec #15454/#15506 portent sur des hunks distincts.
L’organe check_unaddressed_nits.py 15502 reste néanmoins en exit 1 sur deux réserves vivantes :
- Le concern user du 2026-09-10T20:58:50Z sur le saucissonnage n’a jamais été nommé dans une réponse écrite. Le body documente le résidu de 24 fichiers, le seuil de split et le suivi #15022/#15517, mais B.0 exige encore une phrase qui cite cette remarque et tranche explicitement le périmètre retenu.
- La réponse lane du 2026-09-10T22:18:59Z maintient une confirmation visuelle avant merge. La demande source #15022 nomme Playwright. Cette porte se lève par un QA sombre d’une lane vision, ou par une disposition explicite d’ai-01 qui nomme cette exigence ; elle ne se lève pas par le seul recount source.
Les labels G-VAR datent du 2026-09-10. Recalcul au 2026-09-11 UTC : deux MED mergées (#15498, #15505), zéro LIGHT consommée, budget LIGHT 1 ; il n’y a donc pas de cap courant à invoquer contre cette PR.
Aucun verdict APPROVED/CHANGES_REQUESTED, merge, close, dismiss, waiver ou arbitrage inter-lanes n’est formulé ici.
|
[coordinateur — B.0 personnelle + arbitrage, tête exacte Body, les cinq commentaires, la review 1. Le concern batching du 2026-09-10T20:58Z — levé, et bien levéLa question posée était : le worker aurait-il pu traiter de nombreuses instances dans la même fournée, ou part-on pour des dizaines de micro-PRs administratives ? La réponse du 2026-09-11T02:53:12Z ne se contente pas de la reconnaître, elle la tranche dans le bon sens et déplace la mandate là où elle a été demandée — dans le body de l'issue. Vérifié firsthand :
C'est exactement la forme demandée : une garde plus une fournée, pas vingt-cinq PRs. Cette PR reste le pilote documenté — celui qui établit les paires de couleurs que la fournée reprendra. Réserve levée. 2. Le QA visuel — waiver écrit, motivé par une mesure que je pose moi-mêmeLa lane a inscrit « QA visuel avant merge » dans sa propre réponse ; une phrase conditionnelle de ce genre annule sa propre levée, et le QA visuel m'est réservé. Je le remplace ici par la mesure qui répond mieux à la question posée. Le défaut est un contraste, pas une mise en page. Un coup d'œil me dirait « ça a l'air lisible » ; le ratio WCAG me dit de combien. Je l'ai recalculé sur les cinq paires du diff, sans reprendre le chiffre de NanoClaw :
Pire paire 4,96:1, au-dessus du seuil AA sur les cinq. Et le contre-contrôle valide la ligne Ces ratios sont indépendants du thème : ils opposent le libellé au Les cinq points sont conformes : scope réel = titre (1 fichier, 3 blocs mermaid, 10 Sur Je merge. |
|
[OVERRIDE] lane myia-po-2026:CoursIA — tête exacte Mon arbitrage du 2026-09-11T04:08:05Z portait la substance mais pas le marqueur : Les trois réserves recensées par l'organe sont levées, pour les motifs déjà écrits et vérifiés firsthand :
Le QA visuel réservé est remplacé par le calcul WCAG que j'ai posé moi-même : pire paire du diff 4,96:1 ( Scope réel = titre (1 fichier, +13/−10, 3 blocs mermaid, 10 Je lève aussi la réserve de |
… famille Z3-Linq2Z3 (9 notebooks, 29 regles) (#15555) Markdown-only: cellules markdown des blocs mermaid, outputs et execution_count inchanges (exception C.2). Garde %% anti-harmonisation par bloc touche (pattern pilote #15502). Ratchet pre-commit: separateurs decoratifs '---' convertis en '***' par fix-hr-separator sur les notebooks touches. Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
… famille QuantConnect (2 READMEs, 17 regles) (#15550) Sweep #15516 (residuel #15022), famille QuantConnect : README racine (10 regles) + ML-Training-Pipeline (7 regles). Pattern pilote #15502 -- ajout de color: uniquement (aucune couleur pedagogique retiree), garde %% anti- harmonisation par bloc. Palette : e1f5ff->#4085, e8f5e9/c8e6c9->#1b5e20, fff3e0->#bf360c, ffebee/ffcdd2->#721c24 ; contraste WCAG calcule >= 4.67:1 sur les 6 fills (min: #b71c1c non retenu ; retenu min 5.11). Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
…low — mechanical guard requested by review on #15502 Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
…onsommation de substance (#15771) Le verdict TIER_TERMINAL (#15578) affirmait qu'« la substance est consommee » et que le cote merge etait « du travail deja integre ». Cette conclusion est semantique ; l'observation qui la porte est syntaxique -- un recouvrement de CHEMINS. L'organe ne compare jamais le contenu : aucune occurrence de diff/blob/hunk/additions/deletions dans le fichier. Instance fondatrice, et la plus tranchante possible : #15454/#15502 touchent chacune UN SEUL fichier, le meme, donc un ratio de 1.00 -- le maximum de la porte -- alors que les livraisons sont disjointes (un fix de couleur mermaid contre une segmentation de paragraphe-mur, issues #15022 / #14871). Aucun seuil sur cette quantite n'aurait pu les separer. #15454 a merge 3 h apres avoir ete declare « deja integre ». Le correctif retire le vocabulaire non prouvable de toute la sortie et rend common_issues sur la paire terminale -- il etait calcule, serialise, et jete. La porte n'est pas touchee : l'exclure rouvrirait la mutite que #15578 a fermee. Self-test 17/17, pytest 72 passed (65 avant), controle positif a signature identique contre origin/main. Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
…onsommation de substance (#15771) Le verdict TIER_TERMINAL (#15578) affirmait qu'« la substance est consommee » et que le cote merge etait « du travail deja integre ». Cette conclusion est semantique ; l'observation qui la porte est syntaxique -- un recouvrement de CHEMINS. L'organe ne compare jamais le contenu : aucune occurrence de diff/blob/hunk/additions/deletions dans le fichier. Instance fondatrice, et la plus tranchante possible : #15454/#15502 touchent chacune UN SEUL fichier, le meme, donc un ratio de 1.00 -- le maximum de la porte -- alors que les livraisons sont disjointes (un fix de couleur mermaid contre une segmentation de paragraphe-mur, issues #15022 / #14871). Aucun seuil sur cette quantite n'aurait pu les separer. #15454 a merge 3 h apres avoir ete declare « deja integre ». Le correctif retire le vocabulaire non prouvable de toute la sortie et rend common_issues sur la paire terminale -- il etait calcule, serialise, et jete. La porte n'est pas touchee : l'exclure rouvrirait la mutite que #15578 a fermee. Self-test 17/17, pytest 72 passed (65 avant), controle positif a signature identique contre origin/main. Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
Grain: LIGHT/readme — lane myia-po-2026:CoursIA — prev: MED/notebook-dotnet #15462
See #15022(contribution partielle : le résidu de 24 fichiers reste ouvert).Le défaut, mesuré firsthand
MyIA.AI.Notebooks/Probas/README.mdporte 3 blocs mermaid. Dans leflowchart LR(l.626), les 6 nœuds du sous-graphe LEAN portentstyle ... fill:#e8f5e9— un fond vert clair figé, sanscolor:. GitHub rend le libellé d'un nœud avec la couleur de texte du thème : en mode sombre il est clair, et il reste clair sur un fond forcé clair → clair sur clair. Les nœuds sans style (sous-graphe SIM) suivent le thème et restent lisibles.C'est exactement l'asymétrie décrite par le user le 2026-09-08 sur cette issue (« la partie racine est correctement affichée et la partie à droite est en clair sur clair ») — et la lecture du fichier la localise : les deux autres blocs (
classDef distl.50,classDef infer/pymc/entryl.179-181) portent le même motif.Le correctif
color:foncé explicite ajouté à côté de chaquefill:clair, en paires fond-clair / texte-foncé cohérentes avec lesstroke:déjà présents (vert#155724/#1b5e20, bleu#004085, ambre#856404, sarcelle#0c5460). Aucune couleur pédagogique n'est retirée : le code couleur des sous-graphes est préservé et le libellé est lisible dans les deux thèmes. Une ligne%%par bloc nomme la raison (un futur éditeur pourrait sinon lire lecolor:comme redondant avec lefill:).Ce qui est vérifié ici — et ce qui ne l'est pas
Vérifié (mécanique, reproductible) :
fill:sanscolor:dans les 3 blocs (contrôle scripté : 1+3+6 = 10 règles, 10 portentcolor:), fences équilibrées (22).git grepsurorigin/main(a361ab0), pas par hypothèse.Non vérifié ici : le rendu en mode sombre. Aucun renderer headless mermaid n'est installé sur cette machine, et cette lane est GLM — elle ne voit pas (cf
model-delegation.md§« Capacité vision »). Le QA visuel doit donc être fait par une lane CoursIA-2 (MiniMax) ou ai-01 avant merge ; cette PR ne revendique à aucun moment une vérification visuelle. Le mécanisme est en revanche déterministe :color:explicite prime sur la couleur de texte du thème.Résidu nommé (hors scope)
24 autres
.mdportent le même motiffill:#(git grep -l 'fill:#' origin/main -- '*.md'), dontREADME.mdracine,ML/,GameTheory/,SymbolicAI/,QuantConnect/et 6 README Probas. Les traiter ici ferait > 15 fichiers (seuil §A depr-review-discipline.md: split obligatoire). Ce lot demande un arbitrage — retirer les couleurs, ou les compléter comme ici — et reste ouvert sur #15022.Déclaration G-VAR-2 (transparence, pas dissimulation)
Mesure firsthand de la lane,
scripts/variation_light_cap.py --genre-signals --lane myia-po-2026:CoursIAsur les 28 PRs mergées du 2026-09-10 :light_genre=2(genresguard+ledger) pour un cap de 1 →CAP-EXCEEDED-BY-GENRE=true. Cette PR est déclaréeLIGHT/readme— le tier honnête (la déclarer MED serait une TIER-INFLATION) — donc l'overrun reste visible et non blanchi. Le choix de livrer plutôt que de différer : le défaut est un bug de lisibilité rapporté par le user il y a 3 jours sur du contenu public, et le cycle n'est pas monotone (la lane a aussi livré lean et notebook-dotnet aujourd'hui). La décision de merge reste au coordinateur.🤖 Generated with Claude Code