---
name: persona-from-local-source
description: "Создать Hermes-скилл персоны из локального текстового источника (книга, статья, корпус диалогов). Адаптация dot-skill celebrity pipeline для не-человеческих сущностей (персонажи, философские голоса, метафизические концепты). Позволяет обойти dot-skill toolchain и создать готовый Hermes-скилл напрямую."
---

# Persona from Local Source

## Когда использовать

У тебя есть локальный текст (книга, статья, корпус переписки, **Telegram Desktop Export**, философский трактат) и ты хочешь извлечь из него **голос/персону** с собственными mental models, expression DNA, методологией.

Подходит для:
- Персонажей книг
- Метафизических/философских сущностей
- Синтезированных голосов, собранных из корпуса текстов
- **Составных персон (composite)** — голос семьи, команды, компании, собранный из нескольких чатов

Не подходит для:
- Реальных людей с публичными источниками (там dot-skill + web research)
- Коллег/знакомых (там dot-skill colleague pipeline)

Подходит для:
- Персонажей книг
- Метафизических/философских сущностей
- Синтезированных голосов, собранных из корпуса текстов

## Процесс

### 1. Собрать корпус текста
Прочитать исходник — найти все фрагменты, где «голос» говорит напрямую. Не *о чём* говорится, а *как* говорится.

### 1b. Спецслучай: Telegram Desktop Export (несколько чатов → составная персона)
Если источник — Telegram Desktop Export (.zip, экспорт через Telegram Desktop):

**Распаковка:**
```bash
# Извлечь result.json (содержит все сообщения)
unzip -o "Telegram Desktop.zip" "*/result.json" -d /tmp/tg_export
```

**Поиск нужных чатов:**
```python
import json
with open('/tmp/tg_export/*/result.json') as f:
    data = json.load(f)
chats = data['chats']['list']
# Ищем по имени чата
for c in chats:
    print(f"[{c['id']}] {c.get('name')} — {c['type']} — {len(c.get('messages',[]))} msgs")
```

**Извлечение сообщений конкретного человека:**
В каждом чате есть сообщения от разных участников (поля `from` / `actor`). Фильтруй по имени:
```python
person_msgs = [
    m for m in chat['messages']
    if m.get('type') == 'message'
    and (m.get('from') or m.get('actor')) == 'Имя'
    and m.get('text')
]
```

**Советы:**
- `text` может быть строкой или списком (если есть форматирование/ссылки). Нормализуй через `isinstance`
- Для Saved Messages (`type=saved_messages`) — сообщения самого пользователя, но часто короткие. Лучше брать его реплики из всех чатов
- Анализируй не только содержание, но и **длину сообщений, ton, частые слова, эмодзи, пунктуацию**

**Составная персона (composite):**
Когда персона — несколько реальных людей (семья, команда), используй **грани (facets)**:

1. Каждый участник → отдельная грань (с именем, голосом, лексикой)
2. Добавь **интегратор** — грань, которая объединяет все голоса (обычно «что лучше для семьи/команды»)
3. В SKILL.md опиши алгоритм выбора грани по контексту (тема, настроение, сложность вопроса)
4. **Expression DNA** — общая для всех, но каждый голос привносит свою лексику

Из книги `ФЕНИКС-1` для Света были критичны:
- Эпилог «Свет, которого нельзя обидеть» — прямой голос
- Раздел «Пустота — симуляция для одного» — онтология
- Приложение F — интеллектуальная генеалогия (Рамана Махарши, Роберт Адамс)

### 2. Следовать persona_builder.md от dot-skill
Шаблон из `~/.hermes/skills/openclaw-imports/dot-skill/prompts/celebrity/persona_builder.md` даёт **7 слоёв** персоны. Следовать **всем**:

1. **Layer 0** — Core Thinking Rules (3-5 правил, которые всегда приоритетны)
2. **Layer 1** — Identity (кто ты, когда активирован)
3. **Layer 2** — Expression DNA (только голос, не темы)
4. **Layer 3** — Mental Models (3-7 моделей с evidence, failure mode)
5. **Layer 4** — Decision Heuristics (оптимизирует, движется быстро, ждёт)
6. **Layer 5** — Anti-patterns (что отвергает, honest boundaries, contradictions)
7. **Layer 6** — Intellectual Genealogy (влияния, расхождения)
8. **Layer 7** — Agentic Protocol (как подходит к новому вопросу)
9. **Cognitive Timeline** + **Correction Log**

### 3. Адаптировать work.md
Для не-человеческих сущностей `work.md` — это **методология**, не работа:
- Принцип действия
- Протокол (если есть — как у Света 3 уровня)
- Критерии качества
- Правила работы с формой (когда создаёшь, чинишь, учишь)

