Skip to content
Install the CLI

Reference Clusters and instances

Cluster configuration

A cluster module is where you describe your Kubernetes environment as a whole: which cloud provider or distribution it runs on, what availability target your workloads should meet, which namespaces exist, and whether Kix should generate network policies and enforce scorecard rules. You pass one or more of these modules to kix.buildCluster whenever you set up a new cluster or adjust cluster-wide defaults.

A cluster listed in kix.lib.mkFlake is named after its clusters key, so the file passes no name. See Use mkFlake in a consuming repo for when to set one, and for the check that stops a cluster that Kix 0.6 deployed as cluster from changing its name.

{ kix, packages }:
kix.buildCluster {
specialArgs = { inherit kix packages; };
modules = [
kix.flavors.gke
{
k8sVersion = "1.31";
cluster.domain = "example.com";
cluster.capabilities.availabilityZones = [ "us-central1-a" "us-central1-b" "us-central1-c" ];
availablePackages = packages;
autoNamespace = "platform";
networkPolicy.enable = true;
scorecard.maxSeverity = "error";
}
];
}
OptionTypeDefaultPurpose
cluster.availabilitysubmodulederived from capabilitiesCluster-wide availability target and read-only substrate ceiling.
cluster.topologysubmodulezone and host keysNode label keys used for derived pod topology spread.
cluster.capabilitiessubmodulenull per field (or flavor default)Substrate capabilities such as multiNode, availabilityZones, daemonSets, and privilegedContainers.
cluster.nodesattrsOf submodule{ }Optional static node inventory (roles, cpu, memory, labels, taints).
cluster.providernullOr strnull (or flavor default)Display name of the Kubernetes distribution or cloud provider.
k8sVersionnullOr strnullTarget Kubernetes version checked against package meta.k8s constraints.
cluster.kubernetes.uidnullOr strnullUID of the target cluster’s kube-system Namespace. Binds the definition to that one Kubernetes cluster.
cluster.recordNamespacestr"kube-system"Namespace that holds the PackageInstance record of each instance under a _-prefixed key such as instances._cluster.
cluster.domainnullOr strnullPublic base domain used by kix.expose when an instance omits ingress.host.
clusterDomainstr"cluster.local"In-cluster DNS suffix used when constructing out.fqdn.
cluster.networksubmodule{ }Pod CIDR, Service CIDR, and upstream DNS resolvers.
cluster.containerdsubmodulestandard containerd pathsNode containerd socket, registry config path, content store path, and layer retention setting.
cluster.maintenancesubmodule{ enable = false; ... }Maintenance window marker exposed on cluster.out.maintenance.
cluster.secrets.acceptnullOr (listOf enum)nullSecret value sources permitted by the security.secretSource scorecard rule.
cluster.rolesattrsOf submodule{ } (or flavor default)How the environment claims infrastructure roles such as cni, dns, and storageClasses.
cluster.factBehaviorattrsOf anything{ }Per-kind override for whether custom resources conduct or terminate Service endpoint facts.
namespacesattrsOf submodule{ }Per-namespace labels, annotations, ResourceQuotas, NetworkPolicies, and Pod Security levels.
autoNamespacenullOr strnullDefault namespace for packages auto-instantiated from availablePackages.
availablePackagesattrsOf raw{ }Package catalog used to create instances automatically when required dependencies are missing.
networkPolicysubmodule{ enable = false; ... }Automatic network policy derivation from the dependency graph.
scorecardsubmodule{ enable = true; ... }Build-time policy evaluation, rule sets, severity overrides, and maximum severity cap.
clusterLabelsattrsOf str{ }Labels added to metadata.labels on every rendered resource.
globalPartsOverlayslistOf raw[ ]Post-build overlay functions (scope: self: base: attrset) applied to every instance.
instancesattrsOf (attrsOf submodule){ }Package instances and imports grouped by <namespace>.<instanceName>.
consumersattrsOf submodule{ }Hosted Kix consumer clusters and their granted namespaces, quotas, and shared services.
reservedNamespaceslistOf str[ ]Additional namespaces owned by a platform cluster that consumer clusters may not use.
secretsRecipientnullOr strnullPublic key (such as an age recipient) recorded in generated consumer interface files.

cluster.availability sets the cluster-wide availability requirement and reports the highest level that the declared cluster capabilities can support.

