Skip to content
State Support Matrix

This is the “what works / what doesn’t” guarantee for the v0.5 external-tester milestone (see VERSIONING.md § v0.5 gate). It lists every state-file parameter Keystone Core’s stdlib modules accept and the maturity status of each, so operators evaluating v0.5 know in advance what is safe to depend on.

Scope: this matrix covers the state-management stdlib modules under internal/statemgmt/stdlib. It is generated from the modules’ validated parameter surface, not from marketing copy — if a parameter is listed here, the engine accepts and acts on it today.

How to read this

Status taxonomy

  • stable — Implemented, validated, and either covered by the live cross-distro CI matrix or distro-agnostic and exercised by unit/integration tests. Safe to depend on; breaking changes will carry a migration note.
  • experimental — Implemented and usable, but with narrower coverage: not yet exercised on the live distro matrix, recently added, or limited in scope. May change between v0.x releases without a long deprecation window.
  • deprecated — Scheduled for removal; a replacement exists. No parameters are deprecated as of v0.5.

Cross-distro matrix

The “matrix” column refers to the live 8-distro privileged-container harness (make test-cross-distrotest/e2e/state/run.sh): Debian 12, Ubuntu 22.04/24.04, Rocky 9, Alpine 3.19, exercising each applicable module twice for idempotency against the real init system and package manager.

  • yes — Verified live on the distro matrix.
  • agnostic — Behaviour does not vary by distribution (filesystem, user, exec, crypto primitives); covered by unit/integration tests rather than the distro matrix.

Parameters every module shares

These are handled by the engine and are not repeated in each table below:

  • The declaration name is the primary identity. For several modules it is the managed value — e.g. hostname, timezone (America/New_York), kmod (the module name), sysctl (the kernel key), file/link/pki (the path), package/user/group (the object name).
  • state — Desired state. The legal values are module-specific and are noted per module (e.g. present/absent, running/stopped, on/off, run). Where a module supports only one state, that is called out.
  • severity — Optional drift-severity override (low/medium/high). Reserved engine parameter; stable on every module.

Module maturity at a glance

ModuleCategoryMaturityMatrixNotes
fileFiles & contentstableagnosticcontent/source, mode, owner, symlink
linkFiles & contentstableagnosticsymlink + hardlink
archiveFiles & contentstableagnosticextract-only (present)
configFiles & contentstableagnostickeyvalue + INI formats
gitFiles & contentstableagnosticclone / track rev
packagePackagesstableyesapt/dnf/apk verified; zypper/pacman experimental
langpkgPackagesexperimentalagnosticpip/npm/gem, global scope only
serviceServices & schedulingstableyessystemd/openrc verified; sysvinit experimental
cronServices & schedulingstableyesper-user crontab
atServices & schedulingstableyesone-shot at jobs
systemd_timerServices & schedulingstableyestimer units
userUsers & accessstableagnosticaccount management
groupUsers & accessstableagnosticgroup management
sshUsers & accessstableagnosticauthorized_keys entries
sysctlKernel & systemstableyesruntime + /etc/sysctl.d persist
kmodKernel & systemstableagnosticload + boot persistence
hostnameKernel & systemstableyesstatic hostname
timezoneKernel & systemstableyessystem timezone
systemKernel & systemstableagnosticbanner / reboot / locale
swapKernel & systemstableyesswapfile / partition + fstab
diskStoragestableyesmkfs + resize
mountStoragestableyesfstab + live mount
lvmStoragestableyesPV / VG / LV
networkNetworkingstableyesruntime + persist (networkd/netplan)
routeNetworkingstableyesruntime + persist (networkd/netplan)
bondNetworkingstableyescreate/remove; persist optional
bridgeNetworkingstableyescreate/remove; persist optional
vlanNetworkingstableyes802.1Q create/remove
iptablesFirewallstableyessingle rule per decl
nftablesFirewallstableyessingle rule per decl
firewalldFirewallstableyeszone service/port/rich-rule
firewallFirewallstableyesbackend-dispatching abstraction
securitySecurityexperimentalpartialSELinux + AppArmor, present only
pkiPKIstableagnosticx509 cert/key on disk
commandExecutionstableagnosticguarded shell exec

persist renderers are limited to systemd-networkd and netplan in v0.5. NetworkManager / RHEL ifcfg-* are planned for v0.6+ (see the network module section).


Files & content

file

