Skip to content

ci: pass the organization Go workflow across the repository - #5853

Merged
devantler merged 20 commits into
mainfrom
claude/go-workflow-adoption
Nov 4, 2026
Merged

devantler merged 20 commits into
mainfrom
claude/go-workflow-adoption

Conversation

@devantler

@devantler devantler commented Nov 3, 2026 •

Copy link
Copy Markdown
Contributor

Why

Since GitHub started counting this repository as a Go project, the organization requires its Go workflow on every pull request, and that workflow fails here. No pull request can merge until it passes. The maintainer chose to adopt the workflow rather than opt out of it.

What

Makes the whole repository pass the organization Go workflow: the repository-wide lint backlog, the Go lint and dead-code findings, vulnerable Go modules, and the tests that only failed on the organization's runner. Findings are fixed at their cause; the few genuine false positives get narrowly scoped, explained exceptions. The review note on this pull request lists every fix and every exception.

Part of #5852. The issue stays open for its second condition: the workflow must keep running here even if GitHub detects the repository as Shell again.

Known risk, tracked separately: the coverage job can still run the GHCR-auth refresh tests out of time on a busy runner (#5862). The organization workflow skips its tests in the merge queue, so the cost is re-running that job on a pull request.

👉 After merge: open pull requests here need to update from main to pick up the fixes before their required checks can pass.

🤖 Generated with Claude Code

…workflow

Betterleaks, Secretlint, HTMLHint and djLint failed the organization's
required Go workflow on test fixtures, not on secret material:

- build the Slack-webhook fixture in two pieces, as the test already does
  for its other secret-shaped fixtures
- mark the base64 fixture credentials inline with betterleaks:allow
- move the S3 stub's refusal-only credential into a variable whose line
  carries a Secretlint disable for its basic-auth rule
- add a repository Betterleaks config with three allowlists, each bound
  to one rule and one non-secret shape: numeric docker uid:gid, the
  mail tests' `fixture:` account, and go.sum `h1:` lines
- exclude the byte-exact Hubble UI fixture, whose test requires it
  unaltered, from the two HTML linters only

Part of #5852

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
devantler and others added 4 commits November 3, 2026 22:10
The organization Go workflow runs `go test ./...` and
`go test -race -coverprofile=... ./...` with Go's defaults, unlike
platform CI's `-parallel 8 -timeout 20m`.

refresh-flux-ghcr-auth spends much of each case waiting on the helper's
shell and fake-command processes, so the default one slot per CPU took
592s on a four-CPU runner and its last cases ran past the command
deadlines derived from Go's ten-minute package budget. TestMain now
raises only that default to the eight slots CI already uses; an explicit
-parallel is kept as given.

TestObservationCommandRefusesForeignDispatchBeforeAccess replaced the
child's environment, dropping the GOCOVERDIR a coverage run exports, so
the instrumented child's exit warning broke the exact-output check. It is
now forwarded, which also records the child's coverage.

Part of #5852

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The organization Go workflow lints the whole root module with
golangci-lint's default configuration, runs `deadcode -test ./...`, and
runs revive over every Go file through MegaLinter.

golangci-lint (61 findings, 27 shown under its default per-text cap):
- errcheck: handle or explicitly discard Close and write errors. A failed
  verdict write in analyze-cri-logs and observe-crossplane-recovery now
  refuses instead of reporting success; validate-homepage-bookmarks
  documents that its buffered writer's Flush decides; tests check
  json.Unmarshal.
- staticcheck: lowercase two error strings, name the shared sentinel
  errRefused, and apply the De Morgan and tagged-switch rewrites that
  `--fix` would otherwise leave as uncommitted changes.
- unused/deadcode: remove the unreachable containsLine and number.

revive: rename unused parameters to _, stop shadowing builtins, put
context.Context first, document the exported API of the internal
packages, and give each package that had none a package comment.

Part of #5852

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ments

MegaLinter passes revive a list of files, so revive asks for a package
comment in every file of a package that already has one: 166 findings.
Keep every default rule and turn off only package-comments, as the
maintainer decided on #5852. Every package
already carries its own package comment.

Part of #5852

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
GitHub's detected language decides whether the organization's required
Go workflow applies, and Go and Shell are within a few kilobytes of each
other here. Record that the repository keeps passing it either way.

Part of #5852

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@github-actions

github-actions Bot commented Nov 3, 2026 •

Copy link
Copy Markdown
Contributor

✅⚠️MegaLinter analysis: Success with warnings

⚠️ BASH / bash-exec - 18 errors
ublish-workflow-approved-revisions.sh
✅ [SUCCESS] scripts/tests/test-publish-workflow-canonical-approvals.sh
✅ [SUCCESS] scripts/tests/test-publish-workflow-signing-revision-resolvers.sh
✅ [SUCCESS] scripts/tests/test-publish-workflow-signing-revisions.sh
✅ [SUCCESS] scripts/tests/test-pvc-prune-safety.sh
✅ [SUCCESS] scripts/tests/test-read-actual-budget-userns-maps.sh
✅ [SUCCESS] scripts/tests/test-read-cilium-api-limiter.sh
✅ [SUCCESS] scripts/tests/test-reassert-flux-root-verify.sh
✅ [SUCCESS] scripts/tests/test-redeploy-main-when-behind.sh
✅ [SUCCESS] scripts/tests/test-refresh-flux-ghcr-auth-safety.sh
✅ [SUCCESS] scripts/tests/test-regenerate-publish-workflow-approved-revisions.sh
✅ [SUCCESS] scripts/tests/test-registry-auth-lib.sh
✅ [SUCCESS] scripts/tests/test-release-recovery.sh
✅ [SUCCESS] scripts/tests/test-release-writer-refusal.sh
✅ [SUCCESS] scripts/tests/test-reloader-placement-selection.sh
✅ [SUCCESS] scripts/tests/test-reloader-rendered-placement.sh
✅ [SUCCESS] scripts/tests/test-report-kubescape-scan-orphans.sh
✅ [SUCCESS] scripts/tests/test-report-prod-convergence.sh
✅ [SUCCESS] scripts/tests/test-required-merge-workflows.sh
✅ [SUCCESS] scripts/tests/test-restart-uncapped-talos-coredns.sh
✅ [SUCCESS] scripts/tests/test-restore-stranded-prod-workflow.sh
✅ [SUCCESS] scripts/tests/test-restrict-homepage-service-groups.sh
✅ [SUCCESS] scripts/tests/test-restrict-tenant-network-policies.sh
✅ [SUCCESS] scripts/tests/test-restrict-tenant-secret-stores.sh
✅ [SUCCESS] scripts/tests/test-retire-arc-pool.sh
✅ [SUCCESS] scripts/tests/test-rgd-template-static-scan-wiring.sh
✅ [SUCCESS] scripts/tests/test-rgd-template-static-scan.sh
✅ [SUCCESS] scripts/tests/test-run-parallel-guard-cases.sh
✅ [SUCCESS] scripts/tests/test-run-publication-generator-tests.sh
✅ [SUCCESS] scripts/tests/test-setup-ksail.sh
✅ [SUCCESS] scripts/tests/test-setup-supply-chain-tools.sh
✅ [SUCCESS] scripts/tests/test-setup-talosctl.sh
✅ [SUCCESS] scripts/tests/test-shared-publish-workflow-pin-guard.sh
✅ [SUCCESS] scripts/tests/test-signing-report-publisher-families.sh
✅ [SUCCESS] scripts/tests/test-stranded-autoscaler-node-alerter.sh
✅ [SUCCESS] scripts/tests/test-stranded-volume-attach-alert.sh
✅ [SUCCESS] scripts/tests/test-summarize-sarif-findings.sh
✅ [SUCCESS] scripts/tests/test-talos-apparmor-lsm-regressions.sh
✅ [SUCCESS] scripts/tests/test-talos-apparmor-lsm.sh
✅ [SUCCESS] scripts/tests/test-talos-drain-budget.sh
✅ [SUCCESS] scripts/tests/test-talos-factory-schematic-registration.sh
✅ [SUCCESS] scripts/tests/test-talos-render-kernel-args.sh
✅ [SUCCESS] scripts/tests/test-talos-schematic-readback.sh
✅ [SUCCESS] scripts/tests/test-talos-version-pins.sh
✅ [SUCCESS] scripts/tests/test-tenant-controller-namespace-coverage.sh
✅ [SUCCESS] scripts/tests/test-tenant-edit-networkpolicy-write.sh
✅ [SUCCESS] scripts/tests/test-tenant-kro-pull-secret.sh
✅ [SUCCESS] scripts/tests/test-tenant-publication-binding.sh
✅ [SUCCESS] scripts/tests/test-tenant-route-hostname-boundary.sh
✅ [SUCCESS] scripts/tests/test-tenant-source-constructors.sh
✅ [SUCCESS] scripts/tests/test-tenant-source-discovery.sh
✅ [SUCCESS] scripts/tests/test-tenant-webapp-boundary.sh
✅ [SUCCESS] scripts/tests/test-tetragon-agent-priority.sh
✅ [SUCCESS] scripts/tests/test-tofu-controller-retirement.sh
✅ [SUCCESS] scripts/tests/test-trivyignore-configmap-content-boundary.sh
✅ [SUCCESS] scripts/tests/test-trivyignore-first-party-rbac-boundary.sh
✅ [SUCCESS] scripts/tests/test-trivyignore-private-mail-identity-boundary.sh
✅ [SUCCESS] scripts/tests/test-trivyignore-vault-backup-identity-boundary.sh
✅ [SUCCESS] scripts/tests/test-trivyignore-vault-config-identity-boundary.sh
✅ [SUCCESS] scripts/tests/test-trivyignore-vendored-operator-boundary.sh
✅ [SUCCESS] scripts/tests/test-umami-provisioning-bootstrap.sh
✅ [SUCCESS] scripts/tests/test-umami-rendered-placement.sh
✅ [SUCCESS] scripts/tests/test-umami-sso-dashboard-route.sh
✅ [SUCCESS] scripts/tests/test-umami-tracking-probe.sh
✅ [SUCCESS] scripts/tests/test-use-prod-stable-api-endpoint.sh
✅ [SUCCESS] scripts/tests/test-validate-homepage-bookmarks.sh
✅ [SUCCESS] scripts/tests/test-validate-image-verifier-liveness-workflow.sh
✅ [SUCCESS] scripts/tests/test-validate-image-verifier-liveness.sh
✅ [SUCCESS] scripts/tests/test-validate-kyverno-fixture-evaluation.sh
✅ [SUCCESS] scripts/tests/test-vault-snapshot-group-readable.sh
✅ [SUCCESS] scripts/tests/test-velero-cancellation-release.sh
✅ [SUCCESS] scripts/tests/test-velero-data-mover-resources.sh
✅ [SUCCESS] scripts/tests/test-velero-kopia-renovate-pin.sh
✅ [SUCCESS] scripts/tests/test-velero-maintenance-oom-alert.sh
✅ [SUCCESS] scripts/tests/test-velero-node-agent-priority.sh
✅ [SUCCESS] scripts/tests/test-verify-arc-transport.sh
✅ [SUCCESS] scripts/tests/test-verify-gateway-routes-applied.sh
✅ [SUCCESS] scripts/tests/test-verify-image-unsigned.sh
✅ [SUCCESS] scripts/tests/test-verify-matcher-accepts-digest.sh
✅ [SUCCESS] scripts/tests/test-verify-published-evidence.sh
✅ [SUCCESS] scripts/tests/test-verify-wedding-backup-cutover.sh
✅ [SUCCESS] scripts/tests/test-verify-wedding-backup-denial.sh
✅ [SUCCESS] scripts/tests/test-verify-wedding-shared-backup-coverage.sh
✅ [SUCCESS] scripts/tests/test-vpa-updater-event-rbac.sh
✅ [SUCCESS] scripts/tests/test-wait-for-prod-api-stability.sh
✅ [SUCCESS] scripts/tests/test-webapp-compiled-scan.sh
✅ [SUCCESS] scripts/tests/test-webapp-compiler-wiring.sh
✅ [SUCCESS] scripts/tests/test-webapp-compiler.sh
✅ [SUCCESS] scripts/tests/test-webapp-container-security.sh
✅ [SUCCESS] scripts/tests/test-webapp-inputs-wiring.sh
✅ [SUCCESS] scripts/tests/test-webapp-inputs.sh
✅ [SUCCESS] scripts/tests/test-webapp-runtime-hosted.sh
✅ [SUCCESS] scripts/tests/test-wedding-backup-denial-runtime.sh
✅ [SUCCESS] scripts/tests/test-world-zone-signatures.sh
✅ [SUCCESS] scripts/tests/test-world-zone-trial.sh
✅ [SUCCESS] scripts/tests/test-write-publish-workflow-matchers.sh
✅ [SUCCESS] scripts/update-vendored-operators.sh
✅ [SUCCESS] scripts/use-prod-stable-api-endpoint.sh
✅ [SUCCESS] scripts/validate-alert-coverage.sh
✅ [SUCCESS] scripts/validate-embedded-json.sh
✅ [SUCCESS] scripts/validate-homepage-bookmarks.sh
✅ [SUCCESS] scripts/validate-image-verifier-liveness.sh
✅ [SUCCESS] scripts/validate-kyverno-fixture-evaluation.sh
❌ [ERROR] scripts/validate-webapp-inputs.sh
    Error: File:[scripts/validate-webapp-inputs.sh] is not executable

✅ [SUCCESS] scripts/verify-arc-transport.sh
✅ [SUCCESS] scripts/verify-data-product-rollout.sh
❌ [ERROR] scripts/verify-email-provider/probe-client.sh
    Error: File:[scripts/verify-email-provider/probe-client.sh] is not executable

❌ [ERROR] scripts/verify-email-provider/run.sh
    Error: File:[scripts/verify-email-provider/run.sh] is not executable

✅ [SUCCESS] scripts/verify-gateway-routes-applied.sh
✅ [SUCCESS] scripts/verify-heartbeat-cleanup.sh
✅ [SUCCESS] scripts/verify-image-unsigned.sh
✅ [SUCCESS] scripts/verify-kubelet-config-readback.sh
✅ [SUCCESS] scripts/verify-matcher-accepts-digest.sh
❌ [ERROR] scripts/verify-private-mail-storage-recovery.sh
    Error: File:[scripts/verify-private-mail-storage-recovery.sh] is not executable

✅ [SUCCESS] scripts/verify-prod-recovery-source.sh
✅ [SUCCESS] scripts/verify-published-evidence.sh
❌ [ERROR] scripts/verify-shared-backup-consumers.sh
    Error: File:[scripts/verify-shared-backup-consumers.sh] is not executable

✅ [SUCCESS] scripts/verify-talos-schematic-readback.sh
✅ [SUCCESS] scripts/verify-umami-tracking.sh
✅ [SUCCESS] scripts/verify-wedding-backup-cutover.sh
✅ [SUCCESS] scripts/verify-wedding-backup-denial-pod.sh
✅ [SUCCESS] scripts/verify-wedding-backup-denial.sh
✅ [SUCCESS] scripts/verify-wedding-shared-backup-coverage-pod.sh
✅ [SUCCESS] scripts/verify-wedding-shared-backup-coverage.sh
✅ [SUCCESS] scripts/wait-for-platform-flux-revision.sh
✅ [SUCCESS] scripts/wait-for-prod-api-stability.sh
✅ [SUCCESS] scripts/write-publish-workflow-matchers.sh
✅ [SUCCESS] tests/kyverno-stale-report-prune/assert-probe-result.sh


(Truncated to last 8000 characters out of 26047)
⚠️ SPELL / cspell - 1 error
"recognised",
        "recognises",
        "recognising",
        "recolour",
        "reconverges",
        "redir",
        "redirs",
        "refd",
        "refdlike",
        "referencegrant",
        "referencegrants",
        "refreshfluxghcrauth",
        "regen",
        "regenerable",
        "registrationv",
        "rego",
        "releaserc",
        "relpath",
        "rematerialise",
        "rematerialised",
        "remediations",
        "renderable",
        "replayable",
        "replicaset",
        "replicasets",
        "repoint",
        "repointed",
        "repoints",
        "repositorycustomproperties",
        "repositorypermissions",
        "repositoryrulesets",
        "reqd",
        "rescan",
        "rescanned",
        "rescanned's",
        "rescans",
        "reserialize",
        "resizer",
        "resourcegraphdefinitions",
        "resourceset",
        "resourcesets",
        "restic",
        "restrictor",
        "retabbed",
        "retagged",
        "retagging",
        "retarget",
        "retargeted",
        "retirementproof",
        "rocksdb",
        "rolebinding",
        "rolebindings",
        "rollouts",
        "rpctypes",
        "rtrimstr",
        "rulemanager",
        "runblock",
        "runnergroups",
        "runtimerulealertbindings",
        "rwmixread",
        "saaaa",
        "sanitised",
        "sanitiser",
        "sanitising",
        "sare",
        "sarif",
        "sasl",
        "sbommanager",
        "sbomsyfts",
        "scheckov",
        "schedulability",
        "schedulable",
        "scheduledbackups",
        "schemeless",
        "scopeable",
        "scopeless",
        "sdjournal",
        "seccomp",
        "secretbox",
        "secretstore",
        "secretstores",
        "securityprogress",
        "seedable",
        "selfsubjectaccessreviews",
        "selfsubjectrulesreviews",
        "serialise",
        "serialised",
        "serialises",
        "serverside",
        "serviceaccount",
        "serviceaccounts",
        "setcap",
        "setgid",
        "setpath",
        "setsid",
        "shellcheck",
        "shfmt",
        "shopt",
        "shortsha",
        "siderolabs",
        "sigpipe",
        "sigstore",
        "skmde",
        "slicelabels",
        "slsa",
        "slurpfile",
        "snapshotfs",
        "snapshotgroups",
        "softwarecomposition",
        "sourceref",
        "specnull",
        "spiffe",
        "ssooidc",
        "stakater",
        "stalesuffix",
        "stalwartlabs",
        "standbyok",
        "startswith",
        "statefulset",
        "statefulsets",
        "statemanager",
        "stdlib",
        "storageclass",
        "storageclasses",
        "storageconfig",
        "strategytransition",
        "strenv",
        "strictjson",
        "strvals",
        "stylesheet",
        "subaddress",
        "subjectaccessreviews",
        "subrequest",
        "subresource",
        "subresources",
        "subshell",
        "subtest",
        "summ",
        "summarise",
        "summarised",
        "superstring",
        "supplychain",
        "supportbundles",
        "surfaceless",
        "syft",
        "syfttypes",
        "syscall",
        "sysctls",
        "syste",
        "systeminformation",
        "tablespace",
        "talosconfig",
        "talosctl",
        "tanzu",
        "targetless",
        "tbranchprotections",
        "tclusterrolebinding",
        "tdefaultbranches",
        "tdevantler",
        "tdir",
        "teammemberships",
        "teamrepositories",
        "templatesyncignore",
        "tenvironmentdeploymentpolicies",
        "testdata",
        "testonly",
        "testsonly",
        "thirdparty",
        "thresholded",
        "tissuelabels",
        "tiucp",
        "tlsv",
        "tmpfs",
        "toci",
        "toctou",
        "todate",
        "todateiso",
        "tokenless",
        "tokenreviews",
        "tolerations",
        "tolower",
        "tonumber",
        "toolexec",
        "topenidconnectproviders",
        "toplevel",
        "torganizationrulesets",
        "tostring",
        "tracepoints",
        "trafficroutes",
        "trailarg",
        "travelled",
        "trepositorycustomproperties",
        "trepositorypermissions",
        "trepositoryrulesets",
        "trimpath",
        "trivyglob",
        "trivymiss",
        "trivynamed",
        "trivynomatch",
        "trivynopaths",
        "trivynowl",
        "trivyprose",
        "trivyship",
        "trixie",
        "trueish",
        "trunc",
        "trunnergroups",
        "tteammemberships",
        "tteamrepositories",
        "ttrafficroutes",
        "ttrpc",
        "tunnelendpoint",
        "uids",
        "umami",
        "umami's",
        "unablated",
        "unadmitted",
        "unauditable",
        "unbaselined",
        "uncharacterized",
        "unclickable",
        "uncompilable",
        "unconfigured",
        "uncordon",
        "uncordoned",
        "uncordoning",
        "uncordons",
        "undecoded",
        "undeployed",
        "undercounts",
        "undispositioned",
        "unexcepted",
        "unexcluded",
        "unexempted",
        "unfetched",
        "unfiled",
        "ungated",
        "ungenerated",
        "ungranted",
        "unidiff",
        "unifi",
        "uninspectable",
        "uninspected",
        "unjournaled",
        "unjudgeable",
        "unjudged",
        "unlistable",
        "unmarshals",
        "unmatch",
        "unmodelled",
        "unopenable",
        "unparseable",
        "unpatchable",
        "unprioritised",
        "unprovisioned",
        "unpublishing",
        "unrankable",
        "unreaped",
        "unrecognisable",
        "unrecognised",
        "unref",
        "unreflike",
        "unrelatedlike",
        "unrenderable",
        "unreplicated",
        "unrequested",
        "unretained",
        "unretried",
        "unreviewable",
        "unreviewed",
        "unrewritten",
        "unrouted",
        "unrun",
        "unscanned",
        "unshippable",
        "unshortened",
        "unsignalled",
        "unstarted",
        "unstubbed",
        "unsuspended",
        "untraversable",
        "unvalidated",
        "unwaited",
        "unwired",
        "upbound",
        "updatekeys",
        "upjet",
        "uprobe",
        "uprobes",
        "urandom",
        "urlencode",
        "usec",
        "userinfo",
        "userns",
        "ushfn",
        "validatable",
        "validatingadmissionpolicies",
        "validatingadmissionpolicybindings",
        "validatingpolicy",
        "validatingwebhookconfigurations",
        "valuesfrom",
        "vanything",
        "vcluster",
        "vcunav",
        "vdual",
        "velero",
        "verticalpodautoscalers",
        "vfio",
        "virt",
        "volumeattachments",
        "volumeconfig",
        "volumesnapshot",
        "volumestatus",
        "vpas",
        "vpol",
        "vpolengine",
        "vulnerabilitymanifests",
        "vulnerabilitymanifestsummaries",
        "vulnerabilitymanifestsummary",
        "vulns",
        "wailsapp",
        "wals",
        "webadmin",
        "webapps",
        "webui",
        "wffc",
        "wgpolicyk",
        "wildcarding",
        "wlan",
        "wlid",
        "workloadconfigurationscan",
        "workloadconfigurationscans",
        "workloadconfigurationscansummaries",
        "workloadconfigurationscansummary",
        "worktree",
        "worktrees",
        "wraparg",
        "wrapctl",
        "wrapopt",
        "wrongns",
        "xcheckov",
        "xcrun",
        "xcrun's",
        "xform",
        "xlated",
        "xpkg",
        "xprov",
        "yannh",
        "yubikey",
        "yzwvjjmcyfnl",
        "zizmor",
        "zizmorcore",
        "\u017ftatus"
    ]
}


