Skip to content
GitHub

Reference: direct-install diagnostic codes

Look up every refusal code the direct skill-installation route can emit, what it means, and what to do about it.

Installing a skill folder straight from a repository refuses rather than guessing. Every refusal carries one of the codes below and the path it objects to. Some also print a separate recovery line. The table is the complete set: nothing else can reach you from this route.

Machine-readable schema for the JSON envelope these appear in: https://agentbundle.dev/schema/direct-diagnostics-v1.json

CodeMeaning
CAT-D001Malformed owner/repository or invalid URL component
CAT-D002Bare or defaulted ref (main) refused
CAT-D003Hex-shaped tag not safely classifiable as an abbreviated SHA
CAT-D004pax_global_header SHA absent, malformed, or ref mismatch
CAT-D005Interpreter runtime floor below the supported minor
CAT-D006Transport failure during acquisition: a download or inactivity limit, a non-2xx HTTP status, a malformed seam between acquisition stages, or a certificate that could not be verified even after the system-trust retry
CAT-D007Archive member refused by the extraction filter or link policy
CAT-D008Collection selection missing, unknown, duplicated, or applied to a direct pack; a remote noninteractive install missing --yes; or a standalone noninteractive upgrade missing --yes
CAT-D009Measured-path integrity (link-like, reparse, wrong type)
CAT-D010Source untraversable or changed during admission
CAT-D011Invalid direct identity (slug grammar or length)
CAT-D012Measured-envelope entry count
CAT-D013Envelope-relative path depth
CAT-D014Measured file count
CAT-D015Selected-skills count
CAT-D016Per-file bytes
CAT-D017Total bytes
CAT-D018Logical path segment carries a control or surrogate code point
CAT-D019Publisher candidate value failed the output allowlist, a declared allowed-tools value could not be normalized, or an internal refusal (path-jail, direct-state, or bounded-metadata) reached the install boundary
CAT-D020A standalone skill upgrade could not remove an obsolete owned file; clear the obstruction on that file before retrying
CAT-D021A standalone skill upgrade removed an obsolete file but could not prune an emptied directory; clear the obstruction on that directory before retrying
CAT-D022An installed direct identity was requested from the same source at a different ref; use upgrade --skill <name> --source <source>
CAT-D023A standalone skill upgrade could not read required state or select a usable installed manifestless row
CAT-D024A standalone skill upgrade matched more than one scope; pass --scope repo or --scope user
CAT-D025A standalone skill upgrade matched more than one adapter; pass --adapter <adapter>
CAT-D026A standalone skill upgrade re-resolved its source, but the recorded source path no longer identifies the installed skill
CAT-D027A standalone skill upgrade found destination bytes that match neither its incoming content nor the digest recorded by the installed row
CAT-D028A standalone skill upgrade was given a source override for a row installed from a local path
CAT-D029A standalone skill upgrade was given a source override that names a different repository identity
CAT-D030A standalone skill upgrade cannot form a request from absent, legacy, malformed, or unconfined stored source provenance
CAT-D031A standalone skill upgrade cannot verify a non-widening transition because the installed capability history is unknown or the incoming declarations widen allowed tools, boundaries, or credential use
CAT-D032A standalone skill upgrade cannot compare the stored source digest because it is absent, malformed, or uses an unsupported algorithm or encoding; reinstall to record a digest this build understands
CAT-D033Catalogue-only upgrade --pack found direct rows for multiple adapters; each manifestless skill row names its standalone command, while a direct pack row states that no upgrade route is built
CAT-D034Standalone upgrade --skill does not support JSON output; use table output instead
CAT-D035A standalone skill upgrade found a recorded ownership path outside the selected skill projection; repair or remove the malformed state entry before retrying
CAT-D036Catalogue-only upgrade --pack selected one directly installed row; use the row’s direct lifecycle route instead

A refusal names the offending path, not just the rule. Before a source root exists — a malformed URL, for instance — the path is the source string you supplied, with any non-graphic, bidirectional-override, or default-ignorable code point rendered as \uXXXX. Every character that would print as itself does; the escaping exists so a path cannot repaint the line it appears on.

Every value in a printed recovery command is shell-quoted, so you can paste the line as-is even when a publisher chose an awkward skill name.

Six codes report a measured budget rather than a defect. Each names the budget it broke and that budget’s limit. A value equal to a limit is admitted; only a greater value refuses.

An integrity refusal is never reported as a budget breach: a symlink inside a skill folder is a link, not an oversized one, and it carries its own code and the path it was found at.