Телефон с экраном «Сегодня» прислонён к двум посылкам, рядом лента белых этикеток, сзади контражур как у вывески магазина

Перед пилотом у заказчика

Система для магазина электроники в Японии. Заказы приходят в рабочую Telegram-группу от продавцов из Индонезии и Мьянмы: альбом фото и подпись в свободной форме. Бот, Mini App и веб-панель превращают это в строку для печати этикеток ゆうプリR, а всё сомнительное показывают человеку.

заказов без ошибок в полях на эталоне из 41 реального заказа
93%
за распознавание заказа основной моделью
$0,0033
на заказ у основной модели
5,2с
автотестов: ядро, распознавание, сервер, интерфейс
220

Обычный день магазина

25–30

заказов в день, в пик около 60. Сотрудник руками переносил индекс, адрес, имя, телефон, сумму и товар в ゆうプリR. Данные заказчика.

  • Два вида этикеток: оплачено и наложенный платёж
  • Пометку ntb нельзя пускать на этикетку
  • Переводы проверяли глазами по фото чека
Красная клейкая лента на гофрокартоне крупным планом
¥300 000Столько стоит телефон, который уезжает не туда, если ошибиться в одной цифре индекса. Или курьер берёт не ту сумму.

61%

адрес только на фото: оборот карты резидента, скриншот, вырезка карты

56%

нет японского телефона, а этикетка должна уйти и без него

45мин

примерно столько уходило на партию из 30 заказов руками. Цель системы меньше 3 минут, замерить её предстоит на пилоте

Чат остаётся рабочим местом

Продавцы не меняют привычку и не учат новый интерфейс. Бот читает то, что и так приходит в группу, а Mini App открывается кнопкой Orders прямо из Telegram.

Демо чата: альбом из трёх заглушек SAMPLE с подписью и жёлтая карточка заказа SR0148 с исправленным индексом
Продавец пишет как привыкАльбом склеивается после 2,5 секунды тишины. Бот отвечает карточкой в той же ветке: светофор, что проверить, кнопки Confirm и Not an order.
Демо чата: красная карточка без индекса, ответ сотрудника с индексом и та же карточка уже зелёная
Правка ответом на карточкуОтвет zip: 544-0034 меняет заказ. Карточка у заказа одна и редактируется, поэтому группа не упирается в лимит Telegram 20 сообщений в минуту.
Демо чата: сообщение об отправке с трек-номером, текст покупателю на двух языках и сводка дня
Трек и сводка дняПосле печати под заказом появляются трек и готовый текст покупателю на английском и индонезийском. Раз в день в группу приходит сводка.

Демо: разметка собрана в HTML в стиле Telegram, это не снимок мессенджера. Тексты карточек дословно из кода бота, фото и данные вымышленные.

Как заказ становится этикеткой

Попробуйте спорный заказ: печать ждёт решения человека. Данные вымышленные.

Сообщение в группе

  • Реакция на сообщении показывает статус: 👀 читаю, 👍 готов, 🤔 нужна проверка
  • Альбом склеен после 2,5 секунды тишины
  • Фото уменьшены до 1600 px, модели подсказаны строки базы индексов

