# CLI Batch A -- E2E Test Results **Date:** 2026-02-15 **Agent:** batch-a **CLI Project:** `src/Cli/StellaOps.Cli/StellaOps.Cli.csproj` **Configuration:** Release (pre-built, `--no-build`) **Environment note:** SM remote probe fails (expected -- no SM remote service running). Adds ~4s startup latency per invocation. --- ## Top-Level Command Summary | # | Command | Description | Subcommands | --help OK | Behavioral Test | Exit Code | Notes | |---|---------|-------------|-------------|-----------|-----------------|-----------|-------| | 1 | `scanner` | Manage scanner artifacts and lifecycle | `download`, `workers` | YES | N/A (container-dependent) | 0 | 2 subcommands | | 2 | `scan` | Execute scanners and manage scan outputs | `entrytrace`, `sarif`, `replay`, `gate-policy`, `gate-results`, `layers`, `layer-sbom`, `recipe`, `diff`, `delta`, `verify-patches`, `download`, `workers`, `secrets`, `image`, `run`, `upload`, `graph` | YES | N/A (requires scan data) | 0 | 18 subcommands -- richest command | | 3 | `image` | OCI image operations | `inspect` | YES | N/A (requires registry) | 0 | 1 subcommand | | 4 | `ruby` | Work with Ruby analyzer outputs | `inspect`, `resolve` | YES | `ruby inspect --help` OK | 0 | 2 subcommands | | 5 | `php` | Work with PHP analyzer outputs | `inspect` | YES | N/A | 0 | 1 subcommand | | 6 | `python` | Work with Python analyzer outputs | `inspect` | YES | N/A | 0 | 1 subcommand | | 7 | `bun` | Work with Bun analyzer outputs | `inspect`, `resolve` | YES | N/A | 0 | 2 subcommands | | 8 | `db` | Trigger Concelier database operations | `fetch`, `merge`, `export` | YES | N/A (requires backend) | 0 | 3 subcommands | | 9 | `sources` | Interact with source ingestion workflows | `ingest`, `list`, `check`, `enable`, `disable`, `status` | YES | `sources list` CRASH (exit 1), `sources status` CRASH (exit 1) | 0 (help) / 1 (run) | **BUG: ISourceRegistry not registered in DI** | | 10 | `aoc` | Aggregation-Only Contract verification | `verify` | YES | `aoc verify` exits 71 (tenant required) | 0 (help) / 71 (run) | Correct error: requires `--tenant` | | 11 | `auth` | Manage authentication | `login`, `logout`, `status`, `whoami`, `revoke`, `token` | YES | `auth status` exits 1 (authority not configured) | 0 (help) / 1 (run) | Expected: no Authority URL configured | | 12 | `tenants` | Manage tenant contexts | `list`, `use`, `current`, `clear` | YES | `tenants current` exits 0: "No active tenant configured." | 0 | Correct offline behavior | | 13 | `policy` | Interact with Policy Engine | `simulate`, `activate`, `lint`, `edit`, `test`, `new`, `history`, `explain`, `init`, `compile`, `version`, `submit`, `review`, `publish`, `rollback`, `sign`, `verify-signature`, `lattice`, `verdicts`, `promote`, `validate-yaml`, `install`, `list-packs`, `export`, `import`, `validate`, `evaluate` | YES | `policy lint /nonexistent.stella` exits 4 (file not found) | 0 (help) / 4 (lint) | 27 subcommands; correct error for missing file | | 14 | `tools` | Local policy tooling | `policy-dsl-validate`, `policy-schema-export`, `policy-simulation-smoke`, `lint`, `benchmark`, `migrate` | YES | N/A | 0 | 6 subcommands; benchmark has sub-subs (policy/scan/crypto) | | 15 | `task-runner` | Interact with Task Runner | `simulate` | YES | N/A | 0 | 1 subcommand | | 16 | `findings` | Inspect policy findings | `ls`, `get`, `explain` | YES | `findings ls` exits 1 (--policy required) | 0 (help) / 1 (run) | Correct: shows required option hint | | 17 | `advise` | Advisory AI pipelines | `run`, `summarize`, `explain`, `remediate`, `batch`, `open-pr`, `ask`, `chat-doctor`, `chat-settings`, `export` | YES | `advise run --help` OK | 0 | 10 subcommands | | 18 | `config` | Manage configuration | `show`, `list`, `notify`, `integrations`, `feeds`, `registry`, `sources`, `signals` | YES | `config show` exits 0 (shows defaults), `config list` exits 0 (lists paths) | 0 | 8 subcommands; behavioral tests pass | | 19 | `kms` | Manage signing keys | `export`, `import` | YES | Both `--help` OK | 0 | 2 subcommands | | 20 | `key` | Key management | `list`, `add`, `revoke`, `rotate`, `status`, `history`, `verify` | YES | N/A (requires anchorId) | 0 | 7 subcommands | | 21 | `issuer` | Issuer key management | `keys` (sub: `list`, `create`, `rotate`, `revoke`) | YES | `issuer keys --help` OK | 0 | Nested: keys has 4 sub-subcommands | --- ## Subcommand --help Verification | Parent | Subcommand | --help OK | Exit Code | Notes | |--------|------------|-----------|-----------|-------| | `scanner` | `download` | YES | 0 | Options: --channel, --output, --overwrite, --no-install | | `scanner` | `workers` | YES | 0 | Sub-subcommands: get, set | | `scan` | `entrytrace` | YES | 0 | Options: --scan-id (required), --include-ndjson, --semantic | | `scan` | `sarif` | YES | 0 | Options: --scan-id (required), -o, --pretty, --include-hardening, --include-reachability, --min-severity | | `scan` | `replay` | YES | 0 | Options: --artifact (req), --manifest (req), --feeds (req), --policy (req), --offline, --verify-inputs | | `scan` | `secrets` | YES | 0 | Sub-subcommand: bundle | | `scan` | `graph` | YES | 0 | Options: --lang (req), --target (req), --format, --upload, --include-tests | | `image` | `inspect` | YES | 0 | Options: -r, -l, -p platform, -o format, --timeout | | `auth` | `login` | YES | 0 | Options: --force | | `auth` | `status` | YES | 0 | No extra options | | `auth` | `whoami` | YES | 0 | No extra options | | `db` | `fetch` | YES | 0 | Options: --source (req), --stage, --mode | | `db` | `merge` | YES | 0 | No extra options | | `db` | `export` | YES | 0 | Options: --format, --delta, --publish-full, --publish-delta, --bundle-full, --bundle-delta | | `policy` | `lint` | YES | 0 | Args: file; Options: -f, -o | | `policy` | `new` | YES | 0 | Args: name; Options: -t template, -o, -d, --tag, --shadow, --fixtures, --git-init | | `policy` | `compile` | YES | 0 | Args: file; Options: -o, --no-ir, --no-digest, --optimize, --strict | | `policy` | `validate-yaml` | YES | 0 | Args: path; Options: --schema, --strict | | `policy` | `list-packs` | YES | 0 | Options: --source | | `policy` | `evaluate` | YES | 0 | Options: -p policy (req), -i input (req), --format, -e environment, --include-remediation | | `tenants` | `list` | YES | 0 | Options: --tenant, --json | | `tenants` | `use` | YES | 0 | Args: tenant-id | | `tenants` | `clear` | YES | 0 | No extra options | | `tools` | `lint` | YES | 0 | Options: -i input (req), --fix, --strict, -f format | | `tools` | `benchmark` | YES | 0 | Sub-subcommands: policy, scan, crypto | | `tools` | `migrate` | YES | 0 | Sub-subcommands: config, data | | `task-runner` | `simulate` | YES | 0 | Options: --manifest, --inputs, --format, --output | | `kms` | `export` | YES | 0 | Options: --root, --key-id (req), --version, --output (req), --force, --passphrase | | `kms` | `import` | YES | 0 | Options: --root, --key-id (req), --input (req), --version, --passphrase | | `issuer` | `keys` | YES | 0 | Sub-subcommands: list, create, rotate, revoke | | `advise` | `run` | YES | 0 | Args: task; Options: --advisory-key (req), many more | | `findings` | `ls` | YES (via error) | 1 | Shows help with required --policy hint | | `config` | `show` | YES | 0 | No extra options | --- ## Behavioral Test Results | Command | Invocation | Exit Code | Behavior | Verdict | |---------|------------|-----------|----------|---------| | `auth status` | `auth status` | 1 | "Authority URL not configured. Set STELLAOPS_AUTHORITY_URL and run 'auth login'." | PASS -- correct error | | `tenants current` | `tenants current` | 0 | "No active tenant configured. Use 'stella tenants use ' to set one." | PASS -- correct offline | | `config show` | `config show` | 0 | Shows all config keys with defaults (Backend URL, Concelier URL, API Key, etc.) | PASS -- works offline | | `config list` | `config list` | 0 | Lists all config paths grouped by section (notify, feeds, integrations, etc.) | PASS -- works offline | | `sources list` | `sources list` | 1 | **CRASH: `InvalidOperationException: No service for type 'ISourceRegistry' has been registered.`** | FAIL -- DI bug | | `sources status` | `sources status` | 1 | **CRASH: Same `ISourceRegistry` DI exception** | FAIL -- DI bug | | `aoc verify` | `aoc verify` | 71 | "Tenant must be provided via --tenant or STELLA_TENANT." | PASS -- correct validation | | `policy lint` | `policy lint /nonexistent.stella` | 4 | "Error: Policy file not found: .../nonexistent.stella" | PASS -- correct file-not-found | | `findings ls` | `findings ls` | 1 | "Option '--policy' is required." + help text | PASS -- correct validation | --- ## Bugs Found ### BUG-001: `sources list` and `sources status` crash with DI exception **Severity:** Medium **Commands affected:** `sources list`, `sources status` **Error:** `System.InvalidOperationException: No service for type 'StellaOps.Concelier.Core.Sources.ISourceRegistry' has been registered.` **Location:** `src/Cli/StellaOps.Cli/Commands/Sources/SourcesCommandHandlers.cs:line 35` (list), `line 332` (status) **Root cause:** The `ISourceRegistry` service is not registered in the CLI's DI container. The `sources --help` works fine, but actual invocation fails. **Impact:** Users cannot list or check status of advisory sources via CLI without backend connectivity. --- ## Summary - **21/21 commands** have working `--help` (exit 0) - **All subcommand --help** tests pass (30+ subcommands tested) - **9 behavioral tests** run: 7 PASS, 2 FAIL - **1 bug found:** `sources list`/`sources status` DI registration missing for `ISourceRegistry` - **Total subcommands discovered:** 100+ across all 21 top-level commands - **Richest commands:** `policy` (27 subcmds), `scan` (18 subcmds), `advise` (10 subcmds), `config` (8 subcmds)