Machine output coverage
Which commands speak --json, which produce machine-readable output another way, and where a real gap remains — audited per command against the shipped command grammar, and machine-checked by the offline test suite 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 (schema_versionon every payload), with the same exit codes as the human output. Stdout stays pure: progress, notes and warnings go to stderr.- 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 a recorded rejection, not an oversight: 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 census
At v0.2 the CLI grammar has 122 command paths (78 top-level commands + 44 nested verbs). Of these, 36 take --json, 2 are machine-native without a flag, 59 produce artifacts on disk as their machine interface, 22 are human-only by design, and 3 are audited gaps where adding --json is planned.
| Verdict | Count | Meaning |
|---|---|---|
| has-json | 36 | Takes --json; one versioned JSON document on stdout. |
| machine-native | 2 | Machine output is already the default: JSON with no flag, or a CI-native format. |
| artifact-suffices | 59 | 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 | 22 | Prose, interactive or dispatch surfaces for a person at a terminal; a machine consumer has no job here (14 of the 22 are bare group names that print usage). |
| add | 3 | A real machine-consumer job is unserved today; exposing --json is planned as a follow-up change. |
Every verdict below was audited against the command's implementation, not its help text: what it writes, what its exit code means, and which sibling command already serves the same data.
The audited matrix
<!-- JSON-COVERAGE:BEGIN — machine-checked against the shipped CLI grammar by the offline test suite. Every command path appears exactly once as the row's first backtick token; the verdict column uses only the five values defined above; a row's has-json verdict must match the real parser. Do not add, remove, or reword rows without re-running the suite. -->
| Command | Machine output today | Verdict | Why |
|---|---|---|---|
analyze | artifacts on disk | artifact-suffices | writes the full evidence artifact set (SBOM, findings, gaps, CRA report, gate…); the files are the API |
annotate | CI-native via --format | machine-native | its output IS a machine format: native CI annotations selected with --format (github, gitlab) |
approve | --json | has-json | read/status surface; one versioned JSON document on stdout |
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 |
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 assign | artifacts on disk | artifact-suffices | appends JSON case records to a hash-chained journal; case show with --json is the read side |
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 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 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 | artifacts on disk | artifact-suffices | writes its deterministic evidence JSON (file or stdout) |
compare-releases | artifacts on disk | artifact-suffices | writes release-drift.json |
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 | artifacts on disk | artifact-suffices | writes its verification observations JSON via --output |
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 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 | artifacts on disk | artifact-suffices | writes the diffoscope comparison observations JSON |
doctor | --json | has-json | read/status surface; one versioned JSON document on stdout |
elf-evidence | artifacts on disk | artifact-suffices | writes its deterministic evidence JSON (file or stdout) |
emit-user-info | artifacts on disk | artifact-suffices | writes the UNSIGNED CRA Annex II user-information draft files |
esp-idf-evidence | artifacts on disk | artifact-suffices | writes its deterministic evidence JSON (file or stdout) |
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 |
firmware-extract | artifacts on disk | artifact-suffices | writes the bounded extraction inventory JSON |
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 | exit code + text | add | read-only integrity verdict is text-only today; every sibling verifier (store verify, vulndb verify, decisions verify-transactions) speaks --json; planned |
index-releases | artifacts on disk | artifact-suffices | writes release-index.json, the machine-readable cross-release index |
ingest-grype | artifacts on disk | artifact-suffices | writes sourced-observation JSON artifacts |
ingest-sarif | artifacts on disk | artifact-suffices | writes sourced-observation JSON artifacts |
ingest-trivy | artifacts on disk | artifact-suffices | writes sourced-observation JSON artifacts |
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 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 | artifacts on disk | artifact-suffices | writes its deterministic evidence JSON (file or stdout) |
mcuboot-evidence | artifacts on disk | artifact-suffices | writes its deterministic evidence JSON (file or stdout) |
mcuboot-verify | artifacts on disk | artifact-suffices | writes its verification observations JSON via --output |
mender-evidence | artifacts on disk | artifact-suffices | writes its deterministic evidence JSON (file or stdout) |
notify | artifacts on disk | artifact-suffices | writes the notification plan artifact; delivery is a separate explicit step |
oci-evidence | artifacts on disk | artifact-suffices | writes its deterministic evidence JSON (file or stdout) |
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 |
prov-map | artifacts on disk | artifact-suffices | writes a deterministic PROV mapping JSON (file or stdout) |
provenance-check | artifacts on disk | artifact-suffices | writes provenance-check observations JSON; expectations verdicts are in the artifact |
quickstart | artifacts on disk | artifact-suffices | writes the same artifact set as a first-run wrapper around an offline audit; the terminal summary is a courtesy |
rauc-evidence | artifacts on disk | artifact-suffices | writes its deterministic evidence JSON (file or stdout) |
recheck | artifacts on disk | artifact-suffices | writes the recheck report artifact comparing shipped evidence to newer local advisory data |
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 | artifacts on disk | artifact-suffices | writes the digest-comparison JSON for two build trees |
review | --json | has-json | read/status surface; one versioned JSON document on stdout |
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 |
schema | usage only | human-only-by-design | group dispatcher: prints usage/guidance only; the machine surfaces are its nested verbs |
schema list | exit code + text | add | the JSON listing already exists internally but the flag is not exposed; planned so schema show and the list speak the same way |
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 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 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 |
support-bundle | artifacts on disk | artifact-suffices | writes the redaction-audited diagnostics zip; its contents are structured JSON |
swupdate-evidence | artifacts on disk | artifact-suffices | writes its deterministic evidence JSON (file or stdout) |
syft-scan | artifacts on disk | artifact-suffices | writes syft-result.json (file or stdout) as ingested observations |
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 | artifacts on disk | artifact-suffices | writes its deterministic evidence JSON (file or stdout) |
update-manifest-evidence | artifacts on disk | artifact-suffices | writes its deterministic evidence JSON (file or stdout) |
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 |
uptane-evidence | artifacts on disk | artifact-suffices | writes its deterministic evidence JSON (file or stdout) |
validate | --json | has-json | read/status surface; one versioned JSON document on stdout |
validate-annexii-model | exit code + text | human-only-by-design | packaged-model self-check; the machine contract is the exit code (0 pass, non-zero fail) |
validate-article14-model | exit code + text | 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) |
validate-graph | exit code + text | human-only-by-design | packaged-model self-check; the machine contract is the exit code (0 pass, non-zero fail) |
validate-ssvc-model | exit code + text | human-only-by-design | packaged-model self-check; the machine contract is the exit code (0 pass, non-zero fail) |
validate-techdoc-model | exit code + text | human-only-by-design | packaged-model self-check; the machine contract is the exit code (0 pass, non-zero fail) |
verify-bundle | exit code + text | add | the recipient-side handoff verifier reports layer detail as text only; its analogue passport verify speaks --json; planned |
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 inspect | JSON on 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 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 | artifacts on disk | artifact-suffices | writes its deterministic evidence JSON (file or stdout) |
<!-- JSON-COVERAGE:END -->
The three audited gaps
Only three of the 122 paths were verdicted a real gap, all of them read-only verifiers or listings whose sibling commands already speak --json:
schema list— the machine-readable listing already exists internally; only the flag is missing. Planned.index validate— integrity notes and errors are free text today; every comparable verifier ships--json. Planned.verify-bundle— bundle verification detail (which layer passed or failed) is text-only; a CI consumer verifying a received handoff currently parses prose. Planned.
"Planned" means exactly that: the flags will arrive in a follow-up change, additively — no existing output, exit code, or artifact changes. Nothing else on this page is a commitment to add flags; the remaining non---json rows are deliberate.
Doctor wishlist facts (recorded verdicts)
The same audit reviewed the two outstanding doctor wishlist rows, 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.