You can also copy-paste megalinter-reports/.cspell.json at the root of your repository

(Truncated to last 8000 characters out of 2528719)
⚠️ COPYPASTE / jscpd - 645 errors
cape-frameworks/main_test.go [1991:119 - 2003:14]
Clone found (go)
 - scripts/validate-kubescape-frameworks/main_test.go [1838:115 - 1850:14] (13 lines, 69 tokens)
   scripts/validate-kubescape-frameworks/main_test.go [2070:126 - 2082:14]
Clone found (go)
 - scripts/validate-kubescape-frameworks/main_test.go [2390:54 - 2402:14] (13 lines, 74 tokens)
   scripts/validate-kubescape-frameworks/main_test.go [2462:105 - 2474:14]
Clone found (go)
 - scripts/validate-kubescape-frameworks/parser_regression_test.go [345:16 - 352:61] (8 lines, 90 tokens)
   scripts/validate-kubescape-frameworks/parser_regression_test.go [370:13 - 377:61]
Clone found (go)
 - scripts/validate-matcher-efficacy/main.go [143:23 - 149:8] (7 lines, 52 tokens)
   scripts/validate-matcher-efficacy/main.go [160:25 - 166:9]
Clone found (go)
 - scripts/validate-matcher-efficacy/main.go [345:44 - 359:3] (15 lines, 78 tokens)
   scripts/validate-matcher-efficacy/main.go [373:59 - 387:3]