FieldTypeDefaultMeaning
cluster.availability.default"none" | "pod" | "node" | "zone"cluster.availability.substrateAvailability level passed to instances that do not set their own availability.
cluster.availability.substrateread-only "none" | "pod" | "node" | "zone"derivedHighest availability level supported by cluster.capabilities.

The four availability levels form an ordered scale:

LevelFailure the workload must tolerate without downtimeDerived topology spread strictness
noneNone (single pod or downtime during updates is acceptable).ScheduleAnyway
podLoss of a single pod or a rolling update.ScheduleAnyway
nodeLoss of a single node.DoNotSchedule on hostKey
zoneLoss of a single availability zone.DoNotSchedule on zoneKey, ScheduleAnyway on hostKey

Kix derives cluster.availability.substrate from cluster.capabilities:

Declared capabilitiesDerived substrate
multiNode = false"none"
availabilityZones has 2 or more entries"zone"
Otherwise (multiNode = true with 0 or 1 zones, or unknown capabilities)"node"

When multiNode or availabilityZones is null (unknown), Kix derives "node" and emits a cluster warning asking you to declare the capability explicitly. Requesting a cluster.availability.default or instance availability higher than a known substrate fails evaluation.

cluster.capabilities.multiNode = true;
cluster.capabilities.availabilityZones = [ "eu-west-1a" "eu-west-1b" "eu-west-1c" ];
cluster.availability.default = "zone";

Packages receive the resolved level as their availability argument and use kix.availability.pick to choose replica counts. For every Deployment and StatefulSet with spec.replicas > 1 (unless the workload defines its own topologySpreadConstraints), Kix automatically injects topologySpreadConstraints across cluster.topology.failureDomainKeys and emits a PodDisruptionBudget with maxUnavailable = 1.

cluster.topology defines the node labels that Kix uses when generating topologySpreadConstraints.

FieldTypeDefaultMeaning
cluster.topology.zoneKeystr"topology.kubernetes.io/zone"Node label key that identifies an availability zone, rack, or outer failure domain.
cluster.topology.hostKeystr"kubernetes.io/hostname"Node label key that identifies an individual node or host.
cluster.topology.failureDomainKeysread-only listOf strderivedOrdered list of topology keys ([ ] when multiNode = false, [ zoneKey hostKey ] with 2+ zones, [ hostKey ] otherwise).

Override zoneKey on bare-metal or on-premises clusters that label racks or hypervisor hosts instead of cloud availability zones:

cluster.topology.zoneKey = "topology.example.com/rack";

Packages whose pods are created by an operator rather than a Kix Deployment or StatefulSet can read clusterConfig.cluster.topology.failureDomainKeys or call kix.availability.spreadConstraints to place the same spread rules into their custom resource specs.

cluster.capabilities describes the underlying Kubernetes substrate. Each boolean capability uses three-valued logic:

  • true: the capability is present.
  • false: the capability is absent; packages or resources that require it fail evaluation.
  • null: unknown; packages or resources that rely on it evaluate with a warning.
OptionTypeDefaultMeaning
multiNodenullOr boolnullWhether the cluster has more than one schedulable node. When false, cluster.availability.substrate is "none" and required anti-affinity or DoNotSchedule spread on multi-replica workloads fails evaluation.
availabilityZonesnullOr (listOf str)nullList of availability zone names. Use [ ] for a known single-zone cluster. Two or more entries enable the "zone" availability level.
nodeAutoscalingnullOr boolnullWhether a node autoscaler (such as Karpenter, cluster-autoscaler, or GKE Autopilot) can add nodes dynamically.
managedControlPlanenullOr boolnullWhether the control plane is managed by a cloud provider.
gpunullOr boolnullWhether GPU scheduling (nvidia.com/gpu) is available on cluster nodes.
privilegedContainersnullOr boolnullWhether pods may run privileged containers or use host namespaces (hostNetwork, hostPID, hostIPC). Set to false by gke-autopilot and openshift.
podSecurityEnforcementnullOr ("privileged" | "baseline" | "restricted")nullCluster-wide Pod Security Admission or Security Context Constraint level enforced by the platform.
daemonSetsnullOr boolnullWhether DaemonSets may be deployed (false on gke-autopilot).

cluster.nodes.<nodeName> records an optional static node inventory for bare-metal or fixed-size clusters:

