Security Walkthrough

For a Technical Reader

A single account-compromise episode, three log lines, an analyst question, a posterior, a recommendation, traced through every stage of the pipeline with the typed objects shown at each hand-off.

Three log lines and an analyst question.

A SOC analyst is reviewing a SIEM alert cluster for account jsmith@corp.example. The raw telemetry spans eighteen minutes:

# Raw telemetry, as it arrives 2026-06-29T09:15:03Z AUTH jsmith London/GB SUCCESS vpn.corp.example 2026-06-29T09:23:41Z EXEC jsmith WIN-DC-01 powershell.exe -enc <base64> SYSTEM 2026-06-29T09:33:17Z EGRESS jsmith WIN-DC-01 upload 4.1 GB → dropbox.com

The analyst types:

# Analyst query, natural language "Is jsmith's account compromised? London login looks odd, he's usually in New York. Followed by a privileged PowerShell on a domain controller and a large upload. What should we do?"

That question enters the pipeline. Here is what happens at each stage.

▲ LLM interface

Natural language becomes a typed query.

The LLM runs under a constrained decoding schema. It extracts entities, links them to canonical variable IDs in the scope card, infers the rung from linguistic markers, and assigns soft-evidence confidences to hedged observations. It does not decide whether an attack occurred.

The London login is not a certain observation, the analyst flagged it as odd, not as confirmed impossible. It enters as soft evidence at 0.72. The PowerShell execution and the large upload are structurally clear from the logs and enter as hard evidence.

CausalQuery, emitted by the LLM parser

