[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6CBPKYVREY83CQYNFW6BVD0":3,"skill-same:01M6CBPKYVREY83CQYNFW6BVD0":83},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":23,"publishedAt":53,"linkOnly":54,"markdownContent":55,"markdownBody":56,"frontMatter":57,"refName":59,"commitSha":60,"skillDirectory":61,"forksCount":62,"repositoryHtmlUrl":63,"repositoryHomepageUrl":64,"ownerHtmlUrl":65,"ownerBlogUrl":66,"ownerDescription":67,"updatedAt":68,"install":69,"resources":82},"01M6CBPKYVREY83CQYNFW6BVD0","scout-verify",null,"Use when the user wants a TYPED, FINGERPRINTED, IMMUTABLE evidence artifact about a Kubernetes resource — the Verify verb group of cub-scout (the receipt capability shipped in #446). Natural phrasing: \"produce a receipt that this is in compliance\", \"give me an attestation that the cluster matches Git\", \"I need a verifiable record for the audit trail\", \"build a receipt verifying no manual edits since deploy\", \"verify deploy\u002Fapi against source-truth and save the artifact\", \"validate this receipt has not been tampered with\", \"show me what receipts we have\", \"is this receipt tampered with?\", \"attach evidence to my CI gate\". Load whenever intent is receipt \u002F attestation \u002F evidence-artifact \u002F tamper-evident-record \u002F verified-record \u002F audit-trail \u002F postmortem-evidence \u002F acceptance-judge-input. Do NOT load for: a live comparison without a persisted artifact (use scout-compare), interpreting a single field's provenance (use scout-attribute), or actually applying a fix (cub-scout never mutates — route to cub \u002F argocd \u002F kubectl with the user driving).","confighub\u002Fcub-scout","confighub","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F206140369?v=4","01M6CBJBWD33AFNG4VXMJHSRXD","ConfigHub Inc","01M6CBJC0K0F8CJVFWGRSR0KYC",14,"MIT","https:\u002F\u002Fgithub.com\u002Fconfighub\u002Fcub-scout\u002Fblob\u002Fmain\u002Fskills\u002Fscout-verify\u002FSKILL.md",[18],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000011","运维与部署","SCENARIO","使用场景",[24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52],"verify","scout","scout verify","fix","when","managed","unit","app","get","me","route","show","cub scout","evidence","never","use","kubernetes","view","argocd","changeset","postmortem","Bash","show me","api","provenance","attestation","ci","produce","acceptance","2026-11-10 10:12:30",false,"---\nname: scout-verify\ndescription: 'Use when the user wants a TYPED, FINGERPRINTED, IMMUTABLE evidence artifact about a Kubernetes resource — the Verify verb group of cub-scout (the receipt capability shipped in #446). Natural phrasing: \"produce a receipt that this is in compliance\", \"give me an attestation that the cluster matches Git\", \"I need a verifiable record for the audit trail\", \"build a receipt verifying no manual edits since deploy\", \"verify deploy\u002Fapi against source-truth and save the artifact\", \"validate this receipt has not been tampered with\", \"show me what receipts we have\", \"is this receipt tampered with?\", \"attach evidence to my CI gate\". Load whenever intent is receipt \u002F attestation \u002F evidence-artifact \u002F tamper-evident-record \u002F verified-record \u002F audit-trail \u002F postmortem-evidence \u002F acceptance-judge-input. Do NOT load for: a live comparison without a persisted artifact (use scout-compare), interpreting a single field''s provenance (use scout-attribute), or actually applying a fix (cub-scout never mutates — route to cub \u002F argocd \u002F kubectl with the user driving).'\nphase: verify\nallowed-tools: Bash(.\u002Fcub-scout receipt verify *) Bash(cub-scout receipt verify *) Bash(cub scout receipt verify *) Bash(.\u002Fcub-scout receipt show *) Bash(cub-scout receipt show *) Bash(cub scout receipt show *) Bash(.\u002Fcub-scout receipt validate *) Bash(cub-scout receipt validate *) Bash(cub scout receipt validate *) Bash(.\u002Fcub-scout receipt list *) Bash(cub-scout receipt list *) Bash(cub scout receipt list *) Bash(.\u002Fcub-scout receipt list) Bash(cub-scout receipt list) Bash(cub scout receipt list) Bash(kubectl get *) Bash(kubectl describe *) Bash(kubectl get --show-managed-fields *) Bash(cub space list *) Bash(cub unit get *) Bash(cub unit list *) Bash(cub link get *) Bash(cub link list *) Bash(cub view get *) Bash(cub view list *) Bash(cub unit-event list *) Bash(cub resource list *) Bash(cub release list *) Bash(cub changeset list *) Bash(argocd app get *) Bash(flux get *)\n---\n\n# scout-verify\n\nThe Verify verb group of cub-scout. Produces typed, fingerprinted, immutable evidence artifacts — **receipts** — wrapping cub-scout's existing field-level evidence into a verifiable record CI\u002FCD gates, audit trails, postmortems, and acceptance-judge tooling can attach to a decision and later re-check for tampering.\n\n> A **receipt** is a stamped, hand-offable record of one verification: an in-toto Statement v1 envelope around a verdict, evidence, omissions, and optional upstream receipt references. Its **proof** is the verifiable integrity property created by the fingerprint: SHA-256 over RFC 8785 canonical JSON of the full Statement, with only `predicate.fingerprint` removed before hashing. Any third party can recompute that fingerprint to confirm the receipt has not been edited since it was stamped. That is tamper-evidence, not producer authentication or formal proof of truth. A receipt without proof is a claim; a receipt with proof is evidence.\n\nReceipts are HISTORICAL records. Updates produce new receipts; old ones never mutate.\n\n## When to use\n\nExplicit phrasings:\n\n- \"Produce a receipt that deploy\u002Fapi is in compliance\"\n- \"Give me a verifiable attestation that the cluster matches Git\"\n- \"I need an evidence artifact for the audit trail\"\n- \"Build a receipt verifying no manual edits since the freeze started\"\n- \"Verify deploy\u002Fapi against source-truth and save the artifact\"\n- \"Validate this receipt has not been tampered with\"\n- \"List the receipts I've generated locally\"\n- \"Show me yesterday's receipts where the verdict was BLOCK\"\n- \"Attach typed evidence to my CI gate \u002F promotion gate \u002F release ticket\"\n- \"Keep the exact delivery\u002Fstatus feedback snapshot for audit\"\n\nImplicit intents:\n\n- The user wants **persistence** of an evidence snapshot, not just an ephemeral comparison\n- The user is gating CI \u002F promotion \u002F acceptance on a verdict\n- The user needs to **show later** exactly what evidence was attached to a decision, with tamper-evidence (forensic \u002F audit \u002F postmortem)\n- The user is integrating with Pilot or a similar acceptance kernel that consumes receipt-shaped evidence\n- The user wants a tamper-evident artifact, not a log line\n\n## Do not load for\n\n- Live comparison without a persisted artifact — [`scout-compare`](..\u002Fscout-compare\u002FSKILL.md) is faster and the right shape\n- Interpreting *why* a single field is wrong (which controller, which file) — [`scout-attribute`](..\u002Fscout-attribute\u002FSKILL.md)\n- Inventory \u002F status \u002F \"what's running\" — [`scout-observe`](..\u002Fscout-observe\u002FSKILL.md)\n- Forcing an apply \u002F sync \u002F patch — cub-scout cannot. Receipts emit; they never act.\n\n## Standalone vs connected\n\n- **Standalone (cluster only):** `receipt verify --predicate applied-matches-spec` and `--predicate no-manual-edits-since` work without ConfigHub. The receipt records `OmissionConfigHubUnitSubject` to flag the missing connected-mode evidence.\n- **Connected (cluster + `cub auth login`):** `--predicate source-truth-pass --strategy \u003Cname>` becomes available. Connected mode also adds the `confighub-unit:\u002F\u002F` subject to every receipt when unit identity is available, anchoring it to the unit revision in addition to the live K8s digest. Single-resource `receipt verify --with-confighub` can attach object-correlated delivery evidence under `predicate.evidence.deliveryEvidence`; this is supporting evidence and does not change predicate verdict semantics.\n- **Offline (file only):** `receipt show` \u002F `receipt validate` \u002F `receipt list` all work on on-disk artifacts with no cluster and no ConfigHub. Useful in CI containers that received the receipt as an artifact from an upstream job.\n\n## Tool boundary\n\n- **Allowed (read-only):** the four receipt verbs (`verify` \u002F `show` \u002F `validate` \u002F `list`); `kubectl get\u002Fdescribe`, `kubectl get --show-managed-fields` (for inspecting what `no-manual-edits-since` saw); `cub \u003Centity> get \u002F list` for the entities named in allowed-tools (connected); `argocd app get`, `flux get` (when building source-truth-pass evidence).\n- **Not allowed:** `kubectl apply\u002Fedit\u002Fpatch\u002Fdelete`, `argocd app sync` (as mutation), `flux reconcile --with-source`, `cub * create\u002Fupdate\u002Fdelete`. Receipts are evidence, never recommendations to mutate. `FilterNextSteps` (in `pkg\u002Fagent\u002Freceipt_predicates.go`) rejects mutating `actionType` \u002F `nextCommand` at receipt-emit time as defense in depth.\n- **`TestReceiptPackageReadOnlyClient`:** the static guard in `cmd\u002Fcub-scout\u002Freceipt_readonly_test.go` greps every `receipt*.go` source file and fails the build if any mutating K8s client method appears. Receipts are categorically read-only.\n\n## The verb menu\n\n| Question | Verb | Notes |\n|---|---|---|\n| \"Produce a receipt about this resource\" | `cub-scout receipt verify \u003Ckind>\u002F\u003Cname> -n \u003Cns>` | Auto-detects the predicate from owner + signals. Defaults to applied-matches-spec for Argo\u002FFlux\u002FConfigHub-owned resources with a resolved git anchor. |\n| \"Preserve delivery\u002Fstatus feedback\" | `cub-scout receipt verify \u003Ckind>\u002F\u003Cname> -n \u003Cns> --with-confighub --confighub-space \u003Cspace>` | Single-resource only; freezes object-correlated `deliveryEvidence` inside the fingerprinted receipt. |\n| \"Render a saved receipt\" | `cub-scout receipt show \u003Cpath>` | ASCII or JSON. Does NOT verify the fingerprint — works on tampered receipts for forensic inspection. |\n| \"Has this receipt been tampered with?\" | `cub-scout receipt validate \u003Cpath>` | Recomputes the fingerprint and compares. Exit 0 OK \u002F 1 mismatch \u002F 2 I\u002FO. JSON output for CI. |\n| \"What receipts do I have locally, and are TTL-backed ones still fresh?\" | `cub-scout receipt list --format json` | Walks `$CUB_SCOUT_RECEIPTS_DIR → $XDG_DATA_HOME\u002Fcub-scout\u002Freceipts → $HOME\u002F.local\u002Fshare\u002Fcub-scout\u002Freceipts`. Newest first, with `freshness.status` as `fresh`, `stale`, `not-declared`, or `invalid`. |\n\n## The predicates\n\ncub-scout v1 ships three predicates. Each maps a *required input signal* to a *receipt-level verdict*:\n\n| Predicate | Required signal | Verdict logic |\n|---|---|---|\n| `applied-matches-spec` | Argo\u002FFlux\u002FConfigHub owner + controller-resolved git anchor | PASS on `controller-drift` cause; BLOCK on `manual-edit` cause or anchor mismatch; INCONCLUSIVE on missing anchor or unknown cause. |\n| `source-truth-pass` | `--strategy \u003Cname>` (one of 9) + connected-mode ConfigHub auth | Mirrors `compare source-truth` Status → Verdict. Strategy mismatch between caller and evidence → BLOCK. |\n| `no-manual-edits-since` | `--since \u003CRFC3339>` cutoff | PASS when no `kubectl-*` writer touched `managedFields` after the cutoff. BLOCK on any late interactive write. INCONCLUSIVE on missing managedFields or nil-Time entries (parse-don't-guess). |\n\ncub-scout NEVER infers a strategy or a cutoff. `source-truth-pass` requires `--strategy`; `no-manual-edits-since` requires `--since`. Pass them or the CLI errors upfront.\n\n## Verdicts\n\nEvery receipt carries one of four:\n\n| Verdict | Meaning |\n|---|---|\n| `PASS` | Evidence supports the claim |\n| `WATCH` | Evidence is ambiguous; situation needs monitoring |\n| `BLOCK` | Evidence contradicts the claim |\n| `INCONCLUSIVE` | Evidence missing or unavailable; always carries one or more `omissions[]` entries |\n\nINCONCLUSIVE is **not** failure — it's an honest \"I don't have enough to claim PASS.\" Pilot and similar acceptance kernels treat it as `ASK` (need human or richer evidence).\n\n## The loop\n\n1. **Pick the predicate.** Most users mean `applied-matches-spec` (default for Argo\u002FFlux\u002FConfigHub-owned resources with a resolved anchor). If the user mentions a delivery strategy, they want `source-truth-pass`. If they mention a freeze window or cutoff timestamp, they want `no-manual-edits-since`.\n2. **Decide standalone vs connected.** Receipts work in both modes; connected mode adds the `confighub-unit:\u002F\u002F` subject + ConfigHub-side evidence. Source-truth-pass requires connected mode.\n3. **Invoke verify.** Use `--format json` for CI \u002F agent consumption. Use `--save` to land the artifact in the local store (immutable; refuses overwrite).\n4. **Read the verdict + omissions.** The verdict is the headline; `omissions[]` is the \"what I deliberately did not claim\" list. Empty omissions = comprehensive coverage. Non-empty = honest gaps.\n5. **Persist or attach.** `--out \u003Cpath>` writes a specific file; `--save` writes into the store under the canonical name. CI gates that need to attach the artifact to a build record use `--out`.\n6. **Hand off.** If the verdict is BLOCK and the user wants to *act*, refuse to mutate. Point them at the appropriate `cub` skill (for ConfigHub state changes), at `kubectl get --show-managed-fields` (to investigate a manual-edit BLOCK), or at the original-author path (commit the change back to git).\n\n## Worked examples\n\n### A: applied-matches-spec, standalone\n\nThe default path for an Argo-owned Deployment. Works without ConfigHub auth.\n\n```bash\n$ cub-scout receipt verify deploy\u002Fapi -n prod\nReceipt: applied-matches-spec\n  Verdict: PASS\n  Claim:   applied matches spec at apps\u002Fprod\u002Fapi\n  Scope:   Deployment\u002Fapi in prod\n  By:      cub-scout v2.3.0 at 2026-05-22T10:30:00Z\n  Spec:    https:\u002F\u002Fgithub.com\u002Forg\u002Fplatform-config @abc123def456 path=apps\u002Fprod\u002Fapi\n\nSubjects\n  - k8s-live:\u002F\u002Fapps\u002Fv1\u002FDeployment\u002Fprod\u002Fapi  sha256:595f08ae073d…\n\nEvidence (attribution)\n  cause:       controller-drift\n  managerHint: argocd-controller\n  gitSource:   https:\u002F\u002Fgithub.com\u002Forg\u002Fplatform-config @abc123def456 path=apps\u002Fprod\u002Fapi\n\nOmissions (deliberate non-claims)\n  - confighub-unit-subject  — standalone-mode build; no ConfigHub auth available to fetch unit subject  [info]\n\nNext steps (read-only)\n  - [read-only] controller is reconciling; spec anchor matches the resolved git source\n      → cub-scout explain\n\nFingerprint: sha256:252ef3104d0a3cc8ac62e7bde40cf6174b6f045d8ed2b97c6512781d8cb690f4\n```\n\nSave it to disk for a build record:\n\n```bash\n$ cub-scout receipt verify deploy\u002Fapi -n prod --format json --out api-prod.receipt.json\n```\n\nOr land it in the local store for casual accumulation:\n\n```bash\n$ cub-scout receipt verify deploy\u002Fapi -n prod --save\nsaved: \u002Fhome\u002Fuser\u002F.local\u002Fshare\u002Fcub-scout\u002Freceipts\u002F2026-05-22T10-30-00Z__applied-matches-spec__Deployment-api__252ef3104d0a.receipt.json\n```\n\n### B: source-truth-pass, declared strategy (connected mode)\n\n```bash\n$ cub-scout receipt verify deploy\u002Fapi -n prod --strategy git-argo --format json\n{\n  \"_type\": \"https:\u002F\u002Fin-toto.io\u002FStatement\u002Fv1\",\n  \"subject\": [\n    {\"name\": \"k8s-live:\u002F\u002Fapps\u002Fv1\u002FDeployment\u002Fprod\u002Fapi\", \"digest\": {\"sha256\": \"...\"}},\n    {\"name\": \"confighub-unit:\u002F\u002Fpayments-api@rev=42\", \"digest\": {\"sha256\": \"...\"}}\n  ],\n  \"predicateType\": \"https:\u002F\u002Fcub-scout.dev\u002Freceipt\u002Fv1\",\n  \"predicate\": {\n    \"predicateName\": \"source-truth-pass\",\n    \"verdict\": \"PASS\",\n    \"evidence\": {\n      \"sourceTruth\": {\n        \"declared_strategy\": \"Git -> Argo -> Kubernetes\",\n        \"status\": \"PASS\",\n        \"source_truth\": \"AGREED\",\n        \"surfaces\": { ... }\n      }\n    },\n    \"omissions\": [],\n    \"fingerprint\": \"sha256:...\"\n  }\n}\n```\n\nStrategy mismatch is BLOCK — never silently honor the caller's strategy over what the evidence records:\n\n```bash\n$ cub-scout receipt verify deploy\u002Fapi -n prod --strategy git-argo\n# ... evidence carries confighub-oci-argo, not git-argo ...\nVerdict: BLOCK\nOmissions\n  - strategy-mismatch  — receipt was asked to verify under strategy \"git-argo\" but source-truth evidence carries \"ConfigHub -> OCI -> Argo -> Kubernetes\"\n```\n\n### C: no-manual-edits-since freeze gate (standalone)\n\n```bash\n$ cub-scout receipt verify deploy\u002Fapi -n prod --since 2026-05-22T00:00:00Z --save\nsaved: \u002Fhome\u002Fuser\u002F.local\u002Fshare\u002Fcub-scout\u002Freceipts\u002F2026-05-22T10-30-00Z__no-manual-edits-since__Deployment-api__abc123.receipt.json\n\n$ cub-scout receipt show ~\u002F.local\u002Fshare\u002Fcub-scout\u002Freceipts\u002F2026-05-22T10-30-00Z__no-manual-edits-since__Deployment-api__abc123.receipt.json\nReceipt: no-manual-edits-since\n  Verdict: PASS\n  Claim:   no manual edits to Deployment\u002Fapi in prod since 2026-05-22T00:00:00Z\n```\n\nA late `kubectl edit` produces BLOCK and names the offending writer:\n\n```\nVerdict: BLOCK\nNext steps (read-only)\n  - [read-only] interactive writer wrote managedFields after the cutoff (2026-05-22T00:00:00Z): kubectl-edit@2026-05-22T12:00:00Z — investigate the unplanned edit before any apply\n      → kubectl get --show-managed-fields\n```\n\n### D: validate + list\n\n```bash\n$ cub-scout receipt validate .\u002Fapi-prod.receipt.json\nFingerprint OK: .\u002Fapi-prod.receipt.json\n  sha256:252ef3104d0a3cc8ac62e7bde40cf6174b6f045d8ed2b97c6512781d8cb690f4\n\n$ cub-scout receipt list\nStore: \u002Fhome\u002Fuser\u002F.local\u002Fshare\u002Fcub-scout\u002Freceipts\n\nVERDICT        PREDICATE               SCOPE                                     VERIFIED-AT             PATH\nPASS           applied-matches-spec    Deployment\u002Fapi in prod                    2026-05-22T10:30:00Z    2026-05-22T10-30-00Z__applied-matches-spec__Deployment-api__252ef3104d0a.receipt.json\nBLOCK          no-manual-edits-since   Deployment\u002Fapi in prod                    2026-05-22T08:00:00Z    2026-05-22T08-00-00Z__no-manual-edits-since__Deployment-api__abc123.receipt.json\n```\n\nJSON list output for CI consumption (filter by verdict):\n\n```bash\n$ cub-scout receipt list --format json | jq '.[] | select(.verdict == \"BLOCK\")'\n```\n\n## Output evidence\n\nWhat every receipt carries (the structured surface a downstream consumer pattern-matches on):\n\n| Field | Meaning |\n|---|---|\n| `predicate.predicateName` | One of `applied-matches-spec` \u002F `source-truth-pass` \u002F `no-manual-edits-since` |\n| `predicate.verdict` | One of `PASS` \u002F `WATCH` \u002F `BLOCK` \u002F `INCONCLUSIVE` |\n| `predicate.scope` | `kind \u002F name \u002F namespace \u002F cluster` |\n| `predicate.verifier` | `{tool, version}` — always `cub-scout` plus the build tag |\n| `predicate.verifiedAt` | RFC 3339 timestamp |\n| `predicate.spec.anchor` | Git repo + revision + path (applied-matches-spec only) |\n| `predicate.evidence.attribution` | `cause` \u002F `managerHint` \u002F `gitSource` — cub-scout's existing attribution layer |\n| `predicate.evidence.sourceTruth` | Source-truth derivation surfaces (source-truth-pass only) |\n| `predicate.omissions[]` | Structured list of what the receipt deliberately does NOT claim — empty array means comprehensive coverage |\n| `predicate.nextSteps[]` | Read-only follow-up hints (mutating verbs filtered at emit time) |\n| `predicate.fingerprint` | `sha256:` SHA-256 over RFC 8785 canonical JSON of the full Statement minus only this field |\n\n## Storage convention\n\nThe local receipt store is a flat directory of `*.receipt.json` files keyed by a deterministic sortable name:\n\n```\n\u003CverifiedAt-rfc3339-safe>__\u003Cpredicate>__\u003Ckind>-\u003Cname>__\u003Cshort-fingerprint>.receipt.json\n```\n\nResolved in priority order:\n\n1. `--save-dir \u003Cpath>` on verify, `--dir \u003Cpath>` on list (explicit override)\n2. `$CUB_SCOUT_RECEIPTS_DIR` env var\n3. `$XDG_DATA_HOME\u002Fcub-scout\u002Freceipts`\n4. `$HOME\u002F.local\u002Fshare\u002Fcub-scout\u002Freceipts`\n\nThe store is **immutable**: re-running verify on the same resource at the same instant with the same fingerprint produces the same canonical filename → \"already saved\" warning and exit 0. The on-disk artifact never changes.\n\n## v2 surface (CI \u002F agent shaped)\n\nThree v2 extensions layer on top of the v1 envelope without changing the wire format:\n\n- **`--fail-on \u003Cverdict-list>` on `receipt verify`** (`#451`) — exit non-zero (code 2) when the verdict matches. Accepts `WATCH`, `BLOCK`, `INCONCLUSIVE` (comma-separated) or the sugar `any-non-pass`. The receipt is still printed \u002F saved \u002F written to `--out` — the gate fires AFTER the artifact is durable.\n- **`--input-attestation \u003Cpath>` chained receipts** (`#448` chained half) — repeatable; each referenced receipt is loaded + fingerprint-verified + attached to the new receipt's `inputAttestations[]`. Tampered references refused at chain-construction time. The downstream fingerprint covers the field by construction.\n- **`cub-scout watch --emit-receipt-on \u003Cevent-types>` \u002F `cub-scout bot --emit-receipt-on \u003Cevent-types>`** (`#449`) — attaches a receipt to each matching event payload inline (JSONL or webhook). All four known event types build receipts: `drift.detected`, `ownership.changed`, `resource.discovered`, and `scan.finding`; `--emit-receipt-batch-cap` bounds burst volume. Failures are non-fatal.\n\n```bash\n# CI gate\n.\u002Fcub-scout receipt verify deploy\u002Fapi -n prod --fail-on any-non-pass\n\n# Chain a per-resource receipt with an upstream \"release gate passed\" one\n.\u002Fcub-scout receipt verify deploy\u002Fapi -n prod \\\n  --input-attestation .\u002Frelease-gate.receipt.json \\\n  --save\n\n# Streaming acceptance: each drift event becomes a fingerprinted receipt\n.\u002Fcub-scout watch -n prod \\\n  --output-file .\u002Facceptance.jsonl \\\n  --emit-receipt-on drift.detected,ownership.changed\n```\n\n## Not yet in cub-scout\n\nFuture directions worth flagging:\n\n- Cryptographic signing as a hardening layer on top of fingerprint-only — DSSE wrapped in a Sigstore Bundle (cosign keyless + ed25519 fallback) is one candidate design; the wire format is intentionally additive-friendly so signatures can land without an envelope change\n\nShipping releases use fingerprint-only integrity; future hardening is honest about what's not yet there — the contract is in `docs\u002Freference\u002Fjson-contracts.md` § Receipt Contract.\n\n## References\n\n- Terminology: [`docs\u002Fconcepts\u002Freceipts-and-proofs.md`](..\u002F..\u002Fdocs\u002Fconcepts\u002Freceipts-and-proofs.md) — what \"receipt\" and \"proof\" mean, vs log \u002F journal \u002F record \u002F ledger \u002F provenance\n- Contract: [`docs\u002Freference\u002Fjson-contracts.md`](..\u002F..\u002Fdocs\u002Freference\u002Fjson-contracts.md) § Receipt Contract\n- Locked design: [`docs\u002Fproposals\u002Freceipts-way-forward.md`](..\u002F..\u002Fdocs\u002Fproposals\u002Freceipts-way-forward.md)\n- Examples: [`examples\u002Freceipts\u002F`](..\u002F..\u002Fexamples\u002Freceipts\u002F) — 8 canonical receipts across the three predicates, generated deterministically by `tools\u002Fgen-receipt-examples`\n- Implementation: `pkg\u002Fagent\u002Freceipt*.go`, `cmd\u002Fcub-scout\u002Freceipt*.go`\n- Read-only triad: [`scout-attribute`](..\u002Fscout-attribute\u002FSKILL.md) (companion evidence surface), [`scout-compare`](..\u002Fscout-compare\u002FSKILL.md) (live comparison sibling)\n","# scout-verify\n\nThe Verify verb group of cub-scout. Produces typed, fingerprinted, immutable evidence artifacts — **receipts** — wrapping cub-scout's existing field-level evidence into a verifiable record CI\u002FCD gates, audit trails, postmortems, and acceptance-judge tooling can attach to a decision and later re-check for tampering.\n\n> A **receipt** is a stamped, hand-offable record of one verification: an in-toto Statement v1 envelope around a verdict, evidence, omissions, and optional upstream receipt references. Its **proof** is the verifiable integrity property created by the fingerprint: SHA-256 over RFC 8785 canonical JSON of the full Statement, with only `predicate.fingerprint` removed before hashing. Any third party can recompute that fingerprint to confirm the receipt has not been edited since it was stamped. That is tamper-evidence, not producer authentication or formal proof of truth. A receipt without proof is a claim; a receipt with proof is evidence.\n\nReceipts are HISTORICAL records. Updates produce new receipts; old ones never mutate.\n\n## When to use\n\nExplicit phrasings:\n\n- \"Produce a receipt that deploy\u002Fapi is in compliance\"\n- \"Give me a verifiable attestation that the cluster matches Git\"\n- \"I need an evidence artifact for the audit trail\"\n- \"Build a receipt verifying no manual edits since the freeze started\"\n- \"Verify deploy\u002Fapi against source-truth and save the artifact\"\n- \"Validate this receipt has not been tampered with\"\n- \"List the receipts I've generated locally\"\n- \"Show me yesterday's receipts where the verdict was BLOCK\"\n- \"Attach typed evidence to my CI gate \u002F promotion gate \u002F release ticket\"\n- \"Keep the exact delivery\u002Fstatus feedback snapshot for audit\"\n\nImplicit intents:\n\n- The user wants **persistence** of an evidence snapshot, not just an ephemeral comparison\n- The user is gating CI \u002F promotion \u002F acceptance on a verdict\n- The user needs to **show later** exactly what evidence was attached to a decision, with tamper-evidence (forensic \u002F audit \u002F postmortem)\n- The user is integrating with Pilot or a similar acceptance kernel that consumes receipt-shaped evidence\n- The user wants a tamper-evident artifact, not a log line\n\n## Do not load for\n\n- Live comparison without a persisted artifact — [`scout-compare`](..\u002Fscout-compare\u002FSKILL.md) is faster and the right shape\n- Interpreting *why* a single field is wrong (which controller, which file) — [`scout-attribute`](..\u002Fscout-attribute\u002FSKILL.md)\n- Inventory \u002F status \u002F \"what's running\" — [`scout-observe`](..\u002Fscout-observe\u002FSKILL.md)\n- Forcing an apply \u002F sync \u002F patch — cub-scout cannot. Receipts emit; they never act.\n\n## Standalone vs connected\n\n- **Standalone (cluster only):** `receipt verify --predicate applied-matches-spec` and `--predicate no-manual-edits-since` work without ConfigHub. The receipt records `OmissionConfigHubUnitSubject` to flag the missing connected-mode evidence.\n- **Connected (cluster + `cub auth login`):** `--predicate source-truth-pass --strategy \u003Cname>` becomes available. Connected mode also adds the `confighub-unit:\u002F\u002F` subject to every receipt when unit identity is available, anchoring it to the unit revision in addition to the live K8s digest. Single-resource `receipt verify --with-confighub` can attach object-correlated delivery evidence under `predicate.evidence.deliveryEvidence`; this is supporting evidence and does not change predicate verdict semantics.\n- **Offline (file only):** `receipt show` \u002F `receipt validate` \u002F `receipt list` all work on on-disk artifacts with no cluster and no ConfigHub. Useful in CI containers that received the receipt as an artifact from an upstream job.\n\n## Tool boundary\n\n- **Allowed (read-only):** the four receipt verbs (`verify` \u002F `show` \u002F `validate` \u002F `list`); `kubectl get\u002Fdescribe`, `kubectl get --show-managed-fields` (for inspecting what `no-manual-edits-since` saw); `cub \u003Centity> get \u002F list` for the entities named in allowed-tools (connected); `argocd app get`, `flux get` (when building source-truth-pass evidence).\n- **Not allowed:** `kubectl apply\u002Fedit\u002Fpatch\u002Fdelete`, `argocd app sync` (as mutation), `flux reconcile --with-source`, `cub * create\u002Fupdate\u002Fdelete`. Receipts are evidence, never recommendations to mutate. `FilterNextSteps` (in `pkg\u002Fagent\u002Freceipt_predicates.go`) rejects mutating `actionType` \u002F `nextCommand` at receipt-emit time as defense in depth.\n- **`TestReceiptPackageReadOnlyClient`:** the static guard in `cmd\u002Fcub-scout\u002Freceipt_readonly_test.go` greps every `receipt*.go` source file and fails the build if any mutating K8s client method appears. Receipts are categorically read-only.\n\n## The verb menu\n\n| Question | Verb | Notes |\n|---|---|---|\n| \"Produce a receipt about this resource\" | `cub-scout receipt verify \u003Ckind>\u002F\u003Cname> -n \u003Cns>` | Auto-detects the predicate from owner + signals. Defaults to applied-matches-spec for Argo\u002FFlux\u002FConfigHub-owned resources with a resolved git anchor. |\n| \"Preserve delivery\u002Fstatus feedback\" | `cub-scout receipt verify \u003Ckind>\u002F\u003Cname> -n \u003Cns> --with-confighub --confighub-space \u003Cspace>` | Single-resource only; freezes object-correlated `deliveryEvidence` inside the fingerprinted receipt. |\n| \"Render a saved receipt\" | `cub-scout receipt show \u003Cpath>` | ASCII or JSON. Does NOT verify the fingerprint — works on tampered receipts for forensic inspection. |\n| \"Has this receipt been tampered with?\" | `cub-scout receipt validate \u003Cpath>` | Recomputes the fingerprint and compares. Exit 0 OK \u002F 1 mismatch \u002F 2 I\u002FO. JSON output for CI. |\n| \"What receipts do I have locally, and are TTL-backed ones still fresh?\" | `cub-scout receipt list --format json` | Walks `$CUB_SCOUT_RECEIPTS_DIR → $XDG_DATA_HOME\u002Fcub-scout\u002Freceipts → $HOME\u002F.local\u002Fshare\u002Fcub-scout\u002Freceipts`. Newest first, with `freshness.status` as `fresh`, `stale`, `not-declared`, or `invalid`. |\n\n## The predicates\n\ncub-scout v1 ships three predicates. Each maps a *required input signal* to a *receipt-level verdict*:\n\n| Predicate | Required signal | Verdict logic |\n|---|---|---|\n| `applied-matches-spec` | Argo\u002FFlux\u002FConfigHub owner + controller-resolved git anchor | PASS on `controller-drift` cause; BLOCK on `manual-edit` cause or anchor mismatch; INCONCLUSIVE on missing anchor or unknown cause. |\n| `source-truth-pass` | `--strategy \u003Cname>` (one of 9) + connected-mode ConfigHub auth | Mirrors `compare source-truth` Status → Verdict. Strategy mismatch between caller and evidence → BLOCK. |\n| `no-manual-edits-since` | `--since \u003CRFC3339>` cutoff | PASS when no `kubectl-*` writer touched `managedFields` after the cutoff. BLOCK on any late interactive write. INCONCLUSIVE on missing managedFields or nil-Time entries (parse-don't-guess). |\n\ncub-scout NEVER infers a strategy or a cutoff. `source-truth-pass` requires `--strategy`; `no-manual-edits-since` requires `--since`. Pass them or the CLI errors upfront.\n\n## Verdicts\n\nEvery receipt carries one of four:\n\n| Verdict | Meaning |\n|---|---|\n| `PASS` | Evidence supports the claim |\n| `WATCH` | Evidence is ambiguous; situation needs monitoring |\n| `BLOCK` | Evidence contradicts the claim |\n| `INCONCLUSIVE` | Evidence missing or unavailable; always carries one or more `omissions[]` entries |\n\nINCONCLUSIVE is **not** failure — it's an honest \"I don't have enough to claim PASS.\" Pilot and similar acceptance kernels treat it as `ASK` (need human or richer evidence).\n\n## The loop\n\n1. **Pick the predicate.** Most users mean `applied-matches-spec` (default for Argo\u002FFlux\u002FConfigHub-owned resources with a resolved anchor). If the user mentions a delivery strategy, they want `source-truth-pass`. If they mention a freeze window or cutoff timestamp, they want `no-manual-edits-since`.\n2. **Decide standalone vs connected.** Receipts work in both modes; connected mode adds the `confighub-unit:\u002F\u002F` subject + ConfigHub-side evidence. Source-truth-pass requires connected mode.\n3. **Invoke verify.** Use `--format json` for CI \u002F agent consumption. Use `--save` to land the artifact in the local store (immutable; refuses overwrite).\n4. **Read the verdict + omissions.** The verdict is the headline; `omissions[]` is the \"what I deliberately did not claim\" list. Empty omissions = comprehensive coverage. Non-empty = honest gaps.\n5. **Persist or attach.** `--out \u003Cpath>` writes a specific file; `--save` writes into the store under the canonical name. CI gates that need to attach the artifact to a build record use `--out`.\n6. **Hand off.** If the verdict is BLOCK and the user wants to *act*, refuse to mutate. Point them at the appropriate `cub` skill (for ConfigHub state changes), at `kubectl get --show-managed-fields` (to investigate a manual-edit BLOCK), or at the original-author path (commit the change back to git).\n\n## Worked examples\n\n### A: applied-matches-spec, standalone\n\nThe default path for an Argo-owned Deployment. Works without ConfigHub auth.\n\n```bash\n$ cub-scout receipt verify deploy\u002Fapi -n prod\nReceipt: applied-matches-spec\n  Verdict: PASS\n  Claim:   applied matches spec at apps\u002Fprod\u002Fapi\n  Scope:   Deployment\u002Fapi in prod\n  By:      cub-scout v2.3.0 at 2026-05-22T10:30:00Z\n  Spec:    https:\u002F\u002Fgithub.com\u002Forg\u002Fplatform-config @abc123def456 path=apps\u002Fprod\u002Fapi\n\nSubjects\n  - k8s-live:\u002F\u002Fapps\u002Fv1\u002FDeployment\u002Fprod\u002Fapi  sha256:595f08ae073d…\n\nEvidence (attribution)\n  cause:       controller-drift\n  managerHint: argocd-controller\n  gitSource:   https:\u002F\u002Fgithub.com\u002Forg\u002Fplatform-config @abc123def456 path=apps\u002Fprod\u002Fapi\n\nOmissions (deliberate non-claims)\n  - confighub-unit-subject  — standalone-mode build; no ConfigHub auth available to fetch unit subject  [info]\n\nNext steps (read-only)\n  - [read-only] controller is reconciling; spec anchor matches the resolved git source\n      → cub-scout explain\n\nFingerprint: sha256:252ef3104d0a3cc8ac62e7bde40cf6174b6f045d8ed2b97c6512781d8cb690f4\n```\n\nSave it to disk for a build record:\n\n```bash\n$ cub-scout receipt verify deploy\u002Fapi -n prod --format json --out api-prod.receipt.json\n```\n\nOr land it in the local store for casual accumulation:\n\n```bash\n$ cub-scout receipt verify deploy\u002Fapi -n prod --save\nsaved: \u002Fhome\u002Fuser\u002F.local\u002Fshare\u002Fcub-scout\u002Freceipts\u002F2026-05-22T10-30-00Z__applied-matches-spec__Deployment-api__252ef3104d0a.receipt.json\n```\n\n### B: source-truth-pass, declared strategy (connected mode)\n\n```bash\n$ cub-scout receipt verify deploy\u002Fapi -n prod --strategy git-argo --format json\n{\n  \"_type\": \"https:\u002F\u002Fin-toto.io\u002FStatement\u002Fv1\",\n  \"subject\": [\n    {\"name\": \"k8s-live:\u002F\u002Fapps\u002Fv1\u002FDeployment\u002Fprod\u002Fapi\", \"digest\": {\"sha256\": \"...\"}},\n    {\"name\": \"confighub-unit:\u002F\u002Fpayments-api@rev=42\", \"digest\": {\"sha256\": \"...\"}}\n  ],\n  \"predicateType\": \"https:\u002F\u002Fcub-scout.dev\u002Freceipt\u002Fv1\",\n  \"predicate\": {\n    \"predicateName\": \"source-truth-pass\",\n    \"verdict\": \"PASS\",\n    \"evidence\": {\n      \"sourceTruth\": {\n        \"declared_strategy\": \"Git -> Argo -> Kubernetes\",\n        \"status\": \"PASS\",\n        \"source_truth\": \"AGREED\",\n        \"surfaces\": { ... }\n      }\n    },\n    \"omissions\": [],\n    \"fingerprint\": \"sha256:...\"\n  }\n}\n```\n\nStrategy mismatch is BLOCK — never silently honor the caller's strategy over what the evidence records:\n\n```bash\n$ cub-scout receipt verify deploy\u002Fapi -n prod --strategy git-argo\n# ... evidence carries confighub-oci-argo, not git-argo ...\nVerdict: BLOCK\nOmissions\n  - strategy-mismatch  — receipt was asked to verify under strategy \"git-argo\" but source-truth evidence carries \"ConfigHub -> OCI -> Argo -> Kubernetes\"\n```\n\n### C: no-manual-edits-since freeze gate (standalone)\n\n```bash\n$ cub-scout receipt verify deploy\u002Fapi -n prod --since 2026-05-22T00:00:00Z --save\nsaved: \u002Fhome\u002Fuser\u002F.local\u002Fshare\u002Fcub-scout\u002Freceipts\u002F2026-05-22T10-30-00Z__no-manual-edits-since__Deployment-api__abc123.receipt.json\n\n$ cub-scout receipt show ~\u002F.local\u002Fshare\u002Fcub-scout\u002Freceipts\u002F2026-05-22T10-30-00Z__no-manual-edits-since__Deployment-api__abc123.receipt.json\nReceipt: no-manual-edits-since\n  Verdict: PASS\n  Claim:   no manual edits to Deployment\u002Fapi in prod since 2026-05-22T00:00:00Z\n```\n\nA late `kubectl edit` produces BLOCK and names the offending writer:\n\n```\nVerdict: BLOCK\nNext steps (read-only)\n  - [read-only] interactive writer wrote managedFields after the cutoff (2026-05-22T00:00:00Z): kubectl-edit@2026-05-22T12:00:00Z — investigate the unplanned edit before any apply\n      → kubectl get --show-managed-fields\n```\n\n### D: validate + list\n\n```bash\n$ cub-scout receipt validate .\u002Fapi-prod.receipt.json\nFingerprint OK: .\u002Fapi-prod.receipt.json\n  sha256:252ef3104d0a3cc8ac62e7bde40cf6174b6f045d8ed2b97c6512781d8cb690f4\n\n$ cub-scout receipt list\nStore: \u002Fhome\u002Fuser\u002F.local\u002Fshare\u002Fcub-scout\u002Freceipts\n\nVERDICT        PREDICATE               SCOPE                                     VERIFIED-AT             PATH\nPASS           applied-matches-spec    Deployment\u002Fapi in prod                    2026-05-22T10:30:00Z    2026-05-22T10-30-00Z__applied-matches-spec__Deployment-api__252ef3104d0a.receipt.json\nBLOCK          no-manual-edits-since   Deployment\u002Fapi in prod                    2026-05-22T08:00:00Z    2026-05-22T08-00-00Z__no-manual-edits-since__Deployment-api__abc123.receipt.json\n```\n\nJSON list output for CI consumption (filter by verdict):\n\n```bash\n$ cub-scout receipt list --format json | jq '.[] | select(.verdict == \"BLOCK\")'\n```\n\n## Output evidence\n\nWhat every receipt carries (the structured surface a downstream consumer pattern-matches on):\n\n| Field | Meaning |\n|---|---|\n| `predicate.predicateName` | One of `applied-matches-spec` \u002F `source-truth-pass` \u002F `no-manual-edits-since` |\n| `predicate.verdict` | One of `PASS` \u002F `WATCH` \u002F `BLOCK` \u002F `INCONCLUSIVE` |\n| `predicate.scope` | `kind \u002F name \u002F namespace \u002F cluster` |\n| `predicate.verifier` | `{tool, version}` — always `cub-scout` plus the build tag |\n| `predicate.verifiedAt` | RFC 3339 timestamp |\n| `predicate.spec.anchor` | Git repo + revision + path (applied-matches-spec only) |\n| `predicate.evidence.attribution` | `cause` \u002F `managerHint` \u002F `gitSource` — cub-scout's existing attribution layer |\n| `predicate.evidence.sourceTruth` | Source-truth derivation surfaces (source-truth-pass only) |\n| `predicate.omissions[]` | Structured list of what the receipt deliberately does NOT claim — empty array means comprehensive coverage |\n| `predicate.nextSteps[]` | Read-only follow-up hints (mutating verbs filtered at emit time) |\n| `predicate.fingerprint` | `sha256:` SHA-256 over RFC 8785 canonical JSON of the full Statement minus only this field |\n\n## Storage convention\n\nThe local receipt store is a flat directory of `*.receipt.json` files keyed by a deterministic sortable name:\n\n```\n\u003CverifiedAt-rfc3339-safe>__\u003Cpredicate>__\u003Ckind>-\u003Cname>__\u003Cshort-fingerprint>.receipt.json\n```\n\nResolved in priority order:\n\n1. `--save-dir \u003Cpath>` on verify, `--dir \u003Cpath>` on list (explicit override)\n2. `$CUB_SCOUT_RECEIPTS_DIR` env var\n3. `$XDG_DATA_HOME\u002Fcub-scout\u002Freceipts`\n4. `$HOME\u002F.local\u002Fshare\u002Fcub-scout\u002Freceipts`\n\nThe store is **immutable**: re-running verify on the same resource at the same instant with the same fingerprint produces the same canonical filename → \"already saved\" warning and exit 0. The on-disk artifact never changes.\n\n## v2 surface (CI \u002F agent shaped)\n\nThree v2 extensions layer on top of the v1 envelope without changing the wire format:\n\n- **`--fail-on \u003Cverdict-list>` on `receipt verify`** (`#451`) — exit non-zero (code 2) when the verdict matches. Accepts `WATCH`, `BLOCK`, `INCONCLUSIVE` (comma-separated) or the sugar `any-non-pass`. The receipt is still printed \u002F saved \u002F written to `--out` — the gate fires AFTER the artifact is durable.\n- **`--input-attestation \u003Cpath>` chained receipts** (`#448` chained half) — repeatable; each referenced receipt is loaded + fingerprint-verified + attached to the new receipt's `inputAttestations[]`. Tampered references refused at chain-construction time. The downstream fingerprint covers the field by construction.\n- **`cub-scout watch --emit-receipt-on \u003Cevent-types>` \u002F `cub-scout bot --emit-receipt-on \u003Cevent-types>`** (`#449`) — attaches a receipt to each matching event payload inline (JSONL or webhook). All four known event types build receipts: `drift.detected`, `ownership.changed`, `resource.discovered`, and `scan.finding`; `--emit-receipt-batch-cap` bounds burst volume. Failures are non-fatal.\n\n```bash\n# CI gate\n.\u002Fcub-scout receipt verify deploy\u002Fapi -n prod --fail-on any-non-pass\n\n# Chain a per-resource receipt with an upstream \"release gate passed\" one\n.\u002Fcub-scout receipt verify deploy\u002Fapi -n prod \\\n  --input-attestation .\u002Frelease-gate.receipt.json \\\n  --save\n\n# Streaming acceptance: each drift event becomes a fingerprinted receipt\n.\u002Fcub-scout watch -n prod \\\n  --output-file .\u002Facceptance.jsonl \\\n  --emit-receipt-on drift.detected,ownership.changed\n```\n\n## Not yet in cub-scout\n\nFuture directions worth flagging:\n\n- Cryptographic signing as a hardening layer on top of fingerprint-only — DSSE wrapped in a Sigstore Bundle (cosign keyless + ed25519 fallback) is one candidate design; the wire format is intentionally additive-friendly so signatures can land without an envelope change\n\nShipping releases use fingerprint-only integrity; future hardening is honest about what's not yet there — the contract is in `docs\u002Freference\u002Fjson-contracts.md` § Receipt Contract.\n\n## References\n\n- Terminology: [`docs\u002Fconcepts\u002Freceipts-and-proofs.md`](..\u002F..\u002Fdocs\u002Fconcepts\u002Freceipts-and-proofs.md) — what \"receipt\" and \"proof\" mean, vs log \u002F journal \u002F record \u002F ledger \u002F provenance\n- Contract: [`docs\u002Freference\u002Fjson-contracts.md`](..\u002F..\u002Fdocs\u002Freference\u002Fjson-contracts.md) § Receipt Contract\n- Locked design: [`docs\u002Fproposals\u002Freceipts-way-forward.md`](..\u002F..\u002Fdocs\u002Fproposals\u002Freceipts-way-forward.md)\n- Examples: [`examples\u002Freceipts\u002F`](..\u002F..\u002Fexamples\u002Freceipts\u002F) — 8 canonical receipts across the three predicates, generated deterministically by `tools\u002Fgen-receipt-examples`\n- Implementation: `pkg\u002Fagent\u002Freceipt*.go`, `cmd\u002Fcub-scout\u002Freceipt*.go`\n- Read-only triad: [`scout-attribute`](..\u002Fscout-attribute\u002FSKILL.md) (companion evidence surface), [`scout-compare`](..\u002Fscout-compare\u002FSKILL.md) (live comparison sibling)\n",{"name":5,"phase":24,"description":7,"allowed-tools":58},"Bash(.\u002Fcub-scout receipt verify *) Bash(cub-scout receipt verify *) Bash(cub scout receipt verify *) Bash(.\u002Fcub-scout receipt show *) Bash(cub-scout receipt show *) Bash(cub scout receipt show *) Bash(.\u002Fcub-scout receipt validate *) Bash(cub-scout receipt validate *) Bash(cub scout receipt validate *) Bash(.\u002Fcub-scout receipt list *) Bash(cub-scout receipt list *) Bash(cub scout receipt list *) Bash(.\u002Fcub-scout receipt list) Bash(cub-scout receipt list) Bash(cub scout receipt list) Bash(kubectl get *) Bash(kubectl describe *) Bash(kubectl get --show-managed-fields *) Bash(cub space list *) Bash(cub unit get *) Bash(cub unit list *) Bash(cub link get *) Bash(cub link list *) Bash(cub view get *) Bash(cub view list *) Bash(cub unit-event list *) Bash(cub resource list *) Bash(cub release list *) Bash(cub changeset list *) Bash(argocd app get *) Bash(flux get *)","main","261862e7ec5e5c93ce377ccfd6b583f5ac03c95c","skills\u002Fscout-verify",1,"https:\u002F\u002Fgithub.com\u002Fconfighub\u002Fcub-scout","https:\u002F\u002Fconfighub.com","https:\u002F\u002Fgithub.com\u002Fconfighub","http:\u002F\u002Fwww.confighub.com","Public repo for ConfigHub","2026-11-14 03:24:15",{"source":8,"skillName":5,"commands":70,"prompt":80,"zipAvailable":81},[71,74,77],{"tool":72,"command":73},"npx","npx skills add confighub\u002Fcub-scout --skill scout-verify",{"tool":75,"command":76},"bunx","bunx skills add confighub\u002Fcub-scout --skill scout-verify",{"tool":78,"command":79},"pnpm","pnpm dlx skills add confighub\u002Fcub-scout --skill scout-verify","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fconfighub\u002Fcub-scout\u002Fblob\u002Fmain\u002Fskills\u002Fscout-verify\u002FSKILL.md",true,[],[84,109,129,155,177,201],{"skillNo":85,"name":86,"nameZh":6,"description":87,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":88,"categories":89,"keywords":91,"publishedAt":53},"01M6CBPQHTK7YGVZD3MMH1328H","triage-unhealthy-workload","Use when the user is responding to a broken Kubernetes workload UNDER TIME PRESSURE — pager-going-off, CI-red, \"prod is down\" framing. Natural phrasing: \"deploy\u002Fapi is CrashLoopBackOff, what now?\", \"the rollout is stuck, help\", \"this pod won't start\", \"pager fired on payments\", \"everything is red in argocd\", \"what should I check first?\", \"give me a triage plan for this workload\". Composes doctor → explain → trace into a tight ~30-second loop the operator can run in a pager-acknowledged context. Do NOT load for: a planned investigation without urgency (use scout-diagnose directly), a drift question (use investigate-drift), or anything mutating (cub-scout never mutates — route to kubectl with the user driving).","https:\u002F\u002Fgithub.com\u002Fconfighub\u002Fcub-scout\u002Fblob\u002Fmain\u002Fskills\u002Ftriage-unhealthy-workload\u002FSKILL.md",[90],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},[92,93,94,40,95,96,97,50,98,47,45,99,100,101,102,103,39,104,38,36,34,105,106,107,32,108,28],"triage","workload","triage unhealthy workload","diagnose","doctor","logs","payments","loop","explain","check","broken","question","rollout","drift","map","time","now",{"skillNo":110,"name":111,"nameZh":6,"description":112,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":113,"categories":114,"keywords":115,"publishedAt":53},"01M6CBPF8WZBM7F9X096WT8PJD","scout-observe","Use when the user wants to SEE what is running in a Kubernetes cluster, who owns it, and how it is structured — the read-only Observe verb group of cub-scout. Natural phrasing: \"what is running in my cluster?\", \"give me a map of resources\", \"who owns this Deployment?\", \"trace this back to its source\", \"show me the ownership tree\", \"scan this cluster for risk\", \"dump the cluster as JSON\", \"stream cluster events\", \"run cub-scout as a bot\", \"what is the connection status?\", \"is this cluster healthy?\". Load when intent is observe \u002F inventory \u002F map \u002F show \u002F list \u002F trace \u002F scan \u002F dump \u002F stream \u002F bot \u002F health-check over a Kubernetes cluster. Do NOT load for: explaining WHY something is broken (use scout-diagnose), comparing cluster state to intended state (use scout-compare), provenance of individual field values (use scout-attribute), or any action that mutates the cluster (cub-scout never mutates — route to cub or kubectl with the user driving).","https:\u002F\u002Fgithub.com\u002Fconfighub\u002Fcub-scout\u002Fblob\u002Fmain\u002Fskills\u002Fscout-observe\u002FSKILL.md",[],[116,117,25,118,40,95,119,96,97,120,48,121,46,45,102,39,122,38,123,124,36,35,125,126,106,32,127,128,28],"observe","scout observe","bot","deployment","risk","inventory","version","only","hooks","back","health-check","resources","meaning",{"skillNo":130,"name":131,"nameZh":6,"description":132,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":133,"categories":134,"keywords":138,"publishedAt":53},"01M6CBPBM5J9PX4H8CE628AY5X","scout-mcp","Use when the user wants to expose cub-scout to an AI agent over MCP, wants a deterministic AI-ready snapshot of cluster context, or wants cub-scout running as a read-only event bot — the Integrate verb group. Natural phrasing: \"start the MCP server\", \"expose cub-scout to Claude \u002F Codex \u002F my agent\", \"give me an AI-ready context pack of this cluster\", \"set up the MCP gateway\", \"what MCP tools does cub-scout expose?\", \"run cub-scout as a bot\", \"produce JSON context for an LLM to reason about this cluster\". Load whenever intent is mcp \u002F mcp-gateway \u002F mcp-serve \u002F context-pack \u002F bot \u002F agent-context \u002F ai-snapshot \u002F llm-context \u002F model-context-protocol. Do NOT load for: actually running a non-integrate verb (those are scout-observe \u002F scout-diagnose \u002F scout-compare \u002F scout-attribute \u002F scout-ingest \u002F scout-govern \u002F scout-verify), or `cub` MCP integration (that's a separate tool surface).","https:\u002F\u002Fgithub.com\u002Fconfighub\u002Fcub-scout\u002Fblob\u002Fmain\u002Fskills\u002Fscout-mcp\u002FSKILL.md",[135],{"categoryNo":136,"categoryName":137,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000023","Skill与智能体开发",[139,140,25,118,141,142,143,144,145,146,147,148,45,149,43,150,151,123,152,153,116,32,30,154,28],"MCP","scout mcp","mcp server","ai agent","auth","config","run","release","server","SET","model","read","snapshot","ready","up","agent-context",{"skillNo":156,"name":157,"nameZh":6,"description":158,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":159,"categories":160,"keywords":161,"publishedAt":53},"01M6CBP7D72G704FWGRXNB6F9T","scout-ingest","Use when the user wants to ADOPT existing Kubernetes \u002F GitOps workload structure into ConfigHub after observing the live cluster — the adoption\u002Fimport verb group of cub-scout. Natural phrasing: \"discover workloads in this cluster and propose ConfigHub units\", \"show me the import proposal before I apply\", \"import this Argo Application set\", \"bring my Flux Kustomizations into ConfigHub\", \"preview what would land in ConfigHub if I imported this repo\", \"parse my git repo as a ConfigHub import bundle\", \"import a cluster aggregator\", \"what would --git-path produce for this repo?\". Load whenever intent is adopt \u002F import \u002F ingest \u002F preview \u002F propose \u002F parse-repo \u002F discovery \u002F aggregator \u002F bring-into-confighub \u002F what-would-confighub-see. Do NOT load for: questions about who changed a resource, whether it was edited by hand or drifted (use scout-attribute or investigate-drift); reading an exported `kubectl get -o yaml` dump to answer a question about the cluster (that is not an import); basic live-cluster inventory (use scout-observe), troubleshooting (use scout-diagnose), comparing live state to ConfigHub (use scout-compare), or the actual write to ConfigHub via `cub variant upload` (that is `cub`, not cub-scout — route to cub skills). Important: `cub-scout import apply` IS the mutating write into ConfigHub — this skill teaches the read-only preview path and explicitly refuses to invoke `import apply` itself.","https:\u002F\u002Fgithub.com\u002Fconfighub\u002Fcub-scout\u002Fblob\u002Fmain\u002Fskills\u002Fscout-ingest\u002FSKILL.md",[],[162,163,25,40,95,146,164,51,165,148,121,166,46,45,43,167,103,150,168,41,39,123,116,36,35,169,170,171,172,31,30,173,174,175,176],"ingest","scout ingest","state","adoption","discovery","repo","write","structure","aggregator","adopt","argo","reading","exported","invoke","parse",{"skillNo":178,"name":179,"nameZh":6,"description":180,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":181,"categories":182,"keywords":183,"publishedAt":53},"01M6CBP32CYJT8DJSGNCRWXQTM","scout-govern","Use when the user wants to consume CONNECTED ConfigHub governance signals from cub-scout — the Govern verb group. Natural phrasing: \"show me the ChangeSet history for this unit\", \"what is the blast radius if I change this unit?\", \"which clusters in my fleet are outliers?\", \"show me yesterday's connected summary\", \"render this view across the fleet\", \"audit who changed this\", \"where did the last apply come from?\", \"list ConfigHub bundles I have\", \"show me the catalog of past snapshots\". Load whenever intent is history \u002F impact \u002F blast-radius \u002F fleet-outliers \u002F summary \u002F view \u002F audit \u002F bundle \u002F catalog \u002F connected-context. Do NOT load for: live cluster comparison (use scout-compare), receipts (use scout-verify), inventory of running pods (use scout-observe), or any mutation via cub. Most of this skill requires `cub auth login` — say so upfront.","https:\u002F\u002Fgithub.com\u002Fconfighub\u002Fcub-scout\u002Fblob\u002Fmain\u002Fskills\u002Fscout-govern\u002FSKILL.md",[],[184,25,185,143,186,187,188,121,24,46,45,189,43,41,190,39,191,192,193,116,36,35,194,32,195,196,30,197,198,199,200,28],"scout govern","change","governance","blast radius","audit","history","catalog","diff","say","snapshots","project","mutation","impact","render","blast-radius","which","inspect",{"skillNo":202,"name":203,"nameZh":6,"description":204,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":205,"categories":206,"keywords":207,"publishedAt":53},"01M6CBNZ2JCB0050H8NYYGQMDN","scout-diagnose","Use when the user wants cub-scout to INTERPRET what it sees and suggest a next step — the Diagnose verb group. Natural phrasing: \"explain this Deployment\", \"why is this broken?\", \"what should I do about this?\", \"is this drift or just slow sync?\", \"what does this error mean?\", \"is there a known pattern for this?\", \"is my GitOps pipeline healthy?\", \"what events are firing on this Pod?\", \"give me a suggested remedy for this finding\". Load whenever intent is explain \u002F why \u002F what-does-it-mean \u002F what-should-I-do \u002F interpret \u002F diagnose \u002F recommend \u002F suggest-fix over a Kubernetes cluster or a scan finding. Do NOT load for: pure cluster inventory (use scout-observe), comparing intended vs running state at the field level (use scout-compare), field-level provenance (use scout-attribute), or actually applying a fix (cub-scout never mutates — route to cub or kubectl with the user driving).","https:\u002F\u002Fgithub.com\u002Fconfighub\u002Fcub-scout\u002Fblob\u002Fmain\u002Fskills\u002Fscout-diagnose\u002FSKILL.md",[],[95,208,25,40,209,119,164,97,210,48,121,45,100,42,211,102,27,39,38,116,36,34,105,33,212,32,31,213,214,28],"scout diagnose","debug","pipeline","just","next","error","what-should-i-do"]