FieldTypeDefaultMeaning
roleslistOf str[ "worker" ]Node roles (such as "control-plane", "worker", "storage", or "gpu").
cpunullOr intnullvCPU count on the node.
memorynullOr strnullTotal node memory in Kubernetes quantity notation (for example, "32Gi").
labelsattrsOf str{ }Node labels.
taintslistOf anything[ ]Node taints.

cluster.provider, k8sVersion, and cluster.kubernetes.uid

Section titled “cluster.provider, k8sVersion, and cluster.kubernetes.uid”
OptionTypeDefaultMeaning
cluster.providernullOr strnullInformational distribution name (such as "k3s", "eks", or "talos"). Used for display and telemetry only; Kix never branches on cluster.provider.
k8sVersionnullOr strnullTarget Kubernetes version string, such as "1.31". Checked against package meta.k8s.minVersion and meta.k8s.maxVersion. The build carries it, and kix deploy, kix plan, and the operator stop when the cluster runs a different version, compared as precisely as you write it: "1.31" matches any 1.31.x, "1.31.4" matches only 1.31.4. A value with a patch number stops the deploy after every patch upgrade, which managed clusters (GKE, EKS, AKS) apply on their own, so write the minor version. The error names the value to set. kix.interface sets k8sVersion from the platform’s interface file unless the definition sets it; a mismatch then names the platform and offers a new interface file or an override as the fix. kix rollback goes ahead with one line that says the target build was made for another version; the operator keeps repairing an Active record; kix diff does not check. When unset, the build runs no version check and Kix compares nothing. See Bind a cluster definition to its Kubernetes cluster.
cluster.kubernetes.uidnullOr strnullThe UID of the target cluster’s kube-system Namespace, a lowercase UUID (kix status <cluster> or kubectl get namespace kube-system -o jsonpath='{.metadata.uid}'). When set, the build carries it, each deploy labels its Activation record kix.run/kubernetes-uid, and kix deploy, kix plan, kix rollback, kix gc, and the operator refuse to apply the build to any other Kubernetes cluster. Once a bound build has deployed, that Kubernetes cluster also refuses definitions that leave this unset. Several Kix clusters on one Kubernetes cluster set the same UID. See Bind a cluster definition to its Kubernetes cluster.

Kix writes a PackageInstance record for each instance, in the instance’s namespace. An instance under a _-prefixed key, such as instances._cluster for a package that creates only cluster-scoped objects, has no namespace of its own. Kubernetes stores a PackageInstance only inside a namespace, so Kix writes these records to cluster.recordNamespace instead. The default is kube-system.

Kix does not create this namespace, so it must exist. Some managed services refuse writes to kube-system, for example GKE Autopilot. On such a cluster, set another namespace that exists:

cluster.recordNamespace = "kix-records";

A _cluster instance and an instance in the record namespace cannot share a name, because both would write the same record. The build fails with a duplicate resource error.

cluster.containerd, cluster.maintenance, and cluster.secrets.accept

Section titled “cluster.containerd, cluster.maintenance, and cluster.secrets.accept”
OptionTypeDefaultMeaning
cluster.containerd.socketstr"/run/containerd/containerd.sock"Path to containerd’s gRPC socket on each node. Overridden by k3s and rke2 flavors.
cluster.containerd.registryConfigPathstr"/etc/containerd/certs.d"CRI config_path directory where containerd reads per-registry hosts.toml mirror files. Overridden by k3s, rke2, gke, and talos.
cluster.containerd.contentPathstr"/var/lib/containerd/io.containerd.content.v1.content"Path to containerd’s content store on each node.
cluster.containerd.discardUnpackedLayersnullOr boolnullWhether containerd deletes compressed image layers after unpacking (true on kind, talos, eks, and gke; false on aks, scaleway, k3s, and rke2). Read by peer-to-peer mirror packages such as spegel.
cluster.maintenance.enableboolfalseMarks the cluster as being in a maintenance window via cluster.out.maintenance.
cluster.maintenance.reasonnullOr strnullHuman-readable explanation for the maintenance window.
cluster.maintenance.untilnullOr strnullInformational ISO 8601 timestamp when the maintenance window ends.
cluster.secrets.acceptnullOr (listOf ("inline" | "sops" | "external" | "controller" | "configuration"))nullRestricts which Secret value sources are allowed in the cluster. When non-null, security.secretSource reports any Secret key whose source is not in this list.

cluster.network and the top-level domain options record cluster addressing facts that packages and helpers read.

