Skip to content

fix(deps): uv.lock portait deux fois le même paquet, et ne se lisait plus - #305

Merged
stephrobert merged 1 commit into
mainfrom
fix/uv-lock-doublon
Oct 9, 2026
Merged

stephrobert merged 1 commit into
mainfrom
fix/uv-lock-doublon

Conversation

@stephrobert

Copy link
Copy Markdown
Owner

Summary

main est actuellement inutilisable pour quiconque lance uv :

error: Failed to parse `uv.lock`
  Caused by: Found duplicate package `atheris==3.0.0`

Plus de uv run, donc plus de tests, plus de hooks pre-commit, plus de lint :
l'outillage entier du dépôt est à l'arrêt sur un clone frais de main.

Comment je l'ai cassé

C'est ma faute, et le mécanisme mérite d'être écrit, parce qu'il se reproduira.

J'ai fusionné coup sur coup deux PR Dependabot qui touchent toutes deux le
verrou
— virtualenv (#301) puis le groupe des dépendances mineures (#302) —
en rebasant chacune sur main. La fusion à trois branches a vu les deux côtés
ajouter le même bloc atheris 3.0.0, et elle a gardé les deux. Les blocs
étaient strictement identiques, octet pour octet : un conflit sémantique
qu'aucun conflit textuel ne signale, et qu'aucune analyse statique ne voit.

La CI de #302 avait été jouée avant la fusion de #301 : elle a donc validé
un verrou qui n'était plus celui du résultat.

Le correctif

Il retire le doublon exact, et lui seul : les 51 autres blocs sont intacts,
dont le atheris 3.1.0 légitime qui coexiste avec la 3.0.0 pour des marqueurs
de version de Python différents.

blocs de paquets : 52 → 51
doublon retiré    : atheris 3.0.0

Vérifié sur le verrou réparé

uv lock --check        Resolved 51 packages
uv run python -c …     dsoxlab 0.3.2 — l'outillage répond
uv run pytest tests/   1289 passed
uv run ruff check …    All checks passed!
uv run mypy src/…      no issues found in 88 source files

Type of change

  • Bug fix
  • New feature
  • Refactor
  • Documentation
  • Chore / tooling
  • Security / supply chain

Checklist

Always

  • ruff, mypy, pytest — tous joués ci-dessus, tous verts
  • pytest tests_e2e — non joué : il construit la roue et l'installe
    dans un venv jetable, ce qui ne dépend pas du verrou de développement.
    Il tourne en CI sur cette PR
  • The engine stays domain-agnostic — aucun code touché
  • No hardcoded personal path or host — aucun code touché
  • Manually tested against two lab repositories — sans objet : le diff est
    une suppression de doublon dans un fichier de verrouillage

When behavior changes

N/A — aucun comportement ne change, et aucune version n'est publiée : le
verrou reparse, c'est tout. Les entrées de CHANGELOG des deux releases
concernées restent exactes.

Les autres blocs

N/A — ni commande, ni workflow, ni contrat touchés.

La règle que j'en tire

Deux PR qui touchent le même verrou ne se fusionnent pas l'une après l'autre
sans rejouer la CI entre les deux. Je rebaserai et attendrai la CI entre
chaque, à l'avenir — c'est exactement ce que la politique « branche à jour
avant fusion » du ruleset exige, et que le contournement administrateur m'a
laissé sauter.

🤖 Generated with Claude Code

…plus

`uv` refusait tout sur main :

    error: Failed to parse `uv.lock`
      Caused by: Found duplicate package `atheris==3.0.0`

Donc plus de `uv run`, plus de tests, plus de hooks pre-commit, plus de lint :
l'outillage entier du dépôt était à l'arrêt pour quiconque partait de main.

C'est ma faute, et le mécanisme mérite d'être écrit. J'ai fusionné coup sur coup
deux PR Dependabot qui touchent toutes deux le verrou — virtualenv (#301) puis
le groupe des dépendances mineures (#302) — en rebasant chacune sur main. La
fusion à trois branches a vu les deux côtés AJOUTER le même bloc `atheris
3.0.0` et a gardé les deux : un conflit sémantique qu'aucun conflit textuel ne
signale. Les deux blocs étaient strictement identiques, octet pour octet.

Le correctif retire le doublon exact, et lui seul : les 51 autres blocs sont
intacts, dont le `atheris 3.1.0` légitime qui coexiste avec la 3.0.0 pour des
marqueurs de version différents.

Vérifié sur le verrou réparé : `uv lock --check` résout 51 paquets, `uv run`
répond, 1289 tests verts, ruff et mypy propres.

La leçon pour la suite : deux PR qui touchent le même verrou ne se fusionnent
pas l'une après l'autre sans rejouer la CI entre les deux. La CI de la seconde
avait été jouée AVANT la fusion de la première, donc sur un verrou qui n'était
plus celui du résultat.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@stephrobert
stephrobert merged commit 9ed027b into main Oct 9, 2026
20 checks passed
@stephrobert
stephrobert deleted the fix/uv-lock-doublon branch October 9, 2026 15:20
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.

1 participant