Value stored in the agent_groups KV bucket, keyed by pc_id. The
wrapper struct (instead of a bare Vec<String>) leaves room for
future per-PC metadata (membership timestamps, who-set-it audit, …)
without breaking the wire format.
Per-scope partial config. Every field is Option<T>: Some =
set, None = inherit from the next-less-specific scope. Serde
default + skip_serializing_if keeps the wire JSON tight —
unset fields don’t appear in the bucket value.
Concrete config the agent runs against once the scope stack has
been flattened. target_version stays Option because “no
rollout target set anywhere” is a meaningful state (the agent
just keeps running the version it has); the other fields always
have a value, falling back to EffectiveConfig::builtin_defaults
when no scope sets them.
Payload sent on logs.fetch.<pc_id> to request the tail of an
agent’s log file. Unknown / missing fields fall back to sensible
defaults so the CLI / Web UI can grow the shape later without
retraining every fleet host.
Non-fatal observations from resolve that the caller should
log. Currently only “two of this PC’s groups set the same field
to different values” — useful pre-emptive debugging signal when
canary / wave / dept overlays accidentally overlap.