Clone found (go)
 - scripts/validate-matcher-efficacy/main_test.go [82:38 - 90:57] (9 lines, 62 tokens)
   scripts/validate-matcher-efficacy/main_test.go [117:45 - 125:57]
Clone found (go)
 - scripts/validate-matcher-efficacy/main_test.go [82:38 - 90:31] (9 lines, 55 tokens)
   scripts/validate-matcher-efficacy/main_test.go [133:41 - 141:31]
Clone found (go)
 - scripts/validate-merge-group-heal/main.go [59:33 - 64:68] (6 lines, 54 tokens)
   scripts/validate-merge-group-heal/main_test.go [85:9 - 92:2]
Clone found (go)
 - scripts/validate-merge-group-heal/main_test.go [184:335 - 191:7] (8 lines, 61 tokens)
   scripts/validate-merge-group-heal/main_test.go [553:3 - 562:7]
Clone found (go)
 - scripts/validate-policy-actions/main_test.go [27:4 - 33:14] (7 lines, 75 tokens)
   scripts/validate-policy-actions/main_test.go [161:2 - 165:49]
Clone found (go)
 - scripts/validate-policy-actions/main_test.go [30:67 - 39:3] (10 lines, 64 tokens)
   scripts/validate-policy-actions/main_test.go [218:64 - 227:3]
Clone found (go)
 - scripts/validate-policy-actions/main_test.go [179:65 - 186:41] (8 lines, 83 tokens)
   scripts/validate-policy-actions/main_test.go [255:191 - 262:41]
Clone found (go)
 - scripts/validate-policy-actions/main_test.go [215:69 - 228:3] (14 lines, 101 tokens)
   scripts/validate-policy-actions/main_test.go [259:72 - 272:2]
