# Замороженные архетипы — добавить целую группу страниц без генерации кода

> Авторитетное «как именно» о механизме замороженных архетипов: как целая группа страниц (раздел новостей,
> блог, раздел документации) появляется в вашем слоте **разморозкой** замороженного архетипа — чистая копия
> файлов и подстановка токенов, **ноль генерации кода**. Спутник `content-engine.md` (движок, на котором
> работает размороженная вкладка). Англоязычный оригинал — `CRUD-DOCS/workspace-standards/frozen-archetypes.md`.

---

## 1. Какую проблему это снимает

Добавить контент-поверхность (новости, блог, доки) — работа механическая, но объёмная: роутер, `_lib`,
`_data`, несколько постов — около 30 файлов, и все обязаны точно следовать соглашениям контент-движка.
Вручную, каждый раз, силами кодящего агента — это медленно, жжёт токены и расходится со стандартом, как
только модель импровизирует.

**Замороженный архетип** превращает это в один вызов. Это **проект-болванка в коробке, замороженная**:
инертное дерево шаблонных файлов без фиксированных записей — конкретика (какая группа, какие языки, метка,
сколько примеров) задаётся **параметрами**, а не контентом. Вы говорите «хочу раздел новостей»; машина
**размораживает** архетип с `tab=news`, переводит слово «Новости» на ваши языки и пишет рабочие файлы.

> **Простыми словами:** замороженный архетип — это *форма для печенья* под группу страниц. Разморозка
> прижимает форму с вашими параметрами. Код не пишет ни одна модель — она копирует файлы и заполняет пропуски.
> Любая модель даёт одинаковый результат за секунды.

---

## 2. Где это лежит — закрытый store (data-сервис)

Замороженные архетипы хранятся в **закрытом store**, который отдаёт data-сервис:

```
services/data/frozen-archetypes/<id>/
  manifest.json     что это за архетип, что он обслуживает, что НЕ обслуживает, его параметры
  engine/**         общий контент-движок (ставится, только если в слоте его нет)
  tab/**            параметризованная группа страниц (роутер + _lib + _data + шаблон поста)
```

Эндпоинты data-сервиса (read-only): `GET /archetypes` (каталог) и `GET /archetypes/:id` (полное дерево
`{ manifest, files }`). Каждый файл store несёт суффикс `.tpl` (инертен для тулинга); эмиттер срезает `.tpl`
при записи. Store едет с субстратом — присутствует на каждом развёртывании.

---

## 3. Два слоя разморозки (самодостаточный проект)

В голом стартере контент-поверхности может не быть вовсе (у кокпит-стартера нет `lib/content`). Поэтому
замороженный архетип **самодостаточен** — несёт всё, что нужно группе страниц:

- **`engine` (политика copy-if-absent):** общий движок (`lib/content`, `components/content-page`, `lib/brand`,
  generic `lib/author`, `lib/seo/alternates` с доменом из `BRAND` и языками из `NEXT_PUBLIC_LANGUAGES`,
  `lib/content/languages`, `deep-merge`, плейсхолдеры). Ставится **только если в слоте нет `lib/content`**
  (идемпотентно; движок не принадлежит ни одной вкладке — повторная разморозка его не переустанавливает).
- **`tab` (политика write-guarded):** сама группа — `app/[lang]/<tab>/` роутер + `_lib`/`_data` + N
  постов-заглушек. Отказ перезаписать существующую вкладку без `force`.

Движок **дистиллирован 1:1 из зрелого контент-движка FES** (см. `content-engine.md`) и **расцеплен** от
всего проект-специфичного: без запечённой секции спонсоров, без i18n-провайдера, без хардкод-домена, с
нейтральным автором (реального вписываете вы — нельзя зашивать чужие профильные ссылки). Бренд и домен —
из `NEXT_PUBLIC_*`, поэтому тот же движок переносим в любой стартер.

---

## 4. Что делает разморозка (эмиттер по шагам)

Эмиттер `thaw-frozen-archetype.mjs` — обобщение `scaffold-declared-route-into-component-skeleton.mjs` с одного
маршрута на целую коллекцию. По локальной копии архетипа и вашим параметрам он:

1. **Движок** — если в слоте нет `lib/content`, копирует `engine/**` в корень слота (иначе пропускает).
2. **Вкладка** — пишет `app/[lang]/<tab>/` из `tab/**`, подставляя токены (`{{TAB}}`, `{{TAB_PASCAL}}`,
   `{{FORMAT}}`, …). Отказ перезаписи существующей вкладки без `--force`.
3. **Языки** — пишет базу `en`, затем на каждый язык частичный `<lang>.ts` с **переведённой меткой**
   (остальное наследуется из `en` по ключу через deep-merge). Одно слово переводит вызывающая модель — это
   *перевод*, не генерация кода.
