Files
microdao-daarion/docs/tasks/TASK_PHASE_DAGI_AGENT_AUDIT_MVP_v1.md
Apple bca81dc719 feat: Node Self-Healing, DAGI Audit, Agent Prompts, Infra Invariants
### Backend (city-service)
- Node Registry + Self-Healing API (migration 039)
- Improved get_all_nodes() with robust fallback for node_registry/node_cache
- Agent Prompts Runtime API for DAGI Router integration
- DAGI Router Audit endpoints (phantom/stale detection)
- Node Agents API (Guardian/Steward)
- Node metrics extended (CPU/GPU/RAM/Disk)

### Frontend (apps/web)
- Node Directory with improved error handling
- Node Cabinet with metrics cards
- DAGI Router Card component
- Node Metrics Card component
- useDAGIAudit hook

### Scripts
- check-invariants.py - deploy verification
- node-bootstrap.sh - node self-registration
- node-guardian-loop.py - continuous self-healing
- dagi_agent_audit.py - DAGI audit utility

### Migrations
- 034: Agent prompts seed
- 035: Agent DAGI audit
- 036: Node metrics extended
- 037: Node agents complete
- 038: Agent prompts full coverage
- 039: Node registry self-healing

### Tests
- test_infra_smoke.py
- test_agent_prompts_runtime.py
- test_dagi_router_api.py

### Documentation
- DEPLOY_CHECKLIST_2024_11_30.md
- Multiple TASK_PHASE docs
2025-11-30 13:52:01 -08:00

8.1 KiB
Raw Blame History

TASK_PHASE_DAGI_AGENT_AUDIT_MVP_v1

Проєкт: DAARION.city — DAGI Router / Node Cabinet
Фаза: DAGI Agent Audit & Activity Monitor
Мета: гарантувати, що всі агенти, оголошені DAGI Router на кожній Ноді (NODA1, NODA2), коректно синхронізовані з системою microdao та відображаються у Кабінеті Ноди з правильним індикатором активності.


0. Problem Statement

У процесі розробки та деплою деякі агенти на НОДА з'являлись/зникали.
Не було механізму перевірки їх присутності та активності у DAGI Router та їх відповідності записам у системі (microdao → agents).

Потрібно створити:

  • одноразовий аудит DAGI-агентів на кожній ноді;
  • постійний автоматизований моніторинг активності агентів;
  • індикатор «підключено/активний» замість терміну «зареєстрований у MVP»;
  • UI-відображення в Кабінеті Ноди;
  • метрики й сигналізація (NATS + Prometheus).

1. Scope

Включено

  • Аудит DAGI Router агентів на NODA1 та NODA2.
  • Зіставлення: router_agentssystem_agents (таблиця microdao.agents).
  • Додавання індикатора активності агента.
  • Одноразовий звіт diff у JSON.
  • Автоматичний воркер для періодичної перевірки.
  • Метрики Prometheus.
  • Події NATS.
  • UI (Node Cabinet → вкладка "DAGI Router").

Виключено

  • Вплив на логіку DAGI Router.
  • Автоматичне видалення агентів.
  • Версіонування агентів.

2. Definitions

  • Router Agents — агенти, які DAGI Router бачить на конкретній ноді (GET /api/agents або NATS dagi.router.agent.list).
  • System Agents — агенти, зареєстровані в системі (таблиця agents у microdao).
  • Node Agent Auditor — спеціальний агент Ноди, який періодично перевіряє відповідність.
  • Active — агент з'являється в DAGI Router і відповідає на healthcheck.
  • Stale — агент є в системі, але його немає в DAGI Router.
  • Phantom — агент є в DAGI Router, але його немає в системі.

3. One-time Audit (Node1 + Node2)

3.1. Команда

Створити CLI/скрипт:

scripts/dagi_agent_audit.py --node node1
scripts/dagi_agent_audit.py --node node2

3.2. Дії

  1. Отримати список агентів з DAGI Router:
GET {ROUTER_URL}/api/agents
  1. Отримати список агентів з microdao:
SELECT id, name, role, node_id FROM agents WHERE node_id = :node
  1. Обчислити:
missing_in_system = router_ids - system_ids
stale_in_router   = system_ids - router_ids
active            = intersection(router_ids, system_ids)
  1. Згенерувати звіт:
logs/dagi-audit-node{1,2}.json

3.3. Структура JSON-звіту

{
  "node_id": "node1",
  "router_total": 15,
  "system_total": 14,
  "active": ["agent_x", "agent_y"],
  "missing_in_system": ["agent_z"],
  "stale_in_router": ["agent_a"],
  "timestamp": "..."
}