Clone found (go)
 - scripts/verify-arc-app-identity/runner_group.go [170:2 - 176:30] (7 lines, 77 tokens)
   scripts/verify-arc-app-identity/verify.go [249:2 - 255:30]
Clone found (bash)
 - scripts/verify-data-product-rollout.sh [273:78 - 278:7] (6 lines, 129 tokens)
   scripts/verify-data-product-rollout.sh [354:72 - 358:79]
Clone found (go)
 - scripts/verify-email-data-recovery/kubernetes.go [17:37 - 29:2] (13 lines, 72 tokens)
   scripts/verify-email-storage-canary/main.go [45:1 - 58:2]
Clone found (go)
 - scripts/verify-email-data-recovery/kubernetes.go [33:2 - 38:13] (6 lines, 53 tokens)
   scripts/verify-email-provider/main.go [71:2 - 76:13]
Clone found (go)
 - scripts/verify-email-data-recovery/kubernetes.go [90:16 - 99:33] (10 lines, 88 tokens)
   scripts/verify-email-storage-canary/main.go [108:16 - 117:33]
Clone found (go)
 - scripts/verify-email-data-recovery/kubernetes.go [263:18 - 282:2] (20 lines, 117 tokens)
   scripts/verify-email-storage-canary/main.go [160:13 - 179:2]
Clone found (go)
 - scripts/verify-email-data-recovery/resources_test.go [93:2 - 101:3] (9 lines, 62 tokens)
   scripts/verify-email-data-recovery/resources_test.go [128:4 - 136:5]
Clone found (go)
 - scripts/verify-email-storage-canary/main.go [350:22 - 357:4] (8 lines, 68 tokens)
   scripts/verify-email-storage-canary/main.go [382:22 - 389:4]
Clone found (go)
 - scripts/verify-email-storage-canary/main.go [458:2 - 467:11] (10 lines, 62 tokens)
   scripts/verify-email-storage-canary/main.go [472:2 - 481:11]
Clone found (go)
 - scripts/verify-email-storage-canary/main.go [458:37 - 467:11] (10 lines, 50 tokens)
   scripts/verify-email-storage-canary/main.go [486:5 - 495:11]
Clone found (go)
 - scripts/verify-email-storage-canary/main.go [468:35 - 477:3] (10 lines, 50 tokens)
   scripts/verify-email-storage-canary/main.go [517:39 - 526:3]
Clone found (bash)
 - scripts/verify-kubelet-config-readback.sh [52:1 - 57:10] (6 lines, 63 tokens)
   scripts/verify-talos-schematic-readback.sh [16:46 - 20:42]
Clone found (bash)
 - scripts/verify-shared-backup-consumers.sh [55:86 - 60:47] (6 lines, 72 tokens)
   scripts/verify-wedding-backup-cutover.sh [74:45 - 80:47]
Clone found (go)
 - scripts/verify-wedding-backup-bootstrap/proof_test.go [95:67 - 100:62] (6 lines, 63 tokens)
   scripts/verify-wedding-backup-bootstrap/proof_test.go [165:70 - 170:62]
Clone found (go)
 - scripts/verify-wedding-backup-bootstrap/runtime.go [39:2 - 59:41] (21 lines, 172 tokens)
   scripts/verify-wedding-dedicated-restore/main.go [163:2 - 183:41]
Clone found (bash)
 - scripts/verify-wedding-backup-denial.sh [114:1 - 128:68] (15 lines, 136 tokens)
   scripts/verify-wedding-shared-backup-coverage.sh [133:1 - 147:68]
Clone found (bash)
 - scripts/verify-wedding-backup-denial.sh [131:8 - 141:6] (11 lines, 136 tokens)
   scripts/verify-wedding-shared-backup-coverage.sh [155:30 - 165:6]
Clone found (bash)
 - scripts/verify-wedding-backup-denial.sh [144:87 - 150:113] (7 lines, 73 tokens)
   scripts/verify-wedding-shared-backup-coverage.sh [166:47 - 172:113]
Clone found (bash)
 - scripts/verify-wedding-backup-denial.sh [164:47 - 169:96] (6 lines, 82 tokens)
   scripts/verify-wedding-shared-backup-coverage.sh [223:37 - 228:96]
Clone found (bash)
 - scripts/verify-wedding-backup-denial.sh [253:5 - 280:12] (28 lines, 110 tokens)
   scripts/verify-wedding-shared-backup-coverage.sh [302:5 - 329:12]
Clone found (bash)
 - scripts/verify-wedding-backup-denial.sh [282:49 - 294:16] (13 lines, 54 tokens)
   scripts/verify-wedding-shared-backup-coverage.sh [331:62 - 343:16]
┌────────────┬────────────────┬─────────────┬──────────────┬──────────────┬──────────────────┬───────────────────┐
│ Format     │ Files analyzed │ Total lines │ Total tokens │ Clones found │ Duplicated lines │ Duplicated tokens │
├────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤
│ bash       │ 408            │ 118904      │ 622372       │ 207          │ 2596 (2.18%)     │ 18276 (2.94%)     │
├────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤
│ diff       │ 14             │ 7274        │ 83186        │ 57           │ 447 (6.15%)      │ 7975 (9.59%)      │
├────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤
│ go         │ 640            │ 153940      │ 1194521      │ 381          │ 3110 (2.02%)     │ 28797 (2.41%)     │
├────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤
│ javascript │ 9              │ 694         │ 12086        │ 0            │ 0 (0.00%)        │ 0 (0.00%)         │
├────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤
│ toml       │ 1              │ 32          │ 86           │ 0            │ 0 (0.00%)        │ 0 (0.00%)         │
├────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤
│ txt        │ 3              │ 2164        │ 15925        │ 0            │ 0 (0.00%)        │ 0 (0.00%)         │
├────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤
│ Total:     │ 1075           │ 283008      │ 1928176      │ 645          │ 6153 (2.17%)     │ 55048 (2.85%)     │
└────────────┴────────────────┴─────────────┴──────────────┴──────────────┴──────────────────┴───────────────────┘
Found 645 clones.
HTML report saved to megalinter-reports/copy-paste/jscpd-report.html
ERROR: jscpd found too many duplicates (2.2%) over threshold (0.0%)
time: 5.41s

(Truncated to last 8000 characters out of 121078)
⚠️ SPELL / lychee - 37 errors
📝 Summary
---------------------
🔍 Total..........665
🔗 Unique.........451
✅ Successful.....535
⏳ Timeouts.........0
🔀 Redirected......13
👻 Excluded........90
❓ Unknown..........0
🚫 Errors..........37
⛔ Unsupported.....37

Errors in .github/workflows/ci.yaml
[404] https://codeload.github.com/$CATALOGUE_REPOSITORY/tar.gz/$CATALOGUE_SHA (at 829:14) | Error (cached)
[404] https://get.helm.sh/$archive (at 1112:77) | Error (cached)
[404] https://get.helm.sh/$archive (at 1566:77) | Error (cached)
[404] https://get.helm.sh/$archive (at 4069:65) | Error (cached)
[404] https://get.helm.sh/$archive.sha256sum (at 4070:75) | Rejected status code: 404 Not Found

Errors in .github/workflows/copy-email-credential-custody.yaml
[ERROR] http://127.0.0.1:38200/ (at 132:27) | Connection refused - server may be down or port blocked
[ERROR] http://127.0.0.1:38200/v1/sys/health (at 112:17) | Error (cached)

Errors in .github/workflows/measure-ci-runtime.yaml
[404] https://get.helm.sh/$archive (at 114:77) | Rejected status code: 404 Not Found

Errors in .github/workflows/prepare-email-storage-key.yaml
[ERROR] http://127.0.0.1:38200/v1/sys/health (at 109:17) | Connection refused - server may be down or port blocked

Errors in .github/workflows/publish-coroot-checkpoint-hotfix.yaml
[404] https://github.com/devantler-tech/platform/.github/workflows/publish-coroot-checkpoint-hotfix.yaml@refs/heads/main (at 212:37) | Rejected status code: 404 Not Found

Errors in .github/workflows/publish-coroot-node-agent-hotfix.yaml
[404] https://github.com/devantler-tech/platform/.github/workflows/publish-coroot-node-agent-hotfix.yaml@refs/heads/main (at 248:37) | Rejected status code: 404 Not Found

Errors in .github/workflows/publish-kubescape-node-agent-hotfix.yaml
[404] https://github.com/devantler-tech/platform/.github/workflows/publish-kubescape-node-agent-hotfix.yaml@refs/heads/main (at 186:37) | Rejected status code: 404 Not Found

Errors in .github/workflows/publish-kubescape-storage-hotfix.yaml
[404] https://github.com/devantler-tech/platform/.github/workflows/publish-kubescape-storage-hotfix.yaml@refs/heads/main (at 270:37) | Rejected status code: 404 Not Found