Две модели, колонки файла A–G

    Итог

    Жду заказ

    代金引換¥48,000

    Модель извлекает.
    Код решает

    Модели ошибаются в форматах и правилах, код нет. Поэтому нейросеть заполняет поля, а всё проверяемое проверяется обычными функциями.

    2модели

    Нейросети читают

    • Подпись и фото: карту резидента, чек, скриншот адреса
    • Работают параллельно и независимо
    • Поля заполняют, решений не принимают

    96тестов ядра

    Код решает

    • Индекс сверяется с адресом по базе Japan Post
    • Строка оплаты, арифметика разбивки, дубли за 7 дней
    • Даты, слоты, телефон, тип этикетки H и I

    6из 41 к человеку

    Человек смотрит спорное

    • Модели разошлись или проверка не прошла
    • Подтверждает до печати, правит прямо в чате или в приложении
    • Каждое действие остаётся в журнале

    Модель выбрали сравнением на настоящих заказах

    Доля заказов, где верны все критичные поля. Лидеров разделяют 1–3 заказа, поэтому честнее смотреть на порядок величин, чем на десятые доли.

    МодельВсе поляАдрес с фотоЗа заказСекунд
    Gemini 3.8 FlashОсновная: лучшая по адресам с фото93%100%$0,00335,2
    Claude Haiku 5.5Теряет здание и комнату с фото90%92%$0,00081,9
    DeepSeek v4.1 FlashВторое мнение, мусор ловит проверка88%92%$0,00191,2
    Claude Sonnet 5.5В 3–13 раз дороже без выигрыша88%96%$0,01102,4
    GPT-6 LunaПридумывает здания с фото85%84%$0,00051,3

    Прогон моделей

    Эталон
    41 реальный заказ
    Адрес только на фото
    25 заказов
    Цена всего сравнения
    $0,72
    Пара моделей совпала
    35 из 41
    Ушло к человеку
    6
    Проверено на живых
    6 заказов
    Совпало с эталоном
    5
    Бот сам пометил жёлтым
    1

    Форма взята с вывески

    Единственный источник бренда: вектор настенной вывески магазина. Метр шириной, чёрный и красный, контражур 5500K на стену. Пути логотипа не перерисованы, их режет скрипт прямо из этого вектора.

    Логотип Silk Road Mobile Store из настоящего вектора с контражурной подсветкой на штукатурной стене
    Композиция: настоящий вектор логотипа на сгенерированной стене.
    8нет индексапроверить

    Красный значит «нужен человек»

    Логотипный #FF0100 бывает на знаке, на цифрах вывески и на блокирующих замечаниях. Запрещён как фон, свечение, градиент и кнопка. На этой странице то же правило.

    Подтвердить и дальше

    Скос из букв логотипа

    Один угол 45°, верхний правый. Только у главного: одна кнопка на экран, вывеска, активный пункт меню. Ниже 40 пикселей скос читается как зазубрина, поэтому там его нет.

    SR0148¥193,80073%

    Tektur для чисел, Onest для текста

    Квадратный шрифт логотипа держит номера заказов и суммы. Знак процента у Tektur читается плохо, поэтому цифра и единица набраны разными шрифтами.

    Один стиль иллюстраций

    Толстый штрих 3,5, плоские чёрный и красный, скос на углах. Такие споты стоят во всех пустых состояниях, рядом с ними тонких иконок нет.

    Ноутбук на чёрном столе в подсобке магазина рядом с посылками, на экране настоящая доска проверки Silk Road
    Композиция: настоящий скриншот доски на сгенерированной сцене, данные демо.

    Одно приложение в Telegram и в браузере

    14 экранов, светлая и тёмная тема, четыре ширины. Mini App и панель делят один код, поэтому фронтенд вышел вдвое меньше. На снимках работает настоящий интерфейс на выдуманных данных.

    Экран Проверка на компьютере: пять колонок заказов от проверки до отправленных, красные и жёлтые полоски у спорных
    Доска проверки. Сверху итог одной строкой, у спорных заказов полоска светофора и причина. После подтверждения светофор исчезает, строку красит только статус: иначе рядом спорят два цвета.
    Заказ SR0149: слева фото документа, справа данные, поле Индекс подсвечено красным, кнопка подтверждения недоступна
    Заказ со спорным полем. Документ стоит рядом с полем, чтобы сверять глазами. Красное замечание блокирует «Подтвердить и дальше», и причина написана рядом с кнопкой. Заглушки документов помечены SAMPLE.
    Телефон: лист правки индекса с фото документа, зумом и адресом для сверки
    То же на телефоне. Правка поля открывается листом с фото и зумом. Дефис в индексе ставится сам, «Сохранить» недоступна, пока цифр не семь.
    Экран Все заказы: таблица с поиском, периодом, фильтрами, статусами и суммами
    Все заказы. Поиск по имени, телефону, индексу и треку, фильтры, массовые действия с понятным итогом: что пропущено и почему. На телефоне тот же экран становится карточками с фильтрами в листе.
    Экран Сегодня в светлой теме
    Экран Сегодня в тёмной теме

    Две темы. Двигайте границу. Тёмная на ступень светлее чёрного: иначе вывеска «Нужна проверка» перестала бы читаться отдельным предметом. В Telegram тема берётся у клиента, контраст AA в обеих проверяет тест.

    Телефон это отдельный сценарий, а не компьютер в столбик

    Порядок экрана идёт от задачи сотрудника, главное действие внизу под большим пальцем. Сжатие кнопки за 90 мс, данные и код экрана грузятся уже на касании, движение только на transform и opacity.

    • Телефон: экран Сегодня с чёрной вывеской и красной цифрой 8 на проверке
      Сегодня
    • Телефон: список заказов на проверку с красными и жёлтыми полосками
      Очередь проверки
    • Телефон: заказ SR0148 с подсвеченным индексом и кнопкой Подтвердить и дальше
      Заказ, снизу главная кнопка
    • Телефон: список закупки с полями для серийника и кнопкой сканера
      Закупка и скан серийника
    • Телефон: статистика заказов в тёмной теме
      Статистика, тёмная тема

    Одна кнопка и файл для ゆうプリR

    Программа почты читает Excel напрямую, поэтому файл собирается по шаблону заказчика. Текстовые ячейки не дают Excel превратить слот 9-12 в дату и съесть ведущий ноль у телефона.

    Экран Выгрузка: шесть готовых заказов, кнопка Выгрузить и список партий
    Карточка результата: файл готов, шесть заказов, дальше напечатать этикетки и загрузить треки

    Двойной клик не создаст две партии: выгрузка атомарна. После выгрузки экран сам говорит, что дальше: напечатать и загрузить треки.

    Строка файла

    Демо-данные. Колонки J и K добавили по согласованию: номер заказа вернётся из программы почты вместе с треком.

    A代引金額B電話番号C郵便番号D住所E名前F商品名G配達時間帯H元払い/代引きI損害用障額Jお客様側管理番号Kお届け希望日
    193800080-0000-5547333-0866埼玉県川口市デモ町1-2-3Rizky PratamaiPhone 17 Pro ·783819-211пустоSR01482026/10/27
    • 0 перевод или оплачено
    • 1 наложенный платёж до ¥300 000
    • 2 от ¥300 001, плюс заявленная ценность ¥500 000
    • Больше ¥2 000 000 заказ блокируется: Japan Post откажет
    Полка с картонными посылками, заклеенными красной лентой, уходит в темноту

    После этикетки работа не заканчивается

    Заказчик просил главное: посылка отправлена 3–5 дней назад и всё ещё не доставлена. Система держит это сама, а заодно закупку и деньги.

    Экран Отправления: две зоны загрузки файлов, вкладки и таймлайн посылок по дням с линией сейчас
    Доставка. Файл истории из ゆうプリR привязывает треки к заказам по номеру. API отслеживания у Japan Post нет, поэтому статус проверяется на их странице раз в два часа. Возврат, хранение на почте и долгий путь приходят оповещением.
    Вкладка Проблемы: карточки посылок на почте и возврата со следующим шагом
    Проблема всегда со следующим шагом. Лежит на почте: повторная доставка и контакт покупателя. Возвращается: «Возврат получен» закрывает заказ, в списке он больше не висит.

    Сверка наложенного платежа

    ¥288,800собрал курьер

    −¥417комиссия перевода ゆうちょ

    −¥200гербовый сбор от ¥50 000

    ¥288,183ждём в выписке

    API у банка нет. Сотрудник кидает CSV выписки, поступления сопоставляются с доставленными заказами. Одинаковые суммы система не угадывает, их показывает человеку.

    Телефон: вкладка COD ждём, две доставленные посылки с суммой, которой ещё нет в выписке
    COD ждём. Янтарный: посылка доставлена, денег пока нет.
    Телефон: закупка, товары сгруппированы по моделям, у каждого заказа поле серийника и кнопка сканера
    Закупка. Заказы с пометкой ntb собраны по моделям. Серийник вводится руками или сканом штрихкода коробки, и заказ готов к выгрузке.
    Статистика в тёмной теме: заказы, выручка, доля без правок, разрезы по принявшим и моделям
    Статистика. По дням, принявшим и рынкам, доля распознанных без правок, какие поля правят чаще всего.

    Самое трудное

    Одна дата, четыре записи

    В 41 заказе нашлось и ДД/ММ, и ММ/ДД. Модель тут ненадёжна, поэтому даты разбирает код, а неоднозначное сразу уходит человеку.

    • 13/1013 октября13 больше 12, значит это день
    • 10/2323 октябряа здесь день стоит вторым
    • 22日22 октябряближайшее будущее 22-е
    • 火曜日ближайший вторниквплотную к слоту

    Что ещё приходит в подписи

    Форматы настоящие из эталона, значения заменены.

    • ¥ 48.800¥48,800точка вместо разделителя тысяч
    • 150 - 0001150-0001индекс с пробелами
    • +81 90 0000 1234090-0000-1234иначе ゆうプリR выкинет плюс
    • ( 19-2119-21слот в скобках
    • iPhone 17 ·7838 ntbiPhone 17 ·7838пометка не попадает на этикетку
    • 1500001 - 1-2-3150-0001индекс склеен с адресом
    • abcd2ABCD2хвост серийника строчными
    • skipпустотак пишут, когда телефона нет

    Перед пилотом два критика искали, где сломается

    Один смотрел интерфейс глазами владельца магазина и операторов, второй ломал бот, выгрузку и деньги. Каждая находка закрыта тестом или проверена снимком.

    296снимков экрана на 4 ширинах и 2 темах

    53находки: 23 в бэкенде и 30 в интерфейсе

    2блокера, оба исправлены до пилота

    • былоОтвет на карточку из нескольких строк портил заказ: вторая строка уходила в имя на этикетке.

      сталоОдна правка на строку. Ошибка в любой отменяет все.

    • былоПосле правки, сделавшей заказ готовым, оператор выпадал из очереди.

      сталоНа месте «Подтвердить» появляется «Следующий заказ».

    • былоCOD засчитывался не тому заказу при пересекающихся выписках.

      сталоСтроку, бывшую неоднозначной, система сама не засчитывает.

    • былоПри ошибке загрузки «Сегодня» показывало All clear.

      сталоТеперь ошибка и кнопка «Повторить».

    Документы покупателей

    • Фото документов зашифрованы AES-256-GCM, каждый просмотр пишется в журнал
    • Через 30 дней после доставки фото удаляются, срок настраивается
    • Номер 在留カード и My Number не извлекается и не хранится
    • В карточке в чате только город: полный адрес и фото есть в приложении

    Честно об ограничениях

    • Пилота ещё не было: денег и часов экономии здесь нет, их не мерили
    • Импорт файла на компьютере заказчика пока не проверен
    • Mini App внутри Telegram проверена только в браузере на моке
    • Форматы файла истории и выписки ещё не сверены на реальных файлах

    Что дальше

    • Пилот у заказчика параллельно с ручным процессом
    • Перепроверка моделей по правкам операторов

    TypeScript, grammY, Hono, pg-boss, PostgreSQL, Drizzle, React 19, Tailwind, Base UI, OpenRouter, Docker

    Следующий кейсUPNЛичный VPN на своих серверах: весь компьютер идёт через туннель, а при обрыве связь встаёт на паузу.