Releases
Changelog
All notable changes to this project will be documented in this file.
[0.2.0-beta.1] - 2026-10-11
Added
- Remove Flux delivery fields and kurel’s Flux delivery mode
- Order components only where the document declares it
- Declare contract metadata and lowering targets on every builtin
- Let an author name the scaler, rbac and networkpolicy objects
- Label what a component owns and report its owner
- Default the Helm release name to the component name under both deliveries
- Order oci Kustomizations after their shared source
- Resolve generated names through a consumer naming hook
- Prune-protection and force-replace set a delivery intent
- Let the author and the naming hook name the postgresql Pooler and Databases
- Refuse a pod-spec trait on a component without a workload
- ObjectName names the object of a kind component
- Add six cluster-scoped kind components on a shared helper
- Let the six cluster-scoped kinds take objectName
- Name the generated source and the helm values objects
- Add the servicecidr, poddisruptionbudget and horizontalpodautoscaler kinds
- Refuse reserved metadata keys on every generated object
- Name the Kustomization of each helmtemplate hook-group child
- Give every policy refusal a class a consumer can read
- Labels and annotations on every kind component
- Make the name-collision refusal recognisable
- Make the reserved metadata key refusal recognisable
- Recognise the over-long hook-group name refusal and raise it in the transform
- Give the component label’s refusal a type and a sentinel
- Name the claim a role component’s pvc volume generates
- Resolve the ingress and httproute trait objects under name roles
- Label a CronJob’s job template and hold it to the reserved keys
- Resolve the Secrets the traits have written under two name roles
- Add the generated name role
- Declare exactly-one-of and at-most-one-of property groups
- Add the object kind policy
- Export the built-in handlers and lowering rules from pkg/oam/builtin/registry
- Expose the pod view of a monitoring workload object
Build
- Bump kure to v0.2.0-beta.15.0.20261004180425-97dce7a4b760
- Bump kure to v0.2.0-beta.15.0.20261004224508-0afd7ca8c4b8
- Bump kure to v0.2.0-beta.15.0.20261005031541-144a533dbcf3
- Bump kure to v0.2.0-beta.15.0.20261005101450-d3a45fad7a9a
- Keep Renovate off the monitoring API module shared with kure
- Bump kure to v0.2.0-beta.15.0.20261005142203-fef959cefb0a
- Bump kure to v0.2.0-beta.15.0.20261005152652-5dd0e22643ce
- Bump kure to v0.2.0-beta.15.0.20261005182950-3afb93e06660
- Require k8s.io/apiserver directly
- Update dependency syft to v1.54.1
- Require the Flux API modules of the new kinds directly
- Keep k8s.io/kube-openapi from being proposed on its own
- Name the vulnerability-alert exception for kube-openapi
- Require the flux-operator module directly
- Bump external-secrets apis to 2.12 and kure to 3978ab14
- Re-pin kure to main
- Bump Go to 1.26.9 and golang.org/x/net to v0.60.0
- Keep goimports out of testdata and hidden directories
- Update dependency goreleaser to v2.18.3
- Update module golang.org/x/mod to v0.42.0
- Update module golang.org/x/vuln to v1.9.0
- Pin kure v0.2.0-beta.16
CI
- Key the Go build cache on a UTC-day bucket, not a source hash
- Save the tool-binary caches from main only
- Drop the stale GO-2026-6596 allowlist entry
Changed
- Shorten every generated name by one rule
- Shorten the routing, backup and TLS default names too
- Shorten the role PVC claim name, keep an oversized suffix in bounds
- Drop a repeated nil check in the sibling group’s Generate
- Write the component type maps in the order of their types
Dependencies
- Exclude fluxcd pkg/apis/kustomize from Renovate
Document Format
- Hold a helmtemplate chart in app.yaml to the replica maximum
- Add the namespace kind component
- Add the limitrange kind component
- Add the resourcequota kind component
- Add the persistentvolume kind component
- Set the release name of a template-rendered chart in app.yaml
- Let the pod-template policy check take an empty path
- Add the pod kind component
- State what a schema-validating caller sees for the refused pod fields
- Make the pod kind a trait target
- Refuse a rendered list that involves a Helm hook
- Hold each item of a registered list to the undeclared-field rule
- Check the hook only in the items a list is replaced by
- Add fluxcd-kustomization to app.yaml; oci lowers to kind components
- Take scopeOverrides on helmtemplate
- State the order manifest.Scope resolves in
- Add the replicaset kind component
- Add the replicationcontroller kind component
- Add the podtemplate kind component
- Refuse an unknown key inside a Cilium selector
- Turn a panicking API decoder into a build error
- Report a decoder panic on a manifest document as a build error
- Take sensitive Helm values in app.yaml as secretValues
- Read a nil map as a null in the secretValues shared-path check
- Resolve the secret trait’s sub-application through the naming hook
- A Secret is no longer unchecked on passthrough and manifests
- Name the explicit-secret refusal where other kinds are said to pass
- Take scopeOverrides on helm under delivery: template
- Read seven container fields on every workload container
- Raw tolerations and topology spread on statefulset
- Raw affinity, topology spread and sidecars on daemonset
- Raw affinity, tolerations and topology spread on job
- Raw affinity, tolerations and topology spread on cronjob
- Selector, dataSourceRef and volumeName on a standalone claim
- Scope a passthrough object in app.yaml by its kind
- Read the remaining ServiceSpec fields on the service kind
- Claim the object names the routing and Cilium traits settle
- Add the ingress kind component
- Add the httproute kind component
- Add the networkpolicy kind component
- Add the cilium-networkpolicy kind component
- Say why the Cilium trait claims its name as authored
- Add the secret kind component
- Hold cnpg-cluster to the shared spec comparison
- Add the servicemonitor, podmonitor, prometheus-probe and prometheusrule kind components
- Add the issuer, clusterissuer and certificate kind components
- State three limits of the cert-manager kinds exactly
- Add the cilium-bgpadvertisement, cilium-bgpclusterconfig, cilium-bgpnodeconfigoverride and cilium-bgppeerconfig kind components
- Add the cilium-cidrgroup, cilium-loadbalancerippool, cilium-egressgatewaypolicy, cilium-localredirectpolicy and cilium-nodeconfig kind components
- Add the cilium-clusterwidenetworkpolicy kind component
- Refuse a cilium-networkpolicy rule without a required field
- Refuse a cilium-networkpolicy trait rule without a required field
- Name the Cilium kind helper for every Cilium kind
- Add the gatewayclass, gateway, listenerset, referencegrant and backendtlspolicy kind components
- Say when a BackendTLSPolicy hostname authenticates the backend
- Name the Kustomization and the kept source of an oci component
- Name the HelmRelease of a helm component
- Refuse a required field that a kind’s type leaves out
- Name the empty strings a cnpg-cluster does refuse
- Hold a pod’s image volume to the allowed registries
- Hold every image a cnpg-cluster names to the allowed registries
- Say where a cnpg-cluster takes an image it does not name
- Name the objects of a webservice and a worker component
- Refuse a required field that a kind’s type writes as null
- Say what an issuer’s solver fields leave to the API server
- Hold every image a document names to the tag rule
- Name the Cluster and the ObjectStore of a postgresql component
- Refuse the endpoints of a postgresql pooler named as its Cluster
- Refuse the endpoint of a cnpg-pooler named as its cluster
- Read a cnpg-pooler’s cluster reference as its decode does
- Read a cnpg-pooler’s properties for its endpoint as the build does
- Refuse a required string that a kind’s type writes empty
- Say which refusals of the cnpg kinds Generate repeats
- Refuse an object store path postgresql would write empty
- Count an external object store path in any spelling
- Check a peer’s timers rule against the CRD’s defaults
- Refuse a postgresql block that would not be built
- Write a postgresql pooler’s authored instances of 0 or less
- Add the endpointslice kind component
- Add the role, rolebinding, clusterrole and clusterrolebinding kind components
- Name the traits README by its path in the RBAC kinds entry
- Add the secretstore, clustersecretstore, externalsecret and clusterexternalsecret kind components
- Hold an external secret’s target.manifest to the environment policy
- Refuse a target.manifest apiVersion that is no API version
- Hold a target.manifest apiVersion to group and version names
- Correct two statements about an external secret’s references
- Refuse a cnpg-cluster’s endpoint where the build refuses its properties
- Refuse the endpoints of a postgresql pooler named as its component
- Answer an endpoint only for a component its type’s parse accepts
- Hold the postgresql endpoint entry to the members its lowering emits
- Add the replicationsource and replicationdestination kind components
- State what of a VolSync mover’s pod the policy does not hold
- Hold a VolSync rsync mover to the policy’s container capabilities
- Say that no kind is reachable only as a trait any more
- App.yaml helm and helmtemplate components take layoutKustomizationName; shorten a chart layout’s Kustomization name over 63
- Refuse every unread upstream field of a hand-parsed kind with its reason
- Refuse a defective match expression in a built-in kind’s label selector
- Require a match expression’s key and operator on a CRD-backed kind
- Refuse an app.yaml Application whose objects hold another component’s label
- Hold an app.yaml Application’s mover pod, solver pod and Gateway infrastructure labels
- Add the fluxcd-alert kind component
- Add the imagepolicy kind component
- Add the imageupdateautomation kind component
- Add the artifactgenerator kind component
- Hold the ResourceSet and FluxInstance kinds
- Say what a kind in the Flux namespace shares
- Correct two statements about an Alert’s event sources
- Say in the fluxcd-alert schema what matchLabels narrows
- Put the highlights of the Flux kinds where the placement rule says
- Keep the contract and object methods of the Flux kinds in their files
- Require a policySelector match expression’s key and operator
- Mark as required the properties six kinds refuse a component without
- Hold the seven Flux kinds to what their API requires and defaults
- Refuse reserved keys in an app.yaml Application’s metadata that reaches no pods
- Refuse an empty string on a field whose default the API applies
- Read statefulset affinity as the raw corev1 shape
- Add the metallb-ipaddresspool kind component
- Add the metallb-l2advertisement kind component
- Add the metallb-bgpadvertisement kind component
- Add the metallb-bfdprofile kind component
- Add the metallb-community kind component
- Exclude MetalLB from Renovate and describe empty advertisements as the widest
- Add the metallb-bgppeer kind component
- App.yaml volsync trait takes an optional name for its ReplicationSource
- App.yaml configmap, secret and pvc traits claim their object names
- Read a container’s windowsOptions and an init container’s restart policy
- Hold windowsOptions strings to upstream’s rules
- Let a Flux kind be held to the environment policy
- Write a Flux kind’s durations in the form their pattern takes
- Add the imagerepository kind component
- Add the fluxcd-provider kind component
- Add the fluxcd-receiver kind component
- Check a Flux kind’s duration under a list by its authored text
- Add the resourcesetinputprovider kind component
- Refuse an @ in a Provider address that is no URL with a host
- Refuse an @ in a proxy or url that is no URL with a host
- App.yaml fluxcd-receiver refuses a user or password in an OIDC issuerURL
- Say that a fluxcd-receiver issuerURL that does not parse is refused
- Say the standard channel’s HTTPRoute CRD does not hold useDefaultGateways
- Hold the two Cilium Envoy config kinds
- Refuse an authored empty list the API would default
- Give a key refused below the top level the reason its parser has
- Give podResources.claims the reason upstream refuses it with
- Publish app.yaml one-of groups and refuse an empty member beside a set one
- Add the tcproute, udproute and tlsroute kind components
- Add the grpcroute kind component
- Say the standard channel’s GRPCRoute CRD does not hold useDefaultGateways
- Name gateway-api v1.6.3 as the version the experimental-field claim holds at
- Add the cnpg-imagecatalog, cnpg-clusterimagecatalog, cnpg-backup, cnpg-scheduledbackup, cnpg-databaserole, cnpg-publication and cnpg-subscription kind components
- Refuse an image the CloudNativePG operator would choose under a registry allowlist
- Refuse an unnamed CloudNativePG image only after the authored checks
- App.yaml pod kinds refuse a defaulted string written as ""
- Make the defaulter vendoring script executable
- App.yaml refuses a reserved key in a raw StatefulSet’s volume claim templates
- Add the alertmanager kind component
- Refuse an unset alertmanager image under a registry allowlist
- Say an image-less monitoring container is unchecked by any name
- Say kurel build refuses an empty deprecated alertmanager image field
- Hold the alertmanager kind to what the operator runs
- Refuse an alertmanager memory limit under the operator’s request
- Say which alertmanager pod fields the derivation recognises
- Hold the alertmanager container as the operator merges it
- Check the alertmanager container only as the operator runs it
- Check an unnamed container’s resources alone
- Refuse alertmanager specs the operator cannot run
- Refuse alertmanager values the operator or the API refuse
- Refuse alertmanager values only where the operator writes them
- Leave alertmanager TLS credential volume names to the API
- Keep the monitoring kinds’ defaulted-zero list to the pod numbers
- Refuse alertmanager specs the CRD admits and the pods cannot run
- Name retention values the alertmanager CRD refuses
- Say the object kind policy can keep the alertmanager kind out of a build
- Refuse an alertmanager secret or configMap whose volume name is cut after a -
- Drop the alertmanager claim templates’ comparison with a statefulset’s
- Refuse four alertmanager specs the operator cannot build
- Refuse alertmanager DNS, HostProcess and TLS specs the pods cannot carry
- Hold alertmanager flags and patched ports only where the operator generates them
- Refuse alertmanager zeros the pods’ defaulting replaces
- Refuse an alertmanager externalUrl Alertmanager exits on
- Hold the externalUrl scheme at v0.19.0’s prerelease too
- App.yaml refuses a reserved key in a monitoring kind’s storage claim template
- Read a monitoring kind’s storage claim template only as the arm in use
- Model the merge of a monitoring patch’s ports and refuse duplicate names
- Take a monitoring patch’s ports as listed where the operator gives the container none
- Hold a monitoring serviceName to the Service name rule, a DNS-1035 label
- Say where the API refuses a monitoring serviceName that is not a DNS-1035 label
- Refuse alertmanager fields below the version that reads them
- State what an unset alertmanager version is judged at
- Judge alertmanager flags and field gates at one pinned default
- Hold minReadySeconds at every alertmanager version
- Refuse an alertmanager clusterAdvertiseAddress Alertmanager exits on
- Hold the advertise address to the Go and the args Alertmanager starts with
- Read the advertise address as the kubelet passes it, judge its host only at Go 1.23
- Refuse an advertise host name at every alertmanager version
- Read an advertise port at 32 bits and scan the address once
- Say an empty clusterAdvertiseAddress host is not refused
- App.yaml takes the two admission webhook configuration kinds and apiservice
- Drop the webhook and apiservice handlers from builtinComponentHandlers for the rebase
- Register the webhook and apiservice handlers in pkg/oam/builtin/registry
- Hold the operator kinds’ pod checks in kind-neutral helpers
- Add the thanosruler kind component
- Judge a thanosruler portName on the container as the pods run the web port
- Say in the thanosruler portName schema how a patch’s ports change the container check
- App.yaml refuses a fluxcd-provider address that is its credential under a policy that forbids explicit secrets
- Add the prometheus kind component
- Hold the prometheus operator’s own defaults
- Merge prometheus and thanos-sidecar patches as the operator runs them
- Refuse the prometheus pods the API refuses, as on alertmanager
- Refuse a prometheus schedulerName or imagePullPolicy the pods’ defaulting replaces
- Refuse a prometheus externalUrl Prometheus exits on at startup
- Refuse the prometheus ports, volumes and serviceName the API refuses
- Refuse what the operator builds into a broken Prometheus
- Refuse prometheus sidecar mounts, log files and shard counts the operator breaks
- Refuse thanos sidecar mount fields the operator drops
- Refuse a prometheus secret or configMap whose volume name is cut after a -
- Hold the prometheus rule volume names, query log mount and pod metadata text to the operator
- Refuse a monitoring StatefulSet name its pods’ revision label cannot carry
- Say the prometheus kind holds nothing to version
- Say the prometheus kind’s claim template holds reserved keys
- Refuse an alertmanager enableFeatures Alertmanager exits on
- Refuse an alertmanager enableFeatures of one empty element
- Read an alertmanager enableFeatures as the kubelet passes it
- App.yaml HelmReleases under a Flux namespace keep their Helm storage with the release
Documentation
- Cite the gocache cost figure and narrow the PR-cache claim
- Separate PR and merge-queue cache scope in the caching guide
- Add delivery-scope design sub-report
- Record the release-name default and image-check recommendation
- Replace provisional ticket IDs with the filed issues
- Correct five current-behaviour claims in delivery-scope
- Align delivery-scope with the filed tickets
- Drop leftover Flux delivery wording
- Drop the removed readiness check from the paused description
- Say the forwarded delivery traits are consumer-registered
- Keep bundle-only handlers in the terminal-type definition
- State every condition of a generated source
- Qualify where the postgresql members share a bundle
- Say what counts as a list inside an unregistered list
- Leave the design page out of the hook-group naming change
- State that hook-group child names carry no namespace
- Qualify the remaining hook-group uniqueness statements
- Say which authored names have a default
- Name the traits README by path, not by a relative link
- Add the kind inventory, held to the base library by test
- State the stamp on the helmtemplate config’s Namespace field
- State the decided handler asymmetries where they live
- Mark the delivery-field and ordering sections as shipped
- Say when the post-renderer parts a chart’s selector from its pods
- Move the ownership note to the ConfigWrapper row
- Bring the delivery-scope page up to what main holds
- State that an existing Job cannot take the component label
- State the suspended-Job exception as the cluster applies it
- Leave the feature-gate fallback out of the Job exception
- State what template delivery does with an undeclared field
- State the release name default as shipped on the delivery-scope page
- Name the pinned kure commit and what it means for lists
- Name the oci rule and the fluxcd-kustomization kind
- Withdraw the tier placement of the oci rule’s sources
- List fluxcd-kustomization with the Flux kinds
- State the naming hook as shipped on the delivery-scope page
- Say where kure maps a delivery intent and where it refuses one
- Say what ClusterScoped does and does not replace
- Drop a comparison the transform does not bear out
- State the passthrough scope precedence in the summaries
- State the forwarded-trait rule and close the asymmetries ticket
- State the scaling kinds’ value checks as they are
- Say object metadata on kind components is decided, not shipped
- Say what the endpointslice row is held for
- State where hook-group names that meet are refused
- The cert-manager kinds take labels and annotations
- Say where a Job’s annotations come from and what ApplyTo checks
- Say the policy is not applied again after a post-policy step
- Say which bundle’s settings a component’s Kustomization takes
- Say when a lowered name collision carries a namespace
- State the rule the endpoint entries hold to and its three limits
- State the fourth thing an endpoint entry does not see
- Name the cnpg-pooler endpoint’s selector by the Pooler’s object
- Say what names the object the CNPG endpoint selectors carry
- Name the entry a reference points at
- Put the per-type highlights in the order of their types
- Put the tables of component types in the order of their types
- Put the shipped kinds of the delivery scope in the order of their types
- Point at the kind inventory instead of naming every kind
- List the kind components of the build reference in a table
- Say where the lines of a new kind component go
- Leave the per-type highlights in the order they were written
- A long component name shortens the whole layout Kustomization name
- State what a hand-parsed kind does with an upstream field it does not read
- Describe the label-reach test and which name a labels refusal holds
- List ReservedKeyInPodMetadata among the new exported API
- Say that a policy-free kind may list its defaulted zeros
- Word the defaulted-zero claims to what their tests hold
- Name the component types again in the OAM README
- Name the exactly-one rules the published schema cannot express
- Say a trait’s Flux namespace input is claimed where it lands
- Name a kind’s own validation and the empty list in the required-written pin
- Name the kure commit and gateway-api v1.6.3 that go.mod pins
- Say what a bundle’s settings reach under the kure pin
- Qualify patch placement and the two new kure refusals
- Limit patch placement to plain patches before any other entry
- List the four patch placements by entry kind
- Say which per-layout Kustomizations a bundle patch reaches
- Count the 263 required store paths External Secrets 2.12 generates
- Correct the ComponentLabelKey GoDoc for go-kure/launcher#790
- State that a chart’s own-layout Kustomization name is shortened by launcher’s rule, not kure’s
- State that helmtemplate’s own-layout Kustomization name is shortened by launcher’s rule
- Settle go-kure/launcher#787’s open point in the delivery scope and scope kure’s rule
- State the chart layout shortening as the pinned state, not a lasting rule
- State when the object kind policy refuses the rbac trait
- A listed allowlist that leaves out either rbac kind refuses the trait
- Name the CloudNativePG ephemeral volume claim template the checks leave unread
- Say a hookGroupNamePrefix names the Kustomization, the default does not
- Count the Naming hook’s prefix out of the hook-group default
- Point from the registry’s maps to the list of kind components
- ExplicitSecretPolicy names a fluxcd-provider credential address among its sources
Fixed
- Check a generated name’s characters before shortening it
- Keep a generated source out of an inherited order
- Exempt from an inherited order only the source that is hoisted
- Hold template-delivered charts to the environment policy
- Close three gaps in the rendered-workload checks
- Name the authored component for a forwarded trait with no handler
- Name the authored component for a trait a document rule moved
- Name helmtemplate hook-group layouts after their application
- Hold a passthrough object to environment policy
- Report a passthrough refusal at generation as a policy violation
- Refuse an authored trait name no object can carry
- Refuse an authored empty trait name
- Hold the objects of a manifests source to environment policy
- Give namespaced template-delivery objects the application namespace
- Keep a labelled workload admissible and state the label’s limits
- Refuse a non-string pod label whether or not the key is there
- Read an unstructured object’s labels as written
- Label the members of an unstructured list envelope
- Label the pods of a ReplicaSet and a ReplicationController
- Write the component label into a label map of its own
- Label a bare Pod a Flux-installed chart renders
- Label the pod template of a standalone PodTemplate
- Read a nil map on an unstructured object as absent
- Keep the core-kind label patches to the core API group
- Select a synthesized policy’s pods by the authored component
- Refuse or keep a field the Go type does not declare
- Name a remedy both Helm terminals have in the no-release-name error
- Follow the decoder’s field selection in UnknownJSONFieldPath
- Declare the contract of the oci rule and the fluxcd-kustomization kind
- Keep the path of an unknown fluxcd-kustomization key that contains a dot
- Ask the naming hook before refusing a name, and tell every applied trait apart
- Tell apart every owner of a resolved name, and compare a hook-named sub-application by name
- Keep a hook answer that is the default as the hook’s, and tell a rule’s trait from an authored one
- Say of a trait’s equal-named sub-applications only what holds for all of them
- Name the lowered document in a naming hook request
- Warn conditionally about a volume under the force-replace intent alone
- Refuse a name two lowering rules resolve, and hold raw documents apart by namespace
- Keep a lowering rule’s name claim apart from a later owner’s
- Claim a lowering rule’s cluster-scoped name with no namespace
- Hold a document without a namespace as one of default under LowerRaws
- ObjectName applies to what a document rule returns
- Leave a handler’s own objectName alone, and read a null as none on a member
- Resolve no object name where no endpoints are read, and name both its sources
- Take objectName out before a handler fills capability defaults
- Hold a CronJob’s name to 52 characters and a Job’s to 63
- Hold an Indexed job’s name to one its pods can be named after
- Hold an Indexed job’s name to its first index where completions is unset
- Require controller on the ingressclass kind
- Refuse one owner’s Flux-scoped and plain claims of one object
- Read inheritedMetadata of a typed Cluster that states no kind
- Read platform annotations a capability gives in a typed map
- Find the platform’s annotations under a config wrapper
- End the walk for platform annotations on any wrapper chain
- Read a null entry of a trait’s string map as absent
- Make a policy refusal in a post-policy step a violation
- A refused ObjectMetadata.ApplyTo leaves the object as it was
- Hold the annotations ApplyTo merges to the size limit
- Read labels and annotations a component built in Go holds
- One root-node shape for a flat and an ordered application
- Name a policy once in its refusal
- Keep the parser’s two readings of a list apart
- Check only what the augmenter added to a layout
- Compare the objects a List holds wherever generated objects are keyed
- Leave a hook-group prefix that names nothing unmeasured
- Measure a chart layout’s Kustomization name with its application’s name
- Refuse two spellings of a Flux verification’s provider
- Claim a trait’s Flux namespace input where it lands
- Tell a trait’s owner its Flux namespace before a claim asks what it reads
- Refuse managedTLS on expose and read it from any string-keyed map
- Hold a Flux object’s commonMetadata to the reserved keys and the component label
- Hold an ArtifactGenerator’s commonMetadata to the reserved keys alone
- Hold a ResourceSet’s and a FluxInstance’s commonMetadata
- Refuse two applications of one name in one bundle
- Refuse a workload whose selector rules the component label out
- Select a renamed entry’s pods under the component label key app
- Refuse a malformed exclusive group before checking its keys
- Refuse a kind of unknown scope whatever namespace it states
- Hold a list by its members and re-read what an augmenter edits
- Hold a typed list’s members and an added configMapGenerator to the object kind policy
- Read a list as it is written for the object kind policy
- Read nested and mixed lists as written for the object kind policy
- Drop a null List for the object kind check alone
- Hold one generation for the object kind recheck and document the policy for traits
- Leave default Kustomization names to kure
Testing
- Qualify the suffix-preservation comment
- Let a trait row’s constructor be called from the components package
- Hold the kind inventory’s API versions to the base library
- Hold the kind inventory’s Type column to the handlers
- Pin that generation rechecks an inline manifests source
- Hold labels, scale target and selectors to the component beside a name override
- Compare whole selectors, the scale target and the namespace beside a name override
- Add the component label to the core-kind goldens
- Name the returned type when the ownership wrapper is not one
- Pin what passthrough does with a full strict record
- Make the passthrough full-record test reach its case
- Say what the refuse-set test probes by hand
- Rework the Helm goldens and release-name docs for the rebase onto main
- Hold the pod kind to the app-label invariant
- Register the scheme in the list mismatch test
- The secret trait’s sub-application takes the delivery intent
- Hold the cluster-scoped kinds’ copy and input checks tighter
- Compare the whole input in the cluster-scoped kinds’ input check
- Hold the two object metadata cases the comments name
- Count the objects before reading the first
- Count the hook’s requests for the HelmRelease
- Select the workload roles without a switch
- Count the object name properties of webservice and worker
- Say what the cert-manager required-list test derives
- Hold the name-collision text to the claim key’s
- Show a required field in another spelling is not refused
- Hold checked CRD rules to the API server’s validator
- Show the postgresql values a block that is not built drops
- Show a postgresql pooler’s instances of 0 or less is left out
- Drop a document’s status in the CRD create harness
- Hold the endpointslice, RBAC and six Cilium kinds in the table of API sets
- Hold the marker guards on the markers themselves
- Classify the counts over named fields of the external-secrets API
- Put typed objects to the rendered-object check itself
- Show endpoints answered for a document the build refuses
- Read the registries for the endpoint guard, show refusals past the parse
- Hold the VolSync CRDs to no default on list elements and map values
- Read the whole rsync mover package for the capabilities it adds
- Hold the rsync mover’s source to a digest
- Say which builders take the privileged-movers answer
- Hold the per-kind test tables in the order of their types
- Hold coreKindSchemas and apiSetKinds complete
- Hold the tables of component types in the docs in order
- Put the comment of the RBAC kinds back over them
- Read a kind list from the function’s own body
- Account for every line with a bar in a kind table’s section
- Hold the nine hand-parsed kinds to every field of their upstream type
- Report a label-reach entry whose type is gone instead of panicking
- Hold the Flux rows of the policy-free kinds to the four kinds
- Put the comment of the Kustomization fixture back over it
- Say that the Flux kinds set no defaulted-zero list
- Give the Flux source kinds their own reason for having no API-set row
- Say which kinds set no defaulted-zero list
- List the ArtifactGenerator’s commonMetadata among what is not read
- Show the postgresql rule writes what its members’ schemas require
- Count a null as absent and guard only a full run in the postgresql members test
- Name every nil kind the postgresql members test reads as null
- Rename the routing objects through the naming hook
- Run statefulset raw affinity through the selector matrix
- Claim a Flux namespace input where it lands
- Refuse a FluxInput spec outside a trait’s Secret or ConfigMap
- Pin the required fields a CRD-backed kind writes unauthored and does not refuse
- Measure the Flux kinds in the required-written pin
- Match a refused omission to the field’s full path
- Measure the MetalLB kinds in the required-written pin
- Measure the four new Flux kinds in the required-written pin
- Hold the required-written pin’s kinds to the kind inventory
- Count only omitempty lists as losing an authored empty list
- Hold the secret kind to every field of its upstream type
- Hold every ownProperties kind to a parity row
- Count the route kinds’ omitted paths in the Gateway defaulted-zero test
- Hold the cnpg kinds’ checked rules to the API server’s validator
- Measure the cnpg kinds in the required-written pin
- The defaulting drift test fails on code it cannot follow
- State what the defaulting drift test does not detect
- The drift test fails on a dereferenced copy, a break and a guard initialiser
- The drift test fails on a call in a case or on the object
- The drift test looks through parentheses around a callee
- The drift test walks only the shapes the excerpt uses
- The closed walk checks types, shadowing and receivers
- The closed walk scopes its names to their block
- Hold each alertmanager policy proof to its own field
- Measure the alertmanager kind in the required-written pin
- List the alertmanager image fields right after the pod spec’s
- Give the alertmanager’s claim template row its own reason
- Keep strictlyDecodedTypes and componentLabelFixtures row-local
- Restore the aligned layout of the two shared kind tables
- Re-apply the row-local layout of the two shared kind tables
- Hold the per-kind test tables in the order of their type
- Say why a leading digit in a monitoring serviceName is refused
- Vendor the Prometheus operator’s Alertmanager gates at v0.94.1
- Hold the alertmanager gate source to every comparing file
- Scan every reading shape and fail on a broken scan
- Vendor and walk the whole alertmanager package
- Catch parenthesized and method-value version comparisons
- Hold the gate fixtures’ leftover check under a -run filter
- Cover what the app.yaml apiservice and webhook kinds leave to the API server, and a wrong objectName
- Drop the webhook and apiservice rows from the two shared kind tables for the rebase
- Restore the webhook and apiservice rows in the two shared kind tables
- Measure the prometheus kind in the required-written pin
- Pin the refusal of one empty alertmanager enableFeatures below 0.27.0
[0.2.0-beta.0] - 2026-10-03
Added
- Add NameAllocator emit-or-adopt for elements shared across siblings
- Add a strict JSON decode for external API types, with a field-reachability check
- Add CheckCrossDocumentCollisions for multi-document callers
- Export CheckEnumMembersHoldNoNull for static Enum null checks
- Recognise traits a component rule forwards by value
- Lower worker to deployment via a component lowering rule
- Release through the shared Release workflow
- Promote dependency, placement, reconciliation and health-checks to builtins
- Publish policy schemas through HandlerSchemas
- Return raw lowering steps on the success path
- Generate Flux delivery objects with –oci-repository
- Accept a Flux source timeout of an hour or more, emitted in minutes
- Let a component lowering rule emit a same-name sibling group
- Warn on an authored component or trait whose type is deprecated
- Read a component’s endpoints from the lowering rule claiming its type
- Generate a sibling group’s primary objects first
- Apply a sibling group’s traits in authored order
- Lower webservice into a deployment and service pair
- Let a lowering rule record a rendered PlatformReserved value
- Add serviceaccount, persistentvolumeclaim and configmap kind components
- Warn when a PersistentVolume or claim is force-applied
- Replace engine-only traits with a post-policy step on lowering rules
- Check issue references in commit messages too
- Build the pvc trait through the persistentvolumeclaim kind’s claim path
- Give the persistentvolumeclaim component the pvc capability’s storageClassName default
- Build the configmap trait through the configmap kind’s path
- Give webservice and worker pvc volumes the pvc capability’s storageClassName
- Give statefulset claim templates the pvc capability’s storageClassName
Build
- Update dependency hugo to v0.167.0
- Update dependency yq to v4.54.1
- Bump kure to v0.2.0-beta.14
- Keep fluxcd/pkg/apis/meta out of Renovate proposals now it is a shared direct dep
- Exclude helm.sh/helm/v4, now a direct dep shared with kure
- Update dependency flux2 to v2.9.6
- Update dependency syft to v1.53.0
- Revert syft to v1.52.0
- Keep the unpublished syft v1.53.0 from being proposed again
- Update dependency flux-schema-plugin to v0.15.0
- Update dependency syft to v1.54.0
- Drop helm from the shared-direct mirror
- Bump kure to v0.2.0-beta.15
CI
- Add the Release / State dispatch workflow
Document Format
- Close the typed-nil holes in the cilium and auto-synthesis netpol parsers
- Reject cilium-networkpolicy documents without rules or endpointSelector
- Add the kind-named service component
- Refuse a service component name that is not a valid Service name
- Admit the scaler trait on deployment
- Add the topology-spread trait for any Deployment
- Check the topology-spread selector at every replica count
- Accept the engine-owned scope on a topology-spread trait
- Refuse a topology-spread capability rendering at profile evaluation
- List the topology-spread trait in the kurel-package trait table
- Default podFailurePolicy onPodConditions status to True
- Say onPodConditions status defaults when absent or null
- Reject networkpolicy peers the API server refuses
- Read every Go integer kind in the property readers, refuse what does not fit
- Refuse a wrapped maxSize and out-of-range ports; report overflow as a range error
- Reject postgresql documents with wrongly typed optional properties
- Read typed-nil postgresql scalars as omitted
- Close the remaining typed-nil holes in pkg/oam parsers
- Give typed nils the untyped answer in the remaining trait parsers
- Refuse typed-nil list entries with the untyped message in the remaining readers
- Add opt-in force-replace trait for immutable-field updates
- Add a Types union to PropertySchema for int-or-string and quantity leaves
- Type the service kind’s targetPort as the integer/string union
- Support raw block volumes (volumeMode: Block)
- Refuse volume names a raw block device already uses
- Refuse claim-template name and mountPath collisions on statefulset
- Validate Service names as DNS-1035 labels in webservice, daemonset and statefulset
- Refuse an empty postgresql version
- Add opt-in wait and healthChecks to the oci component’s Kustomization
- Correct the oci healthChecks apiVersion and opt-in wording
- Forward every resource name onto the postgresql Cluster
- Refuse hugepages without cpu or memory on postgresql and podResources
- Add the kind-named helmrelease component
- Omit the helmrelease values ConfigMap app label past 63 characters
- Skip the auto health check for a suspended helmrelease
- Refuse worker documents whose affinity topologyKey or nodeSelector is not valid label syntax
- Project component names over 63 characters onto a valid app label value
- Project the helmrelease values ConfigMap app label past 63 characters
- Add the kind-named helmtemplate component
- Add the kind-named Flux source components
- Check the registry and bucket host Flux actually contacts
- Refuse an Amazon S3 bucket endpoint under a registry allowlist
- Refuse an oci or helmchart interval that truncates to zero or bypasses the handler
- Refuse an invalid Flux interval on helmrelease and the source components, and a wrongly typed helmchart property
- Refuse a truncating Flux interval Go code sets with a named string type
- Refuse a wrongly typed helmchart valuesMode
- Refuse a wrongly typed helmchart source or source field
- Accept a reserved component value a schema-declaring rule writes, reject one a document rule would drop
- Reject a reserved value a schema-less trait rule copies out of a sealed trait
- Reject a reserved value a schema-declaring trait rule copies out of a sealed trait
- Keep every component a document lowering rule emits authored
- State the inherited and forwarded cases in the createApplications exemption comment
- Name the unsealed-trait condition in the createApplications exemption comment
- Accept array and object kurel parameters, substituted as a whole YAML node
- Keep the anchor on a substituted node and refuse an array or object parameter in a string default
- Refuse a typed-nil structured value and stop blaming –set for every string
- Add the EnvironmentSet document (environments.yaml) and kurel build –environment
- Require Application and raw-document namespaces to be DNS-1123 labels
- Refuse reconciliation policy durations Flux rejects once emitted
- Install a native helmchart release built under a Flux namespace into the application namespace
- Refuse a reserved component property a lowering rule emits as null
- Check a rule’s whole emission for reserved keys before validating any of it
- Check authored components for reserved keys at the start of every lowering round
- A multi-tier Application’s tier umbrella Kustomization no longer sets wait
- Add the cnpg-cluster component, a full CloudNativePG Cluster projection
- Describe the operator custom-resource component pattern
- Refuse app.yaml documents that set a platform-reserved trait property a lowering rule copies as null or drops
- Refuse postgresql and cnpg-cluster documents with non-positive storage sizes or replicas 0
- Refuse a platform-reserved property set inside an array item, or authored as a nested null
- Keep Transform’s exemptions and document naming in the authored reservation check
- Add the role-named helm component type to the v1alpha1 Application, lowered to the kind-named Flux terminals
- Add cnpg-pooler, cnpg-database and cnpg-objectstore kind components
- Refuse postgresql names CloudNativePG cannot give a Cluster
- Deprecate the helmchart component type in favour of helm
- Accept a ports list on the deployment component in app.yaml
- Refuse an empty deployment port protocol in app.yaml, as its schema does
- Point the postgresql WAL-archiver entry at the barman-cloud plugin and carry serverName there
- Refuse two applications of one document generating the same object
- State the real reason pod priority and overhead are refused
- Refuse a container port name repeated across the pod in app.yaml
- Refuse a postgresql managed role’s connectionLimit: 0
- Refuse a zero managed-role connectionLimit in postgresql Generate too
- Refuse an authored empty ensure on a cnpg-database schema, extension, fdw or server
- Copy the chart layer of a helmchart OCI source and stop sharing it with oci
- Lower postgresql onto the cnpg kind components, changing app.yaml output layout
- Forward postgresql’s traits to every member and order a pooler-named database after the Pooler in app.yaml
- Refuse repeated postgresql database names in app.yaml and bound its placement names
- Refuse a fileKeyRef whose volume is missing or not emptyDir
- Refuse webservice documents whose affinity topologyKey or nodeSelector is not valid label syntax
- Let a helm component in app.yaml reference a GitRepository or Bucket chart source
- Accept a ports list on the daemonset, statefulset, job and cronjob components in app.yaml
- Qualify the named-port refusal note for daemonset and statefulset
- Accept clusterIP None on the service component for a headless Service
- Let a helm component in app.yaml generate an inline GitRepository or Bucket chart source
- Make a helm component in app.yaml redeploy Git/Bucket charts and refuse inline ssh sources
- Refuse a user or token in an inline helm GitRepository URL in app.yaml
- Refuse credentials in an inline helm Bucket endpoint and an unknown provider in app.yaml
- Accept only a plain host and path in an inline helm Git URL or Bucket endpoint in app.yaml
- Refuse an http:// inline helm Bucket endpoint in app.yaml
- Daemonset and statefulset emit no Service and refuse
port - Remove the helmchart component
- Add the helmchart Flux HelmChart source terminal
- Prune-protection and force-replace in app.yaml reach a component’s trait sub-applications
- Refuse an out-of-range port in an inline helm Git URL or Bucket endpoint in app.yaml
- Refuse a user or password in an inline helm chart source url
- Drop the ServiceAccount and claims the pod kinds generate
- Emit helm values ConfigMap through a configmap trait
- Accept a typed valuesFrom list under helm valuesMode: configMap
- Strict-decode a typed valuesFrom list before normalizing it
- Refuse a helmrelease valuesFrom kind Flux does not admit
- Hold helmrelease valuesFrom name, valuesKey and targetPath to the CRD
Documentation
- Record the real cost of the labeled/unlabeled PR trigger
- Strip-ack starts no run, and only docs-skip reads the payload
- Document the optional-field-wrapper guard
- Correct the scaler, statefulset-claim and token-trigger wording
- Scope the peer-shape null wording to the three peer fields
- Record the two-axis type model and the type naming rule in design-gvk
- Classify worker by role, not kind count; name policies as lowering output
- Tighten the two-axis wording against the engine’s behavior
- State the adoption exception wherever collisions are called fatal
- Correct the allocator’s collision key and location in D2
- Constrain emit-or-adopt to terminal shared elements
- Say launcher does not add the force annotation without the trait
- List the force-replace trait in the kurel package guide’s trait catalogue
- Name ValidateAuthoredProperties as the raw-rule trait check
- Replace drifted line citations and correct stale claims
- Correct the remaining stale claims the review found
- Keep built-in terminal types admissible in the D4 settled-pass note
- Describe the traits README as a key-property catalog
- State the daemonset Service-name rule as port > 0
- Bound the surviving null and helper-routing universals
- Bound the nested-null, typed-nil and resource-list claims
- Correct the typed-nil, raw-read and empty-string routing claims
- Stop naming one diagnostic for a null on a raw read
- Qualify the raw-lookup null and resource-quantity null claims
- Exclude the always-written cronjob fields from the presence-gated claim
- Record the helmrelease health-check and build behaviour
- Narrow the oci explicit-registry claims to what the parser does
- State why forwardableTraits marks a copy
- Name DeploymentConfig, not the removed WorkerConfig, as a policy implementer
- Scope the app-label compatibility claim and name worker’s label path
- Scope the component label uniqueness claim to validated Applications
- Say which helmtemplate errors carry the component-type prefix
- A wrongly typed value is an error on a direct Transform call too
- Re-vendor the release guide at go-kure/.github 27e9923
- Document the Deploy Docs slot restriction
- A forwarded component keeps the classification it arrived with
- Point the EnvironmentSet reference in design-gvk at pkg.go.dev
- Link the EnvironmentSet reference to the README on GitHub
- List environments.yaml in the format-scope checklists
- Name artifact directories by bundle, including dependency-policy splits
- Accept a zero duration in the delivery refusal paragraph
- Scope the cnpg-cluster lowering-value claim to what the schema checks
- Qualify bare issue and PR references as go-kure/launcher#N
- Reword two downstream tracker references in the external-secret data shorthand design
- Describe bundle ordering and shared-source ownership in the package README
- State the deployed-first source owner in the SourceDeduplicatable contract
- Update the oci source-owner comment and scope helmchart sharing to native delivery
- Document why oci’s targetNamespace has no default
- Name objects still namespace-less after the artifact’s kustomize build
- Say the deploy step follows the pages checkout, not that it alone can read the token
- Qualify issue references in Go comments, tests and scripts
- Record that postgresql carries serverName on the plugin entry
- Describe the sibling-group hooks on deployment and service
- Make identity ports the condition for the sibling selector switch
- Name DeploymentConfig, not the removed WebserviceConfig, as a policy implementer
- State when the docs deploy refuses to write the root
- Say the slot still deploys when the label no longer ranks highest
- Give the missing-tag deploy failure its own remedy
- Dispatch the deploy retry from the tag it names
- Give the deploy retry every input it needs
- Retry the root write with the highest existing stable tag
- Apply the document-format lifecycle from the first stable release
- State the GA baseline and the pre-GA disclosure rule consistently
- Migration pod replacement and probe port names
- The pod replacement step under a rollingUpdate partition
- Repoint the remaining statefulset Service references
- Repoint the probe-port and port-less daemonset references
- Vendor the shared workflows guide
- Reword the helm rule references to the removed helmchart
- Record helmchart as removed and reused by the HelmChart CR
- A moved external-secret’s namespaced SecretStore must exist in the Flux namespace
- Link the force warning’s attribution limit to its follow-up
- Say the helm values configmap trait is built through the configmap kind
Fixed
- Save Go caches from main only
- Save the docs-build Hugo modules cache from main only
- Keep setup-go’s cache in deploy-docs
- Bring check-pin-impact.sh level with kure’s gate and pin it with hermetic cases
- Hold a service component’s named implicit backend to its first port
- Compare pin impact against the base the PR merges onto
- Scope adoption to one document, digest identities in errors
- Stop sharing label selectors and inherited-metadata maps with generated objects
- Add IntegerInRange and read uintptr as an integer kind
- Report overflow in scaler, certificate and volsync as a range error
- Stop UnreachableJSONFields at a repeated embedded type
- Match owned keys case-insensitively, keep exact numbers, and let encoding/json decide reachability
- Report keys behind unexported embedded pointers, honour encoding/json’s tag-name fallback, and document the per-key contract
- Accept a union value any member validates, and read uintptr as a number
- Run LowerRaws for round 0 only and seal nothing
- Scope LowerRaws error chains to the failing document
- Skip typed-nil objects and report each collision once
- Report fields hidden behind another field in UnreachableJSONFields
- Report rather than panic when the UnreachableJSONFields probe cannot marshal
- Treat a self-decoding root as unprovable in UnreachableJSONFields
- Treat a jsonv2 self-coding root as unprovable in UnreachableJSONFields
- Prepend each release’s changelog section, never regenerate
- Restore published CHANGELOG sections to their release-time text
- Keep a hook-group helmchart layout a directory under an AppFileSingle writer default
- Check an ingress implicit backend’s portName against every kind’s Service port
- Require an explicit registry in oci source urls under an allowlist
- Keep a forwarded trait’s authored Origin.Index behind a rule’s own trait
- Reject components whose projected app label values collide
- Convert rendered chart values to JSON types at decode
- Keep refusing rendered timestamps RFC 3339 cannot express
- Drop an unemittable document that hook grouping drops, instead of failing
- Refuse a rendered document with a non-string top-level key
- Check authored policy properties against their handler’s schema
- Reject a non-string health-check namespace and keep a rejected dependency policy’s edges out
- Refuse a conflicting second placement and durations Flux would reject
- Reject a reconciliation property of the wrong type instead of skipping it
- Read a typed or untyped null as absent in reconciliation and health-check namespace
- Reject an empty dependency rules or dependsOn list
- Drop a dropped-hook document whose metadata has a non-string key
- Keep the raw step on a re-serialization error
- Read an explicit null on the remaining optional properties as omission
- Pin each null test’s wrong-type check to its own refusal
- Keep the key check and empty-selector refusal ahead of a null entry
- Check a hugepage resource name before skipping its null entry
- Refuse interval values Flux rejects in oci and helmchart
- Re-check the docs root at write time via the shared deploy action
- Exempt rule-synthesized components from authored reservation checks
- Pass the release namespace and name to template renders
- Reject trailing documents and empty environment flags
- Reject EnvironmentSet paths that leave the file’s directory
- Resolve symlinks before accepting EnvironmentSet paths
- Make the EnvironmentSet base directory absolute before resolving links
- Check a sealed trait for platform-reserved values unless a checked rule emitted it
- Check every Flux duration field in the form its CRD takes
- Write delivery output for an empty build and validate the OCI flags
- Refuse an –oci-repository registry without a hostname
- Refuse delivery objects that collide with an artifact’s objects
- Check list members for delivery-object collisions
- Refuse an identity shared by two artifacts and an overlong delivery name
- Give collision ownership only to objects Flux applies
- Refuse an artifact kustomize would refuse for a duplicate resource
- Refuse a generated Flux duration outside Flux’s pattern
- Compare a cluster-scoped object without its namespace in the collision check
- Generate each application once in a delivery build
- Refuse a unit name past 253 characters and a registry port outside 1-65535
- Close cnpg-cluster null, authorship and registry gaps
- Read cnpg-cluster properties through their JSON serialization
- Refuse cnpg-cluster values the typed spec would omit
- Refuse only cnpg-cluster zeros the operator would replace
- Refuse cnpg-cluster instances below the CRD minimum of 1
- Refuse cnpg-cluster names and null misspellings CloudNativePG cannot carry
- Repeat the cnpg-cluster name and instances refusals in Generate
- Refuse a cnpg-cluster storage-size policy default that is not a quantity
- Refuse a non-positive cnpg-cluster storage-size policy default
- Refuse a cnpg-cluster resource request above its limit
- Refuse a negative policy cpu/memory default
- Pass deploy-docs dispatch inputs through env and validate them
- Refuse set_latest=true with a dev label before the deploy-docs build
- Emit a shared source from the component deployed first
- Order the tier bundles of a multi-tier application
- Stop persisting the job token in the deploy-docs launcher checkout
- Close three sibling-group gaps
- Refuse a sibling-group member object with no kind
- Name a sibling group’s component and refuse duplicate member trait sub-applications
- Let a placement policy settle a sibling group’s mixed tiers
- Copy a generated OCI chart layer as-is and pin the helm release namespaces in the build test
- Refuse a placement that moves a generated source out of infra, and drop a size hint CodeQL flags
- Refuse a dependency that delays a generated source, and two spellings of one helm key
- Emit admissible cnpg-pooler templates and refuse ObjectStore serverName
- Check cnpg-pooler and cnpg-objectstore resources and cap pooler ephemeral claims
- Refuse cnpg-pooler template ephemeral containers
- Refuse the rest of the pod fields a cnpg-pooler Deployment cannot carry
- Refuse mixed go-kure/.github pins in the merge queue
- Generate a bundle as kure does and tell a same-named trait apart
- Allowlist the GO-2026-6596 false positive on cilium v1.20.2
- Extend postgresql’s placement and dependency policies to every member
- Close three issue-ref guard gaps found in review
- Pass qualified repository names ending in launcher
- Reject ownerless references to any repository
- Ignore URLs, format verbs and nested link targets precisely
- Stop URL stripping at a single quote
- Handle shell trims, indexed verbs and quoted call arguments
- Recognise a document rule’s by-value copy of an authored trait as forwarded
- Keep forwarding marks until a rule’s output is classified, and detach empty slices
- Keep the authored index on a trait a document rule forwards by value
- Stamp a document-forwarded trait with the component it was authored on
- Keep a sibling group’s own pods under its component-label policy
- Keep a sibling group’s routed ports translated on its own pods
- Ignore array trims and starred verbs, catch emphasised refs
- Bound the emphasised-ref pattern like the ownerless one
- Keep scanning array subscripts that hold a #
- Compare a rendered reserved value exactly and refuse a nil intermediate map
- Compare a rendered reserved value by the schema validation applies
- Write a detached copy of a rendered reserved value
- Tell signed zeros apart in a rendered reserved value and correct the schema-less rule docs
- Keep a port-less headless service an owned Service with no routable port
- Count capabilities a lowering rule reads in ConsumedCapabilities
- Keep a manifest source url’s credential out of its errors
- Drop a failed fetch’s cause text and an opaque url from its error
- Name a manifest fetch or read failure by fixed text only
- Name a manifest fetch url by scheme and host only
- Keep a source url’s credential out of every refusal
- Drop an IPv6 zone that holds a bracket from a shown host
- Show a refused url’s host only when it is plainly a host
- Show no host when the userinfo’s @ may sit in IPv6 brackets
- Name no url scheme, and show an ssh host from its raw authority
- Refuse a configmap component over the 1 MiB API size limit
- Trait decorators keep layout intent; traits keep a custom bundle order
- A trait handler that removes an application no longer panics the transform
- Find a trait’s new sub-applications by pointer, not by the bundle’s tail
- Refuse a configmap trait ConfigMap over the 1 MiB API limit
- A sub-application decorator may not change the bundle at all, not just its length
- Match Flux’s force selector and list expansion in the volume warning
- Refuse a configmap trait data key the API server refuses
- Attach a component’s health check to its own application only
- Refuse a sibling group with two pod-running members
- Refuse a trait that replaces or removes a component’s application
- Refuse a trait that renames a component’s application
- Refuse a decorator that renames an application
- Move trait objects a moved Flux object reads into the Flux namespace
- Follow a chart verification Secret when sourceRef names the Flux namespace
- Scope a sibling member’s trait inputs to that member
- Move a certificate trait a moved Flux source reads into the Flux namespace
- Read a typed nil as null at both capability merge sites
- Refuse an uncopyable capability default instead of sharing it
- Read force-applied volumes after the bundle’s patches
- Trace each patched volume to the application that generated it
- Trace patched volumes by an origin tag, not by position
- Tag only the resources kustomize holds, trace envelope members through their envelope
- Build bundle patches untagged, so the force verdict is Flux’s
- Fail a patched build whose result does not serialize, as Flux does
- Read the patched objects from the build’s YAML, as Flux reads them
- Read the patched build with a mirror of Flux’s ReadObjects
- Refuse a trait sub-application’s policy that renames a component’s application
- Refuse a trait or its policy renaming a sibling group member’s application
- Keep a capability rendering’s Go types on both merge sites
- Report the same refused rendering value on every run
- Name a patched force-applied volume by the object it comes from
- Scope the attribution fallback docs, document copy-then-delete
- Read a group sub-application’s name after its policy in the duplicate check
- Refuse a sibling-member rename during the decoration pass
- Name producers that read alike by count in the collision error
- Check a component capability default against the component’s schema
- Merge a capability rendering into nested authored objects
- Check nested Required after the capability rendering is merged
- Refuse a schemaless capability default no trait side validates
Performance
- Take entry names only for an entry with traits
Testing
- Fail on any re-added optional field wrapper
- Cover the wrapper-guard dir scan, a later non-RWX claim and the scaler HPA
- Skip nil generated objects in the topology-spread test helpers
- Pin onPodConditions status null default and explicit values
- Cover later-round adoption and NameOrAdopt refusals
- Pin same-origin conflicting identity as a hard error
- Drop an unnecessary PortNumber conversion flagged by unconvert
- Pin the integer readers without validation in front, and the aliasing fix’s content
- Pin the NetworkPolicy selector copy for match expressions
- Pin postgresql empty enums, pooler envelope in Endpoints, custom query paths
- Pin postgresql empty storageSize and null bootstrap siblings
- Adapt per-document adoption test to round-0 LowerRaws
- Pin worker’s scheduling opinions in a golden fixture
- Re-pin worker-scheduling against the release-1 container shape
- Evaluate whole component selectors in the label invariant
- Validate every component selector and count app labels apart from selectors
- Identify synthesized network policies by name in the label invariant
- Count component lowering rules in the label invariant registry coverage
- Pin the multi-event hook Job acceptance for both helm renders
- Cover the helmtemplate component in the label invariant
- Cover the Flux source components in the label invariant
- Name the url-scheme refusal in the null test comment
- Drop a document-rule fixture that mutated the document it was handed
- Run the dependency delivery fixture through the real policy handler
- Expect the reconciliation policy to refuse a sub-millisecond duration first
- Mark the cnpg-cluster schema-shape switch exhaustive
- Cover cnpg-cluster in the component label invariant
- Pin cnpg-cluster in the tier and health-check registries
- Assert the placement tier edge and refresh the dedup phase reference
- Expect the hierarchical delivery tier Kustomizations to depend on the tier before
- Scope the cnpg-cluster storage-size test comment and cover a walStorage template
- Pin the postgresql endpoint label values at the longest admitted name
- Refuse an in-document collision in a document lowered from a raw one
- Capture postgresql’s published property schema before it becomes a lowering rule
- Pin webservice output for a trait mix and an ingress portName
- Drop a redundant plain-Transform check from the rule-read capability test
- Freeze the helmchart side of the helm parity oracle
- Pin the dot at the values ConfigMap truncation boundary
- Reach the external-backend selector conflicts without the reserved key
- Assert each default-tier row is an explicit map entry
- Pin the force warning for the new claim sources
- Attribute a role claim’s force warning to its sub-application
- Pin the post-policy step copy and policy-refusal contracts
- Require each owner decorator’s annotation on the pvc trait’s claim
- Pin that the force warning’s origin tag reaches no output
- Give two test identifiers generic names
[0.1.0-alpha.23] - 2026-09-25
Added
- Export NewNameAllocator for out-of-package rule drivers
- Add verify-merge to rebuild a PR’s merge ref locally
Build
- Update dependency git-cliff to v2.14.2
- Update dependency golangci-lint to v2.14.0
- Update dependency flux-schema-plugin to v0.14.0
Document Format
- Allow pre-release bug fixes to change v1alpha1 output
- Derive networkpolicy policyTypes from key presence
- Retarget a trait-level serviceName’s netpol allow off the router
- Close init/sidecar container entries and wire their missing fields
- Require a positive PVC size for volumes and the pvc trait
- Reject non-integer and negative replicas on every replica-bearing kind
- Check engine-owned trait properties when a handler declares no schema
- Normalize integer kinds readers cannot assert, reject unsigned overflow
- Reject a nameless env entry instead of dropping it
- Reject a wrongly typed affinity sub-field by name
- Refuse a scaler maxReplicas above 1 beside a non-RWX claim
- Reject a non-string inheritedMetadata label or annotation value
- Reject a non-string postgresql, pooler or connection parameter
- Read a null string-map value as absent, not as a wrong type
- Check networkpolicy label and CIDR content at parse time
- Refuse a dotted component name on every workload kind
Fixed
- Drop the no-op pull_request trigger from the Claude workflow
- Fully qualify the cross-repo issue reference
- Align the local test budget with CI’s 5m
- Stop check-kure-dep-sync turning a full clone shallow
- Extend prune-protection to LayoutAugmenter-added resources
- Deep-copy every value buildPodSpec projects out of the config
- Write named scalar property types back as their plain Go type
- Report a wrongly typed required string as a type error
- Reject a wrongly typed resources property by name
- Reject wrongly typed optional scalars in the handler audit
- Word an out-of-int32-range integer apart from a wrong type
- Accept an Enum member whose null nothing strips
- Keep a value’s typed nil matching an empty Enum member
- Pin the kurel-package example image to a version tag
- State the 63-character label limit in the container-name refusal
- Build kure objects from generated constructors (kure v0.2.0-beta.13)
- Report a missing toolchain or module fetch as not computable
Testing
- Pin non-string rejection of string-typed authored properties
- Guard the statefulset and daemonset aliasing mutators against nil
- Pin rejection of a top-level items array on a non-List kind
- Pin a null nodeSelector value as absent in both affinity readers
- Gate the documentation’s YAML fences on their declared mode
- Accept spaced check markers and refuse unreadable ones
- Pin the strict CIDR reason for a leading-zero ipBlock
- Expand the case environment safely on bash < 4.4
[0.1.0-alpha.22] - 2026-09-18
Added
- Enforce environment policy on container securityContext.capabilities
- Validate generated manifests against flux-schema
- Surface per-app consumed capability keys on the transform result
- Partition template-delivery helmchart output by Helm hook group
- Detect the govulncheck env pin and keep golangci-lint pins in sync
- Gate go-kure/.github pin bumps on their real impact
- Shared pod-level builder with full corev1.PodSpec fidelity
- Project DaemonSetSpec fields onto the daemonset kind
- Add the job component with the full JobSpec surface
- Share the DeploymentSpec surface with webservice and worker
- Project podFailurePolicy onto job and cronjob
- Reject undeclared authored component and trait properties
- Re-vendor the forbidden-terms guard on pin bump
- Adopt kure builder-contract release-1 (go-kure/launcher#361)
Build
- Migrate to Renovate and make the version guard real
- Update toolchain
- Update module golang.org/x/mod to v0.40.0
- Update dependency goreleaser to v2.18.0
- Update module github.com/google/go-containerregistry to v0.22.0
- Update dependency syft to v1.51.1
- Update dependency golangci-lint to v2.13.2
- Update dependency flux2 to v2.9.5
- Update dependency go to v1.26.7
- Update dependency git-cliff to v2.14.1
- Update module google.golang.org/grpc to v1.83.1 [security]
- Update module golang.org/x/crypto to v0.56.0 [security]
- Update module github.com/google/go-containerregistry to v0.22.1
- Update dependency goreleaser to v2.18.1
- Bump Go to 1.26.8
- Update module golang.org/x/mod to v0.41.0
- Update module google.golang.org/grpc to v1.83.2 [security]
- Update dependency hugo to v0.166.0
- Update module golang.org/x/vuln to v1.8.0
- Update dependency flux-schema-plugin to v0.13.0
- Update dependency goreleaser to v2.18.2
- Update dependency syft to v1.52.0
CI
- Allow manual re-publish of an existing tag
- Guard dispatch ref and correct the re-run recovery guidance
- Refuse a dispatch over a live release, split the rerun rows
- Serialize the wrapper, bound the re-run rows, flag docs rollback
- Probe for an existing release on re-attempts, not just dispatches
Document Format
- Enforce policy and support securityContext on init/sidecar containers
- Externalize helmchart values via configMap valuesMode
- Preserve ConfigMap-name uniqueness under truncation; reclassify changelog
- Document configMap-mode reconciliation timing
- Drop hand-written CHANGELOG entry, clarify README
- Complete cronjob CronJobSpec/JobSpec projection
- Document cronjob’s CronJobSpec/JobSpec fields
- Validate pod-level names and gate privileged pod fields
- Pod-level cross-field rules for host namespaces, IPs and UIDs
- Stop declaring a string type on the rolling-update knobs
- Cite the strict-parsing contract behind the selector rejection
- Project the StatefulSetSpec fields onto the statefulset kind
- Project the full PersistentVolumeClaimSpec onto volumeClaimTemplates
- Infer the update-strategy type and close three claim-spec gaps
- Add the kind-named deployment component
- Publish raw affinity, tolerations and topologySpreadConstraints on deployment
- Complete the corev1.Toleration projection
- Pin the raw scheduling projection and state the daemonset break
Documentation
- Correct design.md overclaims and cross-repo issue refs
- Correct template-delivery release-identity wording
- Add AI agent gates (A1-A7) section
- Correct README claims superseded by the capability/divisor enforcement fix
- Fix inaccurate zero-divisor test comment
- Record pkg/patch disposition as a standalone post-generation library
- Address codex review on #308
- Mark package composition as deferred in the Helm comparison
- Drop the cross-package composability overstatement and the universal-typed claim
- Stop implying PropertySchemaProvider closes the typing gap; name lowering rules
- Add missing ContainerCapabilities field to policy struct example
- Add type-name covenant and document-format lifecycle
- Fix covenant/lifecycle accuracy issues from round-1 review
- Fix remaining accuracy and gate-A7 issues from round-2 review
- Fix CapabilityDefinition scope (trait-only, not component)
- Correct PATH-ordering troubleshooting note for pinned golangci-lint
- Clarify why –output’s path is exempt from the CLI Safety path-escape rule
- Correct README errors.As exception list
- Document helmchart valuesMode configMap externalization
- Document kurel build’s LayoutAugmenter rejection
- Document PolicyResult.ConsumedCapabilities (#290)
- Document LayoutAugmentationCoverage and hook-group partitioning
- Drop review-process provenance from durable comments
- Describe the sync-go-version.sh mechanism
- Explain strip-ack/rerun gotcha on pin-impact-ack
- Note the strip-ack rerun gotcha in the pin-impact-ack section
- Fix pin-impact-ack rerun gotcha wording (synchronize/reopened + fork scoping)
- Align the LowerRaws and loweringDoc comments with pair dispatch
- Document ServiceAccountNamer and the rbac trait’s binding subject
- State the config-name/application-name invariant
- Correct why each stricter daemonset rule is stricter
- Drop the cross-package README link the site link check rejects
- Reattach the parseDeploymentIntOrPercent doc comment
- Note that trait-level serviceName and netpol synthesis do not compose
- Correct the last two workload-kind counts, and guard them
- Say where null-as-omission stops, and pin the boundary
- Qualify the bare issue references in the nested-null test
- Stop claiming what the controller does with a paused deployment
- Record why the run-to-completion kinds carry no auto health check
- Finish the six-to-seven count migration and widen its guard
- Correct the job force-replace workaround, which did not work
- Name the three kinds instead of counting them
- Stop claiming these kinds refused the five keys before
- Correct four prose claims about the authored-properties check
- Stop the schemaVersion aside from restating the additive test short a conjunct
- Correct the engineTraitProperties note on what expose/ingress/httproute did before
- Correct four inaccurate claims in the components README
- Bound two more claims the parser fix left unsupported
- Drop a wrong kind count from the parseAffinity test comment
- Replace the parseStringField convention universal with the exceptions
- Correct the securityContext policy-hook claim
- Scope the container securityContext policy claim
- Detect partial publishes and cover post-publication recovery
- Key the completeness check on the tag, drop the scripted deletion
- Use the goreleaser job conclusion as the completion oracle
- Pin the attempt, key on not-success, state two limits
- Let the command flag carried-over job rows
- Find the attempt that ran goreleaser, not the latest
- Require positive release ownership; correct the runner label
- Replace the partial-publish deletion branch with escalation
- Split transient re-run recovery, document the docs-deploy race
- Close the –failed class by enumeration, add the guard-failure row
- Correct two more statements of the guard’s old trigger condition
- Wait for the corrective docs deploy, not just the recovered one
- Replace false universal wrong-type claims with per-parser ones
- Narrow the new wrong-type disclaimer’s own blanket claim
- Don’t overstate null-affinity as ’nothing is enabled’ (codex round 2)
- Scope the passthrough IsList residual to zero in-repo producers
- Fix three wording nits found by codex round 2 confirm
- Describe IsNullValue as the nil predicate it is
- Scope npPortNumber’s accepted-types claim to builtins only
- Give bare F33/F36/round identifiers descriptive subjects
- State the aliasing test’s boundary and cite #425
- Drop the wrong direction count from the daemonset summary
- Name the two surfaces the null contract does not bind
- Stop optionalInt64’s comment asserting what #394 removes
- Close out the remaining stale null/shape-check claims
- Sync mapped docs with the kure release-1 builder contract
- Describe a conflicting same-source scopeOverrides CRD as rejected
Fixed
- Sync vendored downstream-references guard, cover config files
- Pin downstream-references gate and drift-check to one commit
- Retype renderChart seam for kure’s variadic RenderChart
- Pin the guard drift-check ref to the bumped action digest
- Add missing enforceCapabilities calls and reject zero divisors
- Revert enforceCapabilities addition, fix stale divisor comment
- Pin the guard drift-check ref to the bumped action digest
- Derive the guard drift-check ref from the action pin, not a copy
- Fully qualify the PR reference, survive errexit on a missing pin
- Enforce resource maxima against intrinsic workload defaults
- Resolve follow-up-issue TODO, skip enforcement when no maxima set, widen output-unchanged assertions
- Reject every capability when forbidden list contains ALL
- Reconcile capabilities enforcement docs, qualify issue reference
- Resolve golangci-lint version drift between mise.toml and the Makefile/CI pins
- Use the canonical golangci-lint install.sh URL
- Enforce pinned golangci-lint version; correct gosec rule ID in nolint
- Don’t mask a failed golangci-lint install behind a piped shell
- Set TypeMeta on values ConfigMap and stop wrapping template delivery
- Don’t reject template delivery on inherited valuesMode default
- Reject kurel-build components needing layout-level resources
- Fail loudly when flux CLI or plugin list fails in validate-manifests
- Reword downstream-consumer references caught by check-forbidden-terms
- Correct hook-ordering wording; modernize new code
- Harden hook-group coverage test, fallback pin, and docs
- Normalize multi-event helm.sh/hook annotations before hook-group split
- Drop excluded hook tokens from mixed excluded+custom annotations
- Don’t drop degenerate comma-only hook annotations; fix stale citations
- Harden parity scripts and the govulncheck marker regex
- Widen tool-version pin-detection regexes to any formatting
- Use the same regex for ci.yml count and value extraction
- Sync tool-version-parity docs and precommit gate
- Anchor govulncheck doc-sync extraction to the correct occurrence
- Wire govulncheck doc check into CI, harden checker and syncer
- Doc-sync gaps and CI_VAL whitespace trim for govulncheck checks
- Sed -i -E portability + DEVELOPMENT.md doc-sync gaps
- Tolerate trailing whitespace on the ci.yml pin line; fold golangci-lint recovery instructions into all synced files
- Scope the govulncheck-docs rule to its own customManager
- Strip trailing whitespace from Makefile golangci-lint pin
- Reject duplicate golangci-lint source pins in mise.toml
- Tolerate mise.toml = spacing in duplicate-pin guard
- Tolerate TOML single-quote pins; align syncer’s mise parser with the checker
- Scope mise.toml pin matching to [tools]; guard syncer against duplicate pins
- Tolerate whitespace around the [tools] table header
- Recognize TOML quoted-key [tools] table headers
- Stop the pin-impact gate silently swallowing its own exit code
- Guard –old/–new argument parsing and non-ahead compares
- Add pin-impact-ack override, harden multi-step/dot-segment gaps
- Recognize uses:/run: written as the step’s first YAML key
- Rerun pin-impact on label change, detect compound-line source
- Scan .yaml workflows too, reject mixed deps in one run block
- Bind pin-impact-ack to the reviewed head SHA
- Skip label mutation on fork PRs, fix token auth, use immutable base SHA
- Fail closed on ack-strip failure, cover reopened PRs, tighten perms
- Wire go.mod/versions.yaml/README badge into the mise-sync postUpgradeTasks
- Anchor go.mod’s go-directive sed on content, not line number
- Sync go.mod’s go directive across all three modules
- Drop dead self-substitution sed, harden go.mod directive sync
- Widen go-version postUpgradeTasks fileFilters to every workflow file
- Wire sync-versions.sh generate into the go-version postUpgradeTasks chain
- Sed portability, AGENTS.md sync, and nested go.mod path-filter coverage
- Fail loudly when AGENTS.md is missing in check-go-version
- Commit the generated compatibility.md instead of leaving it untracked
- Let a raw document lowering rule claim its own apiVersion
- Scope a raw rule’s settled apiVersion to its own seed
- Bind a raw seed’s settle group to the registry key that matched
- Spell the raw apiVersion hook RawDocumentAPIVersion, not APIVersion
- Pre-reserve pass-through Applications by API group, not full apiVersion
- Enforce the PodSpec.OS contract and close the podResources object
- Address review round on the shared pod builder
- Forward ServiceAccountNamer and keep Windows pods legal
- Single-source the ServiceAccount identity across the workload kinds
- Synthesize gateway rules from the hostnames shorthand
- Stop claiming upstream parity for two stricter daemonset rules
- Give every generated object its own label map
- Tighten claim-spec validation and pin nested schema parity
- Reject a signed maxUnavailable percentage
- Close a MaxStorageSize bypass and three silent-acceptance gaps
- Close the claim resource-list schema to storage
- Reject non-string name, size and mountPath on claim entries
- Treat a null volumeClaimTemplates as absence, not a type error
- Read an explicit null as omission on every optional field added here
- Classify a typed nil as null, and read null lists as absence
- Read an explicit null storage quantity as omitted
- Deep-copy projected spec values instead of aliasing the config
- Compare both defaulted halves of the deadline rule, and check replicas
- Admit the deployment kind through the parser and the health-check map
- Qualify issue references and harden two test assertions
- Read an explicit null as omission on every deployment-spec field
- Read every top-level null as omission, bound both rolling-update percentages
- Read a claim’s whole access-mode set in the non-RWX guard
- Deep-copy the deployment’s projected spec values
- Skip the auto health check when a deployment is paused
- Make the maxFailedIndexes Indexed-mode refusal reachable
- Refuse the two job values that were read as omissions
- Make job reachable from the traits it is allowed to carry
- Refuse the empty podReplacementPolicy the parser was dropping
- Refuse the cronjob keys a retyped job document leaves behind
- Wait on the job, since kstatus can read one
- Stop the job from dropping a template and waiting on a paused one
- Refuse the dotted job name that admission would reject
- Accept the engine-read
scopeproperty on every authored trait - Reject a property authored with the wrong container type
- Drop the spec-level traits key that made the quickstart unparseable
- Guard the test job’s build-essential install with command -v
- Guard on make as well as gcc, and qualify the issue reference
- The guard’s message must not claim publication succeeded
- Probe the release on every path, fail closed on an undetermined answer
- Retry the release probe, and stop the waiver claiming more than it can
- Read an explicit null as absence in every components parser
- Read an explicit null as absence in the six comma-ok parsers
- Re-point the inherited optional* call sites at their delegates
- Route remaining null-omission checks through authoredValue
- Cite the issue that actually tracks the parseAffinity sub-fields
- Close the capability type switch and read a null rendering as absent
- Type-check a declared default on the Go-built path too
- Address codex round-1 review findings for #431 null contract
- Reject a mistyped postgresql affinity block instead of discarding it
- Close the null and nodeSelector holes in postgresql affinity
- Report the lowest-sorted bad map key, not whichever one iteration reaches
- Follow #444’s optional*-wrapper removal in postgresql affinity
- PodAntiAffinityType null must be absence too (codex round 1)
- Reject a list-shaped passthrough object
- Reject passthrough envelopes with a null items, and freeze the validated object
- Make the passthrough list rejection binding, and finish the freeze
- Validate the emitted passthrough body in one place
- Scope the null-items rejection to List-suffixed kinds, and fix nil-slice freeze (codex round 1)
- Read a null NetworkPolicy peer selector as absent, not as empty
- Reject a null NetworkPolicy peer envelope
- Stop a null ingress/egress satisfying the joint requirement
- Reject a null ingress/egress rule element
- Reject a malformed peer selector instead of widening it
- Reject a null matchLabels value instead of rendering “”
- Reject a malformed NetworkPolicy key or label value, don’t widen
- Reject a wrong-typed protocol and a lossy numeric port
- Classify NetworkPolicy label values by reflect.Kind, not exact type
- Classify NetworkPolicy port numbers by reflect.Kind too
- Declare the NetworkPolicy port schema instead of leaving it open
- Classify NetworkPolicy port-name and protocol by reflect.Kind
- Scan matchExpressions for matchLabelKeys clashes
- Reject mistyped tolerations, copy projected scheduling
- Reject scheduling shapes the apiserver refuses
- Read a nested null in a toleration entry as omission
- Close the admission and schema gaps the last fix left open
- Require matchFields values, make the parity guard bidirectional
- Normalize an emitted explicit null, and close two escapes in the matchFields parity guard
- Strip an emitted null unconditionally, without a PlatformReserved exception
- State the null contract and align its readers
- Narrow the Enum rule and reach the null guard past a missing Items
- Key the built-in Enum check to the rule the validator enforces
- Correct the tolerationSeconds row’s compatibility class and close the daemonset coverage gap
- Finish the optional*-to-parse* rename after the #440 rebase
- Restore authored-null handling, add matchLabelKeys/mismatchLabelKeys overlap check
- Validate required node-affinity label values, not preferred
- Close three defects the release-1 contract adoption exposed
- Stop an override outvoting a bundled CRD, and a panic at emission
- Reject an authored namespace on a cluster-scoped manifest or CRD
Testing
- Rename derived-memory-limit test to match what it proves
- Cover PatchError.Error() and Unwrap; fix patch README claim
- Cover helmchart valuesMode: configMap and its LayoutAugmenter wrapper
- Fix dot-boundary index in ConfigMap-name truncation test
- Cover PolicyResult.ConsumedCapabilities
- Cover hook-group partitioning, DNS-1123 safety, and coverage predicate
- Cover coverage-forward, prune-protection e2e, and fail-closed guard
- Pin grouping-key oracles; drop bare plan-step references
- Cover cronjob CronJobSpec/JobSpec fields and widened schedule
- Assert full unrecognized-key messages
- Assert hostnames survive alongside authored gateway rules
- Cover the generated claim spec end to end
- Pin three guards that survived deletion
- Observe every nested unknown-key guard on a claim entry
- Rename the claim-schema walker after a post-rebase collision
- Pin the shared non-RWX guard’s effect on the older kinds
- Fail rather than panic on an unset replicas pointer
- Pin that the non-RWX strategy guard survives scale-to-zero
- Fail rather than panic in the deployment aliasing mutator
- Pin worker’s topology spread under a non-noop policy
- Close three oracle gaps in the worker scheduling tests
- Pin whole scheduling objects, not field subsets
- Correct two over-broad scope claims in scheduling test comments
- Record the cross-PR cleanup where the next reader will hit it
- Pin IsNullValue directly, including the shapes nothing reached
- Pin that an absent NetworkPolicy port key errors, not panics
- Walk all four schemaPodSpec flag combinations in the ordering guard
- Pin the half of the Lt/Gt check no test could reach
- Guard the second-render index in the aliasing control
- Guard the new preferred-affinity test before indexing
[0.1.0-alpha.21] - 2026-08-21
Added
- External-secret envFrom and mountPath workload injection
- Validate external-secret envFrom keys and mountPath volume name
- Lowering engine core, property validator, extension channel, PlatformReserved
- Expose as a registered lowering rule
- Add ContractDescriber optional interface and HandlerContracts accessor
- Record lowering-rule identity in Origin.Rule
- Shared full-fidelity pod/container schema for builtin components
Build
- Bump Go to 1.26.6 for stdlib CVE fixes
CI
- Add merge_group trigger to pr-review.yml
- Run checks + AI review on draft PRs (GitLab mr-review parity)
- Bump govulncheck to v1.7.0 and pin it via workflow env
- Reword the govulncheck pin comment to drop downstream names
Changed
- Use the shared govulncheck gate
Dependencies
- Group the cloudnative-pg and controlplaneio-fluxcd modules
- Bump github.com/google/go-containerregistry
Documentation
- Document the doc-sync composite actions in docs-build/doc-gate
- Document and demonstrate external-secret workload injection
- Document mount-path collision rejection, fix stale line citation
- Specify raw-document entry point for lowering engine
- Stop citing spike-only TransformAll as current-branch fact
- Document the lowering engine’s public API in package READMEs
- Stop scoping emitted-property validation to schema-declaring rules
- Drop dangling cross-reference to untracked review notes
- Fix stale ExposeHandler/RenderingSchema references in design-capability-schema.md
- Fix two stale references caught by scoped wave-2 re-review
- Sync pkg/oam doc comment with lowering engine scope
- Fix stale RegisterTraitLowering reference for built-in expose
- Document ExposeRendering.NetworkPolicy (doc-gate fix)
- Document NameAllocator namespace scoping and LowerRaws metadata validation
- Correct round-13’s forwarded-trait claim, document two deferred gaps
- Document ContractDescriber, HandlerContracts, and Origin.Rule
- Correct “engine never reads” claim re: ContractMetadata.Version
- Document Origin.Rule’s forwarded-element exception
- Qualify draft-review claim on rollout dependency (codex confirm-round, wording)
- Correct the go.work ignore rationale
Fixed
- Consume canonical doc-sync scripts from go-kure/.github
- Trigger CI on ready_for_review so draft-gated jobs actually run
- Forward service interfaces through trait decorators
- Reject mistyped envFrom/mountPath and close asymmetric volume collision
- Forward LayoutAugmenter conditionally, reject mount-path collisions
- Stop claiming applyTraits already enforces PlatformReserved
- Correct policy-ordering, schema-parity, and PlatformReserved gaps in expose lowering
- Close final-review gaps in hostname-wildcard reservation, lowering-rule registration, and docs
- Make handler/lowering-rule collision checks reciprocal
- Preserve stamped origin across a second lowering round
- Stop validateSettled dropping registered custom trait handlers
- Catch a same-round sibling name collision in NameAllocator
- Reject an empty Kind() at document-lowering registration
- Enforce AdditionalProperties on an object field with no sub-schema
- Exempt built-in trait-lowering rules from CapabilityDefinition
- Admit registered component handlers during settled validation
- Publish component-lowering schemas alongside trait rules
- Skip capability re-merge for sealed traits in lowering-rule dispatch
- Write normalized collection values back onto validated properties
- Defer trait-component restrictions for lowerable component types
- Gate LowerRaws dispatch on apiVersion, not kind alone
- Record every emitted sibling in LoweringStep.To; reject cross-round name reuse
- Namespace-scoped raw dedup, sealed nested traits, lowerable-type leak, NaN/Inf rejection
- Accept networkPolicy under the expose capability’s rendering
- Scope NameAllocator reservations by namespace
- Validate claimed raw document metadata before lowering
- Support annotations on the httproute trait
- Don’t seal traits a component rule merely forwards
- Give a chain of exactly MaxLoweringDepth-1 expansions room to settle
- Enforce strict-capabilities’ missing-CapabilityDefinition check for lowering rules
- Apply CapabilityDefinition schema to lowering rules without VAD
- Enforce lowering-rule PropertySchema on emitted intermediate components/traits
- Reserve pass-through document identities against LowerRaws collision detection
- Scope pass-through identity reservation to the terminal kind
- Close five round-9 Codex gaps in the lowering engine
- Seal document-rule nested traits, validate policy lowering-rule schemas
- Stamp nested document-rule output, reserve expose gateway fields
- Seal raw-entry nested traits, defer trait validation past forwarding
- Re-vendor check-forbidden-terms.sh to canonical
- Correct rule-class label and forwarded-component Rule stamping
- Preserve Origin.Rule on document-forwarded policies
- Reuse the computed rule identity in LoweringStep, not a rebuilt one
- Keep ready_for_review in pr-review caller (A6 finding)
- Make resources/securityContext/env full-fidelity per round-2 review
- Reject unsupported postgresql resource names, fix stale docs
- Reject 6 more admission-invalid values instead of accepting them
- Fix 4 more admission-invalid gaps, revert numeric-quantity rejection
- Validate extended-resource quantities, resourceFieldRef prefix, fileKeyRef path, and lifecycle exec args
- Validate env fieldRef paths, resourceFieldRef selectors, and envFrom object names
- Reject 4 more contradictory/unsafe security-context and resource inputs
- Reject 5 more silently-dropped or overcommit-invalid inputs
- Wire CronJob volumes for fileKeyRef, reject non-bool hardening flags
- Reject standard-resource request>limit and empty httpGet paths
- Reject 15+ more silently-typed fields, fix httpGet.path regression
- Reject 4 more silently-wrong-type array/scalar fields
- Reject mistyped securityContext/workingDir, document fileKeyRef gap
- Reject mistyped nested securityContext profiles and envFrom prefix
- Reject mistyped lifecycle object and non-string procMount
- Enforce probe bounds and reject unresolvable named ports
- Correct 5 findings from wave-12 review of PR #284
- Correct 3 findings from wave-13 review of PR #284
- Correct 2 findings from wave-14 review of PR #284
- Correct 2 findings from wave-15 review of PR #284
- Correct 2 findings from wave-16 review of PR #284
- Correct 4 findings from wave-17 review of PR #284
- Correct 3 findings from wave-18 review of PR #284
- Correct 3 findings from wave-19 review of PR #284
- Correct 6 findings from wave-20 review of PR #284
- Correct wave-21 bot finding, plus 9 self-found unknown-key siblings
- Reject unknown resourceFieldRef/envFrom-ref keys, correct fileKeyRef doc
- Reject unknown keys and malformed types across remaining valueFrom/pvc/lifecycle fields
- Qualify generated PVC object names by component to avoid collisions
- Reject RWOP+other-modes and CAP_SYS_ADMIN+no-escalation, preserve explicit empty storageClass
- Reject malformed accessModes/storageClass, close per-type volume field sets, fix PVC re-qualification
- Make qualified PVC names collision-free across hyphenated component/volume names
- Validate qualified PVC names against DNS-1123 limits
Testing
- Cover F5 capability-def schema defaults for trait-lowering rules
- Cover ContractDescriber/HandlerContracts and Origin.Rule identity
- Fix vacuous assertion in untouched-component rule-identity test
[0.1.0-alpha.20] - 2026-08-03
Dependencies
- Bump oras.land/oras-go/v2 from 2.6.1 to 2.6.2
- Bump kure to v0.2.0-beta.8 with shared dependency updates
Fixed
- Bump grpc to v1.82.1 for GO-2026-6061
- Decode raw Cilium rules strictly; bump kure to v0.2.0-beta.9
[0.1.0-alpha.19] - 2026-07-15
Added
- Synthesize ingress allows for external routing backends via explicit selector
Fixed
- Distinct resource names for multi-endpoint endpoint-ingress policies
- Resolve #227 backendRef retargeting across dependency/tier bundles
- Only register components that own a Service as backendRef targets
[0.1.0-alpha.18] - 2026-07-14
Added
- Implement EndpointProvider on webservice
- Postgresql pooler EndpointProvider + per-endpoint NP naming
- Derive ingress-synthesis target from expose backendRefs
Changed
- Tighten builtin rbac and flux patch schemas
- Adopt shared check-forbidden-terms action for scan parity
Fixed
- Scrub downstream references from generated notes
- Scan full tree for downstream refs on PRs (PR/merge-queue parity)
- Fail fast on invalid egress peers
- Preflight downstream-reference guard before every CI push
[0.1.0-alpha.17] - 2026-07-13
Added
- Target the platform component label in synthesized NetworkPolicies
- Parametrize the platform label/annotation domain (default gokure.dev)
- Guard against launcher leading kure on shared direct deps
- Add EndpointProvider and endpoint-ingress NetworkPolicy synthesis
CI
- Enforce no-downstream-references guard and document the rule
Changed
- Genericize downstream references in comments, READMEs, fixtures
Dependencies
- Bump go-kure/kure to v0.2.0-beta.7 and align shared deps
Documentation
- Genericize downstream references in design docs
Fixed
- Run tag-collision checks in preview + guard next dev version
- Publish external-secret shorthand design doc and fix traits link
- Harden kure-dep-sync guard per PR review
- Always refresh remote-tracking base ref in kure-dep-sync guard
[0.1.0-alpha.16] - 2026-07-11
Added
- Accept storageClassName + volumeSnapshotClassName via capability rendering
- Synthesize per-component egress NetworkPolicy from a non-authorable input
[0.1.0-alpha.15] - 2026-07-10
Changed
- Unify schema vocabulary on PropertySchema
- Preserve YAML aliases and validate schema keys
Fixed
- Make unsupported-field error name the correct allow-set
Testing
- Cover param aliases and document merge-key rejection
[0.1.0-alpha.14] - 2026-07-09
Added
- Authored secretName override on ingress TLS
[0.1.0-alpha.13] - 2026-07-09
Added
- External-auth (oauth2-proxy) ingress annotations
- Expose ComponentName() accessor on sub-app configs
- External-secret data[] shorthand (derive remoteRef.key + property)
Documentation
- External-secret data[] shorthand design spike
Fixed
- Accept security-context in validTraitTypes
[0.1.0-alpha.12] - 2026-07-08
Added
- Add Description to PropertySchema + populate builtin handler descriptions
- Hostnames shorthand + platform-default ssl-redirect
[0.1.0-alpha.11] - 2026-07-07
Added
- Support privateKey (algorithm/size/rotationPolicy/encoding) in certificate trait
- Consume EnvironmentPolicy storage/scaler defaults in scaler/pvc/postgresql
Documentation
- Document Policy defaults & enforcement in pkg/oam README
[0.1.0-alpha.10] - 2026-07-04
Documentation
- Note capability-injected fields are not user-required in trait schemas
Fixed
- Don’t mark capability-injected fields as user-required in schemas
[0.1.0-alpha.9] - 2026-07-03
Added
- Add PropertySchema() to rc.1 public built-in handlers
Changed
- Give resources requests/limits independent sub-maps
Documentation
- Refresh github-workflows.md Last Updated date
- Note shared handler registration and property schemas
[0.1.0-alpha.8] - 2026-07-02
Added
- Property-schema vocabulary + handler-schema interface
- Platform-managed TLS + hostname validation
- Synthesise parentRefs from capability
- Add prerelease bump scope
Dependencies
- Bump external-secrets/apis to latest pseudo-version
- Bump github.com/cilium/cilium from 1.19.4 to 1.19.5
- Bump github.com/google/go-containerregistry
- Bump github.com/cert-manager/cert-manager
- Bump sigs.k8s.io/gateway-api from 1.5.1 to 1.6.0
- Bump github.com/cloudnative-pg/cloudnative-pg
- Adopt Flux 2.9 API set + kure v0.2.0-beta.6
Documentation
- Note k8s.io/api constant convention
Fixed
- Use k8s.io/api constants for well-known K8s values
Performance
- Source-aware Go build cache, split by job purpose
[0.1.0-alpha.7] - 2026-06-19
Dependencies
- Bump the k8s-ecosystem group across 1 directory with 3 updates
[0.1.0-alpha.6] - 2026-06-19
Added
- Add security-context OAM trait handler
Dependencies
- Bump github.com/cloudnative-pg/plugin-barman-cloud
- Bump github.com/backube/volsync from 0.15.0 to 0.16.0
Documentation
- Reference security-context trait in build command README
Fixed
- Reject non-integral float values in toInt64
[0.1.0-alpha.5] - 2026-06-05
Added
- Add oci component handler
- ScopeOverrides for cluster-scoped CRs without in-source CRD
- Single-source docs map + enforcement tooling; mount existing docs
CI
- Enforce docs sync (check-doc-sync, link-check, doc-gate)
Documentation
- State mandatory documentation-sync rule (Part C cascade)
- Correct backend to claude-max-proxy:3456
- Add per-package READMEs (errors, kurel CLI ref, oam overviews)
- Add section intros, api-reference index, and generator markers
- Refresh AGENTS structure + mark doc-sync enforced
- Publish OAM model + component/trait handler references
- Getting-started narrative + mount capability schema
- Use absolute pkg.go.dev links for cross-package refs
Testing
- Cover oci auto health-check GVK + flux namespace
[0.1.0-alpha.4] - 2026-06-03
Added
- Add crd and manifests component handlers
Build
- Tidy go.mod (promote apiextensions-apiserver to direct)
- Bump Go to 1.26.4 (fixes 3 stdlib vulns) and fold in govulncheck tweaks
CI
- Add merge_group trigger and harden change detection for merge queue
- Cap govulncheck memory (GOMEMLIMIT + -scan package) to avoid runner OOM
Dependencies
- Bump the k8s-ecosystem group across 1 directory with 2 updates
- Bump github.com/go-kure/kure
Fixed
- Build linux-only release artifacts
[0.1.0-alpha.3] - 2026-06-02
Fixed
- Emit the flux namespace for helmchart auto health checks (#234)
[0.1.0-alpha.2] - 2026-05-30
Added
- Restore app parameter on cilium-networkpolicy parseProperties
- Rename daemonset Service port name from tcp to http
- Revert volsync sub-app name to {sourcePVC}-backup
- Accept inline secretStoreRef/provider in external-secret trait
- Add FluxNamespace forwarding for configmap+helmchart combos
[0.1.0-alpha.1] - 2026-05-29
Added
- Certificate trait uses nested issuerRef {name,kind}
- Support scope property for ingress/httproute sub-app naming
- Synthesize per-component allow-ingress NetworkPolicy at cluster post-build
- Parse networkPolicy.trafficSources on ingress/httproute traits
- Add passthrough component for arbitrary objects
- Register passthrough component type
CI
- Redesign release workflows — Create/Promote/Bump/Publish
Dependencies
- Bump kure to v0.2.0-beta.0 and align flux/containerregistry deps
- Bump kure to v0.2.0-beta.3 and align k8s deps
Documentation
- Add README with index, profile guide, and custom-capability explanation
- Document launcher’s intentional kure package boundary
- Document and example the passthrough component
Fixed
- Correct cluster profile issuerRef fields and custom-capability app; support custom traits in parser
- Change default HelmRelease interval from 10m to 60m
- Deep-copy passthrough object so source properties are never mutated
- Upgrade golang.org/x/net to v0.55.0 to address GO-2026-5026
[0.1.0-alpha.0] - 2026-05-22
Added
- Add docs site and versioned release workflow
- Migrate pkg/launcher, pkg/patch, cmd/kurel, pkg/cmd/kurel from kure
- Pkg/errors — ValidationError, ParseError, and error helpers
- Pkg/oam — handler interfaces
- Pkg/oam — ClusterProfile and CapabilityBinding types
- Pkg/oam — Policy interface, Enforceable, NoopPolicy
- Runtime skeleton — Transformer registry and pipeline types (#47)
- Transform pipeline — Transform, TransformWithPolicy, and pipeline stages (#53)
- Built-in webservice, expose, and ingress handlers (partial #48, #49, #50)
- Add build command — OAM vertical slice (#55)
- Add worker, cronjob, daemonset handlers with fixture parity (#48, #54)
- Add statefulset handler and certificate/scaler/pvc traits (#48, #49, #54)
- Add external-secret, configmap, networkpolicy, cilium-networkpolicy, volsync traits (#49, #50)
- Add postgresql component handler (#48)
- Add httproute trait handler and expose gateway dispatch
- Add port field, Service generation, and servicePortProvider to daemonset (#86)
- Rename helmrelease→helmchart, add gitopsEngine to ClusterProfile, implement helmchart handler (#82, #84)
- Add kurel.yaml package descriptor and parameter substitution (#51)
- Implement helmchart delivery: template (#83)
- Allow routing traits on helmchart components via explicit servicePort (#89)
- Add CapabilityDefinition schema for custom trait rendering (#66)
- Port rbac, fluxcd-patches, fluxcd-postbuild, prune-protection traits from the downstream operator (#97 #98 #99 #100)
Build
- Bump kure to v0.2.0-alpha.8; add helmchart template e2e test
CI
- Add AI PR review and Claude Code workflows
- Replace shared workflows with callers to go-kure/.github
- Optimize pipeline — parallel jobs, single test run, Hugo cache, path filtering
- Cancel in-progress runs when new push arrives on same branch
- Drop go build cache, bump timeouts for slow S3 upload
- Force legacy cache API to route through in-cluster cache server
- Rename runner label autops-kube -> autops-kube-kure
- Explicitly set ACTIONS_CACHE_URL in workflow env to override job dispatch
- Switch to ACTIONS_RESULTS_URL for cache routing, fix artifact steps
- Expand workflow path filter and fix coverage comment threshold
Changed
- Rename oam.Policy struct to ApplicationPolicy
Dependencies
- Bump k8s.io/apimachinery from 0.35.3 to 0.36.0
- Bump github.com/go-kure/kure
- Align dependencies with kure main
Documentation
- Add initial design document
- Update module path references from kure to launcher in READMEs
- Add Organization Resources section referencing go-kure/.github
- Add GitHub Actions workflow reference
- Phase 0 design documents for OAM runtime
- Second iteration of Phase 0 OAM design documents
- Record Phase 0 design decisions and close open questions
- Finalize Phase 0 design — trim options docs, complete kurel-package §6, add changelogs
- Add examples covering all Phase 1 component and trait types
- Update design.md to v1.3 — OAM-native architecture
- Design capability schema for built-in and custom handlers
- Fix cluster-profile terminology, narrow universal-scope claim, update deferred ref
Fixed
- Correct import ordering in pkg/cmd/kurel/cmd.go
- Correct import ordering in pkg/launcher test files
- Split kure/launcher import groups for goimports compliance
- Add test to build gate needs to catch skipped cascade on failure
- Guard against empty Hugo version parse from mise.toml
- Add validate to build gate needs so lint failure blocks merge
- Add CHANGELOG.md to check-mounts verification
- Bump Go to 1.26.3 and x/net to v0.53.0
- Remove phantom pkg/errors and pkg/logger from repo tree
- Correct stale GVK references in design-kurel-package.md
- Address final review findings before PR #58 merge
- Enforce Policy capability constraints in pipeline
- Use pkg/errors instead of fmt.Errorf in builtin handlers
- Replace remaining fmt.Errorf in decode.go and expose.go
- Evaluate ClusterProfile capabilities before Transform
- Parse ClusterProfile strictly; reject unknown fields
- Add semantic validation to ParseClusterProfile
- Guard cronjob history limits against int32 overflow
- Promote cert-manager to direct dep; validate PVC access modes
- Reject explicitly empty accessModes list in pvc trait
- Address external-secret shorthand, volsync naming, and coverage
- Preserve decodingStrategy in external-secret remoteRef shorthand
- Align postgresql customQueries validation and bootstrap recovery tests with the downstream operator
- Remove wrong deprecation from ingress/httproute; fix default backend port
- Validate implicit backends; extend ingress with per-path backend override
- Tighten implicit-backend port guards for ingress and httproute
- Tighten parameter coercion validation
- Validate parameter defaults at parse time and coerce plain-string defaults
- Reject map and slice defaults for string parameters at parse time
- Reject invalid interval string in helmchart ToApplicationConfig
- Add actions: read permission to release-create workflow
Testing
- Expand builtin handler coverage to meet 80% threshold
- Document prune-protection narrow scope; strict target validation in fluxcd-patches