# spark-mind — DESIGN: автономный контент-продюсер с заземлением Обновление плана от 2026-09-23 (вторая редакция: фокус смещён с рекламы/метрик на **производство контента + анализ его метрик + SEO**). ## 1. Тезис iLands строит общество на 80 000 агентов, чтобы получить «судью без автора». Нам толпа не нужна: у нас есть **мир, который отвечает сам** — поисковики и аудитория. Агент производит контент (текст, изображение, подкаст, видео), публикует, и через заданный горизонт **замеряет, что сработало**: показы, позиции, CTR, дочитывания, прослушивания, переходы, конверсии. Два принципа, которых нет у iLands в рабочем виде: 1. **Заземление.** Качество контента оценивается не рассуждением агента, а метриками, которые он не контролирует, с отложенным вердиктом. 2. **Автономия по заслугам.** Права выдаются по подтверждённому трек-рекорду: доказал, что контент улучшает метрики — получил свободу публиковать без спроса и выбирать темы сам. Провал — права сужаются. Границы persona `values` непреодолимы на любом уровне. **Что это даёт на практике:** агент не «генерирует текст вообще», а учится, какой заголовок, структура и формат работают — на своих же сайтах (orabota.ru, нейросети.рус, bzp02.ru и др.) и на заказах клиентов. ## 2. Три контура + конвейер ``` КОНВЕЙЕР ПРОИЗВОДСТВА brief → generated → optimized → published → measured content_items — центральный объект, на нём замеряются метрики A. КОНТУР ЗАКАЗОВ «для кого и за что» counterparties → deals B. КОНТУР ЗАЗЕМЛЕНИЯ «что сработало» outcomes → capabilities → ledger C. КОНТУР МЕТОДОВ «как производить» skills + reflection ``` Плюс сквозные: `noAction` (P5) и тонкий `Channel` (бывший P7). ## 3. Модель данных (SQLite, тот же файл БД) ### 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','platform','external')), name TEXT NOT NULL, notes TEXT, 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), brief TEXT NOT NULL, -- что заказали (тема/формат/объём) price REAL, currency TEXT DEFAULT 'RUB', status TEXT NOT NULL CHECK(status IN ('offered','accepted','delivered','paid','refused','defaulted')), created_at INTEGER NOT NULL, closed_at INTEGER ); CREATE TABLE deal_events ( id TEXT PRIMARY KEY, deal_id TEXT NOT NULL REFERENCES deals(id), type TEXT NOT NULL, payload_json TEXT, created_at INTEGER NOT NULL ); ``` ### B. Контур заземления ```sql -- Один outcome = один content_item + одно измерение метрики. CREATE TABLE outcomes ( id TEXT PRIMARY KEY, 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','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, -- null для нового контента value_after REAL, 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] ); -- Автономия по заслугам: тир НА ОБЛАСТЬ, не общий. CREATE TABLE capabilities ( 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 ); CREATE TABLE ledger ( id TEXT PRIMARY KEY, ts INTEGER NOT NULL, delta REAL NOT NULL, reason TEXT NOT NULL, balance_after REAL NOT NULL ); ``` ### C. Контур методов ```sql CREATE TABLE skills ( id TEXT PRIMARY KEY, 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 — retrieval под задачу ); ``` ## 4. Правила ### 4.1 Области (area) и типы метрик | 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 не участвует в трек-рекорде. ### 4.3 Автономия по заслугам | tier | Имя | Что разрешено | |------|-----|----------------| | 0 | observer | только анализ и предложения, публикаций нет | | 1 | suggest | предлагает готовый контент человеку, сам не публикует | | 2 | ask | публикует после подтверждения | | 3 | act+report | публикует и отчитывается; человек может откатить | | 4 | autonomous | публикует и выбирает темы сам, в границах persona | Переходы: - `+1 тир` за **3 нетто-положительных** outcome в области. - `−1 тир` за **1 нетто-отрицательный** — асимметрия: падать легче. - Затухание: outcome старше 90 дней весит 0.5. - Новая область стартует с tier 0. - **Границы persona `values` непреодолимы на любом тире.** ### 4.4 Энергия - Расход: тик, генерация (текст/фото/аудио/видео — дороже всего), публикация, вызов саб-агента. - Приход: **подтверждённые положительные outcomes** (особенно `revenue`), плюс донат человека. - Низкий баланс → интервал тиков растёт → Deep Rest. - Отличие от iLands: энергия восполняется результатом, а не покупкой. ## 5. Триггеры heartbeat (добавляются) | Триггер | Что делает | |---------|------------| | `{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). Источники метрик: **Метрика API, Google Search Console, Yandex Webmaster API, Wordstat** — у всех доступ уже настроен. Плюс `platform` (прослушивания/просмотры) и `manual`/`client`. ## 6. Тонкий Channel (бывший P7) ```ts interface Channel { send(text: string): Promise; } ``` Реализации: `ConsoleChannel`, `TelegramChannel`, `FileChannel`. `LLMClient` уже есть. Полный harness-реестр отложен — абстракция окупается с ≥2 реализациями. ## 7. Методы (skills) — привязка к реальному стеку | 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` | агент умеет не действовать; вывод через интерфейс | | 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. 4 требует 3. 5 требует 2. 7 требует 3. ## 9. Что НЕ делаем - Рекламные метрики (Директ/CPA) как основу — ушло из фокуса. - Соцсеть/ленту/подписки внутри агента. - Токены как валюту. - Полный harness-реестр. - «Суперразум из общества». ## 10. Открытые вопросы 1. **Свои сайты или клиентские заказы в первую очередь?** (влияет на приоритет шага 2 vs 6; предлагаю сначала свои сайты — полный контроль над метриками). 2. **Кто ставит `horizon_days`** — агент предлагает, человек правит? (Мой дефолт.) 3. **Где предел «качества» текста** — только метрики или ещё экспертная оценка Ника обязательна перед публикацией на tier<3.