Errors in .github/workflows/publish-kyverno-background-hotfix.yaml
[404] https://github.com/devantler-tech/platform/.github/workflows/publish-kyverno-background-hotfix.yaml@refs/heads/main (at 205:37) | Rejected status code: 404 Not Found

Errors in .github/workflows/publish-kyverno-migration-runtime.yaml
[404] https://github.com/devantler-tech/platform/.github/workflows/publish-kyverno-migration-runtime.yaml@refs/heads/main (at 187:37) | Rejected status code: 404 Not Found

Errors in .github/workflows/publish-kyverno-reports-hotfix.yaml
[404] https://github.com/devantler-tech/platform/.github/workflows/publish-kyverno-reports-hotfix.yaml@refs/heads/main (at 183:37) | Rejected status code: 404 Not Found

Errors in .github/workflows/publish-private-mail-bootstrap.yaml
[404] https://github.com/devantler-tech/platform/.github/workflows/publish-private-mail-bootstrap.yaml@refs/heads/main (at 127:37) | Rejected status code: 404 Not Found

Errors in .github/workflows/publish-release-recovery.yaml
[404] https://api.github.com/repos/$REPOSITORY/releases/generate-notes (at 192:14) | Rejected status code: 404 Not Found
[404] https://codeload.github.com/$CATALOGUE_REPOSITORY/tar.gz/$CATALOGUE_SHA (at 257:14) | Rejected status code: 404 Not Found
[404] https://codeload.github.com/$CATALOGUE_REPOSITORY/tar.gz/$CATALOGUE_SHA (at 97:14) | Rejected status code: 404 Not Found

Errors in .github/workflows/validate-coroot-security-progress.yaml
[ERROR] http://127.0.0.1:1/ (at 137:67) | Connection refused - server may be down or port blocked
[ERROR] http://127.0.0.1:8080/metrics (at 89:36) | Connection refused - server may be down or port blocked
[ERROR] http://127.0.0.1:8080/metrics (at 90:25) | Error (cached)
[ERROR] http://127.0.0.1:9090/ (at 130:80) | Connection refused - server may be down or port blocked
[ERROR] http://127.0.0.1:9090/ (at 135:66) | Connection refused - server may be down or port blocked
[ERROR] http://127.0.0.1:9090/ (at 136:64) | Connection refused - server may be down or port blocked

Errors in .github/workflows/verify-email-credential-custody.yaml
[ERROR] http://127.0.0.1:38200/ (at 110:27) | Error (cached)
[ERROR] http://127.0.0.1:38200/v1/sys/health (at 103:17) | Error (cached)

Errors in .github/workflows/verify-email-storage-key-recovery.yaml
[ERROR] http://127.0.0.1:38200/v1/sys/health (at 110:17) | Error (cached)

Errors in .github/workflows/verify-openbao-backup-recovery.yaml
[ERROR] http://127.0.0.1:38200/v1/sys/health (at 114:17) | Error (cached)

Errors in docs/costs.md
[404] https://docs.hetzner.com/general/infrastructure-and-availability/price-adjustment/#cloud-servers (at 24:27) | Rejected status code: 404 Not Found

Errors in scripts/check-hubble-ui-streaming/testdata/frontend-v0.13.6-index.html
[ERROR] error: (at 1:78) | Cannot resolve root-relative link '/': To resolve root-relative links in local files, provide a root dir
[ERROR] file://scripts/check-hubble-ui-streaming/testdata/bundle.main.841ee8bbb7cc9d85b79e.css (at 1:536) | File not found. Check if file exists and path is correct
[ERROR] file://scripts/check-hubble-ui-streaming/testdata/favicon-16x16.png (at 1:401) | File not found. Check if file exists and path is correct
[ERROR] file://scripts/check-hubble-ui-streaming/testdata/favicon-32x32.png (at 1:336) | File not found. Check if file exists and path is correct
[ERROR] file://scripts/check-hubble-ui-streaming/testdata/favicon.ico (at 1:450) | File not found. Check if file exists and path is correct

Errors in talos/control-planes/wireguard.yaml
[404] https://docs.siderolabs.com/talos/v1.13/reference/configuration/network/deviceconfig/ (at 49:5) | Rejected status code: 404 Not Found | Followed 1 redirect. Redirects: https://docs.siderolabs.com/talos/v1.13/reference/configuration/network/deviceconfig/ --[308]--> https://docs.siderolabs.com/talos/v1.13/reference/configuration/network/deviceconfig

Hint: Followed 13 redirects. You might want to consider replacing redirecting URLs with the resolved URLs. Use verbose mode (`-v`/`-vv`) to see redirection details.
Hint: You can configure accepted/rejected response codes with `-a` or `--accept`
⚠️ MARKDOWN / markdownlint - 92 errors
[Expected: 400; Actual: 523]
AGENTS.md:456:401 error MD013/line-length Line length [Expected: 400; Actual: 613]
AGENTS.md:457:401 error MD013/line-length Line length [Expected: 400; Actual: 711]
AGENTS.md:461:401 error MD013/line-length Line length [Expected: 400; Actual: 509]
AGENTS.md:465:401 error MD013/line-length Line length [Expected: 400; Actual: 458]
AGENTS.md:466:401 error MD013/line-length Line length [Expected: 400; Actual: 525]
AGENTS.md:470:401 error MD013/line-length Line length [Expected: 400; Actual: 444]
AGENTS.md:507:401 error MD013/line-length Line length [Expected: 400; Actual: 1505]
AGENTS.md:508:401 error MD013/line-length Line length [Expected: 400; Actual: 2266]
AGENTS.md:570:401 error MD013/line-length Line length [Expected: 400; Actual: 1217]
AGENTS.md:572:401 error MD013/line-length Line length [Expected: 400; Actual: 463]
AGENTS.md:574:401 error MD013/line-length Line length [Expected: 400; Actual: 1741]
AGENTS.md:588:401 error MD013/line-length Line length [Expected: 400; Actual: 1396]
AGENTS.md:596:401 error MD013/line-length Line length [Expected: 400; Actual: 542]
AGENTS.md:667:401 error MD013/line-length Line length [Expected: 400; Actual: 790]
AGENTS.md:672:401 error MD013/line-length Line length [Expected: 400; Actual: 515]
CLAUDE.md:1 error MD041/first-line-heading/first-line-h1 First line in a file should be a top-level heading [Context: "@AGENTS.md"]
docs/adr/headless-cms.md:66:401 error MD013/line-length Line length [Expected: 400; Actual: 450]
docs/adr/headless-cms.md:67:401 error MD013/line-length Line length [Expected: 400; Actual: 457]
docs/crossplane-sync-recovery.md:5:401 error MD013/line-length Line length [Expected: 400; Actual: 427]
docs/crossplane-sync-recovery.md:7:401 error MD013/line-length Line length [Expected: 400; Actual: 577]
docs/dr/alerting.md:263:28 error MD060/table-column-style Table column style [Table pipe does not align with header for style "aligned"]
docs/dr/crypto-custody.md:22:389 error MD060/table-column-style Table column style [Table pipe does not align with header for style "aligned"]
docs/dr/crypto-custody.md:23:264 error MD060/table-column-style Table column style [Table pipe does not align with header for style "aligned"]
docs/dr/crypto-custody.md:27:35 error MD060/table-column-style Table column style [Table pipe does not align with header for style "aligned"]
docs/dr/crypto-custody.md:27:161 error MD060/table-column-style Table column style [Table pipe does not align with header for style "aligned"]
docs/dr/crypto-custody.md:27:239 error MD060/table-column-style Table column style [Table pipe does not align with header for style "aligned"]
docs/dr/crypto-custody.md:114 error MD024/no-duplicate-heading Multiple headings with the same content [Context: "Custody recommendations"]
docs/dr/crypto-custody.md:263 error MD024/no-duplicate-heading Multiple headings with the same content [Context: "Custody recommendations"]
docs/dr/crypto-custody.md:269 error MD024/no-duplicate-heading Multiple headings with the same content [Context: "What to do if it leaks"]
docs/dr/crypto-custody.md:276 error MD024/no-duplicate-heading Multiple headings with the same content [Context: "What to do if it is *lost* (no..."]
docs/dr/restore-drill.md:161 error MD028/no-blanks-blockquote Blank line inside blockquote
docs/dr/runbook.md:23:102 error MD060/table-column-style Table column style [Table pipe does not align with header for style "aligned"]
docs/dr/runbook.md:23:487 error MD060/table-column-style Table column style [Table pipe does not align with header for style "aligned"]
docs/dr/runbook.md:34 error MD028/no-blanks-blockquote Blank line inside blockquote
docs/dr/runbook.md:44 error MD028/no-blanks-blockquote Blank line inside blockquote
docs/dr/runbook.md:53 error MD028/no-blanks-blockquote Blank line inside blockquote
docs/dr/runbook.md:263 error MD028/no-blanks-blockquote Blank line inside blockquote
docs/dr/runbook.md:708:92 error MD060/table-column-style Table column style [Table pipe does not align with header for style "aligned"]
docs/dr/spire-server-ha.md:93 error MD040/fenced-code-language Fenced code blocks should have a language specified [Context: "```"]
docs/dr/velero-cnpg.md:11 error MD040/fenced-code-language Fenced code blocks should have a language specified [Context: "```"]
docs/github-management.md:38:401 error MD013/line-length Line length [Expected: 400; Actual: 419]
docs/github-management.md:40:401 error MD013/line-length Line length [Expected: 400; Actual: 522]
docs/node-autoscaling.md:14 error MD040/fenced-code-language Fenced code blocks should have a language specified [Context: "```"]
docs/oidc-kubectl.md:111 error MD040/fenced-code-language Fenced code blocks should have a language specified [Context: "```"]
docs/operations/email-client-identity.md:1 error MD041/first-line-heading/first-line-h1 First line in a file should be a top-level heading [Context: "> 🤖 Generated by the Agentic ..."]
docs/operations/gateway-receiver-boundary.md:1 error MD041/first-line-heading/first-line-h1 First line in a file should be a top-level heading [Context: "> 🤖 Generated by the Agentic ..."]
docs/operations/ingress-client-address.md:1 error MD041/first-line-heading/first-line-h1 First line in a file should be a top-level heading [Context: "> 🤖 Generated by the Agentic ..."]
docs/operations/production-recovery.md:5:401 error MD013/line-length Line length [Expected: 400; Actual: 491]
docs/release-recovery.md:10:401 error MD013/line-length Line length [Expected: 400; Actual: 576]
docs/release-recovery.md:12:401 error MD013/line-length Line length [Expected: 400; Actual: 793]
docs/release-recovery.md:14:401 error MD013/line-length Line length [Expected: 400; Actual: 477]
docs/runtime-security.md:130 error MD040/fenced-code-language Fenced code blocks should have a language specified [Context: "```"]
docs/rwx-storage.md:38 error MD040/fenced-code-language Fenced code blocks should have a language specified [Context: "```"]
docs/unifi-management.md:14 error MD040/fenced-code-language Fenced code blocks should have a language specified [Context: "```"]
docs/unifi-management.md:60 error MD040/fenced-code-language Fenced code blocks should have a language specified [Context: "```"]
k8s/bases/infrastructure/controllers/tetragon/README.md:7:401 error MD013/line-length Line length [Expected: 400; Actual: 505]
k8s/bases/README.md:10:141 error MD060/table-column-style Table column style [Table pipe does not align with header for style "aligned"]
k8s/bases/README.md:11:39 error MD060/table-column-style Table column style [Table pipe does not align with header for style "aligned"]
k8s/bases/README.md:11:138 error MD060/table-column-style Table column style [Table pipe does not align with header for style "aligned"]
k8s/providers/README.md:8:91 error MD060/table-column-style Table column style [Table pipe does not align with header for style "aligned"]
k8s/providers/README.md:8:207 error MD060/table-column-style Table column style [Table pipe does not align with header for style "aligned"]
k8s/providers/README.md:9:234 error MD060/table-column-style Table column style [Table pipe does not align with header for style "aligned"]
scripts/judge-openbao-quorum/README.md:25:401 error MD013/line-length Line length [Expected: 400; Actual: 437]
scripts/README.md:15:159 error MD060/table-column-style Table column style [Table pipe does not align with header for style "aligned"]
scripts/README.md:16:185 error MD060/table-column-style Table column style [Table pipe does not align with header for style "aligned"]
scripts/README.md:18:98 error MD060/table-column-style Table column style [Table pipe does not align with header for style "aligned"]
scripts/README.md:18:171 error MD060/table-column-style Table column style [Table pipe does not align with header for style "aligned"]
scripts/README.md:20:255 error MD060/table-column-style Table column style [Table pipe does not align with header for style "aligned"]

