Skip to main content

What this is for

This page explains what gw-cli discover finds on a machine and how each artifact is scored. The inventory is broad — the whole agent extension surface, not just skills — and the scoring is layered: a primary engine, plus offline augmentation passes designed to catch the evasion techniques that beat file-only scanners.

The inventory surface

discover --deep walks the machine and records every AI artifact it finds:

Risk levels

Every scored artifact is normalized to one of five levels, ordered lowest to highest: High and Critical are the flagged levels — the ones the dashboard badges and vet blocks on by default.

Scoring engines

gw-cli scores with one of two engines. It auto-detects which is available and prints the active engine in its output.
MCP configs are always scored by a config-aware analyzer (reliable on JSON) rather than the skill engine — it flags hardcoded secrets in env, non-TLS http:// endpoints, and shell-launch commands. Hooks and commands are scored with shell + network heuristics; subagents are flagged for overly broad tool grants.

Offline augmentation

On top of the primary engine, every scan record runs through offline augmentation passes. These counter the techniques research has shown beating file-only scanners (including SkillSpector), and they need no network:
So a hardcoded token in an MCP config, a curl … | bash hidden with invisible characters, or a known malicious indicator all surface as findings — even against an artifact crafted to slip past a plain file scan.

External-reference index

Beyond flagging suspicious links, the scanner builds a typed, persisted index of every external resource an artifact points the agent at — the durable graph the drift watcher diffs and a future network trust-scorer will enrich. Each reference records its kind (URL, repository, npm/PyPI package, release download, remote skill/instructions, paste host, wallet address), a coarse host class (vendor, code host, registry, paste, free-tier/throwaway, IP), its version spec, and whether it is pinned to an exact version/tag/commit. Only the host/package identity and version metadata are stored — never a raw URL that might carry a token. The offline external-reference classifier turns high-signal references into findings:

Post-approval drift

An artifact that scored clean can be edited — or silently auto-updated — into something malicious after you first trusted it (a rug-pull / TOCTOU). On every scan the mutation watcher diffs the fresh record against the last-stored (approved) baseline for that path and raises drift findings: This is the on-endpoint-detectable half of the flagship supply-chain attack (CVE-2025-54136). discover prints a one-line summary (Post-approval drift: N change(s)…) when anything drifted.

Install-lifecycle & CI-workflow analysis

The highest-severity confirmed payloads often hide in install plumbing rather than the skill body. A dedicated pass inspects each artifact’s files:

Metadata, posture & MCP scope

Three more offline passes catch risks that live in the declaration and environment around a skill rather than its code:

OWASP Agentic Skills Top 10

Every rule Guardway raises is tagged with the OWASP Agentic Skills Top 10 item it detects (AST01–AST10), and the CLI + dashboards compute a compliance level per machine from those findings. Guardway has detection-side coverage of all ten items — it detects and reports; it never blocks or sandboxes.

Compliance scoring

Each item is scored from the findings present on the machine: A machine’s compliance % = (PASS = 1 · ATTENTION = 0.5 · FAIL = 0) across the ten items ÷ 10. gw-cli scan prints each finding’s AST tag (e.g. META-UNDECLARED-NET … (AST04)); the local dashboard shows an OWASP panel; the Guardway console rolls it up across the fleet.
AST vs ASI — two different OWASP frameworks. The endpoint side (this CLI) maps to the Agentic Skills Top 10 (AST) — threats in installed skills at rest. The platform Agents page maps to the Agentic Security Initiative (ASI) — threats in a running agent. They are complementary, not the same list: AST07 Update Drift and AST09 Governance have no runtime equivalent; ASI06 Memory Poisoning and ASI10 Rogue Agents have no static-skill equivalent. AST is the risk at rest (the leading indicator); ASI is the live exploitation — e.g. an over-privileged skill (AST03) is what a running agent later abuses (ASI03).

Governance (AST09)

Inventory only governs if new arrivals are surfaced. Run gw-cli approve after reviewing a discover run to record the current skills, commands, subagents, and MCP configs as the approved baseline (path + content hash → <data-dir>/approved.json). From then on discover flags anything new or changed outside that baseline: Governance is opt-in and local — no baseline file, no findings. Until you run approve, AST09 reads as ATTENTION (“no approval baseline”); a baseline with no violations makes it PASS.

Vet verdicts

gw-cli vet collapses an artifact’s overall risk into a single headline verdict word plus one-line advice. The mapping: The process exits non-zero at or above --fail-on (default high), so you can gate an install:

Limits

  • The built-in engine over-flags by design; install SkillSpector for production-grade scoring.
  • Detection is static — it inspects files, it does not execute them. Drift detection catches the local mutation of an approved artifact (the on-endpoint half of a TOCTOU/rug-pull); confirming that a remote URL’s served content has flipped, or judging live runtime intent, requires the network and is out of scope for on-endpoint static analysis.
  • Drift needs a baseline: the first scan of an artifact establishes it, so drift findings appear from the second scan onward. Keep the inventory fresh (see schedule) so the baseline stays current.
  • On Windows, some app-config paths (e.g. the Claude desktop app under %APPDATA%) are still being added; Claude Code and project-folder artifacts are covered today.