plugin-doctor
| Placement | compiled-in (in-process) |
| Source | github.com/opencharly/plugin-doctor/candy/plugin-doctor |
| Version | 2026.181.0001 |
| Candy | plugin-doctor |
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:
doctor— command class
What it does
Section titled “What it does”COMPILED-IN charly COMMAND-class plugin that OWNS the externalized charly doctor
CLI — the host-dependency-status surface. The plugin owns the command end to end: the
flag grammar (–json), the ENTIRE check list + group orchestration (container engine /
build infra / service management / VMs / VFIO / encrypted storage / secret storage /
tunnels / merge & registry / shell & TTY / podman machine), the pass/warn/fail verdicts,
the human + JSON report formatting, the exit code, AND the pure host ops it runs itself
(binary probes via exec.LookPath / exec.Command, file reads via os.Stat / os.ReadFile).
No plugin-specific report LOGIC is left in core.
The GPU/VFIO/device detection primitives (DetectGPU / DetectAMDGPU / detectAMDGFXVersion / GPURunArgs / DetectVFIO / MemlockLimitBytes / VfioGroupAccessible / vfioPciAvailable / the device_patterns glob) and the credential-store health probe are NOT a core dependency (K5 seam-death): this plugin reaches candy/plugin-gpu’s verb:gpu and candy/plugin-secrets’ verb:credential PEER-TO-PEER over its own sdk.Executor.InvokeProvider — the exact pattern the arbiter and candy/plugin-vm already use for the same GPU primitives — and the install-hint / distro-family / device-description / device-pattern tables are this plugin’s OWN embed (data.go/data.yml), not core-owned data threaded across a seam. There is no remaining core HostBuild dependency at all: no hidden core-command forward, and no seam for “the genuine host-coupled facts” — the plugin runs everything itself, including the two peer-plugin dispatches.
doctor is COMPILED-IN (listed in charly/charly.yml compiled_plugins) BECAUSE its Invoke(OpRun) needs the in-proc reverse channel — threaded by dispatchInProcCommand (“Seam A”) — for its sdk.Executor.InvokeProvider calls. The out-of-process CliMain path passes a nil executor, so those two peer calls degrade to zero values rather than erroring (the report still renders, minus the two peer-plugin-backed sections); the canonical placement stays compiled-in regardless.
command:doctor dispatches through the COMPILED-IN registry path (registerCompiledPlugin →
resolve(ClassCommand,“doctor”) → dispatchInProcCommand → Invoke(OpRun) with the threaded
in-proc reverse channel), so NewMeta advertises command:doctor while the served CUE schema
carries no plugin_input (the args are plain CLI tokens). The R10 witness is the disposable
check-doctor-local bed: charly doctor exits 0 and prints the host-dependency report,
proving the externalized command + its peer verb:gpu/verb:credential dispatches end-to-end.
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/doctor.cue
Section titled “schema/doctor.cue”// plugin-doctor's OWN self-contained CUE schema — the plugin's declaration// surface, used two ways exactly like every other plugin's schema (there is// no schema-less plugin)://// 1. SERVE over Describe — the host splices `base ++ plugin` at the load gate, so the// plugin's declarations travel WITH it and a self-contained schema that will not// splice is a LOUD load failure.// 2. DOCUMENT the plugin's published surface — the reference site's per-plugin page is// rendered from its providers, this schema, and the candy description.//// command:doctor's authored input is its pass-through CLI grammar (the OpRun `{args:// [...]}` envelope) and verb:freshness-guard is invoked by the kernel's preflight phase,// so this schema DOCUMENTS both capability contracts rather than a structured// plugin_input. SELF-CONTAINED: it references no base def, so it compiles STANDALONE// (the property that lets the SDK compile it serve-side).#DoctorPlugin: { // The declared capability words (the plugin.providers surface) — the command:doctor // CLI plus the verb:freshness-guard preflight hook — recorded here as part of the // plugin's published declaration surface. providers: [...string]
// The command word the plugin serves. command: "doctor"
// The verb word the kernel's preflight phase invokes. verb: "freshness-guard"
// What the command does, in one line (the public-docs surface). contract: string & !=""
// The configuration surface: env var names the plugin reads, recorded here as part // of the plugin's published declaration surface. config?: [string]: string}See also the candy reference for this candy’s install surface.