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,110 @@
# TASK PHASE — MVP DAGI INTEGRATION AUDIT
Version: 1.0
Target: NODE1 (DAARION.space + daarion-city-service)
---
## 1. Мета
Замкнути ланцюг **“документи → код → деплой → UI”** для ключових сутностей MVP (agents, microdao, nodes) і підтвердити, що реалізація відповідає DAGI-онтології.
Вихід: `docs/debug/mvp_dagi_integration_report_<DATE>.md` з фактами та прогалинами.
---
## 2. Agents
### 2.1. Документи
- `docs/foundation/DAARION_Ontology_Core_v1.md`
- `docs/foundation/Agent_Governance_Protocol_v1.md`
- `docs/foundation/DAARION_Identity_And_Access_Draft_v1.md`
Виписати вимоги щодо gov_level, DAIS identity, microDAO membership, видимості.
### 2.2. Backend / DAGI
- API: `/city/agents/*`, `/api/v1/agents/*`, governance ендпоїнти.
- Перевірити джерела даних (`agents`, `microdao_members`, `dais_*`) та інтеграції з DAGI/NATS (статуси агентів, інциденти).
### 2.3. Frontend (Next.js)
- Сторінки `/agents`, `/agents/[agentId]`.
- Переконатися, що через rewrites йдуть на прод-бекенд, а в UI видно gov-level, DAIS, microDAO-поля.
### 2.4. Висновок
- Зафіксувати реалізовані/відсутні елементи.
---
## 3. MicroDAO
### 3.1. Документи
- `docs/foundation/Technical_Description_microdao_PATCH_Ontology.md`
- `docs/foundation/microdao_Data_Model_UPDATE_v1.md`
- `docs/foundation/microdao_Event_Catalog_EXTENDED_v1.md`
- `docs/foundation/MicroDAO_Interface_Architecture_v1.md`
### 3.2. Backend / DAGI
- Ендпоїнти `/city/microdao/*`, `/api/v1/microdao/*`.
- Перевірити зв’язки з агентами, кімнатами, event outbox.
### 3.3. Frontend
- Сторінки `/microdao`, `/microdao/[slug]`, `/governance`.
- Перевірити відображення orchestrator, каналів, кімнат, citizens.
### 3.4. Висновок
- Занотувати реалізовані та відсутні функції.
---
## 4. Nodes
### 4.1. Документи
- `docs/foundation/Nodes_Interface_Architecture_UPDATE_v1.md`
- `docs/foundation/patches/Nodes_Profile_Core_Invariant_PATCH_v1.md`
- `docs/tasks/TASK_PHASE_NODE_RUNTIME_AUDIT_NODE1_NODE2.md`
### 4.2. Backend / DAGI
- API: `/public/nodes`, `/api/nodes/*`, `/city/agents/{id}/dashboard`.
- Перевірити, що Node Core Agents, метрики, власники відображаються з `node_cache`/agent summary.
### 4.3. Frontend
- Сторінки `/nodes`, `/nodes/[nodeId]`.
- Переконатися, що відображаються всі 4 шари (metrics, ownership, models, orchestration).
### 4.4. Висновок
- Описати відповідність та прогалини.
---
## 5. Звіт
Створити `docs/debug/mvp_dagi_integration_report_<DATE>.md` з розділами:
```md
## Agents
- Documents ↔ Code ↔ Deploy ↔ UI
- Findings / Gaps
## MicroDAO
- ...
## Nodes
- ...
## Summary
- Що вже відповідає онтології
- TODO / наступні кроки
```
За потреби підготувати follow-up таск `TASK_PHASE_MVP_DAGI_INTEGRATION_FIX_<DATE>.md`.
---
## 6. Команда для Cursor
```
Виконай, будь ласка, `docs/tasks/TASK_PHASE_MVP_DAGI_INTEGRATION_AUDIT.md`.
Зроби висновок у `docs/debug/mvp_dagi_integration_report_<DATE>.md`,
що реалізовано (док → код → деплой → UI) і де залишились прогалини.
```

View File

