DESIGN v2: refocus to autonomous content producer with grounding

Смена целенаправленности: не реклама/аналитика метрик, а производство
контента (текст, изображение, подкаст, видео) + анализ его метрик + SEO.

- Новый центральный объект content_items (kind, status-конвейер
  brief→generated→optimized→published→measured, site, deal_id)
- areas: text, image, podcast, video, seo_onpage, seo_semantics, publish
- metric_kind: reach, engagement, position, traffic, conversion, revenue, speed, quality
- источники метрик: Метрика API, GSC, Yandex Webmaster, Wordstat (+platform/manual/client)
- skills привязаны к реальному стеку: editor-pro, ComfyUI, Silero TTS,
  video-pipeline, Wordstat, Astro (retrieval по bge-m3)
- автономия по заслугам: тир на область, +1 за 3 успеха, -1 за провал
- конвейер производства добавлен как сквозной процесс
- TODO переписан: 8 шагов (0-7) с критериями приёмки
This commit is contained in:
n1kt4r committed 2026-09-23 14:42:15 +05:00
1 parent 436dd5fa31
commit 97f03a9dd5
3 files changed
+212 -146

No files matched your search

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