Sati models
Nine models that Sati, the investigation agent, runs on — each named for one of the nine forms of Navadurga and given the job that fits it. Every model is built here and trained and tested on real public data, in the cloud.
Models
9
one per stage of the loop
Trained
9 of 9
each on real public data
Katyayani, unseen systems
88.4%
top-1 root cause · baseline 57.0%
Real incidents tested
735
RCAEval · pinned afeacb11
Where each model sits in the loop
Observe
Remember
Understand
Explain
Act
Verify
Decide
- 1Observetrained
Metric anomaly detection — learns what normal looks like for every series
Shailaputri — the steady foundation
NABSMDRP-60
Results ↓Try it on a held-out server →
On Kaggle:dataset ↗notebook ↗model ↗
- 2Remembertrained
Embeddings for memory — maps observed behaviour to the known technique it resembles
Brahmacharini — discipline and study
MITRE ATT&CK proceduresRP-64
On Kaggle:dataset ↗notebook ↗model ↗
- 3Observetrained
Network intrusion alerting — flags attack traffic by family
Chandraghanta — the bell that warns
UNSW-NB15CIC-IDS2017RP-61
Results ↓Try it on a held-out flow →
On Kaggle:dataset ↗notebook ↗model ↗
- 4Explaintrained
Writes the structured hypothesis and explanation — Sati's own language model
Kushmanda — the creator
MITRE ATT&CK, CAPEC, CWECISA KEVNVD CVE descriptionsRP-65
Results ↓Not served publicly yet
- 5Acttrained
Proposes the protective response — Dharma still authorises it
Skandamata — the protecting mother
MITRE ATT&CK mitigationsRP-72
On Kaggle:dataset ↗notebook ↗model ↗
- 6Understandtrained
Root-cause ranking — names the service at fault and the fault type, citing the metric series
Katyayani — the warrior who finds the adversary
RCAEvalRP-58
Top-1 root cause on systems never seen in training: 88.4% vs 57.0% without learning.
Results ↓Try it on a held-out incident →
On Kaggle:dataset ↗notebook ↗model ↗
- 7Observetrained
Log anomaly detection — what hides in the noise
Kalaratri — the night that dispels darkness
LogHub HDFSLogHub BGLRP-62
Results ↓Try it on a held-out session →
On Kaggle:dataset ↗notebook ↗model ↗
- 8Verifytrained
Verification — confirms a system has truly returned to normal after an action
Mahagauri — calm restored
SMD incidentsRP-71
Results ↓Try it on a held-out server →
On Kaggle:dataset ↗notebook ↗model ↗
- 9Decidetrained
Fusion — combines several detectors into one calibrated verdict
Siddhidatri — completion
SMD: Shailaputri + baselines, stacked out of foldRP-73
Results ↓Try it on a held-out server →
On Kaggle:dataset ↗notebook ↗model ↗
Shailaputri — anomalies in real metric series
Trained on 47 real series from NAB, each family of series held out in turn, and scored online by the same harness as the four statistical detectors on exactly the same series. F1 is read together with false alarms per 1000 points, never alone.
F1 on a family it never saw
- realAWSCloudwatchfamily never seen in training · best statistical: seasonal-naiven = 1740.4%33.4%
- realAdExchangefamily never seen in training · best statistical: seasonal-naiven = 635.6%29.5%
- realKnownCausefamily never seen in training · best statistical: seasonal-naiven = 744.0%30.3%
- realTrafficfamily never seen in training · best statistical: seasonal-naiven = 749.6%54.1%
- realTweetsfamily never seen in training · best statistical: seasonal-naiven = 1042.5%25.9%
Episode recall and point precision combined; the threshold was chosen on training families only.
Mean across held-out families
| Detector | F1 | Recall | False alarms / 1000 | Lead |
|---|---|---|---|---|
| Shailaputri | 0.424 | 0.739 | 24.1 | 179.3 |
| robust-z | 0.325 | 0.911 | 78.7 | 234.1 |
| ewma | 0.261 | 0.900 | 14.2 | 229.0 |
| Seasonal naive | 0.346 | 0.930 | 74.7 | 240.0 |
| Seasonal robust z-score | 0.312 | 0.761 | 74.7 | 241.3 |
NAB’s labels are windows, and Wu & Keogh (2021) show several NAB series are trivial or mislabelled; these numbers inherit those limits.
Brahmacharini — from behaviour to the technique it is
Each test query is a real description of how an attacker behaved, written about one of 115 groups, malware families or tools never seen in training. The model ranks all 706 ATT&CK techniques; the same queries go to BM25 and to the embedder Smriti uses today.
Held-out behaviour descriptions
| Retriever | Recall@1 | Recall@5 | Recall@10 | MRR |
|---|---|---|---|---|
| Brahmacharini | 0.614 | 0.802 | 0.854 | 0.699 |
| BM25 | 0.268 | 0.478 | 0.580 | 0.372 |
| TF-IDF + logistic regression | 0.646 | 0.832 | 0.869 | 0.730 |
| Brahmacharini + TF-IDF classifier, fused | 0.673 | 0.859 | 0.896 | 0.758 |
| Hashing embedder (Smriti's previous retriever) | 0.120 | 0.226 | 0.283 | 0.177 |
| Brahmacharini, as served | 0.556 | 0.735 | 0.797 | 0.638 |
| Brahmacharini as served + TF-IDF classifier, fused | 0.650 | 0.847 | 0.887 | 0.738 |
A plain TF-IDF classifier beats Brahmacharini on its own (Recall@1 0.646 against 0.614). Combined, with the mix chosen on the validation sources and never on the test, the two reach 0.673, better than either. The classifier can only name techniques it saw in training and cannot retrieve passages, so Sati AI still grounds its answers with Brahmacharini.
Chandraghanta — attack traffic in real labelled flows
Two lab datasets of labelled network flows. On CIC-IDS2017 the model trains on Monday to Wednesday and is tested on Thursday and Friday, so every attack family it is tested on is one it has never seen — and the random-split row shows what the usual evaluation would have claimed instead.
Try it
Loading the examples…
UNSW-NB15: 82,332 held-out flows
| Detector | Precision | Recall | F1 | False-positive rate |
|---|---|---|---|---|
| Chandraghanta, best-F1 threshold | 0.821 | 0.988 | 0.897 | 0.2634 |
| Chandraghanta, best-F1 threshold, without TTL fields | 0.827 | 0.981 | 0.897 | 0.2522 |
| Chandraghanta | 0.952 | 0.926 | 0.939 | 0.0578 |
| PCA, trained on benign flows | 0.581 | 0.993 | 0.733 | 0.8782 |
| Attack family | Flows | Seen in training | Chandraghanta, best-F1 threshold recall | Chandraghanta, best-F1 threshold, without TTL fields recall | Chandraghanta recall | pca (benign-only) recall |
|---|---|---|---|---|---|---|
| Analysis | 677 | yes | 0.975 | 0.972 | 0.916 | 0.994 |
| Backdoor | 583 | yes | 1.000 | 1.000 | 0.990 | 0.997 |
| DoS | 4,089 | yes | 0.999 | 0.997 | 0.987 | 0.988 |
| Exploits | 11,132 | yes | 0.996 | 0.992 | 0.973 | 0.995 |
| Fuzzers | 6,062 | yes | 0.919 | 0.881 | 0.531 | 0.979 |
| Generic | 18,871 | yes | 1.000 | 1.000 | 0.999 | 1.000 |
| Reconnaissance | 3,496 | yes | 0.999 | 0.997 | 0.990 | 0.984 |
| Shellcode | 378 | yes | 0.992 | 0.992 | 0.921 | 0.989 |
| Worms | 44 | yes | 1.000 | 1.000 | 0.977 | 1.000 |
Research use only, not for commercial use (CC BY-NC-SA 4.0): trained on research-use-only data; owner decision, 27 Oct 2026. UNSW-NB15 and CIC-IDS2017 are research-use only.
CIC-IDS2017: 1,162,213 held-out flows
| Detector | Precision | Recall | F1 | False-positive rate |
|---|---|---|---|---|
| Chandraghanta, best-F1 threshold | 0.989 | 0.294 | 0.453 | 0.0011 |
| Chandraghanta | 0.927 | 0.448 | 0.604 | 0.0118 |
| PCA, trained on benign flows | 0.440 | 0.135 | 0.207 | 0.0575 |
| random split (reference only) | 0.998 | 0.996 | 0.997 | 0.0005 |
| Attack family | Flows | Seen in training | Chandraghanta, best-F1 threshold recall | Chandraghanta recall | pca (benign-only) recall |
|---|---|---|---|---|---|
| Bot | 1,966 | no | 0.000 | 0.000 | 0.028 |
| DDoS | 128,027 | no | 0.636 | 0.975 | 0.215 |
| Infiltration | 36 | no | 0.000 | 0.000 | 0.722 |
| PortScan | 158,930 | no | 0.013 | 0.020 | 0.074 |
| Web Attack - Brute Force | 1,507 | no | 0.908 | 1.000 | 0.000 |
| Web Attack - Sql Injection | 21 | no | 1.000 | 1.000 | 0.000 |
| Web Attack - XSS | 652 | no | 0.974 | 1.000 | 0.000 |
Research use only, not for commercial use (CC BY-NC-SA 4.0): trained on research-use-only data; owner decision, 27 Oct 2026. UNSW-NB15 and CIC-IDS2017 are research-use only.
Kushmanda — Sati's own language model
16.9M parameters, trained from scratch on 32.2M tokens of security text. It answers from the passages it is given, cites one, and says so when none holds the answer — tested on 1,200 questions about techniques, CVEs and weaknesses it never saw in tuning. It writes answers well and copies exact IDs badly, so IDs are checked against the citation. A model twice its size, on a larger corpus, copies IDs better but declines less often when no passage holds the answer, and declining is what Sati depends on, so the smaller one is served.
Held-out questions
| Question | Measure | Kushmanda | Kushmanda, 34M | Word overlap | Chance |
|---|---|---|---|---|---|
| Define a technique, CWE or CVE | rouge l | 0.785 | 0.827 | 0.683 | 0.321 |
| What to do about a CVE | rouge l | 0.938 | 0.896 | 0.361 | 0.258 |
| Mitigations for a technique | rouge l | 0.998 | 0.946 | 0.613 | 0.264 |
| No passage holds the answer | abstained | 0.543 | 0.417 | 0.000 | 0.000 |
| Technique ID by name | exact match | 0.528 | 0.717 | 0.962 | 0.396 |
| Behaviour → technique | exact match | 0.423 | 0.567 | 0.690 | 0.305 |
Can a simulator teach root cause? Not yet.
The same ranker, trained only on 50,000 synthetic incidents, scores nearly perfectly on synthetic tests — and below a no-learning baseline on real fault-injection cases. Katyayani, trained on real data, reaches 88.4% on a system it never saw. This is why Sati's root-cause model learns from real incidents.
Zero-shot on real RCAEval cases
| System | Ranker | RCA@1 | RCA@3 |
|---|---|---|---|
| Online Boutique | Trained on simulator | 0.490 | 0.657 |
| Online Boutique | loudest service | 0.608 | 0.914 |
| Online Boutique | earliest anomaly | 0.098 | 0.380 |
| Sock Shop | Trained on simulator | 0.265 | 0.576 |
| Sock Shop | loudest service | 0.747 | 0.967 |
| Sock Shop | earliest anomaly | 0.139 | 0.335 |
Skandamata — the defences for what was seen
Given a behaviour, rank ATT&CK's 44 mitigations. Tested on 1,269 behaviours written about 115 attackers never seen in training; the right answers are the ones ATT&CK itself links. It recommends — Dharma decides.
Held-out behaviours
| Recommender | Hit@1 | Recall@5 | Precision@5 | MRR | nDCG@10 |
|---|---|---|---|---|---|
| Skandamata | 0.787 | 0.824 | 0.436 | 0.849 | 0.839 |
| Popularity (the same list for everyone) | 0.232 | 0.398 | 0.206 | 0.443 | 0.433 |
| BM25, behaviour to mitigation text | 0.195 | 0.259 | 0.128 | 0.344 | 0.276 |
| BM25, behaviour to technique to its mitigations | 0.537 | 0.646 | 0.335 | 0.659 | 0.652 |
| TF-IDF + logistic regression | 0.827 | 0.873 | 0.464 | 0.880 | 0.881 |
| Skandamata + TF-IDF classifier, fused | 0.822 | 0.882 | 0.465 | 0.877 | 0.880 |
| TF-IDF + logistic regression, pruned as served | 0.780 | 0.842 | 0.450 | 0.850 | 0.850 |
A plain TF-IDF classifier beats Skandamata here (Hit@1 0.827 against 0.787). When Brahmacharini finds the technique, Sati AI shows only the mitigations ATT&CK links to it, in Skandamata's order, so its first pick is always one ATT&CK recommends.
Mori can communicate using HTTP over IPv4 or IPv6 depending on a flag set.
ATT&CK says: Filter Network Traffic, Network Intrusion Prevention
Skandamata: Network Intrusion Prevention, Filter Network Traffic, Network Segmentation, Disable or Remove Feature or Program, Data Loss Prevention
Qilin can employ several code obfuscation methods, including renaming functions, altering control flows, and encrypting strings.
ATT&CK says: Antivirus/Antimalware, Behavior Prevention on Endpoint
Skandamata: Behavior Prevention on Endpoint, Antivirus/Antimalware, User Training, Audit, Execution Prevention
GoldMax has used scheduled tasks to maintain persistence.
ATT&CK says: Audit, Operating System Configuration, Privileged Account Management, User Account Management
Skandamata: User Account Management, Audit, Operating System Configuration, Privileged Account Management, Multi-factor Authentication
Try Shailaputri, Siddhidatri and Mahagauri
The three models that watch servers, run live on incidents from machines none of them trained on.
Try it
Loading the incidents…
Mahagauri — is it really over?
327 real server incidents. Once a minute, from onset until 60 minutes after the end, the verifier says whether the server has recovered, and declares it over once recovery has held long enough. The error that matters is a premature all-clear. It now stays within its 5% budget on servers it never saw, but it confirms few recoveries: most incidents still go back to a person.
Held-out machine groups
| Verifier | Premature all-clear | Confirmed | Left to a human |
|---|---|---|---|
| Mahagauri | 0.021 | 0.095 | 0.884 |
| Mahagauri + trajectory features | 0.025 | 0.110 | 0.866 |
| back within 3σ | 0.165 | 0.248 | 0.587 |
| fixed timer | 0.480 | 0.520 | 0.000 |
Siddhidatri — one verdict from several detectors
28 real servers (SMD (Server Machine Dataset)). Siddhidatri stacks Shailaputri and two statistical detectors, trained out of fold, and each machine group is held out in turn. It matches Shailaputri alone on F1 but raises far more false alarms, so Shailaputri's alarm stays the one Sati acts on and the fusion is advisory.
Mean over held-out machine groups
| Detector | Precision | Episode recall | F1 | False alarms / 1000 | Lead (min) |
|---|---|---|---|---|---|
| Siddhidatri | 0.558 | 0.774 | 0.537 | 47.8 | 98 |
| Shailaputri alone | 0.642 | 0.597 | 0.539 | 3.8 | 122 |
| Robust z-score, largest across metrics | 0.168 | 0.778 | 0.253 | 20.4 | 98 |
| PCA | 0.448 | 0.724 | 0.416 | 84.5 | 99 |
Lead is how many minutes before an anomaly's end the first flag came: higher is earlier.
Kalaratri — anomalies hidden in real logs
Two real logs, each split by time — trained on the earliest part, tested on the latest — against two classic detectors on exactly the same test data. HDFS is the easy benchmark; BGL, a supercomputer's log over seven months, is the hard one.
Try it
Loading the examples…
LogHub HDFS_v1: 115,013 held-out HDFS blocks
| Detector | Precision | Recall | F1 | False-positive rate |
|---|---|---|---|---|
| Kalaratri | 1.000 | 0.934 | 0.966 | 0.0000 |
| Kalaratri + novelty features | 1.000 | 0.939 | 0.968 | 0.0000 |
| PCA (Xu et al. 2009) | 0.766 | 0.996 | 0.866 | 0.0045 |
| unseen-template rule | 1.000 | 0.432 | 0.604 | 0.0000 |
Research use only, not for commercial use (CC BY-NC-SA 4.0): trained on research-use-only data; owner decision, 27 Oct 2026. LogHub is research-use only.
LogHub BGL: 9,427 held-out windows of 100 lines
| Detector | Precision | Recall | F1 | False-positive rate |
|---|---|---|---|---|
| Kalaratri | 0.513 | 0.271 | 0.355 | 0.0244 |
| Kalaratri + novelty features | 0.778 | 0.220 | 0.343 | 0.0059 |
| PCA (Xu et al. 2009) | 0.092 | 0.829 | 0.166 | 0.7716 |
| unseen-template rule | 0.098 | 1.000 | 0.179 | 0.8696 |
Research use only, not for commercial use (CC BY-NC-SA 4.0): trained on research-use-only data; owner decision, 27 Oct 2026. LogHub is research-use only.
Katyayani — root cause, on real failures
Trained and tested on 735 real fault-injection incidents from RCAEval across three microservice systems. Each row holds something out of training entirely, and both bars are scored on exactly the same incidents. Hover a row for its interval.
Try it
Loading the incidents…
A system it has never seen
- Online Boutiquenever seen in training · 430 training incidentsn = 21587.9%57.2%
- Sock Shopnever seen in training · 430 training incidentsn = 21594.9%76.7%
- Train Ticketnever seen in training · 430 training incidentsn = 21582.3%37.2%
Share of incidents where the true root-cause service is ranked first.
A kind of failure it has never seen
- cpufault type never seen in trainingn = 12096.7%58.3%
- delayfault type never seen in trainingn = 12079.2%54.2%
- diskfault type never seen in trainingn = 120100.0%64.2%
- lossfault type never seen in trainingn = 12066.7%36.7%
- memfault type never seen in trainingn = 120100.0%68.3%
- socketfault type never seen in trainingn = 45100.0%66.7%
- code-level faults (RE3)a whole suite never trained onn = 9080.0%48.9%
Each fault type held out of training in turn; RE3 never trained on at all.
Pooled results
| Held out | Model | Top-1 | Top-3 | Avg@5 |
|---|---|---|---|---|
| leave one system out | Katyayani | 88.4% | 96.7% | 95.3% |
| leave one system out | baseline | 57.0% | 87.1% | 81.3% |
| held out fault | Katyayani | 89.3% | 97.0% | 95.9% |
| held out fault | baseline | 57.0% | 87.1% | 81.3% |
| held out repetition | Katyayani | 91.5% | 98.2% | 97.1% |
| held out repetition | baseline | 61.2% | 90.3% | 84.6% |
| unseen system, without series count | Katyayani (ablated) | 88.7% | 97.0% | 95.4% |
The ablated row removes a feature that could let the model guess the kind of service rather than read what changed. It scores the same — the model is reading the metrics.
What a ranking cites
Every ranking names the metric series behind it, so the answer can be checked — the same rule as for any hypothesis Sati makes. Root cause here: adservice.
- shift_cpufromadservice_cpu+3.5509
- shift_anyfromadservice_cpu+2.444
- rank_shift_anyfromadservice_cpu+1.7611
The incident’s injection time is given to the model, which is RCAEval’s standard setting; a deployed system has to detect onset itself. Model sha256 5cff5f7588cbf46f…. These models were designed, written and trained by an AI assistant under the owner’s direction. Evaluation
