diff --git a/CHANGELOG.md b/CHANGELOG.md
index a17455b19..be81e5a93 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,15 @@
 | Date       | Issue | Description                                                                                                        |
 |------------|-------|--------------------------------------------------------------------------------------------------------------------|
+| 2024/02/03 |       | Release 0.28.0                                                                                                     |
+| 2024/01/04 | 2104  | Allow clients to view the ACLs applied to their connections in various utilities                                   |
+| 2024/12/19 | 2101  | Improve shutdown reliability by giving Stream brokers more shutdown grace                                          |
+| 2023/12/18 | 2096  | Allow setting SRV domain using the `CHORIA_SRV_DOMAIN` environment variable                          >             |
+| 2023/12/07 | 2094  | Adds additional utilities to maintain autonomous agent plugin manifests under `choria machine plugins`             |
+| 2023/12/04 |       | Upgrade to NATS Server 2.10.x and updates the embedded `nats` command line                                         |
+| 2023/09/20 | 2077  | Various improvements to audit logging and expose its settings in `choria tool config`                              |
+| 2023/09/07 | 2077  | Allow audit log ownership to be set using `plugin.rpcaudit.logfile.group` and `plugin.rpcaudit.logfile.mode`       |
+| 2023/08/25 | 2079  | Disable `appbuilder` on Windows                                                                                    |
+| 2024/05/04 | 2066  | Allow those who embed Choria Server to get notified when it's ready using `RegisterReadyCallback()`                |
 | 2023/04/24 | 2059  | Support verifying packed plugin specifications in `machine pugins` and `mms`                                       |
 | 2023/04/19 | 2055  | Retry calls to streams that can fail in early election setup                                                       |
 | 2023/04/19 | 2052  | Ensure stream users can access KV and Object stores                                                                |
diff --git a/build/build.go b/build/build.go
index 6a6c6f269..07a0ec458 100644
--- a/build/build.go
+++ b/build/build.go
@@ -1,4 +1,4 @@
-// Copyright (c) 2017-2022, R.I. Pienaar and the Choria Project contributors
+// Copyright (c) 2017-2024, R.I. Pienaar and the Choria Project contributors
 //
 // SPDX-License-Identifier: Apache-2.0
 
@@ -9,7 +9,7 @@ import (
 )
 
 // Version the application version
-var Version = "0.27.0"
+var Version = "0.28.0"
 
 // SHA is the git reference used to build this package
 var SHA = "unknown"
diff --git a/client/aaa_signerclient/action_sign.go b/client/aaa_signerclient/action_sign.go
index 87c7b46db..78f12e9bd 100644
--- a/client/aaa_signerclient/action_sign.go
+++ b/client/aaa_signerclient/action_sign.go
@@ -1,6 +1,6 @@
 // generated code; DO NOT EDIT
 //
-// Client for Choria RPC Agent 'aaa_signer' Version 0.27.0 generated using Choria version 0.27.0
+// Client for Choria RPC Agent 'aaa_signer' Version 0.28.0 generated using Choria version 0.28.0
 
 package aaa_signerclient
 
diff --git a/client/aaa_signerclient/ddl.json b/client/aaa_signerclient/ddl.json
index 8c84c73b7..075992eb5 100644
--- a/client/aaa_signerclient/ddl.json
+++ b/client/aaa_signerclient/ddl.json
@@ -1 +1 @@
-{"$schema":"https://choria.io/schemas/mcorpc/ddl/v1/agent.json","metadata":{"license":"Apache-2.0","author":"R.I.Pienaar \u003crip@devco.net\u003e","timeout":10,"name":"aaa_signer","version":"0.27.0","url":"https://github.com/choria-io/aaasvc","description":"Request Signer for Choria AAA Service","provider":"golang","service":true},"actions":[{"action":"sign","input":{"request":{"prompt":"RPC Request","description":"The request to sign","type":"string","optional":false,"validation":"shellsafe","maxlength":100240},"token":{"prompt":"JWT Token","description":"The JWT token authenticating the user","type":"string","optional":false,"validation":".","maxlength":10024},"signature":{"prompt":"Request Signature","description":"A signature produced using the ed25519 seed of the request, hex encoded","type":"string","optional":false,"validation":".","maxlength":1024}},"output":{"secure_request":{"description":"The signed Secure Request","display_as":"Secure Request","type":"string"}},"display":"always","description":"Signs a RPC Request on behalf of a user"}]}
\ No newline at end of file
+{"$schema":"https://choria.io/schemas/mcorpc/ddl/v1/agent.json","metadata":{"license":"Apache-2.0","author":"R.I.Pienaar \u003crip@devco.net\u003e","timeout":10,"name":"aaa_signer","version":"0.28.0","url":"https://github.com/choria-io/aaasvc","description":"Request Signer for Choria AAA Service","provider":"golang","service":true},"actions":[{"action":"sign","input":{"request":{"prompt":"RPC Request","description":"The request to sign","type":"string","optional":false,"validation":"shellsafe","maxlength":100240},"token":{"prompt":"JWT Token","description":"The JWT token authenticating the user","type":"string","optional":false,"validation":".","maxlength":10024},"signature":{"prompt":"Request Signature","description":"A signature produced using the ed25519 seed of the request, hex encoded","type":"string","optional":false,"validation":".","maxlength":1024}},"output":{"secure_request":{"description":"The signed Secure Request","display_as":"Secure Request","type":"string"}},"display":"always","description":"Signs a RPC Request on behalf of a user"}]}
\ No newline at end of file
diff --git a/client/aaa_signerclient/doc.go b/client/aaa_signerclient/doc.go
index cf752b4b5..1b1957d08 100644
--- a/client/aaa_signerclient/doc.go
+++ b/client/aaa_signerclient/doc.go
@@ -1,8 +1,8 @@
 // generated code; DO NOT EDIT
 //
-// Client for Choria RPC Agent 'aaa_signer' Version 0.27.0 generated using Choria version 0.27.0
+// Client for Choria RPC Agent 'aaa_signer' Version 0.28.0 generated using Choria version 0.28.0
 
-// Package aaa_signerclient is an API client to the Choria Aaa_signer agent Version 0.27.0.
+// Package aaa_signerclient is an API client to the Choria Aaa_signer agent Version 0.28.0.
 //
 // Actions:
 //   - Sign - Signs a RPC Request on behalf of a user
diff --git a/client/choria_provisionclient/action_configure.go b/client/choria_provisionclient/action_configure.go
index c0b15161f..70c24c044 100644
--- a/client/choria_provisionclient/action_configure.go
+++ b/client/choria_provisionclient/action_configure.go
@@ -1,6 +1,6 @@
 // generated code; DO NOT EDIT
 //
-// Client for Choria RPC Agent 'choria_provision' Version 0.27.0 generated using Choria version 0.27.0
+// Client for Choria RPC Agent 'choria_provision' Version 0.28.0 generated using Choria version 0.28.0
 
 package choria_provisionclient
 
diff --git a/client/choria_provisionclient/action_gen25519.go b/client/choria_provisionclient/action_gen25519.go
index e58b491b8..56f59a53d 100644
--- a/client/choria_provisionclient/action_gen25519.go
+++ b/client/choria_provisionclient/action_gen25519.go
@@ -1,6 +1,6 @@
 // generated code; DO NOT EDIT
 //
-// Client for Choria RPC Agent 'choria_provision' Version 0.27.0 generated using Choria version 0.27.0
+// Client for Choria RPC Agent 'choria_provision' Version 0.28.0 generated using Choria version 0.28.0
 
 package choria_provisionclient
 
diff --git a/client/choria_provisionclient/action_gencsr.go b/client/choria_provisionclient/action_gencsr.go
index b8c5404b2..b25606048 100644
--- a/client/choria_provisionclient/action_gencsr.go
+++ b/client/choria_provisionclient/action_gencsr.go
@@ -1,6 +1,6 @@
 // generated code; DO NOT EDIT
 //
-// Client for Choria RPC Agent 'choria_provision' Version 0.27.0 generated using Choria version 0.27.0
+// Client for Choria RPC Agent 'choria_provision' Version 0.28.0 generated using Choria version 0.28.0
 
 package choria_provisionclient
 
diff --git a/client/choria_provisionclient/action_jwt.go b/client/choria_provisionclient/action_jwt.go
index 70d9f57d3..2551f6ccf 100644
--- a/client/choria_provisionclient/action_jwt.go
+++ b/client/choria_provisionclient/action_jwt.go
@@ -1,6 +1,6 @@
 // generated code; DO NOT EDIT
 //
-// Client for Choria RPC Agent 'choria_provision' Version 0.27.0 generated using Choria version 0.27.0
+// Client for Choria RPC Agent 'choria_provision' Version 0.28.0 generated using Choria version 0.28.0
 
 package choria_provisionclient
 
diff --git a/client/choria_provisionclient/action_release_update.go b/client/choria_provisionclient/action_release_update.go
index 22993ad00..822e2e233 100644
--- a/client/choria_provisionclient/action_release_update.go
+++ b/client/choria_provisionclient/action_release_update.go
@@ -1,6 +1,6 @@
 // generated code; DO NOT EDIT
 //
-// Client for Choria RPC Agent 'choria_provision' Version 0.27.0 generated using Choria version 0.27.0
+// Client for Choria RPC Agent 'choria_provision' Version 0.28.0 generated using Choria version 0.28.0
 
 package choria_provisionclient
 
diff --git a/client/choria_provisionclient/action_reprovision.go b/client/choria_provisionclient/action_reprovision.go
index a17684a06..e49908dba 100644
--- a/client/choria_provisionclient/action_reprovision.go
+++ b/client/choria_provisionclient/action_reprovision.go
@@ -1,6 +1,6 @@
 // generated code; DO NOT EDIT
 //
-// Client for Choria RPC Agent 'choria_provision' Version 0.27.0 generated using Choria version 0.27.0
+// Client for Choria RPC Agent 'choria_provision' Version 0.28.0 generated using Choria version 0.28.0
 
 package choria_provisionclient
 
diff --git a/client/choria_provisionclient/action_restart.go b/client/choria_provisionclient/action_restart.go
index 5c23c71d2..83e55ce0d 100644
--- a/client/choria_provisionclient/action_restart.go
+++ b/client/choria_provisionclient/action_restart.go
@@ -1,6 +1,6 @@
 // generated code; DO NOT EDIT
 //
-// Client for Choria RPC Agent 'choria_provision' Version 0.27.0 generated using Choria version 0.27.0
+// Client for Choria RPC Agent 'choria_provision' Version 0.28.0 generated using Choria version 0.28.0
 
 package choria_provisionclient
 
