Repository navigation
Cut the v0.6.0 release #3533
Description
Summary
Cut the v0.6.0 release once every other issue in the milestone has merged. This is the last item in
the milestone and it is blocked by all of them.
There are 161 commits since the v0.5.6 tag, and pyproject.toml:12 still reads
version = "0.5.6".
Scope
-
Bump the version.
pyproject.toml:12is the whole change.polyfile/polyfile.py:19reads
__version__from package metadata throughimportlib.metadata.version("polyfile"), so nothing
else carries a hard-coded version string. -
Write
polyfile_0.6.0.md. Follow the structure ofpolyfile_0.5.6.md: Performance
Improvements, Bug Fixes, New Features, Magic Definitions, Breaking Changes, Dependencies. Omit a
section that has nothing in it.The release covers two bodies of work. Summarize rather than list every issue:
- libmagic fidelity. The definitions moved to 5.48, and all 88 stems of the upstream corpus
now match whatfilereports.tests/test_magic.py::KNOWN_FAILURESis empty. Tracking: the 14 stems skipped in test_file_corpus, and the ten causes behind them #3480 records how
the previous fourteen failures were retired. - Packaging.
setup.pywas replaced bypyproject.tomland the in-tree PEP 517 backend
build_backend.py(Replace setup.py with pyproject.toml and an in-tree PEP 517 backend #3513).
Call out under Breaking Changes anything in this milestone that changes observable output. At
minimum: An untyped indirect offset defaults to big endian, where libmagic uses host byte order #3499 changes how an untyped indirect offset reads its field, A BOM-prefixed JSON document is reported as JSON, where file reports Unicode text #3500 changes what a
BOM-prefixed JSON document reports, --format file is rejected, json is duplicated in the choices, and the help example uses the wrong flag #3497 changes the accepted values of--format, and try_all_offsets is accepted and ignored, and the CLI flag for it is commented out #3465
removes thetry_all_offsetsparameter fromMatcherandAnalyzer. - libmagic fidelity. The definitions moved to 5.48, and all 88 stems of the upstream corpus
-
Verify the distribution.
uv build, thenuvx twine check dist/*. Thedistributionsjob in
.github/workflows/tests.ymlalready asserts that the wheel is built from the sdist, that no
non-permissive.ksyreached the sdist, and that the package-data counts matchgit ls-files;
confirm it is green rather than re-deriving it.
Note
Publishing is out of scope for the pull request. .github/workflows/pythonpublish.yml runs on
release: published and uploads through PyPI Trusted Publishing, so the actual release is cut from
the GitHub UI after this merges.
Activity
1 remaining item
ESultanik commentedon Sep 11, 2026
Methodology for the release notes: audit the history, do not reconstruct it
Build
polyfile_0.6.0.mdfrom a complete audit of every commit message and pull requestdescription since the
v0.5.6tag, rather than from a summary or from the milestone's issue list.The milestone captures what was planned; the history captures what actually shipped, including work
that arrived outside the milestone.
Scope
Measured 2026-09-11:
v0.5.6v0.5.6was tagged 2026-02-11, so the window is seven months.Read the pull request bodies, not only the titles. This project writes long ones with measured
evidence, and the observable behavior change is usually stated there rather than in the subject line.
What the audit has to surface
The v0.5.6 notes are the model for structure — Performance Improvements, Bug Fixes, New Features,
Magic Definitions, Breaking Changes, Dependencies. Drop a section with nothing in it.
Breaking Changes needs the most care. This release changes observable output in many ways, and
anyone parsing PolyFile's output is affected. Known examples, which the audit must confirm and
extend rather than treat as complete:
--format fileis accepted where it was rejected, andjsonno longer appears twice in thechoices (--format file is rejected, json is duplicated in the choices, and the help example uses the wrong flag #3497)
try_all_offsetsparameter is removed fromMatcherandAnalyzer(try_all_offsets is accepted and ignored, and the CLI flag for it is commented out #3465)empty/inode/x-emptywhere it previously reported nothing, and--format htmlno longer crashes on one (An empty file reports nothing, where file reports empty and inode/x-empty #3566)start offset earlier (A string test matches when fewer bytes remain than its value declares #3504, A search test matches when fewer bytes remain than its value declares #3552, A negated string test no longer matches a buffer shorter than its value #3557, A flagged search tries one start offset too many #3558)
fflag makes 60 previously unfirable definitions match, so shebang scripts gain descriptionssuch as
POSIX shell script(The full word (f) flag anchors both sides, so no shipped f definition can match #3559)Two larger bodies of work also need describing at the right altitude, as themes rather than issue
lists: the libmagic 5.48 fidelity effort, which ended with all 88 corpus stems matching
fileandKNOWN_FAILURESempty, and the packaging move fromsetup.pytopyproject.tomlwith the in-treePEP 517 backend (#3513).
Also in scope
versioninpyproject.tomlfrom0.5.6to0.6.0. That single line is the whole bump;polyfile/polyfile.pyreads__version__from package metadata.uv.lockto.gitignore. It is untracked and unignored today, so it shows as dirty in everyworktree and
gh pr createwarns about it on every branch.uv build, thenuvx twine check dist/*.Publishing stays out of scope.
.github/workflows/pythonpublish.ymlruns onrelease: publishedand uploads through PyPI Trusted Publishing, so the release itself is cut from the GitHub UI after
this merges.
ESultanik commentedon Sep 12, 2026
Authorization for this issue, from @ESultanik
Direct push to
masteris authorized for this issue only, and only if the sole code change is theversion bump. No pull request is needed for that.
The release commit may contain exactly these:
pyproject.toml—version = "0.5.6"→version = "0.6.0". This is the whole code change;polyfile/polyfile.pyreads__version__from package metadata.polyfile_0.6.0.md— the new release notes..gitignore— adduv.lock, authorized separately earlier in the same discussion. It isuntracked and unignored today, so it shows dirty in every worktree and
gh pr createwarns onevery branch.
If anything else needs changing, stop and open a pull request instead. A stale document found
while auditing, a failing build, a packaging fix — none of those are covered. The authorization is
narrow by design: it exists because a version bump plus release notes has nothing to review that
reading the notes would not already show.
The release itself is a draft
Create it as a draft GitHub release against tag
v0.6.0. Do not publish it.gh release create v0.6.0 --draft --title "PolyFile 0.6.0" --notes-file polyfile_0.6.0.mdPublishing is what @ESultanik does after reviewing the draft. This matters mechanically, not just
procedurally:
.github/workflows/pythonpublish.ymltriggers onrelease: publishedand uploads toPyPI through Trusted Publishing. A published release ships to PyPI immediately and cannot be
recalled. A draft holds the notes and the tag target without triggering anything.
Bump the version to 0.6.0 and add the release notes