15.10.2026 Технический разбор RU

conf-kit: программу конференции собирает чат-бот, а ошибки ловит схема

Страница для жюри одной конференции за два дня выросла в сервис для мероприятий: программа как проверяемый документ, API для чат-ботов, конструктор на телефоне и на десктопе, публичная программа, документы A4, конкурс докладов и приём заявок. Как устроена проверка программы, что получилось у локальной модели и где проходит граница между ботом и человеком.

Никита Конкин

Проект Репозиторий
Языковые версии: RU EN

Проект начался 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 % валидных документов с первой или второй попытки; пока валидны два результата из четырёх.

Замер показывает, зачем нужна проверка: ошибка бота не попадает в программу молча, а возвращается ему с точным путём — для второй попытки.

Программа для участников

Программа «Осенней школы по радиофизике» на телефоне: кнопки «Подать заявку на доклад», «Поделиться» и «В календарь», блок «Сейчас» с докладом в 11:15 и «Далее» с докладом в 11:30 и обедом в 12:00, поиск и вкладки дней 18 и 19 ноября
Публичная программа: «сейчас» и «далее» по часам мероприятия.
Список докладов заседания в тёмной теме: прошедшие приглушены, текущий доклад в 11:15 выделен рамкой, у докладов — коды s1-1, s1-2, секция, отметка «онлайн» и время окончания
Тёмная тема: текущий доклад выделен, у него кнопка «В календарь».
Форма «Заявка на доклад»: текст организатора о тезисах, поля докладчика, авторов, названия доклада, выбор секции и формы участия
Заявка на доклад — без аккаунта.

Здесь и ниже на скриншотах — вымышленная «Осенняя школа по радиофизике» в вымышленном городе Энск; все имена, организации и адреса придуманы.

Участник видит, что идёт сейчас и что дальше, — по часам мероприятия, а не по часам телефона. Программу можно искать и фильтровать по секциям и форме участия, подписаться на неё в календаре (подписка обновляется сама) или добавить в календарь один доклад. Изменения приходят без перезагрузки страницы, а на случай пропадания связи в браузере остаётся копия программы.

Для публичной программы и жюри задан бюджет — не больше 80 КБ JavaScript в gzip; сейчас основной файл занимает 32,7 КБ. Поддерживаются браузеры с 2018 года: сборка нацелена на Chrome 61, Firefox 60 и Safari 12, а проверка выкладки запускает страницы в Chrome 62 и Firefox 60. Браузер, которому не хватает возможностей, показывает сообщение, а не пустую страницу.

Конструктор

Экран заседания №1 в конструкторе: время 10:45, аудитория 305, председатель и секретарь, кнопка «Порядок» и список из шести элементов с временем и докладчиками
Конструктор на телефоне: заседание и его элементы.
Нижний лист «s1-2 · элемент»: тип «Доклад», название, докладчик, авторы через запятую, организация и кнопки «Готово», «Перенести…», «Копия» и «Удалить»
Правка доклада в нижнем листе.

На телефоне программа собирается по уровням: дни, заседания, элементы. Правка идёт в нижних листах, порядок меняется кнопками, ошибки проверки видны на месте. Есть отмена, черновик переживает перезагрузку страницы, а история версий позволяет откатиться. Доклады можно загрузить из таблицы — .xlsx, .csv или .docx, — а новое мероприятие создать по образцу старого.

Конструктор на широком экране в три колонки: слева дерево дней 18 и 19 ноября с заседаниями и подсказка о горячих клавишах, в центре заседание №1 и его доклады, справа «Как будет напечатано» — программа в виде официального документа
Десктоп: дерево дней и заседаний, элементы и предпросмотр печатной программы, который обновляется вместе с правкой.

На экране от 900 пикселей конструктор раскладывается в три колонки: дерево дней и заседаний, список элементов и предпросмотр печатной программы. Листы правки открываются боковой панелью, элементы перетаскиваются мышью внутри заседания и в другое заседание, работают горячие клавиши — Ctrl+S, Ctrl+Z, Esc и Alt+↑/↓. Отдельная таблица собирает людей программы и находит разное написание одной фамилии.

