Skip to content

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.

The reserved words this plugin serves:

  • doctor — command class

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.


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