From 4ccdb30159cfdac8159e1093c3416e1522bf7d51 Mon Sep 17 00:00:00 2001 From: Apple Date: Sun, 30 Nov 2025 05:13:30 -0800 Subject: [PATCH] feat: MVP seed real entities (RECOVERY) - DAIS identities for all core agents - City governance: DAARWIZZ, DARIO, DARIA - District leads: SOUL, Helion, GREENFOOD - District teams: Spirit, Logic, Energia - Core agents: CLAN, DRUID, EONARCH, YAROMIR - MicroDAOs: daarion (root), energyunion, greenfood, soul-retreat - Agent assignments & permissions - District rooms for SOUL, ENERGYUNION, GREENFOOD --- .../TASK_PHASE_MVP_SEED_REAL_ENTITIES.md | 211 ++++++++ migrations/033_mvp_seed_real_entities.sql | 477 ++++++++++++++++++ 2 files changed, 688 insertions(+) create mode 100644 docs/tasks/TASK_PHASE_MVP_SEED_REAL_ENTITIES.md create mode 100644 migrations/033_mvp_seed_real_entities.sql diff --git a/docs/tasks/TASK_PHASE_MVP_SEED_REAL_ENTITIES.md b/docs/tasks/TASK_PHASE_MVP_SEED_REAL_ENTITIES.md new file mode 100644 index 00000000..eae4a0c6 --- /dev/null +++ b/docs/tasks/TASK_PHASE_MVP_SEED_REAL_ENTITIES.md @@ -0,0 +1,211 @@ +# TASK PHASE — MVP SEED REAL ENTITIES + +Version: 1.0 +Status: In Progress +Target: NODE1 (production DB: daarion) + +## 1. Мета + +Після FOUNDATION_UPDATE та впровадження Governance Backend API: + +- БД має всі нові таблиці (agents, microdaos, nodes, dais_*, agent_assignments, permissions, rooms, event_outbox, incidents, …), +- Frontend (Next.js, apps/web) ходить на `/api/v1/*` у city-service, +- Але **немає реальних даних** (агентів, microDAO, прив'язок), через що: + - `/agents`, `/microdaos`, `/governance`, `/city` у проді виглядають порожніми. + +Ціль фази — **засідити (seed)** реальні агентів, microDAO, базові зв'язки та перевірити, що: + +- на daarion.space зʼявляються: + - реальні агенти, + - реальні microDAO, + - реальні districts, + - city/district rooms, +- Governance UI і City UI працюють з живими даними. + +--- + +## 2. Обсяг робіт (Scope) + +### 2.1. Таблиці, які мають бути задіяні + +Не змінювати схему, лише наповнити: + +- `dais_identities` +- `agents` +- `microdaos` +- `nodes` (тільки реальні, без вигаданих) +- `agent_assignments` +- `permissions` +- `rooms` (перевірити, що seed не дублює існуючі) +- опційно: `event_outbox` (перевірити логування подій) + +### 2.2. Кого й що потрібно створити + +#### DAIS / Agents (core, що вже існують у концепції та/або в коді) + +1. City / Root: + - `DAARWIZZ` — мер / city lead + - `DARIO` — комʼюніті / city face + - `DARIA` — support / tech help + - `SOUL` — lead агент District SOUL + - `Helion` — lead агент District ENERGYUNION + - `GREENFOOD` (ERP Agent) — lead агент District GREENFOOD + +2. Інші вже згадані агенти: + - `CLAN` — orchestrator для clan-типу microDAO + - `DRUID` — лабораторія + - `EONARCH` — приватний агент + - `YAROMIR` — приватний агент + +> ВАЖЛИВО: +> Отримати точні назви / slug-и агентів із поточного коду/міграцій (НЕ вигадувати нові). + +#### MicroDAO + +Мінімальний набір: + +- `daarion` (root microDAO / city-level) +- `energyunion` (District — ENERGYUNION) +- `greenfood` (District — GREENFOOD) +- `retreat_hub` (District — SOUL Retreat) +- `clan_*` (якщо вже є реально створений клан microDAO) +- `druid_lab` (якщо існує) +- інші реальні microDAO з БД, якщо вже створювались через UI раніше + +Поля (орієнтовно, точний список взяти з міграцій): + +- `id` / `slug` +- `name` +- `dao_type` (`root`, `district`, `standard`, `community`, …) +- `orchestrator_agent_id` +- `status` (active) + +#### District Lead прив'язки + +У таблиці `microdaos` для: + +- `daarion` → `dao_type = 'root'`, orchestrator = `DAARWIZZ` +- `energyunion` → `dao_type = 'district'`, orchestrator = `Helion` +- `greenfood` → `dao_type = 'district'`, orchestrator = `GREENFOOD` +- `retreat_hub` → `dao_type = 'district'`, orchestrator = `SOUL` + +#### Agent Assignments / Governance + +У `agent_assignments` + `permissions`: + +- DAARWIZZ: + - scope: `city` + - role: `city_governance` +- DARIO: + - scope: `city` + - role: `city_community` +- DARIA: + - scope: `city` + - role: `city_support` +- Helion: + - scope: `district:energyunion` + - role: `district_lead` +- GREENFOOD: + - scope: `district:greenfood` + - role: `district_lead` +- SOUL: + - scope: `district:retreat_hub` + - role: `district_lead` + +(Точні значення enum/рядків взяти з `Agent_Governance_Protocol_v1.md` + актуальних міграцій.) + +#### Nodes + +- Заповнювати тільки тим, що реально існує (NODE1, NODE2, якщо вони відображаються в схемі як rows у `nodes`). +- Якщо зараз фізичні ноди ще не підʼєднані як entries у БД — цю частину можна пропустити або створити лише запис для `NODE1` (якщо вже використовується в коді). +- Строго дотримуватись правила: + > "Жодних автосозданих нод — тільки приєднані по факту". + +--- + +## 3. Реалізація + +### 3.1. Формат + +Створити **одну нову міграцію** для seed, наприклад: + +- `migrations/033_mvp_seed_real_entities.sql` + +Вимоги: + +- **ідемпотентність**: + - використовувати `INSERT ... ON CONFLICT DO NOTHING` (якщо SQL), + - або попередньо перевіряти існування записів. +- НЕ змінювати схему (жодних `ALTER TABLE`), тільки `INSERT`. + +### 3.2. Кроки + +1. **Проаналізувати схему**: + - переглянути останні міграції: `027_*` (FOUNDATION_UPDATE), + - зафіксувати точні назви колонок. + +2. **Підготувати seed для DAIS identities**: + - створити `dais_identities` для: + - DAARWIZZ, DARIO, DARIA, SOUL, Helion, GREENFOOD, CLAN, DRUID, EONARCH, YAROMIR. + - якщо emails/wallets вже є — не дублювати. + +3. **Створити записи в `agents`**: + - звʼязати кожного агента з його `dais_id`. + - заповнити: + - `display_name`, + - `slug`, + - `gov_level` (для city/district агентів), + - `status = 'active'`. + +4. **Створити записи в `microdaos`**: + - `daarion`, `energyunion`, `greenfood`, `retreat_hub`, інші реальні. + - виставити `dao_type` + `orchestrator_agent_id`. + +5. **Створити `agent_assignments`**: + - згідно з переліком вище (city, districts). + +6. **Створити `permissions`**: + - мінімальний набір, щоб Governance UI коректно показував ролі (див. `Agent_Governance_Protocol_v1.md`). + +7. **Перевірити `rooms`**: + - city rooms та district rooms частково вже seeded FOUNDATION_UPDATE (city-lobby, city-square, city-news, … + rooms для GREENFOOD/ENERGYUNION/SOUL). + - Перевірити, чи: + - є посилання на owner_microdao / owner_agent (якщо такі колонки є), + - не створюються дублікати. + +8. **Локально прогнати міграцію** (якщо можливо) або на staging. + +9. **Запустити міграцію на NODE1**: + - через той самий механізм, що й `027_*`. + +10. **Smoke-тести в проді**: + - Зайти на: + - `/agents` — повинні зʼявитись DAARWIZZ, DARIO, DARIA, Helion, GREENFOOD, SOUL, CLAN, DRUID, EONARCH, YAROMIR. + - `/governance` — показує city governance agents + districts. + - `/city` — показує city rooms та привʼязаних агентів. + - `/district/energyunion`, `/district/greenfood`, `/district/soul` (коли будуть маршрути) — інформація не пуста. + +--- + +## 4. Checklist для завершення фази + +- [ ] Є файл `migrations/033_mvp_seed_real_entities.sql`. +- [ ] Міграція застосована до БД `daarion` на NODE1. +- [ ] В `agents` є записи для всіх core-агентів. +- [ ] В `microdaos` є root + всі три District (GREENFOOD, ENERGYUNION, SOUL) + інші реальні. +- [ ] В `agent_assignments` та `permissions` є мінімальний набір для: + - city governance (DAARWIZZ/DARIO/DARIA), + - district_lead (Helion, GREENFOOD, SOUL). +- [ ] На daarion.space: + - `/governance` показує реальних агентів, + - `/city` показує city rooms та прив'язки, + - `/agents` не порожній. + +--- + +## 5. Нотатки + +- Усі назви агентів, microDAO, полів таблиць — брати з існуючого коду та міграцій. +- Не створювати вигаданих агентів, microDAO, nodes. +- Node entries створювати **лише при наявності реальних фізичних нод**. + diff --git a/migrations/033_mvp_seed_real_entities.sql b/migrations/033_mvp_seed_real_entities.sql new file mode 100644 index 00000000..1fede00a --- /dev/null +++ b/migrations/033_mvp_seed_real_entities.sql @@ -0,0 +1,477 @@ +-- ============================================================================ +-- Migration 033: MVP Seed Real Entities +-- Purpose: Seed real agents, microDAOs, and assignments for production MVP +-- Date: 2025-11-30 +-- Status: MVP Recovery +-- ============================================================================ + +-- ============================================================================ +-- 0. CREATE USERS IF NEEDED (for owner_user_id reference) +-- ============================================================================ + +-- Ensure admin user exists +INSERT INTO users (id, email, display_name, created_at) +SELECT + '00000000-0000-0000-0000-000000000001'::UUID, + 'admin@daarion.xyz', + 'DAARION Admin', + NOW() +WHERE NOT EXISTS (SELECT 1 FROM users WHERE email = 'admin@daarion.xyz') +ON CONFLICT (id) DO NOTHING; + +-- ============================================================================ +-- 1. DAIS IDENTITIES - Core Agents +-- ============================================================================ + +-- City Governance Agents +INSERT INTO dais_identities (id, did, default_email, trust_level, metadata) +VALUES + ('dais-daarwizz', 'did:daarion:daarwizz', 'daarwizz@daarion.city', 'operator', '{"role": "city_mayor", "type": "ai-agent"}'::jsonb), + ('dais-dario', 'did:daarion:dario', 'dario@daarion.city', 'operator', '{"role": "city_community", "type": "ai-agent"}'::jsonb), + ('dais-daria', 'did:daarion:daria', 'daria@daarion.city', 'operator', '{"role": "city_support", "type": "ai-agent"}'::jsonb) +ON CONFLICT (id) DO UPDATE SET + trust_level = EXCLUDED.trust_level, + metadata = EXCLUDED.metadata; + +-- District Lead Agents +INSERT INTO dais_identities (id, did, default_email, trust_level, metadata) +VALUES + ('dais-soul', 'did:daarion:soul', 'soul@daarion.city', 'operator', '{"role": "district_lead", "district": "soul-retreat", "type": "ai-agent"}'::jsonb), + ('dais-helion', 'did:daarion:helion', 'helion@daarion.city', 'operator', '{"role": "district_lead", "district": "energyunion", "type": "ai-agent"}'::jsonb), + ('dais-greenfood', 'did:daarion:greenfood', 'greenfood@daarion.city', 'operator', '{"role": "district_lead", "district": "greenfood", "type": "ai-agent"}'::jsonb) +ON CONFLICT (id) DO UPDATE SET + trust_level = EXCLUDED.trust_level, + metadata = EXCLUDED.metadata; + +-- District Support Agents +INSERT INTO dais_identities (id, did, default_email, trust_level, metadata) +VALUES + ('dais-spirit', 'did:daarion:spirit', 'spirit@daarion.city', 'verified', '{"role": "guidance_agent", "district": "soul-retreat", "type": "ai-agent"}'::jsonb), + ('dais-logic', 'did:daarion:logic', 'logic@daarion.city', 'verified', '{"role": "info_agent", "district": "soul-retreat", "type": "ai-agent"}'::jsonb), + ('dais-energia', 'did:daarion:energia', 'energia@daarion.city', 'verified', '{"role": "energy_agent", "district": "energyunion", "type": "ai-agent"}'::jsonb) +ON CONFLICT (id) DO UPDATE SET + trust_level = EXCLUDED.trust_level, + metadata = EXCLUDED.metadata; + +-- Other Core Agents +INSERT INTO dais_identities (id, did, default_email, trust_level, metadata) +VALUES + ('dais-clan', 'did:daarion:clan', 'clan@daarion.city', 'orchestrator', '{"role": "orchestrator", "type": "ai-agent"}'::jsonb), + ('dais-druid', 'did:daarion:druid', 'druid@daarion.city', 'verified', '{"role": "researcher", "type": "ai-agent"}'::jsonb), + ('dais-eonarch', 'did:daarion:eonarch', 'eonarch@daarion.city', 'verified', '{"role": "personal_agent", "type": "ai-agent"}'::jsonb), + ('dais-yaromir', 'did:daarion:yaromir', 'yaromir@daarion.city', 'verified', '{"role": "personal_agent", "type": "ai-agent"}'::jsonb) +ON CONFLICT (id) DO UPDATE SET + trust_level = EXCLUDED.trust_level, + metadata = EXCLUDED.metadata; + +-- ============================================================================ +-- 2. AGENTS - Core Agents +-- ============================================================================ + +-- Get admin user ID +DO $$ +DECLARE + admin_user_id UUID; +BEGIN + SELECT id INTO admin_user_id FROM users WHERE email = 'admin@daarion.xyz' LIMIT 1; + IF admin_user_id IS NULL THEN + SELECT id INTO admin_user_id FROM users LIMIT 1; + END IF; + + -- City Governance Agents + INSERT INTO agents (external_id, name, kind, owner_user_id, description, is_active, gov_level, status, dais_identity_id, agent_role, agent_service_scope, avatar_url) + VALUES + ('agent:daarwizz', 'DAARWIZZ', 'governance', admin_user_id, 'Мер DAARION.city — головний агент міста', true, 'city_governance', 'active', 'dais-daarwizz', 'orchestrator', 'city', '/avatars/daarwizz.png'), + ('agent:dario', 'DARIO', 'community', admin_user_id, 'Комʼюніті-менеджер DAARION.city', true, 'city_governance', 'active', 'dais-dario', 'orchestrator', 'city', '/avatars/dario.png'), + ('agent:daria', 'DARIA', 'support', admin_user_id, 'Технічна підтримка DAARION.city', true, 'city_governance', 'active', 'dais-daria', 'orchestrator', 'city', '/avatars/daria.png') + ON CONFLICT (external_id) DO UPDATE SET + gov_level = EXCLUDED.gov_level, + status = EXCLUDED.status, + dais_identity_id = EXCLUDED.dais_identity_id, + agent_role = EXCLUDED.agent_role, + agent_service_scope = EXCLUDED.agent_service_scope, + description = EXCLUDED.description; + + -- District Lead Agents + INSERT INTO agents (external_id, name, kind, owner_user_id, description, is_active, gov_level, status, dais_identity_id, agent_role, agent_service_scope, avatar_url) + VALUES + ('agent:soul', 'SOUL', 'district_lead', admin_user_id, 'District Lead Agent — SOUL Retreat (Wellness/Metahuman)', true, 'district_lead', 'active', 'dais-soul', 'orchestrator', 'district', '/avatars/soul.png'), + ('agent:helion', 'Helion', 'district_lead', admin_user_id, 'District Lead Agent — ENERGYUNION (DePIN/Energy/Compute)', true, 'district_lead', 'active', 'dais-helion', 'orchestrator', 'district', '/avatars/helion.png'), + ('agent:greenfood', 'GREENFOOD', 'district_lead', admin_user_id, 'District Lead Agent — GREENFOOD (IndustryOps/Supply-Chain)', true, 'district_lead', 'active', 'dais-greenfood', 'orchestrator', 'district', '/avatars/greenfood.png') + ON CONFLICT (external_id) DO UPDATE SET + gov_level = EXCLUDED.gov_level, + status = EXCLUDED.status, + dais_identity_id = EXCLUDED.dais_identity_id, + agent_role = EXCLUDED.agent_role, + agent_service_scope = EXCLUDED.agent_service_scope, + description = EXCLUDED.description; + + -- District Support Agents + INSERT INTO agents (external_id, name, kind, owner_user_id, description, is_active, gov_level, status, dais_identity_id, agent_role, agent_service_scope, avatar_url) + VALUES + ('agent:spirit', 'Spirit', 'guidance', admin_user_id, 'AI Guidance Agent — медитації, практики, підтримка (SOUL)', true, 'core_team', 'active', 'dais-spirit', 'regular', 'district', '/avatars/spirit.png'), + ('agent:logic', 'Logic', 'info', admin_user_id, 'AI Information Agent — розклад, інфо, форми (SOUL)', true, 'core_team', 'active', 'dais-logic', 'regular', 'district', '/avatars/logic.png'), + ('agent:energia', 'Energia', 'energy', admin_user_id, 'Energy Agent — телеметрія та аналітика (ENERGYUNION)', true, 'core_team', 'active', 'dais-energia', 'regular', 'district', '/avatars/energia.png') + ON CONFLICT (external_id) DO UPDATE SET + gov_level = EXCLUDED.gov_level, + status = EXCLUDED.status, + dais_identity_id = EXCLUDED.dais_identity_id, + agent_role = EXCLUDED.agent_role, + agent_service_scope = EXCLUDED.agent_service_scope, + description = EXCLUDED.description; + + -- Other Core Agents + INSERT INTO agents (external_id, name, kind, owner_user_id, description, is_active, gov_level, status, dais_identity_id, agent_role, avatar_url) + VALUES + ('agent:clan', 'CLAN', 'orchestrator', admin_user_id, 'Orchestrator для clan-типу microDAO', true, 'orchestrator', 'active', 'dais-clan', 'orchestrator', '/avatars/clan.png'), + ('agent:druid', 'DRUID', 'researcher', admin_user_id, 'Research & Development Agent', true, 'worker', 'active', 'dais-druid', 'regular', '/avatars/druid.png'), + ('agent:eonarch', 'EONARCH', 'personal', admin_user_id, 'Personal AI Assistant', true, 'personal', 'active', 'dais-eonarch', 'regular', '/avatars/eonarch.png'), + ('agent:yaromir', 'YAROMIR', 'personal', admin_user_id, 'Personal AI Assistant', true, 'personal', 'active', 'dais-yaromir', 'regular', '/avatars/yaromir.png') + ON CONFLICT (external_id) DO UPDATE SET + gov_level = EXCLUDED.gov_level, + status = EXCLUDED.status, + dais_identity_id = EXCLUDED.dais_identity_id, + agent_role = EXCLUDED.agent_role, + description = EXCLUDED.description; +END $$; + +-- ============================================================================ +-- 3. MICRODAOS - Core DAOs +-- ============================================================================ + +DO $$ +DECLARE + admin_user_id UUID; + daarion_id UUID; + energyunion_id UUID; + greenfood_id UUID; + soul_retreat_id UUID; +BEGIN + SELECT id INTO admin_user_id FROM users WHERE email = 'admin@daarion.xyz' LIMIT 1; + IF admin_user_id IS NULL THEN + SELECT id INTO admin_user_id FROM users LIMIT 1; + END IF; + + -- Root MicroDAO (City) + INSERT INTO microdaos (external_id, slug, name, description, owner_user_id, is_active, dao_type) + VALUES ('microdao:daarion', 'daarion', 'DAARION City', 'Root MicroDAO — DAARION.city', admin_user_id, true, 'root') + ON CONFLICT (slug) DO UPDATE SET + dao_type = 'root', + description = EXCLUDED.description + RETURNING id INTO daarion_id; + + IF daarion_id IS NULL THEN + SELECT id INTO daarion_id FROM microdaos WHERE slug = 'daarion'; + END IF; + + -- District: ENERGYUNION + INSERT INTO microdaos (external_id, slug, name, description, owner_user_id, is_active, dao_type) + VALUES ('microdao:energyunion', 'energyunion', 'ENERGYUNION', 'DePIN / Energy Grid / Compute Grid / AI District', admin_user_id, true, 'district') + ON CONFLICT (slug) DO UPDATE SET + dao_type = 'district', + description = EXCLUDED.description + RETURNING id INTO energyunion_id; + + IF energyunion_id IS NULL THEN + SELECT id INTO energyunion_id FROM microdaos WHERE slug = 'energyunion'; + END IF; + + -- District: GREENFOOD + INSERT INTO microdaos (external_id, slug, name, description, owner_user_id, is_active, dao_type) + VALUES ('microdao:greenfood', 'greenfood', 'GREENFOOD', 'IndustryOps / Supply-Chain District', admin_user_id, true, 'district') + ON CONFLICT (slug) DO UPDATE SET + dao_type = 'district', + description = EXCLUDED.description + RETURNING id INTO greenfood_id; + + IF greenfood_id IS NULL THEN + SELECT id INTO greenfood_id FROM microdaos WHERE slug = 'greenfood'; + END IF; + + -- District: SOUL Retreat + INSERT INTO microdaos (external_id, slug, name, description, owner_user_id, is_active, dao_type) + VALUES ('microdao:soul-retreat', 'soul-retreat', 'SOUL Retreat', 'Wellness / Retreat / Metahuman District', admin_user_id, true, 'district') + ON CONFLICT (slug) DO UPDATE SET + dao_type = 'district', + description = EXCLUDED.description + RETURNING id INTO soul_retreat_id; + + IF soul_retreat_id IS NULL THEN + SELECT id INTO soul_retreat_id FROM microdaos WHERE slug = 'soul-retreat'; + END IF; + + -- Update orchestrator references + UPDATE microdaos SET primary_orchestrator_agent_id = (SELECT id::TEXT FROM agents WHERE external_id = 'agent:daarwizz' LIMIT 1) + WHERE slug = 'daarion'; + + UPDATE microdaos SET primary_orchestrator_agent_id = (SELECT id::TEXT FROM agents WHERE external_id = 'agent:helion' LIMIT 1) + WHERE slug = 'energyunion'; + + UPDATE microdaos SET primary_orchestrator_agent_id = (SELECT id::TEXT FROM agents WHERE external_id = 'agent:greenfood' LIMIT 1) + WHERE slug = 'greenfood'; + + UPDATE microdaos SET primary_orchestrator_agent_id = (SELECT id::TEXT FROM agents WHERE external_id = 'agent:soul' LIMIT 1) + WHERE slug = 'soul-retreat'; + + -- Update agents' home_microdao_id + UPDATE agents SET home_microdao_id = daarion_id::TEXT + WHERE external_id IN ('agent:daarwizz', 'agent:dario', 'agent:daria'); + + UPDATE agents SET home_microdao_id = energyunion_id::TEXT + WHERE external_id IN ('agent:helion', 'agent:energia'); + + UPDATE agents SET home_microdao_id = greenfood_id::TEXT + WHERE external_id = 'agent:greenfood'; + + UPDATE agents SET home_microdao_id = soul_retreat_id::TEXT + WHERE external_id IN ('agent:soul', 'agent:spirit', 'agent:logic'); +END $$; + +-- ============================================================================ +-- 4. AGENT ASSIGNMENTS +-- ============================================================================ + +-- City Governance Assignments +INSERT INTO agent_assignments (agent_id, target_microdao_id, scope, role, metadata) +SELECT + a.id::TEXT, + m.id::TEXT, + 'city'::assignment_scope, + 'city_governance', + '{"power": ["administrative", "moderation", "protocol"]}'::jsonb +FROM agents a, microdaos m +WHERE a.external_id = 'agent:daarwizz' AND m.slug = 'daarion' +ON CONFLICT (agent_id, target_microdao_id, role) DO NOTHING; + +INSERT INTO agent_assignments (agent_id, target_microdao_id, scope, role, metadata) +SELECT + a.id::TEXT, + m.id::TEXT, + 'city'::assignment_scope, + 'city_community', + '{"power": ["moderation", "execution"]}'::jsonb +FROM agents a, microdaos m +WHERE a.external_id = 'agent:dario' AND m.slug = 'daarion' +ON CONFLICT (agent_id, target_microdao_id, role) DO NOTHING; + +INSERT INTO agent_assignments (agent_id, target_microdao_id, scope, role, metadata) +SELECT + a.id::TEXT, + m.id::TEXT, + 'city'::assignment_scope, + 'city_support', + '{"power": ["moderation", "identity"]}'::jsonb +FROM agents a, microdaos m +WHERE a.external_id = 'agent:daria' AND m.slug = 'daarion' +ON CONFLICT (agent_id, target_microdao_id, role) DO NOTHING; + +-- District Lead Assignments +INSERT INTO agent_assignments (agent_id, target_microdao_id, scope, role, metadata) +SELECT + a.id::TEXT, + m.id::TEXT, + 'district'::assignment_scope, + 'district_lead', + '{"power": ["administrative", "moderation", "district"]}'::jsonb +FROM agents a, microdaos m +WHERE a.external_id = 'agent:helion' AND m.slug = 'energyunion' +ON CONFLICT (agent_id, target_microdao_id, role) DO NOTHING; + +INSERT INTO agent_assignments (agent_id, target_microdao_id, scope, role, metadata) +SELECT + a.id::TEXT, + m.id::TEXT, + 'district'::assignment_scope, + 'district_lead', + '{"power": ["administrative", "moderation", "district"]}'::jsonb +FROM agents a, microdaos m +WHERE a.external_id = 'agent:greenfood' AND m.slug = 'greenfood' +ON CONFLICT (agent_id, target_microdao_id, role) DO NOTHING; + +INSERT INTO agent_assignments (agent_id, target_microdao_id, scope, role, metadata) +SELECT + a.id::TEXT, + m.id::TEXT, + 'district'::assignment_scope, + 'district_lead', + '{"power": ["administrative", "moderation", "district"]}'::jsonb +FROM agents a, microdaos m +WHERE a.external_id = 'agent:soul' AND m.slug = 'soul-retreat' +ON CONFLICT (agent_id, target_microdao_id, role) DO NOTHING; + +-- District Core-team Assignments +INSERT INTO agent_assignments (agent_id, target_microdao_id, scope, role, metadata) +SELECT + a.id::TEXT, + m.id::TEXT, + 'district'::assignment_scope, + 'core_team', + '{"power": ["execution"], "specialty": "guidance"}'::jsonb +FROM agents a, microdaos m +WHERE a.external_id = 'agent:spirit' AND m.slug = 'soul-retreat' +ON CONFLICT (agent_id, target_microdao_id, role) DO NOTHING; + +INSERT INTO agent_assignments (agent_id, target_microdao_id, scope, role, metadata) +SELECT + a.id::TEXT, + m.id::TEXT, + 'district'::assignment_scope, + 'core_team', + '{"power": ["execution"], "specialty": "information"}'::jsonb +FROM agents a, microdaos m +WHERE a.external_id = 'agent:logic' AND m.slug = 'soul-retreat' +ON CONFLICT (agent_id, target_microdao_id, role) DO NOTHING; + +INSERT INTO agent_assignments (agent_id, target_microdao_id, scope, role, metadata) +SELECT + a.id::TEXT, + m.id::TEXT, + 'district'::assignment_scope, + 'core_team', + '{"power": ["execution", "infrastructure"], "specialty": "energy"}'::jsonb +FROM agents a, microdaos m +WHERE a.external_id = 'agent:energia' AND m.slug = 'energyunion' +ON CONFLICT (agent_id, target_microdao_id, role) DO NOTHING; + +-- ============================================================================ +-- 5. PERMISSIONS - Base Permissions for City Governance +-- ============================================================================ + +-- DAARWIZZ permissions (superadmin on city) +INSERT INTO permissions (dais_id, target_type, target_id, action, granted_by) +VALUES + ('dais-daarwizz', 'city', 'daarion', 'superadmin', 'system') +ON CONFLICT (dais_id, target_type, target_id, action) DO NOTHING; + +-- DARIO permissions (moderate city) +INSERT INTO permissions (dais_id, target_type, target_id, action, granted_by) +VALUES + ('dais-dario', 'city', 'daarion', 'moderate', 'dais-daarwizz') +ON CONFLICT (dais_id, target_type, target_id, action) DO NOTHING; + +-- DARIA permissions (admin city) +INSERT INTO permissions (dais_id, target_type, target_id, action, granted_by) +VALUES + ('dais-daria', 'city', 'daarion', 'admin', 'dais-daarwizz') +ON CONFLICT (dais_id, target_type, target_id, action) DO NOTHING; + +-- District Lead permissions +INSERT INTO permissions (dais_id, target_type, target_id, action, granted_by) +SELECT 'dais-helion', 'district', id::TEXT, 'admin', 'dais-daarwizz' +FROM microdaos WHERE slug = 'energyunion' +ON CONFLICT (dais_id, target_type, target_id, action) DO NOTHING; + +INSERT INTO permissions (dais_id, target_type, target_id, action, granted_by) +SELECT 'dais-greenfood', 'district', id::TEXT, 'admin', 'dais-daarwizz' +FROM microdaos WHERE slug = 'greenfood' +ON CONFLICT (dais_id, target_type, target_id, action) DO NOTHING; + +INSERT INTO permissions (dais_id, target_type, target_id, action, granted_by) +SELECT 'dais-soul', 'district', id::TEXT, 'admin', 'dais-daarwizz' +FROM microdaos WHERE slug = 'soul-retreat' +ON CONFLICT (dais_id, target_type, target_id, action) DO NOTHING; + +-- ============================================================================ +-- 6. ROOMS - District Rooms (if not exist) +-- ============================================================================ + +-- SOUL District Rooms +INSERT INTO rooms (id, owner_type, owner_id, type, space_scope, visibility, name, description, primary_agent_id) +SELECT + 'soul-lobby', 'district', id::TEXT, 'district-room', 'district', 'public-city', + 'SOUL Lobby', 'Головний вхід до SOUL Retreat District', 'soul' +FROM microdaos WHERE slug = 'soul-retreat' +ON CONFLICT (id) DO NOTHING; + +INSERT INTO rooms (id, owner_type, owner_id, type, space_scope, visibility, name, description, primary_agent_id) +SELECT + 'soul-events', 'district', id::TEXT, 'district-room', 'district', 'public-city', + 'SOUL Events', 'Анонси подій та ретритів', 'soul' +FROM microdaos WHERE slug = 'soul-retreat' +ON CONFLICT (id) DO NOTHING; + +INSERT INTO rooms (id, owner_type, owner_id, type, space_scope, visibility, name, description, primary_agent_id) +SELECT + 'soul-guidance', 'district', id::TEXT, 'district-room', 'district', 'members', + 'SOUL Guidance', 'Кімната Spirit & Logic — медитації та інфо', 'spirit' +FROM microdaos WHERE slug = 'soul-retreat' +ON CONFLICT (id) DO NOTHING; + +INSERT INTO rooms (id, owner_type, owner_id, type, space_scope, visibility, name, description, primary_agent_id) +SELECT + 'soul-masters', 'district', id::TEXT, 'district-room', 'district', 'public-city', + 'SOUL Masters', 'Профілі майстрів та вчителів', 'soul' +FROM microdaos WHERE slug = 'soul-retreat' +ON CONFLICT (id) DO NOTHING; + +INSERT INTO rooms (id, owner_type, owner_id, type, space_scope, visibility, name, description, primary_agent_id) +SELECT + 'soul-help', 'district', id::TEXT, 'district-room', 'district', 'public-city', + 'SOUL Help', 'Підтримка та FAQ', 'logic' +FROM microdaos WHERE slug = 'soul-retreat' +ON CONFLICT (id) DO NOTHING; + +-- SOUL Portal to City +INSERT INTO rooms (id, owner_type, owner_id, type, space_scope, visibility, name, description, is_portal, portal_target_microdao_id, zone) +SELECT + 'soul-city-portal', 'district', id::TEXT, 'front-room', 'city', 'public-city', + 'SOUL Retreat Portal', 'Портал до SOUL Retreat District', true, id::TEXT, 'wellness-zone' +FROM microdaos WHERE slug = 'soul-retreat' +ON CONFLICT (id) DO NOTHING; + +-- ENERGYUNION additional rooms +INSERT INTO rooms (id, owner_type, owner_id, type, space_scope, visibility, name, description, primary_agent_id) +SELECT + 'energyunion-telemetry', 'district', id::TEXT, 'district-room', 'district', 'members', + 'ENERGYUNION Telemetry', 'Телеметрія та моніторинг енергії', 'energia' +FROM microdaos WHERE slug = 'energyunion' +ON CONFLICT (id) DO NOTHING; + +INSERT INTO rooms (id, owner_type, owner_id, type, space_scope, visibility, name, description, primary_agent_id) +SELECT + 'energyunion-compute', 'district', id::TEXT, 'district-room', 'district', 'members', + 'ENERGYUNION Compute', 'AI/Compute ресурси та лабораторії', 'helion' +FROM microdaos WHERE slug = 'energyunion' +ON CONFLICT (id) DO NOTHING; + +-- GREENFOOD additional rooms +INSERT INTO rooms (id, owner_type, owner_id, type, space_scope, visibility, name, description, primary_agent_id) +SELECT + 'greenfood-warehouse', 'district', id::TEXT, 'district-room', 'district', 'members', + 'GREENFOOD Warehouses', 'Склади та інвентар', 'greenfood' +FROM microdaos WHERE slug = 'greenfood' +ON CONFLICT (id) DO NOTHING; + +INSERT INTO rooms (id, owner_type, owner_id, type, space_scope, visibility, name, description, primary_agent_id) +SELECT + 'greenfood-logistics', 'district', id::TEXT, 'district-room', 'district', 'members', + 'GREENFOOD Logistics', 'Логістика та доставка', 'greenfood' +FROM microdaos WHERE slug = 'greenfood' +ON CONFLICT (id) DO NOTHING; + +-- ============================================================================ +-- 7. LOG SEED EVENT +-- ============================================================================ + +INSERT INTO event_outbox (event_type, subject, payload, version, status, actor_id, scope) +VALUES ( + 'system.seed.completed', + 'daarion.system.seed', + jsonb_build_object( + 'migration', '033_mvp_seed_real_entities', + 'agents_seeded', ARRAY['daarwizz', 'dario', 'daria', 'soul', 'helion', 'greenfood', 'spirit', 'logic', 'energia', 'clan', 'druid', 'eonarch', 'yaromir'], + 'microdaos_seeded', ARRAY['daarion', 'energyunion', 'greenfood', 'soul-retreat'], + 'timestamp', NOW() + ), + '1.0', + 'published', + 'system', + 'city' +); + +-- ============================================================================ +-- DONE +-- ============================================================================ + +SELECT 'Migration 033 completed: MVP Seed Real Entities' as result; +