Repository navigation
fix(upgrade): attribute incomplete evidence precisely - #1513
Merged
Merged
Conversation
There was a problem hiding this comment.
Cursor Bugbot has reviewed your changes using default effort and found 2 potential issues.
â Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.
Reviewed by Cursor Bugbot for commit f74b36f. Configure here.
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.

Summary
Follow-up to #1481: make Kubernetes upgrade impact honest and actionable when Radar cannot collect all of the live evidence needed for the 1.37 checks. Operators now see the difference between no evidence and partial evidence, explicit authorization denials and transient collection failures, and timeless upgrade-path policy versus release-gated findings.
This matters for Kubernetes 1.37 because several checks depend on kubelet metrics/effective configuration and admission-plane resources that the default in-cluster identity deliberately cannot read. A missing permission must not look like a compatibility failure, a clean bill of health, or an unexplained Unknown.
Kubernetes 1.37 context
Radar's 1.37 review covers the operationally relevant removals and transitions documented by Kubernetes, including removed or locked feature gates, kubeadm configuration changes, kubelet
eventRecordQPS, removed cAdvisor flags/metrics, the schedulingv1alpha2removal, SELinux mount behavior, webhook readiness, and the required one-minor control-plane upgrade sequence.Authoritative references:
What changed
Precise evidence attribution
Forbiddenresponses from kubelet node-proxy requests and webhook list requests remain authoritative even when a permissive no-auth preflight allowed the attempt.Safe node-runtime access
rbac.viewNodeRuntime, defaultfalse, granting onlygetonnodes/proxywhen explicitly enabled.nodes/proxyon their own Kubernetes identity; enabling the ServiceAccount grant does not bypass per-user RBAC.Honest upgrade-impact communication
Applies fromrelease: the one-minor sequencing policy is timeless, including a live 1.37 â 1.39 path.Validation
Live Kubernetes validation
v1.35.6-gke.1710000, 9/9 nodes Ready. Radar evaluated 1.35 â 1.37 withreviewedThrough=1.37; the UI rendered the required1.35 â 1.36 â 1.37sequence and 73 grounded findings with no console errors. Independent EndpointSlice reads confirmed the unavailable webhook backends cited by fail-closed blockers and fail-open warnings. The access path rejected mutating HTTP verbs and CONNECT; node count was unchanged, while one already-running Pod became NotReady during the observation window and was treated as ambient nonprod drift.eventRecordQPS, and Prometheus metric-consumer evidence. The API values matched the injected settings, and the expected blocker/warning/review/N/A classifications rendered with zero console errors. The cluster was restored and deleted after capture.kindest/node:v1.37.0@sha256:a1ed56cfb0e7b93589bdf97c8cd566405a265939e3620fc4f5de89adff580ae5; API server and Ready node both reported v1.37.0 with containerd 2.3.4. Published Radar 1.12.1 (ghcr.io/skyhook-io/radar@sha256:a95ec5d9a50e7a874ddc85ec9fecd216eaebb95d90be4e3d36500436273c2e35) was Ready with zero restarts; health, cluster-info, resource-counts, upgrade-readiness, and the Overview UI passed. The follow-up branch also ran under the default chart ServiceAccount and rendered at 1280Ã800 and 1920Ã1080 with zero console errors.1.37.0-gke.1173000+previewin Rapid preview versions, but the documented alpha create request returned HTTP 400 and listed Rapid create support only through 1.36.3. No cluster, VM, disk, forwarding rule, address, or firewall was created. This is recorded only as an advertised-preview/create-API availability mismatch; no provider root cause is inferred.The final authoritative-SAR distinction, observed-403 attribution, and zero-evidence wire-shape correction were made after the live browser captures. They are covered by HTTP-level collector, HTTP/MCP authorizer, scanner, and frontend tests rather than represented as additional live-cluster proof.
Local QA
go test ./...cd pkg && go test ./...make tscnpx vitest run src/components/audit/UpgradeReadinessView.test.tsâ 14 passedhelm unittest -f 'tests/upgrade_impact_rbac_test.yaml' deploy/helm/radarâ 3 passed./scripts/test-chart.shmake buildâ frontend build, embed, and Go binarygit diff --checkSecurity and residual risk
The only new permission is explicit, narrowly scoped, and default-off. The main failure mode is incomplete evidence, not an incorrect compatibility verdict: unavailable sources keep affected checks Unknown/incomplete and explain the evidence boundary. Final copy/authorization corrections are test-backed but were not re-captured on the deleted disposable cluster.
Note
Medium Risk
Touches authorization for upgrade evidence and adds an opt-in
nodes/proxygrant; misconfiguration could expose node runtime details on no-auth installs, but defaults stay off and denied/missing evidence is surfaced as incomplete rather than false compatibility verdicts.Overview
Upgrade impact now separates authoritative RBAC denials from non-authoritative auth check failures (missing client, SAR errors, timeouts). HTTP and MCP upgrade authorizers expose
EvidenceAuthorizationDecision(Allowed+Authoritative); webhook collection tracks denied kinds separately from transient list failures; kubeletnodes/proxyfetches record observed 403 so checks can cite permission gaps instead of generic âmissing evidence.âAdds opt-in Helm value
rbac.viewNodeRuntime(defaultfalse) granting onlygetonnodes/proxyfor no-auth in-cluster Radar, with README/docs and a unittest for the exact ClusterRole rule.Scanner and UI propagate
NodeProxyForbiddenandAdmissionWebhookDeniedKindsinto caveats with actionable remediation; node-runtime gaps no longer blame disabled configz when proxy was forbidden. Upgrade-path blockers drop misleadingAppliesFromon timeless sequencing policy. Upgrade Readiness UI labels rows No evidence vs Partial evidence, says âincomplete evidenceâ in summaries, and avoids guessing Helm RBAC keys in coverage banners.Reviewed by Cursor Bugbot for commit d77f1ca. Bugbot is set up for automated code reviews on this repo. Configure here.