SIS CLI
Investigation Playbook
The single-sample workflow across the four investigative surfaces: scan, query, report,
explain. Use this as the default starting point; reach for the focused guides (sis docs query,
sis docs explain, sis docs report) when you already know which step you need.
Format is detected from content, not extension — every command here works on any supported root.
The core loop
# 1. Baseline verdict + findings (human-readable)
sis scan sample.bin
# 2. Reproducible deep pass (expensive detectors: full font scan, entropy clustering, XFA, JS AST)
sis scan sample.bin --deep --json > triage.json
# 3. Pull the slices you need (see `sis docs query`)
sis query sample.bin findings --where "severity == 'High'" --json
sis query sample.bin chains --chain-summary events --json
sis query sample.bin iocs --json
sis query sample.bin urls --json
# 4. Operator hand-off report when settings are stable
sis report sample.bin --deep --format markdown --out report.md
# 5. Expand the load-bearing finding into evidence
sis explain sample.bin <finding-id>
Choosing a surface
| Need | Surface |
|---|---|
| Verdict + full finding set, machine-stable | sis scan --json |
| One slice / filtered view / count | sis query |
| Durable human-readable hand-off | sis report |
| Evidence + lineage for one finding | sis explain |
| Why a format/handler/detector ran | sis explain-detection (see sis docs explain) |
| What a format can produce | sis explain-format (see sis docs explain) |
Pivots
- Verdict/severity looks elevated →
sis query <s> findings --where "severity == 'High'" --json - Behaviour spans nested formats →
sis query <s> chains --chain-summary events --json - Need network/URL extraction →
sis query <s> iocs --jsonandsis query <s> urls --json - One finding needs evidence →
sis explain <s> <finding-id> - “Why was this analysed as format X?” →
sis explain-detection <s>
Getting a finding ID for explain
Finding IDs are content-hash based: sis-<64 hex> (e.g.
sis-103db1f2254c…). They are not sequential (finding-0007 is not a real ID). Read the full
ID from query JSON — it lives at .result.findings[].id:
sis query sample.bin findings --json | jq -r '.result.findings[].id'
sis explain sample.bin sis-103db1f2254c… # paste the FULL id
explain requires the exact ID (no prefixes) and re-runs analysis, so the ID is sensitive to
scan options. See the reproducibility rule below and sis docs explain.
Reproducibility
- Keep
--deepconsistent acrossscan,query,report, andexplain— depth changes which detectors run, which changes findings and therefore finding IDs. - A finding ID is a function of the analysis conditions. If the originating scan used a non-default
--configor runtime policy bundle, pass the same--configtoquery/explain, or the ID will not resolve (explainreports the candidate set and the fingerprint mismatch when it fails). - Prefer
--jsonfor any artefact you will store or feed downstream.
Triage decision model
Read severity, impact, and confidence together (never one alone — see sis docs verdict), then
weigh: chain completeness and stage, intent mix and top intent, whether the behaviour survives nested
traversal, and whether it still holds under the original scan conditions. When downgrading, confirm
context in meta and correlated chains and decide whether the risk is structural-only or
behavioural — don’t suppress a finding family without a policy rationale.
Note:
sis triage(the subcommand) manages triage records and calibration, a separate workflow from this investigation loop. Seesis triage --help.
Related guides
sis docs query·sis docs explain·sis docs report·sis docs verdictsis docs assess(AI-ingestion decision) ·sis docs cdr(sanitisation)- (multi-format vs PDF-only scope)