medlab / case

medlab

what got hurt, and what now fails loudly

↑ sublayer

2026-10-11 · fixed: yes

A developer's Python installation supplies the CI test dependencies

BehavioralIntegration Tests

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.