conf-kit: программу конференции собирает чат-бот, а ошибки ловит схема
Страница для жюри одной конференции за два дня выросла в сервис для мероприятий: программа как проверяемый документ, API для чат-ботов, конструктор на телефоне и на десктопе, публичная программа, документы A4, конкурс докладов и приём заявок. Как устроена проверка программы, что получилось у локальной модели и где проходит граница между ботом и человеком.
Проект начался 7 октября как страница для жюри конференции RWP-2026: эксперт выставлял оценки по шести критериям, а сохранял их бэкенд на Apps Script. На следующий день из него вырос conf-kit — сервис для конференций и мероприятий. Старый инструмент сохранён в legacy/jury-score/, и его прежняя ссылка продолжает работать.
Главный сценарий сервиса непривычен: программу собирает чат-бот. Он получает материалы мероприятия — список докладов, регламент, залы — и через API собирает программу целиком, а человек получает ссылку-приглашение на готовый черновик. Всё остальное — конструктор, публичная программа, документы, жюри и заявки — работает с тем, что получилось.
Программа как документ
Чтобы бот и человек могли работать с одной программой, она описана как документ: формат conf.program/v1 с JSON Schema. Мероприятие, залы, секции, дни, заседания и элементы — доклады, пленарные доклады, перерывы, обеды, церемонии.
Документ сначала нормализуется. Время «14.30» становится «14:30», авторы, переданные строкой, делятся по запятым, а незнакомые поля не теряются, а переносятся в extra с предупреждением. Время, которое не указано явно, считается по регламенту: 15 минут на доклад, 30 — на пленарный, 15 — на перерыв, 45 — на обед.
Затем программа проверяется: один зал не занят дважды, докладчик не стоит в двух местах одновременно, время не идёт назад. Каждая ошибка указывает точный путь — например, days[0].sessions[3].items[0], — чтобы её мог исправить и человек, и бот.
Схему проверяют на настоящих программах. Фикстура РРВ-2023 — пять дней, до пяти параллельных секций в разных залах, стендовые доклады и выездные события, всего 164 элемента. Её предупреждения — настоящие огрехи исходника: три докладчика, которых нет среди авторов, и ужин без указанного места. Для RWP-2026 есть вариант со временем секции, взятым как в исходном PDF; проверка находит в нём TIME_BACKWARDS и TIME_OVERLAP с точными путями.
Хранит программы PocketBase на SQLite. Каждая замена программы — новая версия, к любой можно вернуться.
Бот собирает, человек принимает
Бот работает по API-ключу. Запрос POST /api/v1/events создаёт черновик и возвращает ссылку-приглашение; она действует 14 дней. Человек открывает её, видит предпросмотр и принимает черновик в свой аккаунт. Непринятые черновики удаляются через 30 дней.
Для ботов есть три входа: llms.txt с инструкциями, openapi.json для GPT Actions и MCP-сервер для Claude, LM Studio и других клиентов — по stdio и по HTTP. Для бота без инструментов есть режим «Создать из ответа чат-бота»: JSON из ответа вставляется на страницу. Боты могут оставлять обратную связь, а список изменений API доступен им по отдельному адресу.
Отдельно работает локальный обработчик. На компьютере организатора он разбирает заявки и письма моделью в LM Studio; соединение с сервером только исходящее. Результат проверяется той же нормализацией и проверкой, а применяет его владелец — новой версией программы.
Насколько схема понятна модели, измеряет замер tests/bots/local_bench.mjs. В двух прогонах модели qwen3.5-9b в LM Studio короткая программа школы-семинара — два дня и 14 элементов — получалась валидной с первой попытки, примерно за 90 секунд. Настоящая программа RWP-2026 из 30 элементов не получилась ни разу: после двух попыток оставались наложения по времени, докладчики в двух местах и занятые залы, а в одной попытке модель не вернула JSON вовсе. В плане проекта порог — не меньше 80 % валидных документов с первой или второй попытки; пока валидны два результата из четырёх.
Замер показывает, зачем нужна проверка: ошибка бота не попадает в программу молча, а возвращается ему с точным путём — для второй попытки.
Программа для участников



