Зачем на свете нужен ещё один трекер привычек? Их же и так - на любой вкус и цвет. Проблема в том, что ни один из них не нравился моей жене, поэтому пришлось в список идей для пет-проектов добавить и его.

Последние полгода я активно применяю LLM в своей работе. Автокомплитом от Github Copilot я пользуюсь с момента начала бесплатного бета-тестирования, а с выходом Opus 4.5 стало возможно отдавать железяке на реализацию целые блоки логики. Нужно только организовать виртуальную клетку, внутри которой он будет вынужден писать работающий код.

Disclaimer. Несмотря на то, что описываемый проект был написан используя Agentic Engineering, сама статья - исключительно плод человеческих формулировок. Я не создавал через LLM структуру, не отправлял ничего на правку стилистических ошибок, не просил написать абзац с выводами. Всё ниженаписанное - это результат работы живого меня.

Для тех, кто предпочитает сразу щупать, вот ссылки:

Те, кому больше нравится с прелюдией - читаем дальше.

Проект

Итак, требования к трекеру:

  • простой интерфейс создания/редактирования новых привычек

  • настройка расписания активности привычки (выбор дней недели/месяца)

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

  • каждой привычке можно добавить несколько напоминаний

  • добавление текстовой заметки для каждого дня

Страница трекинга привычек
Страница трекинга привычек

В процессе работы функционал расширился следующими необязательными элементами:

  • activity grid в стиле github за последние 140 дней

  • обзор недели

  • обзор года где каждая ячейка - одна неделя

  • обзор всей жизни где каждая ячейка - один год

  • ИИ дайджест по итогам дня

  • экспорт в CSV

Страница просмотра недели
Страница просмотра недели
Страница просмотра жизни
Страница просмотра жизни

Имплементация

Изначально решил делать бота в телеграме, поскольку так пользователям не придётся регистрироваться, плюс решается проблема синхронизации между устройствами. Работает это всё на Laravel 13.

Laravel хорош тем, что содержит решение множества архитектурных вопросов - ORM для базы, кэширование, queued jobs, консольные команды, удобные моки для тестов. Плюс это мой основной стек в последние 10 лет. Ну и конечно обилие разнообразных пакетов.

Один из моих любимых - это dedoc/scramble. Он служит для генерации документации api, при этом не требует ничего писать дополнительно, а просто проходит по коду и phpdoc, собирая очень симпатичную красоту - https://openhabitapp.com/docs/api. Её я использую как ещё один способ контроля результатов работы модели.

Поскольку вывод LLM недетерминирован по определению, для процесса работы нужно установить жёсткие рамки, в которых LLM будет существовать.

Тут в дело вступают тесты, статический анализ и автоматический рефакторинг. В экосистеме Laravel это Pest, phpstan и rector. Причём для каждого из них используется максимально строгий набор правил - 100% coverage для pest, level: max для phpstan. Для фронтенда тоже установлено требование в 100% coverage.

Далее все эти правила заворачиваются в composer скрипт, который AGENTS.md требует запускать после каждой итерации разработки.

// composer.json

"scripts": {
    "test": [
        "pest --type-coverage --min=100 --compact",
        "pint --parallel --format agent",
        "rector --output-format=json",
        "bun run lint",
        "XDEBUG_MODE=\"coverage\" pest --parallel --coverage --exactly=100.0",
        "phpstan",
        "bun run test:vue"
    ],
}

Приятным следствием такой организации стала экономия на Copilot. Биллинг там устроен так, что они считают только сами запросы - 4 цента за итерацию Sonnet 4.6. А в один проход агент, который постоянно проверяет себя скриптом, может наколдовать довольно большой кусок функционала. При подписке Pro+ на 35 долларов я вылезал за предоплаченный лимит всего несколько раз, максимально заплатив около 40 в один месяц. Печаль только в том, что с 1го июня 2026 Github упраздняет биллинг по запросам, и переходит на плату за токены.

Изначально приложение было написано с использованием Livewire, таким образом все тесты работали с кодом бэкенда. Но проблема Livewire в том, что с ним очень сложно добиться нестандартных анимаций, кроме того каждое действие на странице загружает все данные текущего компонента целиком, а это часто больше 100 Кб. И при включении network throttling задержка становится некомфортной.

Поэтому дойдя до финальных штрихов готового приложения, намучавшись с анимациями для optimistic update и оптимизацией размера отдаваемых данных, я переделал всё на Vue. Использовал голое апи, без Inertia - чтобы если однажды понадобится делать нативное мобильное приложение, то фундамент уже есть.

Agentic engineering

В целом процесс написания кода с LLM не особо отличается от обычного кодинга. Формулируем user story, разбиваем на подзадачи, пишем код и тесты. Убедившись что все тесты зелёные, запускаем линтер и статический анализатор. Снова добиваемся, чтобы все проверки прошли. Дальше свежим взглядом смотрим код и рефакторим так, чтобы это не только работало, а ещё и было приятно читать.

Для рефакторинга у меня отдельный промпт:

изучи код последнего коммита и весь код с ним связанный
также изучи тесты которые покрывают этот код
проведи рефакторинг и кода, и тестов

для кода:
цель - повышение читаемости и поддерживаемости кода
избавься от имеющихся неочевидных решений
при наличии сходных функций и решений унифицируй их структуру для упрощения поддержки 
убери дублирующиеся запросы в базу данных
упрости запросы которые выбирают слишком много неиспользуемых данных
убери n+1 запросы

