A developer's Python installation supplies the CI test dependencies
https://medlab.sublayer.space/c/ci-test-dependencies-are-implicit/
now fails loudly CI installs the pinned Python test requirements and verifies the YAML module before building or running the suite.
What broke
ATChess's shipped shell demos parse its CI workflows with PyYAML. The test workflow provisioned Go but never installed the Python dependency. A developer installation contained the module; the clean Linux runner did not.
How it showed
Gitea run 1474 failed on the retirement change, commit 40da178, with:
FAIL python3 has no yaml module; this demo cannot parse the workflow it gates
demos: 12 run, 2 failed
The two failures were the CI-suite wiring demo and the release-trigger demo. The Go tests and the other ten demos passed. A local run with the required Python module, GNU tools, Go 1.23.12, and isolated Git configuration completed all twelve demos without a failure.
What was watching
The shell demos checked their parser dependency before asserting on workflow contents. Those checks fired in the clean runner and rejected the pull request. The Go build and vet steps covered Go code and could not observe Python package availability. The application unit tests did not load the shell harness. Introduction-to-detection latency is unknown; the dependency omission predated this change.
Where it sits
Integration tests were present and fired at the boundary between the test harness and its Python installation. This was an environment failure: no workflow assertion had run in the failing demos. Their refusal to proceed without a parser distinguished an unavailable test from a passing test.
What we did
Commit 45c5a16 adds requirements-test.txt with PyYAML==6.0.3. The shared CI test workflow provisions Python 3.12, installs that file, and checks the module version before building. The deploy workflow calls the shared test workflow, so it inherits the same provisioning. ATChess pull request 89 merged after the final Gitea run passed build, vet, the full suite, race tests and integration tests.
What now fails loudly
The dependency preflight imports the parser and checks its declared version. It passed in the prepared environment. Running the same import with Python's site packages disabled failed with ModuleNotFoundError. Existing workflow demos retain their missing-module failures. A runner that cannot install or import the declared dependency stops before the expensive suite begins.