(Truncated to last 8000 characters out of 10096)

✅ Linters with no issues

actionlint, betterleaks, checkov, git_diff, grype, hadolint, jsonlint, osv-scanner, prettier, prettier, revive, secretlint, shellcheck, shfmt, syft, trivy, trivy-sbom, trufflehog, v8r, v8r, yamllint, zizmor

Notices

⚠️ Your configuration references items that have been removed from MegaLinter and are ignored: REPOSITORY_GITLEAKS. See Removed linters to find their replacements.

See detailed reports in MegaLinter artifacts

MegaLinter is provided by OX Security
Show us your support by starring ⭐ the repository

@github-code-quality

github-code-quality Bot commented Nov 3, 2026 •

Copy link
Copy Markdown

Code coverage overview

Languages: Go

Go / code-coverage/go

main claude/go-workflow-a... d328b72 +/-
— 74% —

Line coverage data for the main branch is not yet available.

View coverage of the 10 most covered files.
File main claude/go-workflow-a... d328b72 +/-
scripts/kubesca...-bridge/main.go — 91% —
scripts/validat...eworks/shell.go — 89% —
scripts/validat...signing/main.go — 85% —
scripts/validat...-policy/main.go — 84% —
scripts/validat...meworks/main.go — 83% —
scripts/diagnos...artup/access.go — 83% —
scripts/replace...y/quarantine.go — 83% —
scripts/replace...standby/main.go — 79% —
scripts/maintai...clients/main.go — 66% —
scripts/annotat...checkov/main.go — 53% —

ℹ️ Calculations represent line coverage. Results may change as calculations are updated.


Updated November 04, 2026 06:49 UTC

devantler and others added 6 commits November 3, 2026 23:05
Betterleaks 1.7 attaches global [[allowlists]] with targetRules only in
the top-level config. MegaLinter's generated config extends this file,
so the targeted allowlists were dropped and their six findings stayed.
Rule-level allowlists merge into the default rules on extend.

Part of #5852

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
MegaLinter's grype, osv-scanner and trivy scans flag Go module
versions with published advisories across the repository's Go
modules. Bump each to its fixed release in every module that pins it:

- golang.org/x/net to v0.62.0 (GO-2026-6603/6610/6611/6612/6617/
  6860/6866), which raises golang.org/x/text to v0.43.0
  (GO-2026-6629) through minimal version selection.
- golang.org/x/crypto to v0.58.1-0.20261009181718-2f1f834330b2, the
  fixed version GO-2026-5932 names (the commit that removes the
  unmaintained openpgp package; no tagged release carries it yet).
  Nothing here imports openpgp, so every module still builds.
- github.com/google/cel-go to v0.30.0 (GO-2026-6094 /
  GHSA-gcjh-h69q-9w9g) in the three native admission proofs.

The audited controller renderer keeps Helm v4.2.4 and Go 1.26.8, so
the build guard's SDK pin and build metadata are unchanged.

Part of #5852

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…dules

osv-scanner reports two sets that are not defects to bump away:

- The govulncheck negative-control fixture pins Go 1.24.0 on purpose,
  so its standard-library advisories are the point of the fixture.
  Its own osv-scanner.toml ignores only the stdlib package there; a
  dependency advisory added to that module is still reported.
- Kyverno v1.19.2 in the offline admission driver carries the three
  Go records the module's .govulncheck-allow.txt already adjudicates
  as database-range errors (platform#5154). The module's
  osv-scanner.toml ignores exactly those IDs with the upstream ranges,
  and TestAdvisoryAcceptancePinsReviewedRelease now requires the two
  lists to name the same advisories and keeps fencing the release.

osv-scanner reads each file only for the go.mod beside it, so no other
module's findings are affected.

Part of #5852

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…kerfiles

- Run the govulncheck findings pipelines in the two Kyverno builders
  under bash with pipefail (hadolint DL4006), so any failed stage fails
  the build rather than only the last one.
- Pin liblz4-dev to bookworm's only build, 1.9.4-1 (DL3008).
- Restate each upstream runtime image's own non-root identity with an
  explicit USER (65532 for the ko-built Kyverno controllers, 65534:65534
  for the Coroot server and cluster agent), read from the pinned
  digests' configs, so runtime behaviour is unchanged (Checkov
  CKV_DOCKER_3, Trivy DS-0002).
- Declare HEALTHCHECK NONE, as the private-mail image already does:
  Kubernetes never runs an image health check (Trivy DS-0026).

Scoped dispositions, each next to what it covers:
- MigrationRuntime: `hadolint ignore=DL3059` on its second exec-form
  check, because the ko-built runtime image has no shell to share one
  RUN.
- CorootNodeAgent: `checkov:skip=CKV_DOCKER_3`; the eBPF node agent
  keeps the upstream image's root identity by design (the matching
  Trivy DS-0002 entry is in .trivyignore.yaml).
- private-mail-config: `checkov:skip=CKV_DOCKER_4` on the one ADD that
  fetches a checksum-pinned URL, which COPY cannot do.