4. DB / System Changes

4.1. Таблиця agents (розширення)

Додати поля:

  • node_id text — ідентифікатор ноди.
  • status text check(status in ('active','stale','missing','error')) — стан.
  • last_seen_at timestamptz — останній час успішного контакту.

Міграція:

ALTER TABLE agents ADD COLUMN IF NOT EXISTS node_id text;
ALTER TABLE agents ADD COLUMN IF NOT EXISTS status text DEFAULT 'stale';
ALTER TABLE agents ADD COLUMN IF NOT EXISTS last_seen_at timestamptz;

4.2. Repo-методи

  • repo_agents.update_status(agent_id, status, last_seen_at)
  • repo_agents.list_by_node(node_id)
  • repo_agents.sync_router_list(node_id, router_agents) — optional

5. Automated Worker: Node Agent Auditor

Створити сервіс: services/node-agent-auditor/worker.py

5.1. Частота

  • кожні 60 секунд (конфігуровано).

5.2. Алгоритм

router_agents = get_router_list(node)
system_agents = get_system_list(node)

active = intersection(router_agents, system_agents)
missing = router_agents - system_agents
stale = system_agents - router_agents

update agents.status
update agents.last_seen_at
publish NATS events
expose Prometheus metrics

5.3. NATS події

  • node.agent.audit.active
  • node.agent.audit.missing
  • node.agent.audit.stale
  • node.agent.audit.error

Payload:

{
  "node_id": "node1",
  "agent_id": "daria",
  "status": "missing",
  "timestamp": "..."
}

5.4. Prometheus метрики

  • dagi_agents_active{node="node1"}
  • dagi_agents_missing{node="node1"}
  • dagi_agents_stale{node="node1"}
  • dagi_agent_last_seen_timestamp{agent="daria",node="node1"}

6. Node Cabinet UI

6.1. Нова вкладка

/node/{nodeId}/dagi-router

6.2. Таблиця

Колонки:

  • Agent ID
  • Name
  • Role
  • Status (active, missing, stale, error)
  • Last Seen (timestamp)
  • Node

6.3. Індикатор статусу

  • 🟢 Зелене коло — active
  • 🟡 Жовте — stale
  • 🔴 Червоне — missing
  • Сіре — error

6.4. Елементи управління

  • Resync → тригерить ручний аудит (POST /internal/node/{id}/audit).

7. API

7.1. GET

  • GET /internal/node/{node_id}/agents/router → список DAGI Router агентів
  • GET /internal/node/{node_id}/agents/system → список system agent records
  • GET /internal/node/{node_id}/audit → останній аудит

7.2. POST

  • POST /internal/node/{node_id}/audit → виконати аудит вручну
  • POST /internal/node/{node_id}/sync → синхронізувати статуси (опційно)

8. Tests

8.1. Unit

  • зіставлення router/system списків
  • статуси: active/missing/stale/error

8.2. Integration

  • worker → DB update
  • worker → NATS event
  • worker → Prometheus export

8.3. E2E

  • запуск аудиту
  • відображення у Node Cabinet UI
  • Resync працює

9. Acceptance Criteria

  • На NODA1 і NODA2 виконано успішний одноразовий аудит.
  • JSON-звіти створені.
  • Worker працює і оновлює статуси агентів у БД.
  • Статуси в UI відповідають реальному стану Router.
  • NATS і Prometheus показують коректні дані.
  • Resync викликає миттєве оновлення.

10. Deliverables

  • scripts/dagi_agent_audit.py
  • services/node-agent-auditor/worker.py
  • Міграція agents.status/last_seen_at/node_id
  • API (internal)
  • Node Cabinet UI вкладка
  • Документація цього таску

11. Implementation Plan

M0 — Одноразовий аудит (Day 1)

  1. Створити scripts/dagi_agent_audit.py
  2. Тест на NODA1 та NODA2
  3. Звіти в logs/

M1 — DB + Repo (Day 1-2)

  1. Міграція для нових полів
  2. Repo-методи в city-service

M2 — Worker (Day 2-3)

  1. Node Agent Auditor сервіс
  2. NATS integration
  3. Prometheus metrics

M3 — UI (Day 3-4)

  1. Node Cabinet вкладка "DAGI Router"
  2. Таблиця агентів зі статусами
  3. Resync button

Версія: 1.0.0
Дата: 2025-11-30
Статус: READY FOR IMPLEMENTATION