Task · SKT-0142

Apply and remove one namespaced blueprint live on a running process

Description

Custom and git blueprints are staged through the control API but only load at process start: docs/custom-blueprints.md:114-118 states the runner loads the selected snapshot at startup, writes the boot manifest and “runs with that fixed set for its lifetime. There is no hot-reload.” The only live levers are enable and disable of an already-loaded blueprint (internal/control/http.go:686-687) and staging upload and delete (internal/control/http.go:848-888, staged only). An operator that drives a running process, with no restart in the loop, therefore cannot add or retire a blueprint’s telemetry on demand. Owner ruling 2026-10-17 approves one generic control operation to apply or remove a blueprint live. It must not be vendor-specific, product-specific or customer-specific: it takes any blueprint under a namespace, the way uploads and git sources already do.

Scope notes. Substrate-scoped constructs carry no blueprint label and rely on declared identity plus load-time rejection of collisions (blueprint.ValidateSet, internal/blueprint/load.go:333-350), so a live apply has to repeat that check against the running set rather than only against staged files. Control state persists in the snapshot file at CONFIG_SNAPSHOT_PATH (internal/config/config.go:75,190; control.State, internal/control/control.go:46-58); the owner brief called this CONTROL_STATE, which is the same snapshot. The runner builds its set once (internal/runner/runner.go:276, Runner), so the live set needs a safe mutation seam under the tick loop.

Out of scope, deliberately. No backfill of history for an applied blueprint. No TTL or expiry: an applied blueprint lives until it is removed, and any lease or expiry policy belongs to the downstream operator or client that calls the remove operation.

Acceptance Criteria

Definition of Done

Implementation Notes

Landed 29583af (rc v1.6.0-rc.201) in loop50. just check and just race green on composed tree c167866f; just gen no drift. DoD #3 just dump not run: no renderer change (control plane only).

References

View the source file on GitHub