OptionTypeDefaultMeaning
clusterDomainstr"cluster.local"Internal Kubernetes DNS suffix used to build <name>.<namespace>.svc.<clusterDomain> on every resource’s out.fqdn. Change this only if your cluster’s kubelet and DNS service use a custom domain.
cluster.domainnullOr strnullPublic base domain for ingress routes. When set, kix.expose derives <instanceName>.<cluster.domain> for instances that do not set config.ingress.host.
cluster.network.podCidrnullOr strnullPod network CIDR ("10.244.0.0/16" on kind; "10.42.0.0/16" on k3s and rke2). Read by the cilium package when deploying its chart with cluster-pool IPAM.
cluster.network.serviceCidrnullOr strnullService network CIDR (for example, "10.96.0.0/16").
cluster.network.dnsUpstreamlistOf str[ ]Upstream DNS resolver addresses read by the coredns package’s forward plugin. When empty, CoreDNS forwards to /etc/resolv.conf.
cluster.domain = "apps.example.com";
cluster.network.dnsUpstream = [ "1.1.1.1" "9.9.9.9" ];

Do not confuse clusterDomain (the internal .svc.cluster.local DNS suffix) with cluster.domain (the external base domain for Ingresses and HTTPRoutes).

cluster.roles.<role> declares whether the cluster environment already provides an infrastructure capability. Built-in flavors set these bindings to match stock distributions, and cluster modules can override them when a cluster is configured differently.

FieldTypeDefaultMeaning
cluster.roles.<role>.bindingnull | "absent" | "shadowable" | "exclusive"nullHow the environment claims the role.
cluster.roles.<role>.providernullOr strnullInformational display name of the environment’s implementation.
BindingMeaning
nullUnknown. Consumers or resources that rely on the role emit a warning if no managed instance provides it.
"absent"The environment does not provide the role. A managed package instance must fill it; otherwise required consumers fail evaluation and optional consumers resolve to null.
"shadowable"The environment provides a default implementation (usually paired with a kix.mkImport platform instance). A managed instance that claims the role replaces the platform default.
"exclusive"The environment owns the role and cannot be replaced in-band. Declaring a managed instance that claims the role is an evaluation error.

Role names come from the closed registry in kix/lib/eval/roles.nix. Every role name also acts as a dependency-injection alias.

RoleProvider out contractPackages claiming the roleHow Kix checks it
cninoneciliumPrevents deploying a second CNI when the environment binds cni as exclusive.
network-policy-enforcernetpol rule buildersciliumRequired when networkPolicy.enable = true.
dnsfqdncorednsWorkloads with cross-instance Service dependencies are ordered after the active DNS provider.
storageClassesstorageClassNamestorage-classesDefault StorageClass provider for PVCs and StatefulSets.
loadBalancernonenone (environment role)Checked by scope.mkResource on Service objects with type: LoadBalancer (unless loadBalancerClass comes from kix.providedLoadBalancerClass).
metricsApinonemetrics-serverChecked on HorizontalPodAutoscaler resources reading metrics.k8s.io and packages calling scope.requireMetricsApi.
registryMirrornonespegelPrevents running a second node-local OCI mirror when embedded-registry is enabled on k3s or RKE2 (exclusive).
snapshotControllercrds (VolumeSnapshot, VolumeSnapshotClass, VolumeSnapshotContent)snapshot-controllerProvides volume snapshot CRD handles to storage drivers and backup packages.

To replace a distribution’s bundled component with a Kix-managed package, disable the component in the distribution and set the role binding to "absent":

# k3s started with --flannel-backend=none --disable-network-policy
cluster.roles.cni = {
binding = "absent";
provider = null;
};
instances.kube-system.cilium.package = packages.cilium;

cluster.factBehavior overrides how custom resources handle Service endpoint facts during network policy derivation.

PropertyValue
TypeattrsOf anything keyed by "<group>/<Kind>"
Default{ }

When a custom resource embeds a Kix Service’s out.fqdn or out.url, Kix needs to know whether the resource’s controller connects to that Service directly ("terminate") or passes the address along to another resource ("conduct"). Normally, the package that owns the CRD declares factBehavior on scope.mkCRD or scope.mkCRDRef. Use cluster.factBehavior when a custom resource is rendered without a typed CRD builder (for example, inside a Helm chart) or when you need to override the CRD’s declaration:

