# Верхняя Ока — прогресс проекта (актуально на 25.08.2026, 20:55 UTC)

## Что это за проект
Краеведческая работа по верхней Оке: пять уездов (Лихвинский, Алексинский,
Одоевский, Белёвский, Козельский), XVI–XX вв. Источники — Генеральное
межевание 1770–90-х (алфавиты дач, Экономические примечания), писцовые
книги XVII в., военно-топографические карты 1850-х и Генштаба, Списки
населённых мест, приходские списки Кёппена. Цель — краеведческая книга
о верхней Оке и веб-карта пропавших селений.

## ⚠️ ИСПРАВЛЕНА ПОТЕРЯ ДАННЫХ (25.08.2026, 18:50)

В листе «Реестр» **два разных столбца** про строения:
- **F «Строения и заведения»** — сводка: мельницы, фабрики, пруды,
  господские дома, дороги, размер дачи. Заполнено **327 из 561** строк.
- **AU «ЭП Лихвина: строения и производство»** — заполнено 35 строк.

`export_registry_v1.py` читал только AU и **терял столбец F целиком**.
Из-за этого в карточках карты не было, например, мучной мельницы на
речке Вырке у пустоши Чашина (Л-0527, №99).

Исправлено: в `COLS` добавлен `"stroeniya_zav": "Строения и заведения"`,
в запись `dachi.json` — поле `ep.stroeniya_zav`. Реестр перевыгружен,
живые JSON на сервере обновлены. Записей с производством, которые
находит автопоиск: **42 вместо 11** (в т.ч. 5 пустошей со строениями).

**Мораль на будущее:** при любом изменении схемы реестра сверяйте
`COLS` в экспортёре с фактическими заголовками листа «Реестр» —
экспортёр падает только на ОТСУТСТВУЮЩИХ столбцах, а лишние/новые
столбцы он молча игнорирует.


## ЧТО СДЕЛАНО 25.08 ВЕЧЕРОМ — пять доработок атласа

Всё живёт в **https://pgm.24stroybot.ru/tools/atlas.html**.
Прежняя версия сохранена локально как `atlas_backup.html` (на сервер не заливалась).

### 1. Режим «Разметка листа» (вкладка «Разметка»)
Главная доработка: снимает барьер массового нанесения.
Выбираете уезд → очередь строится из записей реестра, отсортированных по
номеру генерального плана, уже нанесённые пропускаются. Нажимаете «Начать
разметку» — и просто кликаете по номерам дач на скане. Подпись, цвет и
иконка подставляются из реестра, очередь сама переходит к следующей записи.
Ни одного диалога на дачу.
- Пробел — пропустить, Esc — выйти, «отменить последнюю» — снять метку и
  вернуться на шаг назад.
- В режиме разметки метки не перехватывают клики (класс `.marking`), иначе
  нельзя поставить точку рядом с уже стоящей.
- Очередь можно собрать не по уезду, а из среза фильтра — кнопка
  «В очередь разметки».

### 2. Фильтры, срезы и раскраска (вкладка «Фильтр»)
Фильтр считает по ВСЕМ 3614 записям реестра, а не только по нанесённым.
- Уезд, вид (пустоши/деревни/сельца/сёла/погосты/луга/церковные земли/…)
- Признаки: только пропавшие (238), с событием (694), с производством (70),
  с церковью (362), с господским домом (151)
- Поиск по владельцу, по гидрониму, по названию/ID
- Раскраска: цвет из реестра · по уезду · по виду · по последнему следу в
  источниках (эпохи I–VI) · по разряду доказанности · по владельцу (топ-10)
- Легенда — плавающая панель в левом нижнем углу карты, отключается галочкой

### 3. Кластеризация
Плагин Leaflet.markercluster. Кнопка «Кластеры» в панели; включается
автоматически, если меток больше 400. Кластеры распадаются на зуме 16.

### 4. Экспорт GeoJSON и KML
Кнопки «GeoJSON» и «KML». Выгружаются только видимые метки (то есть срез
фильтра) плюс все линии и контуры. В свойствах: ID реестра, название,
№ по плану, вид, уезд, владельцы, гидронимы, строения, признаки
«пропавшее»/«с событием», заметка, и строка о происхождении координаты.
GeoJSON открывается в QGIS, KML — в Google Earth.

