feat(mvp): DAGI Integration Fix - gov_level, DAIS, nodes table

TASK_PHASE_MVP_DAGI_INTEGRATION_FIX_20251201

A) Agents Layer:
- A1: Added gov_level to API and UI (list + profile)
- A2: Added dais_identity_id to API and UI
- A3: Added home_microdao_id/name/slug for ownership display

B) MicroDAO Layer:
- B1/B2: Already implemented (agents, rooms, citizens, district badge)

C) Nodes Layer:
- C1: Node Dashboard already implemented
- C2: Created nodes table migration with owner_microdao_id
- C3: INSERT NODE1/NODE2 with dao_daarion ownership

D) Backend Fixes:
- D1: Extended /api/agents/* with DAIS/governance fields
- D2/D3: Already implemented

Files changed:
- services/city-service/repo_city.py
- services/city-service/models_city.py
- services/city-service/routes_city.py
- services/city-service/migrations.py
- apps/web/src/lib/types/agents.ts
- apps/web/src/lib/agent-dashboard.ts
- apps/web/src/app/agents/page.tsx
- apps/web/src/components/agent-dashboard/AgentSummaryCard.tsx

Reports:
- docs/debug/mvp_dagi_integration_fix_report_20251201.md
- docs/tasks/TASK_PHASE_MVP_DAGI_INTEGRATION_FIX_20251201.md
This commit is contained in:
Apple
2025-11-30 08:45:07 -08:00
parent a23deae3c4
commit 644edd3f30
22 changed files with 1227 additions and 82 deletions

View File

@@ -0,0 +1,199 @@
# TASK PHASE — NODE RUNTIME AUDIT (NODE1 & NODE2)
Version: 1.0
Target: NODE1 (production), NODE2 (development)
---
## 1. Мета
Гарантувати, що:
1. У БД рівно дві реальні ноди (NODE1, NODE2) з коректними полями.
2. DAGI-стек на NODE1 відповідає документації (ті сервіси, які мають працювати в проді).
3. NODE2 позначений як development-нода з правильними тегами.
4. UI Node Directory та Node Profile показують саме ці дані.
---
## 2. Перевірка БД (nodes + агенти на ноді)
### 2.1. Список нод
```sql
SELECT id, slug, name, kind, environment, hostname, owner_microdao_id, guardian_agent_id, steward_agent_id
FROM nodes
ORDER BY id;
```
Очікування:
- рівно 2 рядки:
- NODE1 — `Hetzner GEX44 Production` (environment = `production`);
- NODE2 — `MacBook Pro M4 Max` (environment = `development`).
### 2.2. Агенти, прив’язані до нод
Якщо колонка `home_node_id` вже додана:
```sql
SELECT id, slug, display_name, home_node_id, primary_microdao_id
FROM agents
WHERE home_node_id IS NOT NULL AND deleted_at IS NULL
ORDER BY home_node_id, id;
```
Очікування:
- NODE1: інфраструктурні/прод-агенти (router, gateway, guardians);
- NODE2: core-team / AI-runtime агенти (якщо вже зареєстровані).
> Якщо `home_node_id` поки немає — додати TODO у звіт і зафіксувати актуальний стан у README.
---
## 3. Перевірка DAGI-стека на NODE1
### 3.0. Node Profiles (expected DAGI stack)
#### NODE1 — `node-1-hetzner-gex44`
Role: infra / city / production.
Expected services (name mask):
- `dagi-router*`
- `gateway` / `dagi-gateway*`
- `dagi-postgres`
- `dagi-nats`
- `daarion-city-service`
- `daarion-web`
- `dagi-stt-service`
- `dagi-ocr-service`
- `dagi-web-search-service`
- `dagi-rag-service`
- `dagi-vector-db-service`
- інші prod-інтеграції (Matrix gateway, telegram bots, crew router, etc.)
Forbidden / unexpected на NODE1:
- важкі dev/LLM контейнери (ollama, vllm, test models),
- експериментальні сервіси core-team (якщо це не задокументовані прод-сервіси).
#### NODE2 — `node-2-macbook-m4max`
Role: development / models / ai-runtime.
Expected services:
- `ollama`, `vllm`, `text-gen` або інші LLM runtime контейнери,
- dev/test RAG, vision, STT модулі,
- core-team agents / experimental gateways.
Forbidden / unexpected на NODE2:
- продакшн-сервіси міста (`daarion-city-service`, `dagi-router`, `dagi-postgres`, `dagi-nats`, тощо),
- будь-які критичні інфра-компоненти, які повинні жити лише на NODE1.
### 3.1. Список контейнерів
На NODE1 виконати:
```bash
docker ps --format "table {{.Names}}\t{{.Image}}\t{{.Status}}" | grep -E "(dagi-|daarion-|gateway)"
```
Результат зберегти у файл `docs/debug/node1_containers_<DATE>.txt`.
Очікуваний перелік (орієнтовно, залежно від compose):
- `dagi-router`, `dagi-gateway`, `dagi-postgres`, `dagi-nats`;
- сервісні контейнери (`dagı-ocr-service`, `dagı-stt-service`, `dagı-web-search-service`, `dagı-rag-service`, `dagı-vector-db-service`, тощо за актуальним `docker-compose` файлом);
- `daarion-city-service`;
- `daarion-web` (якщо працює через docker run).
### 3.2. Healthcheck основних сервісів
Створити скрипт `scripts/node1_healthcheck.sh`:
```bash
#!/usr/bin/env bash
set -e
echo "== NODE1 HEALTHCHECK ==" > /tmp/node1_health_status.txt
{
curl -sf http://daarion-city-service:7001/health && echo "city-service OK"
} || echo "city-service FAILED" >> /tmp/node1_health_status.txt
{
curl -sf http://gateway:9300/health && echo "gateway OK"
} || echo "gateway FAILED" >> /tmp/node1_health_status.txt
{
nc -z dagi-nats 4222 && echo "NATS OK"
} || echo "NATS FAILED" >> /tmp/node1_health_status.txt
{
PGPASSWORD=postgres psql -h dagi-postgres -U postgres -d daarion -c "SELECT 1" && echo "postgres OK"
} || echo "postgres FAILED" >> /tmp/node1_health_status.txt
```
Перенести файл `/tmp/node1_health_status.txt` до `docs/debug/node1_health_<DATE>.txt`.
---
## 4. Перевірка NODE2 (development)
На NODE2 виконати:
```bash
docker ps --format "table {{.Names}}\t{{.Image}}\t{{.Status}}" | grep -E "(dagi-|daarion-|ollama|models)"
```
Зберегти результат у `docs/debug/node2_containers_<DATE>.txt`.
Очікування:
- NODE2 не має зайвих прод-сервісів (тільки dev/runtime контейнери);
- у таблиці `nodes` для NODE2 стоять теги `development`, `gpu`, `ai_runtime` (або аналогічні).
---
## 5. Перевірка відповідності UI
Після SQL та скриптів:
1. Відкрити `https://daarion.space/nodes` — має бути рівно 2 ноди з правильними даними.
2. Перевірити сторінки:
- `https://daarion.space/nodes/node-1-hetzner-gex44`
- `https://daarion.space/nodes/node-2-macbook-m4max`
Переконатися, що:
- сторінки рендеряться без `Failed to fetch`;
- якщо dashboard ще WIP — показано попереджувальний банер, але базовий профіль працює.
---
## 6. Критерії завершення
- У `nodes` — рівно дві ноди з коректними полями.
- Контейнери DAGI на NODE1 відповідають очікуваному стеку.
- NODE2 позначений як development-нода без лишніх прод-сервісів.
- У `docs/debug/` збережені файли:
- `node1_containers_<DATE>.txt`
- `node1_health_<DATE>.txt`
- `node2_containers_<DATE>.txt`
- UI `/nodes` та сторінки нод працюють без помилок і показують актуальні дані.
---
## 7. Запуск таска в Cursor
В чаті Cursor (репозиторій `microdao-daarion`) надіслати:
> Виконай, будь ласка,
> `docs/tasks/TASK_PHASE_NODE_RUNTIME_AUDIT_NODE1_NODE2.md`
> по кроках, як описано в документі.
> Мета: підтвердити, що в БД рівно дві ноди, DAGI-стек на NODE1 відповідає очікуваному, NODE2 відмічений як development, і UI `/nodes` та сторінки нод показують ці дані.
> Особливий акцент: порівняй реальний список контейнерів з розділом **Node Profiles**. Якщо є розбіжності (відсутній обов’язковий сервіс або запущено заборонений), створи файл `docs/debug/node_stack_mismatch_<DATE>.md` з описом фактів і пропозицією дій (зупинити/додати сервіс, створити таск на майбутнє).