1The short answer first
You asked a hard question and you deserve a clear answer.
Think of it like this: the execution engine, the policy gate, the approval workflow, the reasoning trace, the compliance evidence emission — all real, all running. The last mile — driving Tanium or SCCM in customer-specific ways — is connectors that get configured during the POC, not invented during the POC.
2How a patch executes — full lifecycle
Scanner reports a vulnerability
Qualys (or whichever scanner) finishes a scan and emits a finding. Mythal's Scanner Liaison agent ingests it via the scanner's REST API (or webhook). Schema normalized, deduped, stored.
Per second on a Class I rail estate, this might be 1–10 findings during peak scanner cycles.
Agents enrich and plan
Threat Intel checks KEV. Patch Hunter finds the vendor's KB / advisory. Impact Analyst joins CMDB. Change Risk scores deployment risk. Remediation Planner synthesizes the plan.
Total time: under 5 seconds for normal CVEs.
Policy gate evaluates the plan
The plan hits a deterministic policy engine (Open Policy Agent under the hood). The engine reads:
- Asset criticality (Critical / High / Medium / Low)
- Asset environment (IT / DMZ / OT)
- Critical Cyber System flag
- Patch reliability score
- Canary peer availability
- Current time vs configured maintenance windows
- Rollback plan validity
The engine returns one of: auto_apply · single_approval · dual_approval · blocked.
If approval required — human signs
For single_approval: routed to the configured security approver (e.g. via email + signed link, ServiceNow notification, or Slack channel — whichever you configure).
For dual_approval: routed to two configured approvers in different roles. Both must sign with HMAC-validated identities before the next step.
Signature includes: approver email, timestamp, justification, policy rule ID that triggered the requirement.
Maintenance window check
Even with approval, the Executor agent will not act outside a configured maintenance window. Default windows:
| Asset class | Default window | How configured |
|---|---|---|
| Standard IT workstations | Anytime | Per zone in change_windows table |
| Production servers | 02:00–06:00 nightly | Per zone in change_windows table |
| Network gear | Sat/Sun 02:00–06:00 | Per zone in change_windows table |
| Sensitive operational systems | Quarterly planned outage | Pinned dates · plan handed to operations team |
If the window is closed at execution time, the plan waits in APPROVED state. Executor wakes up when the window opens (cron-driven check every minute).
Executor dispatches through the right driver
Each step of the plan names a tool. The Executor looks up the configured driver for that tool and calls it. For Windows patching that might be Tanium. For Linux it might be Ansible. For network gear it's Cisco Catalyst Center. For firewall rule changes it's Palo Alto Panorama.
The driver:
- Authenticates to the tool's API using credentials stored in your Vault.
- Submits the action (install KB, push package, run playbook, commit ACL change).
- Polls the tool's API for status.
- Returns the result back to the Executor as a structured payload (action_id, exit_code, stdout, etc).
Verifier rescans + health checks
After each step completes, the Verifier agent triggers a fresh scan via the same Scanner Liaison driver (Qualys API). If the CVE no longer reports, that's a clean rescan. It also runs configured service health probes against the target. If either check fails, automatic rollback through the same driver.
Compliance Reporter writes evidence
Every closed plan emits a record into the compliance_evidence table, tagged to the relevant framework controls. The reasoning trace is the audit log. The PDF export reads from this table.
3What a real driver actually looks like (in code)
Drivers are small Python classes. Each one wraps one tool's API. Here's the shape of the Tanium driver:
class TaniumDriver(PatchDriver): """Drives the Tanium platform for endpoint patching.""" def __init__(self, config): self.base_url = config["base_url"] # e.g. https://tanium.csx.internal self.api_token = config["api_token"] # pulled from Vault self.signing_key = config["signing_key"] self.verify_tls = config.get("verify_tls", True) def apply_patch(self, asset, patch): # 1. Look up the target endpoint in Tanium endpoint = self._find_endpoint(asset.hostname) # 2. Create an action that installs the KB action_id = self._create_action( target=endpoint.computer_id, package=patch.kb_id, # e.g. KB5004945 sense_id=patch.tanium_sensor, ) # 3. Poll until complete (with timeout + backoff) status = self._wait_for_action(action_id, timeout=600) # 4. Return structured result for the Execution record return ExecutionResult( tool="tanium", action_id=action_id, status=status.outcome, # success / failed exit_code=status.exit_code, stdout_tail=status.last_log_lines, duration_s=status.duration_seconds, ) def rollback(self, asset, patch): # Reverse the action — uninstall + restart ...
The same shape applies to all the other drivers. Each one wraps one tool. The Executor calls driver.apply_patch(asset, patch) and gets back a structured result.
4What we have today — be honest
✓ Real today, running on Azure
- Twelve agents running real Python code with structured outputs
- Policy gate evaluating real rules against every plan
- Approval workflow with HMAC-signed approvals
- Database — Postgres on Azure with full schema
- Reasoning trace ledger persisted and queryable
- Maintenance window table-driven check
- Compliance evidence emission and PDF export
- Scanner ingestion against live CISA KEV feed
- Driver interface — abstract base class with structured contract
- Console + console UX — Lightning, Mission, Bridge views all live
~ Simulated in the demo (configurable per customer)
- Tanium / SCCM / Ansible drivers — return synthetic but realistic API payloads (action_id, deployment_id, exit_code, package_state)
- Live Qualys / Tenable rescans — Verifier currently simulates rescan outcomes with realistic success/failure rates per asset class
- Cisco DNAC / Palo Alto Panorama — config push simulated with realistic commit_job_id
- Approval email/Slack/ServiceNow — clicks through the console; production wires to your actual messaging system
- Vault credential pull — currently uses .env; production wires to HashiCorp Vault or Azure Key Vault
The architecture supports all of them. The work during a customer POC is: provide the tool endpoint URL, the API credentials (stored in your Vault), and which assets each tool is authoritative for. The driver code is already written.
5How rules and policies get configured
Policies are stored as OPA bundles (Open Policy Agent — the standard policy-as-code system). You write rules in Rego, the standard policy language. Here's what a real policy rule looks like:
package mythal.execution # Critical Cyber Systems require dual approval, no auto-apply, ever require_dual_approval["ccs"] { input.asset.is_ccs == true } # OT zones require dual approval AND maintenance window require_dual_approval["ot"] { input.asset.env == "OT" } # Auto-apply allowed only for low-criticality IT with high-reliability patch auto_apply_eligible { input.asset.env == "IT" input.asset.criticality != "Critical" input.patch.reliability_score >= 0.85 input.canary_peer_available == true not require_dual_approval[_] } # Block anything during configured blackout windows blocked["blackout"] { some w input.current_time >= data.blackout_windows[w].start input.current_time <= data.blackout_windows[w].end }
The policy bundle is loaded into Mythal at startup. When the customer wants to change a rule — for example, "never auto-apply on Friday afternoons" — an engineer edits the bundle, runs opa test to validate, and pushes. Mythal hot-reloads.
You can also configure simpler things through the Policy Studio console page without writing Rego:
- Which asset classes require approval
- Which approver groups handle which scope
- Maintenance window schedules per zone
- Blackout periods (board meetings, peak revenue weeks)
- Which tools handle which OS class
6Tools we drive (and what method each one uses)
7Can we show this in the POC? — yes, and here's how
Recommendation: yes, but stage it right
What you can demonstrate in the POC:
- Run the full simulated execution flow — the Executor agent, the policy gate, the approval workflow, the rescan, the rollback. This already works and is impressive.
- Show the driver interface code — open the Python file in a code editor and say "this is what the Tanium driver looks like — when we wire to your Tanium server, we add the URL and credentials and this exact code calls your API."
- Wire ONE real connector during the POC — pick the customer's most accessible patch tool (often Ansible Tower because it's API-first) and stand up a real driver against a lab server. Demonstrate one real patch landing through Mythal end-to-end.
- Leave the rest in simulation for the POC. They don't need 12 connectors live — they need to see the pattern works end-to-end with one.
What NOT to claim: Don't say "Mythal patches your entire estate today out of the box." Say "Mythal's execution architecture is built. The customer-specific connector configuration is part of the POC scope."
8What to say when CSX asks "is this real or simulated?"
"The execution engine, the policy gate, the approval workflow, the rescan loop, the compliance evidence emission — all real, all running on Azure today. What you're seeing on screen is real Python code making real database transactions and emitting real audit records.
The last mile — the integrations to your specific Tanium server, your SCCM, your Ansible — those are connectors that get configured during a proof. The drivers are written. The interface is stable. What's customer-specific is the endpoint URL, the credentials in your Vault, and the asset routing rules.
During a POC, we'd wire up one of your patch tools — probably the most API-accessible one — and demonstrate one real patch landing end-to-end through Mythal. That's enough to prove the pattern. The remaining connectors get configured during onboarding, not during the proof."
9Realistic POC scope
| Phase | What we connect | What's still simulated |
|---|---|---|
| POC kickoff | Mythal appliance stood up in your lab. Read-only Qualys connection (or whichever scanner you use). Read-only CMDB connection. | All patch tools still in simulation mode while we get the read paths working. |
| POC mid | One patch-tool driver wired to a real lab instance (typically Ansible Tower because it's API-friendly). One real plan executes end-to-end against a lab Windows or Linux server. | Other patch tools still simulated. Production assets out of scope. |
| POC close | Compliance evidence PDF reviewed by your auditor. End-to-end trace shown. Lab patch landed and verified. | Production wiring deferred to onboarding phase. |
| Onboarding (post-POC) | All remaining patch-tool drivers wired. Approval routing to your real ServiceNow / Slack / email. Vault integration. Production assets enrolled in waves. | Nothing — full production. |
10Is this too complex for the demo? — no, not if you frame it right
You're not selling a finished product. You're selling an execution architecture that's already built, with the customer-specific last mile being a known, scoped piece of work.
The demo should:
- Show the simulated execution flow (visually impressive, all real code, just synthetic API payloads)
- Show the Compliance evidence PDF (real PDF, real reasoning trace)
- If asked "is this hitting our real Tanium?" — answer with the verbatim answer in section 8 above
- Offer to show the driver code in a real editor if they want to see the integration layer
If they're satisfied with the simulation + the driver code, you've made the sale. If they want to see one connector actually hit a real system, that's exactly what the POC delivers.
Bottom line
Show the simulation. Reference the driver code if asked. Be honest that customer connectors are POC scope. Don't oversell. The audience knows enterprise software well enough to understand the difference between "architecture works" and "your specific tool is wired today." Pretending the latter when you mean the former destroys credibility. The straight answer wins this room.
Open the deck: /presentation/client-deck.html · Script: /presentation/demo-script.html