close

Spec Coverage Matrix

Which requirements have automated audits — and which remain uncovered. Generated by anc generate coverage-matrix from the agentnative principle registry.

Summary

59 total requirements
56 covered
3 uncovered
LevelTotalCoveredUncovered
MUST28280
SHOULD21183
MAY10100

P1: Non-Interactive by Default

LevelRequirementApplicabilityVerified by
MUSTEvery flag settable via environment variable (falsey-value parser for booleans).Universalp1-env-hints p1-env-flags-source
MUSTWhen stdin is not a TTY or `--no-interactive` is set, every blocking-input surface (prompt libraries, read-line, TUI init) resolves from defaults/stdin or exits with an actionable error.Universalp1-non-interactive p1-flag-existence p1-non-interactive-source
MUSTHeadless authentication path (`--no-browser` / OAuth Device Authorization Grant).CLI authenticates against a remote servicep1-headless-auth
MUSTSensitive inputs are readable via stdin or a `--*-file` flag; flag-value and env-var inputs MAY exist for convenience but MUST NOT be the only path.CLI accepts secret material (tokens, passwords, keys) as inputp1-secret-non-leaky-path
SHOULDAuto-detect non-interactive context via TTY detection; suppress prompts when stderr is not a terminal.Universalp1-tty-detection-source
SHOULDDocument default values for prompted inputs in `--help` output.Universalp1-defaults-in-help
MAYRich interactive experiences (spinners, progress bars, menus) when TTY is detected and `--no-interactive` is not set.Universalp1-rich-tui

P2: Structured, Parseable Output

LevelRequirementApplicabilityVerified by
MUST`--output` flag selects format with `json` and `jsonl` as canonical machine-readable values; `text` is the default human-facing form.Universalp2-json-output p2-structured-output
MUSTData goes to stdout; diagnostics/progress/warnings go to stderr, never interleaved.Universalp2-output-module
MUSTExit codes are structured and documented (0 success, 1 general, 2 usage, 77 auth, 78 config).Universalp2-structured-exit-codes
MUSTWhen `--output json` is active, errors are emitted as JSON (to stderr) with at least `error`, `kind`, and `message` fields.Universalp2-json-errors
MUSTCLIs that emit structured output expose the output schema via a `schema` subcommand or `--schema` flag: runtime-discoverable, with a documented format identifier.Conditionalp2-schema-print
SHOULDJSON output uses a consistent envelope (a top-level object with predictable keys) across every command.Universalp2-consistent-envelope
SHOULDOutput schemas are also exported to a stable file path (e.g., `schema/<command>.json`) so CI/static-analysis consumers pin without invoking the tool.Conditionalp2-schema-file
SHOULD`--json` and `--jsonl` are accepted as aliases for `--output json` and `--output jsonl`; the short forms work alongside the canonical enum.Universalp2-json-aliases
MAYAdditional output formats (CSV, TSV, YAML) beyond the core three.Universalp2-more-formats
MAY`--raw` flag for unformatted output suitable for piping to other tools.Universalp2-raw-flag

P3: Progressive Help Discovery

LevelRequirementApplicabilityVerified by
MUSTEvery subcommand ships at least one concrete invocation example (`after_help` in clap).CLI uses subcommandsp3-subcommand-examples
MUSTThe top-level command ships 2–3 examples covering the primary use cases.Universalp3-help
MUSTTop-level `--version` prints a non-empty version line and exits 0.Universalp3-version
SHOULDA short version alias (`-V`, `-v`, or `-version`) accompanies `--version` for fast version probes.Universalp3-version
SHOULDExamples show human and agent invocations side by side (text then `--output json` equivalent).Universalp3-paired-examples
SHOULDShort `about` for command-list summaries; `long_about` reserved for detailed descriptions visible with `--help`.Universalp3-about-long-about
MAYDedicated `examples` subcommand or `--examples` flag for curated usage patterns.Universalp3-examples-subcommand

P4: Fail-Fast, Actionable Errors

LevelRequirementApplicabilityVerified by
MUSTParse arguments with `try_parse()` instead of `parse()` so `--output json` can emit JSON parse errors.Universalp4-try-parse
MUSTError types map to distinct exit codes (0, 1, 2, 77, 78).Universalp4-bad-args p4-exit-codes
MUSTEvery error message names the failure, the cause, and a concrete remediation (a command or a value, not a hint to consult docs).Universalp4-actionable-errors
SHOULDError types use a structured enum (via `thiserror` in Rust) with variant-to-kind mapping for JSON serialization.Universalp4-error-module p4-error-types
SHOULDConfig and auth validation happen before any network call, failing at the earliest possible point.CLI makes network callsUNCOVERED
SHOULDError output respects `--output json`: JSON-formatted errors go to stderr when JSON output is selected.Universalp4-json-error-output
SHOULDWhen rejecting input against an enum or fixed-allowed-values set, the error message includes the valid set.CLI rejects input against a closed setp4-enumerate-valid-set p4-enumerate-valid-set

P5: Safe Retries & Mutation Boundaries

