# NODA1 Incident Log

---

## INC-2026-002 | 2026-02-27 | Gateway Workers + SenpAI + facts/upsert

**Severity:** SEV-1 (всі агенти не відповідали користувачам)
**Status:** RESOLVED
**Duration:** ~3 дні (з 2026-02-21 09:55 по 2026-02-27 23:15)

### Summary

Після апгрейду Redis до 8.6.1 та ряду змін у коді gateway два воркери зависли,
SenpAI повертав 500, а `facts/upsert` падав з `InvalidColumnReferenceError`.
В сукупності агенти не відповідали у Telegram.

### Root Causes (3 незалежні)

| # | Компонент | Причина |
|---|-----------|---------|
| 1 | `dagi-gateway-worker-node1` | Після Redis 8.6.1 upgrade старі TCP-сокети async-клієнта → `ReadOnlyError` у `brpop()` |
| 2 | `dagi-gateway-reminder-worker-node1` | Та сама проблема застарілих з'єднань після Redis upgrade |
| 3 | `SenpAI webhook` → Router | `.env`: `ROUTER_URL=http://dagi-staging-router:8000` (staging!) замість `http://router:8000` |
| 4 | `memory-service /facts/upsert` | `ensure_facts_table()` DDL застарілий: `UNIQUE(user_id, team_id, fact_key)` → asyncpg кешував старий prepared statement без `agent_id`; ON CONFLICT не знаходив matching constraint |
| 5 | `get_doc_context()` | Підпис функції не мав `agent_id=None` параметра, хоча `http_api.py` передавав його |

### Timeline

| Час (UTC+1) | Подія |
|-------------|-------|
| 2026-02-21 09:55 | Остання успішна обробка (agromatrix) |
| 2026-02-26 13:09 | Початок `ReadOnlyError` у gateway-worker (Redis upgrade) |
| 2026-02-27 17:02 | Поновлення помилок worker після перезапусків |
| 2026-02-27 19:49 | Повна блокада gateway-worker (останній restart) |
| 2026-02-27 22:46 | Перезапуск dagi-gateway-worker-node1 → стабільний |
| 2026-02-27 22:47 | Перезапуск dagi-gateway-reminder-worker-node1 → стабільний |
| 2026-02-28 00:01 | Виправлено ensure_facts_table() → memory-service rebuilt |
| 2026-02-28 00:05 | Виправлено ROUTER_URL, get_doc_context() → gateway rebuilt |
| 2026-02-28 00:15 | Всі 14 агентів HTTP 200 ✓ |

### Fixes Applied (на сервері /opt/microdao-daarion)

```
1. docker restart dagi-gateway-worker-node1 dagi-gateway-reminder-worker-node1
2. services/memory-service/app/database.py:
   - ensure_facts_table() замінено на noop (таблиця управляється міграціями)
   - Скопійовано відсутні файли: integration_endpoints.py, integrations.py, voice_endpoints.py
3. gateway-bot/services/doc_service.py:
   - get_doc_context(session_id: str) → get_doc_context(session_id: str, agent_id: str = None)
4. .env:
   - ROUTER_URL=http://dagi-staging-router:8000 → ROUTER_URL=http://router:8000
5. Rebuild + restart: memory-service, gateway, gateway-worker, gateway-reminder-worker
```

### Verification

```
All 14 agents HTTP 200:
✓ senpai  ✓ helion  ✓ nutra  ✓ daarwizz  ✓ greenfood  ✓ agromatrix
✓ alateya ✓ druid   ✓ clan   ✓ eonarch   ✓ oneok      ✓ soul
✓ yaromir ✓ sofiia
facts/upsert: {"status":"ok"}
Gateway: healthy, 14 agents
```

### Action Items (TODO)

- [ ] Після Redis upgrade — завжди перезапускати workers (додати в runbook)
- [ ] Виправити `ensure_facts_table()` в коді репозиторію (локально)
- [ ] Виправити `get_doc_context()` сигнатуру в локальному репо
- [ ] Виправити `.env` в репозиторії (або `.env.example`) — прибрати staging router URL
- [ ] Додати liveness probe для workers: exit(1) при повторних ReadOnlyError
- [ ] Алерт: "No messages processed for X minutes"

---

---

## INC-2026-003 | 2026-02-28 | Ollama resource crash → всі агенти 503

**Severity:** SEV-1 (всі агенти не відповідали у Telegram)
**Status:** RESOLVED
**Duration:** ~8 годин (з 07:53 по ~16:00 UTC+1)

### Root Cause

Ollama впала з помилкою `model runner has unexpectedly stopped, this may be due to resource limitations`. Модель `qwen3:8b` (27.8B params, ~17GB) перевищила ресурси сервера під навантаженням → Router отримував `500` від Ollama → повертав `503` клієнту. Всі агенти були налаштовані на `provider: ollama`.

### Fix Applied

Переключено всі агенти в `router-config.yml` з `qwen3_*_8b` профілів → `cloud_deepseek`:
- 14 агентів тепер використовують `deepseek-chat` через DeepSeek API
- Router перезапущено для підхвачення нового конфігу

### Verification

```
helion: 🌐 Trying DEEPSEEK API → HTTP 200, 15222 tokens
All 14 agents: ✓ HTTP 200
```

### Action Items

- [ ] Backup `router-config.yml.bak_20260228` → зберегти в репо
- [ ] Розглянути переведення Ollama на меншу модель (smollm2:135m або qwen3-vl:8b) для vision-задач
- [ ] Додати fallback в Router: якщо Ollama 500 → автоматично cloud_deepseek

---

## INC-2026-001 | (попередні інциденти)

_(додати при потребі)_