для тестов:
цель - повышение скорости работы и читаемости тестов без снижения code coverage
разбивай большие файлы на несколько для ясности
объединяй тесты в рамках одного файла в один для уменьшения количества перезапусков приложения
упрощай большие тесты и проверяй только самое необходимое

для фронтенда:
упрости неочевидные и переусложнённые решения
используй прямолинейный подход который задействует возможности и фреймворки доступные в текущем проекте
поставь дополнительные пакеты если нужно

общее:
максимальной следуй современным best practices фреймворков которых используются в коде
следуй принципам DRY, KISS и YAGNI. между чистотой абстракций и читабельностью всегда выбирай читабельность
сделай так, чтобы этим кодом было легко пользоваться любому будущему разработчику

Дополнительное удобство Laravel в том, что в экосистеме существует пакет, который генерирует AGENTS.md, скиллы и открывает локальный MCP сервер - laravel/boost. Содержание инструкций для агента и скиллов зависит от того, какие пакеты установлены в приложении. Существуют например laravel-best-practices для работы с Laravel, pest-testing для написания тестов, tailwind-css-development для (очевидно) tailwind.

Отдельно хочу отметить несколько скиллов, которые сильно улучшили финальный результат. 

Изначально я сделал простой лендинг, итеративно добавив в него несколько секций. Claude выдал лучшее что мог используя tailwind скилл. Потом я установил в проект Impeccable, и он превратил имеющийся лендинг в невероятную красоту, которую сам бы я никогда не сформулировал.

Humanizer скилл очень помог в корректировке текстов и избавлении от ИИ-шности. Плюс я использую karpathy-guidelines. Его эффект сложно оценить объективно, но по ощущениям с ним даже младшие модели начинают меньше галлюцинировать и быстрее завершать таски.

В итоге LLM позволил реализовать вообще все хотелки которые пришли в голову, сохранив кодовую базу чистой и опрятной. В проекте есть целый список вещей (в основном по фронтенду), до которых без агента я бы даже не добрался:

  • мультиязычность на 8 языков с поддержкой rtl для арабского

  • выбор светлой и тёмной темы

  • accessibility разметка

  • кастомный интерфейс

  • анимации на всех страницах

  • красивый современный лендинг

  • тесты для фронтенда

Детали

Расписание каждой привычки реализовано через RRULE поле, в котором можно очень гибко настроить любой сценарий повторения. Например завёл отдельную категорию добродетелей Бенджамина Франклина - это 13 привычек, каждая из которых длится неделю. Двигаются они циклично, и после 13 недели снова начинается первая привычка. Итого на год (52 недели) - 4 полных цикла. У каждой такой привычки расписание выглядит следующим образом:

FREQ=YEARLY;BYWEEKNO=1,14,27,40;BYDAY=MO,TU,WE,TH,FR,SA,SU

Пользователь не может редактировать RRULE поле напрямую, вместо этого я оставил возможность выбора дней недели, дней месяца, и например «последняя суббота месяца».

Отдельно расскажу про агента, который формирует ежедневный дайджест. Написан он с использованием пакета laravel/ai. Системный промт состоит из того, что можно было бы ожидать от ментора по привычкам, выжимки из скилла humanizer, плюс памяти о пользователе (о ней в следующем абзаце). Дополнительно туда попадает стиль дайджеста, который тоже выбирает пользователь - "дружелюбный", "заботливый", "тренер" или "строгий".

В качестве пользовательского промта используется долгосрочная цель, которую формулирует сам пользователь, ну и ожидаемо - список запланированных/завершённых задач за день. Также у агента есть два инструмента (tool): UpdateUserMemory обновляет ячейку памяти о пользователе по одному из ключей - "краткосрочная", "долгосрочная", "сложности", "успехи", "цели", "личность" и "лог коучинга". TaskDone завершает работу агента и возвращает дайджест дня.

В проекте есть ротатор моделей. В случае если какая-то оказалась недоступной, она отключается на некоторое время и происходит попытка запроса следующей по приоритету. Плюс laravel/ai позволяет выбрать провайдера модели. Проект поставляется с уже настроенной Deepseek через OpenRouter, но доступны также OpenAI, Anthropic, Gemini, Azure, Bedrock, Groq, xAI, DeepSeek, Mistral и Ollama.

Outro

Раньше я вёл подобное расписание на большой маркерной доске, а теперь удобно отмечаю в приложении, и даже вижу историю того, где я был красавчик а когда не очень. Ну и ежедневные дайджесты иногда подсвечивают интересные моменты.

ИИ в разработке, по моему мнению, - это не серебряная пуля, которая сама решает все проблемы. Это всего лишь один инструмент, который разгрузил от рутины, написанной мною уже много раз, и оставил самое интересное - организацию, структуру и поиск идей того, что можно ещё реализовать. Я не использую кучу агентов, которые просто выдают результат. Мне ближе итеративный подход, где я слежу и контролирую каждую сессию.

Подписываться никуда не нужно. Достаточно того внимания, что вы уже мне уделили.
Спасибо.

P.S. И да, я расчехлил аккаунт, которым не пользовался 15 лет. Потому что чукча не писатель. Чукча любит кодить.

Комментарии (2)


  1. jaker
    29.05.2026 07:25

    Трекер привычек- первый раз такое услышал. Непонятно. А можно по простому- для чего это нужно?


    1. Zulu0
      29.05.2026 07:25

      Иногда возникает необходимость не держать в голове ежедневные рутинные действия. Например: когда необходимо пить таблетки 3 раза в день в течении месяца...