Extensible AI-powered diagnostics for DevOps & SRE — analyze logs and infrastructure signals using pluggable diagnostic packs and typed probabilistic decisions powered by Jev.
jev-ops is an extensible CLI and diagnostic framework designed for DevOps, SRE, and platform engineers. It ingests unstructured operational state (system logs, journal entries, Kubernetes events, database telemetry, command outputs) and evaluates them against declarative diagnostic packs to return structured, typed decisions.
Unlike conversational LLMs that output verbose prose requiring fragile regex parsing, jev-ops is built on the TypeSafe System One model philosophy: unstructured state in, typed probabilistic decisions out.
Linux / Kubernetes / Logs / Monitoring
↓
jev-ops
↓
[Diagnostic Pack]
↓
[TypeSafe Jev Inference]
↓
┌──────────┬──────────┬──────────┬──────────┐
│ IGNORE │ NOTIFY │ REPAIR │ ESCALATE │
└──────────┴──────────┴──────────┴──────────┘
↓
Bash / SRE Automation
[!NOTE] TypeSafe Jev Live Integration:
jev-opssupports both the deterministic offlinemockprovider and live inference via the TypeSafe System One API (POST https://api.typesafe.ai/v1/systemone).Simply export your API key:
export TYPESAFE_API_KEY="ts_live_..."
jev-opsautomatically detects your key and connects to thejev-latestmodel. Without a key,analyzeexits with code5rather than guessing; pass--provider mockexplicitly for offline, keyword-based output (useful for demos and tests, never for automation).
The Rust core binary contains zero technology-specific diagnostic logic. It knows nothing about Linux, Docker, Kubernetes, MySQL, or Magento.
Domain vocabulary, problem categories, rubrics, and diagnostic instructions are defined entirely inside externally loadable diagnostic packs (pack.yaml). Anyone can add support for proprietary internal services without modifying or recompiling jev-ops.
In jev-ops, diagnostic packs are strictly declarative YAML manifests.
exec, system)In accordance with TypeSafe AI’s System One architecture, jev-ops evaluates atomic, well-scoped questions against system state:
| Primitive | Purpose | Returns |
|---|---|---|
choice |
Classify into discrete domain categories | Selected option, confidence score (0.0–1.0), and probabilities distribution |
score |
Score system state on a rubric of 2–10 described levels (e.g. 0 to 5) | Numerical score in the pack’s range, confidence, and probabilities distribution |
boolean (Noul) |
Binary condition check (“Is attention required?”) | yes / no, confidence score (0.0–1.0) |
Install pure standalone binaries directly with curl:
# Linux (x86_64 glibc)
sudo curl -fsSL https://github.com/nemke82/jev-ops/releases/download/v2026.09.19/jev-ops-linux-x86_64 -o /usr/local/bin/jev-ops
sudo chmod +x /usr/local/bin/jev-ops
# Linux (static musl / Alpine / containers)
sudo curl -fsSL https://github.com/nemke82/jev-ops/releases/download/v2026.09.19/jev-ops-linux-x86_64-musl -o /usr/local/bin/jev-ops
sudo chmod +x /usr/local/bin/jev-ops
# Linux (ARM64 / AWS Graviton)
sudo curl -fsSL https://github.com/nemke82/jev-ops/releases/download/v2026.09.19/jev-ops-linux-arm64 -o /usr/local/bin/jev-ops
sudo chmod +x /usr/local/bin/jev-ops
# macOS (Apple Silicon M1/M2/M3/M4)
sudo curl -fsSL https://github.com/nemke82/jev-ops/releases/download/v2026.09.19/jev-ops-macos-arm64 -o /usr/local/bin/jev-ops
sudo chmod +x /usr/local/bin/jev-ops
# macOS (Intel)
sudo curl -fsSL https://github.com/nemke82/jev-ops/releases/download/v2026.09.19/jev-ops-macos-x86_64 -o /usr/local/bin/jev-ops
sudo chmod +x /usr/local/bin/jev-ops
# Windows (PowerShell)
curl.exe -fsSL https://github.com/nemke82/jev-ops/releases/download/v2026.09.19/jev-ops-windows-x86_64.exe -o jev-ops.exe
Standalone binaries and SHA256 checksums for all platforms are available on GitHub Releases.
git clone https://github.com/nemke82/jev-ops.git
cd jev-ops
cargo build --release
sudo cp target/release/jev-ops /usr/local/bin/
Pipe diagnostic outputs directly into jev-ops:
# Triage recent SSH authentication failures & intrusion spikes
grep -E "Failed|Invalid|error" /var/log/secure | tail -n 100 | jev-ops analyze linux
# Analyze kernel dmesg errors with the linux pack
dmesg -T | grep -E "EXT4|error" | jev-ops analyze linux
# Analyze AWS CloudWatch log streams from ECS Fargate
aws logs tail /aws/ecs/payment-service --since 10m | jev-ops analyze aws-cloudwatch
# Analyze GCP Cloud Run errors from Google Cloud Logging
gcloud logging read "resource.type=cloud_run_revision AND severity>=WARNING" --limit=25 | jev-ops analyze gcp-cloud-ops
# Analyze Azure Monitor alert context
az monitor alert show --id "$ALERT_ID" | jev-ops analyze azure-monitor
# Analyze Kubernetes events or failing pods
kubectl get pods -A | jev-ops analyze kubernetes
--json)Live response from TypeSafe Jev (jev-latest) evaluating 100 authentication failure lines from /var/log/secure:
grep -E "Failed|Invalid|error" /var/log/secure | tail -n 100 | jev-ops analyze linux --json | jq .
Output:
{
"schema_version": "1",
"pack": {
"name": "linux",
"version": "0.1.0"
},
"provider": "typesafe-jev (jev-latest)",
"input": {
"bytes": 10414,
"truncated": false
},
"decisions": {
"category": {
"type": "choice",
"value": "security",
"confidence": 1.0,
"probabilities": {
"application": 0.0,
"cpu": 0.0,
"filesystem": 0.0,
"hardware": 0.0,
"memory": 0.0,
"network": 0.0,
"normal": 0.0,
"security": 1.0,
"unknown": 0.0
}
},
"health": {
"type": "choice",
"value": "degraded",
"confidence": 0.4,
"probabilities": {
"degraded": 0.55,
"healthy": 0.1,
"unhealthy": 0.33,
"unknown": 0.02
}
},
"needs_attention": {
"type": "boolean",
"value": true,
"confidence": 0.83
},
"severity": {
"type": "score",
"value": 2,
"confidence": 0.6,
"probabilities": {
"0": 0.0,
"1": 0.22,
"2": 0.54,
"3": 0.15,
"4": 0.04,
"5": 0.05
}
}
}
}
Surgically extract alert signals in automation scripts with jq:
grep -E "Failed|Invalid" /var/log/secure | tail -n 100 | jev-ops analyze linux --json \
| jq '{attention: .decisions.needs_attention.value, severity: .decisions.severity.value, conf: .decisions.needs_attention.confidence}'
Output:
{
"attention": true,
"severity": 2,
"conf": 0.86
}
$ tail -n 200 /var/log/secure | jev-ops analyze linux
jev-ops analysis
Pack: linux 0.1.0
Provider: typesafe-jev (jev-latest)
Input: 25.7 KB
Category: security 95%
Health: degraded 89%
Attention: yes 92%
Severity: 2/5 88%
--min-confidence)Filter or flag decisions when the model reports uncertainty. Decisions below the threshold are tagged with [LOW CONFIDENCE]:
$ tail -n 200 /var/log/secure | jev-ops analyze linux --min-confidence 0.75
jev-ops analysis
Pack: linux 0.1.0
Provider: typesafe-jev (jev-latest)
Input: 25.7 KB
Category: security 57% [LOW CONFIDENCE]
Health: healthy 57% [LOW CONFIDENCE]
Attention: no 52% [LOW CONFIDENCE]
Severity: 2/5 26% [LOW CONFIDENCE]
Run live inference with TypeSafe’s jev-latest model:
# Via environment variable
export TYPESAFE_API_KEY="ts_live_your_api_key"
cat error.log | jev-ops analyze linux
# Or explicitly via CLI flag
cat error.log | jev-ops analyze linux --provider typesafe --api-key "ts_live_..."
# Custom API endpoint / proxy / model override
export TYPESAFE_API_URL="https://api.typesafe.ai/v1"
export TYPESAFE_MODEL="jev-latest"
jev-ops integrates cleanly with standard monitoring, CI/CD, orchestration, and security tools. Production-ready recipes are located in integrations/:
Pipe service checks and growth metrics into checkmk pack to suppress transient spikes and auto-remediate:
# In /omd/sites/<site>/local/share/check_mk/notifications/jev-ops-filter.sh
DECISION=$(echo "$NOTIFY_SERVICEOUTPUT" | jev-ops analyze checkmk --json)
ACTION=$(echo "$DECISION" | jq -r '.decisions.action.value')
CONFIDENCE=$(echo "$DECISION" | jq -r '.decisions.action.confidence')
if [[ "$ACTION" == "ignore" ]] && jq -e '.decisions.action.confidence > 0.85' <<<"$DECISION" >/dev/null; then
exit 0 # Suppress noise
fi
See integrations/checkmk/checkmk-notification.sh.
Use typed confidence to gate destructive actions in Ansible playbooks:
- name: Safe service restart
ansible.builtin.service:
name: nginx
state: restarted
when:
- jev.decisions.needs_attention.value
- jev.decisions.category.value == 'application'
- (jev.decisions.category.confidence | float) >= 0.95
See integrations/ansible/auto-remediate.yml.
Monitor pod warnings, CrashLoops, and OOMKilled events in real time:
kubectl get events -A --watch-only | ./integrations/k8s/k8s-event-watch.sh
Halt rollouts and trigger automated rollbacks in GitHub Actions or ArgoCD:
- name: Evaluate Canary Health
run: |
DECISION=$(curl -s "https://metrics/canary" | jev-ops analyze ci-canary --json)
if [ "$(echo $DECISION | jq -r .decisions.rollback_now.value)" = "true" ]; then
argocd app rollback payment-service
exit 1
fi
See integrations/github-actions/canary-gate.yml.
Automate ECS task cycling and dispatch rich Slack triage when containers crash:
# In AWS Lambda subscription filter handler
proc = subprocess.run(["jev-ops", "analyze", "aws-cloudwatch", "--json"], input=log_bytes, stdout=subprocess.PIPE)
result = json.loads(proc.stdout)
if result["decisions"]["recommended_action"]["value"] == "ssm_restart" and result["decisions"]["recommended_action"]["confidence"] >= 0.90:
ecs.update_service(cluster="prod", service="checkout", forceNewDeployment=True)
See integrations/aws/cloudwatch-lambda-triage.py.
Triage Azure Common Alert Schema webhooks and auto-remediate AKS and Application Gateway faults:
# In Azure HTTP Webhook receiver
proc = subprocess.run(["jev-ops", "analyze", "azure-monitor", "--json"], input=alert_json, stdout=subprocess.PIPE)
res = json.loads(proc.stdout)
if res["decisions"]["recommended_action"]["value"] == "auto_heal":
subprocess.run(["az", "aks", "nodepool", "scale", "--count", "5", ...])
See integrations/azure/azure-monitor-webhook.py.
Stream Cloud Run OOM events and automatically double memory ceilings:
RAW_LOGS=$(gcloud logging read "resource.type=cloud_run_revision" --limit=25)
RESULT=$(echo "$RAW_LOGS" | jev-ops analyze gcp-cloud-ops --json)
# If OOM confirmed by model:
gcloud run services update checkout-api --memory 1Gi --quiet
See integrations/gcp/cloud-run-triage.sh.
Summarize terraform show -json output and judge it with the terraform-plan pack, blocking destructive drops or IAM and network changes before merge. The gate fails closed: if the plan cannot be parsed or analyzed, it blocks.
terraform show -json tfplan.binary | ./integrations/terraform/plan-triage.sh
See integrations/terraform/plan-triage.sh.
jev-ops ships with 12 standard packs covering cloud platforms, infrastructure layers, and CI/CD:
| Pack | Focus Area | Key Decisions Evaluated |
|---|---|---|
aws-cloudwatch |
AWS ECS, ALB, Lambda, RDS | health, service, root_cause, severity, recommended_action |
azure-monitor |
Azure AKS, App Gateway, CosmosDB | health, resource_type, root_cause, severity, recommended_action |
gcp-cloud-ops |
GCP Cloud Run, GKE, BigQuery | health, service, root_cause, severity, recommended_action |
linux |
Kernel & system logs | health, category (memory/fs/network/sec), severity, needs_attention |
kubernetes |
Pods & cluster events | health, root_cause (crashloop/oom/scheduling), severity, needs_attention |
docker |
Containers & daemons | health, failure_mode (oom_killed/crash_loop/unhealthy_probe), severity |
nginx |
Web proxies & ingresses | health, issue_type (502_504/timeout/ssl/rate_limit), severity |
mysql |
Databases & replicas | health, bottleneck (connections/deadlock/slow_queries/replication), severity |
checkmk |
Alert de-noising | action (ignore/watch/notify/auto_repair/escalate), root_domain, urgency |
ci-canary |
Deployment verification | rollout_action (promote/watch/rollback), error_spike, risk_score |
terraform-plan |
IaC change review | change_risk, blast_radius, destroys_stateful_resource |
queue-service |
Custom reference pack | Demonstrates domain customization without Rust code |
$ jev-ops packs list
AVAILABLE DIAGNOSTIC PACKS:
NAME VERSION DESCRIPTION PATH
────────────────────────────────────────────────────────────────────────────────
example 0.1.0 Generic example diagnostic pack demon... ./packs/example/pack.yaml
kubernetes 0.1.0 Kubernetes pod, event, and cluster di... ./packs/kubernetes/pack.yaml
linux 0.1.0 General Linux diagnostic classificati... ./packs/linux/pack.yaml
$ jev-ops packs show kubernetes
Diagnostic Pack: kubernetes
Version: 0.1.0
Author: jev-ops
Path: ./packs/kubernetes/pack.yaml
Description: Kubernetes pod, event, and cluster diagnostics
Spec Input:
Type: text
Max Bytes: 2097152
Decisions (4 defined):
- health: choice (options: healthy, degraded, unhealthy, unknown)
- root_cause: choice (options: scheduling, image_pull, crashloop, resources, networking, storage, application, unknown)
- needs_attention: boolean (yes/no)
- severity: score (range: 0 to 5)
0: Normal: no errors or anomalies in the signals
1: Informational: notable events with no impact on service
2: Minor: isolated errors or warnings with no user-visible impact
3: Degraded: partial impairment, elevated errors or latency for some users or requests
4: Serious: a major component is failing or most requests are affected; urgent action needed
5: Critical: outage, data loss or corruption risk, or active security compromise
Instructions:
Analyze Kubernetes diagnostic output including pod statuses, events, describe outputs, and logs.
Classify whether the workload is healthy, degraded, or unhealthy.
Identify the most probable root cause from the domain options.
Create a custom diagnostic pack in seconds:
jev-ops packs new my-service --dir ./packs
jev-ops packs validate ./packs/my-service/pack.yaml
Packs are defined in YAML (pack.yaml):
api_version: "jev-ops/v1"
kind: "DiagnosticPack"
metadata:
name: "queue-service"
version: "0.1.0"
description: "Diagnostic pack for queue workers and latency spikes"
author: "SRE Team"
spec:
input:
type: "text"
max_bytes: 1048576 # 1 MiB limit
decisions:
status:
type: "choice"
values:
- healthy
- backlogged
- stuck
- crashed
- unknown
severity:
type: "score"
min: 0
max: 5
levels: # optional: one description per level, min to max
- "No backlog; messages processed as they arrive"
- "Small backlog that clears on its own"
- "Growing backlog; latency noticeable but within SLO"
- "Backlog breaching SLO for some consumers"
- "Most consumers stalled; SLO breached broadly"
- "Processing halted or messages being lost"
page_oncall:
type: "boolean"
instructions: |
Analyze queue worker heartbeat logs and message processing lag.
Determine whether processing is healthy or stuck, and whether the oncall
engineer must be paged immediately.
Pack rules worth knowing:
max_byte fails validation instead of being silently ignored.score may span at most 10 levels (max - min + 1 <= 10), matching the TypeSafe API. If levels is given, it needs exactly one entry per level.instructions are sent to TypeSafe as analysis_guidance alongside the input, so rubric details written there reach the model.jev-ops resolves packs using deterministic search precedence:
--pack-dir <PATH>./packs/~/.config/jev-ops/packs/~/.local/share/jev-ops/packs//usr/share/jev-ops/packs/Generate native shell completions for Bash, Zsh, Fish, or PowerShell:
# Bash
source <(jev-ops completion bash)
# Zsh
jev-ops completion zsh > "${fpath[1]}/_jev-ops"
# Fish
jev-ops completion fish > ~/.config/fish/completions/jev-ops.fish
jev-ops returns predictable standard process exit codes:
| Code | Status | Description |
|---|---|---|
0 |
Success | Diagnostic analysis completed successfully |
1 |
General Error | Internal runtime or I/O error |
2 |
Invalid CLI Usage | Unknown argument, missing flag, or bad syntax |
3 |
Invalid Pack | Pack not found, syntax error, or schema validation failure |
4 |
Invalid Input | Empty input, input exceeding max bytes, binary garbage, or malformed UTF-8 |
5 |
Provider Failure | Inference provider failure or timeout, or no API key when no --provider is given |
6 |
Invalid Provider Response | Provider returned decisions that violate pack schema constraints |
0–6).api.typesafe.ai/v1) and offline mock fallback.jev-ops stream aws --log-group <name>).jev-ops packs schema).jev-ops packs install github.com/<org>/<pack>).jev-ops replay incident.log --pack <name>).--min-confidence 0.90).jev-ops-operator) with CRD-driven diagnostic routing.MIT License. See LICENSE for details.