cluster.factBehavior."monitoring.coreos.com/Prometheus" = {
endpoint = "terminate";
podSelector = cr: {
"app.kubernetes.io/name" = "prometheus";
"operator.prometheus.io/name" = cr.metadata.name;
};
};
FieldTypeRequiredMeaning
endpoint"conduct" | "terminate"yes"conduct" forwards endpoint facts through the custom resource’s out.*; "terminate" generates egress policies for the operator’s operand pods and ingress policies on the target Service.
podSelectorcr: attrsOf strwhen endpoint = "terminate"Function from the rendered custom resource manifest to the pod selector labels of the pods the operator creates.
podNamespacestr or cr: strnoNamespace where the operand pods run, if different from the custom resource’s own namespace.

Kix automatically creates a Namespace resource for every namespace that contains an active instance. Use namespaces.<name> to attach metadata, quotas, Kubernetes NetworkPolicy objects, or Pod Security Admission levels to a namespace, or to create an empty namespace.

namespaces.apps = {
labels.team = "checkout";
annotations."example.com/oncall" = "[email protected]";
podSecurity = "restricted";
resourceQuota = {
pods = "20";
"requests.cpu" = "8";
"requests.memory" = "16Gi";
};
networkPolicies.allow-DNS = {
podSelector = { };
policyTypes = [ "Egress" ];
};
};
FieldTypeDefaultMeaning
labelsattrsOf str{ }Additional labels merged into the Namespace metadata alongside kubernetes.io/metadata.name and app.kubernetes.io/managed-by.
annotationsattrsOf str{ }Annotations placed on the Namespace resource.
resourceQuotanullOr anythingnullWhen non-null, emits ResourceQuota/<namespace>-quota with this set as spec.hard and checks namespace workload usage at build time.
networkPoliciesattrsOf anything{ }Emits one standard networking.k8s.io/v1 NetworkPolicy per key, named <namespace>-<key>, with the value as spec.
podSecuritynull | "privileged" | "baseline" | "restricted"nullSets pod-security.kubernetes.io/enforce on the Namespace and validates all pod templates in the namespace against that Pod Security Standard at build time.

Build-time Pod Security and ResourceQuota checks

Section titled “Build-time Pod Security and ResourceQuota checks”
  • Pod Security Admission: If any instance in the namespace declares meta.podSecurity, the namespace receives the most permissive level required by its instances. Setting namespaces.<name>.podSecurity to a level stricter than an instance in that namespace requires fails evaluation. When a namespace has an enforced level (from namespaces.<name>.podSecurity, meta.podSecurity, or a consumer platform interface), Kix checks every pod template in the namespace against the Kubernetes Pod Security Standards at build time and reports each container field that violates the policy.
  • ResourceQuota: Kix sums the minimum pod, CPU, memory, and storage usage across all workloads in the namespace (including custom resources whose CRD declares usesAtLeast) and compares the total against namespaces.<name>.resourceQuota, any unscoped ResourceQuota resource in the namespace, and any consumer interface quota. If the minimum usage exceeds a limit, evaluation fails with one error per limit. The error lists the objects Kix counted with their usage, and the objects it could not count: DaemonSets and CronJobs by name, and custom resources whose kind declares no usesAtLeast grouped by kind. See Declaring quota usage for how a package declares it.

autoNamespace sets the default namespace for packages that Kix instantiates automatically from availablePackages.

PropertyValue
TypenullOr str
Defaultnull

When Kix auto-instantiates a catalog package, it selects the target namespace in this order:

  1. availablePackages.<name>.namespace, if set on the catalog entry;
  2. autoNamespace, if set on the cluster;
  3. the namespace of the consumer instance that requested the dependency.

Setting autoNamespace = "platform" places shared auto-instantiated providers into a single namespace instead of duplicating them in every requesting namespace. It has no effect on instances declared explicitly under instances.

A package that runs once per cluster, such as an operator, needs a namespace of its own. When step 3 would place one beside the package that needs it, Kix builds the cluster and prints a warning, because removing that package would remove the operator for the whole cluster. Declare the operator under instances, set autoNamespace, or set a namespace on its catalog entry. Kix 0.10 will refuse this placement. When consumers in two namespaces need it, Kix already refuses the cluster.

availablePackages registers a catalog of packages that Kix can instantiate on demand when a required dependency argument is not satisfied by any declared instance.

