Skip to content

plugin-example-structkind

Placement runtime (out-of-process over gRPC)
Source github.com/opencharly/charly/candy/plugin-example-structkind
Version 2026.182.0440
Candy plugin-example-structkind

This plugin is not listed in charly/charly.yml’s compiled_plugins:. It is not part of the shipped binary: charly builds and loads it out-of-process over gRPC when a plan references one of its words (the coexist path).

The reserved words this plugin serves:

  • examplestructkind — kind class

Reference OUT-OF-TREE charly STRUCTURAL class:kind plugin (F5) — a standalone Go module serving the examplestructkind entity KIND over go-plugin gRPC. Unlike the FLAT kind (candy/plugin-example-kind, F4, body -> opaque uf.PluginKinds), a STRUCTURAL kind declares Structural:true and its OpLoad returns a spec.Deploy (BundleNode) MEMBER TREE the host folds into uf.Bundle — the SAME map a builtin pod/group/candy decoder populates in-proc — so the entity participates in deploy/check like a builtin. It also proves F5 authored-member INPUT-threading: the AUTHORED resource-member children are pre-decoded host-side (core buildBundleNode) and threaded via op.Env, and the plugin ATTACHES them to its reply — so the reconstructed uf.Bundle carries the AUTHORED members (peer/nested + cross-member checks), not a synthesized stand-in. NOT in compiled_plugins (out-of-process only); the channel the group/pod/vm/k8s/local/android/candy externalizations reuse.

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/examplestructkind.cue — the SELF-CONTAINED CUE def validating the example STRUCTURAL
// external KIND's authored SCALAR body. Ships over Describe (schema_cue); references no base def so
// it compiles standalone (BuildCapabilities compiles it alone, failing loudly if broken).
//
// This def is CLOSED (the default) and validates ONLY op.Params — the kind-specific scalar body.
// The authored resource-MEMBER children are NOT part of this def: they cannot ride op.Params (a
// closed def rejects them), so the host pre-decodes them and threads them via op.Env
// (spec.StructuralKindLoadEnv, F5 authored-member input-threading). This mirrors the shape the
// `group` externalization reuses — deploy-config scalars in the value, members via the env channel.
#ExamplestructkindInput: {
// marker is an OPTIONAL kind-specific scalar (op.Params) — proving kind-specific config decode
// coexists with host-threaded members (op.Env). Stamped into the reply Description.
marker?: string
// disposable / lifecycle / description are the deploy-config passthrough the plugin maps into
// its spec.Deploy reply, so a structural node can BE a disposable check bed — the exact shape
// the group cutover needs. (The members ride op.Env, never this closed value.)
disposable?: bool
lifecycle?: string
description?: string
}

See also the candy reference for this candy’s install surface.