chore(ci): pin Humanizer against majors — v3 renames the OWL IRIs we publish (#951) - #953
Merged
Conversation
…publish (#951) MEASURED on #949 (run 89854763158, `build (Release)`): 643 tests, 636 passed, 2 failed, and the two failures are exactly the GetId contract guards -- VirtueOwlGenerationContractTests.GetId_StripsApostrophesHyphensCommas [40 ms] OwlGetIdPureContractTests.FrenchFallacyName_ProducesFragment_AccentsPreserved [1 ms] Both assert GetId("Appel a l'autorite") == "appelALautorite" (accents preserved); both pass on master, verified locally 10/10 on the filtered run. GetId is Camelize plus a Replace chain, so Humanizer IS the transform, and v3 is a declared breaking major -- upstream ships a Roslyn analyzer for its own namespace migration. Why this outranks "two red tests": those fragments are the identity of the published ontology (1 408 fallacy IRIs, 223 virtue IRIs). A silent Camelize change renames every accented term's IRI on the next regeneration -- green build, no diff in our code, broken external consumers (#133 publication, CoursIA import). Same shape as the licence findings already in this file, one axis over: a package can change identity-bearing OUTPUT with nothing announcing it. Majors only, and here that filter is NOT the no-op it was for Playwright (#947): Humanizer's break sits on the major boundary. The shared rule is that the right update-types depends on where the package puts its break -- measure, don't copy. The pin carries its deferred work, per the admission bar at the top of this file: issue #951 holds the v3 migration and the prior question of whether published IRIs may change at all, which is jsboige's call, not ours. Refs #951, #949, #911, #133 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This was referenced Jul 27, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Constat — mesuré, et il vaut mieux que « deux tests rouges »
Humanizer 2.14.1 → 3.0.10(majeure déclarée cassante : l'amont livre un analyseur Roslyn pour sa propre « v3 namespace migration ») fait échouer exactement deux tests dans #949, et pas un de plus :VirtueOwlGenerationContractTests.GetId_StripsApostrophesHyphensCommasOwlGetIdPureContractTests.FrenchFallacyName_ProducesFragment_AccentsPreservedRun
89854763158,build (Release)→Total tests: 643 / Passed: 636 / Failed: 2 / Skipped: 5. Les deux passent sur master (vérifié en local 2026-07-27 : run filtré 10/10, 629 ms).Les deux assertent la même chose :
GetId("Appel à l'autorité") == "appelÀLautorité"— apostrophe retirée, accent préservé. OrGetId=Camelize+ une chaîne deReplace: Humanizer est la transformation.Pourquoi c'est un pin et pas un ticket de test
Ces fragments sont l'identité de l'ontologie publiée : 1 408 IRI de sophismes dans
docs/ontology/argumentum.owlet 223 IRI de vertus dansargumentum_virtues.owlsont construits par cette fonction. Un changement silencieux deCamelizerenomme l'IRI de chaque terme accentué à la prochaine régénération — build vert, aucun diff dans notre code, et les consommateurs externes cassent (publication #133, import CoursIA).C'est le motif déjà nommé deux fois dans ce fichier (QuestPDF, FluentAssertions), décalé d'un axe : un paquet peut cesser d'être permissif sans qu'aucun outil ne l'annonce → un paquet peut changer une sortie porteuse d'identité sans qu'aucun outil ne l'annonce. Ce qui l'a attrapé, ce sont deux tests de contrat écrits exprès — et ils ne tournent en CI que depuis #911.
Majeures seulement — et ici ce n'est PAS le no-op de Playwright
#947 a retenu qu'un
ignore« majeures » ne protège rien sur un paquet qui ne bouge jamais sa majeure (Playwright, jamais sorti de 1.x). Le cas d'Humanizer est l'inverse : sa rupture est précisément à la frontière majeure (2.x → 3.x). La règle commune aux deux, écrite dans le fichier : le bonupdate-typesdépend de l'endroit où le paquet met sa rupture — mesurer, ne pas recopier.Le pin porte son travail différé
C'est la barre d'admission que ce fichier s'impose (« citer la décision ; ne pas ajouter une entrée pour éteindre un build rouge »). Issue #951 porte :
GetId; (b) renommage versionné +owl:sameAs; (c) statu quo. Arbitrage jsboige.ignoredans la même PR que la migration.Périmètre
1 fichier, +26/-0, uniquement des commentaires + une entrée
ignore. Aucun paquet touché, aucun code touché. Schémadependabot-2.0respecté (même forme que les 5 entrées existantes). Zéro effet sur la release : le statu quo 2.14.1 est exactement ce qui a produit les.owlcommittées et validées.Refs #951, #949, #911, #133
🤖 Coordinator ai-01