Контекст

Неделя с шестого по четырнадцатое. Пропустил вторник — пишу сейчас. Было несколько параллельных веток: яхтенный бот, маркетплейс, persona factory, и один инцидент с железом который всё остальное поставил на паузу.

Чай на ноутбуке

Физический мир напомнил о себе

Пролил чай на ноутбук. Не воду — чай. Не чуть-чуть. Несколько секунд смотрел на экран и ждал чего-то плохого. Ноут не умер сразу — что, как выяснилось, не обязательно хороший знак: иногда короткое замыкание проявляется позже.

Первая реакция — подключить внешний диск и сделать бекап. Запустил rsync всей системы на KINGSTON. Процесс шёл больше часа, с предупреждениями про xattr на FAT-разделе — не страшно, данные скопировались. Пока шло, сидел и думал про то, сколько всего держится на одном куске железа, который можно залить чаем.

Ноут в итоге жив. Но ощущение осталось: бекапов не было вообще. Это не дыра в системе — это отсутствие системы как таковой. Надо чинить.

Дыра

Автоматического бекапа не существовало. Один физический инцидент — и всё могло исчезнуть. Сейчас сделали вручную. Автоматизация — в следующий раз.

Persona Factory: боты говорят с ботами

Telegram открыл новый класс продуктов

Telegram выкатил обновление: боты теперь могут общаться друг с другом в групповых чатах. Это не мелочь — раньше бот видел только сообщения людей. Теперь видит других ботов.

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

Прокси давал проблемы — несколько раз запросы к Telegram API падали на одной из нод. Поменяли конфигурацию, заработало. Архитектура пока сырая — один файл responder.py, логи в хвост, без очереди. Но концепция работает: три персонажа живут в группе и разговаривают.

Наблюдение

Когда платформа даёт новую возможность — первые прототипы делаются быстро именно потому что не знаешь ограничений. Знание приходит потом. Лучше сначала запустить.

tg-training: от логбука до расписания

Бот растёт в нескольких направлениях одновременно

На прошлой неделе задеплоили трекер. На этой он сильно разросся.

Первое: пришёл фидбек от Максима Г. по команде /logbook — вопросы про единицы измерения ветра, про то как вводить данные за тренировку одной цифрой если условия менялись. Переработали: оставили и м/с, и узлы, и кт — пусть ученик сам выбирает формат. Убрали лишнее из онбординга, который случайно задели при правке.

Второе: написали Privacy Policy. Физлицо, сервер в Германии — минимально необходимый текст чтобы формально соответствовать. Первый деплой выдал Internal Server Error на странице /privacy — нашли и починили.

Третье: попытались парсить booking.silavetra.com — систему записи на тренировки в яхт-клубе. Идея: знать своё реальное расписание изнутри бота, не заходя на сайт. Написали silavetra_sync.py, запустили через Playwright. Работает. Следующий шаг — показывать доступные слоты ученикам прямо в боте.

Сложность

Инструкторского кабинета на silavetra нет. Пришлось парсить публичную страницу booking и фильтровать по имени. Хрупко, но работает пока структура не поменяется.

Тренировки на воде: персонализированные планы

Три человека, три разных уровня

Провёл тренировку с тремя учениками. Светлана — ходит давно, знает много, из-за этого иногда сомневается там где не надо. Юля — переключается между ролями, пока не нашла свою. Лиза — переоценивает уровень относительно реального опыта.

Раньше план был один на группу — общий. Теперь делаем персональный для каждого. Формат пока не устоялся: попробовали несколько вариантов, часть выглядела как для зала, не для воды. Юля прислала скриншот старого плана — показала что предпочитает тот формат. Договорились не удалять историю, показывать последний план.

Ветер 6 узлов, дождь, 9 градусов. Не лучшие условия, но вышли. Тренировка вокруг руля на слабом ветре — медленная лодка даёт больше времени на ошибку. Сработало.

Skill tree для яхтсменов

База знаний становится интерактивной

Параллельно с тренировочным ботом начал строить базу знаний по парусному спорту. Obsidian-vault, структурированные файлы по уровням — терминология, управление, тактика. Пока просто заполнение: приношу тезисы, Claude структурирует и добавляет вопросы чтобы двигаться дальше.

Потом появилась идея: сделать из этой базы RPG-подобное дерево навыков. Каждый ученик сам отмечает что уже освоил. Не тест от инструктора — самооценка. Это меняет динамику: ученик видит карту своих знаний, я вижу белые пятна, план тренировки строится из конкретных дыр, а не из общего "вы новичок".

Пока концепция. Следующий шаг — интерактивный веб поверх существующих markdown-файлов.

Идея

Самооценка точнее теста в начале пути. Человек знает что он делал — не знает только названий. Дерево навыков даёт язык для разговора о прогрессе.

Вывод с задержкой

Железо влияет на деньги

Вывод по G2G задержался — из-за ситуации с ноутом. Пайплайн не запускался несколько дней. Когда запустили — пришло 1337 (ожидали чуть больше). Пересчитали доли, провели выплаты.

Интересный момент: именно эта ситуация — когда задержка произошла из-за физического железа — поставила вопрос про автоматизацию подсчёта. Сейчас всё держится на том, что я запускаю пайплайн вручную примерно раз в неделю. Если не запускаю — данные устаревают, вывод задерживается.

Направление понятно: автоподсчёт или автозапуск пайплайна. Когда буду делать — не знаю. В следующий вывод, скорее всего.

Цифры недели


Физический инцидент всегда напоминает о чём-то важном. В этот раз — о том, что автоматизация резервного копирования стоит дешевле одного стакана чая.