### 5. Постоянные ссылки
Вид карты, режим раскраски, фильтр и выбранный объект живут в адресе
страницы. Кнопка «Ссылка» кладёт адрес в буфер; в карточке метки — своя
кнопка «Ссылка на этот объект». Такую ссылку можно поставить в статью.

### Новый файл данных: /data/registry_facets.json (0.51 МБ)
Признаки для фильтров: владельцы, строения, гидронимы, маска эпох, разряд
доказанности, флаги «пропавшее»/«событие». Лежит ОТДЕЛЬНО от
`registry_index.json` намеренно — индекс перезаписывается вашим
`sync_registry.sh`, и признаки бы затирались.

**ВАЖНО: после каждого обновления реестра пересобирайте признаки**, иначе
фильтр будет работать по старым данным:
```bash
# положить registry_<код>.json в каталог reg/ и выполнить
python3 make_facets.py reg registry_facets.json
curl -u pgmdav:ПАРОЛЬ -T registry_facets.json \
  https://pgm.24stroybot.ru/_dav/data/registry_facets.json
```
Скрипт лежит на сервере: https://pgm.24stroybot.ru/tools/make_facets.py

### Честно об ограничениях этих доработок
- **Фамилии владельцев вытаскиваются разбором текста**, а не берутся из
  отдельной графы реестра: в `ep.vladelcy` порядок «Фамилия Имя Отчество»,
  в `primechanie` — родительный падеж «Прасковьи Михайловны Тургеневой».
  Разбор отбрасывает имена, отчества, чины и церковные/казённые владения,
  склонения сводит к основе (Тургеневой → Тургенев). Получилось 563 фамилии
  на 1738 записей. Разбор небезупречен: в топе есть «Иванов» и «Васильев»,
  где это может быть отчество, а не фамилия. Для книги фамилию надо
  проверять по самой графе, а не по фильтру.
- Числа по фамилиям НЕ совпали с теми, что я называл в старом чате
  (Камынины 26, Лавровы 22, Давыдовы 21). Сейчас выходит 14 / 15 / 37.
  Прежние числа считались иначе (похоже, поиском подстроки по всему тексту
  записи, включая соседей и примечания). Какой счёт верен — надо решать
  по самому реестру.
- Раскраска «по последнему следу в источниках» показывает последнюю
  заполненную эпоху, а пустая клетка эпохи в реестре означает
  «источник не сведён», а не «селения не было». Это НЕ дата исчезновения.
- Экспорт отдаёт координаты как есть; лист ПГМ по-прежнему не откалиброван
  (расхождение ~1.5 км по Мыжбору), поэтому в QGIS всё поедет ровно на ту же
  величину.


## РАЗБОР ПУСТОШИ — первая часть (25.08, вечер)

Задача: не «где была дача», а «где внутри дачи стояло жильё».
Открывается кнопкой «Разобрать место» в карточке метки и в очереди
разметки. Esc закрывает.

### Три синхронных окна
Одно место в трёх взглядах, вид и зум связаны:
1. Лист ПГМ (любой из загруженных листов на выбор)
2. Снимок по годам
3. Рельеф — горизонтали OpenTopoMap + отмывка Esri World Hillshade

В каждом окне источник переключается: спутник, снимок по годам, рельеф,
топокарта, OSM, любой лист атласа, пусто.

### Снимки по годам — Esri Wayback
Ключа не требует, CORS открыт. Над Мыжбором нашлось 10 различных
снимков с 2014 по 2026, из них 9 безлиственных (помечены ❄).
Отсев дублей: у Wayback 196 релизов, но большинство над конкретной
точкой держат один и тот же снимок. Служебная точка tilemap отдаёт
поле select, если данные взяты у другого релиза — такие отбрасываются.
196 запросов по ~150 байт, 14 потоков, около 5–9 секунд, результат
кэшируется по тайлу.

Это, по-моему, самое ценное во всём модуле: западины погребов,
фундаменты и межи видны только на кадрах без листвы и по снегу.

### Подсказки из текста Экономических примечаний
14 образцов разбирают `doslovno`, `primechanie`, `stroeniya_zav`,
`alfavit`, `otozhdestvlenie`: берег реки, по обе стороны, при воде,
устье/отвершек, овраг, суходол, при дороге, плотина/мельница,
пруд/сад, возвышенность, городище, церковь/кладбище, смежность.
Найденное подсвечивается прямо в цитате источника.

