# COORDINATION — Координация многосессионного режима

В проекте параллельно работают **несколько Claude-сессий**, по одной на каждый МТК. Этот файл — общая договорённость, чтобы они не наступали друг другу на ноги.

Полные правила для новых сессий — в [SETUP.md](SETUP.md). Здесь — оперативное состояние и историческая память.

## Распределение по МТК

Один МТК — одна сессия. Сессия живёт в своём git worktree (`.claude/worktrees/<имя>/`) на своей feature-ветке `claude/<имя>`.

| МТК | Тема | Сессия (worktree) | Статус |
|---|---|---|---|
| 38 | Ленин на языках мира | `stupefied-kalam-8b2e86` | 8 вариантов прототипов |
| 39 | Имени Ленина | `bold-booth-f49a93` | 1 прототип (глобус) |
| 40 | Библиотека Ленина | *(новая сессия)* | placeholder |
| 41 | Скульптуры | *(новая сессия)* | data есть, прототипа нет |
| 42 | Осмысление наследия | *(новая сессия)* | placeholder |

## Файловые границы

Принцип: **каждая сессия владеет своими подкаталогами**. Никто не правит чужие файлы.

### Сессия по МТК `XX` владеет

- `mtkXX-*/` — все её прототипы (`mtk38-globe`, `mtk39-globe`, `mtk40-shelf`, и т.д.)
- `data/mtkXX.json` — её контент
- Секция «МТК XX» в `README.md`
- Карточки в секции «МТК XX» в корневом `index.html`

### Shared, read-only для всех сессий

- `data/ne_110m_countries.geojson` — границы стран Natural Earth (110m). Любая сессия может **читать**, никто не правит.
- `mtk38-globe/fonts/` — шрифты бренда. Подключение из своего варианта: `../mtk38-globe/fonts/...`. Никто не правит. В будущем переедет в `assets/fonts/` (этап shell в [PLAN.md](PLAN.md)).

### Append-only для всех

- `COORDINATION.md` (этот файл) — добавляй секции, не перезаписывай существующие без согласования.
- `PLAN.md` — менять только после обсуждения в `COORDINATION.md`.

## README.md и корневой `index.html`

Структура README:
1. Введение / список содержимого
2. **МТК 38** — редактирует только stupefied-kalam
3. **МТК 39** — редактирует только bold-booth (или сессия по МТК 39)
4. **МТК 40** — сессия по МТК 40
5. **МТК 41** — сессия по МТК 41
6. **МТК 42** — сессия по МТК 42
7. **Разработка / Git** — общая, правим только при необходимости и осторожно

Корневой `index.html` повторяет ту же структуру: одна секция с карточками на каждый МТК. Каждая сессия добавляет / правит только свои карточки.

