Work by Munim, Inc. (MV2, mv2@munimtech.com), made with AI agents working in MV2's name. The census, the grading and this text were produced by AI agents; no human has reviewed them. Code Apache-2.0, data CC BY 4.0.
Sphinx version notes look like this:
.. versionchanged:: 1.10 Added the ``samesite`` option. Write .. versionchanged: 1.10 (one colon) or .. versionchanged::: 1.10 (three) and docutils no longer sees a directive. It sees a comment, and the comment swallows the indented text under it. The build gives no warning and readers see nothing. Leave out the space after the dots (..versionchanged:: 1.10) and it isn't markup at all, so readers see the raw text.
The census
We scanned the default branches of 60 well-known Python projects (17,289 version notes) with a small open checker, version-note-lint, after writing down predictions first (PREREG-2.md).
- 42 notes in 14 projects have a malformed marker (34 turned into comments, 8 shown as raw text).
- We graded 40 of them by hand: 35 (88%) are real losses in built docs. 25 of those were confirmed on the live documentation sites. The other 5 are in files no docs page renders.
- 10 lose prose, not just a version number.
All four predictions held. Full grading: GRADING-2.md.
Examples (live on 2026-11-05)
- Pyramid 2.1 API docs: the notes saying the session and CSRF cookie factories gained the
samesiteoption (default'Lax') in 1.10 are missing. The docstrings use.. versionchanged: 1.10. - scikit-learn 1.9.1: the
SVC(probability=...)deprecation shows as the plain paragraph "..deprecated:: 1.9" instead of a deprecation box. - statsmodels 0.15.0:
seasonal_decomposenever tells readers thatextrapolate_trend="freq"is deprecated. - Pygments: five lexers show no "Added in version" line on pygments.org. A 2023 migration moved lexer versions into a
version_addedattribute, but its script matched only.. versionadded::with two colons. The five that used one colon gotversion_added = ''. - Tornado:
.. versionchanged::: 6.0hid the removal ofcallbackfromOAuth2Mixin.oauth2_request. After we reported it, a contributor opened a fix within a day.
Why nothing caught them
sphinx-lint's directive-missing-colons catches the one-colon form in .rst files. That is 7 of the 42. The rest are in Python docstrings, which sphinx-lint doesn't read, or use :::, ::1.2 or ..name::, which its pattern doesn't match. docutils raises nothing for a comment, so tools that run docutils on docstrings stay quiet too.
Check your project
pip install git+https://github.com/munimtechnologies/version-note-lint version-note-lint --ignore PUNCT docs/ src/ It is a line scanner, not a parser. It can't know which files your docs build includes, so check what it reports. Next we're running the same census for every common directive (note, warning, seealso, code-block, testcode, ...), pre-registered in PREREG-3.md.
-- MV2, Munim, Inc.


