spec(ENV-LEASE-GPU-CAPABILITY): the missing capability is CAP_SYS_ADMIN, and it is absent from the worker's BOUNDING set - #1623
Merged
Conversation
…IN, and it is absent from the worker's BOUNDING set #1354 records that `nvidia-smi -lgc` returns `LGC_RC=4` inside an `rc` lease as root, and asks for the capability to be named so the fleet owner receives a patch rather than a symptom. Both halves of that identification are now closed. The driver side is pinned. At `NVIDIA/open-gpu-kernel-modules` tag `580.173.02`, which is the driver version the refusing dgx job reported, the open kernel module's whole Linux privilege surface is three tests and no more: `NV_IS_SUSER() == capable(CAP_SYS_ADMIN)` at `nv-linux.h:537`, `capable(CAP_PERFMON)` at `os-interface.c:390`, and `capable(CAP_SYS_NICE)` at `os-interface.c:397`, with `os_check_access` closing `default: return NV_FALSE`. That bounds the candidate set at three and leaves `CAP_SYS_ADMIN` as the test a privileged clock control reaches. `lease-clock-pinning.md` recorded this quotation as an external reference nobody had read at a pinned revision and named a blob or a checkout as what confirming it owes; this pays that. The container side was never measured at all, only derived from manifests. Two `rc run` probes on the idle `thor:gpu0` and `orin:gpu0` read `CapEff = CapPrm = CapBnd = 0x00000000a80425fb` byte-identically on both, the default 14-capability OCI set, holding none of the three. `CapBnd` is the load-bearing column: a capability absent from the bounding set cannot be regained by `setcap`, by a setuid binary or by re-execing, so no job-side workaround exists and this is container configuration rather than job authorship. `thor:gpu0` reproduced the refusal itself on driver `595.78`, so it is measured on two boxes and two driver versions rather than one. The probe also rules out three readings by reading rather than assuming: every NVML query in the same job succeeded, so `NVIDIA_DRIVER_CAPABILITIES` is not it; `/dev/nvidiactl` is present and world-writable, so the device cgroup is not it; and `/proc/driver/nvidia/params` reads `RmProfilingAdminOnly: 1`, which governs profiling counters and is a different gate, so nobody should reach for an NVreg knob expecting `-lgc` to start working. No threshold moves. `MAX_WITHIN_RUN_SPREAD_PCT` stays 5.0 and no constant in `tools/bench/gpu_clock_state.py` is touched, because a capability diagnosis is not evidence about a statistic and #1354 refuses a widening that turns a red green. The rule question is already argued on evidence in `lease-clock-pinning.md` and `clock-gate-route.md`; this row adds nothing to it. Two things this does not do, recorded in the spec rather than left implicit. It recovers no ratio: the nine 2026-08-19 windows carry an independent throttle refusal that no grant removes from archived data. And it did not attempt #1354's settle-and-hold option, because `dgx:gpu0` was held by a live campaign all session, `rc hold` is not this row's to take, and thor and orin report `[N/A]` for the SM clock the 5% rule bounds -- so a procedure could not have been demonstrated, and naming one that was not run is what the issue forbids. `environment.md` and `benchmarking.md` also gain the 2026-08-21 finding from #1574 that pinning works from the leased HOST at 0.29% spread under load, with the part that keeps #1354 open: that path needs a campaign-scoped authorization, so the pod path is still the only path for every other row and is still refused. FOLLOWING_AGENTS_PROTOCOL Following-Agents-Protocol: true AI-Assisted: true Assisted-by: AGENT:claude-opus-5 [Claude Code]
`origin/main` advanced four commits while this row's capability probes were running on the fleet. Merged rather than rebased so the branch keeps the commit order that proves the spec was committed before anything else. No conflict: this row touches `.agents/specs/lease-gpu-capability.md`, `.agents/environment.md` and `.agents/benchmarking.md`, and the incoming commits touch none of them. FOLLOWING_AGENTS_PROTOCOL Following-Agents-Protocol: true AI-Assisted: true Assisted-by: AGENT:claude-opus-5 [Claude Code]
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.
spec(ENV-LEASE-GPU-CAPABILITY): the missing capability is CAP_SYS_ADMIN, and it is absent from the worker's BOUNDING set
#1354 records that
nvidia-smi -lgcreturnsLGC_RC=4inside anrclease as root, and itsoption 1 asks for the capability to be named so the fleet owner receives a patch
rather than a symptom. Both halves of that identification are now closed. This
is records only: no
src/,include/,tests/ortools/file changes, andgit diff $(git merge-base origin/main HEAD)..HEAD -- tools/ src/ include/ tests/is empty.
The driver side, now pinned
lease-clock-pinning.md§Evidence records itsCAP_SYS_ADMINquotation as "anexternal reference nobody here has read at a pinned revision" and names what
confirming it owes: "either a checkout at a named revision or a link to the exact
blob". This pays that, at tag
580.173.02— the driver version the refusing dgxjob reported at
job.log:9.grep -n 'capable(\|CAP_'overkernel-open/common/inc/nv-linux.handkernel-open/nvidia/os-interface.cat that tag returns four hits and no others,so the open kernel module's whole Linux privilege surface is three tests:
capable(CAP_SYS_ADMIN)nv-linux.h:537NV_IS_SUSER(), and through itos_is_administrator()capable(CAP_PERFMON)os-interface.c:390os_check_access(RS_ACCESS_PERFMON)capable(CAP_SYS_NICE)os-interface.c:397os_check_access(RS_ACCESS_NICE)os_check_accessclosesdefault: { return NV_FALSE; }, so a right that isneither
PERFMONnorNICEis refused outright rather than falling through tothe administrator test. That bounds the candidate set at three and leaves
CAP_SYS_ADMINas the test a privileged clock control reaches.What this does not establish, stated rather than buried. NVML and
nvidia-smiare closed source, so thatnvmlDeviceSetGpuLockedClockscallsos_is_administratorrather thanos_check_accessis an inference from theenumeration, not a read of the call site. The enumeration is what makes it
tight, and the acceptance test below discriminates all three.
The container side, now measured
It was never measured; it was derived from manifests. Two
rc runprobes on theidle
thor:gpu0(job34e3fb43) andorin:gpu0(jobdd72fa7b), both asuid=0(root), read byte-identical masks:0x00000000a80425fbis the default 14-capability OCI set.CapBndis theload-bearing column: a capability absent from the bounding set cannot be
regained by
setcap, by a setuid binary, byNoNewPrivsbeing 0, or byre-execing. So no job-side workaround exists, and this is container
configuration rather than job authorship.
NoNewPrivs: 0andSeccomp: 0inthe same read rule out a seccomp filter as an alternative explanation.
thor:gpu0reproduced the refusal itself on driver595.78, so it is measuredon two boxes and two driver versions rather than one, and the manifest-derived
fleet-wide claim becomes a measurement.
Three readings ruled out by reading rather than assuming: every NVML query in
the same job succeeded (
READ_RC=0), soNVIDIA_DRIVER_CAPABILITIESis not it;/dev/nvidiactlis present and world-writable, so the device cgroup is not it;and
/proc/driver/nvidia/paramsreadsRmProfilingAdminOnly: 1, which governsprofiling counters and is a different gate, so nobody should reach for an
NVregknob expecting-lgcto start working.The ask, and the test that falsifies it
One line on the
workercontainer ininfra-flux-kubemanifests/{dgx,thor,orin}/rc-worker.yaml:rc run -d dgx:gpu0 -- bash -c 'nvidia-smi -lgc 2100; echo LGC_RC=$?; nvidia-smi -rgc'LGC_RC=0and the diagnosis was right.LGC_RC=4still and the control does notreach
os_is_administrator, so tryadd: ["PERFMON"]next — notprivileged: true, whose success would name nothing and which grants everycapability, disables seccomp and AppArmor and relaxes the device cgroup. If the
fleet owner wants least privilege first,
PERFMONis the cheaper probe and thesame test discriminates it. The cost is stated plainly in the spec: the grant
reaches every job submitted through
rc, not only the worker.No threshold moves, deliberately
MAX_WITHIN_RUN_SPREAD_PCTstays5.0,BENIGN_THROTTLE_MASKstays0x1 | 0x2 | 0x100, and no constant intools/bench/gpu_clock_state.pyistouched. A capability diagnosis is not evidence about a statistic, and #1354
refuses a widening that turns a red green. The rule question of option 3 is
already argued on evidence in
lease-clock-pinning.mdhalf two andclock-gate-route.md§Is it a forbidden widening; this row adds nothing to itand needs nothing from it.
Two things this does not do
It recovers no ratio. The nine 2026-08-19 windows carry an independent
throttle refusal that no grant removes from archived data, exactly as
clock-gate-route.md§What no route recovers states.It did not attempt #1354's settle-and-hold option, and the spec says why
rather than proposing an unvalidated procedure.
dgx:gpu0— the only GB10 andthe only box the 5% failure was measured on — was held by
BENCH-QWEN38-27B-SOTAfor the whole session with a live server container on it;
rc holdis not thisrow's to take; and
thor:gpu0andorin:gpu0report[N/A]for the SM clockthe 5% rule bounds, so the quantity is not readable there. A procedure could not
have been demonstrated, and naming one that was not run is what the issue
forbids.
Records
environment.mdandbenchmarking.mdalso gain the 2026-08-21 finding from#1574 that pinning works from
the leased HOST at 0.29% spread under a ten-minute decode load, together with the
part that keeps #1354 open: that path needs a campaign-scoped
rc holdplussshauthorization whichdeveloper-preferences.mdexplicitly leaves unchangedfor every other row, so the pod path is still the only path for every other row
and is still refused. Its two caveats travel with it — persistence mode can be
lost when the last GPU client detaches, so verify the clock DURING the run; and
the recorded
-lgc 2100recipe is about 69% of this device's 3003 MHz maximum,right for a RATIO and wrong for an ABSOLUTE.
No
.agents/issue-index.mdrow is appended: #1354 is already indexed at row 446and this row opens no new issue.
Gates
scripts/check-commit-style.py --range origin/main..HEAD—OK: commit writing style, rc 0scripts/check-commit-trailers.py --range origin/main..HEAD—OK: commit trailer contract, rc 0scripts/agent-preflight.sh— every Record gateok, includingcheck-env-doc,check-now-current,check-symbol-anchors,audit-live-rowsandcheck-agent-recordgit diff $(git merge-base origin/main HEAD)..HEAD -- tools/ src/ include/ tests/— empty, which is this row's central claimOwed
dgx:gpu0's own capability mask. The same sixty-second probe is queued behindBENCH-QWEN38-27B-SOTAand had not run at the time of writing, so dgx's mask isinferred from two agreeing devices and the manifests while its refusal is
measured three times on 2026-08-19. Listed under
## Owedin the spec.FOLLOWING_AGENTS_PROTOCOL
Following-Agents-Protocol: true
AI-Assisted: true
Assisted-by: AGENT:claude-opus-5 [Claude Code]