LevelRequirementApplicabilityVerified by
MUSTDestructive operations (delete, overwrite, bulk modify) require an explicit `--force` or `--yes` flag.CLI has destructive operationsp5-force-yes
MUSTThe distinction between read and write commands is clear from the command name and help text alone.CLI has both read and write operationsp5-read-write-distinction
MUSTA `--dry-run` flag is present on every write command; dry-run output respects `--output json`.CLI has write operationsp5-dry-run
SHOULDWrite operations are idempotent where the domain allows it: running the same command twice produces the same result.CLI has write operationsUNCOVERED

P6: Composable, Predictable Command Structure

LevelRequirementApplicabilityVerified by
MUSTSIGPIPE is handled so piping to `head`/`tail` does not crash the process (Rust example below; Python/Go/Node have language-specific equivalents).Universalp6-sigpipe
MUSTLong-running operations handle SIGTERM gracefully: flush or roll back partial writes, release locks, exit non-zero within a bounded window. Next invocation succeeds without manual cleanup.CLI has long-running operationsp6-sigterm p6-sigterm
MUSTTTY detection plus support for `NO_COLOR` and `TERM=dumb`: color codes suppressed when stdout/stderr is not a terminal.Universalp6-no-color-behavioral p6-no-color p6-no-color
MUSTShell completions available via a `completions` subcommand (Tier 1 meta-command, needs no config/auth/network).Universalp6-completions
MUSTNetwork CLIs ship a `--timeout` flag with a sensible default (e.g., 30 seconds).CLI makes network callsp6-timeout
MUSTIf the CLI uses a pager (`less`, `more`, `$PAGER`), it supports `--no-pager` or respects `PAGER=""`.CLI invokes a pager for outputp6-no-pager-behavioral p6-no-pager
MUSTAgentic flags (`--output`, `--quiet`, `--no-interactive`, `--timeout`) propagate to every subcommand (e.g., `global = true` in clap).CLI uses subcommandsp6-global-flags
SHOULDCommands that accept input read from stdin when no file argument is provided.CLI has commands that accept input datap6-stdin-input
SHOULDSubcommand naming follows a consistent `noun verb` or `verb noun` convention throughout the tool.CLI uses subcommandsp6-consistent-naming
SHOULDThree-tier dependency gating: Tier 1 (meta) needs nothing, Tier 2 (local) needs config, Tier 3 (network) needs config + auth.UniversalUNCOVERED
SHOULDOperations are modeled as subcommands, not flags (`tool search "q"`, not `tool --search "q"`).CLI performs multiple distinct operationsp6-subcommand-operations
MAY`--color auto|always|never` flag for explicit color control beyond TTY auto-detection.Universalp6-color-flag
MAYSubcommand verbs MAY follow community-standard names (`get`/`list`/`create`/`update`/`delete`); flag spellings MAY follow widely-used canonical forms (`--force`, `--yes`, `--limit`, `--quiet`, `--verbose`).CLI uses subcommandsp6-standard-names

P7: Bounded, High-Signal Responses

LevelRequirementApplicabilityVerified by
MUSTA `--quiet` flag suppresses non-essential output; only requested data and errors appear.Universalp7-quiet
MUSTList operations clamp to a documented default maximum; when truncated, indicate it (`"truncated": true` in JSON, stderr note in text).CLI has list-style commandsp7-output-clamping
SHOULDA `--verbose` flag (or `-v` / `-vv`) escalates diagnostic detail when agents need to debug failures.Universalp7-verbose
SHOULDA `--limit` or `--max-results` flag lets callers request exactly the number of items they want.CLI has list-style commandsp7-limit
SHOULDA `--timeout` flag bounds execution time so agents are not blocked indefinitely.Universalp7-timeout-behavioral
MAYCursor-based pagination flags (`--after`, `--before`) for efficient traversal of large result sets.CLI returns paginated resultsp7-cursor-pagination
MAYAutomatic verbosity reduction in non-TTY contexts (same behavior `--quiet` explicitly requests).Universalp7-auto-verbosity

P8: Discoverable Through Agent Skill Bundles

LevelRequirementApplicabilityVerified by
MUSTWhen a skill bundle exists, the CLI provides an install path (`tool skill install [<host>]`) that registers the bundle with installed agent runtimes.Conditionalp8-bundle-install
SHOULDCLIs ship a top-level agent-discoverable markdown bundle (`AGENTS.md`, `SKILL.md`, or equivalent) with YAML frontmatter naming the tool and capability summary.Universalp6-agents-md p8-bundle-exists
MAYAn `--all` mode auto-detects installed runtimes (Claude Code, Cursor, Codex, OpenCode, etc.) and installs across all.Conditionalp8-install-all
MAYAn update/upgrade subcommand (`tool skill update`) pulls the latest bundle version.Conditionalp8-bundle-update

About this matrix

This matrix is generated from the agentnative principle registry — a flat list of every MUST, SHOULD, and MAY across the eight principles, each mapped to the audit IDs that verify it. Requirements with no verifiers are marked UNCOVERED: the spec requires them but anc does not yet test for them.

"Covered" means an audit exists that targets this requirement. "Verified" (on scorecard pages) means the audit actually ran for a specific tool. A requirement can be covered in the matrix but unverified for a particular tool if the audit was skipped (e.g., source audits on a binary-only audit).