What Each AI Run Sees¶
Every model-backed action in DFIR Companion, and the two questions that decide whether you can trust its output: what is it allowed to read, and does it change your case record.
Of the 27 runs, 12 change your case record and 5 of those can run without anyone pressing anything. 5 are allowed to read the raw archive.
Read with the AI Analysis page, which explains what each run is for. This one answers a narrower question: what it is allowed to see, and what it does to your case.
At a glance¶
| Run | Trigger | Reads | Changes your record | Model calls |
|---|---|---|---|---|
| Synthesis | automatic + button | forensic timeline | yes | 2 per real run — synthesis, then finding-tasks |
| Deep pass | you press it | forensic timeline | yes | 1–30 observe calls, then a forced synthesis — scales with the case |
| Second look | you press it | raw archive | yes | Zero for the search itself — it is keyword matching. 2 if you let it re-synthesise. |
| Second opinion | you press it | forensic timeline | yes | up to 4 |
| Explain event | you press it | raw archive | yes | 1 |
| Starred report | you press it | raw archive | yes | 1 |
| Narrative | you press it | forensic timeline | yes | 1 |
| Import extraction (CSV) | automatic | the imported file | yes | 1 per batch — scales with the file |
| Import extraction (logs) | automatic | the imported file | yes | 1 per batch |
| Screenshot extraction | automatic | the imported file | yes | 1 per batch |
| Finding → task | automatic | findings | yes | 1 per synthesis, or 0 |
| Investigate (MCP agent) | you press it | anything it chooses | yes | an autonomous loop — cost is unbounded in advance |
| Missed evidence review | you press it | raw archive | no | one per 40 rows — scales, about 50 calls per 2,000 rows |
| View summary | you press it | raw archive | no | 1 |
| Ask the case | you press it | forensic timeline | no | 1 |
| Executive summary | you press it | forensic timeline | no | 1 |
| Remediation plan | you press it | findings | no | 1 |
| Hypothesis review | you press it | forensic timeline | no | 1, or 0 when nothing is open |
| Hypothesize gaps | you press it | forensic timeline | no | 1 for all gaps, or 0 |
| Suggest hunts | you press it | forensic timeline | no | 1, or 0 with nothing to pivot on |
| Playbook hunts | you press it | forensic timeline | no | 1 for the whole playbook |
| Technique hunt | you press it | barely any case data | no | 1 |
| Query translation | you press it | barely any case data | no | 1 for all platforms |
| Memory next steps | you press it | forensic timeline | no | 1, or 0 without memory evidence |
| Suggest tagger rule | you press it | barely any case data | no | 1 |
| Ask AI for similar | you press it | findings | no | 1 |
| Session summary | you press it | forensic timeline | no | 1 |
Runs that change your case record¶
These rewrite your evidence, your findings or your tasks. Read the limitation on each one before you rely on its output.
Synthesis¶
Where. AI Re-synthesize — automatic + button.
Sees. A stratified sample of the forensic timeline — all Critical and High, the earliest events, an even time spread, a rarity bias. Info rows get no seat unless you ask for them.
Caps. 600 events (DFIR_AI_SYNTH_MAX_EVENTS), burst grouping on, skip-if-unchanged
Costs. 2 per real run — synthesis, then finding-tasks, using the synthesis model.
Know this
The model sees a sample, not your case. On a big case most rows never reach it. A deterministic backfill is what stops a Critical row vanishing entirely. Toggling anonymisation on or off forces a fresh run.
Deep pass¶
Where. Deep pass — you press it.
Sees. Every in-scope event at or above a severity floor you choose, burst-collapsed, split into batches.
Caps. 600 rows per batch, 30 batches max (DFIR_DEEP_PASS_MAX_BATCHES) — above that it refuses and names a floor that fits
Costs. 1–30 observe calls, then a forced synthesis — scales with the case, using the synthesis model.
Know this
At the end the model does not re-read the events. It reads its own digest of them. If a batch failed to parse, that slice of your timeline went unread and the conclusions will not say so.
Second look¶
Where. Second look · Run second look — you press it. The panel sits in the left nav beside Missed Evidence Review.
Sees. The raw archive inside the active window, plus the in-scope forensic events. Searches built from your open hypotheses, unanswered questions, top IOCs, and the model's own “I wasn't shown X” requests.
Caps. 12 rows per question, 200 per sweep spent round-robin, 3 repeats of any one detection — all constants, no settings
Costs. Zero for the search itself — it is keyword matching. 2 if you let it re-synthesise., using the synthesis, only for the re-synthesis model.
Know this
It changes your evidence record. Untick “re-synthesise afterwards” and your conclusions are now older than your timeline — an export taken in that state is internally inconsistent. Selection is keyword matching; model judgement was tried and rejected.
Second opinion¶
Where. 2nd opinion — you press it.
Sees. The same forensic slice synthesis reads — twice, once per model.
Caps. inherits every synthesis cap
Costs. up to 4, using the synthesis, second-opinion, reconcile model.
Know this
The first thing it does is a real synthesis — so pressing this can rewrite your findings before the comparison even exists. That is why it sits with the writers. The rival model's own deltas are different: those reach your case only when you accept them.
Reconcile referee — runs inside it, automatically. A third model reads both versions and the disagreement list, and annotates each one: take B, keep A, or review it yourself. It never touches your case — only the comparison record. It is skipped entirely when the two models agree.
Know this
Best-effort. If that call fails you get the disagreements with no rationales and the panel simply shows fewer annotations. Silence there is not agreement.
Explain event¶
Where. the lightbulb on a row — you press it.
Sees. The one event, up to 15 neighbours in time and on the same host, up to 50 findings, the attacker path.
Caps. 15 context events, 50 findings
Costs. 1, using the synthesis model.
Know this
Clicking the lightbulb on a raw archive row permanently adds that row to your forensic record, which changes what the next synthesis reads. Deliberate — but it is a write behind a button that reads like a question.
Starred report¶
Where. ✨ Starred report — you press it.
Sees. Only the events you starred. No scope filter, no false-positive filter — you picked them by hand.
Caps. 600 events then token-fitted
Costs. 1, using the synthesis model.
Know this
Any starred row living only in the archive is promoted into the record before the model sees anything. And if the budget bit, it dropped starred events you explicitly chose — check the used-versus-matched count.
Narrative¶
Where. ✨ Generate (narrative) — you press it.
Sees. The scoped timeline, attacker path, up to 150 findings.
Caps. 150 findings, token-fitted
Costs. 1, using the synthesis model.
Know this
It is the only case report that saves itself, and it overwrites the previous narrative without asking — including one you hand-edited.
Import extraction (CSV)¶
Where. Import — automatic.
Sees. The uploaded file only, in batches, with a short case summary for context.
Caps. 50 rows per batch, then the token budget
Costs. 1 per batch — scales with the file, using the synthesis model.
Know this
A year the file never literally contains gets stamped as inferred and becomes clamp-eligible. Cancelling mid-import keeps the batches already merged.
Import extraction (logs)¶
Where. Import — automatic.
Sees. Not your log lines — deduplicated templates. The model triages patterns.
Caps. 400 templates (DFIR_LOG_MAX_TEMPLATES), 120 per batch
Costs. 1 per batch, using the synthesis model.
Know this
One anomalous line inside a huge template is represented by a single example. Templates past the 400 cap are never shown at all — the import flags that as a coverage gap.
Screenshot extraction¶
Where. automatic on capture — automatic.
Sees. The new screenshots, plus a short case summary.
Caps. one call per capture batch; image detail via DFIR_VISION_IMAGE_DETAIL
Costs. 1 per batch, using the vision model.
Know this
This is the only path needing a multimodal model. An install configured with a text-only model silently produces no screenshot events. And if OCR redaction fails, the unredacted image is sent.
Finding → task¶
Where. no button — it just happens — automatic.
Sees. Your findings, not your timeline: undismissed Critical and High ones whose task is stale.
Caps. 25 findings (DFIR_FINDING_TASKS_MAX), 8 events and 6 IOCs each
Costs. 1 per synthesis, or 0, using the synthesis model.
Know this
Best-effort and silent. If the call fails, or a finding falls past the 25 cap, you get the deterministic fallback task instead — and the card looks identical either way.
Investigate (MCP agent)¶
Where. ▶ Investigate — you press it.
Sees. Whatever the agent decides to read through the MCP servers you allowed — evidence files, live hosts, whatever those servers expose. The Companion does not choose the calls.
Caps. 40 turns, 1 hour, 8 MB of output
Costs. an autonomous loop — cost is unbounded in advance, using the the Claude Code CLI, not a configured provider model.
Know this
No masking anywhere on this path, and the command allowlist cannot be enforced in this mode — an allowed command-runner tool lets the loop choose its own command lines on your host. Its results merge into the case with an undo checkpoint.
Runs that only read¶
Nothing these do reaches your case file. Press them as often as you like; the only cost is the call.
Missed evidence review¶
Where. Missed evidence · Review — you press it.
Sees. The raw archive, minus every row already in your forensic timeline — the rows nothing else looks at.
Caps. 2,000 rows by default (DFIR_JEV_MAX_ROWS) — a default, not a ceiling; “Read every row” covers the archive
Costs. one per 40 rows — scales, about 50 calls per 2,000 rows, using the decision model (not a writer).
Know this
Off unless DFIR_JEV_ENABLED is set. The panel hides rows it scores above 0.5 as your own tooling, ticked by default — a real finding misjudged that way is invisible until you untick it. And nothing it grades Critical enters your case; you act on it by hand.
View summary¶
Where. ✨ Summarize view — you press it.
Sees. The raw archive directly, filtered the way your screen is filtered. The one sanctioned exception to the boundary rule.
Caps. 500 rows, a constant with no setting
Costs. 1, using the synthesis model.
Know this
The count it reports is what matched your filters, not what was read. Filter down to 40,000 rows and you get a summary of 500 of them. The truncation flag deliberately cannot tell the row cap from the token budget.
Ask the case¶
Where. Ask — you press it.
Sees. The scoped forensic timeline, the causal graph, the attacker path, up to 150 findings — and your own work: hypotheses, host scope, dwell windows, prior hunts, tags and comments.
Caps. 120 graph edges (DFIR_ASK_GRAPH_MAX_EDGES), 150 findings, token-fitted
Costs. 1, using the synthesis model.
Know this
It answers from the forensic timeline only — the raw archive is invisible to it. The used-versus-matched count is your only signal that the prompt was trimmed.
Executive summary¶
Where. ✨ Generate (exec) — you press it.
Sees. The scoped timeline, attacker path, 150 findings.
Caps. 150 findings
Costs. 1, using the synthesis model.
Know this
Findings are passed without ids, so the summary cannot be traced back to specific findings the way a hypothesis review can.
Remediation plan¶
Where. ✨ Generate remediation plan — you press it.
Sees. Up to 100 findings with their techniques, plus the ATT&CK mitigations and D3FEND countermeasures your techniques map to.
Caps. 100 findings, 30 mitigations, 40 countermeasures
Costs. 1, using the synthesis model.
Know this
The mitigations are supplied deterministically — the model builds steps from them and cannot invent one. If a technique is unmapped, the grounding says “none” and the plan turns generic.
Hypothesis review¶
Where. 🔎 Review — you press it.
Sees. Your open, non-exhausted hypotheses, each with its supporting and contradicting event ids, plus the scoped timeline.
Caps. answers sanitised against the hypothesis and event ids it was offered
Costs. 1, or 0 when nothing is open, using the synthesis model.
Know this
Advisory only — it never changes a hypothesis status. And it excludes settled hypotheses, so it will never tell you one was settled wrongly.
Hypothesize gaps¶
Where. ✨ Hypothesize gaps — you press it.
Sees. The silent windows a deterministic detector already found, with the events either side, and the catalog of collections it ranks against.
Caps. 5 gaps (DFIR_GAP_HYPOTHESIS_MAX), 8 events either side
Costs. 1 for all gaps, or 0, using the synthesis model.
Know this
The recommended collections are deterministic — the model only picks from the catalog. A gap it skips still carries its collections, so an empty answer is not “nothing to collect”.
Suggest hunts¶
Where. ✨ Suggest hunts — you press it.
Sees. The scoped timeline, findings, IOCs, techniques, the causal graph, and the hunt feedback ledger — what previously hit and missed.
Caps. 8 suggestions (DFIR_HUNT_SUGGEST_MAX)
Costs. 1, or 0 with nothing to pivot on, using the velociraptor model.
Know this
Any suggestion matching a hunt already deployed in this case is silently dropped. You can get fewer than 8, or none, and nothing tells you why.
Playbook hunts¶
Where. ✨ Suggest Velociraptor hunts — you press it.
Sees. Your playbook tasks, the case's observed endpoints, the real artifact names from your Velociraptor server, findings, a small timeline sample.
Caps. 120 events, 150 artifacts, 30 suggestions
Costs. 1 for the whole playbook, using the velociraptor model.
Know this
Whether a suggestion deploys to one host or the fleet is decided deterministically from your endpoints, not by the model — and a host it invents is rejected.
Technique hunt¶
Where. per-technique hunt button — you press it.
Sees. No timeline at all — the technique id, your pivotable IOCs, and the hunt feedback.
Caps. technique id must be well-formed or it returns nothing
Costs. 1, using the velociraptor model.
Know this
By definition the technique has not been observed in your case. The query is generic detection, not case evidence.
Query translation¶
Where. Translate — you press it.
Sees. Almost nothing about your case: the data sources you have, your pivotable IOCs, and the schema guide. It works on an empty case.
Caps. platforms you selected
Costs. 1 for all platforms, using the synthesis — deliberately not the hunt model model.
Know this
It does not read your timeline. “This host” resolves only through the IOC list handed to it. The hunt-tuned model is avoided here on purpose, because it biases everything toward VQL.
Memory next steps¶
Where. ✨ Suggest next steps — you press it.
Sees. Your in-scope memory-forensics events, worst first, and which plugins you already imported.
Caps. 8 suggestions (DFIR_MEMORY_NEXTSTEP_MAX)
Costs. 1, or 0 without memory evidence, using the synthesis model.
Know this
It proposes commands you run yourself, and nothing verifies the plugin exists in your Volatility build.
Suggest tagger rule¶
Where. ✨ Suggest rule — you press it.
Sees. No case data at all — the matchable field list and your plain-English description.
Caps. single-event field matches only; it declines anything else
Costs. 1, using the synthesis model.
Know this
A new rule changes what future imports surface, never what past ones did. Your existing evidence is not re-graded.
Ask AI for similar¶
Where. 🔎 Ask AI for similar — you press it.
Sees. The label of the item you are dismissing and a narrowed candidate list of labels. No timeline.
Caps. answers validated twice against the candidate list
Costs. 1, using the synthesis model.
Know this
It sees labels, not evidence. Accepting its suggestions removes those events from every later AI prompt.
Session summary¶
Where. ✨ Summarize session — you press it.
Sees. The forensic events of one session, re-derived at the moment you press it.
Caps. 600 events then token-fitted
Costs. 1, using the synthesis model.
Know this
The session is re-segmented at call time, so changing your segmentation settings changes what the same session id covers.
Passes that are not AI at all¶
These run with the AI switched off. If you have ever asked why an event has a severity when AI is off, the answer is the first row.
| Pass | What it does |
|---|---|
| Content tagger | A rule set run over the newly imported events only, straight after import. It raises severity and adds ATT&CK techniques. This is why an event has a severity with AI off. A rule you write next week changes what future imports surface, never what past ones did. |
| Severity gate | Splits imports: Low and above into the forensic timeline, Info into the raw archive only. A row carrying a promotion stamp is exempt whatever its severity, which is why the forensic timeline can hold Info rows. |
| Named demoters | Lower one narrow class of row to Info with a stated reason — a Windows updater talking to a Microsoft edge, for instance. Never lowers High or Critical, never touches a row you promoted. |
| Burst grouping | Collapses four or more repeats of the same detection within an hour into one prompt row. Prompt only — your case keeps every row. |
| Prevalence | A per-case baseline of command shapes. Feeds a rarity bias into what synthesis is shown, and the common/rare tag on a row. |
| Attack phases | Groups the timeline into phases by time gap and labels each with its dominant tactic. Pure arithmetic. |
| High-severity backfill | Mints findings the model did not: any Critical or High event it left unlinked, Defender episodes, script-block commands, coverage gaps. A High or Critical row that a finding cites but does not name gets its own finding when it sits in a different folder from the finding's other rows (the finding must cite at least 3 rows with a file path). A finding can exist with no model involvement at all. |
| Refutation gate | Downgrades a model "refuted" verdict to unknown when the host scope never collected the evidence class being denied. It can only ever weaken a claim. |
| Screenshot OCR | Local Tesseract. Makes screenshots searchable, and blacks out entities before an image reaches an external vision model. |
Masking¶
Nearly every model call passes one choke point that swaps real hostnames, users, paths and addresses for tokens before anything leaves the machine, then restores the real values into the answer.
Three things about that gate are worth knowing. The system prompt is never masked — safe for the shipped prompts, but a custom prompt file holding real case values would go out in the clear. An OCR failure forwards the unredacted image with a warning. And if you turn anonymisation off for a case, the whole chain is skipped, including the PII scanner.
Three paths do not use the gate
Investigate (the MCP agent) is the real bypass. It reads evidence through MCP servers and streams it to the Claude Code CLI. Nothing masks that text, because the Companion never sees it. The command allowlist also cannot be enforced in that mode — only the tool list survives.
The missed-evidence review masks correctly, by a different route. No PII scanner on that text, and no restore step — which is fine, because a grade is a number.
Import extraction skips the PII scanner per batch, safe only because the whole payload is scanned once up front. The skip and the pre-scan are a pair; neither is correct alone.
The archive boundary¶
The rule is that the model reads the forensic timeline, and nothing automatic reads the raw archive. Six paths touch the archive, each under a stated constraint.
| Path | How it stays inside the rule |
|---|---|
| Explain event | Promotes the one event first, then explains from the forensic timeline. |
| Starred report | Promotes the starred rows first, then reports from the forensic timeline. |
| Second look | Analyst-pressed. Deterministic search, promote with provenance, then re-synthesise. |
| View summary | Exception 1. Reads the archive directly. Analyst-pressed, ephemeral, capped at 500 rows with the truncation disclosed. |
| Remediation check | Exception 2. Reads the archive, but no model ever sees it. Persists counts and ids only, never a row's text. |
| Missed evidence review | Exception 3. Reads the archive and a model does see it. |
Eviction loses evidence
The raw archive is capped and eviction is permanent. It sheds in three tiers, oldest first:
ordinary rows at any severity go first; rows a named rule deliberately graded Info go next,
bounded so they cannot fill the cap; rows you starred or tagged are never evicted and do
not count against the cap.