Part of #5852

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Fixes:
- recover-vault-snapshot becomes a JSON patch with its target in the
  Hetzner kustomization, following keep-vault-snapshot-on-baseline-
  workers: a partial Job is scanned as a workload with no containers
  (Checkov CKV_K8S_23/29/31/38/40, Trivy KSV-0118). The rendered Hetzner
  infrastructure layer is byte-identical.
- The coroot-dns-probe admission fixture states a restricted pod
  baseline (15 Trivy findings); the ndots mutation it exercises reads
  only labels, namespace and dnsConfig, and still applies.

Path- or resource-scoped dispositions, each with its reason:
- KSV-0040 (579, LOW): skipped like KSV-0039. Trivy evaluates the
  namespace ResourceQuota check per file, so every non-ResourceQuota
  file fails; the repository's one ResourceQuota passes.
- private-mail: uid/gid 2000 is the stalwart identity baked into the
  pinned Stalwart digest (KSV-0020/0021, CKV_K8S_40), NET_BIND_SERVICE
  is needed for the binary's file capability (KSV-0022, CKV_K8S_25),
  recovery mode takes its admin from an env var (CKV_K8S_35), and the
  two overlay fragments get their image digest and pod securityContext
  from the kustomization (KSV-0013/0118, CKV_K8S_14/15/29/43).
  Resource-scoped checkov.io/skipN annotations are numbered across the
  base and both patches so the merged StatefulSet keeps every reason;
  only that object's metadata changes in the rendered output.
- KSV-0036 on the three pods that disable automounting and project a
  token only into the container that authenticates.
- KSV-0037 on kube-system's own LimitRange, now under bootstrap.
- KSV-0048/0049/0053 on five namespaced single-rule Roles (Longhorn
  Kyverno retrofits, the orphan-alert state record, the owner-only
  World at Ruin trial).
- KSV-01010/0109 on the Homepage layout and the generated
  security-progress ConfigMap.
- DS-0002 on the root eBPF Coroot node agent.

Guards: a new test-trivyignore-private-mail-identity-boundary.sh
asserts the identity per container, the measured digest and the
bootstrap USER, and keeps an identical probe reported (wired into CI).
The RBAC test asserts the five new roles' shape and the trial role's
sole owner binding; the ConfigMap test pins both new files' matched key
sets and clears absolute file paths from its opaque-value premise; the
reciprocal path lists in the vendored, vault-config and vault-backup
tests name the new reviewed pairs.

Part of #5852

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…Go workflow

The org validate-go-project workflow runs MegaLinter v10.1.0 over the whole
repository. This clears its yamllint, v8r, zizmor, checkov (CKV_GHA_*) and
shellcheck findings without changing what any workflow, patch or fixture does.