diff --git a/client/choria_provisionclient/action_shutdown.go b/client/choria_provisionclient/action_shutdown.go
index bdff3143c..e9accd725 100644
--- a/client/choria_provisionclient/action_shutdown.go
+++ b/client/choria_provisionclient/action_shutdown.go
@@ -1,6 +1,6 @@
 // generated code; DO NOT EDIT
 //
-// Client for Choria RPC Agent 'choria_provision' Version 0.27.0 generated using Choria version 0.27.0
+// Client for Choria RPC Agent 'choria_provision' Version 0.28.0 generated using Choria version 0.28.0
 
 package choria_provisionclient
 
diff --git a/client/choria_provisionclient/ddl.json b/client/choria_provisionclient/ddl.json
index 6c9d897f6..c61a94500 100644
--- a/client/choria_provisionclient/ddl.json
+++ b/client/choria_provisionclient/ddl.json
@@ -1 +1 @@
-{"$schema":"https://choria.io/schemas/mcorpc/ddl/v1/agent.json","metadata":{"name":"choria_provision","description":"Choria Provisioner","author":"R.I.Pienaar <rip@devco.net>","license":"Apache-2.0","version":"0.27.0","url":"https://choria.io","timeout":20},"actions":[{"action":"configure","input":{"token":{"prompt":"Token","description":"Authentication token to pass to the server","type":"string","default":"","optional":true,"validation":".","maxlength":128},"config":{"prompt":"Configuration","description":"The configuration to apply to this node","type":"string","default":null,"optional":false,"validation":"^{.+}$","maxlength":2048},"certificate":{"prompt":"Certificate","description":"PEM text block for the certificate","type":"string","default":null,"optional":true,"validation":"^-----BEGIN CERTIFICATE-----","maxlength":10240},"ca":{"prompt":"CA Bundle","description":"PEM text block for the CA","type":"string","default":null,"optional":true,"validation":"^-----BEGIN CERTIFICATE-----","maxlength":20480},"ssldir":{"prompt":"SSL Dir","description":"Directory for storing the certificate in","type":"string","default":null,"optional":true,"validation":".","maxlength":500},"key":{"description":"A RSA private key","prompt":"PEM text block for the private key","type":"string","default":null,"optional":true,"validation":"-----BEGIN RSA PRIVATE KEY-----","maxlength":10240},"ecdh_public":{"prompt":"ECDH Public Key","description":"Required when sending a private key","type":"string","default":"","optional":true,"maxlength":64,"validation":"."},"action_policies":{"prompt":"Action Policy Documents","description":"Map of Action Policy documents indexed by file name","type":"hash","default":{},"optional":true},"opa_policies":{"prompt":"Open Policy Agent Policy Documents","description":"Map of Open Policy Agent Policy documents indexed by file name","type":"hash","default":{},"optional":true},"server_jwt":{"description":"JWT file used to identify the server to the broker for ed25519 based authentication","prompt":"Server JWT","type":"string","default":"","optional":true,"maxlength":2048,"validation":"."}},"output":{"message":{"description":"Status message from the Provisioner","display_as":"Message","type":"string","default":null}},"display":"failed","description":"Configure the Choria Server"},{"action":"gen25519","display":"always","description":"Generates a new ED25519 keypair","input":{"token":{"prompt":"Token","description":"Authentication token to pass to the server","type":"string","default":"","optional":false,"validation":".","maxlength":128},"nonce":{"prompt":"Nonce","description":"Single use token to be signed by the private key being generated","type":"string","default":"","optional":false,"validation":".","maxlength":64}},"output":{"public_key":{"description":"The ED255519 public key hex encoded","display_as":"Public Key","type":"string","default":""},"directory":{"description":"The directory where server.key and server.pub is written to","display_as":"Directory","type":"string","default":""},"signature":{"description":"The signature of the nonce made using the new private key, hex encoded","display_as":"Signature","type":"string","default":""}}},{"action":"gencsr","input":{"token":{"prompt":"Token","description":"Authentication token to pass to the server","type":"string","default":"","optional":false,"validation":".","maxlength":128},"cn":{"prompt":"Common Name","description":"The certificate Common Name to place in the CSR","type":"string","default":null,"optional":true,"validation":"^(([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9-]*[a-zA-Z0-9]).)*([A-Za-z0-9]|[A-Za-z0-9][A-Za-z0-9-]*[A-Za-z0-9])$","maxlength":80},"C":{"prompt":"Country","description":"Country Code","type":"string","default":null,"optional":true,"validation":"^[A-Z]{2}$","maxlength":2},"L":{"prompt":"Locality","description":"Locality or municipality (such as city or town name)","type":"string","default":null,"optional":true,"validation":"^[\\w\\s-]+$","maxlength":50},"O":{"prompt":"Organization","description":"Organization","type":"string","default":null,"optional":true,"validation":"^[\\w\\s-]+$","maxlength":50},"OU":{"prompt":"Organizational Unit","description":"Organizational Unit","type":"string","default":null,"optional":true,"validation":"^[\\w\\s-]+$","maxlength":50},"ST":{"prompt":"State","description":"State","type":"string","default":null,"optional":true,"validation":"^[\\w\\s-]+$","maxlength":50}},"output":{"csr":{"description":"PEM text block for the CSR","display_as":"CSR","type":"string","default":null},"public_key":{"description":"PEM text block of the public key that made the CSR","display_as":"Public Key","type":"string","default":null},"ssldir":{"description":"SSL directory as determined by the server","display_as":"SSL Dir","type":"string","default":null}},"display":"always","description":"Request a CSR from the Choria Server"},{"action":"jwt","input":{"token":{"prompt":"Token","description":"Authentication token to pass to the server","type":"string","default":"","optional":false,"validation":".","maxlength":128}},"output":{"jwt":{"description":"The contents of the JWT token","display_as":"JWT Token","type":"string","default":""},"ecdh_public":{"description":"The ECDH public key for calculating shared secrets","display_as":"ECDH Public Key","type":"string","default":""}},"display":"always","description":"Re-enable provision mode in a running Choria Server"},{"action":"reprovision","input":{"token":{"prompt":"Token","description":"Authentication token to pass to the server","type":"string","default":"","optional":false,"validation":".","maxlength":128}},"output":{"message":{"description":"Status message from the Provisioner","display_as":"Message","type":"string","default":null}},"display":"always","description":"Reenable provision mode in a running Choria Server"},{"action":"restart","input":{"token":{"prompt":"Token","description":"Authentication token to pass to the server","type":"string","default":"","optional":false,"validation":".","maxlength":128},"splay":{"prompt":"Splay time","description":"The configuration to apply to this node","type":"number","default":null,"optional":true}},"output":{"message":{"description":"Status message from the Provisioner","display_as":"Message","type":"string","default":null}},"display":"failed","description":"Restart the Choria Server"},{"action":"release_update","input":{"token":{"prompt":"Token","description":"Authentication token to pass to the server","type":"string","default":"","optional":false,"validation":".","maxlength":128},"repository":{"prompt":"Repository URL","description":"HTTP(S) server hosting the update repository","type":"string","default":"","optional":false,"validation":"^http(s*)://","maxlength":512},"version":{"prompt":"Version to update to","description":"Package version to update to","type":"string","default":"","optional":false,"validation":".+","maxlength":32}},"output":{"message":{"description":"Status message from the Provisioner","display_as":"Message","type":"string","default":null}},"display":"always","description":"Performs an in-place binary update and restarts Choria"},{"action":"shutdown","input":{"token":{"prompt":"Token","description":"Authentication token to pass to the server","type":"string","default":"","optional":false,"validation":".","maxlength":128}},"output":{"message":{"description":"Status message from the Provisioner","display_as":"Message","type":"string","default":null}},"display":"failed","description":"Shut the Choria Server down cleanly"}]}
\ No newline at end of file
+{"$schema":"https://choria.io/schemas/mcorpc/ddl/v1/agent.json","metadata":{"name":"choria_provision","description":"Choria Provisioner","author":"R.I.Pienaar <rip@devco.net>","license":"Apache-2.0","version":"0.28.0","url":"https://choria.io","timeout":20},"actions":[{"action":"configure","input":{"token":{"prompt":"Token","description":"Authentication token to pass to the server","type":"string","default":"","optional":true,"validation":".","maxlength":128},"config":{"prompt":"Configuration","description":"The configuration to apply to this node","type":"string","default":null,"optional":false,"validation":"^{.+}$","maxlength":2048},"certificate":{"prompt":"Certificate","description":"PEM text block for the certificate","type":"string","default":null,"optional":true,"validation":"^-----BEGIN CERTIFICATE-----","maxlength":10240},"ca":{"prompt":"CA Bundle","description":"PEM text block for the CA","type":"string","default":null,"optional":true,"validation":"^-----BEGIN CERTIFICATE-----","maxlength":20480},"ssldir":{"prompt":"SSL Dir","description":"Directory for storing the certificate in","type":"string","default":null,"optional":true,"validation":".","maxlength":500},"key":{"description":"A RSA private key","prompt":"PEM text block for the private key","type":"string","default":null,"optional":true,"validation":"-----BEGIN RSA PRIVATE KEY-----","maxlength":10240},"ecdh_public":{"prompt":"ECDH Public Key","description":"Required when sending a private key","type":"string","default":"","optional":true,"maxlength":64,"validation":"."},"action_policies":{"prompt":"Action Policy Documents","description":"Map of Action Policy documents indexed by file name","type":"hash","default":{},"optional":true},"opa_policies":{"prompt":"Open Policy Agent Policy Documents","description":"Map of Open Policy Agent Policy documents indexed by file name","type":"hash","default":{},"optional":true},"server_jwt":{"description":"JWT file used to identify the server to the broker for ed25519 based authentication","prompt":"Server JWT","type":"string","default":"","optional":true,"maxlength":2048,"validation":"."}},"output":{"message":{"description":"Status message from the Provisioner","display_as":"Message","type":"string","default":null}},"display":"failed","description":"Configure the Choria Server"},{"action":"gen25519","display":"always","description":"Generates a new ED25519 keypair","input":{"token":{"prompt":"Token","description":"Authentication token to pass to the server","type":"string","default":"","optional":false,"validation":".","maxlength":128},"nonce":{"prompt":"Nonce","description":"Single use token to be signed by the private key being generated","type":"string","default":"","optional":false,"validation":".","maxlength":64}},"output":{"public_key":{"description":"The ED255519 public key hex encoded","display_as":"Public Key","type":"string","default":""},"directory":{"description":"The directory where server.key and server.pub is written to","display_as":"Directory","type":"string","default":""},"signature":{"description":"The signature of the nonce made using the new private key, hex encoded","display_as":"Signature","type":"string","default":""}}},{"action":"gencsr","input":{"token":{"prompt":"Token","description":"Authentication token to pass to the server","type":"string","default":"","optional":false,"validation":".","maxlength":128},"cn":{"prompt":"Common Name","description":"The certificate Common Name to place in the CSR","type":"string","default":null,"optional":true,"validation":"^(([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9-]*[a-zA-Z0-9]).)*([A-Za-z0-9]|[A-Za-z0-9][A-Za-z0-9-]*[A-Za-z0-9])$","maxlength":80},"C":{"prompt":"Country","description":"Country Code","type":"string","default":null,"optional":true,"validation":"^[A-Z]{2}$","maxlength":2},"L":{"prompt":"Locality","description":"Locality or municipality (such as city or town name)","type":"string","default":null,"optional":true,"validation":"^[\\w\\s-]+$","maxlength":50},"O":{"prompt":"Organization","description":"Organization","type":"string","default":null,"optional":true,"validation":"^[\\w\\s-]+$","maxlength":50},"OU":{"prompt":"Organizational Unit","description":"Organizational Unit","type":"string","default":null,"optional":true,"validation":"^[\\w\\s-]+$","maxlength":50},"ST":{"prompt":"State","description":"State","type":"string","default":null,"optional":true,"validation":"^[\\w\\s-]+$","maxlength":50}},"output":{"csr":{"description":"PEM text block for the CSR","display_as":"CSR","type":"string","default":null},"public_key":{"description":"PEM text block of the public key that made the CSR","display_as":"Public Key","type":"string","default":null},"ssldir":{"description":"SSL directory as determined by the server","display_as":"SSL Dir","type":"string","default":null}},"display":"always","description":"Request a CSR from the Choria Server"},{"action":"jwt","input":{"token":{"prompt":"Token","description":"Authentication token to pass to the server","type":"string","default":"","optional":false,"validation":".","maxlength":128}},"output":{"jwt":{"description":"The contents of the JWT token","display_as":"JWT Token","type":"string","default":""},"ecdh_public":{"description":"The ECDH public key for calculating shared secrets","display_as":"ECDH Public Key","type":"string","default":""}},"display":"always","description":"Re-enable provision mode in a running Choria Server"},{"action":"reprovision","input":{"token":{"prompt":"Token","description":"Authentication token to pass to the server","type":"string","default":"","optional":false,"validation":".","maxlength":128}},"output":{"message":{"description":"Status message from the Provisioner","display_as":"Message","type":"string","default":null}},"display":"always","description":"Reenable provision mode in a running Choria Server"},{"action":"restart","input":{"token":{"prompt":"Token","description":"Authentication token to pass to the server","type":"string","default":"","optional":false,"validation":".","maxlength":128},"splay":{"prompt":"Splay time","description":"The configuration to apply to this node","type":"number","default":null,"optional":true}},"output":{"message":{"description":"Status message from the Provisioner","display_as":"Message","type":"string","default":null}},"display":"failed","description":"Restart the Choria Server"},{"action":"release_update","input":{"token":{"prompt":"Token","description":"Authentication token to pass to the server","type":"string","default":"","optional":false,"validation":".","maxlength":128},"repository":{"prompt":"Repository URL","description":"HTTP(S) server hosting the update repository","type":"string","default":"","optional":false,"validation":"^http(s*)://","maxlength":512},"version":{"prompt":"Version to update to","description":"Package version to update to","type":"string","default":"","optional":false,"validation":".+","maxlength":32}},"output":{"message":{"description":"Status message from the Provisioner","display_as":"Message","type":"string","default":null}},"display":"always","description":"Performs an in-place binary update and restarts Choria"},{"action":"shutdown","input":{"token":{"prompt":"Token","description":"Authentication token to pass to the server","type":"string","default":"","optional":false,"validation":".","maxlength":128}},"output":{"message":{"description":"Status message from the Provisioner","display_as":"Message","type":"string","default":null}},"display":"failed","description":"Shut the Choria Server down cleanly"}]}
\ No newline at end of file
diff --git a/client/choria_provisionclient/doc.go b/client/choria_provisionclient/doc.go
index fccbc5c24..6f1bd041a 100644
--- a/client/choria_provisionclient/doc.go
+++ b/client/choria_provisionclient/doc.go
@@ -1,8 +1,8 @@
 // generated code; DO NOT EDIT
 //
