# spark-mind — Оставшиеся TODO Полный план — в [DESIGN.md](./DESIGN.md): **автономный контент-продюсер с заземлением на метриках и автономией по заслугам.** Статус: P0–P5 базовые завершены (heartbeat→mind, JSON output, bge-m3 embeddings, sub-agents, SQLite, Telegram+fallback). Далее — программа контент-производства. Порядок обязателен: есть зависимости между шагами. ## Шаг 0 — Основа - [ ] P5: `decision.noAction: true` — агент может решить, что действие не нужно, и не писать thought (сейчас heartbeat всегда «работает» → шум в памяти). - [ ] Тонкий `Channel`: `ConsoleChannel`, `TelegramChannel`, `FileChannel`. `sendReply` сейчас жёстко зашит на Telegram+console. ## Шаг 1 — Планировщик (нужен для pipeline/measure/reflection) - [ ] Cron-задачи: триггер `{type:'task'}` объявлен, но никто не эмитит. - [ ] Проверка due-записей в SQLite → эмит `{type:'pipeline'}` и `{type:'measure'}`. - [ ] Ночной `{type:'reflection'}`. - Приёмка: задача с датой выполняется в срок. ## Шаг 2 — Конвейер контента (центральный объект) - [ ] Таблица `content_items` (kind: text|image|podcast|video; status: brief→generated→optimized→published→measured→archived). - [ ] Переходы статусов + журнал переходов. - [ ] Привязка к `site` (свои сайты) и `deal_id` (клиентские заказы). - Приёмка: item проходит brief→published, все переходы в журнале. ## Шаг 3 — Заземление: outcomes + measure - [ ] Таблица `outcomes`: metric_kind (reach, engagement, position, traffic, conversion, revenue, speed, quality), direction, horizon_days, due_at. - [ ] Замер через `{type:'measure'}`: Метрика API / GSC / Yandex Webmaster / Wordstat. - [ ] Нормализация в `score` [-1..+1]; базлайн области для нового контента. - Приёмка: метрика замеряется через horizon, score пишется. ## Шаг 4 — Автономия по заслугам - [ ] Таблица `capabilities` (тир на область: text, image, podcast, video, seo_onpage, seo_semantics, publish). - [ ] Тиры 0..4 (observer → suggest → ask → act+report → autonomous). - [ ] +1 тир за 3 нетто-положительных; −1 за 1 отрицательный; затухание 90 дней. - [ ] Границы persona `values` непреодолимы на любом тире. - Приёмка: тир растёт после 3 успехов и падает после провала. ## Шаг 5 — Методы: skills + reflection - [ ] Таблица `skills` (name, area, method_md, tool, validated, uses, success_rate, embedding). - [ ] Retrieval нужного метода по эмбеддингу bge-m3 (не грузить всё сразу). - [ ] Наполнение методами из реального стека: editor-pro (text/seo_onpage), ComfyUI (image), Silero TTS (podcast), video-pipeline (video), Wordstat (seo_semantics), Astro (publish). - [ ] `reflection`: ночной цикл обобщает items+outcomes+thoughts → long-term и `self_observations` (**сейчас мёртвый слой**). - [ ] Tool-runtime для под-агентов: tools сейчас — только строки-декларации. ## Шаг 6 — Заказы: deals + counterparties - [ ] Таблицы `counterparties`, `deals`, `deal_events` (append-only). - [ ] `trust_score` выводится из истории, не задаётся руками. - [ ] Заказ клиента на контент: offered→accepted→delivered→paid|refused|defaulted. - Приёмка: заказ проходит полный цикл. ## Шаг 7 — Энергия: ledger - [ ] Таблица `ledger`. - [ ] Расход: тик, генерация (текст/фото/аудио/видео), публикация, саб-агент. - [ ] Приход: положительные outcomes + донат. - [ ] Низкий баланс → интервал тиков растёт → Deep Rest. - Приёмка: результат пополняет энергию, дефицит замедляет тики. ## Инфраструктура (по мере надобности) - [ ] Конфиг / `.env`: URL-ы Ollama, dbPath, Telegram захардкожены в `index.ts`. - [ ] Retry + timeout (AbortController) для LLM/embedding fetch. - [ ] Тесты: `parseSparkOutput`, `Database` CRUD, cosine-поиск, нормализация score. - [ ] Web UI (persona setup) вместо `DEFAULT_PERSONA` в коде. ## Каналы вывода - [ ] Telegram: обход SSL-проблемы bot.qw4.ru (`tlsv1 unrecognized name`, серверная). Сейчас console-only fallback. ## Движок - [ ] Spark X2.5-4B: не грузится в Ollama (`unknown architecture 'spark2_5'`). Варианты: совместимый GGUF / llama.cpp напрямую / остаться на Ornith-1.5-9B. **Важно:** локальные модели пумолкают (пустой ответ), если `subAgent` в JSON-схеме structured output. ## Косметика - [ ] Устаревший doc-комментарий в `mind.ts` (класс `SparkLLMClient` описан как «клиент для Spark X2.5-4B, в MVP заглушка»). - [ ] Дефолт модели в конструкторе `SparkLLMClient` = `'spark-x2.5-4b'`.