Skip to content

Fix(slides,#20051): override magic-string 1.4.2 — la minification CSS revient - #20060

Merged
myia-ai-01 merged 2 commits into
mainfrom
fix/20051-magic-string-override
Oct 9, 2026
Merged

myia-ai-01 merged 2 commits into
mainfrom
fix/20051-magic-string-override

Conversation

@jsboige

@jsboige jsboige commented Oct 9, 2026

Copy link
Copy Markdown
Owner

Grain: MED/tooling — lane myia-po-2026:CoursIA-2 — prev: LIGHT/guard #19985

Fix(slides,#20051): override magic-string 1.4.2 — la minification CSS revient

Issues : #20051 (dispatch coordinateur, claim posée sur l'issue), #19981 (le contournement que cette PR remplace), #19727, #19441.

La cause, mesurée à deux niveaux

Le build des decks échouait sur :

SyntaxError: [lightningcss minify] Invalid token in pseudo element:
Dimension { has_sign: false, value: 1.5, int_value: None, unit: "rem" }

#19981 a débloqué les decks en désactivant la minification (build.cssMinify: false dans le thème) et attribuait le défaut à Slidev + Vite 8. Le déclencheur est plus bas : depuis magic-string 1.4.3 (publiée le 2026-10-05), @unocss/transformer-directives réécrit en double, en fin de fichier, les déclarations qu'il insère quand le fichier porte aussi une règle vide à nettoyer (unocss/unocss#5373 ; correctif proposé #5375 ; côté Slidev slidevjs/slidev#2768).

Le chemin réel dans notre arbre : @unocss/transformer-directives → @unocss/rule-utils (magic-string: ^1.4.1). Le transformer ne déclare et n'importe pas magic-string lui-même — vérifié : ses dependencies sont @unocss/core, @unocss/rule-utils, css-tree, et aucun import du paquet n'apparaît dans son dist. Le lock committé le résolvait bien en 1.4.3 (l. 6243-6247, cité par l'issue).

Le contrôle négatif — la mesure qui tranche

Un build qui passe ne dit pas pourquoi il passe. Le même arbre a donc été construit deux fois, à manifestes près — le fichier vite.config.ts est déjà supprimé dans les deux cas, seul l'override change :

Arbre magic-string résolu slidev build 01-introduction
manifestes de main (sans override) 1.4.3 ÉCHEC — rc=1, Invalid token in pseudo element: Dimension 1.5rem
cette PR (override magic-string@^1) 1.4.2 VERT — CSS minifié

C'est donc l'override qui porte le résultat, et non la suppression du vite.config.ts ni autre chose. Le même contrôle exécuté sans le second changement de manifeste (@slidev/theme-default) est équivalent : ce pin ne touche pas magic-string.

Ce que la PR change (4 fichiers, +86/-40)

  1. slides/package.json — override "magic-string@^1": "1.4.2" à côté de lz-string, et @slidev/theme-default passe de "latest" à "^0.25.0" : c'était la seule dépendance du deck sans borne. Le paquet n'est pas décoratif — theme-ia101/index.ts importe @slidev/theme-default/animations.
  2. slides/package-lock.json — régénéré avec npm 11, qui est le format du lock committé (18 champs libc). Régénérer avec npm 10.9.7 supprimait ces 18 champs : du bruit sans rapport avec le sujet, écarté pour que le diff se lise. magic-string 1.4.3 : 0 occurrence restante dans le lock.
  3. slides/theme-ia101/vite.config.ts — supprimé. Son unique contenu actif était build: { cssMinify: false } ; le retirer laissait un fichier de configuration vide. Le savoir durable qu'il portait est conservé (point 4).
  4. slides/README.md — la section « Invariants Slidev (regression-prone) » gagne le symptôme, la cause amont, le point de retrait de l'override, et la règle des racines où Slidev lit un vite.config.* (thème, addons, racine du deck — un slides/vite.config.ts serait ignoré). C'est ce fait qui explique pourquoi la configuration vivait dans le thème ; il n'était écrit nulle part ailleurs.

Preuve

  • Build local, minification réactivée : 01-introduction vert en 4,2 s, CSS minifié (1 ligne, index-*.css de 89 Ko) ; 03-logique vert en 18,4 s — le deck lourd, celui qui OOM sous le plafond de tas par défaut du runner.
  • Les 19 decks : la PR touche slides/package.json, slides/package-lock.json et slides/theme-ia101/, donc l'organe slides-build-advisory (jambe PR, bloquante) voit SHARED non vide et construit tous les decks du dépôt. C'est le check-run qui porte le décompte complet.
  • Contrôle visuel ?clicks=99, deux decks, serveur de développement local :
    • 01-introduction — slide 1 (couverture, titre et filet du thème) et slide 5 (contenu : marqueurs de liste, titres de section, pagination 5 / 48).
    • 03-logique — slide 5 (bloc de code avec ses numéros de ligne, soit exactement les pseudo-éléments .slidev-code-line-numbers que le défaut CSS atteignait), slide 9 (image en img-stack) et slide 11 (tableau : bordures et alignement rendus).
    • Les quatre familles de rendu touchées par le thème (couverture, listes, code, tableau, image) sont couvertes et saines. Aucun débordement introduit : le léger chevauchement du texte sous l'image de 03-logique slide 5 vient du markdown lui-même (un <div class="img-stack absolute"> posé sur un texte qui coule), pas de la feuille de style — le diff ne touche aucun contenu de deck.
    • Observation, non imputée à cette PR : le serveur de développement émet une erreur console Failed to patch FloatingVue (Popper indéfini) venue de @shikijs/vitepress-twoslash. Elle est sans rapport avec magic-string (aucune arête entre les deux) et n'apparaît pas dans la construction statique.
  • Contrôle négatif : le tableau ci-dessus.

Collision à déclarer — #20038 touche les deux mêmes fichiers

#20038 (mon autre PR ouverte, l'override katex) modifie aussi slides/package.json et slides/package-lock.json. Les deux ajoutent une entrée dans le même objet overrides, et les deux régénèrent le lock.

Conséquence, à traiter au merge et non avant : la seconde à merger trouvera un conflit sur slides/package-lock.json. La résolution est mécanique et sans arbitrage — fusionner origin/main, puis régénérer le lock par npm install (les deux overrides coexistent alors dans package.json), jamais résoudre le JSON à la main. Les deux PR étant de la même lane, ce geste est à sa portée. Ordre indifférent.

Retrait de l'override

L'override se retire quand une version d'UnoCSS portant le correctif de #5375 est publiée et tirée par Slidev — dans une PR dédiée. La case de suivi vit dans #20051, qui reste ouverte jusque-là.

Issues liées : #20051 (dispatch coordinateur), #19981, #19727, #19441, #19999.

🤖 Generated with Claude Code

…S revient

Remplace le contournement de #19981 (build.cssMinify: false) par la cause reelle :
depuis magic-string 1.4.3 (publiee le 2026-10-05), @unocss/transformer-directives
reecrit en double, en fin de fichier, les declarations qu'il insere quand le
fichier porte aussi une regle vide a nettoyer (unocss/unocss#5373, correctif
propose #5375 ; cote Slidev slidevjs/slidev#2768).

Controle negatif mesure sur le meme arbre, a manifestes pres (le fichier
vite.config.ts est deja supprime dans les deux cas) :
- magic-string 1.4.3 (manifestes de main)  -> build 01-introduction ECHEC rc=1,
  "[lightningcss minify] Invalid token in pseudo element: Dimension 1.5rem"
- override magic-string@^1 -> 1.4.2        -> build VERT, CSS minifie (1 ligne)

- slides/package.json : override "magic-string@^1": "1.4.2" ; @slidev/theme-default
  passe de "latest" a "^0.25.0" (seule dependance du deck sans borne ; le paquet
  porte les animations importees par theme-ia101/index.ts)
- slides/package-lock.json : regenere avec npm 11, le format du lock committe
  (18 champs libc preserves ; npm 10.9.7 les supprimait, bruit hors sujet) ;
  0 occurrence de 1.4.3 restante
- slides/theme-ia101/vite.config.ts : supprime -- son unique contenu actif etait
  build.cssMinify: false, le retirer laissait une configuration vide
- slides/README.md : l'invariant "Invariants Slidev (regression-prone)" consigne
  le symptome, la cause amont et le point de retrait de l'override, ainsi que la
  regle des racines ou Slidev lit un vite.config.*

See #20051, #19981, #19727.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
@github-actions github-actions Bot added the variation-adjacency-deep-med Adjacence DEEP/MED hors LIGHT : §2 l'autorise si substance distincte (coordinateur) label Oct 9, 2026
…g-override

# Conflicts:
#	slides/package-lock.json
#	slides/package.json
@jsboige

jsboige commented Oct 9, 2026

Copy link
Copy Markdown
Owner Author

Conflit resolu — tete ca366ec919

Le conflit venait de #20038 (mergé 2026-10-09T08:52Z), qui a touché le meme slides/package.json et le meme lock.

Les deux cotes etaient additifs : #20038 pose katex: ^0.18.2, cette PR pose magic-string@^1: 1.4.2. La resolution est l'union des deux overrides — aucun n'est perdu :

"overrides": { "lz-string": "1.4.4", "katex": "^0.18.2", "magic-string@^1": "1.4.2" }

slides/package-lock.json a ete regenere depuis la base origin/main avec npm 11 (le majeur qui a ecrit le lock : lockfileVersion: 3, compteur libc inchange a 18).

Verification du lock — comparaison des cartes de versions contre origin/main :

Mesure Resultat
entrees ajoutees 8, toutes magic-string = 1.4.2 (copies imbriquees sous @slidev/cli, @unocss/*, @unhead/bundler, @shikijs/vitepress-twoslash, magic-string-stack)
entrees retirees 1 — node_modules/magic-string = 1.4.3 (la copie hissee, remplacee par l'override)
entrees changees 0
node_modules/katex 0.18.10 (l'override de #20038, preserve)

Le delta est exactement l'effet de l'override, sans bruit de majeur npm. La suppression de slides/theme-ia101/vite.config.ts (le contournement cssMinify: false) reste le cœur de la PR et n'a pas ete touchee par la fusion.

Effet de bord : la tete a bouge (8e214cffce -> ca366ec919). Un dossier de prevalidation bati sur l'ancienne tete est perime ; la nouvelle tete re-arme aussi le minuteur de merge, par construction d'un commit.

Lane myia-po-2026:CoursIA-2.

@jsboige

jsboige commented Oct 9, 2026

Copy link
Copy Markdown
Owner Author

[ADJOINT PREFLIGHT]
schema: 1
lane: myia-po-2026:CoursIA-3
pr: 20060
head: ca366ec
complete: true
body: read
comments-reviewed: 1
reviews-reviewed: 0
threads-reviewed: 0
threads-unresolved: 0
surfaces-sha256: c74dd1d8ace524be31bdf3e472018592b78c7164ae26b75c991772e6ab516a9e
diff-files: 4
diff-additions: 86
diff-deletions: 40
checks: BLOCKED
b0: clear
scope: pass
domain: pass
verdict: BLOCKED
organ: check_adjoint_prevalidation.py
organ-command: python scripts/check_adjoint_prevalidation.py --derive-verdict 20060
organ-rc: 3
[/ADJOINT PREFLIGHT]

@github-actions

github-actions Bot commented Oct 9, 2026

Copy link
Copy Markdown
Contributor

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

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 removed the variation-adjacency-deep-med Adjacence DEEP/MED hors LIGHT : §2 l'autorise si substance distincte (coordinateur) label Oct 9, 2026
@jsboige

jsboige commented Oct 9, 2026

Copy link
Copy Markdown
Owner Author

[ADJOINT PREFLIGHT]
schema: 1
lane: myia-po-2026:CoursIA-3
pr: 20060
head: ca366ec
complete: true
body: read
comments-reviewed: 3
reviews-reviewed: 0
threads-reviewed: 0
threads-unresolved: 0
surfaces-sha256: 44302fc41892bc433efd7b49d29ebd4bf330a50066b265018ffff4fcfd019cc8
diff-files: 4
diff-additions: 86
diff-deletions: 40
checks: latest-wins-green
b0: clear
scope: pass
domain: pass
verdict: READY
organ: check_adjoint_prevalidation.py
organ-command: python scripts/check_adjoint_prevalidation.py --derive-verdict 20060
organ-rc: 0
supersedes: 2
supersedes-why: le motif de l'ancien dossier (checks: BLOCKED) est eteint et mesure : au fold latest-wins de la tete ca366ec (source commits//check-runs, organe check_run_state.py --pr 20060, mesure secretaire 14:2xZ), zero jambe non-verte et zero jambe en vol ; mergeable=true / mergeStateStatus=clean mesure par REST a cette meme tete ; B.0 rc=0 (organe check_unaddressed_nits.py) ; ai-01 ordonne le re-stamp a cette tete (DM ai01-c1610-secretary-restamps du 2026-10-09T13:54:33Z).
[/ADJOINT PREFLIGHT]

@github-actions

github-actions Bot commented Oct 9, 2026

Copy link
Copy Markdown
Contributor

Path-collision (organ #13359/#13615)

Cette PR #20060 (Fix(slides,#20051): override magic-string 1.4.2 — la minification CSS revient) 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.

Le verdict terminal (#15578) signale qu'un cote de la paire est deja sur main. L'organe mesure un recouvrement de chemins ; il ne compare pas le contenu des deux livraisons, donc il ne conclut PAS a une redondance (#15768) : deux PRs peuvent toucher le meme fichier pour des raisons disjointes. L'arbitrage reste a la lane ou au coordinateur.

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