-// Client for Choria RPC Agent 'choria_provision' Version 0.27.0 generated using Choria version 0.27.0
+// Client for Choria RPC Agent 'choria_provision' Version 0.28.0 generated using Choria version 0.28.0
 
-// Package choria_provisionclient is an API client to the Choria Choria_provision agent Version 0.27.0.
+// Package choria_provisionclient is an API client to the Choria Choria_provision agent Version 0.28.0.
 //
 // Actions:
 //   - Configure - Configure the Choria Server
diff --git a/client/choria_registryclient/action_ddl.go b/client/choria_registryclient/action_ddl.go
index 41e238fea..5d7e662ea 100644
--- a/client/choria_registryclient/action_ddl.go
+++ b/client/choria_registryclient/action_ddl.go
@@ -1,6 +1,6 @@
 // generated code; DO NOT EDIT
 //
-// Client for Choria RPC Agent 'choria_registry' Version 0.27.0 generated using Choria version 0.27.0
+// Client for Choria RPC Agent 'choria_registry' Version 0.28.0 generated using Choria version 0.28.0
 
 package choria_registryclient
 
diff --git a/client/choria_registryclient/action_names.go b/client/choria_registryclient/action_names.go
index e4b72e529..36e3a52fe 100644
--- a/client/choria_registryclient/action_names.go
+++ b/client/choria_registryclient/action_names.go
@@ -1,6 +1,6 @@
 // generated code; DO NOT EDIT
 //
-// Client for Choria RPC Agent 'choria_registry' Version 0.27.0 generated using Choria version 0.27.0
+// Client for Choria RPC Agent 'choria_registry' Version 0.28.0 generated using Choria version 0.28.0
 
 package choria_registryclient
 
diff --git a/client/choria_registryclient/ddl.json b/client/choria_registryclient/ddl.json
index 9d9f3f2fc..2480c01fb 100644
--- a/client/choria_registryclient/ddl.json
+++ b/client/choria_registryclient/ddl.json
@@ -1 +1 @@
-{"$schema":"https://choria.io/schemas/mcorpc/ddl/v1/agent.json","metadata":{"license":"Apache-2.0","author":"rip@devco.net \u003crip@devco.net\u003e","timeout":2,"name":"choria_registry","version":"0.27.0","url":"https://choria.io","description":"Choria Registry Service","provider":"golang","service":true},"actions":[{"action":"names","description":"List of all known DDLs for a specific plugin type","input":{"plugin_type":{"prompt":"Plugin Type","description":"The type of plugin","type":"list","default":"agent","optional":false,"list":["agent"]}},"output":{"names":{"description":"The names of all known DDL files","type":"array","display_as":"Names"},"plugin_type":{"description":"The type of plugin","display_as":"Type","type":"string"}}},{"action":"ddl","input":{"format":{"prompt":"Plugin Format","description":"The result format the plugin should be retrieved in","type":"list","default":"json","optional":true,"list":["ddl","json"]},"name":{"prompt":"Plugin Name","description":"The name of the plugin","type":"string","optional":false,"validation":"shellsafe","maxlength":64},"plugin_type":{"prompt":"Plugin Type","description":"The type of plugin","type":"list","default":"agent","optional":false,"list":["agent"]}},"output":{"ddl":{"description":"The plugin DDL in the requested format","display_as":"DDL","type":"string"},"name":{"description":"The name of the plugin","display_as":"Name","type":"string"},"plugin_type":{"description":"The type of plugin","display_as":"Type","type":"string"},"version":{"description":"The version of the plugin","display_as":"Version","type":"string"}},"display":"always","description":"Retrieve the DDL for a specific plugin"}]}
\ No newline at end of file
+{"$schema":"https://choria.io/schemas/mcorpc/ddl/v1/agent.json","metadata":{"license":"Apache-2.0","author":"rip@devco.net \u003crip@devco.net\u003e","timeout":2,"name":"choria_registry","version":"0.28.0","url":"https://choria.io","description":"Choria Registry Service","provider":"golang","service":true},"actions":[{"action":"names","description":"List of all known DDLs for a specific plugin type","input":{"plugin_type":{"prompt":"Plugin Type","description":"The type of plugin","type":"list","default":"agent","optional":false,"list":["agent"]}},"output":{"names":{"description":"The names of all known DDL files","type":"array","display_as":"Names"},"plugin_type":{"description":"The type of plugin","display_as":"Type","type":"string"}}},{"action":"ddl","input":{"format":{"prompt":"Plugin Format","description":"The result format the plugin should be retrieved in","type":"list","default":"json","optional":true,"list":["ddl","json"]},"name":{"prompt":"Plugin Name","description":"The name of the plugin","type":"string","optional":false,"validation":"shellsafe","maxlength":64},"plugin_type":{"prompt":"Plugin Type","description":"The type of plugin","type":"list","default":"agent","optional":false,"list":["agent"]}},"output":{"ddl":{"description":"The plugin DDL in the requested format","display_as":"DDL","type":"string"},"name":{"description":"The name of the plugin","display_as":"Name","type":"string"},"plugin_type":{"description":"The type of plugin","display_as":"Type","type":"string"},"version":{"description":"The version of the plugin","display_as":"Version","type":"string"}},"display":"always","description":"Retrieve the DDL for a specific plugin"}]}
\ No newline at end of file
diff --git a/client/choria_registryclient/doc.go b/client/choria_registryclient/doc.go
index e228020b6..9afd203d1 100644
--- a/client/choria_registryclient/doc.go
+++ b/client/choria_registryclient/doc.go
@@ -1,8 +1,8 @@
 // generated code; DO NOT EDIT
 //
-// Client for Choria RPC Agent 'choria_registry' Version 0.27.0 generated using Choria version 0.27.0
+// Client for Choria RPC Agent 'choria_registry' Version 0.28.0 generated using Choria version 0.28.0
 
-// Package choria_registryclient is an API client to the Choria Choria_registry agent Version 0.27.0.
+// Package choria_registryclient is an API client to the Choria Choria_registry agent Version 0.28.0.
 //
 // Actions:
 //   - Names - List of all known DDLs for a specific plugin type