- yamllint (293 in CI, 304 locally before prettier's in-place fixes): add the
  `---` document marker to 223 files and quote the workflow trigger key as
  `"on":` in 63 workflows. Every changed YAML file except two parses to
  identical data. Re-indent three comments that sat outside their content,
  space the flow sequences in one fixture, drop a trailing blank line, and
  wrap four lines over 500 characters: the deploy-prod readiness error is
  now one echo with several arguments (same single-line output), and the CEL
  in scripts/tests/crossplane-egress-policy-rules.yaml is re-wrapped between
  tokens (identical parsed AST). The one test that read the trigger block as
  text (`/^on:/` in test-probe-cilium-externalauth-crossnode.sh) now accepts
  the quoted key and fails on an empty block, where its no-other-trigger
  check would otherwise have passed on nothing.
- talos/factory-schematic.yaml keeps no marker: its sha256 is the Image
  Factory schematic ID registered before deploy and read back from nodes. A
  repository .yamllint.yml (MegaLinter's template plus one path-scoped
  document-start ignore) records that, and .prettierignore stops MegaLinter's
  APPLY_FIXES from re-indenting it into a different ID.
- v8r: rename the CNPG fixture off `cluster.yaml`, which SchemaStore maps to
  the RKE cluster schema; the test still copies it in as cluster.yaml.
- zizmor: MegaLinter's zizmor 1.25.0 flags `owner` on five app-token steps
  that already set `repositories`, because it looks for a singular
  `repository` input (zizmorcore/zizmor#2011, fixed in 1.25.1). Each `owner`
  line carries an inline github-app ignore with that reason; no token scope,
  permission or input changes.
- checkov CKV_GHA_7: three dispatch-only workflows build nothing; their inputs
  are a typed interlock, an approval binding and a dry-run default. Each gets
  a file-scoped checkov skip with that reason, as dr-rebuild.yaml already has.
- shellcheck SC2153 in bootstrap-tenant-source.sh was a symptom: shfmt 3.13.1
  treats a U+0080 character as end of input and truncated
  generate-publish-workflow-approved-revisions.sh (630 -> 2 lines) before
  shellcheck read its sourcer. Its comments held double-encoded mojibake; they
  are restored to the intended em dashes, arrows and rocket emoji.

Part of #5852

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@devantler

devantler commented Nov 3, 2026 •

Copy link
Copy Markdown
Contributor Author

Review note: what was fixed, and every exception

Everything below was fixed at the cause unless it is listed as an exception.

Fixed

  • Go: 61 golangci-lint findings (the log showed 27, because repeats are hidden). Removed 2 unreachable functions. Fixed 178 revive findings, including package docs for the 23 packages that had none.
  • Tests that failed only on the organization runner:
    • refresh-flux-ghcr-auth hit the default 10-minute test deadline. Its default parallelism is now 8, the value platform CI already uses.
    • verify-email-data-recovery dropped GOCOVERDIR when it built the child process's environment; it now passes it through.
  • Dependencies: vulnerable Go modules bumped in every tracked module. x/crypto is pinned to the untagged commit that fixes GO-2026-5932, because no tagged release carries the fix yet.
  • YAML and workflows: --- added to 223 files and "on": quoted in 63 workflows. Four over-long lines re-wrapped, and both re-wrapped files were checked to mean the same thing. One v8r schema mismatch fixed by renaming a fixture. A ShellCheck finding was traced to shfmt cutting a script at a stray U+0080 character in its comments.
  • Images and manifests: Hadolint, Checkov and Trivy findings fixed in the hotfix Dockerfiles and manifests. Rendered output changes only in the private-mail StatefulSet's annotations.
  • Secret scanners: a Slack-webhook-shaped fixture is now built in two pieces, as the test already does for its other secret-shaped fixtures.
  • Transitive Go modules that grype reads from go.sum: render-helm-chart now requires fixed grpc, klauspost/compress, go-jose, distribution, edwards25519 and OpenTelemetry releases, and three test modules require klauspost/compress v1.19.1. go mod tidy leaves nothing to change, and helm still builds.
  • Formatting: MegaLinter's shfmt, prettier and markdownlint fixes, applied here because the workflow token cannot commit workflow files. Test literals were checked against the old and new script text, and none of the 95 tests that reference a reformatted script asserts changed text. The Coroot security-progress ConfigMap is regenerated, because it packages a reformatted script.
  • Flaky test: two refresh-flux-ghcr-auth mutation tests ran a file they had just written and failed with ETXTBSY under parallel forks. They now let Bash read the file, as the shared helper already does.

Exceptions (each scoped to one file, rule or shape, with the reason beside it)

  • revive package-comments is off; every other default rule stays on. MegaLinter feeds revive one file at a time, so it asked for a package comment in every file. Maintainer decision on Every pull request is blocked by the organization Go workflow since GitHub reclassified this repository as Go #5852.
  • Trivy KSV-0040 is skipped repo-wide, the same way KSV-0039 already is. Trivy checks a namespace's ResourceQuota one file at a time, so every non-quota file fails it (579 findings). The repository's only ResourceQuota passes. The cost: a ResourceQuota added later without its four hard fields will not be flagged. This is the one blanket exception; please confirm it.
  • Trivy, path-scoped:
    • KSV-0020/0021 on private mail. UID/GID 2000 is the identity the Stalwart image runs as, and a new guard test pins it.
    • KSV-0022, KSV-0013/0118, KSV-0036 on three pods, KSV-0037 on the kube-system LimitRange, and KSV-0048/0049/0053 on five single-rule Roles.
    • KSV-01010/0109 on two ConfigMaps, and DS-0002 on the Coroot node agent, which needs root for eBPF.
  • Checkov:
    • Resource-scoped skips on the private-mail StatefulSet.
    • CKV_DOCKER_3 on the Coroot node agent, and CKV_DOCKER_4 on a checksum-pinned ADD.
    • CKV_GHA_7 on three workflows that build nothing.
  • Hadolint: DL3059 on one image that has no shell to combine the two steps.
  • zizmor github-app: five inline ignores. zizmor 1.25.0, the version MegaLinter runs, wrongly flags steps that already scope with repositories (zizmor#2011, fixed in 1.25.1).
  • OSV-Scanner: two per-module ignore files.
    • One covers the negative-control fixture, whose old Go version is deliberate.
    • One covers the three Kyverno advisories .govulncheck-allow.txt already accepts; a test keeps the two lists equal.
  • yamllint and prettier: talos/factory-schematic.yaml keeps its exact bytes, because its sha256 is the schematic ID the nodes are checked against.
  • Betterleaks:
    • Inline betterleaks:allow on base64 test credentials.
    • Rule-level allowlists for exactly three shapes: a numeric docker --user uid:gid, the mail tests' fixture: account, and go.sum h1: lines.
  • Secretlint: one line, the refusal-only credential for a local S3 stub.
  • HTMLHint and djLint skip one file: the byte-exact Hubble UI fixture, which its test requires unaltered.
  • Formatters skip files whose bytes are the point:
    • markdownlint skips approved-surface-history.md, which a test freezes by sha256.
    • prettier skips three JSON sets:
      • the jq-written RBAC baselines, which their test compares with diff -u;
      • the upstream flagd schemas, whose sha256 the README records;
      • the captured Stalwart store output in diagnose-email-startup/testdata.
  • Betterleaks go.sum allowlist: now allows leading whitespace, because the scanner reports a finding's line starting from the preceding newline.

Known leftovers outside this PR

  • scripts/megalinter-scan-counts.sh still records MegaLinter 10.0.0's scanner versions, while CI now runs 10.1.0. Main's scanner-version drift check will report it. Bumping the Checkov pin means re-vendoring the operator bundles, so it stays a separate change.

🤖 Generated with Claude Code

devantler and others added 7 commits November 4, 2026 01:34
….sum

Grype reads go.sum as well as go.mod, so modules a build never selects
still count. render-helm-chart now requires the fixed grpc, klauspost/compress,
go-jose, distribution, edwards25519 and OpenTelemetry releases; three test
modules require klauspost/compress v1.19.1. go mod tidy keeps the requirements
and is idempotent, and helm still builds.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Betterleaks reports a finding's line from the preceding newline, so the
anchored go.sum allowlist never matched the two quoted lines in the Kyverno
background patch.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A parallel fork can hold a freshly written mutant open for writing, so
executing it directly failed with "text file busy" on Linux. Both mutation
tests now let Bash read the file, as the shared test helper already does.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The organization Go workflow lints the whole repository with APPLY_FIXES,
so a formatter there rewrites files whose bytes are the point: the frozen
EKS approval history (sha256-pinned by its test), the jq-written RBAC
baselines (compared with diff -u), the upstream flagd schemas (sha256
recorded in the README) and the captured Stalwart store output.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The organization Go workflow's MegaLinter run formats every file, then
commits the result with the workflow token. That token cannot change
workflow files, so the commit was refused. These are the same fixes:
shfmt -i 2 -ci on shell scripts, prettier on JSON and YAML outside k8s/,
and markdownlint. The Coroot security-progress ConfigMap is regenerated
because it packages the reformatted healthcheck.sh.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A wrapped line that began with an issue reference such as `#5247` read
to markdownlint as a heading missing its space. Its fixes made it a real
heading, then stripped the sentence's trailing punctuation. The original
wording is back, wrapped so no line starts with the reference.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@devantler

Copy link
Copy Markdown
Contributor Author

@coderabbitai review

The review note above lists every fix and each scoped exception, with its reason.

🤖 Generated with Claude Code

@coderabbitai

coderabbitai Bot commented Nov 4, 2026 •

Copy link
Copy Markdown
Contributor
Action not completed

Review skipped: 544 files exceed the limit of 100.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

- tenant-webapp-admission: accept only reviewed osv-scanner.toml line shapes,
  so a PackageOverrides table, a single-quoted id or a trailing comment fails
  the test instead of widening the ignore unseen.
- private-mail identity guard: require every container's image, not only the
  main one, and refuse an empty container read.
- first-party RBAC guard: read the operator Role's bindings from the rendered
  production layers rather than one directory.
- private-mail-config: a Go test refuses any Dockerfile ADD without a pinned
  sha256 checksum, because Checkov's CKV_DOCKER_4 skip covers the whole file.
- vault-backup-recovery: the production recovery patch must keep every base
  pod-template annotation, because its JSON Patch add replaces the map.
- go.mod: say beside the x/crypto pseudo-version why it is pinned and when to
  move off it.
- Comments: state the real reason for the diagnose-email-startup prettier
  exclusion, and that the trivy layer of the boundary guards does not run in
  CI yet (#5864).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

@devantler devantler left a comment

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Local review round: clean at d328b724fe7ea3de0a17811733828a916e6917d2

Why this was a local review. No external review provider could review this pull request when I checked:

Provider Evidence Scope Recovery
CodeRabbit "Review skipped: 544 files exceed the limit of 100" on this PR (comment 6622557535, 2026-11-04 04:28 UTC) this PR, because of its size none for this PR
Codex "You have reached your Codex usage limits for code reviews" on devantler-tech/ksail#8184 (01:57 UTC) the whole account the maintainer adds credits, or the limit resets
Cursor Bugbot "Bugbot couldn't run - usage limit reached" on devantler-tech/ksail#8179 (00:29 UTC) the whole account an admin raises the Cursor limit

Method. The diff against main touches 553 files.

  • 398 files were proven formatting-only by machine.
    • YAML and JSON parse to identical data before and after.
    • Every shell script's new text is exactly shfmt -i 2 -ci of its old text, and the old and new text are identical once whitespace, ; and \ are removed.
    • Every changed script passes bash -n.
  • The other 155 files went to three independent reviewers. Each was given the code and the repository's review bar, not my conclusions:
    • the 89 Go files;
    • the production manifests, Dockerfiles, ci.yaml and the deploy action, including an offline kubectl kustomize render of every layer on main and on this branch;
    • the scanner configuration and exceptions, Go modules, tests and docs.
  • The reviewers built and vetted every affected package, ran the affected tests, and ran mutations against the guard tests.

Production effect. Every rendered layer is byte-identical to main, except:

  • StatefulSet private-mail/private-mail gains 13 Checkov skip annotations in its own metadata. The pod template is unchanged, so no pod restarts.
  • ConfigMap observability/coroot-security-progress changes only in whitespace inside two embedded scripts. Reloader will restart that Deployment once.

Findings. None critical or major. Ten were minor; seven are fixed in d328b724f:

  • The OSV advisory list test accepts only reviewed line shapes. Before, a [[PackageOverrides]] table, a single-quoted id or a trailing comment could widen what osv-scanner ignores without failing the test.
  • The private-mail identity guard checks every container's image, not only the main container's.
  • The World at Ruin operator binding is read from the rendered production layers instead of one directory.
  • A Go test refuses any ADD in the private-mail image without a pinned SHA-256 checksum. Checkov's CKV_DOCKER_4 skip covers the whole Dockerfile, so it can't do this.
  • A Go test makes sure the production recovery patch keeps every base pod-template annotation. Its JSON Patch add replaces the whole map.
  • The x/crypto pseudo-version now says beside it why it is pinned and when to move off it.
  • The comment on the diagnose-email-startup prettier exclusion now gives the real reason: its tests edit the compact JSON by exact substring.

Accepted or tracked:

  • The boundary guards' trivy layer doesn't run in CI, because the validate job doesn't install trivy. All six guards were built that way before this PR. This is now tracked in #5864, and the comments say so.
  • The Coroot builder stage pins liblz4-dev=1.9.4-1 to satisfy hadolint. If Debian replaces that version, the image build fails visibly. It affects the build stage only, and the pin keeps builds reproducible.
  • The "no Secret API grant" sentence in the World at Ruin disposition is not asserted by a test. The test does assert the binding's single subject and the Role's single rule.

Separate known issue. The coverage job can still run refresh-flux-ghcr-auth out of time on a busy runner (#5862, with measurements). The organization workflow skips its test jobs in the merge queue, so this costs a re-run on pull requests, not a queue eviction.

Verdict: clean at d328b724fe7ea3de0a17811733828a916e6917d2.

🤖 Generated with Claude Code

@devantler
devantler added this pull request to the merge queue Nov 4, 2026
Merged via the queue into main with commit 28794fb Nov 4, 2026
108 of 109 checks passed
@devantler
devantler deleted the claude/go-workflow-adoption branch November 4, 2026 08:01
@github-project-automation github-project-automation Bot moved this from 🫴 Ready to ✅ Done in 🌊 Project Board Nov 4, 2026
devantler added a commit that referenced this pull request Nov 4, 2026
…tire-cri-log-analyzer-4350

Keeps main's updated Validation paragraph and the retirement's package example (validate-eks-ci-role-policy), and keeps scripts/analyze-cri-logs deleted although main lint-fixed it in #5853.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

Status: ✅ Done

Development

Successfully merging this pull request may close these issues.

1 participant