Docker layer caching on the runner was reusing old layers even when source code changed, resulting in images with outdated code.