diff --git a/client/choria_utilclient/action_info.go b/client/choria_utilclient/action_info.go
index fca1dd1b8..69457085f 100644
--- a/client/choria_utilclient/action_info.go
+++ b/client/choria_utilclient/action_info.go
@@ -1,6 +1,6 @@
 // generated code; DO NOT EDIT
 //
-// Client for Choria RPC Agent 'choria_util' Version 0.27.0 generated using Choria version 0.27.0
+// Client for Choria RPC Agent 'choria_util' Version 0.28.0 generated using Choria version 0.28.0
 
 package choria_utilclient
 
diff --git a/client/choria_utilclient/action_machine_state.go b/client/choria_utilclient/action_machine_state.go
index f372a87bc..1b82a5421 100644
--- a/client/choria_utilclient/action_machine_state.go
+++ b/client/choria_utilclient/action_machine_state.go
@@ -1,6 +1,6 @@
 // generated code; DO NOT EDIT
 //
-// Client for Choria RPC Agent 'choria_util' Version 0.27.0 generated using Choria version 0.27.0
+// Client for Choria RPC Agent 'choria_util' Version 0.28.0 generated using Choria version 0.28.0
 
 package choria_utilclient
 
diff --git a/client/choria_utilclient/action_machine_states.go b/client/choria_utilclient/action_machine_states.go
index 45c22b921..6518eb3fe 100644
--- a/client/choria_utilclient/action_machine_states.go
+++ b/client/choria_utilclient/action_machine_states.go
@@ -1,6 +1,6 @@
 // generated code; DO NOT EDIT
 //
-// Client for Choria RPC Agent 'choria_util' Version 0.27.0 generated using Choria version 0.27.0
+// Client for Choria RPC Agent 'choria_util' Version 0.28.0 generated using Choria version 0.28.0
 
 package choria_utilclient
 
diff --git a/client/choria_utilclient/action_machine_transition.go b/client/choria_utilclient/action_machine_transition.go
index f8818fb4a..747e233e7 100644
--- a/client/choria_utilclient/action_machine_transition.go
+++ b/client/choria_utilclient/action_machine_transition.go
@@ -1,6 +1,6 @@
 // generated code; DO NOT EDIT
 //
-// Client for Choria RPC Agent 'choria_util' Version 0.27.0 generated using Choria version 0.27.0
+// Client for Choria RPC Agent 'choria_util' Version 0.28.0 generated using Choria version 0.28.0
 
 package choria_utilclient
 
diff --git a/client/choria_utilclient/ddl.json b/client/choria_utilclient/ddl.json
index 278adbf7e..e1ded0594 100644
--- a/client/choria_utilclient/ddl.json
+++ b/client/choria_utilclient/ddl.json
@@ -1 +1 @@
-{"$schema":"https://choria.io/schemas/mcorpc/ddl/v1/agent.json","metadata":{"name":"choria_util","description":"Choria Utilities","author":"R.I.Pienaar <rip@devco.net>","license":"Apache-2.0","version":"0.27.0","url":"https://choria.io","timeout":2},"actions":[{"action":"info","input":{},"output":{"security":{"description":"Security Provider plugin","display_as":"Security Provider","type":"string"},"secure_protocol":{"description":"If the protocol is running with PKI security enabled","display_as":"Protocol Secure","type":"boolean"},"connector":{"description":"Connector plugin","display_as":"Connector","type":"string"},"connector_tls":{"description":"If the connector is running with TLS security enabled","display_as":"Connector TLS","type":"boolean"},"path":{"description":"Active OS PATH","display_as":"Path","type":"string"},"choria_version":{"description":"Choria version","display_as":"Choria Version","type":"string"},"client_version":{"description":"Middleware client library version","display_as":"Middleware Client Library Version","type":"string"},"client_flavour":{"description":"Middleware client library flavour","display_as":"Middleware Client Flavour","type":"string"},"client_options":{"description":"Active Middleware client options","display_as":"Middleware Client Options","type":"hash"},"connected_server":{"description":"Connected middleware server","display_as":"Connected Broker","type":"string"},"client_stats":{"description":"Middleware client statistics","display_as":"Middleware Client Stats","type":"hash"},"facter_domain":{"description":"Facter domain","display_as":"Facter Domain","type":"string"},"facter_command":{"description":"Command used for Facter","display_as":"Facter","type":"string"},"srv_domain":{"description":"Configured SRV domain","display_as":"SRV Domain","type":"string"},"using_srv":{"description":"Indicates if SRV records are considered","display_as":"SRV Used","type":"boolean"},"middleware_servers":{"description":"Middleware Servers configured or discovered","display_as":"Middleware","type":"array"}},"display":"failed","description":"Choria related information from the running Daemon and Middleware","aggregate":[{"function":"summary","args":["choria_version"]},{"function":"summary","args":["client_version"]},{"function":"summary","args":["client_flavour"]},{"function":"summary","args":["connected_server"]},{"function":"summary","args":["srv_domain"]},{"function":"summary","args":["using_srv"]},{"function":"summary","args":["secure_protocol"]},{"function":"summary","args":["connector_tls"]}]},{"action":"machine_state","description":"Retrieves the current state of a specific Choria Autonomous Agent","display":"ok","input":{"instance":{"prompt":"Instance ID","description":"Machine Instance ID","type":"string","default":null,"optional":true,"validation":"^.+-.+-.+-.+-.+$","maxlength":36},"name":{"prompt":"Name","description":"Machine Name","type":"string","default":null,"optional":true,"validation":"^[a-zA-Z][a-zA-Z0-9_-]+","maxlength":128},"path":{"prompt":"Path","description":"Machine Path","type":"string","default":null,"optional":true,"validation":".+","maxlength":512}},"aggregate":[{"function":"summary","args":["state"]},{"function":"summary","args":["name"]},{"function":"summary","args":["version"]}],"output":{"name":{"type":"string","description":"The name of the autonomous agent","display_as":"Name"},"version":{"type":"string","description":"The version of the autonomous agent","display_as":"Version"},"state":{"type":"string","description":"The current state the agent is in","display_as":"State"},"path":{"type":"string","description":"The location on disk where the autonomous agent is stored","display_as":"Path"},"id":{"type":"string","description":"The unique running ID of the autonomous agent","display_as":"ID"},"start_time":{"type":"string","description":"The time the autonomous agent was started in unix seconds","display_as":"Started"},"available_transitions":{"type":"array","description":"The list of available transitions this autonomous agent can make","display_as":"Available Transitions"},"scout":{"type":"boolean","description":"True when this autonomous agent represents a Choria Scout Check","display_as":"Scout Check"},"current_state":{"description":"The Choria Scout specific state for Scout checks","display_as":"Scout State"}}},{"action":"machine_states","input":{},"output":{"machine_names":{"description":"List of running machine names","display_as":"Machine Names","type":"array"},"machine_ids":{"description":"List of running machine IDs","display_as":"Machine IDs","type":"array"},"states":{"description":"Hash map of machine statusses indexed by machine ID","display_as":"Machine States","type":"hash"}},"display":"always","description":"States of the hosted Choria Autonomous Agents","aggregate":[{"function":"summary","args":["machine_names"]}]},{"action":"machine_transition","input":{"instance":{"prompt":"Instance ID","description":"Machine Instance ID","type":"string","default":null,"optional":true,"validation":"^.+-.+-.+-.+-.+$","maxlength":36},"version":{"prompt":"Version","description":"Machine Version","type":"string","default":null,"optional":true,"validation":"^\\d+\\.\\d+\\.\\d+$","maxlength":20},"name":{"prompt":"Name","description":"Machine Name","type":"string","default":null,"optional":true,"validation":"^[a-zA-Z][a-zA-Z0-9_-]+","maxlength":128},"path":{"prompt":"Path","description":"Machine Path","type":"string","default":null,"optional":true,"validation":".+","maxlength":512},"transition":{"prompt":"Transition Name","description":"The transition event to send to the machine","type":"string","default":null,"optional":false,"validation":"^[a-zA-Z][a-zA-Z0-9_-]+$","maxlength":128}},"output":{"success":{"description":"Indicates if the transition was successfully accepted","display_as":"Accepted","type":"boolean"}},"display":"failed","description":"Attempts to force a transition in a hosted Choria Autonomous Agent"}]}
\ No newline at end of file
+{"$schema":"https://choria.io/schemas/mcorpc/ddl/v1/agent.json","metadata":{"name":"choria_util","description":"Choria Utilities","author":"R.I.Pienaar <rip@devco.net>","license":"Apache-2.0","version":"0.28.0","url":"https://choria.io","timeout":2},"actions":[{"action":"info","input":{},"output":{"security":{"description":"Security Provider plugin","display_as":"Security Provider","type":"string"},"secure_protocol":{"description":"If the protocol is running with PKI security enabled","display_as":"Protocol Secure","type":"boolean"},"connector":{"description":"Connector plugin","display_as":"Connector","type":"string"},"connector_tls":{"description":"If the connector is running with TLS security enabled","display_as":"Connector TLS","type":"boolean"},"path":{"description":"Active OS PATH","display_as":"Path","type":"string"},"choria_version":{"description":"Choria version","display_as":"Choria Version","type":"string"},"client_version":{"description":"Middleware client library version","display_as":"Middleware Client Library Version","type":"string"},"client_flavour":{"description":"Middleware client library flavour","display_as":"Middleware Client Flavour","type":"string"},"client_options":{"description":"Active Middleware client options","display_as":"Middleware Client Options","type":"hash"},"connected_server":{"description":"Connected middleware server","display_as":"Connected Broker","type":"string"},"client_stats":{"description":"Middleware client statistics","display_as":"Middleware Client Stats","type":"hash"},"facter_domain":{"description":"Facter domain","display_as":"Facter Domain","type":"string"},"facter_command":{"description":"Command used for Facter","display_as":"Facter","type":"string"},"srv_domain":{"description":"Configured SRV domain","display_as":"SRV Domain","type":"string"},"using_srv":{"description":"Indicates if SRV records are considered","display_as":"SRV Used","type":"boolean"},"middleware_servers":{"description":"Middleware Servers configured or discovered","display_as":"Middleware","type":"array"}},"display":"failed","description":"Choria related information from the running Daemon and Middleware","aggregate":[{"function":"summary","args":["choria_version"]},{"function":"summary","args":["client_version"]},{"function":"summary","args":["client_flavour"]},{"function":"summary","args":["connected_server"]},{"function":"summary","args":["srv_domain"]},{"function":"summary","args":["using_srv"]},{"function":"summary","args":["secure_protocol"]},{"function":"summary","args":["connector_tls"]}]},{"action":"machine_state","description":"Retrieves the current state of a specific Choria Autonomous Agent","display":"ok","input":{"instance":{"prompt":"Instance ID","description":"Machine Instance ID","type":"string","default":null,"optional":true,"validation":"^.+-.+-.+-.+-.+$","maxlength":36},"name":{"prompt":"Name","description":"Machine Name","type":"string","default":null,"optional":true,"validation":"^[a-zA-Z][a-zA-Z0-9_-]+","maxlength":128},"path":{"prompt":"Path","description":"Machine Path","type":"string","default":null,"optional":true,"validation":".+","maxlength":512}},"aggregate":[{"function":"summary","args":["state"]},{"function":"summary","args":["name"]},{"function":"summary","args":["version"]}],"output":{"name":{"type":"string","description":"The name of the autonomous agent","display_as":"Name"},"version":{"type":"string","description":"The version of the autonomous agent","display_as":"Version"},"state":{"type":"string","description":"The current state the agent is in","display_as":"State"},"path":{"type":"string","description":"The location on disk where the autonomous agent is stored","display_as":"Path"},"id":{"type":"string","description":"The unique running ID of the autonomous agent","display_as":"ID"},"start_time":{"type":"string","description":"The time the autonomous agent was started in unix seconds","display_as":"Started"},"available_transitions":{"type":"array","description":"The list of available transitions this autonomous agent can make","display_as":"Available Transitions"},"scout":{"type":"boolean","description":"True when this autonomous agent represents a Choria Scout Check","display_as":"Scout Check"},"current_state":{"description":"The Choria Scout specific state for Scout checks","display_as":"Scout State"}}},{"action":"machine_states","input":{},"output":{"machine_names":{"description":"List of running machine names","display_as":"Machine Names","type":"array"},"machine_ids":{"description":"List of running machine IDs","display_as":"Machine IDs","type":"array"},"states":{"description":"Hash map of machine statusses indexed by machine ID","display_as":"Machine States","type":"hash"}},"display":"always","description":"States of the hosted Choria Autonomous Agents","aggregate":[{"function":"summary","args":["machine_names"]}]},{"action":"machine_transition","input":{"instance":{"prompt":"Instance ID","description":"Machine Instance ID","type":"string","default":null,"optional":true,"validation":"^.+-.+-.+-.+-.+$","maxlength":36},"version":{"prompt":"Version","description":"Machine Version","type":"string","default":null,"optional":true,"validation":"^\\d+\\.\\d+\\.\\d+$","maxlength":20},"name":{"prompt":"Name","description":"Machine Name","type":"string","default":null,"optional":true,"validation":"^[a-zA-Z][a-zA-Z0-9_-]+","maxlength":128},"path":{"prompt":"Path","description":"Machine Path","type":"string","default":null,"optional":true,"validation":".+","maxlength":512},"transition":{"prompt":"Transition Name","description":"The transition event to send to the machine","type":"string","default":null,"optional":false,"validation":"^[a-zA-Z][a-zA-Z0-9_-]+$","maxlength":128}},"output":{"success":{"description":"Indicates if the transition was successfully accepted","display_as":"Accepted","type":"boolean"}},"display":"failed","description":"Attempts to force a transition in a hosted Choria Autonomous Agent"}]}
\ No newline at end of file
diff --git a/client/choria_utilclient/doc.go b/client/choria_utilclient/doc.go
index 10937da5e..8f290d428 100644
--- a/client/choria_utilclient/doc.go
+++ b/client/choria_utilclient/doc.go
@@ -1,8 +1,8 @@
 // generated code; DO NOT EDIT
 //