Документы

Предпросмотр листа A4: 18 ноября 2026 года, среда, 09:30–10:35, крупно «ауд. 210», «Пленарное заседание» и таблица из трёх элементов с временем
Табличка «на дверь»: заседание на альбомном листе.
Предпросмотр сертификата: название школы, «Сертификат участника», имя докладчика, «выступил(а) с докладом» и название пленарного доклада, даты и строка для подписи председателя оргкомитета
Сертификат участника с названием доклада.

Из программы получаются документы A4 с предпросмотром прямо на телефоне: программа в виде официальной программы конференции, таблички «на дверь» для каждого заседания, протоколы секций, сертификаты участников, итоги конкурса и дипломы. Их можно напечатать, получить PDF на сервере — его делает Gotenberg — или выгрузить в Word.

Жюри и заявки

Экран эксперта: «Оценено 1 из 13», «всё отправлено», вкладки секций, первый доклад с оценкой 18 из 20 и отметкой «Сохранено», второй доклад раскрыт с авторами и первым критерием
Жюри: эксперт оценивает доклады по критериям.
Вкладка «Итоги»: рейтинг докладов по среднему суммарному баллу, первое место — 17 баллов от четырёх экспертов, второе — 16,67 от трёх
Итоги для администратора жюри.

Эксперт жюри входит по ссылке, указав фамилию и код комиссии вида k7m2-p9x4, — без аккаунта. Код рассчитан на то, чтобы его можно было продиктовать и набрать на телефоне. Оценки сохраняются на телефоне и уходят на сервер сами, в том числе после пропадания связи; доклад, который не состоялся, отмечается отдельно.

Администратор видит рейтинг, места внутри секций и статистику, выгружает CSV и удаляет ошибочные оценки — они уходят в архив, а не исчезают. В рейтинг входят только полностью заполненные оценки без отметок «не состоялся» и «воздерживается».

Таблица рейтинга: место, докладчик, доклад, секция, средний балл, число экспертов, минимум и максимум и средние по четырём критериям К1–К4; первое место — 17 баллов
Рейтинг жюри на десктопе: средний балл, число экспертов, разброс и средние по критериям.

Заявку на доклад участник подаёт без аккаунта. Форма называет оператора персональных данных и просит согласие на их обработку. От спама её защищают скрытое поле и минимальное время заполнения — три секунды: быстрее человек форму не заполнит. По ссылке участник видит статус своей заявки, причину отказа и может её отозвать.

Владелец принимает заявку в заседание, и она становится докладом в новой версии программы. Контакты участников в программу не попадают и стираются через год после мероприятия.

Выкладка и проверка

Сервис разворачивается через docker compose: Caddy с HTTPS, PocketBase, MCP-сервер и Gotenberg без выхода в сеть. В плане проекта сервер стоит в России: персональные данные участников должны храниться там по 152-ФЗ.

Тесты идут на четырёх уровнях: юнит-тесты, API против временного PocketBase, MCP-сервер и сквозные сценарии в Playwright. Сквозные сценарии проверяют вёрстку на экране шириной 320 пикселей: горизонтальной прокрутки нет, а кнопки и поля не ниже 44 пикселей. Отдельная проверка поднимает весь стек в Docker, получает PDF через Gotenberg и открывает страницы в старых браузерах.

Выводы

  1. Программа, описанная как документ со схемой, позволяет разделить работу: бот собирает, проверка находит ошибки с точным путём, человек принимает.
  2. Настоящие программы — лучший тест схемы: огрехи исходников становятся ожидаемыми предупреждениями.
  3. Замер на локальной модели показывает разрыв между учебной и реальной программой: короткая собирается с первой попытки, настоящая — пока нет.
  4. Бот не получает права опубликовать программу сам: черновик становится программой только после того, как человек примет приглашение.
  5. Персональные данные участников имеют срок: контакты не попадают в программу и стираются через год.

Доступность

Исходный код открыт. Описание API, схема и план развития лежат в репозитории; для проверки нужны Node.js, PocketBase и Playwright.

Теги

программирование javascript pocketbase llm мобильный-интерфейс конференции

Другие обновления по проекту