availablePackages = packages // {
prometheus = {
package = packages.prometheus;
namespace = "monitoring";
aliases = [ "metrics" ];
};
};
Entry shapeMeaning
availablePackages.<name> = <package>;Shorthand for { package = <package>; }.
availablePackages.<name> = { package, namespace?, aliases? };Full catalog entry with an optional fixed namespace (nullOr str) and additional aliases (listOf str).
  • Required dependencies only: Only required build arguments (without ? null) create demand against availablePackages. Optional build arguments resolve to an active instance or null. Explicit deps.<arg> overrides also bypass catalog lookup.
  • Transitive resolution: If an auto-instantiated package has its own required dependencies, Kix resolves them transitively using the same rules.
  • One-per-cluster packages: If a package claims a cluster-wide role (meta.roles) or lists "cluster:<own-alias>" in meta.conflictsWith, it can only be instantiated once in the cluster. If consumers in two different namespaces demand it and neither autoNamespace nor an entry namespace pins it to a single namespace, evaluation fails and asks you to declare the instance explicitly under instances.
  • Ambiguous catalog claimants: If two or more entries in availablePackages answer the same demanded dependency name, evaluation fails and lists the claimants. Disambiguate by declaring an instance with optional = true under instances or by removing the duplicate entry from availablePackages.

networkPolicy controls automatic network policy generation from the dependency graph. When enabled, Kix uses the cluster’s network-policy-enforcer provider (such as cilium) to emit policies for service-to-service traffic, DNS, API server access, ingress controllers, Prometheus and VictoriaMetrics scraping, StatefulSet peer traffic, and package intents.

networkPolicy = {
enable = true;
defaultDeny = true;
directions = "both";
};
FieldTypeDefaultMeaning
networkPolicy.enableboolfalseDerive network policies from the dependency graph. Requires an active instance that claims meta.roles = [ "network-policy-enforcer" ].
networkPolicy.defaultDenybooltrueEmit a default-deny policy in every Kix-managed namespace for the enforced directions.
networkPolicy.directions"ingress" | "egress" | "both""both"Which traffic directions Kix enforces in default-deny policies, derived policies, and kix.operandPolicy.
networkPolicy.platformIntentsattrsOf anything{ }Connectivity intents for non-Kix pods (such as pre-installed kube-system components) or configurable workload egress targets.

Each networkPolicy.platformIntents.<name> entry supports:

FieldTypeMeaning
namespacestrNamespace for a namespaced policy. Omit when scope = "clusterwide".
scope"namespaced" | "clusterwide"Policy scope (default "namespaced"). Clusterwide intents emit a CiliumClusterwideNetworkPolicy.
targetNamespacenullOr strOptional io.kubernetes.pod.namespace filter on a clusterwide policy’s endpoint selector.
podSelectorattrsOf strPod labels selected by the policy.
ingresslistOf attrsIngress rules ({ from = "world" | "all-pods" | "apiserver"; ports?; entities?; }).
egresslistOf attrsEgress rules ({ to = "world" | "all-pods" | "apiserver" | "dns"; ports?; entities?; }).

scorecard configures build-time policy evaluation over the cluster’s rendered manifests, packages, namespaces, and cluster-wide state.

scorecard = {
enable = true;
maxSeverity = "error";
ruleOverrides = {
byRule."reliability.hasProbes".severity = "error";
byNamespace."sandbox-*"."security.*".severity = "warning";
};
knownAnnotationDomains = [ "eks.amazonaws.com" ];
};
FieldTypeDefaultMeaning
scorecard.enablebooltrueRun the scorecard during cluster evaluation.
scorecard.rulesattrsOf anythingkix.rulesNested attribute set of active rules ({ <category>.<ruleName> = rule; }). Assigning this replaces the default rule set unless you merge kix.rules.
scorecard.maxSeverity"info" | "warning" | "error""warning"Caps the effective severity of every finding. Under the default "warning" cap, "error" rules are reported as warnings and do not fail the build; set "error" to fail evaluation on error-severity findings.
scorecard.ruleDefaultsattrsOf anything{ }Fallback rule settings ({ severity = "warning" | "error" | "info"; }) for rules that omit severity.
scorecard.ruleOverridesattrsOf anything{ }Scoped overrides under byRule, byOwner, and byNamespace.
scorecard.knownAnnotationDomainslistOf str[ ]External annotation domains exempted from the architecture.annotationDomainOwnership rule.