[{"data":1,"prerenderedAt":3969},["ShallowReactive",2],{"blog-posts":3,"blog-runtime-posts":3934,"blog-2025-06-01-potihonechku-daleko-cover":3957},[4,304,657,1736,2646,2734,2859,2960,3312,3335,3379,3468,3500,3614,3702,3723,3744,3777,3803,3821,3847,3899],{"id":5,"title":6,"acrostic":7,"body":8,"date":288,"description":289,"duration":7,"emoji":7,"extension":290,"faq":7,"featured":291,"format":7,"image":7,"level":7,"media":7,"meta":292,"navigation":293,"path":294,"price":7,"schedule":7,"seo":295,"seoTitle":296,"serviceType":7,"status":7,"stem":297,"tags":298,"tech":7,"toc":293,"url":7,"__hash__":303},"blog\u002Fblog\u002F2026-08-13-bystryy-deploy-statey.md","Как я ускорил деплой контента в Nuxt: с 12 минут до 21 секунды",null,{"type":9,"value":10,"toc":274},"minimark",[11,15,18,23,26,29,33,36,80,88,99,104,115,119,122,148,151,155,161,165,172,175,178,182,185,188,191,195,198,253,256,259,262,265],[12,13,14],"p",{},"Исправить слово или запятую в статье можно за несколько секунд. Но на моём сайте после такой правки запускался полный выпуск: установка зависимостей, сборка Nuxt и админки, генерация страниц, перезапуск приложения и итоговые проверки.",[12,16,17],{},"Последний успешный полный workflow перед запуском новой схемы шёл 12 минут 53 секунды. Для изменений в коде это нормально. Для исправленной запятой — слишком долго.",[19,20,22],"h2",{"id":21},"я-разделил-два-разных-выпуска","Я разделил два разных выпуска",[12,24,25],{},"Полный деплой остался для кода, конфигурации и смешанных изменений. Для статей я сделал отдельный путь, который принимает только Markdown блога и не пересобирает всё приложение.",[12,27,28],{},"Это не сокращённая версия обычного деплоя. Быстрый путь работает с отдельной проекцией контента, проверяет точный Git-коммит и переключает новую версию целиком. Если что-то идёт не так, сайт возвращается к предыдущему состоянию.",[19,30,32],{"id":31},"как-устроен-быстрый-путь","Как устроен быстрый путь",[12,34,35],{},"Я добавил три компонента:",[37,38,39,52],"table",{},[40,41,42],"thead",{},[43,44,45,49],"tr",{},[46,47,48],"th",{},"Компонент",[46,50,51],{},"Что делает",[53,54,55,64,72],"tbody",{},[43,56,57,61],{},[58,59,60],"td",{},"Fast renderer",[58,62,63],{},"Готовит разрешённые страницы из выбранного Git-снимка",[43,65,66,69],{},[58,67,68],{},"Gateway",[58,70,71],{},"Направляет обычные запросы в основное приложение, а разрешённые маршруты — в renderer",[43,73,74,77],{},[58,75,76],{},"Активный указатель",[58,78,79],{},"Связывает публичные маршруты с точным Git-коммитом",[12,81,82,83,87],{},"Главная страница, список блога, сама статья и sitemap должны видеть один и тот же набор материалов. Простого копирования ",[84,85,86],"code",{},".md"," на сервер для этого недостаточно: основное приложение продолжит работать с данными и HTML из прежней сборки.",[12,89,90,91,94,95,98],{},"Поэтому renderer читает полный снимок блога из Git и создаёт новую проекцию. Gateway использует её только для маршрутов из строгого списка. Административные страницы, API, неизвестные URL и методы кроме ",[84,92,93],{},"GET"," и ",[84,96,97],{},"HEAD"," остаются на основном приложении.",[100,101,103],"h3",{"id":102},"промпт-спроектировать-быстрый-путь-для-контента","Промпт: спроектировать быстрый путь для контента",[105,106,112],"pre",{"className":107,"code":109,"language":110,"meta":111},[108],"language-text","Я хочу отделить публикацию Markdown-статей от полного деплоя Nuxt-сайта.\n\nСначала изучи текущий проект и установи:\n- откуда build и runtime получают статьи;\n- какие страницы, списки, API и sitemap зависят от блога;\n- какие prerender-артефакты и кеши создаёт Nuxt;\n- как сейчас устроены deploy, rollback и production-проверки.\n\nПосле этого предложи минимальную архитектуру быстрого выпуска.\nОна должна:\n1. Принимать только полный 40-символьный Git SHA.\n2. Разрешать только датированные Markdown-файлы блога.\n3. Отклонять пустые, смешанные и неизвестные изменения.\n4. Переключать полный неизменяемый снимок контента атомарно.\n5. Сохранять согласованность статьи, списка блога, API и sitemap.\n6. Возвращать предыдущий SHA и активный снимок при ошибке.\n\nОграничения:\n- Не меняй код и production-инфраструктуру на этапе анализа.\n- Не считай, что удаление prerender-файла автоматически включает SSR.\n- Не ослабляй доступ к административным маршрутам и внутренним API.\n- Не выдавай предполагаемую скорость за измеренный результат.\n\nФормат ответа:\n1. Текущий путь публикации.\n2. Границы быстрого выпуска.\n3. Предлагаемая архитектура.\n4. Сценарии отказа и rollback.\n5. План тестов и production-приёмки.\n6. Открытые вопросы перед реализацией.\n","text","prompt",[84,113,109],{"__ignoreMap":114},"",[19,116,118],{"id":117},"как-теперь-публикуется-статья","Как теперь публикуется статья",[12,120,121],{},"Быстрый выпуск получает полный 40-символьный SHA и выполняет несколько шагов:",[123,124,125,133,136,139,142,145],"ol",{},[126,127,128,129,132],"li",{},"Проверяет, что коммит совпадает с вершиной ",[84,130,131],{},"origin\u002Fmain",".",[126,134,135],{},"Подтверждает, что во всём наборе изменений есть только разрешённые Markdown-файлы.",[126,137,138],{},"Формирует полную проекцию блога для выбранного SHA.",[126,140,141],{},"Записывает её в неизменяемый файл.",[126,143,144],{},"Атомарно переключает активный указатель.",[126,146,147],{},"Открывает главную, блог, sitemap и изменённые статьи через HTTP.",[12,149,150],{},"Перед началом скрипт сохраняет исходный SHA и прежний активный указатель. Если синхронизация или HTTP-проверка завершается ошибкой, он возвращает оба значения назад. Читатель видит либо предыдущую целую версию сайта, либо новую.",[100,152,154],{"id":153},"промпт-проверить-выпуск-перед-подтверждением-успеха","Промпт: проверить выпуск перед подтверждением успеха",[105,156,159],{"className":157,"code":158,"language":110,"meta":111},[108],"Проверь завершившийся content-only выпуск независимо от отчёта deploy-скрипта.\n\nВходные данные:\n- ожидаемый полный Git SHA: [SHA];\n- список изменённых статей: [ФАЙЛЫ И URL];\n- production host и публичный домен: [ЗНАЧЕНИЯ];\n- имена основного приложения, renderer и gateway: [ИМЕНА].\n\nПроверки:\n1. Сверь ожидаемый SHA с `origin\u002Fmain`, production HEAD\n   и активным указателем контента.\n2. Подтверди чистое состояние production checkout.\n3. Открой изменённые статьи, главную, список блога, API и sitemap.\n4. Для статьи проверь HTTP 200, заголовок, canonical, description,\n   Open Graph и JSON-LD в полном HTML.\n5. Сравни PID и счётчики перезапусков процессов до и после выпуска.\n6. Убедись, что gateway отвечает через production-маршрут,\n   а неизвестные и внутренние URL не перехвачены быстрым слоем.\n\nПравила:\n- Не считай статус workflow достаточным доказательством публикации.\n- Не выводи секреты, environment и connection strings.\n- Не исправляй production во время проверки.\n- Если хотя бы одна обязательная проверка не прошла,\n  не объявляй успех: покажи evidence и безопасный rollback.\n\nФормат ответа:\n1. Exact SHA и состояние Git.\n2. Результаты HTTP-проверок.\n3. Состояние процессов.\n4. Проверка границ маршрутизации.\n5. Итог: принят, отклонён или требуется rollback.\n",[84,160,158],{"__ignoreMap":114},[19,162,164],{"id":163},"где-проходит-граница","Где проходит граница",[12,166,167,168,171],{},"Быстрый путь разрешает добавлять, изменять и удалять только датированные файлы ",[84,169,170],{},"content\u002Fblog\u002F*.md",". Он проверяет весь diff от активной production-версии до запрошенного коммита.",[12,173,174],{},"Переименование, копирование, пустой diff, изменение кода или смешанный набор файлов отправляются в полный деплой. Если классификатор не может доказать, что перед ним только статьи, ускорения не будет.",[12,176,177],{},"Это ограничение важнее самой скорости. Без него отдельный путь постепенно превратился бы в запасной деплой для любых изменений.",[19,179,181],{"id":180},"эта-статья-стала-проверкой-нового-пути","Эта статья стала проверкой нового пути",[12,183,184],{},"Когда быстрый деплой был готов, его требовалось проверить настоящей публикацией. Я решил не создавать проходную тестовую заметку, а написать статью о самой работе. Тема того стоила: ожидаемый путь публикации сокращался с почти 13 минут до нескольких секунд.",[12,186,187],{},"Черновик родился в той же рабочей сессии с AI-агентом, где я вводил новую схему в production. В контексте ещё оставались исходная задача, неудачные проверки, откаты, команды и фактическая приёмка. Из этого журнала я собрал последовательный рассказ, а код и логи не позволили приписать системе то, чего она ещё не доказала.",[12,189,190],{},"Получился полезный цикл: рабочая сессия дала материал для статьи, а статья стала первым реальным тестом результата этой сессии.",[19,192,194],{"id":193},"что-показала-первая-публикация","Что показала первая публикация",[12,196,197],{},"Первый успешный выпуск этой статьи занял 21 секунду по времени GitHub Actions. Сам production-скрипт от начала проверки до завершения локальной приёмки отработал за 13,36 секунды.",[37,199,200,211],{},[40,201,202],{},[43,203,204,207],{},[46,205,206],{},"Этап",[46,208,210],{"align":209},"right","Время",[53,212,213,221,229,237,245],{},[43,214,215,218],{},[58,216,217],{},"Проверка набора файлов",[58,219,220],{"align":209},"1,73 с",[43,222,223,226],{},[58,224,225],{},"Git-проверка и переход",[58,227,228],{"align":209},"1,01 с",[43,230,231,234],{},[58,232,233],{},"Синхронизация контента",[58,235,236],{"align":209},"2,91 с",[43,238,239,242],{},[58,240,241],{},"HTTP-приёмка",[58,243,244],{"align":209},"7,67 с",[43,246,247,250],{},[58,248,249],{},"Весь production-скрипт",[58,251,252],{"align":209},"13,36 с",[12,254,255],{},"Для сравнения я беру одинаковую внешнюю границу — длительность job в GitHub Actions. Полный workflow шёл 12 минут 53 секунды, быстрый — 21 секунду. В этой публикации выпуск ускорился в 36,8 раза.",[12,257,258],{},"Основной Nuxt-процесс, renderer и gateway не перезапускались: их PID и счётчики перезапусков до и после совпали. При этом сохранились проверка точного SHA, контроль набора файлов, согласованность маршрутов, HTTP-приёмка и автоматический откат.",[12,260,261],{},"Полный деплой никуда не исчез. Он по-прежнему обслуживает изменения в коде и остаётся точкой восстановления. Следующая полная сборка включает опубликованные статьи в обычный Nuxt-артефакт, после чего временная проекция больше не нужна.",[12,263,264],{},"Эта статья стала первой принятой проверкой быстрого пути. Два следующих обновления того же Markdown также прошли без полной сборки и перезапуска процессов. Быстрый выпуск теперь обслуживает обычные правки статей, а полный деплой остаётся для изменений в коде и включает актуальный контент в основной Nuxt-артефакт.",[12,266,267,268,273],{},"У вас публикация одной правки тоже запускает долгую сборку? ",[269,270,272],"a",{"href":271},"\u002Fcontact","Напишите мне",". Я посмотрю, где в проекте проходит граница между контентом и кодом, и помогу спроектировать быстрый путь так, чтобы он не обходил проверки и rollback.",{"title":114,"searchDepth":275,"depth":275,"links":276},2,[277,278,282,285,286,287],{"id":21,"depth":275,"text":22},{"id":31,"depth":275,"text":32,"children":279},[280],{"id":102,"depth":281,"text":103},3,{"id":117,"depth":275,"text":118,"children":283},[284],{"id":153,"depth":281,"text":154},{"id":163,"depth":275,"text":164},{"id":180,"depth":275,"text":181},{"id":193,"depth":275,"text":194},"2026-08-13","Как я отделил публикацию Markdown от полной сборки Nuxt-сайта и сократил время выпуска статьи с 12 минут 53 секунд до 21 секунды.","md",false,{},true,"\u002Fblog\u002F2026-08-13-bystryy-deploy-statey",{"title":6,"description":289},"Как ускорить деплой контента в Nuxt с 12 минут до 21 секунды","blog\u002F2026-08-13-bystryy-deploy-statey",[299,300,301,302],"разработка","devops","nuxt","ai","1n9Sf3zXrOYTRK2HYmG9VeX610rfCZ8PNaTY3It3_qE",{"id":305,"title":306,"acrostic":7,"body":307,"date":288,"description":646,"duration":7,"emoji":7,"extension":290,"faq":7,"featured":291,"format":7,"image":7,"level":7,"media":7,"meta":647,"navigation":293,"path":648,"price":7,"schedule":7,"seo":649,"seoTitle":650,"serviceType":7,"status":7,"stem":651,"tags":652,"tech":7,"toc":293,"url":7,"__hash__":656},"blog\u002Fblog\u002F2026-08-13-ot-open-source-k-multitenant-saas.md","От open-source для одного автосервиса к мультитенантному SaaS",{"type":9,"value":308,"toc":636},[309,312,315,318,321,324,327,330,334,337,340,343,346,349,373,376,379,382,386,389,392,395,398,401,407,410,413,436,439,443,446,449,452,455,458,461,464,467,470,473,478,481,485,488,491,494,497,500,503,507,510,513,516,519,522,545,548,551,554,557,561,564,567,570,573,576,579,583,586,589,592,595,598,601,604,608,611,614,617,620,623,626,629],[12,310,311],{},"Когда я начинал этот проект, задача выглядела довольно понятно.",[12,313,314],{},"Нужно было сделать код для одного автосервиса. Предполагалось, что затем владельцы других сервисов смогут взять open-source продукт, развернуть его у себя и пользоваться им самостоятельно: вести клиентов, автомобили, заказы, документы и работу сотрудников.",[12,316,317],{},"Для первого этапа такая модель была естественной. Она позволяла сосредоточиться на самом продукте, а не на платформе вокруг него. У каждого сервиса была бы своя установка, свои данные, своё окружение и свой темп обновлений.",[12,319,320],{},"Но по мере работы стало видно, что продукт идёт в другую сторону.",[12,322,323],{},"Нам нужен был не набор независимых установок, а единый сервис для многих автосервисов. Такой, где организация создаёт своё рабочее пространство, получает изолированные данные и обновления без отдельного развёртывания каждой новой версии.",[12,325,326],{},"Так проект перешёл от open-source модели к мультитенантному SaaS.",[12,328,329],{},"На словах это иногда звучит как небольшая архитектурная задача: добавить организациям идентификаторы, разделить данные, настроить роли. На деле пришлось пересмотреть почти все границы продукта.",[19,331,333],{"id":332},"старая-модель-перестала-отвечать-на-новые-вопросы","Старая модель перестала отвечать на новые вопросы",[12,335,336],{},"Установка для одного автосервиса и SaaS для множества организаций могут выполнять похожие функции. В обоих случаях есть клиенты, автомобили, заказы, сотрудники и документы.",[12,338,339],{},"Но ответственность устроена по-разному.",[12,341,342],{},"В самостоятельной установке каждый владелец сервиса отвечает за своё окружение. Он решает, когда обновляться, как поддерживать инфраструктуру и что делать, если версия продукта расходится с другими установками.",[12,344,345],{},"В SaaS система одна, но внутри неё работают независимые организации. Они не должны видеть данные друг друга, влиять на чужие процессы или получать доступ к действиям, которые не относятся к их роли.",[12,347,348],{},"Из-за этого появились вопросы, которые нельзя было оставлять на потом:",[350,351,352,355,358,361,364,367,370],"ul",{},[126,353,354],{},"как пользователь создаёт организацию и попадает в нужный автосервис;",[126,356,357],{},"кому принадлежат автомобили, заказы и документы;",[126,359,360],{},"что видит владелец автомобиля;",[126,362,363],{},"какие действия доступны сотруднику сервиса;",[126,365,366],{},"что может делать механик;",[126,368,369],{},"где заканчиваются права организации и начинаются полномочия самой платформы;",[126,371,372],{},"как выпускать обновления одновременно для всех, не превращая каждый релиз в отдельный проект.",[12,374,375],{},"Пока продукт рассчитан на одну установку, часть этих вопросов легко не заметить. Когда внутри одной системы появляются разные организации, неявные договорённости становятся риском.",[12,377,378],{},"Я понял, что недостаточно добавить к старой модели несколько новых полей и назвать результат мультитенантностью. В таком случае старый продукт остаётся внутри нового, а вокруг него постепенно растут исключения, флаги и переходники.",[12,380,381],{},"Через несколько месяцев уже трудно понять, что относится к текущей модели, а что осталось от прежней.",[19,383,385],{"id":384},"не-добавлять-слой-сверху-а-поменять-основу","Не добавлять слой сверху, а поменять основу",[12,387,388],{},"Главное решение здесь было не техническим, а продуктовым.",[12,390,391],{},"Проект всё ещё находился в разработке. Не было клиентского трафика и данных, ради которых пришлось бы годами поддерживать прежнюю логику. Поэтому я выбрал более прямой путь: не строить совместимость с тем, что больше не нужно.",[12,393,394],{},"Если старая сущность или сценарий противоречили новой модели, их не нужно было сохранять «на всякий случай». Их можно было убрать.",[12,396,397],{},"Это не сделало работу маленькой. Зато она стала честнее.",[12,399,400],{},"Вместо вопроса «как сохранить все старые сценарии?» появился другой:",[402,403,404],"blockquote",{},[12,405,406],{},"Какая модель нужна продукту сейчас и какие границы в ней нельзя размывать?",[12,408,409],{},"Основой стала понятная последовательность: исходный запрос превращается в сервисный запрос, затем в заказ конкретного автосервиса. История изменений заказа сохраняется отдельно, чтобы новые правки не переписывали прошлое задним числом.",[12,411,412],{},"Когда процесс определён, проще задать остальные границы:",[350,414,415,418,421,424,427,430,433],{},[126,416,417],{},"кому принадлежит заказ;",[126,419,420],{},"кто имеет право его увидеть;",[126,422,423],{},"кто меняет статус;",[126,425,426],{},"что может делать сервис;",[126,428,429],{},"что относится к работе механика;",[126,431,432],{},"какие данные должен видеть владелец автомобиля;",[126,434,435],{},"где проходит граница между организациями.",[12,437,438],{},"Это не универсальная схема для любого продукта. Но для нашей платформы она стала опорой, от которой можно проверять решения.",[19,440,442],{"id":441},"разные-роли-не-должны-жить-в-одном-кабинете","Разные роли не должны жить в одном кабинете",[12,444,445],{},"На ранней стадии продукта хочется собрать всё в одном интерфейсе. Кажется, что так быстрее: один фронтенд, одна навигация, а лишние пункты меню можно скрывать в зависимости от роли.",[12,447,448],{},"Проблема в том, что скрытое меню не создаёт границ.",[12,450,451],{},"Владелец автомобиля, сотрудник сервиса, механик и платформенный администратор смотрят на один и тот же заказ по-разному. У них разные задачи, разный объём информации и разная цена ошибки.",[12,453,454],{},"Поэтому я разделил эти сценарии.",[12,456,457],{},"Публичная часть рассказывает о сервисе и ведёт человека в нужный путь.",[12,459,460],{},"Кабинет владельца автомобиля нужен для его машин, заявок и истории обслуживания.",[12,462,463],{},"Рабочее пространство автосервиса предназначено для заказов, клиентов, автомобилей, документов, сотрудников и внутренних процессов организации.",[12,465,466],{},"Рабочее место механика намеренно уже. Механик должен видеть назначенные ему работы, а не всю коммерческую и клиентскую информацию сервиса.",[12,468,469],{},"Отдельно существует платформенное администрирование. Это не кабинет автосервиса с дополнительными кнопками, а контур управления самой платформой.",[12,471,472],{},"Такое разделение добавляет работы на старте. Зато у каждого интерфейса появляется простой вопрос:",[402,474,475],{},[12,476,477],{},"Что этот человек должен сделать здесь сейчас?",[12,479,480],{},"Если на него нет ясного ответа, экран или действие, вероятно, лишние.",[19,482,484],{"id":483},"роль-это-не-настройка-интерфейса","Роль — это не настройка интерфейса",[12,486,487],{},"При переходе к SaaS легко принять визуальные ограничения за настоящую защиту.",[12,489,490],{},"Например, можно скрыть от механика кнопку редактирования. Это полезно для интерфейса, но ничего не гарантирует, если сервер всё равно принимает запрос.",[12,492,493],{},"Поэтому правила должны работать не только на экране. Система сама определяет, кто выполняет действие, к какой организации относится пользователь, в каком рабочем контексте он находится и имеет ли право на конкретный запрос.",[12,495,496],{},"Интерфейс помогает человеку не ошибиться. Окончательное решение остаётся за сервером.",[12,498,499],{},"То же относится к данным. Если механику не нужны финансовые сведения, лишние данные клиента или служебные поля, их не стоит просто прятать в интерфейсе. Они не должны попадать в его рабочий набор данных вовсе.",[12,501,502],{},"Это не попытка усложнить продукт. Это нормальная дисциплина для системы, где рядом работают разные организации и разные роли.",[19,504,506],{"id":505},"почему-я-не-стал-переписывать-всё-одним-заходом","Почему я не стал переписывать всё одним заходом",[12,508,509],{},"Большие переделки часто ломаются не потому, что команда не умеет писать код. Они ломаются, когда изменения невозможно проверить по частям.",[12,511,512],{},"Поэтому переход я разделил на шесть волн разработки.",[12,514,515],{},"Сначала нужно было зафиксировать доменную модель и убрать то, что конфликтовало с ней. Затем отдельно выстраивались сценарии доступа, жизненный цикл заказов, интерфейсы разных ролей, операционный контур и выпуск.",[12,517,518],{},"У каждой волны был свой проверяемый вопрос.",[12,520,521],{},"Не «готов ли уже весь продукт?», а, например:",[350,523,524,527,530,533,536,539,542],{},[126,525,526],{},"работают ли организации только со своими данными;",[126,528,529],{},"не остались ли активные сценарии прежней модели;",[126,531,532],{},"можно ли получить доступ к чужому заказу прямым запросом;",[126,534,535],{},"не выдаёт ли публичная ссылка лишнюю информацию;",[126,537,538],{},"сохраняется ли история изменений;",[126,540,541],{},"видит ли механик только назначенные ему работы;",[126,543,544],{},"можно ли развернуть новую версию и подтвердить её состояние без ручных действий на сервере.",[12,546,547],{},"Каждая волна должна была заканчиваться не отчётом о проделанной работе, а доказательствами: тестами, сборкой, проверкой схемы данных, проверкой прав доступа, отсутствием устаревших маршрутов и проверкой выпуска.",[12,549,550],{},"AI-агенты здесь заметно ускорили работу. Они помогали параллельно исследовать разные части проекта, находить старые зависимости, готовить проверки и проверять достижимость маршрутов.",[12,552,553],{},"Но направление и приёмка оставались за мной.",[12,555,556],{},"Агент может предложить изменение или сообщить, что задача завершена. Он не решает, какую старую сущность нужно сохранить, где проходит продуктовая граница между ролями и достаточно ли доказательств перед выпуском. Его отчёт остаётся гипотезой, пока я не проверю код, тесты и фактическое поведение системы.",[19,558,560],{"id":559},"временные-решения-быстро-становятся-постоянными","Временные решения быстро становятся постоянными",[12,562,563],{},"Во время большого перехода постоянно хочется сказать: «Пока оставим старое, потом разберёмся».",[12,565,566],{},"Иногда это необходимо. Если в системе уже есть пользователи, исторические данные и обязательства, переход должен быть осторожным.",[12,568,569],{},"Но когда продукт ещё можно менять свободно, временная совместимость быстро обрастает постоянными ветками.",[12,571,572],{},"Остаётся старый маршрут «на всякий случай». Прежняя сущность продолжает использоваться в одном экране. Новый сценарий начинает принимать два формата данных. В интерфейсе появляется переключатель между старым и новым поведением.",[12,574,575],{},"Через несколько месяцев трудно объяснить, что из этого действительно нужно продукту, а что просто осталось от незавершённого переезда.",[12,577,578],{},"Я старался не поддерживать старую модель там, где она мешала новой. Это помогло упростить не презентацию, а реальное поведение системы: убрать лишние ветки, исключения и правила, которые держатся только на памяти людей, работавших с проектом раньше.",[19,580,582],{"id":581},"production-тоже-часть-продукта","Production — тоже часть продукта",[12,584,585],{},"После того как код написан и тесты проходят, легко решить, что работа закончена.",[12,587,588],{},"На самом деле начинается другой этап.",[12,590,591],{},"Для SaaS недостаточно, чтобы проект собирался на локальной машине. Нужно понимать, как он запускается, где хранятся данные, какие сервисы доступны извне, как разделены окружения, что произойдёт при ошибке и как подтвердить, что новая версия действительно работает.",[12,593,594],{},"Поэтому выпуск я проверял отдельно.",[12,596,597],{},"До него были резервные копии и подготовленный путь отката. После него — состояние процессов, доступность публичных точек входа, целостность базы и отсутствие открытых наружу внутренних сервисов.",[12,599,600],{},"Это не самая заметная часть работы. Её не покажешь красивым скриншотом. Но именно здесь становится понятно, есть ли перед тобой продукт или просто набор исходников.",[12,602,603],{},"Переход на мультитенантную модель завершён. Платформа работает как единый SaaS-продукт, а не как кодовая база для множества самостоятельных установок.",[19,605,607],{"id":606},"что-дальше","Что дальше",[12,609,610],{},"На этом работа не закончилась.",[12,612,613],{},"Переход на SaaS решил одну большую задачу: теперь продукт построен как единая платформа с разделёнными организациями, ролями и рабочими сценариями.",[12,615,616],{},"Но архитектурная готовность не означает, что интерфейс уже идеален.",[12,618,619],{},"Сейчас я отдельно переделываю UI. Это другая работа: как сделать сложную систему понятной для владельца автомобиля, сотрудника сервиса, механика и администратора платформы. Когда там появится материал, которым можно делиться, я расскажу об этом отдельно.",[12,621,622],{},"Эта история для меня не только про автосервисы и мультитенантность.",[12,624,625],{},"Она про момент, когда нужно признать: первоначальная версия продукта выполнила свою задачу, но больше не подходит следующей версии замысла.",[12,627,628],{},"В такой момент не всегда нужно аккуратно развивать то, что уже есть. Иногда честнее заново определить основу, разделить переход на проверяемые части и оставить в системе только то, что действительно нужно будущему продукту.",[12,630,631,632,635],{},"Если вы тоже переводите продукт из самостоятельных установок в единый сервис, ",[269,633,634],{"href":271},"напишите мне",". Я помогу разобрать границы данных, ролей, сценариев доступа и выпусков, которые стоит определить до того, как переход обрастёт временной совместимостью.",{"title":114,"searchDepth":275,"depth":275,"links":637},[638,639,640,641,642,643,644,645],{"id":332,"depth":275,"text":333},{"id":384,"depth":275,"text":385},{"id":441,"depth":275,"text":442},{"id":483,"depth":275,"text":484},{"id":505,"depth":275,"text":506},{"id":559,"depth":275,"text":560},{"id":581,"depth":275,"text":582},{"id":606,"depth":275,"text":607},"Почему я отказался от модели самостоятельных open-source установок и как перевёл разрабатываемую платформу автосервисов на мультитенантный SaaS.",{},"\u002Fblog\u002F2026-08-13-ot-open-source-k-multitenant-saas",{"title":306,"description":646},"Как перевести продукт из open-source в мультитенантный SaaS","blog\u002F2026-08-13-ot-open-source-k-multitenant-saas",[299,653,654,655],"saas","архитектура","автосервисы","QLNoN3ETI4iw7QvXpguCi0hvXZYrCiW1LW-LzCHlakY",{"id":658,"title":659,"acrostic":7,"body":660,"date":1724,"description":1725,"duration":7,"emoji":7,"extension":290,"faq":7,"featured":291,"format":7,"image":7,"level":7,"media":7,"meta":1726,"navigation":293,"path":1727,"price":7,"schedule":7,"seo":1728,"seoTitle":1729,"serviceType":7,"status":7,"stem":1730,"tags":1731,"tech":7,"toc":293,"url":7,"__hash__":1735},"blog\u002Fblog\u002F2026-08-12-lichnyy-sayt-ai-agenty.md","Личный сайт в эпоху AI-агентов: как запустить и развивать его без хаоса",{"type":9,"value":661,"toc":1695},[662,665,668,671,674,677,681,701,705,708,711,714,717,722,725,728,731,735,738,741,795,798,803,806,810,813,816,819,839,842,845,850,853,857,863,866,870,873,876,879,896,899,903,909,912,916,919,922,925,979,982,985,990,994,1000,1004,1007,1010,1064,1067,1070,1074,1077,1080,1097,1104,1107,1110,1127,1130,1133,1137,1144,1147,1164,1167,1170,1175,1178,1183,1186,1190,1193,1204,1403,1406,1410,1416,1419,1423,1426,1430,1436,1440,1446,1450,1456,1460,1463,1466,1469,1513,1516,1520,1523,1577,1580,1583,1586,1590,1593,1663,1666,1670,1673,1676,1679,1682,1685,1691],[12,663,664],{},"Личный сайт легко представить как разовую задачу: купить домен, выбрать шаблон, написать «обо мне», добавить контакты — и наконец-то поставить галочку.",[12,666,667],{},"Но через несколько месяцев оказывается, что на сайте висит старая услуга, в проектах не видно последних работ, блог ждёт первую публикацию, а форму связи страшно трогать, потому что непонятно, кто и как её настраивал.",[12,669,670],{},"С появлением AI-агентов проблема не исчезла. Сайт стало проще быстро собрать, написать для него тексты и даже развернуть на сервере. Но скорость не гарантирует, что он окажется полезным, узнаваемым и живым. За вечер агент способен предложить структуру, сгенерировать блоки и составить план публикаций. С той же скоростью он может наполнить сайт общими словами, выдуманными кейсами и разделами, которые никто не будет поддерживать.",[12,672,673],{},"Поэтому для меня личный сайт — не «страница о себе» и не демонстрация того, что AI умеет писать код. Это рабочая площадка, где постепенно собираются проекты, мысли, доказательства опыта и поводы начать разговор.",[12,675,676],{},"AI здесь не заменяет автора. Он помогает превратить живой опыт в материал, проверить повторяющиеся вещи и поддерживать ритм обновлений. Но цель сайта, факты, интонация и решение о публикации остаются за человеком.",[19,678,680],{"id":679},"коротко","Коротко",[350,682,683,686,689,692,695,698],{},[126,684,685],{},"Сначала нужно определить роль сайта: что посетитель должен понять и сделать, а не выбирать шаблон.",[126,687,688],{},"Лучшая основа для статьи или кейса часто появляется не в пустом документе, а в голосовой заметке после работы, встречи или мысли в дороге.",[126,690,691],{},"Агент может расшифровать запись, выделить структуру, подготовить черновик и проверить материал, но не должен придумывать факты и публиковать без подтверждения.",[126,693,694],{},"Первую версию сайта стоит ограничить несколькими рабочими сценариями: понять, чем я занимаюсь, увидеть результаты, прочитать материалы и связаться.",[126,696,697],{},"Для собственного сайта я рекомендую Nuxt: он даёт серверный рендеринг, хорошую основу для SEO, Markdown-контент и возможность добавлять формы и интеграции без смены платформы.",[126,699,700],{},"Сайт лучше размещать на контролируемом VPS или выделенном сервере, а обновления проводить по понятному, проверяемому процессу.",[19,702,704],{"id":703},"сайт-не-визитка-а-собственная-площадка","Сайт — не визитка, а собственная площадка",[12,706,707],{},"Социальные сети, мессенджеры, площадки для портфолио и агрегаторы полезны. Они помогают знакомиться, получать внимание и поддерживать связь. Но правила там всегда чужие: меняется алгоритм, исчезает формат, публикация уходит глубоко в ленту, а аккаунт может попасть под ограничения.",[12,709,710],{},"Сайт не отменяет эти каналы. Он связывает их между собой.",[12,712,713],{},"В коротком посте я могу оставить одну мысль и привести человека к подробной статье. В описании проекта — показать не только красивый скриншот, но и задачу, ход решения, ограничения и результат. На странице услуг — объяснить, в каком формате начинается работа. В контактах — предложить простой путь к разговору.",[12,715,716],{},"Поэтому до дизайна и кода я бы зафиксировал роль сайта одной фразой. Например:",[402,718,719],{},[12,720,721],{},"Помочь посетителю быстро понять, чем я занимаюсь, увидеть реальные работы и материалы, а затем выбрать следующий шаг: написать, обсудить проект или вернуться за новой заметкой.",[12,723,724],{},"Это не рекламный слоган, а критерий для следующих решений.",[12,726,727],{},"Если хочется добавить новый раздел, я могу спросить: он помогает посетителю пройти нужный маршрут или просто кажется хорошей идеей? Если хочется переделать главную, станет ли яснее, что здесь происходит? Если ответ неясен, вероятно, задача ещё не проработана.",[12,729,730],{},"Без этой опоры личный сайт быстро превращается в склад блоков: проекты, навыки, сертификаты, отзывы, блог, восемь иконок, анимация и ссылка на мессенджер. Формально всё на месте, но человеку по-прежнему непонятно, зачем он сюда пришёл.",[19,732,734],{"id":733},"распределить-роли-автор-агент-и-работающая-система","Распределить роли: автор, агент и работающая система",[12,736,737],{},"AI-агенты особенно полезны там, где нужно быстро разобрать много материала, подготовить несколько вариантов или не забыть повторяющуюся проверку. Но они не получают автоматически право решать, что является правдой обо мне и моём деле.",[12,739,740],{},"Я разделяю ответственность так:",[37,742,743,753],{},[40,744,745],{},[43,746,747,750],{},[46,748,749],{},"За автором",[46,751,752],{},"Можно поручить AI-помощнику",[53,754,755,763,771,779,787],{},[43,756,757,760],{},[58,758,759],{},"Цель сайта, аудитория и позиционирование",[58,761,762],{},"Исследование структуры похожих сайтов и сценариев посетителя",[43,764,765,768],{},[58,766,767],{},"Факты, реальные проекты, обещания и границы",[58,769,770],{},"Расшифровка голосовых заметок и выделение тем",[43,772,773,776],{},[58,774,775],{},"Личный голос и финальная редактура",[58,777,778],{},"План статьи, варианты заголовков, черновик из моих материалов",[43,780,781,784],{},[58,782,783],{},"Решение о публикации",[58,785,786],{},"Проверка ссылок, метаданных, доступности и чек-листа",[43,788,789,792],{},[58,790,791],{},"Доступы, production и рискованные изменения",[58,793,794],{},"Сборка, тесты, отчёт об изменённых файлах и рисках",[12,796,797],{},"Такое разделение не означает, что агенту нельзя доверять. Оно делает доверие понятным: я вижу, какую часть работы он ускоряет и где решение должен принять я.",[402,799,800],{},[12,801,802],{},"Агентский отчёт — это полезная гипотеза. Доказательством он становится после проверки текста, кода, публичной страницы или нужного пользовательского сценария.",[12,804,805],{},"Это особенно важно для личного сайта. Один выдуманный результат в кейсе подрывает доверие сильнее, чем отсутствие десятка красивых карточек. Одна сломанная форма связи может стоить реального разговора. А одна самовольная публикация превращает помощника в источник риска.",[19,807,809],{"id":808},"начинать-статью-можно-с-голосовой-заметки","Начинать статью можно с голосовой заметки",[12,811,812],{},"Самая трудная часть регулярных обновлений сайта часто не техническая. Нужно сесть перед пустым документом и собрать мысли в связный текст. После рабочего дня, встречи или сложного проекта на это обычно не хватает времени — хотя именно тогда в голове есть живые детали.",[12,814,815],{},"Поэтому я считаю голосовую заметку хорошей стартовой точкой.",[12,817,818],{},"Можно открыть диктофон и за несколько минут проговорить:",[350,820,821,824,827,830,833,836],{},[126,822,823],{},"что произошло;",[126,825,826],{},"какая была задача;",[126,828,829],{},"почему она оказалась непростой;",[126,831,832],{},"какое решение я выбрал;",[126,834,835],{},"что сработало или не сработало;",[126,837,838],{},"какой вывод может быть полезен другому человеку.",[12,840,841],{},"Не нужно пытаться говорить литературно. На этом этапе важнее сохранить ход мысли, конкретные обстоятельства и собственную интонацию. Голосом часто легче сказать: «я сначала думал так, но потом увидел вот это», чем немедленно превратить опыт в гладкий текст.",[12,843,844],{},"Дальше появляется понятный маршрут:",[402,846,847],{},[12,848,849],{},"рабочее событие или мысль → голосовая заметка → расшифровка → структура от агента → проверка фактов автором → черновик → техническая проверка → публикация.",[12,851,852],{},"Расшифровка — не готовая статья. В ней будут повторы, обрывки фраз, оговорки и мысли, которые хорошо звучат в разговоре, но не обязаны попадать в публичный текст. Это сырьё с реальным материалом, а не попытка AI заполнить тишину общими фразами.",[100,854,856],{"id":855},"промпт-из-голосовой-расшифровки-в-план-и-черновик","Промпт: из голосовой расшифровки в план и черновик",[105,858,861],{"className":859,"code":860,"language":110,"meta":111},[108],"Я дам тебе расшифровку моей голосовой заметки для личного сайта.\n\nТвоя задача:\n1. Выделить главную мысль, целевую аудиторию и практическую пользу.\n2. Отделить подтверждённые факты от личных оценок,\n   предположений и мест, которые нужно уточнить.\n3. Предложить 4–6 информативных заголовков без кликбейта.\n4. Собрать подробный план статьи.\n5. Подготовить черновик от первого лица, сохраняя мою интонацию.\n\nОграничения:\n- Не выдумывай факты, кейсы, цифры, клиентов или результаты.\n- Не заменяй конкретику общими рекламными формулировками.\n- Не публикуй и не меняй файлы.\n- Если материала недостаточно, сначала задай точные вопросы.\n\nФормат ответа:\n1. Главная мысль.\n2. Что требует уточнения.\n3. Варианты заголовка.\n4. План.\n5. Черновик.\n",[84,862,860],{"__ignoreMap":114},[12,864,865],{},"Перед публикацией я всё равно проверяю имена, даты, цифры, обещания, описание результатов и собственную интонацию. Агент может хорошо структурировать мысль, но не знает без моей проверки, какая деталь конфиденциальна, какой пример можно вынести публично и где я сам ещё сомневаюсь.",[19,867,869],{"id":868},"сначала-бриф-потом-страницы","Сначала бриф, потом страницы",[12,871,872],{},"У сайта личного бренда есть простая задача: помочь человеку быстро сориентироваться. Но для каждого автора конкретный маршрут будет своим.",[12,874,875],{},"Кому-то нужно собирать заявки на услуги. Кому-то — показывать опыт, чтобы проще проходить собеседования и начинать партнёрства. Кому-то важнее регулярно публиковать материалы и строить вокруг них профессиональное сообщество.",[12,877,878],{},"Прежде чем открывать редактор или давать агенту команду «сделай сайт», я бы ответил на несколько вопросов:",[123,880,881,884,887,890,893],{},[126,882,883],{},"Для кого сайт?",[126,885,886],{},"Что этот человек должен понять за первую минуту?",[126,888,889],{},"Какое действие для него главное: написать, оставить заявку, изучить проекты, прочитать материал, записаться на обучение?",[126,891,892],{},"Какие доказательства у меня уже есть: проекты, отзывы, заметки, выступления, продукты?",[126,894,895],{},"Что сознательно не входит в первую версию?",[12,897,898],{},"Последний вопрос часто спасает запуск. Он не даёт превратить небольшой сайт в бесконечный проект с личным кабинетом, каталогом, десятками пустых разделов и космическим кораблём на первом экране.",[100,900,902],{"id":901},"промпт-интервью-для-брифа-сайта","Промпт: интервью для брифа сайта",[105,904,907],{"className":905,"code":906,"language":110,"meta":111},[108],"Помоги мне подготовить бриф для личного сайта.\n\nПроведи интервью: задавай по одному короткому вопросу за раз.\nСначала выясни:\n- кому нужен сайт;\n- что посетитель должен понять за первую минуту;\n- какое действие для него главное;\n- какие проекты, услуги, материалы и доказательства уже есть;\n- что не входит в первую версию;\n- кто и как будет обновлять сайт после запуска.\n\nПравила:\n- Не предлагай дизайн и технологии, пока не собран смысловой бриф.\n- Не придумывай опыт, отзывы, результаты или позиционирование вместо меня.\n- Если я отвечаю расплывчато, задай уточняющий вопрос с примером выбора.\n\nВ финале подготовь:\n1. Цель сайта в одной фразе.\n2. Портреты основных посетителей.\n3. Три–пять ключевых сценариев.\n4. Состав первой версии.\n5. Список недостающих материалов.\n6. Риски и открытые вопросы.\n",[84,908,906],{"__ignoreMap":114},[12,910,911],{},"Такой промпт полезен не только в разговоре с агентом. Он заставляет сформулировать то, что обычно остаётся в голове, а потом превращается в противоречивые пожелания к дизайну.",[19,913,915],{"id":914},"первая-версия-должна-работать-а-не-казаться-полной","Первая версия должна работать, а не казаться полной",[12,917,918],{},"Есть соблазн сначала сделать «полный» сайт: собрать все проекты за десять лет, написать большую биографию, найти идеальные фотографии, придумать страницу для каждой услуги, перенести старые тексты и ещё добавить несколько функций на будущее.",[12,920,921],{},"Так сайт начинает выглядеть серьёзно — и долго не выходит к людям.",[12,923,924],{},"Я бы запускал первую версию, когда она честно и понятно решает несколько главных сценариев:",[37,926,927,937],{},[40,928,929],{},[43,930,931,934],{},[46,932,933],{},"Сценарий посетителя",[46,935,936],{},"Что должно быть на сайте",[53,938,939,947,955,963,971],{},[43,940,941,944],{},[58,942,943],{},"Человек впервые видит ссылку",[58,945,946],{},"Ясная главная страница: кто я и чем занимаюсь",[43,948,949,952],{},[58,950,951],{},"Потенциальный клиент оценивает опыт",[58,953,954],{},"Несколько конкретных проектов, подход и удобный контакт",[43,956,957,960],{},[58,958,959],{},"Коллега или читатель хочет понять мой взгляд",[58,961,962],{},"Заметки, статьи, выступления или другие материалы",[43,964,965,968],{},[58,966,967],{},"Человек возвращается позже",[58,969,970],{},"Признаки живого сайта: актуальные проекты и новые публикации",[43,972,973,976],{},[58,974,975],{},"Нужен конкретный ответ",[58,977,978],{},"Быстрый путь к услуге, статье или форме связи",[12,980,981],{},"Для старта обычно достаточно главной, проектов, заметок и контактов. Услуги, обучение, музыка, стихи или другие разделы стоит добавлять не потому, что «так бывает у личных сайтов», а когда они поддерживают реальную часть моей работы.",[12,983,984],{},"Вместо двадцати поверхностных карточек лучше показать три проекта, о которых можно рассказать по существу. Вместо биографии на пять экранов — несколько точных абзацев. Вместо блока «скоро здесь будет блог» — одна содержательная заметка, у которой есть авторская мысль.",[402,986,987],{},[12,988,989],{},"Первая версия сайта должна быть достаточно маленькой, чтобы её запустить, и достаточно содержательной, чтобы за неё не было неловко.",[100,991,993],{"id":992},"промпт-карта-первой-версии-сайта","Промпт: карта первой версии сайта",[105,995,998],{"className":996,"code":997,"language":110,"meta":111},[108],"На основе моего утверждённого брифа предложи первую версию личного сайта.\n\nНужен не дизайн и не код, а рабочая карта:\n- страницы и их роль;\n- главные сценарии посетителя;\n- содержание каждого первого экрана;\n- обязательные материалы, которые нужно подготовить;\n- что можно отложить после запуска;\n- риски, если какой-то раздел будет пустым или неподтверждённым.\n\nПриоритизируй решения по принципу:\nсначала понятность предложения, реальные доказательства опыта\nи простой способ связаться; затем декоративные и необязательные элементы.\n\nНе выдумывай кейсы, статистику и отзывы.\nВ конце составь короткий список задач на первую неделю.\n",[84,999,997],{"__ignoreMap":114},[19,1001,1003],{"id":1002},"содержание-появляется-раньше-финального-дизайна","Содержание появляется раньше финального дизайна",[12,1005,1006],{},"Иногда работу строят так: сначала дизайн, потом вёрстка, потом настройка, а в конце кто-то срочно заполняет страницы текстами. Обычно это видно: заголовки получаются общими, карточки — одинаковыми, а раздел «обо мне» состоит из слов «опытный», «креативный» и «ответственный».",[12,1008,1009],{},"Я бы собрал хотя бы черновое содержание до финального интерфейса. Не идеальные тексты, а ясные ответы на вопросы:",[37,1011,1012,1022],{},[40,1013,1014],{},[43,1015,1016,1019],{},[46,1017,1018],{},"Раздел",[46,1020,1021],{},"Вопрос, на который он отвечает",[53,1023,1024,1032,1040,1048,1056],{},[43,1025,1026,1029],{},[58,1027,1028],{},"Главная",[58,1030,1031],{},"Кто я и почему здесь стоит задержаться?",[43,1033,1034,1037],{},[58,1035,1036],{},"Проекты",[58,1038,1039],{},"Какие задачи я умею доводить до результата?",[43,1041,1042,1045],{},[58,1043,1044],{},"Услуги или обучение",[58,1046,1047],{},"В каком формате можно работать вместе?",[43,1049,1050,1053],{},[58,1051,1052],{},"Заметки",[58,1054,1055],{},"Как я думаю, принимаю решения и объясняю сложное?",[43,1057,1058,1061],{},[58,1059,1060],{},"Контакты",[58,1062,1063],{},"Как начать разговор без лишних препятствий?",[12,1065,1066],{},"Тогда интерфейс помогает содержанию, а не заставляет его подстраиваться под случайный шаблон.",[12,1068,1069],{},"AI здесь хорошо работает как редактор и исследователь. Он может заметить повторы, предложить порядок, показать места без фактов и подготовить несколько вариантов заголовка. Но я не поручал бы ему самостоятельно «писать позиционирование»: результат почти наверняка окажется гладким, но слишком похожим на сотни других сайтов.",[19,1071,1073],{"id":1072},"технологии-почему-я-рекомендую-nuxt","Технологии: почему я рекомендую Nuxt",[12,1075,1076],{},"После смысла и содержания приходит вопрос о стеке. В нём легко увязнуть: спорить о правильном фреймворке, CMS, хостинге и количестве библиотек.",[12,1078,1079],{},"Для личного сайта я смотрю на выбор прагматично. Технология должна помогать:",[123,1081,1082,1085,1088,1091,1094],{},[126,1083,1084],{},"быстро и надёжно отдавать страницу посетителю;",[126,1086,1087],{},"удобно публиковать и обновлять материалы;",[126,1089,1090],{},"давать хорошую базу для поисковой видимости;",[126,1092,1093],{},"не превращать небольшую правку в отдельный технический проект;",[126,1095,1096],{},"позволять постепенно добавлять формы и интеграции, когда они действительно понадобятся.",[12,1098,1099,1100,132],{},"Для таких задач я рекомендую ",[1101,1102,1103],"strong",{},"Nuxt",[12,1105,1106],{},"Nuxt построен на Vue и может рендерить страницы на сервере. Это значит, что посетитель и поисковый робот получают готовый HTML, а не пустую страницу, которую браузер должен сначала собрать из JavaScript. Для личного сайта это помогает скорости первого отображения и создаёт нормальную основу для SEO.",[12,1108,1109],{},"Ещё несколько практических причин:",[350,1111,1112,1115,1118,1121,1124],{},[126,1113,1114],{},"статьи, проекты и другие материалы удобно хранить в Markdown рядом с кодом;",[126,1116,1117],{},"метаданные страницы — title, description, Open Graph, canonical URL и structured data — можно держать в одном понятном процессе;",[126,1119,1120],{},"sitemap можно генерировать автоматически;",[126,1122,1123],{},"публичные страницы, формы и серверные API находятся в одном проекте;",[126,1125,1126],{},"сначала можно сделать спокойный контентный сайт, а затем добавить заявки, интеграции или небольшую админку без переезда на другую платформу.",[12,1128,1129],{},"Nuxt не делает SEO автоматически. Он даёт нужные механизмы, но название страницы, описание, понятная структура, реальные материалы, скорость, доступность и последующая проверка всё равно остаются работой автора и разработчика.",[12,1131,1132],{},"Markdown тоже не решает всё сам. Он хорош, когда у сайта есть понятный процесс редактуры: материал можно написать, увидеть diff, проверить ссылку и сохранить историю изменений. Если автору удобнее работать только в визуальном редакторе и он не хочет иметь дело с Git, нужно сразу предусмотреть другой безопасный путь публикации.",[19,1134,1136],{"id":1135},"где-размещать-сайт-контролируемый-vps-или-выделенный-сервер","Где размещать сайт: контролируемый VPS или выделенный сервер",[12,1138,1139,1140,1143],{},"Сайт лучше размещать в инфраструктуре, которой я могу управлять. На практике для личного сайта обычно достаточно надёжного ",[1101,1141,1142],{},"VPS"," — выделенного виртуального сервера. Для более требовательной системы или при особых требованиях можно использовать физический выделенный сервер.",[12,1145,1146],{},"Дело не в том, чтобы любой личный сайт обязательно жил на большой машине. Дело в контроле:",[350,1148,1149,1152,1155,1158,1161],{},[126,1150,1151],{},"домен, доступы и конфигурация принадлежат владельцу сайта;",[126,1153,1154],{},"можно подключать формы, почту, webhooks, CRM и другие интеграции;",[126,1156,1157],{},"есть понятная резервная копия и возможность восстановиться;",[126,1159,1160],{},"можно управлять обновлениями, а не ждать, пока конструктор поменяет правила;",[126,1162,1163],{},"инфраструктура не ограничивает развитие сайта одним набором возможностей.",[12,1165,1166],{},"При этом собственный сервер требует дисциплины. Нужно следить за обновлениями системы, резервными копиями, TLS-сертификатами, журналами, доступами и состоянием приложения. Если эти обязанности никто не берёт на себя, «свой сервер» быстро превращается не в свободу, а в забытый ящик с паролями.",[12,1168,1169],{},"Я бы придерживался простого правила:",[402,1171,1172],{},[12,1173,1174],{},"Сервер должен применять подготовленную версию сайта. В полночь не стоит дописывать на нём код и исправлять текст напрямую.",[12,1176,1177],{},"Нормальный путь обновления выглядит так:",[402,1179,1180],{},[12,1181,1182],{},"изменение в исходном коде или контенте → проверка → зафиксированная версия → публикация именно этой версии → health-check → проверка публичной страницы.",[12,1184,1185],{},"Так проще ответить на важные вопросы: какая версия сейчас работает, что именно изменилось, открывается ли новый маршрут и куда вернуться, если после публикации что-то пошло не так.",[19,1187,1189],{"id":1188},"настроить-ai-агента-как-участника-проекта","Настроить AI-агента как участника проекта",[12,1191,1192],{},"Агент работает заметно лучше, когда у него есть актуальный контекст. Не многотомная энциклопедия, а короткий документ с ответами на главные вопросы до начала работы.",[12,1194,1195,1196,1199,1200,1203],{},"Его можно назвать ",[84,1197,1198],{},"PROJECT_CONTEXT.md",", ",[84,1201,1202],{},"CLAUDE.md"," или иначе — название не главное. Важно содержание:",[105,1205,1208],{"className":1206,"code":1207,"language":290,"meta":114,"style":114},"language-md shiki shiki-themes github-light github-dark","# Контекст личного сайта\n\n## Цель\nПомогать посетителю понять, чем я занимаюсь, увидеть реальные работы\nи выбрать следующий шаг: написать, обсудить проект или прочитать материал.\n\n## Аудитория\n[Кто обычно приходит на сайт и зачем.]\n\n## Стек\nNuxt, серверный рендеринг, Markdown для статей и проектов,\nVPS или выделенный сервер для production.\n\n## Контент\n- Пишем от первого лица.\n- Не выдумываем факты, клиентов, цифры и результаты.\n- Голосовые расшифровки — это исходный материал, не готовая публикация.\n- Автор подтверждает финальный текст перед публикацией.\n\n## Правила изменений\n- Сначала исследование и план, затем минимальное изменение.\n- Не менять production, доступы, секреты и инфраструктуру без отдельной команды.\n- Не расширять задачу «заодно».\n- После работы вернуть список изменённых файлов, проверки, риски и открытые вопросы.\n\n## Публикация\n- Перед публикацией проверить ссылки, метаданные, мобильное отображение\n  и основной пользовательский сценарий.\n- Публикация — отдельное подтверждённое действие.\n",[84,1209,1210,1219,1224,1229,1236,1242,1247,1253,1259,1264,1270,1276,1282,1287,1293,1303,1311,1319,1327,1332,1338,1346,1354,1362,1370,1375,1381,1389,1395],{"__ignoreMap":114},[1211,1212,1215],"span",{"class":1213,"line":1214},"line",1,[1211,1216,1218],{"class":1217},"sq-ep","# Контекст личного сайта\n",[1211,1220,1221],{"class":1213,"line":275},[1211,1222,1223],{"emptyLinePlaceholder":293},"\n",[1211,1225,1226],{"class":1213,"line":281},[1211,1227,1228],{"class":1217},"## Цель\n",[1211,1230,1232],{"class":1213,"line":1231},4,[1211,1233,1235],{"class":1234},"sVt8B","Помогать посетителю понять, чем я занимаюсь, увидеть реальные работы\n",[1211,1237,1239],{"class":1213,"line":1238},5,[1211,1240,1241],{"class":1234},"и выбрать следующий шаг: написать, обсудить проект или прочитать материал.\n",[1211,1243,1245],{"class":1213,"line":1244},6,[1211,1246,1223],{"emptyLinePlaceholder":293},[1211,1248,1250],{"class":1213,"line":1249},7,[1211,1251,1252],{"class":1217},"## Аудитория\n",[1211,1254,1256],{"class":1213,"line":1255},8,[1211,1257,1258],{"class":1234},"[Кто обычно приходит на сайт и зачем.]\n",[1211,1260,1262],{"class":1213,"line":1261},9,[1211,1263,1223],{"emptyLinePlaceholder":293},[1211,1265,1267],{"class":1213,"line":1266},10,[1211,1268,1269],{"class":1217},"## Стек\n",[1211,1271,1273],{"class":1213,"line":1272},11,[1211,1274,1275],{"class":1234},"Nuxt, серверный рендеринг, Markdown для статей и проектов,\n",[1211,1277,1279],{"class":1213,"line":1278},12,[1211,1280,1281],{"class":1234},"VPS или выделенный сервер для production.\n",[1211,1283,1285],{"class":1213,"line":1284},13,[1211,1286,1223],{"emptyLinePlaceholder":293},[1211,1288,1290],{"class":1213,"line":1289},14,[1211,1291,1292],{"class":1217},"## Контент\n",[1211,1294,1296,1300],{"class":1213,"line":1295},15,[1211,1297,1299],{"class":1298},"s4XuR","-",[1211,1301,1302],{"class":1234}," Пишем от первого лица.\n",[1211,1304,1306,1308],{"class":1213,"line":1305},16,[1211,1307,1299],{"class":1298},[1211,1309,1310],{"class":1234}," Не выдумываем факты, клиентов, цифры и результаты.\n",[1211,1312,1314,1316],{"class":1213,"line":1313},17,[1211,1315,1299],{"class":1298},[1211,1317,1318],{"class":1234}," Голосовые расшифровки — это исходный материал, не готовая публикация.\n",[1211,1320,1322,1324],{"class":1213,"line":1321},18,[1211,1323,1299],{"class":1298},[1211,1325,1326],{"class":1234}," Автор подтверждает финальный текст перед публикацией.\n",[1211,1328,1330],{"class":1213,"line":1329},19,[1211,1331,1223],{"emptyLinePlaceholder":293},[1211,1333,1335],{"class":1213,"line":1334},20,[1211,1336,1337],{"class":1217},"## Правила изменений\n",[1211,1339,1341,1343],{"class":1213,"line":1340},21,[1211,1342,1299],{"class":1298},[1211,1344,1345],{"class":1234}," Сначала исследование и план, затем минимальное изменение.\n",[1211,1347,1349,1351],{"class":1213,"line":1348},22,[1211,1350,1299],{"class":1298},[1211,1352,1353],{"class":1234}," Не менять production, доступы, секреты и инфраструктуру без отдельной команды.\n",[1211,1355,1357,1359],{"class":1213,"line":1356},23,[1211,1358,1299],{"class":1298},[1211,1360,1361],{"class":1234}," Не расширять задачу «заодно».\n",[1211,1363,1365,1367],{"class":1213,"line":1364},24,[1211,1366,1299],{"class":1298},[1211,1368,1369],{"class":1234}," После работы вернуть список изменённых файлов, проверки, риски и открытые вопросы.\n",[1211,1371,1373],{"class":1213,"line":1372},25,[1211,1374,1223],{"emptyLinePlaceholder":293},[1211,1376,1378],{"class":1213,"line":1377},26,[1211,1379,1380],{"class":1217},"## Публикация\n",[1211,1382,1384,1386],{"class":1213,"line":1383},27,[1211,1385,1299],{"class":1298},[1211,1387,1388],{"class":1234}," Перед публикацией проверить ссылки, метаданные, мобильное отображение\n",[1211,1390,1392],{"class":1213,"line":1391},28,[1211,1393,1394],{"class":1234},"  и основной пользовательский сценарий.\n",[1211,1396,1398,1400],{"class":1213,"line":1397},29,[1211,1399,1299],{"class":1298},[1211,1401,1402],{"class":1234}," Публикация — отдельное подтверждённое действие.\n",[12,1404,1405],{},"Рядом с контекстом полезно вести два разных списка: текущий план и журнал принятых решений. План отвечает на вопрос «что делать дальше», а журнал — «почему когда-то выбрали именно этот путь». Не стоит превращать старые решения в автоматический приказ продолжать работу: сначала их нужно сверить с реальным состоянием сайта.",[100,1407,1409],{"id":1408},"промпт-безопасная-работа-агента-в-существующем-сайте","Промпт: безопасная работа агента в существующем сайте",[105,1411,1414],{"className":1412,"code":1413,"language":110,"meta":111},[108],"Ты работаешь с существующим личным сайтом.\n\nПеред любыми изменениями:\n1. Прочитай контекст проекта и правила публикации.\n2. Проверь текущую ветку и наличие незакоммиченных изменений.\n3. Установи фактическое состояние по коду, контенту и нужному runtime,\n   а не только по старой документации.\n4. Сначала предложи минимальный план и перечисли риски.\n\nВо время работы:\n- Не выдумывай факты для публичных материалов.\n- Не публикуй сайт, не меняй production, секреты, доступы\n  или инфраструктуру без отдельной команды.\n- Не расширяй scope до соседних улучшений «заодно».\n- Сохраняй авторский голос; спорные места помечай вопросами.\n\nГотовность:\n- список изменённых файлов;\n- результат релевантных проверок;\n- проверенные пользовательские сценарии;\n- оставшиеся риски и действия, которые требуют решения автора.\n",[84,1415,1413],{"__ignoreMap":114},[12,1417,1418],{},"Такой договор делает поведение агента предсказуемым. Он не обязан быть «универсальным исполнителем, который разберётся со всем». Ему нужны ясная цель, границы и форма результата.",[19,1420,1422],{"id":1421},"готовые-промпты-для-регулярных-обновлений","Готовые промпты для регулярных обновлений",[12,1424,1425],{},"После запуска главная задача — не потерять ритм. Я бы не строил контент-план на год вперёд и не обещал публиковать по три материала в неделю. Гораздо полезнее завести простой повторяемый процесс и наполнять его реальными поводами.",[100,1427,1429],{"id":1428},"промпт-новая-заметка-или-кейс-из-рабочих-материалов","Промпт: новая заметка или кейс из рабочих материалов",[105,1431,1434],{"className":1432,"code":1433,"language":110,"meta":111},[108],"Помоги подготовить новую публикацию для личного сайта.\n\nВот исходные материалы: [вставить голосовую расшифровку, тезисы,\nзаметки, ссылки на подтверждённые материалы].\n\nСначала:\n1. Сформулируй, какую проблему читателя может закрыть публикация.\n2. Отдели подтверждённые факты от непроверенных утверждений.\n3. Покажи, чего не хватает для честного кейса или статьи.\n4. Предложи 4–6 заголовков и рекомендуемый формат:\n   заметка, разбор, кейс, инструкция или FAQ.\n\nТолько после этого подготовь структуру и черновик от первого лица.\n\nНе добавляй несуществующие цифры, клиентов, отзывы или результаты.\nНе публикуй материал и не меняй файлы.\n",[84,1435,1433],{"__ignoreMap":114},[100,1437,1439],{"id":1438},"промпт-аудит-страницы-перед-публикацией","Промпт: аудит страницы перед публикацией",[105,1441,1444],{"className":1442,"code":1443,"language":110,"meta":111},[108],"Проведи read-only аудит страницы личного сайта перед публикацией.\n\nПроверь:\n- понятна ли цель страницы в первом экране;\n- соответствует ли текст заявленной аудитории;\n- есть ли неподтверждённые обещания, числа или факты;\n- title, description, canonical URL, Open Graph и заголовки;\n- ссылки и понятность призыва к действию;\n- доступность: смысловые заголовки, alt-тексты, контраст, клавиатурная навигация;\n- отображение на мобильном и desktop;\n- нет ли лишнего усложнения или отвлекающих элементов.\n\nНе меняй файлы. Верни таблицу:\nприоритет | проблема | доказательство | рекомендуемое минимальное изменение.\nОтдельно перечисли, что уже выглядит готовым к публикации.\n",[84,1445,1443],{"__ignoreMap":114},[100,1447,1449],{"id":1448},"промпт-еженедельный-редакторский-обзор","Промпт: еженедельный редакторский обзор",[105,1451,1454],{"className":1452,"code":1453,"language":110,"meta":111},[108],"Помоги провести еженедельный обзор личного сайта.\n\nЯ дам тебе список событий недели: завершённые задачи, вопросы клиентов,\nголосовые заметки, черновики, новые проекты и изменения услуг.\n\nТвоя задача:\n1. Найти один-два реалистичных повода для обновления сайта.\n2. Для каждого предложить формат: заметка, кейс, обновление проекта,\n   FAQ или изменение страницы услуги.\n3. Объяснить пользу для посетителя.\n4. Указать, какие факты или материалы нужно подтвердить.\n5. Составить небольшой план на следующую неделю.\n\nНе придумывай темы, которых нет в материалах.\nНе публикуй и не меняй сайт.\nПриоритизируй регулярность и содержание, а не количество публикаций.\n",[84,1455,1453],{"__ignoreMap":114},[19,1457,1459],{"id":1458},"цикл-обновлений-не-ждать-большой-темы","Цикл обновлений: не ждать большой темы",[12,1461,1462],{},"Сильный материал часто начинается не с идеи «надо написать статью», а с повторяющегося рабочего момента.",[12,1464,1465],{},"Я дважды объяснил один подход в переписке. Завершил часть проекта. Получил вопрос, на который сайт пока не отвечает. Поменял формат работы. Разобрался с ошибкой, которая может быть полезна другим. Всё это поводы для обновления.",[12,1467,1468],{},"Я бы использовал такой короткий цикл:",[123,1470,1471,1477,1483,1489,1495,1501,1507],{},[126,1472,1473,1476],{},[1101,1474,1475],{},"Заметить повод."," Сохранить его голосовой заметкой, тезисом или ссылкой.",[126,1478,1479,1482],{},[1101,1480,1481],{},"Собрать исходный материал."," Расшифровать запись, приложить факты, скриншоты, документы или ссылки.",[126,1484,1485,1488],{},[1101,1486,1487],{},"Дать агенту структуру."," Попросить выделить пользу, вопросы и возможный формат.",[126,1490,1491,1494],{},[1101,1492,1493],{},"Проверить содержание."," Убрать конфиденциальное, подтвердить факты, вернуть собственную интонацию.",[126,1496,1497,1500],{},[1101,1498,1499],{},"Проверить техническую часть."," Ссылки, метаданные, мобильное отображение, форму связи, если она затронута.",[126,1502,1503,1506],{},[1101,1504,1505],{},"Опубликовать отдельным решением."," Не считать публикацию побочным эффектом редактуры.",[126,1508,1509,1512],{},[1101,1510,1511],{},"Сохранить вывод."," Если появился новый процесс, ограничение или полезный вопрос — обновить контекст сайта или checklist.",[12,1514,1515],{},"Тогда блог перестаёт быть обязанностью «вести контент» и становится способом не терять накопленный опыт.",[19,1517,1519],{"id":1518},"сила-проверки-должна-соответствовать-цене-ошибки","Сила проверки должна соответствовать цене ошибки",[12,1521,1522],{},"Не всякая правка требует одинакового ритуала. Исправить опечатку — не то же самое, что поменять форму заявки или деплой-процесс.",[37,1524,1525,1535],{},[40,1526,1527],{},[43,1528,1529,1532],{},[46,1530,1531],{},"Тип изменения",[46,1533,1534],{},"Что проверить",[53,1536,1537,1545,1553,1561,1569],{},[43,1538,1539,1542],{},[58,1540,1541],{},"Текст, иллюстрация, ссылка",[58,1543,1544],{},"Смысл, факты, орфография, рабочая ссылка и отображение",[43,1546,1547,1550],{},[58,1548,1549],{},"Новая статья или проект",[58,1551,1552],{},"Заголовок, описание, структура, SEO-метаданные, mobile и desktop",[43,1554,1555,1558],{},[58,1556,1557],{},"Навигация или интерфейс",[58,1559,1560],{},"Главный пользовательский маршрут, адаптивность, доступность, ссылки",[43,1562,1563,1566],{},[58,1564,1565],{},"Форма или интеграция",[58,1567,1568],{},"Отправка данных, ошибка, защита, доставка заявки и сообщение пользователю",[43,1570,1571,1574],{},[58,1572,1573],{},"Сервер и production-процесс",[58,1575,1576],{},"Точный revision, резервная точка, health-check и проверка публичного маршрута",[12,1578,1579],{},"Это не бюрократия, а способ не тратить час на проверку одной запятой и не публиковать важное изменение со словами «вроде работает».",[12,1581,1582],{},"Особенно важно не давать AI-агенту больше полномочий, чем ему действительно нужны. Для подготовки черновика не нужен доступ к production. Для аудита SEO не нужны секреты. Для проверки страницы часто достаточно read-only доступа и списка маршрутов.",[12,1584,1585],{},"Если ошибка повторилась, я бы не ограничивался новой формулировкой промпта. Лучше оставить защиту: checklist, тест, правило в проектном контексте или короткую инструкцию по проверке. Тогда следующий человек или агент начинает не с той же ошибки, а с опыта, который уже стал частью процесса.",[19,1587,1589],{"id":1588},"что-можно-сделать-в-первую-неделю","Что можно сделать в первую неделю",[12,1591,1592],{},"Запуск не обязательно растягивать на месяцы. Если есть решение и исходные материалы, за первую неделю можно собрать рабочую основу.",[37,1594,1595,1605],{},[40,1596,1597],{},[43,1598,1599,1602],{},[46,1600,1601],{},"День",[46,1603,1604],{},"Результат",[53,1606,1607,1615,1623,1631,1639,1647,1655],{},[43,1608,1609,1612],{},[58,1610,1611],{},"1",[58,1613,1614],{},"Бриф: роль сайта, аудитория, главное действие посетителя",[43,1616,1617,1620],{},[58,1618,1619],{},"2",[58,1621,1622],{},"Карта разделов и три–пять пользовательских сценариев",[43,1624,1625,1628],{},[58,1626,1627],{},"3",[58,1629,1630],{},"Голосовые заметки или черновики для главной, проектов и контактов",[43,1632,1633,1636],{},[58,1634,1635],{},"4",[58,1637,1638],{},"Структура контента и выбор технической основы: Nuxt, домен, VPS или сервер",[43,1640,1641,1644],{},[58,1642,1643],{},"5",[58,1645,1646],{},"Первая версия страниц и проверка на телефоне и компьютере",[43,1648,1649,1652],{},[58,1650,1651],{},"6",[58,1653,1654],{},"Формы, ссылки, базовые SEO-метаданные, доступность и резервная стратегия",[43,1656,1657,1660],{},[58,1658,1659],{},"7",[58,1661,1662],{},"Публикация подготовленной версии, public smoke-проверка и список следующих обновлений",[12,1664,1665],{},"У кого-то первый сайт будет состоять из одной сильной страницы и контактов. У кого-то сразу появятся проекты и несколько заметок. Это нормально. Важнее не количество разделов, а наличие публичного маршрута: человек открывает ссылку, понимает предложение, видит подтверждения и знает, что делать дальше.",[19,1667,1669],{"id":1668},"личный-сайт-становится-сильнее-от-накопления-доверия","Личный сайт становится сильнее от накопления доверия",[12,1671,1672],{},"AI сделал производство текста и кода быстрым. Поэтому особенно заметной становится разница между просто заполненным сайтом и сайтом, в котором есть живой опыт.",[12,1674,1675],{},"Второй не пытается убедить посетителя множеством громких слов. Он постепенно показывает: вот что я делаю, вот как думаю, вот какие вопросы разбираю, вот что изменилось с прошлого раза, вот как со мной можно продолжить разговор.",[12,1677,1678],{},"Голосовые заметки помогают не терять материал в моменте. AI-помощник помогает превратить его в структуру, черновик и проверяемый процесс. Nuxt и контролируемый сервер дают техническую основу, на которой сайт можно спокойно развивать, а не собирать заново при каждой новой задаче.",[12,1680,1681],{},"Но главный актив всё равно не стек и не количество агентов. Это ясный голос автора, реальные факты и привычка возвращаться к сайту с новым содержанием.",[12,1683,1684],{},"Я бы не ждал идеальной версии. Лучше начать с небольшой честной площадки, настроить безопасный цикл обновлений и оставить на ней место для следующей мысли — возможно, уже записанной сегодня в диктофон.",[12,1686,1687,1688,1690],{},"Если вы хотите запустить личный сайт или привести в порядок тот, который давно не обновлялся, ",[269,1689,634],{"href":271},". Для начала разберём роль сайта, соберём реальные материалы и определим первую версию, которую можно спокойно развивать.",[1692,1693,1694],"style",{},"html pre.shiki code .sq-ep, html code.shiki .sq-ep{--shiki-default:#005CC5;--shiki-default-font-weight:bold;--shiki-dark:#79B8FF;--shiki-dark-font-weight:bold}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .s4XuR, html code.shiki .s4XuR{--shiki-default:#E36209;--shiki-dark:#FFAB70}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":114,"searchDepth":275,"depth":275,"links":1696},[1697,1698,1699,1700,1703,1706,1709,1710,1711,1712,1715,1720,1721,1722,1723],{"id":679,"depth":275,"text":680},{"id":703,"depth":275,"text":704},{"id":733,"depth":275,"text":734},{"id":808,"depth":275,"text":809,"children":1701},[1702],{"id":855,"depth":281,"text":856},{"id":868,"depth":275,"text":869,"children":1704},[1705],{"id":901,"depth":281,"text":902},{"id":914,"depth":275,"text":915,"children":1707},[1708],{"id":992,"depth":281,"text":993},{"id":1002,"depth":275,"text":1003},{"id":1072,"depth":275,"text":1073},{"id":1135,"depth":275,"text":1136},{"id":1188,"depth":275,"text":1189,"children":1713},[1714],{"id":1408,"depth":281,"text":1409},{"id":1421,"depth":275,"text":1422,"children":1716},[1717,1718,1719],{"id":1428,"depth":281,"text":1429},{"id":1438,"depth":281,"text":1439},{"id":1448,"depth":281,"text":1449},{"id":1458,"depth":275,"text":1459},{"id":1518,"depth":275,"text":1519},{"id":1588,"depth":275,"text":1589},{"id":1668,"depth":275,"text":1669},"2026-08-12","Как запустить сайт личного бренда с AI-помощниками: от голосовой заметки и первой версии до Nuxt, VPS и безопасного цикла обновлений.",{},"\u002Fblog\u002F2026-08-12-lichnyy-sayt-ai-agenty",{"title":659,"description":1725},"Личный сайт и AI-агенты: запуск и обновления","blog\u002F2026-08-12-lichnyy-sayt-ai-agenty",[302,1732,1733,299,1734],"сайт","личный бренд","контент","1mag4GKjfAApBFcZYVIEnmVkXm2jMWon7oGjPpmm-fM",{"id":1737,"title":1738,"acrostic":7,"body":1739,"date":2635,"description":2636,"duration":7,"emoji":7,"extension":290,"faq":7,"featured":291,"format":7,"image":7,"level":7,"media":7,"meta":2637,"navigation":293,"path":2638,"price":7,"schedule":7,"seo":2639,"seoTitle":7,"serviceType":7,"status":7,"stem":2640,"tags":2641,"tech":7,"toc":293,"url":7,"__hash__":2645},"blog\u002Fblog\u002F2026-08-11-ai-upravlenie-razrabotkoj.md","Управление разработкой с AI-агентом: контекст вместо задач",{"type":9,"value":1740,"toc":2609},[1741,1744,1747,1750,1753,1758,1761,1764,1770,1772,1786,1790,1793,1796,1799,1802,1805,1808,1822,1829,1833,1836,1839,1842,1845,1851,1854,1857,1863,1866,1880,1883,1887,1890,1897,1900,1903,1923,1926,1929,1934,1940,1944,1947,1950,1953,2007,2010,2013,2016,2019,2022,2026,2029,2033,2036,2050,2053,2056,2060,2063,2066,2069,2073,2076,2079,2099,2102,2106,2109,2112,2115,2141,2144,2148,2151,2154,2157,2160,2192,2196,2199,2202,2205,2208,2261,2264,2269,2272,2276,2279,2282,2285,2291,2344,2347,2350,2354,2357,2364,2367,2411,2414,2417,2420,2423,2427,2430,2433,2436,2442,2445,2448,2451,2455,2458,2464,2467,2470,2476,2479,2482,2489,2493,2496,2499,2519,2522,2525,2529,2533,2536,2540,2543,2547,2550,2554,2557,2560,2580,2583,2588,2591,2594,2597,2606],[12,1742,1743],{},"Компании покупают лицензии, объявляют AI-стратегии, считают токены и показывают красивые демо. Потом оказывается, что пользователи не пришли, продукт не решает их задачу, а за результат как будто никто не отвечает: он потерялся между презентацией, подрядчиком и чат-ботом.",[12,1745,1746],{},"Проблема часто не в самой модели, а в слабом управлении разработкой. Если в обычном проекте неясно, что именно строят, для кого и как будут проверять результат, AI этого не исправит. Он лишь позволит ошибаться быстрее.",[12,1748,1749],{},"У меня был другой путь. Я не «внедрял AI в компанию» и не измерял эффективность числом сгенерированных строк. Я начал использовать AI-агента как постоянного участника разработки. Он может исследовать, выполнять ограниченные задачи, проводить ревью, а иногда выступает неприятным собеседником, который заставляет ещё раз объяснить, чего именно я хочу.",[12,1751,1752],{},"И довольно быстро понял простую вещь:",[402,1754,1755],{},[12,1756,1757],{},"AI не отменяет управление разработкой. С ним слабые места управления просто становятся заметнее.",[12,1759,1760],{},"Раньше часть управления можно было держать в голове. Сильному разработчику достаточно сказать: «посмотри, почему не работает фильтр» — и он сам поймёт, в каком сервисе искать, что не трогать, какие данные опасны и где проверить результат.",[12,1762,1763],{},"Агент этого не знает. Не потому, что он глупый. Он просто не живёт внутри моего проекта: не помнит вчерашний разговор у кофемашины, не знает, почему сервер нельзя трогать в середине дня, и не чувствует затылком, что фраза «давайте заодно обновим зависимости» сейчас пахнет трёхдневным приключением.",[12,1765,1766,1767,132],{},"Поэтому я иначе стал ставить задачи. Для каждой заметной работы я собираю ",[1101,1768,1769],{},"цель, контекст, ограничения и доказательство готовности",[19,1771,680],{"id":679},[350,1773,1774,1777,1780,1783],{},[126,1775,1776],{},"AI одинаково ускоряет порядок и хаос.",[126,1778,1779],{},"Задача для AI-агента должна описывать цель, подтверждённый контекст, границы и доказательство готовности.",[126,1781,1782],{},"Перед production нужен не «зелёный билд», а точный revision, health-check и пользовательская проверка.",[126,1784,1785],{},"Повторившаяся ошибка должна оставлять защиту: тест, инвариант, runbook или обновлённый контекст.",[19,1787,1789],{"id":1788},"ai-ускоряет-и-порядок-и-беспорядок","AI ускоряет и порядок, и беспорядок",[12,1791,1792],{},"Есть удобная сказка: достаточно дать команде хороший AI-инструмент, и производительность вырастет сама. В этой сказке нейросеть сидит рядом, мгновенно пишет код, тесты, документацию и, вероятно, ещё слегка массирует плечи перед релизом.",[12,1794,1795],{},"В реальности AI ускоряет не только полезную работу.",[12,1797,1798],{},"Когда задача сформулирована ясно, агент быстро помогает изучить код, увидеть риски, написать тест, подготовить небольшой патч и проверить его. Если задача туманная, он с такой же скоростью создаёт несколько правдоподобных вариантов неправильного решения.",[12,1800,1801],{},"Если в проекте есть актуальные документы, агент опирается на них и меньше изобретает архитектуру заново. Если документация устарела, он уверенно цитирует вчерашний мир. Это не злой умысел. Просто модель не умеет отличать «документ лежит рядом с кодом» от «документ всё ещё правда» без проверки.",[12,1803,1804],{},"Если у процесса есть понятные ворота перед production, AI помогает проходить их быстрее. Если таких ограничений нет, он может быстро сделать то, чего делать было нельзя.",[12,1806,1807],{},"Поэтому я не считаю, что AI делает разработку проще. Он ускоряет то, что уже есть:",[350,1809,1810,1813,1816,1819],{},[126,1811,1812],{},"ясный процесс;",[126,1814,1815],{},"работающий порядок;",[126,1817,1818],{},"хаос;",[126,1820,1821],{},"последствия плохо поставленной задачи.",[12,1823,1824,1825,1828],{},"Поэтому разговор об AI в разработке для меня начинается с вопроса: ",[1101,1826,1827],{},"как у нас устроено принятие решений?"," Выбор модели идёт после.",[19,1830,1832],{"id":1831},"от-сделай-фичу-к-какое-изменение-мы-хотим-получить","От «сделай фичу» к «какое изменение мы хотим получить?»",[12,1834,1835],{},"Фраза «сделай авторизацию» кажется задачей. На самом деле это название целого леса, в котором ещё не проложена ни одна тропинка.",[12,1837,1838],{},"Для кого авторизация? Какие роли существуют? Какие действия должен видеть пользователь, а какие — сервис? Где заканчивается публичный маршрут и начинается внутренний? Можно ли менять существующий контракт? Что происходит со старыми сессиями? Как проверить, что чужой пользователь не получил доступ? И, наконец, можно ли сегодня вообще трогать production?",[12,1840,1841],{},"Пока на эти вопросы нет ответа, агенту нельзя давать задачу: иначе он начнёт отвечать за меня.",[12,1843,1844],{},"Плохая постановка выглядит так:",[105,1846,1849],{"className":1847,"code":1848,"language":110,"meta":111},[108],"Добавь авторизацию и задеплой.\n",[84,1850,1848],{"__ignoreMap":114},[12,1852,1853],{},"В ней нет цели, нет границ и нет критерия результата. Есть только глагол, который может означать двадцать разных решений.",[12,1855,1856],{},"Нормальная постановка устроена иначе:",[105,1858,1861],{"className":1859,"code":1860,"language":110,"meta":111},[108],"Нужно закрыть один конкретный сценарий записи данных:\nизменять запись может только её владелец.\n\nСначала установи текущий контракт по коду, тестам и runtime.\nНе расширяй права «на всякий случай» и не меняй публичные маршруты.\nСначала добавь проверку, что другой пользователь получает отказ.\nProduction не трогай.\n\nГотовность: целевой тест, сборка затронутого пакета,\nпроверка diff и список изменённых контрактов.\n",[84,1862,1860],{"__ignoreMap":114},[12,1864,1865],{},"Это не «магический промпт» и не набор волшебных слов. Здесь зафиксировано управленческое решение:",[350,1867,1868,1871,1874,1877],{},[126,1869,1870],{},"какой риск я закрываю;",[126,1872,1873],{},"что считаю допустимой границей изменения;",[126,1875,1876],{},"каким будет доказательство результата;",[126,1878,1879],{},"какое действие сейчас запрещено.",[12,1881,1882],{},"Если я не могу это сформулировать, дело обычно не в агенте. Скорее всего, я сам ещё не разобрался с задачей.",[19,1884,1886],{"id":1885},"хорошая-задача-начинается-с-контекста","Хорошая задача начинается с контекста",[12,1888,1889],{},"Человек в команде часто накапливает контекст годами. Он знает, где находится код, как устроен релиз, почему нельзя чистить эту таблицу и какой endpoint на самом деле проверяет пользователь.",[12,1891,1892,1893,1896],{},"Агент приходит в проект почти как новый сотрудник. Только он очень быстро и без устали читает то количество файлов, которое человек обычно откладывает «на потом». И да, иногда ему приходится отдельно объяснять, что документацию надо читать ",[1101,1894,1895],{},"до"," того, как он начнёт уверенно чинить то, чего не понял.",[12,1898,1899],{},"У меня это стало почти ритуалом.",[12,1901,1902],{},"Перед заметной задачей агент сначала должен выяснить:",[123,1904,1905,1908,1911,1914,1917,1920],{},[126,1906,1907],{},"где он находится;",[126,1909,1910],{},"какой репозиторий и какая ветка являются рабочими;",[126,1912,1913],{},"есть ли незакоммиченные изменения;",[126,1915,1916],{},"где лежит подтверждённый контекст проекта;",[126,1918,1919],{},"что говорит актуальный план;",[126,1921,1922],{},"что реально происходит в коде, данных и runtime.",[12,1924,1925],{},"Последний пункт важнее остальных. В документации может быть написано, что система работает на одной версии. В Git может лежать другая. На сервере — третья. А пользователь может открыть четвёртую, потому что у него закешировалась старая страница или он вообще смотрит не на то окружение.",[12,1927,1928],{},"Поэтому я стараюсь держаться правила:",[402,1930,1931],{},[12,1932,1933],{},"Память, старый план и уверенный ответ агента не доказывают ничего. Опираться нужно на проверяемое состояние кода, данных и работающей системы.",[12,1935,1936,1937,132],{},"Это не значит, что документации нельзя доверять. Хорошая документация помогает быстро понять, ",[1101,1938,1939],{},"что проверить и зачем",[19,1941,1943],{"id":1942},"документация-которую-действительно-читают","Документация, которую действительно читают",[12,1945,1946],{},"Существует старый жанр инженерного юмора: документация — это место, куда информация уходит, чтобы никогда не вернуться.",[12,1948,1949],{},"С агентами у меня получилось чуть иначе. Документация стала рабочим инструментом, а не приложением к проекту.",[12,1951,1952],{},"У каждого заметного продукта есть несколько разных типов знания.",[37,1954,1955,1965],{},[40,1956,1957],{},[43,1958,1959,1962],{},[46,1960,1961],{},"Что нужно узнать",[46,1963,1964],{},"Где это должно быть зафиксировано",[53,1966,1967,1975,1983,1991,1999],{},[43,1968,1969,1972],{},[58,1970,1971],{},"Что подтверждено и принято",[58,1973,1974],{},"Краткий актуальный контекст проекта",[43,1976,1977,1980],{},[58,1978,1979],{},"Что делать дальше",[58,1981,1982],{},"Текущий план или backlog",[43,1984,1985,1988],{},[58,1986,1987],{},"Почему было принято старое решение",[58,1989,1990],{},"Исторический план или журнал решений",[43,1992,1993,1996],{},[58,1994,1995],{},"Как безопасно провести операцию",[58,1997,1998],{},"Runbook, deploy-инструкция, troubleshooting",[43,2000,2001,2004],{},[58,2002,2003],{},"Что однажды уже сломалось",[58,2005,2006],{},"Gotcha, тест, инвариант, проверочный сценарий",[12,2008,2009],{},"Важно не смешивать эти слои.",[12,2011,2012],{},"Исторический план — это не приказ продолжать работу с места, где остановились полгода назад. Он может объяснить, почему архитектура выглядит именно так. Но текущую задачу надо начинать с того, что реально подтверждено сегодня.",[12,2014,2015],{},"Документ со списком прошлых релизов — не замена проверке production. Он полезен, чтобы понимать, что спросить у системы. Но всё равно нужно посмотреть текущий revision, состояние процессов, health-check и нужный пользовательский маршрут.",[12,2017,2018],{},"Агент умеет быстро читать много, но это не повод читать всё подряд. Я задаю порядок: правила проекта, актуальный контекст, текущий план, затем код и состояние работающей системы.",[12,2020,2021],{},"Похоже, я наконец нашёл читателя для технической документации.",[19,2023,2025],{"id":2024},"пять-слоёв-постановки-задачи","Пять слоёв постановки задачи",[12,2027,2028],{},"Со временем у меня сложилась простая конструкция. Почти любую работу с агентом можно проверить по пяти слоям.",[100,2030,2032],{"id":2031},"_1-цель","1. Цель",[12,2034,2035],{},"Не «добавить кнопку», а ответить на вопросы:",[350,2037,2038,2041,2044,2047],{},[126,2039,2040],{},"кто получает новое действие;",[126,2042,2043],{},"какую проблему оно решает;",[126,2045,2046],{},"что меняется в пользовательском сценарии;",[126,2048,2049],{},"что сознательно не входит в задачу.",[12,2051,2052],{},"Например, цель может звучать так: «пользователь должен видеть понятную причину отказа и знать, что делать дальше». Это лучше, чем «сделай красивое уведомление».",[12,2054,2055],{},"В первой формулировке есть результат. Во второй — только эстетическое пожелание, которое можно трактовать бесконечно.",[100,2057,2059],{"id":2058},"_2-реальность","2. Реальность",[12,2061,2062],{},"До плана нужно установить факты.",[12,2064,2065],{},"Не «вроде бы сервис использует такую-то очередь», а проверить код и состояние системы. Не «кажется, endpoint защищён», а посмотреть маршрут, policy, тест и фактический HTTP-ответ. Не «релиз уже выкачен», а сверить revision и публичный маршрут.",[12,2067,2068],{},"Этот этап иногда выглядит как потеря времени. Особенно когда хочется немедленно дать агенту команду «исправляй». Но именно он спасает от классического сценария: три часа мы лечили проблему в одном окружении, а пользователь всё это время работал в другом.",[100,2070,2072],{"id":2071},"_3-границы","3. Границы",[12,2074,2075],{},"В хорошей задаче нужно назвать и то, что сделать, и то, чего делать нельзя.",[12,2077,2078],{},"Например:",[350,2080,2081,2084,2087,2090,2093,2096],{},[126,2082,2083],{},"не трогать production без отдельного решения;",[126,2085,2086],{},"не менять инфраструктуру ради удобства одного патча;",[126,2088,2089],{},"не удалять данные широким запросом;",[126,2091,2092],{},"не раскрывать конфигурацию и секреты;",[126,2094,2095],{},"не исправлять соседние подсистемы «заодно»;",[126,2097,2098],{},"не стирать чужие незакоммиченные изменения.",[12,2100,2101],{},"Границы особенно важны потому, что агент очень охотно помогает. Иногда настолько охотно, что начинает чинить не только указанную проблему, но и весь мир вокруг неё. Для человека это называют инициативностью. В работе с агентом это повод ещё раз проверить границы задачи.",[100,2103,2105],{"id":2104},"_4-доказательство-готовности","4. Доказательство готовности",[12,2107,2108],{},"Фразы «код написан» недостаточно.",[12,2110,2111],{},"«Тест прошёл» — тоже не всегда готовность.",[12,2113,2114],{},"В зависимости от задачи доказательство может включать:",[350,2116,2117,2120,2123,2126,2129,2132,2135,2138],{},[126,2118,2119],{},"regression test на конкретный контракт;",[126,2121,2122],{},"сборку затронутого приложения;",[126,2124,2125],{},"проверку API или очереди;",[126,2127,2128],{},"подтверждённое состояние в базе;",[126,2130,2131],{},"desktop- и mobile-проверку публичного сценария;",[126,2133,2134],{},"независимый review;",[126,2136,2137],{},"exact revision на сервере;",[126,2139,2140],{},"возможность отката.",[12,2142,2143],{},"Список не должен быть длинным. Он должен соответствовать риску. Для текстовой правки не нужен военный совет. Для изменения авторизации или записи данных недостаточно фразы «вроде работает».",[100,2145,2147],{"id":2146},"_5-след-знания","5. След знания",[12,2149,2150],{},"После заметной работы результат не должен оставаться только в чате.",[12,2152,2153],{},"Если выяснилось новое ограничение — оно попадает в документ или runbook. Если найден опасный сценарий — появляется тест. Если повторяется диагностический путь — он сохраняется как процедура. Если обновился контракт — это отражается в актуальном контексте.",[12,2155,2156],{},"Так появляется память разработки, а не склад заметок. В следующий раз агент не начинает заново из археологических раскопок, а я не пытаюсь вспомнить, почему месяц назад мы запретили «простое» решение.",[12,2158,2159],{},"Эти слои лучше работают не как чек-лист в конце, а как последовательность принятия решения:",[105,2161,2165],{"className":2162,"code":2163,"language":2164,"meta":114,"style":114},"language-mermaid shiki shiki-themes github-light github-dark","flowchart TB\n  goal[1 · Цель] --> facts[2 · Проверенные факты]\n  facts --> scope[3 · Границы изменения]\n  scope --> proof[4 · Доказательство готовности]\n  proof --> memory[5 · След знания]\n","mermaid",[84,2166,2167,2172,2177,2182,2187],{"__ignoreMap":114},[1211,2168,2169],{"class":1213,"line":1214},[1211,2170,2171],{},"flowchart TB\n",[1211,2173,2174],{"class":1213,"line":275},[1211,2175,2176],{},"  goal[1 · Цель] --> facts[2 · Проверенные факты]\n",[1211,2178,2179],{"class":1213,"line":281},[1211,2180,2181],{},"  facts --> scope[3 · Границы изменения]\n",[1211,2183,2184],{"class":1213,"line":1231},[1211,2185,2186],{},"  scope --> proof[4 · Доказательство готовности]\n",[1211,2188,2189],{"class":1213,"line":1238},[1211,2190,2191],{},"  proof --> memory[5 · След знания]\n",[19,2193,2195],{"id":2194},"агент-не-должен-быть-универсальным-исполнителем","Агент не должен быть универсальным исполнителем",[12,2197,2198],{},"Самый опасный запрос к AI звучит просто: «разберись со всем».",[12,2200,2201],{},"Иногда я тоже так думаю. Особенно когда вижу старый сервис, несколько слоёв документации, очередь, фоновые задачи, непонятное состояние данных и один маленький баг, который почему-то не хочет быть маленьким.",[12,2203,2204],{},"Но в таких случаях универсальный агент быстро становится универсальным источником правдоподобных объяснений. Он может найти десять мест, которые «похожи на проблему», предложить большую переработку и даже честно написать, что всё проверил. А потом окажется, что главный сценарий никто не запускал.",[12,2206,2207],{},"Поэтому я разделяю роли.",[37,2209,2210,2219],{},[40,2211,2212],{},[43,2213,2214,2217],{},[46,2215,2216],{},"Роль",[46,2218,51],{},[53,2220,2221,2229,2237,2245,2253],{},[43,2222,2223,2226],{},[58,2224,2225],{},"Исследователь",[58,2227,2228],{},"Собирает факты о коде, документации, данных и runtime",[43,2230,2231,2234],{},[58,2232,2233],{},"Исполнитель",[58,2235,2236],{},"Делает ограниченное изменение в согласованном scope",[43,2238,2239,2242],{},[58,2240,2241],{},"Ревьюер",[58,2243,2244],{},"Ищет пропущенные контракты, риски и слабые проверки",[43,2246,2247,2250],{},[58,2248,2249],{},"Принимающий",[58,2251,2252],{},"Независимо подтверждает, что результат действительно работает",[43,2254,2255,2258],{},[58,2256,2257],{},"Ведущий",[58,2259,2260],{},"Связывает цель, риск, архитектуру и решение владельца продукта",[12,2262,2263],{},"Иногда все эти роли выполняет один агент в несколько заходов. Иногда для независимости полезно разделить их. Но смысл остаётся: результат исполнителя не должен автоматически становиться истиной только потому, что он звучит убедительно.",[402,2265,2266],{},[12,2267,2268],{},"Отчёт агента — это гипотеза до тех пор, пока она не подтверждена кодом, тестом, системой или независимой проверкой.",[12,2270,2271],{},"Особенно это относится к авторизации, данным, платежам, очередям, внешним интеграциям и production.",[19,2273,2275],{"id":2274},"почему-скорость-не-равна-отмене-проверок","Почему скорость не равна отмене проверок",[12,2277,2278],{},"Есть две одинаково вредные крайности.",[12,2280,2281],{},"Первая: запускать полный набор проверок после каждой запятой в документации. Это выглядит строго, но постепенно превращает разработку в ритуал. Люди и агенты начинают ждать завершения тяжёлых процессов, не понимая, что именно они проверяют.",[12,2283,2284],{},"Вторая: «быстро сделать, потом разберёмся». Это обычно означает, что разбираться будут уже с последствиями — в логах, в базе, в рабочее время и в чужом настроении.",[12,2286,2287,2288,132],{},"Я стараюсь использовать третий вариант: ",[1101,2289,2290],{},"сила проверки должна соответствовать цене ошибки",[37,2292,2293,2302],{},[40,2294,2295],{},[43,2296,2297,2299],{},[46,2298,1531],{},[46,2300,2301],{},"Что достаточно проверить",[53,2303,2304,2312,2320,2328,2336],{},[43,2305,2306,2309],{},[58,2307,2308],{},"Документация или изолированный текст",[58,2310,2311],{},"Diff и непротиворечивость фактам",[43,2313,2314,2317],{},[58,2315,2316],{},"Локальная бизнес-логика",[58,2318,2319],{},"Точный regression test и сборка затронутого компонента",[43,2321,2322,2325],{},[58,2323,2324],{},"Публичный интерфейс",[58,2326,2327],{},"Нужный пользовательский flow на desktop и mobile",[43,2329,2330,2333],{},[58,2331,2332],{},"Очередь, writer, данные",[58,2334,2335],{},"Инварианты, состояние в базе, защита от частичной записи",[43,2337,2338,2341],{},[58,2339,2340],{},"Авторизация, деньги, production",[58,2342,2343],{},"Exact revision, независимый review, rollback и runtime smoke",[12,2345,2346],{},"Это не означает, что я всегда угадываю идеальный набор проверок. Но сама постановка вопроса меняет работу.",[12,2348,2349],{},"Не «как заставить агента сделать всё быстро?», а «какая ошибка здесь будет самой дорогой и как её поймать раньше пользователя?»",[19,2351,2353],{"id":2352},"production-это-не-место-для-продолжения-разработки","Production — это не место для продолжения разработки",[12,2355,2356],{},"Отдельная дисциплина нужна для релизов.",[12,2358,2359,2360,2363],{},"Когда система работает для пользователей, нельзя считать успехом ни ",[84,2361,2362],{},"git push",", ни зелёную сборку, ни сообщение process manager-а «online». Все эти вещи полезны, но каждая доказывает только свою маленькую часть истории.",[12,2365,2366],{},"Рабочая цепочка выглядит примерно так:",[105,2368,2370],{"className":2162,"code":2369,"language":2164,"meta":114,"style":114},"flowchart TB\n  change[Локальное изменение] --> checks[Проверка]\n  checks --> revision[Зафиксированный revision]\n  revision --> candidate[Точный release candidate]\n  candidate --> switch[Атомарное переключение]\n  switch --> health[Health-check]\n  health --> smoke[Пользовательский smoke]\n  smoke --> rollback[Возможность rollback]\n",[84,2371,2372,2376,2381,2386,2391,2396,2401,2406],{"__ignoreMap":114},[1211,2373,2374],{"class":1213,"line":1214},[1211,2375,2171],{},[1211,2377,2378],{"class":1213,"line":275},[1211,2379,2380],{},"  change[Локальное изменение] --> checks[Проверка]\n",[1211,2382,2383],{"class":1213,"line":281},[1211,2384,2385],{},"  checks --> revision[Зафиксированный revision]\n",[1211,2387,2388],{"class":1213,"line":1231},[1211,2389,2390],{},"  revision --> candidate[Точный release candidate]\n",[1211,2392,2393],{"class":1213,"line":1238},[1211,2394,2395],{},"  candidate --> switch[Атомарное переключение]\n",[1211,2397,2398],{"class":1213,"line":1244},[1211,2399,2400],{},"  switch --> health[Health-check]\n",[1211,2402,2403],{"class":1213,"line":1249},[1211,2404,2405],{},"  health --> smoke[Пользовательский smoke]\n",[1211,2407,2408],{"class":1213,"line":1255},[1211,2409,2410],{},"  smoke --> rollback[Возможность rollback]\n",[12,2412,2413],{},"Я сознательно стараюсь не «доделывать на сервере». Сервер не должен становиться местом, где пишется код, исправляется lockfile, создаётся коммит или принимается архитектурное решение в полночь под давлением ошибки.",[12,2415,2416],{},"Production должен применять уже подготовленный релиз. И этот релиз должен иметь точный идентификатор: вот revision, вот сборка, вот проверка, вот предыдущая рабочая точка, к которой можно вернуться.",[12,2418,2419],{},"Такой подход кажется медленнее ровно до первого случая, когда нужно понять: пользователь видит новый код или старый? Система упала из-за релиза или проблема была раньше? Что именно откатывать? Есть ли у нас вообще куда откатываться?",[12,2421,2422],{},"После этого словосочетание «давайте быстро поправим на сервере» начинает звучать как предложение чинить проводку мокрыми руками. Возможно, получится. Но лучше сначала выключить питание.",[19,2424,2426],{"id":2425},"промпт-часть-инженерной-системы","Промпт — часть инженерной системы",[12,2428,2429],{},"Когда говорят о prompt engineering, часто представляют удачную формулировку, которая заставляет модель выдать нужный ответ с первого раза.",[12,2431,2432],{},"В разработке мне важнее другое. Промпт — это форма, в которой я фиксирую управленческое решение. Он не должен быть красивым. Он должен быть проверяемым.",[12,2434,2435],{},"Например, рабочее задание агенту может выглядеть так:",[105,2437,2440],{"className":2438,"code":2439,"language":110,"meta":111},[108],"Контекст:\n- это существующий работающий сервис;\n- в рабочем дереве могут быть чужие изменения;\n- документация описывает подтверждённое состояние,\n  но перед действиями её нужно сверить с кодом и runtime.\n\nЗадача:\n- устранить причину конкретного симптома;\n- не расширять scope до соседних подсистем.\n\nПорядок:\n1. Собери evidence и назови root cause.\n2. Добавь или уточни проверку, которая ловит регрессию.\n3. Сделай минимальное изменение.\n4. Выполни только релевантные проверки.\n5. Верни изменённые файлы, доказательство результата,\n   ограничения и оставшиеся риски.\n\nЗапрещено:\n- production deploy;\n- работа с секретами;\n- массовые изменения данных;\n- изменение инфраструктуры без отдельной команды.\n",[84,2441,2439],{"__ignoreMap":114},[12,2443,2444],{},"В таком тексте нет просьбы «будь экспертом мирового уровня». Я не прошу агента «проявить инициативу» и не заставляю его писать эссе о том, как прекрасно он понял задачу.",[12,2446,2447],{},"Я задаю ему рабочую среду: вот цель, вот порядок, вот границы, вот форма результата.",[12,2449,2450],{},"А ещё я могу сказать самое полезное: «остановись перед следующим опасным действием». Агент не обидится, не закатит глаза и не скажет, что ему нужно больше доверять. Он просто остановится. В мире разработки это недооценённое качество.",[19,2452,2454],{"id":2453},"после-ошибки-нужен-не-новый-промпт-а-новая-защита","После ошибки нужен не новый промпт, а новая защита",[12,2456,2457],{},"Когда агент делает неверный шаг, очень легко начать бесконечный цикл:",[105,2459,2462],{"className":2460,"code":2461,"language":110,"meta":114},[108],"Не сработало → попробуй ещё → не сработало → попробуй по-другому.\n",[84,2463,2461],{"__ignoreMap":114},[12,2465,2466],{},"Иногда второй заход действительно нужен. Но если ошибка повторяется, проблема обычно уже не в конкретной формулировке. Значит, в системе отсутствует защита.",[12,2468,2469],{},"Я стараюсь разбирать такие случаи иначе:",[105,2471,2474],{"className":2472,"code":2473,"language":110,"meta":114},[108],"Симптом\n→ факты\n→ root cause\n→ минимальное исправление\n→ regression test или инвариант\n→ обновлённый контекст\n",[84,2475,2473],{"__ignoreMap":114},[12,2477,2478],{},"Например, если однажды выяснилось, что фоновая задача может завершиться без ошибки, но не выполнить полезную работу, недостаточно просто поправить обработчик. Нужно добавить проверку её реального результата.",[12,2480,2481],{},"Если можно перепутать окружения, нужен предохранитель, который заставит сначала подтвердить цель действия. Если deploy-скрипт может взять не тот revision, ему нужен exact-SHA контракт. Если документ расходится с кодом, нужно не только исправить документ, но и понять, почему он перестал обновляться.",[12,2483,2484,2485,2488],{},"В этом месте AI особенно полезен. Он умеет быстро помочь превратить разовый урок в тест, правило, runbook или проверку. Но решение о том, ",[1101,2486,2487],{},"какая защита действительно нужна",", остаётся за мной.",[19,2490,2492],{"id":2491},"чего-ai-не-решает","Чего AI не решает",[12,2494,2495],{},"Важно не превратить всё это в новую форму AI-оптимизма.",[12,2497,2498],{},"Агент не знает автоматически:",[350,2500,2501,2504,2507,2510,2513,2516],{},[126,2502,2503],{},"какой продукт нужен людям;",[126,2505,2506],{},"какой риск допустим для бизнеса;",[126,2508,2509],{},"когда стоит отказаться от идеи;",[126,2511,2512],{},"что можно считать достаточным доказательством;",[126,2514,2515],{},"какая часть старой системы ценна, а какая давно просится на покой;",[126,2517,2518],{},"почему пользователь недоволен, даже если формально все тесты зелёные.",[12,2520,2521],{},"Он также не заменяет обратную связь от живых людей. Можно идеально организовать pipeline, покрыть тестами контракты, написать прекрасную документацию — и всё равно построить вещь, которая никому не нужна.",[12,2523,2524],{},"AI не отменяет продуктовую ответственность. Он лишь делает дороже попытку от неё спрятаться.",[19,2526,2528],{"id":2527},"вопросы-и-ответы","Вопросы и ответы",[100,2530,2532],{"id":2531},"как-ставить-задачи-ai-агенту-в-разработке","Как ставить задачи AI-агенту в разработке?",[12,2534,2535],{},"Сначала назвать цель и риск, затем дать агенту проверяемый контекст, границы изменения и критерий готовности. Короткая команда может быть началом разговора, но не заменяет постановку задачи.",[100,2537,2539],{"id":2538},"почему-ai-агенту-недостаточно-короткого-промпта","Почему AI-агенту недостаточно короткого промпта?",[12,2541,2542],{},"Агент не живёт внутри проекта: он не знает актуальное состояние кода, данных, окружений и старых ограничений, пока это не подтверждено. Без контекста он вынужден выбирать важные ответы вместо владельца задачи.",[100,2544,2546],{"id":2545},"как-безопасно-использовать-ai-при-production-deploy","Как безопасно использовать AI при production deploy?",[12,2548,2549],{},"Сначала подготовить и проверить конкретный revision вне production. Затем применять только этот revision, фиксировать health-check и отдельно проходить пользовательский smoke-сценарий. Если риск не согласован, агент должен остановиться до опасного действия.",[19,2551,2553],{"id":2552},"управление-стало-разговором-но-не-разговором-ни-о-чём","Управление стало разговором — но не разговором ни о чём",[12,2555,2556],{},"Работа с агентом изменила моё представление об управлении разработкой.",[12,2558,2559],{},"Раньше я больше думал о распределении задач: что отдать, в каком порядке сделать, кому поручить проверку. Сейчас фокус сместился. Самая важная часть работы происходит раньше кода:",[350,2561,2562,2565,2568,2571,2574,2577],{},[126,2563,2564],{},"правильно назвать цель;",[126,2566,2567],{},"отделить факт от предположения;",[126,2569,2570],{},"обозначить границы;",[126,2572,2573],{},"определить риск;",[126,2575,2576],{},"договориться о доказательстве результата;",[126,2578,2579],{},"сохранить знание после завершения.",[12,2581,2582],{},"Получается, что управление всё чаще сводится к качеству диалога. Но не к разговору ради разговора. К разговору, после которого появляется конкретный проверяемый результат.",[402,2584,2585],{},[12,2586,2587],{},"Чем сильнее AI участвует в разработке, тем меньше можно управлять намёками.",[12,2589,2590],{},"Каждое неясное слово в задаче становится риском. Каждая непроверенная гипотеза — потенциальным багом. Каждая хорошо поставленная цель — возможностью двигаться быстрее без лишнего героизма.",[12,2592,2593],{},"Я продолжаю строить эту систему: уточнять контекст, превращать ошибки в проверки, отделять исследование от изменений и учиться ставить задачи так, чтобы за диалогом всегда оставался работающий результат.",[12,2595,2596],{},"И, пожалуй, это пока самый полезный эффект AI в разработке. Не то, что он пишет код. А то, что рядом с ним приходится наконец ясно объяснять, зачем этот код нужен.",[12,2598,2599,2600,132],{},"Наблюдения об AI в разработке и о том, что в этой работе остаётся на стороне человека, я продолжаю собирать в Telegram-канале ",[269,2601,2605],{"href":2602,"rel":2603},"https:\u002F\u002Ft.me\u002Fstrunimisli",[2604],"nofollow","«Струны, мысли»",[1692,2607,2608],{},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":114,"searchDepth":275,"depth":275,"links":2610},[2611,2612,2613,2614,2615,2616,2623,2624,2625,2626,2627,2628,2629,2634],{"id":679,"depth":275,"text":680},{"id":1788,"depth":275,"text":1789},{"id":1831,"depth":275,"text":1832},{"id":1885,"depth":275,"text":1886},{"id":1942,"depth":275,"text":1943},{"id":2024,"depth":275,"text":2025,"children":2617},[2618,2619,2620,2621,2622],{"id":2031,"depth":281,"text":2032},{"id":2058,"depth":281,"text":2059},{"id":2071,"depth":281,"text":2072},{"id":2104,"depth":281,"text":2105},{"id":2146,"depth":281,"text":2147},{"id":2194,"depth":275,"text":2195},{"id":2274,"depth":275,"text":2275},{"id":2352,"depth":275,"text":2353},{"id":2425,"depth":275,"text":2426},{"id":2453,"depth":275,"text":2454},{"id":2491,"depth":275,"text":2492},{"id":2527,"depth":275,"text":2528,"children":2630},[2631,2632,2633],{"id":2531,"depth":281,"text":2532},{"id":2538,"depth":281,"text":2539},{"id":2545,"depth":281,"text":2546},{"id":2552,"depth":275,"text":2553},"2026-08-11","Как я выстраиваю разработку с AI-агентом: через цели, контекст, ограничения, проверку фактов и доказательства результата.",{},"\u002Fblog\u002F2026-08-11-ai-upravlenie-razrabotkoj",{"title":1738,"description":2636},"blog\u002F2026-08-11-ai-upravlenie-razrabotkoj",[302,299,2642,2643,2644],"управление","агенты","мысли","2KE0r-c898KARjeA8befh6xQ7RkWoXBdw-XGXwQ1YA0",{"id":2647,"title":2648,"acrostic":7,"body":2649,"date":2724,"description":2725,"duration":7,"emoji":7,"extension":290,"faq":7,"featured":291,"format":7,"image":7,"level":7,"media":7,"meta":2726,"navigation":293,"path":2727,"price":7,"schedule":7,"seo":2728,"seoTitle":7,"serviceType":7,"status":7,"stem":2729,"tags":2730,"tech":7,"toc":291,"url":7,"__hash__":2733},"blog\u002Fblog\u002F2026-08-04-dumat-energozatratno.md","Думать энергозатратно",{"type":9,"value":2650,"toc":2722},[2651,2654,2657,2660,2663,2666,2669,2672,2675,2678,2681,2684,2687,2704,2707,2710,2713,2716,2719],[12,2652,2653],{},"Думать энергозатратно.",[12,2655,2656],{},"Мозг — один из самых требовательных к энергии органов. Даже в состоянии покоя он потребляет заметную долю ресурсов организма. А когда нужно разобраться в новой, неочевидной задаче, построить модель происходящего, выбрать направление и принять решение — это ощущается почти физически.",[12,2658,2659],{},"Поэтому нам часто не хочется думать.",[12,2661,2662],{},"Мы выбираем знакомые шаблоны, опираемся на прошлый опыт, повторяем уже сработавшие решения. Это не обязательно признак лени или слабости. Скорее, естественный способ экономить ресурс.",[12,2664,2665],{},"Но именно там, где шаблонов недостаточно, начинается настоящая работа: нужно искать новое решение, удерживать в голове противоречия, проверять гипотезы, признавать, что прежняя схема больше не подходит.",[12,2667,2668],{},"Сейчас часть этой нагрузки берёт на себя искусственный интеллект.",[12,2670,2671],{},"ИИ может быстро написать типовой код, разложить задачу на подзадачи, собрать варианты реализации, подготовить тесты, найти очевидную ошибку. То, на что раньше уходили часы ручной работы, теперь иногда занимает минуты.",[12,2673,2674],{},"Это действительно меняет скорость разработки.",[12,2676,2677],{},"Но есть важная оговорка: ИИ не отменяет необходимость думать. Он переносит её выше по уровню.",[12,2679,2680],{},"Раньше скорость создания продукта зависела от всей цепочки: от автора идеи и архитектора до разработчика, который реализует очередную небольшую часть системы. Каждому нужно было остановиться, понять контекст и принять решение.",[12,2682,2683],{},"Теперь значительную часть низового труда можно автоматизировать. Робот не устает писать код, не теряет концентрацию на рутинных правках и способен очень быстро перебрать варианты.",[12,2685,2686],{},"А вот человеку остаётся самое сложное:",[350,2688,2689,2692,2695,2698,2701],{},[126,2690,2691],{},"понять, какую проблему мы вообще решаем;",[126,2693,2694],{},"сформулировать цель так, чтобы она не развалилась при реализации;",[126,2696,2697],{},"выбрать ограничения и критерии качества;",[126,2699,2700],{},"увидеть последствия решения для продукта, людей и бизнеса;",[126,2702,2703],{},"вовремя остановить систему, которая уверенно строит не то.",[12,2705,2706],{},"Если дать ИИ свободу без ясного каркаса и контроля, он легко построит вавилонскую башню из кода: много файлов, функций, абстракций и активности — но без цельной архитектуры и понятной ценности.",[12,2708,2709],{},"Поэтому настоящий предел скорости разработки сегодня — не скорость генерации кода.",[12,2711,2712],{},"Он упирается в человеческую способность собраться, найти силы, выделить время и по-настоящему подумать: что именно нужно сделать и почему.",[12,2714,2715],{},"Этот барьер вряд ли исчезнет полностью. Возможно, ИИ будет всё лучше ставить промежуточные цели и предлагать решения. Но исходный замысел, каркас системы и ответственность за направление пока остаются человеческой работой.",[12,2717,2718],{},"ИИ делает работу быстрее.",[12,2720,2721],{},"Но думать за нас — особенно о важном — он пока не отменяет.",{"title":114,"searchDepth":275,"depth":275,"links":2723},[],"2026-08-04","ИИ ускоряет создание кода, но не отменяет главную человеческую работу: сформулировать задачу, спроектировать систему и взять ответственность за решение.",{},"\u002Fblog\u002F2026-08-04-dumat-energozatratno",{"title":2648,"description":2725},"blog\u002F2026-08-04-dumat-energozatratno",[2731,299,2732],"ии","мышление","VObIrQdtM415tg47o04mnjebtR8Hb1DZVRwGxjCgMlo",{"id":2735,"title":2736,"acrostic":7,"body":2737,"date":2849,"description":2850,"duration":7,"emoji":7,"extension":290,"faq":7,"featured":291,"format":7,"image":7,"level":7,"media":7,"meta":2851,"navigation":293,"path":2852,"price":7,"schedule":7,"seo":2853,"seoTitle":7,"serviceType":7,"status":7,"stem":2854,"tags":2855,"tech":7,"toc":291,"url":7,"__hash__":2858},"blog\u002Fblog\u002F2026-07-09-telegram-invite-reality.md","Как я пытаюсь раскачать телеграм-канал: битва с лимитами",{"type":9,"value":2738,"toc":2842},[2739,2742,2745,2749,2752,2755,2758,2762,2765,2768,2771,2775,2778,2781,2787,2793,2797,2800,2814,2817,2821,2827,2833,2839],[12,2740,2741],{},"У меня есть канал — «Струны, мысли». Стихи, музыка, мысли. Недавно решил попробовать пригласить туда людей из своих контактов. Тысяча с лишним человек — среди них точно есть те, кому это откликнется.",[12,2743,2744],{},"Плюс у меня есть AI-агент. Он умеет писать скрипты, работать с Telegram API, отслеживать прогресс. Казалось бы — идеальный инструмент для массовой рассылки.",[19,2746,2748],{"id":2747},"первый-запуск","Первый запуск",[12,2750,2751],{},"8 июля, вечер. Агент отфильтровал контакты — около 600 ботов и мёртвых душ отсеялись, осталось 1158 реальных людей. Запустили скрипт.",[12,2753,2754],{},"24 приглашения — и Telegram разорвал сессию. Просто отключил аккаунт от API. Без предупреждения, без объяснений.",[12,2756,2757],{},"Пришлось заново авторизоваться. Потеряли час.",[19,2759,2761],{"id":2760},"вторая-попытка","Вторая попытка",[12,2763,2764],{},"На следующий день решили действовать иначе. Сначала — тихие инвайты в канал (107 человек добавлены, даже не заметили). Потом — личные сообщения с приглашением. Честные, без маркетингового шлака: «Привет! Это массовая рассылка, но канал мой, стихи тоже мои. Вот ссылка».",[12,2766,2767],{},"67 сообщений за 20 минут. И снова — «Too many requests». Аккаунт забанен.",[12,2769,2770],{},"На этот раз бан подольше. Часы.",[19,2772,2774],{"id":2773},"третья-попытка","Третья попытка",[12,2776,2777],{},"Переписали скрипт. Теперь он работает в двух режимах: invite в канал + личное сообщение, с паузой 31 секунда между приглашениями. При rate limit — ждёт час и пробует снова. Запустили в фоне.",[12,2779,2780],{},"Но выяснилось две вещи, которые усложнили автоматизацию.",[12,2782,2783,2786],{},[1101,2784,2785],{},"Первое:"," Telegram не даёт отправлять больше 20–30 личных сообщений в день незнакомым людям. Не в час — в день. Приглашения в канал — около 30 в час. Это не баг, это политика платформы. И она не написана нигде в явном виде — только в FloodWaitError, который приходит после факта.",[12,2788,2789,2792],{},[1101,2790,2791],{},"Второе:"," мой AI-агент и скрипт рассылки используют одну и ту же сессию Telegram. Они не могут работать одновременно. Каждый запуск скрипта требует остановки агента. Каждый ответ агента — остановки скрипта.",[19,2794,2796],{"id":2795},"где-мы-сейчас","Где мы сейчас",[12,2798,2799],{},"Скрипт работает. Медленно, по одному приглашению в 31 секунду, с часовыми паузами при каждом бане. Из 1158 контактов:",[350,2801,2802,2805,2808,2811],{},[126,2803,2804],{},"100 человек добавлены в канал (тихо, без уведомлений)",[126,2806,2807],{},"72 получили личное приглашение",[126,2809,2810],{},"22 пропущены — закрытые настройки приватности",[126,2812,2813],{},"954 ждут своей очереди",[12,2815,2816],{},"Баны снимаются. Скрипт снова стучится в API. Так и ломимся — по часу в час, по одному приглашению за раз.",[19,2818,2820],{"id":2819},"что-понял-на-этом-пути","Что понял на этом пути",[12,2822,2823,2826],{},[1101,2824,2825],{},"Telegram защищает пользователей, а не создателей контента."," Лимиты — это философия платформы: рост должен быть органическим. Но «органический» не значит «ждать, пока само придёт». Значит — идти к людям, но медленно, с уважением к правилам.",[12,2828,2829,2832],{},[1101,2830,2831],{},"AI — не кнопка «сделать всё»."," Агент пишет скрипты, обрабатывает ошибки, адаптируется к лимитам. Но он не может обойти фундаментальное ограничение платформы. Зато он может терпеливо ждать и пробовать снова — в отличие от человека, которому это наскучит через два часа.",[12,2834,2835,2838],{},[1101,2836,2837],{},"1158 приглашений — это марафон, не спринт."," При текущем темпе на всё уйдут несколько дней. И это нормально. Каждый, кто примет приглашение, будет тем, кто увидел реальное приглашение от реального человека — а не спам из ниоткуда.",[12,2840,2841],{},"Продолжение следует. Скрипт работает.",{"title":114,"searchDepth":275,"depth":275,"links":2843},[2844,2845,2846,2847,2848],{"id":2747,"depth":275,"text":2748},{"id":2760,"depth":275,"text":2761},{"id":2773,"depth":275,"text":2774},{"id":2795,"depth":275,"text":2796},{"id":2819,"depth":275,"text":2820},"2026-07-09","История о том, как AI-автоматизация массовых приглашений столкнулась с реальностью телеграм-лимитов",{},"\u002Fblog\u002F2026-07-09-telegram-invite-reality",{"title":2736,"description":2850},"blog\u002F2026-07-09-telegram-invite-reality",[2856,302,2857,2644],"telegram","опыт","gGQprx9Q2ELGhjkWm1QiNpHXVK3P5xEBRLSu0ZOxxI0",{"id":2860,"title":2861,"acrostic":7,"body":2862,"date":2951,"description":2952,"duration":7,"emoji":7,"extension":290,"faq":7,"featured":291,"format":7,"image":7,"level":7,"media":7,"meta":2953,"navigation":293,"path":2954,"price":7,"schedule":7,"seo":2955,"seoTitle":7,"serviceType":7,"status":7,"stem":2956,"tags":2957,"tech":7,"toc":291,"url":7,"__hash__":2959},"blog\u002Fblog\u002F2026-07-08-o-privychke-i-merakh.md","О привычке и мерах",{"type":9,"value":2863,"toc":2945},[2864,2867,2870,2874,2881,2884,2887,2894,2897,2901,2904,2907,2910,2913,2916,2920,2923,2926,2929,2933,2936,2939,2942],[12,2865,2866],{},"Монтень ушёл из суда, заперся в башне своего замка и тридцать лет писал книгу о себе. Не о политике, не о войнах — о том, как он сам устроен. Что его злит, что радует, почему он делает одно и не делает другое. «Опыты» — это толстая тетрадь честных записей. Без претензии на истину.",[12,2868,2869],{},"Я не ушёл в замок. Но я тоже веду записи. Только мои — не про личные нравы, а про код, системы и привычки, которые в них пролезают.",[19,2871,2873],{"id":2872},"привычка","Привычка",[12,2875,2876,2877,2880],{},"Монтень говорил: «Привычка — тихая и незаметная управительница». Она не приказывает — она просто делает за нас. Открываешь проект — Ctrl+P, открываешь терминал, пишешь ",[84,2878,2879],{},"npm run dev",". Новый проект — те же клавиши. Не задумываешься.",[12,2882,2883],{},"И это хорошо. Без привычки невозможно работать. Когда я впервые начал со Strapi 5, каждый шаг требовал усилия: как устроены content types, как работает REST API, где права, как деплоить. Сейчас — автоматизм. Пять минут и новый сервис на ногах.",[12,2885,2886],{},"Но Монтень предупреждал и о другой стороне. Привычка, которая помогает, одновременно слепит. Ты делаешь то же самое, потому что делал раньше, а не потому что это лучший способ.",[12,2888,2889,2890,2893],{},"Я три года писал на Vue. Потом на проекте потребовался React — и я ловил себя на том, что ищу во фреймворке вещи, которых там нет. Vue-привычки. Реактивность через ",[84,2891,2892],{},"ref",", composition API, single-file components. В React это всё устроено иначе, и вместо того чтобы думать на языке нового инструмента, я пытался заставить его работать по-старому.",[12,2895,2896],{},"Монтень так и писал: «Обычай заслоняет нам истинный вид вещей». Фреймворк — это не просто инструмент. Это набор привычек. Сменить стек — значит сменить мышление. А это тяжело.",[19,2898,2900],{"id":2899},"о-мерах","О мерах",[12,2902,2903],{},"В другом эссе Монтень рассуждает об излишествах. Он за умеренность — не потому что крайности плохи сами по себе, а потому что они мешают видеть цель. Ешь слишком много — забудешь вкус еды. Читаешь слишком много — забудешь, зачем читал.",[12,2905,2906],{},"В разработке это проявляется как архитектурный жор.",[12,2908,2909],{},"У меня проект, где 15 PM2-процессов. Frontend, backend, 10 парсеров, анализатор, дайджест, сборщик фото. Когда я рассказываю об этом, люди спрашивает: «Зачем так много?»",[12,2911,2912],{},"И я сам задаю себе тот же вопрос. Потому что когда запускал — каждый сервис казался необходимым. Один парсер на площадку. Один процесс на аналитику. Логично. Но логика каждого отдельного решения не гарантирует логику целого. Можно сделать сто правильных шагов и прийти в тупик.",[12,2914,2915],{},"Монтень бы понял. Он писал: «Наше положение привычно, и вот мы привыкли быть». 15 процессов — это не катастрофа. Но я знаю, что 8 хватило бы. Знаю — потому что уже проходил через это. Сначала всё кажется необходимым. Потом смотришь и видишь дублирование, лишние прослойки, сервис, который делает ровно одну вещь раз в сутки и мог бы быть cron-задачей.",[19,2917,2919],{"id":2918},"опыт-учит-задним-числом","Опыт учит задним числом",[12,2921,2922],{},"Главная мысль Монтеня: опыт приходит после того, как ты уже всё сделал. Нельзя прочитать книгу и стать мудрым. Нужно набить шишки. Но можно — и нужно — честно оглядываться назад и спрашивать: а зачем я это сделал?",[12,2924,2925],{},"Каждую неделю я нахожу в своём коде что-то, что переписал бы иначе. Не потому что было плохо — потому что теперь я знаю больше. Два месяца назад это было правильное решение. Сегодня — нет. И это нормально. Монтень переписывал «Опыты» пятнадцать лет, добавляя и зачёркивая. Книга росла вместе с ним.",[12,2927,2928],{},"Код — тоже. Не бывает финальной архитектуры. Бывает текущая, которая работает, и следующая, которая будет работать лучше. Между ними — опыт. Не книжный, не из документации. Свой, набитый на своих ошибках.",[19,2930,2932],{"id":2931},"привычка-как-мера","Привычка как мера",[12,2934,2935],{},"Вот что я понял, читая Монтеня: привычка и мера — это не два разных предмета. Это одно и то же. Привычка — это внутренняя мера. Ты делаешь ровно столько, сколько делал раньше. Ни больше, ни меньше.",[12,2937,2938],{},"Иногда этого достаточно. Автоматизмы экономят время и силы. Но иногда привычная мера устарела. Проект вырос, задачи изменились, а ты всё ещё делаешь так, как делал полгода назад. Не потому что так лучше — потому что так привычно.",[12,2940,2941],{},"Монтень не давал рецептов. Он говорил: «Я не учу — я рассказываю». Вот и я рассказываю. О том, как привычка помогает строить сервисы. И о том, как та же привычка мешает их упрощать. О мерах — которые приходят только с опытом, а опыт — только с ошибками.",[12,2943,2944],{},"Иногда достаточно остановиться и спросить: я делаю так, потому что это правильно, или потому что я так привык?",{"title":114,"searchDepth":275,"depth":275,"links":2946},[2947,2948,2949,2950],{"id":2872,"depth":275,"text":2873},{"id":2899,"depth":275,"text":2900},{"id":2918,"depth":275,"text":2919},{"id":2931,"depth":275,"text":2932},"2026-07-08","Монтень считал, что привычка делает нас рабами. В разработке то же самое — только рабами фреймворков и паттернов",{},"\u002Fblog\u002F2026-07-08-o-privychke-i-merakh",{"title":2861,"description":2952},"blog\u002F2026-07-08-o-privychke-i-merakh",[2644,299,2958],"философия","x9l2xBnSlfbg9Ooz-ZCtX7KMM4aQ2_3bD4Uf1DdG1C8",{"id":2961,"title":2962,"acrostic":7,"body":2963,"date":3299,"description":3300,"duration":7,"emoji":7,"extension":290,"faq":7,"featured":291,"format":7,"image":7,"level":7,"media":7,"meta":3301,"navigation":293,"path":3302,"price":7,"schedule":7,"seo":3303,"seoTitle":7,"serviceType":7,"status":7,"stem":3304,"tags":3305,"tech":7,"toc":291,"url":7,"__hash__":3311},"blog\u002Fblog\u002F2026-07-07-aklab-ai-development.md","AKLAB: как я строю автоматический мониторинг недвижимости для инвесторов",{"type":9,"value":2964,"toc":3290},[2965,2968,2971,2974,2981,2985,2988,2991,2994,2997,3090,3093,3096,3107,3111,3114,3117,3123,3126,3132,3135,3139,3142,3148,3151,3157,3160,3163,3166,3170,3173,3179,3185,3191,3197,3201,3271,3273,3287],[12,2966,2967],{},"Я делаю сервис мониторинга инвестиционной недвижимости — AKLAB. Он автоматически находит объекты, которые стоят значительно ниже рыночных эталонов. Парсит 10 федеральных площадок, анализирует отклонения от эталонных цен, присылает утренний дайджест на email.",[12,2969,2970],{},"Основной фокус — коммерческая недвижимость: офисы, склады, торговые помещения. Но мониторим также земельные участки и квартиры.",[12,2972,2973],{},"За полтора месяца довёл проект от идеи до продакшена. Рассказываю, как устроено.",[12,2975,2976],{},[2977,2978],"img",{"alt":2979,"src":2980},"Дашборд AKLAB — тёмная тема","\u002Fuploads\u002Faklab-dashboard-dark.png",[19,2982,2984],{"id":2983},"зачем","Зачем",[12,2986,2987],{},"Рынок инвестиционной недвижимости — это торги. Сбербанк-АСТ, Алфалот, М-ЕТС, ГИС Торги, ЕТПРФ, Инвест Москва и другие. На каждой площадке — сотни лотов. Просматривать их вручную каждый день — нереально.",[12,2989,2990],{},"AKLAB делает это за меня: парсит площадки ночью, анализирует отклонения от эталонов, утром присылает результат на почту.",[19,2992,2993],{"id":654},"Архитектура",[12,2995,2996],{},"Один репозиторий, 15 PM2-процессов:",[37,2998,2999,3011],{},[40,3000,3001],{},[43,3002,3003,3005,3008],{},[46,3004,48],{},[46,3006,3007],{},"Порт",[46,3009,3010],{},"Описание",[53,3012,3013,3024,3035,3046,3057,3068,3079],{},[43,3014,3015,3018,3021],{},[58,3016,3017],{},"Frontend (Vue 3 + Vite + Tailwind)",[58,3019,3020],{},":5174",[58,3022,3023],{},"Dashboard, Настройки, Карточки объектов",[43,3025,3026,3029,3032],{},[58,3027,3028],{},"Backend (Strapi 5 + SQLite)",[58,3030,3031],{},":1338",[58,3033,3034],{},"REST API, Admin Panel, Cron scheduler",[43,3036,3037,3040,3043],{},[58,3038,3039],{},"10 парсеров (Playwright\u002Ffetch)",[58,3041,3042],{},":1345–1355",[58,3044,3045],{},"alfalot, torgi-gov, sberbank-ast, m-ets …",[43,3047,3048,3051,3054],{},[58,3049,3050],{},"Analyzer",[58,3052,3053],{},":1341",[58,3055,3056],{},"Сравнение с эталонами",[43,3058,3059,3062,3065],{},[58,3060,3061],{},"Digest",[58,3063,3064],{},":1342",[58,3066,3067],{},"Утренний email-дайджест",[43,3069,3070,3073,3076],{},[58,3071,3072],{},"Photo",[58,3074,3075],{},":1356",[58,3077,3078],{},"Фото из карточек",[43,3080,3081,3084,3087],{},[58,3082,3083],{},"Очередь",[58,3085,3086],{},"—",[58,3088,3089],{},"@aklab\u002Fsqlite-queue",[12,3091,3092],{},"Backend — Strapi 5.44 + SQLite. Выбрал Strapi, потому что из коробки получаю REST API, админку, систему прав и кастомные контроллеры. Не нужно писать boilerplate.",[12,3094,3095],{},"Frontend — Vue 3 + Vite + Tailwind. Дашборд с фильтрами по городу, цене и типу объекта, карточки с галереей фото.",[12,3097,3098,3099,3102,3103,3106],{},"Парсеры — каждый микросервис в отдельной папке, shared-модули в ",[84,3100,3101],{},"_shared\u002F",". Один манифест ",[84,3104,3105],{},"services.json"," управляет портами, health-checks и PM2-конфигом.",[19,3108,3110],{"id":3109},"парсинг","Парсинг",[12,3112,3113],{},"Ночью запускаются 10 парсеров одновременно. Каждый обходит свою площадку, находит новые лоты и проверяет обновления старых.",[12,3115,3116],{},"Парсинг работает в две фазы — и это не просто «скан, потом загрузка». Это принципиальное решение, которое экономит время и ресурсы.",[12,3118,3119,3122],{},[1101,3120,3121],{},"Phase 1 — Scan."," Парсер обходит ленту площадки и собирает только карточные данные: цена, площадь, адрес, тип помещения. Тут же, на лету, применяет фильтры. Не попадает в нужный регион — отбрасывается. Площадь меньше минимума — отбрасывается. Цена выше порога — отбрасывается. Стоп-слова в названии — отбрасывается. Всё это происходит до того, как я потратил хоть одну лишнюю секунду на детальную выгрузку.",[12,3124,3125],{},"Типичный сценарий: площадка выдаёт 200 лотов по всей России. После фильтрации по региону (Москва + МО) остаётся 30. После фильтрации по площади и цене — 12. Именно эти 12 и пойдут во вторую фазу, а не все 200.",[12,3127,3128,3131],{},[1101,3129,3130],{},"Phase 2 — Fetch Details."," Для каждого прошедшего фильтр лота парсер заходит в карточку и забирает полное описание, фотографии, документы, условия торгов. Это дорогая операция — каждый запрос это реальный HTTP-запрос к площадке, с ожиданием загрузки, иногда с обходом JavaScript-рендеринга через Playwright.",[12,3133,3134],{},"Две фазы позволяют не грузить детали для объектов, которые заведомо не подходят. На некоторых площадках фильтрация отсекает 80–90% лотов ещё на этапе scan.",[19,3136,3138],{"id":3137},"скоринг","Скоринг",[12,3140,3141],{},"После парсинга analyzer оценивает каждый объект по сравнению с эталонными ценами.",[12,3143,3144,3147],{},[1101,3145,3146],{},"Эталоны"," — это заранее заданные ориентиры стоимости за квадратный метр для каждого типа помещения в каждом регионе. Не «средняя цена по рынку», а конкретные контрольные точки, которые я веду вручную и корректирую по мере накопления данных.",[12,3149,3150],{},"Для каждого объекта analyzer считает отклонение от эталона:",[105,3152,3155],{"className":3153,"code":3154,"language":110},[108],"deviation = (эталонная_цена − фактическая_цена) \u002F эталонная_цена × 100\n",[84,3156,3154],{"__ignoreMap":114},[12,3158,3159],{},"Если отклонение превышает порог (например, 20%) — объект попадает в фокус. Чем больше отклонение, тем выше фокус-скор.",[12,3161,3162],{},"Кроме отклонения, на скор влияют дополнительные факторы: тип торгов (банкротство vs реализация), наличие фото, полнота описания, сроки торгов. Объект с высоким отклонением, но без фотографий и с неполным описанием получит скор ниже, чем объект с аналогичным отклонением, но полной карточкой.",[12,3164,3165],{},"Весь парсинг и анализ происходит ночью. Утром digest формирует email-дайджест по объектам, попавшим в фокус, и отправляет мне на почту.",[19,3167,3169],{"id":3168},"как-ai-помогает","Как AI помогает",[12,3171,3172],{},"Я разрабатываю AKLAB с AI-ассистентом. Вот что это даёт на практике:",[12,3174,3175,3178],{},[1101,3176,3177],{},"Параллельная работа."," AI одновременно пишет код для нескольких сервисов — парсера, analyzer, фронтенд-компонента. Я ревьюю результат, а не пишу с нуля.",[12,3180,3181,3184],{},[1101,3182,3183],{},"Документация."," После каждого изменения AI обновляет внутреннюю документацию: архитектурные решения, known issues, deployment notes. Всё актуально в каждый момент времени.",[12,3186,3187,3190],{},[1101,3188,3189],{},"Тесты."," AI генерирует тесты параллельно с кодом. Не «напиши потом тесты» — а сразу вместе с фичей.",[12,3192,3193,3196],{},[1101,3194,3195],{},"Деплой."," Один скрипт: коммит, пуш, npm install, build 10 сервисов, перезапуск PM2, health-check. 3–5 минут от команды до рабочего продакшена.",[19,3198,3200],{"id":3199},"цифры","Цифры",[37,3202,3203,3213],{},[40,3204,3205],{},[43,3206,3207,3210],{},[46,3208,3209],{},"Метрика",[46,3211,3212],{},"Значение",[53,3214,3215,3223,3231,3239,3247,3255,3263],{},[43,3216,3217,3220],{},[58,3218,3219],{},"Версия",[58,3221,3222],{},"v1.1.43",[43,3224,3225,3228],{},[58,3226,3227],{},"PM2-процессов",[58,3229,3230],{},"15",[43,3232,3233,3236],{},[58,3234,3235],{},"Активных парсеров",[58,3237,3238],{},"10",[43,3240,3241,3244],{},[58,3242,3243],{},"Площадок",[58,3245,3246],{},"10 федеральных",[43,3248,3249,3252],{},[58,3250,3251],{},"Тестов",[58,3253,3254],{},"578",[43,3256,3257,3260],{},[58,3258,3259],{},"Коммитов",[58,3261,3262],{},"200+",[43,3264,3265,3268],{},[58,3266,3267],{},"Время от идеи до prod",[58,3269,3270],{},"1.5 месяца",[19,3272,607],{"id":606},[350,3274,3275,3278,3281,3284],{},[126,3276,3277],{},"Email-дайджест с аналитикой по трендам",[126,3279,3280],{},"Расширение на больше площадок и регионов",[126,3282,3283],{},"API для партнёров",[126,3285,3286],{},"Предсказание доходности на основе исторических данных",[3288,3289],"hr",{},{"title":114,"searchDepth":275,"depth":275,"links":3291},[3292,3293,3294,3295,3296,3297,3298],{"id":2983,"depth":275,"text":2984},{"id":654,"depth":275,"text":2993},{"id":3109,"depth":275,"text":3110},{"id":3137,"depth":275,"text":3138},{"id":3168,"depth":275,"text":3169},{"id":3199,"depth":275,"text":3200},{"id":606,"depth":275,"text":607},"2026-07-07","10 парсеров, 15 сервисов, 578 тестов. Как я строю платформу для инвесторов в недвижимость с помощью AI.",{},"\u002Fblog\u002F2026-07-07-aklab-ai-development",{"title":2962,"description":3300},"blog\u002F2026-07-07-aklab-ai-development",[3306,302,299,3307,3308,3309,3310],"aklab","strapi","vue","недвижимость","инвестиции","NgOyUcftyQjU9k1ghD0wHeO2LsIUkgKlZjFav3qstgc",{"id":3313,"title":3314,"acrostic":7,"body":3315,"date":3322,"description":3323,"duration":7,"emoji":7,"extension":290,"faq":7,"featured":291,"format":7,"image":7,"level":7,"media":3324,"meta":3328,"navigation":293,"path":3329,"price":7,"schedule":7,"seo":3330,"seoTitle":7,"serviceType":7,"status":7,"stem":3331,"tags":3332,"tech":7,"toc":291,"url":7,"__hash__":3334},"blog\u002Fblog\u002F2026-03-14-improvizaciya.md","Импровизация (14 марта)",{"type":9,"value":3316,"toc":3320},[3317],[12,3318,3319],{},"Живая акустическая импровизация, записанная 14 марта.",{"title":114,"searchDepth":275,"depth":275,"links":3321},[],"2026-03-14","Акустическая гитара, свежая импровизация.",[3325],{"type":3326,"url":3327,"title":3314},"audio","\u002Fmusic\u002F14-mar-1222.mp3",{},"\u002Fblog\u002F2026-03-14-improvizaciya",{"title":3314,"description":3323},"blog\u002F2026-03-14-improvizaciya",[3333],"музыка","8tBvhLmSw3k7YN0s4RuppHBhnjaYZ9-n6ULY5X0DtlM",{"id":3336,"title":3337,"acrostic":7,"body":3338,"date":3368,"description":3369,"duration":7,"emoji":7,"extension":290,"faq":7,"featured":291,"format":7,"image":7,"level":7,"media":7,"meta":3370,"navigation":293,"path":3373,"price":7,"schedule":7,"seo":3374,"seoTitle":7,"serviceType":7,"status":7,"stem":3375,"tags":3376,"tech":7,"toc":291,"url":7,"__hash__":3378},"blog\u002Fblog\u002F2026-03-13-help-people.md","Помочь можно только тому, кто готов",{"type":9,"value":3339,"toc":3366},[3340,3343,3346,3349,3352,3355,3358,3361],[12,3341,3342],{},"Иногда ловлю себя на мысли, что очень хочу приносить пользу. Не просто быть рядом, а именно — быть полезным. Помогать близким, да и вообще — людям. Делать так, чтобы кому-то стало легче, понятнее, лучше.",[12,3344,3345],{},"Умею, казалось бы, немало. Могу сайт помочь сделать. Могу разобраться с ИИ, внедрить, прокачать процессы. Казалось бы — бери и делай, приноси пользу.",[12,3347,3348],{},"Но что-то не складывается.",[12,3350,3351],{},"И ведь знаю я эту мудрость, которую не первый раз слышу: «Люди сопротивляются новому, даже если понимают, что оно к лучшему». Знаю — и всё равно каждый раз удивляюсь. Вроде человек сам просил помощи. Вроде сам понимает, что надо что-то менять. А потом — тишина. Или отговорки. Или просто игнор.",[12,3353,3354],{},"Может, конечно, это я где-то не так подхожу. Может, не умею правильно донести. Может, навязываюсь там, где не надо.",[12,3356,3357],{},"А может, всё просто — помочь можно только тому, кто сам готов эту помощь принять. Не за руку тянуть, а просто быть рядом, когда спросят.",[12,3359,3360],{},"Но всё равно — хочется. Чтобы получалось. Чтобы не зря.",[402,3362,3363],{},[12,3364,3365],{},"«...и может быть станем, станем мы друг другу нужней...» — иногда эта строчка из 7Б застревает в голове. Вот бы так. Вот бы получалось.",{"title":114,"searchDepth":275,"depth":275,"links":3367},[],"2026-03-13","О желании приносить пользу и о том, почему это не всегда получается",{"externalLinks":3371},{"telegram":3372},"tg:\u002F\u002Fresolve?domain=strunimisli&post=11","\u002Fblog\u002F2026-03-13-help-people",{"title":3337,"description":3369},"blog\u002F2026-03-13-help-people",[3377,2644],"личное","j1sATirO1E67Dnf68VmZhA_IgY7DXmNZg0NdbGYVxho",{"id":3380,"title":3381,"acrostic":7,"body":3382,"date":3459,"description":3460,"duration":7,"emoji":7,"extension":290,"faq":7,"featured":291,"format":7,"image":7,"level":7,"media":7,"meta":3461,"navigation":293,"path":3462,"price":7,"schedule":7,"seo":3463,"seoTitle":7,"serviceType":7,"status":7,"stem":3464,"tags":3465,"tech":7,"toc":291,"url":7,"__hash__":3467},"blog\u002Fblog\u002F2026-03-10-ai-changed-rules.md","AI изменил правила: как один разработчик заменяет команду",{"type":9,"value":3383,"toc":3453},[3384,3387,3391,3397,3403,3407,3433,3437,3440,3443,3447],[12,3385,3386],{},"За 30 лет в IT я видел много технологических революций. Но ни одна из них не была такой быстрой и глубокой, как AI.",[19,3388,3390],{"id":3389},"было-стало","Было \u002F Стало",[12,3392,3393,3396],{},[1101,3394,3395],{},"Раньше:"," чтобы создать SaaS-продукт, нужна команда из 5-10 человек. Frontend, backend, дизайнер, DevOps, тестировщик.",[12,3398,3399,3402],{},[1101,3400,3401],{},"Сейчас:"," один разработчик с AI-инструментами делает то же самое. Claude пишет код, GPT генерирует контент, Replicate создаёт изображения, а я собираю всё это в продукт.",[19,3404,3406],{"id":3405},"мой-стек-продуктивности","Мой стек продуктивности",[350,3408,3409,3415,3421,3427],{},[126,3410,3411,3414],{},[1101,3412,3413],{},"Claude Code"," — написание и рефакторинг кода",[126,3416,3417,3420],{},[1101,3418,3419],{},"Yandex GPT"," — генерация контента на русском",[126,3422,3423,3426],{},[1101,3424,3425],{},"GPT-4"," — сложные аналитические задачи",[126,3428,3429,3432],{},[1101,3430,3431],{},"Replicate"," — генерация изображений",[19,3434,3436],{"id":3435},"что-это-меняет","Что это меняет",[12,3438,3439],{},"Порог входа в создание продуктов снизился радикально. Теперь важна не размер команды, а качество идеи и способность быстро итерировать.",[12,3441,3442],{},"Один человек с правильными инструментами может конкурировать с командами. Не потому что он лучше — потому что AI убрал bottleneck в исполнении.",[19,3444,3446],{"id":3445},"главный-навык-2026-года","Главный навык 2026 года",[12,3448,3449,3450,132],{},"Не программирование. Не дизайн. А умение правильно декомпозировать задачу и поставить её AI. Это новый вид инженерии — ",[1101,3451,3452],{},"инженерия промптов и процессов",{"title":114,"searchDepth":275,"depth":275,"links":3454},[3455,3456,3457,3458],{"id":3389,"depth":275,"text":3390},{"id":3405,"depth":275,"text":3406},{"id":3435,"depth":275,"text":3436},{"id":3445,"depth":275,"text":3446},"2026-03-10","30 лет в IT научили меня одному — адаптируйся или проиграешь",{},"\u002Fblog\u002F2026-03-10-ai-changed-rules",{"title":3381,"description":3460},"blog\u002F2026-03-10-ai-changed-rules",[302,2644,3466],"продуктивность","7X2yLb6-QceOE5kpg_oozrJoijN8dDcvIY7BrTS4oZI",{"id":3469,"title":3470,"acrostic":7,"body":3471,"date":3490,"description":3491,"duration":7,"emoji":7,"extension":290,"faq":7,"featured":291,"format":7,"image":7,"level":7,"media":7,"meta":3492,"navigation":293,"path":3495,"price":7,"schedule":7,"seo":3496,"seoTitle":7,"serviceType":7,"status":7,"stem":3497,"tags":3498,"tech":7,"toc":291,"url":7,"__hash__":3499},"blog\u002Fblog\u002F2026-03-09-struny-myslej.md","Струны мыслей",{"type":9,"value":3472,"toc":3488},[3473,3476,3479,3482,3485],[12,3474,3475],{},"Решил завести этот канал для себя. Не для проекта, не для аудитории — просто место, куда можно положить мысли, которые сами просятся наружу.",[12,3477,3478],{},"Я Александр. Разработчик, предприниматель, музыкант. Странное сочетание, но мне кажется, именно оно делает меня тем, кто я есть. В голове постоянно что-то происходит — то про AI и технологии, то про то, как строить дела, то про то, как всё это не усложнять. А ещё есть музыка. Она занимает огромное место в моей душе, и здесь я буду делиться своими произведениями — не потому что они идеальные, а потому что они мои.",[12,3480,3481],{},"Это не бизнес-канал. Это дневник. Записи о том, что думаю, пока еду куда-то или сижу ночью с гитарой. Мысли об AI, который меня завораживает. Размышления о стартапах — не как учить, а как самому ошибаться и учиться. Продуктивность — но без токсичного позитива, просто честно о том, что работает и что нет.",[12,3483,3484],{},"А ещё здесь будет музыка. Не концертные записи и не продакшн уровня студии — живой звук, мысли в нотах, иногда просто настроение, которое вылилось в мелодию.",[12,3486,3487],{},"Если это кому-то откликнется — хорошо. Если нет — тоже.",{"title":114,"searchDepth":275,"depth":275,"links":3489},[],"2026-03-09","Зачем я завёл личный канал — место для мыслей, музыки и честных записей",{"externalLinks":3493},{"telegram":3494},"tg:\u002F\u002Fresolve?domain=strunimisli&post=2","\u002Fblog\u002F2026-03-09-struny-myslej",{"title":3470,"description":3491},"blog\u002F2026-03-09-struny-myslej",[3377],"8LfKUqraECTM7ZDjCDyccqANqrJYF254hFHJ80YToJk",{"id":3501,"title":3502,"acrostic":7,"body":3503,"date":3605,"description":3606,"duration":7,"emoji":7,"extension":290,"faq":7,"featured":291,"format":7,"image":7,"level":7,"media":7,"meta":3607,"navigation":293,"path":3608,"price":7,"schedule":7,"seo":3609,"seoTitle":7,"serviceType":7,"status":7,"stem":3610,"tags":3611,"tech":7,"toc":291,"url":7,"__hash__":3613},"blog\u002Fblog\u002F2026-03-08-architecture.md","Архитектура TiROBOTS: как устроена AI‑платформа",{"type":9,"value":3504,"toc":3599},[3505,3508,3512,3538,3542,3545,3559,3562,3566,3572,3575,3579],[12,3506,3507],{},"Когда я начинал TiROBOTS, стояла задача: построить платформу, которая будет легко масштабироваться и поддерживаться одним разработчиком.",[19,3509,3511],{"id":3510},"стек","Стек",[350,3513,3514,3520,3526,3532],{},[126,3515,3516,3519],{},[1101,3517,3518],{},"Frontend:"," Vue 3 + Tailwind CSS",[126,3521,3522,3525],{},[1101,3523,3524],{},"Backend:"," Strapi 5 (headless CMS)",[126,3527,3528,3531],{},[1101,3529,3530],{},"AI:"," Yandex GPT для текстов, Replicate для изображений",[126,3533,3534,3537],{},[1101,3535,3536],{},"Инфраструктура:"," PM2, Nginx, Ubuntu",[19,3539,3541],{"id":3540},"почему-strapi","Почему Strapi",[12,3543,3544],{},"Strapi даёт из коробки:",[350,3546,3547,3550,3553,3556],{},[126,3548,3549],{},"REST и GraphQL API",[126,3551,3552],{},"Админку для контент-менеджмента",[126,3554,3555],{},"Систему ролей и прав",[126,3557,3558],{},"Кастомные контроллеры",[12,3560,3561],{},"Это позволило сосредоточиться на бизнес-логике, а не на бойлерплейте.",[19,3563,3565],{"id":3564},"архитектура-ai-пайплайна","Архитектура AI-пайплайна",[105,3567,3570],{"className":3568,"code":3569,"language":110},[108],"Тема → Генерация текста (GPT) → Ревью (Главный редактор) → Генерация изображения (Replicate) → Публикация\n",[84,3571,3569],{"__ignoreMap":114},[12,3573,3574],{},"Каждый этап — отдельный сервис. Если AI сгенерировал плохой текст, главный редактор отправляет на переработку.",[19,3576,3578],{"id":3577},"уроки","Уроки",[123,3580,3581,3587,3593],{},[126,3582,3583,3586],{},[1101,3584,3585],{},"Не усложняй раньше времени."," Начал с монолита, разделю когда понадобится",[126,3588,3589,3592],{},[1101,3590,3591],{},"AI нужен контекст."," Чем больше контекста даёшь модели, тем лучше результат",[126,3594,3595,3598],{},[1101,3596,3597],{},"Мониторинг критичен."," Когда роботы работают 24\u002F7, нужно знать что происходит",{"title":114,"searchDepth":275,"depth":275,"links":3600},[3601,3602,3603,3604],{"id":3510,"depth":275,"text":3511},{"id":3540,"depth":275,"text":3541},{"id":3564,"depth":275,"text":3565},{"id":3577,"depth":275,"text":3578},"2026-03-08","Vue 3 + Strapi 5 + Yandex GPT — как всё это работает вместе",{},"\u002Fblog\u002F2026-03-08-architecture",{"title":3502,"description":3606},"blog\u002F2026-03-08-architecture",[3612,654,3308,3307],"tirobots","I9NByyPwHKcDOaujP1aG__wCvuDpnp1_j90iJN4BB6o",{"id":3615,"title":3616,"acrostic":7,"body":3617,"date":3693,"description":3694,"duration":7,"emoji":7,"extension":290,"faq":7,"featured":291,"format":7,"image":7,"level":7,"media":7,"meta":3695,"navigation":293,"path":3696,"price":7,"schedule":7,"seo":3697,"seoTitle":7,"serviceType":7,"status":7,"stem":3698,"tags":3699,"tech":7,"toc":291,"url":7,"__hash__":3701},"blog\u002Fblog\u002F2026-03-07-how-it-started.md","Как я решил автоматизировать контент‑маркетинг",{"type":9,"value":3618,"toc":3686},[3619,3622,3626,3629,3633,3636,3640,3643,3657,3660,3664,3667,3681,3683],[12,3620,3621],{},"Всё началось с простого наблюдения: ведение контент-каналов отнимает безумное количество времени. Придумать тему, написать текст, сделать картинку, опубликовать в нужное время — и так каждый день.",[19,3623,3625],{"id":3624},"проблема","Проблема",[12,3627,3628],{},"Я вёл несколько Telegram-каналов и тратил на это 10-15 часов в неделю. При этом качество контента было нестабильным — когда устаёшь, посты получаются хуже.",[19,3630,3632],{"id":3631},"идея","Идея",[12,3634,3635],{},"А что если AI может не просто помогать с текстом, а полностью вести канал? С определённым tone of voice, стратегией, расписанием?",[19,3637,3639],{"id":3638},"первые-эксперименты","Первые эксперименты",[12,3641,3642],{},"Начал с простого — скрипт, который:",[123,3644,3645,3648,3651,3654],{},[126,3646,3647],{},"Берёт тему из списка",[126,3649,3650],{},"Генерирует текст через Yandex GPT",[126,3652,3653],{},"Создаёт изображение через Replicate",[126,3655,3656],{},"Публикует в Telegram по расписанию",[12,3658,3659],{},"Результат превзошёл ожидания. Посты были не хуже написанных вручную, а иногда даже лучше — AI не устаёт и не теряет фокус.",[19,3661,3663],{"id":3662},"от-скрипта-к-платформе","От скрипта к платформе",[12,3665,3666],{},"Один скрипт превратился в платформу TiROBOTS. Добавил:",[350,3668,3669,3672,3675,3678],{},[126,3670,3671],{},"Веб-интерфейс для управления",[126,3673,3674],{},"Роль «Главного редактора» — задаёт стратегию",[126,3676,3677],{},"Несколько AI-роботов с разными специализациями",[126,3679,3680],{},"Аналитику эффективности",[19,3682,607],{"id":606},[12,3684,3685],{},"Сейчас TiROBOTS — это полноценная платформа для автоматизации контент-маркетинга. Но я вижу её будущее шире — как хаб AI-роботов для разных задач бизнеса.",{"title":114,"searchDepth":275,"depth":275,"links":3687},[3688,3689,3690,3691,3692],{"id":3624,"depth":275,"text":3625},{"id":3631,"depth":275,"text":3632},{"id":3638,"depth":275,"text":3639},{"id":3662,"depth":275,"text":3663},{"id":606,"depth":275,"text":607},"2026-03-07","От идеи до продакшена — один разработчик и один AI",{},"\u002Fblog\u002F2026-03-07-how-it-started",{"title":3616,"description":3694},"blog\u002F2026-03-07-how-it-started",[302,3612,3700],"история","qMmW7-j3p9MkqKRv_DaoI98E0BUne2t3e_RgyJ3sbFU",{"id":3703,"title":3704,"acrostic":7,"body":3705,"date":3712,"description":3713,"duration":7,"emoji":7,"extension":290,"faq":7,"featured":291,"format":7,"image":7,"level":7,"media":3714,"meta":3717,"navigation":293,"path":3718,"price":7,"schedule":7,"seo":3719,"seoTitle":7,"serviceType":7,"status":7,"stem":3720,"tags":3721,"tech":7,"toc":291,"url":7,"__hash__":3722},"blog\u002Fblog\u002F2025-06-01-potihonechku-daleko-cover.md","Потихонечку — далеко (Cover)",{"type":9,"value":3706,"toc":3710},[3707],[12,3708,3709],{},"Акустический кавер.",{"title":114,"searchDepth":275,"depth":275,"links":3711},[],"2025-06-01","Кавер на акустической гитаре.",[3715],{"type":3326,"url":3716,"title":3704},"\u002Fmusic\u002Fpotikhonechku-daleko-cover.mp3",{},"\u002Fblog\u002F2025-06-01-potihonechku-daleko-cover",{"title":3704,"description":3713},"blog\u002F2025-06-01-potihonechku-daleko-cover",[3333],"PaLnyOBXJVyRw6jbiuQbGjBB89QMGwFGXCYQ9qDbFco",{"id":3724,"title":3725,"acrostic":7,"body":3726,"date":3733,"description":3734,"duration":7,"emoji":7,"extension":290,"faq":7,"featured":291,"format":7,"image":7,"level":7,"media":3735,"meta":3738,"navigation":293,"path":3739,"price":7,"schedule":7,"seo":3740,"seoTitle":7,"serviceType":7,"status":7,"stem":3741,"tags":3742,"tech":7,"toc":291,"url":7,"__hash__":3743},"blog\u002Fblog\u002F2025-01-24-improvizaciya.md","Импровизация (24 января)",{"type":9,"value":3727,"toc":3731},[3728],[12,3729,3730],{},"Fingerstyle-импровизация на акустической гитаре.",{"title":114,"searchDepth":275,"depth":275,"links":3732},[],"2025-01-24","Акустическая гитара, fingerstyle импровизация.",[3736],{"type":3326,"url":3737,"title":3725},"\u002Fmusic\u002F24-jan-1115.mp3",{},"\u002Fblog\u002F2025-01-24-improvizaciya",{"title":3725,"description":3734},"blog\u002F2025-01-24-improvizaciya",[3333],"bjdlpCC2vLziYprV48lRGPUnbx7MvLr1ZZh8Q72u-cg",{"id":3745,"title":3746,"acrostic":7,"body":3747,"date":3769,"description":3770,"duration":7,"emoji":7,"extension":290,"faq":7,"featured":291,"format":7,"image":7,"level":7,"media":7,"meta":3771,"navigation":293,"path":3772,"price":7,"schedule":7,"seo":3773,"seoTitle":7,"serviceType":7,"status":7,"stem":3774,"tags":3775,"tech":7,"toc":291,"url":7,"__hash__":3776},"blog\u002Fblog\u002F2020-01-01-deneg-kotorykh-net.md","Деньги, которых нет",{"type":9,"value":3748,"toc":3767},[3749,3752,3755,3758,3761,3764],[12,3750,3751],{},"У меня была беседа с человеком, который успешно играл на бирже и однажды решил вывести все деньги в кэш.",[12,3753,3754],{},"Уж так он успешно до этого играл, что денег оказалось очень много. Вот прям реально несколько чемоданов.",[12,3756,3757],{},"Это, как он рассказывал, тоже было недёшево – комиссия за обналичивание такой суммы была запредельной, но он всё же пошел на эту трату, так как был твёрд в своем решении. В этот момент, говорит, когда ему озвучили размер комиссионных, он в первый раз почувствовал укол какой-то плохо еще осознаваемой мысли.",[12,3759,3760],{},"Ну вот, говорит, посидел на чемоданах пару дней, он пошел и купил за наличные панамеру. Мог, в принципе, какую угодно тачку купить, но эта вот попала под руку, как говорится. Эта покупка была похожа на небольшой перерасчет портфеля акций в связи с коррекцией рынка. Пока он не видел этих денег вживую, он по-другому ощущал их ценность, поэтому для него было открытием, что оказывается вымутить понамеру, а для держателя капитала это можно объяснить коррекцией.",[12,3762,3763],{},"Потом он сделал еще несколько покупок, но быстро понял, что это тупо. Тупо держать такую большую сумму в чемоданах, да еще и собранных в одном месте. Тупо, что это место – квартира. Тупо вообще вся эта затея.",[12,3765,3766],{},"Деньги были переведены обратно в безнал.",{"title":114,"searchDepth":275,"depth":275,"links":3768},[],"2020-01-01","Человек, который обналичил всё",{},"\u002Fblog\u002F2020-01-01-deneg-kotorykh-net",{"title":3746,"description":3770},"blog\u002F2020-01-01-deneg-kotorykh-net",[3700,2644],"-L0m9kWzyTo3Yzr5IU88DYVwJcPWWrJdWyvz1a7yjqo",{"id":3778,"title":3779,"acrostic":7,"body":3780,"date":3769,"description":3796,"duration":7,"emoji":7,"extension":290,"faq":7,"featured":291,"format":7,"image":7,"level":7,"media":7,"meta":3797,"navigation":293,"path":3798,"price":7,"schedule":7,"seo":3799,"seoTitle":7,"serviceType":7,"status":7,"stem":3800,"tags":3801,"tech":7,"toc":291,"url":7,"__hash__":3802},"blog\u002Fblog\u002F2020-01-01-dragotsennyj-kamen.md","Драгоценный камень в куче угля",{"type":9,"value":3781,"toc":3794},[3782,3785,3788,3791],[12,3783,3784],{},"Однажды я нашёл в куче угля маленький рубин. Дело было так. Еще с детства у меня в голове отложилась информация, что в угле можно найти много чего интересного. Например, ракушку древнего моллюска. Потом я узнал как появляются драгоценные камни и где их чаще всего находят. В принципе, для получения каменного угля и для получения драгоценных камней необходимы сходные процессы – высокое давление и температура. Поэтому, есть не нулевая вероятность найти в куче угля драгоценный камень.",[12,3786,3787],{},"Дело происходило, когда я служил в армии. Привезли уголь и сгрузили его на территории склада, к которому мы были прикомандированы. И вот сидели мы как-то с пацанами рядом с этой кучей, я им рассказываю про эту вот не нулевую вероятность и у них на глазах начинаю искать. Поискав какое-то время, бросаю это занятие, ребята посмеиваются. Потом, на следующий день я опять присаживался рядом с кучей и сидел, внимательно просматривая каждый квадратный сантиметр. Прошло несколько дней. И вот однажды я нашёл! Маленький камушек рубинового цвета. Кто-то из парней предложил попробовать поцарапать стекло этим камушком. Мол, если расцарапает, то да действительно рубин. У меня было зеркальце и мы попробовали им поцарапать поверхность. Камешек уверенно прорезал борозду на стекле!",[12,3789,3790],{},"К чему я это рассказываю?",[12,3792,3793],{},"Я много раз был свидетелем того, как происходили события, вероятность которых была крайне мала.",{"title":114,"searchDepth":275,"depth":275,"links":3795},[],"Не нулевая вероятность",{},"\u002Fblog\u002F2020-01-01-dragotsennyj-kamen",{"title":3779,"description":3796},"blog\u002F2020-01-01-dragotsennyj-kamen",[3700,2644],"ReSvh8Q8ni8J7tDte_S_5SolExGDBVCMxmtEAIRGbv0",{"id":3804,"title":3805,"acrostic":7,"body":3806,"date":3769,"description":3813,"duration":7,"emoji":7,"extension":290,"faq":7,"featured":291,"format":7,"image":7,"level":7,"media":7,"meta":3814,"navigation":293,"path":3815,"price":7,"schedule":7,"seo":3816,"seoTitle":7,"serviceType":7,"status":7,"stem":3817,"tags":3818,"tech":7,"toc":291,"url":7,"__hash__":3820},"blog\u002Fblog\u002F2020-01-01-lyudi-pozhivshie.md","Люди, пожившие на этом свете",{"type":9,"value":3807,"toc":3811},[3808],[12,3809,3810],{},"Люди, пожившие на этом свете, наполнятся воспоминаниями и размышлениями о событиях, которые травмируют их психику. Дети помогают не сойти с ума. Это банальная мысль – рождаемость должна быть, как минимум на том же уровне, как и смертность, а лучше выше, чтобы цивилизация развивалась. Но функция детей не только продолжение рода, но и помощь взрослым. Без них взрослые бы «загнались».",{"title":114,"searchDepth":275,"depth":275,"links":3812},[],"Дети помогают не сойти с ума",{},"\u002Fblog\u002F2020-01-01-lyudi-pozhivshie",{"title":3805,"description":3813},"blog\u002F2020-01-01-lyudi-pozhivshie",[3819,2644],"размышление","zUyXsqORRwh6hQ778jHyNVtVIac8gRo8Wszdg8guXOs",{"id":3822,"title":3823,"acrostic":7,"body":3824,"date":3769,"description":3840,"duration":7,"emoji":7,"extension":290,"faq":7,"featured":291,"format":7,"image":7,"level":7,"media":7,"meta":3841,"navigation":293,"path":3842,"price":7,"schedule":7,"seo":3843,"seoTitle":7,"serviceType":7,"status":7,"stem":3844,"tags":3845,"tech":7,"toc":291,"url":7,"__hash__":3846},"blog\u002Fblog\u002F2020-01-01-pustye-otnosheniya.md","Пустые, ненужные отношения",{"type":9,"value":3825,"toc":3838},[3826,3829,3832,3835],[12,3827,3828],{},"Как так получилось, что то, что имело большую ценность, стало пустым и ненужным? Я пытаюсь разгадать, что это? К чему этот урок? И закончен ли он?",[12,3830,3831],{},"Может то, что мне сейчас кажется пустым, попозже будет видеться обратным?",[12,3833,3834],{},"Чтобы продвигаться, нам необходимо принимать решения. Каждое принятое решение – это смена, корректировка курса. И получается, что мой корабль попал в магнитную аномалию. Компас показывает удивительное…",[12,3836,3837],{},"Когда барахлит компас, отложите в сторону карты. Просто внимательно смотрите вперед, чтобы вовремя обруливать препятствия и ждите ночей, чтобы ориентироваться по звёздам.",{"title":114,"searchDepth":275,"depth":275,"links":3839},[],"Когда барахлит компас, смотрите на звёзды",{},"\u002Fblog\u002F2020-01-01-pustye-otnosheniya",{"title":3823,"description":3840},"blog\u002F2020-01-01-pustye-otnosheniya",[3819],"tQYgVIj0RrbHM-2pue2OefsdjMD46CkFc3HL5StVQZ0",{"id":3848,"title":3849,"acrostic":7,"body":3850,"date":3769,"description":3892,"duration":7,"emoji":7,"extension":290,"faq":7,"featured":291,"format":7,"image":7,"level":7,"media":7,"meta":3893,"navigation":293,"path":3894,"price":7,"schedule":7,"seo":3895,"seoTitle":7,"serviceType":7,"status":7,"stem":3896,"tags":3897,"tech":7,"toc":291,"url":7,"__hash__":3898},"blog\u002Fblog\u002F2020-01-01-sobralsya-ya-umirat.md","Собрался я умирать, ребята…",{"type":9,"value":3851,"toc":3890},[3852,3854,3857,3860,3863,3866,3869,3872,3875,3878,3881,3884,3887],[12,3853,3849],{},[12,3855,3856],{},"Не переживайте, речь не о суициде. Просто что-то сегодня замкнуло в моей голове и как-то стало очень понятно, что времени-то всё меньше! А я туплю.",[12,3858,3859],{},"Задал себе такой вот вопрос – вот если умру прям сейчас, что останется недоделанным? К осуществлению каких целей, желаний я даже не приступал, откладывая их «до лучших времен»?",[12,3861,3862],{},"Ну набралось у меня парочка, да и то, в принципе, не такие уж и критично важные… Я уже так давно живу с пониманием механизма материализации мысли, что все мои мечты уже сбылись. Только и успеваю придумывать что-нибудь новое, потом реализовывать.",[12,3864,3865],{},"В конечном итоге, каждый получает то, что он хочет. Та ситуация, в которой вы сейчас находитесь, образовалась в результате ваших стремлений и связанных с ними решений.",[12,3867,3868],{},"Если вы предприниматель со стажем, то вы меня поймете. Когда над тобой нет начальника, то вы сами определяете, чем вам и когда заниматься. Это классная штука – свобода, но есть обратная сторона у этой медали. Впрочем, это не медаль. Свободу не вручают и не выдают в кассе. Свободу берут. И вот я беру уже эту свободу с 2003 года, как открыл свое первое юрлицо. Сначала о чем-то просто мечтаю, если мечта манит, то меняю статус «мечта» на «цель», потом делаю шаг на пути к ней, другой, третий и всегда (!) обнаруживаю, что мне помогают. Разное в помощь. Люди, конечно же, в первую очередь. Но частенько случаются случайности, типа того, как подходишь к пешеходному переходу и в этот момент, как раз загорается зеленый свет. Ну ладно, речь не о вселенской помощи.",[12,3870,3871],{},"Я понял, что не так уж много, как оказалось, у меня таких мечт, которые я откладывал в долгий ящик… А мечты, которые я не успел воплотить – это и не мечты вовсе, а просто видение будущего. Вот будут еще дирижабли летать повсеместно, увидите сами!",[12,3873,3874],{},"Да и хрен с ними, мне тут подумалось, с этими неисполненными мечтами. Отпустил их и понял… что готов умереть. Ничего такого страшного не произойдет. Я везде, где надо, продублировал доступы надежным людям к всяким там сайтам и панелям управления, ну а то, что загнется без меня, значит не так и нужно было…",[12,3876,3877],{},"Эта вот «готовность» меня ошеломила.",[12,3879,3880],{},"А вот дальше пришло осознание, что это есть главное отличие нас, мужчин, от женщин. Женщина должна жить ради жизни, а от мужчины требуется готовность умереть ради неё.",[12,3882,3883],{},"Только не надо путать готовность и желание)",[12,3885,3886],{},"Новый уровень свободы.",[12,3888,3889],{},"А в ситуации, когда внутри нас борются два противоречивых желания, побеждает тот волк, которого мы лучше кормим",{"title":114,"searchDepth":275,"depth":275,"links":3891},[],"Не переживайте, речь не о суициде",{},"\u002Fblog\u002F2020-01-01-sobralsya-ya-umirat",{"title":3849,"description":3892},"blog\u002F2020-01-01-sobralsya-ya-umirat",[3819],"gBdlbvxE_crJNRBWgREvua6YSVu4hnSEXac6cQ4OSF4",{"id":3900,"title":3901,"acrostic":7,"body":3902,"date":3769,"description":3927,"duration":7,"emoji":7,"extension":290,"faq":7,"featured":291,"format":7,"image":7,"level":7,"media":7,"meta":3928,"navigation":293,"path":3929,"price":7,"schedule":7,"seo":3930,"seoTitle":7,"serviceType":7,"status":7,"stem":3931,"tags":3932,"tech":7,"toc":291,"url":7,"__hash__":3933},"blog\u002Fblog\u002F2020-01-01-topchemy-na-meste.md","Топчемся на месте или двигаемся?",{"type":9,"value":3903,"toc":3925},[3904,3907,3910,3913,3916,3919,3922],[12,3905,3906],{},"Мы представляем из себя то, о чём думаем целыми днями. В каждом мгновении, которое мы проживаем, мы имеем возможность поменять направление нашего движения. Конечно, есть такое понятие, как инерция и поэтому после поворота руля, корабль еще всё равно двигается в прежнем направлении. Кроме того, иногда нужно сменить курс, чтобы обогнуть какое-то препятствие и в этот момент, со стороны кажется, что мы двигаемся совсем не в том направлении, в котором надо бы. Мы не плывем по течению, не плывем против течения, мы плывём к цели! Лавируя между кусками дерьма, плывущиму навстречу, мы можем даже в какой-то момент оказаться на месте, где уже были раньше и тогда кто-то имеет право сказать, что мы топчемся на месте. Но! Мы живы, мы вместе, а значит всё хорошо. Главное не забывать о цели. Вот о ней я и хочу порассуждать.",[12,3908,3909],{},"За последнее время я все чаще дискутирую с разными людьми о цели бизнеса. В уставе каждой компании сказано, что цель бизнеса – прибыль. Поэтому, бизнесмены сначала очень удивляются и смотрят на меня, как на дурака, когда я им заявляю, что никогда не ставил прибыль во главу угла. Я хочу большего, чем просто прибыль. Стремление к гармонии – вот главный мой императив. А что такое гармония? Универсального ответа, справедливого для всех, наверное нет. Да я и не хочу говорить за всех. Скажу за себя – гармония это когда совесть не болит. А у меня она не болит. Я знаю, что есть за мной грешки, типа не заплаченных вовремя пенсионных взносов или налогов, но всё равно не болит! И не потому, что знаю, как распределяются эти налоги, а потому знаю, что я, как единица, приношу ПОЛЬЗУ окружающим меня людям. Польза эта выражается по разному. Это может быть быстрая реакция на сломавшийся сервер, может просто подбадривающие слова, а может и обратное – вот к примеру, вчера я сознательно отключил сервер одной фирме, которая уже пять месяцев не платит за хостинг. У нас там такие отношения с владельцами компании, что я могу быть спокоен – эти неоплаченные месяцы в конце концов будут всё же оплачены. Я и не отключал, просто напоминал об этом периодически управляющим. У меня есть понимание, что тот факт, что я всё же отключил сервер, создало проблемы для управляющих и, может быть, их даже могут уволить. Но уволят их за халатность, а это значит эта компания получит шанс стать лучше (если, конечно, на их место придут менее халатные люди). А те, кого уволят, получат шанс задуматься над своими ошибками и больше их не совершать.",[12,3911,3912],{},"Кто-то согласен работать с мудаками, лишь бы они деньги платили. Они любят говорить фразу: «Ничего личного – это бизнес». А я не такой! Как только я вычисляю мудака, я стремлюсь порвать с ним отношения. И не жалко мне незаработанных миллионов!",[12,3914,3915],{},"Такая стратегия возможна, только когда есть на кого опереться. Я и опираюсь. Опираюсь на родителей. Опираюсь на жену, когда по несколько месяцев нет доходов и мы оплачиваем продукты и секции там всякие, на которые ходит ребенок, её зарплатой. Опираюсь на друзей, когда прихожу к ним, чтобы погреться немного.",[12,3917,3918],{},"Опираюсь и знаю, что моя стратегия, как бумеранг, приносит мне счастье. Не контактировать с мудаками – это ли не счастье? Не счастье ли иметь теплые дружественные отношения с клиентами? А не счастье ли, когда твой сотрудник, говорит самокритично о своей работе? Я уже долго следую своей стратегии и это дает плоды – мудаков в моем близком окружении нет. Я счастлив)",[12,3920,3921],{},"Мы не топчемся на месте. Мы развиваемся и этот процесс не всегда напоминает рост дерева. Потому что мы не деревья. Мы делаем ошибки, учимся на них. Или не учимся и тогда, ситуации повторяются, пока мы не научимся.",[12,3923,3924],{},"У меня спрашивают, трудно ли быть предпринимателем. Надо просто любить людей, отвечаю я им. И вот этому-то и приходится всё время учиться. Как только научишься немного, обретешь внутренний стержень. Учась дальше, обретаешь надежную команду. Продвигаясь дальше в своем обучении, обретаешь хороших клиентов. А там и благоденствие недалеко!",{"title":114,"searchDepth":275,"depth":275,"links":3926},[],"Стремление к гармонии — главный императив",{},"\u002Fblog\u002F2020-01-01-topchemy-na-meste",{"title":3901,"description":3927},"blog\u002F2020-01-01-topchemy-na-meste",[3819],"eMNLdEQLUgyNA5v4U5102TDtXN-LhPi7dYJA8UdRZog",[3935,3947],{"slug":3936,"title":3937,"date":3938,"tags":3939,"description":3942,"media":3943,"externalLinks":3944,"source":3945,"publishedAt":3946},"2026-06-03-odin-na-odin-s-beskonechnostyu","Один на один с бесконечностью","2026-06-03",[2644,2958,3940,3941],"космос","чудо","Один во Вселенной — это тюрьма или школа любви? Размышление о том, почему мы не видим других цивилизаций, и что это говорит о нас самих.",[],{},"openclaw-voice-transcription","2026-06-03T09:18:41.161Z",{"slug":3948,"title":3949,"date":3950,"tags":3951,"description":3952,"media":3953,"externalLinks":3954,"source":3955,"publishedAt":3956},"2026-03-18-sdelali-sayt-avtopoliv69-ru-za-odin-den","Сделали сайт avtopoliv69.ru за один день","2026-03-18",[],"Сделали сайт avtopoliv69.ru за один день\n\nСегодня был интересный опыт — с утра получил задачу сделать сайт для компании по автополиву в Твери, а к вечеру он уже работает.\n\navtopoliv69.ru — сайт для би",[],{},"webhook","2026-03-18T17:14:34.959Z",{"id":3703,"title":3704,"acrostic":7,"body":3958,"date":3712,"description":3713,"duration":7,"emoji":7,"extension":290,"faq":7,"featured":291,"format":7,"image":7,"level":7,"media":3964,"meta":3966,"navigation":293,"path":3718,"price":7,"schedule":7,"seo":3967,"seoTitle":7,"serviceType":7,"status":7,"stem":3720,"tags":3968,"tech":7,"toc":291,"url":7,"__hash__":3722},{"type":9,"value":3959,"toc":3962},[3960],[12,3961,3709],{},{"title":114,"searchDepth":275,"depth":275,"links":3963},[],[3965],{"type":3326,"url":3716,"title":3704},{},{"title":3704,"description":3713},[3333],1786663642854]