diff --git a/DESIGN.md b/DESIGN.md index e753a56..665e5d9 100644 --- a/DESIGN.md +++ b/DESIGN.md @@ -1,57 +1,82 @@ -# spark-mind — DESIGN: заземлённый контур и автономия по заслугам +# spark-mind — DESIGN: автономный контент-продюсер с заземлением -Обновление плана от 2026-09-23. Заменяет «шесть пунктов P1–P6» на три контура -плюс механизм автономии. Источник идей — разбор iLands (см. `ilands-razbor.txt` -в workspace), но реализация — своя. +Обновление плана от 2026-09-23 (вторая редакция: фокус смещён с рекламы/метрик +на **производство контента + анализ его метрик + SEO**). ## 1. Тезис -iLands для «судьи без автора» строит общество на 80 000 агентов. Нам это не нужно: -у нас есть **мир, который отвечает сам** — Метрика, GSC, Директ, Вордстат, -реакция клиентов. Это последствия, которые не сбрасываются и которых никто не -авторит. +iLands строит общество на 80 000 агентов, чтобы получить «судью без автора». +Нам толпа не нужна: у нас есть **мир, который отвечает сам** — поисковики и +аудитория. Агент производит контент (текст, изображение, подкаст, видео), +публикует, и через заданный горизонт **замеряет, что сработало**: показы, +позиции, CTR, дочитывания, прослушивания, переходы, конверсии. -Отсюда два принципа, которых нет у iLands в рабочем виде: +Два принципа, которых нет у iLands в рабочем виде: -1. **Заземление.** Действие агента оценивается не его же рассуждением, - а замером метрики в реальном мире до/после, с отложенным вердиктом. -2. **Автономия по заслугам.** Агент получает права не сразу, а по подтверждённому - трек-рекорду. Провал — права сужаются. Границы из persona `values` непреодолимы - всегда, независимо от уровня. +1. **Заземление.** Качество контента оценивается не рассуждением агента, + а метриками, которые он не контролирует, с отложенным вердиктом. +2. **Автономия по заслугам.** Права выдаются по подтверждённому трек-рекорду: + доказал, что контент улучшает метрики — получил свободу публиковать + без спроса и выбирать темы сам. Провал — права сужаются. + Границы persona `values` непреодолимы на любом уровне. -## 2. Три контура +**Что это даёт на практике:** агент не «генерирует текст вообще», а учится, +какой заголовок, структура и формат работают — на своих же сайтах +(orabota.ru, нейросети.рус, bzp02.ru и др.) и на заказах клиентов. + +## 2. Три контура + конвейер ``` -A. КОНТУР СДЕЛОК «кому можно верить» - counterparties → deals → deal_events +КОНВЕЙЕР ПРОИЗВОДСТВА brief → generated → optimized → published → measured + content_items — центральный объект, на нём замеряются метрики -B. КОНТУР ЗАЗЕМЛЕНИЯ «стало ли лучше на самом деле» ← ядро уникальности - outcomes (метрики до/после) → capabilities (автономия) → ledger (энергия) - -C. КОНТУР МЕТОДОВ «как делать хорошо» - skills (методы, retrieval по эмбеддингу) + reflection (ночная консолидация) +A. КОНТУР ЗАКАЗОВ «для кого и за что» counterparties → deals +B. КОНТУР ЗАЗЕМЛЕНИЯ «что сработало» outcomes → capabilities → ledger +C. КОНТУР МЕТОДОВ «как производить» skills + reflection ``` -Плюс сквозная микро-правка P5 (`noAction`) и тонкий `Channel` (бывший P7). +Плюс сквозные: `noAction` (P5) и тонкий `Channel` (бывший P7). ## 3. Модель данных (SQLite, тот же файл БД) -### A. Контур сделок +### 2.1 Конвейер: content_items — центральный объект + +```sql +CREATE TABLE content_items ( + id TEXT PRIMARY KEY, + kind TEXT NOT NULL CHECK(kind IN ('text','image','podcast','video')), + title TEXT NOT NULL, + topic TEXT, + status TEXT NOT NULL DEFAULT 'brief' + CHECK(status IN ('brief','generated','optimized','published', + 'measured','archived')), + target_url TEXT, -- где опубликован + site TEXT, -- orabota.ru | нейросети.рус | ... + deal_id TEXT REFERENCES deals(id), -- nullable: для своих сайтов + published_at INTEGER, + created_at INTEGER NOT NULL +); +``` + +Конвейер — это переходы `status`. Каждый переход пишется в `deal_events`-подобный +журнал, если привязан к сделке. + +### A. Контур заказов ```sql CREATE TABLE counterparties ( id TEXT PRIMARY KEY, - kind TEXT NOT NULL CHECK(kind IN ('client','contact','platform','external')), + kind TEXT NOT NULL CHECK(kind IN ('client','platform','external')), name TEXT NOT NULL, notes TEXT, - trust_score REAL NOT NULL DEFAULT 0, -- derived, не задаётся руками + trust_score REAL NOT NULL DEFAULT 0, -- derived из истории created_at INTEGER NOT NULL ); CREATE TABLE deals ( id TEXT PRIMARY KEY, counterparty_id TEXT NOT NULL REFERENCES counterparties(id), - task TEXT NOT NULL, + brief TEXT NOT NULL, -- что заказали (тема/формат/объём) price REAL, currency TEXT DEFAULT 'RUB', status TEXT NOT NULL CHECK(status IN @@ -60,11 +85,10 @@ CREATE TABLE deals ( closed_at INTEGER ); --- append-only: нельзя переписать задним числом CREATE TABLE deal_events ( id TEXT PRIMARY KEY, deal_id TEXT NOT NULL REFERENCES deals(id), - type TEXT NOT NULL, -- offered|accepted|delivered|paid|refused|note + type TEXT NOT NULL, payload_json TEXT, created_at INTEGER NOT NULL ); @@ -73,37 +97,40 @@ CREATE TABLE deal_events ( ### B. Контур заземления ```sql --- Метрики РАЗНОГО ТИПА. Один outcome = одно действие + один замер. +-- Один outcome = один content_item + одно измерение метрики. CREATE TABLE outcomes ( id TEXT PRIMARY KEY, - deal_id TEXT REFERENCES deals(id), -- nullable: действие без сделки - domain TEXT NOT NULL, -- seo|ads_budget|content_publish|client_comms|research|code + item_id TEXT REFERENCES content_items(id), -- что мерим + deal_id TEXT REFERENCES deals(id), + area TEXT NOT NULL, -- text|image|podcast|video|seo_onpage|seo_semantics|publish metric_kind TEXT NOT NULL CHECK(metric_kind IN - ('reach','position','engagement','conversion','sale','revenue','cost','speed','quality')), - metric_name TEXT NOT NULL, -- 'ctr', 'avg_position', 'cpa', 'leads', 'revenue_rub'... - unit TEXT, -- '%','руб','шт','сек','место' + ('reach','engagement','position','traffic', + 'conversion','revenue','speed','quality')), + metric_name TEXT NOT NULL, -- 'impressions','ctr','avg_position','dwell_sec', + -- 'listens','completion_rate','indexing_hours','clicks' + unit TEXT, -- 'шт','%','сек','место','руб','ч' direction TEXT NOT NULL CHECK(direction IN ('up_good','down_good')), - value_before REAL, + value_before REAL, -- null для нового контента value_after REAL, - source TEXT NOT NULL CHECK(source IN ('metrika','gsc','direct','wordstat','manual','client')), - horizon_days INTEGER NOT NULL, -- через сколько замеряем + source TEXT NOT NULL CHECK(source IN + ('metrika','gsc','webmaster','wordstat','platform','manual','client')), + horizon_days INTEGER NOT NULL, due_at INTEGER NOT NULL, status TEXT NOT NULL DEFAULT 'pending' CHECK(status IN ('pending','measured','missed','unavailable')), measured_at INTEGER, - score REAL -- нормализованный вердикт [-1..+1] + score REAL -- нормализованный вердикт [-1..+1] ); --- Автономия по заслугам: уровень НА КАЖДУЮ ОБЛАСТЬ, не общий. +-- Автономия по заслугам: тир НА ОБЛАСТЬ, не общий. CREATE TABLE capabilities ( - domain TEXT PRIMARY KEY, + area TEXT PRIMARY KEY, tier INTEGER NOT NULL DEFAULT 0 CHECK(tier BETWEEN 0 AND 4), positive_outcomes INTEGER NOT NULL DEFAULT 0, negative_outcomes INTEGER NOT NULL DEFAULT 0, updated_at INTEGER NOT NULL ); --- Энергия (бывший P4): не деньги, а единица активности. CREATE TABLE ledger ( id TEXT PRIMARY KEY, ts INTEGER NOT NULL, @@ -118,109 +145,136 @@ CREATE TABLE ledger ( ```sql CREATE TABLE skills ( id TEXT PRIMARY KEY, - name TEXT NOT NULL, - method_md TEXT NOT NULL, + name TEXT NOT NULL, -- 'podcast-silero','image-comfyui','seo-onpage-editor' + area TEXT NOT NULL, -- привязка к capabilities.area + method_md TEXT NOT NULL, -- как делать (промпт/алгоритм/порядок шагов) + tool TEXT, -- реальный инструмент: ace-step|silero|comfyui|editor-pro|astro|wordstat source TEXT NOT NULL CHECK(source IN ('builtin','learned')), validated INTEGER NOT NULL DEFAULT 0, uses INTEGER NOT NULL DEFAULT 0, success_rate REAL, - embedding BLOB -- bge-m3, dim=1024 + embedding BLOB -- bge-m3, dim=1024 — retrieval под задачу ); ``` ## 4. Правила -### 4.1 Нормализация метрики в score +### 4.1 Области (area) и типы метрик -Один вердикт на outcome, диапазон `[-1..+1]`: +| area | Что производит/делает | Типовые метрики | +|------|----------------------|-----------------| +| `text` | статьи, лонгриды, описания | показы, CTR, дочитывания, позиции | +| `image` | изображения, обложки, карточки | показы, CTR, скачивания | +| `podcast` | аудио, подкасты (Silero TTS) | прослушивания, completion rate, дослушивания | +| `video` | видео, шортсы | просмотры, watch time, удержание | +| `seo_onpage` | заголовки, структура, разметка | позиции, CTR, индексация | +| `seo_semantics` | семантика, кластеры, запросы | охват запросов, релевантность | +| `publish` | публикация, распространение | скорость публикации, индексация | + +### 4.2 Нормализация метрики в score ``` raw = (value_after - value_before) / max(|value_before|, eps) score = clamp(raw * (direction == 'up_good' ? 1 : -1), -1, 1) ``` +- Нет `value_before` (новый контент) → сравнение с базлином области + (медиана последних 10 measured в этой `area`). +- `quality` — дискретно: `+1 / 0 / −1` (эксперт/клиент/человек). +- `speed` — `direction = 'down_good'` (быстрее индексация = лучше). +- `status != 'measured'` → score не участвует в трек-рекорде. -Для `quality` (ручной вердикт клиента) — дискретно: `+1 / 0 / -1`. -Для `speed` — `direction = 'down_good'` (быстрее = лучше). -Если `status != 'measured'` → score не участвует в трек-рекорде. - -### 4.2 Автономия по заслугам - -Уровни (по области, отдельно для каждой): +### 4.3 Автономия по заслугам | tier | Имя | Что разрешено | |------|-----|----------------| -| 0 | observer | только думает и пишет в память, внешних действий нет | -| 1 | suggest | предлагает действия человеку, сам не делает | -| 2 | ask | делает после подтверждения (кроме своих каналов) | -| 3 | act+report | делает и отчитывается; человек может откатить | -| 4 | autonomous | делает без подтверждения в пределах границ persona | +| 0 | observer | только анализ и предложения, публикаций нет | +| 1 | suggest | предлагает готовый контент человеку, сам не публикует | +| 2 | ask | публикует после подтверждения | +| 3 | act+report | публикует и отчитывается; человек может откатить | +| 4 | autonomous | публикует и выбирает темы сам, в границах persona | Переходы: -- `+1 тир` за **3 нетто-положительных** outcome в области (score > 0). -- `-1 тир` за **1 нетто-отрицательный** (score < 0) — асимметрия: падать легче. +- `+1 тир` за **3 нетто-положительных** outcome в области. +- `−1 тир` за **1 нетто-отрицательный** — асимметрия: падать легче. - Затухание: outcome старше 90 дней весит 0.5. -- Новая область всегда стартует с tier 0. -- **Границы persona `values` непреодолимы на любом тире.** Тир расширяет - свободу внутри границ, но не снаружи. +- Новая область стартует с tier 0. +- **Границы persona `values` непреодолимы на любом тире.** -### 4.3 Энергия +### 4.4 Энергия -- Расход: каждый тик, каждое внешнее действие, каждый вызов саб-агента. -- Приход: **подтверждённые положительные outcomes** (особенно `revenue`), плюс - донат человека. -- Низкий баланс → реже просыпается (интервал растёт), затем Deep Rest. -- Ключевое отличие от iLands: энергия восполняется **результатом**, а не покупкой. - Дефицит мотивирует делать полезное, а не имитировать активность. +- Расход: тик, генерация (текст/фото/аудио/видео — дороже всего), публикация, + вызов саб-агента. +- Приход: **подтверждённые положительные outcomes** (особенно `revenue`), + плюс донат человека. +- Низкий баланс → интервал тиков растёт → Deep Rest. +- Отличие от iLands: энергия восполняется результатом, а не покупкой. -## 5. Триггеры heartbeat (добавляются к существующим) +## 5. Триггеры heartbeat (добавляются) | Триггер | Что делает | |---------|------------| -| `{type:'measure'}` | наступил `due_at` → тянет метрику из источника → пишет `value_after`, `score` | -| `{type:'reflection'}` | ночной цикл: обобщает deals + outcomes + thoughts → в long-term и `self_observations` | -| `{type:'task'}` | **наконец используется** — cron-планировщик (нужен для measure/reflection) | +| `{type:'pipeline'}` | продвинуть content_items по конвейеру (draft→generated→optimized→published) | +| `{type:'measure'}` | наступил `due_at` → тянет метрику из источника → `value_after`, `score` | +| `{type:'reflection'}` | ночной цикл: обобщает items + outcomes + thoughts → long-term и `self_observations` | +| `{type:'task'}` | cron-планировщик (нужен для measure/reflection) | -Плюс в `decision` появляется `noAction: true` (P5) — агент может решить, -что действие не требуется, и не писать thought. +Плюс `decision.noAction: true` (P5). + +Источники метрик: **Метрика API, Google Search Console, Yandex Webmaster API, +Wordstat** — у всех доступ уже настроен. Плюс `platform` (прослушивания/просмотры) +и `manual`/`client`. ## 6. Тонкий Channel (бывший P7) -Не строим plugin-реестр рантаймов. Только: - ```ts interface Channel { send(text: string): Promise; } ``` +Реализации: `ConsoleChannel`, `TelegramChannel`, `FileChannel`. +`LLMClient` уже есть. Полный harness-реестр отложен — абстракция окупается +с ≥2 реализациями. -Реализации: `ConsoleChannel`, `TelegramChannel`, `FileChannel` (лог для заземления). -`LLMClient` уже есть — движок меняли Spark→Ornith без переписывания Mind. -Полный harness-реестр откладываем: абстракция окупается с ≥2 реализациями, у мира -пока одна. `Channel` станет дверью к BYOA, если решишь подключаться к чужим мирам. +## 7. Методы (skills) — привязка к реальному стеку -## 7. Порядок внедрения +| area | tool | Что уже есть | +|------|------|--------------| +| text | editor-pro | 7-layer markdown pipeline (типографика, SEO-слой) | +| image | comfyui | генерация изображений через diffusion-воркфлоу | +| podcast | silero | Silero TTS 24kHz, пайплайн через normalizar/tts | +| video | video-pipeline | загрузка/обработка видео | +| seo_onpage | editor-pro, astro | структура, заголовки, schema | +| seo_semantics | wordstat | Wordstat API: частотность, кластеры | +| publish | astro + deploy | сборка Astro → публикация | + +Это ключевое: **скиллы агента = твой существующий производственный стек**, +а не абстрактные описания. Retrieval по bge-m3 подгружает нужный метод под задачу. + +## 8. Порядок внедрения | Шаг | Что | Критерий приёмки | |-----|-----|------------------| -| 0 | P5 `noAction` + `Channel` (console/telegram/file) | агент умеет не действовать; вывод через интерфейс | -| 1 | Планировщик (`task` + `measure`): проверка due-записей в SQLite | задача с датой выполняется в срок | -| 2 | Контур A: counterparties + deals + deal_events | сделка проходит offered→paid, события в журнале | -| 3 | Контур B: outcomes + `measure` | метрика замеряется через horizon, score пишется | -| 4 | Контур B: capabilities (автономия по заслугам) | тир растёт после 3 успехов, падает после провала | -| 5 | Контур C: reflection | ночью опыт уходит в self_observations, мёртвый слой оживает | -| 6 | Контур C: skills + retrieval по bge-m3 | нужный метод подгружается по задаче, не всё сразу | -| 7 | Контур B: ledger (энергия) | результат пополняет энергию, дефицит замедляет тики | +| 0 | P5 `noAction` + тонкий `Channel` | агент умеет не действовать; вывод через интерфейс | +| 1 | Планировщик (`task`/`pipeline`/`measure`) | задача с датой выполняется в срок | +| 2 | `content_items` + конвейер | item проходит brief→published, переходы в журнале | +| 3 | `outcomes` + `measure` (Метрика/GSC/Webmaster/Wordstat) | метрика замеряется через horizon, score пишется | +| 4 | `capabilities` — автономия по областям | тир растёт после 3 успехов, падает после провала | +| 5 | `skills` + retrieval + `reflection` | нужный метод подгружается по задаче; self_observations оживают | +| 6 | `deals` + `counterparties` | заказ клиента проходит offered→paid | +| 7 | `ledger` — энергия | результат пополняет энергию, дефицит замедляет тики | -Зависимости: 3 требует 1 (замер по расписанию) и 2 (deal_id). 4 требует 3. -7 требует 3. Остальное независимо. +Зависимости: 3 требует 1 и 2. 4 требует 3. 5 требует 2. 7 требует 3. -## 8. Что НЕ делаем +## 9. Что НЕ делаем -- **Соцсеть/ленту/подписки** внутри агента — бессмысленно без массы участников. -- **Токены как валюту** — Тамагочи-монетизация, не наша польза. -- **Полный harness-реестр** (Codex/Claude Code/OpenClaw) — оверинжиниринг для соло. -- **«Суперразум из общества»** — нарратив без измерений. +- Рекламные метрики (Директ/CPA) как основу — ушло из фокуса. +- Соцсеть/ленту/подписки внутри агента. +- Токены как валюту. +- Полный harness-реестр. +- «Суперразум из общества». -## 9. Открытые вопросы +## 10. Открытые вопросы -- Источник метрик по умолчанию для каждой области (Метрика/GSC/Директ — какие API уже есть). -- Кто ставит `horizon_days` — агент или человек (по умолчанию предлагаю агент, человек правит). -- Как считать `quality`-вердикт: явный ответ клиента или оценка Ника вручную. +1. **Свои сайты или клиентские заказы в первую очередь?** (влияет на приоритет + шага 2 vs 6; предлагаю сначала свои сайты — полный контроль над метриками). +2. **Кто ставит `horizon_days`** — агент предлагает, человек правит? (Мой дефолт.) +3. **Где предел «качества» текста** — только метрики или ещё экспертная оценка + Ника обязательна перед публикацией на tier<3. diff --git a/README.md b/README.md index 0e68445..23fc64d 100644 --- a/README.md +++ b/README.md @@ -92,15 +92,18 @@ const telegram = new TelegramMessenger({ | P4 | SQLite persistence (5 таблиц, WAL) | ✅ | | P5 | Telegram Channel Layer (MAX API + fallback) | ✅ | -## Roadmap (P6+) +## Roadmap -- **План** — [DESIGN.md](./DESIGN.md): заземлённый контур + автономия по заслугам +- **План** — [DESIGN.md](./DESIGN.md): автономный контент-продюсер с заземлением - **Чек-лист** — [TODO.md](./TODO.md) -Суть программы: агент оценивается не своими же рассуждениями, а замером метрик -реального мира (охват, конверсии, продажи, деньги, скорость) до/после действия, -с отложенным вердиктом. Права (автономия) выдаются по подтверждённому трек-рекорду, -а не сразу; границы persona непреодолимы на любом уровне. +Суть: агент производит контент (текст, изображение, подкаст, видео), публикует +и через заданный горизонт **замеряет, что сработало** — показы, позиции, CTR, +дочитывания, прослушивания, переходы (метрики Метрики/GSC/Webmaster/Wordstat). +Качество оценивается не рассуждением агента, а этими метриками. Права (автономия) +выдаются по подтверждённому трек-рекорду: доказал рост метрик — получил свободу +публиковать без спроса. Скиллы агента = существующий производственный стек +(editor-pro, ComfyUI, Silero TTS, video-pipeline, Wordstat, Astro). ## License diff --git a/TODO.md b/TODO.md index a67c59b..ae98d45 100644 --- a/TODO.md +++ b/TODO.md @@ -1,71 +1,80 @@ # spark-mind — Оставшиеся TODO -Полный план — в [DESIGN.md](./DESIGN.md) (заземлённый контур + автономия по заслугам). -Здесь — рабочий чек-лист. Порядок обязателен: зависимости между шагами. +Полный план — в [DESIGN.md](./DESIGN.md): **автономный контент-продюсер +с заземлением на метриках и автономией по заслугам.** -Статус: **P0–P5 базовые завершены** (heartbeat→mind, JSON output, bge-m3 -embeddings, sub-agents, SQLite, Telegram+fallback). Далее — новая программа. +Статус: P0–P5 базовые завершены (heartbeat→mind, JSON output, bge-m3 embeddings, +sub-agents, SQLite, Telegram+fallback). Далее — программа контент-производства. -## Шаг 0 — Основа (дёшево, чистит память) +Порядок обязателен: есть зависимости между шагами. + +## Шаг 0 — Основа - [ ] P5: `decision.noAction: true` — агент может решить, что действие не нужно, - и не писать thought. Сейчас heartbeat всегда «работает» → шум в памяти. -- [ ] Тонкий `Channel`-интерфейс: `ConsoleChannel`, `TelegramChannel`, `FileChannel`. + и не писать thought (сейчас heartbeat всегда «работает» → шум в памяти). +- [ ] Тонкий `Channel`: `ConsoleChannel`, `TelegramChannel`, `FileChannel`. `sendReply` сейчас жёстко зашит на Telegram+console. -## Шаг 1 — Планировщик (нужен для measure/reflection) -- [ ] Cron/otlozhennye задачи: триггер `{type:'task'}` объявлен, но никто не эмитит. -- [ ] Проверка due-записей в SQLite → эмит `{type:'measure'}`. +## Шаг 1 — Планировщик (нужен для pipeline/measure/reflection) +- [ ] Cron-задачи: триггер `{type:'task'}` объявлен, но никто не эмитит. +- [ ] Проверка due-записей в SQLite → эмит `{type:'pipeline'}` и `{type:'measure'}`. - [ ] Ночной `{type:'reflection'}`. - Приёмка: задача с датой выполняется в срок. -## Шаг 2 — Контур A: сделки и контрагенты -- [ ] Таблицы `counterparties`, `deals`, `deal_events` (append-only). -- [ ] `trust_score` выводится из истории, не задаётся руками. -- [ ] Mind умеет открывать/двигать сделку (offered→accepted→delivered→paid|refused|defaulted). -- Приёмка: сделка проходит полный цикл, все переходы в журнале. +## Шаг 2 — Конвейер контента (центральный объект) +- [ ] Таблица `content_items` (kind: text|image|podcast|video; status: + brief→generated→optimized→published→measured→archived). +- [ ] Переходы статусов + журнал переходов. +- [ ] Привязка к `site` (свои сайты) и `deal_id` (клиентские заказы). +- Приёмка: item проходит brief→published, все переходы в журнале. -## Шаг 3 — Контур B: outcomes (ядро уникальности) -- [ ] Таблица `outcomes`: метрики разного типа (reach, position, engagement, - conversion, sale, revenue, cost, speed, quality), `direction`, `horizon_days`, `due_at`. -- [ ] Замер через `{type:'measure'}`: тянем метрику из источника (Метрика/GSC/Директ/Вордстат/manual). -- [ ] Нормализация в `score` [-1..+1] (формула в DESIGN.md §4.1). +## Шаг 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 — Контур B: автономия по заслугам -- [ ] Таблица `capabilities` (уровень НА ОБЛАСТЬ: seo, ads_budget, content_publish, - client_comms, research, code). +## Шаг 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 — Контур C: reflection -- [ ] Ночной цикл: обобщает deals + outcomes + thoughts → long-term. -- [ ] Пишет в `self_observations` — **сейчас мёртвый слой**, оживляется здесь. -- [ ] Дешёвая модель (не основная). - -## Шаг 6 — Контур C: skills registry -- [ ] Таблица `skills` (name, method_md, source, validated, uses, success_rate, embedding). +## Шаг 5 — Методы: skills + reflection +- [ ] Таблица `skills` (name, area, method_md, tool, validated, uses, + success_rate, embedding). - [ ] Retrieval нужного метода по эмбеддингу bge-m3 (не грузить всё сразу). -- [ ] Заменяет 4 захардкоженные роли sub-agents. +- [ ] Наполнение методами из реального стека: 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 сейчас — только строки-декларации. -## Шаг 7 — Контур B: энергия (бывший P6 sleep & energy) +## Шаг 6 — Заказы: deals + counterparties +- [ ] Таблицы `counterparties`, `deals`, `deal_events` (append-only). +- [ ] `trust_score` выводится из истории, не задаётся руками. +- [ ] Заказ клиента на контент: offered→accepted→delivered→paid|refused|defaulted. +- Приёмка: заказ проходит полный цикл. + +## Шаг 7 — Энергия: ledger - [ ] Таблица `ledger`. -- [ ] Расход: тик, внешнее действие, саб-агент. Приход: положительные outcomes + донат. +- [ ] Расход: тик, генерация (текст/фото/аудио/видео), публикация, саб-агент. +- [ ] Приход: положительные outcomes + донат. - [ ] Низкий баланс → интервал тиков растёт → Deep Rest. - Приёмка: результат пополняет энергию, дефицит замедляет тики. ## Инфраструктура (по мере надобности) - [ ] Конфиг / `.env`: URL-ы Ollama, dbPath, Telegram захардкожены в `index.ts`. -- [ ] Retry + timeout (AbortController) для LLM/embedding fetch — один сбой роняет тик. +- [ ] 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. Варианты: починить SNI на qw4.ru, локальный - MAX-релей, или Telegram Bot API напрямую. + Сейчас console-only fallback. ## Движок - [ ] Spark X2.5-4B: не грузится в Ollama (`unknown architecture 'spark2_5'`). @@ -76,4 +85,4 @@ embeddings, sub-agents, SQLite, Telegram+fallback). Далее — новая п ## Косметика - [ ] Устаревший doc-комментарий в `mind.ts` (класс `SparkLLMClient` описан как «клиент для Spark X2.5-4B, в MVP заглушка»). -- [ ] Дефолт модели в конструкторе `SparkLLMClient` = `'spark-x2.5-4b'` (вводит в заблуждение). +- [ ] Дефолт модели в конструкторе `SparkLLMClient` = `'spark-x2.5-4b'`.