Охват: указания на местность есть у 1057 записей из 3614 (29%),
у пустошей — 404 из 1705 (23%). Частота: церковь 357, берег 290,
овраг 226, пруд/сад 195, суходол 95, при речке 63, плотина 51,
дорога 41, устье 30.

Плюс блок «что искать» — западины погребов, одичавшие яблони и сирень,
крапива, пруд и плотина, сходящиеся полевые дороги, куртина старых лип,
пятна темнее фона на пашне.

### Версии размещения
Клик по любому из трёх окон ставит точку-версию, она появляется сразу
во всех трёх. У каждой версии разряд доказанности 1–5 (те же разряды,
что в графе `pustosh.ocenka`) и текст обоснования. «Записать в реестр»
кладёт все версии в метку (поле `versions`), обоснования — в заметку,
а координатой метки становится версия с ЛУЧШИМ разрядом.

Смысл: результат — не мнение, а датированная версия с обоснованием,
на которую можно сослаться в книге и которую может оспорить другой
краевед.

### Чего этот модуль НЕ делает
- Рельеф из открытых источников — 30 м на пиксель. Ложбину и водораздел
  покажет, западину погреба — нет. Для этого нужен LiDAR, которого на
  Тульскую и Калужскую области в открытом доступе нет.
- Кнопки ИИ пока нет — намеренно. Препятствия: ключ утечёт со страницы
  (сайт публичный), CORS у Yandex Cloud из браузера скорее всего закрыт,
  нужен посредник на сервере — а там, судя по проверке, голая статика,
  запись только по WebDAV. И неясно, принимает ли YandexGPT изображения:
  источники расходятся. Ждём ответа, есть ли на сервере PHP или Python.
- Шуберт и Генштаб как отдельные источники не подключены: чужие тайловые
  серверы нестабильны и хотлинк невежлив. Подключатся сами собой, когда
  вы привяжете свои листы — они появятся в списке источников каждого окна.


## РЕЕСТР ОБНОВЛЁН ДО v54 (26.08.2026)

Источник: `Реестр_Лихвин_события_v54__2_.xlsx`, 87 листов (было 77).
Строк реестра **3894** (было 3614), прирост 280.

| уезд | было | стало |
|---|---|---|
| Алексинский | 1229 | 1229 |
| Белёвский | 554 | 554 |
| Белёв (писцовые) | 103 | 113 |
| Козельский | 290 | **528** |
| Лихвинский | 561 | **593** |
| Одоевский | 877 | 877 |

Козельский почти удвоился: 238 новых записей из печатного издания ЭП
Козельского уезда — 100 церковных земель, 36 пустошей, 27 сельц,
23 села, 22 деревни, 9 сенных покосов.

### ВАЖНО: восстановлен конвейер выгрузки
На сервере лежали `export_registry_v1.py` и `sync_registry.sh` — но это
СТАРЫЙ конвейер, он делает только `dachi.json` по одному Лихвину.
Файлы `registry_*.json`, на которых работает нынешний atlas.html, делал
более новый скрипт, которого на сервере не было — он остался в песочнице
прошлой сессии и пропал.

Написан заново и **положен на сервер**: `tools/export_registry_v2.py`.
Он импортирует `COLS`, `s()`, `num()` и `flags_and_color()` из v1, а не
копирует их, поэтому правила цвета и флагов гарантированно не разъедутся.
Если реестр поменяет заголовки столбцов — v1 остановится с внятной
ошибкой и остановит v2.

Порядок обновления теперь такой:
```bash
python3 export_registry_v2.py Реестр_..._vNN.xlsx out/
python3 make_facets.py out/ out/registry_facets.json   # признаки для фильтров
# залить из out/ все 12 файлов в /_dav/data/
```

### Сверка v53 → v54 (делалась до заливки)
- **потеряно записей: 0** — все прежние ID на месте, 65 нанесённых меток
  не осиротели
- добавлено 280
- 495 прежних записей стали полнее. Больше всего появилось: звание дачи
  по ЭП (+295), всего десятин (+295), экономическое примечание (+274),
  дословная запись (+201), дворов (+102), души муж./жен. (+102/101),
  строения по ЭП (+71)