Manages files, directories, and symlinks. States: present, absent, directory, symlink.

ParameterTypeRequiredStatusNotes
contentstringoptionalstableFile body; mutually exclusive with source
sourcestringoptionalstableLocal source path; mutually exclusive with content
modestringoptionalstableOctal permissions, e.g. "0644"
ownerstringoptionalstableUser name or numeric UID
groupstringoptionalstableGroup name or numeric GID
targetstringconditionalstableSymlink target; required for state: symlink

link

Manages symbolic and hard links. States: present, absent.

ParameterTypeRequiredStatusNotes
targetstringconditionalstableLink target; required for present
kindstringoptionalstablesymlink (default) or hard
forcebooloptionalstableReplace an existing non-matching file (never a directory)

Not yet supported (planned, #104): relative-target normalisation — relative symlink targets are stored verbatim.

archive

Extracts tar/tar.gz/tar.bz2/zip archives. State: present only.

ParameterTypeRequiredStatusNotes
targetstringrequiredstableDestination directory
formatstringoptionalstableauto (default), tar, tar.gz, tar.bz2, zip
createsstringoptionalstableIdempotency short-circuit path
strip_componentsintoptionalstableRemove leading path levels

Not yet supported (planned, #108): absent/clean-before-extract mode and safe symlink/hardlink extraction.

config

Manages individual key/value pairs in keyvalue or INI files. States: present, absent.

ParameterTypeRequiredStatusNotes
keystringrequiredstableConfig key (no =, newlines, or comment/section leaders)
valuestringconditionalstableRequired for present
formatstringoptionalstablekeyvalue (default) or ini
sectionstringoptionalstableINI section header; INI format only
space_around_separatorbooloptionalstablekey = value vs key=value
createbooloptionalstableCreate file if missing (default true)

Not yet supported (planned, #107): TOML/YAML/JSON/XML formats, configurable separators, case-insensitive keys, uncomment-aware updates.

git

Manages a git working tree. States: present (clone if absent), latest (track remote), absent.

ParameterTypeRequiredStatusNotes
urlstringconditionalstableRequired for present/latest
revstringoptionalstableBranch/tag/SHA (default: remote default branch)
depthintoptionalstableShallow-clone depth; 0 = full
remotestringoptionalstableRemote name (default origin)
forcebooloptionalstableAllow latest to discard local changes

Not yet supported (planned, #103): authenticated clones, submodules, advanced clone options.


Packages

package

Linux package management. States: present, absent. Backend is auto-detected.

ParameterTypeRequiredStatusNotes
versionstringoptionalstableVersion pin; invalid with absent

Backends:

  • apt, dnf, apkstable; verified on the live distro matrix (Debian/Ubuntu, Rocky, Alpine).
  • zypper, pacmanexperimental; implemented and unit-tested, but no SUSE/Arch distro is in the live matrix yet. (Gate: zypper is optional for v0.5, required by v1.0 — see #18.)

langpkg

Language-ecosystem packages via pip/npm/gem. States: present, absent. Module maturity: experimental.

ParameterTypeRequiredStatusNotes
namestringrequiredexperimentalPackage name
managerstringrequiredexperimentalpip, npm, or gem
versionstringoptionalexperimentalStrict-equality pin; invalid with absent

Not yet supported (planned, #116): version ranges, per-user / per-project installs, lockfiles, PEP-668, and additional ecosystems (cargo, composer, …).


Services & scheduling

service

Manages service running state and boot-enablement. States: running, stopped.

ParameterTypeRequiredStatusNotes
enablebooloptionalstableBoot-enablement; unset = leave as-is

Backends:

  • systemd, openrcstable; verified on the live distro matrix (systemd everywhere, openrc on Alpine).
  • sysvinitexperimental; implemented and fixture-tested, but no sysvinit-default distro is in the live matrix.
  • launchd (macOS) — not supported; out of scope for the Linux-only v0.5 (#17).

cron

Per-user crontab entries with marker comments. States: present, absent.

ParameterTypeRequiredStatusNotes
commandstringconditionalstableRequired for present
schedulestringconditionalstable5-field spec or @-shortcut; required for present
userstringoptionalstableCrontab owner (default root)

Not yet supported (planned, #105): per-field schedule params, /etc/cron.d drop-ins, environment lines, deep field-syntax validation.

at

One-shot jobs in the at queue. States: present, absent.

ParameterTypeRequiredStatusNotes
commandstringconditionalstableRequired for present
timestringconditionalstableat time spec; required for present
queuestringoptionalstableQueue letter az (default a)

Not yet supported (planned, #109): replace-on-change re-queue, per-user queues, batch mode.

systemd_timer

systemd timer units. States: present, absent.

ParameterTypeRequiredStatusNotes
on_calendarstringconditionalstableCalendar expression; required for present
servicestringoptionalstableTarget unit (default <name>.service)
persistentbooloptionalstablesystemd Persistent= flag
descriptionstringoptionalstableUnit description
enablebooloptionalstableEnable + activate at boot (default true)

Not yet supported (planned, #106): generated companion service, per-user timers, additional [Timer] knobs.


Users & access

user

Linux user accounts. States: present, absent.

ParameterTypeRequiredStatusNotes
uidintoptionalstableNumeric UID
gidintoptionalstableNumeric primary GID; mutually exclusive with group
groupstringoptionalstablePrimary group name; mutually exclusive with gid
homestringoptionalstableHome directory (absolute path)
shellstringoptionalstableLogin shell (absolute path)
commentstringoptionalstableGECOS field
groups[]stringoptionalstableSupplementary groups
systembooloptionalstableCreate as system user
create_homebooloptionalstableCreate home directory
remove_homebooloptionalstableDelete home on absent

Note: on BusyBox systems, scalar-field modification of an existing account is unsupported (ErrModUnsupported); creation/removal work.

group

Unix groups. States: present, absent.

ParameterTypeRequiredStatusNotes
gidintoptionalstableNumeric GID
systembooloptionalstableCreate as system group

ssh

authorized_keys entries. States: present, absent.

ParameterTypeRequiredStatusNotes
keystringrequiredstablePublic key (keytype blob [comment])
userstringrequiredstableTarget user
optionsstring | []stringoptionalstableauthorized_keys options prefix
commentstringoptionalstableLine comment override

Not yet supported (planned, #113): key validation, options-set comparison, whole-file management.


Kernel & system

sysctl

Kernel parameters with optional /etc/sysctl.d persistence. State: present.

ParameterTypeRequiredStatusNotes
valuestringrequiredstableParameter value
persistbooloptionalstableWrite drop-in (default true)

Note: one drop-in file per key; a consolidated file is a future enhancement.

kmod

Kernel module load + boot persistence. States: present, absent.

ParameterTypeRequiredStatusNotes
persistbooloptionalstableAdd to boot-load config (default true)

hostname

Static hostname (the declaration name is the desired hostname). State: present. No parameters beyond severity.

timezone

System timezone (the declaration name is the zone, e.g. UTC). State: present. No parameters beyond severity.

system

Banner / reboot / locale — exactly one operation per declaration. State: present.

ParameterTypeRequiredStatusNotes
bannerstringoptionalstablemotd, issue, or issue_net
contentstringconditionalstableBanner content; required with banner
rebootbooloptionalstableTrigger reboot (must be true)
when_filestringoptionalstableReboot marker (default /var/run/reboot-required)
delayintoptionalstableMinutes before reboot (0–60, default 1)
localestringoptionalstablePOSIX locale identifier

Not yet supported (planned, #22): reboot disconnect-tolerance, cross-distro reboot detection, dual-file locale, absent semantics.

swap

Swapfile or swap partition with fstab + swapon state. States: on, present (fstab only), off, absent.

ParameterTypeRequiredStatusNotes
sizestringconditionalstableSwapfile size (e.g. 2G); on state only
priorityintoptionalstable-132767; invalid with off/absent

Not yet supported (planned, #112): UUID=/LABEL= sources, resize, custom opts. Sources must be absolute paths in v0.5.


Storage

disk

Filesystem signatures on block devices. States: present, absent.

ParameterTypeRequiredStatusNotes
devicestringrequiredstableBlock device path
fstypestringconditionalstableext2–4, xfs, btrfs, f2fs, vfat, exfat, swap; required for present
mkfs_options[]stringoptionalstableFlags passed to mkfs
forcebooloptionalstableOverwrite an existing filesystem
resize_fsbooloptionalstableGrow fs to device (ext/xfs/btrfs/f2fs)

Not yet supported (planned, #24): partition management, encryption, label/UUID management, broader fstype catalog.

mount

/etc/fstab entry + live mount. States: mounted, present (fstab only), unmounted, absent.

ParameterTypeRequiredStatusNotes
devicestringconditionalstableRequired for mounted/present
fstypestringconditionalstableRequired for mounted/present
optsstringoptionalstableMount options (default defaults)
dumpintoptionalstablefstab dump field
passintoptionalstablefstab fsck pass field
mkmntbooloptionalstableCreate mount point (default true)

Not yet supported (planned, #111): remount-on-change, crypttab integration, swap mounts.

lvm

LVM PV / VG / LV — exactly one object per declaration. States: present, absent.

ParameterTypeRequiredStatusNotes
pvstringconditionalstablePV device; PV operation
vgstringconditionalstableVG name; VG/LV operation
pvs[]stringconditionalstableVG member devices; reconciled (add/remove)
lvstringconditionalstableLV name; requires vg
sizestringoptionalstableLV size (e.g. 10G); mutually exclusive with extents
extentsstringoptionalstablee.g. 100%FREE; create-only; mutually exclusive with size
resize_fsbooloptionalstable--resizefs on grow

Not yet supported (planned, #23): LV shrink, extents-based resize, thin/cache/ snapshot, RAID, PV metadata management, allocation policy.


Networking

persist selects the boot-survive renderer: networkd (systemd-networkd), netplan (Ubuntu), or auto. These two renderers are the v0.5 commitment; NetworkManager / RHEL ifcfg-* are planned for v0.6+ (#25). Omitting persist applies runtime-only configuration that does not survive reboot.

network

One interface’s runtime config + optional persistence. States: present, absent.

ParameterTypeRequiredStatusNotes
interfacestringrequiredstableInterface name (≤15 chars)
addresses[]stringoptionalstableCIDR list (full per-interface set)
mtuintoptionalstableLink MTU (68–65535)
upbooloptionalstableAdmin up/down
persiststringoptionalstablenetworkd/netplan/auto

At least one of addresses/mtu/up is required. Not yet supported (planned, #25): per-family addresses, DNS/NTP/domain management.

route

One routing-table entry. States: present, absent.

ParameterTypeRequiredStatusNotes
destinationstringrequiredstableCIDR or host IP
gatewaystringconditionalstableNext hop; one of gateway/interface required for present
interfacestringconditionalstableOutput interface; required for persist
metricintoptionalstableRoute metric
tablestring | intoptionalstableRouting table
persiststringoptionalstablenetworkd/netplan/auto

Not yet supported (planned, #26): source-routing rules, multipath, richer route attributes.

bond

Link-aggregation interface. States: present, absent.

ParameterTypeRequiredStatusNotes
namestringrequiredstableBond interface name (≤15 chars)
modestringoptionalstablebalance-rr (default) … 802.3ad, or numeric 0–6
members[]stringoptionalstableInterfaces enslaved at creation
miimonintoptionalstableLink-monitor interval (ms)
persiststringoptionalstablenetworkd/netplan/auto

Not yet supported (planned, #27): in-place attribute/member reconciliation — to change a live bond, delete then re-declare.

bridge

Bridge interface. States: present, absent.

ParameterTypeRequiredStatusNotes
namestringrequiredstableBridge interface name (≤15 chars)
members[]stringoptionalstablePorts added at creation
stpbooloptionalstableSpanning Tree Protocol (default false)
persiststringoptionalstablenetworkd/netplan/auto

Not yet supported (planned, #28): in-place reconciliation of stp/members.

vlan

802.1Q VLAN interface. States: present, absent.

ParameterTypeRequiredStatusNotes
namestringrequiredstableVLAN interface name (≤15 chars)
parentstringconditionalstableUnderlying interface; required for present
idintconditionalstableVLAN ID 1–4094; required for present
persiststringoptionalstablenetworkd/netplan/auto

Not yet supported (planned, #29): in-place reconciliation — an existing VLAN of the same name is treated as converged regardless of id/parent; QinQ; VLAN ranges.


Firewall

firewall

Backend-dispatching abstraction over iptables/nftables/firewalld.

ParameterTypeRequiredStatusNotes
servicestringconditionalstableOne of service/port required
portstringconditionalstablePORT[-PORT]/{tcp,udp,sctp,dccp}
backendstringoptionalstableForce iptables/nftables/firewalld
zonestringoptionalstablefirewalld zone (firewalld backend)
strict_catalogbooloptionalstableRequire catalog service name (default true)

Not yet supported (planned, #20): deny action, IPv6 on the iptables backend, chain/table overrides, service-catalog expansion.

firewalld

firewalld zone items. States: present, absent.

ParameterTypeRequiredStatusNotes
zonestringrequiredstableZone name (default public)
servicestringconditionalstableOne of service/port/rich_rule required
portstringconditionalstablePORT[-PORT]/{tcp,udp,sctp,dccp}
rich_rulestringconditionalstableRich-rule syntax (canonicalised)
reloadbooloptionalstableReload after change (default true)

Not yet supported (planned, #19): whole-zone management, masquerade/forward-port, direct rules.

iptables

A single iptables/ip6tables rule. States: present, absent.

ParameterTypeRequiredStatusNotes
chainstringrequiredstableTarget chain
rulestring | []stringrequiredstableMatch spec + target
tablestringoptionalstablefilter (default)/nat/mangle/raw/security
familystringoptionalstableipv4 (default)/ipv6
positionintoptionalstableInsert position; present only
savestringoptionalstablePath for iptables-save output

Not yet supported (planned, #114): structured rule model, ordering guarantees, both-family in one decl, distro persistence integration.

nftables

A single nftables rule. States: present, absent.

ParameterTypeRequiredStatusNotes
tablestringrequiredstableExisting table
chainstringrequiredstableExisting chain
rulestring | []stringrequiredstableMatch + statement
familystringoptionalstableDefault inet
indexintoptionalstableInsert position; present only
savestringoptionalstablePath for ruleset dump

Not yet supported (planned, #115): structured rules, ordering, table/chain management, comment matching.


Security

security

SELinux modes/booleans and AppArmor profile modes — exactly one operation per declaration. State: present only. Module maturity: experimental (highly distro-specific; only partially exercised on the matrix).

ParameterTypeRequiredStatusNotes
modestringconditionalexperimentalSELinux mode enforcing/permissive/disabled
booleanstringconditionalexperimentalSELinux boolean to toggle
valueboolconditionalexperimentalBoolean value; requires boolean
apparmor.profilestringconditionalexperimentalAppArmor profile name/path
apparmor.profile_modestringconditionalexperimentalenforce/complain/disable; requires profile

Note: SELinux mode: disabled cannot transition at runtime (reboot required). Not yet supported (planned, #21): SELinux file contexts / ports / modules / logins, absent semantics.


PKI

pki

A TLS certificate + private key on disk (the declaration name is the cert path). States: present, absent.

ParameterTypeRequiredStatusNotes
key_pathstringrequiredstablePrivate-key path (must differ from cert path)
common_namestringconditionalstableCN; one of CN/SAN required for present
subject_alt_namesstring | []stringconditionalstableSANs
organizationstringoptionalstableSubject organization
daysintoptionalstableValidity (default 365)
renew_daysintoptionalstableRenewal threshold (default 30)
key_typestringoptionalstablersa (default)/ecdsa/ed25519
rsa_bitsintoptionalstableRSA size (default/min 2048)
ecdsa_curvestringoptionalstablep256 (default)/p384/p521
is_cabooloptionalstableMark certificate as a CA
ca_certstringoptionalstableSigning CA cert; pair with ca_key
ca_keystringoptionalstableSigning CA key; pair with ca_cert

ca_cert/ca_key must be set together (omit both for self-signed). Not yet supported (planned, #110): combined PEM output, encrypted keys, broader issuance options.


Execution

command

Guarded shell execution. State: run only. At least one guard (unless/onlyif/creates) is required for idempotency.

ParameterTypeRequiredStatusNotes
commandstringrequiredstableExecuted via /bin/sh -c
cwdstringoptionalstableWorking directory
envmap[string]stringoptionalstableEnvironment variables
timeout_secondsintoptionalstableDefault 60, max 3600
unlessstringoptionalstableSkip if guard exits zero
onlyifstringoptionalstableSkip if guard exits non-zero
createsstringoptionalstableSkip if absolute path exists
shellstringoptionalexperimentalOnly /bin/sh accepted; alternate shells rejected

Note: shell rejects any non-default value today ("shell not supported … only /bin/sh"). To force an always-run command, use onlyif: /bin/true.


See also

  • VERSIONING.md — the v0.5 gate this matrix satisfies.
  • ROADMAP.md — ranked backlog; the #NN references above are Codeberg issues in the gate-v0.5 / v0.x milestones.
  • COMPATIBILITY.md — release cadence, support windows, and upgrade/compatibility policy.