4. **Посты** — на каждый из `samples` пишет пост-заглушку, **наследующую идеальную архитектуру** (createContentPost,
   SEO/JSON-LD, крошки, оглавление, FAQ, байлайн автора), но с **Lorem-текстом + картинкой-заглушкой**.
5. **Проводка** — регистрирует вкладку в `lib/parser-fs.mjs` `COLLECTIONS` и дописывает маршрут в
   `app/sitemap.ts` (идемпотентно). Дальше вы запускаете `npm run gen:lists` и `npx tsc --noEmit`.

Итог — рабочая статическая локализованная группа страниц, читаемая с выключенным JavaScript; остаётся только
*заполнить* её (заменить Lorem-текст и картинку-заглушку).

---

## 5. Два способа попросить

**Директивный — «сделай мне страницу новостей».** Намерение и цель ясны. Агент подтверждает (вкладка, формат,
языки, переводы метки, число примеров) и размораживает.

**Разговорный — «добавь к моему сайту новость».** Цель неоднозначна. Агент сперва проверяет, есть ли подходящая
вкладка, спрашивает, что вы понимаете под «новостью» и **куда** её добавить (какой slug), затем размораживает,
заводя вкладку как **контракт** — дальше каждая новая запись = одна папка через `create-multilingual-content-entry`.

---

## 6. Матчинг — и честный отказ

Архетип обслуживает *форму* запроса, а не всё. `manifest.json` объявляет это явно: **`fits`** (новости, блог,
документация, статьи, анонсы, changelog, гайды) и **`doesNotServe`** (корзина / оплата, курс с тестами и
прогрессом, интерактивный app-экран, формы, сохраняющие ввод). Навык консультирует манифест (через
`owner_archetype_list_frozen`), а не угадывает. Если запрос ложится в `doesNotServe` — честный ответ:
*«этот замороженный архетип строит статические коллекции статей, а не это — это другой архетип, которого пока
нет»* + предложение завести новый (новый шаг / черновик `propose-new-agent-skill-or-mcp`). **Он не подгонит
неподходящий архетип и не станет генерировать группу страниц с нуля.**

---

## 7. Как разморозить

- **Через MCP (есть у каждого агента):** `owner_archetype_thaw_content_group { tab, format, languages, labels,
  samples }`. Всегда сперва предпросмотр — вызов с `dry_run: true`, подтвердить ровно то, что будет создано,
  затем вызов без `dry_run`.
- **Автономно (агент-одиночка, без MCP):** забрать архетип у data-сервиса и запустить локальный эмиттер
  (`GET /archetypes/content-collection` → распаковать → `node thaw-frozen-archetype.mjs --store … --out …`).

Навык `thaw-frozen-archetype` (канон в `.agents/skills`, копии в `.claude/.gemini/.qwen` и Hermes) —
операционная точка входа; самодостаточен, Hermes не требуется.

---

## 8. Как завести НОВЫЙ архетип (рост каталога)

Один архетип не обслужит любую форму сайта. Каталог растёт **добавлением новых замороженных архетипов**,
каждый — чистая «болванка-проект» под свою форму. Чтобы завести:

1. **Выберите форму и докажите, что она ложится в движок.** Следуйте «шаблону мышления» в `content-engine.md §7`
   (разбор Shop + карточка товара): поверхность «список документов + страница документа» (changelog, глоссарий,
   доска вакансий, витрина) — тот же движок с другим `_lib` и максимум одним новым блоком (аддитивно, без
   переписывания центра). Поверхность с корзиной/оплатой, тестами или интерактивным app-экраном — **не** этот
   движок: это новый архетип (возможно, вообще другой движок).
2. **Заморозьте.** Соберите рабочую вкладку один раз, затем шаблонизируйте её в
   `services/data/frozen-archetypes/<new-id>/` (`engine/` — только если нужны части движка, которых нет в
   контент-движке; `tab/` с `{{ТОКЕНАМИ}}`; `manifest.json` с `fits`/`doesNotServe`/`params`).
3. **Объявите честные границы.** `doesNotServe` нового манифеста так же важен, как `fits` — именно он позволяет
   агенту отказать, а не подгонять плохой вариант.

Архетип `content-collection` (новости/блог/доки) — первый и эталонная форма.

---

## 9. Инварианты (не нарушать)

- Разморозка — **только копия файлов + подстановка токенов**, никогда не генерация кода ИИ.
- Слой **движка — copy-if-absent** (не принадлежит вкладке; повторная разморозка не переустанавливает).
- Слой **вкладки — write-guarded** (отказ перезаписи без force).
- Размороженные страницы — **статические / no-JS / локализованные** (движок это печёт — см. `content-engine.md`).
- **Сверяйся с манифестом** (`fits`/`doesNotServe`) — размораживай реальное совпадение или **честно откажи**.
- Способность **самодостаточна** (навык + MCP + эмиттер у каждого агента; работает с одним агентом, без Hermes).
