Files
microdao-daarion/site/tasks/TASK_PHASE_NODE1_REPAIR/index.html
Apple ef3473db21 snapshot: NODE1 production state 2026-02-09
Complete snapshot of /opt/microdao-daarion/ from NODE1 (144.76.224.179).
This represents the actual running production code that has diverged
significantly from the previous main branch.

Key changes from old main:
- Gateway (http_api.py): expanded from ~40KB to 164KB with full agent support
- Router: new /v1/agents/{id}/infer endpoint with vision + DeepSeek routing
- Behavior Policy: SOWA v2.2 (3-level: FULL/ACK/SILENT)
- Agent Registry: config/agent_registry.yml as single source of truth
- 13 agents configured (was 3)
- Memory service integration
- CrewAI teams and roles

Excluded from snapshot: venv/, .env, data/, backups, .tgz archives

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-09 08:46:46 -08:00

1317 lines
52 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!doctype html>
<html lang="en" class="no-js">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<link rel="canonical" href="https://IvanTytar.github.io/microdao-daarion/tasks/TASK_PHASE_NODE1_REPAIR/">
<link rel="icon" href="../../assets/images/favicon.png">
<meta name="generator" content="mkdocs-1.5.3, mkdocs-material-9.5.18">
<title>TASK_PHASE_NODE1_REPAIR.md - DAARION Documentation</title>
<link rel="stylesheet" href="../../assets/stylesheets/main.66ac8b77.min.css">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,300i,400,400i,700,700i%7CRoboto+Mono:400,400i,700,700i&display=fallback">
<style>:root{--md-text-font:"Roboto";--md-code-font:"Roboto Mono"}</style>
<script>__md_scope=new URL("../..",location),__md_hash=e=>[...e].reduce((e,_)=>(e<<5)-e+_.charCodeAt(0),0),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+"."+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+"."+e,JSON.stringify(_))}catch(e){}}</script>
</head>
<body dir="ltr">
<input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off">
<input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off">
<label class="md-overlay" for="__drawer"></label>
<div data-md-component="skip">
<a href="#task_phase_node1_repairmd" class="md-skip">
Skip to content
</a>
</div>
<div data-md-component="announce">
</div>
<header class="md-header md-header--shadow" data-md-component="header">
<nav class="md-header__inner md-grid" aria-label="Header">
<a href="../.." title="DAARION Documentation" class="md-header__button md-logo" aria-label="DAARION Documentation" data-md-component="logo">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54Z"/></svg>
</a>
<label class="md-header__button md-icon" for="__drawer">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3 6h18v2H3V6m0 5h18v2H3v-2m0 5h18v2H3v-2Z"/></svg>
</label>
<div class="md-header__title" data-md-component="header-title">
<div class="md-header__ellipsis">
<div class="md-header__topic">
<span class="md-ellipsis">
DAARION Documentation
</span>
</div>
<div class="md-header__topic" data-md-component="header-topic">
<span class="md-ellipsis">
TASK_PHASE_NODE1_REPAIR.md
</span>
</div>
</div>
</div>
<script>var media,input,key,value,palette=__md_get("__palette");if(palette&&palette.color){"(prefers-color-scheme)"===palette.color.media&&(media=matchMedia("(prefers-color-scheme: light)"),input=document.querySelector(media.matches?"[data-md-color-media='(prefers-color-scheme: light)']":"[data-md-color-media='(prefers-color-scheme: dark)']"),palette.color.media=input.getAttribute("data-md-color-media"),palette.color.scheme=input.getAttribute("data-md-color-scheme"),palette.color.primary=input.getAttribute("data-md-color-primary"),palette.color.accent=input.getAttribute("data-md-color-accent"));for([key,value]of Object.entries(palette.color))document.body.setAttribute("data-md-color-"+key,value)}</script>
<label class="md-header__button md-icon" for="__search">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5Z"/></svg>
</label>
<div class="md-search" data-md-component="search" role="dialog">
<label class="md-search__overlay" for="__search"></label>
<div class="md-search__inner" role="search">
<form class="md-search__form" name="search">
<input type="text" class="md-search__input" name="query" aria-label="Search" placeholder="Search" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="search-query" required>
<label class="md-search__icon md-icon" for="__search">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5Z"/></svg>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11h12Z"/></svg>
</label>
<nav class="md-search__options" aria-label="Search">
<button type="reset" class="md-search__icon md-icon" title="Clear" aria-label="Clear" tabindex="-1">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12 19 6.41Z"/></svg>
</button>
</nav>
</form>
<div class="md-search__output">
<div class="md-search__scrollwrap" data-md-scrollfix>
<div class="md-search-result" data-md-component="search-result">
<div class="md-search-result__meta">
Initializing search
</div>
<ol class="md-search-result__list" role="presentation"></ol>
</div>
</div>
</div>
</div>
</div>
</nav>
</header>
<div class="md-container" data-md-component="container">
<main class="md-main" data-md-component="main">
<div class="md-main__inner md-grid">
<div class="md-sidebar md-sidebar--primary" data-md-component="sidebar" data-md-type="navigation" >
<div class="md-sidebar__scrollwrap">
<div class="md-sidebar__inner">
<nav class="md-nav md-nav--primary" aria-label="Navigation" data-md-level="0">
<label class="md-nav__title" for="__drawer">
<a href="../.." title="DAARION Documentation" class="md-nav__button md-logo" aria-label="DAARION Documentation" data-md-component="logo">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54Z"/></svg>
</a>
DAARION Documentation
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../public/" class="md-nav__link">
<span class="md-ellipsis">
Home
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../public/getting-started/" class="md-nav__link">
<span class="md-ellipsis">
Getting Started
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../public/architecture-overview/" class="md-nav__link">
<span class="md-ellipsis">
Architecture
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../public/daiS_daos_overview/" class="md-nav__link">
<span class="md-ellipsis">
DAIS & DAOS
</span>
</a>
</li>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_5" >
<label class="md-nav__link" for="__nav_5" id="__nav_5_label" tabindex="">
<span class="md-ellipsis">
Internal
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_5_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_5">
<span class="md-nav__icon md-icon"></span>
Internal
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_5_1" >
<label class="md-nav__link" for="__nav_5_1" id="__nav_5_1_label" tabindex="0">
<span class="md-ellipsis">
Infra
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_5_1_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_5_1">
<span class="md-nav__icon md-icon"></span>
Infra
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../internal/infra/INFRA_AUTOMATION_PACK_V1/" class="md-nav__link">
<span class="md-ellipsis">
Infra Automation Pack v1
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../internal/infra/monitoring_overview/" class="md-nav__link">
<span class="md-ellipsis">
Monitoring Overview
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../internal/infra/nodes_registry_v0/" class="md-nav__link">
<span class="md-ellipsis">
Nodes Registry v0
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_5_2" >
<label class="md-nav__link" for="__nav_5_2" id="__nav_5_2_label" tabindex="0">
<span class="md-ellipsis">
Specs
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_5_2_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_5_2">
<span class="md-nav__icon md-icon"></span>
Specs
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../internal/specs/matrix_presence_aggregator/" class="md-nav__link">
<span class="md-ellipsis">
Matrix Presence Aggregator
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../internal/specs/city_map_spec/" class="md-nav__link">
<span class="md-ellipsis">
City Map Spec
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../internal/specs/node_join_protocol_draft/" class="md-nav__link">
<span class="md-ellipsis">
Node Join Protocol (Draft)
</span>
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</div>
</div>
</div>
<div class="md-sidebar md-sidebar--secondary" data-md-component="sidebar" data-md-type="toc" >
<div class="md-sidebar__scrollwrap">
<div class="md-sidebar__inner">
<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
<label class="md-nav__title" for="__toc">
<span class="md-nav__icon md-icon"></span>
Table of contents
</label>
<ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
<li class="md-nav__item">
<a href="#phase-name" class="md-nav__link">
<span class="md-ellipsis">
Phase name
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#goal" class="md-nav__link">
<span class="md-ellipsis">
Goal
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#context-facts-do-not-redefine-them-in-code" class="md-nav__link">
<span class="md-ellipsis">
Context (facts — do not "redefine" them in code)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#scope" class="md-nav__link">
<span class="md-ellipsis">
Scope
</span>
</a>
<nav class="md-nav" aria-label="Scope">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#in-scope" class="md-nav__link">
<span class="md-ellipsis">
In scope
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#out-of-scope" class="md-nav__link">
<span class="md-ellipsis">
Out of scope
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#prerequisites" class="md-nav__link">
<span class="md-ellipsis">
Prerequisites
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#tasks" class="md-nav__link">
<span class="md-ellipsis">
Tasks
</span>
</a>
<nav class="md-nav" aria-label="Tasks">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#1-bring-codebase-up-to-task-039044-rooms-orchestrator-and-align-db-schema" class="md-nav__link">
<span class="md-ellipsis">
1. Bring codebase up to TASK 039044 (rooms / orchestrator) and align DB schema
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#2-fix-daarion-web-api-base-urls-and-ssr-errors" class="md-nav__link">
<span class="md-ellipsis">
2. Fix daarion-web API base URLs and SSR errors
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#3-fix-healthchecks-for-dagi-router-and-sttocrwebsearchswapper" class="md-nav__link">
<span class="md-ellipsis">
3. Fix healthchecks for dagi-router and STT/OCR/WebSearch/Swapper
</span>
</a>
<nav class="md-nav" aria-label="3. Fix healthchecks for dagi-router and STT/OCR/WebSearch/Swapper">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#31-dagi-router-healthcheck-python-requests" class="md-nav__link">
<span class="md-ellipsis">
3.1. dagi-router healthcheck (Python requests)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#32-sttocrwebsearchswapper-healthchecks-curl" class="md-nav__link">
<span class="md-ellipsis">
3.2. STT/OCR/WebSearch/Swapper healthchecks (curl)
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#4-fix-dagi-vector-db-service-dependencies-torch-sentence-transformers" class="md-nav__link">
<span class="md-ellipsis">
4. Fix dagi-vector-db-service dependencies (Torch / sentence-transformers)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#5-fix-dagi-rag-service-dependencies-haystack" class="md-nav__link">
<span class="md-ellipsis">
5. Fix dagi-rag-service dependencies (Haystack)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#6-fix-telegram-gateway-configuration-and-nats-usage" class="md-nav__link">
<span class="md-ellipsis">
6. Fix Telegram gateway configuration and NATS usage
</span>
</a>
<nav class="md-nav" aria-label="6. Fix Telegram gateway configuration and NATS usage">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#61-router-url-dns-service-name" class="md-nav__link">
<span class="md-ellipsis">
6.1. Router URL (DNS / service name)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#62-avoid-notjsmessageerror-msgack-on-non-jetstream" class="md-nav__link">
<span class="md-ellipsis">
6.2. Avoid NotJSMessageError (msg.ack on non-JetStream)
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#7-add-health-endpoint-for-gatewaydaarioncity" class="md-nav__link">
<span class="md-ellipsis">
7. Add /health endpoint for gateway.daarion.city
</span>
</a>
<nav class="md-nav" aria-label="7. Add /health endpoint for gateway.daarion.city">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#71-if-gateway-is-a-backend-service-nodefastapietc" class="md-nav__link">
<span class="md-ellipsis">
7.1. If gateway is a backend service (Node/FastAPI/etc.)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#72-if-gatewaydaarioncity-is-served-via-nginx" class="md-nav__link">
<span class="md-ellipsis">
7.2. If gateway.daarion.city is served via nginx
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#8-deployment-flow-for-node1-instructions" class="md-nav__link">
<span class="md-ellipsis">
8. Deployment flow for NODE1 (instructions)
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#acceptance-checklist" class="md-nav__link">
<span class="md-ellipsis">
Acceptance checklist
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#notes-for-agents" class="md-nav__link">
<span class="md-ellipsis">
Notes for agents
</span>
</a>
</li>
</ul>
</nav>
</div>
</div>
</div>
<div class="md-content" data-md-component="content">
<article class="md-content__inner md-typeset">
<h1 id="task_phase_node1_repairmd">TASK_PHASE_NODE1_REPAIR.md<a class="headerlink" href="#task_phase_node1_repairmd" title="Permanent link">&para;</a></h1>
<h2 id="phase-name">Phase name<a class="headerlink" href="#phase-name" title="Permanent link">&para;</a></h2>
<p>NODE1_REPAIR — bring NODE1 to a healthy, MVP-ready state.</p>
<h2 id="goal">Goal<a class="headerlink" href="#goal" title="Permanent link">&para;</a></h2>
<ol>
<li>All core services on NODE1 are <code>running</code> and <code>healthy</code> in <code>docker ps</code>.</li>
<li><code>daarion-web</code> serves working UI for:</li>
<li><code>/microdao/daarion</code> (orchestrator room view),</li>
<li><code>/nodes/node-1</code> (NODE1 status),</li>
<li><code>/agents/...</code> (agents/crew views).</li>
<li>Telegram bot(s) can route a message through <code>telegram-gateway → dagi-router → LLM</code> and return a response.</li>
<li><code>https://gateway.daarion.city/health</code> returns HTTP 200.</li>
<li>DB schema and code are aligned with the MVP product brief and room/orchestrator features (TASK 039044).</li>
</ol>
<hr />
<h2 id="context-facts-do-not-redefine-them-in-code">Context (facts — do not "redefine" them in code)<a class="headerlink" href="#context-facts-do-not-redefine-them-in-code" title="Permanent link">&para;</a></h2>
<p>NODE1 (144.76.224.179):</p>
<ul>
<li><code>docker ps</code> shows multiple services as <code>unhealthy</code> or <code>Restarting</code>:</li>
<li><code>daarion-web</code>,</li>
<li><code>dagi-router</code>,</li>
<li><code>dagi-stt-service</code>,</li>
<li><code>dagi-ocr-service</code>,</li>
<li><code>dagi-web-search-service</code>,</li>
<li><code>dagi-swapper-service</code>,</li>
<li><code>dagi-vector-db-service</code>,</li>
<li><code>dagi-rag-service</code>.</li>
<li>Git HEAD on server = TASK 038 (no TASK 039044 applied).</li>
<li><code>daarion-web</code> (Next.js) fails on SSR with:</li>
<li><code>connect ECONNREFUSED 127.0.0.1:80</code></li>
<li>It tries to <code>fetch http://127.0.0.1:80/...</code></li>
<li><code>daarion-city-service</code> is alive:</li>
<li><code>curl http://localhost:7001/health</code> → healthy</li>
<li>But DB schema is missing new columns (e.g. <code>room_role</code>, <code>is_public</code>, <code>sort_order</code>) for orchestrator rooms.</li>
<li><code>dagi-router</code> responds:</li>
<li><code>curl localhost:9102/health</code><code>ok</code></li>
<li>Docker healthcheck runs <code>python -c "import requests"</code>; <code>requests</code> is not installed → container marked <code>unhealthy</code>.</li>
<li>STT/OCR/WebSearch/Swapper:</li>
<li>Healthchecks run <code>curl</code> inside slim images without <code>curl</code> installed → false <code>unhealthy</code>.</li>
<li><code>dagi-vector-db-service</code>:</li>
<li>Keeps restarting with:<ul>
<li><code>AttributeError: module 'torch.utils._pytree' has no attribute 'register_pytree_node'</code></li>
</ul>
</li>
<li>Torch version is incompatible with <code>sentence-transformers</code>.</li>
<li><code>dagi-rag-service</code>:</li>
<li>Crashes with:<ul>
<li><code>ModuleNotFoundError: No module named 'haystack'</code></li>
</ul>
</li>
<li><code>telegram-gateway</code>:</li>
<li>Logs <code>Temporary failure in name resolution</code> for <code>http://router:9102/route</code><ul>
<li>Real service name in Docker is <code>dagi-router</code>, not <code>router</code>.</li>
</ul>
</li>
<li>Logs <code>NotJSMessageError</code> when calling <code>msg.ack()</code> ack is used on a non-JetStream subject.</li>
<li><code>https://gateway.daarion.city/health</code> returns 404 (SSL OK but no health endpoint).</li>
<li>Because <code>daarion-web</code> is <code>unhealthy</code>, MVP UI for NODE1 (microDAO, nodes, agents) is effectively offline.</li>
<li>Product brief requires at least six core flows live for MVP:</li>
<li>MicroDAO onboarding,</li>
<li>Public channel for guests,</li>
<li>MicroDAO chat,</li>
<li>Follow-ups,</li>
<li>Kanban tasks,</li>
<li>Private agent.</li>
</ul>
<p>Do NOT change these facts; change code/config to fix the system.</p>
<hr />
<h2 id="scope">Scope<a class="headerlink" href="#scope" title="Permanent link">&para;</a></h2>
<h3 id="in-scope">In scope<a class="headerlink" href="#in-scope" title="Permanent link">&para;</a></h3>
<ul>
<li>Code and config changes in the main repo:</li>
<li>Dockerfiles and <code>docker-compose.yml</code> (and any overrides).</li>
<li><code>daarion-web</code> env/SSR config.</li>
<li><code>daarion-city-service</code> migrations and DB schema updates.</li>
<li><code>dagi-router</code>, STT/OCR/WebSearch/Swapper healthchecks.</li>
<li><code>dagi-vector-db-service</code> dependencies (Torch, sentence-transformers).</li>
<li><code>dagi-rag-service</code> dependencies (Haystack).</li>
<li><code>telegram-gateway</code> configuration and NATS usage.</li>
<li>Gateway <code>/health</code> endpoint (backend or nginx, depending on actual stack).</li>
<li>Local verification (via <code>docker compose</code>) + instructions for running on NODE1.</li>
</ul>
<h3 id="out-of-scope">Out of scope<a class="headerlink" href="#out-of-scope" title="Permanent link">&para;</a></h3>
<ul>
<li>New product features beyond MVP (no new flows).</li>
<li>Large refactors of architecture.</li>
<li>Switching to a different LLM stack or DB vendor.</li>
</ul>
<hr />
<h2 id="prerequisites">Prerequisites<a class="headerlink" href="#prerequisites" title="Permanent link">&para;</a></h2>
<p>Before editing:</p>
<ol>
<li>Inspect repo structure to locate:</li>
<li>Docker compose files (e.g. <code>docker-compose.yml</code>, <code>docker-compose.prod.yml</code>).</li>
<li>Services:<ul>
<li><code>daarion-web</code>,</li>
<li><code>daarion-city-service</code>,</li>
<li><code>dagi-router</code>,</li>
<li><code>dagi-stt-service</code>,</li>
<li><code>dagi-ocr-service</code>,</li>
<li><code>dagi-web-search-service</code>,</li>
<li><code>dagi-swapper-service</code>,</li>
<li><code>dagi-vector-db-service</code>,</li>
<li><code>dagi-rag-service</code>,</li>
<li><code>telegram-gateway</code>,</li>
<li><code>gateway</code> (or equivalent).</li>
</ul>
</li>
<li>Migration tooling for <code>daarion-city-service</code> (Alembic / Prisma / Drizzle / etc.).</li>
<li>Existing deploy scripts:<ul>
<li><code>scripts/deploy-prod.sh</code>,</li>
<li><code>scripts/migrate-prod.sh</code> (or equivalents).</li>
</ul>
</li>
<li>Read:</li>
<li><code>01_product_brief_mvp.md</code> — especially sections about microDAO, rooms, orchestrator, onboarding, follow-ups, Kanban, private agent.</li>
<li><code>docs/DEPLOY_MIGRATIONS.md</code> or any deployment doc describing DB migrations.</li>
<li><code>microdao — Data Model &amp; Event Catalog</code> (if present in repo/docs) to understand expected DB fields for rooms.</li>
</ol>
<hr />
<h2 id="tasks">Tasks<a class="headerlink" href="#tasks" title="Permanent link">&para;</a></h2>
<h3 id="1-bring-codebase-up-to-task-039044-rooms-orchestrator-and-align-db-schema">1. Bring codebase up to TASK 039044 (rooms / orchestrator) and align DB schema<a class="headerlink" href="#1-bring-codebase-up-to-task-039044-rooms-orchestrator-and-align-db-schema" title="Permanent link">&para;</a></h3>
<p>1.1. Locate tasks 039044 (look under <code>docs/cursor/</code> / <code>docs/tasks/</code> / similar).
- Identify what changes they describe:
- new fields for rooms (e.g. <code>room_role</code>, <code>is_public</code>, <code>sort_order</code>),
- any additional tables/relations required for orchestrator rooms and microDAO UI.</p>
<p>1.2. Implement DB/schema changes:
- Use existing migration framework for <code>daarion-city-service</code>.
- Create a new migration that:
- adds missing columns (e.g. <code>room_role</code>, <code>is_public</code>, <code>sort_order</code>) to relevant tables (e.g. <code>rooms</code>),
- adds any indices or constraints described in the docs,
- is <strong>idempotent</strong> and safe to apply on existing prod DB.
- Ensure migration can run in both dev and prod environments.</p>
<p>1.3. Update <code>daarion-city-service</code> models/ORM to match the new schema.
- All API endpoints that return rooms/microDAO views must expose these fields (if required by frontend).</p>
<p>1.4. Ensure deploy pipeline uses these migrations:
- Confirm <code>scripts/migrate-prod.sh</code> (or equivalent) calls the migration tool.
- If not, update it so that running the script applies the new migration.</p>
<p>1.5. Add/update minimal tests:
- Unit/integration test for room creation / listing that uses the new fields.
- At least one test for the orchestrator room API.</p>
<hr />
<h3 id="2-fix-daarion-web-api-base-urls-and-ssr-errors">2. Fix <code>daarion-web</code> API base URLs and SSR errors<a class="headerlink" href="#2-fix-daarion-web-api-base-urls-and-ssr-errors" title="Permanent link">&para;</a></h3>
<p>2.1. Locate <code>daarion-web</code> config:
- <code>.env</code> / <code>.env.production</code> / <code>next.config.js</code> / <code>app/config.ts</code> etc.</p>
<p>2.2. Define correct base URL for city-service:</p>
<p>For <strong>server-side</strong> calls:</p>
<div class="codehilite"><pre><span></span><code>CITY_API_BASE_URL=http://daarion-city-service:7001
</code></pre></div>
<p>For <strong>client-side</strong> calls (if needed):</p>
<div class="codehilite"><pre><span></span><code>NEXT_PUBLIC_CITY_API_BASE_URL=https://gateway.daarion.city/api
<span class="gh">#</span> or, for internal-only, http://daarion-city-service:7001
</code></pre></div>
<p>2.3. Update all fetch calls in <code>daarion-web</code> to use these env vars instead of hardcoded <code>http://127.0.0.1:80</code>.</p>
<ul>
<li>Search for <code>127.0.0.1</code>, <code>localhost</code>, and update to use <code>CITY_API_BASE_URL</code> / <code>NEXT_PUBLIC_CITY_API_BASE_URL</code>.</li>
<li>Ensure Next.js server components and API routes read values from <code>process.env</code>.</li>
</ul>
<p>2.4. Local smoke test:</p>
<div class="codehilite"><pre><span></span><code>docker<span class="w"> </span>compose<span class="w"> </span>up<span class="w"> </span>-d<span class="w"> </span>daarion-city-service
docker<span class="w"> </span>compose<span class="w"> </span>up<span class="w"> </span>-d<span class="w"> </span>--build<span class="w"> </span>daarion-web
</code></pre></div>
<ul>
<li>Open <code>http://localhost:&lt;WEB_PORT&gt;/microdao/daarion</code> and check there are no SSR 500 errors.</li>
<li>Check <code>/nodes/node-1</code> and one of <code>/agents/...</code> pages.</li>
</ul>
<hr />
<h3 id="3-fix-healthchecks-for-dagi-router-and-sttocrwebsearchswapper">3. Fix healthchecks for dagi-router and STT/OCR/WebSearch/Swapper<a class="headerlink" href="#3-fix-healthchecks-for-dagi-router-and-sttocrwebsearchswapper" title="Permanent link">&para;</a></h3>
<h4 id="31-dagi-router-healthcheck-python-requests">3.1. dagi-router healthcheck (Python requests)<a class="headerlink" href="#31-dagi-router-healthcheck-python-requests" title="Permanent link">&para;</a></h4>
<p>3.1.1. Locate <code>dagi-router</code> Dockerfile and <code>docker-compose</code> service.</p>
<p>3.1.2. Replace healthcheck that uses <code>python -c "import requests"</code> with an HTTP healthcheck pointing at the service's <code>/health</code> endpoint.</p>
<p>Example <code>docker-compose.yml</code> snippet:</p>
<div class="codehilite"><pre><span></span><code><span class="nt">services</span><span class="p">:</span>
<span class="w"> </span><span class="nt">dagi-router</span><span class="p">:</span>
<span class="w"> </span><span class="c1"># ...</span>
<span class="w"> </span><span class="nt">healthcheck</span><span class="p">:</span>
<span class="w"> </span><span class="nt">test</span><span class="p">:</span><span class="w"> </span><span class="p p-Indicator">[</span><span class="s">&quot;CMD-SHELL&quot;</span><span class="p p-Indicator">,</span><span class="w"> </span><span class="s">&quot;wget</span><span class="nv"> </span><span class="s">-qO-</span><span class="nv"> </span><span class="s">http://localhost:9102/health</span><span class="nv"> </span><span class="s">||</span><span class="nv"> </span><span class="s">exit</span><span class="nv"> </span><span class="s">1&quot;</span><span class="p p-Indicator">]</span>
<span class="w"> </span><span class="nt">interval</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">10s</span>
<span class="w"> </span><span class="nt">timeout</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">3s</span>
<span class="w"> </span><span class="nt">retries</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">5</span>
</code></pre></div>
<p>3.1.3. Ensure the image has <code>wget</code> (or <code>curl</code>):</p>
<div class="codehilite"><pre><span></span><code><span class="k">RUN</span><span class="w"> </span>apt-get<span class="w"> </span>update<span class="w"> </span><span class="o">&amp;&amp;</span><span class="w"> </span>apt-get<span class="w"> </span>install<span class="w"> </span>-y<span class="w"> </span>--no-install-recommends<span class="w"> </span>wget<span class="w"> </span><span class="se">\</span>
<span class="w"> </span><span class="o">&amp;&amp;</span><span class="w"> </span>rm<span class="w"> </span>-rf<span class="w"> </span>/var/lib/apt/lists/*
</code></pre></div>
<h4 id="32-sttocrwebsearchswapper-healthchecks-curl">3.2. STT/OCR/WebSearch/Swapper healthchecks (curl)<a class="headerlink" href="#32-sttocrwebsearchswapper-healthchecks-curl" title="Permanent link">&para;</a></h4>
<p>3.2.1. For each of:</p>
<ul>
<li><code>dagi-stt-service</code>,</li>
<li><code>dagi-ocr-service</code>,</li>
<li><code>dagi-web-search-service</code>,</li>
<li><code>dagi-swapper-service</code>,</li>
</ul>
<p>replace <code>curl</code>-based healthcheck with <code>wget</code> or an equivalent command that is available in the image, or add <code>wget</code>/<code>curl</code> to Dockerfile as above.</p>
<p>Example:</p>
<div class="codehilite"><pre><span></span><code><span class="nt">healthcheck</span><span class="p">:</span>
<span class="w"> </span><span class="nt">test</span><span class="p">:</span><span class="w"> </span><span class="p p-Indicator">[</span><span class="s">&quot;CMD-SHELL&quot;</span><span class="p p-Indicator">,</span><span class="w"> </span><span class="s">&quot;wget</span><span class="nv"> </span><span class="s">-qO-</span><span class="nv"> </span><span class="s">http://localhost:&lt;PORT&gt;/health</span><span class="nv"> </span><span class="s">||</span><span class="nv"> </span><span class="s">exit</span><span class="nv"> </span><span class="s">1&quot;</span><span class="p p-Indicator">]</span>
<span class="w"> </span><span class="nt">interval</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">10s</span>
<span class="w"> </span><span class="nt">timeout</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">3s</span>
<span class="w"> </span><span class="nt">retries</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">5</span>
</code></pre></div>
<p>3.2.2. Rebuild and run locally:</p>
<div class="codehilite"><pre><span></span><code>docker<span class="w"> </span>compose<span class="w"> </span>build<span class="w"> </span>dagi-router<span class="w"> </span>dagi-stt-service<span class="w"> </span>dagi-ocr-service<span class="w"> </span>dagi-web-search-service<span class="w"> </span>dagi-swapper-service
docker<span class="w"> </span>compose<span class="w"> </span>up<span class="w"> </span>-d<span class="w"> </span>dagi-router<span class="w"> </span>dagi-stt-service<span class="w"> </span>dagi-ocr-service<span class="w"> </span>dagi-web-search-service<span class="w"> </span>dagi-swapper-service
docker<span class="w"> </span>ps
</code></pre></div>
<ul>
<li>Verify <code>STATUS</code> shows <code>healthy</code> after the healthcheck grace period.</li>
</ul>
<hr />
<h3 id="4-fix-dagi-vector-db-service-dependencies-torch-sentence-transformers">4. Fix <code>dagi-vector-db-service</code> dependencies (Torch / sentence-transformers)<a class="headerlink" href="#4-fix-dagi-vector-db-service-dependencies-torch-sentence-transformers" title="Permanent link">&para;</a></h3>
<p>4.1. Locate Dockerfile / requirements for <code>dagi-vector-db-service</code>.</p>
<p>4.2. Update Python dependencies to a compatible set, e.g.:</p>
<div class="codehilite"><pre><span></span><code><span class="k">RUN</span><span class="w"> </span>pip<span class="w"> </span>install<span class="w"> </span>--no-cache-dir<span class="w"> </span><span class="s2">&quot;torch==2.4.0&quot;</span><span class="w"> </span><span class="s2">&quot;sentence-transformers==2.6.1&quot;</span>
</code></pre></div>
<p>(or another version pair that is known to work together).</p>
<p>4.3. Rebuild and run:</p>
<div class="codehilite"><pre><span></span><code>docker<span class="w"> </span>compose<span class="w"> </span>build<span class="w"> </span>dagi-vector-db-service
docker<span class="w"> </span>compose<span class="w"> </span>up<span class="w"> </span>-d<span class="w"> </span>dagi-vector-db-service
docker<span class="w"> </span>logs<span class="w"> </span>-f<span class="w"> </span>dagi-vector-db-service
</code></pre></div>
<ul>
<li>Ensure there is no <code>torch.utils._pytree</code> error and service reaches "ready" state.</li>
<li>Add a simple <code>/health</code> endpoint test if not present.</li>
</ul>
<hr />
<h3 id="5-fix-dagi-rag-service-dependencies-haystack">5. Fix <code>dagi-rag-service</code> dependencies (Haystack)<a class="headerlink" href="#5-fix-dagi-rag-service-dependencies-haystack" title="Permanent link">&para;</a></h3>
<p>5.1. Locate Dockerfile / requirements for <code>dagi-rag-service</code>.</p>
<p>5.2. Add Haystack dependency, for example:</p>
<div class="codehilite"><pre><span></span><code><span class="k">RUN</span><span class="w"> </span>pip<span class="w"> </span>install<span class="w"> </span>--no-cache-dir<span class="w"> </span><span class="s2">&quot;farm-haystack[all]==1.26.2&quot;</span>
</code></pre></div>
<p>(or the version used locally).</p>
<p>5.3. Rebuild and run:</p>
<div class="codehilite"><pre><span></span><code>docker<span class="w"> </span>compose<span class="w"> </span>build<span class="w"> </span>dagi-rag-service
docker<span class="w"> </span>compose<span class="w"> </span>up<span class="w"> </span>-d<span class="w"> </span>dagi-rag-service
docker<span class="w"> </span>logs<span class="w"> </span>-f<span class="w"> </span>dagi-rag-service
</code></pre></div>
<ul>
<li>Confirm <code>ModuleNotFoundError: No module named 'haystack'</code> is gone.</li>
<li>Add/verify <code>/health</code> endpoint and healthcheck.</li>
</ul>
<hr />
<h3 id="6-fix-telegram-gateway-configuration-and-nats-usage">6. Fix Telegram gateway configuration and NATS usage<a class="headerlink" href="#6-fix-telegram-gateway-configuration-and-nats-usage" title="Permanent link">&para;</a></h3>
<h4 id="61-router-url-dns-service-name">6.1. Router URL (DNS / service name)<a class="headerlink" href="#61-router-url-dns-service-name" title="Permanent link">&para;</a></h4>
<p>6.1.1. Find <code>telegram-gateway</code> service in <code>docker-compose.yml</code> and its env/config.</p>
<p>6.1.2. Set correct router URL:</p>
<div class="codehilite"><pre><span></span><code><span class="nt">services</span><span class="p">:</span>
<span class="w"> </span><span class="nt">telegram-gateway</span><span class="p">:</span>
<span class="w"> </span><span class="nt">environment</span><span class="p">:</span>
<span class="w"> </span><span class="c1"># ...</span>
<span class="w"> </span><span class="nt">ROUTER_URL</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">http://dagi-router:9102</span>
</code></pre></div>
<p>6.1.3. Alternatively, define network alias:</p>
<div class="codehilite"><pre><span></span><code><span class="nt">services</span><span class="p">:</span>
<span class="w"> </span><span class="nt">dagi-router</span><span class="p">:</span>
<span class="w"> </span><span class="nt">networks</span><span class="p">:</span>
<span class="w"> </span><span class="nt">default</span><span class="p">:</span>
<span class="w"> </span><span class="nt">aliases</span><span class="p">:</span>
<span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">router</span>
</code></pre></div>
<p>and keep <code>ROUTER_URL=http://router:9102</code>.</p>
<h4 id="62-avoid-notjsmessageerror-msgack-on-non-jetstream">6.2. Avoid <code>NotJSMessageError</code> (msg.ack on non-JetStream)<a class="headerlink" href="#62-avoid-notjsmessageerror-msgack-on-non-jetstream" title="Permanent link">&para;</a></h4>
<p>6.2.1. Locate the code where <code>telegram-gateway</code> subscribes to NATS and calls <code>msg.ack()</code>.</p>
<p>6.2.2. If the subject is not part of a JetStream stream, remove <code>msg.ack()</code>:</p>
<div class="codehilite"><pre><span></span><code><span class="c1"># Before</span>
<span class="n">msg</span> <span class="o">=</span> <span class="k">await</span> <span class="n">sub</span><span class="o">.</span><span class="fm">__anext__</span><span class="p">()</span>
<span class="c1"># ... process ...</span>
<span class="k">await</span> <span class="n">msg</span><span class="o">.</span><span class="n">ack</span><span class="p">()</span>
<span class="c1"># After (simple NATS)</span>
<span class="n">msg</span> <span class="o">=</span> <span class="k">await</span> <span class="n">sub</span><span class="o">.</span><span class="fm">__anext__</span><span class="p">()</span>
<span class="c1"># ... process ...</span>
<span class="c1"># no ack for core NATS</span>
</code></pre></div>
<p>6.2.3. If you want JetStream in the future, add TODO comments and separate task; for this phase keep it simple and working.</p>
<p>6.2.4. Local smoke test:</p>
<ul>
<li>Start NATS, <code>dagi-router</code>, and <code>telegram-gateway</code>.</li>
<li>Simulate a message (if test tooling exists) and ensure no <code>NotJSMessageError</code> appears.</li>
</ul>
<hr />
<h3 id="7-add-health-endpoint-for-gatewaydaarioncity">7. Add <code>/health</code> endpoint for <code>gateway.daarion.city</code><a class="headerlink" href="#7-add-health-endpoint-for-gatewaydaarioncity" title="Permanent link">&para;</a></h3>
<p>Depending on implementation:</p>
<h4 id="71-if-gateway-is-a-backend-service-nodefastapietc">7.1. If gateway is a backend service (Node/FastAPI/etc.)<a class="headerlink" href="#71-if-gateway-is-a-backend-service-nodefastapietc" title="Permanent link">&para;</a></h4>
<p>7.1.1. Add minimal endpoint:</p>
<div class="codehilite"><pre><span></span><code><span class="c1">// Node/Express example</span>
<span class="nx">app</span><span class="p">.</span><span class="nx">get</span><span class="p">(</span><span class="s1">&#39;/health&#39;</span><span class="p">,</span><span class="w"> </span><span class="p">(</span><span class="nx">req</span><span class="p">,</span><span class="w"> </span><span class="nx">res</span><span class="p">)</span><span class="w"> </span><span class="p">=&gt;</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="nx">res</span><span class="p">.</span><span class="nx">status</span><span class="p">(</span><span class="mf">200</span><span class="p">).</span><span class="nx">json</span><span class="p">({</span><span class="w"> </span><span class="nx">status</span><span class="o">:</span><span class="w"> </span><span class="s1">&#39;ok&#39;</span><span class="w"> </span><span class="p">});</span>
<span class="p">});</span>
</code></pre></div>
<p>or</p>
<div class="codehilite"><pre><span></span><code><span class="c1"># FastAPI example</span>
<span class="nd">@app</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;/health&quot;</span><span class="p">)</span>
<span class="k">def</span><span class="w"> </span><span class="nf">health</span><span class="p">():</span>
<span class="k">return</span> <span class="p">{</span><span class="s2">&quot;status&quot;</span><span class="p">:</span> <span class="s2">&quot;ok&quot;</span><span class="p">}</span>
</code></pre></div>
<p>7.1.2. Ensure this endpoint is mounted at the top level of the gateway service.</p>
<h4 id="72-if-gatewaydaarioncity-is-served-via-nginx">7.2. If <code>gateway.daarion.city</code> is served via nginx<a class="headerlink" href="#72-if-gatewaydaarioncity-is-served-via-nginx" title="Permanent link">&para;</a></h4>
<p>7.2.1. Update nginx config (e.g. <code>/etc/nginx/sites-available/gateway.conf</code>) to include:</p>
<div class="codehilite"><pre><span></span><code><span class="k">location</span><span class="w"> </span><span class="s">/health</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="kn">return</span><span class="w"> </span><span class="mi">200</span><span class="w"> </span><span class="s">&#39;OK&#39;</span><span class="p">;</span>
<span class="w"> </span><span class="kn">add_header</span><span class="w"> </span><span class="s">Content-Type</span><span class="w"> </span><span class="s">text/plain</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div>
<p>7.2.2. Reload nginx:</p>
<div class="codehilite"><pre><span></span><code>nginx<span class="w"> </span>-t<span class="w"> </span><span class="o">&amp;&amp;</span><span class="w"> </span>nginx<span class="w"> </span>-s<span class="w"> </span>reload
</code></pre></div>
<p>7.2.3. Local/container test:</p>
<ul>
<li><code>curl -k https://gateway.daarion.city/health</code> should return HTTP 200.</li>
</ul>
<hr />
<h3 id="8-deployment-flow-for-node1-instructions">8. Deployment flow for NODE1 (instructions)<a class="headerlink" href="#8-deployment-flow-for-node1-instructions" title="Permanent link">&para;</a></h3>
<p>Agent should prepare / update deployment docs (e.g. <code>docs/DEPLOY_NODE1_REPAIR.md</code>) with:</p>
<p>8.1. Git update on NODE1:</p>
<div class="codehilite"><pre><span></span><code><span class="nb">cd</span><span class="w"> </span>/opt/microdao-daarion
git<span class="w"> </span>fetch
git<span class="w"> </span>checkout<span class="w"> </span>main<span class="w"> </span><span class="c1"># or production branch</span>
git<span class="w"> </span>pull
</code></pre></div>
<p>8.2. Apply migrations:</p>
<div class="codehilite"><pre><span></span><code>./scripts/migrate-prod.sh<span class="w"> </span><span class="c1"># or documented migrations command</span>
</code></pre></div>
<p>8.3. Rebuild and restart only relevant services:</p>
<div class="codehilite"><pre><span></span><code>docker<span class="w"> </span>compose<span class="w"> </span>build<span class="w"> </span><span class="se">\</span>
<span class="w"> </span>daarion-city-service<span class="w"> </span><span class="se">\</span>
<span class="w"> </span>daarion-web<span class="w"> </span><span class="se">\</span>
<span class="w"> </span>dagi-router<span class="w"> </span><span class="se">\</span>
<span class="w"> </span>dagi-stt-service<span class="w"> </span><span class="se">\</span>
<span class="w"> </span>dagi-ocr-service<span class="w"> </span><span class="se">\</span>
<span class="w"> </span>dagi-web-search-service<span class="w"> </span><span class="se">\</span>
<span class="w"> </span>dagi-swapper-service<span class="w"> </span><span class="se">\</span>
<span class="w"> </span>dagi-vector-db-service<span class="w"> </span><span class="se">\</span>
<span class="w"> </span>dagi-rag-service<span class="w"> </span><span class="se">\</span>
<span class="w"> </span>telegram-gateway<span class="w"> </span><span class="se">\</span>
<span class="w"> </span>gateway
docker<span class="w"> </span>compose<span class="w"> </span>up<span class="w"> </span>-d<span class="w"> </span><span class="se">\</span>
<span class="w"> </span>daarion-city-service<span class="w"> </span><span class="se">\</span>
<span class="w"> </span>daarion-web<span class="w"> </span><span class="se">\</span>
<span class="w"> </span>dagi-router<span class="w"> </span><span class="se">\</span>
<span class="w"> </span>dagi-stt-service<span class="w"> </span><span class="se">\</span>
<span class="w"> </span>dagi-ocr-service<span class="w"> </span><span class="se">\</span>
<span class="w"> </span>dagi-web-search-service<span class="w"> </span><span class="se">\</span>
<span class="w"> </span>dagi-swapper-service<span class="w"> </span><span class="se">\</span>
<span class="w"> </span>dagi-vector-db-service<span class="w"> </span><span class="se">\</span>
<span class="w"> </span>dagi-rag-service<span class="w"> </span><span class="se">\</span>
<span class="w"> </span>telegram-gateway<span class="w"> </span><span class="se">\</span>
<span class="w"> </span>gateway
</code></pre></div>
<p>8.4. Quick <code>docker ps</code> check:</p>
<ul>
<li>All listed services must be <code>Up</code> and <code>healthy</code> after grace period.</li>
</ul>
<hr />
<h2 id="acceptance-checklist">Acceptance checklist<a class="headerlink" href="#acceptance-checklist" title="Permanent link">&para;</a></h2>
<p>Task is done when all of the following are true:</p>
<ol>
<li>
<p><strong>Services/health</strong></p>
</li>
<li>
<p>[ ] On NODE1, <code>docker ps</code> shows:</p>
<ul>
<li><code>daarion-web</code>, <code>daarion-city-service</code>,</li>
<li><code>dagi-router</code>, <code>dagi-stt-service</code>, <code>dagi-ocr-service</code>,</li>
<li><code>dagi-web-search-service</code>, <code>dagi-swapper-service</code>,</li>
<li><code>dagi-vector-db-service</code>, <code>dagi-rag-service</code>,</li>
<li><code>telegram-gateway</code>, <code>gateway</code>
in state <code>Up</code> and <code>healthy</code>.</li>
<li>[ ] <code>curl http://localhost:7001/health</code> (city-service) → 200.</li>
<li>[ ] <code>curl http://localhost:9102/health</code> (dagi-router) → 200.</li>
<li>[ ] <code>curl -k https://gateway.daarion.city/health</code> → 200.</li>
</ul>
</li>
<li>
<p><strong>DB &amp; API</strong></p>
</li>
<li>
<p>[ ] DB schema contains required fields for rooms (e.g. <code>room_role</code>, <code>is_public</code>, <code>sort_order</code>), matching Data Model &amp; product brief.</p>
</li>
<li>[ ] Migration for these changes runs successfully on DEV and PROD.</li>
<li>
<p>[ ] API endpoints that frontend uses for microDAO/rooms/orchestrator return the new fields (where specified in docs).</p>
</li>
<li>
<p><strong>daarion-web UI</strong></p>
</li>
<li>
<p>[ ] <code>/microdao/daarion</code> loads without SSR error and displays orchestrator/microDAO context.</p>
</li>
<li>[ ] <code>/nodes/node-1</code> loads and shows NODE1 data.</li>
<li>[ ] At least one <code>/agents/...</code> page loads and shows crew/agents data.</li>
<li>
<p>[ ] No <code>ECONNREFUSED 127.0.0.1:80</code> in <code>daarion-web</code> logs.</p>
</li>
<li>
<p><strong>Telegram routing</strong></p>
</li>
<li>
<p>[ ] <code>telegram-gateway</code> uses the correct router URL (<code>http://dagi-router:9102</code> or via alias <code>router</code>).</p>
</li>
<li>[ ] No <code>Temporary failure in name resolution</code> or <code>NotJSMessageError</code> in <code>telegram-gateway</code> logs under normal operation.</li>
<li>
<p>[ ] Sending a message through the Telegram bot results in a valid LLM-based reply via <code>dagi-router</code>.</p>
</li>
<li>
<p><strong>Docs</strong></p>
</li>
<li>
<p>[ ] This task file <code>TASK_PHASE_NODE1_REPAIR.md</code> is saved under <code>docs/tasks/</code> (or the project's task folder).</p>
</li>
<li>[ ] A short deploy how-to for NODE1 (from "git pull" to "docker compose up") is added/updated (e.g. <code>docs/DEPLOY_NODE1_REPAIR.md</code>).</li>
</ol>
<hr />
<h2 id="notes-for-agents">Notes for agents<a class="headerlink" href="#notes-for-agents" title="Permanent link">&para;</a></h2>
<ul>
<li>Prefer minimal, targeted changes over large refactors.</li>
<li>Reuse existing patterns from other services (Dockerfiles, healthchecks, migrations).</li>
<li>
<p>When in doubt which version of a library to pin (Torch, Haystack), check:</p>
</li>
<li>
<p>existing working services in this repo,</p>
</li>
<li>or the versions used in local/dev containers (if recorded in lockfiles).</li>
<li>Keep logs and errors in comments / commit messages to help future debugging.</li>
</ul>
</article>
</div>
<script>var target=document.getElementById(location.hash.slice(1));target&&target.name&&(target.checked=target.name.startsWith("__tabbed_"))</script>
</div>
</main>
<footer class="md-footer">
<div class="md-footer-meta md-typeset">
<div class="md-footer-meta__inner md-grid">
<div class="md-copyright">
Made with
<a href="https://squidfunk.github.io/mkdocs-material/" target="_blank" rel="noopener">
Material for MkDocs
</a>
</div>
</div>
</div>
</footer>
</div>
<div class="md-dialog" data-md-component="dialog">
<div class="md-dialog__inner md-typeset"></div>
</div>
<script id="__config" type="application/json">{"base": "../..", "features": ["navigation.sections", "navigation.instant", "content.code.copy"], "search": "../../assets/javascripts/workers/search.b8dbb3d2.min.js", "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version": "Select version"}}</script>
<script src="../../assets/javascripts/bundle.3220b9d7.min.js"></script>
</body>
</html>