- 244 записи «обеднели» — это НЕ потеря, а ваша чистка 24.08. Пропали
  «Стан / волость» у 417 и «Связь (ID)» у 430. Лист «Аудит — чужие
  сведения в графах» перечисляет их поимённо с пометкой «снято 24.08»:
  2626 строк снято, 35 оставлено с пометкой «проверить поштучно».
  У 70 записей стан не исчез, а переехал в графу «Стан по ПК Алексина
  (справочно)» — то есть встал на своё место
- у 7 записей БП графа «Уезд по источнику» содержит «—», и экспортёр
  по своему правилу считает это отсутствием сведения, а не текстом.
  На работу атласа не влияет: уезд берётся из кода ID

### Проверено на живом сервере после заливки
Индекс 3894, признаки 3894, манифест сходится, меток, потерявших свою
запись в реестре, — ноль. Пропавших селений по-прежнему 238. Очередь
разметки Козельского теперь 528. Запись Л-0010 подтянула расшифровку ЭП:
звание дачи, 11 дворов, экономическое примечание. Ошибок в консоли нет.

## Живой сервер
- Сайт: **https://pgm.24stroybot.ru/**
- Прототип карты: **https://pgm.24stroybot.ru/tools/map_prototype.html**
- Инструмент геопривязки: **https://pgm.24stroybot.ru/tools/georef.html**
- Данные (живые JSON, обновляются через sync_registry.sh):
  - https://pgm.24stroybot.ru/data/dachi.json (561 дача Лихвинского уезда)
  - https://pgm.24stroybot.ru/data/gidronimy.json (56 гидронимов)
  - https://pgm.24stroybot.ru/data/meta.json

### Доступ WebDAV
```
Эндпойнт: https://pgm.24stroybot.ru/_dav/
Логин:    pgmdav
Пароль:   E1IZbTB6Q32ebeloY6D4GVBU
Методы:   GET, PUT, DELETE, MKCOL, COPY, MOVE
Лимит:    500 МБ на файл
```
Пример заливки файла:
```bash
DAV="pgmdav:E1IZbTB6Q32ebeloY6D4GVBU"
curl -u "$DAV" -T ./local/file.html "https://pgm.24stroybot.ru/_dav/tools/file.html"
```
Порт 22 (SSH/SFTP) из песочницы Claude недоступен — работать **только через
WebDAV**. Автораспаковка архивов: PUT `_incoming/pack.zip` → сервер сам
распакует в течение 30 сек (лог: `_incoming/_unpack.log`).

Обновление реестра (xlsx → JSON → сайт одной командой):
```bash
cd /путь/к/tools
DAV_USER=pgmdav DAV_PASS='E1IZbTB6Q32ebeloY6D4GVBU' \
  ./sync_registry.sh /путь/к/Реестр_Лихвин_события_vNN.xlsx
```

## Что сделано в последней сессии (map_prototype.html)

Файл: `/home/claude/site/site/tools/map_prototype.html` (~1.08 МБ,
содержит вшитый JPEG-скан ПГМ фрагмента 1700×1218 px в base64 —
кадр «1787652090141_image.png», Лихвинский уезд, район сёл Жеремино /
Кипеть / Соболево / Переславичи / Мышборъ / Курьяново).

### Функциональность прототипа
1. **Цветные метки** — зелёные (отобрано/спорно/доказано/с событием) и
   фиолетовые (прочие), цвет берётся из `flags` дачи в реестре по
   умолчанию, но переопределяется вручную (см. п.6).
2. **Перетаскивание меток** мышью (mousedown/mousemove/mouseup,
   порог 3px отличает клик от драга).
3. **Режим добавления дачи** — поле с автодополнением по всем 561 дачам
   Лихвинского уезда (`datalist`), клик по карте ставит метку. Есть
   выбор цвета при добавлении («по реестру» / зелёный / фиолетовый) и
   чекбокс «ручная метка (без реестра)» — ставит метку с произвольной
   подписью, не привязанную ни к одной дачи (`id: null`).
4. **Режим рисования рек/оврагов** — поле с автодополнением по 56
   гидронимам, клик добавляет точки полилинии, двойной клик завершает.
5. **Экспорт JSON** — кнопка скачивает `{points, rivers}` локально.
6. **Редактирование карточки метки** — при клике на метку в карточке
   появляются: кнопки смены цвета (зелёный/фиолетовый), поле «Привязка
   к реестру» (с автодополнением) — можно привязать ручную метку к
   дачи или перепривязать существующую к другой записи реестра, кнопка
   «Отвязать» (превращает метку обратно в ручную) и кнопка «Удалить
   метку».
