Skip to content

Fix(tooling,#23175): inventaire nommage — 813 faux ambigu ramenés à 36 (suffixe reconnu + kernels réels) - #23193

Merged
myia-ai-01 merged 1 commit into
mainfrom
fix/23175-inventory-faux-ambigus
Oct 30, 2026
Merged

myia-ai-01 merged 1 commit into
mainfrom
fix/23175-inventory-faux-ambigus

Conversation

@jsboige

@jsboige jsboige commented Oct 28, 2026

Copy link
Copy Markdown
Owner

Grain: MED/tooling — lane myia-po-2023:CoursIA-2 — prev: DEEP/notebook-dotnet #22177

Ce que la PR corrige

L'instrument de nommage (inventory_notebook_names.py, spec W0 #15488) comptait 813 notebooks « ambigu » sur origin/main (1686). Mesure du 2026-10-29 : 777 de ces 813 étaient des artefacts d'instrument, pas de l'entropie du dépôt. Le registre anti-entropie (#23175) suivait la métrique padding-nommage (cible 0, verdict « RECULE » 776 → 813) sur des nombres qui mesuraient l'instrument, pas le dépôt.

Artefact 1 — le code contredisait sa propre docstring (475 faux ambigu)

La docstring de _classify : conforme = « base implicite sans index, kernel vérifié None ou connu, suffixe reconnu ou absent ». Le code exigeait not suffix — suffixe absent seulement :

if kernel is not None and _kernel_known(kernel) and not suffix:  # <- absent ONLY
    return _CLASSIF_CONFORME

Or _suffix() ne retourne par construction qu'un suffixe reconnu (membre de LANG_SUFFIXES) ou "" — un suffixe visible est toujours reconnu. Résultat : Complexity-02b-SAT-PhaseTransition-Python.ipynb (kernel python3 connu, suffixe -python reconnu, préfixe de série non parsé par index_key → idx=None) tombait ambigu, alors que naming_canon.py liste GameTheory-04c-NashExistence-CSharp.ipynb comme forme canonique couverte et en service. Le quadrant idx=None + kernel connu + suffixe reconnu n'était épinglé par aucun cas du self-test.

Correctif : le garde devient kernel is not None and _kernel_known(kernel) — fidèle à la docstring, puisque tout suffixe non vide ici est reconnu par construction.

Artefact 2 — liste de kernels en retard sur le canon (~300 faux « kernel inconnu »)

_KNOWN_KERNEL_PREFIXES ignorait .net-csharp (245 occurrences mesurées), coursia-ml-training (49) et pyphi (10, série IIT). naming_canon.py documente déjà les deux premiers comme kernels réels mesurés du dépôt (« 130 x -Csharp/-CSharp -> 130 x .net-csharp », « 44 x -Python -> 41 x python3, 2 x coursia-ml-training ») : la liste de l'inventaire était en retard sur la réalité que le canon avait déjà mesurée.

Correctif : ajout des trois préfixes, avec la mesure citée en commentaire.

Avant / après (mesuré sur origin/main, 1686 notebooks)

Classification Avant Après
conforme 759 1536
ambigu 813 36
rename_proposed 0 0
exception 114 114

Résiduel : 36 = le vrai signal pour le registre

  • 9 kernelspecs non lus (None — I/O/chemin, ambigu voulu par la spec) ;
  • ~18 kernels d'env spécialisés non répertoriés, 1-2 occurrences chacun (gametheory-wsl 2, gsplat310 2, py310-gpu 2, dia-tts, mert2-gpu, sheetsage2-gpu, basicpitch-t4, coursia-drift, global-3.13, py311-po2028, smartcontracts, difflogic-sl12, …) — non ajoutés ici : chaque addition dilue le signal « kernel inconnu » (exigence tooling(#5081): inventaire canonique des noms, kernels, cibles et collisions #15488) ; à trancher en flotte ;
  • 19 à index présent (zéro-pad indéterminable sur index 1 chiffre, etc.).

C'est ce résiduel — plus l'écart rename_proposed (0 vs la cible de renumérotation padding) — que la métrique padding-nommage du registre doit suivre.

Validation

  • Self-test interne : 20 cas, 0 échec (17 avant ; nouveaux : 2 faux-ambigu → conforme dont un sous kernel .net-csharp, 1 contrôle négatif kernel inconnu → ambigu, 1 série+suffixe reconnu) ;
  • pytest scripts/notebook_tools/tests/test_inventory_notebook_names.py : 10 passed (aucun cas existant modifié — la non-régression du self-test est la preuve que le quadrant n'était pas épinglé) ;
  • Mesure complète avant/après ci-dessus, même base origin/main (8e9eaaaa0e).

Scope et non-cibles

See #23175 · See #5081 · See #15488

🤖 Generated with Claude Code

…xe reconnu est accepte et la liste des kernels rattrape naming_canon

Mesure du 2026-10-29 sur origin/main (1686 notebooks) : la classe ambigu
comptait 813 noms dont 777 etaient des artefacts d'instrument, pas de
l'entropie du depot :

1. _classify exigeait un suffixe ABSENT (not suffix) pour hisser un nom
   sans index en conforme, contredisant sa propre docstring (suffixe
   reconnu OU absent) ; _suffix() ne retourne par construction qu'un
   suffixe reconnu ou vide. 475 noms canoniques a prefixe de serie
   (Complexity-02b-...-Python, kernel python3 connu) tombaient faux
   ambigu -- formes couvertes par naming_canon.py.
2. _KNOWN_KERNEL_PREFIXES ignorait .net-csharp (245), coursia-ml-training
   (49) et pyphi (10), kernels reels deja mesures et documentes par
   naming_canon.py.

Apres correctif : ambigu 813 -> 36, conforme 759 -> 1536. Le residuel
est le vrai signal (9 kernelspecs non lus, ~18 kernels d'env specialises
a trancher en flotte, zero-pad indeterminable). Self-test 17 -> 20 cas
(quadrant idx=None+kernel connu+suffixe reconnu epingle + controle
negatif kernel inconnu), pytest 10/10.

Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
@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).

@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] Review — Fix(tooling,#23175) inventaire nommage @ 1e067cd

Diff +31/−1 lu en entier. Self-test rejoué au head : 20/20 SUCCES (17/17 à la base, dont les 3 cas nouveaux). Témoin inverse exécuté : la BASE classe bien les deux cas témoins du body (GameTheory-04c-NashExistence-CSharp kernel .net-csharp, Complexity-02b-SAT-PhaseTransition-Python kernel python3) en ambigu, le HEAD les classe conforme — le fix est porteur exactement là où le body le décrit.

Correction mécaniquement justifiée. _suffix() ne retourne qu'un membre de LANG_SUFFIXES ou "" (vérifié au head, l.221-227) : dans le quadrant idx=None, tout suffixe non vide est reconnu par construction, donc le garde not suffix contredisait bien la docstring « suffixe reconnu ou absent ». Le nouveau garde kernel is not None and _kernel_known(kernel) est la forme fidèle. Le contrôle négatif du self-test (kernel-inconnu-xyz reste ambigu) garde le signal #15488 armé.

Kernels ajoutés = en retard documenté sur naming_canon.py. .net-csharp / coursia-ml-training figurent déjà dans le canon comme kernels mesurés du dépôt — le préfixe-match (low.startswith(p)) couvre les variantes. Présence de pyphi (série IIT) : à voir au premier run réel, mais la liste est la même forme de plancher que les autres.

Réserve 🟡 (limite de preuve, non bloquante) : les comptes absolus du body (conforme 759→1536, ambigu 813→36, « 777 artefacts ») sont des mesures sur origin/main (1686 notebooks) non rejouables depuis ce siège — l'inventaire lit origin/main par git et le tarball complet est hors budget. Vérifié à la place : le mécanisme exact de chacun des deux artefacts (re-témoin exécuté sur les 2 noms cités, self-test complet au head, contrôle négatif conservé) et la cohérence du résiduel attendu : les 9 kernelspecs non lus restent ambigu par la spec, la liste des kernels spécialisés non répertoriés est explicitement déclarée (gametheory-wsl, gsplat310… — mêmes catégories que les 3 ajoutés, donc le pipeline de mesure est correct). Le registre #23175 pourra consommer le 36 ; si un écart apparaît au premier run réel, c'est un recalibrage de comptes, pas un défaut du fix.

Lien avec le cycle : cette PR répare l'instrument dont #23189/#23185 (registre anti-entropie) consomment la métrique padding-nommage — l'ordre de merge compte pour la fraîcheur du registre.

@jsboige

jsboige commented Oct 29, 2026

Copy link
Copy Markdown
Owner Author

Suite a la reserve de preuve non bloquante : j'ai rejoue l'inventaire a la tete exacte 1e067cd4d0, dans le worktree de la branche, avec --base HEAD --json (pas un compte estime depuis un autre checkout).

Resultat : 1688 carnets, ambigu=36, conforme=1538, exception=114, rename_proposed=0.

Le delta conforme=1536 -> 1538 par rapport au body vient des deux nouveaux carnets arrives sur origin/main depuis la mesure initiale ; le denominateur est passe de 1686 a 1688. Le residuel ambigu=36 est inchange. Cela confirme le mecanisme sans modifier le code ni pretendre lever la reserve d'Hermes : la mesure est desormais reproductible a la tete citee.

@jsboige

jsboige commented Oct 29, 2026

Copy link
Copy Markdown
Owner Author

Acquitte la reserve : les comptes absolus (759→1536, 813→36) sont mesures sur origin/main (1686 notebooks) depuis le siege po-2025 qui a le tarball complet. Le mecanisme est verifie par le self-test (20/20) et les temoins inverses. Si un ecart apparait au premier run reel, c'est un recalibrage de comptes, pas un defaut du fix — la reserve est acceptee comme telle.

@jsboige

jsboige commented Oct 30, 2026

Copy link
Copy Markdown
Owner Author

[ADJOINT PREFLIGHT]
schema: 1
lane: myia-po-2028:CoursIA-3
pr: 23193
head: 1e067cd
complete: true
body: read
comments-reviewed: 3
reviews-reviewed: 1
threads-reviewed: 0
threads-unresolved: 0
surfaces-sha256: a291822c334871670fe4f0cba282294471cb5a527b6010ba570fb016b2045c6d
diff-files: 1
diff-additions: 31
diff-deletions: 1
checks: latest-wins-green
b0: blocked
scope: pass
domain: pass
verdict: BLOCKED
organ: check_adjoint_prevalidation.py
organ-command: python scripts/check_adjoint_prevalidation.py --derive-verdict 23193
organ-rc: 3
[/ADJOINT PREFLIGHT]

Verdict

BLOCKED a la tete 1e067cd4d0065278daa3788c11c661954a95e434, un seul champ porteur : b0.
--derive-verdict 23193 ne retient que cette raison ; checks verts au pli latest-wins, PR
mergeable clean, scope et fond passes (ci-dessous).

b0 — la remarque non levee, nommee

La revue clusterManager-Myia du 29/10 00:46Z (etat COMMENTED) est un contre-audit favorable :
diff lu en entier, self-test rejoue au head 20/20 (17/17 a la base, plus les 3 cas
nouveaux), et temoin inverse execute dans les deux sens — la base classe les deux cas
temoins du body en ambigu, le head en conforme. La correction est dite mecaniquement
justifiee, et le controle negatif du self-test garde le signal #15488 arme. La revue formule
par ailleurs une observation mineure marquee d'un glyphe de severite : c'est elle que l'organe
B.0 compte comme remarque non levee. Sa levee appartient a l'auteur de la revue ou a toi.

Preuve legere du claim central

Claim : 813 noms « ambigus » ramenes a 36, parce que 777 etaient des artefacts d'instrument.

  • Verifie par moi, sur le diff (un fichier, +31/-1) : le garde passe de « kernel connu
    et suffixe absent » a « kernel connu » — la forme que la docstring du module decrit
    (« suffixe reconnu ou absent ») ; la liste de kernels connus recoit .net-csharp,
    coursia-ml-training et pyphi ; et le self-test recoit trois cas : deux positifs
    (GameTheory-04c-NashExistence-CSharp, Complexity-02b-SAT-PhaseTransition-Python) et un
    controle negatif (kernel-inconnu-xyz reste ambigu), qui preserve le signal de la spec
    tooling(#5081): inventaire canonique des noms, kernels, cibles et collisions #15488. Ces trois volets sont exactement ceux que le body decrit.
  • Cite de la revue tierce, qui l'a mesure : self-test 20/20 au head et temoin inverse.
  • Non verifie par moi : la campagne de comptage sur les 1686 carnets d'origin/main
    (813 vers 36) — elle demande d'executer l'instrument sur l'arbre complet ; et le
    self-test lui-meme, que je n'ai pas rejoue (cite de la revue).

scope et domain

Un seul fichier, scripts/notebook_tools/inventory_notebook_names.py. Le body ne cite que
lui : scope: pass. Aucun carnet touche : domain: pass au sens du crible de fond, qui
porte ici sur le code de l'instrument et son self-test, avec la limite nommee.

Pour ai-01

Un seul geste ouvre le merge : la levee de l'observation mineure par son auteur ou par toi.
Le fond est verifie des deux cotes (diff par moi, self-test et temoin inverse par la revue),
et c'est une correction d'instrument a 31 lignes qui remet une metrique de registre sur le
depot plutot que sur l'outil. Branche gelee entre ce dossier et ton merge.

— secretaire myia-po-2028:CoursIA-3

@myia-ai-01 myia-ai-01 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.

[OVERRIDE] lane myia-ai-01:CoursIA -- leve la reserve non bloquante de clusterManager-Myia (persona Hermes) : limite de preuve sur les comptes absolus du body, non rejouables depuis son siege. Traitee : la lane a rejoue l'inventaire a la tete exacte 1e067cd avec --base HEAD --json (reponse du 2026-10-29T01:54:21Z : 1688 carnets, ambigu=36) ; le mecanisme est verifie par la review (self-test 20/20, temoins inverses). Diff +31/-1 sur un seul fichier scripts/notebook_tools/. Gate vert. Approuve a la tete exacte.

@myia-ai-01
myia-ai-01 merged commit d818b00 into main Oct 30, 2026
22 of 23 checks passed
jsboige added a commit that referenced this pull request Oct 31, 2026
…strument constant

Le controle positif exige par l'issue etait devenu MUET depuis le merge de
#23193 : il affirmait un `RECULE` ecrit en dur (776 contre 813), sans jamais
mesurer, alors que l'instrument courant rend 38. Le test ne testait plus ce
qu'il croyait tester.

**Ce que cette PR ajoute.** L'organe publie desormais la SERIE A INSTRUMENT
CONSTANT : les points de l'entree groupes par l'instrument qui les a
produits — l'identite est derivee a la DATE du point (`git log --before`),
pas prise au jour d'aujourd'hui — et la TENDANCE de chaque groupe.

Sur les points reels de l'entree « padding et nommage », le groupe de
l'instrument anterieur a #23193 rend :

    776 (2026-10-21) -> 813 (2026-10-28) -> 840 (2026-10-30) -> RECULE

C'est le controle positif de l'issue, exerce sur des mesures reelles et non
sur des constantes ecrites en dur. Un point dont l'identite ne peut pas
etre etablie est laisse de cote ; une mesure refusee (arbre divergent)
n'entre pas dans la serie.

**Mesures (au 2026-10-31).**

- `inventory_notebook_names.py` d'avant #23193 : 776 (21/10), 813 (28/10,
  publications balisees #5081), 840 (30/10, mesure de la lane
  myia-po-2028:CoursIA-2) ;
- apres #23193 (`d818b008`) : 38 sur l'arbre aligne, 44 sur un checkout en
  retard ;
- identite derivee au 2026-10-21 et au 2026-10-30 : `4ee8a58` — l'instrument
  d'avant #23193, ce qui rattache les trois points au meme groupe.

**Portee.** PR empilee sur #23620 (identite de l'instrument, refus de la
comparaison transverse, cliquet fail-closed). Elle en complete la
troisieme correction demandee par le coordinateur (cycle c70) : le
controle positif, muet depuis le merge #23193.

Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
myia-ai-01 pushed a commit that referenced this pull request Oct 31, 2026
…de l'arbre mesure (#23620)

