Deployment & sovereignty proof
How it's built.
What leaves the box. What doesn't.
Every other page on this site makes a sovereignty claim. This is the page that proves it. CyberCLI is a single binary that runs entirely inside your network — no daemon, no agent fleet, no control plane we operate. Below is the whole data path, the complete list of what can ever cross your boundary, and how the audit chain, credentials, and licensing actually work.
The data path, end to end.
Signals flow left to right. Everything inside the dashed boundary runs on hardware you control — air-gappable if you run the Local lane.
▢ Your network · one binary · no control plane we operate
Stage 1
Sources
Wazuh, firewalls, DNS, honeypots, cloud APIs you connect
→
Stage 2
Connectors
Normalize each source into one event substrate
→
Stage 3
Engine
Detect · correlate across sources · drive the CYCON dial
→
Stage 4
The Guild
Local AI roles triage, verify, sequence, write the case
→
Stage 5
Delivery
Your channels — Slack, email, webhook, dashboard
⛓ Every stage writes to the hash-chained audit log. The dashboard is a read view over engine truth — it never invents state.
Human-first. AI accelerates, never gates.
Other SOC tools queue alerts behind their AI. If the AI is slow, your operator waits — and the dashboard sits stuck at the elevated posture for hours after the threat passed. CyberCLI flips that: the operator is the highest-trust authority on the box, and a human verdict overrules AI math the moment it lands.
Ignore
"This is benign — stop counting it."
One click. The signal drops out of CYCON math immediately. A matching suppression rule auto-fires so the same pattern won't re-elevate. The raw archive still has the line for forensics.
Monitor
"Real — keep watching."
The signal stays in your view + in CYCON math, but no escalation. Useful for "I see it, I'm aware, no Case needed yet." No AI tokens burned past the initial triage.
Investigate
"Real — work it now."
Opens a Case, locks the signal's CYCON contribution until the case closes. The Trust Ladder takes over from here — the operator can authorize action on the case the moment they decide.
The cost-moat play
Every Ignore / Monitor / Investigate writes a TriageDecision row with actor=operator, trust_level_used=4. The v1.5 local Warden trains on those rows — your operator's calibration becomes your model's calibration. No vendor sees the labels. The longer you run, the more your local AI matches how YOU read the threat picture.
Backpressure and fairness — N connectors, no head-of-line block.
Most SOCs run a single shared ingest queue. A chatty Suricata sensor under a port scan can bury a Wazuh auth alert for hours. CyberCLI is built so a noisy connector saturates its own queue (and sheds bounded to dead-letter) — never starves another connector's path.
| Stage | Bound | When it saturates |
| Per-connector queue | 10K frames each | Newest frame sheds to dead-letter (Vector raw archive still has it). Other connector queues unaffected. Round-robin drain across connectors guarantees fairness. |
| Warden admission gate | 3 in-flight (Pro) | New arrivals route to passthrough lane immediately — no 14-min queue join. The signal still lands in your dashboard at raw severity; only the AI narrative is skipped. |
| Herald severity floor | high+ default | Skips the layman-narrative pass on medium events. Warden's structured digest still runs. Operators with AI budget can lower via CYBERCLI_HERALD_MIN_SEVERITY. |
| Cgroup memory ceiling | 3G / 4G | Kernel throttles past MemoryHigh; OOM-kills + clean restart in ~5s past MemoryMax. StartLimitBurst=3 surfaces silent failures instead of hiding restart loops. |
Live state: GET /v1/system/ingest-health returns per-connector queue depth, drop counts, Warden bypass count, and a derived pressure badge (ok · throttled · critical · failed). The dashboard health pill reads this directly.
What can ever leave your network.
The honest version. Two things never leave; the rest only leave because you wired them, to destinations you own.
| Data | Crosses your boundary? | To where |
| Your logs & events | Never | Never. Parsed, scored, and stored on your box. |
| Your data — logs, events, tools, config | Never | Never. None of it leaves your box. Zero usage telemetry, zero diagnostics, zero phone-home of your SOC. |
| License check to CyberCLI | Only if you connect it | A periodic signed check — your license id, a nonce, a timestamp. Nothing about your data or usage. It's how renewals and tier upgrades reach the box automatically. |
| Vendor cloud APIs (Pro) | Only if you connect it | Outbound read only, and only for the Pro connectors you choose to connect (M365, Okta, EDR…). Your call. |
| Frontier AI (optional) | Only if you connect it | Off by default. Only if you bring your own key — then it goes to your provider on your bill, never through us. |
| Operator notifications | Only if you connect it | To the channels you configure (Slack, email, webhook). You own the destinations. |
| License check | Only if you connect it | A periodic signed check, offline-capable with a grace window. No usage data attached. |
"No CyberCLI cloud" means exactly this: we operate nothing your data passes through. Connecting a Pro cloud connector is your decision and an outbound read to that vendor — not a route through us.
License heartbeat — exactly what crosses the wire.
The one outbound call CyberCLI ever makes on its own. Optional, monthly, soft. Sends a license id and a random nonce. Nothing else. Receives back a refreshed license JWS if your subscription state changed since the last check. If the call fails, your install keeps running on the token it has until it expires. You can turn it off entirely.
Outbound payload
What your box sends
POST https://cybercli.com/api/license/heartbeat
Content-Type: application/jose+json
{
"alg": "EdDSA",
"kid": "<your license id>",
"payload": {
"license_id": "lic_a4b9...",
"nonce": "<32 bytes random>",
"ts": "<UTC ISO timestamp>"
},
"signature": "<EdDSA over payload>"
}
That's the whole request. License id + nonce + timestamp, signed with the license's own private key (which never leaves the box). The signature proves you have the license; the nonce stops replay. No event count, no endpoint count, no host names, no IPs, no installed-version, no anything else.
Explicitly NOT sent
What never crosses
- ✗ Your alerts, events, or any security data
- ✗ Endpoint inventory or count
- ✗ Connector configuration or list of enabled connectors
- ✗ Hostnames, IPs, usernames, file paths
- ✗ Installed CyberCLI version or feature usage
- ✗ Diagnostic logs, crash reports, telemetry
- ✗ Geolocation or device fingerprint
We see your license id. We know you exist as a paying customer. That is the entirety of what the heartbeat reveals.
Frequency
Once per month
Randomized within a 24-hour window so we don't synchronously fingerprint operator wake patterns. No retry-on-failure storm.
Failure mode
Soft — local install keeps running
If we're unreachable, your network is down, or you walked the box into a Faraday cage, your CyberCLI continues to operate on its existing JWS until expires_at. No countdown, no nag, no degraded mode.
Off-switch
license_heartbeat = "off" in $CYBERCLI_CONFIG_DIR/config.toml
Trade: no auto-pickup of subscription changes (renewal, tier upgrade). Re-download JWS manually from your account portal and cybercli license install <path> whenever you want to refresh. Standard air-gap pattern; a dedicated cybercli license heartbeat off subcommand ships in v1.x.
The contract
We do not now and will not later add anything else to the heartbeat payload. Adding a new field is a breaking change to the contract on this page — it ships as a major version bump, a public diff, and an opt-in toggle. Any usage telemetry would be a separate, explicitly named feature you turn on. The default install never sends it.
Three AI lanes. You pick the trade.
The Guild's reasoning runs in one of three lanes, set per deployment. Sovereignty and cost move together; you choose where to sit.
Ollama on your hardware, auto-detected. Abliterated open models with no provider guardrails — the SOC reasons about real attacker tradecraft without a content filter refusing. Fully sovereign: nothing leaves the box.
Default lane. Free tier runs here.
Frontier Your key · your bill Bring your own Claude / GPT / Gemini key for the hardest triage. The request goes straight from your box to your provider — CyberCLI is never in the path and never sees your key beyond the local vault.
Opt-in. BYOK, off by default.
Hybrid ~80% cheaper than all-frontier Local models do the high-volume triage; only the ambiguous cases escalate to a frontier model. Best cost-to-quality for teams that want frontier judgment without a frontier-sized bill.
Recommended for most paid deployments.
Per-lane egress
"Zero telemetry" + "I'm using Sonnet" both true — here's the line.
Read row by row | Lane | Case payload to a frontier provider | Telemetry to CyberCLI | License heartbeat (1×/mo) |
| Local | Never | Never | Optional · license id + nonce only |
| Hybrid | Only ambiguous cases · routed straight to your provider, on your key | Never | Optional · same payload as Local |
| Frontier | Every case · routed straight to your provider, on your key | Never | Optional · same payload as Local |
The contradiction isn't a contradiction. Marketing "zero telemetry" means CyberCLI the company never sees your data. In Hybrid + Frontier lanes, individual case payloads leave your box to Anthropic / OpenAI / Google on your own API key, billed to you, governed by their TOS — never proxied through us, never logged on our side, never trained on. If that distinction matters to your auditor, stay in Local. If you're willing to trade some sovereignty for frontier judgment on the hard cases, Hybrid is what most paid deployments pick.
The audit chain & how secrets are held.
Sovereignty is only real if you can prove what happened and trust where your keys live. These hold regardless of which AI lane or Trust Level you run.
Guarantee
Hash-chained audit
Every action — proposed, approved, executed, rolled back — appends a row to a hash-linked log. Change any row and the chain root changes. You can prove what happened to a forensic investigator without trusting CyberCLI.
Guarantee
Vault-scoped credentials
Connector secrets live in a local vault, scoped per connector, never written to logs and never transmitted to us. A compromised connector can't read another's keys.
Guarantee
Replayable
The chain is append-only and replayable: re-run the decision history against a case and get the same result. No hidden state, no silent mutation.
Guarantee
Per-connector isolation
Every audit row records which connector emitted the signal and which executed any action — including community connectors. Forensic isolation is a property of the chain, not the dashboard.
The full leash — eight calibrated levels of AI autonomy per action — lives on the Trust page.
Proof artifact
A real audit row, hash-chained to its predecessor.
src/cybercli/audit/entry.py
Sample entry (AuditEntry · schema 1.0.0)
{
"schema_version": "1.0.0",
"seq": 41827,
"prev_hash": "9b1e3a…c712",
"entry_hash": "f4d9c0…2a83",
"decision_id": "dec_01HX9...",
"decision_packet_ref": "case://2026-05-31/117/decision.json",
"idempotency_key": "isolate_host:srv-id-01:dec_01HX9",
"initiator": {
"type": "ai",
"agent_role": "warden",
"model_route": "local"
},
"action": {
"type": "triage",
"action_template_id": "warden.triage.v1",
"scope": "single",
"parameters": {"signal_id": "sig_01HX9", "severity": "high"}
},
"outcome": "approved_by_human",
"trust_level": 3,
"cycon": 3,
"ts": "2026-05-31T14:28:11.412Z"
} entry_hash = sha256(canonical_json(this row with entry_hash blanked)). The next row's prev_hash equals this row's entry_hash. Genesis = 64 zeros.
Verify it yourself
# the chain lives at $CYBERCLI_DATA_DIR/audit.db.
# Three ways to verify:
#
# 1. CLI walker (read-only, exits 0/1/2):
# cybercli audit verify
# cybercli audit verify --from 1 --to $(cybercli audit head)
#
# 2. Dashboard Audit tab: live tail +
# row-level entry_hash recompute on view.
#
# 3. Roll your own — every entry's payload is
# canonical JSON; sha256 it (with entry_hash
# blanked) and compare. We publish the
# canonicalization spec on this page.
What this proves
- · Every AI decision is replayable. The chain is the event-of-record. dashboards, cases, connector state are projections rebuilt from it.
- · Operator approvals are first-class.
"outcome": "approved_by_human" + initiator.type always identify who acted. - · Tamper detection is immediate. Field-level changes break
entry_hash; row deletes break the next row's prev_hash. - · You can verify the chain yourself.
cybercli check injects a canned scenario through the live engine, watches CYCON elevate, asserts the AuthorityBridge caps over-ceiling actions, confirms no test event woke a real channel, and re-verifies the chain across the session. Generates a sharable check.html receipt — no marketing trust required.
Verify it yourself, end-to-end
cybercli check — engine smoke test, ~3 seconds.
Injects a canned scenario through the live pipeline, walks six engine layers, and prints PASS/FAIL with the audit-row range for each. Every test signal is flagged is_test=True so the AuthorityBridge refuses real connector actions and the DeliveryPolicy returns an empty plan (no Slack/Pushover/PagerDuty fires). The audit-chain rows ARE written — those are your verifiable receipts.
$ cybercli check
CyberCLI System Check · 2026-06-15T14:22:11Z
L0 Beacons (CYCON elevation) ✓ PASS 1.3s CYCON 3 → 2 (5 audit rows · wazuh.suspicious_login)
L1 DigestPipeline routing ✓ PASS 0.0s warden (triage), herald (notify) · tier=pro
L2 AI provider lane ⚠ WARN 0.0s no AI provider configured — open the Dashboard's AI Engine page
L3 AuthorityBridge gate ✓ PASS 0.1s 2/2 packets gated correctly · ceiling=L5 · above-ceiling capped 7→5
L4 Delivery suppression ✓ PASS 0.0s 25/25 plan() returned [] (is_test=True)
L5 Audit chain verify ✓ PASS 0.3s 18 rows, all hashes match
━━━ PASS WITH WARNINGS ━━━
18 test audit rows written. Run `cybercli audit verify --from 41828` to re-verify.
(Free-tier first install shown above — L2 WARNs because no AI provider lane
is selected yet. Pro buyers with Ollama or a frontier key see ✓ PASS.)
For sharing — MSP commissioning artifact, CISO follow-up, or a friend confirming the install works — generate the self-contained HTML report: cybercli check --report html -o check.html. Single file, no JS, no external assets.
What this doesn't claim · The chain proves nothing was tampered without the operator with root knowing. It does not prove what a root attacker on the box did — root can rewrite the whole chain from genesis forward and recompute hashes. That's a property of every on-box audit log, including Splunk-on-prem, Wazuh's audit DB, and the kernel auditd. Defenses for that class of threat live one layer up: file integrity monitoring (which CyberCLI ships against itself), off-box log shipping (configure the audit lake to also write to an external WORM bucket — design partner ask), and the hash chain root being committed periodically to an external anchor (planned for v1.x; will publish the cadence + endpoint on this page when shipped). We name what the chain does and doesn't do so the threat model isn't a marketing trick.
Licensing & endpoints, plainly.
How endpoints count
An endpoint is a distinct host or device emitting telemetry. Free covers 10; Founder Pro / Pro cover 50; Business 51–500. You see your current count in the dashboard.
Offline-capable
The license verifies with a periodic signed check and keeps working through a grace window if the box is air-gapped. No always-on connection required.
Account follows you
Buy now, activate later — the license is tied to your account, not a machine. Move it between boxes; re-activation is a sign-in away.
What works today vs what's planned.
We ship breadth first, then depth on the connectors design partners actually run. Here's the honest line as of this build.
25
OSS connectors onboard today — one cybercli onboard <id> each.
4
Pro connectors with bundled guided onboarding today (M365, UniFi).
3
Pro connectors on the roadmap (Workspace, Okta, CrowdStrike, SentinelOne, Avanan) — wired in at v1.x.
70+
On the roadmap — intentional scope, not date commitments.
See the list → "Why not just run Wazuh?"
Wazuh — and Suricata, and your firewall — see. They produce alerts. CyberCLI is the layer that decides and acts: it correlates every source into one posture (CYCON), triages and verifies with the Guild, and executes containment only inside the leash you set (the Trust Ladder) — with a receipt for every step. Keep your detectors. CyberCLI orchestrates them into a SOC instead of a wall of alerts.
Your box. Your keys. Your audit chain.
That's the architecture.
We fight for the users.