Changelog#
All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
Unreleased#
Changed#
Dependencies from the hub’s local Renovate run: a refreshed
uv.lock(wsgidav 4.4.0, pytest 9.2.0, ty 0.0.92, sphinx 9.2.0, setuptools 84.2.1). wsgidav 4.4.0 no longer depends on bcrypt or passlib, so thebcrypt>=5override is gone. ruff stays at the hub’sRUFF_VERSION(0.17.0) until the hub moves it; the consumer-pins gate holds the two equal.
Fixed#
Include the build-class fixtures in isolated installed-wheel tests, preserving the compression/RECORD regression and compiled-package import checks in the same run.
Mark unused response-fixture exception arguments and remove the obsolete setup logger left after wheel-helper extraction so the existing Vulture gate passes.
Validate decoded WebDAV paths before writing, including parent segments, Windows path syntax and existing symlink escapes. GET/listing failures now reach callers; responses close on errors.
Preserve existing files when filtered downloads fail mid-transfer, and compress rewritten binary-wheel entries instead of storing them uncompressed.
Changed#
Search local and direct-submodule Bash/PowerShell helpers before adding behavior here; extend the shared owner for functionality used by other consumers.
Pin ANTfrastructure’s shared Bash/PowerShell reuse scanner so CI reports consumer-to-hub overlap candidates.
Pin ANTfrastructure to the Renovate driver that updates direct submodules to their remote default branches and initializes missing checkouts on apply, including WSL over Windows Git checkouts.
Add a one-command local Renovate wrapper for manifests, lockfiles and the ANTfrastructure gitlink, with dry-run and exit-code instructions.
Add shared CI quality reports, Ruff/ty analysis, PowerShell lint and complexity reporting, a manual Python refactor preview and a submodule pin check. Generated local reports stay under ignored
logs/.download_filesanddownload_all_files_iterativeaccept a keyword-onlyextensionsuffix and return a download count. The hub uses this API for filtered and whole-tree downloads.Wheel rewriting is shared with OrchestrANT through ANTfrastructure’s manifest-checked
build_support/kataglyphis_wheel.pycopy, included in every sdist without a hub import.The README header shows WebDavClient’s own logo,
images/logo.svg(2026-10-21, owner): an ant carrying a file down from a cloud, from the family set DocumANTation’sscripts/make_repo_logos.pydraws.images/logo.pngis rendered from it at 256 px.The docs site shows WebDavClient’s own logo (2026-10-21, owner):
docs/source/conf.pysetshtml_logoandhtml_favicontoimages/logo.svgaftersetup_theme(), in place of the theme’s shared wireframe.Windows runs the suite on the installed cp3XYt wheel too (hub CON122). The subset moved from
scripts/linux/ci_packaging.sh’s flags intopyproject.toml’s[tool.antfrastructure.free-threaded-wheel-tests], unchanged; the Linux twin, the hub’s Windows x64 build and thewindows-11-armstage all read it, and the hub’s runner fails a run that left the GIL enabled. The third_party/ANTfrastructure gitlink moves to the hub commit that adds it.docs/source/README.mdanddocs/source/CHANGELOG.mdare no longer tracked (hub CON117). Both were hand-synced copies of the root files and had drifted (the CHANGELOG copy lacked 5dad56c’s and 970353a’s entries).docs/Makefileandmake.batnow copy the root files in before every build, as the hub’sci_build_docs.shdoes;.gitignoreholds the copies, anddoc-link-roots.allowlets the hub’s doc-links gate resolvegetting-started.md’sREADME.md#quick-startfrom the repo root. The third_party/ANTfrastructure gitlink moves to the hub commit that reads that file.Windows arm64 runs on
:winarm64’s interpreters and builds its wheels with the image’s toolchain (hub CON113). The hub’s job installed uv and downloaded CPython 3.15.0 and 3.15.0+freethreaded onwindows-11-arm(run 39336879640), then built the wheels with the runner’s Visual Studio. Now awindows-2025job stages both legs in:winarm64: the cp315 and cp315twin_arm64wheels cross-built with its VS 2026 and clang-cl, the image’s target interpreters and the lock’s set;windows-11-armruns the suite on the installed wheels (arm64-test-env: KATAGLYPHIS_EXPECT_COMPILED=1), proves each wheel alone and uploads them. The release skips the stage artifact, whose interpreters carry ensurepip’s pip wheel.Dependabot is off (owner, 2026-10-20: dependency upgrades go only through Renovate as a local CLI, ANTfrastructure’s
docs/dependency-updates.md)..github/dependabot.yml(uv) is deleted, its open PR #31 closed and the repository’s Dependabot security-update PRs disabled; Dependabot alerts stay on.Every lane tests and packages only the pinned CPython, once with the GIL and once free-threaded (owner, 2026-10-20). Windows x64 ran 3.13, 3.14 and 3.14t and packaged on 3.14, so
uv python installdownloaded 3.13 and 3.14 into:winamd64, which carries 3.15.0 (dry run 39309927573).scripts/windows/python-ci.psd1namespinned pinnedtand no packaging version; Windows arm64’sarm64-python-versionsispinned pinnedt. The Windows wheels follow the pin: cp315 and cp315t where v0.10.1 shipped cp314 and cp314t; Linux keeps:latest’s 3.14 and 3.14t until that image is rebuilt. Measured in:winamd64with the hub’s driver: legs 3.15 (22 passed, 2 skipped) and 3.15t (23 passed, 1 skipped), both from the image’s interpreters, no download; wheelscp315-cp315andcp315-cp315twin_amd64, the second proved with the GIL off.The quick start syncs on the pinned 3.15 (
uv sync --all-extras --python 3.15, 3.15t for the free-threaded build) where it named 3.14. Nothing in the repo selects the pin (no.python-version;requires-pythonis>=3.10), so the flag stays; getting-started says where the pin lives.bcrypt is overridden only below 3.15: 5.0.0 has no cp315t wheel, and its PyO3 0.26 refuses to build for 3.15, which failed the 3.15t leg’s sync. wsgidav lists it, but the tests’ mock server runs without auth and nothing imports it.
The README logo is the family’s ant (2026-10-17, owner: one icon in every repository), drawn from OmniAccelerANT’s
assets/icons/kataglyphis_app_icon.svg.The README is a short overview (owner, 2026-10-19: every README links into its docs, and ANTfrastructure’s
repository-family.mdholds contributing, licence and contact for the family). Installation, usage, tests and static analysis moved to the newdocs/source/getting-started.md, which is in the Sphinx toctree. The empty Roadmap, Useful tools and Acknowledgements sections, the commented-out Vulkan literature and the unused Best-README-Template link definitions are gone. The clone URL ishttps://, as for every family repository, and the logo has an absolute URL, so it also shows on the docs site and in the package’s long description..github/copilot-instructions.mdpoints atAGENTS.mdand names five of its rules, in English. It was a 213-line German template with C++, Rust and Dart sections for code this repository does not have.AGENTS.mdlinks ANTfrastructure instead of restating it (2026-10-19): the lint gates and the freeze-file contract, the bootstrap copies’ body mode and their drift history, the module-private PowerShell imports,git-sync-branches.sh, the workflow naming and the CI-round and release rule point at the hub’s pages; this repo’s lanes, release files and exceptions stay.doc-dupes-hub.allowturns on the hub’sdoc-dupes --against-hubgate.The docs site wears the family theme (2026-10-19):
docs/source/conf.pycallssphinx_kataglyphis.setup_theme(), so the site gets the current brand CSS, the family logo and favicon, the Kataglyphis code palette,<page> — WebDavClienttitles and GitHub heading anchors on every level (myst_heading_anchors6, was 3).docs/Makefileandmake.batinstall the theme editable from the hub’s vendored DocumANTation before every build; a uv path source would fail everyuv sync --lockedof a checkout without submodules. Thesys.pathentry the oldconf.pyadded resolved against the working directory to the repository’s parent; autodoc imports the package the docs venv installs.release.ymlcalls the hub’srelease-publish.yml(2026-10-19) for its version check and its release job, which collects with this repo’scollectoptions (the wheels and the sdist, the pure wheel and the sdist from Linux x64 only, reports and logs left out), tagsv<version>and publishes.scripts/linux/collect-release-assets.sh, its suite andlinux-x64.yml’srelease-collectorjob are gone; the hub’s suite runs these options over this repo’s uploads. Over v0.10.1’s real uploads (run 39048087762) the old and the hub collector pick the same 10 files, the release’s assets butSHA256SUMS. ANTfrastructure moves to c3fc7585.The Windows x64 build is the hub’s (2026-10-19):
scripts/windows/Build-Windows.ps1is gone, andpython-ci-windows.ymlruns ANTfrastructure’sInvoke-PythonCiBuild.ps1instead, which readsscripts/windows/python-ci.psd1. The legs (3.13, 3.14, and 3.14t with only thetestsextra) and the packaging on 3.14 are unchanged; ANTfrastructure moves to 1a174d9c. Three things differ:Static analysis gates: a finding fails the lane, where each tool used to log and carry on. It is the hub’s
Invoke-CiStaticAnalysis.ps1on the pinned Python (3.15 at this pin, was 3.13): codespell, bandit (the package, the hub’s excludes), vulture,ruff check,ruff format --checkand ty.mypy no longer runs; the Linux lane never ran it.
A failing
bench/demo logsskippedinstead of failing its leg, as on Linux.
Removed#
exhale_argsindocs/source/conf.py, andbreatheandexhalein thedocsextra: Doxygen tooling for C++ that no page loaded. The docs build without them gives zero warnings, as before.docs/source/_static/css/custom.css, an 81-line fork of the brand sheet that still painted links the pre-cyan green; the theme ships the generated one.
Fixed#
AGENTS.mdnames what a release carries instead of “six binary wheels”: a cp314 and a cp314t wheel from each of Linux x86_64 and aarch64 and Windows amd64 and arm64 (eight, as v0.10.1 has), Linux x64’s pure wheel and sdist, andSHA256SUMS.docs/source/CHANGELOG.mdmatchesCHANGELOG.mdagain; it lacked the 0.10.0 and 0.10.1 sections, anddocs/Makefilebuilds from the tracked copy. 0.10.0’s link to the hub’sAGENTS.mdis absolute, so it resolves from the copy too.The dead links a live-site audit found (2026-10-19) are gone. The docs index linked
py-modindex.html, which Sphinx did not write, and the API page’s:no-index:left the eight links back from the highlighted source without a target; the page now indexesWebDavClientand its methods. The README’s Automatic Dependency Submission badge named a workflow this repository does not have. The coverage report and both test reports, published with every docs build, are linked from the docs index.AGENTS.mdmatches the code again: the lint aggregator runs eight gates, not seven; theWORKSPACE_ROOTpitfall namesci_packaging.sh, the one wrapper that runs its driver withoutantfrastructure_execand so exports the variable itself; andscripts/windows/also holdssetup-dependencies.ps1.
0.10.1 - 2026-10-17#
Added#
Windows arm64 wheels (2026-10-17): the Windows arm64 lane builds
cp314-cp314-win_arm64andcp314-cp314t-win_arm64natively onwindows-11-arm, after its tests, with Visual Studio’s own clang-cl, and installs each alone into a fresh venv where every compiled module must load (thecp314tone with the GIL off). The release collector picks them up beside thewin_amd64pair, and its suite expects ten files now. Until now a release carried no Windows arm64 wheel, because the hub’s arm64 container cross-builds no GIL Cython wheel. ANTfrastructure moves to f24e7530 (python-ci-windows.yml’sarm64-wheels). Owner rule of the same day: every release ships Windows arm64 next to x64.
[0.10.0] - 2026-10-16#
Changed#
Every push to
mainreleasesv<version>, and only when all four lanes are green (2026-10-16,release.yml, the family’s rule in ANTfrastructure’sbranch-and-release-strategy.md). The version isVERSION.txt’s; the release carries the binary wheels of Linux x64, Linux arm64 and Windows x64 (cp314 and cp314t each), the pure wheel and the sdist, which every lane builds and Linux x64’s copy ships (scripts/linux/collect-release-assets.sh; its suite runs with Linux x64 on every push). The hub moves to 15bc7d6c, which carries the release script.A push runs Linux x64 and the lint gates; Linux arm64, Windows x64 and Windows arm64 run on request (2026-10-16), the family’s CI rule (ANTfrastructure’s
branch-and-release-strategy.md).on-request.ymlstarts the lanes a pushed commit message asks for with the ci token (windows,arm64,all), every lane keeps its Run workflow button, and each lane’s concurrency group names the lane and its caller.ruff 0.17.0, ANTfrastructure 3a0ab1c3 -> 0768e5e0 and the lock’s maintenance (2026-10-13). The hub’s tool batch moves
RUFF_VERSIONto 0.17.0, sopyproject.toml,.pre-commit-config.yamlanduv.lockfollow it in the same commit, as the consumer-pins gate requires.uv lock --upgradewith uv 0.13.0, the hub’s pin, writes lock revision 5 and moves ten packages, ty 0.0.86, numpy 2.5.4 and pre-commit 4.7.0 among them.linux-x64.yml’s two-line comment is one line again; the comment-size ratchet had failed the lint lane on it since 2026-10-12. In:latest: the seven lint gates and the six static-analysis gates pass, and so do 22 tests (2 skipped) on CPython 3.15.0 and 3.14.4, and 23 (1 skipped) on 3.14t.The suite on the installed cp314t wheel runs through the hub’s step (2026-10-12).
scripts/linux/ci_packaging.shcalls the hub’stest-free-threaded-wheel.sh(hub ff91d46d, CON66) with--extra tests --copy tests --copy pytest.ini --env KATAGLYPHIS_EXPECT_COMPILED=1, in place of the localscripts/linux/test-free-threaded-wheel.sh, which is gone. The lock’s set now comes fromuv export --lockedrather than--frozen. A local run of the wrapper in:latestproved 3 compiled modules and passed all 24 tests.
Added#
The whole suite runs against the installed cp314t wheel on both Linux rows (2026-10-11). The 3.14t test leg tested the uncompiled sources, and the hub’s proof only creates each compiled module without running it.
scripts/linux/ci_packaging.shnow runsscripts/linux/test-free-threaded-wheel.shafter the hub driver. It installs the lockedtestsextra and thecp314twheel into a fresh 3.14t venv, and runs pytest from a copy oftests/that has no package directory beside it.tests/unit/test_free_threading.pyfails when importing the package re-enables the GIL, and, underKATAGLYPHIS_EXPECT_COMPILED=1, when a module is not the compiled one.tests/test_webdav_client.pyadds eight threads that share one client and one destination. Locally in:latest: 22 passed on the wheel. Both negative controls fail: a wheel built withoutfreethreading_compatiblegivesassert True is Falseand the hub’s proof exits 1, and a run from the checkout imports the sources.A
packagingextra with auditwheel (2026-10-07). The hub’s Linux packaging repairs the Cython wheels to manylinux with the packaging venv’s auditwheel once the hub pin carries 0fb3bd95; PATH never had one, so the Linux binaries shipped aslinux_<arch>.A proved free-threaded wheel beside the GIL one (2026-10-07).
pyproject.tomldropsProgramming Language :: Python :: 3.14t, which is no trove classifier (PyPI refuses an upload that names it), for the officialProgramming Language :: Python :: Free Threading :: 2 - Beta: Beta, because the 3.14t test legs gate. The hub’s packaging drivers read that classifier: once the hub pin carries them, they build a second Cython wheel on the image’s 3.14t (cp314-cp314t) and load its compiled modules in a fresh 3.14t venv, failing when the GIL comes back on.setup.pytherefore sets Cython’sfreethreading_compatible=True(cython>=3.1, the first with the directive); without it the proof fails, as a local negative control showed. Proved locally with the hub’s new drivers in:latestand:winamd64: both lanes shipkataglyphis_webdavclient-0.0.1-cp314-cp314t-{linux_x86_64,win_amd64}.whl, its 3 compiled modules keep the GIL off, and the 18 tests pass on 3.14t against the installed wheel withsys._is_gil_enabled()still False.A Windows arm64 test lane (
.github/workflows/windows-arm64.yml, “Windows arm64 · test”, 2026-10-01). It is the hub’s runner-nativewindows-11-armjob (arm64-tests, hub 0ef3f68d): no container and no build, just the whole pytest suite on the 3.14 and 3.14t legs. It uses arm64 CPython from uv, pinned and SHA-checked by the hub. The lock resolves fromwin_arm64wheels alone since py-spy and line_profiler stay off ARM64. ANTfrastructure moves from 65d61617 to 0ef3f68d.scripts/linux/run-lint-gates.shand.github/workflows/lint-gates.yml: the family lint lane. Seven gates over the tracked tree — shell lint, workflow lint plus the CI image-ref check, secret scan,ruff, the shared-config drift check, the consumer pin-forwarding check and the ratchets — all owned by ANTfrastructure’slinux/scripts/run-lint-gates.sh. Before this the repo had no shell, workflow or secret linting at all.comment-size.allow,function-size.allow,code-complexity.allow: the ratchet freeze files. The wrapper passes--ratchetsitself, so the seventh gate is not optional here: it runs the doc-link gate and eight measurement gates over this tree. Five measured clean and get no file at all. Every row in the three that exist carries a reason and is a queue entry, not an exemption — the contract fails on growth, on a new offender, on an unrecorded shrink AND on a stale row..antfrastructure-shared.manifest: declares the two upstream files this repo holds a copy of (antfrastructure-sh,resolve-build-module) so the shared-config gate compares them instead of trusting the word “verbatim” in a header..gitignorehad to un-ignore it — the PyInstaller*.manifestrule is unanchored..github/actionlint.yaml: teaches the pinned actionlint theubuntu-26.04runner labels it predates.
Changed#
uv.lockmaintenance: every locked package at its newest release (2026-10-07). The owner’s “bleeding edge” rule covers the lock too, and no Renovate manager reported this drift because the hub’s shared preset had nolockFileMaintenance.uv lock --upgrademoved 41 packages; the majors are chardet 6, filelock 4, more-itertools 11 and rich 15, all transitive, and pytest-benchmark 5.3 swaps py-cpuinfo for py-cpuinfo2. ty goes 0.0.23 -> 0.0.85, numpy 2.4.3 -> 2.5.3 (cp314t wheels on PyPI), cython 3.3.0. ruff stays at the hub’s 0.16.10. No code change was needed: in:latest,ci_static_analysis.shpasses its 6 gates (ty 0.0.85 included),ci_tests.shpasses 18 tests on 3.14 and on 3.14t (bcrypt 5.0.0 and numpy 2.5.3 from free-threaded wheels), andrun-lint-gates.shpasses 7/7.Windows packaging is the hub’s
Invoke-CiPackaging.ps1on 3.14 (2026-10-07).scripts/windows/Build-Windows.ps1built in a 3.13 venv with a bareuv build, which ignores the venv and takes whatever interpreter uv finds, a free-threaded one included. The driver asks for3.14+gil, as the Linux lane does, and adds the free-threaded wheel above.Comments are one line, only the why (2026-09-30). The family rule, in the hub’s
AGENTS.mdand linked fromAGENTS.md: 27 files lose their comment blocks, and code is unchanged. ANTfrastructure moves fromf65ccae9to497ba711for the gate that grades every language and the bootstrap templates the two local copies follow. Itsversions.envpins ruff at 0.16.8, sopyproject.toml,.pre-commit-config.yamlanduv.lockfollow (0.16.7 and 0.16.8 report the same findings here).The Linux lane runs on 3.14 again, and atheris is 3.1.0. The 3.13 pin of 2026-09-15 (below, under Fixed) existed because atheris 3.0.0 shipped no cp314 wheel. atheris 3.1.0 ships cp312, cp313 and cp314 wheels, so
uv.lockmoves to it and the lane’s tests, static analysis, docs and packaging run on 3.14, the image’s interpreter; 3.14t stays experimental. The marker gainspython_version >= '3.12', because 3.1.0 has no sdist and no cp310/cp311 wheel. A source build is still no way out: atheris’find_libfuzzer.shlooks forlib/linux/libclang_rt.fuzzer_no_main-x86_64.a, which the family image’s per-target compiler-rt layout does not provide, and 3.0.0 refuses to import on 3.14 even once built withLIBFUZZER_LIB(measured 2026-09-29).The Linux wrappers no longer unset
VIRTUAL_ENV/UV_PYTHON. The family image stopped exporting both with hub CON18 (:latestof 2026-09-29), soci_tests.shandci_static_analysis.shdropped the lines described under Fixed below;UV_PROJECT_ENVIRONMENTin the latter stays, because the driver still never activates the venv it creates.2026-09-25: one workflow per platform + arch, and every lane a thin caller.
ubuntu-26.04-amd64-arm64.ymlis split intolinux-x64.yml(“Linux x64 · buildtest”) and
linux-arm64.yml(“Linux arm64 · build + test”), both calling ANTfrastructure’spython-ci-linux.ymlwitharches: x64/arches: arm64. The docs deploy stays on the x64 row, so only that file passes the FTP secrets.lint-gates.ymlnow calls the hub’s reusable lint lane withratchets: true, which runs whatscripts/linux/run-lint-gates.shruns locally; its header had asked for exactly this switch the day that lane existed. The README badges follow the new files.
2026-09-25: ANTfrastructure’s reusable workflows and composite actions are called at
@develop, no longer@mainas the older entry below says. Since 2026-09-16 every lane also runs on pushes and pull requests todevelop, not onlymain. The hub pin isf65ccae9(2026-09-16), which is on the hub’smain, as is the3c83a5e3the NOTE below warns about.2026-09-24: the workflows follow the family naming convention (owner decision).
windows-2025.ymliswindows-x64.yml(“Windows x64 · build + test”) and the lint lane’s display name is plainLint gates, as in every other repo. Triggers, jobs and job ids are unchanged; the README badges follow the new file.ubuntu-26.04-amd64-arm64.ymlkeeps its name for now: its split intolinux-x64.ymlandlinux-arm64.ymlneeds a hub reusable-lane input that is not on hubmainyet.The hub pin moved to ANTfrastructure
3c83a5e3(from the published72730743). The published hub still listed WebDavClient underunconfirmedin its.github/consumers.json, and the workflow-conventions gate refuses a tree it cannot key its allow rows to, so that gate could not pass at the old pin at all. NOTE:3c83a5e3is NOT PUSHED anywhere yet — do not push this repo before ANTfrastructure is, or the gitlink resolves to nothing.scripts/linux/lib/antfrastructure.shre-synced against the new pin (hub commit08137b27rewrote the template).ANTFRASTRUCTURE_DIRnow resolves in a documented order — explicit env, then the submodule, then anantfrastructure-toolssibling clone — and the not-found error picks its hint from whether.gitmodulesactually declares the submodule.The two reusable-lane callers declare
permissions: contents: read, which is whatpython-ci-linux.ymlandpython-ci-windows.ymldeclare themselves; a called workflow runs on the caller’s token, and the only registry credential in either lane issecrets.GHCR_PAT. Without it GITHUB_TOKEN fell through to the repository default.*.allowjoins theeol=lfrules in.gitattributes: those files are read only by the hub’s Python gates, which run in the Linux container.The hub submodule moved from
ExternalLib/Kataglyphis-ContainerHubtothird_party/ANTfrastructure, matching every other consumer, and.gitmodulesnow points athttps://github.com/Kataglyphis/ANTfrastructure.git. The upstream repository was renamed from Kataglyphis-ContainerHub to ANTfrastructure; every reference in this repo followed, including thecontainerhub_*bootstrap entry points (nowantfrastructure_*),scripts/linux/lib/containerhub.sh(nowlib/antfrastructure.sh), and this repo’s own name, which dropped itsKataglyphis-prefix.The two reusable-workflow lanes now call
Kataglyphis/ANTfrastructure/.github/workflows/python-ci-{linux,windows}.yml@main. The Linux lane’s file was renamedubuntu-24.04-amd64-arm64.yml->ubuntu-26.04-amd64-arm64.yml: the reusable lane pinsubuntu-26.04andubuntu-26.04-arm, so the old file name had been wrong since adoption.scripts/windows/Resolve-BuildModule.ps1re-synced from the upstream template. The local copy had fallen 16 body lines behind: the.ps1arm ofResolve-BuildModule(which is what makesInitialize-CiEnvironment.ps1reachable) and the dot-source guard inImport-BuildModulewere both missing.ruffis pinned to0.16.7inpyproject.tomland.pre-commit-config.yaml, forwarded from ANTfrastructure’sversions.envand checked by the consumer-pins gate. The three numbers had drifted apart — the lockfile carried 0.15.6 while pre-commit asked for 0.13.2..github/github_copilot_instructions.mdrenamed to.github/copilot-instructions.md, the path GitHub Copilot actually reads.
Deprecated#
Placeholder for soon-to-be removed features.
Removed#
Placeholder for now removed features.
Fixed#
Every compiled module builds with clang-cl on Windows; the first one used MSVC’s
cluntil now (2026-10-12).ClangBuildExtset the compiler’scctoclang-clbefore the firstcompile(), which then raninitialize()and putcl.exeback, sokataglyphis_webdavclient/dummy.ccompiled and linked with MSVC’s tools in every Windows build (run 38214955666).build_extensionnow initializes the compiler first. Thespawnhook meant to catch this is gone: setuptools 84 never calls it.One loguru file sink per log file, not one per client (2026-10-11). Every
WebDavClient()calledlogger.add("logs/downloadMd_s.log"). Eight clients built on eight threads wrote each line eight times and rotated the file eight times (measured on 3.14t). The sinks are now a lock-guarded module set keyed by absolute path. That is the only mutable module state the thread-safety audit found, andfreethreading_compatible=Truerests on it.Downloads are renamed into place (2026-10-11). Each file streams into a private
.<name>.<uuid>.partbeside it, then replaces the target. Threads that share a destination no longer truncate each other’s file, and the response is closed on every status. Windows denies a replace while another thread replaces the same target, and the first CI run failed withPermissionErroron windows-11-arm (run 38142999677). There the replace retries for up to about 4 s; elsewhere the error is final.Wheels ship only the package (2026-10-11).
[tool.setuptools.packages.find]had noinclude, so namespace discovery packedthird_party/,scripts/andimages/, 218 packages, into every wheel. The pure wheel drops from 363 KB to 12 KB.cythonize(force=True)(2026-10-11). An in-tree.cleft by an earlier build was reused as is, so a changed compiler directive did not reach the next wheel.CI tests the WebDAV client again (2026-10-01).
Every lane now runs the whole configured suite: all 10 tests, including the 6
test_webdav_client.pytests against the mock server and the integration test.Since 2025-10-20 all lanes had run
tests/unitonly (3 dummy tests). Before that, the single Linux x64 lane ran all oftests/.The free-threaded 3.14t leg now really tests: it syncs only the tests extra and gates. Before, it synced nothing and passed on a warning.
Two dependency changes make that possible:
atheris is removed. Nothing used it, and it has no cp314t wheel.
bcrypt is overridden to >=5. wsgidav caps it below 5, and 4.x has no free-threaded wheel; the mock server runs without auth.
Windows gates on every leg instead of letting 3.14 and up fail.
py-spy and line_profiler leave the tests extra on Windows arm64 (
platform_machine != 'ARM64'). py-spy has no win_arm64 wheel, and line_profiler has none for 3.14t. No test imports either, so the lock now resolves from wheels alone there, for the arm64 test job that comes next.
tests/integration/test_dummy.pypatchednumpy.random.normalwhileSimpleMLPreprocessorcallsnp.random.default_rng().normal(...), so the fixture was never used and the label assertion was a fair coin on four rows — passing about one run in sixteen. It now patchesdefault_rng. Pre-existing: neither file had changed sinceorigin/main.Four references the doc-link gate resolves to nothing: two cross-repo pointers that named the hub’s
AGENTS.mdanddocs/adopting-in-a-new-project.mdas if they were this repo’s, and a relativeLICENSElink in the two WebDAV test fixtures that has never existed beside them.The Linux lane pinned 3.14, where this project cannot install.
testsdeclaresatheris, every lane syncs--all-extras, and atheris 3.0.0 ships cp311/cp312/cp313 wheels and nothing newer, so 3.14 falls back to an sdist whose build needs a Clang with libFuzzer and fails. That build did succeed in the family image on 2026-08-14 (run31823466662); it no longer does, on a runner or on a dev box with the same image. The lane’s test, static-analysis and packaging interpreters are 3.13 now — the newest every locked dependency of this project actually ships; 3.14t stays because the driver treats it as experimental and its sync failure only warns. Restore 3.14 when atheris ships a cp314 wheel, or give atheris a marker instead of the lane a pin.Neither half of the Linux lane’s gating ran, for one shared reason. Upstream’s
uv_runisuv run --activewith the image’sUV_PYTHON=/opt/venv/bin/pythonandVIRTUAL_ENV=/opt/venvstill in scope, while its siblinguv_sync_projectclears exactly those two for its own call and documents why. Static analysis: its driver never activates the venv it creates (uv_venv_ensureactivates only one that already existed), so all six gates hit root-owned/opt/venvand died withPermission deniedbefore running a check. Tests:uv_runfound the activated.venv-<ver>disagreeing withUV_PYTHON, deleted it, rebuilt it with the image’s interpreter and default groups — andpytestis in thetestsEXTRA, so the run died withFailed to spawn: `pytest`. The matrix only ever escaped that by testing the one interpreter the image happens to ship. The two wrappers now clear those variables (and static analysis namesUV_PROJECT_ENVIRONMENT, doing what theuv_venv_activateci_build_docs.shalready carries would do). Invisible until the pin reachedd339cd52: upstream ran those six behind|| trueuntil 2026-09-08.The two findings that surfaced once the analysers ran for real, fixed rather than ignored:
ruffCPY001 over twelve files (the MITLICENSE’s notice now heads each one), andvultureonmyst_heading_anchors, which was the one Sphinx setting missing fromconf.py’s own_SPHINX_EXPORTStuple.
Security#
The open Dependabot alerts in
uv.lockare fixed (2026-10-01), withuv lock --upgrade-packagefor exactly the affected packages:wsgidav 4.3.3 → 4.3.5, which adds bcrypt and passlib;
lxml 6.0.2 → 6.1.3;
urllib3 2.6.3 → 2.8.0;
soupsieve 2.8.3 → 2.10;
requests 2.32.5 → 2.34.2;
idna 3.11 → 3.20;
setuptools 82.0.1 → 84.0.0;
pygments 2.19.2 → 2.21.0;
virtualenv 21.2.0 → 21.14.2, which brings python-discovery 1.1.3 → 1.6.1. GitHub only raised this alert after rescanning the updated lock.
The five Dependabot PRs merged the same day (#22–#26) had already moved pytest past its advisory.
No version has been released yet: VERSION.txt reads 0.0.1, and the
repository carries no tags (2026-09-25).