Все проекты

Тестовое задание8 Jul 2026

vulpecula - «Косвенно», консоль байесовского вывода для AI-first тестового задания дизайн-студии

vulpecula - «Косвенно», консоль байесовского вывода для AI-first тестового задания дизайн-студии
  • React 19
  • TypeScript
  • Vite
  • Tailwind CSS 4
  • Zustand
  • Bayesian inference
  • Vitest
  • Accessible

Тестовое задание студии, нанимающей AI-first разработчика: собрать интерактивное мини-приложение вокруг одного из двух вероятностных сценариев - ферма с невидимыми кроликами или диспетчер лис - с редактируемыми данными, живым пересчётом отчёта и журналом работы с ИИ внутри приложения. Я собрал оба сценария плюс третий (оценка оставшихся багов методом повторной поимки) на ОДНОМ общем движке, потому что интересное здесь не кроличья арифметика, а архитектура: ни один компонент не знает имени сценария - компоненты диспетчеризуются по форме данных (вид сцены, вид объяснения), сценарий это плоский дескриптор (схема, сид, параметры, функция отчёта), и новый сценарий не добавляет ни строчки в компоненты. Математика - байесовское ядро без зависимостей: дискретные апостериоры по сетке гипотез, пуассоновские правдоподобия со стабилизацией через log-sum-exp, доверительные интервалы, leave-one-out вклад каждой записи и разложение лог-шансов по признакам; правило интерфейса - каждое число на экране выведено моделью, никогда не вписано руками. Сам инструмент: редактируемая таблица записей (кастомные листбоксы, двухколоночный пикер времени, числовые ячейки с авто-клампом и сносками валидации), гистограмма апостериора с полосой HDI, сцена с пузырями, площадь которых - доля активности, номограмма для лис, контрфактические полосы вклада, панели [почему?] с арифметикой за каждым заголовочным числом, режим сравнения с закреплённым эталоном, пермалинки с полным состоянием в hash, журнал изменений, чьи строки называют правку («запись 1 · Сила сигнала: 4 → 10») и восстанавливают состояние по клику, экспорт JSON с превью и 40-секундный тур на отдельной странице, не трогающий рабочее состояние. Журнал работы с ИИ - требование задания - сделан всерьёз: чекпоинты, где предложения ИИ были отклонены или изменены, каждый с рассуждением и измеренным сравнением (например, пакетная сигнатура скоринга отклонена, потому что превращает leave-one-out из O(T·K) в O(T²·K) - проверено на отдельной ветке). Детерминизм зашит (в приложении нет Math.random и Date.now), троттлинг history.replaceState в Safari учтён через дискретные границы коммита, а ~1100 юнит-тестов пиннят всё - от обменяемости модели до русских текстов посимвольно. React 19 + TypeScript + Vite + Tailwind 4 + Zustand + Motion, деплой на Cloudflare Pages.