-// Client for Choria RPC Agent 'choria_util' Version 0.27.0 generated using Choria version 0.27.0
+// Client for Choria RPC Agent 'choria_util' Version 0.28.0 generated using Choria version 0.28.0
 
-// Package choria_utilclient is an API client to the Choria Choria_util agent Version 0.27.0.
+// Package choria_utilclient is an API client to the Choria Choria_util agent Version 0.28.0.
 //
 // Actions:
 //   - Info - Choria related information from the running Daemon and Middleware
diff --git a/client/rpcutilclient/action_agent_inventory.go b/client/rpcutilclient/action_agent_inventory.go
index b19f09634..7aa56c1bd 100644
--- a/client/rpcutilclient/action_agent_inventory.go
+++ b/client/rpcutilclient/action_agent_inventory.go
@@ -1,6 +1,6 @@
 // generated code; DO NOT EDIT
 //
-// Client for Choria RPC Agent 'rpcutil' Version 0.27.0 generated using Choria version 0.27.0
+// Client for Choria RPC Agent 'rpcutil' Version 0.28.0 generated using Choria version 0.28.0
 
 package rpcutilclient
 
diff --git a/client/rpcutilclient/action_collective_info.go b/client/rpcutilclient/action_collective_info.go
index 431ccd9e7..2ead5b094 100644
--- a/client/rpcutilclient/action_collective_info.go
+++ b/client/rpcutilclient/action_collective_info.go
@@ -1,6 +1,6 @@
 // generated code; DO NOT EDIT
 //
-// Client for Choria RPC Agent 'rpcutil' Version 0.27.0 generated using Choria version 0.27.0
+// Client for Choria RPC Agent 'rpcutil' Version 0.28.0 generated using Choria version 0.28.0
 
 package rpcutilclient
 
diff --git a/client/rpcutilclient/action_daemon_stats.go b/client/rpcutilclient/action_daemon_stats.go
index d6f8ac228..26bff0d3f 100644
--- a/client/rpcutilclient/action_daemon_stats.go
+++ b/client/rpcutilclient/action_daemon_stats.go
@@ -1,6 +1,6 @@
 // generated code; DO NOT EDIT
 //
-// Client for Choria RPC Agent 'rpcutil' Version 0.27.0 generated using Choria version 0.27.0
+// Client for Choria RPC Agent 'rpcutil' Version 0.28.0 generated using Choria version 0.28.0
 
 package rpcutilclient
 
diff --git a/client/rpcutilclient/action_get_config_item.go b/client/rpcutilclient/action_get_config_item.go
index 33a5235be..36a227c2b 100644
--- a/client/rpcutilclient/action_get_config_item.go
+++ b/client/rpcutilclient/action_get_config_item.go
@@ -1,6 +1,6 @@
 // generated code; DO NOT EDIT
 //
-// Client for Choria RPC Agent 'rpcutil' Version 0.27.0 generated using Choria version 0.27.0
+// Client for Choria RPC Agent 'rpcutil' Version 0.28.0 generated using Choria version 0.28.0
 
 package rpcutilclient
 
diff --git a/client/rpcutilclient/action_get_data.go b/client/rpcutilclient/action_get_data.go
index 1e4ccc5e5..1307d4160 100644
--- a/client/rpcutilclient/action_get_data.go
+++ b/client/rpcutilclient/action_get_data.go
@@ -1,6 +1,6 @@
 // generated code; DO NOT EDIT
 //
-// Client for Choria RPC Agent 'rpcutil' Version 0.27.0 generated using Choria version 0.27.0
+// Client for Choria RPC Agent 'rpcutil' Version 0.28.0 generated using Choria version 0.28.0
 
 package rpcutilclient
 
diff --git a/client/rpcutilclient/action_get_fact.go b/client/rpcutilclient/action_get_fact.go
index b0f46aeac..f11a73105 100644
--- a/client/rpcutilclient/action_get_fact.go
+++ b/client/rpcutilclient/action_get_fact.go
@@ -1,6 +1,6 @@
 // generated code; DO NOT EDIT
 //
-// Client for Choria RPC Agent 'rpcutil' Version 0.27.0 generated using Choria version 0.27.0
+// Client for Choria RPC Agent 'rpcutil' Version 0.28.0 generated using Choria version 0.28.0
 
 package rpcutilclient
 
diff --git a/client/rpcutilclient/action_get_facts.go b/client/rpcutilclient/action_get_facts.go
index de73e5cde..42fb77311 100644
--- a/client/rpcutilclient/action_get_facts.go
+++ b/client/rpcutilclient/action_get_facts.go
@@ -1,6 +1,6 @@
 // generated code; DO NOT EDIT
 //
-// Client for Choria RPC Agent 'rpcutil' Version 0.27.0 generated using Choria version 0.27.0
+// Client for Choria RPC Agent 'rpcutil' Version 0.28.0 generated using Choria version 0.28.0
 
 package rpcutilclient
 
diff --git a/client/rpcutilclient/action_inventory.go b/client/rpcutilclient/action_inventory.go
index 6706b183b..b2b0499c3 100644
--- a/client/rpcutilclient/action_inventory.go
+++ b/client/rpcutilclient/action_inventory.go
@@ -1,6 +1,6 @@
 // generated code; DO NOT EDIT
 //
-// Client for Choria RPC Agent 'rpcutil' Version 0.27.0 generated using Choria version 0.27.0
+// Client for Choria RPC Agent 'rpcutil' Version 0.28.0 generated using Choria version 0.28.0
 
 package rpcutilclient
 
diff --git a/client/rpcutilclient/action_ping.go b/client/rpcutilclient/action_ping.go
index 8b01a6031..6974d8c0f 100644
--- a/client/rpcutilclient/action_ping.go
+++ b/client/rpcutilclient/action_ping.go
@@ -1,6 +1,6 @@
 // generated code; DO NOT EDIT
 //
-// Client for Choria RPC Agent 'rpcutil' Version 0.27.0 generated using Choria version 0.27.0
+// Client for Choria RPC Agent 'rpcutil' Version 0.28.0 generated using Choria version 0.28.0
 
 package rpcutilclient
 
