Tag antes do bump: o que achei nas tags de 2026 de 1.200 repositórios
Um erro de release bem comum: você cria a tag v1.16.0 e só depois sobe a versão no arquivo. A tag fica apontando para um commit que ainda diz 1.15.2.
Na maioria das vezes nada quebra na hora. Mas quem faz git checkout v1.16.0 recebe outro código, e alguns registros de pacotes guardam o commit de onde a versão saiu de verdade, que não é o da tag.
Rodei uma checagem nas tags criadas em 2026 em cerca de 1.200 repositórios públicos: PyPI, crates.io, npm, RubyGems, apps do F-Droid, Helm, Flutter e os mais estrelados do GitHub. A pergunta para cada tag: ela nomeia a versão que o próprio commit declara?
Alguns casos reais, todos conferíveis em dados públicos:
- smallvec (Rust): a tag
v1.16.0aponta para um commit com1.15.2. O crates.io registra no.cargo_vcs_info.jsonque a 1.16.0 saiu de outro commit. - pytest-timeout: a tag
2.5.0saiu com2.4.0nosetup.cfg. O commit seguinte diz "should have been committed before the tag". A 2.5.0 foi retirada (yanked) do PyPI. - ComfyUI: três tags do ano saíram antes do bump; a release
v0.14.2, cuja tag declara0.14.1, traz pacotes portáteis para Windows.
O mais interessante foi o erro da minha própria checagem. A maioria dos descasamentos era falso positivo: monorepo com tag de outro pacote (clap_complete-v4.6.1), pré-release escrita de dois jeitos (v2.9.0-rc0 e 2.9.0rc0), build metadata (+45). Nada disso aparecia no corpus antigo de testes, que fica congelado em tags velhas. Medir fora do laboratório pegou o que o laboratório não pegava.
Um cuidado: perdi os arquivos brutos da varredura, então não dou taxa nenhuma. Só os casos conferidos à mão.
Se quiser evitar o problema no seu projeto: crie a tag depois do commit que sobe a versão, ou faça o workflow de release criar a tag a partir do arquivo de versão.
A checagem é o --tag do closure_drift, ferramenta minha, open source. O registro completo, com os comandos para conferir cada caso: https://doi.org/10.5281/zenodo.24054343
