Machine output coverage
Which commands speak --json, which print machine output by default without a flag, which produce machine-readable artifacts on disk instead, and which are for a person at a terminal. Every command path carries one verdict, recorded once in the bundled command catalog and read from there by this page, sbomflow help machine-output, the last line of every command's own help and sbomflow commands --json. The offline test suite holds each verdict to evidence, so this page cannot silently rot when a command is added or gains a flag.
If you are scripting against SBOMFlow, start with the CLI overview's integration contract; this page is the per-command census behind it.
The machine interface, in order of authority#
- Artifacts on disk are the API. SBOMFlow's product is deterministic, versioned JSON files. A command that writes artifacts already has a machine interface — usually a richer one than any terminal flag could carry.
sbomflow schema listnames the families;sbomflow schema show <family>documents the fields offline. --jsonwhere operators read terminals. Read/status commands emit one pure, versioned JSON document on stdout, under the contract below.- Machine output by default where the document is the product. The build-evidence, update-evidence, ingest and verification commands print their JSON document on stdout when no
--outputis given;--output FILEwrites the same document to a file instead. Those documents name their contract under aschemakey, the name the same bytes carry as a file. - Exit codes are a machine contract of their own. Every command's exit code follows the published exit-code reference, and errors carry stable
[E0xx]codes in both text and JSON.
A universal "result envelope" wrapping every command's stdout is deliberately not provided: artifacts on disk are the primary machine interface, and re-wrapping every command's output for symmetry would break existing consumers without serving a named need.
The --json contract#
Every command path that takes --json keeps four promises. They are checked by running every such path: once with the shortest invocation that reaches the command and points at nothing, and again over real invocations against a freshly built pack, store, custody set, case, index and vulnerability snapshot.
- Exactly one document. Under
--json, stdout holds one JSON document and nothing else. Progress, notes, receipts and warnings go to stderr, sosbomflow … --json | jqnever breaks on a stray line. A command that records something (approve --role,review --accept,regime-profile init) prints its human receipt on stderr and puts its document on stdout: the approval status, the refreshed review queue, the profile as written. - Versioned. The document carries
schema_version. Three documents are JSON arrays —index query,store listandstore query— and there the contract name rides on each element rather than in a wrapper: wrapping the array would break every consumer already parsing it, for a key those consumers do not read.upgrade plan,gate simulate,store verify-gatesandstore verify-replayshipped their version under aschemakey first; each now carriesschema_versionas well, with the same value, and the original key is unchanged. - The same exit code with and without
--json. Three declared exceptions, each because--jsonchanges what the invocation does rather than how it is shown: -quickstart --jsonprints the pre-write disclosure and exits without writing or auditing anything, so the refusal that guards the write when no target is named and no terminal can confirm the scope (exit2) is never reached; -ingest-codex-security --jsonandingest-preserved-artifact --jsonare write-free, so combining--jsonwith a write destination (--output, or--output-dir) is refused with[E019]and exit2rather than leaving the destination silently unwritten. - A failure still answers on stdout. When a command that took
--jsonfails after it has started, stdout carries one versionedsbomflow-cli-error-v1document: the[E0xx]code, the title, the detail, the repair, the docs link, the exit code the process actually returned and the retry and state-change semantics. A command that already emits its own document on the failure path (validate --jsonprints its validate-report and then fails) keeps exactly that document — stdout never carries two. The stderr text is unchanged. What this does not cover: a usage error the argument parser rejects before any command runs (an unknown option, a missing required option, an invalid choice) prints the usage and a coded line on stderr, nothing on stdout, and exits2, with or without--json.
Where to look a verdict up#
sbomflow help machine-outputlists every verdict with its count, every path that takes--json, every path that prints machine output without a flag, and this contract in four sentences.sbomflow help <command>(orsbomflow <command> --help) ends with aMachine output:line: that command's verdict and the reason for it.sbomflow commands --jsoncarries the same verdict on every command as amachine_outputobject (verdict,why, andserved_bywhen a sibling command serves the data), alongside each command's options and network class. It is the command catalog.sbomflow help --jsonis a different document: the network-policy registry, one row per command with its network class and egress gates. Neither replaces the other.
The census#
In this build the CLI grammar has 174 command paths (95 top-level commands + 79 nested verbs), re-derived from the parser on every generation, never carried forward from a previous release. Of these, 70 take --json, 26 print machine output by default without a flag, 52 produce artifacts on disk as their machine interface, and 26 are human-only by design.
| Verdict | Count | Meaning |
|---|---|---|
| has-json | 70 | Takes --json; one versioned JSON document on stdout. |
| machine-native | 26 | Machine output is already the default: JSON with no flag, or a CI-native format. |
| artifact-suffices | 52 | The command's product is deterministic files on disk (or an identical sibling surface already speaks --json); a terminal flag would duplicate the real interface. |
| human-only-by-design | 26 | Prose, interactive or dispatch surfaces for a person at a terminal; a machine consumer has no job here (18 of the 26 are bare group names that print usage). |
| add | 0 | A real machine-consumer job unserved by any surface. The audit found three; all three now ship the flag. |
Every verdict is checked against evidence, not against its help text: has-json against the real parser, machine-native against an executed run of the command whose stdout parses as one JSON document, artifact-suffices against what the command declares it writes (and never against a command whose --output defaults to stdout), and human-only-by-design against the parser, which knows which paths only dispatch to their nested verbs.
The audited matrix#
| Command | Machine output | Verdict | Why |
|---|---|---|---|
analyze | artifacts on disk | artifact-suffices | writes the full evidence artifact set (SBOM, findings, gate, and under the cra regime the gaps and CRA report…); the files are the API |
annotate | stdout, no flag | machine-native | its output IS a machine format: native CI annotations selected with --format (github, gitlab) |
approve | --json | has-json | shows the approval status, or records one approval action and then shows it; the status is one versioned JSON document on stdout and a recording action's receipt goes to stderr |
audit | --json | has-json | read/status surface; one versioned JSON document on stdout |
auditor-pack | artifacts on disk | artifact-suffices | writes auditor-pack.zip, a self-contained read-only package |
backfill | --json | has-json | read/status surface; one versioned JSON document on stdout |
batch-run | --json | has-json | one versioned batch summary on stdout; each job's own output is captured so the document stays parseable, and every row carries that job's warning count (with the line count it was taken out of) plus its declared network posture |
build-applicability-evidence | artifacts on disk | artifact-suffices | writes the build-applicability document at --output; that file is the machine surface, and analyze reads it through build_applicability in sbomflow.yaml |
bundle | artifacts on disk | artifact-suffices | writes evidence-bundle.json / .zip, the portable reviewer handoff |
case | usage only | human-only-by-design | group dispatcher: prints usage/guidance only; the machine surfaces are its nested verbs |
case accept-risk | artifacts on disk | artifact-suffices | appends the named human's bounded risk decision to the hash-chained case journal |
case advisory-tree | artifacts on disk | artifact-suffices | writes a local directory and a receipt listing every file and its digest |
case assign | artifacts on disk | artifact-suffices | appends JSON case records to a hash-chained journal; case show with --json is the read side |
case communicate | artifacts on disk | artifact-suffices | drafts, approves, or records delivery in the local communication journal; it never sends |
case correlate | artifacts on disk | artifact-suffices | appends JSON case records to a hash-chained journal; case show with --json is the read side |
case disclose | artifacts on disk | artifact-suffices | records a human disclosure-timeline event without publishing anything |
case export-advisory | artifacts on disk | artifact-suffices | writes an unsigned, unsubmitted advisory draft |
case intake | artifacts on disk | artifact-suffices | appends JSON case records to a hash-chained journal; case show with --json is the read side |
case open | artifacts on disk | artifact-suffices | appends JSON case records to a hash-chained journal; case show with --json is the read side |
case propose-propagation | --json | has-json | emits a versioned proposal document with applied: false |
case remediate | artifacts on disk | artifact-suffices | appends a remediation observation and its frozen-pack verification result |
case reopen | artifacts on disk | artifact-suffices | appends the attributed advisory-reopen decision and transition to the hash-chained journal; no case is reopened automatically |
case show | --json | has-json | read/status surface; one versioned JSON document on stdout |
case transition | artifacts on disk | artifact-suffices | appends JSON case records to a hash-chained journal; case show with --json is the read side |
case triage | artifacts on disk | artifact-suffices | appends JSON case records to a hash-chained journal; case show with --json is the read side |
cmake-evidence | stdout, no flag | machine-native | prints its CMake File API build-evidence document as JSON on stdout by default, no flag needed; --output writes the same document to a file instead |
commands | --json | has-json | read/status surface; one versioned JSON document on stdout (the command catalog resolved against the parser) |
compare-releases | artifacts on disk | artifact-suffices | writes release-drift.json |
component-support | usage only | human-only-by-design | group dispatcher: prints usage/guidance only; the machine surfaces are its nested verbs |
component-support fetch | artifacts on disk | artifact-suffices | saves each product document unchanged and component-support-fetch.json beside them in --output; those files are the machine surface |
config | usage only | human-only-by-design | group dispatcher: prints usage/guidance only; the machine surfaces are its nested verbs |
config show | --json | has-json | read/status surface; one versioned JSON document on stdout |
cosign-verify | stdout, no flag | machine-native | prints its verification observations as JSON on stdout by default, no flag needed; --output writes the same document to a file instead; with cosign absent it still prints the document, recording available: false |
custody | usage only | human-only-by-design | group dispatcher: prints usage/guidance only; the machine surfaces are its nested verbs |
custody add | --json | has-json | one sbomflow-custody-operation-v1 document: the outcome and the set's row for the artifact; with --intake-manifest, row is null and intake carries each entry's outcome |
custody compare | --json | has-json | one sbomflow-custody-comparison-v1 document: what two sides record differently, or comparable: false with the reason nothing was compared |
custody export | --json | has-json | one sbomflow-custody-export-v1 manifest: every exported member with its sha256 and size (the generated custody-export-index.md among them), the seal, the audit chain head and count, readable_index, and originals_carried: false |
custody hold | --json | has-json | one sbomflow-custody-hold-v1 document: the hold as the set now records it and the audit event that binds it |
custody init | --json | has-json | one sbomflow-custody-operation-v1 document for the new set |
custody list | --json | has-json | prints the set index, sbomflow-custody-set-v1, verbatim |
custody release-hold | --json | has-json | one sbomflow-custody-hold-v1 document: the lifted hold as the set now records it and the audit event that binds it |
custody review | --json | has-json | one sbomflow-custody-review-result-v1 document: the key, status, reviewer, operation id and whether a keyed retry converged |
custody show | --json | has-json | one sbomflow-custody-show-v1 document: the row with its decision, its records, and the set's decision file state |
custody verify | --json | has-json | one sbomflow-custody-verify-v1 report; exit 4 on any integrity problem |
dashboard | artifacts on disk | artifact-suffices | renders a static human dashboard from release-index.json, which is already the machine surface |
decisions | usage only | human-only-by-design | group dispatcher: prints usage/guidance only; the machine surfaces are its nested verbs |
decisions quarantine | --json | has-json | moves an unreadable decision journal under quarantine as an AUDITED event — the copy, its digest and the parse failure are appended before the original is unlinked, so an un-audited quarantine is unreachable; one versioned JSON document on stdout |
decisions recover | --json | has-json | read/status surface; one versioned JSON document on stdout |
decisions transactions | --json | has-json | read/status surface; one versioned JSON document on stdout |
decisions verify-transactions | --json | has-json | read/status surface; one versioned JSON document on stdout |
diffoscope-compare | stdout, no flag | machine-native | prints its diffoscope comparison observations as JSON on stdout by default, no flag needed; --output writes the same document to a file instead; with diffoscope absent it still prints the document, recording available: false |
doctor | --json | has-json | one versioned JSON document on stdout |
elf-evidence | stdout, no flag | machine-native | prints its ELF inventory evidence as JSON on stdout by default, no flag needed; --output writes the same document to a file instead |
emit-user-info | artifacts on disk | artifact-suffices | writes the UNSIGNED CRA Annex II user-information draft files |
esp-idf-evidence | stdout, no flag | machine-native | prints its ESP-IDF build-evidence document as JSON on stdout by default, no flag needed; --output writes the same document to a file instead |
examples | --json | has-json | read/status surface; one versioned JSON document on stdout |
explain | text for humans | human-only-by-design | renders a prose explanation composed from artifacts that are already machine-readable on disk |
export-cle | artifacts on disk | artifact-suffices | writes the lifecycle-event document at --output and cle-export-receipt.json beside it; those files are the machine surface |
export-reqif | artifacts on disk | artifact-suffices | writes the ReqIF document at --output and reqif-export-receipt.json beside it; those files are the machine surface |
firmware-extract | stdout, no flag | machine-native | prints the bounded extraction inventory as JSON on stdout by default, no flag needed; --output writes the same document to a file instead; with the extractor absent it still prints the document, recording that extraction was skipped |
gate | usage only | human-only-by-design | group dispatcher: prints usage/guidance only; the machine surfaces are its nested verbs |
gate simulate | --json | has-json | read/status surface; one versioned JSON document on stdout |
help | --json | has-json | read/status surface; one versioned JSON document on stdout |
index | usage only | human-only-by-design | group dispatcher: prints usage/guidance only; the machine surfaces are its nested verbs |
index query | --json | has-json | read/status surface; one versioned JSON document on stdout |
index rebuild | artifacts on disk | artifact-suffices | writes the derived SQLite index — itself a machine-queryable artifact (index query speaks --json) |
index validate | --json | has-json | structured errors/notes on stdout; the exit code is unchanged, so switching on --json cannot change the verdict |
index-releases | artifacts on disk | artifact-suffices | writes release-index.json, the machine-readable cross-release index. A product entry also carries product_line when its releases declared one distinct from the product name; absent means no line was declared, never that grouping failed |
ingest-build-cve-report | artifacts on disk | artifact-suffices | writes build-cve-report-ingest.json into --output; that file is the machine surface |
ingest-codex-security | --json | has-json | imports a sealed local Codex Security scan as external AI-assisted observations; one versioned JSON document on stdout, every record needs_review |
ingest-cyclonedx-vdr | artifacts on disk | artifact-suffices | writes cyclonedx-vdr-ingest.json into --output; that file is the machine surface |
ingest-grype | stdout, no flag | machine-native | prints the sourced Grype observations as JSON on stdout by default, no flag needed; --output writes the same document to a file instead |
ingest-preserved-artifact | --json | has-json | preserves one operator-selected artifact by identity and records what a human asserted about it; one versioned JSON document on stdout, never parsed, never a gate |
ingest-sarif | stdout, no flag | machine-native | prints the sourced SARIF observations as JSON on stdout by default, no flag needed; --output writes the same document to a file instead |
ingest-trivy | stdout, no flag | machine-native | prints the sourced Trivy observations as JSON on stdout by default, no flag needed; --output writes the same document to a file instead |
init | artifacts on disk | artifact-suffices | scaffolds sbomflow.yaml and inert review templates; the scaffolded files are the product |
license | usage only | human-only-by-design | group dispatcher: prints usage/guidance only; the machine surfaces are its nested verbs |
license inspect | --json | has-json | read/status surface; one versioned JSON document on stdout |
license install | --json | has-json | verifies a delivered entitlement offline, then files it at the per-user discovery path; one versioned, non-secret JSON result on stdout (never the customer id, signature or entitlement id) |
license status | --json | has-json | read/status surface; one versioned JSON document on stdout |
license verify | --json | has-json | read/status surface; one versioned JSON document on stdout |
linker-map-evidence | stdout, no flag | machine-native | prints its linker-map evidence as JSON on stdout by default, no flag needed; --output writes the same document to a file instead |
mcuboot-evidence | stdout, no flag | machine-native | prints its MCUboot image-header evidence as JSON on stdout by default, no flag needed; --output writes the same document to a file instead |
mcuboot-verify | stdout, no flag | machine-native | prints its verification observations as JSON on stdout by default, no flag needed; --output writes the same document to a file instead; the exit code carries the verdict |
mender-evidence | stdout, no flag | machine-native | prints its Mender artifact evidence as JSON on stdout by default, no flag needed; --output writes the same document to a file instead |
migrate-in | --json | has-json | one versioned migration manifest; every row carries claim_origin and unimported files are listed with reasons |
next-actions | --json | has-json | one versioned next-actions document on stdout; aggregation only, never a decision |
notify | artifacts on disk | artifact-suffices | writes the notification plan artifact; delivery is a separate explicit step |
oci-evidence | stdout, no flag | machine-native | prints its OCI image-layout evidence as JSON on stdout by default, no flag needed; --output writes the same document to a file instead |
passport | usage only | human-only-by-design | group dispatcher: prints usage/guidance only; the machine surfaces are its nested verbs |
passport issue | artifacts on disk | artifact-suffices | writes the signed passport files; passport verify (with --json) is the read side |
passport verify | --json | has-json | read/status surface; one versioned JSON document on stdout |
policy | usage only | human-only-by-design | group dispatcher: prints usage/guidance only; the machine surfaces are its nested verbs |
policy diff | --json | has-json | read/status surface; one versioned JSON document on stdout |
policy show | --json | has-json | read/status surface; one versioned JSON document on stdout |
portfolio | artifacts on disk | artifact-suffices | writes the cross-product portfolio index plus its dashboard. When the config declares products:[], the index also carries config_grouping: the operator's own group names joined to the product_ids their directories resolved to. Presentation only — it never changes identity, and a group whose outputs span two product identities is reported as spanning two rather than merged |
prov-map | stdout, no flag | machine-native | prints the PROV mapping of a traceability file as JSON on stdout by default, no flag needed; --output writes the same document to a file instead |
provenance-check | stdout, no flag | machine-native | prints its provenance-check observations, expectation verdicts included, as JSON on stdout by default, no flag needed; --output writes the same document to a file instead |
quickstart | --json | has-json | one versioned JSON document on stdout (sbomflow-quickstart-preflight-v1, or sbomflow-quickstart-ci-preflight-v1 under --ci — two shapes, so two names). The RUN's machine interface is still the artifact set it writes; --json serves the pre-write disclosure instead — the same document the terminal form renders, so a caller reading JSON and a caller reading the terminal cannot reach different conclusions about the scan root, the bounded and labelled file count, or which of the five states the output directory is in. It emits that document and exits without writing, auditing or consenting |
rauc-evidence | stdout, no flag | machine-native | prints its RAUC bundle evidence as JSON on stdout by default, no flag needed; --output writes the same document to a file instead |
recheck | artifacts on disk | artifact-suffices | writes the recheck report artifact comparing shipped evidence to newer local advisory data |
regime-profile | --json | has-json | local profile authoring kit; under --json every action prints one document (the profile it wrote, the validation, the inspection or the export manifest), and every action writes only profile files, never evidence |
regime-view | --json | has-json | read-only view of an existing verified pack through a versioned profile; one versioned JSON document on stdout |
release-chain | usage only | human-only-by-design | group dispatcher: prints usage/guidance only; the machine surfaces are its nested verbs |
release-chain verify | --json | has-json | read/status surface; one versioned JSON document on stdout |
report | usage only | human-only-by-design | group dispatcher: prints usage/guidance only; the machine surfaces are its nested verbs |
report freshness | --json | has-json | read/status surface; one versioned JSON document on stdout |
reproducible-compare | stdout, no flag | machine-native | prints the digest comparison of the two build trees as JSON on stdout by default, no flag needed; --output writes the same document to a file instead |
review | --json | has-json | shows the review queue, or records one decision and then shows the refreshed queue; one versioned JSON document on stdout, and a recording action's receipt goes to stderr |
review-merge | artifacts on disk | artifact-suffices | writes the merged reviewer decision file plus a conflict report |
review-view | artifacts on disk | artifact-suffices | writes reviewer.html, a human console composed from artifacts that are already machine-readable |
sbom-set | usage only | human-only-by-design | group dispatcher: prints usage/guidance only; the machine surfaces are its nested verbs |
sbom-set compare | --json | has-json | one sbomflow-sbom-concordance-v1 document with --json (stdout) or --output (file): the subject binding, every input's custody record and, when the binding holds, the nine dimensions |
schema | usage only | human-only-by-design | group dispatcher: prints usage/guidance only; the machine surfaces are its nested verbs |
schema list | --json | has-json | one versioned JSON document; exposing the flag revived a branch the parser could never reach |
schema show | --json | has-json | read/status surface; one versioned JSON document on stdout |
setup | text for humans | human-only-by-design | interactive, TTY-gated onboarding; refuses CI and redirected IO by design |
sign-bundle | artifacts on disk | artifact-suffices | writes detached signature envelope files (formats: sbomflow, in-toto) |
standards-view | --json | has-json | read/status surface; one versioned JSON document on stdout |
store | usage only | human-only-by-design | group dispatcher: prints usage/guidance only; the machine surfaces are its nested verbs |
store add | artifacts on disk | artifact-suffices | records the release into the store (JSON records + index); store list / store show with --json are the read side |
store empty-trash | --json | has-json | read/status surface; one versioned JSON document on stdout |
store exploitation-delta | artifacts on disk | artifact-suffices | writes the delta document to --output; that file is the machine surface |
store export | --json | has-json | one versioned completeness manifest, also written to the export directory; reconciles against the store index. store_index_state records how much of that index was read, and complete can only be true when it is read |
store hold | --json | has-json | read/status surface; one versioned JSON document on stdout |
store list | --json | has-json | read/status surface; one versioned JSON document on stdout |
store query | --json | has-json | read/status surface; one versioned JSON document on stdout |
store register-rename | --json | has-json | read/status surface; one versioned JSON document on stdout |
store reindex | --json | has-json | rebuilds the deterministic index from canonical store-owned packs and reports every skipped input; prior_index_state says how much of the replaced index was read, and a prior index that will not parse is refused rather than rebuilt over |
store reissue | artifacts on disk | artifact-suffices | writes a new release plus portable-reissue-receipt.json; human summary on stdout |
store reissue-plan | --json | has-json | read-only diagnosis of a refused export; one versioned JSON document on stdout |
store release-hold | --json | has-json | read/status surface; one versioned JSON document on stdout |
store retain | --json | has-json | read/status surface; one versioned JSON document on stdout |
store show | --json | has-json | read/status surface; one versioned JSON document on stdout |
store timeline | --json | has-json | read/status surface; one versioned JSON document on stdout |
store verify | --json | has-json | read/status surface; one versioned JSON document on stdout |
store verify-gates | --json | has-json | read/status surface; one versioned JSON document on stdout |
store verify-replay | --json | has-json | replays a stored release's recorded vulnerability inputs and reports whether each resolved to its exact recorded bytes; a recorded input it cannot find is reported as unavailable, never reproduced from whatever is current |
supplier-package | usage only | human-only-by-design | group dispatcher: prints usage/guidance only; the machine surfaces are its nested verbs |
supplier-package emit | artifacts on disk | artifact-suffices | writes intake.json, the shared SBOMs, emitted-from.json and (with --include-vex) vex.json into --to; those files are the machine surface |
support-bundle | artifacts on disk | artifact-suffices | writes the redaction-audited diagnostics zip; its contents are structured JSON |
swupdate-evidence | stdout, no flag | machine-native | prints its SWUpdate artifact evidence as JSON on stdout by default, no flag needed; --output writes the same document to a file instead |
syft-scan | stdout, no flag | machine-native | prints the ingested Syft result as JSON on stdout by default, no flag needed; --output writes the same document to a file instead; with Syft absent it still prints the document, recording available: false |
sync-dependencytrack | artifacts on disk | artifact-suffices | dry-run by default: writes the machine-readable sync plan artifact; delivery is a separate explicit step |
sync-issues | artifacts on disk | artifact-suffices | dry-run by default: writes the machine-readable sync plan artifact; delivery is a separate explicit step |
sync-jira | artifacts on disk | artifact-suffices | dry-run by default: writes the machine-readable sync plan artifact; delivery is a separate explicit step |
sync-servicenow | artifacts on disk | artifact-suffices | dry-run by default: writes the machine-readable sync plan artifact; delivery is a separate explicit step |
twister-evidence | stdout, no flag | machine-native | prints its Twister test-result evidence as JSON on stdout by default, no flag needed; --output writes the same document to a file instead |
update-manifest-evidence | stdout, no flag | machine-native | prints its TUF/SUIT update-manifest evidence as JSON on stdout by default, no flag needed; --output writes the same document to a file instead |
upgrade | usage only | human-only-by-design | group dispatcher: prints usage/guidance only; the machine surfaces are its nested verbs |
upgrade inspect | text for humans | human-only-by-design | pre-migration eyeball of artifact families/versions; the machine decision surface is upgrade plan with --json |
upgrade migrate-copy | artifacts on disk | artifact-suffices | writes migrated copies plus upgrade-manifest.json to a new directory, never in place |
upgrade plan | --json | has-json | read/status surface; one versioned JSON document on stdout |
upgrade validate | artifacts on disk | artifact-suffices | the identical validation ships as top-level validate, which speaks --json with the same exit contract; served by validate |
uptane-evidence | stdout, no flag | machine-native | prints its Uptane metadata evidence as JSON on stdout by default, no flag needed; --output writes the same document to a file instead |
validate | --json | has-json | read/status surface; one versioned JSON document on stdout |
validate-annexii-model | text for humans | human-only-by-design | packaged-model self-check; the machine contract is the exit code (0 pass, non-zero fail) |
validate-article14-model | text for humans | human-only-by-design | packaged-model self-check; the machine contract is the exit code (0 pass, non-zero fail) |
validate-config | artifacts on disk | artifact-suffices | the same config validation surfaces machine-readably in doctor --json (config block: errors and warnings); served by doctor |
validate-graph | text for humans | human-only-by-design | packaged-model self-check; the machine contract is the exit code (0 pass, non-zero fail) |
validate-ssvc-model | text for humans | human-only-by-design | packaged-model self-check; the machine contract is the exit code (0 pass, non-zero fail) |
validate-techdoc-model | text for humans | human-only-by-design | packaged-model self-check; the machine contract is the exit code (0 pass, non-zero fail) |
verify-bundle | --json | has-json | verification detail, per-layer under --layered; parity with passport verify --json. Version skew stays context, changing no status and no exit code |
verify-package-artifacts | artifacts on disk | artifact-suffices | writes digest-verification observations JSON |
vulndb | usage only | human-only-by-design | group dispatcher: prints usage/guidance only; the machine surfaces are its nested verbs |
vulndb change-impact | --json | has-json | explains which stored releases a source-set change touches, reusing the release comparison already on disk; --store is required so the command can only emit the shape the schema registry declares |
vulndb inspect | stdout, no flag | machine-native | prints its report as JSON on stdout with no flag needed |
vulndb pin | artifacts on disk | artifact-suffices | records the active-snapshot pin; vulndb inspect is the JSON read side |
vulndb reindex | artifacts on disk | artifact-suffices | rebuilds the derived index from complete snapshot manifests after index loss or corruption |
vulndb retention | artifacts on disk | artifact-suffices | writes a deterministic needed-snapshots binding and conservative retention plan; deletion requires explicit --apply |
vulndb sources | --json | has-json | read/status surface; lists the registered sources and what each one has ACTIVE locally |
vulndb update | artifacts on disk | artifact-suffices | records a pinned, hashed snapshot plus its manifest (the one explicit network step) |
vulndb verify | --json | has-json | read/status surface; one versioned JSON document on stdout |
zephyr-evidence | stdout, no flag | machine-native | prints its Zephyr build-evidence document as JSON on stdout by default, no flag needed; --output writes the same document to a file instead |
The three audited gaps — CLOSED#
Only three of the 123 non-dispatch paths audited in that pass were verdicted a real gap, all of them read-only verifiers or listings whose sibling commands already speak --json. All three now ship the flag, additively:
schema list— the machine-readable listing already existed internally, behind a flag the parser never declared, so the branch could not be reached. Declaring--jsonexposes the document and revives that dead branch.index validate— integrity notes and errors are now a structured document. The exit code is unchanged, so a caller that switches on--jsoncannot get a different verdict from the one the text reported.verify-bundle— verification detail, per-layer under--layered, at parity withpassport verify --json. Version skew stays context: it appears in the document but changes no layer status and no exit code.
Human text, exit codes, and artifacts are byte-identical to before on every one of the three.
verify-bundle --layered: what a zero exit proves#
Every layered document carries exit_code_scope, and the human output prints the same sentence, because a consumer reading only one of the two must not have to find that boundary in prose somewhere else. Exit 0 proves that no layer failed and that every layer named by --require-layers reached a trusted status. It does not prove the bundle is trusted (read verdict / trusted_use), that an unrequired layer verified, that the evidence inside the bundle is correct, or anything at all about conformity.
--require-layers content,envelope,semantics,authority adds an expectation block — required, met, unmet, and a per-layer row carrying the observed status alongside the accepted_statuses that would have satisfied the requirement — and exits 7 when a well-formed report does not meet it. The full layer report is still emitted: an expectation narrows what the exit code means, never what the run reports. Without the flag the block is absent and every exit code is exactly what it was; a genuine verification failure stays 3 and outranks 7; an unknown layer name is refused as an input error (2) before verification runs, because a stricter check that silently did not happen is worse than no check. Nothing else on this page is a commitment to add flags; the remaining non---json rows are deliberate.
Doctor facts added by the same audit#
The same audit reviewed two outstanding doctor requests, and both shipped alongside it as facts-only additions — doctor reports local facts, fabricates nothing, and never decides:
- offline docs availability — whether
sbomflow help errorandsbomflow help exitrender from this install, with their code counts, and which web docs URLs error messages will print (recorded, never fetched). - path length — the absolute target path's length in characters and bytes next to the filesystem's own reported
PATH_MAX/NAME_MAXlimits, or an honest "not reported" where the platform has no answer.
See Troubleshooting for what doctor reports and why each row is context, never a verdict.