О проекте
About the Project
Гибрид: детерминированный Knowledge Graph + LLM-пайплайн за policy-gate. Обогащение алертов, RCA и controlled remediation в Kubernetes. Спроектирован честным к своим слепым зонам — система помечает, чего она не знает, вместо того чтобы выдавать догадки за факты.
A hybrid: deterministic Knowledge Graph + an LLM pipeline behind a policy gate. Alert enrichment, RCA and controlled remediation for Kubernetes. Built to be honest about its blind spots — it marks what it doesn't know instead of passing guesses off as facts.
Безопасность прежде всего
Safety-first remediation
Главный страх «AI сам трогает прод» снят архитектурно: можно ли запускать kubectl-write считается детерминированно (8 risk-axes → policy-engine), а не берётся из ответа модели. Dry-run по умолчанию, approvals, anti-replay, savepoint-изоляция.
The core fear — “the AI touches prod on its own” — is removed by design: whether a kubectl write may run is computed deterministically (8 risk axes → policy engine), not taken from the model’s answer. Dry-run by default, approvals, anti-replay, savepoint isolation.
Граф, который знает, чего он не знает
A Knowledge Graph that knows when it doesn't know
Операционный граф из нескольких источников (топология, деплои, события, метрики, логи) с провенансом, отслеживанием свежести, проверками целостности и явными слепыми зонами. Сейчас в проде: 11 540 узлов, 9 004 ребра, 188 namespace.
A multi-source operational graph (topology, deploys, events, metrics, logs) with provenance, freshness tracking, integrity checks and explicit blind spots. Live in production: 11,540 nodes, 9,004 edges, 188 namespaces.
Честность по умолчанию
Honest by design
Наблюдаемые факты отделены от прокси-сигналов и неполных данных, известные слепые зоны задокументированы в самом ответе. Система не выдаёт «зелёное», когда у неё просто нет данных — редкий, но решающий для доверия признак.
Observed facts are distinguished from proxies and incomplete evidence; known blind spots are documented in the response itself. It won’t report “green” when it simply has no data — a rare but decisive trait for trust.
Как это работает
Конвейер инцидента — 6 ступеней. Честно: что уже live, а что включается с LLM-флагом.
1 · IngestliveAlertManager webhook → HMAC + anti-replay + dedup.
2 · Enrich (KG)liveГраф добавляет контекст: деплои, blast radius, pod-события, логи, ingress 5xx/p95.
3 · Reason (LLM)за флагомГипотез-агенты строят версии из контекста; critic ранжирует и режет слабые.
4 · Respondlive +LLMОдин Discord-эмбед: факты + подсказка root-cause; с LLM — связный narrative.
5 · Remediateopt-inПредложить/применить kubectl-фикс за детерминированным policy-gate + approval.
6 · Self-watchlive7 self-health-чеков /30мин, включая integrity-watchdog графа.
How it works
The incident pipeline — 6 stages. Honest about what's live today vs what the LLM flag turns on.
1 · IngestliveAlertManager webhook → HMAC + anti-replay + dedup.
2 · Enrich (KG)liveThe graph adds context: deploys, blast radius, pod events, logs, ingress 5xx/p95.
3 · Reason (LLM)flaggedHypothesis agents draft versions from the context; a critic ranks and prunes weak ones.
4 · Respondlive +LLMOne Discord embed: facts + a root-cause hint; with LLM, a coherent narrative.
5 · Remediateopt-inPropose/apply a kubectl fix behind a deterministic policy gate + approval.
6 · Self-watchlive7 self-health checks /30 min, including a graph integrity watchdog.
Как выглядит выводWhat the output looks like
Синтетический пример critical-эмбеда в Discord (данные вымышленные).A synthetic example of a critical Discord embed (fictional data).
🔴 Critical · checkout-service · prod
🎯 Likely cause
deploy #482 4 min before — p95 +180%, 5xx 0.6 rps at api.example.com/checkout
🌐 Endpoint health (ingress-derived)
5xx 0.6 rps · p95 920 ms
💥 Blast radius
3 svc → orders-service, cart-service, payments-gateway · 1 URL
🩺 Pod events
CrashLoopBackOff ×7 (OOMKilled)
🔧 Suggested action
kubectl rollout undo deploy/checkout-service [⚙️ Apply — dry-run ✓, risk: medium]
Почему это безопасно для прода
Главный страх «AI сам трогает прод» снят архитектурно — решение принимает не модель:
- Детерминированный policy-gate: можно ли запускать
kubectl-write считается из структурного intent'а по 8 risk-axes, а не берётся из ответа LLM (его risk — лишь advisory).
- Dry-run по умолчанию + approval: реальный apply только после
--dry-run=server и явного подтверждения кнопкой (risk ≤ medium).
- TOCTOU-подпись intent + anti-replay + savepoint-изоляция + полный OTEL-аудит каждого действия.
- Default = advisory: из коробки copilot не зовёт
kubectl вообще — анализирует и пишет в Discord.
Why it's safe next to prod
The core fear — "the AI touches prod on its own" — is removed by design; the model doesn't make the call:
- Deterministic policy gate: whether a
kubectl write may run is computed from the structured intent across 8 risk axes — not taken from the LLM (its risk field is advisory only).
- Dry-run by default + approval: a real apply happens only after
--dry-run=server and an explicit button confirmation (risk ≤ medium).
- TOCTOU intent signature + anti-replay + savepoint isolation + full OTEL audit of every action.
- Default = advisory: out of the box the copilot never calls
kubectl — it analyzes and posts to Discord.
Проверено продом, а не демо-кластером
Четыре реальных дефекта этой недели. Каждый нашёлся на живых данных и стал регрессионным тестом.
2 092 невалидных ребра за тик
k8s Service и его Deployment делили одну строку с ключом (namespace, name). Ребро между ними не могло существовать — вырождалось в петлю и отбрасывалось. В графе жило 3 ребра serves_traffic.
→ Явная онтология узлов + регрессионные тесты. Сейчас 4 234 ребра.
230 задач в очереди
Окно жизни было выставлено ровно у одной периодической задачи из 27. Дешёвые пробы копились — 94 минутных тика за полтора часа — и полностью вытеснили синк топологии: он планировался по расписанию и не выполнялся ни разу.
→ Протухание задач по интервалу.
4 200 upsert-ов в одной транзакции
Синк коммитил раз в тик, удерживая блокировку 13 минут. Миграция встала за ним в очередь — а очередь на лок в PostgreSQL блокирует всех, кто пришёл после неё. Зависли семь читателей, приложение стояло 6 минут.
→ Коммит батчами.
Метрика, которая солгала
Новый тип узла уронил orphan с 72,5% до 42% за ночь — без единой новой интеграции. Каждый «вылеченный» сервис получил ровно одно ребро: на самого себя.
→ Откатили метрику, а не схему. У каждой метрики качества теперь тест на то, чего она считать НЕ должна.
Built against production, not a demo cluster
Four real defects from a single week. Each surfaced on live data and became a regression test.
2,092 invalid edges per tick
A k8s Service and its Deployment shared one row keyed by (namespace, name). The edge between them could not exist — it degenerated into a self-loop and was dropped. The graph held 3 serves_traffic edges.
→ Explicit node ontology + regression tests. Now 4,234 edges.
230 queued jobs
Exactly one periodic task out of 27 had an expiry window. Low-value probes piled up — 94 one-minute ticks over 90 minutes — and starved the topology sync completely: dispatched on schedule, never executed.
→ Task expiry sized to each interval.
4,200 upserts, one transaction
A sync committed once per tick, holding a table lock for 13 minutes. A migration queued behind it — and in PostgreSQL a queued DDL blocks every reader that arrives after it. Seven readers hung; the app stalled for 6 minutes.
→ Batched commits.
The metric that lied
A new node type made orphan drop from 72.5% to 42% overnight — without a single new integration. Every “cured” service had gained exactly one edge: to itself.
→ We reverted the metric, not the schema. Every quality metric now has a test asserting what it must NOT count.
Почему всё держится на графеWhy the Knowledge Graph matters
| Обычный AI-SRE | SRE AI Copilot |
| Источник истины | модель и её контекст | операционный граф в Postgres |
| Evidence | подразумевается | явное, с провенансом источника |
| Неизвестное | обычно скрыто | полноправное состояние: «данных нет» ≠ «всё хорошо» |
| История | ограничена окном | хранится: деплои, события, аномалии |
| Право на действие | решает модель или тул | детерминированный policy-gate, 8 risk-axes |
| Обратная связь | опциональна | непрерывная: результат возвращается в граф |
| Typical AI-SRE | SRE AI Copilot |
| Source of truth | the model and its context | an operational graph in Postgres |
| Evidence | implicit | explicit, with source provenance |
| Unknown state | usually hidden | first-class: “no data” ≠ “all good” |
| History | limited to a window | retained: deploys, events, anomalies |
| Authorization | model or tool decides | deterministic policy gate, 8 risk axes |
| Production feedback | optional | continuous: outcomes flow back into the graph |
2000+ tests
11 540 graph nodes
188 namespaces
multi-source KG
8-axis policy gate
honest blind-spot tagging