7. **Сохранение на сервер** — кнопка «Сохранить на сервер» в тулбаре.
   При клике спрашивает пароль WebDAV (логин `pgmdav` захардкожен,
   пароль вводится в `prompt()` и держится в JS-переменной только на
   время сессии вкладки — **не хранится в коде страницы**). Данные
   пишутся по адресу `https://pgm.24stroybot.ru/_dav/data/map_prototype_state.json`
   через `fetch(..., {method:'PUT', headers:{Authorization: Basic ...}})`.
   При каждой загрузке страница сама подгружает этот файл
   (`GET /data/map_prototype_state.json`) и, если он есть, заменяет
   встроенные POINTS/RIVERS на сохранённое состояние — так правки
   переживают перезагрузку страницы и видны всем посетителям.

   **⚠️ Известный риск безопасности:** логин `pgmdav` имеет полный
   доступ на запись/удаление ко ВСЕМУ сайту (не только к файлу
   состояния карты). Пароль вводится человеком в браузере и никогда не
   попадает в html-код страницы (можно спокойно смотреть view-source),
   но при желании стоит завести отдельный WebDAV-аккаунt с правами
   только на `data/map_prototype_state.json`, если панель станет
   общедоступной посторонним людям. Сейчас это не критично, т.к.
   доступ к сохранению есть только у тех, кому вы дадите пароль устно.
8. **Правая кнопка мыши (контекстное меню)**:
   - ПКМ по пустому месту карты → «➕ Добавить дачу здесь…» (запрашивает
     ID/номер/название через `prompt()`, ищет в реестре) или
     «➕ Добавить ручную метку здесь…» (запрашивает произвольную подпись).
     Новая метка сразу ставится в точке клика и открывается её карточка.
   - ПКМ по существующей метке → «✏️ Редактировать» (открывает карточку),
     быстрое переключение цвета одним кликом, «🗑 Удалить метку».
   - Меню закрывается по клику вне него, по Esc или при скролле.
9. **Палитра из 11 цветов** вместо двух: зелёный (отобрано), фиолетовый
   (прочее), красный (исчезло), оранжевый (спорное), синий (при воде),
   бирюзовый (возродилось), коричневый (пустошь/земля), розовый
   (событие), жёлтый (доказано документом), серый (без сведений),
   чёрный (прочая отметка). В карточке — кружки-образцы, при
   наведении подсказка со смыслом цвета.
10. **SVG-иконки по типу поселения** (вместо одинаковых капель):
   - `pustosh` — пустошь (кружок)
   - `ruins` — пустошь, что была селением (развалины двух стен)
   - `house` — деревня (двор/домик)
   - `houses` — крупная деревня / сельцо (два домика)
   - `manor` — сельцо с господским домом (усадьба с окнами)
   - `church` — село (церковь с куполом и крестом)
   - `bigchurch` — большое село (церковь + дворы по бокам)
   - `pogost` — погост (церковь + надгробия)
   - `monastery` — монастырь
   - `meadow` — луг / сенные покосы (трава)
   - `water` — при воде / мельница (капля)
   - `marker` — простая отметка

   **Автоопределение** (`autoIcon(rec)`) по полям реестра: `Вид
   населённого пункта` + наличие слов «церк/собор/храм» и
   «господск/усадьб» в ЭП + число дворов + факт попадания в отбор
   пропавших селений. Порог «большого села» — 40+ дворов или наличие
   господского дома при церкви; «крупной деревни» — 30+ дворов.
   На текущих 57 метках даёт: 31 пустошь, 12 развалин, 5 дворов,
   4 церкви, 4 пары домов, 1 большое село (Жеремино — 49 дворов,
   церковь Рождества Богородицы, 7 господских домов).

   Иконку можно **переопределить вручную** в карточке метки (галерея
   всех вариантов с подписями) или выбрать при создании — в панели
   добавления появился селектор «Иконка» («по виду из реестра» или
   конкретная). При перепривязке метки к другой дачи иконка
   пересчитывается автоматически.

6. **57 маркеров дач** — распознаны вручную по скану, координаты сверены
   с реестром по номеру генплана (`№ по ген. плану`). Метод: наложение
   координатной сетки (шаг 50px) на скан через PIL, разбивка на 6
   перекрывающихся тайлов с зумом 1.6–2×, чтение номеров и сверка с
   `by_n` (словарь `n → dacha`) из `dachi.json`.
