plugin-substrate
| Placement | compiled-in (in-process) |
| Source | github.com/opencharly/plugin-substrate/candy/plugin-substrate |
| Version | 2026.196.0600 |
| Candy | plugin-substrate |
This plugin is listed in charly/charly.yml’s compiled_plugins:, so its providers are compiled into the charly binary and register in-process.
Providers
Section titled “Providers”The reserved words this plugin serves:
android— kind classkindcluster— kind classkubernetes— kind classkubevirt— kind classlocal— kind classpod— kind classvm— kind class
What it does
Section titled “What it does”The SUBSTRATE structural deploy KINDS — pod / vm / kubernetes / local / android / kubevirt / kindcluster — relocated into
ONE candy (C2-substrate; formerly the shared built-in standaloneKind). Each substrate kind is
BOTH a standalone TEMPLATE (a bare vm:/pod: block → the typed template map uf.Pod/uf.VM/…,
the PRIMARY VM authoring form) AND a DEPLOY (from:/image: cross-ref or resource members →
uf.Deploy). Its value is RICH + core-referencing (#Vm/#Deploy/#LibvirtDomain/…), so — unlike
group’s small self-contained #GroupInput — it cannot be re-decoded from op.Params nor validated
by a self-contained plugin schema. So the HOST pre-decodes the CANONICAL node via the core
loader (buildDeployNode / decodeNodeValue — the single decode source of truth), validates its
value against the KEPT #charly status fan-out; the deploy-cone-coupled enrichment + the vm/kubernetes/kubevirt/android collectors
live here too (relocated from core in K5). kubevirt is the 6th deploy substrate (a KubeVirt VM on a
cluster), declaring the ssh venue WITHOUT exclusive_venue + a deep OpValidate (the source-arm XOR + GPU resource XOR).
Parameter schema
Section titled “Parameter schema”The CUE schema below is the authoritative grammar for this plugin’s input. It is the same single source that generates the plugin’s Go parameter types and answers the runtime Describe RPC, so this page cannot disagree with either.
schema/substrate.cue
Section titled “schema/substrate.cue”// plugin-substrate's OWN self-contained CUE schema — the SINGLE SOURCE for this plugin's// served declaration surface (there is no schema-less plugin: every plugin ships a// non-empty schema over Describe).//// SELF-CONTAINED and PACKAGE-LESS: it references no base def and carries no package// clause, so it compiles STANDALONE — the property the SDK's serve-side compile needs// and the property that lets the host splice `base ++ plugin` at the load gate// (registerPluginUnitSchema); a self-contained schema that will not splice is a LOUD// load failure.//// NO GO CONSUMER: the plugin declares no typed `plugin_input` (its authored input is// its pass-through CLI grammar), so this schema generates NO `params` package and has// NO `cue exp gengotypes` artifact — it is the SERVED documentation/config surface,// not a code-generation source.//// It DOCUMENTS the substrate provider's kind/command/verb words and the deploy traits they carry. The rich substrate VALUES are validated HOST-SIDE against the kept `#<Kind>Value` defs (each capability declares `InputDef:""`), not decoded here.#SubstratePlugin: { // The structural deploy kind words this provider serves. kinds: [...string]
// The command words this provider serves (reap-orphans). commands: [...string]
// The internal-only verb words this provider serves (status-fanout). verbs: [...string]
// What this provider does, in one line (the public-docs surface). contract: string & !=""
// The configuration surface: env var names the collectors read. config?: [string]: string}See also the candy reference for this candy’s install surface.