`apt-get install awscli` failed with "no installation candidate": the package
lives in Ubuntu's universe component, so whether it resolves depends on which
image the runner uses rather than on anything this workflow declares. Same
class of bug as the missing Yarn.
Install the official v2 bundle instead — self-contained and identical across
images — in its own step so a failure names itself, and log the image identity
so the next surprise is diagnosable from the log alone.
setup-node provides Node but not Yarn; the workflow was relying on the runner
image shipping it, as GitHub's hosted images do. When the act_runner image
changed, `yarn install` began failing with exit 127 and every push since
6964ce7 (2026-07-19) silently stopped deploying — a dead pipeline reads the
same as a site that did not need to change.
Pinned to 1.x: the lockfile is v1 and `--frozen-lockfile` is v1 syntax.
Serve it as text/plain on deploy so browsers display the raw text
instead of downloading; add .dockerignore so local image builds can't
ship stale _site or host node_modules.