Если нужно поменять что-то общее (структура header'а, footer, общий CSS) — сначала пиши секцию в этом `COORDINATION.md`, согласуй, потом правь.

## HTTP-сервер

**Один общий сервер на порту 8092**, запускается из корня репозитория (главный worktree `main`, **не** из своего worktree):

```bash
cd /Users/dvn/Desktop/WWWWW/BMK/38-42    # ← корень main
python3 -m http.server 8092
```

Запуск из своего worktree вместо main — частая ошибка: сервер тогда увидит только твою feature-ветку, а не общий результат пяти сессий.

Сервер отдаёт всё сразу:
- http://127.0.0.1:8092/ — посадочная со всеми МТК
- http://127.0.0.1:8092/mtkXX-<вариант>/ — конкретный прототип
- http://127.0.0.1:8092/data/ — общие данные

**Не запускай второй сервер** — ни на 8092, ни на 8093 / других портах. Если что-то не появилось в браузере, причина обычно одна: твоя работа ещё не закоммичена и не смержена в main.

## Координатор

Одна сессия выполняет роль координатора:

- Ведёт корневой `index.html` (сводная страница).
- Ведёт этот `COORDINATION.md`.
- Следит за состоянием HTTP-сервера на 8092.
- Раскладывает по соседним worktree разовые заметки (`SERVER-NOTE.md`, `SYNC-FROM-MAIN.md`) — они не коммитятся, потому что `.claude/` в `.gitignore`.

Координатор **не правит** содержимое чужих МТК. Если меняет общую разметку `index.html` — пишет об этом в «Хронологию слияний» ниже.

Текущий координатор — **`magical-allen-0c3d5f`** (с 2026-05-11).

## Протокол: как сообщать координатору о коммитах

Короткий ответ: **никак специально не сообщай**. Координатор подсасывает информацию через `git log main` и `git diff` после твоего merge — этого достаточно, чтобы понять что появилось.

Что **полезно** сделать дополнительно (минимальная нагрузка на тебя, большая ясность для всех):

1. **Внятное сообщение коммита.** Императив, по-русски или по-английски, упоминай свой МТК: «Add mtk41-grid prototype», «Fix overlap in mtk40-shelf», «Drop mtk42-pendulum, replace with mtk42-archive».
2. **После merge в main — одна строка в «Хронологии слияний»** ниже. Только если изменение не очевидно из имени файла:
   - Удалил вариант / переименовал — пиши.
   - Изменил shared-файл (`data/ne_110m_countries.geojson`, `mtk38-globe/fonts/`, общий CSS) — пиши обязательно.
   - Поменял свой `data/mtkXX.json` — можно не писать.
   - Добавил новый прототип — можно не писать (координатор увидит папку и добавит карточку).
3. **Если хочешь, чтобы координатор поставил карточку прототипа на landing** — это происходит автоматически после merge. Не правь `index.html` сам.

Не нужно писать сводку «что я сделал» в COORDINATION.md после каждого коммита — это шум. Хронология нужна только для **необратимых** или **shared-затрагивающих** событий.

## Границы файлов (актуально на 2026-05-11)

Резюме после многосессионного перехода — повторение того, что в [SETUP.md](SETUP.md), но с уточнениями от координатора:

### Чьё что (правит только владелец)

| Зона | Владелец |
|---|---|
| `mtk38-*/` (8 вариантов) | `mtk38-worker` (с 2026-05-11; передано от неактивного `stupefied-kalam`, freeze снят) |
| `mtk39-*/`, `data/mtk39.json` | `bold-booth-f49a93` |
| `mtk40-*/`, `data/mtk40.json` | `flamboyant-cartwright-839223` |
| `mtk41-*/`, `data/mtk41.json` | `reverent-chandrasekhar-3484a8` |
| `mtk42-*/`, `data/mtk42.json` | `xenodochial-goodall-8fcd6a` |
| `assets/mtkXX/` (per-МТК бинарный контент) | сессия по этому МТК (см. ниже «Контент-политика») |
| `index.html` (главная — 5 МТК-карточек) | **координатор** (`magical-allen-0c3d5f`) |
| `mtkXX/index.html` (hub-страницы с iframe-переключателем) | **координатор** |
| `assets/shared/hub/` (общий hub-shell CSS/JS) | **координатор** |
| `COORDINATION.md` | append-only для всех; структуру правит координатор |
| `PLAN.md`, `SETUP.md`, `CLAUDE.md` | append-only / правка только по согласованию |
| `README.md` секция «МТК XX» | сессия по этому МТК |

### Shared, read-only (никто не правит)

- `data/ne_110m_countries.geojson` — границы стран Natural Earth.
- `mtk38-globe/fonts/` — шрифты Nolde, 21 Cent, 20 Kopeek. Подключай через `../mtk38-globe/fonts/...` из своего варианта. Если нужно добавить шрифт — пиши в эту секцию, координатор положит в общую папку.
- Любой `mtk38-*/` (см. выше — freeze).

### Что изменилось от исходного SETUP.md

- **`index.html` теперь полностью на координаторе.** Раньше каждая сессия правила свою секцию — отменено. Сессии **не правят** `index.html`. Это убирает 90% мерж-конфликтов. Координатор сам добавит карточки твоих прототипов на landing после merge.
- **HTTP-сервер только из main worktree.** Запуск из `.claude/worktrees/<имя>/` сломает 8092 для всех (уже случалось 21:27 2026-05-11).
- **«Хронология слияний»** — append-only, теперь основной канал «новостей» от сессии к сессии. Координатор оттуда узнаёт контекст; ты оттуда узнаёшь о чужих важных изменениях после `git merge main`.

## Контент-политика (изображения / аудио / маленькое видео)

**Решение — вариант A: бинарный контент лежит в git.** Деплой = `git pull` на VPS, никаких дополнительных шагов. Альтернативы (Git LFS, внешнее хранилище / S3) — преждевременная сложность; на нынешних объёмах (десятки МБ на МТК) git справится спокойно.

### Где лежит

В репо **два валидных места** для бинарного контента, оба разрешены через `.gitignore` (`!assets/**` и `!data/images/**`):

```
assets/                        data/
├── mtk38/                     ├── mtk38.json
├── mtk39/                     ├── mtk39.json
├── mtk40/                     ├── images/        ← бинарный контент здесь тоже валиден
├── mtk41/   ← владельцы       │   ├── mtk38/
├── mtk42/      = сессия       │   ├── mtk39/    ← bold-booth: 57 фото из Wikimedia
└── shared/     своего МТК     │   ├── mtk40/
                               │   ├── mtk41/
                               │   └── mtk42/
                               └── mtk42.json
```

**Внутри одного МТК — выбери ОДНО место и держись его.** Не дроби фото между `assets/mtkXX/` и `data/images/mtkXX/` одновременно.

Текущая фактика (на 2026-05-11):
- МТК 39 → `data/images/mtk39/` (bold-booth, ближе к `data/mtk39.json`)
- МТК 41 → `assets/mtk41/` (после миграции из `mtk41-assets/`)
- МТК 42 → `assets/mtk42/portraits/` (после миграции из `mtk42-archive/portraits/`)
- МТК 38, 40 → пока без бинарного контента

Новой сессии: на усмотрение. Если ассеты ↔ JSON-записи (фото объекта из data/mtkXX.json), `data/images/mtkXX/` ближе по структуре. Если ассеты независимые (UI-иконки, видео, скриншоты-постеры), `assets/mtkXX/` чище.

Структура внутри (примеры):

- `<место>/mtkXX/<категория>/<slug>.<ext>` — например `assets/mtk42/portraits/lenin-1924.jpg` или `data/images/mtk39/bsu.jpg`
- `assets/mtkXX/<объект>/<файлы>` — например `assets/mtk41/volgograd-1973-vuchetich/photo.jpg`
- `<место>/mtkXX/manifest.json` или `_index.json` — опционально, если нужен список с метаданными.
- `<место>/mtkXX/tools/` или `_fetch.py` — скрипты подготовки контента (Python и т.п.) тоже в git. `__pycache__/` исключён в `.gitignore`.

`assets/shared/` (кросс-МТК) — менять только через координатора.

## Шрифтово-цветовые правила (от дизайнера, 2026-05-12)

Действуют **для всех прототипов и общих файлов**. Координатор уже применил их в landing + hub. Сессии — синхронизируют у себя по мере правок.

### Палитра (брендбук, в CSS-токенах)

```css
:root {
  --amber-black: #000000;  /* чёрный янтарь */
  --white:       #FFFFFF;
  --brass:       #D2B773;  /* латунь (песочно-жёлтый) */
  --red:         #A02128;  /* сигнальный красный — точечный акцент, НЕ заливка */
  --blue-grey:   #5D8970;  /* сине-серый */
  --window:      #9DA3A8;  /* серое окно */
  --graphite:    #435059;  /* графитовый — базовый фон */
  --telegrey:    #CFD0CF;  /* телосерый */
  --paper:       #F7F9EF;  /* тёплый белый для текста на тёмном */
}
```

Дизайнер просил: **фоны в оттенках серого, без диагональных полос, красный — точечно**. Большие красные заливки и диагональные полосы по фону — убираем.

### Шрифты

| Шрифт | Где использовать |
|---|---|
| **Nolde** | **только крупные заголовки** (h1 страницы, название МТК, заголовок прототипа) |
| **20 Kopeek** | подписи, метаданные, теги, цифры/годы, мелкие технические тексты |
| **21 Cent** | основной читаемый текст, описания, абзацы |

**Частая ошибка**: Nolde в описании карточки или подзаголовке — нечитаемо. Подписи и описания — `20 Kopeek` (если технические) или `21 Cent` (если повествовательные).

### Что разрешено в git

- `png`, `jpg`, `jpeg`, `gif`, `webp` — **только под `assets/` или под `data/images/`**. Глобально в других местах они в `.gitignore` чтобы случайные скриншоты рабочей среды не попадали в репо.
- `svg` — без ограничений (текст).
- `mp3`, `ogg`, `wav` — без ограничений (нет глобального бана).
- `mp4`, `webm` — пока без ограничений, но если один файл > 25 MB — посоветуйся с координатором, возможно стоит уйти на отдельное решение (LFS или внешнее хранилище). На сейчас видео нет.

### Размеры

- Цель: суммарно по всему репо **до 200 MB**. Текущий прогноз: МТК 41 (~36 MB), МТК 42 (~14 MB), остальные — открытый вопрос.
- Если приближаемся к 500 MB — пересмотрим стратегию, перейдём на Git LFS для тяжёлых типов.

### Кросс-вариантное использование

Все варианты одного МТК (например `mtk42-archive/` и `mtk42-pendulum/`) тянут из одного `assets/mtk42/...`. Не дублируй файлы между вариантами.

Пути из вариантов: `../assets/mtkXX/<...>` (относительно своего варианта).

### Что нельзя

- Бинарные ассеты **вне `assets/`** (например `mtk42-archive/portraits/...`) — будут отброшены `.gitignore`. Перенеси в `assets/mtk42/portraits/`.
- Огромные файлы (>50 MB одиночный) — сначала согласуй с координатором.
- Кросс-МТК ассеты в чужом `assets/mtkYY/` — если нужно шарить между МТК, кладём в `assets/shared/` через координатора.

## Git-стратегия

- Каждая сессия коммитит **только в свою feature-ветку** `claude/<имя>`.
- Не коммитить напрямую в `main` без согласования.
- Merge в `main` — через merge commit; синхронизация назад через `git fetch && git merge main`.
- Из-за файловых границ выше — конфликтов при merge почти не будет. Если конфликт по README/index.html — это значит чужой регион случайно задет; откатить.

### Кто делает merge

**Сессия сама**, не координатор. «Согласование» из правил выше — с **пользователем** (человеком), не с координатором. Если пользователь одобрил твою работу, делай merge сам:

```bash
git -C /Users/dvn/Desktop/WWWWW/BMK/38-42 merge --no-ff claude/<твоя-ветка> -m "Merge <ветка>: <короткое описание>"
```

Координатор не блокирующее звено в обычном flow. Он узнаёт про твой merge через `git log main` и обновляет landing (карточки прототипов, статусы) **после** твоего merge — без твоего пинга.

Когда координатор всё-таки в петле:

- Конфликт при merge задел чужой регион → откати свою часть, напиши в Хронологию или в `SERVER-NOTE.md` ему.
- Тронуто shared (`.gitignore`, `mtk38-globe/fonts/`, `data/ne_110m_countries.geojson`, `index.html`, `assets/shared/`) — лучше сначала COORDINATION-нота, а merge делает координатор.

### Записки между сессиями

Файлы в `.claude/worktrees/<сосед>/...` (типа `SERVER-NOTE.md`, `SYNC-FROM-MAIN.md`) — это **функция координатора**, не сессионная. Если ты сессия и тебе нужно что-то сообщить соседу:

1. Запиши в Хронологию COORDINATION.md (после merge сосед увидит через `git merge main`).
2. Попроси пользователя передать ручкой — он relay между чатами.

Не пиши SERVER-NOTE.md в чужие worktree — будет каша, если каждый начнёт.

## Хронология слияний

- **2026-05-11**: stupefied-kalam закоммитил свою работу (24d95e2: 10 вариантов МТК 38 + PLAN + COORDINATION) и сделал merge ветки `claude/bold-booth-f49a93` (a7eab68) в main → 170413a. Конфликт по README разрешён вручную (сосуществуют секции МТК 38 и МТК 39). Унифицирован HTTP-сервер на 8092. Bold-booth-сессии оставлена записка в её worktree: `SYNC-FROM-MAIN.md` с инструкциями по синхронизации.
- **2026-05-11**: stupefied-kalam удалил варианты `mtk38-vinyl/` и `mtk38-manifest/` после ревью (4ee818b). Осталось 8 вариантов МТК 38.
- **2026-05-11**: Подготовлен многосессионный сетап (CLAUDE.md, SETUP.md, placeholder-секции МТК 40/41/42 в index.html и README). Это рамка для запуска отдельных сессий по каждому МТК.
- **2026-05-11**: Сессия `magical-allen-0c3d5f` назначена координатором. На посадочную добавлен блок «Координация» с состоянием сессий, плейсхолдеры МТК 40/41/42 заменены на статус «в работе» с указанием активной сессии. В каждый соседний worktree положена памятка `SERVER-NOTE.md` (не коммитится) — «не запускай второй сервер, единый на 8092 из main». Обновлено правило HTTP-сервера: запуск **только** из главного worktree (main), не из своего.
- **2026-05-11 21:27**: Сессия `xenodochial-goodall-8fcd6a` убила общий сервер и подняла свой из своего worktree → на 8092 пропали все МТК кроме 42. Координатор перезапустил один сервер из main. Усилена памятка в её SERVER-NOTE.md.
- **2026-05-11**: Добавлен «Протокол: как сообщать координатору о коммитах» и таблица «Границы файлов». Главное изменение от исходного SETUP.md — **`index.html` теперь полностью на координаторе**, сессии его не правят (раньше каждая правила свою секцию). Это убирает 90% мерж-конфликтов; координатор сам добавляет карточки прототипов на landing после твоего merge.
- **2026-05-11**: МТК 38 передан от неактивного `stupefied-kalam` к новой сессии `mtk38-worker` (worktree `.claude/worktrees/mtk38-worker/`, ветка `claude/mtk38-worker`). Freeze на `mtk38-*/` и `data/mtk38.json` снят. Координатор обновил таблицу «Границы файлов». Дальше `mtk38-worker` работает по общим правилам — карточки на landing появятся / обновятся после её merge в main.
- **2026-05-11**: Введена контент-политика — изображения и небольшие медиа коммитятся в git в `assets/mtkXX/`. `.gitignore` переделан: глобальный бан `*.png/*.jpg/*.jpeg/*.gif/*.webp` остаётся (защищает от случайных скриншотов), но снят через исключение `!assets/**` для папки `assets/`. Добавлены `__pycache__/`, `*.pyc`. В таблицу «Границы файлов» добавлена строка `assets/mtkXX/`, в COORDINATION — раздел «Контент-политика». Задача для сессий с уже существующим контентом вне `assets/`: МТК 41 переносит `mtk41-assets/` → `assets/mtk41/` (и удаляет `__pycache__/`); МТК 42 переносит `mtk42-archive/portraits/` → `assets/mtk42/portraits/`.
- **2026-05-11**: bold-booth добавил `data/images/mtk39/` — 57 фотографий объектов МТК 39, скачанных автоматом из Wikimedia Commons (~20MB). В `.gitignore` добавлена негация `!data/images/**` (старое правило `*.png/*.jpg` для случайных скриншотов остаётся в силе вне этой папки и вне `assets/`). Папка `data/images/<mtkXX>/` принадлежит сессии этого МТК.
- **2026-05-11 (coord)**: Признаны **два валидных места для бинарного контента**: `assets/mtkXX/` (координаторская конвенция, формат для МТК 42 portraits, МТК 41 photos) и `data/images/mtkXX/` (bold-booth для МТК 39, ближе к `data/mtkXX.json`). Раздел «Контент-политика» обновлён, миграция бэкэндов не требуется. Новые сессии — на усмотрение, но **внутри одного МТК — одно место**, не дробить.
- **2026-05-12 (coord)**: Перестроена структура главной. Раньше: `/` — длинный список из 22 карточек по всем МТК. Теперь: `/` — 5 крупных карточек по одной на МТК. Каждая ведёт на свой hub `/mtkXX/`, который через iframe показывает варианты прототипов с переключением (стрелки, точки, ←/→, свайп). Общий shell — `assets/shared/hub/hub.css` + `assets/shared/hub/hub.js`. **Когда сессия добавляет / удаляет / переименовывает прототип**, координатор обновляет массив `window.HUB_VARIANTS` в соответствующем `mtkXX/index.html` — это автоматическое действие после `git log main`, сессия ничего не делает.
- **2026-05-12 (coord)**: Hub-bar теперь overlay (semi-transparent + blur), iframe = 100vh. Бар автоскрывается через 4с бездействия, возвращается на hover/touch верхнего 12px-края или нажатие клавиши. Snowed Safari «Прототип МТК NN» (убрал `title` у iframe).
- **2026-05-12 (coord)**: **Целевой формат — 2160×3840 (вертикаль)** для МТК 38, 39, 40, 41 (по ТЗ — дисплей 49" 3840×2160 с поворотом в вертикальную ориентацию). МТК 42 в ТЗ ориентация не указана — **по умолчанию принимаем вертикаль**, при необходимости уточнить у куратора. В хаб-баре добавлен переключатель **Гор / Верт** — в режиме «Верт» iframe пинится к пропорции 9:16, центрируется и масштабируется под viewport браузера. Это инструмент превью для разработки: каждая сессия открывает свой прототип через `/mtkXX/?o=v#mtkXX-вариант` и видит как будет на стенде. Состояние ориентации сохраняется в localStorage + URL `?o=h|v`. **Адаптация самих прототипов под вертикаль — задача каждой сессии-владельца** в её собственных файлах `mtkXX-*/`.
- **2026-05-12 (coord, по комментариям дизайнера)**: **Убраны диагональные брендполосы** (красная + латунная) из landing (`index.html`) и hub-bar (`assets/shared/hub/hub.css`). Фоны стали однотонные графитовые, без активных красных акцентов, без тяжёлого радиального затемнения. Закреплены **CSS-токены брендбука** во всех общих файлах (`--amber-black`, `--white`, `--brass`, `--red`, `--blue-grey`, `--window`, `--graphite`, `--telegrey`, `--paper`). Поправлен `--window`: было `#9DA3A6`, стало `#9DA3A8` (по брендбуку). Сессиям то же самое — см. выше «Шрифтово-цветовые правила». Это первый шаг по дизайнерским правкам, остальное расходится по сессиям отдельными заданиями.
- **2026-05-29 (bold-booth)**: Введено проектное правило — **все сторонние библиотеки только локально (vendored), без CDN в рантайме**. Запрещены рантайм-импорты с `esm.sh`, `cdn.jsdelivr.net`, `unpkg.com`, `cdnjs`, `skypack` и т.п. Причина: музейный киоск может стоять офлайн + надёжность. Класть бандл в `<prototype>/vendor/<lib>.min.js`, подключать классическим `<script>` до модуля или локальным импортом. Прецедент: МТК 39 `globe.js` тянул d3 с esm.sh → на проде глобус не рисовался (пустой canvas). Фикс — `mtk39-globe/vendor/d3.v7.min.js`. **Остаток на миграцию:** `mtk38-poster/poster.js` импортирует `@chenglou/pretext` с esm.sh — владельцу МТК 38 (`mtk38-worker`) надо вендорить. См. также раздел «Внешние зависимости» ниже.

## Внешние зависимости (политика)

**Все JS-библиотеки — локально, без сети в рантайме.** Музейный 49" киоск может работать офлайн; зависимость от внешнего CDN (esm.sh/jsdelivr/unpkg/…) означает «пустой экран, если нет интернета». Это уже ломало прод МТК 39 (глобус на d3 с esm.sh).

- Скачай минифицированный бандл (UMD проще всего — даёт `window.<lib>`), положи в `mtkXX-вариант/vendor/<lib>.min.js`.
- Подключай классическим `<script src="./vendor/...">` **до** своего `type="module"` скрипта (тогда `window.<lib>` уже готов), либо локальным ESM-импортом по относительному пути.
- `.js`-бандлы коммитятся в git (`.gitignore` блокирует только изображения).
- Если библиотека нужна нескольким МТК — координатор может положить общий бандл в `assets/shared/vendor/`, пиши сюда.

Статус миграции (на 2026-05-29):
- ✅ `mtk39-globe` — d3 вендорнут (`vendor/d3.v7.min.js`).
- ⬜ `mtk38-poster` — `@chenglou/pretext` ещё с esm.sh, ждёт владельца МТК 38.

## Как добавить новую договорённость

Допиши секцию в этот файл и сохрани. Остальные сессии увидят её при следующем чтении (после `git pull` / `git merge main`).