7. **8 рек/ручьёв** нарисованы как полилинии (черновые, координаты
   прикидочные по тем же тайлам):
   - Ока (2 сегмента — граница уезда сверху-слева и русло через сам
     г. Лихвин/слободы)
   - Городенка (приток у дачи №65)
   - Сосенка (левая часть фрагмента, у сельца Жалобы)
   - Малошка (от №26 через Курьяново)
   - Богошъ (между №26 и №27) — **чтение неуверенное**, cursive плохо
     разбирается даже при 6–7× зуме
   - Балашовъ (у Кипети/№111) — **чтение неуверенное**
   - Бахмута (низ фрагмента)

### ВАЖНО — известные ограничения (сказать пользователю, если спросит)
- Координаты меток и рек — **на глаз по картинке, не географическая
  привязка** (нет широты/долготы). Явно написано в примечании внутри
  самого прототипа.
- Точность координат меток ±15–30 px (уровня «на глаз с сеткой»), для
  60+ меток не было инструмента точного пиксель-пикинга — местами метки
  у самого края скана (№53, №98) были прижаты к границе 0–1 (clip).
- Плотный кластер мелких наделов **восточнее Жеремина** (номера в районе
  165–210) распознан лишь частично — цифры очень мелкие/смазанные,
  часть (168 vs 108, 176 vs 194, 184 vs 198 и т.п.) сознательно НЕ
  внесена, чтобы не давать неверные данные. Нужен доступ к скану большего
  разрешения или полевая/архивная сверка.
- Названия рек «Богошъ» и «Балашовъ» — рабочие транскрипции, не
  сверены с гидронимами из реестра (в списке `gidronimy.json` их нет,
  возможно это местные названия по владельцам, не попавшие в тот список).

## Что дальше (предложенный план, ничего не подтверждено пользователем)
1. Точная геопривязка того же скана в QGIS по 3–4 контрольным точкам
   (устья ручьёв, углы дач, видимые и на плане, и на спутнике) —
   раньше уже обсуждали, план такой: после привязки те же ID дач можно
   вывести на боевую веб-карту (Leaflet/MapLibre) поверх спутника,
   Шуберта и других версий ПГМ разом.
2. Доразобрать плотный кластер 165–210 у Жеремина (нужен скан выше
   разрешением или контрольная сверка по алфавиту дач/ЭП).
3. Решить правило «зелёного» цвета — сейчас зелёный = флаги
   otbor/veroyatno/dokazano/spornoe/sobytie/razryv_*, `veroyatno`
   даёт 136 строк зелёных — нужно решение владельца, устраивает ли это.
4. Привязать трёхвёрстку 1851 г. (скан ещё не загружен).
5. Провести гидронимы через геометрию (пока только черновые полилинии
   на этом одном фрагменте).

## Прочие живые файлы на сервере
```
/html/
  index.html
  tools/
    georef.html            — инструмент привязки сканов (авто-пересчёт,
                              зум колесом, слои OSM+спутник, драг меток)
    map_prototype.html     — прототип карты (этот файл, см. выше)
    sync_registry.sh        — реестр (xlsx) → JSON → сайт одной командой
    export_registry_v1.py   — экспортёр реестра в JSON
  data/
    dachi.json               ← ЖИВОЙ (561 дача, v53: 3614 строк/77 листов)
    gidronimy.json           ← ЖИВОЙ (61 гидроним)
    meta.json                ← ЖИВОЙ
```

## Технические детали привязки (georef.html)
- Авто-пересчёт affine-трансформации при ≥3 парах точек
- inverseTransform: det=a·e−b·d; x=(e·(lng−c)−b·(lat−f))/det;
  y=(a·(lat−f)−d·(lng−c))/det
- Слои: OSM + Esri World Imagery
- Известная проблема калибровки privyazka_1_.json (6 точек, невязки
  36–129 м) — неоднородный масштаб листа ПГМ, разброс 7.12–8.12 м/px
  (14%), все 6 точек в правых 23% листа — нужны точки в левой трети.

---
*Файл создан автоматически в конце сессии для передачи контекста в
следующий чат. Если начинаете новый чат — просто скажите Claude
прочитать этот файл (https://pgm.24stroybot.ru/data/PROGRESS.md) или
приложите его.*