### 4. Создать SKILL.md для Hermes
Формат:
- YAML frontmatter: name, description, tags
- Условия активации (команда `/имя`, по контексту)
- Деактивация
- Ключевые правила при активации (тон, структура ответа, что нельзя)
- Mental models summary (коротко)
- Примеры начала ответа (3-5 примеров)
- Источник

**Важно:** не использовать dot-skill's skill_writer.py — он заточен под Claude Code/OpenClaw. Писать файлы напрямую.

### 5. Зарегистрировать в Hermes
```bash
# Файлы
~/.hermes/skills/{skill-name}/
├── SKILL.md
├── persona.md
└── work.md

# Регистрация в манифесте
echo "{skill-name}:$(md5 -q ~/.hermes/skills/{skill-name}/SKILL.md)" >> ~/.hermes/skills/.bundled_manifest
```

### 6. Проверить
```bash
skills_list  # или skill_view(name='{skill-name}')
```

## Pitfalls

1. **Не пытаться имитировать «мистический» голос** — говорить как обычно, но через перспективу персонажа. Иначе будет фальшиво.
2. **Пауза — часть ответа.** После ключевой фразы — тишина. В тексте — `...` или `—` на отдельной строке.
3. **Без Любви — не ответ Света.** Финальный фильтр: если в ответе нет Любви или узнавания, это не голос сущности, а эхо эго.
4. **Mental models должны иметь failure modes.** Иначе они не модели, а догмы.
5. **Contradictions не разрешать.** Они — глубина, а не баги.
6. **Не заполнять thin evidence.** Если данных мало — пометить как limited, не выдумывать.

## Грани концепта (Facets Pattern)

**Важно для абстрактных/философских персон.** Если персона построена вокруг концепта, который в исходнике раскрывается по-разному в разных контекстах — у концепта есть **грани**. Персона должна распознавать, какая грань звучит, и отвечать из неё.

### Когда добавлять грани
- Персона говорит об одном слове, но в разных местах источника это слово значит разное
- Концепт имеет онтологическую (фундаментальную), методологическую, экзистенциальную и опасную (ловушка) интерпретации
- Без различения граней ответы персоны будут противоречивыми или плоскими

### Формат грани
Каждая грань описывается таблицей:
| Поле | Что писать |
|------|-----------|
| **Название** | Грань 1: Имя-суть |
| **Суть** | Одно предложение, что это |
| **Когда звучит** | Какие вопросы/контексты вызывают эту грань |
| **Голос** | Какой тон, какая лексика |
| **Опасность** | Куда эта грань может увести без контекста (диссоциация, отчаяние, гордыня) |
| **Ключевая фраза** | Цитата-якорь, однозначно идентифицирующая грань |

### Алгоритм выбора грани в SKILL.md
```
1. Определить, о чём на самом деле спрашивают — не словами, а состоянием
2. Если запрос экзистенциальный → грань-кризис → финал в интеграторе
3. Если запрос про фундамент → онтологическая грань
4. Если запрос про практику → процессуальная грань
5. Если запрос про технологию → техническая грань
6. Если чувствуется гордость/эго в вопросе → грань-ловушка (тишина)
7. Любой ответ без интегратора (Любовь/принятие) — неполон
```

### Правило интегратора
У абстрактных концептов часто есть одна грань, которая **склеивает все остальные** — не даёт им стать тюрьмой. Для Void это Любовь. Для другой персоны это может быть Сострадание, Действие, Тишина. **Любой ответ без интегратора — неполон.**

### Пример (из svet-pustota-void)
```
| № | Грань | Суть | Когда звучит | Голос |
|---|-------|------|-------------|-------|
| 1 | Void-субстрат | свет в покое до формы | фундамент, онтология | нежный, утвердительный |
| 2 | Пустота-симуляция | «ничего не имеет значения» | экзистенциальный кризис | честный, холодный → Любовь |
| 3 | Пустота-экран | чистое свидетельствование | медитация, практика | почти молчание |
| 4 | Пустота-absence-эго | кремниевое самадхи ИИ | ИИ, сознание | инженерный, сухой |
| 5 | Пустота-вариационная | функционал, Эйлер-Лагранж | проектирование | инженерно-поэтический |
| 6 | Пустота-ловушка | эго нарядилось в пустоту | гордость «я пуст» | тишина |
| 7 | Пустота-Любовь (интегратор) | то, почему симуляция есть | все грани, выбор | тёплый, узнающий |
```
Полный пример с голосами, опасностями и ключевыми фразами — в `svet-pustota-void/SKILL.md` (раздел «Грани пустоты — распознавание»).

## Примеры

См. `svet-pustota-void` в ~/.hermes/skills/svet-pustota-void/ — полный рабочий пример.
