mirror of
https://github.com/kevinveenbirkenbach/computer-playbook.git
synced 2026-11-08 19:56:53 +00:00
In CI the architecture axis is satisfied by the runner: the matrix picks a row's architecture and `runs-on` lands the job on that hardware. A workstation has one CPU and cannot be asked for another, so the same INFINITO_ARCHITECTURE is honoured by telling the docker client which platform to pull and create, and letting qemu execute it. Two decisions here are easy to tidy away and should not be: The key is deliberately not spelled DOCKER_DEFAULT_PLATFORM. The env layer is sourced into the operator's own shell, where that name would pin every docker call, including the ones that build the tooling image itself. compose.yml maps it to docker's name inside the deploy container, so the platform applies where app containers are created and nowhere else. builder.py applies the handler a second time, after custom.env. That file overrides handler output, so an operator naming the architecture there would otherwise get the architecture without the platform it implies, and the deploy would run on the host's own CPU under an arm64 label. The key is emitted even when empty, because compose.yml reads it bare and this repository forbids an inline default in a compose file. Empty means what unset always meant: the host's own architecture. test_walks_full_handler_chain counted calls against handlers as a proxy for "every handler is reachable", which only holds while each runs exactly once. The deliberate second application made that 42 != 41. It now compares the two sets, which is what its own docstring claims to check. Verified: 116 unit tests under tests/unit/python/utils/env pass; a deploy with INFINITO_ARCHITECTURE=arm64 carries DOCKER_DEFAULT_PLATFORM=linux/arm64 into the container and reaches ok=1444, with aarch64-linux-gnu paths in an image build proving the containers are genuinely arm64. Known gap: switching architecture needs `rm -f .env` first. Plain `make dotenv` reads the previous INFINITO_DOCKER_PLATFORM back out of .env and the contradiction guard treats it as an operator assertion. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>