fix(ci): restore green CI — enlace floor 0.1.21 + install the dev extra - #1
Merged
Conversation
The `enlace.diagnosers` entry-point group this package registers against
(and `enlace.diagnose.iter_diagnosers`, which `diagnose_app` calls) first
shipped in enlace 0.1.21. The declared floor was `enlace>=0.1.20`, one
release too low, so a clean resolve could legitimately install 0.1.20 —
where `diagnose_app` never invokes plugin diagnosers.
That is exactly what happened in CI: the Validation (3.12) job resolved
`enlace==0.1.20` and `test_runs_via_diagnose_app_entry_point` failed with
AssertionError: assert 'docker_missing_dockerfile' in
{<Category.MISSING_ENTRY_POINT: 'missing_entry_point'>}
Reproduced locally in a clean venv: pinning enlace==0.1.20 fails that test
(1 failed, 52 passed, 2 skipped); enlace==0.1.21 passes (53 passed,
2 skipped). Developer machines masked it because they carry a newer enlace.
Claude-Session: https://claude.ai/code/session_01VipiLaG4xy7WctqY9w2475
…lected wads CI runs `pytest --doctest-modules` with no path argument, so pytest's collection roots come entirely from `testpaths`. With `testpaths = ["enlace_docker/tests"]` the `--doctest-modules` flag was inert: no module docstring in the package could ever be collected, and CI reported green regardless. Pointing testpaths at the package directory keeps the existing test files (they live under enlace_docker/tests) and additionally exposes module docstrings to doctest collection. Verified in a clean venv with the exact CI command: 53 passed, 2 skipped -- unchanged, since no module currently has doctest examples. This is about future ones being honoured. Claude-Session: https://claude.ai/code/session_01VipiLaG4xy7WctqY9w2475
Packaging metadata alignment with the rest of the ecosystem, no behaviour change: - `[project.license] text = "Apache-2.0"` -> `license = "Apache-2.0"`. The table form is deprecated under PEP 639; the built wheel now carries `License-Expression: Apache-2.0` plus an auto-included `License-File`. - Added the standard trove classifiers (the package previously published none). - Added the ecosystem-standard .editorconfig. Verified: `uv build` produces both sdist and wheel, `twine check` PASSED on both, and the wheel's entry_points.txt still carries all four `enlace.backend_strategies` entries plus the `enlace.diagnosers` one. Claude-Session: https://claude.ai/code/session_01VipiLaG4xy7WctqY9w2475
wads' reusable workflow now feeds the install step from
`[tool.wads.ci.install].extras`, which defaults to "" — so CI installed the
package with core dependencies only. Older runs got the `dev` extra by
accident, from the install-deps-uv action's own `default: "dev"`, which the
workflow now always overrides with the (empty) resolved config value.
pytest-asyncio is declared only in the `dev` extra, and `asyncio_mode =
"auto"` needs it, so every `async def` test failed:
Failed: async def functions are not natively supported.
PytestConfigWarning: Unknown config option: asyncio_mode
Reproduced locally in a clean 3.10 venv (package + bare pytest, no extra):
11 failed, 42 passed, 2 skipped. Adding the `dev` extra to that same venv:
53 passed, 2 skipped. `CIConfig.from_file` now reports install_extras='dev'.
Same fix already carried by the sibling enlace and enlace_auth repos.
Claude-Session: https://claude.ai/code/session_01VipiLaG4xy7WctqY9w2475
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Gets
ci.ymlgreen again. It had been red onmainsince 2026-05-28, and the newest commit onmainis a CI push-back carrying a workflow-skip marker, so no newer run had fired to reveal that a second, independent breakage had since landed on top of the first.Root cause — two independent failures, both in the
Run Testsstep1. Dependency floor one release too low (the original 2026-05-28 red)
Run 26588121918, job
ci / Validation (3.12), stepRun Tests:That job resolved
enlace==0.1.20. Theenlace.diagnosersextension point this package registers against —enlace.diagnose.iter_diagnosers, whichdiagnose_appcalls — first shipped in enlace 0.1.21 (enlace commit191b00b, "Phase 3 extension points — port-allocation flag + diagnoser hook"; the 0.1.20 version bump2eb2d0bprecedes it, andenlace/diagnose.pyat 0.1.20 contains zero references to the hook). The declared floor here wasenlace>=0.1.20, so a clean resolve could legitimately pick a release in which the registered diagnoser is never invoked. Developer machines masked this because they carry a newer enlace.Reproduced in a clean venv: with
enlace==0.1.20→1 failed, 52 passed, 2 skipped; withenlace==0.1.21→53 passed, 2 skipped.Today's resolver picks 0.1.27, so this specific assertion would no longer fire — but the declared floor was still wrong, and a wrong floor is a real, reproducible packaging bug for anyone installing from PyPI with an older enlace pinned.
2.
devextra no longer installed by CI (what was actually red today)The first branch push exposed this. Run 30858824314, jobs
Validation (3.10)andWindows Tests:and in the install step:
wads' reusable workflow now feeds the install step from
[tool.wads.ci.install].extras, whose default is"". Older runs of this repo got thedevextra only by accident, from theinstall-deps-uvaction's owndefault: "dev", which the workflow now always overrides with the resolved (empty) config value — compare the 2026-05-28 log, which showsif [ -n "dev" ].pytest-asynciois declared only in thedevextra andasyncio_mode = "auto"depends on it, so everyasync deftest failed.The sibling
enlaceandenlace_authrepos already carry the[tool.wads.ci.install] extras = "dev"line for exactly this reason.What changed
56526daenlace>=0.1.20→enlace>=0.1.21, with a comment recording why, plus one stale in-file version referencee98f0fctestpaths["enlace_docker/tests"]→["enlace_docker"]16b50calicense = "Apache-2.0", trove classifiers,.editorconfigca9586e[tool.wads.ci.install] extras = "dev"Notes on the two non-root-cause commits:
pytest --doctest-moduleswith no path argument, so collection roots come entirely fromtestpaths. Pointed atenlace_docker/tests, the--doctest-modulesflag was inert — no module docstring in the package could ever be collected, and CI reported green regardless. Pointing it at the package keeps every existing test (they live underenlace_docker/tests) and makes future doctests actually run. Collected counts are unchanged (53 passed, 2 skipped) because no module currently has doctest examples.[project.license]table form is deprecated under PEP 639; the built wheel now carriesLicense-Expression: Apache-2.0plus an auto-includedLicense-File. Verifieduv buildproduces both sdist and wheel,twine checkPASSED on both, and the wheel'sentry_points.txtstill carries all fourenlace.backend_strategiesentries plus theenlace.diagnosersone.No package behaviour and no test assertion was changed to make CI pass.
Verification
Local dependents gate (
priv test-dependents enlace-docker):enlace-docker pass 1.3s — 1 suites: 1 pass, 0 fail, 0 no-testsenlace-docker pass 1.2s — 1 suites: 1 pass, 0 fail, 0 no-testsBranch CI: run 30859243465 — success.
All three test jobs show
pytest-asyncio==1.4.0installed,plugins: anyio, asyncio-1.4.0, andenlace==0.1.27.Left undone
pyprojectdescription, so the audit reports a mismatch. Left as-is deliberately rather than truncating the GitHub side; worth a decision on which is canonical.skills/) — out of scope for a CI fix.DOCKER_AVAILABLE). That is by design, but it does mean the real-docker paths are exercised only locally.ci.ymlpublishes to PyPI on push tomain, so merging will cut and publish a newenlace_dockerrelease (version auto-bumped from 0.0.4). Left open for you to merge when you want that.