AI Decision System
Replayable, offline-verifiable records for AI-assisted go/no-go decisions: experiment promotions, typed model answers and human-approved actions.
翻譯準備中
Explore and map GitOps in your clusters
翻譯準備中
開發工具Go · PythonGitHub @confighub自行安裝營運者未確認
試用過了嗎? 點一下就好,不需要登入。
正在載入完整 README。 以下為已儲存的摘錄。
GitOps explorer for agents.
Read-only, deterministic evidence about who owns what in your cluster, how it got
there and what changed, for AI agents first and for the people and scripts they
work with. Unknowns are stated, never guessed.
The goal is verified answers with less agent spend: fewer dollars, credits
and minutes than standalone Claude needs with ordinary read-only tools. We
measure that claim, including where scout adds cost. The
3.0 delivery plan sets release criteria for
fair cost comparisons and preserved correctness; general savings are not yet proven.檢視完整 README ↗GitOps explorer for agents.
Read-only, deterministic evidence about who owns what in your cluster, how it got there and what changed, for AI agents first and for the people and scripts they work with. Unknowns are stated, never guessed.
The goal is verified answers with less agent spend: fewer dollars, credits and minutes than standalone Claude needs with ordinary read-only tools. We measure that claim, including where scout adds cost. The 3.0 delivery plan sets release criteria for fair cost comparisons and preserved correctness; general savings are not yet proven.
v2.12.4 release | Start here | Is this image deployed? | Command guide
"Is this deployed?" usually means several questions: did the controller consume the right revision, did the objects reach the cluster, and is the application ready? Those answers live in different resources and tools.
cub-scout brings that evidence together without taking over delivery. Start from a live cluster, follow ownership and source chains, inspect failures, and compare against supplied or ConfigHub-managed configuration. Missing evidence stays visible; a healthy Pod is not proof that the intended release was delivered.
No ConfigHub account or in-cluster Scout installation is needed for standalone inspection. Live checks need Kubernetes API access; saved-file and bundle workflows can run offline. Observation does not modify cluster state, but read permissions, sensitive output, and API load still matter.
brew install confighub/tap/cub-scout
cub-scout doctor # What needs attention?
cub-scout gitops status # What do delivery controllers report?
cub-scout map # Explore interactively
Homebrew builds the checksum-pinned release source and installs its Go build
dependency. If an old cask is installed, run
brew uninstall --cask confighub/tap/cub-scout first.
Already using cub? Run cub plugin install confighub/[email protected], then
cub scout doctor. Installation and verified downloads
cover macOS, Linux, Windows, and tagged source builds.
| Run mode | Command | Best for | Notes |
|---|---|---|---|
| Standalone client | cub-scout doctor, cub-scout map, cub-scout trace ... | CLI, interactive TUI, or JSON in a script | Uses the current kube context; no ConfigHub dependency. kubectl cub-scout is another invocation of this client, not another service. |
| ConfigHub plugin | cub scout doctor, cub scout compare ... | ConfigHub users who want the same observer inside their existing cub workflow | Same read-only scout behavior, with plugin-aware help text and inherited cub context. |
| MCP server | cub-scout mcp serve | Agents calling structured read-only tools | The MCP host starts a local stdio process. Nothing must already be running. Agents with shell access can also call the CLI directly. |
| Watch stream | cub-scout watch --output-file ./events.jsonl | A long-running local observer feeding incident tooling | Polling-based discovery, ownership-change, drift, and scan events; webhook and receipt output are also available. |
| In-cluster bot | cub-scout bot --webhook <url> | One observer Pod feeding an approved sink | Same polling engine, with ServiceAccount auth and CUB_SCOUT_BOT_* configuration. It does not deploy or trigger sync. See bot setup and container availability limits. |
Standalone or connected — a mode over all five surfaces. By default cub-scout
runs standalone against one kube context, with no ConfigHub dependency. Add
--with-confighub (or use the confighub_* MCP tools) to run connected to
ConfigHub for governed desired-vs-live comparison,
delivery history and live-status, fleet and Resource queries, and import
proposals. Connected mode is read-only and additive: it never writes to the
cluster, and standalone stays fully functional without ConfigHub.
Prefer browsing intended configuration in a connected TUI? The separately installed companion explorer uses Scout v2.10.0 in its Resource Evidence tab. Commander v0.3.0 requires an explicit Target-ID/kube-context binding. Scout's standalone TUI remains available.
Cub-scout helps users answer questions about k8s and GitOps clusters in one place.
| User question | cub-scout surface | What cub-scout provides |
|---|---|---|
| What is running, and who owns it? | doctor, map, trace, explain | Live inventory, ownership, source chain, recent events, and next read-only checks across supported controllers and platforms. |
| Can I inspect one exact resource without running a broad diagnostic sweep? | explain Deployment/api -n prod --bounded --api-version apps/v1 --kube-context <context> --format json; MCP explain with bounded: true; TUI Ctrl+e | v2.10.0: explicit context and API identity; one discovery document and one object GET on a cold read. No controller CLI, ConfigHub, pod/event fan-out, or object LIST. The TUI requires an inventory-bound kube context; unbound/in-cluster inventory, unsupported APIs, RBAC failures, and identity mismatches remain unavailable evidence. |
| Can repeated explorer or agent reads reuse the same observation, and can I force a fresh check? | Bounded MCP explain; TUI Ctrl+e and r; CLI explain --bounded --refresh | v2.10.0: a maximum of 16 object observations reused for less than 15 seconds within one MCP/TUI session. resourceRead exposes availability, scope, timestamps, cache state, and discovery/object read counts. Refresh, expiry, and context/credential-configuration changes invalidate reuse. Leaving the TUI read cancels pending work and rejects late results. Separate CLI processes do not share this cache. |
| What did this narrow check deliberately leave unverified? | Bounded explain JSON, ASCII/Markdown, MCP, and TUI | v2.10.0: structured omissions distinguish source/controller evidence, related pods/events, and desired/live comparison from object-local ownership and readiness. Readiness is not delivery completion or application success. No Secret payload reads. |
| Which source space, unit, and revision does this live resource identify? | explain Deployment/api -n prod --bounded --api-version apps/v1 --kube-context <context> --format json; bounded MCP explain; TUI Ctrl+e | v2.10.0: configHubOrigin parses the already-read confighub.com/origin annotation, preserving space/unit IDs, slugs, and an optional exact integer revision. No additional requests or ConfigHub authentication. This is observed source metadata, not independently verified provenance, a release/target/component/variant join, or proof of delivery. . |
The main path starts from a live cluster. It works standalone with your current kube context, or connected to ConfigHub for governed comparison, history, import, fleet queries, and AI-friendly read-only workflows. Local repo and manifest inputs are available later for adoption, import-preview, and source-file enrichment, but they are not the first mental model.
Resource MCP reads and Application-row joins are v2.9.0 additions. See
release notes for scope and validation. Scoped Resource
queries use ConfigHub rather than Kubernetes, but
each repeated query still runs a fresh cub command. Watch/bot remain polling
observers; output caps and freshness stamps are not API rate limits. Reuse saved
evidence when appropriate. Request-cost proof.
v2.10.0 adds bounded explorer evidence. See the release notes and upgrade order for Scout/companion compatibility, request budgets, and explicit validation limits. The companion is separately packaged; install Scout v2.10.0 before Commander v0.3.0.
v2.10.1 corrects feedback freshness. Missing or future report timestamps cannot justify success; old success and failure reports ask for a current check. See patch notes and upgrade guidance.
v2.11.0 added identity-linked release checks
(controller-revision evidence, exact OCI release checks, and opt-in
running-image identity) and cheaper long-running observation (within-cycle read
coalescing, opt-in watch-backed idle observation, and a new resource.deleted
event), plus local bot images built from verified release archives. See the
release notes.
v2.14.2 is the latest release. Live status is read from each Release, where ConfigHub records it since a server change of 2026-10-03; cub-scout used to look only at a Space annotation nothing writes any more. See the v2.14.2 release notes.
v2.14.1: a filter given an empty value is refused where it used to run unfiltered, and the plugin's skills match v2.14. See the v2.14.1 release notes.
v2.14.0: cub-scout now reads ConfigHub through the
ConfigHub SDK and checks the session the same way, so a read-only command
whose reads are covered needs no cub binary; cub is still needed to log
in, for every write, and for the reads not yet moved.
CUB_SCOUT_CONFIGHUB_READER=cub reads through cub as before. A new preview
command, gitops tree, shows what is under each Argo CD Application to any
depth. No cost or time saving for an agent is claimed for either. The work
that "v2.14" used to name, the P4 acceptance gates, moved to v2.15 and is not
claimed. See the v2.14.0 release notes.
v2.13.4 made gitops settings available to
agents: an MCP tool, gitops_settings, and a compact JSON --view summary. In
the eval cases that came with it, an agent that already held the raw kubectl
export never called the tool and gained nothing, while an agent with cub-scout
and no export answered a 300-deployer question correctly in four turns; that is
three runs on generated scenarios, not a general saving. A bare
--setting <name> now selects deployers that declare the setting. See the
v2.13.4 release notes.
v2.13.3 added gitops settings, a preview command that shows which Argo CD
and Flux deployers sync on their own, revert manual changes, prune, or apply
with non-default options, grouped by project or namespace. It reports declared
settings only. See the v2.13.3 release notes.
v2.13.2 is a correction release: upgrade from v2.13.1 or earlier for it. A
receipt for a Flux-delivered workload could name its parent's Git repository
instead of its own; a failing Flux delivery could be drawn as healthy; explain
said nothing about a failing delivery chain; and suggest-remedy ran kubectl
through a shell. It also made provenance work without the flux and argocd
CLIs and brought --kube-context to nearly every command that reads a cluster.
See the v2.13.2 release notes.
v2.13.1 added explicit context and namespace binding across investigation
workflows, exact-space ChangeOrder reads, combined-origin revision claims,
separate Sveltos delivery and health reports, and recorded map and explain
input; public Go imports moved to /v2. See the
v2.13.1 release notes.
v2.12.4 improved manual-edit attribution, Argo
tracking identity and workload health, retains useful MCP output on non-zero
exits, and adds compact inventory requests. Plugin-mode hints preserve
cub scout. These changes enable smaller agent reads; a general cost or credit
savings claim remains subject to the controlled benchmark. See the
v2.12.4 release notes.
From v2.12.3, explain and trace report the owner that
ownership detection finds, as map does, instead of the tracer that ran, and
cub-scout mcp serve accepts the MCP stdio transport, so MCP clients such as
Claude Code can connect. See the
v2.12.3 release notes. From v2.12.2, when cub is older than its ConfigHub
server, connected commands now say to run cub upgrade instead of reporting an
expired session, and ConfigHub unit events are classified by their exact values,
so nothing unrecognised is reported as success. See the
v2.12.2 release notes. Image checks, from v2.12.1,
verify complete Deployment ownership and replica coverage, with bounded
credential helpers and API error responses; see the
v2.12.1 release notes and the
image verification guide.
cub-scout vs cub: the boundarycub-scout | cub | |
|---|---|---|
| Role | Observe and explain | Act and govern |
| Cluster state | Read-only observation | Publishes desired releases for deployment controllers to reconcile |
| ConfigHub state | Read-only evidence; explicit import commands can write inventory | Authoring, import, promotion |
| Best for | Diagnosis, ownership, drift, attribution, AI tools | Intended-state authoring, GitOps pipelines |
cub-scout is the read-only witness for cluster state. ConfigHub (driven by cub) is the authority. The binaries ship separately; explicit inventory-import commands are distinguished from read-only observation.
Use Scout when you need cross-controller evidence that works in a terminal, automation, and an agent workflow. Use your delivery controller or approved deployment tooling to change desired state and reconcile it. Dedicated cluster and GitOps explorers remain useful for live graphs, logs, and interactive operations; Scout does not claim to replace every one of their views.
An event-driven delivery bot has a different job: trigger delivery and report
controller status back. Scout reads that feedback and checks it alongside live
evidence. Its bot mode is an observation producer, not a replacement syncer.
See the version-pinned capability comparison
for verified strengths, competing capabilities, and the gaps still on the roadmap.
cub-scout's commands fall into eight groups. Read them as a live-cluster journey first: observe what is running, diagnose one thing, compare live state to governed intent when connected, then use adoption/import paths only when you are ready to bring existing config into ConfigHub.
Each command's Inputs column tells you exactly what it needs — cluster only (standalone), cluster + ConfigHub auth (connected), bundle/file inputs, or a local git checkout for advanced adoption and source-enrichment flows.
| Command | What you get | Inputs |
|---|---|---|
doctor | One-screen cluster health summary with concrete next steps and optional bounded ConfigHub delivery evidence | cluster; optional ConfigHub auth for --with-confighub |
map (TUI / list / hooks / orphans / meaning) | Ownership inventory, lifecycle hooks, orphan detection, meaning-first grouping | cluster |
trace | Full ownership chain from K8s object → controller/source evidence, with optional object-correlated ConfigHub delivery evidence | cluster; optional ConfigHub auth for --with-confighub |
tree | Runtime, ownership, git, and composition hierarchies | cluster |
scan | Audit live cluster or manifest files against 46 built-in risk patterns | cluster or file |
graph export | Resource graph as DOT/JSON | cluster |
snapshot | Dump cluster state as GSF JSON | cluster |
watch | Stream observation events to webhook/file sinks | cluster |
bot | Run the watch engine continuously as an in-cluster observer | cluster |
status | Connection mode and cluster context info | cluster |
| Command | What you get | Inputs |
|---|---|---|
explain | Plain-English ownership and lineage for one resource, with phase-aware next-step hints and optional object-correlated ConfigHub delivery evidence | cluster; optional ConfigHub auth for --with-confighub |
debug | Guided GitOps debugging wizard | cluster |
suggest-remedy | Read-only description of a remediation that would resolve a finding — never applies it | cluster |
patterns (detect / explain / list) | Pattern-engine catalogue + matched findings | cluster or file |
gitops status | GitOps/controller pipeline health across Flux, Argo, Sveltos, and Modelplane controllers | cluster |
gitops settings | Declared sync, self-heal, prune and apply settings of Argo CD Applications and Flux Kustomizations and HelmReleases, grouped by project or namespace (preview since v2.13.3) | cluster |
gitops tree | What is under each deployer, to any depth: child deployers and the resources each reports, with settings and state (Argo CD; a preview since v2.14.0) | cluster |
| Command | What you get | Inputs |
|---|---|---|
compare (resource mode) | Single-resource DRY/WET/LIVE picture when connected; LIVE-only when standalone | cluster (+ConfigHub for DRY/WET) |
compare drift | Desired (file) vs live drift detection | cluster + file |
compare three-way | Scope-wide DRY/WET/LIVE with agreement summary and conformance verdict; --dry-from supports standalone rendered YAML as DRY | cluster + ConfigHub or rendered YAML |
compare object-set | Set-level desired-vs-live ObjectSetDiffReceipt from rendered YAML, with optional closed-world added/removed object diff | cluster + rendered YAML |
compare source-truth | Strategy-relative PASS / WATCH / ASK / BLOCK evidence for downstream acceptance tools (#393) | cluster + ConfigHub |
compare source-truth still requires connected source-truth evidence. compare three-way --dry-from and compare object-set --dry-from support standalone rendered YAML as desired-state input.
cub-scout receipts (#446) are the persistence sibling of compare: where compare produces an ephemeral live picture, receipt verify wraps the same evidence into an in-toto Statement v1 envelope that CI/CD gates, audit trails, postmortems, and acceptance-judge tooling can attach to a decision and later re-check for tampering.
| Command | What you get | Inputs |
|---|---|---|
receipt verify <kind>/<name> | Build a typed, fingerprinted receipt asserting a resource predicate. Predicates include applied-matches-spec, source-truth-pass, no-manual-edits-since, object-set-matches, workloads-converged, and prerequisites-met. Add --with-confighub to attach bounded, object-correlated delivery evidence as supporting evidence; it does not change which system owns delivery or application-health truth. Verdicts: PASS / WATCH / BLOCK / INCONCLUSIVE. | cluster (+ ConfigHub for source-truth-pass and optional --with-confighub) |
receipt verify --file <path> --scope namespace/<ns> | Build an install/object-set receipt (object-set-matches) proving every desired object in rendered YAML is present live and every authored field still matches. Add --predicate workloads-converged to prove rendered workloads reached a ready runtime state, with --grace-window measured from current-generation progress signals. | cluster + rendered YAML |
receipt verify --fail-on <verdict> | Same, plus CI-gate exit semantics: exit 2 when the receipt's verdict matches the listed set (WATCH / BLOCK / INCONCLUSIVE / any-non-pass). Artifact is preserved on fail. | cluster |
receipt verify --input-attestation <path> | Chain receipts: reference a prior receipt via inputAttestations[]. Each referenced receipt's fingerprint is verified before chaining; tampered receipts are refused. | cluster + prior receipt file |
receipt show <path> | Render a saved receipt (ASCII or JSON). Does NOT verify the fingerprint — works on tampered receipts for forensic inspection. | receipt file |
receipt validate <path> | Recompute and compare the receipt's fingerprint. Exit 0 OK / 1 mismatch / 2 I/O. | receipt file |
receipt list | Walk the local store ($CUB_SCOUT_RECEIPTS_DIR → $XDG_DATA_HOME/cub-scout/receipts → $HOME/.local/share/cub-scout/receipts) newest first, with freshness status for saved TTL-backed receipts. | local store |
Wire format: in-toto Statement v1 (_type = "https://in-toto.io/Statement/v1") wrapping https://cub-scout.dev/receipt/v1. SHA-256 fingerprint over RFC 8785 canonical JSON of the full Statement minus only predicate.fingerprint. Read-only by construction — receipts emit artifacts, never mutate.
cub-scout's attribution layer (#435) annotates every field mismatch with provenance evidence:
| Signal | Surfaces on | Inputs |
|---|---|---|
cause + managerHint (controller-drift / manual-edit / unknown) — from K8s managedFields | compare + explain | cluster |
gitSource.{repoUrl, revision, path} — from Argo Application / Flux GitRepository spec | compare + explain | cluster (needs argocd / flux CLI for tracer) |
gitSource.file + gitSource.line — raw-YAML back-resolution | compare | cluster + --source-path <local-checkout> |
incomingBindings[] — ConfigHub Links influencing this unit | compare | cluster + ConfigHub |
bindingSource — per-field upstream unit + binding path | compare | cluster + ConfigHub |
The verified manager-string enumeration covers Argo CD, Flux (kustomize / helm / source controllers), Helm direct, Crossplane (composite / composed / claim / MRD / refs), kro (applyset / parent / labeller), Sveltos (application/apply-patch), Modelplane via Crossplane composition managers, and kubectl-* interactive paths — strings not in the enumeration fall through to unknown rather than being guessed.
| Command | What you get | Inputs |
|---|---|---|
history | Connected ChangeSet timeline for one resource | ConfigHub |
impact | Connected blast-radius preview for one unit | ConfigHub |
fleet outliers | Deprecated in 2.x; planned 3.0 removal unless stable cross-cluster identity and fixture-backed comparisons justify retaining or rebuilding it; no equivalent replacement is available yet (#562) | ConfigHub |
summary (list / slack) | Connected summary storage + Slack delivery | ConfigHub |
views (resolve / open / project) | Resolve, open, and project ConfigHub Views (#391) | ConfigHub |
audit list | Break-glass accept/reject audit trail | ConfigHub |
bundle / catalog | Inspect, replay, diff, and summarize debug bundles + manage catalogs | bundle artifact |
Use this when you are bringing an existing cluster, Argo/Flux setup, debug bundle, or manifest repo toward ConfigHub. This is an adoption path, not the first-run troubleshooting path.
| Command | What you get | Inputs |
|---|---|---|
import --dry-run | Live-cluster ConfigHub adoption proposal | cluster |
import --from-bundle | Offline adoption proposal from captured bundle facts | bundle artifact |
import --git-path | Advanced local Git-structure preview, no upload or render | git checkout |
import parse-repo | Lower-level repo structure JSON for downstream tools | git checkout or remote URL |
import argocd | Proposal/import for one Argo CD Application's units | cluster + ConfigHub |
import cluster-aggregator | Aggregate import proposals across many clusters/controllers | cluster/bundle proposal files |
import apply | Apply an import proposal JSON to ConfigHub | ConfigHub |
app | Manage ConfigHub Apps | ConfigHub |
Today standalone import --git-path is preview-only. A --output-dir mode that emits proposed unit YAMLs to disk for review/PR/upload is in the next-up list.
| Command | What you get | Inputs |
|---|---|---|
setup connect | Import or create a kubeconfig context | none |
setup completion | Shell completion script | none |
quickstart demo | Fixture-backed first-run tour | none |
mcp serve | Read-only Model Context Protocol (MCP) server over stdio for Claude, Codex, agents | cluster (any subset of the above based on the tool invoked) |
bot | In-cluster read-only observation bot using the watch event stream | cluster |
context-pack | Deterministic AI context JSON export | cluster |
version | Build/version info | none |
Read commands expose structured output through --format json or a documented
--json flag; consult each command's help. Ownership and evidence logic are
deterministic for the same inputs. New live observations have new timestamps.
No ConfigHub signup required. Live inspection reads your Kubernetes API; offline analysis uses saved files or bundles.
brew install confighub/tap/cub-scout
cub-scout doctor # cluster health summary
cub-scout explain deploy/api -n prod # who owns this resource?
cub-scout trace deploy/api -n prod # where did it come from?
cub-scout map # interactive TUI
If cub-scout: command not found but you have cub installed, try cub scout doctor instead — see How to invoke.
# cub plugin (preferred for ConfigHub users — one install, shared auth)
cub plugin install confighub/cub-scout
cub scout version
# Homebrew
brew install confighub/tap/cub-scout
For direct downloads and tagged source builds, use the
install guide. The source module now uses
github.com/confighub/cub-scout/v2; proxy installation via
go install github.com/confighub/cub-scout/v2/cmd/cub-scout@latest installs
the latest tagged 2.x module. For a pinned install use
go install github.com/confighub/cub-scout/v2/cmd/[email protected]. Container command
docker run ghcr.io/confighub/cub-scout:v2.14.2 version still needs registry
access verification (#520); the published image is Linux amd64 only.
kubectl krew install cub-scout is not a verified distribution path; use the
kubectl-cub_scout binary included in the archives or Homebrew instead.
make build-kubectl-plugin also produces a kubectl cub-scout ... wrapper. See docs/howto/plugin-install.md for pinned-version, direct-URL, and offline installs.
The same Scout commands, JSON contracts, exit codes, and MCP tool names are available through three invocation forms:
cub-scout doctor # 1. Standalone — installed directly
cub scout doctor # 2. cub plugin — after `cub plugin install confighub/cub-scout`
kubectl cub-scout doctor # 3. kubectl plugin — from `make build-kubectl-plugin`
Plugin form (cub scout ...) inherits cub's auth automatically — useful when you also use ConfigHub. Standalone form is the path of least resistance and the default for AI/MCP scenarios. Parity is enforced by a release-gate test (TestPluginParity_StandaloneMatchesPlugin).
Host-global flags can differ: cub --context selects a ConfigHub context, while
Scout's bounded --kube-context selects the Kubernetes context to inspect.
Standalone does not mean disconnected from Kubernetes: live checks need API access. Saved-file and bundle analysis can run offline. ConfigHub connected mode is optional and adds intended-state, history, and fleet context.
Standalone (no signup): ownership detection, tracing, health diagnosis, drift hints, risk scanning, JSON, MCP gateway, attribution via managedFields + Flux/Argo/Helm/Sveltos/Modelplane/Crossplane trace resolvers + (with --source-path) raw-YAML file:line resolution.
Connected (cub auth login): adds the historical and cross-cluster context the Kubernetes API doesn't have:
kubectl events only goes so far; history walks the ConfigHub governed timeline.gitops status --with-confighub, doctor --with-confighub, trace --with-confighub, explain --with-confighub, map activity --with-confighub, and single-resource receipt verify --with-confighub add bounded release history, unit events, live-status writeback, event-consumer health, rollups, object-correlated snapshots, timeline rows, fingerprinted evidence, and omissions for a known space/time window.Important: connected import writes ConfigHub records, not cluster manifests. cub-scout never modifies the cluster.
Local repository parsing (import --git-path, import parse-repo) is a second-order adoption path: use it when a manifest repo is the thing you are reviewing or when you need source structure to enrich the live-cluster story.
trace is the headline feature — it answers "what created this?" without making you stitch Deployments, Applications, Helm releases, Sveltos profiles, Modelplane model resources, labels, annotations, and controller state by hand:
$ cub-scout trace deploy/frontend -n boutique
TRACE: Deployment/frontend in boutique
Owner: Flux
Source: GitRepository/flux-system/platform-config
Path: clusters/prod/apps/boutique
Status: Ready
Recent events:
Warning BackOff (3x, 5m) kubelet: Back-off restarting failed container
Next:
cub-scout explain deploy/frontend -n boutique
For more, see docs/reference/commands.md#trace.
| Interface | Best for | Start here |
|---|---|---|
| TUI | Interactive exploration, keyboard-driven debugging | cub-scout map |
| CLI | One-off triage, shell use, pipelines | doctor, explain, trace |
| JSON | Automation, AI, MCP, downstream tooling | --format json or --json |
Press ? inside the TUI for shortcuts.
scan is the fastest way to audit a cluster or manifest set for known risk patterns. The built-in scanner covers 46 patterns, and the broader confighub-scan catalog tracks 3,513 risk patterns for deeper policy and detection work.
Common entrypoints:
cub-scout scan --statecub-scout scan --kyvernocub-scout scan --lifecycle-hazardscub-scout scan --timing-bombscub-scout scan --danglingcub-scout scan --file manifest.yamlcub-scout scan --jsoncub-scout scan --normalized-jsonDetailed scanner behavior and output shape: docs/reference/commands.md#scan and docs/reference/json-contracts.md.
For Claude, Codex, and other AI agents:
cub-scout mcp serve is a read-only MCP server over stdio backed by the same CLI JSON surfaces — same answers, agent-shaped. It's not a Kubernetes write tool, not a multi-gateway router, and not the ConfigHub authority layer (that role belongs to cub).
Honest gaps in the current capability map, with the leverage on filling them:
doctor findings, audited action events as history/receipt evidence, deeper object-level correlation for release/event/live-status evidence (#502), and parity omissions for controllers without status/source/event/generation evidence.import --git-path --output-dir — emit proposed unit YAMLs to disk for PR review, then upload via Installer's --merge-external-source once connected. One bundle, two workflows.| Need | Doc |
|---|---|
| Workflow-first CLI tour | CLI-GUIDE.md |
| Full command catalog (A–Z) | docs/reference/cli-reference.md |
| Command usage and examples | docs/reference/commands.md |
| Stable flags and schemas | docs/reference/cli-contract.md |
| JSON fields and output model | docs/reference/json-contracts.md |
| Getting started checklist | docs/getting-started/checklist.md |
| Import and migration path | docs/howto/import-to-confighub.md |
| Delivery readiness decision and live-delivery fixture | docs/howto/delivery-readiness-decision.md + examples/live-delivery-observability/ |
| AI tool integration | docs/howto/using-cub-scout-from-ai-tool.md |
| Examples and demos | examples/README.md |
git clone https://github.com/confighub/cub-scout.git
cd cub-scout
go build ./cmd/cub-scout
./cub-scout version
Get, List, Watch. No apply, no delete, no admission webhook. Even suggest-remedy only describes a fix — it does not run it.cub) is the authority for intended state.For more on the security model, see SECURITY.md.
Contributions welcome. See CONTRIBUTING.md.
| Could incomplete or conflicting source metadata silently link me to the wrong configuration? | Bounded explain JSON, ASCII/Markdown, MCP, and TUI | v2.10.0: missing origin stays an information omission; malformed, duplicate, unsupported, or legacy-conflicting identity becomes a warning omission. No guessed IDs, legacy fallback, browser links, or target-to-cluster mapping; controller ownership and health stay unchanged. |
| Can I inspect a live object while browsing its intended configuration in a companion explorer? | Companion panel: cub commander --scout-binding '<target-id>=<kube-context>', Resource detail 3 Evidence | Commander v0.3.0 + Scout v2.10.0: calls the bounded CLI JSON provider with exact Resource API/kind/namespace/name and an explicit Target-ID/context binding. Missing identity/binding prevents execution; mismatched or incompatible responses stay unavailable. The panel displays scope, a shell-safe invocation, origin evidence and omissions. Standalone Scout and its TUI remain available; this is not a desired/live diff or delivery-success verdict. |
| Can I revisit that companion panel without re-reading the cluster, and see when its evidence is old? | Companion Resource 3 Evidence, 1 / 2 to switch tabs, r to refresh | Commander v0.3.0 + Scout v2.10.0: one captured snapshot with observation/expiry times and a STALE label. Tab revisits make no provider calls, even after expiry; only explicit refresh reads again and discards old success first. Navigation cancels pending work; changed identities and late responses cannot reuse old evidence. Unlike Scout's MCP/TUI cache, viewing this retained snapshot does not revalidate credentials. Contract and proof. |
| Is delegated delivery healthy? | doctor --with-confighub, gitops status, MCP gitops_status, map deployers, map activity --with-confighub, trace | Controller-reported backend, transport, source/build/apply/sync stages, first-class aggregate delivery resources, scope-level delivery rollups, ConfigHub delivery timeline rows, exact live-status joins on matching Argo Application activity rows, reason/message, and explicit evidence gaps when status is incomplete. |
| Which controller families did cub-scout actually inspect? | gitops status, MCP gitops_status | controllerCoverage[] records Flux, Argo CD, ConfigHub, Sveltos, and Modelplane coverage as found, not_found, partial, or unreadable, including checked kinds, observed kinds, counts, and RBAC/list omissions. |
| Which deployers sync on their own, revert manual changes, prune, or apply with non-default options? | gitops settings, gitops settings --setting self-heal=off, MCP gitops_settings, map deep-dive | v2.13.3 (preview): the settings each Argo CD Application and Flux Kustomization and HelmRelease declares, inverted so each setting lists the deployers that have each value, grouped by project (Argo CD) or namespace (Flux). An absent field is unset with the controller default named, not a declared off; a kind that could not be listed is reported as not read, not as empty. Declared settings only: no verdict, and no claim that a controller acted on them. From v2.13.4 also MCP gitops_settings, which returns a compact summary by default. |
| What is under this app-of-apps, at every level, and which child Application has a given resource? | gitops tree app/<name>, gitops tree app/<name> --kind Deployment, --sync OutOfSync | Each Argo CD Application with its settings and state, the Applications it delivers, walked the same way, and the resources each reports. A child that is missing, unreadable or reports nothing is kept and marked. Resources are what Argo CD reports, not checked against the cluster, and carry no health. Flux and other tools: #856 to #861 |
| Is this Modelplane resource backed by Crossplane composition? | map list --format json, trace, watch, bot, receipt verify, attribution JSON | Modelplane remains the higher-level owner when its signals are stronger, while ownerEvidence, owner.evidence, trace messages, and predicate.evidence.platformSubstrate surface Crossplane composite, claim, composition-resource, and verified field-manager evidence as substrate context. |
| What Kubernetes config does ConfigHub already hold for this space or target? | MCP confighub_k8s_types, MCP confighub_k8s_resources | Read-only, Resource-backed intended-config reads through cub k8s types/get: type surveys, stored resource rows or YAML, custom-resource discovery, explicit space/target scoping, and where / where_resource filters before touching live cluster APIs. |
| Which indexed resources match a fleet-wide predicate? | MCP confighub_resources | Read-only ConfigHub Resource entity queries through cub resource list: server-side ResourceType, ResourceName, TargetID, Unit.*, Space.*, and Data.* predicates, optional views/selects/raw data, and explicit space scoping for broad explorer questions. |
| Could a same-name application inherit another application's delivery status? | map activity --with-confighub --format json | Joins require an observed Application Space ID matching the reported Space ID plus a unique, exact Application name in the selected non-wildcard space. Missing/conflicting metadata and ambiguous names/statuses remain correlation omissions; the Argo-owned result is preserved. |
| What release or event triggered this delivery attempt? | map activity --with-confighub, doctor --with-confighub, gitops status --with-confighub, trace --with-confighub, explain --with-confighub, history, MCP confighub_releases, MCP confighub_unit_events | Bounded ConfigHub release and unit-event evidence for a known space/time window, including release ids, digests, targets, unit events, timestamps, exact resource-correlation keys when available, activity timeline rows, and structured omissions when history cannot be joined safely. |
| Which OCI source or release did connected evidence actually observe? | trace --with-confighub, explain --with-confighub, single-resource receipt verify --with-confighub | OCI sources recognize the configured registry's /space/<slug> form and the legacy target form. An exact release join requires a fresh source/status binding, agreement with the active ConfigHub registry advertised through /api/info, and the reported source revision in Release.ManifestDigest. A desired URL pin is not observed source evidence, Release.Digest is bundle content, and a target-only row is scope context rather than release execution. |
| Did evented delivery feedback report back, and is the report fresh? | map activity --with-confighub, doctor --with-confighub, gitops status --with-confighub, trace --with-confighub, explain --with-confighub, MCP confighub_live_status | Read-only parsing of ConfigHub live-status writeback, with observedAt, freshness, sync status, operation phase, observed revision, delivery verdict, separate application-health verdict, scope-level rollups, timeline rows, exact joins onto matching Argo Application activity rows, and object-level matches only when exact space plus app/unit identity is present. v2.10.1: unknown or future timestamps cannot justify PASS. Earlier versions have a documented freshness gap. |
| Is the in-cluster event consumer present and healthy? | map activity --with-confighub, doctor --with-confighub, gitops status --with-confighub, trace --with-confighub, explain --with-confighub, map deployers | Conservative, label-selected detection of the known event-consumer Deployment shape across namespaces when allowed, with ready/desired replicas, activity timeline rows, and doctor top issues when an observed consumer is unhealthy; absence or RBAC narrowing becomes an omission, not a claim that no eventing exists. |
| Can I trust a reported success or failure when its timestamp is missing, future, or old? | Connected gitops status, doctor, map activity, trace, explain, MCP confighub_live_status, single-resource receipts | v2.10.1: missing/invalid/zero/future timestamps yield INCONCLUSIVE; stale reports yield WATCH, including old failures. The original report, timestamp and a freshness omission stay visible. Re-reading an unchanged report does not renew it; the next step is a current controller/workload read. Cases and proof. |
| Has intended configuration reached the cluster? | compare three-way | DRY/WET/LIVE agreement for a resource, namespace, cluster, or governed view, with states like agreed, converging, diverged, and partial. |
| Did the controller consume the expected source revision or OCI digest? | trace, trace --with-confighub, gitops status, compare source-truth, gitops status --with-confighub | Controller-owned source status, revision/digest evidence, object-correlated ConfigHub release digest context when exact space+target joins exist, and proof gaps when controller/source identifiers cannot be joined safely. |
| Does this selected controller report the immutable revision I asked for? | explain Application/api -n delivery --bounded --api-version argoproj.io/v1alpha1 --kube-context <context> --expected-revision <commit-or-digest> --format json; MCP explain with expected_revision; TUI Ctrl+e, select, then e | v2.11.0: controllerRevision compares an explicit full Git commit or SHA-256 artifact digest with a single-source Application or v1 Kustomization report: match, mismatch, or unknown, with original reported revision and separate controller status. Missing, ambiguous, deleted or unobserved evidence remains unknown. No ConfigHub auth; same two-request cold read and zero-request session reuse, including when changing the expected revision. This is not workload convergence, controller liveness or application success. Cases, limits and commands. |
| Did this rendered install set land as a set? | compare object-set, receipt verify --file | Set-level desired-vs-live evidence from rendered YAML: authored-field deltas, optional added/removed object closure, object-set receipts, normalization profiles, freshness TTL, and CI-gate verdicts. |
| Did this exact OCI configuration release reach the selected cluster? | release check --bundle oci://registry/config@sha256:... ... | v2.12.0: verifies the manifest and literal configuration layer by digest, binds the selected controller's repository, target and inventory, then compares authored live fields and workload-controller convergence. Configuration bundle and container image digests are separate. No application-success claim. |
| Where is my release waiting, different, or unverifiable? | release check; MCP release_check; release check --interactive | No TTY required. With --fail-on any-non-pass, exit 0 means PASS; exit 2 preserves a non-passing report. v2.12.1 also fails on output errors. |
| Can a script, CI job or agent check this without a TUI? | release check --check-running-image --format json --out report.json --fail-on any-non-pass; same flags after cub scout | Yes. Standalone, plugin and MCP use the same check. Reports are saved and non-passing results can fail the job. Watch/bot do not schedule this check yet. |
| Can I check one release without a cluster-wide scan, and keep the evidence? | release check --max-objects 100 --out release-check.json; --oci-layout <dir> for a local bundle; TUI r refresh | Exact GETs, no inventory LIST. Image checks add a limited Pod LIST and owner reads. Reports include request counts and omissions. |
| Can I reproduce the image check against real controllers, not just fixtures? | Live acceptance and release gates; bash test/e2e/image-delivery-live.sh | Authenticated local ConfigHub delivery through HTTPS passed for Argo and Flux, in standalone and plugin modes. Missing credentials and untrusted certificates returned INCONCLUSIVE. |
| Can a stalled credential helper hang my unattended image check? | Credential and timeout boundaries | v2.12.1 cancels credential helpers and caps their output. Use non-interactive credentials and an outer timeout; Windows cannot guarantee descendant-process cleanup. |
| Can a large API error bypass the response-size limit? | release check; shared bounded reads | No. v2.12.1 caps HTTP error bodies before client-go buffers them. Failed reads cannot produce PASS. |
| Is the image actually running the one I intended? | release check --check-running-image; MCP release_check with check_running_image: true; release check --interactive --check-running-image | v2.12.1 checks running, ready containers against intended digests, with complete Deployment ownership and replica checks. Tags and unresolved multi-architecture digests remain unknown. |
| Do I have the exact release identity? | release check --bundle oci://...@sha256:... | Supply the manifest digest from the publication record. A tag, image digest or controller status alone does not identify the intended configuration release. |
| Are all replicas running the intended image? | release check --check-running-image --format json | v2.12.1 verifies complete Deployment replica coverage. StatefulSet, DaemonSet and Job completion remain unsupported. v2.12.0 cannot prove all replicas. |
| What does incomplete proof mean? | Inspect runningImage.workloads[].reason, deployment.complete, and pods[], plus the overall verdict | Missing, denied, stale or incomplete observations return INCONCLUSIVE. Read the overall verdict: matching images cannot override a configuration BLOCK. |
| I only have an image reference: can I find everywhere it is deployed? | Image-check prerequisites | No dedicated image-reference search across a cluster or fleet. The release check requires a literal OCI configuration bundle, controller and explicit target; ownership exploration helps identify the workload but does not prove image identity. |
| What image-check gaps should I know before relying on it? | Known gaps | Other workload types, multi-architecture resolution and image-only search remain planned. Scheduling, scale benchmarks, installation coverage and reporting limits are listed separately. |
| Is this rollout still progressing, complete, or stuck? | receipt verify --predicate workloads-converged, doctor, explain, compare three-way | Generation-aware workload evidence: metadata.generation, status.observedGeneration, kstatus, progress clock, pod failure signals, and PASS / WATCH / BLOCK / INCONCLUSIVE verdicts. |
| Can I move to the next task, wait, or retry delivery? | receipt verify --with-confighub, compare three-way, doctor --with-confighub, map activity --with-confighub | A read-only decision frame that separates "not applied yet", "still converging", "runtime failure", stale/failed delivery feedback, recent delivery events, and missing evidence, with optional fingerprinted receipts for the exact observation. |
| Is live state drifting from desired state? | compare drift, compare three-way, compare source-truth | Field-level differences, strategy-relative source-truth evidence, conformance exit codes, and explicit proof gaps when evidence is missing. |
| Is this a delivery problem or an application/runtime problem? | doctor --with-confighub, explain --with-confighub, gitops status --with-confighub, map activity --with-confighub, trace --with-confighub, patterns, scan | kstatus health, Kubernetes events, live-status delivery vs application-health verdicts, audited action metadata when present, workload symptoms, delivery timeline rows, known-pattern matches, and phase-aware hints so operators can separate sync/convergence issues from runtime failures. |
| What triggered this reconcile, check, or action? | map activity --with-confighub, trace, explain | Audited Kubernetes action event metadata when present, plus optional ConfigHub release/unit-event rows: action, actor, subject, groups, timestamps, release digest/target, and preserved raw annotation evidence. |
| Who changed this field, and where did the value come from? | compare, explain, attribution JSON | cause, managerHint, gitSource, bindingSource, audit/event evidence where available, and optional file:line back-resolution from live managedFields, controller metadata, local source files, and governed links. |
| Can I answer broad or repeated questions without hammering live APIs? | snapshot, watch, bot, summary, receipt verify --with-confighub, receipt list --format json, map list --format json, map activity --with-confighub --confighub-space <space>, doctor --with-confighub --confighub-space <space>, gitops status --with-confighub --confighub-space <space> --confighub-since <window>, MCP confighub_resources, MCP confighub_k8s_types, MCP confighub_k8s_resources | Existing captured state, low-cardinality watch/bot events, connected summaries, bounded current-space/time-window ConfigHub reads, Resource-backed intended-config and Resource-index surveys, observation.source/mode/observedAt/freshness metadata on live inventory/event snapshots and stored summary records, and immutable receipts with list-time freshness status (fresh, stale, not-declared, invalid) so repeated reviewers can inspect frozen evidence instead of re-querying live APIs. Within-cycle duplicate reads are coalesced, and watch/bot --watch-backed serve both inventory and the state scan from a Kubernetes watch informer cache so idle cycles no longer re-list (#539): measured request baseline, not a claim of fleet-wide rate limiting. |
| Can I centralize ongoing observation instead of starting a poller for every user? | bot, watch, snapshot | One read-only event producer can feed a shared sink using in-cluster auth, webhook/JSONL output, bounded queues, receipt-build caps, and filters. Consumers must read that sink to avoid their own cluster queries; this is not a shared Scout query service or a fleet-wide API budget. |
| Does Scout's bot replace a release-event or sync bot? | bot; connected delivery evidence | No. The observer produces evidence; the delivery bot triggers its controller and owns status writeback. Scout can consume that feedback with identity and freshness checks, then add independent live observations. Integration boundaries. |
| Can I prepare a bot image when the public registry pull is unavailable, including for arm64 nodes? | bash examples/bot/build-from-release.sh v2.12.0 arm64 (or amd64) | v2.11.0 helper: verifies the published Linux archive checksum before building a local numeric-nonroot image. No ConfigHub auth, image push, registry-permission change or cluster deployment. Select the target node architecture; image distribution, webhook configuration and deployment remain explicit operator steps. This does not repair public registry access. Installation and verification. |
| Can I keep auditable evidence of the check? | receipt verify, receipt verify --with-confighub, receipt list, receipt validate, watch --emit-receipt-on, bot --emit-receipt-on | Typed, fingerprinted, immutable evidence receipts for gates, incident closeout, audits, chained checks, live delivery-status snapshots, and real-time watch/bot events; receipt list shows whether saved TTL-backed receipts are still fresh, stale, undeclared, or malformed. |
| Can I onboard an existing Argo app or app-of-apps safely? | import argocd, import parse-repo, import --git-path, compare three-way, trace | Source-backed discovery and import proposals, app-of-apps topology warnings, and pre-handover comparison evidence; actual ConfigHub loading, release publishing, and controller handover stay with the governing toolchain. |
watch --emit-receipt-on <event-types>Real-time receipt emission: each matching watch event carries a receipt inline. All four known event types build receipts (drift.detected, ownership.changed, resource.discovered, scan.finding); per-poll backpressure controlled by --emit-receipt-batch-cap (default 10). |
| cluster |
| Receipts (typed evidence artifacts) | examples/receipts/README.md + docs/reference/json-contracts.md § Receipt Contract |
| Receipt and proof terminology (vs log / journal / record / ledger / provenance) | docs/concepts/receipts-and-proofs.md |
| Receipts end-to-end how-to (pre-deploy gate → audit chain → namespace aggregate → real-time emission) | docs/howto/receipts-end-to-end.md |
| Watch event types + inline receipts + backpressure | docs/reference/watch-events.md |
| Security model | SECURITY.md |