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:
1 parent
436dd5fa31
commit
97f03a9dd5
3 files changed
+212
-146
No files matched your search
@@ -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.
|
||||||
@@ -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
|
||||||
|
|
||||||
|
|||||||
@@ -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'`.
|
||||||
Reference in new issue
Block a user