diff --git a/client/rpcutilclient/ddl.json b/client/rpcutilclient/ddl.json
index c742b7731..68bb01fcc 100644
--- a/client/rpcutilclient/ddl.json
+++ b/client/rpcutilclient/ddl.json
@@ -1 +1 @@
-{"$schema":"https://choria.io/schemas/mcorpc/ddl/v1/agent.json","metadata":{"name":"rpcutil","description":"Utility actions that expose information about the state of the running Server","author":"R.I.Pienaar <rip@devco.net>","license":"Apache-2.0","version":"0.27.0","url":"https://choria.io/","timeout":2},"actions":[{"action":"agent_inventory","input":{},"output":{"agents":{"description":"List of agents on the server","display_as":"Agents","type":"array"}},"display":"always","description":"Inventory of all agents on the server including versions, licenses and more"},{"action":"collective_info","input":{},"output":{"main_collective":{"description":"The main Collective","display_as":"Main Collective","type":"string"},"collectives":{"description":"All Collectives","display_as":"All Collectives","type":"array"}},"display":"always","description":"Info about the main and sub collectives that the server belongs to","aggregate":[{"function":"summary","args":["collectives"]}]},{"action":"daemon_stats","input":{},"output":{"threads":{"description":"List of threads active in the Choria Server","display_as":"Threads","type":"array"},"agents":{"description":"List of agents loaded","display_as":"Agents","type":"array"},"pid":{"description":"Process ID of the Choria Server","display_as":"PID","type":"integer"},"times":{"description":"Processor time consumed by the Choria Server","display_as":"Times","type":"hash"},"validated":{"description":"Count of messages that passed security validation","display_as":"Security Validated","type":"integer"},"unvalidated":{"description":"Count of messages that failed security validation","display_as":"Failed Security","type":"integer"},"passed":{"description":"Count of messages that passed filter checks","display_as":"Passed Filter","type":"integer"},"filtered":{"description":"Count of message that didn't pass filter checks","display_as":"Failed Filter","type":"integer"},"starttime":{"description":"Time the Choria Server started in unix seconds","display_as":"Start Time","type":"integer"},"total":{"description":"Count of messages received by the Choria Server","display_as":"Total Messages","type":"integer"},"replies":{"description":"Count of replies sent back to clients","display_as":"Replies","type":"integer"},"configfile":{"description":"Config file used to start the daemon","display_as":"Config File","type":"string"},"version":{"description":"Choria Server Version","display_as":"Version","type":"string"},"ttlexpired":{"description":"Count of messages that did pass TTL checks","display_as":"TTL Expired","type":"integer"},"events":{"description":"The number of lifecycle events that was published","display_as":"Events","type":"integer"}},"display":"always","description":"Get statistics from the running daemon","aggregate":[{"function":"summary","args":["version"]},{"function":"summary","args":["agents"]}]},{"action":"get_config_item","input":{"item":{"prompt":"Configuration Item","description":"The item to retrieve from the server","type":"string","optional":false,"validation":"^.+$","maxlength":120}},"output":{"item":{"description":"The config property being retrieved","display_as":"Property","type":"string"},"value":{"description":"The value that is in use","display_as":"Value"}},"display":"always","description":"Get the active value of a specific config property","aggregate":[{"function":"summary","args":["value"]}]},{"action":"get_data","input":{"source":{"prompt":"Data Source","description":"The data plugin to retrieve information from","type":"string","optional":false,"validation":"^\\w+$","maxlength":50},"query":{"prompt":"Query","description":"The query argument to supply to the data plugin","type":"string","default":null,"optional":true,"validation":"^.+$","maxlength":200}},"output":{},"display":"always","description":"Get data from a data plugin"},{"action":"get_fact","input":{"fact":{"prompt":"The name of the fact","description":"The fact to retrieve","type":"string","default":null,"optional":false,"validation":".+","maxlength":512}},"output":{"fact":{"description":"The name of the fact being returned","display_as":"Fact","type":"string"},"value":{"description":"The value of the fact","display_as":"Value","default":null}},"display":"always","description":"Retrieve a single fact from the fact store","aggregate":[{"function":"summary","args":["value"]}]},{"action":"get_facts","input":{"facts":{"prompt":"Comma-separated list of facts to retrieve","description":"Facts to retrieve","type":"string","default":null,"optional":false,"validation":"^\\s*[\\w\\.\\-]+(\\s*,\\s*[\\w\\.\\-]+)*$","maxlength":200}},"output":{"values":{"description":"List of values of the facts","display_as":"Values","type":"hash"}},"display":"always","description":"Retrieve multiple facts from the fact store"},{"action":"inventory","input":{},"output":{"agents":{"description":"List of agent names","display_as":"Agents","type":"array"},"facts":{"description":"List of facts and values","display_as":"Facts","type":"hash"},"classes":{"description":"List of classes on the system","display_as":"Classes","type":"array"},"version":{"description":"Choria Server Version","display_as":"Version","type":"string"},"main_collective":{"description":"The main Collective","display_as":"Main Collective","type":"string"},"collectives":{"description":"All Collectives","display_as":"All Collectives","type":"array"},"data_plugins":{"description":"List of data plugin names","display_as":"Data Plugins","type":"array"},"machines":{"description":"Autonomous Agents","display_as":"Machines","type":"hash"},"upgradable":{"description":"Indicates if the server supports upgrades","display_as":"Upgradable","type":"boolean","default":false}},"display":"always","description":"System Inventory"},{"action":"ping","input":{},"output":{"pong":{"description":"The local Unix timestamp","display_as":"Timestamp","type":"number"}},"display":"always","description":"Responds to requests for PING with PONG"}]}
\ No newline at end of file
+{"$schema":"https://choria.io/schemas/mcorpc/ddl/v1/agent.json","metadata":{"name":"rpcutil","description":"Utility actions that expose information about the state of the running Server","author":"R.I.Pienaar <rip@devco.net>","license":"Apache-2.0","version":"0.28.0","url":"https://choria.io/","timeout":2},"actions":[{"action":"agent_inventory","input":{},"output":{"agents":{"description":"List of agents on the server","display_as":"Agents","type":"array"}},"display":"always","description":"Inventory of all agents on the server including versions, licenses and more"},{"action":"collective_info","input":{},"output":{"main_collective":{"description":"The main Collective","display_as":"Main Collective","type":"string"},"collectives":{"description":"All Collectives","display_as":"All Collectives","type":"array"}},"display":"always","description":"Info about the main and sub collectives that the server belongs to","aggregate":[{"function":"summary","args":["collectives"]}]},{"action":"daemon_stats","input":{},"output":{"threads":{"description":"List of threads active in the Choria Server","display_as":"Threads","type":"array"},"agents":{"description":"List of agents loaded","display_as":"Agents","type":"array"},"pid":{"description":"Process ID of the Choria Server","display_as":"PID","type":"integer"},"times":{"description":"Processor time consumed by the Choria Server","display_as":"Times","type":"hash"},"validated":{"description":"Count of messages that passed security validation","display_as":"Security Validated","type":"integer"},"unvalidated":{"description":"Count of messages that failed security validation","display_as":"Failed Security","type":"integer"},"passed":{"description":"Count of messages that passed filter checks","display_as":"Passed Filter","type":"integer"},"filtered":{"description":"Count of message that didn't pass filter checks","display_as":"Failed Filter","type":"integer"},"starttime":{"description":"Time the Choria Server started in unix seconds","display_as":"Start Time","type":"integer"},"total":{"description":"Count of messages received by the Choria Server","display_as":"Total Messages","type":"integer"},"replies":{"description":"Count of replies sent back to clients","display_as":"Replies","type":"integer"},"configfile":{"description":"Config file used to start the daemon","display_as":"Config File","type":"string"},"version":{"description":"Choria Server Version","display_as":"Version","type":"string"},"ttlexpired":{"description":"Count of messages that did pass TTL checks","display_as":"TTL Expired","type":"integer"},"events":{"description":"The number of lifecycle events that was published","display_as":"Events","type":"integer"}},"display":"always","description":"Get statistics from the running daemon","aggregate":[{"function":"summary","args":["version"]},{"function":"summary","args":["agents"]}]},{"action":"get_config_item","input":{"item":{"prompt":"Configuration Item","description":"The item to retrieve from the server","type":"string","optional":false,"validation":"^.+$","maxlength":120}},"output":{"item":{"description":"The config property being retrieved","display_as":"Property","type":"string"},"value":{"description":"The value that is in use","display_as":"Value"}},"display":"always","description":"Get the active value of a specific config property","aggregate":[{"function":"summary","args":["value"]}]},{"action":"get_data","input":{"source":{"prompt":"Data Source","description":"The data plugin to retrieve information from","type":"string","optional":false,"validation":"^\\w+$","maxlength":50},"query":{"prompt":"Query","description":"The query argument to supply to the data plugin","type":"string","default":null,"optional":true,"validation":"^.+$","maxlength":200}},"output":{},"display":"always","description":"Get data from a data plugin"},{"action":"get_fact","input":{"fact":{"prompt":"The name of the fact","description":"The fact to retrieve","type":"string","default":null,"optional":false,"validation":".+","maxlength":512}},"output":{"fact":{"description":"The name of the fact being returned","display_as":"Fact","type":"string"},"value":{"description":"The value of the fact","display_as":"Value","default":null}},"display":"always","description":"Retrieve a single fact from the fact store","aggregate":[{"function":"summary","args":["value"]}]},{"action":"get_facts","input":{"facts":{"prompt":"Comma-separated list of facts to retrieve","description":"Facts to retrieve","type":"string","default":null,"optional":false,"validation":"^\\s*[\\w\\.\\-]+(\\s*,\\s*[\\w\\.\\-]+)*$","maxlength":200}},"output":{"values":{"description":"List of values of the facts","display_as":"Values","type":"hash"}},"display":"always","description":"Retrieve multiple facts from the fact store"},{"action":"inventory","input":{},"output":{"agents":{"description":"List of agent names","display_as":"Agents","type":"array"},"facts":{"description":"List of facts and values","display_as":"Facts","type":"hash"},"classes":{"description":"List of classes on the system","display_as":"Classes","type":"array"},"version":{"description":"Choria Server Version","display_as":"Version","type":"string"},"main_collective":{"description":"The main Collective","display_as":"Main Collective","type":"string"},"collectives":{"description":"All Collectives","display_as":"All Collectives","type":"array"},"data_plugins":{"description":"List of data plugin names","display_as":"Data Plugins","type":"array"},"machines":{"description":"Autonomous Agents","display_as":"Machines","type":"hash"},"upgradable":{"description":"Indicates if the server supports upgrades","display_as":"Upgradable","type":"boolean","default":false}},"display":"always","description":"System Inventory"},{"action":"ping","input":{},"output":{"pong":{"description":"The local Unix timestamp","display_as":"Timestamp","type":"number"}},"display":"always","description":"Responds to requests for PING with PONG"}]}
\ No newline at end of file
diff --git a/client/rpcutilclient/doc.go b/client/rpcutilclient/doc.go
index 110f07e04..a2116e5f6 100644
--- a/client/rpcutilclient/doc.go
+++ b/client/rpcutilclient/doc.go
@@ -1,8 +1,8 @@
 // generated code; DO NOT EDIT
 //
-// Client for Choria RPC Agent 'rpcutil' Version 0.27.0 generated using Choria version 0.27.0
+// Client for Choria RPC Agent 'rpcutil' Version 0.28.0 generated using Choria version 0.28.0
 
