pixee finding
PREREQUISITES: Read ../pixee-shared/SKILL.md for global flags, exit codes, and error
handling, and ../pixee-scan/SKILL.md to discover the --scan UUID this skill requires.
pixee finding lists and views findings produced by a scan. A finding hangs off a single scan and
is not addressable on its own, so every invocation requires --scan <scan-id>. Findings carry the
output of every analysis Pixee runs against them — triage, fix, sca — and the CLI inlines the
representative result for each analysis type so an agent rarely needs a second HTTP call.
Before asking the user which repository, branch, scan, or pull request to target, derive that
context from the working environment with whatever facilities the host agent already has — current
directory, git state, PR tooling, project conventions. The user is almost always asking about
findings tied to wherever cwd already points. Use pixee scan list --repo <name-or-uuid> (with
--branch and --tool to narrow) to pin down the scan UUID, and only fall back to asking when the
derivation comes back empty or ambiguous.
pixee finding list
pixee finding list --scan <scan-id> [filter flags...]
--scan is required. The response always carries cross-section aggregate counts (triage
status/outcome, fix status/outcome/confidence, sca status/classification, and the composite
ready_to_fix / no_fix_necessary views) plus, by default, the paginated items list with each
item's representative analysis results inlined.
Text output is the aggregate table only — one tab-separated key\tvalue row per metric. Items are
not surfaced in text mode; use --json to access them. The JSON shape:
- Top-level aggregate fields:
total, completed_analysis, in_progress_analysis, triage,
fix, sca, composite, page, _links.
_embedded.items[] carries the paginated findings (omitted under --stats). Each item has
id, title, rule, severity ({label, rank}), html_url, _links, and
_embedded["representative-results"] — a paginated wrapper whose own _embedded.items[]
contains one entry per analysis type (triage, fix, sca) with self/finding/analysis links
and, for fix results, changesets, patches, and a one-page latest-patch shortcut.
Pagination is transparent: the CLI walks every page of findings in one call. Aggregate counts are
page-invariant for a given filter set, so --stats (below) returns them in a single HTTP
round-trip.
--stats
pixee finding list --scan <scan-id> --stats [filter flags...]
Returns aggregate counts only, dropping _embedded.items. Sends page-size=1 over the wire so it
answers questions like "how many critical findings have a completed fix on this scan?" without
streaming the items page. Combine with filter flags below to scope the counts.
Filter flags
All filters are repeatable unless noted, and combine as AND across distinct flags / OR within
the same flag.
--severity <label> — filter by representative severity label.
--suggested-severity <label> — filter by triage's suggested severity label.
--min-severity-score <num> / --max-severity-score <num> — bound the severity score (0.0–10.0).
Not repeatable.
--triage-status <s> — one of completed, failed, no-recommendations-available.
--triage-suggested <s> — one of true_positive, inconclusive, false_positive, wont_fix,
blocked, excluded, not_triaged, error, suspicious.
--fix-status <s> — one of completed, failed, no-recommendations-available, blocked,
excluded.
--fix-confidence <s> — one of high, medium, low, no-rating.
--sca-status <s> — one of completed, failed, blocked, excluded, not-analyzed.
--sca-classification <s> — one of exploitable, not-exploitable, inconclusive,
potentially-exploitable.
--patch-status <s> — one of issued, merged.
--severity-update <s> — one of increased, decreased, no_update. Filters by the
severity-update relation.
--analyzed — only fully-analyzed findings (every analysis type has reached a terminal state).
--no-analyzed — only not-fully-analyzed findings.
--view validated — composite view filter. Currently only validated is defined.
--results <scope> — repeatable. Analysis results to include per finding. One of
representative (default) or all.
--query <text> — case-insensitive search across finding id, title, rule, and file path.
--sort <field> — pixee-intelligence (default), severity, pixee-severity, or
suggested-severity.
--order <asc|desc> — sort direction. Default desc.
Triage result links
A triage-type representative-result carries its own _links beyond self/finding/analysis:
report and article (both markdown-rendered explanations of the triage decision) and, for some
outcome types, verification. These render as markdown, not JSON; pixee api <href> (without
--json) reads them directly — see pixee-api's Non-JSON resources section for how that
negotiation works.
Before chasing report/article, check whether you already have what you need: the item's own
outcome.summary — and on a blocked fix, outcome.reason / outcome.details — already inlines the
triage/fix rationale in pixee finding list and pixee finding view output. report/article are
worth a separate fetch mainly when you want the longer-form, formatted writeup instead of that
summary. Not every link is populated for every outcome type — a 404 on verification means it does
not apply to this result, not that something is broken.
pixee finding view
pixee finding view <finding-id> --scan <scan-id>
<finding-id> is the finding's scan-scoped id, surfaced in _embedded.items[].id from
pixee finding list --json. --scan is required — a finding id is only unique within a scan.
Text output prints the finding's headline fields followed by a Representative Results: table
with one row per analysis type (type, analyzed_at, self_href). JSON output is the full HAL
representation of the finding (id, title, rule, severity, html_url, _links) with
_embedded["representative-results"] already merged in — the same paginated wrapper documented
above. Use this when you need the per-analysis result hrefs (e.g., to walk a fix's latest-patch)
without making a second HTTP call.
Examples
# How many findings are ready-to-fix on the latest main-branch sonar scan?
scan_id=$(pixee scan list --repo pixee/pixee-platform --branch main --tool sonar --json \
| jq -r 'sort_by(.imported_at) | reverse | .[0].id')
pixee finding list --scan "$scan_id" --stats --json \
| jq '.composite.ready_to_fix'
# Critical, fully-analyzed findings with a high-confidence fix, sorted by Pixee severity
pixee finding list --scan "$scan_id" \
--severity Critical --fix-confidence high --analyzed \
--sort pixee-severity --json \
| jq '._embedded.items[] | {id, title, rule, severity}'
# Walk every finding's representative fix result without a second HTTP call per item
pixee finding list --scan "$scan_id" --json \
| jq '._embedded.items[]
| {id, fix: ._embedded["representative-results"]._embedded.items[]
| select(.type=="fix") | ._links}'
# Pull a single finding plus its merged representative results
pixee finding view AZ4JOwsipJDH8099SpHt --scan "$scan_id" --json \
| jq '._embedded["representative-results"]._embedded.items[] | {type, _links}'
# Chase the latest patch href from a finding view
pixee finding view AZ4JOwsipJDH8099SpHt --scan "$scan_id" --json \
| jq -r '._embedded["representative-results"]._embedded.items[]
| select(.type=="fix") | ._links["latest-patch"].href' \
| xargs pixee api
Best practices
- Use
--stats whenever the question is purely aggregate. It drops _embedded.items, which can
be the bulk of the payload on large scans, and answers in one HTTP call.
- The list response inlines
representative-results.latest-patch on each item. Do not loop
pixee finding view for data that's already on the item; reach for view only when you need
the finding plus its merged result page as a single response.
- Combine filters at the CLI rather than post-filtering in
jq. The CLI translates filter flags
into server-side query params, which keeps the items list small and pagination cheap.
- Severity-score and label flags coexist: pass
--severity Critical plus
--min-severity-score 9.0 and both apply. Use --analyzed / --no-analyzed to slice on
pipeline completeness rather than re-checking each item's analysis state in jq.
- HAL-first when fields are absent. The
_links on a finding (results, representative-results)
and on each result (analysis, changesets, patches, latest-patch) are the canonical way to
reach related resources — follow them with pixee api <href> rather than guessing API paths.
See pixee-api for HAL conventions and --paginate.
- The latest scan for a branch is the current state of that branch, full stop. If it has zero
findings matching a filter (e.g.
--triage-suggested true_positive --stats returns "total": 0),
that is the answer — "there are no true positives on the latest scan of main" — not a signal to
walk backward through older scans looking for a nonzero count. An older scan reflects a stale
commit and answering from one silently changes the question from "what's true today" to "what was
once true." Only look at a non-latest scan when the user asks about history explicitly.
1---2name: pixee-finding3description: List, filter, and view Pixee findings for a scan with aggregate counts across triage, fix, and SCA outcomes.4license: Apache-2.05---67# pixee finding89> **PREREQUISITES:** Read `../pixee-shared/SKILL.md` for global flags, exit codes, and error10> handling, and `../pixee-scan/SKILL.md` to discover the `--scan` UUID this skill requires.1112`pixee finding` lists and views findings produced by a scan. A finding hangs off a single scan and13is not addressable on its own, so every invocation requires `--scan <scan-id>`. Findings carry the14output of every analysis Pixee runs against them — triage, fix, sca — and the CLI inlines the15representative result for each analysis type so an agent rarely needs a second HTTP call.1617Before asking the user which repository, branch, scan, or pull request to target, derive that18context from the working environment with whatever facilities the host agent already has — current19directory, git state, PR tooling, project conventions. The user is almost always asking about20findings tied to wherever `cwd` already points. Use `pixee scan list --repo <name-or-uuid>` (with21`--branch` and `--tool` to narrow) to pin down the scan UUID, and only fall back to asking when the22derivation comes back empty or ambiguous.2324## pixee finding list2526```27pixee finding list --scan <scan-id> [filter flags...]28```2930`--scan` is **required**. The response always carries cross-section aggregate counts (triage31status/outcome, fix status/outcome/confidence, sca status/classification, and the composite32`ready_to_fix` / `no_fix_necessary` views) plus, by default, the paginated `items` list with each33item's representative analysis results inlined.3435Text output is the aggregate table only — one tab-separated `key\tvalue` row per metric. Items are36not surfaced in text mode; use `--json` to access them. The JSON shape:3738- Top-level aggregate fields: `total`, `completed_analysis`, `in_progress_analysis`, `triage`,39 `fix`, `sca`, `composite`, `page`, `_links`.40- `_embedded.items[]` carries the paginated findings (omitted under `--stats`). Each item has41 `id`, `title`, `rule`, `severity` (`{label, rank}`), `html_url`, `_links`, and42 `_embedded["representative-results"]` — a paginated wrapper whose own `_embedded.items[]`43 contains one entry per analysis `type` (`triage`, `fix`, `sca`) with self/finding/analysis links44 and, for fix results, `changesets`, `patches`, and a one-page `latest-patch` shortcut.4546Pagination is transparent: the CLI walks every page of findings in one call. Aggregate counts are47page-invariant for a given filter set, so `--stats` (below) returns them in a single HTTP48round-trip.4950### `--stats`5152```53pixee finding list --scan <scan-id> --stats [filter flags...]54```5556Returns aggregate counts only, dropping `_embedded.items`. Sends `page-size=1` over the wire so it57answers questions like "how many critical findings have a completed fix on this scan?" without58streaming the items page. Combine with filter flags below to scope the counts.5960### Filter flags6162All filters are **repeatable** unless noted, and combine as AND across distinct flags / OR within63the same flag.6465- `--severity <label>` — filter by representative severity label.66- `--suggested-severity <label>` — filter by triage's suggested severity label.67- `--min-severity-score <num>` / `--max-severity-score <num>` — bound the severity score (0.0–10.0).68 Not repeatable.69- `--triage-status <s>` — one of `completed`, `failed`, `no-recommendations-available`.70- `--triage-suggested <s>` — one of `true_positive`, `inconclusive`, `false_positive`, `wont_fix`,71 `blocked`, `excluded`, `not_triaged`, `error`, `suspicious`.72- `--fix-status <s>` — one of `completed`, `failed`, `no-recommendations-available`, `blocked`,73 `excluded`.74- `--fix-confidence <s>` — one of `high`, `medium`, `low`, `no-rating`.75- `--sca-status <s>` — one of `completed`, `failed`, `blocked`, `excluded`, `not-analyzed`.76- `--sca-classification <s>` — one of `exploitable`, `not-exploitable`, `inconclusive`,77 `potentially-exploitable`.78- `--patch-status <s>` — one of `issued`, `merged`.79- `--severity-update <s>` — one of `increased`, `decreased`, `no_update`. Filters by the80 severity-update relation.81- `--analyzed` — only fully-analyzed findings (every analysis type has reached a terminal state).82- `--no-analyzed` — only not-fully-analyzed findings.83- `--view validated` — composite view filter. Currently only `validated` is defined.84- `--results <scope>` — **repeatable**. Analysis results to include per finding. One of85 `representative` (default) or `all`.86- `--query <text>` — case-insensitive search across finding id, title, rule, and file path.87- `--sort <field>` — `pixee-intelligence` (default), `severity`, `pixee-severity`, or88 `suggested-severity`.89- `--order <asc|desc>` — sort direction. Default `desc`.9091## Triage result links9293A `triage`-type representative-result carries its own `_links` beyond `self`/`finding`/`analysis`:94`report` and `article` (both markdown-rendered explanations of the triage decision) and, for some95outcome types, `verification`. These render as markdown, not JSON; `pixee api <href>` (without96`--json`) reads them directly — see `pixee-api`'s **Non-JSON resources** section for how that97negotiation works.9899Before chasing `report`/`article`, check whether you already have what you need: the item's own100`outcome.summary` — and on a blocked fix, `outcome.reason` / `outcome.details` — already inlines the101triage/fix rationale in `pixee finding list` and `pixee finding view` output. `report`/`article` are102worth a separate fetch mainly when you want the longer-form, formatted writeup instead of that103summary. Not every link is populated for every outcome type — a 404 on `verification` means it does104not apply to this result, not that something is broken.105106## pixee finding view107108```109pixee finding view <finding-id> --scan <scan-id>110```111112`<finding-id>` is the finding's scan-scoped id, surfaced in `_embedded.items[].id` from113`pixee finding list --json`. `--scan` is **required** — a finding id is only unique within a scan.114115Text output prints the finding's headline fields followed by a `Representative Results:` table116with one row per analysis type (`type`, `analyzed_at`, `self_href`). JSON output is the full HAL117representation of the finding (`id`, `title`, `rule`, `severity`, `html_url`, `_links`) with118`_embedded["representative-results"]` already merged in — the same paginated wrapper documented119above. Use this when you need the per-analysis result hrefs (e.g., to walk a fix's `latest-patch`)120without making a second HTTP call.121122## Examples123124```bash125# How many findings are ready-to-fix on the latest main-branch sonar scan?126scan_id=$(pixee scan list --repo pixee/pixee-platform --branch main --tool sonar --json \127 | jq -r 'sort_by(.imported_at) | reverse | .[0].id')128pixee finding list --scan "$scan_id" --stats --json \129 | jq '.composite.ready_to_fix'130131# Critical, fully-analyzed findings with a high-confidence fix, sorted by Pixee severity132pixee finding list --scan "$scan_id" \133 --severity Critical --fix-confidence high --analyzed \134 --sort pixee-severity --json \135 | jq '._embedded.items[] | {id, title, rule, severity}'136137# Walk every finding's representative fix result without a second HTTP call per item138pixee finding list --scan "$scan_id" --json \139 | jq '._embedded.items[]140 | {id, fix: ._embedded["representative-results"]._embedded.items[]141 | select(.type=="fix") | ._links}'142143# Pull a single finding plus its merged representative results144pixee finding view AZ4JOwsipJDH8099SpHt --scan "$scan_id" --json \145 | jq '._embedded["representative-results"]._embedded.items[] | {type, _links}'146147# Chase the latest patch href from a finding view148pixee finding view AZ4JOwsipJDH8099SpHt --scan "$scan_id" --json \149 | jq -r '._embedded["representative-results"]._embedded.items[]150 | select(.type=="fix") | ._links["latest-patch"].href' \151 | xargs pixee api152```153154## Best practices155156- Use `--stats` whenever the question is purely aggregate. It drops `_embedded.items`, which can157 be the bulk of the payload on large scans, and answers in one HTTP call.158- The list response inlines `representative-results.latest-patch` on each item. Do not loop159 `pixee finding view` for data that's already on the item; reach for `view` only when you need160 the finding plus its merged result page as a single response.161- Combine filters at the CLI rather than post-filtering in `jq`. The CLI translates filter flags162 into server-side query params, which keeps the items list small and pagination cheap.163- Severity-score and label flags coexist: pass `--severity Critical` plus164 `--min-severity-score 9.0` and both apply. Use `--analyzed` / `--no-analyzed` to slice on165 pipeline completeness rather than re-checking each item's analysis state in `jq`.166- HAL-first when fields are absent. The `_links` on a finding (`results`, `representative-results`)167 and on each result (`analysis`, `changesets`, `patches`, `latest-patch`) are the canonical way to168 reach related resources — follow them with `pixee api <href>` rather than guessing API paths.169 See `pixee-api` for HAL conventions and `--paginate`.170- The **latest** scan for a branch is the current state of that branch, full stop. If it has zero171 findings matching a filter (e.g. `--triage-suggested true_positive --stats` returns `"total": 0`),172 that is the answer — "there are no true positives on the latest scan of `main`" — not a signal to173 walk backward through older scans looking for a nonzero count. An older scan reflects a stale174 commit and answering from one silently changes the question from "what's true today" to "what was175 once true." Only look at a non-latest scan when the user asks about history explicitly.