From c540ad5d7f107609a681c41f24ebea2ab43ec719 Mon Sep 17 00:00:00 2001 From: Admin <1+admin@noreply.git.dcntrlized.org> Date: Mon, 31 Aug 2026 09:43:43 +0100 Subject: [PATCH] feat(config): fail-closed manifest-driven injection + runtime write-back delivery (D6) --- spec.yaml | 4 +- .../src/components/service/service-config.tsx | 23 +++- src/handlers/config/config.go | 7 + src/lib/containers/configdeliver.go | 122 +++++++++++++++++ src/lib/containers/start.go | 62 +++++++-- src/lib/containers/start_test.go | 124 +++++++++++++++++- 6 files changed, 326 insertions(+), 16 deletions(-) create mode 100644 src/lib/containers/configdeliver.go diff --git a/spec.yaml b/spec.yaml index c1d27ef..89ff51a 100644 --- a/spec.yaml +++ b/spec.yaml @@ -987,7 +987,9 @@ paths: stored plaintext (read-write); password fields are AES-256-GCM encrypted at rest, keyed by /maestro/secrets.key, and never returned again — the response is only a ServiceConfigEntry with set:true. - The value is injected as the field's env key on the next start. + The value is injected as the field's env key at start, and, when the + service is running and exposes POST /config (D6 write-back), delivered + to it at runtime over the mTLS peer edge. requestBody: required: true content: diff --git a/src/frontend/src/components/service/service-config.tsx b/src/frontend/src/components/service/service-config.tsx index e9271ad..883ad61 100644 --- a/src/frontend/src/components/service/service-config.tsx +++ b/src/frontend/src/components/service/service-config.tsx @@ -44,6 +44,11 @@ export function ServiceConfigDialog({ service, onClose }: ServiceConfigDialogPro const open = service !== null const { load, refresh } = useServiceConfig(service?.name ?? null, open) + const running = + (service?.status ?? '').toLowerCase() === 'running' || + (service?.status ?? '').toLowerCase() === 'starting' || + (service?.status ?? '').toLowerCase() === 'restarting' + return (

Operator-configured values declared by the service manifest. Passwords are stored - encrypted and are never shown again — only whether they are set. Applies on next - start. + encrypted and are never shown again — only whether they are set. + {running ? ' Values apply on the next restart.' : ' Values apply at next start.'}