@@ -0,0 +1,205 @@
# TASK_PHASE_MVP_DAGI_INTEGRATION_FIX_20251201.md
Version: 1.0
Status: ACTIVE
Target: DAARION.space (NODE1)
Scope: Backend (city-service), Next.js Frontend, DB migrations, Node Profile UI
---
# 1. МЕТА
Замкнути ланцюг **"документи → код → деплой → UI"** для MVP так, щоб:
* всі інваріанти онтології (agents, microDAO, nodes) були відображені в коді й UI;
* DAIS/Agents/MicroDAO/Nodes працювали відповідно до foundation-доків;
* DAGI ↔ MVP працювали узгоджено на NODE1;
* UI не приховував важливу інформацію про агента, microDAO або ноду;
* було ліквідовано всі зафіксовані розриви з `mvp_dagi_integration_report_20251130.md`.
---
# 2. ПЕРЕЛІК НЕОБХІДНИХ ВИПРАВЛЕНЬ (TODO)
---
## A) Agents Layer: поглибити UI відповідно до онтології
### ❗ A1. Додати gov-level у UI (Next.js)
* У списку агентів (`/agents`)
* У профілі агента (`/agents/:agentId`)
* На governance-сторінці (`/governance`)
Поля з БД:
* `gov_level`
* `governance_rank` (якщо є)
* бейджі з документа Agent_Governance_Protocol_v1.md
### ❗ A2. Додати DAIS ID у всі представлення агентів
* DAIS identity (`dais_identities.id`)
* DAIS email(s)
* DAIS wallet(s)
### ❗ A3. Додати microDAO membership для агента
У UI агента показувати:
* "agent belongs to microDAO: <slug>"
* клік → кімнати microDAO
* бейдж microdao_type (regular/district/root)
---
## B) MicroDAO Layer: привести UI до документації
### ❗ B1. Розширити "MicroDAO Dashboard"
На основі:
* MicroDAO_Interface_Architecture_v1.md
* microdao_Data_Model_UPDATE_v1.md
* Rooms_Layer_Architecture_v1.md
Додати:
* список агентів microDAO
* список кімнат microDAO
* список громадян microDAO (напр. microdao_members / agent_assignments)
* бейджі microdao_type (root / district / org / clan / platform)
* кімната microDAO "lobby / help / governance"
### ❗ B2. Показати District-level microDAO як окремий тип
* GREENFOOD
* ENERGYUNION
* SOUL
* CLAN (коли буде протокол)
---
## C) Nodes Layer: вирівняти з онтологією та документами
### ❗ C1. Реалізувати "Node Dashboard (MVP full)"
Згідно:
* Nodes_Profile_Core_Invariant_PATCH_v1.md
* Nodes_Interface_Architecture_UPDATE_v1.md
Додати в `/nodes/:nodeId`:
**Metrics Layer:**
* CPU load
* CPU cores
* RAM total/used
* GPU count
* VRAM total/used
* Disk sizes
**Ownership Layer:**
* owner_microdao
* district_slug
* DAIS-агенти ноди
**Models Layer:**
* Swapper status
* Перелік моделей (стек) у JSON
* Відображення ролей моделей (LLM/coder/vision/etc.)
**Orchestration Layer:**
* Node Core Agents (GuardianOS/Pulse/Atomis)
* agent-count (local_agents)
* health DAGI router
### ❗ C2. Створити міграцію nodes
Додати таблицю `nodes` у PG, щоб перестати залежати від `node_cache`.
Мінімальні поля:
```sql
CREATE TABLE nodes (
id TEXT PRIMARY KEY, -- slug, e.g. node-1-hetzner-gex44
display_name TEXT NOT NULL,
owner_microdao_id TEXT REFERENCES microdaos(id),
node_type TEXT, -- energy, compute, hybrid, iot_gateway
env TEXT, -- production, development, staging
cpu_cores INTEGER,
ram_gb INTEGER,
gpu_count INTEGER DEFAULT 0,
disk_gb INTEGER,
status TEXT DEFAULT 'unknown',
created_at TIMESTAMPTZ DEFAULT now(),
updated_at TIMESTAMPTZ DEFAULT now()
);
```
### ❗ C3. Записати NODE1 / NODE2 у `nodes`
* проставити:
- `owner_microdao_id = dao_daarion`
- `home_node_id` для GuardianOS, Pulse, Atomis
---
# D) Backend Fixes
### ❗ D1. Виправити /api/agents/* відповідно до DAIS-шару
Формалізувати:
* dais_identity
* dais_emails[]
* dais_wallets[]
* home_node_id
* owner_microdao_id
### ❗ D2. Додати `/api/microdao/:id/rooms`
Для MicroDAO Dashboard.
### ❗ D3. Виправити `/api/nodes/:id/dashboard`
Зробити відповідно до Nodes Profile (див. C1).
---
# 3. ВИХІДНІ АРТЕФАКТИ
Cursor має створити:
* `docs/debug/mvp_dagi_integration_fix_report_<DATE>.md`
(результати перевірки після фіксів)
* (опціонально) `frontend-diff/` & `backend-diff/`
(всі зміни по UI та API)
---
# 4. КОМАНДА ДЛЯ CURSOR
Після додавання цього файла у репо:
> Виконай, будь ласка,
> `docs/tasks/TASK_PHASE_MVP_DAGI_INTEGRATION_FIX_20251201.md`
> у повному обсязі.
> Створи `docs/debug/mvp_dagi_integration_fix_report_<DATE>.md`,
> і підготуй дифи для backend (FastAPI) та frontend (Next.js).
---
# 5. КРИТЕРІЇ ЗАВЕРШЕННЯ
- [ ] A1-A3: gov-level, DAIS ID, microDAO membership відображаються на сторінках агентів
- [ ] B1-B2: MicroDAO Dashboard показує agents, rooms, citizens, district badge
- [ ] C1-C3: Node Dashboard показує 4 шари (Metrics, Ownership, Models, Orchestration), таблиця `nodes` існує, NODE1/NODE2 записані
- [ ] D1-D3: API повертають повні дані (DAIS, rooms, node dashboard)
- [ ] Звіт `mvp_dagi_integration_fix_report_<DATE>.md` підтверджує, що всі пункти закриті

