Skip to content

# TASK PHASE — MVP VERIFY NO ORPHANS

Version: 1.0
Target DB: daarion (NODE1)
Goal: гарантувати, що в системі немає "безхозних" нод, агентів і microDAO.

## 1. Контекст

Після FOUNDATION_UPDATE, нових District Protocols і seed-міграцій:

- додано нові таблиці (`agents`, `microdaos`, `nodes`, `agent_assignments`, `permissions`, `rooms`, `dais_*`, …),
- оновлено онтологію: не може існувати:
- нода без microDAO/агента-відповідального,
- агент без прив'язки до microDAO (окрім city-агентів),
- microDAO без оркестратора.

Цей таск — чистий аудит БД через SQL.

## 2. Перевірка нод (nodes)

### 2.1. Ноди без owner_microdao

    -- Nodes without owning microDAO
    SELECT node_id, name, kind, microdao_id
    FROM nodes
    WHERE microdao_id IS NULL;

Очікування: * 0 рядків (якщо є винятки — зафіксувати явно в коментарях до таблиці/коду).

### 2.2. Ноди без відповідального агента (node guardian/steward)

    -- Nodes without guardian agent (based on current schema)
    SELECT n.node_id, n.name
    FROM nodes n
    LEFT JOIN agents a ON a.node_id = n.node_id AND a.is_node_guardian = true
    WHERE a.id IS NULL;

Очікування: * 0 рядків або явний список нод, де керує сам root-microDAO.

## 3. Перевірка агентів (agents)

### 3.1. Агенти без microDAO (крім city-агентів)

    -- Agents without owning microDAO (excluding city-level agents)
    SELECT id, display_name, kind, home_microdao_id, gov_level
    FROM agents
    WHERE home_microdao_id IS NULL
      AND gov_level NOT IN ('city_governance')
      AND id NOT IN ('daarwizz', 'dario', 'daria', 'spirit', 'logic', 'energia');

Очікування: * 0 рядків (усі агенти, окрім city-level, повинні мати home_microdao_id).

### 3.2. Агенти без DAIS-ідентичності

    -- Agents without DAIS identity
    SELECT a.id, a.display_name
    FROM agents a
    WHERE a.dais_identity_id IS NULL
      AND a.gov_level IN ('city_governance', 'district_lead', 'orchestrator', 'core_team');

Очікування: * 0 рядків для governance/lead агентів.

## 4. Перевірка microDAO (microdaos)

### 4.1. microDAO без оркестратора

    -- MicroDAO without orchestrator agent
    SELECT id, slug, name, dao_type, orchestrator_agent_id
    FROM microdaos
    WHERE orchestrator_agent_id IS NULL;

Очікування: * 0 рядків (кожне microDAO має мати orchestrator_agent_id).

### 4.2. Orchestrator не існує в agents

    -- Orchestrator agent must exist in agents table
    SELECT m.id, m.slug, m.name, m.orchestrator_agent_id
    FROM microdaos m
    LEFT JOIN agents a ON m.orchestrator_agent_id = a.id
    WHERE a.id IS NULL AND m.orchestrator_agent_id IS NOT NULL;

Очікування: * 0 рядків.

## 5. Перевірка rooms (кімнат)

### 5.1. Кімнати без owner

    -- Rooms without any owner
    SELECT id, name, owner_type, owner_id, type
    FROM rooms
    WHERE owner_id IS NULL OR owner_id = '';

Очікування: * 0 рядків (усі кімнати мають належати city, microDAO, district, або агенту).

### 5.2. Кімнати без primary_agent

    -- District/City rooms without primary agent
    SELECT id, name, type, space_scope, primary_agent_id
    FROM rooms
    WHERE type IN ('city-room', 'district-room', 'front-room')
      AND (primary_agent_id IS NULL OR primary_agent_id = '');

Очікування: * 0 рядків.

## 6. Дії при виявленні "orphan" записів

Якщо будь-який із запитів повертає рядки:

1. Зробити snapshot результату (зберегти у `docs/debug/orphans_YYYYMMDD.md`).
2. Для кожного типу:
3. визначити правильного owner або agent,
4. або вирішити, що запис зайвий → видалити.
5. Створити окрему міграцію:
6. `migrations/0xx_fix_orphans_YYYYMMDD.sql`
7. тільки `UPDATE`/`DELETE`, без зміни схеми.

Після застосування міграції — повторно виконати всі запити з цього таску.

## 7. Умова завершення фази

Фаза вважається виконаною, якщо:

- всі SQL-запити з розділів 2–5 повертають 0 рядків (або винятки чітко описані й задокументовані),
- є короткий звіт у `docs/debug/orphans_YYYYMMDD.md`,
- UI:
- `/nodes` + detail-сторінка ноди працюють,
- `/agents` + кабінети агентів працюють,
- `/microdao` працює без помилок.