[{"data":1,"prerenderedAt":4538},["ShallowReactive",2],{"blog-posts":3,"blog-runtime-posts":4283,"blog-2026-08-23-slozhnost-nikuda-ne-ischezla":4306},[4,379,659,1009,2087,2996,3084,3209,3310,3661,3684,3728,3817,3849,3963,4051,4072,4093,4126,4152,4170,4196,4248],{"id":5,"title":6,"acrostic":7,"body":8,"date":363,"description":364,"duration":7,"emoji":7,"extension":365,"faq":7,"featured":366,"format":7,"image":7,"level":7,"media":7,"meta":367,"navigation":368,"path":369,"price":7,"schedule":7,"seo":370,"seoTitle":7,"serviceType":7,"status":7,"stem":371,"tags":372,"tech":7,"toc":368,"url":7,"__hash__":378},"blog\u002Fblog\u002F2026-08-23-slozhnost-nikuda-ne-ischezla.md","Сложность никуда не исчезла — я научился с ней справляться",null,{"type":9,"value":10,"toc":351},"minimark",[11,15,18,21,24,27,30,52,55,60,63,66,69,72,75,78,82,85,88,117,120,123,126,129,133,136,139,142,145,148,154,157,160,164,167,170,173,176,179,183,186,189,192,212,215,219,222,225,228,231,234,242,245,249,252,255,258,275,278,281,284,290,293,297,300,311,314,317,321,324,327,330,333,336,339,342],[12,13,14],"p",{},"В разработке программ есть свой ритм.",[12,16,17],{},"Сначала главное — чтобы всё заработало. Потом хочется, чтобы интерфейс выглядел достойно. Следом начинается доводка: нужно вычистить ошибки, подтянуть производительность, разобраться с крайними случаями, настроить мониторинг. Когда приложение состоит из пары экранов, обо всём этом обычно не думаешь.",[12,19,20],{},"Затем приходит самый непростой этап: сделать так, чтобы спустя полгода в коде смог разобраться человек, который не держит устройство всей системы в голове. Раньше до этого этапа у меня часто просто не доходили руки.",[12,22,23],{},"Продукт уже работает, им пользуются, новые функции постепенно появляются. Возникает логичный вопрос: зачем тратить время на документацию, архитектурные правила, тесты и рефакторинг, если заказчик этого почти не видит?",[12,25,26],{},"Но проходит время, и простая правка, которая раньше занимала пару часов, растягивается на два дня. Ещё через год на неё может уйти неделя. Обычно дело не в том, что код превратился в кошмар. Просто вокруг него накопился огромный пласт знаний, которые остались в чьей-то голове и нигде не были зафиксированы.",[12,28,29],{},"Появляются обычные вопросы, на которые нет ответа в документации:",[31,32,33,37,40,43,46,49],"ul",{},[34,35,36],"li",{},"зачем нужны два почти одинаковых сервиса;",[34,38,39],{},"какой из них считать основным;",[34,41,42],{},"почему это поле обязательно;",[34,44,45],{},"можно ли менять этот endpoint;",[34,47,48],{},"почему нельзя перезапускать процесс;",[34,50,51],{},"что сломается, если убрать странную проверку.",[12,53,54],{},"Когда-то кто-то всё это понимал. Иногда этим человеком был я сам.",[56,57,59],"h2",{"id":58},"сложность-это-не-количество-файлов","Сложность — это не количество файлов",[12,61,62],{},"Раньше я думал, что управлять сложностью — значит построить правильную архитектуру: грамотно разделить систему на модули, не плодить лишние зависимости, использовать понятные шаблоны, выносить общее, писать тесты.",[12,64,65],{},"Всё это действительно важно. Но со временем мой взгляд изменился.",[12,67,68],{},"Большая система всё равно останется большой. Если в ней несколько приложений, база данных, очередь задач, десяток сервисов, внешние API, фоновые процессы и разные окружения, никакой рефакторинг не превратит её в простой калькулятор.",[12,70,71],{},"Поэтому я больше не пытаюсь сделать сложные системы простыми. Я стараюсь сделать их понятными.",[12,73,74],{},"Это не одно и то же.",[12,76,77],{},"Простота зависит от масштаба задачи. Понятность — от того, насколько хорошо зафиксированы устройство системы, принятые решения и способы проверки.",[56,79,81],{"id":80},"пишу-инструкцию-для-следующего-разработчика","Пишу инструкцию для следующего разработчика",[12,83,84],{},"Только теперь этим следующим разработчиком всё чаще становится AI.",[12,86,87],{},"Для каждого серьёзного проекта я готовлю краткий документ — карту системы. Не толстую документацию на сотни страниц, а рабочий ориентир:",[31,89,90,93,96,99,102,105,108,111,114],{},[34,91,92],{},"что я строю;",[34,94,95],{},"из каких частей состоит система;",[34,97,98],{},"где живёт бизнес-логика;",[34,100,101],{},"что считается главным источником данных;",[34,103,104],{},"как данные проходят через систему;",[34,106,107],{},"какие существуют окружения;",[34,109,110],{},"как устроен релиз;",[34,112,113],{},"какие решения уже приняты;",[34,115,116],{},"какие части лучше не менять, пока не разберёшься в последствиях.",[12,118,119],{},"Раньше такой документ один раз читал новый сотрудник. Потом карта устаревала и постепенно превращалась в археологическую находку.",[12,121,122],{},"С AI ситуация оказалась интереснее. Агент действительно читает карту перед каждой задачей. Документация перестала быть формальностью, которую пишут «потому что положено». Она стала частью рабочего процесса.",[12,124,125],{},"Сначала агент получает контекст, затем изучает код.",[12,127,128],{},"Разница кажется небольшой, но на практике она огромна. Без контекста AI быстро придумывает собственную версию архитектуры. Эта версия может быть вполне логичной, аккуратной и даже красивой. Проблема в том, что она не совпадает с системой, которая уже работает.",[56,130,132],{"id":131},"хорошие-и-плохие-примеры","Хорошие и плохие примеры",[12,134,135],{},"Если однажды в проекте удалось грамотно решить типовую задачу — сделать API-контроллер, воркер, компонент, работу с очередью или интеграцию с внешним сервисом, — нет смысла заставлять следующего агента снова изобретать решение.",[12,137,138],{},"Я сохраняю такие реализации как эталонные примеры. Перед созданием нового компонента агент сначала смотрит, как подобные компоненты принято делать в этом проекте. Он не должен слепо копировать код. Важнее понять подход: структуру, границы ответственности, обработку ошибок и способ проверки.",[12,140,141],{},"Рядом постепенно появилась обратная коллекция: примеры того, как делать не стоит. Она оказалась даже полезнее.",[12,143,144],{},"Например, ответ языковой модели нельзя сразу отдавать пользователю. Модель может вернуть служебный текст, неожиданную разметку, некорректные данные или убедительно сформулированную ошибку.",[12,146,147],{},"Можно один раз исправить такой баг и забыть о нём. А можно сохранить правило:",[149,150,151],"blockquote",{},[12,152,153],{},"Результат LLM — это недоверенный ввод. Перед использованием его нужно проверить.",[12,155,156],{},"Тогда ошибка оставляет после себя не только исправленный код, но и новое знание.",[12,158,159],{},"Мне нравится мысль, что каждый хорошо разобранный баг должен немного снижать вероятность следующего. Иначе я буду бесконечно исправлять одну и ту же ошибку в разных местах.",[56,161,163],{"id":162},"один-факт-одно-место","Один факт — одно место",[12,165,166],{},"Есть простой способ незаметно нарастить сложность: скопировать один список в четыре разных файла.",[12,168,169],{},"Через несколько месяцев эти списки неизбежно начнут отличаться. То же самое происходит с типами данных, конфигурациями, правилами, URL, промптами, статусами и бизнес-ограничениями.",[12,171,172],{},"Поэтому я стараюсь находить для каждого такого факта одно главное место.",[12,174,175],{},"Если есть список сервисов, остальные конфигурации должны строиться на его основе. Если определён общий контракт данных, приложения должны использовать его, а не создавать собственные похожие версии. Если существует системный промпт, не нужно хранить ещё одну его копию прямо в коде.",[12,177,178],{},"Здесь нет сложной архитектурной теории. Если факт записан только в одном месте, невозможно забыть обновить его копию в другом — потому что копии нет.",[56,180,182],{"id":181},"самая-опасная-фраза-заодно","Самая опасная фраза — «заодно»",[12,184,185],{},"AI охотно помогает. Просишь его исправить одну ошибку, а он замечает ещё три потенциальные проблемы, устаревшую библиотеку и дублирование логики. Иногда заодно предлагает перестроить половину архитектуры.",[12,187,188],{},"Нередко он прав. Но исходная задача всё равно заключалась в том, чтобы исправить одну ошибку.",[12,190,191],{},"Поэтому я стал гораздо строже задавать границы работы. Перед заметным изменением агент должен понимать:",[31,193,194,197,200,203,206,209],{},[34,195,196],{},"что именно нужно изменить;",[34,198,199],{},"что не входит в задачу;",[34,201,202],{},"какие части системы могут быть затронуты;",[34,204,205],{},"как выглядит готовый результат;",[34,207,208],{},"чем этот результат будет проверен;",[34,210,211],{},"какие действия могут привести к неприятным последствиям.",[12,213,214],{},"Особенно важно явно перечислять то, чего делать не нужно. Большинство неприятностей в разработке начинается с безобидной фразы: «А давайте заодно…»",[56,216,218],{"id":217},"я-больше-не-верю-фразе-всё-работает","Я больше не верю фразе «всё работает»",[12,220,221],{},"Это относится не только к AI.",[12,223,224],{},"Разработчик пишет код, проверяет его и говорит: «Работает». Но что именно он проверил? Какой результат получил? Соответствует ли это реальному пользовательскому сценарию?",[12,226,227],{},"Теперь для каждого изменения я стараюсь заранее построить понятный путь проверки.",[12,229,230],{},"Если исправляю баг, сначала по возможности воспроизвожу его тестом. Тест падает. Я вношу исправление. Тест проходит. Затем проверяю модуль целиком и сборку. Если изменение затрагивает соседние части системы, проверяю и их. Для критичных функций иду дальше и прохожу настоящий пользовательский сценарий.",[12,232,233],{},"Количество тестов само по себе ничего не доказывает. Важно, чтобы доказательство соответствовало утверждению.",[12,235,236,237,241],{},"Зелёный unit-тест не гарантирует, что функция работает в production. Статус процесса ",[238,239,240],"code",{},"online"," не означает, что пользователь может выполнить нужное действие. Фраза AI «задача полностью выполнена» — это уверенное мнение, а не доказательство.",[12,243,244],{},"Если я утверждаю, что функция работает, у меня должен быть результат проверки именно этой функции.",[56,246,248],{"id":247},"документация-стала-результатом-работы","Документация стала результатом работы",[12,250,251],{},"Здесь AI заметно изменил экономику процесса.",[12,253,254],{},"Раньше после большой задачи приходилось выбирать: двигаться дальше или остановиться и подробно описать сделанное. Нетрудно догадаться, какой вариант чаще побеждал.",[12,256,257],{},"Теперь значительную часть этой работы можно поручить агенту:",[31,259,260,263,266,269,272],{},[34,261,262],{},"изменился архитектурный контракт — обновить его описание;",[34,264,265],{},"нашлась повторяющаяся ошибка — добавить её в список антипаттернов;",[34,267,268],{},"появился новый сервис — дополнить карту проекта;",[34,270,271],{},"изменился пользовательский сценарий — проверить связанные тесты и документацию;",[34,273,274],{},"найден удачный способ решения — сохранить его как пример.",[12,276,277],{},"Конечно, за документацией тоже нужно следить. AI способен уверенно описать собственные догадки как существующее устройство системы. Поэтому код, конфигурация и работающий runtime остаются главными источниками фактов. Документ должен сверяться с ними, а не подменять их.",[12,279,280],{},"Но поддерживать документацию стало настолько дешевле, что уже странно этого не делать.",[12,282,283],{},"У меня получился повторяющийся цикл:",[12,285,286],{},[287,288,289],"strong",{},"задача → код → проверка → новое знание → документация → контекст для следующей задачи",[12,291,292],{},"Проект накапливает не только код. Он накапливает опыт работы с этим кодом.",[56,294,296],{"id":295},"с-чего-начать","С чего начать",[12,298,299],{},"Для такого подхода необязательно сразу создавать сложную систему правил. В качестве отправной точки можно дать агенту базовый промпт:",[301,302,308],"pre",{"className":303,"code":305,"language":306,"meta":307},[304],"language-text","Перед тем как вносить изменения, разберись, как устроен проект:\n\n1. Прочитай основной документ с описанием проекта.\n2. Найди архитектурные правила, эталонные решения, известные ошибки и антипаттерны, относящиеся к задаче.\n3. Не доверяй документации безоговорочно. Проверь реальный код, схемы, API и существующие тесты.\n\nПеред реализацией зафиксируй:\n\n- что нужно изменить;\n- что точно не входит в задачу;\n- какие части системы будут затронуты;\n- как будет выглядеть готовый результат;\n- как ты будешь проверять результат;\n- какие побочные эффекты возможны.\n\nНе расширяй задачу «заодно».\n\nЕсли исправляешь баг или добавляешь новое поведение, по возможности сначала напиши тест, который воспроизводит требуемое изменение.\n\nНе создавай дубликаты типов, конфигураций, списков и бизнес-правил, если в проекте уже есть единый источник истины.\n\nПроводи проверки от узких к широким:\n\n1. Целевой тест.\n2. Тесты затронутой части.\n3. Сборка и проверка типов.\n4. Зависимые проверки.\n5. Полный набор проверок, если он действительно нужен.\n\nНе пиши «всё проверено», если какие-то проверки не выполнялись. Перечисли, что было проверено на самом деле.\n\nЕсли в ходе работы ты обнаружил новое архитектурное правило, повторяющуюся ошибку или важную особенность проекта, предложи обновление документации.\n\nНе выполняй опасные действия — deploy, сброс базы, изменение инфраструктуры или перезапуск production — без отдельной явной команды.\n\nВ конце сообщи:\n\n1. Что было изменено.\n2. Какие контракты затронуты.\n3. Что проверено.\n4. Что обновлено в документации.\n5. Какие риски или нерешённые вопросы остались.\n","text","prompt",[238,309,305],{"__ignoreMap":310},"",[12,312,313],{},"Сам по себе этот промпт не сотворит чудес. Если в проекте нет нормального контекста, тестов и понятных правил, агенту не на что будет опереться.",[12,315,316],{},"Но с чего-то нужно начинать.",[56,318,320],{"id":319},"четвёртый-этап-я-больше-не-откладываю","Четвёртый этап я больше не откладываю",[12,322,323],{},"Раньше я сначала запускал программу, затем дорабатывал интерфейс и стабилизировал систему. О документации, архитектурных правилах и накопленных знаниях вспоминал, когда проект уже начинал трещать под собственной тяжестью. Если на это оставались время и бюджет.",[12,325,326],{},"Теперь четвёртый этап можно выполнять постепенно, одновременно с основной работой.",[12,328,329],{},"Написал код — оставил тест. Принял решение — зафиксировал его. Наступил на грабли — положил их в каталог и подписал. Нашёл хороший способ решить типовую задачу — сохранил его как эталон.",[12,331,332],{},"Следующий AI-агент приходит уже не в пустое поле. Он получает опыт предыдущих задач: карту системы, принятые решения, рабочие примеры, известные ошибки и способы проверки.",[12,334,335],{},"Сложность никуда не исчезла. Большая система осталась большой системой. Но всё меньше её частей держится только в моей памяти.",[12,337,338],{},"И этого уже достаточно, чтобы работать с ней увереннее.",[340,341],"hr",{},[12,343,344,345,350],{},"Если в вашем проекте слишком многое держится в головах отдельных людей, я могу помочь собрать карту системы, определить источники истины и настроить работу AI-агентов так, чтобы они начинали с контекста и заканчивали проверяемым результатом. ",[346,347,349],"a",{"href":348},"\u002Fcontact","Расскажите мне о своей задаче",".",{"title":310,"searchDepth":352,"depth":352,"links":353},2,[354,355,356,357,358,359,360,361,362],{"id":58,"depth":352,"text":59},{"id":80,"depth":352,"text":81},{"id":131,"depth":352,"text":132},{"id":162,"depth":352,"text":163},{"id":181,"depth":352,"text":182},{"id":217,"depth":352,"text":218},{"id":247,"depth":352,"text":248},{"id":295,"depth":352,"text":296},{"id":319,"depth":352,"text":320},"2026-08-23","Как карты проектов, эталонные решения, тесты и документация помогают мне управлять сложностью и безопаснее работать с AI-агентами.","md",false,{},true,"\u002Fblog\u002F2026-08-23-slozhnost-nikuda-ne-ischezla",{"title":6,"description":364},"blog\u002F2026-08-23-slozhnost-nikuda-ne-ischezla",[373,374,375,376,377],"ai","разработка","архитектура","документация","агенты","u2IpebkyZ2KkR21aYLFIdOnMu7sqcDfubssSzmqIzJY",{"id":380,"title":381,"acrostic":7,"body":382,"date":648,"description":649,"duration":7,"emoji":7,"extension":365,"faq":7,"featured":366,"format":7,"image":7,"level":7,"media":7,"meta":650,"navigation":368,"path":651,"price":7,"schedule":7,"seo":652,"seoTitle":653,"serviceType":7,"status":7,"stem":654,"tags":655,"tech":7,"toc":368,"url":7,"__hash__":658},"blog\u002Fblog\u002F2026-08-13-bystryy-deploy-statey.md","Как я ускорил деплой контента в Nuxt: с 12 минут до 21 секунды",{"type":9,"value":383,"toc":635},[384,387,390,394,397,400,404,407,451,458,469,474,480,484,487,511,514,518,524,528,535,538,541,545,548,551,554,558,561,616,619,622,625,628],[12,385,386],{},"Исправить слово или запятую в статье можно за несколько секунд. Но на моём сайте после такой правки запускался полный выпуск: установка зависимостей, сборка Nuxt и админки, генерация страниц, перезапуск приложения и итоговые проверки.",[12,388,389],{},"Последний успешный полный workflow перед запуском новой схемы шёл 12 минут 53 секунды. Для изменений в коде это нормально. Для исправленной запятой — слишком долго.",[56,391,393],{"id":392},"я-разделил-два-разных-выпуска","Я разделил два разных выпуска",[12,395,396],{},"Полный деплой остался для кода, конфигурации и смешанных изменений. Для статей я сделал отдельный путь, который принимает только Markdown блога и не пересобирает всё приложение.",[12,398,399],{},"Это не сокращённая версия обычного деплоя. Быстрый путь работает с отдельной проекцией контента, проверяет точный Git-коммит и переключает новую версию целиком. Если что-то идёт не так, сайт возвращается к предыдущему состоянию.",[56,401,403],{"id":402},"как-устроен-быстрый-путь","Как устроен быстрый путь",[12,405,406],{},"Я добавил три компонента:",[408,409,410,423],"table",{},[411,412,413],"thead",{},[414,415,416,420],"tr",{},[417,418,419],"th",{},"Компонент",[417,421,422],{},"Что делает",[424,425,426,435,443],"tbody",{},[414,427,428,432],{},[429,430,431],"td",{},"Fast renderer",[429,433,434],{},"Готовит разрешённые страницы из выбранного Git-снимка",[414,436,437,440],{},[429,438,439],{},"Gateway",[429,441,442],{},"Направляет обычные запросы в основное приложение, а разрешённые маршруты — в renderer",[414,444,445,448],{},[429,446,447],{},"Активный указатель",[429,449,450],{},"Связывает публичные маршруты с точным Git-коммитом",[12,452,453,454,457],{},"Главная страница, список блога, сама статья и sitemap должны видеть один и тот же набор материалов. Простого копирования ",[238,455,456],{},".md"," на сервер для этого недостаточно: основное приложение продолжит работать с данными и HTML из прежней сборки.",[12,459,460,461,464,465,468],{},"Поэтому renderer читает полный снимок блога из Git и создаёт новую проекцию. Gateway использует её только для маршрутов из строгого списка. Административные страницы, API, неизвестные URL и методы кроме ",[238,462,463],{},"GET"," и ",[238,466,467],{},"HEAD"," остаются на основном приложении.",[470,471,473],"h3",{"id":472},"промпт-спроектировать-быстрый-путь-для-контента","Промпт: спроектировать быстрый путь для контента",[301,475,478],{"className":476,"code":477,"language":306,"meta":307},[304],"Я хочу отделить публикацию 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",[238,479,477],{"__ignoreMap":310},[56,481,483],{"id":482},"как-теперь-публикуется-статья","Как теперь публикуется статья",[12,485,486],{},"Быстрый выпуск получает полный 40-символьный SHA и выполняет несколько шагов:",[488,489,490,496,499,502,505,508],"ol",{},[34,491,492,493,350],{},"Проверяет, что коммит совпадает с вершиной ",[238,494,495],{},"origin\u002Fmain",[34,497,498],{},"Подтверждает, что во всём наборе изменений есть только разрешённые Markdown-файлы.",[34,500,501],{},"Формирует полную проекцию блога для выбранного SHA.",[34,503,504],{},"Записывает её в неизменяемый файл.",[34,506,507],{},"Атомарно переключает активный указатель.",[34,509,510],{},"Открывает главную, блог, sitemap и изменённые статьи через HTTP.",[12,512,513],{},"Перед началом скрипт сохраняет исходный SHA и прежний активный указатель. Если синхронизация или HTTP-проверка завершается ошибкой, он возвращает оба значения назад. Читатель видит либо предыдущую целую версию сайта, либо новую.",[470,515,517],{"id":516},"промпт-проверить-выпуск-перед-подтверждением-успеха","Промпт: проверить выпуск перед подтверждением успеха",[301,519,522],{"className":520,"code":521,"language":306,"meta":307},[304],"Проверь завершившийся 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",[238,523,521],{"__ignoreMap":310},[56,525,527],{"id":526},"где-проходит-граница","Где проходит граница",[12,529,530,531,534],{},"Быстрый путь разрешает добавлять, изменять и удалять только датированные файлы ",[238,532,533],{},"content\u002Fblog\u002F*.md",". Он проверяет весь diff от активной production-версии до запрошенного коммита.",[12,536,537],{},"Переименование, копирование, пустой diff, изменение кода или смешанный набор файлов отправляются в полный деплой. Если классификатор не может доказать, что перед ним только статьи, ускорения не будет.",[12,539,540],{},"Это ограничение важнее самой скорости. Без него отдельный путь постепенно превратился бы в запасной деплой для любых изменений.",[56,542,544],{"id":543},"эта-статья-стала-проверкой-нового-пути","Эта статья стала проверкой нового пути",[12,546,547],{},"Когда быстрый деплой был готов, его требовалось проверить настоящей публикацией. Я решил не создавать проходную тестовую заметку, а написать статью о самой работе. Тема того стоила: ожидаемый путь публикации сокращался с почти 13 минут до нескольких секунд.",[12,549,550],{},"Черновик родился в той же рабочей сессии с AI-агентом, где я вводил новую схему в production. В контексте ещё оставались исходная задача, неудачные проверки, откаты, команды и фактическая приёмка. Из этого журнала я собрал последовательный рассказ, а код и логи не позволили приписать системе то, чего она ещё не доказала.",[12,552,553],{},"Получился полезный цикл: рабочая сессия дала материал для статьи, а статья стала первым реальным тестом результата этой сессии.",[56,555,557],{"id":556},"что-показала-первая-публикация","Что показала первая публикация",[12,559,560],{},"Первый успешный выпуск этой статьи занял 21 секунду по времени GitHub Actions. Сам production-скрипт от начала проверки до завершения локальной приёмки отработал за 13,36 секунды.",[408,562,563,574],{},[411,564,565],{},[414,566,567,570],{},[417,568,569],{},"Этап",[417,571,573],{"align":572},"right","Время",[424,575,576,584,592,600,608],{},[414,577,578,581],{},[429,579,580],{},"Проверка набора файлов",[429,582,583],{"align":572},"1,73 с",[414,585,586,589],{},[429,587,588],{},"Git-проверка и переход",[429,590,591],{"align":572},"1,01 с",[414,593,594,597],{},[429,595,596],{},"Синхронизация контента",[429,598,599],{"align":572},"2,91 с",[414,601,602,605],{},[429,603,604],{},"HTTP-приёмка",[429,606,607],{"align":572},"7,67 с",[414,609,610,613],{},[429,611,612],{},"Весь production-скрипт",[429,614,615],{"align":572},"13,36 с",[12,617,618],{},"Для сравнения я беру одинаковую внешнюю границу — длительность job в GitHub Actions. Полный workflow шёл 12 минут 53 секунды, быстрый — 21 секунду. В этой публикации выпуск ускорился в 36,8 раза.",[12,620,621],{},"Основной Nuxt-процесс, renderer и gateway не перезапускались: их PID и счётчики перезапусков до и после совпали. При этом сохранились проверка точного SHA, контроль набора файлов, согласованность маршрутов, HTTP-приёмка и автоматический откат.",[12,623,624],{},"Полный деплой никуда не исчез. Он по-прежнему обслуживает изменения в коде и остаётся точкой восстановления. Следующая полная сборка включает опубликованные статьи в обычный Nuxt-артефакт, после чего временная проекция больше не нужна.",[12,626,627],{},"Эта статья стала первой принятой проверкой быстрого пути. Два следующих обновления того же Markdown также прошли без полной сборки и перезапуска процессов. Быстрый выпуск теперь обслуживает обычные правки статей, а полный деплой остаётся для изменений в коде и включает актуальный контент в основной Nuxt-артефакт.",[12,629,630,631,634],{},"У вас публикация одной правки тоже запускает долгую сборку? ",[346,632,633],{"href":348},"Напишите мне",". Я посмотрю, где в проекте проходит граница между контентом и кодом, и помогу спроектировать быстрый путь так, чтобы он не обходил проверки и rollback.",{"title":310,"searchDepth":352,"depth":352,"links":636},[637,638,642,645,646,647],{"id":392,"depth":352,"text":393},{"id":402,"depth":352,"text":403,"children":639},[640],{"id":472,"depth":641,"text":473},3,{"id":482,"depth":352,"text":483,"children":643},[644],{"id":516,"depth":641,"text":517},{"id":526,"depth":352,"text":527},{"id":543,"depth":352,"text":544},{"id":556,"depth":352,"text":557},"2026-08-13","Как я отделил публикацию Markdown от полной сборки Nuxt-сайта и сократил время выпуска статьи с 12 минут 53 секунд до 21 секунды.",{},"\u002Fblog\u002F2026-08-13-bystryy-deploy-statey",{"title":381,"description":649},"Как ускорить деплой контента в Nuxt с 12 минут до 21 секунды","blog\u002F2026-08-13-bystryy-deploy-statey",[374,656,657,373],"devops","nuxt","1n9Sf3zXrOYTRK2HYmG9VeX610rfCZ8PNaTY3It3_qE",{"id":660,"title":661,"acrostic":7,"body":662,"date":648,"description":999,"duration":7,"emoji":7,"extension":365,"faq":7,"featured":366,"format":7,"image":7,"level":7,"media":7,"meta":1000,"navigation":368,"path":1001,"price":7,"schedule":7,"seo":1002,"seoTitle":1003,"serviceType":7,"status":7,"stem":1004,"tags":1005,"tech":7,"toc":368,"url":7,"__hash__":1008},"blog\u002Fblog\u002F2026-08-13-ot-open-source-k-multitenant-saas.md","От open-source для одного автосервиса к мультитенантному SaaS",{"type":9,"value":663,"toc":989},[664,667,670,673,676,679,682,685,689,692,695,698,701,704,727,730,733,736,740,743,746,749,752,755,760,763,766,789,792,796,799,802,805,808,811,814,817,820,823,826,831,834,838,841,844,847,850,853,856,860,863,866,869,872,875,898,901,904,907,910,914,917,920,923,926,929,932,936,939,942,945,948,951,954,957,961,964,967,970,973,976,979,982],[12,665,666],{},"Когда я начинал этот проект, задача выглядела довольно понятно.",[12,668,669],{},"Нужно было сделать код для одного автосервиса. Предполагалось, что затем владельцы других сервисов смогут взять open-source продукт, развернуть его у себя и пользоваться им самостоятельно: вести клиентов, автомобили, заказы, документы и работу сотрудников.",[12,671,672],{},"Для первого этапа такая модель была естественной. Она позволяла сосредоточиться на самом продукте, а не на платформе вокруг него. У каждого сервиса была бы своя установка, свои данные, своё окружение и свой темп обновлений.",[12,674,675],{},"Но по мере работы стало видно, что продукт идёт в другую сторону.",[12,677,678],{},"Нам нужен был не набор независимых установок, а единый сервис для многих автосервисов. Такой, где организация создаёт своё рабочее пространство, получает изолированные данные и обновления без отдельного развёртывания каждой новой версии.",[12,680,681],{},"Так проект перешёл от open-source модели к мультитенантному SaaS.",[12,683,684],{},"На словах это иногда звучит как небольшая архитектурная задача: добавить организациям идентификаторы, разделить данные, настроить роли. На деле пришлось пересмотреть почти все границы продукта.",[56,686,688],{"id":687},"старая-модель-перестала-отвечать-на-новые-вопросы","Старая модель перестала отвечать на новые вопросы",[12,690,691],{},"Установка для одного автосервиса и SaaS для множества организаций могут выполнять похожие функции. В обоих случаях есть клиенты, автомобили, заказы, сотрудники и документы.",[12,693,694],{},"Но ответственность устроена по-разному.",[12,696,697],{},"В самостоятельной установке каждый владелец сервиса отвечает за своё окружение. Он решает, когда обновляться, как поддерживать инфраструктуру и что делать, если версия продукта расходится с другими установками.",[12,699,700],{},"В SaaS система одна, но внутри неё работают независимые организации. Они не должны видеть данные друг друга, влиять на чужие процессы или получать доступ к действиям, которые не относятся к их роли.",[12,702,703],{},"Из-за этого появились вопросы, которые нельзя было оставлять на потом:",[31,705,706,709,712,715,718,721,724],{},[34,707,708],{},"как пользователь создаёт организацию и попадает в нужный автосервис;",[34,710,711],{},"кому принадлежат автомобили, заказы и документы;",[34,713,714],{},"что видит владелец автомобиля;",[34,716,717],{},"какие действия доступны сотруднику сервиса;",[34,719,720],{},"что может делать механик;",[34,722,723],{},"где заканчиваются права организации и начинаются полномочия самой платформы;",[34,725,726],{},"как выпускать обновления одновременно для всех, не превращая каждый релиз в отдельный проект.",[12,728,729],{},"Пока продукт рассчитан на одну установку, часть этих вопросов легко не заметить. Когда внутри одной системы появляются разные организации, неявные договорённости становятся риском.",[12,731,732],{},"Я понял, что недостаточно добавить к старой модели несколько новых полей и назвать результат мультитенантностью. В таком случае старый продукт остаётся внутри нового, а вокруг него постепенно растут исключения, флаги и переходники.",[12,734,735],{},"Через несколько месяцев уже трудно понять, что относится к текущей модели, а что осталось от прежней.",[56,737,739],{"id":738},"не-добавлять-слой-сверху-а-поменять-основу","Не добавлять слой сверху, а поменять основу",[12,741,742],{},"Главное решение здесь было не техническим, а продуктовым.",[12,744,745],{},"Проект всё ещё находился в разработке. Не было клиентского трафика и данных, ради которых пришлось бы годами поддерживать прежнюю логику. Поэтому я выбрал более прямой путь: не строить совместимость с тем, что больше не нужно.",[12,747,748],{},"Если старая сущность или сценарий противоречили новой модели, их не нужно было сохранять «на всякий случай». Их можно было убрать.",[12,750,751],{},"Это не сделало работу маленькой. Зато она стала честнее.",[12,753,754],{},"Вместо вопроса «как сохранить все старые сценарии?» появился другой:",[149,756,757],{},[12,758,759],{},"Какая модель нужна продукту сейчас и какие границы в ней нельзя размывать?",[12,761,762],{},"Основой стала понятная последовательность: исходный запрос превращается в сервисный запрос, затем в заказ конкретного автосервиса. История изменений заказа сохраняется отдельно, чтобы новые правки не переписывали прошлое задним числом.",[12,764,765],{},"Когда процесс определён, проще задать остальные границы:",[31,767,768,771,774,777,780,783,786],{},[34,769,770],{},"кому принадлежит заказ;",[34,772,773],{},"кто имеет право его увидеть;",[34,775,776],{},"кто меняет статус;",[34,778,779],{},"что может делать сервис;",[34,781,782],{},"что относится к работе механика;",[34,784,785],{},"какие данные должен видеть владелец автомобиля;",[34,787,788],{},"где проходит граница между организациями.",[12,790,791],{},"Это не универсальная схема для любого продукта. Но для нашей платформы она стала опорой, от которой можно проверять решения.",[56,793,795],{"id":794},"разные-роли-не-должны-жить-в-одном-кабинете","Разные роли не должны жить в одном кабинете",[12,797,798],{},"На ранней стадии продукта хочется собрать всё в одном интерфейсе. Кажется, что так быстрее: один фронтенд, одна навигация, а лишние пункты меню можно скрывать в зависимости от роли.",[12,800,801],{},"Проблема в том, что скрытое меню не создаёт границ.",[12,803,804],{},"Владелец автомобиля, сотрудник сервиса, механик и платформенный администратор смотрят на один и тот же заказ по-разному. У них разные задачи, разный объём информации и разная цена ошибки.",[12,806,807],{},"Поэтому я разделил эти сценарии.",[12,809,810],{},"Публичная часть рассказывает о сервисе и ведёт человека в нужный путь.",[12,812,813],{},"Кабинет владельца автомобиля нужен для его машин, заявок и истории обслуживания.",[12,815,816],{},"Рабочее пространство автосервиса предназначено для заказов, клиентов, автомобилей, документов, сотрудников и внутренних процессов организации.",[12,818,819],{},"Рабочее место механика намеренно уже. Механик должен видеть назначенные ему работы, а не всю коммерческую и клиентскую информацию сервиса.",[12,821,822],{},"Отдельно существует платформенное администрирование. Это не кабинет автосервиса с дополнительными кнопками, а контур управления самой платформой.",[12,824,825],{},"Такое разделение добавляет работы на старте. Зато у каждого интерфейса появляется простой вопрос:",[149,827,828],{},[12,829,830],{},"Что этот человек должен сделать здесь сейчас?",[12,832,833],{},"Если на него нет ясного ответа, экран или действие, вероятно, лишние.",[56,835,837],{"id":836},"роль-это-не-настройка-интерфейса","Роль — это не настройка интерфейса",[12,839,840],{},"При переходе к SaaS легко принять визуальные ограничения за настоящую защиту.",[12,842,843],{},"Например, можно скрыть от механика кнопку редактирования. Это полезно для интерфейса, но ничего не гарантирует, если сервер всё равно принимает запрос.",[12,845,846],{},"Поэтому правила должны работать не только на экране. Система сама определяет, кто выполняет действие, к какой организации относится пользователь, в каком рабочем контексте он находится и имеет ли право на конкретный запрос.",[12,848,849],{},"Интерфейс помогает человеку не ошибиться. Окончательное решение остаётся за сервером.",[12,851,852],{},"То же относится к данным. Если механику не нужны финансовые сведения, лишние данные клиента или служебные поля, их не стоит просто прятать в интерфейсе. Они не должны попадать в его рабочий набор данных вовсе.",[12,854,855],{},"Это не попытка усложнить продукт. Это нормальная дисциплина для системы, где рядом работают разные организации и разные роли.",[56,857,859],{"id":858},"почему-я-не-стал-переписывать-всё-одним-заходом","Почему я не стал переписывать всё одним заходом",[12,861,862],{},"Большие переделки часто ломаются не потому, что команда не умеет писать код. Они ломаются, когда изменения невозможно проверить по частям.",[12,864,865],{},"Поэтому переход я разделил на шесть волн разработки.",[12,867,868],{},"Сначала нужно было зафиксировать доменную модель и убрать то, что конфликтовало с ней. Затем отдельно выстраивались сценарии доступа, жизненный цикл заказов, интерфейсы разных ролей, операционный контур и выпуск.",[12,870,871],{},"У каждой волны был свой проверяемый вопрос.",[12,873,874],{},"Не «готов ли уже весь продукт?», а, например:",[31,876,877,880,883,886,889,892,895],{},[34,878,879],{},"работают ли организации только со своими данными;",[34,881,882],{},"не остались ли активные сценарии прежней модели;",[34,884,885],{},"можно ли получить доступ к чужому заказу прямым запросом;",[34,887,888],{},"не выдаёт ли публичная ссылка лишнюю информацию;",[34,890,891],{},"сохраняется ли история изменений;",[34,893,894],{},"видит ли механик только назначенные ему работы;",[34,896,897],{},"можно ли развернуть новую версию и подтвердить её состояние без ручных действий на сервере.",[12,899,900],{},"Каждая волна должна была заканчиваться не отчётом о проделанной работе, а доказательствами: тестами, сборкой, проверкой схемы данных, проверкой прав доступа, отсутствием устаревших маршрутов и проверкой выпуска.",[12,902,903],{},"AI-агенты здесь заметно ускорили работу. Они помогали параллельно исследовать разные части проекта, находить старые зависимости, готовить проверки и проверять достижимость маршрутов.",[12,905,906],{},"Но направление и приёмка оставались за мной.",[12,908,909],{},"Агент может предложить изменение или сообщить, что задача завершена. Он не решает, какую старую сущность нужно сохранить, где проходит продуктовая граница между ролями и достаточно ли доказательств перед выпуском. Его отчёт остаётся гипотезой, пока я не проверю код, тесты и фактическое поведение системы.",[56,911,913],{"id":912},"временные-решения-быстро-становятся-постоянными","Временные решения быстро становятся постоянными",[12,915,916],{},"Во время большого перехода постоянно хочется сказать: «Пока оставим старое, потом разберёмся».",[12,918,919],{},"Иногда это необходимо. Если в системе уже есть пользователи, исторические данные и обязательства, переход должен быть осторожным.",[12,921,922],{},"Но когда продукт ещё можно менять свободно, временная совместимость быстро обрастает постоянными ветками.",[12,924,925],{},"Остаётся старый маршрут «на всякий случай». Прежняя сущность продолжает использоваться в одном экране. Новый сценарий начинает принимать два формата данных. В интерфейсе появляется переключатель между старым и новым поведением.",[12,927,928],{},"Через несколько месяцев трудно объяснить, что из этого действительно нужно продукту, а что просто осталось от незавершённого переезда.",[12,930,931],{},"Я старался не поддерживать старую модель там, где она мешала новой. Это помогло упростить не презентацию, а реальное поведение системы: убрать лишние ветки, исключения и правила, которые держатся только на памяти людей, работавших с проектом раньше.",[56,933,935],{"id":934},"production-тоже-часть-продукта","Production — тоже часть продукта",[12,937,938],{},"После того как код написан и тесты проходят, легко решить, что работа закончена.",[12,940,941],{},"На самом деле начинается другой этап.",[12,943,944],{},"Для SaaS недостаточно, чтобы проект собирался на локальной машине. Нужно понимать, как он запускается, где хранятся данные, какие сервисы доступны извне, как разделены окружения, что произойдёт при ошибке и как подтвердить, что новая версия действительно работает.",[12,946,947],{},"Поэтому выпуск я проверял отдельно.",[12,949,950],{},"До него были резервные копии и подготовленный путь отката. После него — состояние процессов, доступность публичных точек входа, целостность базы и отсутствие открытых наружу внутренних сервисов.",[12,952,953],{},"Это не самая заметная часть работы. Её не покажешь красивым скриншотом. Но именно здесь становится понятно, есть ли перед тобой продукт или просто набор исходников.",[12,955,956],{},"Переход на мультитенантную модель завершён. Платформа работает как единый SaaS-продукт, а не как кодовая база для множества самостоятельных установок.",[56,958,960],{"id":959},"что-дальше","Что дальше",[12,962,963],{},"На этом работа не закончилась.",[12,965,966],{},"Переход на SaaS решил одну большую задачу: теперь продукт построен как единая платформа с разделёнными организациями, ролями и рабочими сценариями.",[12,968,969],{},"Но архитектурная готовность не означает, что интерфейс уже идеален.",[12,971,972],{},"Сейчас я отдельно переделываю UI. Это другая работа: как сделать сложную систему понятной для владельца автомобиля, сотрудника сервиса, механика и администратора платформы. Когда там появится материал, которым можно делиться, я расскажу об этом отдельно.",[12,974,975],{},"Эта история для меня не только про автосервисы и мультитенантность.",[12,977,978],{},"Она про момент, когда нужно признать: первоначальная версия продукта выполнила свою задачу, но больше не подходит следующей версии замысла.",[12,980,981],{},"В такой момент не всегда нужно аккуратно развивать то, что уже есть. Иногда честнее заново определить основу, разделить переход на проверяемые части и оставить в системе только то, что действительно нужно будущему продукту.",[12,983,984,985,988],{},"Если вы тоже переводите продукт из самостоятельных установок в единый сервис, ",[346,986,987],{"href":348},"напишите мне",". Я помогу разобрать границы данных, ролей, сценариев доступа и выпусков, которые стоит определить до того, как переход обрастёт временной совместимостью.",{"title":310,"searchDepth":352,"depth":352,"links":990},[991,992,993,994,995,996,997,998],{"id":687,"depth":352,"text":688},{"id":738,"depth":352,"text":739},{"id":794,"depth":352,"text":795},{"id":836,"depth":352,"text":837},{"id":858,"depth":352,"text":859},{"id":912,"depth":352,"text":913},{"id":934,"depth":352,"text":935},{"id":959,"depth":352,"text":960},"Почему я отказался от модели самостоятельных open-source установок и как перевёл разрабатываемую платформу автосервисов на мультитенантный SaaS.",{},"\u002Fblog\u002F2026-08-13-ot-open-source-k-multitenant-saas",{"title":661,"description":999},"Как перевести продукт из open-source в мультитенантный SaaS","blog\u002F2026-08-13-ot-open-source-k-multitenant-saas",[374,1006,375,1007],"saas","автосервисы","QLNoN3ETI4iw7QvXpguCi0hvXZYrCiW1LW-LzCHlakY",{"id":1010,"title":1011,"acrostic":7,"body":1012,"date":2075,"description":2076,"duration":7,"emoji":7,"extension":365,"faq":7,"featured":366,"format":7,"image":7,"level":7,"media":7,"meta":2077,"navigation":368,"path":2078,"price":7,"schedule":7,"seo":2079,"seoTitle":2080,"serviceType":7,"status":7,"stem":2081,"tags":2082,"tech":7,"toc":368,"url":7,"__hash__":2086},"blog\u002Fblog\u002F2026-08-12-lichnyy-sayt-ai-agenty.md","Личный сайт в эпоху AI-агентов: как запустить и развивать его без хаоса",{"type":9,"value":1013,"toc":2046},[1014,1017,1020,1023,1026,1029,1033,1053,1057,1060,1063,1066,1069,1074,1077,1080,1083,1087,1090,1093,1147,1150,1155,1158,1162,1165,1168,1171,1191,1194,1197,1202,1205,1209,1215,1218,1222,1225,1228,1231,1248,1251,1255,1261,1264,1268,1271,1274,1277,1331,1334,1337,1342,1346,1352,1356,1359,1362,1416,1419,1422,1426,1429,1432,1449,1455,1458,1461,1478,1481,1484,1488,1495,1498,1515,1518,1521,1526,1529,1534,1537,1541,1544,1555,1754,1757,1761,1767,1770,1774,1777,1781,1787,1791,1797,1801,1807,1811,1814,1817,1820,1864,1867,1871,1874,1928,1931,1934,1937,1941,1944,2014,2017,2021,2024,2027,2030,2033,2036,2042],[12,1015,1016],{},"Личный сайт легко представить как разовую задачу: купить домен, выбрать шаблон, написать «обо мне», добавить контакты — и наконец-то поставить галочку.",[12,1018,1019],{},"Но через несколько месяцев оказывается, что на сайте висит старая услуга, в проектах не видно последних работ, блог ждёт первую публикацию, а форму связи страшно трогать, потому что непонятно, кто и как её настраивал.",[12,1021,1022],{},"С появлением AI-агентов проблема не исчезла. Сайт стало проще быстро собрать, написать для него тексты и даже развернуть на сервере. Но скорость не гарантирует, что он окажется полезным, узнаваемым и живым. За вечер агент способен предложить структуру, сгенерировать блоки и составить план публикаций. С той же скоростью он может наполнить сайт общими словами, выдуманными кейсами и разделами, которые никто не будет поддерживать.",[12,1024,1025],{},"Поэтому для меня личный сайт — не «страница о себе» и не демонстрация того, что AI умеет писать код. Это рабочая площадка, где постепенно собираются проекты, мысли, доказательства опыта и поводы начать разговор.",[12,1027,1028],{},"AI здесь не заменяет автора. Он помогает превратить живой опыт в материал, проверить повторяющиеся вещи и поддерживать ритм обновлений. Но цель сайта, факты, интонация и решение о публикации остаются за человеком.",[56,1030,1032],{"id":1031},"коротко","Коротко",[31,1034,1035,1038,1041,1044,1047,1050],{},[34,1036,1037],{},"Сначала нужно определить роль сайта: что посетитель должен понять и сделать, а не выбирать шаблон.",[34,1039,1040],{},"Лучшая основа для статьи или кейса часто появляется не в пустом документе, а в голосовой заметке после работы, встречи или мысли в дороге.",[34,1042,1043],{},"Агент может расшифровать запись, выделить структуру, подготовить черновик и проверить материал, но не должен придумывать факты и публиковать без подтверждения.",[34,1045,1046],{},"Первую версию сайта стоит ограничить несколькими рабочими сценариями: понять, чем я занимаюсь, увидеть результаты, прочитать материалы и связаться.",[34,1048,1049],{},"Для собственного сайта я рекомендую Nuxt: он даёт серверный рендеринг, хорошую основу для SEO, Markdown-контент и возможность добавлять формы и интеграции без смены платформы.",[34,1051,1052],{},"Сайт лучше размещать на контролируемом VPS или выделенном сервере, а обновления проводить по понятному, проверяемому процессу.",[56,1054,1056],{"id":1055},"сайт-не-визитка-а-собственная-площадка","Сайт — не визитка, а собственная площадка",[12,1058,1059],{},"Социальные сети, мессенджеры, площадки для портфолио и агрегаторы полезны. Они помогают знакомиться, получать внимание и поддерживать связь. Но правила там всегда чужие: меняется алгоритм, исчезает формат, публикация уходит глубоко в ленту, а аккаунт может попасть под ограничения.",[12,1061,1062],{},"Сайт не отменяет эти каналы. Он связывает их между собой.",[12,1064,1065],{},"В коротком посте я могу оставить одну мысль и привести человека к подробной статье. В описании проекта — показать не только красивый скриншот, но и задачу, ход решения, ограничения и результат. На странице услуг — объяснить, в каком формате начинается работа. В контактах — предложить простой путь к разговору.",[12,1067,1068],{},"Поэтому до дизайна и кода я бы зафиксировал роль сайта одной фразой. Например:",[149,1070,1071],{},[12,1072,1073],{},"Помочь посетителю быстро понять, чем я занимаюсь, увидеть реальные работы и материалы, а затем выбрать следующий шаг: написать, обсудить проект или вернуться за новой заметкой.",[12,1075,1076],{},"Это не рекламный слоган, а критерий для следующих решений.",[12,1078,1079],{},"Если хочется добавить новый раздел, я могу спросить: он помогает посетителю пройти нужный маршрут или просто кажется хорошей идеей? Если хочется переделать главную, станет ли яснее, что здесь происходит? Если ответ неясен, вероятно, задача ещё не проработана.",[12,1081,1082],{},"Без этой опоры личный сайт быстро превращается в склад блоков: проекты, навыки, сертификаты, отзывы, блог, восемь иконок, анимация и ссылка на мессенджер. Формально всё на месте, но человеку по-прежнему непонятно, зачем он сюда пришёл.",[56,1084,1086],{"id":1085},"распределить-роли-автор-агент-и-работающая-система","Распределить роли: автор, агент и работающая система",[12,1088,1089],{},"AI-агенты особенно полезны там, где нужно быстро разобрать много материала, подготовить несколько вариантов или не забыть повторяющуюся проверку. Но они не получают автоматически право решать, что является правдой обо мне и моём деле.",[12,1091,1092],{},"Я разделяю ответственность так:",[408,1094,1095,1105],{},[411,1096,1097],{},[414,1098,1099,1102],{},[417,1100,1101],{},"За автором",[417,1103,1104],{},"Можно поручить AI-помощнику",[424,1106,1107,1115,1123,1131,1139],{},[414,1108,1109,1112],{},[429,1110,1111],{},"Цель сайта, аудитория и позиционирование",[429,1113,1114],{},"Исследование структуры похожих сайтов и сценариев посетителя",[414,1116,1117,1120],{},[429,1118,1119],{},"Факты, реальные проекты, обещания и границы",[429,1121,1122],{},"Расшифровка голосовых заметок и выделение тем",[414,1124,1125,1128],{},[429,1126,1127],{},"Личный голос и финальная редактура",[429,1129,1130],{},"План статьи, варианты заголовков, черновик из моих материалов",[414,1132,1133,1136],{},[429,1134,1135],{},"Решение о публикации",[429,1137,1138],{},"Проверка ссылок, метаданных, доступности и чек-листа",[414,1140,1141,1144],{},[429,1142,1143],{},"Доступы, production и рискованные изменения",[429,1145,1146],{},"Сборка, тесты, отчёт об изменённых файлах и рисках",[12,1148,1149],{},"Такое разделение не означает, что агенту нельзя доверять. Оно делает доверие понятным: я вижу, какую часть работы он ускоряет и где решение должен принять я.",[149,1151,1152],{},[12,1153,1154],{},"Агентский отчёт — это полезная гипотеза. Доказательством он становится после проверки текста, кода, публичной страницы или нужного пользовательского сценария.",[12,1156,1157],{},"Это особенно важно для личного сайта. Один выдуманный результат в кейсе подрывает доверие сильнее, чем отсутствие десятка красивых карточек. Одна сломанная форма связи может стоить реального разговора. А одна самовольная публикация превращает помощника в источник риска.",[56,1159,1161],{"id":1160},"начинать-статью-можно-с-голосовой-заметки","Начинать статью можно с голосовой заметки",[12,1163,1164],{},"Самая трудная часть регулярных обновлений сайта часто не техническая. Нужно сесть перед пустым документом и собрать мысли в связный текст. После рабочего дня, встречи или сложного проекта на это обычно не хватает времени — хотя именно тогда в голове есть живые детали.",[12,1166,1167],{},"Поэтому я считаю голосовую заметку хорошей стартовой точкой.",[12,1169,1170],{},"Можно открыть диктофон и за несколько минут проговорить:",[31,1172,1173,1176,1179,1182,1185,1188],{},[34,1174,1175],{},"что произошло;",[34,1177,1178],{},"какая была задача;",[34,1180,1181],{},"почему она оказалась непростой;",[34,1183,1184],{},"какое решение я выбрал;",[34,1186,1187],{},"что сработало или не сработало;",[34,1189,1190],{},"какой вывод может быть полезен другому человеку.",[12,1192,1193],{},"Не нужно пытаться говорить литературно. На этом этапе важнее сохранить ход мысли, конкретные обстоятельства и собственную интонацию. Голосом часто легче сказать: «я сначала думал так, но потом увидел вот это», чем немедленно превратить опыт в гладкий текст.",[12,1195,1196],{},"Дальше появляется понятный маршрут:",[149,1198,1199],{},[12,1200,1201],{},"рабочее событие или мысль → голосовая заметка → расшифровка → структура от агента → проверка фактов автором → черновик → техническая проверка → публикация.",[12,1203,1204],{},"Расшифровка — не готовая статья. В ней будут повторы, обрывки фраз, оговорки и мысли, которые хорошо звучат в разговоре, но не обязаны попадать в публичный текст. Это сырьё с реальным материалом, а не попытка AI заполнить тишину общими фразами.",[470,1206,1208],{"id":1207},"промпт-из-голосовой-расшифровки-в-план-и-черновик","Промпт: из голосовой расшифровки в план и черновик",[301,1210,1213],{"className":1211,"code":1212,"language":306,"meta":307},[304],"Я дам тебе расшифровку моей голосовой заметки для личного сайта.\n\nТвоя задача:\n1. Выделить главную мысль, целевую аудиторию и практическую пользу.\n2. Отделить подтверждённые факты от личных оценок,\n   предположений и мест, которые нужно уточнить.\n3. Предложить 4–6 информативных заголовков без кликбейта.\n4. Собрать подробный план статьи.\n5. Подготовить черновик от первого лица, сохраняя мою интонацию.\n\nОграничения:\n- Не выдумывай факты, кейсы, цифры, клиентов или результаты.\n- Не заменяй конкретику общими рекламными формулировками.\n- Не публикуй и не меняй файлы.\n- Если материала недостаточно, сначала задай точные вопросы.\n\nФормат ответа:\n1. Главная мысль.\n2. Что требует уточнения.\n3. Варианты заголовка.\n4. План.\n5. Черновик.\n",[238,1214,1212],{"__ignoreMap":310},[12,1216,1217],{},"Перед публикацией я всё равно проверяю имена, даты, цифры, обещания, описание результатов и собственную интонацию. Агент может хорошо структурировать мысль, но не знает без моей проверки, какая деталь конфиденциальна, какой пример можно вынести публично и где я сам ещё сомневаюсь.",[56,1219,1221],{"id":1220},"сначала-бриф-потом-страницы","Сначала бриф, потом страницы",[12,1223,1224],{},"У сайта личного бренда есть простая задача: помочь человеку быстро сориентироваться. Но для каждого автора конкретный маршрут будет своим.",[12,1226,1227],{},"Кому-то нужно собирать заявки на услуги. Кому-то — показывать опыт, чтобы проще проходить собеседования и начинать партнёрства. Кому-то важнее регулярно публиковать материалы и строить вокруг них профессиональное сообщество.",[12,1229,1230],{},"Прежде чем открывать редактор или давать агенту команду «сделай сайт», я бы ответил на несколько вопросов:",[488,1232,1233,1236,1239,1242,1245],{},[34,1234,1235],{},"Для кого сайт?",[34,1237,1238],{},"Что этот человек должен понять за первую минуту?",[34,1240,1241],{},"Какое действие для него главное: написать, оставить заявку, изучить проекты, прочитать материал, записаться на обучение?",[34,1243,1244],{},"Какие доказательства у меня уже есть: проекты, отзывы, заметки, выступления, продукты?",[34,1246,1247],{},"Что сознательно не входит в первую версию?",[12,1249,1250],{},"Последний вопрос часто спасает запуск. Он не даёт превратить небольшой сайт в бесконечный проект с личным кабинетом, каталогом, десятками пустых разделов и космическим кораблём на первом экране.",[470,1252,1254],{"id":1253},"промпт-интервью-для-брифа-сайта","Промпт: интервью для брифа сайта",[301,1256,1259],{"className":1257,"code":1258,"language":306,"meta":307},[304],"Помоги мне подготовить бриф для личного сайта.\n\nПроведи интервью: задавай по одному короткому вопросу за раз.\nСначала выясни:\n- кому нужен сайт;\n- что посетитель должен понять за первую минуту;\n- какое действие для него главное;\n- какие проекты, услуги, материалы и доказательства уже есть;\n- что не входит в первую версию;\n- кто и как будет обновлять сайт после запуска.\n\nПравила:\n- Не предлагай дизайн и технологии, пока не собран смысловой бриф.\n- Не придумывай опыт, отзывы, результаты или позиционирование вместо меня.\n- Если я отвечаю расплывчато, задай уточняющий вопрос с примером выбора.\n\nВ финале подготовь:\n1. Цель сайта в одной фразе.\n2. Портреты основных посетителей.\n3. Три–пять ключевых сценариев.\n4. Состав первой версии.\n5. Список недостающих материалов.\n6. Риски и открытые вопросы.\n",[238,1260,1258],{"__ignoreMap":310},[12,1262,1263],{},"Такой промпт полезен не только в разговоре с агентом. Он заставляет сформулировать то, что обычно остаётся в голове, а потом превращается в противоречивые пожелания к дизайну.",[56,1265,1267],{"id":1266},"первая-версия-должна-работать-а-не-казаться-полной","Первая версия должна работать, а не казаться полной",[12,1269,1270],{},"Есть соблазн сначала сделать «полный» сайт: собрать все проекты за десять лет, написать большую биографию, найти идеальные фотографии, придумать страницу для каждой услуги, перенести старые тексты и ещё добавить несколько функций на будущее.",[12,1272,1273],{},"Так сайт начинает выглядеть серьёзно — и долго не выходит к людям.",[12,1275,1276],{},"Я бы запускал первую версию, когда она честно и понятно решает несколько главных сценариев:",[408,1278,1279,1289],{},[411,1280,1281],{},[414,1282,1283,1286],{},[417,1284,1285],{},"Сценарий посетителя",[417,1287,1288],{},"Что должно быть на сайте",[424,1290,1291,1299,1307,1315,1323],{},[414,1292,1293,1296],{},[429,1294,1295],{},"Человек впервые видит ссылку",[429,1297,1298],{},"Ясная главная страница: кто я и чем занимаюсь",[414,1300,1301,1304],{},[429,1302,1303],{},"Потенциальный клиент оценивает опыт",[429,1305,1306],{},"Несколько конкретных проектов, подход и удобный контакт",[414,1308,1309,1312],{},[429,1310,1311],{},"Коллега или читатель хочет понять мой взгляд",[429,1313,1314],{},"Заметки, статьи, выступления или другие материалы",[414,1316,1317,1320],{},[429,1318,1319],{},"Человек возвращается позже",[429,1321,1322],{},"Признаки живого сайта: актуальные проекты и новые публикации",[414,1324,1325,1328],{},[429,1326,1327],{},"Нужен конкретный ответ",[429,1329,1330],{},"Быстрый путь к услуге, статье или форме связи",[12,1332,1333],{},"Для старта обычно достаточно главной, проектов, заметок и контактов. Услуги, обучение, музыка, стихи или другие разделы стоит добавлять не потому, что «так бывает у личных сайтов», а когда они поддерживают реальную часть моей работы.",[12,1335,1336],{},"Вместо двадцати поверхностных карточек лучше показать три проекта, о которых можно рассказать по существу. Вместо биографии на пять экранов — несколько точных абзацев. Вместо блока «скоро здесь будет блог» — одна содержательная заметка, у которой есть авторская мысль.",[149,1338,1339],{},[12,1340,1341],{},"Первая версия сайта должна быть достаточно маленькой, чтобы её запустить, и достаточно содержательной, чтобы за неё не было неловко.",[470,1343,1345],{"id":1344},"промпт-карта-первой-версии-сайта","Промпт: карта первой версии сайта",[301,1347,1350],{"className":1348,"code":1349,"language":306,"meta":307},[304],"На основе моего утверждённого брифа предложи первую версию личного сайта.\n\nНужен не дизайн и не код, а рабочая карта:\n- страницы и их роль;\n- главные сценарии посетителя;\n- содержание каждого первого экрана;\n- обязательные материалы, которые нужно подготовить;\n- что можно отложить после запуска;\n- риски, если какой-то раздел будет пустым или неподтверждённым.\n\nПриоритизируй решения по принципу:\nсначала понятность предложения, реальные доказательства опыта\nи простой способ связаться; затем декоративные и необязательные элементы.\n\nНе выдумывай кейсы, статистику и отзывы.\nВ конце составь короткий список задач на первую неделю.\n",[238,1351,1349],{"__ignoreMap":310},[56,1353,1355],{"id":1354},"содержание-появляется-раньше-финального-дизайна","Содержание появляется раньше финального дизайна",[12,1357,1358],{},"Иногда работу строят так: сначала дизайн, потом вёрстка, потом настройка, а в конце кто-то срочно заполняет страницы текстами. Обычно это видно: заголовки получаются общими, карточки — одинаковыми, а раздел «обо мне» состоит из слов «опытный», «креативный» и «ответственный».",[12,1360,1361],{},"Я бы собрал хотя бы черновое содержание до финального интерфейса. Не идеальные тексты, а ясные ответы на вопросы:",[408,1363,1364,1374],{},[411,1365,1366],{},[414,1367,1368,1371],{},[417,1369,1370],{},"Раздел",[417,1372,1373],{},"Вопрос, на который он отвечает",[424,1375,1376,1384,1392,1400,1408],{},[414,1377,1378,1381],{},[429,1379,1380],{},"Главная",[429,1382,1383],{},"Кто я и почему здесь стоит задержаться?",[414,1385,1386,1389],{},[429,1387,1388],{},"Проекты",[429,1390,1391],{},"Какие задачи я умею доводить до результата?",[414,1393,1394,1397],{},[429,1395,1396],{},"Услуги или обучение",[429,1398,1399],{},"В каком формате можно работать вместе?",[414,1401,1402,1405],{},[429,1403,1404],{},"Заметки",[429,1406,1407],{},"Как я думаю, принимаю решения и объясняю сложное?",[414,1409,1410,1413],{},[429,1411,1412],{},"Контакты",[429,1414,1415],{},"Как начать разговор без лишних препятствий?",[12,1417,1418],{},"Тогда интерфейс помогает содержанию, а не заставляет его подстраиваться под случайный шаблон.",[12,1420,1421],{},"AI здесь хорошо работает как редактор и исследователь. Он может заметить повторы, предложить порядок, показать места без фактов и подготовить несколько вариантов заголовка. Но я не поручал бы ему самостоятельно «писать позиционирование»: результат почти наверняка окажется гладким, но слишком похожим на сотни других сайтов.",[56,1423,1425],{"id":1424},"технологии-почему-я-рекомендую-nuxt","Технологии: почему я рекомендую Nuxt",[12,1427,1428],{},"После смысла и содержания приходит вопрос о стеке. В нём легко увязнуть: спорить о правильном фреймворке, CMS, хостинге и количестве библиотек.",[12,1430,1431],{},"Для личного сайта я смотрю на выбор прагматично. Технология должна помогать:",[488,1433,1434,1437,1440,1443,1446],{},[34,1435,1436],{},"быстро и надёжно отдавать страницу посетителю;",[34,1438,1439],{},"удобно публиковать и обновлять материалы;",[34,1441,1442],{},"давать хорошую базу для поисковой видимости;",[34,1444,1445],{},"не превращать небольшую правку в отдельный технический проект;",[34,1447,1448],{},"позволять постепенно добавлять формы и интеграции, когда они действительно понадобятся.",[12,1450,1451,1452,350],{},"Для таких задач я рекомендую ",[287,1453,1454],{},"Nuxt",[12,1456,1457],{},"Nuxt построен на Vue и может рендерить страницы на сервере. Это значит, что посетитель и поисковый робот получают готовый HTML, а не пустую страницу, которую браузер должен сначала собрать из JavaScript. Для личного сайта это помогает скорости первого отображения и создаёт нормальную основу для SEO.",[12,1459,1460],{},"Ещё несколько практических причин:",[31,1462,1463,1466,1469,1472,1475],{},[34,1464,1465],{},"статьи, проекты и другие материалы удобно хранить в Markdown рядом с кодом;",[34,1467,1468],{},"метаданные страницы — title, description, Open Graph, canonical URL и structured data — можно держать в одном понятном процессе;",[34,1470,1471],{},"sitemap можно генерировать автоматически;",[34,1473,1474],{},"публичные страницы, формы и серверные API находятся в одном проекте;",[34,1476,1477],{},"сначала можно сделать спокойный контентный сайт, а затем добавить заявки, интеграции или небольшую админку без переезда на другую платформу.",[12,1479,1480],{},"Nuxt не делает SEO автоматически. Он даёт нужные механизмы, но название страницы, описание, понятная структура, реальные материалы, скорость, доступность и последующая проверка всё равно остаются работой автора и разработчика.",[12,1482,1483],{},"Markdown тоже не решает всё сам. Он хорош, когда у сайта есть понятный процесс редактуры: материал можно написать, увидеть diff, проверить ссылку и сохранить историю изменений. Если автору удобнее работать только в визуальном редакторе и он не хочет иметь дело с Git, нужно сразу предусмотреть другой безопасный путь публикации.",[56,1485,1487],{"id":1486},"где-размещать-сайт-контролируемый-vps-или-выделенный-сервер","Где размещать сайт: контролируемый VPS или выделенный сервер",[12,1489,1490,1491,1494],{},"Сайт лучше размещать в инфраструктуре, которой я могу управлять. На практике для личного сайта обычно достаточно надёжного ",[287,1492,1493],{},"VPS"," — выделенного виртуального сервера. Для более требовательной системы или при особых требованиях можно использовать физический выделенный сервер.",[12,1496,1497],{},"Дело не в том, чтобы любой личный сайт обязательно жил на большой машине. Дело в контроле:",[31,1499,1500,1503,1506,1509,1512],{},[34,1501,1502],{},"домен, доступы и конфигурация принадлежат владельцу сайта;",[34,1504,1505],{},"можно подключать формы, почту, webhooks, CRM и другие интеграции;",[34,1507,1508],{},"есть понятная резервная копия и возможность восстановиться;",[34,1510,1511],{},"можно управлять обновлениями, а не ждать, пока конструктор поменяет правила;",[34,1513,1514],{},"инфраструктура не ограничивает развитие сайта одним набором возможностей.",[12,1516,1517],{},"При этом собственный сервер требует дисциплины. Нужно следить за обновлениями системы, резервными копиями, TLS-сертификатами, журналами, доступами и состоянием приложения. Если эти обязанности никто не берёт на себя, «свой сервер» быстро превращается не в свободу, а в забытый ящик с паролями.",[12,1519,1520],{},"Я бы придерживался простого правила:",[149,1522,1523],{},[12,1524,1525],{},"Сервер должен применять подготовленную версию сайта. В полночь не стоит дописывать на нём код и исправлять текст напрямую.",[12,1527,1528],{},"Нормальный путь обновления выглядит так:",[149,1530,1531],{},[12,1532,1533],{},"изменение в исходном коде или контенте → проверка → зафиксированная версия → публикация именно этой версии → health-check → проверка публичной страницы.",[12,1535,1536],{},"Так проще ответить на важные вопросы: какая версия сейчас работает, что именно изменилось, открывается ли новый маршрут и куда вернуться, если после публикации что-то пошло не так.",[56,1538,1540],{"id":1539},"настроить-ai-агента-как-участника-проекта","Настроить AI-агента как участника проекта",[12,1542,1543],{},"Агент работает заметно лучше, когда у него есть актуальный контекст. Не многотомная энциклопедия, а короткий документ с ответами на главные вопросы до начала работы.",[12,1545,1546,1547,1550,1551,1554],{},"Его можно назвать ",[238,1548,1549],{},"PROJECT_CONTEXT.md",", ",[238,1552,1553],{},"CLAUDE.md"," или иначе — название не главное. Важно содержание:",[301,1556,1559],{"className":1557,"code":1558,"language":365,"meta":310,"style":310},"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",[238,1560,1561,1570,1575,1580,1587,1593,1598,1604,1610,1615,1621,1627,1633,1638,1644,1654,1662,1670,1678,1683,1689,1697,1705,1713,1721,1726,1732,1740,1746],{"__ignoreMap":310},[1562,1563,1566],"span",{"class":1564,"line":1565},"line",1,[1562,1567,1569],{"class":1568},"sq-ep","# Контекст личного сайта\n",[1562,1571,1572],{"class":1564,"line":352},[1562,1573,1574],{"emptyLinePlaceholder":368},"\n",[1562,1576,1577],{"class":1564,"line":641},[1562,1578,1579],{"class":1568},"## Цель\n",[1562,1581,1583],{"class":1564,"line":1582},4,[1562,1584,1586],{"class":1585},"sVt8B","Помогать посетителю понять, чем я занимаюсь, увидеть реальные работы\n",[1562,1588,1590],{"class":1564,"line":1589},5,[1562,1591,1592],{"class":1585},"и выбрать следующий шаг: написать, обсудить проект или прочитать материал.\n",[1562,1594,1596],{"class":1564,"line":1595},6,[1562,1597,1574],{"emptyLinePlaceholder":368},[1562,1599,1601],{"class":1564,"line":1600},7,[1562,1602,1603],{"class":1568},"## Аудитория\n",[1562,1605,1607],{"class":1564,"line":1606},8,[1562,1608,1609],{"class":1585},"[Кто обычно приходит на сайт и зачем.]\n",[1562,1611,1613],{"class":1564,"line":1612},9,[1562,1614,1574],{"emptyLinePlaceholder":368},[1562,1616,1618],{"class":1564,"line":1617},10,[1562,1619,1620],{"class":1568},"## Стек\n",[1562,1622,1624],{"class":1564,"line":1623},11,[1562,1625,1626],{"class":1585},"Nuxt, серверный рендеринг, Markdown для статей и проектов,\n",[1562,1628,1630],{"class":1564,"line":1629},12,[1562,1631,1632],{"class":1585},"VPS или выделенный сервер для production.\n",[1562,1634,1636],{"class":1564,"line":1635},13,[1562,1637,1574],{"emptyLinePlaceholder":368},[1562,1639,1641],{"class":1564,"line":1640},14,[1562,1642,1643],{"class":1568},"## Контент\n",[1562,1645,1647,1651],{"class":1564,"line":1646},15,[1562,1648,1650],{"class":1649},"s4XuR","-",[1562,1652,1653],{"class":1585}," Пишем от первого лица.\n",[1562,1655,1657,1659],{"class":1564,"line":1656},16,[1562,1658,1650],{"class":1649},[1562,1660,1661],{"class":1585}," Не выдумываем факты, клиентов, цифры и результаты.\n",[1562,1663,1665,1667],{"class":1564,"line":1664},17,[1562,1666,1650],{"class":1649},[1562,1668,1669],{"class":1585}," Голосовые расшифровки — это исходный материал, не готовая публикация.\n",[1562,1671,1673,1675],{"class":1564,"line":1672},18,[1562,1674,1650],{"class":1649},[1562,1676,1677],{"class":1585}," Автор подтверждает финальный текст перед публикацией.\n",[1562,1679,1681],{"class":1564,"line":1680},19,[1562,1682,1574],{"emptyLinePlaceholder":368},[1562,1684,1686],{"class":1564,"line":1685},20,[1562,1687,1688],{"class":1568},"## Правила изменений\n",[1562,1690,1692,1694],{"class":1564,"line":1691},21,[1562,1693,1650],{"class":1649},[1562,1695,1696],{"class":1585}," Сначала исследование и план, затем минимальное изменение.\n",[1562,1698,1700,1702],{"class":1564,"line":1699},22,[1562,1701,1650],{"class":1649},[1562,1703,1704],{"class":1585}," Не менять production, доступы, секреты и инфраструктуру без отдельной команды.\n",[1562,1706,1708,1710],{"class":1564,"line":1707},23,[1562,1709,1650],{"class":1649},[1562,1711,1712],{"class":1585}," Не расширять задачу «заодно».\n",[1562,1714,1716,1718],{"class":1564,"line":1715},24,[1562,1717,1650],{"class":1649},[1562,1719,1720],{"class":1585}," После работы вернуть список изменённых файлов, проверки, риски и открытые вопросы.\n",[1562,1722,1724],{"class":1564,"line":1723},25,[1562,1725,1574],{"emptyLinePlaceholder":368},[1562,1727,1729],{"class":1564,"line":1728},26,[1562,1730,1731],{"class":1568},"## Публикация\n",[1562,1733,1735,1737],{"class":1564,"line":1734},27,[1562,1736,1650],{"class":1649},[1562,1738,1739],{"class":1585}," Перед публикацией проверить ссылки, метаданные, мобильное отображение\n",[1562,1741,1743],{"class":1564,"line":1742},28,[1562,1744,1745],{"class":1585},"  и основной пользовательский сценарий.\n",[1562,1747,1749,1751],{"class":1564,"line":1748},29,[1562,1750,1650],{"class":1649},[1562,1752,1753],{"class":1585}," Публикация — отдельное подтверждённое действие.\n",[12,1755,1756],{},"Рядом с контекстом полезно вести два разных списка: текущий план и журнал принятых решений. План отвечает на вопрос «что делать дальше», а журнал — «почему когда-то выбрали именно этот путь». Не стоит превращать старые решения в автоматический приказ продолжать работу: сначала их нужно сверить с реальным состоянием сайта.",[470,1758,1760],{"id":1759},"промпт-безопасная-работа-агента-в-существующем-сайте","Промпт: безопасная работа агента в существующем сайте",[301,1762,1765],{"className":1763,"code":1764,"language":306,"meta":307},[304],"Ты работаешь с существующим личным сайтом.\n\nПеред любыми изменениями:\n1. Прочитай контекст проекта и правила публикации.\n2. Проверь текущую ветку и наличие незакоммиченных изменений.\n3. Установи фактическое состояние по коду, контенту и нужному runtime,\n   а не только по старой документации.\n4. Сначала предложи минимальный план и перечисли риски.\n\nВо время работы:\n- Не выдумывай факты для публичных материалов.\n- Не публикуй сайт, не меняй production, секреты, доступы\n  или инфраструктуру без отдельной команды.\n- Не расширяй scope до соседних улучшений «заодно».\n- Сохраняй авторский голос; спорные места помечай вопросами.\n\nГотовность:\n- список изменённых файлов;\n- результат релевантных проверок;\n- проверенные пользовательские сценарии;\n- оставшиеся риски и действия, которые требуют решения автора.\n",[238,1766,1764],{"__ignoreMap":310},[12,1768,1769],{},"Такой договор делает поведение агента предсказуемым. Он не обязан быть «универсальным исполнителем, который разберётся со всем». Ему нужны ясная цель, границы и форма результата.",[56,1771,1773],{"id":1772},"готовые-промпты-для-регулярных-обновлений","Готовые промпты для регулярных обновлений",[12,1775,1776],{},"После запуска главная задача — не потерять ритм. Я бы не строил контент-план на год вперёд и не обещал публиковать по три материала в неделю. Гораздо полезнее завести простой повторяемый процесс и наполнять его реальными поводами.",[470,1778,1780],{"id":1779},"промпт-новая-заметка-или-кейс-из-рабочих-материалов","Промпт: новая заметка или кейс из рабочих материалов",[301,1782,1785],{"className":1783,"code":1784,"language":306,"meta":307},[304],"Помоги подготовить новую публикацию для личного сайта.\n\nВот исходные материалы: [вставить голосовую расшифровку, тезисы,\nзаметки, ссылки на подтверждённые материалы].\n\nСначала:\n1. Сформулируй, какую проблему читателя может закрыть публикация.\n2. Отдели подтверждённые факты от непроверенных утверждений.\n3. Покажи, чего не хватает для честного кейса или статьи.\n4. Предложи 4–6 заголовков и рекомендуемый формат:\n   заметка, разбор, кейс, инструкция или FAQ.\n\nТолько после этого подготовь структуру и черновик от первого лица.\n\nНе добавляй несуществующие цифры, клиентов, отзывы или результаты.\nНе публикуй материал и не меняй файлы.\n",[238,1786,1784],{"__ignoreMap":310},[470,1788,1790],{"id":1789},"промпт-аудит-страницы-перед-публикацией","Промпт: аудит страницы перед публикацией",[301,1792,1795],{"className":1793,"code":1794,"language":306,"meta":307},[304],"Проведи 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",[238,1796,1794],{"__ignoreMap":310},[470,1798,1800],{"id":1799},"промпт-еженедельный-редакторский-обзор","Промпт: еженедельный редакторский обзор",[301,1802,1805],{"className":1803,"code":1804,"language":306,"meta":307},[304],"Помоги провести еженедельный обзор личного сайта.\n\nЯ дам тебе список событий недели: завершённые задачи, вопросы клиентов,\nголосовые заметки, черновики, новые проекты и изменения услуг.\n\nТвоя задача:\n1. Найти один-два реалистичных повода для обновления сайта.\n2. Для каждого предложить формат: заметка, кейс, обновление проекта,\n   FAQ или изменение страницы услуги.\n3. Объяснить пользу для посетителя.\n4. Указать, какие факты или материалы нужно подтвердить.\n5. Составить небольшой план на следующую неделю.\n\nНе придумывай темы, которых нет в материалах.\nНе публикуй и не меняй сайт.\nПриоритизируй регулярность и содержание, а не количество публикаций.\n",[238,1806,1804],{"__ignoreMap":310},[56,1808,1810],{"id":1809},"цикл-обновлений-не-ждать-большой-темы","Цикл обновлений: не ждать большой темы",[12,1812,1813],{},"Сильный материал часто начинается не с идеи «надо написать статью», а с повторяющегося рабочего момента.",[12,1815,1816],{},"Я дважды объяснил один подход в переписке. Завершил часть проекта. Получил вопрос, на который сайт пока не отвечает. Поменял формат работы. Разобрался с ошибкой, которая может быть полезна другим. Всё это поводы для обновления.",[12,1818,1819],{},"Я бы использовал такой короткий цикл:",[488,1821,1822,1828,1834,1840,1846,1852,1858],{},[34,1823,1824,1827],{},[287,1825,1826],{},"Заметить повод."," Сохранить его голосовой заметкой, тезисом или ссылкой.",[34,1829,1830,1833],{},[287,1831,1832],{},"Собрать исходный материал."," Расшифровать запись, приложить факты, скриншоты, документы или ссылки.",[34,1835,1836,1839],{},[287,1837,1838],{},"Дать агенту структуру."," Попросить выделить пользу, вопросы и возможный формат.",[34,1841,1842,1845],{},[287,1843,1844],{},"Проверить содержание."," Убрать конфиденциальное, подтвердить факты, вернуть собственную интонацию.",[34,1847,1848,1851],{},[287,1849,1850],{},"Проверить техническую часть."," Ссылки, метаданные, мобильное отображение, форму связи, если она затронута.",[34,1853,1854,1857],{},[287,1855,1856],{},"Опубликовать отдельным решением."," Не считать публикацию побочным эффектом редактуры.",[34,1859,1860,1863],{},[287,1861,1862],{},"Сохранить вывод."," Если появился новый процесс, ограничение или полезный вопрос — обновить контекст сайта или checklist.",[12,1865,1866],{},"Тогда блог перестаёт быть обязанностью «вести контент» и становится способом не терять накопленный опыт.",[56,1868,1870],{"id":1869},"сила-проверки-должна-соответствовать-цене-ошибки","Сила проверки должна соответствовать цене ошибки",[12,1872,1873],{},"Не всякая правка требует одинакового ритуала. Исправить опечатку — не то же самое, что поменять форму заявки или деплой-процесс.",[408,1875,1876,1886],{},[411,1877,1878],{},[414,1879,1880,1883],{},[417,1881,1882],{},"Тип изменения",[417,1884,1885],{},"Что проверить",[424,1887,1888,1896,1904,1912,1920],{},[414,1889,1890,1893],{},[429,1891,1892],{},"Текст, иллюстрация, ссылка",[429,1894,1895],{},"Смысл, факты, орфография, рабочая ссылка и отображение",[414,1897,1898,1901],{},[429,1899,1900],{},"Новая статья или проект",[429,1902,1903],{},"Заголовок, описание, структура, SEO-метаданные, mobile и desktop",[414,1905,1906,1909],{},[429,1907,1908],{},"Навигация или интерфейс",[429,1910,1911],{},"Главный пользовательский маршрут, адаптивность, доступность, ссылки",[414,1913,1914,1917],{},[429,1915,1916],{},"Форма или интеграция",[429,1918,1919],{},"Отправка данных, ошибка, защита, доставка заявки и сообщение пользователю",[414,1921,1922,1925],{},[429,1923,1924],{},"Сервер и production-процесс",[429,1926,1927],{},"Точный revision, резервная точка, health-check и проверка публичного маршрута",[12,1929,1930],{},"Это не бюрократия, а способ не тратить час на проверку одной запятой и не публиковать важное изменение со словами «вроде работает».",[12,1932,1933],{},"Особенно важно не давать AI-агенту больше полномочий, чем ему действительно нужны. Для подготовки черновика не нужен доступ к production. Для аудита SEO не нужны секреты. Для проверки страницы часто достаточно read-only доступа и списка маршрутов.",[12,1935,1936],{},"Если ошибка повторилась, я бы не ограничивался новой формулировкой промпта. Лучше оставить защиту: checklist, тест, правило в проектном контексте или короткую инструкцию по проверке. Тогда следующий человек или агент начинает не с той же ошибки, а с опыта, который уже стал частью процесса.",[56,1938,1940],{"id":1939},"что-можно-сделать-в-первую-неделю","Что можно сделать в первую неделю",[12,1942,1943],{},"Запуск не обязательно растягивать на месяцы. Если есть решение и исходные материалы, за первую неделю можно собрать рабочую основу.",[408,1945,1946,1956],{},[411,1947,1948],{},[414,1949,1950,1953],{},[417,1951,1952],{},"День",[417,1954,1955],{},"Результат",[424,1957,1958,1966,1974,1982,1990,1998,2006],{},[414,1959,1960,1963],{},[429,1961,1962],{},"1",[429,1964,1965],{},"Бриф: роль сайта, аудитория, главное действие посетителя",[414,1967,1968,1971],{},[429,1969,1970],{},"2",[429,1972,1973],{},"Карта разделов и три–пять пользовательских сценариев",[414,1975,1976,1979],{},[429,1977,1978],{},"3",[429,1980,1981],{},"Голосовые заметки или черновики для главной, проектов и контактов",[414,1983,1984,1987],{},[429,1985,1986],{},"4",[429,1988,1989],{},"Структура контента и выбор технической основы: Nuxt, домен, VPS или сервер",[414,1991,1992,1995],{},[429,1993,1994],{},"5",[429,1996,1997],{},"Первая версия страниц и проверка на телефоне и компьютере",[414,1999,2000,2003],{},[429,2001,2002],{},"6",[429,2004,2005],{},"Формы, ссылки, базовые SEO-метаданные, доступность и резервная стратегия",[414,2007,2008,2011],{},[429,2009,2010],{},"7",[429,2012,2013],{},"Публикация подготовленной версии, public smoke-проверка и список следующих обновлений",[12,2015,2016],{},"У кого-то первый сайт будет состоять из одной сильной страницы и контактов. У кого-то сразу появятся проекты и несколько заметок. Это нормально. Важнее не количество разделов, а наличие публичного маршрута: человек открывает ссылку, понимает предложение, видит подтверждения и знает, что делать дальше.",[56,2018,2020],{"id":2019},"личный-сайт-становится-сильнее-от-накопления-доверия","Личный сайт становится сильнее от накопления доверия",[12,2022,2023],{},"AI сделал производство текста и кода быстрым. Поэтому особенно заметной становится разница между просто заполненным сайтом и сайтом, в котором есть живой опыт.",[12,2025,2026],{},"Второй не пытается убедить посетителя множеством громких слов. Он постепенно показывает: вот что я делаю, вот как думаю, вот какие вопросы разбираю, вот что изменилось с прошлого раза, вот как со мной можно продолжить разговор.",[12,2028,2029],{},"Голосовые заметки помогают не терять материал в моменте. AI-помощник помогает превратить его в структуру, черновик и проверяемый процесс. Nuxt и контролируемый сервер дают техническую основу, на которой сайт можно спокойно развивать, а не собирать заново при каждой новой задаче.",[12,2031,2032],{},"Но главный актив всё равно не стек и не количество агентов. Это ясный голос автора, реальные факты и привычка возвращаться к сайту с новым содержанием.",[12,2034,2035],{},"Я бы не ждал идеальной версии. Лучше начать с небольшой честной площадки, настроить безопасный цикл обновлений и оставить на ней место для следующей мысли — возможно, уже записанной сегодня в диктофон.",[12,2037,2038,2039,2041],{},"Если вы хотите запустить личный сайт или привести в порядок тот, который давно не обновлялся, ",[346,2040,987],{"href":348},". Для начала разберём роль сайта, соберём реальные материалы и определим первую версию, которую можно спокойно развивать.",[2043,2044,2045],"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":310,"searchDepth":352,"depth":352,"links":2047},[2048,2049,2050,2051,2054,2057,2060,2061,2062,2063,2066,2071,2072,2073,2074],{"id":1031,"depth":352,"text":1032},{"id":1055,"depth":352,"text":1056},{"id":1085,"depth":352,"text":1086},{"id":1160,"depth":352,"text":1161,"children":2052},[2053],{"id":1207,"depth":641,"text":1208},{"id":1220,"depth":352,"text":1221,"children":2055},[2056],{"id":1253,"depth":641,"text":1254},{"id":1266,"depth":352,"text":1267,"children":2058},[2059],{"id":1344,"depth":641,"text":1345},{"id":1354,"depth":352,"text":1355},{"id":1424,"depth":352,"text":1425},{"id":1486,"depth":352,"text":1487},{"id":1539,"depth":352,"text":1540,"children":2064},[2065],{"id":1759,"depth":641,"text":1760},{"id":1772,"depth":352,"text":1773,"children":2067},[2068,2069,2070],{"id":1779,"depth":641,"text":1780},{"id":1789,"depth":641,"text":1790},{"id":1799,"depth":641,"text":1800},{"id":1809,"depth":352,"text":1810},{"id":1869,"depth":352,"text":1870},{"id":1939,"depth":352,"text":1940},{"id":2019,"depth":352,"text":2020},"2026-08-12","Как запустить сайт личного бренда с AI-помощниками: от голосовой заметки и первой версии до Nuxt, VPS и безопасного цикла обновлений.",{},"\u002Fblog\u002F2026-08-12-lichnyy-sayt-ai-agenty",{"title":1011,"description":2076},"Личный сайт и AI-агенты: запуск и обновления","blog\u002F2026-08-12-lichnyy-sayt-ai-agenty",[373,2083,2084,374,2085],"сайт","личный бренд","контент","1mag4GKjfAApBFcZYVIEnmVkXm2jMWon7oGjPpmm-fM",{"id":2088,"title":2089,"acrostic":7,"body":2090,"date":2986,"description":2987,"duration":7,"emoji":7,"extension":365,"faq":7,"featured":366,"format":7,"image":7,"level":7,"media":7,"meta":2988,"navigation":368,"path":2989,"price":7,"schedule":7,"seo":2990,"seoTitle":7,"serviceType":7,"status":7,"stem":2991,"tags":2992,"tech":7,"toc":368,"url":7,"__hash__":2995},"blog\u002Fblog\u002F2026-08-11-ai-upravlenie-razrabotkoj.md","Управление разработкой с AI-агентом: контекст вместо задач",{"type":9,"value":2091,"toc":2960},[2092,2095,2098,2101,2104,2109,2112,2115,2121,2123,2137,2141,2144,2147,2150,2153,2156,2159,2173,2180,2184,2187,2190,2193,2196,2202,2205,2208,2214,2217,2231,2234,2238,2241,2248,2251,2254,2274,2277,2280,2285,2291,2295,2298,2301,2304,2358,2361,2364,2367,2370,2373,2377,2380,2384,2387,2401,2404,2407,2411,2414,2417,2420,2424,2427,2430,2450,2453,2457,2460,2463,2466,2492,2495,2499,2502,2505,2508,2511,2543,2547,2550,2553,2556,2559,2612,2615,2620,2623,2627,2630,2633,2636,2642,2695,2698,2701,2705,2708,2715,2718,2762,2765,2768,2771,2774,2778,2781,2784,2787,2793,2796,2799,2802,2806,2809,2815,2818,2821,2827,2830,2833,2840,2844,2847,2850,2870,2873,2876,2880,2884,2887,2891,2894,2898,2901,2905,2908,2911,2931,2934,2939,2942,2945,2948,2957],[12,2093,2094],{},"Компании покупают лицензии, объявляют AI-стратегии, считают токены и показывают красивые демо. Потом оказывается, что пользователи не пришли, продукт не решает их задачу, а за результат как будто никто не отвечает: он потерялся между презентацией, подрядчиком и чат-ботом.",[12,2096,2097],{},"Проблема часто не в самой модели, а в слабом управлении разработкой. Если в обычном проекте неясно, что именно строят, для кого и как будут проверять результат, AI этого не исправит. Он лишь позволит ошибаться быстрее.",[12,2099,2100],{},"У меня был другой путь. Я не «внедрял AI в компанию» и не измерял эффективность числом сгенерированных строк. Я начал использовать AI-агента как постоянного участника разработки. Он может исследовать, выполнять ограниченные задачи, проводить ревью, а иногда выступает неприятным собеседником, который заставляет ещё раз объяснить, чего именно я хочу.",[12,2102,2103],{},"И довольно быстро понял простую вещь:",[149,2105,2106],{},[12,2107,2108],{},"AI не отменяет управление разработкой. С ним слабые места управления просто становятся заметнее.",[12,2110,2111],{},"Раньше часть управления можно было держать в голове. Сильному разработчику достаточно сказать: «посмотри, почему не работает фильтр» — и он сам поймёт, в каком сервисе искать, что не трогать, какие данные опасны и где проверить результат.",[12,2113,2114],{},"Агент этого не знает. Не потому, что он глупый. Он просто не живёт внутри моего проекта: не помнит вчерашний разговор у кофемашины, не знает, почему сервер нельзя трогать в середине дня, и не чувствует затылком, что фраза «давайте заодно обновим зависимости» сейчас пахнет трёхдневным приключением.",[12,2116,2117,2118,350],{},"Поэтому я иначе стал ставить задачи. Для каждой заметной работы я собираю ",[287,2119,2120],{},"цель, контекст, ограничения и доказательство готовности",[56,2122,1032],{"id":1031},[31,2124,2125,2128,2131,2134],{},[34,2126,2127],{},"AI одинаково ускоряет порядок и хаос.",[34,2129,2130],{},"Задача для AI-агента должна описывать цель, подтверждённый контекст, границы и доказательство готовности.",[34,2132,2133],{},"Перед production нужен не «зелёный билд», а точный revision, health-check и пользовательская проверка.",[34,2135,2136],{},"Повторившаяся ошибка должна оставлять защиту: тест, инвариант, runbook или обновлённый контекст.",[56,2138,2140],{"id":2139},"ai-ускоряет-и-порядок-и-беспорядок","AI ускоряет и порядок, и беспорядок",[12,2142,2143],{},"Есть удобная сказка: достаточно дать команде хороший AI-инструмент, и производительность вырастет сама. В этой сказке нейросеть сидит рядом, мгновенно пишет код, тесты, документацию и, вероятно, ещё слегка массирует плечи перед релизом.",[12,2145,2146],{},"В реальности AI ускоряет не только полезную работу.",[12,2148,2149],{},"Когда задача сформулирована ясно, агент быстро помогает изучить код, увидеть риски, написать тест, подготовить небольшой патч и проверить его. Если задача туманная, он с такой же скоростью создаёт несколько правдоподобных вариантов неправильного решения.",[12,2151,2152],{},"Если в проекте есть актуальные документы, агент опирается на них и меньше изобретает архитектуру заново. Если документация устарела, он уверенно цитирует вчерашний мир. Это не злой умысел. Просто модель не умеет отличать «документ лежит рядом с кодом» от «документ всё ещё правда» без проверки.",[12,2154,2155],{},"Если у процесса есть понятные ворота перед production, AI помогает проходить их быстрее. Если таких ограничений нет, он может быстро сделать то, чего делать было нельзя.",[12,2157,2158],{},"Поэтому я не считаю, что AI делает разработку проще. Он ускоряет то, что уже есть:",[31,2160,2161,2164,2167,2170],{},[34,2162,2163],{},"ясный процесс;",[34,2165,2166],{},"работающий порядок;",[34,2168,2169],{},"хаос;",[34,2171,2172],{},"последствия плохо поставленной задачи.",[12,2174,2175,2176,2179],{},"Поэтому разговор об AI в разработке для меня начинается с вопроса: ",[287,2177,2178],{},"как у нас устроено принятие решений?"," Выбор модели идёт после.",[56,2181,2183],{"id":2182},"от-сделай-фичу-к-какое-изменение-мы-хотим-получить","От «сделай фичу» к «какое изменение мы хотим получить?»",[12,2185,2186],{},"Фраза «сделай авторизацию» кажется задачей. На самом деле это название целого леса, в котором ещё не проложена ни одна тропинка.",[12,2188,2189],{},"Для кого авторизация? Какие роли существуют? Какие действия должен видеть пользователь, а какие — сервис? Где заканчивается публичный маршрут и начинается внутренний? Можно ли менять существующий контракт? Что происходит со старыми сессиями? Как проверить, что чужой пользователь не получил доступ? И, наконец, можно ли сегодня вообще трогать production?",[12,2191,2192],{},"Пока на эти вопросы нет ответа, агенту нельзя давать задачу: иначе он начнёт отвечать за меня.",[12,2194,2195],{},"Плохая постановка выглядит так:",[301,2197,2200],{"className":2198,"code":2199,"language":306,"meta":307},[304],"Добавь авторизацию и задеплой.\n",[238,2201,2199],{"__ignoreMap":310},[12,2203,2204],{},"В ней нет цели, нет границ и нет критерия результата. Есть только глагол, который может означать двадцать разных решений.",[12,2206,2207],{},"Нормальная постановка устроена иначе:",[301,2209,2212],{"className":2210,"code":2211,"language":306,"meta":307},[304],"Нужно закрыть один конкретный сценарий записи данных:\nизменять запись может только её владелец.\n\nСначала установи текущий контракт по коду, тестам и runtime.\nНе расширяй права «на всякий случай» и не меняй публичные маршруты.\nСначала добавь проверку, что другой пользователь получает отказ.\nProduction не трогай.\n\nГотовность: целевой тест, сборка затронутого пакета,\nпроверка diff и список изменённых контрактов.\n",[238,2213,2211],{"__ignoreMap":310},[12,2215,2216],{},"Это не «магический промпт» и не набор волшебных слов. Здесь зафиксировано управленческое решение:",[31,2218,2219,2222,2225,2228],{},[34,2220,2221],{},"какой риск я закрываю;",[34,2223,2224],{},"что считаю допустимой границей изменения;",[34,2226,2227],{},"каким будет доказательство результата;",[34,2229,2230],{},"какое действие сейчас запрещено.",[12,2232,2233],{},"Если я не могу это сформулировать, дело обычно не в агенте. Скорее всего, я сам ещё не разобрался с задачей.",[56,2235,2237],{"id":2236},"хорошая-задача-начинается-с-контекста","Хорошая задача начинается с контекста",[12,2239,2240],{},"Человек в команде часто накапливает контекст годами. Он знает, где находится код, как устроен релиз, почему нельзя чистить эту таблицу и какой endpoint на самом деле проверяет пользователь.",[12,2242,2243,2244,2247],{},"Агент приходит в проект почти как новый сотрудник. Только он очень быстро и без устали читает то количество файлов, которое человек обычно откладывает «на потом». И да, иногда ему приходится отдельно объяснять, что документацию надо читать ",[287,2245,2246],{},"до"," того, как он начнёт уверенно чинить то, чего не понял.",[12,2249,2250],{},"У меня это стало почти ритуалом.",[12,2252,2253],{},"Перед заметной задачей агент сначала должен выяснить:",[488,2255,2256,2259,2262,2265,2268,2271],{},[34,2257,2258],{},"где он находится;",[34,2260,2261],{},"какой репозиторий и какая ветка являются рабочими;",[34,2263,2264],{},"есть ли незакоммиченные изменения;",[34,2266,2267],{},"где лежит подтверждённый контекст проекта;",[34,2269,2270],{},"что говорит актуальный план;",[34,2272,2273],{},"что реально происходит в коде, данных и runtime.",[12,2275,2276],{},"Последний пункт важнее остальных. В документации может быть написано, что система работает на одной версии. В Git может лежать другая. На сервере — третья. А пользователь может открыть четвёртую, потому что у него закешировалась старая страница или он вообще смотрит не на то окружение.",[12,2278,2279],{},"Поэтому я стараюсь держаться правила:",[149,2281,2282],{},[12,2283,2284],{},"Память, старый план и уверенный ответ агента не доказывают ничего. Опираться нужно на проверяемое состояние кода, данных и работающей системы.",[12,2286,2287,2288,350],{},"Это не значит, что документации нельзя доверять. Хорошая документация помогает быстро понять, ",[287,2289,2290],{},"что проверить и зачем",[56,2292,2294],{"id":2293},"документация-которую-действительно-читают","Документация, которую действительно читают",[12,2296,2297],{},"Существует старый жанр инженерного юмора: документация — это место, куда информация уходит, чтобы никогда не вернуться.",[12,2299,2300],{},"С агентами у меня получилось чуть иначе. Документация стала рабочим инструментом, а не приложением к проекту.",[12,2302,2303],{},"У каждого заметного продукта есть несколько разных типов знания.",[408,2305,2306,2316],{},[411,2307,2308],{},[414,2309,2310,2313],{},[417,2311,2312],{},"Что нужно узнать",[417,2314,2315],{},"Где это должно быть зафиксировано",[424,2317,2318,2326,2334,2342,2350],{},[414,2319,2320,2323],{},[429,2321,2322],{},"Что подтверждено и принято",[429,2324,2325],{},"Краткий актуальный контекст проекта",[414,2327,2328,2331],{},[429,2329,2330],{},"Что делать дальше",[429,2332,2333],{},"Текущий план или backlog",[414,2335,2336,2339],{},[429,2337,2338],{},"Почему было принято старое решение",[429,2340,2341],{},"Исторический план или журнал решений",[414,2343,2344,2347],{},[429,2345,2346],{},"Как безопасно провести операцию",[429,2348,2349],{},"Runbook, deploy-инструкция, troubleshooting",[414,2351,2352,2355],{},[429,2353,2354],{},"Что однажды уже сломалось",[429,2356,2357],{},"Gotcha, тест, инвариант, проверочный сценарий",[12,2359,2360],{},"Важно не смешивать эти слои.",[12,2362,2363],{},"Исторический план — это не приказ продолжать работу с места, где остановились полгода назад. Он может объяснить, почему архитектура выглядит именно так. Но текущую задачу надо начинать с того, что реально подтверждено сегодня.",[12,2365,2366],{},"Документ со списком прошлых релизов — не замена проверке production. Он полезен, чтобы понимать, что спросить у системы. Но всё равно нужно посмотреть текущий revision, состояние процессов, health-check и нужный пользовательский маршрут.",[12,2368,2369],{},"Агент умеет быстро читать много, но это не повод читать всё подряд. Я задаю порядок: правила проекта, актуальный контекст, текущий план, затем код и состояние работающей системы.",[12,2371,2372],{},"Похоже, я наконец нашёл читателя для технической документации.",[56,2374,2376],{"id":2375},"пять-слоёв-постановки-задачи","Пять слоёв постановки задачи",[12,2378,2379],{},"Со временем у меня сложилась простая конструкция. Почти любую работу с агентом можно проверить по пяти слоям.",[470,2381,2383],{"id":2382},"_1-цель","1. Цель",[12,2385,2386],{},"Не «добавить кнопку», а ответить на вопросы:",[31,2388,2389,2392,2395,2398],{},[34,2390,2391],{},"кто получает новое действие;",[34,2393,2394],{},"какую проблему оно решает;",[34,2396,2397],{},"что меняется в пользовательском сценарии;",[34,2399,2400],{},"что сознательно не входит в задачу.",[12,2402,2403],{},"Например, цель может звучать так: «пользователь должен видеть понятную причину отказа и знать, что делать дальше». Это лучше, чем «сделай красивое уведомление».",[12,2405,2406],{},"В первой формулировке есть результат. Во второй — только эстетическое пожелание, которое можно трактовать бесконечно.",[470,2408,2410],{"id":2409},"_2-реальность","2. Реальность",[12,2412,2413],{},"До плана нужно установить факты.",[12,2415,2416],{},"Не «вроде бы сервис использует такую-то очередь», а проверить код и состояние системы. Не «кажется, endpoint защищён», а посмотреть маршрут, policy, тест и фактический HTTP-ответ. Не «релиз уже выкачен», а сверить revision и публичный маршрут.",[12,2418,2419],{},"Этот этап иногда выглядит как потеря времени. Особенно когда хочется немедленно дать агенту команду «исправляй». Но именно он спасает от классического сценария: три часа мы лечили проблему в одном окружении, а пользователь всё это время работал в другом.",[470,2421,2423],{"id":2422},"_3-границы","3. Границы",[12,2425,2426],{},"В хорошей задаче нужно назвать и то, что сделать, и то, чего делать нельзя.",[12,2428,2429],{},"Например:",[31,2431,2432,2435,2438,2441,2444,2447],{},[34,2433,2434],{},"не трогать production без отдельного решения;",[34,2436,2437],{},"не менять инфраструктуру ради удобства одного патча;",[34,2439,2440],{},"не удалять данные широким запросом;",[34,2442,2443],{},"не раскрывать конфигурацию и секреты;",[34,2445,2446],{},"не исправлять соседние подсистемы «заодно»;",[34,2448,2449],{},"не стирать чужие незакоммиченные изменения.",[12,2451,2452],{},"Границы особенно важны потому, что агент очень охотно помогает. Иногда настолько охотно, что начинает чинить не только указанную проблему, но и весь мир вокруг неё. Для человека это называют инициативностью. В работе с агентом это повод ещё раз проверить границы задачи.",[470,2454,2456],{"id":2455},"_4-доказательство-готовности","4. Доказательство готовности",[12,2458,2459],{},"Фразы «код написан» недостаточно.",[12,2461,2462],{},"«Тест прошёл» — тоже не всегда готовность.",[12,2464,2465],{},"В зависимости от задачи доказательство может включать:",[31,2467,2468,2471,2474,2477,2480,2483,2486,2489],{},[34,2469,2470],{},"regression test на конкретный контракт;",[34,2472,2473],{},"сборку затронутого приложения;",[34,2475,2476],{},"проверку API или очереди;",[34,2478,2479],{},"подтверждённое состояние в базе;",[34,2481,2482],{},"desktop- и mobile-проверку публичного сценария;",[34,2484,2485],{},"независимый review;",[34,2487,2488],{},"exact revision на сервере;",[34,2490,2491],{},"возможность отката.",[12,2493,2494],{},"Список не должен быть длинным. Он должен соответствовать риску. Для текстовой правки не нужен военный совет. Для изменения авторизации или записи данных недостаточно фразы «вроде работает».",[470,2496,2498],{"id":2497},"_5-след-знания","5. След знания",[12,2500,2501],{},"После заметной работы результат не должен оставаться только в чате.",[12,2503,2504],{},"Если выяснилось новое ограничение — оно попадает в документ или runbook. Если найден опасный сценарий — появляется тест. Если повторяется диагностический путь — он сохраняется как процедура. Если обновился контракт — это отражается в актуальном контексте.",[12,2506,2507],{},"Так появляется память разработки, а не склад заметок. В следующий раз агент не начинает заново из археологических раскопок, а я не пытаюсь вспомнить, почему месяц назад мы запретили «простое» решение.",[12,2509,2510],{},"Эти слои лучше работают не как чек-лист в конце, а как последовательность принятия решения:",[301,2512,2516],{"className":2513,"code":2514,"language":2515,"meta":310,"style":310},"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",[238,2517,2518,2523,2528,2533,2538],{"__ignoreMap":310},[1562,2519,2520],{"class":1564,"line":1565},[1562,2521,2522],{},"flowchart TB\n",[1562,2524,2525],{"class":1564,"line":352},[1562,2526,2527],{},"  goal[1 · Цель] --> facts[2 · Проверенные факты]\n",[1562,2529,2530],{"class":1564,"line":641},[1562,2531,2532],{},"  facts --> scope[3 · Границы изменения]\n",[1562,2534,2535],{"class":1564,"line":1582},[1562,2536,2537],{},"  scope --> proof[4 · Доказательство готовности]\n",[1562,2539,2540],{"class":1564,"line":1589},[1562,2541,2542],{},"  proof --> memory[5 · След знания]\n",[56,2544,2546],{"id":2545},"агент-не-должен-быть-универсальным-исполнителем","Агент не должен быть универсальным исполнителем",[12,2548,2549],{},"Самый опасный запрос к AI звучит просто: «разберись со всем».",[12,2551,2552],{},"Иногда я тоже так думаю. Особенно когда вижу старый сервис, несколько слоёв документации, очередь, фоновые задачи, непонятное состояние данных и один маленький баг, который почему-то не хочет быть маленьким.",[12,2554,2555],{},"Но в таких случаях универсальный агент быстро становится универсальным источником правдоподобных объяснений. Он может найти десять мест, которые «похожи на проблему», предложить большую переработку и даже честно написать, что всё проверил. А потом окажется, что главный сценарий никто не запускал.",[12,2557,2558],{},"Поэтому я разделяю роли.",[408,2560,2561,2570],{},[411,2562,2563],{},[414,2564,2565,2568],{},[417,2566,2567],{},"Роль",[417,2569,422],{},[424,2571,2572,2580,2588,2596,2604],{},[414,2573,2574,2577],{},[429,2575,2576],{},"Исследователь",[429,2578,2579],{},"Собирает факты о коде, документации, данных и runtime",[414,2581,2582,2585],{},[429,2583,2584],{},"Исполнитель",[429,2586,2587],{},"Делает ограниченное изменение в согласованном scope",[414,2589,2590,2593],{},[429,2591,2592],{},"Ревьюер",[429,2594,2595],{},"Ищет пропущенные контракты, риски и слабые проверки",[414,2597,2598,2601],{},[429,2599,2600],{},"Принимающий",[429,2602,2603],{},"Независимо подтверждает, что результат действительно работает",[414,2605,2606,2609],{},[429,2607,2608],{},"Ведущий",[429,2610,2611],{},"Связывает цель, риск, архитектуру и решение владельца продукта",[12,2613,2614],{},"Иногда все эти роли выполняет один агент в несколько заходов. Иногда для независимости полезно разделить их. Но смысл остаётся: результат исполнителя не должен автоматически становиться истиной только потому, что он звучит убедительно.",[149,2616,2617],{},[12,2618,2619],{},"Отчёт агента — это гипотеза до тех пор, пока она не подтверждена кодом, тестом, системой или независимой проверкой.",[12,2621,2622],{},"Особенно это относится к авторизации, данным, платежам, очередям, внешним интеграциям и production.",[56,2624,2626],{"id":2625},"почему-скорость-не-равна-отмене-проверок","Почему скорость не равна отмене проверок",[12,2628,2629],{},"Есть две одинаково вредные крайности.",[12,2631,2632],{},"Первая: запускать полный набор проверок после каждой запятой в документации. Это выглядит строго, но постепенно превращает разработку в ритуал. Люди и агенты начинают ждать завершения тяжёлых процессов, не понимая, что именно они проверяют.",[12,2634,2635],{},"Вторая: «быстро сделать, потом разберёмся». Это обычно означает, что разбираться будут уже с последствиями — в логах, в базе, в рабочее время и в чужом настроении.",[12,2637,2638,2639,350],{},"Я стараюсь использовать третий вариант: ",[287,2640,2641],{},"сила проверки должна соответствовать цене ошибки",[408,2643,2644,2653],{},[411,2645,2646],{},[414,2647,2648,2650],{},[417,2649,1882],{},[417,2651,2652],{},"Что достаточно проверить",[424,2654,2655,2663,2671,2679,2687],{},[414,2656,2657,2660],{},[429,2658,2659],{},"Документация или изолированный текст",[429,2661,2662],{},"Diff и непротиворечивость фактам",[414,2664,2665,2668],{},[429,2666,2667],{},"Локальная бизнес-логика",[429,2669,2670],{},"Точный regression test и сборка затронутого компонента",[414,2672,2673,2676],{},[429,2674,2675],{},"Публичный интерфейс",[429,2677,2678],{},"Нужный пользовательский flow на desktop и mobile",[414,2680,2681,2684],{},[429,2682,2683],{},"Очередь, writer, данные",[429,2685,2686],{},"Инварианты, состояние в базе, защита от частичной записи",[414,2688,2689,2692],{},[429,2690,2691],{},"Авторизация, деньги, production",[429,2693,2694],{},"Exact revision, независимый review, rollback и runtime smoke",[12,2696,2697],{},"Это не означает, что я всегда угадываю идеальный набор проверок. Но сама постановка вопроса меняет работу.",[12,2699,2700],{},"Не «как заставить агента сделать всё быстро?», а «какая ошибка здесь будет самой дорогой и как её поймать раньше пользователя?»",[56,2702,2704],{"id":2703},"production-это-не-место-для-продолжения-разработки","Production — это не место для продолжения разработки",[12,2706,2707],{},"Отдельная дисциплина нужна для релизов.",[12,2709,2710,2711,2714],{},"Когда система работает для пользователей, нельзя считать успехом ни ",[238,2712,2713],{},"git push",", ни зелёную сборку, ни сообщение process manager-а «online». Все эти вещи полезны, но каждая доказывает только свою маленькую часть истории.",[12,2716,2717],{},"Рабочая цепочка выглядит примерно так:",[301,2719,2721],{"className":2513,"code":2720,"language":2515,"meta":310,"style":310},"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",[238,2722,2723,2727,2732,2737,2742,2747,2752,2757],{"__ignoreMap":310},[1562,2724,2725],{"class":1564,"line":1565},[1562,2726,2522],{},[1562,2728,2729],{"class":1564,"line":352},[1562,2730,2731],{},"  change[Локальное изменение] --> checks[Проверка]\n",[1562,2733,2734],{"class":1564,"line":641},[1562,2735,2736],{},"  checks --> revision[Зафиксированный revision]\n",[1562,2738,2739],{"class":1564,"line":1582},[1562,2740,2741],{},"  revision --> candidate[Точный release candidate]\n",[1562,2743,2744],{"class":1564,"line":1589},[1562,2745,2746],{},"  candidate --> switch[Атомарное переключение]\n",[1562,2748,2749],{"class":1564,"line":1595},[1562,2750,2751],{},"  switch --> health[Health-check]\n",[1562,2753,2754],{"class":1564,"line":1600},[1562,2755,2756],{},"  health --> smoke[Пользовательский smoke]\n",[1562,2758,2759],{"class":1564,"line":1606},[1562,2760,2761],{},"  smoke --> rollback[Возможность rollback]\n",[12,2763,2764],{},"Я сознательно стараюсь не «доделывать на сервере». Сервер не должен становиться местом, где пишется код, исправляется lockfile, создаётся коммит или принимается архитектурное решение в полночь под давлением ошибки.",[12,2766,2767],{},"Production должен применять уже подготовленный релиз. И этот релиз должен иметь точный идентификатор: вот revision, вот сборка, вот проверка, вот предыдущая рабочая точка, к которой можно вернуться.",[12,2769,2770],{},"Такой подход кажется медленнее ровно до первого случая, когда нужно понять: пользователь видит новый код или старый? Система упала из-за релиза или проблема была раньше? Что именно откатывать? Есть ли у нас вообще куда откатываться?",[12,2772,2773],{},"После этого словосочетание «давайте быстро поправим на сервере» начинает звучать как предложение чинить проводку мокрыми руками. Возможно, получится. Но лучше сначала выключить питание.",[56,2775,2777],{"id":2776},"промпт-часть-инженерной-системы","Промпт — часть инженерной системы",[12,2779,2780],{},"Когда говорят о prompt engineering, часто представляют удачную формулировку, которая заставляет модель выдать нужный ответ с первого раза.",[12,2782,2783],{},"В разработке мне важнее другое. Промпт — это форма, в которой я фиксирую управленческое решение. Он не должен быть красивым. Он должен быть проверяемым.",[12,2785,2786],{},"Например, рабочее задание агенту может выглядеть так:",[301,2788,2791],{"className":2789,"code":2790,"language":306,"meta":307},[304],"Контекст:\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",[238,2792,2790],{"__ignoreMap":310},[12,2794,2795],{},"В таком тексте нет просьбы «будь экспертом мирового уровня». Я не прошу агента «проявить инициативу» и не заставляю его писать эссе о том, как прекрасно он понял задачу.",[12,2797,2798],{},"Я задаю ему рабочую среду: вот цель, вот порядок, вот границы, вот форма результата.",[12,2800,2801],{},"А ещё я могу сказать самое полезное: «остановись перед следующим опасным действием». Агент не обидится, не закатит глаза и не скажет, что ему нужно больше доверять. Он просто остановится. В мире разработки это недооценённое качество.",[56,2803,2805],{"id":2804},"после-ошибки-нужен-не-новый-промпт-а-новая-защита","После ошибки нужен не новый промпт, а новая защита",[12,2807,2808],{},"Когда агент делает неверный шаг, очень легко начать бесконечный цикл:",[301,2810,2813],{"className":2811,"code":2812,"language":306,"meta":310},[304],"Не сработало → попробуй ещё → не сработало → попробуй по-другому.\n",[238,2814,2812],{"__ignoreMap":310},[12,2816,2817],{},"Иногда второй заход действительно нужен. Но если ошибка повторяется, проблема обычно уже не в конкретной формулировке. Значит, в системе отсутствует защита.",[12,2819,2820],{},"Я стараюсь разбирать такие случаи иначе:",[301,2822,2825],{"className":2823,"code":2824,"language":306,"meta":310},[304],"Симптом\n→ факты\n→ root cause\n→ минимальное исправление\n→ regression test или инвариант\n→ обновлённый контекст\n",[238,2826,2824],{"__ignoreMap":310},[12,2828,2829],{},"Например, если однажды выяснилось, что фоновая задача может завершиться без ошибки, но не выполнить полезную работу, недостаточно просто поправить обработчик. Нужно добавить проверку её реального результата.",[12,2831,2832],{},"Если можно перепутать окружения, нужен предохранитель, который заставит сначала подтвердить цель действия. Если deploy-скрипт может взять не тот revision, ему нужен exact-SHA контракт. Если документ расходится с кодом, нужно не только исправить документ, но и понять, почему он перестал обновляться.",[12,2834,2835,2836,2839],{},"В этом месте AI особенно полезен. Он умеет быстро помочь превратить разовый урок в тест, правило, runbook или проверку. Но решение о том, ",[287,2837,2838],{},"какая защита действительно нужна",", остаётся за мной.",[56,2841,2843],{"id":2842},"чего-ai-не-решает","Чего AI не решает",[12,2845,2846],{},"Важно не превратить всё это в новую форму AI-оптимизма.",[12,2848,2849],{},"Агент не знает автоматически:",[31,2851,2852,2855,2858,2861,2864,2867],{},[34,2853,2854],{},"какой продукт нужен людям;",[34,2856,2857],{},"какой риск допустим для бизнеса;",[34,2859,2860],{},"когда стоит отказаться от идеи;",[34,2862,2863],{},"что можно считать достаточным доказательством;",[34,2865,2866],{},"какая часть старой системы ценна, а какая давно просится на покой;",[34,2868,2869],{},"почему пользователь недоволен, даже если формально все тесты зелёные.",[12,2871,2872],{},"Он также не заменяет обратную связь от живых людей. Можно идеально организовать pipeline, покрыть тестами контракты, написать прекрасную документацию — и всё равно построить вещь, которая никому не нужна.",[12,2874,2875],{},"AI не отменяет продуктовую ответственность. Он лишь делает дороже попытку от неё спрятаться.",[56,2877,2879],{"id":2878},"вопросы-и-ответы","Вопросы и ответы",[470,2881,2883],{"id":2882},"как-ставить-задачи-ai-агенту-в-разработке","Как ставить задачи AI-агенту в разработке?",[12,2885,2886],{},"Сначала назвать цель и риск, затем дать агенту проверяемый контекст, границы изменения и критерий готовности. Короткая команда может быть началом разговора, но не заменяет постановку задачи.",[470,2888,2890],{"id":2889},"почему-ai-агенту-недостаточно-короткого-промпта","Почему AI-агенту недостаточно короткого промпта?",[12,2892,2893],{},"Агент не живёт внутри проекта: он не знает актуальное состояние кода, данных, окружений и старых ограничений, пока это не подтверждено. Без контекста он вынужден выбирать важные ответы вместо владельца задачи.",[470,2895,2897],{"id":2896},"как-безопасно-использовать-ai-при-production-deploy","Как безопасно использовать AI при production deploy?",[12,2899,2900],{},"Сначала подготовить и проверить конкретный revision вне production. Затем применять только этот revision, фиксировать health-check и отдельно проходить пользовательский smoke-сценарий. Если риск не согласован, агент должен остановиться до опасного действия.",[56,2902,2904],{"id":2903},"управление-стало-разговором-но-не-разговором-ни-о-чём","Управление стало разговором — но не разговором ни о чём",[12,2906,2907],{},"Работа с агентом изменила моё представление об управлении разработкой.",[12,2909,2910],{},"Раньше я больше думал о распределении задач: что отдать, в каком порядке сделать, кому поручить проверку. Сейчас фокус сместился. Самая важная часть работы происходит раньше кода:",[31,2912,2913,2916,2919,2922,2925,2928],{},[34,2914,2915],{},"правильно назвать цель;",[34,2917,2918],{},"отделить факт от предположения;",[34,2920,2921],{},"обозначить границы;",[34,2923,2924],{},"определить риск;",[34,2926,2927],{},"договориться о доказательстве результата;",[34,2929,2930],{},"сохранить знание после завершения.",[12,2932,2933],{},"Получается, что управление всё чаще сводится к качеству диалога. Но не к разговору ради разговора. К разговору, после которого появляется конкретный проверяемый результат.",[149,2935,2936],{},[12,2937,2938],{},"Чем сильнее AI участвует в разработке, тем меньше можно управлять намёками.",[12,2940,2941],{},"Каждое неясное слово в задаче становится риском. Каждая непроверенная гипотеза — потенциальным багом. Каждая хорошо поставленная цель — возможностью двигаться быстрее без лишнего героизма.",[12,2943,2944],{},"Я продолжаю строить эту систему: уточнять контекст, превращать ошибки в проверки, отделять исследование от изменений и учиться ставить задачи так, чтобы за диалогом всегда оставался работающий результат.",[12,2946,2947],{},"И, пожалуй, это пока самый полезный эффект AI в разработке. Не то, что он пишет код. А то, что рядом с ним приходится наконец ясно объяснять, зачем этот код нужен.",[12,2949,2950,2951,350],{},"Наблюдения об AI в разработке и о том, что в этой работе остаётся на стороне человека, я продолжаю собирать в Telegram-канале ",[346,2952,2956],{"href":2953,"rel":2954},"https:\u002F\u002Ft.me\u002Fstrunimisli",[2955],"nofollow","«Струны, мысли»",[2043,2958,2959],{},"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":310,"searchDepth":352,"depth":352,"links":2961},[2962,2963,2964,2965,2966,2967,2974,2975,2976,2977,2978,2979,2980,2985],{"id":1031,"depth":352,"text":1032},{"id":2139,"depth":352,"text":2140},{"id":2182,"depth":352,"text":2183},{"id":2236,"depth":352,"text":2237},{"id":2293,"depth":352,"text":2294},{"id":2375,"depth":352,"text":2376,"children":2968},[2969,2970,2971,2972,2973],{"id":2382,"depth":641,"text":2383},{"id":2409,"depth":641,"text":2410},{"id":2422,"depth":641,"text":2423},{"id":2455,"depth":641,"text":2456},{"id":2497,"depth":641,"text":2498},{"id":2545,"depth":352,"text":2546},{"id":2625,"depth":352,"text":2626},{"id":2703,"depth":352,"text":2704},{"id":2776,"depth":352,"text":2777},{"id":2804,"depth":352,"text":2805},{"id":2842,"depth":352,"text":2843},{"id":2878,"depth":352,"text":2879,"children":2981},[2982,2983,2984],{"id":2882,"depth":641,"text":2883},{"id":2889,"depth":641,"text":2890},{"id":2896,"depth":641,"text":2897},{"id":2903,"depth":352,"text":2904},"2026-08-11","Как я выстраиваю разработку с AI-агентом: через цели, контекст, ограничения, проверку фактов и доказательства результата.",{},"\u002Fblog\u002F2026-08-11-ai-upravlenie-razrabotkoj",{"title":2089,"description":2987},"blog\u002F2026-08-11-ai-upravlenie-razrabotkoj",[373,374,2993,377,2994],"управление","мысли","2KE0r-c898KARjeA8befh6xQ7RkWoXBdw-XGXwQ1YA0",{"id":2997,"title":2998,"acrostic":7,"body":2999,"date":3074,"description":3075,"duration":7,"emoji":7,"extension":365,"faq":7,"featured":366,"format":7,"image":7,"level":7,"media":7,"meta":3076,"navigation":368,"path":3077,"price":7,"schedule":7,"seo":3078,"seoTitle":7,"serviceType":7,"status":7,"stem":3079,"tags":3080,"tech":7,"toc":366,"url":7,"__hash__":3083},"blog\u002Fblog\u002F2026-08-04-dumat-energozatratno.md","Думать энергозатратно",{"type":9,"value":3000,"toc":3072},[3001,3004,3007,3010,3013,3016,3019,3022,3025,3028,3031,3034,3037,3054,3057,3060,3063,3066,3069],[12,3002,3003],{},"Думать энергозатратно.",[12,3005,3006],{},"Мозг — один из самых требовательных к энергии органов. Даже в состоянии покоя он потребляет заметную долю ресурсов организма. А когда нужно разобраться в новой, неочевидной задаче, построить модель происходящего, выбрать направление и принять решение — это ощущается почти физически.",[12,3008,3009],{},"Поэтому нам часто не хочется думать.",[12,3011,3012],{},"Мы выбираем знакомые шаблоны, опираемся на прошлый опыт, повторяем уже сработавшие решения. Это не обязательно признак лени или слабости. Скорее, естественный способ экономить ресурс.",[12,3014,3015],{},"Но именно там, где шаблонов недостаточно, начинается настоящая работа: нужно искать новое решение, удерживать в голове противоречия, проверять гипотезы, признавать, что прежняя схема больше не подходит.",[12,3017,3018],{},"Сейчас часть этой нагрузки берёт на себя искусственный интеллект.",[12,3020,3021],{},"ИИ может быстро написать типовой код, разложить задачу на подзадачи, собрать варианты реализации, подготовить тесты, найти очевидную ошибку. То, на что раньше уходили часы ручной работы, теперь иногда занимает минуты.",[12,3023,3024],{},"Это действительно меняет скорость разработки.",[12,3026,3027],{},"Но есть важная оговорка: ИИ не отменяет необходимость думать. Он переносит её выше по уровню.",[12,3029,3030],{},"Раньше скорость создания продукта зависела от всей цепочки: от автора идеи и архитектора до разработчика, который реализует очередную небольшую часть системы. Каждому нужно было остановиться, понять контекст и принять решение.",[12,3032,3033],{},"Теперь значительную часть низового труда можно автоматизировать. Робот не устает писать код, не теряет концентрацию на рутинных правках и способен очень быстро перебрать варианты.",[12,3035,3036],{},"А вот человеку остаётся самое сложное:",[31,3038,3039,3042,3045,3048,3051],{},[34,3040,3041],{},"понять, какую проблему мы вообще решаем;",[34,3043,3044],{},"сформулировать цель так, чтобы она не развалилась при реализации;",[34,3046,3047],{},"выбрать ограничения и критерии качества;",[34,3049,3050],{},"увидеть последствия решения для продукта, людей и бизнеса;",[34,3052,3053],{},"вовремя остановить систему, которая уверенно строит не то.",[12,3055,3056],{},"Если дать ИИ свободу без ясного каркаса и контроля, он легко построит вавилонскую башню из кода: много файлов, функций, абстракций и активности — но без цельной архитектуры и понятной ценности.",[12,3058,3059],{},"Поэтому настоящий предел скорости разработки сегодня — не скорость генерации кода.",[12,3061,3062],{},"Он упирается в человеческую способность собраться, найти силы, выделить время и по-настоящему подумать: что именно нужно сделать и почему.",[12,3064,3065],{},"Этот барьер вряд ли исчезнет полностью. Возможно, ИИ будет всё лучше ставить промежуточные цели и предлагать решения. Но исходный замысел, каркас системы и ответственность за направление пока остаются человеческой работой.",[12,3067,3068],{},"ИИ делает работу быстрее.",[12,3070,3071],{},"Но думать за нас — особенно о важном — он пока не отменяет.",{"title":310,"searchDepth":352,"depth":352,"links":3073},[],"2026-08-04","ИИ ускоряет создание кода, но не отменяет главную человеческую работу: сформулировать задачу, спроектировать систему и взять ответственность за решение.",{},"\u002Fblog\u002F2026-08-04-dumat-energozatratno",{"title":2998,"description":3075},"blog\u002F2026-08-04-dumat-energozatratno",[3081,374,3082],"ии","мышление","VObIrQdtM415tg47o04mnjebtR8Hb1DZVRwGxjCgMlo",{"id":3085,"title":3086,"acrostic":7,"body":3087,"date":3199,"description":3200,"duration":7,"emoji":7,"extension":365,"faq":7,"featured":366,"format":7,"image":7,"level":7,"media":7,"meta":3201,"navigation":368,"path":3202,"price":7,"schedule":7,"seo":3203,"seoTitle":7,"serviceType":7,"status":7,"stem":3204,"tags":3205,"tech":7,"toc":366,"url":7,"__hash__":3208},"blog\u002Fblog\u002F2026-07-09-telegram-invite-reality.md","Как я пытаюсь раскачать телеграм-канал: битва с лимитами",{"type":9,"value":3088,"toc":3192},[3089,3092,3095,3099,3102,3105,3108,3112,3115,3118,3121,3125,3128,3131,3137,3143,3147,3150,3164,3167,3171,3177,3183,3189],[12,3090,3091],{},"У меня есть канал — «Струны, мысли». Стихи, музыка, мысли. Недавно решил попробовать пригласить туда людей из своих контактов. Тысяча с лишним человек — среди них точно есть те, кому это откликнется.",[12,3093,3094],{},"Плюс у меня есть AI-агент. Он умеет писать скрипты, работать с Telegram API, отслеживать прогресс. Казалось бы — идеальный инструмент для массовой рассылки.",[56,3096,3098],{"id":3097},"первый-запуск","Первый запуск",[12,3100,3101],{},"8 июля, вечер. Агент отфильтровал контакты — около 600 ботов и мёртвых душ отсеялись, осталось 1158 реальных людей. Запустили скрипт.",[12,3103,3104],{},"24 приглашения — и Telegram разорвал сессию. Просто отключил аккаунт от API. Без предупреждения, без объяснений.",[12,3106,3107],{},"Пришлось заново авторизоваться. Потеряли час.",[56,3109,3111],{"id":3110},"вторая-попытка","Вторая попытка",[12,3113,3114],{},"На следующий день решили действовать иначе. Сначала — тихие инвайты в канал (107 человек добавлены, даже не заметили). Потом — личные сообщения с приглашением. Честные, без маркетингового шлака: «Привет! Это массовая рассылка, но канал мой, стихи тоже мои. Вот ссылка».",[12,3116,3117],{},"67 сообщений за 20 минут. И снова — «Too many requests». Аккаунт забанен.",[12,3119,3120],{},"На этот раз бан подольше. Часы.",[56,3122,3124],{"id":3123},"третья-попытка","Третья попытка",[12,3126,3127],{},"Переписали скрипт. Теперь он работает в двух режимах: invite в канал + личное сообщение, с паузой 31 секунда между приглашениями. При rate limit — ждёт час и пробует снова. Запустили в фоне.",[12,3129,3130],{},"Но выяснилось две вещи, которые усложнили автоматизацию.",[12,3132,3133,3136],{},[287,3134,3135],{},"Первое:"," Telegram не даёт отправлять больше 20–30 личных сообщений в день незнакомым людям. Не в час — в день. Приглашения в канал — около 30 в час. Это не баг, это политика платформы. И она не написана нигде в явном виде — только в FloodWaitError, который приходит после факта.",[12,3138,3139,3142],{},[287,3140,3141],{},"Второе:"," мой AI-агент и скрипт рассылки используют одну и ту же сессию Telegram. Они не могут работать одновременно. Каждый запуск скрипта требует остановки агента. Каждый ответ агента — остановки скрипта.",[56,3144,3146],{"id":3145},"где-мы-сейчас","Где мы сейчас",[12,3148,3149],{},"Скрипт работает. Медленно, по одному приглашению в 31 секунду, с часовыми паузами при каждом бане. Из 1158 контактов:",[31,3151,3152,3155,3158,3161],{},[34,3153,3154],{},"100 человек добавлены в канал (тихо, без уведомлений)",[34,3156,3157],{},"72 получили личное приглашение",[34,3159,3160],{},"22 пропущены — закрытые настройки приватности",[34,3162,3163],{},"954 ждут своей очереди",[12,3165,3166],{},"Баны снимаются. Скрипт снова стучится в API. Так и ломимся — по часу в час, по одному приглашению за раз.",[56,3168,3170],{"id":3169},"что-понял-на-этом-пути","Что понял на этом пути",[12,3172,3173,3176],{},[287,3174,3175],{},"Telegram защищает пользователей, а не создателей контента."," Лимиты — это философия платформы: рост должен быть органическим. Но «органический» не значит «ждать, пока само придёт». Значит — идти к людям, но медленно, с уважением к правилам.",[12,3178,3179,3182],{},[287,3180,3181],{},"AI — не кнопка «сделать всё»."," Агент пишет скрипты, обрабатывает ошибки, адаптируется к лимитам. Но он не может обойти фундаментальное ограничение платформы. Зато он может терпеливо ждать и пробовать снова — в отличие от человека, которому это наскучит через два часа.",[12,3184,3185,3188],{},[287,3186,3187],{},"1158 приглашений — это марафон, не спринт."," При текущем темпе на всё уйдут несколько дней. И это нормально. Каждый, кто примет приглашение, будет тем, кто увидел реальное приглашение от реального человека — а не спам из ниоткуда.",[12,3190,3191],{},"Продолжение следует. Скрипт работает.",{"title":310,"searchDepth":352,"depth":352,"links":3193},[3194,3195,3196,3197,3198],{"id":3097,"depth":352,"text":3098},{"id":3110,"depth":352,"text":3111},{"id":3123,"depth":352,"text":3124},{"id":3145,"depth":352,"text":3146},{"id":3169,"depth":352,"text":3170},"2026-07-09","История о том, как AI-автоматизация массовых приглашений столкнулась с реальностью телеграм-лимитов",{},"\u002Fblog\u002F2026-07-09-telegram-invite-reality",{"title":3086,"description":3200},"blog\u002F2026-07-09-telegram-invite-reality",[3206,373,3207,2994],"telegram","опыт","gGQprx9Q2ELGhjkWm1QiNpHXVK3P5xEBRLSu0ZOxxI0",{"id":3210,"title":3211,"acrostic":7,"body":3212,"date":3301,"description":3302,"duration":7,"emoji":7,"extension":365,"faq":7,"featured":366,"format":7,"image":7,"level":7,"media":7,"meta":3303,"navigation":368,"path":3304,"price":7,"schedule":7,"seo":3305,"seoTitle":7,"serviceType":7,"status":7,"stem":3306,"tags":3307,"tech":7,"toc":366,"url":7,"__hash__":3309},"blog\u002Fblog\u002F2026-07-08-o-privychke-i-merakh.md","О привычке и мерах",{"type":9,"value":3213,"toc":3295},[3214,3217,3220,3224,3231,3234,3237,3244,3247,3251,3254,3257,3260,3263,3266,3270,3273,3276,3279,3283,3286,3289,3292],[12,3215,3216],{},"Монтень ушёл из суда, заперся в башне своего замка и тридцать лет писал книгу о себе. Не о политике, не о войнах — о том, как он сам устроен. Что его злит, что радует, почему он делает одно и не делает другое. «Опыты» — это толстая тетрадь честных записей. Без претензии на истину.",[12,3218,3219],{},"Я не ушёл в замок. Но я тоже веду записи. Только мои — не про личные нравы, а про код, системы и привычки, которые в них пролезают.",[56,3221,3223],{"id":3222},"привычка","Привычка",[12,3225,3226,3227,3230],{},"Монтень говорил: «Привычка — тихая и незаметная управительница». Она не приказывает — она просто делает за нас. Открываешь проект — Ctrl+P, открываешь терминал, пишешь ",[238,3228,3229],{},"npm run dev",". Новый проект — те же клавиши. Не задумываешься.",[12,3232,3233],{},"И это хорошо. Без привычки невозможно работать. Когда я впервые начал со Strapi 5, каждый шаг требовал усилия: как устроены content types, как работает REST API, где права, как деплоить. Сейчас — автоматизм. Пять минут и новый сервис на ногах.",[12,3235,3236],{},"Но Монтень предупреждал и о другой стороне. Привычка, которая помогает, одновременно слепит. Ты делаешь то же самое, потому что делал раньше, а не потому что это лучший способ.",[12,3238,3239,3240,3243],{},"Я три года писал на Vue. Потом на проекте потребовался React — и я ловил себя на том, что ищу во фреймворке вещи, которых там нет. Vue-привычки. Реактивность через ",[238,3241,3242],{},"ref",", composition API, single-file components. В React это всё устроено иначе, и вместо того чтобы думать на языке нового инструмента, я пытался заставить его работать по-старому.",[12,3245,3246],{},"Монтень так и писал: «Обычай заслоняет нам истинный вид вещей». Фреймворк — это не просто инструмент. Это набор привычек. Сменить стек — значит сменить мышление. А это тяжело.",[56,3248,3250],{"id":3249},"о-мерах","О мерах",[12,3252,3253],{},"В другом эссе Монтень рассуждает об излишествах. Он за умеренность — не потому что крайности плохи сами по себе, а потому что они мешают видеть цель. Ешь слишком много — забудешь вкус еды. Читаешь слишком много — забудешь, зачем читал.",[12,3255,3256],{},"В разработке это проявляется как архитектурный жор.",[12,3258,3259],{},"У меня проект, где 15 PM2-процессов. Frontend, backend, 10 парсеров, анализатор, дайджест, сборщик фото. Когда я рассказываю об этом, люди спрашивает: «Зачем так много?»",[12,3261,3262],{},"И я сам задаю себе тот же вопрос. Потому что когда запускал — каждый сервис казался необходимым. Один парсер на площадку. Один процесс на аналитику. Логично. Но логика каждого отдельного решения не гарантирует логику целого. Можно сделать сто правильных шагов и прийти в тупик.",[12,3264,3265],{},"Монтень бы понял. Он писал: «Наше положение привычно, и вот мы привыкли быть». 15 процессов — это не катастрофа. Но я знаю, что 8 хватило бы. Знаю — потому что уже проходил через это. Сначала всё кажется необходимым. Потом смотришь и видишь дублирование, лишние прослойки, сервис, который делает ровно одну вещь раз в сутки и мог бы быть cron-задачей.",[56,3267,3269],{"id":3268},"опыт-учит-задним-числом","Опыт учит задним числом",[12,3271,3272],{},"Главная мысль Монтеня: опыт приходит после того, как ты уже всё сделал. Нельзя прочитать книгу и стать мудрым. Нужно набить шишки. Но можно — и нужно — честно оглядываться назад и спрашивать: а зачем я это сделал?",[12,3274,3275],{},"Каждую неделю я нахожу в своём коде что-то, что переписал бы иначе. Не потому что было плохо — потому что теперь я знаю больше. Два месяца назад это было правильное решение. Сегодня — нет. И это нормально. Монтень переписывал «Опыты» пятнадцать лет, добавляя и зачёркивая. Книга росла вместе с ним.",[12,3277,3278],{},"Код — тоже. Не бывает финальной архитектуры. Бывает текущая, которая работает, и следующая, которая будет работать лучше. Между ними — опыт. Не книжный, не из документации. Свой, набитый на своих ошибках.",[56,3280,3282],{"id":3281},"привычка-как-мера","Привычка как мера",[12,3284,3285],{},"Вот что я понял, читая Монтеня: привычка и мера — это не два разных предмета. Это одно и то же. Привычка — это внутренняя мера. Ты делаешь ровно столько, сколько делал раньше. Ни больше, ни меньше.",[12,3287,3288],{},"Иногда этого достаточно. Автоматизмы экономят время и силы. Но иногда привычная мера устарела. Проект вырос, задачи изменились, а ты всё ещё делаешь так, как делал полгода назад. Не потому что так лучше — потому что так привычно.",[12,3290,3291],{},"Монтень не давал рецептов. Он говорил: «Я не учу — я рассказываю». Вот и я рассказываю. О том, как привычка помогает строить сервисы. И о том, как та же привычка мешает их упрощать. О мерах — которые приходят только с опытом, а опыт — только с ошибками.",[12,3293,3294],{},"Иногда достаточно остановиться и спросить: я делаю так, потому что это правильно, или потому что я так привык?",{"title":310,"searchDepth":352,"depth":352,"links":3296},[3297,3298,3299,3300],{"id":3222,"depth":352,"text":3223},{"id":3249,"depth":352,"text":3250},{"id":3268,"depth":352,"text":3269},{"id":3281,"depth":352,"text":3282},"2026-07-08","Монтень считал, что привычка делает нас рабами. В разработке то же самое — только рабами фреймворков и паттернов",{},"\u002Fblog\u002F2026-07-08-o-privychke-i-merakh",{"title":3211,"description":3302},"blog\u002F2026-07-08-o-privychke-i-merakh",[2994,374,3308],"философия","x9l2xBnSlfbg9Ooz-ZCtX7KMM4aQ2_3bD4Uf1DdG1C8",{"id":3311,"title":3312,"acrostic":7,"body":3313,"date":3648,"description":3649,"duration":7,"emoji":7,"extension":365,"faq":7,"featured":366,"format":7,"image":7,"level":7,"media":7,"meta":3650,"navigation":368,"path":3651,"price":7,"schedule":7,"seo":3652,"seoTitle":7,"serviceType":7,"status":7,"stem":3653,"tags":3654,"tech":7,"toc":366,"url":7,"__hash__":3660},"blog\u002Fblog\u002F2026-07-07-aklab-ai-development.md","AKLAB: как я строю автоматический мониторинг недвижимости для инвесторов",{"type":9,"value":3314,"toc":3639},[3315,3318,3321,3324,3331,3335,3338,3341,3344,3347,3440,3443,3446,3457,3461,3464,3467,3473,3476,3482,3485,3489,3492,3498,3501,3507,3510,3513,3516,3520,3523,3529,3535,3541,3547,3551,3621,3623,3637],[12,3316,3317],{},"Я делаю сервис мониторинга инвестиционной недвижимости — AKLAB. Он автоматически находит объекты, которые стоят значительно ниже рыночных эталонов. Парсит 10 федеральных площадок, анализирует отклонения от эталонных цен, присылает утренний дайджест на email.",[12,3319,3320],{},"Основной фокус — коммерческая недвижимость: офисы, склады, торговые помещения. Но мониторим также земельные участки и квартиры.",[12,3322,3323],{},"За полтора месяца довёл проект от идеи до продакшена. Рассказываю, как устроено.",[12,3325,3326],{},[3327,3328],"img",{"alt":3329,"src":3330},"Дашборд AKLAB — тёмная тема","\u002Fuploads\u002Faklab-dashboard-dark.png",[56,3332,3334],{"id":3333},"зачем","Зачем",[12,3336,3337],{},"Рынок инвестиционной недвижимости — это торги. Сбербанк-АСТ, Алфалот, М-ЕТС, ГИС Торги, ЕТПРФ, Инвест Москва и другие. На каждой площадке — сотни лотов. Просматривать их вручную каждый день — нереально.",[12,3339,3340],{},"AKLAB делает это за меня: парсит площадки ночью, анализирует отклонения от эталонов, утром присылает результат на почту.",[56,3342,3343],{"id":375},"Архитектура",[12,3345,3346],{},"Один репозиторий, 15 PM2-процессов:",[408,3348,3349,3361],{},[411,3350,3351],{},[414,3352,3353,3355,3358],{},[417,3354,419],{},[417,3356,3357],{},"Порт",[417,3359,3360],{},"Описание",[424,3362,3363,3374,3385,3396,3407,3418,3429],{},[414,3364,3365,3368,3371],{},[429,3366,3367],{},"Frontend (Vue 3 + Vite + Tailwind)",[429,3369,3370],{},":5174",[429,3372,3373],{},"Dashboard, Настройки, Карточки объектов",[414,3375,3376,3379,3382],{},[429,3377,3378],{},"Backend (Strapi 5 + SQLite)",[429,3380,3381],{},":1338",[429,3383,3384],{},"REST API, Admin Panel, Cron scheduler",[414,3386,3387,3390,3393],{},[429,3388,3389],{},"10 парсеров (Playwright\u002Ffetch)",[429,3391,3392],{},":1345–1355",[429,3394,3395],{},"alfalot, torgi-gov, sberbank-ast, m-ets …",[414,3397,3398,3401,3404],{},[429,3399,3400],{},"Analyzer",[429,3402,3403],{},":1341",[429,3405,3406],{},"Сравнение с эталонами",[414,3408,3409,3412,3415],{},[429,3410,3411],{},"Digest",[429,3413,3414],{},":1342",[429,3416,3417],{},"Утренний email-дайджест",[414,3419,3420,3423,3426],{},[429,3421,3422],{},"Photo",[429,3424,3425],{},":1356",[429,3427,3428],{},"Фото из карточек",[414,3430,3431,3434,3437],{},[429,3432,3433],{},"Очередь",[429,3435,3436],{},"—",[429,3438,3439],{},"@aklab\u002Fsqlite-queue",[12,3441,3442],{},"Backend — Strapi 5.44 + SQLite. Выбрал Strapi, потому что из коробки получаю REST API, админку, систему прав и кастомные контроллеры. Не нужно писать boilerplate.",[12,3444,3445],{},"Frontend — Vue 3 + Vite + Tailwind. Дашборд с фильтрами по городу, цене и типу объекта, карточки с галереей фото.",[12,3447,3448,3449,3452,3453,3456],{},"Парсеры — каждый микросервис в отдельной папке, shared-модули в ",[238,3450,3451],{},"_shared\u002F",". Один манифест ",[238,3454,3455],{},"services.json"," управляет портами, health-checks и PM2-конфигом.",[56,3458,3460],{"id":3459},"парсинг","Парсинг",[12,3462,3463],{},"Ночью запускаются 10 парсеров одновременно. Каждый обходит свою площадку, находит новые лоты и проверяет обновления старых.",[12,3465,3466],{},"Парсинг работает в две фазы — и это не просто «скан, потом загрузка». Это принципиальное решение, которое экономит время и ресурсы.",[12,3468,3469,3472],{},[287,3470,3471],{},"Phase 1 — Scan."," Парсер обходит ленту площадки и собирает только карточные данные: цена, площадь, адрес, тип помещения. Тут же, на лету, применяет фильтры. Не попадает в нужный регион — отбрасывается. Площадь меньше минимума — отбрасывается. Цена выше порога — отбрасывается. Стоп-слова в названии — отбрасывается. Всё это происходит до того, как я потратил хоть одну лишнюю секунду на детальную выгрузку.",[12,3474,3475],{},"Типичный сценарий: площадка выдаёт 200 лотов по всей России. После фильтрации по региону (Москва + МО) остаётся 30. После фильтрации по площади и цене — 12. Именно эти 12 и пойдут во вторую фазу, а не все 200.",[12,3477,3478,3481],{},[287,3479,3480],{},"Phase 2 — Fetch Details."," Для каждого прошедшего фильтр лота парсер заходит в карточку и забирает полное описание, фотографии, документы, условия торгов. Это дорогая операция — каждый запрос это реальный HTTP-запрос к площадке, с ожиданием загрузки, иногда с обходом JavaScript-рендеринга через Playwright.",[12,3483,3484],{},"Две фазы позволяют не грузить детали для объектов, которые заведомо не подходят. На некоторых площадках фильтрация отсекает 80–90% лотов ещё на этапе scan.",[56,3486,3488],{"id":3487},"скоринг","Скоринг",[12,3490,3491],{},"После парсинга analyzer оценивает каждый объект по сравнению с эталонными ценами.",[12,3493,3494,3497],{},[287,3495,3496],{},"Эталоны"," — это заранее заданные ориентиры стоимости за квадратный метр для каждого типа помещения в каждом регионе. Не «средняя цена по рынку», а конкретные контрольные точки, которые я веду вручную и корректирую по мере накопления данных.",[12,3499,3500],{},"Для каждого объекта analyzer считает отклонение от эталона:",[301,3502,3505],{"className":3503,"code":3504,"language":306},[304],"deviation = (эталонная_цена − фактическая_цена) \u002F эталонная_цена × 100\n",[238,3506,3504],{"__ignoreMap":310},[12,3508,3509],{},"Если отклонение превышает порог (например, 20%) — объект попадает в фокус. Чем больше отклонение, тем выше фокус-скор.",[12,3511,3512],{},"Кроме отклонения, на скор влияют дополнительные факторы: тип торгов (банкротство vs реализация), наличие фото, полнота описания, сроки торгов. Объект с высоким отклонением, но без фотографий и с неполным описанием получит скор ниже, чем объект с аналогичным отклонением, но полной карточкой.",[12,3514,3515],{},"Весь парсинг и анализ происходит ночью. Утром digest формирует email-дайджест по объектам, попавшим в фокус, и отправляет мне на почту.",[56,3517,3519],{"id":3518},"как-ai-помогает","Как AI помогает",[12,3521,3522],{},"Я разрабатываю AKLAB с AI-ассистентом. Вот что это даёт на практике:",[12,3524,3525,3528],{},[287,3526,3527],{},"Параллельная работа."," AI одновременно пишет код для нескольких сервисов — парсера, analyzer, фронтенд-компонента. Я ревьюю результат, а не пишу с нуля.",[12,3530,3531,3534],{},[287,3532,3533],{},"Документация."," После каждого изменения AI обновляет внутреннюю документацию: архитектурные решения, known issues, deployment notes. Всё актуально в каждый момент времени.",[12,3536,3537,3540],{},[287,3538,3539],{},"Тесты."," AI генерирует тесты параллельно с кодом. Не «напиши потом тесты» — а сразу вместе с фичей.",[12,3542,3543,3546],{},[287,3544,3545],{},"Деплой."," Один скрипт: коммит, пуш, npm install, build 10 сервисов, перезапуск PM2, health-check. 3–5 минут от команды до рабочего продакшена.",[56,3548,3550],{"id":3549},"цифры","Цифры",[408,3552,3553,3563],{},[411,3554,3555],{},[414,3556,3557,3560],{},[417,3558,3559],{},"Метрика",[417,3561,3562],{},"Значение",[424,3564,3565,3573,3581,3589,3597,3605,3613],{},[414,3566,3567,3570],{},[429,3568,3569],{},"Версия",[429,3571,3572],{},"v1.1.43",[414,3574,3575,3578],{},[429,3576,3577],{},"PM2-процессов",[429,3579,3580],{},"15",[414,3582,3583,3586],{},[429,3584,3585],{},"Активных парсеров",[429,3587,3588],{},"10",[414,3590,3591,3594],{},[429,3592,3593],{},"Площадок",[429,3595,3596],{},"10 федеральных",[414,3598,3599,3602],{},[429,3600,3601],{},"Тестов",[429,3603,3604],{},"578",[414,3606,3607,3610],{},[429,3608,3609],{},"Коммитов",[429,3611,3612],{},"200+",[414,3614,3615,3618],{},[429,3616,3617],{},"Время от идеи до prod",[429,3619,3620],{},"1.5 месяца",[56,3622,960],{"id":959},[31,3624,3625,3628,3631,3634],{},[34,3626,3627],{},"Email-дайджест с аналитикой по трендам",[34,3629,3630],{},"Расширение на больше площадок и регионов",[34,3632,3633],{},"API для партнёров",[34,3635,3636],{},"Предсказание доходности на основе исторических данных",[340,3638],{},{"title":310,"searchDepth":352,"depth":352,"links":3640},[3641,3642,3643,3644,3645,3646,3647],{"id":3333,"depth":352,"text":3334},{"id":375,"depth":352,"text":3343},{"id":3459,"depth":352,"text":3460},{"id":3487,"depth":352,"text":3488},{"id":3518,"depth":352,"text":3519},{"id":3549,"depth":352,"text":3550},{"id":959,"depth":352,"text":960},"2026-07-07","10 парсеров, 15 сервисов, 578 тестов. Как я строю платформу для инвесторов в недвижимость с помощью AI.",{},"\u002Fblog\u002F2026-07-07-aklab-ai-development",{"title":3312,"description":3649},"blog\u002F2026-07-07-aklab-ai-development",[3655,373,374,3656,3657,3658,3659],"aklab","strapi","vue","недвижимость","инвестиции","NgOyUcftyQjU9k1ghD0wHeO2LsIUkgKlZjFav3qstgc",{"id":3662,"title":3663,"acrostic":7,"body":3664,"date":3671,"description":3672,"duration":7,"emoji":7,"extension":365,"faq":7,"featured":366,"format":7,"image":7,"level":7,"media":3673,"meta":3677,"navigation":368,"path":3678,"price":7,"schedule":7,"seo":3679,"seoTitle":7,"serviceType":7,"status":7,"stem":3680,"tags":3681,"tech":7,"toc":366,"url":7,"__hash__":3683},"blog\u002Fblog\u002F2026-03-14-improvizaciya.md","Импровизация (14 марта)",{"type":9,"value":3665,"toc":3669},[3666],[12,3667,3668],{},"Живая акустическая импровизация, записанная 14 марта.",{"title":310,"searchDepth":352,"depth":352,"links":3670},[],"2026-03-14","Акустическая гитара, свежая импровизация.",[3674],{"type":3675,"url":3676,"title":3663},"audio","\u002Fmusic\u002F14-mar-1222.mp3",{},"\u002Fblog\u002F2026-03-14-improvizaciya",{"title":3663,"description":3672},"blog\u002F2026-03-14-improvizaciya",[3682],"музыка","8tBvhLmSw3k7YN0s4RuppHBhnjaYZ9-n6ULY5X0DtlM",{"id":3685,"title":3686,"acrostic":7,"body":3687,"date":3717,"description":3718,"duration":7,"emoji":7,"extension":365,"faq":7,"featured":366,"format":7,"image":7,"level":7,"media":7,"meta":3719,"navigation":368,"path":3722,"price":7,"schedule":7,"seo":3723,"seoTitle":7,"serviceType":7,"status":7,"stem":3724,"tags":3725,"tech":7,"toc":366,"url":7,"__hash__":3727},"blog\u002Fblog\u002F2026-03-13-help-people.md","Помочь можно только тому, кто готов",{"type":9,"value":3688,"toc":3715},[3689,3692,3695,3698,3701,3704,3707,3710],[12,3690,3691],{},"Иногда ловлю себя на мысли, что очень хочу приносить пользу. Не просто быть рядом, а именно — быть полезным. Помогать близким, да и вообще — людям. Делать так, чтобы кому-то стало легче, понятнее, лучше.",[12,3693,3694],{},"Умею, казалось бы, немало. Могу сайт помочь сделать. Могу разобраться с ИИ, внедрить, прокачать процессы. Казалось бы — бери и делай, приноси пользу.",[12,3696,3697],{},"Но что-то не складывается.",[12,3699,3700],{},"И ведь знаю я эту мудрость, которую не первый раз слышу: «Люди сопротивляются новому, даже если понимают, что оно к лучшему». Знаю — и всё равно каждый раз удивляюсь. Вроде человек сам просил помощи. Вроде сам понимает, что надо что-то менять. А потом — тишина. Или отговорки. Или просто игнор.",[12,3702,3703],{},"Может, конечно, это я где-то не так подхожу. Может, не умею правильно донести. Может, навязываюсь там, где не надо.",[12,3705,3706],{},"А может, всё просто — помочь можно только тому, кто сам готов эту помощь принять. Не за руку тянуть, а просто быть рядом, когда спросят.",[12,3708,3709],{},"Но всё равно — хочется. Чтобы получалось. Чтобы не зря.",[149,3711,3712],{},[12,3713,3714],{},"«...и может быть станем, станем мы друг другу нужней...» — иногда эта строчка из 7Б застревает в голове. Вот бы так. Вот бы получалось.",{"title":310,"searchDepth":352,"depth":352,"links":3716},[],"2026-03-13","О желании приносить пользу и о том, почему это не всегда получается",{"externalLinks":3720},{"telegram":3721},"tg:\u002F\u002Fresolve?domain=strunimisli&post=11","\u002Fblog\u002F2026-03-13-help-people",{"title":3686,"description":3718},"blog\u002F2026-03-13-help-people",[3726,2994],"личное","j1sATirO1E67Dnf68VmZhA_IgY7DXmNZg0NdbGYVxho",{"id":3729,"title":3730,"acrostic":7,"body":3731,"date":3808,"description":3809,"duration":7,"emoji":7,"extension":365,"faq":7,"featured":366,"format":7,"image":7,"level":7,"media":7,"meta":3810,"navigation":368,"path":3811,"price":7,"schedule":7,"seo":3812,"seoTitle":7,"serviceType":7,"status":7,"stem":3813,"tags":3814,"tech":7,"toc":366,"url":7,"__hash__":3816},"blog\u002Fblog\u002F2026-03-10-ai-changed-rules.md","AI изменил правила: как один разработчик заменяет команду",{"type":9,"value":3732,"toc":3802},[3733,3736,3740,3746,3752,3756,3782,3786,3789,3792,3796],[12,3734,3735],{},"За 30 лет в IT я видел много технологических революций. Но ни одна из них не была такой быстрой и глубокой, как AI.",[56,3737,3739],{"id":3738},"было-стало","Было \u002F Стало",[12,3741,3742,3745],{},[287,3743,3744],{},"Раньше:"," чтобы создать SaaS-продукт, нужна команда из 5-10 человек. Frontend, backend, дизайнер, DevOps, тестировщик.",[12,3747,3748,3751],{},[287,3749,3750],{},"Сейчас:"," один разработчик с AI-инструментами делает то же самое. Claude пишет код, GPT генерирует контент, Replicate создаёт изображения, а я собираю всё это в продукт.",[56,3753,3755],{"id":3754},"мой-стек-продуктивности","Мой стек продуктивности",[31,3757,3758,3764,3770,3776],{},[34,3759,3760,3763],{},[287,3761,3762],{},"Claude Code"," — написание и рефакторинг кода",[34,3765,3766,3769],{},[287,3767,3768],{},"Yandex GPT"," — генерация контента на русском",[34,3771,3772,3775],{},[287,3773,3774],{},"GPT-4"," — сложные аналитические задачи",[34,3777,3778,3781],{},[287,3779,3780],{},"Replicate"," — генерация изображений",[56,3783,3785],{"id":3784},"что-это-меняет","Что это меняет",[12,3787,3788],{},"Порог входа в создание продуктов снизился радикально. Теперь важна не размер команды, а качество идеи и способность быстро итерировать.",[12,3790,3791],{},"Один человек с правильными инструментами может конкурировать с командами. Не потому что он лучше — потому что AI убрал bottleneck в исполнении.",[56,3793,3795],{"id":3794},"главный-навык-2026-года","Главный навык 2026 года",[12,3797,3798,3799,350],{},"Не программирование. Не дизайн. А умение правильно декомпозировать задачу и поставить её AI. Это новый вид инженерии — ",[287,3800,3801],{},"инженерия промптов и процессов",{"title":310,"searchDepth":352,"depth":352,"links":3803},[3804,3805,3806,3807],{"id":3738,"depth":352,"text":3739},{"id":3754,"depth":352,"text":3755},{"id":3784,"depth":352,"text":3785},{"id":3794,"depth":352,"text":3795},"2026-03-10","30 лет в IT научили меня одному — адаптируйся или проиграешь",{},"\u002Fblog\u002F2026-03-10-ai-changed-rules",{"title":3730,"description":3809},"blog\u002F2026-03-10-ai-changed-rules",[373,2994,3815],"продуктивность","7X2yLb6-QceOE5kpg_oozrJoijN8dDcvIY7BrTS4oZI",{"id":3818,"title":3819,"acrostic":7,"body":3820,"date":3839,"description":3840,"duration":7,"emoji":7,"extension":365,"faq":7,"featured":366,"format":7,"image":7,"level":7,"media":7,"meta":3841,"navigation":368,"path":3844,"price":7,"schedule":7,"seo":3845,"seoTitle":7,"serviceType":7,"status":7,"stem":3846,"tags":3847,"tech":7,"toc":366,"url":7,"__hash__":3848},"blog\u002Fblog\u002F2026-03-09-struny-myslej.md","Струны мыслей",{"type":9,"value":3821,"toc":3837},[3822,3825,3828,3831,3834],[12,3823,3824],{},"Решил завести этот канал для себя. Не для проекта, не для аудитории — просто место, куда можно положить мысли, которые сами просятся наружу.",[12,3826,3827],{},"Я Александр. Разработчик, предприниматель, музыкант. Странное сочетание, но мне кажется, именно оно делает меня тем, кто я есть. В голове постоянно что-то происходит — то про AI и технологии, то про то, как строить дела, то про то, как всё это не усложнять. А ещё есть музыка. Она занимает огромное место в моей душе, и здесь я буду делиться своими произведениями — не потому что они идеальные, а потому что они мои.",[12,3829,3830],{},"Это не бизнес-канал. Это дневник. Записи о том, что думаю, пока еду куда-то или сижу ночью с гитарой. Мысли об AI, который меня завораживает. Размышления о стартапах — не как учить, а как самому ошибаться и учиться. Продуктивность — но без токсичного позитива, просто честно о том, что работает и что нет.",[12,3832,3833],{},"А ещё здесь будет музыка. Не концертные записи и не продакшн уровня студии — живой звук, мысли в нотах, иногда просто настроение, которое вылилось в мелодию.",[12,3835,3836],{},"Если это кому-то откликнется — хорошо. Если нет — тоже.",{"title":310,"searchDepth":352,"depth":352,"links":3838},[],"2026-03-09","Зачем я завёл личный канал — место для мыслей, музыки и честных записей",{"externalLinks":3842},{"telegram":3843},"tg:\u002F\u002Fresolve?domain=strunimisli&post=2","\u002Fblog\u002F2026-03-09-struny-myslej",{"title":3819,"description":3840},"blog\u002F2026-03-09-struny-myslej",[3726],"8LfKUqraECTM7ZDjCDyccqANqrJYF254hFHJ80YToJk",{"id":3850,"title":3851,"acrostic":7,"body":3852,"date":3954,"description":3955,"duration":7,"emoji":7,"extension":365,"faq":7,"featured":366,"format":7,"image":7,"level":7,"media":7,"meta":3956,"navigation":368,"path":3957,"price":7,"schedule":7,"seo":3958,"seoTitle":7,"serviceType":7,"status":7,"stem":3959,"tags":3960,"tech":7,"toc":366,"url":7,"__hash__":3962},"blog\u002Fblog\u002F2026-03-08-architecture.md","Архитектура TiROBOTS: как устроена AI‑платформа",{"type":9,"value":3853,"toc":3948},[3854,3857,3861,3887,3891,3894,3908,3911,3915,3921,3924,3928],[12,3855,3856],{},"Когда я начинал TiROBOTS, стояла задача: построить платформу, которая будет легко масштабироваться и поддерживаться одним разработчиком.",[56,3858,3860],{"id":3859},"стек","Стек",[31,3862,3863,3869,3875,3881],{},[34,3864,3865,3868],{},[287,3866,3867],{},"Frontend:"," Vue 3 + Tailwind CSS",[34,3870,3871,3874],{},[287,3872,3873],{},"Backend:"," Strapi 5 (headless CMS)",[34,3876,3877,3880],{},[287,3878,3879],{},"AI:"," Yandex GPT для текстов, Replicate для изображений",[34,3882,3883,3886],{},[287,3884,3885],{},"Инфраструктура:"," PM2, Nginx, Ubuntu",[56,3888,3890],{"id":3889},"почему-strapi","Почему Strapi",[12,3892,3893],{},"Strapi даёт из коробки:",[31,3895,3896,3899,3902,3905],{},[34,3897,3898],{},"REST и GraphQL API",[34,3900,3901],{},"Админку для контент-менеджмента",[34,3903,3904],{},"Систему ролей и прав",[34,3906,3907],{},"Кастомные контроллеры",[12,3909,3910],{},"Это позволило сосредоточиться на бизнес-логике, а не на бойлерплейте.",[56,3912,3914],{"id":3913},"архитектура-ai-пайплайна","Архитектура AI-пайплайна",[301,3916,3919],{"className":3917,"code":3918,"language":306},[304],"Тема → Генерация текста (GPT) → Ревью (Главный редактор) → Генерация изображения (Replicate) → Публикация\n",[238,3920,3918],{"__ignoreMap":310},[12,3922,3923],{},"Каждый этап — отдельный сервис. Если AI сгенерировал плохой текст, главный редактор отправляет на переработку.",[56,3925,3927],{"id":3926},"уроки","Уроки",[488,3929,3930,3936,3942],{},[34,3931,3932,3935],{},[287,3933,3934],{},"Не усложняй раньше времени."," Начал с монолита, разделю когда понадобится",[34,3937,3938,3941],{},[287,3939,3940],{},"AI нужен контекст."," Чем больше контекста даёшь модели, тем лучше результат",[34,3943,3944,3947],{},[287,3945,3946],{},"Мониторинг критичен."," Когда роботы работают 24\u002F7, нужно знать что происходит",{"title":310,"searchDepth":352,"depth":352,"links":3949},[3950,3951,3952,3953],{"id":3859,"depth":352,"text":3860},{"id":3889,"depth":352,"text":3890},{"id":3913,"depth":352,"text":3914},{"id":3926,"depth":352,"text":3927},"2026-03-08","Vue 3 + Strapi 5 + Yandex GPT — как всё это работает вместе",{},"\u002Fblog\u002F2026-03-08-architecture",{"title":3851,"description":3955},"blog\u002F2026-03-08-architecture",[3961,375,3657,3656],"tirobots","I9NByyPwHKcDOaujP1aG__wCvuDpnp1_j90iJN4BB6o",{"id":3964,"title":3965,"acrostic":7,"body":3966,"date":4042,"description":4043,"duration":7,"emoji":7,"extension":365,"faq":7,"featured":366,"format":7,"image":7,"level":7,"media":7,"meta":4044,"navigation":368,"path":4045,"price":7,"schedule":7,"seo":4046,"seoTitle":7,"serviceType":7,"status":7,"stem":4047,"tags":4048,"tech":7,"toc":366,"url":7,"__hash__":4050},"blog\u002Fblog\u002F2026-03-07-how-it-started.md","Как я решил автоматизировать контент‑маркетинг",{"type":9,"value":3967,"toc":4035},[3968,3971,3975,3978,3982,3985,3989,3992,4006,4009,4013,4016,4030,4032],[12,3969,3970],{},"Всё началось с простого наблюдения: ведение контент-каналов отнимает безумное количество времени. Придумать тему, написать текст, сделать картинку, опубликовать в нужное время — и так каждый день.",[56,3972,3974],{"id":3973},"проблема","Проблема",[12,3976,3977],{},"Я вёл несколько Telegram-каналов и тратил на это 10-15 часов в неделю. При этом качество контента было нестабильным — когда устаёшь, посты получаются хуже.",[56,3979,3981],{"id":3980},"идея","Идея",[12,3983,3984],{},"А что если AI может не просто помогать с текстом, а полностью вести канал? С определённым tone of voice, стратегией, расписанием?",[56,3986,3988],{"id":3987},"первые-эксперименты","Первые эксперименты",[12,3990,3991],{},"Начал с простого — скрипт, который:",[488,3993,3994,3997,4000,4003],{},[34,3995,3996],{},"Берёт тему из списка",[34,3998,3999],{},"Генерирует текст через Yandex GPT",[34,4001,4002],{},"Создаёт изображение через Replicate",[34,4004,4005],{},"Публикует в Telegram по расписанию",[12,4007,4008],{},"Результат превзошёл ожидания. Посты были не хуже написанных вручную, а иногда даже лучше — AI не устаёт и не теряет фокус.",[56,4010,4012],{"id":4011},"от-скрипта-к-платформе","От скрипта к платформе",[12,4014,4015],{},"Один скрипт превратился в платформу TiROBOTS. Добавил:",[31,4017,4018,4021,4024,4027],{},[34,4019,4020],{},"Веб-интерфейс для управления",[34,4022,4023],{},"Роль «Главного редактора» — задаёт стратегию",[34,4025,4026],{},"Несколько AI-роботов с разными специализациями",[34,4028,4029],{},"Аналитику эффективности",[56,4031,960],{"id":959},[12,4033,4034],{},"Сейчас TiROBOTS — это полноценная платформа для автоматизации контент-маркетинга. Но я вижу её будущее шире — как хаб AI-роботов для разных задач бизнеса.",{"title":310,"searchDepth":352,"depth":352,"links":4036},[4037,4038,4039,4040,4041],{"id":3973,"depth":352,"text":3974},{"id":3980,"depth":352,"text":3981},{"id":3987,"depth":352,"text":3988},{"id":4011,"depth":352,"text":4012},{"id":959,"depth":352,"text":960},"2026-03-07","От идеи до продакшена — один разработчик и один AI",{},"\u002Fblog\u002F2026-03-07-how-it-started",{"title":3965,"description":4043},"blog\u002F2026-03-07-how-it-started",[373,3961,4049],"история","qMmW7-j3p9MkqKRv_DaoI98E0BUne2t3e_RgyJ3sbFU",{"id":4052,"title":4053,"acrostic":7,"body":4054,"date":4061,"description":4062,"duration":7,"emoji":7,"extension":365,"faq":7,"featured":366,"format":7,"image":7,"level":7,"media":4063,"meta":4066,"navigation":368,"path":4067,"price":7,"schedule":7,"seo":4068,"seoTitle":7,"serviceType":7,"status":7,"stem":4069,"tags":4070,"tech":7,"toc":366,"url":7,"__hash__":4071},"blog\u002Fblog\u002F2025-06-01-potihonechku-daleko-cover.md","Потихонечку — далеко (Cover)",{"type":9,"value":4055,"toc":4059},[4056],[12,4057,4058],{},"Акустический кавер.",{"title":310,"searchDepth":352,"depth":352,"links":4060},[],"2025-06-01","Кавер на акустической гитаре.",[4064],{"type":3675,"url":4065,"title":4053},"\u002Fmusic\u002Fpotikhonechku-daleko-cover.mp3",{},"\u002Fblog\u002F2025-06-01-potihonechku-daleko-cover",{"title":4053,"description":4062},"blog\u002F2025-06-01-potihonechku-daleko-cover",[3682],"PaLnyOBXJVyRw6jbiuQbGjBB89QMGwFGXCYQ9qDbFco",{"id":4073,"title":4074,"acrostic":7,"body":4075,"date":4082,"description":4083,"duration":7,"emoji":7,"extension":365,"faq":7,"featured":366,"format":7,"image":7,"level":7,"media":4084,"meta":4087,"navigation":368,"path":4088,"price":7,"schedule":7,"seo":4089,"seoTitle":7,"serviceType":7,"status":7,"stem":4090,"tags":4091,"tech":7,"toc":366,"url":7,"__hash__":4092},"blog\u002Fblog\u002F2025-01-24-improvizaciya.md","Импровизация (24 января)",{"type":9,"value":4076,"toc":4080},[4077],[12,4078,4079],{},"Fingerstyle-импровизация на акустической гитаре.",{"title":310,"searchDepth":352,"depth":352,"links":4081},[],"2025-01-24","Акустическая гитара, fingerstyle импровизация.",[4085],{"type":3675,"url":4086,"title":4074},"\u002Fmusic\u002F24-jan-1115.mp3",{},"\u002Fblog\u002F2025-01-24-improvizaciya",{"title":4074,"description":4083},"blog\u002F2025-01-24-improvizaciya",[3682],"bjdlpCC2vLziYprV48lRGPUnbx7MvLr1ZZh8Q72u-cg",{"id":4094,"title":4095,"acrostic":7,"body":4096,"date":4118,"description":4119,"duration":7,"emoji":7,"extension":365,"faq":7,"featured":366,"format":7,"image":7,"level":7,"media":7,"meta":4120,"navigation":368,"path":4121,"price":7,"schedule":7,"seo":4122,"seoTitle":7,"serviceType":7,"status":7,"stem":4123,"tags":4124,"tech":7,"toc":366,"url":7,"__hash__":4125},"blog\u002Fblog\u002F2020-01-01-deneg-kotorykh-net.md","Деньги, которых нет",{"type":9,"value":4097,"toc":4116},[4098,4101,4104,4107,4110,4113],[12,4099,4100],{},"У меня была беседа с человеком, который успешно играл на бирже и однажды решил вывести все деньги в кэш.",[12,4102,4103],{},"Уж так он успешно до этого играл, что денег оказалось очень много. Вот прям реально несколько чемоданов.",[12,4105,4106],{},"Это, как он рассказывал, тоже было недёшево – комиссия за обналичивание такой суммы была запредельной, но он всё же пошел на эту трату, так как был твёрд в своем решении. В этот момент, говорит, когда ему озвучили размер комиссионных, он в первый раз почувствовал укол какой-то плохо еще осознаваемой мысли.",[12,4108,4109],{},"Ну вот, говорит, посидел на чемоданах пару дней, он пошел и купил за наличные панамеру. Мог, в принципе, какую угодно тачку купить, но эта вот попала под руку, как говорится. Эта покупка была похожа на небольшой перерасчет портфеля акций в связи с коррекцией рынка. Пока он не видел этих денег вживую, он по-другому ощущал их ценность, поэтому для него было открытием, что оказывается вымутить понамеру, а для держателя капитала это можно объяснить коррекцией.",[12,4111,4112],{},"Потом он сделал еще несколько покупок, но быстро понял, что это тупо. Тупо держать такую большую сумму в чемоданах, да еще и собранных в одном месте. Тупо, что это место – квартира. Тупо вообще вся эта затея.",[12,4114,4115],{},"Деньги были переведены обратно в безнал.",{"title":310,"searchDepth":352,"depth":352,"links":4117},[],"2020-01-01","Человек, который обналичил всё",{},"\u002Fblog\u002F2020-01-01-deneg-kotorykh-net",{"title":4095,"description":4119},"blog\u002F2020-01-01-deneg-kotorykh-net",[4049,2994],"-L0m9kWzyTo3Yzr5IU88DYVwJcPWWrJdWyvz1a7yjqo",{"id":4127,"title":4128,"acrostic":7,"body":4129,"date":4118,"description":4145,"duration":7,"emoji":7,"extension":365,"faq":7,"featured":366,"format":7,"image":7,"level":7,"media":7,"meta":4146,"navigation":368,"path":4147,"price":7,"schedule":7,"seo":4148,"seoTitle":7,"serviceType":7,"status":7,"stem":4149,"tags":4150,"tech":7,"toc":366,"url":7,"__hash__":4151},"blog\u002Fblog\u002F2020-01-01-dragotsennyj-kamen.md","Драгоценный камень в куче угля",{"type":9,"value":4130,"toc":4143},[4131,4134,4137,4140],[12,4132,4133],{},"Однажды я нашёл в куче угля маленький рубин. Дело было так. Еще с детства у меня в голове отложилась информация, что в угле можно найти много чего интересного. Например, ракушку древнего моллюска. Потом я узнал как появляются драгоценные камни и где их чаще всего находят. В принципе, для получения каменного угля и для получения драгоценных камней необходимы сходные процессы – высокое давление и температура. Поэтому, есть не нулевая вероятность найти в куче угля драгоценный камень.",[12,4135,4136],{},"Дело происходило, когда я служил в армии. Привезли уголь и сгрузили его на территории склада, к которому мы были прикомандированы. И вот сидели мы как-то с пацанами рядом с этой кучей, я им рассказываю про эту вот не нулевую вероятность и у них на глазах начинаю искать. Поискав какое-то время, бросаю это занятие, ребята посмеиваются. Потом, на следующий день я опять присаживался рядом с кучей и сидел, внимательно просматривая каждый квадратный сантиметр. Прошло несколько дней. И вот однажды я нашёл! Маленький камушек рубинового цвета. Кто-то из парней предложил попробовать поцарапать стекло этим камушком. Мол, если расцарапает, то да действительно рубин. У меня было зеркальце и мы попробовали им поцарапать поверхность. Камешек уверенно прорезал борозду на стекле!",[12,4138,4139],{},"К чему я это рассказываю?",[12,4141,4142],{},"Я много раз был свидетелем того, как происходили события, вероятность которых была крайне мала.",{"title":310,"searchDepth":352,"depth":352,"links":4144},[],"Не нулевая вероятность",{},"\u002Fblog\u002F2020-01-01-dragotsennyj-kamen",{"title":4128,"description":4145},"blog\u002F2020-01-01-dragotsennyj-kamen",[4049,2994],"ReSvh8Q8ni8J7tDte_S_5SolExGDBVCMxmtEAIRGbv0",{"id":4153,"title":4154,"acrostic":7,"body":4155,"date":4118,"description":4162,"duration":7,"emoji":7,"extension":365,"faq":7,"featured":366,"format":7,"image":7,"level":7,"media":7,"meta":4163,"navigation":368,"path":4164,"price":7,"schedule":7,"seo":4165,"seoTitle":7,"serviceType":7,"status":7,"stem":4166,"tags":4167,"tech":7,"toc":366,"url":7,"__hash__":4169},"blog\u002Fblog\u002F2020-01-01-lyudi-pozhivshie.md","Люди, пожившие на этом свете",{"type":9,"value":4156,"toc":4160},[4157],[12,4158,4159],{},"Люди, пожившие на этом свете, наполнятся воспоминаниями и размышлениями о событиях, которые травмируют их психику. Дети помогают не сойти с ума. Это банальная мысль – рождаемость должна быть, как минимум на том же уровне, как и смертность, а лучше выше, чтобы цивилизация развивалась. Но функция детей не только продолжение рода, но и помощь взрослым. Без них взрослые бы «загнались».",{"title":310,"searchDepth":352,"depth":352,"links":4161},[],"Дети помогают не сойти с ума",{},"\u002Fblog\u002F2020-01-01-lyudi-pozhivshie",{"title":4154,"description":4162},"blog\u002F2020-01-01-lyudi-pozhivshie",[4168,2994],"размышление","zUyXsqORRwh6hQ778jHyNVtVIac8gRo8Wszdg8guXOs",{"id":4171,"title":4172,"acrostic":7,"body":4173,"date":4118,"description":4189,"duration":7,"emoji":7,"extension":365,"faq":7,"featured":366,"format":7,"image":7,"level":7,"media":7,"meta":4190,"navigation":368,"path":4191,"price":7,"schedule":7,"seo":4192,"seoTitle":7,"serviceType":7,"status":7,"stem":4193,"tags":4194,"tech":7,"toc":366,"url":7,"__hash__":4195},"blog\u002Fblog\u002F2020-01-01-pustye-otnosheniya.md","Пустые, ненужные отношения",{"type":9,"value":4174,"toc":4187},[4175,4178,4181,4184],[12,4176,4177],{},"Как так получилось, что то, что имело большую ценность, стало пустым и ненужным? Я пытаюсь разгадать, что это? К чему этот урок? И закончен ли он?",[12,4179,4180],{},"Может то, что мне сейчас кажется пустым, попозже будет видеться обратным?",[12,4182,4183],{},"Чтобы продвигаться, нам необходимо принимать решения. Каждое принятое решение – это смена, корректировка курса. И получается, что мой корабль попал в магнитную аномалию. Компас показывает удивительное…",[12,4185,4186],{},"Когда барахлит компас, отложите в сторону карты. Просто внимательно смотрите вперед, чтобы вовремя обруливать препятствия и ждите ночей, чтобы ориентироваться по звёздам.",{"title":310,"searchDepth":352,"depth":352,"links":4188},[],"Когда барахлит компас, смотрите на звёзды",{},"\u002Fblog\u002F2020-01-01-pustye-otnosheniya",{"title":4172,"description":4189},"blog\u002F2020-01-01-pustye-otnosheniya",[4168],"tQYgVIj0RrbHM-2pue2OefsdjMD46CkFc3HL5StVQZ0",{"id":4197,"title":4198,"acrostic":7,"body":4199,"date":4118,"description":4241,"duration":7,"emoji":7,"extension":365,"faq":7,"featured":366,"format":7,"image":7,"level":7,"media":7,"meta":4242,"navigation":368,"path":4243,"price":7,"schedule":7,"seo":4244,"seoTitle":7,"serviceType":7,"status":7,"stem":4245,"tags":4246,"tech":7,"toc":366,"url":7,"__hash__":4247},"blog\u002Fblog\u002F2020-01-01-sobralsya-ya-umirat.md","Собрался я умирать, ребята…",{"type":9,"value":4200,"toc":4239},[4201,4203,4206,4209,4212,4215,4218,4221,4224,4227,4230,4233,4236],[12,4202,4198],{},[12,4204,4205],{},"Не переживайте, речь не о суициде. Просто что-то сегодня замкнуло в моей голове и как-то стало очень понятно, что времени-то всё меньше! А я туплю.",[12,4207,4208],{},"Задал себе такой вот вопрос – вот если умру прям сейчас, что останется недоделанным? К осуществлению каких целей, желаний я даже не приступал, откладывая их «до лучших времен»?",[12,4210,4211],{},"Ну набралось у меня парочка, да и то, в принципе, не такие уж и критично важные… Я уже так давно живу с пониманием механизма материализации мысли, что все мои мечты уже сбылись. Только и успеваю придумывать что-нибудь новое, потом реализовывать.",[12,4213,4214],{},"В конечном итоге, каждый получает то, что он хочет. Та ситуация, в которой вы сейчас находитесь, образовалась в результате ваших стремлений и связанных с ними решений.",[12,4216,4217],{},"Если вы предприниматель со стажем, то вы меня поймете. Когда над тобой нет начальника, то вы сами определяете, чем вам и когда заниматься. Это классная штука – свобода, но есть обратная сторона у этой медали. Впрочем, это не медаль. Свободу не вручают и не выдают в кассе. Свободу берут. И вот я беру уже эту свободу с 2003 года, как открыл свое первое юрлицо. Сначала о чем-то просто мечтаю, если мечта манит, то меняю статус «мечта» на «цель», потом делаю шаг на пути к ней, другой, третий и всегда (!) обнаруживаю, что мне помогают. Разное в помощь. Люди, конечно же, в первую очередь. Но частенько случаются случайности, типа того, как подходишь к пешеходному переходу и в этот момент, как раз загорается зеленый свет. Ну ладно, речь не о вселенской помощи.",[12,4219,4220],{},"Я понял, что не так уж много, как оказалось, у меня таких мечт, которые я откладывал в долгий ящик… А мечты, которые я не успел воплотить – это и не мечты вовсе, а просто видение будущего. Вот будут еще дирижабли летать повсеместно, увидите сами!",[12,4222,4223],{},"Да и хрен с ними, мне тут подумалось, с этими неисполненными мечтами. Отпустил их и понял… что готов умереть. Ничего такого страшного не произойдет. Я везде, где надо, продублировал доступы надежным людям к всяким там сайтам и панелям управления, ну а то, что загнется без меня, значит не так и нужно было…",[12,4225,4226],{},"Эта вот «готовность» меня ошеломила.",[12,4228,4229],{},"А вот дальше пришло осознание, что это есть главное отличие нас, мужчин, от женщин. Женщина должна жить ради жизни, а от мужчины требуется готовность умереть ради неё.",[12,4231,4232],{},"Только не надо путать готовность и желание)",[12,4234,4235],{},"Новый уровень свободы.",[12,4237,4238],{},"А в ситуации, когда внутри нас борются два противоречивых желания, побеждает тот волк, которого мы лучше кормим",{"title":310,"searchDepth":352,"depth":352,"links":4240},[],"Не переживайте, речь не о суициде",{},"\u002Fblog\u002F2020-01-01-sobralsya-ya-umirat",{"title":4198,"description":4241},"blog\u002F2020-01-01-sobralsya-ya-umirat",[4168],"gBdlbvxE_crJNRBWgREvua6YSVu4hnSEXac6cQ4OSF4",{"id":4249,"title":4250,"acrostic":7,"body":4251,"date":4118,"description":4276,"duration":7,"emoji":7,"extension":365,"faq":7,"featured":366,"format":7,"image":7,"level":7,"media":7,"meta":4277,"navigation":368,"path":4278,"price":7,"schedule":7,"seo":4279,"seoTitle":7,"serviceType":7,"status":7,"stem":4280,"tags":4281,"tech":7,"toc":366,"url":7,"__hash__":4282},"blog\u002Fblog\u002F2020-01-01-topchemy-na-meste.md","Топчемся на месте или двигаемся?",{"type":9,"value":4252,"toc":4274},[4253,4256,4259,4262,4265,4268,4271],[12,4254,4255],{},"Мы представляем из себя то, о чём думаем целыми днями. В каждом мгновении, которое мы проживаем, мы имеем возможность поменять направление нашего движения. Конечно, есть такое понятие, как инерция и поэтому после поворота руля, корабль еще всё равно двигается в прежнем направлении. Кроме того, иногда нужно сменить курс, чтобы обогнуть какое-то препятствие и в этот момент, со стороны кажется, что мы двигаемся совсем не в том направлении, в котором надо бы. Мы не плывем по течению, не плывем против течения, мы плывём к цели! Лавируя между кусками дерьма, плывущиму навстречу, мы можем даже в какой-то момент оказаться на месте, где уже были раньше и тогда кто-то имеет право сказать, что мы топчемся на месте. Но! Мы живы, мы вместе, а значит всё хорошо. Главное не забывать о цели. Вот о ней я и хочу порассуждать.",[12,4257,4258],{},"За последнее время я все чаще дискутирую с разными людьми о цели бизнеса. В уставе каждой компании сказано, что цель бизнеса – прибыль. Поэтому, бизнесмены сначала очень удивляются и смотрят на меня, как на дурака, когда я им заявляю, что никогда не ставил прибыль во главу угла. Я хочу большего, чем просто прибыль. Стремление к гармонии – вот главный мой императив. А что такое гармония? Универсального ответа, справедливого для всех, наверное нет. Да я и не хочу говорить за всех. Скажу за себя – гармония это когда совесть не болит. А у меня она не болит. Я знаю, что есть за мной грешки, типа не заплаченных вовремя пенсионных взносов или налогов, но всё равно не болит! И не потому, что знаю, как распределяются эти налоги, а потому знаю, что я, как единица, приношу ПОЛЬЗУ окружающим меня людям. Польза эта выражается по разному. Это может быть быстрая реакция на сломавшийся сервер, может просто подбадривающие слова, а может и обратное – вот к примеру, вчера я сознательно отключил сервер одной фирме, которая уже пять месяцев не платит за хостинг. У нас там такие отношения с владельцами компании, что я могу быть спокоен – эти неоплаченные месяцы в конце концов будут всё же оплачены. Я и не отключал, просто напоминал об этом периодически управляющим. У меня есть понимание, что тот факт, что я всё же отключил сервер, создало проблемы для управляющих и, может быть, их даже могут уволить. Но уволят их за халатность, а это значит эта компания получит шанс стать лучше (если, конечно, на их место придут менее халатные люди). А те, кого уволят, получат шанс задуматься над своими ошибками и больше их не совершать.",[12,4260,4261],{},"Кто-то согласен работать с мудаками, лишь бы они деньги платили. Они любят говорить фразу: «Ничего личного – это бизнес». А я не такой! Как только я вычисляю мудака, я стремлюсь порвать с ним отношения. И не жалко мне незаработанных миллионов!",[12,4263,4264],{},"Такая стратегия возможна, только когда есть на кого опереться. Я и опираюсь. Опираюсь на родителей. Опираюсь на жену, когда по несколько месяцев нет доходов и мы оплачиваем продукты и секции там всякие, на которые ходит ребенок, её зарплатой. Опираюсь на друзей, когда прихожу к ним, чтобы погреться немного.",[12,4266,4267],{},"Опираюсь и знаю, что моя стратегия, как бумеранг, приносит мне счастье. Не контактировать с мудаками – это ли не счастье? Не счастье ли иметь теплые дружественные отношения с клиентами? А не счастье ли, когда твой сотрудник, говорит самокритично о своей работе? Я уже долго следую своей стратегии и это дает плоды – мудаков в моем близком окружении нет. Я счастлив)",[12,4269,4270],{},"Мы не топчемся на месте. Мы развиваемся и этот процесс не всегда напоминает рост дерева. Потому что мы не деревья. Мы делаем ошибки, учимся на них. Или не учимся и тогда, ситуации повторяются, пока мы не научимся.",[12,4272,4273],{},"У меня спрашивают, трудно ли быть предпринимателем. Надо просто любить людей, отвечаю я им. И вот этому-то и приходится всё время учиться. Как только научишься немного, обретешь внутренний стержень. Учась дальше, обретаешь надежную команду. Продвигаясь дальше в своем обучении, обретаешь хороших клиентов. А там и благоденствие недалеко!",{"title":310,"searchDepth":352,"depth":352,"links":4275},[],"Стремление к гармонии — главный императив",{},"\u002Fblog\u002F2020-01-01-topchemy-na-meste",{"title":4250,"description":4276},"blog\u002F2020-01-01-topchemy-na-meste",[4168],"eMNLdEQLUgyNA5v4U5102TDtXN-LhPi7dYJA8UdRZog",[4284,4296],{"slug":4285,"title":4286,"date":4287,"tags":4288,"description":4291,"media":4292,"externalLinks":4293,"source":4294,"publishedAt":4295},"2026-06-03-odin-na-odin-s-beskonechnostyu","Один на один с бесконечностью","2026-06-03",[2994,3308,4289,4290],"космос","чудо","Один во Вселенной — это тюрьма или школа любви? Размышление о том, почему мы не видим других цивилизаций, и что это говорит о нас самих.",[],{},"openclaw-voice-transcription","2026-06-03T09:18:41.161Z",{"slug":4297,"title":4298,"date":4299,"tags":4300,"description":4301,"media":4302,"externalLinks":4303,"source":4304,"publishedAt":4305},"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":5,"title":6,"acrostic":7,"body":4307,"date":363,"description":364,"duration":7,"emoji":7,"extension":365,"faq":7,"featured":366,"format":7,"image":7,"level":7,"media":7,"meta":4535,"navigation":368,"path":369,"price":7,"schedule":7,"seo":4536,"seoTitle":7,"serviceType":7,"status":7,"stem":371,"tags":4537,"tech":7,"toc":368,"url":7,"__hash__":378},{"type":9,"value":4308,"toc":4524},[4309,4311,4313,4315,4317,4319,4321,4335,4337,4339,4341,4343,4345,4347,4349,4351,4353,4355,4357,4377,4379,4381,4383,4385,4387,4389,4391,4393,4395,4397,4401,4403,4405,4407,4409,4411,4413,4415,4417,4419,4421,4423,4425,4439,4441,4443,4445,4447,4449,4451,4453,4457,4459,4461,4463,4465,4467,4479,4481,4483,4485,4489,4491,4493,4495,4500,4502,4504,4506,4508,4510,4512,4514,4516,4518,4520],[12,4310,14],{},[12,4312,17],{},[12,4314,20],{},[12,4316,23],{},[12,4318,26],{},[12,4320,29],{},[31,4322,4323,4325,4327,4329,4331,4333],{},[34,4324,36],{},[34,4326,39],{},[34,4328,42],{},[34,4330,45],{},[34,4332,48],{},[34,4334,51],{},[12,4336,54],{},[56,4338,59],{"id":58},[12,4340,62],{},[12,4342,65],{},[12,4344,68],{},[12,4346,71],{},[12,4348,74],{},[12,4350,77],{},[56,4352,81],{"id":80},[12,4354,84],{},[12,4356,87],{},[31,4358,4359,4361,4363,4365,4367,4369,4371,4373,4375],{},[34,4360,92],{},[34,4362,95],{},[34,4364,98],{},[34,4366,101],{},[34,4368,104],{},[34,4370,107],{},[34,4372,110],{},[34,4374,113],{},[34,4376,116],{},[12,4378,119],{},[12,4380,122],{},[12,4382,125],{},[12,4384,128],{},[56,4386,132],{"id":131},[12,4388,135],{},[12,4390,138],{},[12,4392,141],{},[12,4394,144],{},[12,4396,147],{},[149,4398,4399],{},[12,4400,153],{},[12,4402,156],{},[12,4404,159],{},[56,4406,163],{"id":162},[12,4408,166],{},[12,4410,169],{},[12,4412,172],{},[12,4414,175],{},[12,4416,178],{},[56,4418,182],{"id":181},[12,4420,185],{},[12,4422,188],{},[12,4424,191],{},[31,4426,4427,4429,4431,4433,4435,4437],{},[34,4428,196],{},[34,4430,199],{},[34,4432,202],{},[34,4434,205],{},[34,4436,208],{},[34,4438,211],{},[12,4440,214],{},[56,4442,218],{"id":217},[12,4444,221],{},[12,4446,224],{},[12,4448,227],{},[12,4450,230],{},[12,4452,233],{},[12,4454,236,4455,241],{},[238,4456,240],{},[12,4458,244],{},[56,4460,248],{"id":247},[12,4462,251],{},[12,4464,254],{},[12,4466,257],{},[31,4468,4469,4471,4473,4475,4477],{},[34,4470,262],{},[34,4472,265],{},[34,4474,268],{},[34,4476,271],{},[34,4478,274],{},[12,4480,277],{},[12,4482,280],{},[12,4484,283],{},[12,4486,4487],{},[287,4488,289],{},[12,4490,292],{},[56,4492,296],{"id":295},[12,4494,299],{},[301,4496,4498],{"className":4497,"code":305,"language":306,"meta":307},[304],[238,4499,305],{"__ignoreMap":310},[12,4501,313],{},[12,4503,316],{},[56,4505,320],{"id":319},[12,4507,323],{},[12,4509,326],{},[12,4511,329],{},[12,4513,332],{},[12,4515,335],{},[12,4517,338],{},[340,4519],{},[12,4521,344,4522,350],{},[346,4523,349],{"href":348},{"title":310,"searchDepth":352,"depth":352,"links":4525},[4526,4527,4528,4529,4530,4531,4532,4533,4534],{"id":58,"depth":352,"text":59},{"id":80,"depth":352,"text":81},{"id":131,"depth":352,"text":132},{"id":162,"depth":352,"text":163},{"id":181,"depth":352,"text":182},{"id":217,"depth":352,"text":218},{"id":247,"depth":352,"text":248},{"id":295,"depth":352,"text":296},{"id":319,"depth":352,"text":320},{},{"title":6,"description":364},[373,374,375,376,377],1787519234477]