I use AI agents to take the slow, repetitive parts out of security orchestration, automation and response (SOAR) work, so my attention goes to the decision. This entry shows which tasks I hand to an agent, what each one produces, and the gate that stops an agent from acting on its own.
The case is simulated. The events, the playbook run and the model call are sample evidence built on the same simulated day as the rest of the console. I have not measured time saved, so there is no speed claim here; the method for measuring one is at the end.
What I hand to an agent
- Gathering and normalising evidence. Windows events and firewall records arrive in different shapes. The agent maps them into one schema so they can be compared at all.
- Grouping duplicates. Seven alerts about the same account and machine are one observation, not seven.
- Drafting the case note. A first draft with the facts, the open questions and the evidence references, which I then edit.
- Recommending a next step. A bounded choice with an uncertainty attached, never an action.
- Keeping the record honest. Outside this case, I keep my lab handoff notes with an assistant, and every fact is tagged confirmed, historical, proposed or unknown. That discipline is why this site can say which statuses come from a record.
What I do not hand over: closing a case, changing an account, isolating a machine, or deciding that two observations are the same incident.
The question
Seven failed logons hit the file server FS-01 within a few minutes, all for one account and all from the workstation WS-02. In the same quarter hour, Sophos denied WS-02 five times on its way to a SOC dashboard. Is this an attack, a mistake, or two unrelated things that happen to share a workstation?
The pipeline, stage by stage
SOC-0142 · AI-assisted SOAR pipeline
simulated case · substituted names and addressesWazuh rules (simulated) · 12 alerts in 15 minutes
- 08:14 Multiple failed logons (4625) · FS-01
- 08:15 Multiple failed logons (4625) · FS-01
- 08:16 Multiple failed logons (4625) · FS-01
- 08:16 Firewall deny burst · WS-02
- 08:17 Multiple failed logons (4625) · FS-01
- 08:18 Multiple failed logons (4625) · FS-01
- 08:19 Multiple failed logons (4625) · FS-01
- 08:19 Firewall deny burst · WS-02
- 08:20 Multiple failed logons (4625) · FS-01
- 08:22 Firewall deny burst · WS-02
- 08:25 Firewall deny burst · WS-02
- 08:28 Firewall deny burst · WS-02
Agent task · deterministic code · one schema for Windows and Sophos fields
{"ts":"2026-11-07T08:14:00Z","source":"windows","event":"logon_failed","host":"fs-01","account":"LAB\\student01","src_host":"ws-02","sub_status":"0xC000006A"}
{"ts":"2026-11-07T08:15:00Z","source":"windows","event":"logon_failed","host":"fs-01","account":"LAB\\student01","src_host":"ws-02","sub_status":"0xC000006A"}
… 10 more recordsAgent task · deterministic code · 12 alerts become 2 observations
- 7 × failed logon on FS-0108:14 to 08:20 UTC · LAB\student01 from ws-02, 0xC000006A
- 5 × firewall deny from WS-0208:16 to 08:28 UTC · to soc-ui.lab.example:443
Both groups share WS-02 and a time window. The agent links them as related but does not merge them: the deny targets a different host and port.
Agent task · sample text · draft for analyst review
Summary. Seven network logon failures (4625, sub status 0xC000006A) for LAB\student01 on FS-01, all from WS-02, 08:14 to 08:20 UTC. Account exists and is enabled; its password changed at 08:05 UTC.
Related, not merged. Five Sophos denies from WS-02 to soc-ui.lab.example:443, 08:16 to 08:28 UTC.
Open questions. Does WS-02 hold a saved credential for \\FS-01\share? Did anyone attempt the SOC dashboard on purpose?
Evidence. E1 to E4 in the case record.
Jev · simulated call · bounded choice, not free text
{
"case": "SOC-0142",
"choices": [
"request context",
"analyst review",
"candidate for closure"
],
"chosen": "request context",
"uncertainty": "medium",
"evidence": [
"E1",
"E3",
"E4"
],
"model": "Jev (simulated call)"
}Playbook rules, then me
- Uncertainty is not low, so the case goes to an analyst.
- No closure without a person: "request context" holds the case open.
- Disabling the account or isolating WS-02 needs my explicit approval; none given.
- My disposition: open, likely benign, ask the owner about the saved credential; the deny stays a separate observation.
Where the agent saves time, and where I check the evidence
| Step | What the agent speeds up | What I still check myself |
|---|---|---|
| Gather | Pulling the 4625 events and Sophos records for the window into one list | That the window and hosts are the right ones, and no source is missing |
| Normalise | Mapping two log formats onto one schema | One raw event against its normalised row, field by field |
| Group | Folding seven alerts into one observation | That the grouping key (account plus workstation) did not swallow a different source |
| Draft | A first case note with facts, open questions and references | Every claim in the note against the event it cites |
| Recommend | A bounded choice with an uncertainty | Whether the evidence supports that choice; the agent’s confidence is not evidence |
| Decide | Nothing | The disposition, and whether the firewall deny belongs in the case |
The pattern is the same in every row: the agent saves the typing and the sorting, and I keep the judgement and the verification. The last row stays empty on purpose.
The replay
SOC-0142 Failed-logon cluster on FS-01 7 Nov 2026
simulated case · substituted names and addressesWindows Security → Wazuh agent
08:14 UTC Windows event
FS-01 writes event 4625 for each failed network logon. The Wazuh agent ships the Security log entries I selected, so the manager sees each failure within seconds.
Wazuh → CoPilot · Graylog
08:21 UTC Alert becomes a case
Repeated failures from one source match a Wazuh frequency rule. CoPilot reads the alert from the indexer and opens SOC-0142; Graylog supplies the Sophos denies from the same window as a related observation.
Shuffle · read-only
08:21 UTC Read-only enrichment
A Shuffle workflow looks up the account and the workstation. Every call is a read: no password reset, no isolation, nothing that changes the lab.
AI agent · Jev
08:22 UTC Agent draft and recommendation
An agent drafts the triage note and cites E1 to E4 for every claim. Jev is asked one bounded question with typed choices and returns request context, with medium uncertainty: a bad-password sub status right after a password change fits a stale saved credential better than guessing.
request contextanalyst reviewcandidate for closureuncertainty: medium
Shuffle approval gate
08:22 UTC Approval gate
The workflow stops. Ambiguity and any closure recommendation go to a person, and disabling the account or isolating WS-02 would need explicit approval, so no automated action runs.
Analyst in CoPilot
08:40 UTC Analyst disposition
I read the draft against the evidence, keep the case open as likely benign pending the account owner confirming the saved credential, and leave the firewall deny linked as its own observation.
Evidence
E1 7 × event 4625 on FS-01
Windows Security · Wazuh agent
Account LAB\student01, logon type 3 (network), sub status 0xC000006A (bad password), workstation WS-02, 08:14 to 08:20 UTC.
E2 5 × Sophos deny from WS-02
Sophos syslog · Graylog
WS-02 to soc-ui.lab.example on TCP 443, rule “Identity to SOC”, 08:16 to 08:28 UTC.
E3 Directory context for LAB\student01
AD lookup (sample)
Account exists and is enabled, member of Lab Users, password changed at 08:05 UTC.
E4 Workstation context for WS-02
Asset notes (sample)
Domain-joined workstation with a mapped drive to \\FS-01\share saved under the old password.
Decision log
| UTC | Actor | Entry | Evidence |
|---|---|---|---|
| 08:21 | Playbook v3 (sample) | Case created from 7 alerts; 5 firewall denies attached as related | E1E2 |
| 08:21 | Playbook v3 (sample) | Account and workstation context attached | E3E4 |
| 08:22 | Triage agent (simulated) | Draft note written; each statement cites its evidence | E1E2E3E4 |
| 08:22 | Jev (simulated) | Recommendation: request context · uncertainty medium | E1E3E4 |
| 08:22 | Policy gate | Held for analyst; no automated action permitted | |
| 08:40 | Analyst | Open · likely benign, awaiting owner confirmation; deny kept separate | E2E4 |
Step through the case or press Play. Evidence stays on screen as the decision state changes, and the decision log ties each entry to the evidence it rests on.
Open the full lab consoleWhat the playbook does
- Collect and deduplicate. The 4625 events and the Sophos records arrive as separate alerts. The playbook folds the logon failures into one case and attaches account, endpoint, time and source context.
- Ask a bounded question. It asks TypeSafe’s Jev to choose between typed options: request context, analyst review, or candidate for closure. The answer comes back with an uncertainty, and both are stored next to the evidence that produced them.
- Apply explicit rules. Ambiguity, missing context, a timeout or conflicting evidence goes to a person. A recommendation to close only prompts an analyst. Disabling an account or isolating a host needs explicit approval.
- Record the decision. The case keeps its ID, the evidence references, the playbook version, the model identifier, the recommendation, the human action and the outcome.
Why the firewall deny stays separate
The playbook can put the logon events and the firewall record in front of me. Jev can recommend where the case goes next. I still have to explain why a firewall deny belongs in the same case, or why I would leave it separate. Here it targets a different host and port, so I link it as its own observation and keep it out of the evidence for a password attack.
Try the investigation yourself
Type help to list commands. Start with brief.
The terminal is a training room in the style of TryHackMe: fixed commands over the simulated data, and a decision at the end. It is deliberately separate from the replay so the guided version does not blur into the evidence.
How I would measure the time saved
Run the same five-case set twice: once by hand, once with the pipeline, starting a timer at the first alert and stopping at a disposition I would sign. Keep the cases, the fixture and the scoring rules public, count only my time, and report both medians with the spread. This page publishes no speed number, because none has been measured that way.
The Kali Red and Blue page shows where test activity like this comes from, and how Kali Blue’s evidence feeds the same kind of case.
What I learned
Working through SOC-0142 changed what I ask an agent for. I stopped asking it for answers and started asking it for well-sorted evidence and a bounded suggestion. The step that matters most, deciding whether the firewall deny is part of the story, is exactly the one the agent cannot make for me, because it depends on why WS-02 was talking to that dashboard.
Takeaway: let an agent gather, normalise, group and draft. Before signing anything, check one raw event against the agent’s version of it.
Further reading: TypeSafe’s introduction to Jev · Windows event 4625
Skills used
- Triage with an evidence trail
- Deciding which SOAR steps an agent may take
- Keeping a human approval gate
Tools in this entry
- SOCFortress CoPilot External reference
Official documentation for SOCFortress CoPilot - Wazuh External reference
Official documentation for Wazuh - Shuffle External reference
Official documentation for Shuffle - Sophos Firewall In my lab
Official documentation for Sophos Firewall