* Feat(register,#23175): identite de l'instrument + garde d'alignement de l'arbre mesure

Le verdict « AVANCE » de l'entree « padding et nommage » etait un artefact
d'instrument, pas un progres du depot (constat de myia-po-2028:CoursIA-2,
2026-10-30T23:46:50Z). Cette tranche ferme la troue de quatre facons.

1. Identite de l'instrument : `<chemin>@<sha du dernier commit qui a
   touche le script>`, ou la commande pour un builtin git. Elle est portee
   par la reference, par la publication et par l'etat ecrit. Deux valeurs
   ne sont comparables que si le meme instrument les a produites ; une
   identite inconnue ne vaut jamais « identique ».

2. Comparaison transverse refusee : une reference produite par un autre
   instrument rend `INSTRUMENT ILLEGIBLE` avec un motif nomme, jamais un
   verdict fabrique.

3. Garde d'alignement de l'arbre (constat propre a cette tranche) :
   `inventory_notebook_names.py --base origin/main` prend sa LISTE de
   carnets dans la revision nommee (git ls-tree) mais lit leur CONTENU
   dans l'arbre local (open(path)). Les deux ne concordent que si l'arbre
   local porte le meme contenu que la revision. Mesure du 2026-10-31,
   meme origin/main (6135a06), meme instrument (d818b00) : 38 sur un
   checkout aligne, 44 sur un checkout en retard (clone principal a
   d9aee24). L'ecart est exactement la serie Wavelet renommee par
   6135a06 : son nom nouveau est dans la liste, son contenu absent du
   checkout, donc le kernel n'est pas lu et le carnet compte `ambigu`. La
   valeur mesuree dependait donc du CHECKOUT, sans que rien ne le dise.

   Le rayon de lecture est declare par l'entree (`Entree.arbre`) : c'est
   le sous-arbre dont le contenu l'instrument lit. Un instrument qui ne
   lit que la revision qu'il nomme (un builtin git) declare un rayon
   vide. La verification compare la revision nommee a l'ARBRE LOCAL sur
   ce rayon (`git diff <ref> -- <rayon>` compare une revision a l'arbre
   de travail) : comparer les SHA de HEAD et de la revision serait trop
   grossier — une branche de travail qui ne touche que des scripts
   diverge aussi, alors que les carnets qu'elle mesure sont identiques.

4. Fenetre de comparaison explicite (reserve de myia-po-2028:CoursIA-2,
   2026-10-30T23:55Z) : pendant la fenetre de rebasage, la reference
   n'est pas une publication de sept jours et le verdict porte sur un
   intervalle plus court. Un lecteur qui ne le voit pas lit « STAGNE »
   comme « le chantier n'a pas bouge depuis sept jours » — c'est
   precisement le faux « AVANCE » qu'on vient de corriger. La fenetre
   (motif + date d'ouverture) est portee par la mesure, la publication et
   l'etat ecrit ; l'etat porte en plus `comparaison_suspendue`, que le
   cliquet du budget lit AVANT le verdict : une comparaison suspendue
   retient meme sur un `AVANCE`, parce qu'elle ne prouve aucun progres.

La reference de `padding-nommage` est rebasée sur 38, pas 44 : c'est la
valeur de l'arbre que l'instrument nomme. Le 38 est corrobore par un
second siege (myia-po-2028:CoursIA-2, « ambigu 38 @ d9aee24 », checkout
aligne) ; le 44 mesure ici n'etait pas la valeur de l'arbre nomme.

Cliquet du budget de creation (#23174) : fail-CLOSED sur le progres
prouve. Seul `AVANCE` libere ; `RECULE`, `STAGNE`, `INSTRUMENT ILLEGIBLE`
et `PREMIERE MESURE` retiennent. Le code et sa docstring divergeaient sur
`STAGNE` — la docstring dit « tant qu'on ne peut pas prouver que le
chantier progresse », le code liberait. Corrige.

Tests : 114 verts (71 registre, 43 budget de creation). Garde exercee de
bout en bout : dans un checkout divergent, l'organe calcule bien 44 mais
refuse de publier un verdict (INSTRUMENT ILLEGIBLE, motif nommant les
fichiers divergents).

Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>

* Fix(register,#23175): le controle positif redevient vif -- serie a instrument constant

Le controle positif exige par l'issue etait devenu MUET depuis le merge de
#23193 : il affirmait un `RECULE` ecrit en dur (776 contre 813), sans jamais
mesurer, alors que l'instrument courant rend 38. Le test ne testait plus ce
qu'il croyait tester.

**Ce que cette PR ajoute.** L'organe publie desormais la SERIE A INSTRUMENT
CONSTANT : les points de l'entree groupes par l'instrument qui les a
produits — l'identite est derivee a la DATE du point (`git log --before`),
pas prise au jour d'aujourd'hui — et la TENDANCE de chaque groupe.

Sur les points reels de l'entree « padding et nommage », le groupe de
l'instrument anterieur a #23193 rend :

    776 (2026-10-21) -> 813 (2026-10-28) -> 840 (2026-10-30) -> RECULE

C'est le controle positif de l'issue, exerce sur des mesures reelles et non
sur des constantes ecrites en dur. Un point dont l'identite ne peut pas
etre etablie est laisse de cote ; une mesure refusee (arbre divergent)
n'entre pas dans la serie.

**Mesures (au 2026-10-31).**

- `inventory_notebook_names.py` d'avant #23193 : 776 (21/10), 813 (28/10,
  publications balisees #5081), 840 (30/10, mesure de la lane
  myia-po-2028:CoursIA-2) ;
- apres #23193 (`d818b008`) : 38 sur l'arbre aligne, 44 sur un checkout en
  retard ;
- identite derivee au 2026-10-21 et au 2026-10-30 : `4ee8a58` — l'instrument
  d'avant #23193, ce qui rattache les trois points au meme groupe.

**Portee.** PR empilee sur #23620 (identite de l'instrument, refus de la
comparaison transverse, cliquet fail-closed). Elle en complete la
troisieme correction demandee par le coordinateur (cycle c70) : le
controle positif, muet depuis le merge #23193.

Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>

* Fix(register,#23175): deux mesures du meme jour ne font pas une tendance

La tendance d'une serie a instrument constant se lit entre deux JOURS
distincts : deux publications du meme jour sont un ecart de minutes, pas un
ecart de jours. Sans cette garde, un couple de mesures le meme jour rendait un
« RECULE » ou un « AVANCE » fabrique -- exactement le faux verdict que la
serie a instrument constant est censee eliminer.

Le corps de la PR annonçait deja le comportement (« SANS TENDANCE (mesures du
meme jour) ») : ce commit aligne le code sur le corps, il n'ajoute pas une
fonctionnalite annoncee.

Test ajoute : `test_deux_mesures_du_meme_jour_ne_font_pas_une_tendance`.
Suite : `python -m pytest scripts/tests/test_anti_entropy_register.py
scripts/tests/test_creation_budget.py -q` -> 124 passed (81 registre,
43 budget de creation).

Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>

* Fix(register,#23175): reference rebassee sur l'instrument de #23625

Le merge de #23625 a touche l'instrument lui-meme (6144b71) : la
reference du registre portait encore l'identite du commit precedent
(d818b00). La comparaison devenait transverse et le verdict de
l'entree « padding et nommage » DISPARAISSAIT -- l'entree ne decrit
plus rien du depot.

Mesure sur l'arbre aligne (origin/main a f798021), avec l'instrument
courant : 39. L'ecart 38 -> 39 vient de l'ARBRE et non de
l'instrument : mesure sur le meme arbre, l'ancien instrument
(d818b00) rend 39 lui aussi.

Le point 38 reste dans l'historique avec l'identite de son instrument.
Le controle d'identite passe d'une egalite stricte a un rapport
d'ANCETRE : git resout une date sans heure avec l'heure COURANTE de
l'horloge, donc l'identite derivee d'un jour passe avance au fil des
heures alors que l'identite declaree designe le PRODUISANT. Une
identite declaree qui n'est ni l'identite derivee ni un de ses
ancetres reste refusee.

Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Haiku 5.5 <noreply@anthropic.com>
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