-// Package rpcutilclient is an API client to the Choria Rpcutil agent Version 0.27.0.
+// Package rpcutilclient is an API client to the Choria Rpcutil agent Version 0.28.0.
 //
 // Actions:
 //   - AgentInventory - Inventory of all agents on the server including versions, licenses and more
diff --git a/client/scoutclient/action_checks.go b/client/scoutclient/action_checks.go
index 8ea128ce5..35f04f5e3 100644
--- a/client/scoutclient/action_checks.go
+++ b/client/scoutclient/action_checks.go
@@ -1,6 +1,6 @@
 // generated code; DO NOT EDIT
 //
-// Client for Choria RPC Agent 'scout' Version 0.27.0 generated using Choria version 0.27.0
+// Client for Choria RPC Agent 'scout' Version 0.28.0 generated using Choria version 0.28.0
 
 package scoutclient
 
diff --git a/client/scoutclient/action_goss_validate.go b/client/scoutclient/action_goss_validate.go
index 9dde400b8..151a4f67e 100644
--- a/client/scoutclient/action_goss_validate.go
+++ b/client/scoutclient/action_goss_validate.go
@@ -1,6 +1,6 @@
 // generated code; DO NOT EDIT
 //
-// Client for Choria RPC Agent 'scout' Version 0.27.0 generated using Choria version 0.27.0
+// Client for Choria RPC Agent 'scout' Version 0.28.0 generated using Choria version 0.28.0
 
 package scoutclient
 
diff --git a/client/scoutclient/action_maintenance.go b/client/scoutclient/action_maintenance.go
index 44a923ef1..4f295ed49 100644
--- a/client/scoutclient/action_maintenance.go
+++ b/client/scoutclient/action_maintenance.go
@@ -1,6 +1,6 @@
 // generated code; DO NOT EDIT
 //
-// Client for Choria RPC Agent 'scout' Version 0.27.0 generated using Choria version 0.27.0
+// Client for Choria RPC Agent 'scout' Version 0.28.0 generated using Choria version 0.28.0
 
 package scoutclient
 
diff --git a/client/scoutclient/action_resume.go b/client/scoutclient/action_resume.go
index af1b38dac..5c8bada27 100644
--- a/client/scoutclient/action_resume.go
+++ b/client/scoutclient/action_resume.go
@@ -1,6 +1,6 @@
 // generated code; DO NOT EDIT
 //
-// Client for Choria RPC Agent 'scout' Version 0.27.0 generated using Choria version 0.27.0
+// Client for Choria RPC Agent 'scout' Version 0.28.0 generated using Choria version 0.28.0
 
 package scoutclient
 
diff --git a/client/scoutclient/action_trigger.go b/client/scoutclient/action_trigger.go
index 3b5ef927e..a7e9c93c1 100644
--- a/client/scoutclient/action_trigger.go
+++ b/client/scoutclient/action_trigger.go
@@ -1,6 +1,6 @@
 // generated code; DO NOT EDIT
 //
-// Client for Choria RPC Agent 'scout' Version 0.27.0 generated using Choria version 0.27.0
+// Client for Choria RPC Agent 'scout' Version 0.28.0 generated using Choria version 0.28.0
 
 package scoutclient
 
diff --git a/client/scoutclient/ddl.json b/client/scoutclient/ddl.json
index 7ad7ea0e5..d15f806b3 100644
--- a/client/scoutclient/ddl.json
+++ b/client/scoutclient/ddl.json
@@ -1 +1 @@
-{"$schema":"https://choria.io/schemas/mcorpc/ddl/v1/agent.json","metadata":{"license":"Apache-2.0","author":"R.I.Pienaar <rip@devco.net>","timeout":5,"name":"scout","version":"0.27.0","url":"https://choria.io","description":"Choria Scout Agent Management API","provider":"golang"},"actions":[{"action":"checks","display":"ok","description":"Obtain a list of checks and their current status","input":{},"output":{"checks":{"description":"Details about each check","type":"array","display_as":"Checks"}}},{"action":"resume","input":{"checks":{"prompt":"Checks","description":"Check to resume, empty means all","type":"array","optional":true}},"output":{"failed":{"description":"List of checks that could not be resumed","display_as":"Failed","type":"array"},"transitioned":{"description":"List of checks that were resumed","display_as":"Triggered","type":"array"},"skipped":{"description":"List of checks that was skipped","display_as":"Skipped","type":"array"}},"display":"failed","description":"Resume active checking of one or more checks"},{"action":"maintenance","input":{"checks":{"prompt":"Checks","description":"Check to pause, empty means all","type":"array","optional":true}},"output":{"failed":{"description":"List of checks that could not be paused","display_as":"Failed","type":"array"},"transitioned":{"description":"List of checks that were paused","display_as":"Triggered","type":"array"},"skipped":{"description":"List of checks that was skipped","display_as":"Skipped","type":"array"}},"display":"failed","description":"Pause checking of one or more checks"},{"action":"goss_validate","description":"Performs a Goss validation using a specific file","display":"failed","aggregate":[{"function":"summary","args":["tests",{"format":"%s Tests on %d node(s)"}]},{"function":"summary","args":["failures",{"format":"%s Failed test on %d node(s)"}]},{"function":"summary","args":["success",{"format":"%s Passed tests on %d node(s)"}]}],"input":{"yaml_rules":{"prompt":"Gossfile contents","description":"Contents of the Gossfile to validate","type":"string","maxlength":5120,"validation":".","optional":true},"file":{"prompt":"Goss File","description":"Path to the Goss validation specification","type":"string","maxlength":256,"validation":".+","optional":true},"vars":{"prompt":"Vars File","description":"Path to a file to use as template variables","type":"string","maxlength":256,"validation":".+","optional":true},"yaml_vars":{"prompt":"Variables YAML","description":"YAML data to use as variables","type":"string","maxlength":5120,"validation":".+","optional":true}},"output":{"tests":{"description":"The number of tests that were run","display_as":"Tests","type":"integer"},"failures":{"description":"The number of tests that failed","display_as":"Failed Tests","type":"integer"},"runtime":{"description":"The time it took to run the tests, in seconds","display_as":"Runtime","type":"integer"},"success":{"description":"Indicates how many tests passed","display_as":"Success","type":"integer"},"skipped":{"description":"Indicates how many tests were skipped","display_as":"Skipped","type":"integer"},"summary":{"description":"A human friendly test result","display_as":"Summary","type":"string"},"results":{"description":"The full test results","display_as":"Results","type":"array"}}},{"action":"trigger","input":{"checks":{"prompt":"Checks","description":"Check to trigger, empty means all","type":"array","optional":true}},"output":{"failed":{"description":"List of checks that could not be triggered","display_as":"Failed","type":"array"},"transitioned":{"description":"List of checks that were triggered","display_as":"Triggered","type":"array"},"skipped":{"description":"List of checks that was skipped","display_as":"Skipped","type":"array"}},"display":"failed","description":"Force an immediate check of one or more checks"}]}
\ No newline at end of file
+{"$schema":"https://choria.io/schemas/mcorpc/ddl/v1/agent.json","metadata":{"license":"Apache-2.0","author":"R.I.Pienaar <rip@devco.net>","timeout":5,"name":"scout","version":"0.28.0","url":"https://choria.io","description":"Choria Scout Agent Management API","provider":"golang"},"actions":[{"action":"checks","display":"ok","description":"Obtain a list of checks and their current status","input":{},"output":{"checks":{"description":"Details about each check","type":"array","display_as":"Checks"}}},{"action":"resume","input":{"checks":{"prompt":"Checks","description":"Check to resume, empty means all","type":"array","optional":true}},"output":{"failed":{"description":"List of checks that could not be resumed","display_as":"Failed","type":"array"},"transitioned":{"description":"List of checks that were resumed","display_as":"Triggered","type":"array"},"skipped":{"description":"List of checks that was skipped","display_as":"Skipped","type":"array"}},"display":"failed","description":"Resume active checking of one or more checks"},{"action":"maintenance","input":{"checks":{"prompt":"Checks","description":"Check to pause, empty means all","type":"array","optional":true}},"output":{"failed":{"description":"List of checks that could not be paused","display_as":"Failed","type":"array"},"transitioned":{"description":"List of checks that were paused","display_as":"Triggered","type":"array"},"skipped":{"description":"List of checks that was skipped","display_as":"Skipped","type":"array"}},"display":"failed","description":"Pause checking of one or more checks"},{"action":"goss_validate","description":"Performs a Goss validation using a specific file","display":"failed","aggregate":[{"function":"summary","args":["tests",{"format":"%s Tests on %d node(s)"}]},{"function":"summary","args":["failures",{"format":"%s Failed test on %d node(s)"}]},{"function":"summary","args":["success",{"format":"%s Passed tests on %d node(s)"}]}],"input":{"yaml_rules":{"prompt":"Gossfile contents","description":"Contents of the Gossfile to validate","type":"string","maxlength":5120,"validation":".","optional":true},"file":{"prompt":"Goss File","description":"Path to the Goss validation specification","type":"string","maxlength":256,"validation":".+","optional":true},"vars":{"prompt":"Vars File","description":"Path to a file to use as template variables","type":"string","maxlength":256,"validation":".+","optional":true},"yaml_vars":{"prompt":"Variables YAML","description":"YAML data to use as variables","type":"string","maxlength":5120,"validation":".+","optional":true}},"output":{"tests":{"description":"The number of tests that were run","display_as":"Tests","type":"integer"},"failures":{"description":"The number of tests that failed","display_as":"Failed Tests","type":"integer"},"runtime":{"description":"The time it took to run the tests, in seconds","display_as":"Runtime","type":"integer"},"success":{"description":"Indicates how many tests passed","display_as":"Success","type":"integer"},"skipped":{"description":"Indicates how many tests were skipped","display_as":"Skipped","type":"integer"},"summary":{"description":"A human friendly test result","display_as":"Summary","type":"string"},"results":{"description":"The full test results","display_as":"Results","type":"array"}}},{"action":"trigger","input":{"checks":{"prompt":"Checks","description":"Check to trigger, empty means all","type":"array","optional":true}},"output":{"failed":{"description":"List of checks that could not be triggered","display_as":"Failed","type":"array"},"transitioned":{"description":"List of checks that were triggered","display_as":"Triggered","type":"array"},"skipped":{"description":"List of checks that was skipped","display_as":"Skipped","type":"array"}},"display":"failed","description":"Force an immediate check of one or more checks"}]}
\ No newline at end of file
diff --git a/client/scoutclient/doc.go b/client/scoutclient/doc.go
index dbd8651a0..4c446f01c 100644
--- a/client/scoutclient/doc.go
+++ b/client/scoutclient/doc.go
@@ -1,8 +1,8 @@
 // generated code; DO NOT EDIT
 //