CausalQuery { rung: 1, // "is the account compromised?", observational outcome: "AccountCompromise", treatment: null, evidence: [ SoftEvidence("LoginLocationAnomaly", p=0.72), // analyst hedge: "looks odd" HardEvidence("PrivilegeEscalation", true), // SYSTEM-level PowerShell on DC HardEvidence("LargeEgressVolume", true), // 4.1 GB egress confirmed SoftEvidence("UnusualEgressDest", p=0.85), // Dropbox: unusual for this account ], population: "corporate_endpoint_accounts", status: "resolved" }

No natural language crosses into the reasoning core. The rung is a first-class field. The analyst’s hedge (“looks odd”) is preserved as a calibrated probability, not rounded to a yes or no.

Deterministic

The query becomes a formal estimand.

Pure code. Given rung = 1 and outcome = AccountCompromise, the estimand is mechanical: P(AccountCompromise | LoginLocationAnomaly=0.72, PrivilegeEscalation=true, LargeEgressVolume=true, UnusualEgressDest=0.85). The same query always yields the same estimand.

# Estimand, emitted by the formalizer Estimand { type: "conditional_probability", // rung 1 outcome: "AccountCompromise", conditioned: [ { var: "LoginLocationAnomaly", kind: "soft", value: 0.72 }, { var: "PrivilegeEscalation", kind: "hard", value: true }, { var: "LargeEgressVolume", kind: "hard", value: true }, { var: "UnusualEgressDest", kind: "soft", value: 0.85 }, ] }
Deterministic

Scope-card satisfiability selects the model.

The router queries the model registry. It checks whether any scope card’s variables contain all four evidence nodes and the target node, whether the regime matches corporate_endpoint_accounts, and whether it supports Rung 1 inference. The account-compromise DBN scope card satisfies all three conditions. One model, single-model path.

# Route result RouteResult { path: "single_model", model_id: "scope_cyber_account_compromise_v1", bayes_file: "account-compromise-v1.bayes", version: "1.0.3", rung_supported: true, regime_match: true }
■ Gate

The gate: certificate or refusal.

Before any numbers are computed, the identification algorithm runs on the chosen graph. For a Rung 1 observational query on a DBN with no unblocked backdoor paths from the evidence to the target, all conditioning variables are observed, the estimand is identified by direct conditioning. No adjustment set is required. The gate passes and issues a certificate.

# IdentificationCertificate, gate passes IdentificationCertificate { certificate_id: "idcert_2026_000184", issued_at: "2026-06-29T09:34:01Z", model_version: "account-compromise-v1.bayes@1.0.3", input_episode_id: "episode_corp_jsmith_20260629", status: "identified", identified_entity: { entity_type: "corporate_account", canonical_name: "jsmith@corp.example", confidence: 0.97, supporting_evidence: [ { source_type: "observation", field: "auth_username", value: "jsmith", confidence: 1.0 }, { source_type: "sensor", field: "vpn_session_id", value: "sess_4417", confidence: 0.99 } ] }, evidence_used: ["LoginLocationAnomaly", "PrivilegeEscalation", "LargeEgressVolume", "UnusualEgressDest"], assumptions: ["Account identity is stable within the session window."], audit: { gate_name: "identification", passed: true, reviewer_required: false } }

No certificate, no downstream reasoning. Had the identity been ambiguous, shared credentials, VPN relay, no device fingerprint, the pipeline would have returned a refusal object here and stopped. The analyst would see why, not a fabricated posterior.

Deterministic

Single-model path, no composition required.

The router found a single covering model, so the composition stage is a pass-through. No cross-model d-separation check is needed. A CompositionCertificate is still emitted for completeness of the audit record, recording that no composition was required.

CompositionCertificate { models: ["account-compromise-v1.bayes@1.0.3"], interface: [], bridge_role: null, d_separated: null, licensed: true, // trivially: single model, no seam carries: null }
Deterministic

Bayes Server infers the posterior. Exactly.

The four evidence bindings, two hard, two soft, are submitted to the compiled junction tree. Message passing propagates the evidence through the dynamic BN. The result is a full posterior distribution over every node, not just the target. The inference is exact where the treewidth allows; this model’s structure is within the exact-inference budget.

# Inference result, Bayes Server output P(AccountCompromise | evidence) = 0.94 P(DataExfiltration | evidence) = 0.88 P(CredentialCompromise | evidence) = 0.79 # Impact attribution, how far each input moved the posterior contributions = { "PrivilegeEscalation": +0.31, "LargeEgressVolume": +0.24, "UnusualEgressDest": +0.19, "LoginLocationAnomaly": +0.08, } # Pattern analysis, distinguishing features vs. baseline behaviour pattern = [ { var: "PrivilegeEscalation", divergence: 0.71 }, { var: "LargeEgressVolume", divergence: 0.64 }, { var: "UnusualEgressDest", divergence: 0.58 }, ] # Evidence optimization, best response given policy budget optimized_actions = ["DisableAccount", "CollectMemoryImage", "ResetPassword"] rejected = [ { action: "IsolateHost", reason: "business disruption exceeds threshold at P(AC)<0.97" }, ]

The genetic optimizer searched the action space, all combinations of the scope card’s intervention nodes, against the objective (maximize P(containment)) and the disruption constraint (avoid host isolation unless P(AccountCompromise) ≥ 0.97). Host isolation was rejected as decision-irrelevant here: the account can be disabled without it, and the disruption cost is not yet justified.

Deterministic

Everything bundled into one reproducible record.

Audit assembly composes the formal estimand, the identification certificate, the composition certificate, the model version, the evidence bindings, the posterior, the contributions, and the recommended actions into an AuditRecord. This is the object that gets logged, reviewed, and contested, not a prose summary.

AuditRecord { record_id: "audit_corp_jsmith_20260629_001", query: CausalQuery { … }, estimand: Estimand { type: "conditional_probability", … }, models: [{ id: "scope_cyber_account_compromise_v1", version: "1.0.3", checksum: "sha256:8fc1…" }], identification: IdentificationCertificate { certificate_id: "idcert_2026_000184", … }, composition: CompositionCertificate { licensed: true, … }, evidence: [ { var: "LoginLocationAnomaly", kind: "soft", value: 0.72, source: "llm" }, { var: "PrivilegeEscalation", kind: "hard", value: true, source: "sensor" }, { var: "LargeEgressVolume", kind: "hard", value: true, source: "sensor" }, { var: "UnusualEgressDest", kind: "soft", value: 0.85, source: "llm" }, ], assumptions: [ "Account identity is stable within the session window.", "LoginLocationAnomaly soft evidence reflects analyst calibration." ], posterior: { "AccountCompromise": 0.94, "DataExfiltration": 0.88, "CredentialCompromise": 0.79 }, contributions: { "PrivilegeEscalation": +0.31, "LargeEgressVolume": +0.24, … }, recommended_actions: ["DisableAccount", "CollectMemoryImage", "ResetPassword"], rejected_actions: [{ action: "IsolateHost", reason: "disruption threshold not met" }], reproducible: true }
▼ LLM interface

The LLM verbalizes the result it did not compute.

The second and final LLM stage takes the finished AuditRecord and renders it as a plain-language analyst report. It explains the posterior, attributes it to the evidence that moved it, and states the recommended actions with the rejected alternative and why. It does not revisit the reasoning.

Analyst report, narrated output

The model puts account compromise at 94% for jsmith@corp.example based on four signals observed over eighteen minutes.

The privileged PowerShell execution on the domain controller carries the most weight (+31 points). The 4.1 GB upload to Dropbox adds another +24, and the unusual destination a further +19. The London login, entered as a 72% confidence observation because it was flagged as unusual rather than confirmed anomalous, contributed an additional +8.

Policy recommends three actions: disable the account, collect a memory image from WIN-DC-01, and reset credentials. Host isolation was evaluated and rejected: at 94% compromise probability it does not yet meet the disruption threshold (97%), and disabling the account achieves containment without taking down the host.

Two assumptions underlie this: account identity is stable across the session window, and the location anomaly confidence reflects the analyst’s calibrated judgment. If either is wrong, the audit record is the place to contest it.

The things a verdict without a pipeline cannot give you.

  • The hedge is preserved. The analyst said “looks odd”, that entered as 0.72, not as a confirmed fact. The posterior reflects it accordingly.
  • The gate can refuse. Had the identity been ambiguous, the pipeline would have returned a refusal at stage 4. The analyst would see the reason, not a fabricated 94%.
  • Every number traces to evidence. The impact attributions show exactly which signals moved the posterior and by how much. A contested finding has a specific place to push back.
  • The rejected action is documented. Host isolation was considered and declined, with the reason stated. The audit record says so. In a post-incident review, that matters.
  • The assumption is named. “Account identity is stable within the session window” is stated, not buried. If VPN relay or shared credentials make it false, that is where the contestation starts.
  • Reproducibility is structural. The same episode, the same scope card, the same evidence bindings, same result, every time. Not a property of the model’s mood.