Skip to content
kix /docs
Install the CLI

How-to guide Author packages and clusters

Declare package roles and metadata

Describe package ownership and lifecycle, and claim a registered infrastructure role when the package provides one.

Add meta beside a package’s options and build attributes:

how-to/composition/config-package.nix
meta = {
version = "1.0.0";
description = "Configuration owned by an application team";
owner = "platform";
lifecycle = "stateless";
scope = "namespace";
};

View source on GitHub ↗

Use these fields to describe the package:

  • version identifies the package version shown by inspection commands and in PackageInstance records.
  • description gives the package a short human-readable purpose.
  • owner identifies the team responsible for it and supports governance scorecard rules.
  • lifecycle classifies its state as stateless, stateful, durable, or ephemeral. Kix records it in the kix.run/lifecycle annotation. Replacing a package marked stateful triggers the deployment migration gate.
  • scope constrains dependencies. With scope = "namespace", instances in other namespaces cannot depend on the package: automatic resolution skips it for consumers in other namespaces, and an explicit deps.<x> = ref.<ns>.<instance> to it fails. The default is cluster.

version, description, and owner describe the package. lifecycle and scope affect evaluation and deployment behavior, so choose them carefully.

Add meta.roles only when the package provides one of Kix’s registered cluster infrastructure roles. This minimal provider claims the storageClasses role:

how-to/composition/storage-provider.nix
meta = {
version = "1.0.0";
description = "Default StorageClass for the composition example";
owner = "platform";
roles = [ "storageClasses" ];
};

View source on GitHub ↗

Registered roles are also dependency-resolution aliases. Kix validates role names, prevents conflicting providers, and checks any required out attributes when a consumer resolves the role.

The storageClasses role requires an exported storageClassName, so the package root supplies it:

how-to/composition/storage-provider.nix
root = {
resource = self.storageClass;
out.storageClassName = self.storageClass.out.name;
};

View source on GitHub ↗

Do not use roles as general package tags. Ordinary application dependencies are resolved through instance names, aliases, or explicit deps wiring.

Run the normal checks after adding or changing metadata:

kix-examples/
❱ kix check how-to-composition
 TOOL       RESULT  DETAILS                      
 eval       pass    16 manifests evaluated       
 scorecard  pass    0 errors, 0 warnings, 0 info

Evaluation fails if a role name is unknown, two managed packages claim the same role, or a resolved provider does not satisfy the role’s output contract.