-// Client for Choria RPC Agent 'scout' Version 0.27.0 generated using Choria version 0.27.0
+// Client for Choria RPC Agent 'scout' Version 0.28.0 generated using Choria version 0.28.0
 
-// Package scoutclient is an API client to the Choria Scout agent Version 0.27.0.
+// Package scoutclient is an API client to the Choria Scout agent Version 0.28.0.
 //
 // Actions:
 //   - Checks - Obtain a list of checks and their current status
diff --git a/docs/content/configuration/_index.md b/docs/content/configuration/_index.md
index 71f10e4d4..801fd13fe 100644
--- a/docs/content/configuration/_index.md
+++ b/docs/content/configuration/_index.md
@@ -8,7 +8,7 @@ pre = "<b>4. </b>"
 This is a list of all known Configuration settings. This list is based on declared settings within the Choria Go code base and so will not cover 100% of settings - plugins can contribute their own settings which are note known at compile time.
 
 {{% notice secondary "Version Hint" code-branch %}}
-Built on *19 Dec 23 18:14 UTC* using version *0.27.0*
+Built on *03 Feb 24 12:57 UTC* using version *0.28.0*
 {{% /notice %}}
 
 ### Run-time configuration
diff --git a/internal/fs/ddl/cache/agent/aaa_signer.ddl b/internal/fs/ddl/cache/agent/aaa_signer.ddl
index 933830342..ade1f151e 100644
--- a/internal/fs/ddl/cache/agent/aaa_signer.ddl
+++ b/internal/fs/ddl/cache/agent/aaa_signer.ddl
@@ -1,8 +1,12 @@
+--  Copyright (c) 2024, R.I. Pienaar and the Choria Project contributors
+--
+--  SPDX-License-Identifier: Apache-2.0
+
 metadata :name        => "aaa_signer",
          :description => "Request Signer for Choria AAA Service",
          :author      => "R.I.Pienaar <rip@devco.net>",
          :license     => "Apache-2.0",
-         :version     => "0.27.0",
+         :version     => "0.28.0",
          :url         => "https://github.com/choria-io/aaasvc",
          :provider    => "golang",
          :service     => true,
diff --git a/internal/fs/ddl/cache/agent/aaa_signer.json b/internal/fs/ddl/cache/agent/aaa_signer.json
index ca9f6d1ed..2a11ff191 100644
--- a/internal/fs/ddl/cache/agent/aaa_signer.json
+++ b/internal/fs/ddl/cache/agent/aaa_signer.json
@@ -5,7 +5,7 @@
     "author": "R.I.Pienaar \u003crip@devco.net\u003e",
     "timeout": 10,
     "name": "aaa_signer",
-    "version": "0.27.0",
+    "version": "0.28.0",
     "url": "https://github.com/choria-io/aaasvc",
     "description": "Request Signer for Choria AAA Service",
     "provider": "golang",
diff --git a/internal/fs/ddl/cache/agent/choria_provision.ddl b/internal/fs/ddl/cache/agent/choria_provision.ddl
index 50d1e5a6c..ea7a79a70 100644
--- a/internal/fs/ddl/cache/agent/choria_provision.ddl
+++ b/internal/fs/ddl/cache/agent/choria_provision.ddl
@@ -1,8 +1,16 @@
+--  Copyright (c) 2024, R.I. Pienaar and the Choria Project contributors
+--
+--  SPDX-License-Identifier: Apache-2.0
+
+--  Copyright (c) 2024, R.I. Pienaar and the Choria Project contributors
+--
+--  SPDX-License-Identifier: Apache-2.0
+
 metadata :name        => "choria_provision",
          :description => "Choria Provisioner",
          :author      => "R.I.Pienaar <rip@devco.net>",
          :license     => "Apache-2.0",
-         :version     => "0.27.0",
+         :version     => "0.28.0",
          :url         => "https://choria.io",
          :timeout     => 20
 
diff --git a/internal/fs/ddl/cache/agent/choria_provision.json b/internal/fs/ddl/cache/agent/choria_provision.json
index 99dfcd817..b7976febd 100644
--- a/internal/fs/ddl/cache/agent/choria_provision.json
+++ b/internal/fs/ddl/cache/agent/choria_provision.json
@@ -5,7 +5,7 @@
     "description": "Choria Provisioner",
     "author": "R.I.Pienaar <rip@devco.net>",
     "license": "Apache-2.0",
-    "version": "0.27.0",
+    "version": "0.28.0",
     "url": "https://choria.io",
     "timeout": 20
   },
diff --git a/internal/fs/ddl/cache/agent/choria_registry.ddl b/internal/fs/ddl/cache/agent/choria_registry.ddl
index 20e198e93..b92a36d78 100644
--- a/internal/fs/ddl/cache/agent/choria_registry.ddl
+++ b/internal/fs/ddl/cache/agent/choria_registry.ddl
@@ -1,8 +1,12 @@
+--  Copyright (c) 2024, R.I. Pienaar and the Choria Project contributors
+--
+--  SPDX-License-Identifier: Apache-2.0
+
 metadata :name        => "choria_registry",
          :description => "Choria Registry Service",
          :author      => "rip@devco.net <rip@devco.net>",
          :license     => "Apache-2.0",
-         :version     => "0.27.0",
+         :version     => "0.28.0",
          :url         => "https://choria.io",
          :provider    => "golang",
          :service     => true,
diff --git a/internal/fs/ddl/cache/agent/choria_registry.json b/internal/fs/ddl/cache/agent/choria_registry.json
index 01a81b01e..3386b9100 100644
--- a/internal/fs/ddl/cache/agent/choria_registry.json
+++ b/internal/fs/ddl/cache/agent/choria_registry.json
@@ -5,7 +5,7 @@
     "author": "rip@devco.net \u003crip@devco.net\u003e",
     "timeout": 2,
     "name": "choria_registry",
-    "version": "0.27.0",
+    "version": "0.28.0",
     "url": "https://choria.io",
     "description": "Choria Registry Service",
     "provider": "golang",
diff --git a/internal/fs/ddl/cache/agent/choria_util.ddl b/internal/fs/ddl/cache/agent/choria_util.ddl
index 815bce696..97fc6b95c 100644
--- a/internal/fs/ddl/cache/agent/choria_util.ddl
+++ b/internal/fs/ddl/cache/agent/choria_util.ddl
@@ -1,8 +1,12 @@
+--  Copyright (c) 2024, R.I. Pienaar and the Choria Project contributors
+--
+--  SPDX-License-Identifier: Apache-2.0
+
 metadata :name        => "choria_util",
          :description => "Choria Utilities",
          :author      => "R.I.Pienaar <rip@devco.net>",
          :license     => "Apache-2.0",
-         :version     => "0.27.0",
+         :version     => "0.28.0",
          :url         => "https://choria.io",
          :timeout     => 2
 
diff --git a/internal/fs/ddl/cache/agent/choria_util.json b/internal/fs/ddl/cache/agent/choria_util.json
index 79912d9e3..707b60ba4 100644
--- a/internal/fs/ddl/cache/agent/choria_util.json
+++ b/internal/fs/ddl/cache/agent/choria_util.json
@@ -5,7 +5,7 @@
     "description": "Choria Utilities",
     "author": "R.I.Pienaar <rip@devco.net>",
     "license": "Apache-2.0",
-    "version": "0.27.0",
+    "version": "0.28.0",
     "url": "https://choria.io",
     "timeout": 2
   },
diff --git a/internal/fs/ddl/cache/agent/rpcutil.ddl b/internal/fs/ddl/cache/agent/rpcutil.ddl
index b9e09754d..e7f954503 100644
--- a/internal/fs/ddl/cache/agent/rpcutil.ddl
+++ b/internal/fs/ddl/cache/agent/rpcutil.ddl
@@ -1,8 +1,12 @@
+--  Copyright (c) 2024, R.I. Pienaar and the Choria Project contributors
+--
+--  SPDX-License-Identifier: Apache-2.0
+
 metadata :name        => "rpcutil",
          :description => "Utility actions that expose information about the state of the running Server",
          :author      => "R.I.Pienaar <rip@devco.net>",
          :license     => "Apache-2.0",
-         :version     => "0.27.0",
+         :version     => "0.28.0",
          :url         => "https://choria.io/",
          :timeout     => 2
 
diff --git a/internal/fs/ddl/cache/agent/rpcutil.json b/internal/fs/ddl/cache/agent/rpcutil.json
index 4bddc912c..1f148f71f 100644
--- a/internal/fs/ddl/cache/agent/rpcutil.json
+++ b/internal/fs/ddl/cache/agent/rpcutil.json
@@ -5,7 +5,7 @@
     "description": "Utility actions that expose information about the state of the running Server",
     "author": "R.I.Pienaar <rip@devco.net>",
     "license": "Apache-2.0",
-    "version": "0.27.0",
+    "version": "0.28.0",
     "url": "https://choria.io/",
     "timeout": 2
   },
diff --git a/internal/fs/ddl/cache/agent/scout.ddl b/internal/fs/ddl/cache/agent/scout.ddl
index 956cacb93..b15033c01 100644
--- a/internal/fs/ddl/cache/agent/scout.ddl
+++ b/internal/fs/ddl/cache/agent/scout.ddl
@@ -1,8 +1,12 @@
+--  Copyright (c) 2024, R.I. Pienaar and the Choria Project contributors
+--
+--  SPDX-License-Identifier: Apache-2.0
+
 metadata :name        => "scout",
          :description => "Choria Scout Agent Management API",
          :author      => "R.I.Pienaar <rip@devco.net>",
          :license     => "Apache-2.0",
-         :version     => "0.27.0",
+         :version     => "0.28.0",
          :url         => "https://choria.io",
          :provider    => "golang",
          :timeout     => 5
diff --git a/internal/fs/ddl/cache/agent/scout.json b/internal/fs/ddl/cache/agent/scout.json
index c27749721..6d6544bbc 100644
--- a/internal/fs/ddl/cache/agent/scout.json
+++ b/internal/fs/ddl/cache/agent/scout.json
@@ -5,7 +5,7 @@
     "author": "R.I.Pienaar <rip@devco.net>",
     "timeout": 5,
     "name": "scout",
-    "version": "0.27.0",
+    "version": "0.28.0",
     "url": "https://choria.io",
     "description": "Choria Scout Agent Management API",
     "provider": "golang"