Closes#1016
## Summary
- Move nightly workflow execution to assume it already runs inside the
containerized self-hosted runner.
- Remove workflow-level Docker startup, workspace ownership fixes, and
the local tileops-runner:latest wrapper.
- Add a nightly runner verification script for cache env vars, cache
writability, and GPU visibility.
## Test plan
- [x] pre-commit passed during git commit
- [x] bash -n scripts/ci/verify_nightly_runner.sh
- [x] python -c "import yaml;
yaml.safe_load(open('.github/workflows/nightly.yml')); print('yaml ok')"
- [x] git diff --check -- .github/workflows/nightly.yml
scripts/ci/verify_nightly_runner.sh
- [x] rg -n "docker run|tileops-runner:latest|Fix workspace
ownership|/data/ci-cache" .github/workflows/nightly.yml returns no
matches
- [ ] actionlint .github/workflows/nightly.yml (not run locally;
actionlint is not installed)
## Additional context
This PR intentionally keeps the existing runner labels unchanged and
does not modify runner-maintenance.yml. Cache cleanup policy is left for
a separate follow-up, as scoped in #1016.