docs: kkt is retired, occidata is the sole GPU runner; document the GPU docs-build pass - #19
Merged
Merged
Conversation
…PU docs-build pass Measured 2026-09-02 while planning/probing control-toolbox/OptimalControl.jl#885 part 2 (a GPU-backed docs build) — the fleet had moved well past what this document described. **`kkt` is retired, not "the other half of a split alongside occidata".** Confirmed via `gh api orgs/control-toolbox/actions/runners`: the org registers only `occidata-runner` and `pinwheel`, no `kkt`. Every `CI.yml` in the fleet was checked directly (not inferred from labels, which lag): CTParser.jl, CTDirect.jl, CTFlows.jl, CTSolvers and CTLie all call `ci.yml` exactly twice -- `github-runner` + `occidata-runner` -- and none has a third job or a `kkt` job of any kind. A three-way split (`github` + `kkt` + `occidata`) does not exist anywhere; this document previously described one for CTFlows.jl. The `kkt-runner` label itself survives as an inert leftover in three repos (OptimalControl, CTFlows.jl, CTLie) -- defined, but consumed by nothing. **CTLie has already joined the split**, not "planned" -- `test: add GPU test suite and split CI (closes #21)`. **CTDirect.jl has already migrated off its older, separate `GPU.yml`** onto the same two-way split everyone else uses -- its own CI.yml says so directly ("Replaces the retired kkt runner"). Both corrected throughout, including the fleet-wide adoption table (§4), the walkthrough example (§3.1), and the new-repo checklist (§8) -- a checklist telling someone to create a `kkt-runner` label would have been actively wrong. **A third self-hosted GPU box, `pinwheel`, exists and was undocumented.** Found while probing `occidata`'s org runner listing for the same task. It is AMD, not CUDA, and is not a candidate for any `:gpu` CI in this ecosystem -- the whole stack (ExaModels through MadNLPGPU to CUDSS) is CUDA-only. Recorded so nobody discovers it by accident and points a CUDA job at it. **New: `documentation.yml` can carry the same kind of split, shaped differently.** control-toolbox/OptimalControl.jl#885 part 2 (CTActions#71) adds an optional `build-gpu` upgrade pass -- publish then upgrade, not attempt-then-fallback, because a docs build's single job both builds and deploys, so there is no room to attempt-and-fall-back within one job the way `ci.yml`'s split does. Documented as the pattern any future caller wanting GPU-backed docs numbers should follow. `documentation.yml`'s row in §3.1's table gains its new `gpu_runner`/`gpu_timeout_minutes` inputs; §3.2 gains occidata's new role as a docs-build target and its two operational quirks (hourly `/tmp` wipe, Monday cache purge) worth knowing before blaming a slow or retried job on the runner. Fixed one incidental markdownlint MD028 (two adjacent blockquotes separated by a blank line) introduced while drafting this. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Two things converge in this PR:
WORKFLOWS.md's runner-fleet description had drifted well past what the fleet actually does, and control-toolbox/OptimalControl.jl#885 part 2 adds a new pattern (documentation.yml's optionalbuild-gpupass) worth documenting from day one.The fleet is not what this document said
Measured 2026-09-02 by checking every
CI.ymldirectly (not inferred from labels, which lag behind actual jobs) plusgh api orgs/control-toolbox/actions/runners:kktis retired, not "the other half of a split alongsideoccidata". The org registers onlyoccidata-runnerandpinwheel— nokkt. Every package with GPU-relevant code (CTParser.jl, CTDirect.jl, CTFlows.jl, CTSolvers, CTLie) callsci.ymlexactly twice:github-runner+occidata-runner. No repo has a third job. A three-way split, which this document described for CTFlows.jl, doesn't exist anywhere.test: add GPU test suite and split CI, closes #21).GPU.ymlonto the same two-way split as everyone else — its ownCI.ymlcomment says so directly ("Replaces the retired kkt runner").kkt-runnerlabel survives as an inert leftover in three repos (OptimalControl, CTFlows.jl, CTLie) — defined, consumed by nothing.All corrected: the trigger-labels table (§2,
kkt-runnernow marked retired), the naming-convention paragraph right after it, the reusable-workflows table and split-CI paragraphs (§3.1), the fleet adoption table (§4), the walkthrough example (§3.1), and the new-repo checklist (§8) — which, uncorrected, would have told someone bootstrapping a repo to create a label for a runner that doesn't exist.A third self-hosted GPU box,
pinwheel, exists and was undocumented. Found while probingoccidata's org runner listing for the same task. It's AMD, not CUDA — not a candidate for any:gpuCI in this ecosystem, since the whole stack (ExaModels → MadNLPGPU → CUDSS) is CUDA-only. Recorded so nobody points a CUDA job at it by accident.New:
documentation.yml's optional GPU upgrade passCTActions#71 adds
build-gpu, gated by a newgpu_runnerinput, for control-toolbox/OptimalControl.jl#885 part 2. Documented here as a distinct shape fromci.yml's split, not the same pattern: publish then upgrade, not attempt then fall back. A docs build's single job both builds and deploys (deploydocsruns insidedocs/make.jl), so there's no room to attempt-GPU-then-fall-back-to-CPU within one job the wayci.yml's split can.build-gpuinstead runs only once the existing GitHub-hostedbuildjob has already published, and can never fail the workflow (continue-on-error: true) — on success it redeploys with real GPU numbers, on failure or a long queue the already-published site is simply left as is.documentation.yml's row in §3.1's reusable-workflows table gains its newgpu_runner/gpu_timeout_minutesinputs; §3.2 gainsoccidata's new role as a docs-build target, plus two operational quirks worth knowing before blaming a slow or retried job on the runner itself — its/tmpis wiped hourly atHH:01, and this workflow's own Monday 02:30 UTC maintenance purges the compiled-code cache.Also
Fixed one incidental markdownlint MD028 (two adjacent blockquotes separated by a blank line) introduced while drafting the
pinwheelnote.🤖 Generated with Claude Code