View File

@@ -0,0 +1,110 @@
# TASK PHASE — NODE2 CONFIG & ISOLATION AUDIT
Version: 1.0
Target: NODE2 (core-team / dev node)
---
## 1. Мета
Переконатися, що dev-нода (NODE2) має **власні конфіги** та не підміняє прод-сервіси NODE1:
- інші `DATABASE_URL`, `NATS_URL`, `MATRIX_GATEWAY_URL`, токени;
- відсутній доступ до прод-БД `daarion` та прод NATS;
- чітке розділення ключів Telegram/Matrix/Email gateway;
- зафіксована політика доступу до DAIS/secretів.
---
## 2. Перевірка контейнерів та змінних середовища
1. На NODE2 виконати:
```bash
docker ps --format "table {{.Names}}\t{{.Image}}\t{{.Status}}"
```
2. Для кожного контейнера DAGI-стеку (`dagi-router`, `dagi-postgres`, `dagi-nats`, `daarion-city-service`, `gateway`, `stt`, `ocr`, `rag`, `vector-db`, `swapper`, тощо) виконати:
```bash
docker inspect <container> \
--format='{{json .Config.Env}}' | jq
```
3. Особливу увагу звернути на ENV:
- `DATABASE_URL`
- `REDIS_URL`
- `NATS_URL`
- `MATRIX_GATEWAY_URL`
- `INTERNAL_API_URL`
- API ключі/токени (Telegram, Discord, Matrix, OAuth)
4. Якщо контейнер використовує `.env` файл — зчитати його (через `docker inspect ... Mounts`).
---
## 3. Виявлення перетинів з PROD
### 3.1. База даних
- Перевірити, що `DATABASE_URL` **не вказує** на `postgres://postgres:postgres@dagi-postgres:5432/daarion`.
- Dev-нода повинна використовувати окрему БД (інший хост/порт або іншу назву БД).
- Якщо все ж використовує прод-БД — зафіксувати це як критичне відхилення.
### 3.2. NATS
- `NATS_URL` має вказувати на локальний/Dev NATS.
- Заборонено використовувати `nats://dagi-nats:4222` з прод-мережі (NODE1).
### 3.3. Gateway / Matrix / Telegram
- Перевірити токени (`TELEGRAM_BOT_TOKEN`, Matrix creds, Discord tokens, тощо).
- Якщо використовуються прод ключі — зафіксувати.
### 3.4. Secrets
- Переконатися, що `daarion-city-service` на NODE2 має **інший** `JWT_SECRET`, `INTERNAL_SECRET`, `AUTH_SERVICE_URL`.
- Перевірити відсутність `.secrets` файлів, спільних із NODE1.
---
## 4. Висновок і логування
1. Створити файл `docs/debug/node2_config_audit_<DATE>.md` з такими секціями:
- `Database`
- `NATS`
- `Gateway/Matrix`
- `Other secrets`
- `Summary`
2. У кожній секції вказати:
- реальні значення (без публікації секретів, лише хости/порти/назви БД);
- чи збігаються вони з прод-конфігом;
- рекомендації (змінити URL/ключ, перенаправити на dev-екземпляр, прибрати контейнер тощо).
3. Якщо знайдені перетини, запропонувати конкретні кроки:
- створити dev БД;
- змінити docker-compose;
- оновити токени в secret manager;
- додати firewall між NODE1/NODE2.
---
## 5. Критерії завершення
- `docs/debug/node2_config_audit_<DATE>.md` заповнений фактами та рекомендаціями;
- Виявлені всі місця, де dev-нода використовує прод-конфіги (якщо є);
- Зроблені пропозиції, як рознести конфіги;
- При необхідності створено follow-up таск (наприклад, `TASK_PHASE_NODE2_CONFIG_FIX.md`).
---
## 6. Команда для Cursor
```
Прошу виконати `docs/tasks/TASK_PHASE_NODE2_CONFIG_AUDIT.md`.
Мета: зібрати docker inspect/env на NODE2, перевірити DATABASE/NATS/Gateway/Secrets,
зробити висновок у `docs/debug/node2_config_audit_<DATE>.md`.
```

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` з описом фактів і пропозицією дій (зупинити/додати сервіс, створити таск на майбутнє).