Здесь и ниже на скриншотах — вымышленная «Осенняя школа по радиофизике» в вымышленном городе Энск; все имена, организации и адреса придуманы.
Участник видит, что идёт сейчас и что дальше, — по часам мероприятия, а не по часам телефона. Программу можно искать и фильтровать по секциям и форме участия, подписаться на неё в календаре (подписка обновляется сама) или добавить в календарь один доклад. Изменения приходят без перезагрузки страницы, а на случай пропадания связи в браузере остаётся копия программы.
Для публичной программы и жюри задан бюджет — не больше 80 КБ JavaScript в gzip; сейчас основной файл занимает 32,7 КБ. Поддерживаются браузеры с 2018 года: сборка нацелена на Chrome 61, Firefox 60 и Safari 12, а проверка выкладки запускает страницы в Chrome 62 и Firefox 60. Браузер, которому не хватает возможностей, показывает сообщение, а не пустую страницу.
Конструктор
На телефоне программа собирается по уровням: дни, заседания, элементы. Правка идёт в нижних листах, порядок меняется кнопками, ошибки проверки видны на месте. Есть отмена, черновик переживает перезагрузку страницы, а история версий позволяет откатиться. Доклады можно загрузить из таблицы — .xlsx, .csv или .docx, — а новое мероприятие создать по образцу старого.

На экране от 900 пикселей конструктор раскладывается в три колонки: дерево дней и заседаний, список элементов и предпросмотр печатной программы. Листы правки открываются боковой панелью, элементы перетаскиваются мышью внутри заседания и в другое заседание, работают горячие клавиши — Ctrl+S, Ctrl+Z, Esc и Alt+↑/↓. Отдельная таблица собирает людей программы и находит разное написание одной фамилии.
Документы
Из программы получаются документы A4 с предпросмотром прямо на телефоне: программа в виде официальной программы конференции, таблички «на дверь» для каждого заседания, протоколы секций, сертификаты участников, итоги конкурса и дипломы. Их можно напечатать, получить PDF на сервере — его делает Gotenberg — или выгрузить в Word.
Жюри и заявки
Эксперт жюри входит по ссылке, указав фамилию и код комиссии вида k7m2-p9x4, — без аккаунта. Код рассчитан на то, чтобы его можно было продиктовать и набрать на телефоне. Оценки сохраняются на телефоне и уходят на сервер сами, в том числе после пропадания связи; доклад, который не состоялся, отмечается отдельно.
Администратор видит рейтинг, места внутри секций и статистику, выгружает CSV и удаляет ошибочные оценки — они уходят в архив, а не исчезают. В рейтинг входят только полностью заполненные оценки без отметок «не состоялся» и «воздерживается».

Заявку на доклад участник подаёт без аккаунта. Форма называет оператора персональных данных и просит согласие на их обработку. От спама её защищают скрытое поле и минимальное время заполнения — три секунды: быстрее человек форму не заполнит. По ссылке участник видит статус своей заявки, причину отказа и может её отозвать.
Владелец принимает заявку в заседание, и она становится докладом в новой версии программы. Контакты участников в программу не попадают и стираются через год после мероприятия.
Выкладка и проверка
Сервис разворачивается через docker compose: Caddy с HTTPS, PocketBase, MCP-сервер и Gotenberg без выхода в сеть. В плане проекта сервер стоит в России: персональные данные участников должны храниться там по 152-ФЗ.
Тесты идут на четырёх уровнях: юнит-тесты, API против временного PocketBase, MCP-сервер и сквозные сценарии в Playwright. Сквозные сценарии проверяют вёрстку на экране шириной 320 пикселей: горизонтальной прокрутки нет, а кнопки и поля не ниже 44 пикселей. Отдельная проверка поднимает весь стек в Docker, получает PDF через Gotenberg и открывает страницы в старых браузерах.
Выводы
- Программа, описанная как документ со схемой, позволяет разделить работу: бот собирает, проверка находит ошибки с точным путём, человек принимает.
- Настоящие программы — лучший тест схемы: огрехи исходников становятся ожидаемыми предупреждениями.
- Замер на локальной модели показывает разрыв между учебной и реальной программой: короткая собирается с первой попытки, настоящая — пока нет.
- Бот не получает права опубликовать программу сам: черновик становится программой только после того, как человек примет приглашение.
- Персональные данные участников имеют срок: контакты не попадают в программу и стираются через год.
Доступность
Исходный код открыт. Описание API, схема и план развития лежат в репозитории; для проверки нужны Node.js, PocketBase и Playwright.
- Исходный код: github.com/nikita-konkin/jury-score





