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 працює без помилок.