The missing open-source Kubernetes UI with a built-in MCP server for AI agents. See what's broken, why, and what changed. Issues, Topology, event timeline, Helm, GitOps, live service traffic, and cluster audits - all in one Go binary.
This report summarizes scanner evidence for skyhook-io/radar, a Go project with 4,002 GitHub stars. SynthScan examined 1,152,829 lines of code across 4130 source files, recording 1990 pattern matches distributed across 14 syntactic categories. The legacy adjusted pattern signal is 1.9 (Low pattern signal); it is not an authorship estimate.
Use the findings to ask whether maintainers can explain intent, verify dependencies, simplify unnecessary scaffolding, and focus review effort. Risk Payload v1 adds ownership, supply-chain, over-engineering, and review-effort vectors when available. These are prompts for human verification, not probabilities, security findings, or measured maintenance costs.
Use each vector to guide manual verification of the underlying findings.
Payload schema: 1.0.0 · Engine: 2.0.0 · Scoring: heuristic-density-v1 · Scan date: 2026-10-31.
Can maintainers explain intent, assumptions, and trade-offs? 1917 finding(s).
Are imports declared and package/API names verified? 21 finding(s).
Are wrappers, guards, and repeated structures necessary? 803 finding(s).
Which changes need focused human review? 1990 finding(s).
This chart tracks the legacy adjusted pattern score across scan runs. Changes can reflect source changes, scan coverage, or detector/scoring versions; they do not measure AI adoption or prove that a team refactored code. Compare runs only when their scoring versions are compatible. The dashed line tracks the raw pattern-hit count.
Groups findings by configured severity weight. Severity is not a confidence estimate, security rating, or proof that a package is missing. Verify imports against the project's manifests and inspect each finding in its local design context.
This horizontal bar chart shows where configured pattern scores accumulate across directories. Treat the bars as locations to inspect, not as evidence of authorship or code quality. Use the file-level findings to decide whether a directory needs a focused ownership, dependency, complexity, or review check.
The scanner identified 1990 distinct pattern matches across 14 syntactic categories. Each entry below represents a discrete location in the source code where the engine recorded a detector match to inspect in context. Expand any category row to inspect the individual file paths, line numbers, code snippets, and the lexical context (CODE, COMMENT, or STRING) in which each match was detected.
Reading the findings table: The Severity column indicates the configured finding weight (CRITICAL / HIGH / MEDIUM / LOW). The Context column identifies whether the match occurred inside executable code, an inline comment, or a string literal — legacy comment-context matches receive a ×1.5 score weight. The ⚡ bolt icon marks clustered matches: three or more patterns within a 10-line window, each receiving an additional ×1.5 density multiplier under the legacy scoring model.
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | install.sh | 1 | #!/bin/sh | COMMENT |
| LOW | cmd/testserver/main.go | 1 | // cmd/testserver is a standalone binary that starts a Radar server backed by | COMMENT |
| LOW | cmd/explorer/main.go | 221 | // Cloud-mode: Radar runs inside a customer cluster and connects to Radar Hub. | COMMENT |
| LOW | cmd/desktop/menu.go | 41 | // clipboardAccelerator drops Ctrl+C/Ctrl+X on Linux only. GTK menubar | COMMENT |
| LOW | cmd/desktop/menu.go | 101 | }) | COMMENT |
| LOW | cmd/desktop/main.go | 101 | log.Printf("Radar Desktop %s starting...", version) | COMMENT |
| LOW | web/src/App.tsx | 181 | issues: 'Issues', helm: 'Helm', helmCompare: 'HelmCompare', traffic: 'Traffic', | COMMENT |
| LOW | web/src/App.tsx | 401 | // the user's pinned state returns when they widen again. Fly-out labels cover | COMMENT |
| LOW | web/src/App.tsx | 681 | // On a history Pop (back/forward) the URL is authoritative. The URL-write | COMMENT |
| LOW | web/src/App.tsx | 781 | // regardless of this callback's memoization. | COMMENT |
| LOW | web/src/App.tsx | 1041 | // fallback during the initial scope fetch. | COMMENT |
| LOW | web/src/App.tsx | 1081 | // Query client for cache invalidation | COMMENT |
| LOW | web/src/App.tsx | 1441 | // server-side pref has actually been cleared makes React Query refetch | COMMENT |
| LOW | web/src/RadarApp.tsx | 1 | // Top-level React component for Radar's web UI. | COMMENT |
| LOW | web/src/context/DiagnoseCustomization.tsx | 1 | // Slot-based injection of a resource-level "Investigate" action, and of the | COMMENT |
| LOW | web/src/context/ConnectionContext.tsx | 121 | const sseGenerationRef = useRef(0) | COMMENT |
| LOW | web/src/context/ConnectionContext.tsx | 161 | // other (SSE always writes a connected frame on stream open); refreshing | COMMENT |
| LOW | web/src/context/ConnectionContext.tsx | 221 | const current = connectionRef.current | COMMENT |
| LOW | web/src/utils/wails-clipboard.ts | 1 | // === Wails Desktop Clipboard === | COMMENT |
| LOW | web/src/utils/shell-safe.ts | 1 | // Remediation commands are typed into an interactive terminal, so quoting is | COMMENT |
| LOW | web/src/components/cloudConnectHandoff.ts | 1 | import { ApiError, type CloudInstallAttempted, type CloudInstallBlocked, type CloudInstallFailure } from '../api/client' | COMMENT |
| LOW | web/src/components/CloudFunnelButton.tsx | 41 | // | COMMENT |
| LOW | web/src/components/CloudFunnelButton.tsx | 141 | const inCluster = capabilities.data?.deployment?.mode === 'in-cluster' | COMMENT |
| LOW | web/src/components/CloudFunnelButton.tsx | 261 | // outcome on Back. | COMMENT |
| LOW | web/src/components/traffic/TrafficView.tsx | 501 | // A 'partial' warning is the source telling us this is as complete as it gets — | COMMENT |
| LOW | web/src/components/home/mcpToolCatalog.ts | 1 | // Human-facing catalog for the MCP setup dialog (MCPSetupDialog.tsx). | COMMENT |
| LOW | web/src/components/home/TopologyPreview.tsx | 141 | // refusal as zero. | COMMENT |
| LOW | web/src/components/resources/ResourcesView.tsx | 321 | COMMENT | |
| LOW | web/src/components/diagnose/AgentSetupNotice.tsx | 81 | {checking ? "Checking…" : "Check again"} | COMMENT |
| LOW | web/src/components/diagnose/ActivityTurn.tsx | 61 | diagnosis: Diagnosis | null; | COMMENT |
| LOW | …/components/diagnose/investigationEvidencePartition.ts | 121 | }; | COMMENT |
| LOW | web/src/components/diagnose/DiagnoseSurface.tsx | 201 | } | COMMENT |
| LOW | web/src/components/diagnose/DiagnoseContext.tsx | 101 | // - "needs-restart": a supported agent is installed but investigations are | COMMENT |
| LOW | web/src/components/diagnose/DiagnoseContext.tsx | 221 | const MIN_W = 400; | COMMENT |
| LOW | web/src/components/diagnose/DiagnoseContext.tsx | 241 | // hides what it overlays without showing more of itself; fill the content | COMMENT |
| LOW | …ts/diagnose/investigationEvidence/bodies/inventory.tsx | 61 | // Agents write namespace "" for a cluster-scoped kind; that states none. | COMMENT |
| LOW | web/src/components/workload/WorkloadView.tsx | 1701 | }: { | COMMENT |
| LOW | web/src/components/workload/WorkloadView.tsx | 1801 | setProbeError(null) | COMMENT |
| LOW | web/src/components/workload/WorkloadView.tsx | 1981 | // underneath. The baseline is the fingerprint of THE RESULT TRACE ITSELF: | COMMENT |
| LOW | web/src/components/workload/WorkloadView.tsx | 2041 | }, [pendingRunPath, runInClusterTest]) | COMMENT |
| LOW | web/src/components/nav/PrimaryNavRail.tsx | 41 | COMMENT | |
| LOW | web/src/components/gitops/GitOpsView.tsx | 241 | refetchInterval: GITOPS_ROWS_REFRESH_INTERVAL_MS, | COMMENT |
| LOW | web/src/components/gitops/GitOpsView.tsx | 421 | // Radar-driven Argo suspension is signaled by annotations that record the | COMMENT |
| LOW | web/src/components/timeline/TimelineView.tsx | 81 | COMMENT | |
| LOW | web/src/components/timeline/TimelineView.tsx | 321 | // arm a filter that hides everything. Gate the read on stored pins so the param | COMMENT |
| LOW | web/src/components/timeline/TimelineView.tsx | 401 | // on screen to own the range). | COMMENT |
| LOW | …b/src/components/timeline/RetainedTimelineScrubber.tsx | 121 | selection: ScrubberRange | COMMENT |
| LOW | …b/src/components/timeline/RetainedTimelineScrubber.tsx | 161 | enabled: !!fetchOverview, | COMMENT |
| LOW | web/src/components/issues/IssuesPane.tsx | 41 | // cpu, node-pinned, zonal PVC, a non-Karpenter managed node group) is NOT | COMMENT |
| LOW | web/src/hooks/useNavRailPinned.ts | 1 | import { useCallback, useEffect, useState } from 'react' | COMMENT |
| LOW | web/src/api/timelineSource.ts | 1 | // Timeline data-source abstraction. | COMMENT |
| LOW | web/src/api/timelineSource.ts | 41 | // Only meaningful for 'retained': the maximum lookback the retained backend | COMMENT |
| LOW | web/src/api/timelineSource.ts | 101 | export interface TimelineEventsResult { | COMMENT |
| LOW | web/src/api/timelineSource.ts | 161 | deletes: number | COMMENT |
| LOW | web/src/api/timelineSource.ts | 221 | } | COMMENT |
| LOW | web/src/api/timelineSource.ts | 241 | // Matches the hub's per-response row cap. A window holding more arrives as | COMMENT |
| LOW | web/src/api/timelineSource.ts | 261 | const RETAINED_FULL_RESYNC_MS = 60 * 60 * 1000 | COMMENT |
| LOW | web/src/api/timelineSource.ts | 481 | // The delta cursor rides the SAME react-query commit as the events it | COMMENT |
| LOW | web/src/api/timelineSource.ts | 501 | // newest-ringLimit rows within the window too — a server window fetch would | COMMENT |
| LOW | web/src/api/timelineSource.ts | 541 | // A frozen window never slides and never polls, so it refetches only on a | COMMENT |
| 1031 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | web/src/types/clusterLoadState.ts | 13 | export function dashboardClusterLoadState(data?: { | CODE |
| LOW | web/src/contexts/CapabilitiesContext.tsx | 154 | export function useNamespacedCapabilities(namespace: string | undefined) { | CODE |
| LOW | web/src/context/DiagnoseCustomization.tsx | 89 | export function DiagnoseCustomizationProvider({ | CODE |
| LOW | web/src/context/ConnectionContext.tsx | 54 | export function refreshQueriesAfterReconnect(queryClient: QueryClient, previousContext: string, nextContext: string) { | CODE |
| LOW | web/src/context/ConnectionContext.tsx | 65 | export function shouldAutoRetryConnection(errorType?: string): boolean { | CODE |
| LOW | web/src/context/ConnectionContext.tsx | 73 | export function shouldApplyPolledConnection( | CODE |
| LOW | web/src/utils/navigation.ts | 13 | export function searchHitToSelectedResource(hit: SearchHit): SelectedResource { | CODE |
| LOW | web/src/utils/navigation.ts | 45 | export function getNetworkPolicyResourceTarget(topology: Topology | null): { kind: string; group?: string } | undefined | CODE |
| LOW | web/src/utils/wails-clipboard.ts | 51 | export function installWailsClipboardShim(): void { | CODE |
| LOW | web/src/integrations/workspaceRoutes.ts | 20 | export function workspaceContextSwitchSearch(pathname: string, search: URLSearchParams): URLSearchParams { | CODE |
| LOW | web/src/components/useContextSwitchFlow.tsx | 11 | function shouldSuppressSwitchErrorToast(error: unknown): boolean { | CODE |
| LOW | …/src/components/settings/LocalConfigurationDetails.tsx | 19 | export function PreviousIntegrationSettingsNotice({ profiles, onNavigate, onDismissed }: { | CODE |
| LOW | …/src/components/settings/LocalConfigurationDetails.tsx | 83 | export function LocalConfigurationDetails({ onNavigate }: { onNavigate: (section: SettingsSectionId) => void }) { | CODE |
| LOW | web/src/components/settings/settings-state.ts | 50 | export function prometheusHeadersFromRows( | CODE |
| LOW | web/src/components/home/NetworkPolicyCoverageCard.tsx | 11 | export function NetworkPolicyCoverageCard({ data, onNavigate }: NetworkPolicyCoverageCardProps) { | CODE |
| LOW | web/src/components/whats-new/WhatsNew.tsx | 76 | function hadRadarStateBeforeThisSession(): boolean { | CODE |
| LOW | …ents/resources/renderers/KarpenterNodePoolRenderer.tsx | 13 | export function KarpenterNodePoolRenderer({ data, onNavigate }: KarpenterNodePoolRendererProps) { | CODE |
| LOW | web/src/components/rightsizing/presentation.ts | 19 | export function getResourceRequestPresentation( | CODE |
| LOW | web/src/components/rightsizing/RightsizingScanView.tsx | 61 | export function getRightsizingScanSurfaceState(input: { | CODE |
| LOW | web/src/components/cost/source.ts | 18 | export function costSourcePreferenceLabel(preference?: string): string { | CODE |
| LOW | web/src/components/cost/source.ts | 105 | export function costIntegrationUnavailableMessage( | CODE |
| LOW | web/src/components/cost/errors.ts | 3 | export function costUnavailableReasonFromError(error: unknown): CostUnavailableReason | undefined { | CODE |
| LOW | web/src/components/cost/format.ts | 91 | export function formatProjectedMonthlyCost(hourlyCost: number, currency: string | undefined): string { | CODE |
| LOW | web/src/components/cost/format.ts | 95 | export function formatProjectedMonthlyRate(hourlyCost: number, currency: string | undefined): string { | CODE |
| LOW | web/src/components/cost/CostView.tsx | 809 | export function resourceKindForCostWorkload(kind: string): string | null { | CODE |
| LOW | web/src/components/cost/ApplicationCostTab.tsx | 421 | function ApplicationWorkloadCostRow({ | CODE |
| LOW | web/src/components/cost/ApplicationCostTab.tsx | 527 | function ApplicationCostDiscovering({ | CODE |
| LOW | web/src/components/cost/ApplicationCostTab.tsx | 559 | function ApplicationCostUnavailable({ | CODE |
| LOW | web/src/components/cost/CostTrendChart.tsx | 499 | export function kubecostTrendUnavailableMessage( | CODE |
| LOW | …/src/components/shared/LargeClusterNamespacePicker.tsx | 5 | export function LargeClusterNamespacePicker({ namespaces, onSelect, ranked = false, renderMeta }: { | CODE |
| LOW | web/src/components/diagnose/investigationExplanation.ts | 4 | export function supportsAssessmentExplanation( | CODE |
| LOW | …mponents/diagnose/investigationEvidencePresentation.ts | 70 | function statusWithoutObservationTimes(status: unknown): unknown { | CODE |
| LOW | …mponents/diagnose/investigationEvidencePresentation.ts | 94 | function warningWithoutElapsedTime(warning: string): string { | CODE |
| LOW | web/src/components/diagnose/target.ts | 37 | export function formatInvestigationTarget( | CODE |
| LOW | …rc/components/diagnose/InvestigationCapacityNotice.tsx | 70 | export function InvestigationCapacityNotice({ | CODE |
| LOW | …rc/components/diagnose/InvestigationCapacityNotice.tsx | 218 | export function InvestigationCapacityRecovery({ | CODE |
| LOW | …src/components/diagnose/InvestigationRefusalAction.tsx | 6 | export function InvestigationRefusalAction({ | CODE |
| LOW | web/src/components/diagnose/toolCallLabel.ts | 149 | export function investigationRunningLabel({ | CODE |
| LOW | web/src/components/diagnose/InvestigationView.tsx | 134 | export function InvestigationStartErrorAlert({ | CODE |
| LOW | web/src/components/diagnose/InvestigationView.tsx | 174 | export function InvestigationFailureNotice({ | CODE |
| LOW | web/src/components/diagnose/InvestigationView.tsx | 222 | export function InvestigationStatusCheckNotice({ | CODE |
| LOW | web/src/components/diagnose/InvestigationView.tsx | 264 | function captureEvidenceCardLayout(container: HTMLElement) { | CODE |
| LOW | …/components/diagnose/investigationEvidencePartition.ts | 61 | export function evidenceTypePrefersFullRow( | CODE |
| LOW | …/components/diagnose/investigationEvidencePartition.ts | 71 | export function investigationEvidenceFullRowFlags( | CODE |
| LOW | …/components/diagnose/investigationEvidencePartition.ts | 89 | export function partitionInvestigationEvidence( | CODE |
| LOW | …/components/diagnose/investigationEvidencePartition.ts | 231 | export function investigationEvidenceRevealCollection( | CODE |
| LOW | …/components/diagnose/investigationEvidencePartition.ts | 250 | export function previousDifferentObservations( | CODE |
| LOW | …/components/diagnose/investigationEvidencePartition.ts | 284 | export function investigationEvidenceShouldRevealHistory( | CODE |
| LOW | web/src/components/diagnose/investigationMetrics.ts | 83 | function withoutStringsAndComments(query: string): string { | CODE |
| LOW | web/src/components/diagnose/DiagnoseSurface.tsx | 267 | export function unavailableInvestigationMessage(embedded: boolean): string { | CODE |
| LOW | web/src/components/diagnose/DiagnoseSurface.tsx | 273 | export function investigationHistoryIsPersistent(input: { | CODE |
| LOW | web/src/components/diagnose/DiagnoseSurface.tsx | 285 | export function investigationHeaderPresentation(input: { | CODE |
| LOW | web/src/components/diagnose/DiagnoseSurface.tsx | 362 | export function openInvestigationEvidenceResource( | CODE |
| LOW | web/src/components/diagnose/DiagnoseSurface.tsx | 384 | function revealInvestigationDestination( | CODE |
| LOW | …/components/diagnose/InvestigationResourceEvidence.tsx | 8 | export function InvestigationResourceEvidence({ | CODE |
| LOW | …/src/components/diagnose/InvestigationEvidencePane.tsx | 60 | export function InvestigationEvidencePane({ | CODE |
| LOW | …ponents/diagnose/investigationResourceEvidenceModel.ts | 89 | export function isSensitiveInvestigationConfigKey(key: string): boolean { | CODE |
| LOW | …ponents/diagnose/investigationResourceEvidenceModel.ts | 106 | function isSensitiveInvestigationConfigValue(value: string): boolean { | CODE |
| LOW | …ponents/diagnose/investigationResourceEvidenceModel.ts | 177 | function sealedSecretEncryptedKeys( | CODE |
| LOW | …ponents/diagnose/investigationResourceEvidenceModel.ts | 251 | export function buildInvestigationResourceEvidenceModel( | CODE |
| 691 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | internal/trace/egress_test.go | 13 | // ── builders ────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | internal/trace/egress_test.go | 66 | // ── chip text + DNS gate ────────────────────────────────────────────────── | COMMENT |
| MEDIUM | internal/trace/egress.go | 159 | // ── destination labels ──────────────────────────────────────────────────── | COMMENT |
| MEDIUM | internal/trace/egress.go | 252 | // ── ports (tooltip phrase only - kept off the chip face to stay calm) ─────── | COMMENT |
| MEDIUM | internal/trace/egress.go | 282 | // ── DNS coverage ────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | internal/trace/egress.go | 554 | // ── rendering helpers (chips + notes for the Finding) ────────────────────── | COMMENT |
| MEDIUM | internal/trace/egress.go | 642 | // ── small utilities ─────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | internal/trace/coverage.go | 2464 | // ── helpers ────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | internal/server/applications_identity.go | 167 | // ── Env-token discovery ────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | scripts/rbac-demo.sh | 60 | # ── Scenario 1: healthy SA + Role + RoleBinding ────────────────────────── | COMMENT |
| MEDIUM | scripts/rbac-demo.sh | 112 | # ── Scenario 2: wildcard ClusterRole + SA + Pod ────────────────────────── | COMMENT |
| MEDIUM | scripts/rbac-demo.sh | 161 | # ── Scenario 3: system:authenticated grant ─────────────────────────────── | COMMENT |
| MEDIUM | scripts/rbac-demo.sh | 179 | # ── Scenario 4: orphan RoleBinding referencing a missing Role ──────────── | COMMENT |
| MEDIUM | scripts/rbac-demo.sh | 198 | # ── Scenario 5: SA with no bindings ────────────────────────────────────── | COMMENT |
| MEDIUM | packages/k8s-ui/src/utils/applications.ts | 1122 | // ─── Chip dialect ──────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/k8s-ui/src/utils/topology-neighborhood.ts | 318 | // ─── Workload ownership tagging ────────────────────────────────────────────── | COMMENT |
| MEDIUM | …-ui/src/components/resources/renderers/PodRenderer.tsx | 123 | // ── Env vars section — extracted to use hooks (useState for reveal) ────────── | COMMENT |
| MEDIUM | …kages/k8s-ui/src/components/logs/LogToolbarSelects.tsx | 11 | // ── ContainerSelect ─────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | …kages/k8s-ui/src/components/logs/LogToolbarSelects.tsx | 41 | // ── LogRangeSelect ──────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | …8s-ui/src/components/applications/ApplicationsView.tsx | 212 | // ── App groups ────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | …ckages/k8s-ui/src/components/workload/WorkloadView.tsx | 144 | // ── Hosted chrome (expanded mode) ──────────────────────────────────────── | COMMENT |
| MEDIUM | …ckages/k8s-ui/src/components/workload/WorkloadView.tsx | 184 | // ── Data (injected by wrapper) ────────────────────────────────────────── | COMMENT |
| MEDIUM | …ckages/k8s-ui/src/components/workload/WorkloadView.tsx | 217 | // ── Timeline data ──────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | …ckages/k8s-ui/src/components/workload/WorkloadView.tsx | 249 | // ── Capabilities ───────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | …ckages/k8s-ui/src/components/workload/WorkloadView.tsx | 255 | // ── Mutations ──────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | …ckages/k8s-ui/src/components/workload/WorkloadView.tsx | 271 | // ── Tab state (optional URL sync) ──────────────────────────────────────── | COMMENT |
| MEDIUM | …ckages/k8s-ui/src/components/workload/WorkloadView.tsx | 277 | // ── GitOps navigation ───────────────────────────────────────────────────── | COMMENT |
| MEDIUM | …ckages/k8s-ui/src/components/workload/WorkloadView.tsx | 313 | // ── Render props for platform-specific content ─────────────────────────── | COMMENT |
| MEDIUM⚡ | …ckages/k8s-ui/src/components/workload/WorkloadView.tsx | 414 | // ── Duplicate ──────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM⚡ | …ckages/k8s-ui/src/components/workload/WorkloadView.tsx | 418 | // ── Download ───────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM⚡ | …ckages/k8s-ui/src/components/workload/WorkloadView.tsx | 422 | // ── ResourceActionsBar props (passed through) ──────────────────────────── | COMMENT |
| MEDIUM | …ckages/k8s-ui/src/components/workload/WorkloadView.tsx | 969 | // ── Collapsed (drawer) mode ────────────────────────────────────────────── | COMMENT |
| MEDIUM | …ckages/k8s-ui/src/components/workload/WorkloadView.tsx | 1166 | // ── Expanded (full) mode ───────────────────────────────────────────────── | COMMENT |
| MEDIUM | pkg/audit/registry.go | 65 | // ── Security ────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | pkg/audit/registry.go | 184 | // ── Reliability ─────────────────────────────────────────────────── | COMMENT |
| MEDIUM | pkg/audit/registry.go | 275 | // ── Efficiency ──────────────────────────────────────────────────── | COMMENT |
| MEDIUM | pkg/audit/registry.go | 345 | // ── Cross-resource / lifecycle (emit under Reliability) ──────────── | COMMENT |
| MEDIUM | pkg/audit/registry.go | 431 | // ── CloudNativePG ───────────────────────────────────────────────── | COMMENT |
| MEDIUM | pkg/audit/registry.go | 443 | // ── GitOps coverage (emit under Reliability) ─────────────────────── | COMMENT |
| MEDIUM⚡ | pkg/audit/deprecations.go | 23 | // ── Removed in 1.22 ─────────────────────────────────────────────── | COMMENT |
| MEDIUM⚡ | pkg/audit/deprecations.go | 33 | // ── Removed in 1.25 ─────────────────────────────────────────────── | COMMENT |
| MEDIUM⚡ | pkg/audit/deprecations.go | 41 | // ── Removed in 1.26 ─────────────────────────────────────────────── | COMMENT |
| MEDIUM⚡ | pkg/audit/deprecations.go | 45 | // ── Removed in 1.27 ─────────────────────────────────────────────── | COMMENT |
| MEDIUM⚡ | pkg/audit/deprecations.go | 48 | // ── Removed in 1.29 ─────────────────────────────────────────────── | COMMENT |
| MEDIUM⚡ | pkg/audit/deprecations.go | 51 | // ── Removed in 1.32 ─────────────────────────────────────────────── | COMMENT |
| MEDIUM⚡ | pkg/audit/deprecations.go | 54 | // ── Removed in 1.37 ─────────────────────────────────────────────── | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | web/src/components/traffic/TrafficWizard.tsx | 149 | // Step 1: Choice screen | COMMENT |
| LOW | web/src/components/traffic/TrafficWizard.tsx | 317 | // Step 2: Install instructions (for non-Helm installs like gcloud commands) | COMMENT |
| LOW | internal/traffic/hubble.go | 103 | // Step 1: Find hubble-relay pods by label across ALL namespaces | COMMENT |
| LOW⚡ | internal/traffic/hubble.go | 139 | // Step 2: Find the hubble-relay service in the same namespace | COMMENT |
| LOW⚡ | internal/traffic/hubble.go | 146 | // Step 3: Check for TLS certs | COMMENT |
| LOW⚡ | internal/traffic/hubble.go | 149 | // Step 4: Determine service port and whether it's TLS | COMMENT |
| LOW | internal/traffic/hubble.go | 161 | // Step 5: Store discovered configuration, unless the request ended: the | COMMENT |
| LOW | internal/k8s/context_manager.go | 561 | // Step 1: Tear down all subsystems. Stop sessions first — past this point the | COMMENT |
| LOW | internal/k8s/context_manager.go | 578 | // Step 2: Switch the K8s client to the new context | COMMENT |
| LOW | internal/k8s/context_manager.go | 602 | // Step 3: Test connectivity before proceeding with initialization. | COMMENT |
| LOW | internal/k8s/context_manager.go | 619 | // Step 4: Initialize all subsystems (same function as initial boot). | COMMENT |
| LOW | internal/k8s/context_manager.go | 634 | // Step 5: Notify all registered callbacks | COMMENT |
| LOW⚡ | internal/k8s/subsystems.go | 308 | // Step 3: dynamic cache. Reset the PolicyReport index first because | COMMENT |
| LOW⚡ | internal/k8s/subsystems.go | 315 | // Step 2: resource discovery + resource cache | COMMENT |
| LOW⚡ | internal/k8s/subsystems.go | 319 | // Step 1: timeline | COMMENT |
| LOW | .claude/commands/visual-test.md | 5 | ## Step 1: Verify Playwright MCP | COMMENT |
| LOW | .claude/commands/visual-test.md | 9 | ## Step 2: Understand What to Test | COMMENT |
| LOW | .claude/commands/visual-test.md | 22 | ## Step 3: Verify Cluster Access | COMMENT |
| LOW | .claude/commands/visual-test.md | 48 | ## Step 4: Check Required Resources Exist | COMMENT |
| LOW | .claude/commands/visual-test.md | 72 | ## Step 5: Build and Launch Radar | COMMENT |
| LOW | .claude/commands/visual-test.md | 93 | ## Step 6: Visual Testing with Playwright | COMMENT |
| LOW | .claude/commands/visual-test.md | 162 | ## Step 7: Report | COMMENT |
| LOW | .claude/commands/visual-test.md | 185 | ## Step 8: Cleanup | COMMENT |
| LOW | docs/authentication.md | 433 | ### Step 1: Create a ClusterRole with the permissions you want | COMMENT |
| LOW | docs/authentication.md | 463 | ### Step 2: Bind it to your users or groups | COMMENT |
| LOW | docs/authentication.md | 514 | ### Step 3: Verify | COMMENT |
| LOW | scripts/test-rbac.sh | 18 | # WARNING: This script applies ClusterRoleBindings and RoleBindings to the | COMMENT |
| LOW | pkg/topology/builder.go | 6023 | // Step 1: Find services referenced by ingresses | COMMENT |
| LOW | pkg/topology/builder.go | 6320 | // Step 2: Find all services and check which have pods | COMMENT |
| LOW | pkg/topology/builder.go | 6351 | // Step 3: Build Ingress nodes and edges | COMMENT |
| LOW | pkg/topology/builder.go | 7280 | // Step 4: Add Internet node if we have ingresses, gateways, Istio gateways, or KNative services with URLs | COMMENT |
| LOW | pkg/topology/builder.go | 7340 | // Step 5: Add Service nodes (only included ones) | COMMENT |
| LOW | pkg/topology/builder.go | 7360 | // Step 6: Aggregate pods by owner and create PodGroup nodes | COMMENT |
| LOW | pkg/auth/permissions.go | 217 | // Step 1: Check cluster-wide "list pods" — if allowed, user is effectively cluster-admin | COMMENT |
| LOW | pkg/auth/permissions.go | 228 | // Step 2: Parallel check each namespace for "list pods" OR "list deployments". | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| CRITICAL | web/src/components/cnpg/actions/CNPGClusterActions.tsx | 550 | ha.data?.quorum.enabled && switchTarget && ha.data.quorum.status && ha.data.quorum.status.standbyNames.lengt | CODE |
| CRITICAL | web/src/components/cnpg/actions/CNPGClusterActions.tsx | 551 | ? `${switchTarget} is not among the recorded potentially synchronous standbys (${ha.data.quorum.status.sta | CODE |
| CRITICAL | internal/k8s/env_change_evidence.go | 213 | candidate := status.State.Running.StartedAt.Time.Add(-time.Second) | CODE |
| CRITICAL | internal/capacity/model_test.go | 470 | if !member.Node.ActualUsage.Quantity.AsOf.Equal(want) { | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | web/src/components/traffic/TrafficWizard.tsx | 149 | // Step 1: Choice screen | COMMENT |
| LOW | web/src/components/traffic/TrafficWizard.tsx | 317 | // Step 2: Install instructions (for non-Helm installs like gcloud commands) | COMMENT |
| LOW | internal/traffic/hubble.go | 103 | // Step 1: Find hubble-relay pods by label across ALL namespaces | COMMENT |
| LOW⚡ | internal/traffic/hubble.go | 139 | // Step 2: Find the hubble-relay service in the same namespace | COMMENT |
| LOW⚡ | internal/traffic/hubble.go | 146 | // Step 3: Check for TLS certs | COMMENT |
| LOW⚡ | internal/traffic/hubble.go | 149 | // Step 4: Determine service port and whether it's TLS | COMMENT |
| LOW | internal/traffic/hubble.go | 161 | // Step 5: Store discovered configuration, unless the request ended: the | COMMENT |
| LOW | internal/k8s/context_manager.go | 561 | // Step 1: Tear down all subsystems. Stop sessions first — past this point the | COMMENT |
| LOW | internal/k8s/context_manager.go | 578 | // Step 2: Switch the K8s client to the new context | COMMENT |
| LOW | internal/k8s/context_manager.go | 602 | // Step 3: Test connectivity before proceeding with initialization. | COMMENT |
| LOW | internal/k8s/context_manager.go | 619 | // Step 4: Initialize all subsystems (same function as initial boot). | COMMENT |
| LOW | internal/k8s/context_manager.go | 634 | // Step 5: Notify all registered callbacks | COMMENT |
| LOW⚡ | internal/k8s/subsystems.go | 308 | // Step 3: dynamic cache. Reset the PolicyReport index first because | COMMENT |
| LOW⚡ | internal/k8s/subsystems.go | 315 | // Step 2: resource discovery + resource cache | COMMENT |
| LOW⚡ | internal/k8s/subsystems.go | 319 | // Step 1: timeline | COMMENT |
| LOW | pkg/topology/builder.go | 6023 | // Step 1: Find services referenced by ingresses | COMMENT |
| LOW | pkg/topology/builder.go | 6320 | // Step 2: Find all services and check which have pods | COMMENT |
| LOW | pkg/topology/builder.go | 6351 | // Step 3: Build Ingress nodes and edges | COMMENT |
| LOW | pkg/topology/builder.go | 7280 | // Step 4: Add Internet node if we have ingresses, gateways, Istio gateways, or KNative services with URLs | COMMENT |
| LOW | pkg/topology/builder.go | 7340 | // Step 5: Add Service nodes (only included ones) | COMMENT |
| LOW | pkg/topology/builder.go | 7360 | // Step 6: Aggregate pods by owner and create PodGroup nodes | COMMENT |
| LOW | pkg/auth/permissions.go | 217 | // Step 1: Check cluster-wide "list pods" — if allowed, user is effectively cluster-admin | COMMENT |
| LOW | pkg/auth/permissions.go | 228 | // Step 2: Parallel check each namespace for "list pods" OR "list deployments". | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | docs/STRUCTURE.md | 147 | ├── scripts/ # Release scripts + demo-cluster + visual-test orchestration | CODE |
| MEDIUM | scripts/gitops-demo.sh | 229 | # setup_rollback_history orchestrates the rollback fixture so it has at | COMMENT |
| MEDIUM | scripts/gitops-demo.sh | 245 | # If we've already done this orchestration on a prior `up` run the path | COMMENT |
| MEDIUM | scripts/rollouts-demo.sh | 128 | # --- Scenario orchestration ------------------------------------------------ | COMMENT |
| MEDIUM | scripts/gitops-demo/11-flux-zombie.yaml | 2 | # Flux config; what makes it a zombie is the post-apply orchestration: | COMMENT |
| MEDIUM | scripts/gitops-demo/10-argo-rollback.yaml | 8 | # After orchestration the app should land at: | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | web/e2e/settings-connections.spec.ts | 711 | await expect(secret).toHaveAttribute('placeholder', 'Saved value') | CODE |
| LOW | web/e2e/settings-connections.spec.ts | 718 | await expect(secret).toHaveAttribute('placeholder', 'Will be removed') | CODE |
| LOW | web/e2e/settings-connections.spec.ts | 918 | if (integration.kind === 'metrics') await expect(page.getByRole('textbox', { name: 'Authorization value', exact: tru | CODE |
| LOW | web/e2e/settings-connections.spec.ts | 919 | else await expect(page.getByRole('textbox', { name: integration.kind === 'argocd' ? 'API token' : 'API key', exact: | CODE |
| LOW | web/e2e/settings-connections.spec.ts | 1200 | await expect(page.getByRole('textbox', { name: 'Authorization value' })).toHaveAttribute('placeholder', 'Saved value') | CODE |
| LOW | web/src/components/ConnectionErrorView.test.tsx | 158 | const markup = renderToStaticMarkup(<CopyableCommand command="placeholder" />) | CODE |
| LOW | internal/k8s/context_registry_test.go | 49 | ai.Token = "fake-token-for-" + e.userName | CODE |
| LOW | internal/k8s/context_registry_test.go | 1277 | cfg.AuthInfos[e.userName] = &clientcmdapi.AuthInfo{Token: "fake-token-for-" + e.userName} | CODE |
| LOW | internal/server/argo_diff_test.go | 83 | _, _ = w.Write([]byte(`{"author":"Jane Doe","date":"2026-07-09T12:00:00Z","message":"fix: bump memory","signatureInfo | CODE |
| LOW | internal/server/argo_diff_test.go | 557 | if meta.Author != "Jane Doe" || meta.Message != "fix: bump memory" { | CODE |
| LOW | internal/ai/signin_test.go | 29 | "email": "user@example.com", | CODE |
| LOW | internal/ai/signin_test.go | 31 | "orgName": "user@example.com's Organization", | CODE |
| LOW | scripts/test-oidc-split.sh | 259 | ("login", "admin@example.com"), | CODE |
| LOW | scripts/test-oidc-split.sh | 486 | check "logged-in username" "admin@example.com" "$username" | CODE |
| LOW | pkg/prom/header_patch_test.go | 27 | {{Key: "Authorization", Action: "keep", Value: "placeholder"}}, | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | internal/trace/entries.go | 180 | // (`problem:0/N selected pods ready`, emitted when it doesn't) so it's robust to | COMMENT |
| MEDIUM | internal/issues/source_cnpg.go | 308 | // the version-robust "was up" signal (set on first election, never cleared), | COMMENT |
| MEDIUM | packages/k8s-ui/src/utils/resource-hierarchy.ts | 1381 | // matching the key is robust to any id-shape drift. | COMMENT |
| MEDIUM | …k8s-ui/src/components/resources/resource-utils-flux.ts | 49 | // Check health condition for more nuanced status | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | deploy/helm/radar/values.yaml | 592 | # Create the default read grant for radar:system: Radar Cloud's alerts worker | COMMENT |
| MEDIUM | deploy/helm/radar/values.yaml | 599 | # Create the default read grant for radar:ai:reader, used only by automatic | COMMENT |
| MEDIUM | scripts/test-rbac.sh | 141 | # Create a couple of instances so list returns non-empty | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | scripts/beyla-demo.sh | 547 | except Exception: | CODE |
| LOW | scripts/beyla-demo.sh | 558 | except Exception: | CODE |
| LOW | scripts/beyla-demo.sh | 572 | except Exception: | CODE |
| LOW | scripts/beyla-demo.sh | 658 | except Exception: | CODE |
| LOW | scripts/beyla-demo.sh | 670 | except Exception: | CODE |
| LOW | scripts/beyla-demo.sh | 685 | except Exception: | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | scripts/test-oidc-split.sh | 56 | # Usage: | COMMENT |
| LOW | scripts/test-chart.sh | 9 | # Usage: | COMMENT |
| LOW | scripts/test-proxy-auth.sh | 12 | # Usage: | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | scripts/tls-issues-live/check.py | 18 | CODE | |
| LOW | scripts/tls-issues-live/check.py | 24 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | scripts/tls-issues-live/check.py | 169 | CODE |