[{"data":1,"prerenderedAt":5640},["ShallowReactive",2],{"blog-posts":3,"blog-runtime-posts":5073,"blog-2026-08-25-profili-hermes-otdelnyy-kontekst-obshchie-navyki":5096},[4,831,1181,1451,1801,2879,3786,3874,3999,4100,4451,4474,4518,4607,4639,4753,4841,4862,4883,4916,4942,4960,4986,5038],{"id":5,"title":6,"acrostic":7,"body":8,"date":814,"description":815,"duration":7,"emoji":7,"extension":816,"faq":7,"featured":817,"format":7,"image":7,"level":7,"media":7,"meta":818,"navigation":819,"path":820,"price":7,"schedule":7,"seo":821,"seoTitle":822,"serviceType":7,"status":7,"stem":823,"tags":824,"tech":7,"toc":819,"url":7,"__hash__":830},"blog\u002Fblog\u002F2026-08-25-profili-hermes-otdelnyy-kontekst-obshchie-navyki.md","Профили Hermes: отдельный контекст, общие навыки",null,{"type":9,"value":10,"toc":793},"minimark",[11,15,18,21,24,30,38,43,46,90,100,103,106,116,119,125,128,132,135,142,145,148,151,156,165,186,189,192,195,199,207,210,213,216,222,225,231,235,238,264,267,270,273,279,282,285,294,297,356,359,363,366,370,377,380,400,403,406,411,415,418,438,441,445,448,451,457,460,463,467,470,473,476,499,502,505,511,514,518,521,524,544,547,550,553,556,562,565,569,575,578,584,587,590,607,610,614,617,620,623,626,649,652,675,682,685,690,694,697,703,706,729,732,735,741,744,748,751,757,760,763,777,780,783,786],[12,13,14],"p",{},"Когда я начал использовать Hermes сразу в нескольких проектах, всё работало через один общий профиль. Один Telegram-бот, одна история, один набор настроек и одна память.",[12,16,17],{},"Поначалу это было удобно. Агент знал мои предпочтения, понимал рабочие привычки и мог переходить между задачами без дополнительной настройки. Но постепенно общий контекст превратился из преимущества в источник ошибок.",[12,19,20],{},"У проектов были разные репозитории, способы деплоя и ограничения. Где-то можно было свободно менять тестовые данные, а где-то требовалась осторожность. Где-то агенту были нужны инструменты для работы с инфраструктурой, а где-то — только анализ кода.",[12,22,23],{},"Чем больше таких правил появлялось, тем труднее было ответить на простой вопрос:",[25,26,27],"blockquote",{},[12,28,29],{},"Какой проект агент сейчас считает своим?",[12,31,32,33,37],{},"Я решил разделить Hermes на отдельные проектные профили. Но довольно быстро выяснилось, что создать несколько Telegram-ботов недостаточно. Нужно было решить более сложную задачу: ",[34,35,36],"strong",{},"разделить контекст проектов, не размножив при этом память и рабочие процедуры",".",[39,40,42],"h2",{"id":41},"профиль-это-не-просто-отдельный-чат","Профиль — это не просто отдельный чат",[12,44,45],{},"В Hermes профиль — это самостоятельное домашнее пространство агента. У него могут быть свои:",[47,48,49,53,56,59,66,75,78,81,84,87],"ul",{},[50,51,52],"li",{},"конфигурация;",[50,54,55],{},"модель и провайдер;",[50,57,58],{},"API-ключи и токены;",[50,60,61,65],{},[62,63,64],"code",{},"SOUL.md",";",[50,67,68,71,72,65],{},[62,69,70],{},"MEMORY.md"," и ",[62,73,74],{},"USER.md",[50,76,77],{},"история сессий;",[50,79,80],{},"skills;",[50,82,83],{},"MCP-серверы;",[50,85,86],{},"cron-задачи;",[50,88,89],{},"gateway-процесс.",[12,91,92,93,37],{},"Это хорошо описано в ",[94,95,99],"a",{"href":96,"rel":97},"https:\u002F\u002Fhermes-agent.nousresearch.com\u002Fdocs\u002Fuser-guide\u002Fprofiles",[98],"nofollow","документации Hermes о профилях",[12,101,102],{},"Для каждого проекта я создал отдельный профиль, отдельный Telegram-бот и отдельный gateway. Также задал рабочий каталог, из которого агент начинает выполнять команды.",[12,104,105],{},"Получилась понятная схема:",[107,108,114],"pre",{"className":109,"code":111,"language":112,"meta":113},[110],"language-text","Telegram-бот\n    ↓\nотдельный gateway\n    ↓\nпрофиль Hermes\n    ↓\nрабочий каталог проекта\n","text","",[62,115,111],{"__ignoreMap":113},[12,117,118],{},"Но здесь есть важное ограничение: профиль изолирует состояние самого Hermes, а не всю операционную систему.",[12,120,121,122,124],{},"Рабочий каталог задаёт начальную директорию, но не превращает профиль в файловую песочницу. Если terminal backend работает локально, агент по-прежнему имеет права текущего пользователя. Поэтому ограничения в ",[62,123,64],{}," помогают управлять поведением, но не заменяют Docker, отдельного системного пользователя или другую техническую изоляцию.",[12,126,127],{},"Тем не менее для моей задачи профиль решил главное: перестал смешиваться проектный контекст.",[39,129,131],{"id":130},"память-оказалась-не-одним-механизмом","Память оказалась не одним механизмом",[12,133,134],{},"Следующая проблема появилась почти сразу.",[12,136,137,138,141],{},"Я спросил нового проектного агента, работает ли у него MemPalace. Он проверил поле ",[62,139,140],{},"memory.provider",", увидел, что оно пустое, и сообщил, что MemPalace не подключён.",[12,143,144],{},"Формально проверка выглядела логично. Но она была основана на неверном предположении: что любая внешняя память Hermes обязательно должна быть настроена как memory provider.",[12,146,147],{},"На самом деле в моей архитектуре MemPalace подключается через MCP.",[12,149,150],{},"Это два разных механизма.",[152,153,155],"h3",{"id":154},"memory-provider-hermes","Memory provider Hermes",[12,157,158,159,164],{},"Hermes поддерживает внешние memory provider plugins. Согласно ",[94,160,163],{"href":161,"rel":162},"https:\u002F\u002Fhermes-agent.nousresearch.com\u002Fdocs\u002Fuser-guide\u002Ffeatures\u002Fmemory-providers",[98],"официальной документации",", активный provider может автоматически:",[166,167,168,171,174,177,180,183],"ol",{},[50,169,170],{},"добавлять найденный контекст в системный prompt;",[50,172,173],{},"искать релевантные воспоминания перед очередным ходом;",[50,175,176],{},"синхронизировать диалог после ответа;",[50,178,179],{},"извлекать новые факты при завершении сессии;",[50,181,182],{},"зеркалировать записи встроенной памяти;",[50,184,185],{},"предоставлять собственные инструменты для поиска и записи.",[12,187,188],{},"Это удобная архитектура: агент получает память автоматически, без отдельного решения о том, когда её искать.",[12,190,191],{},"Но у автоматизма есть цена. Подобранный provider-контекст попадает во входной контекст модели. Даже если он не нужен для конкретного вопроса, он занимает часть контекстного окна на соответствующих вызовах.",[12,193,194],{},"Кэширование prompt может влиять на стоимость обработки повторяющегося префикса, но не отменяет сам объём контекста и его влияние на внимание модели.",[152,196,198],{"id":197},"mempalace-через-mcp","MemPalace через MCP",[12,200,201,202,37],{},"MemPalace появился в моём рабочем процессе раньше, чем отдельные проектные профили. Исторически я подключил его как внешний сервер инструментов через ",[94,203,206],{"href":204,"rel":205},"https:\u002F\u002Fhermes-agent.nousresearch.com\u002Fdocs\u002Fuser-guide\u002Ffeatures\u002Fmcp",[98],"Model Context Protocol",[12,208,209],{},"Когда в Hermes появились полноценные memory providers, я не стал автоматически переносить туда уже работающую память. Сначала это было следствием истории системы, а затем стало осознанным архитектурным решением.",[12,211,212],{},"Hermes знает, что инструменты MemPalace существуют, но содержимое дворца памяти не добавляется автоматически в каждый запрос. Агент обращается к нему только тогда, когда задача требует исторического контекста.",[12,214,215],{},"Например:",[107,217,220],{"className":218,"code":219,"language":112,"meta":113},[110],"Пользователь спрашивает о прошлом решении\n    ↓\nагент вызывает поиск в MemPalace\n    ↓\nполучает несколько релевантных записей\n    ↓\nпроверяет их по текущему коду или документации\n    ↓\nформирует ответ\n",[62,221,219],{"__ignoreMap":113},[12,223,224],{},"Если пользователь просит поправить текст, проверить синтаксис или выполнить другую локальную задачу, проектная история может вообще не загружаться.",[12,226,227,228,37],{},"Именно это стало основной причиной, по которой я ",[34,229,230],{},"умышленно не стал использовать memory provider Hermes для MemPalace",[39,232,234],{"id":233},"почему-память-вызывается-по-требованию","Почему память вызывается по требованию",[12,236,237],{},"Проектная память со временем становится большой. В ней накапливаются:",[47,239,240,243,246,249,252,255,258,261],{},[50,241,242],{},"архитектурные решения;",[50,244,245],{},"причины прошлых ошибок;",[50,247,248],{},"сведения об инфраструктуре;",[50,250,251],{},"результаты расследований;",[50,253,254],{},"принятые ограничения;",[50,256,257],{},"дневники завершённых сессий;",[50,259,260],{},"связи между компонентами;",[50,262,263],{},"устаревшие факты, которые всё ещё важны как история.",[12,265,266],{},"Всё это полезно, но не всё нужно в каждом запросе.",[12,268,269],{},"Автоматическая подстановка памяти хорошо работает, когда агенту почти всегда требуется персональный или исторический контекст. У меня другой сценарий: много проектов и большое количество технических операций, значительная часть которых не требует обращения к прошлому.",[12,271,272],{},"Поэтому я выбрал постепенное раскрытие контекста:",[107,274,277],{"className":275,"code":276,"language":112,"meta":113},[110],"Загружается постоянно:\n├── профильные правила\n├── короткая память о пользователе\n├── несколько критичных ограничений\n└── компактный индекс доступных возможностей\n\nЗагружается по необходимости:\n├── история решений из MemPalace\n├── подробности прошлых ошибок\n├── инфраструктурные сведения\n├── полные инструкции skills\n└── дополнительные проектные документы\n",[62,278,276],{"__ignoreMap":113},[12,280,281],{},"Такой подход уменьшает объём входного контекста в обычных вызовах. Вместо всей накопленной памяти модель получает только несколько фрагментов, найденных под конкретную задачу.",[12,283,284],{},"Это не означает, что MCP работает совершенно бесплатно. У модели остаётся информация о доступных инструментах, а поиск памяти требует дополнительного tool-вызова. При первом обращении появляется небольшая задержка.",[12,286,287,288,293],{},"Hermes решает часть этой проблемы с помощью ",[94,289,292],{"href":290,"rel":291},"https:\u002F\u002Fhermes-agent.nousresearch.com\u002Fdocs\u002Fuser-guide\u002Ffeatures\u002Ftool-search",[98],"Tool Search",": полные схемы MCP-инструментов могут загружаться по требованию, а в постоянном контексте остаётся более компактный каталог возможностей.",[12,295,296],{},"Получается осознанный обмен:",[298,299,300,312],"table",{},[301,302,303],"thead",{},[304,305,306,310],"tr",{},[307,308,309],"th",{},"Автоматический provider",[307,311,198],{},[313,314,315,324,332,340,348],"tbody",{},[304,316,317,321],{},[318,319,320],"td",{},"Память подбирается автоматически",[318,322,323],{},"Агент должен решить, когда искать",[304,325,326,329],{},[318,327,328],{},"Меньше риск забыть про прошлый контекст",[318,330,331],{},"Меньше лишнего контекста в обычных вызовах",[304,333,334,337],{},[318,335,336],{},"Дополнительный контекст может появляться перед ходами",[318,338,339],{},"В prompt попадают только результаты выполненного поиска",[304,341,342,345],{},[318,343,344],{},"Меньше tool-вызовов",[318,346,347],{},"Поиск требует отдельного вызова",[304,349,350,353],{},[318,351,352],{},"Удобен для постоянно нужной персональной памяти",[318,354,355],{},"Удобен для большой проектной базы знаний",[12,357,358],{},"Для моей работы второй вариант оказался предсказуемее и экономнее по контексту.",[39,360,362],{"id":361},"три-уровня-памяти","Три уровня памяти",[12,364,365],{},"В результате память разделилась на три уровня.",[152,367,369],{"id":368},"_1-короткая-встроенная-память","1. Короткая встроенная память",[12,371,372,71,374,376],{},[62,373,74],{},[62,375,70],{}," остаются включёнными.",[12,378,379],{},"В них хранятся только сведения, которые полезны почти в каждой сессии:",[47,381,382,385,388,391,394,397],{},[50,383,384],{},"язык общения;",[50,386,387],{},"устойчивые предпочтения;",[50,389,390],{},"постоянные ограничения;",[50,392,393],{},"правила безопасности;",[50,395,396],{},"несколько фактов об окружении;",[50,398,399],{},"принятый стиль работы.",[12,401,402],{},"Эти файлы загружаются вместе с профилем, поэтому должны оставаться короткими. Если складывать туда историю всех проектов, я вернусь к исходной проблеме: каждый запрос будет нести большой объём нерелевантного контекста.",[12,404,405],{},"Моё практическое правило:",[25,407,408],{},[12,409,410],{},"Во встроенную память попадает только то, что стоит повторять модели почти в каждом диалоге.",[152,412,414],{"id":413},"_2-большая-проектная-память","2. Большая проектная память",[12,416,417],{},"MemPalace хранит знания, которые важны в будущем, но не нужны постоянно:",[47,419,420,423,426,429,432,435],{},[50,421,422],{},"почему было принято определённое решение;",[50,424,425],{},"какие варианты уже проверяли;",[50,427,428],{},"в чём заключалась root cause;",[50,430,431],{},"какие ошибки нельзя повторять;",[50,433,434],{},"как устроен компонент;",[50,436,437],{},"что осталось нерешённым.",[12,439,440],{},"Память разделена по проектам логически, но доступна через общий MCP. Агент начинает поиск с нужного проектного раздела и расширяет его только для межпроектной инфраструктуры.",[152,442,444],{"id":443},"_3-актуальные-первоисточники","3. Актуальные первоисточники",[12,446,447],{},"MemPalace хранит историю. История не всегда равна текущему состоянию.",[12,449,450],{},"Поэтому найденная запись не становится окончательным доказательством. После поиска агент проверяет факты по источнику, который отражает актуальное состояние:",[107,452,455],{"className":453,"code":454,"language":112,"meta":113},[110],"MemPalace\n    ↓\nпроектная документация\n    ↓\nGit и текущий код\n    ↓\nlive runtime, API или база данных\n",[62,456,454],{"__ignoreMap":113},[12,458,459],{},"Если в памяти записано, что сервис работал на определённом адресе несколько месяцев назад, это исторический факт. Чтобы назвать адрес текущим, нужно проверить инфраструктуру.",[12,461,462],{},"Такой порядок защищает от одной из самых опасных ошибок долговременной памяти: уверенного использования устаревшей информации.",[39,464,466],{"id":465},"цена-памяти-по-требованию","Цена памяти по требованию",[12,468,469],{},"У этой архитектуры есть очевидный риск: агент может не вызвать поиск, даже когда прошлый контекст нужен.",[12,471,472],{},"Автоматический provider решает эту задачу сам. В MCP-варианте нужно научить агента распознавать ситуации, в которых память обязательна.",[12,474,475],{},"Для этого в профильных правилах появились явные триггеры:",[47,477,478,481,484,487,490,493,496],{},[50,479,480],{},"вопрос о прошлом решении;",[50,482,483],{},"работа с инфраструктурой;",[50,485,486],{},"повторная ошибка;",[50,488,489],{},"неизвестный способ деплоя;",[50,491,492],{},"упоминание известной особенности проекта;",[50,494,495],{},"продолжение работы после долгого перерыва;",[50,497,498],{},"расхождение между текущей сессией и проектной документацией.",[12,500,501],{},"При таких запросах агент должен сначала искать в MemPalace, а уже затем предлагать действия.",[12,503,504],{},"Важно было зафиксировать и порядок обработки ошибки:",[107,506,509],{"className":507,"code":508,"language":112,"meta":113},[110],"MemPalace\n→ troubleshooting-документация\n→ текущий код\n→ live-состояние\n→ исправление\n",[62,510,508],{"__ignoreMap":113},[12,512,513],{},"Без этого агент мог сразу начать экспериментировать и повторить проблему, которая уже была расследована раньше.",[39,515,517],{"id":516},"skills-это-тоже-память-но-процедурная","Skills — это тоже память, но процедурная",[12,519,520],{},"После разделения обычной памяти возник аналогичный вопрос со skills.",[12,522,523],{},"Skills содержат не факты о проектах, а проверенные способы выполнения задач:",[47,525,526,529,532,535,538,541],{},[50,527,528],{},"как проводить аудит;",[50,530,531],{},"как отлаживать определённый класс ошибок;",[50,533,534],{},"как выполнять релиз;",[50,536,537],{},"как проверять инфраструктуру;",[50,539,540],{},"как оформлять результат;",[50,542,543],{},"какие защитные проверки обязательны.",[12,545,546],{},"Изначально такие skills копировались в каждый профиль. Это казалось логичным: профиль отдельный, значит и инструкции должны лежать внутри него.",[12,548,549],{},"Но копии быстро начали расходиться.",[12,551,552],{},"Исправление, сделанное в основной библиотеке, не попадало в старые профили. Хуже того, profile-local skill с тем же именем мог иметь более высокий приоритет и незаметно скрывать обновлённую общую версию.",[12,554,555],{},"Получилась классическая проблема дублирования:",[107,557,560],{"className":558,"code":559,"language":112,"meta":113},[110],"общий skill v3\n├── профиль 1: копия v1\n├── профиль 2: копия v2\n└── профиль 3: локально изменённая v1\n",[62,561,559],{"__ignoreMap":113},[12,563,564],{},"Невозможно было уверенно сказать, по какой процедуре работает конкретный агент.",[39,566,568],{"id":567},"общая-библиотека-вместо-копий","Общая библиотека вместо копий",[12,570,571,572,37],{},"Решением стала единая каноническая библиотека skills, подключённая к профилям через ",[62,573,574],{},"skills.external_dirs",[12,576,577],{},"Теперь профиль хранит собственные правила и память, но процедуры берёт из общего источника:",[107,579,582],{"className":580,"code":581,"language":112,"meta":113},[110],"Профиль 1 ─┐\nПрофиль 2 ─┼──→ общая Git-библиотека skills\nПрофиль 3 ─┘\n",[62,583,581],{"__ignoreMap":113},[12,585,586],{},"Новые профили создаются без копирования всей библиотеки. Локальный skill допускается только как намеренное исключение. Если процедура подходит нескольким профилям, исправляется каноническая версия.",[12,588,589],{},"После изменения skill проходит:",[166,591,592,595,598,601,604],{},[50,593,594],{},"проверку структуры;",[50,596,597],{},"валидацию связанных файлов и скриптов;",[50,599,600],{},"review diff;",[50,602,603],{},"обновление семантического индекса;",[50,605,606],{},"проверку загрузки из проектного профиля.",[12,608,609],{},"Так я получил общие навыки без общей истории и без смешивания проектных ограничений.",[39,611,613],{"id":612},"почему-skills-тоже-не-исполняются-из-mempalace","Почему skills тоже не исполняются из MemPalace",[12,615,616],{},"В какой-то момент появилась естественная идея: если MemPalace умеет семантический поиск, почему бы не хранить там полные тексты skills и не исполнять найденную инструкцию?",[12,618,619],{},"От этого варианта я отказался.",[12,621,622],{},"Семантическая база хорошо отвечает на вопрос: «Какой skill подходит к этой задаче?» Но она не должна самостоятельно отвечать на вопрос: «Какой текст сейчас разрешено исполнять?»",[12,624,625],{},"Если полная инструкция извлекается из поисковой базы, усложняется контроль:",[47,627,628,631,634,637,640,643,646],{},[50,629,630],{},"происхождения;",[50,632,633],{},"версии;",[50,635,636],{},"изменений;",[50,638,639],{},"связанного кода;",[50,641,642],{},"валидности скриптов;",[50,644,645],{},"отката;",[50,647,648],{},"намеренных локальных исключений.",[12,650,651],{},"Поэтому MemPalace хранит только поисковый индекс:",[47,653,654,657,660,663,666,669,672],{},[50,655,656],{},"название skill;",[50,658,659],{},"краткое описание;",[50,661,662],{},"путь;",[50,664,665],{},"категорию;",[50,667,668],{},"версию;",[50,670,671],{},"хэш;",[50,673,674],{},"подсказки для поиска.",[12,676,677,678,681],{},"Найденная запись считается метаданными. После поиска агент загружает канонический ",[62,679,680],{},"SKILL.md"," штатным инструментом Hermes. Исполняемым источником остаётся файловая библиотека под Git.",[12,683,684],{},"Это тот же принцип, что и с проектной памятью:",[25,686,687],{},[12,688,689],{},"Поисковая система помогает найти источник, но не заменяет сам источник.",[39,691,693],{"id":692},"конфигурация-ещё-не-означает-что-всё-работает","Конфигурация ещё не означает, что всё работает",[12,695,696],{},"Во время настройки профилей я столкнулся ещё с одной проблемой: успешная команда не всегда означала успешную цепочку.",[12,698,699,700,702],{},"Одна из первых команд добавления MemPalace дошла до интерактивного подтверждения, но не сохранила конфигурацию. При этом пустой ",[62,701,140],{}," отвлёк диагностику в неправильную сторону.",[12,704,705],{},"После этого проверка стала состоять из нескольких уровней:",[166,707,708,711,714,717,720,723,726],{},[50,709,710],{},"MCP присутствует в конфигурации профиля;",[50,712,713],{},"соединение с сервером устанавливается;",[50,715,716],{},"Hermes обнаруживает ожидаемые инструменты;",[50,718,719],{},"инструменты доступны в новой или перезагруженной сессии;",[50,721,722],{},"реальный запрос из Telegram доходит до нужного gateway;",[50,724,725],{},"профиль вызывает MemPalace;",[50,727,728],{},"ответ возвращается в тот же чат.",[12,730,731],{},"Появилась и отдельная операционная тонкость. После перезапуска gateway тестовое сообщение можно отправить слишком рано: Telegram его уже примет, но новое поколение polling ещё не будет готово его обработать.",[12,733,734],{},"Поэтому окончательная проверка выглядит так:",[107,736,739],{"className":737,"code":738,"language":112,"meta":113},[110],"Telegram\n→ gateway нужного профиля\n→ модель\n→ MCP\n→ MemPalace\n→ ответ в Telegram\n",[62,740,738],{"__ignoreMap":113},[12,742,743],{},"Только успешная сквозная цепочка считается доказательством работоспособности.",[39,745,747],{"id":746},"что-в-итоге-получилось","Что в итоге получилось",[12,749,750],{},"Сейчас архитектура разделяет не агентов целиком, а разные виды их знаний.",[107,752,755],{"className":753,"code":754,"language":112,"meta":113},[110],"Отдельно для каждого профиля:\n├── Telegram и gateway\n├── конфигурация\n├── сессии\n├── рабочий каталог\n├── SOUL.md\n├── USER.md\n├── MEMORY.md\n└── проектные ограничения\n\nОбщее:\n├── MemPalace\n├── каноническая библиотека skills\n└── инфраструктурные знания\n\nПо требованию:\n├── поиск проектной истории\n├── загрузка полного skill\n└── дополнительная документация\n",[62,756,754],{"__ignoreMap":113},[12,758,759],{},"Главное решение здесь не в количестве ботов. Отдельные боты — только видимая часть системы.",[12,761,762],{},"Настоящая архитектура определяется ответами на четыре вопроса:",[166,764,765,768,771,774],{},[50,766,767],{},"Что агент должен знать всегда?",[50,769,770],{},"Что нужно загружать только для конкретной задачи?",[50,772,773],{},"Какие знания принадлежат одному проекту?",[50,775,776],{},"Какие процедуры должны быть одинаковыми для всех профилей?",[12,778,779],{},"Я оставил во встроенной памяти только короткий обязательный контекст. Большую проектную память подключил через MCP и вызываю по необходимости. Skills вынес в общую версионируемую библиотеку, а MemPalace использую как индекс для их поиска.",[12,781,782],{},"Так профили сохраняют собственную проектную идентичность, но не превращаются в изолированные копии, которые постепенно забывают общие правила.",[784,785],"hr",{},[12,787,788,789,37],{},"Если вы используете AI-агентов в нескольких проектах и контекст уже начал смешиваться, я могу помочь разделить профили, спроектировать уровни памяти и собрать общую библиотеку проверяемых процедур. ",[94,790,792],{"href":791},"\u002Fcontact","Расскажите мне о своей задаче",{"title":113,"searchDepth":794,"depth":794,"links":795},2,[796,797,802,803,808,809,810,811,812,813],{"id":41,"depth":794,"text":42},{"id":130,"depth":794,"text":131,"children":798},[799,801],{"id":154,"depth":800,"text":155},3,{"id":197,"depth":800,"text":198},{"id":233,"depth":794,"text":234},{"id":361,"depth":794,"text":362,"children":804},[805,806,807],{"id":368,"depth":800,"text":369},{"id":413,"depth":800,"text":414},{"id":443,"depth":800,"text":444},{"id":465,"depth":794,"text":466},{"id":516,"depth":794,"text":517},{"id":567,"depth":794,"text":568},{"id":612,"depth":794,"text":613},{"id":692,"depth":794,"text":693},{"id":746,"depth":794,"text":747},"2026-08-25","Как я разделил Hermes по проектным профилям, оставил короткую память локальной, подключил MemPalace через MCP и вынес skills в общую библиотеку.","md",false,{},true,"\u002Fblog\u002F2026-08-25-profili-hermes-otdelnyy-kontekst-obshchie-navyki",{"title":6,"description":815},"Профили Hermes: контекст, память и общие skills","blog\u002F2026-08-25-profili-hermes-otdelnyy-kontekst-obshchie-navyki",[825,826,827,828,829],"ai","агенты","hermes","память","разработка","iVREG2IpzvWnKMedD29hYoC2dnLriv6o0sZJJI1zg_I",{"id":832,"title":833,"acrostic":7,"body":834,"date":1171,"description":1172,"duration":7,"emoji":7,"extension":816,"faq":7,"featured":817,"format":7,"image":7,"level":7,"media":7,"meta":1173,"navigation":819,"path":1174,"price":7,"schedule":7,"seo":1175,"seoTitle":7,"serviceType":7,"status":7,"stem":1176,"tags":1177,"tech":7,"toc":819,"url":7,"__hash__":1180},"blog\u002Fblog\u002F2026-08-23-slozhnost-nikuda-ne-ischezla.md","Сложность никуда не исчезла — я научился с ней справляться",{"type":9,"value":835,"toc":1160},[836,839,842,845,848,851,854,874,877,881,884,887,890,893,896,899,903,906,909,938,941,944,947,950,954,957,960,963,966,969,974,977,980,984,987,990,993,996,999,1003,1006,1009,1012,1032,1035,1039,1042,1045,1048,1051,1054,1061,1064,1068,1071,1074,1077,1094,1097,1100,1103,1108,1111,1115,1118,1125,1128,1131,1135,1138,1141,1144,1147,1150,1153,1155],[12,837,838],{},"В разработке программ есть свой ритм.",[12,840,841],{},"Сначала главное — чтобы всё заработало. Потом хочется, чтобы интерфейс выглядел достойно. Следом начинается доводка: нужно вычистить ошибки, подтянуть производительность, разобраться с крайними случаями, настроить мониторинг. Когда приложение состоит из пары экранов, обо всём этом обычно не думаешь.",[12,843,844],{},"Затем приходит самый непростой этап: сделать так, чтобы спустя полгода в коде смог разобраться человек, который не держит устройство всей системы в голове. Раньше до этого этапа у меня часто просто не доходили руки.",[12,846,847],{},"Продукт уже работает, им пользуются, новые функции постепенно появляются. Возникает логичный вопрос: зачем тратить время на документацию, архитектурные правила, тесты и рефакторинг, если заказчик этого почти не видит?",[12,849,850],{},"Но проходит время, и простая правка, которая раньше занимала пару часов, растягивается на два дня. Ещё через год на неё может уйти неделя. Обычно дело не в том, что код превратился в кошмар. Просто вокруг него накопился огромный пласт знаний, которые остались в чьей-то голове и нигде не были зафиксированы.",[12,852,853],{},"Появляются обычные вопросы, на которые нет ответа в документации:",[47,855,856,859,862,865,868,871],{},[50,857,858],{},"зачем нужны два почти одинаковых сервиса;",[50,860,861],{},"какой из них считать основным;",[50,863,864],{},"почему это поле обязательно;",[50,866,867],{},"можно ли менять этот endpoint;",[50,869,870],{},"почему нельзя перезапускать процесс;",[50,872,873],{},"что сломается, если убрать странную проверку.",[12,875,876],{},"Когда-то кто-то всё это понимал. Иногда этим человеком был я сам.",[39,878,880],{"id":879},"сложность-это-не-количество-файлов","Сложность — это не количество файлов",[12,882,883],{},"Раньше я думал, что управлять сложностью — значит построить правильную архитектуру: грамотно разделить систему на модули, не плодить лишние зависимости, использовать понятные шаблоны, выносить общее, писать тесты.",[12,885,886],{},"Всё это действительно важно. Но со временем мой взгляд изменился.",[12,888,889],{},"Большая система всё равно останется большой. Если в ней несколько приложений, база данных, очередь задач, десяток сервисов, внешние API, фоновые процессы и разные окружения, никакой рефакторинг не превратит её в простой калькулятор.",[12,891,892],{},"Поэтому я больше не пытаюсь сделать сложные системы простыми. Я стараюсь сделать их понятными.",[12,894,895],{},"Это не одно и то же.",[12,897,898],{},"Простота зависит от масштаба задачи. Понятность — от того, насколько хорошо зафиксированы устройство системы, принятые решения и способы проверки.",[39,900,902],{"id":901},"пишу-инструкцию-для-следующего-разработчика","Пишу инструкцию для следующего разработчика",[12,904,905],{},"Только теперь этим следующим разработчиком всё чаще становится AI.",[12,907,908],{},"Для каждого серьёзного проекта я готовлю краткий документ — карту системы. Не толстую документацию на сотни страниц, а рабочий ориентир:",[47,910,911,914,917,920,923,926,929,932,935],{},[50,912,913],{},"что я строю;",[50,915,916],{},"из каких частей состоит система;",[50,918,919],{},"где живёт бизнес-логика;",[50,921,922],{},"что считается главным источником данных;",[50,924,925],{},"как данные проходят через систему;",[50,927,928],{},"какие существуют окружения;",[50,930,931],{},"как устроен релиз;",[50,933,934],{},"какие решения уже приняты;",[50,936,937],{},"какие части лучше не менять, пока не разберёшься в последствиях.",[12,939,940],{},"Раньше такой документ один раз читал новый сотрудник. Потом карта устаревала и постепенно превращалась в археологическую находку.",[12,942,943],{},"С AI ситуация оказалась интереснее. Агент действительно читает карту перед каждой задачей. Документация перестала быть формальностью, которую пишут «потому что положено». Она стала частью рабочего процесса.",[12,945,946],{},"Сначала агент получает контекст, затем изучает код.",[12,948,949],{},"Разница кажется небольшой, но на практике она огромна. Без контекста AI быстро придумывает собственную версию архитектуры. Эта версия может быть вполне логичной, аккуратной и даже красивой. Проблема в том, что она не совпадает с системой, которая уже работает.",[39,951,953],{"id":952},"хорошие-и-плохие-примеры","Хорошие и плохие примеры",[12,955,956],{},"Если однажды в проекте удалось грамотно решить типовую задачу — сделать API-контроллер, воркер, компонент, работу с очередью или интеграцию с внешним сервисом, — нет смысла заставлять следующего агента снова изобретать решение.",[12,958,959],{},"Я сохраняю такие реализации как эталонные примеры. Перед созданием нового компонента агент сначала смотрит, как подобные компоненты принято делать в этом проекте. Он не должен слепо копировать код. Важнее понять подход: структуру, границы ответственности, обработку ошибок и способ проверки.",[12,961,962],{},"Рядом постепенно появилась обратная коллекция: примеры того, как делать не стоит. Она оказалась даже полезнее.",[12,964,965],{},"Например, ответ языковой модели нельзя сразу отдавать пользователю. Модель может вернуть служебный текст, неожиданную разметку, некорректные данные или убедительно сформулированную ошибку.",[12,967,968],{},"Можно один раз исправить такой баг и забыть о нём. А можно сохранить правило:",[25,970,971],{},[12,972,973],{},"Результат LLM — это недоверенный ввод. Перед использованием его нужно проверить.",[12,975,976],{},"Тогда ошибка оставляет после себя не только исправленный код, но и новое знание.",[12,978,979],{},"Мне нравится мысль, что каждый хорошо разобранный баг должен немного снижать вероятность следующего. Иначе я буду бесконечно исправлять одну и ту же ошибку в разных местах.",[39,981,983],{"id":982},"один-факт-одно-место","Один факт — одно место",[12,985,986],{},"Есть простой способ незаметно нарастить сложность: скопировать один список в четыре разных файла.",[12,988,989],{},"Через несколько месяцев эти списки неизбежно начнут отличаться. То же самое происходит с типами данных, конфигурациями, правилами, URL, промптами, статусами и бизнес-ограничениями.",[12,991,992],{},"Поэтому я стараюсь находить для каждого такого факта одно главное место.",[12,994,995],{},"Если есть список сервисов, остальные конфигурации должны строиться на его основе. Если определён общий контракт данных, приложения должны использовать его, а не создавать собственные похожие версии. Если существует системный промпт, не нужно хранить ещё одну его копию прямо в коде.",[12,997,998],{},"Здесь нет сложной архитектурной теории. Если факт записан только в одном месте, невозможно забыть обновить его копию в другом — потому что копии нет.",[39,1000,1002],{"id":1001},"самая-опасная-фраза-заодно","Самая опасная фраза — «заодно»",[12,1004,1005],{},"AI охотно помогает. Просишь его исправить одну ошибку, а он замечает ещё три потенциальные проблемы, устаревшую библиотеку и дублирование логики. Иногда заодно предлагает перестроить половину архитектуры.",[12,1007,1008],{},"Нередко он прав. Но исходная задача всё равно заключалась в том, чтобы исправить одну ошибку.",[12,1010,1011],{},"Поэтому я стал гораздо строже задавать границы работы. Перед заметным изменением агент должен понимать:",[47,1013,1014,1017,1020,1023,1026,1029],{},[50,1015,1016],{},"что именно нужно изменить;",[50,1018,1019],{},"что не входит в задачу;",[50,1021,1022],{},"какие части системы могут быть затронуты;",[50,1024,1025],{},"как выглядит готовый результат;",[50,1027,1028],{},"чем этот результат будет проверен;",[50,1030,1031],{},"какие действия могут привести к неприятным последствиям.",[12,1033,1034],{},"Особенно важно явно перечислять то, чего делать не нужно. Большинство неприятностей в разработке начинается с безобидной фразы: «А давайте заодно…»",[39,1036,1038],{"id":1037},"я-больше-не-верю-фразе-всё-работает","Я больше не верю фразе «всё работает»",[12,1040,1041],{},"Это относится не только к AI.",[12,1043,1044],{},"Разработчик пишет код, проверяет его и говорит: «Работает». Но что именно он проверил? Какой результат получил? Соответствует ли это реальному пользовательскому сценарию?",[12,1046,1047],{},"Теперь для каждого изменения я стараюсь заранее построить понятный путь проверки.",[12,1049,1050],{},"Если исправляю баг, сначала по возможности воспроизвожу его тестом. Тест падает. Я вношу исправление. Тест проходит. Затем проверяю модуль целиком и сборку. Если изменение затрагивает соседние части системы, проверяю и их. Для критичных функций иду дальше и прохожу настоящий пользовательский сценарий.",[12,1052,1053],{},"Количество тестов само по себе ничего не доказывает. Важно, чтобы доказательство соответствовало утверждению.",[12,1055,1056,1057,1060],{},"Зелёный unit-тест не гарантирует, что функция работает в production. Статус процесса ",[62,1058,1059],{},"online"," не означает, что пользователь может выполнить нужное действие. Фраза AI «задача полностью выполнена» — это уверенное мнение, а не доказательство.",[12,1062,1063],{},"Если я утверждаю, что функция работает, у меня должен быть результат проверки именно этой функции.",[39,1065,1067],{"id":1066},"документация-стала-результатом-работы","Документация стала результатом работы",[12,1069,1070],{},"Здесь AI заметно изменил экономику процесса.",[12,1072,1073],{},"Раньше после большой задачи приходилось выбирать: двигаться дальше или остановиться и подробно описать сделанное. Нетрудно догадаться, какой вариант чаще побеждал.",[12,1075,1076],{},"Теперь значительную часть этой работы можно поручить агенту:",[47,1078,1079,1082,1085,1088,1091],{},[50,1080,1081],{},"изменился архитектурный контракт — обновить его описание;",[50,1083,1084],{},"нашлась повторяющаяся ошибка — добавить её в список антипаттернов;",[50,1086,1087],{},"появился новый сервис — дополнить карту проекта;",[50,1089,1090],{},"изменился пользовательский сценарий — проверить связанные тесты и документацию;",[50,1092,1093],{},"найден удачный способ решения — сохранить его как пример.",[12,1095,1096],{},"Конечно, за документацией тоже нужно следить. AI способен уверенно описать собственные догадки как существующее устройство системы. Поэтому код, конфигурация и работающий runtime остаются главными источниками фактов. Документ должен сверяться с ними, а не подменять их.",[12,1098,1099],{},"Но поддерживать документацию стало настолько дешевле, что уже странно этого не делать.",[12,1101,1102],{},"У меня получился повторяющийся цикл:",[12,1104,1105],{},[34,1106,1107],{},"задача → код → проверка → новое знание → документация → контекст для следующей задачи",[12,1109,1110],{},"Проект накапливает не только код. Он накапливает опыт работы с этим кодом.",[39,1112,1114],{"id":1113},"с-чего-начать","С чего начать",[12,1116,1117],{},"Для такого подхода необязательно сразу создавать сложную систему правил. В качестве отправной точки можно дать агенту базовый промпт:",[107,1119,1123],{"className":1120,"code":1121,"language":112,"meta":1122},[110],"Перед тем как вносить изменения, разберись, как устроен проект:\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","prompt",[62,1124,1121],{"__ignoreMap":113},[12,1126,1127],{},"Сам по себе этот промпт не сотворит чудес. Если в проекте нет нормального контекста, тестов и понятных правил, агенту не на что будет опереться.",[12,1129,1130],{},"Но с чего-то нужно начинать.",[39,1132,1134],{"id":1133},"четвёртый-этап-я-больше-не-откладываю","Четвёртый этап я больше не откладываю",[12,1136,1137],{},"Раньше я сначала запускал программу, затем дорабатывал интерфейс и стабилизировал систему. О документации, архитектурных правилах и накопленных знаниях вспоминал, когда проект уже начинал трещать под собственной тяжестью. Если на это оставались время и бюджет.",[12,1139,1140],{},"Теперь четвёртый этап можно выполнять постепенно, одновременно с основной работой.",[12,1142,1143],{},"Написал код — оставил тест. Принял решение — зафиксировал его. Наступил на грабли — положил их в каталог и подписал. Нашёл хороший способ решить типовую задачу — сохранил его как эталон.",[12,1145,1146],{},"Следующий AI-агент приходит уже не в пустое поле. Он получает опыт предыдущих задач: карту системы, принятые решения, рабочие примеры, известные ошибки и способы проверки.",[12,1148,1149],{},"Сложность никуда не исчезла. Большая система осталась большой системой. Но всё меньше её частей держится только в моей памяти.",[12,1151,1152],{},"И этого уже достаточно, чтобы работать с ней увереннее.",[784,1154],{},[12,1156,1157,1158,37],{},"Если в вашем проекте слишком многое держится в головах отдельных людей, я могу помочь собрать карту системы, определить источники истины и настроить работу AI-агентов так, чтобы они начинали с контекста и заканчивали проверяемым результатом. ",[94,1159,792],{"href":791},{"title":113,"searchDepth":794,"depth":794,"links":1161},[1162,1163,1164,1165,1166,1167,1168,1169,1170],{"id":879,"depth":794,"text":880},{"id":901,"depth":794,"text":902},{"id":952,"depth":794,"text":953},{"id":982,"depth":794,"text":983},{"id":1001,"depth":794,"text":1002},{"id":1037,"depth":794,"text":1038},{"id":1066,"depth":794,"text":1067},{"id":1113,"depth":794,"text":1114},{"id":1133,"depth":794,"text":1134},"2026-08-23","Как карты проектов, эталонные решения, тесты и документация помогают мне управлять сложностью и безопаснее работать с AI-агентами.",{},"\u002Fblog\u002F2026-08-23-slozhnost-nikuda-ne-ischezla",{"title":833,"description":1172},"blog\u002F2026-08-23-slozhnost-nikuda-ne-ischezla",[825,829,1178,1179,826],"архитектура","документация","u2IpebkyZ2KkR21aYLFIdOnMu7sqcDfubssSzmqIzJY",{"id":1182,"title":1183,"acrostic":7,"body":1184,"date":1440,"description":1441,"duration":7,"emoji":7,"extension":816,"faq":7,"featured":817,"format":7,"image":7,"level":7,"media":7,"meta":1442,"navigation":819,"path":1443,"price":7,"schedule":7,"seo":1444,"seoTitle":1445,"serviceType":7,"status":7,"stem":1446,"tags":1447,"tech":7,"toc":819,"url":7,"__hash__":1450},"blog\u002Fblog\u002F2026-08-13-bystryy-deploy-statey.md","Как я ускорил деплой контента в Nuxt: с 12 минут до 21 секунды",{"type":9,"value":1185,"toc":1428},[1186,1189,1192,1196,1199,1202,1206,1209,1247,1254,1264,1268,1274,1278,1281,1304,1307,1311,1317,1321,1328,1331,1334,1338,1341,1344,1347,1351,1354,1409,1412,1415,1418,1421],[12,1187,1188],{},"Исправить слово или запятую в статье можно за несколько секунд. Но на моём сайте после такой правки запускался полный выпуск: установка зависимостей, сборка Nuxt и админки, генерация страниц, перезапуск приложения и итоговые проверки.",[12,1190,1191],{},"Последний успешный полный workflow перед запуском новой схемы шёл 12 минут 53 секунды. Для изменений в коде это нормально. Для исправленной запятой — слишком долго.",[39,1193,1195],{"id":1194},"я-разделил-два-разных-выпуска","Я разделил два разных выпуска",[12,1197,1198],{},"Полный деплой остался для кода, конфигурации и смешанных изменений. Для статей я сделал отдельный путь, который принимает только Markdown блога и не пересобирает всё приложение.",[12,1200,1201],{},"Это не сокращённая версия обычного деплоя. Быстрый путь работает с отдельной проекцией контента, проверяет точный Git-коммит и переключает новую версию целиком. Если что-то идёт не так, сайт возвращается к предыдущему состоянию.",[39,1203,1205],{"id":1204},"как-устроен-быстрый-путь","Как устроен быстрый путь",[12,1207,1208],{},"Я добавил три компонента:",[298,1210,1211,1221],{},[301,1212,1213],{},[304,1214,1215,1218],{},[307,1216,1217],{},"Компонент",[307,1219,1220],{},"Что делает",[313,1222,1223,1231,1239],{},[304,1224,1225,1228],{},[318,1226,1227],{},"Fast renderer",[318,1229,1230],{},"Готовит разрешённые страницы из выбранного Git-снимка",[304,1232,1233,1236],{},[318,1234,1235],{},"Gateway",[318,1237,1238],{},"Направляет обычные запросы в основное приложение, а разрешённые маршруты — в renderer",[304,1240,1241,1244],{},[318,1242,1243],{},"Активный указатель",[318,1245,1246],{},"Связывает публичные маршруты с точным Git-коммитом",[12,1248,1249,1250,1253],{},"Главная страница, список блога, сама статья и sitemap должны видеть один и тот же набор материалов. Простого копирования ",[62,1251,1252],{},".md"," на сервер для этого недостаточно: основное приложение продолжит работать с данными и HTML из прежней сборки.",[12,1255,1256,1257,71,1260,1263],{},"Поэтому renderer читает полный снимок блога из Git и создаёт новую проекцию. Gateway использует её только для маршрутов из строгого списка. Административные страницы, API, неизвестные URL и методы кроме ",[62,1258,1259],{},"GET",[62,1261,1262],{},"HEAD"," остаются на основном приложении.",[152,1265,1267],{"id":1266},"промпт-спроектировать-быстрый-путь-для-контента","Промпт: спроектировать быстрый путь для контента",[107,1269,1272],{"className":1270,"code":1271,"language":112,"meta":1122},[110],"Я хочу отделить публикацию 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",[62,1273,1271],{"__ignoreMap":113},[39,1275,1277],{"id":1276},"как-теперь-публикуется-статья","Как теперь публикуется статья",[12,1279,1280],{},"Быстрый выпуск получает полный 40-символьный SHA и выполняет несколько шагов:",[166,1282,1283,1289,1292,1295,1298,1301],{},[50,1284,1285,1286,37],{},"Проверяет, что коммит совпадает с вершиной ",[62,1287,1288],{},"origin\u002Fmain",[50,1290,1291],{},"Подтверждает, что во всём наборе изменений есть только разрешённые Markdown-файлы.",[50,1293,1294],{},"Формирует полную проекцию блога для выбранного SHA.",[50,1296,1297],{},"Записывает её в неизменяемый файл.",[50,1299,1300],{},"Атомарно переключает активный указатель.",[50,1302,1303],{},"Открывает главную, блог, sitemap и изменённые статьи через HTTP.",[12,1305,1306],{},"Перед началом скрипт сохраняет исходный SHA и прежний активный указатель. Если синхронизация или HTTP-проверка завершается ошибкой, он возвращает оба значения назад. Читатель видит либо предыдущую целую версию сайта, либо новую.",[152,1308,1310],{"id":1309},"промпт-проверить-выпуск-перед-подтверждением-успеха","Промпт: проверить выпуск перед подтверждением успеха",[107,1312,1315],{"className":1313,"code":1314,"language":112,"meta":1122},[110],"Проверь завершившийся 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",[62,1316,1314],{"__ignoreMap":113},[39,1318,1320],{"id":1319},"где-проходит-граница","Где проходит граница",[12,1322,1323,1324,1327],{},"Быстрый путь разрешает добавлять, изменять и удалять только датированные файлы ",[62,1325,1326],{},"content\u002Fblog\u002F*.md",". Он проверяет весь diff от активной production-версии до запрошенного коммита.",[12,1329,1330],{},"Переименование, копирование, пустой diff, изменение кода или смешанный набор файлов отправляются в полный деплой. Если классификатор не может доказать, что перед ним только статьи, ускорения не будет.",[12,1332,1333],{},"Это ограничение важнее самой скорости. Без него отдельный путь постепенно превратился бы в запасной деплой для любых изменений.",[39,1335,1337],{"id":1336},"эта-статья-стала-проверкой-нового-пути","Эта статья стала проверкой нового пути",[12,1339,1340],{},"Когда быстрый деплой был готов, его требовалось проверить настоящей публикацией. Я решил не создавать проходную тестовую заметку, а написать статью о самой работе. Тема того стоила: ожидаемый путь публикации сокращался с почти 13 минут до нескольких секунд.",[12,1342,1343],{},"Черновик родился в той же рабочей сессии с AI-агентом, где я вводил новую схему в production. В контексте ещё оставались исходная задача, неудачные проверки, откаты, команды и фактическая приёмка. Из этого журнала я собрал последовательный рассказ, а код и логи не позволили приписать системе то, чего она ещё не доказала.",[12,1345,1346],{},"Получился полезный цикл: рабочая сессия дала материал для статьи, а статья стала первым реальным тестом результата этой сессии.",[39,1348,1350],{"id":1349},"что-показала-первая-публикация","Что показала первая публикация",[12,1352,1353],{},"Первый успешный выпуск этой статьи занял 21 секунду по времени GitHub Actions. Сам production-скрипт от начала проверки до завершения локальной приёмки отработал за 13,36 секунды.",[298,1355,1356,1367],{},[301,1357,1358],{},[304,1359,1360,1363],{},[307,1361,1362],{},"Этап",[307,1364,1366],{"align":1365},"right","Время",[313,1368,1369,1377,1385,1393,1401],{},[304,1370,1371,1374],{},[318,1372,1373],{},"Проверка набора файлов",[318,1375,1376],{"align":1365},"1,73 с",[304,1378,1379,1382],{},[318,1380,1381],{},"Git-проверка и переход",[318,1383,1384],{"align":1365},"1,01 с",[304,1386,1387,1390],{},[318,1388,1389],{},"Синхронизация контента",[318,1391,1392],{"align":1365},"2,91 с",[304,1394,1395,1398],{},[318,1396,1397],{},"HTTP-приёмка",[318,1399,1400],{"align":1365},"7,67 с",[304,1402,1403,1406],{},[318,1404,1405],{},"Весь production-скрипт",[318,1407,1408],{"align":1365},"13,36 с",[12,1410,1411],{},"Для сравнения я беру одинаковую внешнюю границу — длительность job в GitHub Actions. Полный workflow шёл 12 минут 53 секунды, быстрый — 21 секунду. В этой публикации выпуск ускорился в 36,8 раза.",[12,1413,1414],{},"Основной Nuxt-процесс, renderer и gateway не перезапускались: их PID и счётчики перезапусков до и после совпали. При этом сохранились проверка точного SHA, контроль набора файлов, согласованность маршрутов, HTTP-приёмка и автоматический откат.",[12,1416,1417],{},"Полный деплой никуда не исчез. Он по-прежнему обслуживает изменения в коде и остаётся точкой восстановления. Следующая полная сборка включает опубликованные статьи в обычный Nuxt-артефакт, после чего временная проекция больше не нужна.",[12,1419,1420],{},"Эта статья стала первой принятой проверкой быстрого пути. Два следующих обновления того же Markdown также прошли без полной сборки и перезапуска процессов. Быстрый выпуск теперь обслуживает обычные правки статей, а полный деплой остаётся для изменений в коде и включает актуальный контент в основной Nuxt-артефакт.",[12,1422,1423,1424,1427],{},"У вас публикация одной правки тоже запускает долгую сборку? ",[94,1425,1426],{"href":791},"Напишите мне",". Я посмотрю, где в проекте проходит граница между контентом и кодом, и помогу спроектировать быстрый путь так, чтобы он не обходил проверки и rollback.",{"title":113,"searchDepth":794,"depth":794,"links":1429},[1430,1431,1434,1437,1438,1439],{"id":1194,"depth":794,"text":1195},{"id":1204,"depth":794,"text":1205,"children":1432},[1433],{"id":1266,"depth":800,"text":1267},{"id":1276,"depth":794,"text":1277,"children":1435},[1436],{"id":1309,"depth":800,"text":1310},{"id":1319,"depth":794,"text":1320},{"id":1336,"depth":794,"text":1337},{"id":1349,"depth":794,"text":1350},"2026-08-13","Как я отделил публикацию Markdown от полной сборки Nuxt-сайта и сократил время выпуска статьи с 12 минут 53 секунд до 21 секунды.",{},"\u002Fblog\u002F2026-08-13-bystryy-deploy-statey",{"title":1183,"description":1441},"Как ускорить деплой контента в Nuxt с 12 минут до 21 секунды","blog\u002F2026-08-13-bystryy-deploy-statey",[829,1448,1449,825],"devops","nuxt","1n9Sf3zXrOYTRK2HYmG9VeX610rfCZ8PNaTY3It3_qE",{"id":1452,"title":1453,"acrostic":7,"body":1454,"date":1440,"description":1791,"duration":7,"emoji":7,"extension":816,"faq":7,"featured":817,"format":7,"image":7,"level":7,"media":7,"meta":1792,"navigation":819,"path":1793,"price":7,"schedule":7,"seo":1794,"seoTitle":1795,"serviceType":7,"status":7,"stem":1796,"tags":1797,"tech":7,"toc":819,"url":7,"__hash__":1800},"blog\u002Fblog\u002F2026-08-13-ot-open-source-k-multitenant-saas.md","От open-source для одного автосервиса к мультитенантному SaaS",{"type":9,"value":1455,"toc":1781},[1456,1459,1462,1465,1468,1471,1474,1477,1481,1484,1487,1490,1493,1496,1519,1522,1525,1528,1532,1535,1538,1541,1544,1547,1552,1555,1558,1581,1584,1588,1591,1594,1597,1600,1603,1606,1609,1612,1615,1618,1623,1626,1630,1633,1636,1639,1642,1645,1648,1652,1655,1658,1661,1664,1667,1690,1693,1696,1699,1702,1706,1709,1712,1715,1718,1721,1724,1728,1731,1734,1737,1740,1743,1746,1749,1753,1756,1759,1762,1765,1768,1771,1774],[12,1457,1458],{},"Когда я начинал этот проект, задача выглядела довольно понятно.",[12,1460,1461],{},"Нужно было сделать код для одного автосервиса. Предполагалось, что затем владельцы других сервисов смогут взять open-source продукт, развернуть его у себя и пользоваться им самостоятельно: вести клиентов, автомобили, заказы, документы и работу сотрудников.",[12,1463,1464],{},"Для первого этапа такая модель была естественной. Она позволяла сосредоточиться на самом продукте, а не на платформе вокруг него. У каждого сервиса была бы своя установка, свои данные, своё окружение и свой темп обновлений.",[12,1466,1467],{},"Но по мере работы стало видно, что продукт идёт в другую сторону.",[12,1469,1470],{},"Нам нужен был не набор независимых установок, а единый сервис для многих автосервисов. Такой, где организация создаёт своё рабочее пространство, получает изолированные данные и обновления без отдельного развёртывания каждой новой версии.",[12,1472,1473],{},"Так проект перешёл от open-source модели к мультитенантному SaaS.",[12,1475,1476],{},"На словах это иногда звучит как небольшая архитектурная задача: добавить организациям идентификаторы, разделить данные, настроить роли. На деле пришлось пересмотреть почти все границы продукта.",[39,1478,1480],{"id":1479},"старая-модель-перестала-отвечать-на-новые-вопросы","Старая модель перестала отвечать на новые вопросы",[12,1482,1483],{},"Установка для одного автосервиса и SaaS для множества организаций могут выполнять похожие функции. В обоих случаях есть клиенты, автомобили, заказы, сотрудники и документы.",[12,1485,1486],{},"Но ответственность устроена по-разному.",[12,1488,1489],{},"В самостоятельной установке каждый владелец сервиса отвечает за своё окружение. Он решает, когда обновляться, как поддерживать инфраструктуру и что делать, если версия продукта расходится с другими установками.",[12,1491,1492],{},"В SaaS система одна, но внутри неё работают независимые организации. Они не должны видеть данные друг друга, влиять на чужие процессы или получать доступ к действиям, которые не относятся к их роли.",[12,1494,1495],{},"Из-за этого появились вопросы, которые нельзя было оставлять на потом:",[47,1497,1498,1501,1504,1507,1510,1513,1516],{},[50,1499,1500],{},"как пользователь создаёт организацию и попадает в нужный автосервис;",[50,1502,1503],{},"кому принадлежат автомобили, заказы и документы;",[50,1505,1506],{},"что видит владелец автомобиля;",[50,1508,1509],{},"какие действия доступны сотруднику сервиса;",[50,1511,1512],{},"что может делать механик;",[50,1514,1515],{},"где заканчиваются права организации и начинаются полномочия самой платформы;",[50,1517,1518],{},"как выпускать обновления одновременно для всех, не превращая каждый релиз в отдельный проект.",[12,1520,1521],{},"Пока продукт рассчитан на одну установку, часть этих вопросов легко не заметить. Когда внутри одной системы появляются разные организации, неявные договорённости становятся риском.",[12,1523,1524],{},"Я понял, что недостаточно добавить к старой модели несколько новых полей и назвать результат мультитенантностью. В таком случае старый продукт остаётся внутри нового, а вокруг него постепенно растут исключения, флаги и переходники.",[12,1526,1527],{},"Через несколько месяцев уже трудно понять, что относится к текущей модели, а что осталось от прежней.",[39,1529,1531],{"id":1530},"не-добавлять-слой-сверху-а-поменять-основу","Не добавлять слой сверху, а поменять основу",[12,1533,1534],{},"Главное решение здесь было не техническим, а продуктовым.",[12,1536,1537],{},"Проект всё ещё находился в разработке. Не было клиентского трафика и данных, ради которых пришлось бы годами поддерживать прежнюю логику. Поэтому я выбрал более прямой путь: не строить совместимость с тем, что больше не нужно.",[12,1539,1540],{},"Если старая сущность или сценарий противоречили новой модели, их не нужно было сохранять «на всякий случай». Их можно было убрать.",[12,1542,1543],{},"Это не сделало работу маленькой. Зато она стала честнее.",[12,1545,1546],{},"Вместо вопроса «как сохранить все старые сценарии?» появился другой:",[25,1548,1549],{},[12,1550,1551],{},"Какая модель нужна продукту сейчас и какие границы в ней нельзя размывать?",[12,1553,1554],{},"Основой стала понятная последовательность: исходный запрос превращается в сервисный запрос, затем в заказ конкретного автосервиса. История изменений заказа сохраняется отдельно, чтобы новые правки не переписывали прошлое задним числом.",[12,1556,1557],{},"Когда процесс определён, проще задать остальные границы:",[47,1559,1560,1563,1566,1569,1572,1575,1578],{},[50,1561,1562],{},"кому принадлежит заказ;",[50,1564,1565],{},"кто имеет право его увидеть;",[50,1567,1568],{},"кто меняет статус;",[50,1570,1571],{},"что может делать сервис;",[50,1573,1574],{},"что относится к работе механика;",[50,1576,1577],{},"какие данные должен видеть владелец автомобиля;",[50,1579,1580],{},"где проходит граница между организациями.",[12,1582,1583],{},"Это не универсальная схема для любого продукта. Но для нашей платформы она стала опорой, от которой можно проверять решения.",[39,1585,1587],{"id":1586},"разные-роли-не-должны-жить-в-одном-кабинете","Разные роли не должны жить в одном кабинете",[12,1589,1590],{},"На ранней стадии продукта хочется собрать всё в одном интерфейсе. Кажется, что так быстрее: один фронтенд, одна навигация, а лишние пункты меню можно скрывать в зависимости от роли.",[12,1592,1593],{},"Проблема в том, что скрытое меню не создаёт границ.",[12,1595,1596],{},"Владелец автомобиля, сотрудник сервиса, механик и платформенный администратор смотрят на один и тот же заказ по-разному. У них разные задачи, разный объём информации и разная цена ошибки.",[12,1598,1599],{},"Поэтому я разделил эти сценарии.",[12,1601,1602],{},"Публичная часть рассказывает о сервисе и ведёт человека в нужный путь.",[12,1604,1605],{},"Кабинет владельца автомобиля нужен для его машин, заявок и истории обслуживания.",[12,1607,1608],{},"Рабочее пространство автосервиса предназначено для заказов, клиентов, автомобилей, документов, сотрудников и внутренних процессов организации.",[12,1610,1611],{},"Рабочее место механика намеренно уже. Механик должен видеть назначенные ему работы, а не всю коммерческую и клиентскую информацию сервиса.",[12,1613,1614],{},"Отдельно существует платформенное администрирование. Это не кабинет автосервиса с дополнительными кнопками, а контур управления самой платформой.",[12,1616,1617],{},"Такое разделение добавляет работы на старте. Зато у каждого интерфейса появляется простой вопрос:",[25,1619,1620],{},[12,1621,1622],{},"Что этот человек должен сделать здесь сейчас?",[12,1624,1625],{},"Если на него нет ясного ответа, экран или действие, вероятно, лишние.",[39,1627,1629],{"id":1628},"роль-это-не-настройка-интерфейса","Роль — это не настройка интерфейса",[12,1631,1632],{},"При переходе к SaaS легко принять визуальные ограничения за настоящую защиту.",[12,1634,1635],{},"Например, можно скрыть от механика кнопку редактирования. Это полезно для интерфейса, но ничего не гарантирует, если сервер всё равно принимает запрос.",[12,1637,1638],{},"Поэтому правила должны работать не только на экране. Система сама определяет, кто выполняет действие, к какой организации относится пользователь, в каком рабочем контексте он находится и имеет ли право на конкретный запрос.",[12,1640,1641],{},"Интерфейс помогает человеку не ошибиться. Окончательное решение остаётся за сервером.",[12,1643,1644],{},"То же относится к данным. Если механику не нужны финансовые сведения, лишние данные клиента или служебные поля, их не стоит просто прятать в интерфейсе. Они не должны попадать в его рабочий набор данных вовсе.",[12,1646,1647],{},"Это не попытка усложнить продукт. Это нормальная дисциплина для системы, где рядом работают разные организации и разные роли.",[39,1649,1651],{"id":1650},"почему-я-не-стал-переписывать-всё-одним-заходом","Почему я не стал переписывать всё одним заходом",[12,1653,1654],{},"Большие переделки часто ломаются не потому, что команда не умеет писать код. Они ломаются, когда изменения невозможно проверить по частям.",[12,1656,1657],{},"Поэтому переход я разделил на шесть волн разработки.",[12,1659,1660],{},"Сначала нужно было зафиксировать доменную модель и убрать то, что конфликтовало с ней. Затем отдельно выстраивались сценарии доступа, жизненный цикл заказов, интерфейсы разных ролей, операционный контур и выпуск.",[12,1662,1663],{},"У каждой волны был свой проверяемый вопрос.",[12,1665,1666],{},"Не «готов ли уже весь продукт?», а, например:",[47,1668,1669,1672,1675,1678,1681,1684,1687],{},[50,1670,1671],{},"работают ли организации только со своими данными;",[50,1673,1674],{},"не остались ли активные сценарии прежней модели;",[50,1676,1677],{},"можно ли получить доступ к чужому заказу прямым запросом;",[50,1679,1680],{},"не выдаёт ли публичная ссылка лишнюю информацию;",[50,1682,1683],{},"сохраняется ли история изменений;",[50,1685,1686],{},"видит ли механик только назначенные ему работы;",[50,1688,1689],{},"можно ли развернуть новую версию и подтвердить её состояние без ручных действий на сервере.",[12,1691,1692],{},"Каждая волна должна была заканчиваться не отчётом о проделанной работе, а доказательствами: тестами, сборкой, проверкой схемы данных, проверкой прав доступа, отсутствием устаревших маршрутов и проверкой выпуска.",[12,1694,1695],{},"AI-агенты здесь заметно ускорили работу. Они помогали параллельно исследовать разные части проекта, находить старые зависимости, готовить проверки и проверять достижимость маршрутов.",[12,1697,1698],{},"Но направление и приёмка оставались за мной.",[12,1700,1701],{},"Агент может предложить изменение или сообщить, что задача завершена. Он не решает, какую старую сущность нужно сохранить, где проходит продуктовая граница между ролями и достаточно ли доказательств перед выпуском. Его отчёт остаётся гипотезой, пока я не проверю код, тесты и фактическое поведение системы.",[39,1703,1705],{"id":1704},"временные-решения-быстро-становятся-постоянными","Временные решения быстро становятся постоянными",[12,1707,1708],{},"Во время большого перехода постоянно хочется сказать: «Пока оставим старое, потом разберёмся».",[12,1710,1711],{},"Иногда это необходимо. Если в системе уже есть пользователи, исторические данные и обязательства, переход должен быть осторожным.",[12,1713,1714],{},"Но когда продукт ещё можно менять свободно, временная совместимость быстро обрастает постоянными ветками.",[12,1716,1717],{},"Остаётся старый маршрут «на всякий случай». Прежняя сущность продолжает использоваться в одном экране. Новый сценарий начинает принимать два формата данных. В интерфейсе появляется переключатель между старым и новым поведением.",[12,1719,1720],{},"Через несколько месяцев трудно объяснить, что из этого действительно нужно продукту, а что просто осталось от незавершённого переезда.",[12,1722,1723],{},"Я старался не поддерживать старую модель там, где она мешала новой. Это помогло упростить не презентацию, а реальное поведение системы: убрать лишние ветки, исключения и правила, которые держатся только на памяти людей, работавших с проектом раньше.",[39,1725,1727],{"id":1726},"production-тоже-часть-продукта","Production — тоже часть продукта",[12,1729,1730],{},"После того как код написан и тесты проходят, легко решить, что работа закончена.",[12,1732,1733],{},"На самом деле начинается другой этап.",[12,1735,1736],{},"Для SaaS недостаточно, чтобы проект собирался на локальной машине. Нужно понимать, как он запускается, где хранятся данные, какие сервисы доступны извне, как разделены окружения, что произойдёт при ошибке и как подтвердить, что новая версия действительно работает.",[12,1738,1739],{},"Поэтому выпуск я проверял отдельно.",[12,1741,1742],{},"До него были резервные копии и подготовленный путь отката. После него — состояние процессов, доступность публичных точек входа, целостность базы и отсутствие открытых наружу внутренних сервисов.",[12,1744,1745],{},"Это не самая заметная часть работы. Её не покажешь красивым скриншотом. Но именно здесь становится понятно, есть ли перед тобой продукт или просто набор исходников.",[12,1747,1748],{},"Переход на мультитенантную модель завершён. Платформа работает как единый SaaS-продукт, а не как кодовая база для множества самостоятельных установок.",[39,1750,1752],{"id":1751},"что-дальше","Что дальше",[12,1754,1755],{},"На этом работа не закончилась.",[12,1757,1758],{},"Переход на SaaS решил одну большую задачу: теперь продукт построен как единая платформа с разделёнными организациями, ролями и рабочими сценариями.",[12,1760,1761],{},"Но архитектурная готовность не означает, что интерфейс уже идеален.",[12,1763,1764],{},"Сейчас я отдельно переделываю UI. Это другая работа: как сделать сложную систему понятной для владельца автомобиля, сотрудника сервиса, механика и администратора платформы. Когда там появится материал, которым можно делиться, я расскажу об этом отдельно.",[12,1766,1767],{},"Эта история для меня не только про автосервисы и мультитенантность.",[12,1769,1770],{},"Она про момент, когда нужно признать: первоначальная версия продукта выполнила свою задачу, но больше не подходит следующей версии замысла.",[12,1772,1773],{},"В такой момент не всегда нужно аккуратно развивать то, что уже есть. Иногда честнее заново определить основу, разделить переход на проверяемые части и оставить в системе только то, что действительно нужно будущему продукту.",[12,1775,1776,1777,1780],{},"Если вы тоже переводите продукт из самостоятельных установок в единый сервис, ",[94,1778,1779],{"href":791},"напишите мне",". Я помогу разобрать границы данных, ролей, сценариев доступа и выпусков, которые стоит определить до того, как переход обрастёт временной совместимостью.",{"title":113,"searchDepth":794,"depth":794,"links":1782},[1783,1784,1785,1786,1787,1788,1789,1790],{"id":1479,"depth":794,"text":1480},{"id":1530,"depth":794,"text":1531},{"id":1586,"depth":794,"text":1587},{"id":1628,"depth":794,"text":1629},{"id":1650,"depth":794,"text":1651},{"id":1704,"depth":794,"text":1705},{"id":1726,"depth":794,"text":1727},{"id":1751,"depth":794,"text":1752},"Почему я отказался от модели самостоятельных open-source установок и как перевёл разрабатываемую платформу автосервисов на мультитенантный SaaS.",{},"\u002Fblog\u002F2026-08-13-ot-open-source-k-multitenant-saas",{"title":1453,"description":1791},"Как перевести продукт из open-source в мультитенантный SaaS","blog\u002F2026-08-13-ot-open-source-k-multitenant-saas",[829,1798,1178,1799],"saas","автосервисы","QLNoN3ETI4iw7QvXpguCi0hvXZYrCiW1LW-LzCHlakY",{"id":1802,"title":1803,"acrostic":7,"body":1804,"date":2867,"description":2868,"duration":7,"emoji":7,"extension":816,"faq":7,"featured":817,"format":7,"image":7,"level":7,"media":7,"meta":2869,"navigation":819,"path":2870,"price":7,"schedule":7,"seo":2871,"seoTitle":2872,"serviceType":7,"status":7,"stem":2873,"tags":2874,"tech":7,"toc":819,"url":7,"__hash__":2878},"blog\u002Fblog\u002F2026-08-12-lichnyy-sayt-ai-agenty.md","Личный сайт в эпоху AI-агентов: как запустить и развивать его без хаоса",{"type":9,"value":1805,"toc":2838},[1806,1809,1812,1815,1818,1821,1825,1845,1849,1852,1855,1858,1861,1866,1869,1872,1875,1879,1882,1885,1939,1942,1947,1950,1954,1957,1960,1963,1983,1986,1989,1994,1997,2001,2007,2010,2014,2017,2020,2023,2040,2043,2047,2053,2056,2060,2063,2066,2069,2123,2126,2129,2134,2138,2144,2148,2151,2154,2208,2211,2214,2218,2221,2224,2241,2247,2250,2253,2270,2273,2276,2280,2287,2290,2307,2310,2313,2318,2321,2326,2329,2333,2336,2347,2546,2549,2553,2559,2562,2566,2569,2573,2579,2583,2589,2593,2599,2603,2606,2609,2612,2656,2659,2663,2666,2720,2723,2726,2729,2733,2736,2806,2809,2813,2816,2819,2822,2825,2828,2834],[12,1807,1808],{},"Личный сайт легко представить как разовую задачу: купить домен, выбрать шаблон, написать «обо мне», добавить контакты — и наконец-то поставить галочку.",[12,1810,1811],{},"Но через несколько месяцев оказывается, что на сайте висит старая услуга, в проектах не видно последних работ, блог ждёт первую публикацию, а форму связи страшно трогать, потому что непонятно, кто и как её настраивал.",[12,1813,1814],{},"С появлением AI-агентов проблема не исчезла. Сайт стало проще быстро собрать, написать для него тексты и даже развернуть на сервере. Но скорость не гарантирует, что он окажется полезным, узнаваемым и живым. За вечер агент способен предложить структуру, сгенерировать блоки и составить план публикаций. С той же скоростью он может наполнить сайт общими словами, выдуманными кейсами и разделами, которые никто не будет поддерживать.",[12,1816,1817],{},"Поэтому для меня личный сайт — не «страница о себе» и не демонстрация того, что AI умеет писать код. Это рабочая площадка, где постепенно собираются проекты, мысли, доказательства опыта и поводы начать разговор.",[12,1819,1820],{},"AI здесь не заменяет автора. Он помогает превратить живой опыт в материал, проверить повторяющиеся вещи и поддерживать ритм обновлений. Но цель сайта, факты, интонация и решение о публикации остаются за человеком.",[39,1822,1824],{"id":1823},"коротко","Коротко",[47,1826,1827,1830,1833,1836,1839,1842],{},[50,1828,1829],{},"Сначала нужно определить роль сайта: что посетитель должен понять и сделать, а не выбирать шаблон.",[50,1831,1832],{},"Лучшая основа для статьи или кейса часто появляется не в пустом документе, а в голосовой заметке после работы, встречи или мысли в дороге.",[50,1834,1835],{},"Агент может расшифровать запись, выделить структуру, подготовить черновик и проверить материал, но не должен придумывать факты и публиковать без подтверждения.",[50,1837,1838],{},"Первую версию сайта стоит ограничить несколькими рабочими сценариями: понять, чем я занимаюсь, увидеть результаты, прочитать материалы и связаться.",[50,1840,1841],{},"Для собственного сайта я рекомендую Nuxt: он даёт серверный рендеринг, хорошую основу для SEO, Markdown-контент и возможность добавлять формы и интеграции без смены платформы.",[50,1843,1844],{},"Сайт лучше размещать на контролируемом VPS или выделенном сервере, а обновления проводить по понятному, проверяемому процессу.",[39,1846,1848],{"id":1847},"сайт-не-визитка-а-собственная-площадка","Сайт — не визитка, а собственная площадка",[12,1850,1851],{},"Социальные сети, мессенджеры, площадки для портфолио и агрегаторы полезны. Они помогают знакомиться, получать внимание и поддерживать связь. Но правила там всегда чужие: меняется алгоритм, исчезает формат, публикация уходит глубоко в ленту, а аккаунт может попасть под ограничения.",[12,1853,1854],{},"Сайт не отменяет эти каналы. Он связывает их между собой.",[12,1856,1857],{},"В коротком посте я могу оставить одну мысль и привести человека к подробной статье. В описании проекта — показать не только красивый скриншот, но и задачу, ход решения, ограничения и результат. На странице услуг — объяснить, в каком формате начинается работа. В контактах — предложить простой путь к разговору.",[12,1859,1860],{},"Поэтому до дизайна и кода я бы зафиксировал роль сайта одной фразой. Например:",[25,1862,1863],{},[12,1864,1865],{},"Помочь посетителю быстро понять, чем я занимаюсь, увидеть реальные работы и материалы, а затем выбрать следующий шаг: написать, обсудить проект или вернуться за новой заметкой.",[12,1867,1868],{},"Это не рекламный слоган, а критерий для следующих решений.",[12,1870,1871],{},"Если хочется добавить новый раздел, я могу спросить: он помогает посетителю пройти нужный маршрут или просто кажется хорошей идеей? Если хочется переделать главную, станет ли яснее, что здесь происходит? Если ответ неясен, вероятно, задача ещё не проработана.",[12,1873,1874],{},"Без этой опоры личный сайт быстро превращается в склад блоков: проекты, навыки, сертификаты, отзывы, блог, восемь иконок, анимация и ссылка на мессенджер. Формально всё на месте, но человеку по-прежнему непонятно, зачем он сюда пришёл.",[39,1876,1878],{"id":1877},"распределить-роли-автор-агент-и-работающая-система","Распределить роли: автор, агент и работающая система",[12,1880,1881],{},"AI-агенты особенно полезны там, где нужно быстро разобрать много материала, подготовить несколько вариантов или не забыть повторяющуюся проверку. Но они не получают автоматически право решать, что является правдой обо мне и моём деле.",[12,1883,1884],{},"Я разделяю ответственность так:",[298,1886,1887,1897],{},[301,1888,1889],{},[304,1890,1891,1894],{},[307,1892,1893],{},"За автором",[307,1895,1896],{},"Можно поручить AI-помощнику",[313,1898,1899,1907,1915,1923,1931],{},[304,1900,1901,1904],{},[318,1902,1903],{},"Цель сайта, аудитория и позиционирование",[318,1905,1906],{},"Исследование структуры похожих сайтов и сценариев посетителя",[304,1908,1909,1912],{},[318,1910,1911],{},"Факты, реальные проекты, обещания и границы",[318,1913,1914],{},"Расшифровка голосовых заметок и выделение тем",[304,1916,1917,1920],{},[318,1918,1919],{},"Личный голос и финальная редактура",[318,1921,1922],{},"План статьи, варианты заголовков, черновик из моих материалов",[304,1924,1925,1928],{},[318,1926,1927],{},"Решение о публикации",[318,1929,1930],{},"Проверка ссылок, метаданных, доступности и чек-листа",[304,1932,1933,1936],{},[318,1934,1935],{},"Доступы, production и рискованные изменения",[318,1937,1938],{},"Сборка, тесты, отчёт об изменённых файлах и рисках",[12,1940,1941],{},"Такое разделение не означает, что агенту нельзя доверять. Оно делает доверие понятным: я вижу, какую часть работы он ускоряет и где решение должен принять я.",[25,1943,1944],{},[12,1945,1946],{},"Агентский отчёт — это полезная гипотеза. Доказательством он становится после проверки текста, кода, публичной страницы или нужного пользовательского сценария.",[12,1948,1949],{},"Это особенно важно для личного сайта. Один выдуманный результат в кейсе подрывает доверие сильнее, чем отсутствие десятка красивых карточек. Одна сломанная форма связи может стоить реального разговора. А одна самовольная публикация превращает помощника в источник риска.",[39,1951,1953],{"id":1952},"начинать-статью-можно-с-голосовой-заметки","Начинать статью можно с голосовой заметки",[12,1955,1956],{},"Самая трудная часть регулярных обновлений сайта часто не техническая. Нужно сесть перед пустым документом и собрать мысли в связный текст. После рабочего дня, встречи или сложного проекта на это обычно не хватает времени — хотя именно тогда в голове есть живые детали.",[12,1958,1959],{},"Поэтому я считаю голосовую заметку хорошей стартовой точкой.",[12,1961,1962],{},"Можно открыть диктофон и за несколько минут проговорить:",[47,1964,1965,1968,1971,1974,1977,1980],{},[50,1966,1967],{},"что произошло;",[50,1969,1970],{},"какая была задача;",[50,1972,1973],{},"почему она оказалась непростой;",[50,1975,1976],{},"какое решение я выбрал;",[50,1978,1979],{},"что сработало или не сработало;",[50,1981,1982],{},"какой вывод может быть полезен другому человеку.",[12,1984,1985],{},"Не нужно пытаться говорить литературно. На этом этапе важнее сохранить ход мысли, конкретные обстоятельства и собственную интонацию. Голосом часто легче сказать: «я сначала думал так, но потом увидел вот это», чем немедленно превратить опыт в гладкий текст.",[12,1987,1988],{},"Дальше появляется понятный маршрут:",[25,1990,1991],{},[12,1992,1993],{},"рабочее событие или мысль → голосовая заметка → расшифровка → структура от агента → проверка фактов автором → черновик → техническая проверка → публикация.",[12,1995,1996],{},"Расшифровка — не готовая статья. В ней будут повторы, обрывки фраз, оговорки и мысли, которые хорошо звучат в разговоре, но не обязаны попадать в публичный текст. Это сырьё с реальным материалом, а не попытка AI заполнить тишину общими фразами.",[152,1998,2000],{"id":1999},"промпт-из-голосовой-расшифровки-в-план-и-черновик","Промпт: из голосовой расшифровки в план и черновик",[107,2002,2005],{"className":2003,"code":2004,"language":112,"meta":1122},[110],"Я дам тебе расшифровку моей голосовой заметки для личного сайта.\n\nТвоя задача:\n1. Выделить главную мысль, целевую аудиторию и практическую пользу.\n2. Отделить подтверждённые факты от личных оценок,\n   предположений и мест, которые нужно уточнить.\n3. Предложить 4–6 информативных заголовков без кликбейта.\n4. Собрать подробный план статьи.\n5. Подготовить черновик от первого лица, сохраняя мою интонацию.\n\nОграничения:\n- Не выдумывай факты, кейсы, цифры, клиентов или результаты.\n- Не заменяй конкретику общими рекламными формулировками.\n- Не публикуй и не меняй файлы.\n- Если материала недостаточно, сначала задай точные вопросы.\n\nФормат ответа:\n1. Главная мысль.\n2. Что требует уточнения.\n3. Варианты заголовка.\n4. План.\n5. Черновик.\n",[62,2006,2004],{"__ignoreMap":113},[12,2008,2009],{},"Перед публикацией я всё равно проверяю имена, даты, цифры, обещания, описание результатов и собственную интонацию. Агент может хорошо структурировать мысль, но не знает без моей проверки, какая деталь конфиденциальна, какой пример можно вынести публично и где я сам ещё сомневаюсь.",[39,2011,2013],{"id":2012},"сначала-бриф-потом-страницы","Сначала бриф, потом страницы",[12,2015,2016],{},"У сайта личного бренда есть простая задача: помочь человеку быстро сориентироваться. Но для каждого автора конкретный маршрут будет своим.",[12,2018,2019],{},"Кому-то нужно собирать заявки на услуги. Кому-то — показывать опыт, чтобы проще проходить собеседования и начинать партнёрства. Кому-то важнее регулярно публиковать материалы и строить вокруг них профессиональное сообщество.",[12,2021,2022],{},"Прежде чем открывать редактор или давать агенту команду «сделай сайт», я бы ответил на несколько вопросов:",[166,2024,2025,2028,2031,2034,2037],{},[50,2026,2027],{},"Для кого сайт?",[50,2029,2030],{},"Что этот человек должен понять за первую минуту?",[50,2032,2033],{},"Какое действие для него главное: написать, оставить заявку, изучить проекты, прочитать материал, записаться на обучение?",[50,2035,2036],{},"Какие доказательства у меня уже есть: проекты, отзывы, заметки, выступления, продукты?",[50,2038,2039],{},"Что сознательно не входит в первую версию?",[12,2041,2042],{},"Последний вопрос часто спасает запуск. Он не даёт превратить небольшой сайт в бесконечный проект с личным кабинетом, каталогом, десятками пустых разделов и космическим кораблём на первом экране.",[152,2044,2046],{"id":2045},"промпт-интервью-для-брифа-сайта","Промпт: интервью для брифа сайта",[107,2048,2051],{"className":2049,"code":2050,"language":112,"meta":1122},[110],"Помоги мне подготовить бриф для личного сайта.\n\nПроведи интервью: задавай по одному короткому вопросу за раз.\nСначала выясни:\n- кому нужен сайт;\n- что посетитель должен понять за первую минуту;\n- какое действие для него главное;\n- какие проекты, услуги, материалы и доказательства уже есть;\n- что не входит в первую версию;\n- кто и как будет обновлять сайт после запуска.\n\nПравила:\n- Не предлагай дизайн и технологии, пока не собран смысловой бриф.\n- Не придумывай опыт, отзывы, результаты или позиционирование вместо меня.\n- Если я отвечаю расплывчато, задай уточняющий вопрос с примером выбора.\n\nВ финале подготовь:\n1. Цель сайта в одной фразе.\n2. Портреты основных посетителей.\n3. Три–пять ключевых сценариев.\n4. Состав первой версии.\n5. Список недостающих материалов.\n6. Риски и открытые вопросы.\n",[62,2052,2050],{"__ignoreMap":113},[12,2054,2055],{},"Такой промпт полезен не только в разговоре с агентом. Он заставляет сформулировать то, что обычно остаётся в голове, а потом превращается в противоречивые пожелания к дизайну.",[39,2057,2059],{"id":2058},"первая-версия-должна-работать-а-не-казаться-полной","Первая версия должна работать, а не казаться полной",[12,2061,2062],{},"Есть соблазн сначала сделать «полный» сайт: собрать все проекты за десять лет, написать большую биографию, найти идеальные фотографии, придумать страницу для каждой услуги, перенести старые тексты и ещё добавить несколько функций на будущее.",[12,2064,2065],{},"Так сайт начинает выглядеть серьёзно — и долго не выходит к людям.",[12,2067,2068],{},"Я бы запускал первую версию, когда она честно и понятно решает несколько главных сценариев:",[298,2070,2071,2081],{},[301,2072,2073],{},[304,2074,2075,2078],{},[307,2076,2077],{},"Сценарий посетителя",[307,2079,2080],{},"Что должно быть на сайте",[313,2082,2083,2091,2099,2107,2115],{},[304,2084,2085,2088],{},[318,2086,2087],{},"Человек впервые видит ссылку",[318,2089,2090],{},"Ясная главная страница: кто я и чем занимаюсь",[304,2092,2093,2096],{},[318,2094,2095],{},"Потенциальный клиент оценивает опыт",[318,2097,2098],{},"Несколько конкретных проектов, подход и удобный контакт",[304,2100,2101,2104],{},[318,2102,2103],{},"Коллега или читатель хочет понять мой взгляд",[318,2105,2106],{},"Заметки, статьи, выступления или другие материалы",[304,2108,2109,2112],{},[318,2110,2111],{},"Человек возвращается позже",[318,2113,2114],{},"Признаки живого сайта: актуальные проекты и новые публикации",[304,2116,2117,2120],{},[318,2118,2119],{},"Нужен конкретный ответ",[318,2121,2122],{},"Быстрый путь к услуге, статье или форме связи",[12,2124,2125],{},"Для старта обычно достаточно главной, проектов, заметок и контактов. Услуги, обучение, музыка, стихи или другие разделы стоит добавлять не потому, что «так бывает у личных сайтов», а когда они поддерживают реальную часть моей работы.",[12,2127,2128],{},"Вместо двадцати поверхностных карточек лучше показать три проекта, о которых можно рассказать по существу. Вместо биографии на пять экранов — несколько точных абзацев. Вместо блока «скоро здесь будет блог» — одна содержательная заметка, у которой есть авторская мысль.",[25,2130,2131],{},[12,2132,2133],{},"Первая версия сайта должна быть достаточно маленькой, чтобы её запустить, и достаточно содержательной, чтобы за неё не было неловко.",[152,2135,2137],{"id":2136},"промпт-карта-первой-версии-сайта","Промпт: карта первой версии сайта",[107,2139,2142],{"className":2140,"code":2141,"language":112,"meta":1122},[110],"На основе моего утверждённого брифа предложи первую версию личного сайта.\n\nНужен не дизайн и не код, а рабочая карта:\n- страницы и их роль;\n- главные сценарии посетителя;\n- содержание каждого первого экрана;\n- обязательные материалы, которые нужно подготовить;\n- что можно отложить после запуска;\n- риски, если какой-то раздел будет пустым или неподтверждённым.\n\nПриоритизируй решения по принципу:\nсначала понятность предложения, реальные доказательства опыта\nи простой способ связаться; затем декоративные и необязательные элементы.\n\nНе выдумывай кейсы, статистику и отзывы.\nВ конце составь короткий список задач на первую неделю.\n",[62,2143,2141],{"__ignoreMap":113},[39,2145,2147],{"id":2146},"содержание-появляется-раньше-финального-дизайна","Содержание появляется раньше финального дизайна",[12,2149,2150],{},"Иногда работу строят так: сначала дизайн, потом вёрстка, потом настройка, а в конце кто-то срочно заполняет страницы текстами. Обычно это видно: заголовки получаются общими, карточки — одинаковыми, а раздел «обо мне» состоит из слов «опытный», «креативный» и «ответственный».",[12,2152,2153],{},"Я бы собрал хотя бы черновое содержание до финального интерфейса. Не идеальные тексты, а ясные ответы на вопросы:",[298,2155,2156,2166],{},[301,2157,2158],{},[304,2159,2160,2163],{},[307,2161,2162],{},"Раздел",[307,2164,2165],{},"Вопрос, на который он отвечает",[313,2167,2168,2176,2184,2192,2200],{},[304,2169,2170,2173],{},[318,2171,2172],{},"Главная",[318,2174,2175],{},"Кто я и почему здесь стоит задержаться?",[304,2177,2178,2181],{},[318,2179,2180],{},"Проекты",[318,2182,2183],{},"Какие задачи я умею доводить до результата?",[304,2185,2186,2189],{},[318,2187,2188],{},"Услуги или обучение",[318,2190,2191],{},"В каком формате можно работать вместе?",[304,2193,2194,2197],{},[318,2195,2196],{},"Заметки",[318,2198,2199],{},"Как я думаю, принимаю решения и объясняю сложное?",[304,2201,2202,2205],{},[318,2203,2204],{},"Контакты",[318,2206,2207],{},"Как начать разговор без лишних препятствий?",[12,2209,2210],{},"Тогда интерфейс помогает содержанию, а не заставляет его подстраиваться под случайный шаблон.",[12,2212,2213],{},"AI здесь хорошо работает как редактор и исследователь. Он может заметить повторы, предложить порядок, показать места без фактов и подготовить несколько вариантов заголовка. Но я не поручал бы ему самостоятельно «писать позиционирование»: результат почти наверняка окажется гладким, но слишком похожим на сотни других сайтов.",[39,2215,2217],{"id":2216},"технологии-почему-я-рекомендую-nuxt","Технологии: почему я рекомендую Nuxt",[12,2219,2220],{},"После смысла и содержания приходит вопрос о стеке. В нём легко увязнуть: спорить о правильном фреймворке, CMS, хостинге и количестве библиотек.",[12,2222,2223],{},"Для личного сайта я смотрю на выбор прагматично. Технология должна помогать:",[166,2225,2226,2229,2232,2235,2238],{},[50,2227,2228],{},"быстро и надёжно отдавать страницу посетителю;",[50,2230,2231],{},"удобно публиковать и обновлять материалы;",[50,2233,2234],{},"давать хорошую базу для поисковой видимости;",[50,2236,2237],{},"не превращать небольшую правку в отдельный технический проект;",[50,2239,2240],{},"позволять постепенно добавлять формы и интеграции, когда они действительно понадобятся.",[12,2242,2243,2244,37],{},"Для таких задач я рекомендую ",[34,2245,2246],{},"Nuxt",[12,2248,2249],{},"Nuxt построен на Vue и может рендерить страницы на сервере. Это значит, что посетитель и поисковый робот получают готовый HTML, а не пустую страницу, которую браузер должен сначала собрать из JavaScript. Для личного сайта это помогает скорости первого отображения и создаёт нормальную основу для SEO.",[12,2251,2252],{},"Ещё несколько практических причин:",[47,2254,2255,2258,2261,2264,2267],{},[50,2256,2257],{},"статьи, проекты и другие материалы удобно хранить в Markdown рядом с кодом;",[50,2259,2260],{},"метаданные страницы — title, description, Open Graph, canonical URL и structured data — можно держать в одном понятном процессе;",[50,2262,2263],{},"sitemap можно генерировать автоматически;",[50,2265,2266],{},"публичные страницы, формы и серверные API находятся в одном проекте;",[50,2268,2269],{},"сначала можно сделать спокойный контентный сайт, а затем добавить заявки, интеграции или небольшую админку без переезда на другую платформу.",[12,2271,2272],{},"Nuxt не делает SEO автоматически. Он даёт нужные механизмы, но название страницы, описание, понятная структура, реальные материалы, скорость, доступность и последующая проверка всё равно остаются работой автора и разработчика.",[12,2274,2275],{},"Markdown тоже не решает всё сам. Он хорош, когда у сайта есть понятный процесс редактуры: материал можно написать, увидеть diff, проверить ссылку и сохранить историю изменений. Если автору удобнее работать только в визуальном редакторе и он не хочет иметь дело с Git, нужно сразу предусмотреть другой безопасный путь публикации.",[39,2277,2279],{"id":2278},"где-размещать-сайт-контролируемый-vps-или-выделенный-сервер","Где размещать сайт: контролируемый VPS или выделенный сервер",[12,2281,2282,2283,2286],{},"Сайт лучше размещать в инфраструктуре, которой я могу управлять. На практике для личного сайта обычно достаточно надёжного ",[34,2284,2285],{},"VPS"," — выделенного виртуального сервера. Для более требовательной системы или при особых требованиях можно использовать физический выделенный сервер.",[12,2288,2289],{},"Дело не в том, чтобы любой личный сайт обязательно жил на большой машине. Дело в контроле:",[47,2291,2292,2295,2298,2301,2304],{},[50,2293,2294],{},"домен, доступы и конфигурация принадлежат владельцу сайта;",[50,2296,2297],{},"можно подключать формы, почту, webhooks, CRM и другие интеграции;",[50,2299,2300],{},"есть понятная резервная копия и возможность восстановиться;",[50,2302,2303],{},"можно управлять обновлениями, а не ждать, пока конструктор поменяет правила;",[50,2305,2306],{},"инфраструктура не ограничивает развитие сайта одним набором возможностей.",[12,2308,2309],{},"При этом собственный сервер требует дисциплины. Нужно следить за обновлениями системы, резервными копиями, TLS-сертификатами, журналами, доступами и состоянием приложения. Если эти обязанности никто не берёт на себя, «свой сервер» быстро превращается не в свободу, а в забытый ящик с паролями.",[12,2311,2312],{},"Я бы придерживался простого правила:",[25,2314,2315],{},[12,2316,2317],{},"Сервер должен применять подготовленную версию сайта. В полночь не стоит дописывать на нём код и исправлять текст напрямую.",[12,2319,2320],{},"Нормальный путь обновления выглядит так:",[25,2322,2323],{},[12,2324,2325],{},"изменение в исходном коде или контенте → проверка → зафиксированная версия → публикация именно этой версии → health-check → проверка публичной страницы.",[12,2327,2328],{},"Так проще ответить на важные вопросы: какая версия сейчас работает, что именно изменилось, открывается ли новый маршрут и куда вернуться, если после публикации что-то пошло не так.",[39,2330,2332],{"id":2331},"настроить-ai-агента-как-участника-проекта","Настроить AI-агента как участника проекта",[12,2334,2335],{},"Агент работает заметно лучше, когда у него есть актуальный контекст. Не многотомная энциклопедия, а короткий документ с ответами на главные вопросы до начала работы.",[12,2337,2338,2339,2342,2343,2346],{},"Его можно назвать ",[62,2340,2341],{},"PROJECT_CONTEXT.md",", ",[62,2344,2345],{},"CLAUDE.md"," или иначе — название не главное. Важно содержание:",[107,2348,2351],{"className":2349,"code":2350,"language":816,"meta":113,"style":113},"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",[62,2352,2353,2362,2367,2372,2379,2385,2390,2396,2402,2407,2413,2419,2425,2430,2436,2446,2454,2462,2470,2475,2481,2489,2497,2505,2513,2518,2524,2532,2538],{"__ignoreMap":113},[2354,2355,2358],"span",{"class":2356,"line":2357},"line",1,[2354,2359,2361],{"class":2360},"sq-ep","# Контекст личного сайта\n",[2354,2363,2364],{"class":2356,"line":794},[2354,2365,2366],{"emptyLinePlaceholder":819},"\n",[2354,2368,2369],{"class":2356,"line":800},[2354,2370,2371],{"class":2360},"## Цель\n",[2354,2373,2375],{"class":2356,"line":2374},4,[2354,2376,2378],{"class":2377},"sVt8B","Помогать посетителю понять, чем я занимаюсь, увидеть реальные работы\n",[2354,2380,2382],{"class":2356,"line":2381},5,[2354,2383,2384],{"class":2377},"и выбрать следующий шаг: написать, обсудить проект или прочитать материал.\n",[2354,2386,2388],{"class":2356,"line":2387},6,[2354,2389,2366],{"emptyLinePlaceholder":819},[2354,2391,2393],{"class":2356,"line":2392},7,[2354,2394,2395],{"class":2360},"## Аудитория\n",[2354,2397,2399],{"class":2356,"line":2398},8,[2354,2400,2401],{"class":2377},"[Кто обычно приходит на сайт и зачем.]\n",[2354,2403,2405],{"class":2356,"line":2404},9,[2354,2406,2366],{"emptyLinePlaceholder":819},[2354,2408,2410],{"class":2356,"line":2409},10,[2354,2411,2412],{"class":2360},"## Стек\n",[2354,2414,2416],{"class":2356,"line":2415},11,[2354,2417,2418],{"class":2377},"Nuxt, серверный рендеринг, Markdown для статей и проектов,\n",[2354,2420,2422],{"class":2356,"line":2421},12,[2354,2423,2424],{"class":2377},"VPS или выделенный сервер для production.\n",[2354,2426,2428],{"class":2356,"line":2427},13,[2354,2429,2366],{"emptyLinePlaceholder":819},[2354,2431,2433],{"class":2356,"line":2432},14,[2354,2434,2435],{"class":2360},"## Контент\n",[2354,2437,2439,2443],{"class":2356,"line":2438},15,[2354,2440,2442],{"class":2441},"s4XuR","-",[2354,2444,2445],{"class":2377}," Пишем от первого лица.\n",[2354,2447,2449,2451],{"class":2356,"line":2448},16,[2354,2450,2442],{"class":2441},[2354,2452,2453],{"class":2377}," Не выдумываем факты, клиентов, цифры и результаты.\n",[2354,2455,2457,2459],{"class":2356,"line":2456},17,[2354,2458,2442],{"class":2441},[2354,2460,2461],{"class":2377}," Голосовые расшифровки — это исходный материал, не готовая публикация.\n",[2354,2463,2465,2467],{"class":2356,"line":2464},18,[2354,2466,2442],{"class":2441},[2354,2468,2469],{"class":2377}," Автор подтверждает финальный текст перед публикацией.\n",[2354,2471,2473],{"class":2356,"line":2472},19,[2354,2474,2366],{"emptyLinePlaceholder":819},[2354,2476,2478],{"class":2356,"line":2477},20,[2354,2479,2480],{"class":2360},"## Правила изменений\n",[2354,2482,2484,2486],{"class":2356,"line":2483},21,[2354,2485,2442],{"class":2441},[2354,2487,2488],{"class":2377}," Сначала исследование и план, затем минимальное изменение.\n",[2354,2490,2492,2494],{"class":2356,"line":2491},22,[2354,2493,2442],{"class":2441},[2354,2495,2496],{"class":2377}," Не менять production, доступы, секреты и инфраструктуру без отдельной команды.\n",[2354,2498,2500,2502],{"class":2356,"line":2499},23,[2354,2501,2442],{"class":2441},[2354,2503,2504],{"class":2377}," Не расширять задачу «заодно».\n",[2354,2506,2508,2510],{"class":2356,"line":2507},24,[2354,2509,2442],{"class":2441},[2354,2511,2512],{"class":2377}," После работы вернуть список изменённых файлов, проверки, риски и открытые вопросы.\n",[2354,2514,2516],{"class":2356,"line":2515},25,[2354,2517,2366],{"emptyLinePlaceholder":819},[2354,2519,2521],{"class":2356,"line":2520},26,[2354,2522,2523],{"class":2360},"## Публикация\n",[2354,2525,2527,2529],{"class":2356,"line":2526},27,[2354,2528,2442],{"class":2441},[2354,2530,2531],{"class":2377}," Перед публикацией проверить ссылки, метаданные, мобильное отображение\n",[2354,2533,2535],{"class":2356,"line":2534},28,[2354,2536,2537],{"class":2377},"  и основной пользовательский сценарий.\n",[2354,2539,2541,2543],{"class":2356,"line":2540},29,[2354,2542,2442],{"class":2441},[2354,2544,2545],{"class":2377}," Публикация — отдельное подтверждённое действие.\n",[12,2547,2548],{},"Рядом с контекстом полезно вести два разных списка: текущий план и журнал принятых решений. План отвечает на вопрос «что делать дальше», а журнал — «почему когда-то выбрали именно этот путь». Не стоит превращать старые решения в автоматический приказ продолжать работу: сначала их нужно сверить с реальным состоянием сайта.",[152,2550,2552],{"id":2551},"промпт-безопасная-работа-агента-в-существующем-сайте","Промпт: безопасная работа агента в существующем сайте",[107,2554,2557],{"className":2555,"code":2556,"language":112,"meta":1122},[110],"Ты работаешь с существующим личным сайтом.\n\nПеред любыми изменениями:\n1. Прочитай контекст проекта и правила публикации.\n2. Проверь текущую ветку и наличие незакоммиченных изменений.\n3. Установи фактическое состояние по коду, контенту и нужному runtime,\n   а не только по старой документации.\n4. Сначала предложи минимальный план и перечисли риски.\n\nВо время работы:\n- Не выдумывай факты для публичных материалов.\n- Не публикуй сайт, не меняй production, секреты, доступы\n  или инфраструктуру без отдельной команды.\n- Не расширяй scope до соседних улучшений «заодно».\n- Сохраняй авторский голос; спорные места помечай вопросами.\n\nГотовность:\n- список изменённых файлов;\n- результат релевантных проверок;\n- проверенные пользовательские сценарии;\n- оставшиеся риски и действия, которые требуют решения автора.\n",[62,2558,2556],{"__ignoreMap":113},[12,2560,2561],{},"Такой договор делает поведение агента предсказуемым. Он не обязан быть «универсальным исполнителем, который разберётся со всем». Ему нужны ясная цель, границы и форма результата.",[39,2563,2565],{"id":2564},"готовые-промпты-для-регулярных-обновлений","Готовые промпты для регулярных обновлений",[12,2567,2568],{},"После запуска главная задача — не потерять ритм. Я бы не строил контент-план на год вперёд и не обещал публиковать по три материала в неделю. Гораздо полезнее завести простой повторяемый процесс и наполнять его реальными поводами.",[152,2570,2572],{"id":2571},"промпт-новая-заметка-или-кейс-из-рабочих-материалов","Промпт: новая заметка или кейс из рабочих материалов",[107,2574,2577],{"className":2575,"code":2576,"language":112,"meta":1122},[110],"Помоги подготовить новую публикацию для личного сайта.\n\nВот исходные материалы: [вставить голосовую расшифровку, тезисы,\nзаметки, ссылки на подтверждённые материалы].\n\nСначала:\n1. Сформулируй, какую проблему читателя может закрыть публикация.\n2. Отдели подтверждённые факты от непроверенных утверждений.\n3. Покажи, чего не хватает для честного кейса или статьи.\n4. Предложи 4–6 заголовков и рекомендуемый формат:\n   заметка, разбор, кейс, инструкция или FAQ.\n\nТолько после этого подготовь структуру и черновик от первого лица.\n\nНе добавляй несуществующие цифры, клиентов, отзывы или результаты.\nНе публикуй материал и не меняй файлы.\n",[62,2578,2576],{"__ignoreMap":113},[152,2580,2582],{"id":2581},"промпт-аудит-страницы-перед-публикацией","Промпт: аудит страницы перед публикацией",[107,2584,2587],{"className":2585,"code":2586,"language":112,"meta":1122},[110],"Проведи 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",[62,2588,2586],{"__ignoreMap":113},[152,2590,2592],{"id":2591},"промпт-еженедельный-редакторский-обзор","Промпт: еженедельный редакторский обзор",[107,2594,2597],{"className":2595,"code":2596,"language":112,"meta":1122},[110],"Помоги провести еженедельный обзор личного сайта.\n\nЯ дам тебе список событий недели: завершённые задачи, вопросы клиентов,\nголосовые заметки, черновики, новые проекты и изменения услуг.\n\nТвоя задача:\n1. Найти один-два реалистичных повода для обновления сайта.\n2. Для каждого предложить формат: заметка, кейс, обновление проекта,\n   FAQ или изменение страницы услуги.\n3. Объяснить пользу для посетителя.\n4. Указать, какие факты или материалы нужно подтвердить.\n5. Составить небольшой план на следующую неделю.\n\nНе придумывай темы, которых нет в материалах.\nНе публикуй и не меняй сайт.\nПриоритизируй регулярность и содержание, а не количество публикаций.\n",[62,2598,2596],{"__ignoreMap":113},[39,2600,2602],{"id":2601},"цикл-обновлений-не-ждать-большой-темы","Цикл обновлений: не ждать большой темы",[12,2604,2605],{},"Сильный материал часто начинается не с идеи «надо написать статью», а с повторяющегося рабочего момента.",[12,2607,2608],{},"Я дважды объяснил один подход в переписке. Завершил часть проекта. Получил вопрос, на который сайт пока не отвечает. Поменял формат работы. Разобрался с ошибкой, которая может быть полезна другим. Всё это поводы для обновления.",[12,2610,2611],{},"Я бы использовал такой короткий цикл:",[166,2613,2614,2620,2626,2632,2638,2644,2650],{},[50,2615,2616,2619],{},[34,2617,2618],{},"Заметить повод."," Сохранить его голосовой заметкой, тезисом или ссылкой.",[50,2621,2622,2625],{},[34,2623,2624],{},"Собрать исходный материал."," Расшифровать запись, приложить факты, скриншоты, документы или ссылки.",[50,2627,2628,2631],{},[34,2629,2630],{},"Дать агенту структуру."," Попросить выделить пользу, вопросы и возможный формат.",[50,2633,2634,2637],{},[34,2635,2636],{},"Проверить содержание."," Убрать конфиденциальное, подтвердить факты, вернуть собственную интонацию.",[50,2639,2640,2643],{},[34,2641,2642],{},"Проверить техническую часть."," Ссылки, метаданные, мобильное отображение, форму связи, если она затронута.",[50,2645,2646,2649],{},[34,2647,2648],{},"Опубликовать отдельным решением."," Не считать публикацию побочным эффектом редактуры.",[50,2651,2652,2655],{},[34,2653,2654],{},"Сохранить вывод."," Если появился новый процесс, ограничение или полезный вопрос — обновить контекст сайта или checklist.",[12,2657,2658],{},"Тогда блог перестаёт быть обязанностью «вести контент» и становится способом не терять накопленный опыт.",[39,2660,2662],{"id":2661},"сила-проверки-должна-соответствовать-цене-ошибки","Сила проверки должна соответствовать цене ошибки",[12,2664,2665],{},"Не всякая правка требует одинакового ритуала. Исправить опечатку — не то же самое, что поменять форму заявки или деплой-процесс.",[298,2667,2668,2678],{},[301,2669,2670],{},[304,2671,2672,2675],{},[307,2673,2674],{},"Тип изменения",[307,2676,2677],{},"Что проверить",[313,2679,2680,2688,2696,2704,2712],{},[304,2681,2682,2685],{},[318,2683,2684],{},"Текст, иллюстрация, ссылка",[318,2686,2687],{},"Смысл, факты, орфография, рабочая ссылка и отображение",[304,2689,2690,2693],{},[318,2691,2692],{},"Новая статья или проект",[318,2694,2695],{},"Заголовок, описание, структура, SEO-метаданные, mobile и desktop",[304,2697,2698,2701],{},[318,2699,2700],{},"Навигация или интерфейс",[318,2702,2703],{},"Главный пользовательский маршрут, адаптивность, доступность, ссылки",[304,2705,2706,2709],{},[318,2707,2708],{},"Форма или интеграция",[318,2710,2711],{},"Отправка данных, ошибка, защита, доставка заявки и сообщение пользователю",[304,2713,2714,2717],{},[318,2715,2716],{},"Сервер и production-процесс",[318,2718,2719],{},"Точный revision, резервная точка, health-check и проверка публичного маршрута",[12,2721,2722],{},"Это не бюрократия, а способ не тратить час на проверку одной запятой и не публиковать важное изменение со словами «вроде работает».",[12,2724,2725],{},"Особенно важно не давать AI-агенту больше полномочий, чем ему действительно нужны. Для подготовки черновика не нужен доступ к production. Для аудита SEO не нужны секреты. Для проверки страницы часто достаточно read-only доступа и списка маршрутов.",[12,2727,2728],{},"Если ошибка повторилась, я бы не ограничивался новой формулировкой промпта. Лучше оставить защиту: checklist, тест, правило в проектном контексте или короткую инструкцию по проверке. Тогда следующий человек или агент начинает не с той же ошибки, а с опыта, который уже стал частью процесса.",[39,2730,2732],{"id":2731},"что-можно-сделать-в-первую-неделю","Что можно сделать в первую неделю",[12,2734,2735],{},"Запуск не обязательно растягивать на месяцы. Если есть решение и исходные материалы, за первую неделю можно собрать рабочую основу.",[298,2737,2738,2748],{},[301,2739,2740],{},[304,2741,2742,2745],{},[307,2743,2744],{},"День",[307,2746,2747],{},"Результат",[313,2749,2750,2758,2766,2774,2782,2790,2798],{},[304,2751,2752,2755],{},[318,2753,2754],{},"1",[318,2756,2757],{},"Бриф: роль сайта, аудитория, главное действие посетителя",[304,2759,2760,2763],{},[318,2761,2762],{},"2",[318,2764,2765],{},"Карта разделов и три–пять пользовательских сценариев",[304,2767,2768,2771],{},[318,2769,2770],{},"3",[318,2772,2773],{},"Голосовые заметки или черновики для главной, проектов и контактов",[304,2775,2776,2779],{},[318,2777,2778],{},"4",[318,2780,2781],{},"Структура контента и выбор технической основы: Nuxt, домен, VPS или сервер",[304,2783,2784,2787],{},[318,2785,2786],{},"5",[318,2788,2789],{},"Первая версия страниц и проверка на телефоне и компьютере",[304,2791,2792,2795],{},[318,2793,2794],{},"6",[318,2796,2797],{},"Формы, ссылки, базовые SEO-метаданные, доступность и резервная стратегия",[304,2799,2800,2803],{},[318,2801,2802],{},"7",[318,2804,2805],{},"Публикация подготовленной версии, public smoke-проверка и список следующих обновлений",[12,2807,2808],{},"У кого-то первый сайт будет состоять из одной сильной страницы и контактов. У кого-то сразу появятся проекты и несколько заметок. Это нормально. Важнее не количество разделов, а наличие публичного маршрута: человек открывает ссылку, понимает предложение, видит подтверждения и знает, что делать дальше.",[39,2810,2812],{"id":2811},"личный-сайт-становится-сильнее-от-накопления-доверия","Личный сайт становится сильнее от накопления доверия",[12,2814,2815],{},"AI сделал производство текста и кода быстрым. Поэтому особенно заметной становится разница между просто заполненным сайтом и сайтом, в котором есть живой опыт.",[12,2817,2818],{},"Второй не пытается убедить посетителя множеством громких слов. Он постепенно показывает: вот что я делаю, вот как думаю, вот какие вопросы разбираю, вот что изменилось с прошлого раза, вот как со мной можно продолжить разговор.",[12,2820,2821],{},"Голосовые заметки помогают не терять материал в моменте. AI-помощник помогает превратить его в структуру, черновик и проверяемый процесс. Nuxt и контролируемый сервер дают техническую основу, на которой сайт можно спокойно развивать, а не собирать заново при каждой новой задаче.",[12,2823,2824],{},"Но главный актив всё равно не стек и не количество агентов. Это ясный голос автора, реальные факты и привычка возвращаться к сайту с новым содержанием.",[12,2826,2827],{},"Я бы не ждал идеальной версии. Лучше начать с небольшой честной площадки, настроить безопасный цикл обновлений и оставить на ней место для следующей мысли — возможно, уже записанной сегодня в диктофон.",[12,2829,2830,2831,2833],{},"Если вы хотите запустить личный сайт или привести в порядок тот, который давно не обновлялся, ",[94,2832,1779],{"href":791},". Для начала разберём роль сайта, соберём реальные материалы и определим первую версию, которую можно спокойно развивать.",[2835,2836,2837],"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":113,"searchDepth":794,"depth":794,"links":2839},[2840,2841,2842,2843,2846,2849,2852,2853,2854,2855,2858,2863,2864,2865,2866],{"id":1823,"depth":794,"text":1824},{"id":1847,"depth":794,"text":1848},{"id":1877,"depth":794,"text":1878},{"id":1952,"depth":794,"text":1953,"children":2844},[2845],{"id":1999,"depth":800,"text":2000},{"id":2012,"depth":794,"text":2013,"children":2847},[2848],{"id":2045,"depth":800,"text":2046},{"id":2058,"depth":794,"text":2059,"children":2850},[2851],{"id":2136,"depth":800,"text":2137},{"id":2146,"depth":794,"text":2147},{"id":2216,"depth":794,"text":2217},{"id":2278,"depth":794,"text":2279},{"id":2331,"depth":794,"text":2332,"children":2856},[2857],{"id":2551,"depth":800,"text":2552},{"id":2564,"depth":794,"text":2565,"children":2859},[2860,2861,2862],{"id":2571,"depth":800,"text":2572},{"id":2581,"depth":800,"text":2582},{"id":2591,"depth":800,"text":2592},{"id":2601,"depth":794,"text":2602},{"id":2661,"depth":794,"text":2662},{"id":2731,"depth":794,"text":2732},{"id":2811,"depth":794,"text":2812},"2026-08-12","Как запустить сайт личного бренда с AI-помощниками: от голосовой заметки и первой версии до Nuxt, VPS и безопасного цикла обновлений.",{},"\u002Fblog\u002F2026-08-12-lichnyy-sayt-ai-agenty",{"title":1803,"description":2868},"Личный сайт и AI-агенты: запуск и обновления","blog\u002F2026-08-12-lichnyy-sayt-ai-agenty",[825,2875,2876,829,2877],"сайт","личный бренд","контент","1mag4GKjfAApBFcZYVIEnmVkXm2jMWon7oGjPpmm-fM",{"id":2880,"title":2881,"acrostic":7,"body":2882,"date":3776,"description":3777,"duration":7,"emoji":7,"extension":816,"faq":7,"featured":817,"format":7,"image":7,"level":7,"media":7,"meta":3778,"navigation":819,"path":3779,"price":7,"schedule":7,"seo":3780,"seoTitle":7,"serviceType":7,"status":7,"stem":3781,"tags":3782,"tech":7,"toc":819,"url":7,"__hash__":3785},"blog\u002Fblog\u002F2026-08-11-ai-upravlenie-razrabotkoj.md","Управление разработкой с AI-агентом: контекст вместо задач",{"type":9,"value":2883,"toc":3750},[2884,2887,2890,2893,2896,2901,2904,2907,2913,2915,2929,2933,2936,2939,2942,2945,2948,2951,2965,2972,2976,2979,2982,2985,2988,2994,2997,3000,3006,3009,3023,3026,3030,3033,3040,3043,3046,3066,3069,3072,3077,3083,3087,3090,3093,3096,3150,3153,3156,3159,3162,3165,3169,3172,3176,3179,3193,3196,3199,3203,3206,3209,3212,3216,3219,3221,3241,3244,3248,3251,3254,3257,3283,3286,3290,3293,3296,3299,3302,3334,3338,3341,3344,3347,3350,3403,3406,3411,3414,3418,3421,3424,3427,3433,3486,3489,3492,3496,3499,3506,3509,3553,3556,3559,3562,3565,3569,3572,3575,3578,3584,3587,3590,3593,3597,3600,3606,3609,3612,3618,3621,3624,3631,3635,3638,3641,3661,3664,3667,3671,3675,3678,3682,3685,3689,3692,3696,3699,3702,3722,3725,3730,3733,3736,3739,3747],[12,2885,2886],{},"Компании покупают лицензии, объявляют AI-стратегии, считают токены и показывают красивые демо. Потом оказывается, что пользователи не пришли, продукт не решает их задачу, а за результат как будто никто не отвечает: он потерялся между презентацией, подрядчиком и чат-ботом.",[12,2888,2889],{},"Проблема часто не в самой модели, а в слабом управлении разработкой. Если в обычном проекте неясно, что именно строят, для кого и как будут проверять результат, AI этого не исправит. Он лишь позволит ошибаться быстрее.",[12,2891,2892],{},"У меня был другой путь. Я не «внедрял AI в компанию» и не измерял эффективность числом сгенерированных строк. Я начал использовать AI-агента как постоянного участника разработки. Он может исследовать, выполнять ограниченные задачи, проводить ревью, а иногда выступает неприятным собеседником, который заставляет ещё раз объяснить, чего именно я хочу.",[12,2894,2895],{},"И довольно быстро понял простую вещь:",[25,2897,2898],{},[12,2899,2900],{},"AI не отменяет управление разработкой. С ним слабые места управления просто становятся заметнее.",[12,2902,2903],{},"Раньше часть управления можно было держать в голове. Сильному разработчику достаточно сказать: «посмотри, почему не работает фильтр» — и он сам поймёт, в каком сервисе искать, что не трогать, какие данные опасны и где проверить результат.",[12,2905,2906],{},"Агент этого не знает. Не потому, что он глупый. Он просто не живёт внутри моего проекта: не помнит вчерашний разговор у кофемашины, не знает, почему сервер нельзя трогать в середине дня, и не чувствует затылком, что фраза «давайте заодно обновим зависимости» сейчас пахнет трёхдневным приключением.",[12,2908,2909,2910,37],{},"Поэтому я иначе стал ставить задачи. Для каждой заметной работы я собираю ",[34,2911,2912],{},"цель, контекст, ограничения и доказательство готовности",[39,2914,1824],{"id":1823},[47,2916,2917,2920,2923,2926],{},[50,2918,2919],{},"AI одинаково ускоряет порядок и хаос.",[50,2921,2922],{},"Задача для AI-агента должна описывать цель, подтверждённый контекст, границы и доказательство готовности.",[50,2924,2925],{},"Перед production нужен не «зелёный билд», а точный revision, health-check и пользовательская проверка.",[50,2927,2928],{},"Повторившаяся ошибка должна оставлять защиту: тест, инвариант, runbook или обновлённый контекст.",[39,2930,2932],{"id":2931},"ai-ускоряет-и-порядок-и-беспорядок","AI ускоряет и порядок, и беспорядок",[12,2934,2935],{},"Есть удобная сказка: достаточно дать команде хороший AI-инструмент, и производительность вырастет сама. В этой сказке нейросеть сидит рядом, мгновенно пишет код, тесты, документацию и, вероятно, ещё слегка массирует плечи перед релизом.",[12,2937,2938],{},"В реальности AI ускоряет не только полезную работу.",[12,2940,2941],{},"Когда задача сформулирована ясно, агент быстро помогает изучить код, увидеть риски, написать тест, подготовить небольшой патч и проверить его. Если задача туманная, он с такой же скоростью создаёт несколько правдоподобных вариантов неправильного решения.",[12,2943,2944],{},"Если в проекте есть актуальные документы, агент опирается на них и меньше изобретает архитектуру заново. Если документация устарела, он уверенно цитирует вчерашний мир. Это не злой умысел. Просто модель не умеет отличать «документ лежит рядом с кодом» от «документ всё ещё правда» без проверки.",[12,2946,2947],{},"Если у процесса есть понятные ворота перед production, AI помогает проходить их быстрее. Если таких ограничений нет, он может быстро сделать то, чего делать было нельзя.",[12,2949,2950],{},"Поэтому я не считаю, что AI делает разработку проще. Он ускоряет то, что уже есть:",[47,2952,2953,2956,2959,2962],{},[50,2954,2955],{},"ясный процесс;",[50,2957,2958],{},"работающий порядок;",[50,2960,2961],{},"хаос;",[50,2963,2964],{},"последствия плохо поставленной задачи.",[12,2966,2967,2968,2971],{},"Поэтому разговор об AI в разработке для меня начинается с вопроса: ",[34,2969,2970],{},"как у нас устроено принятие решений?"," Выбор модели идёт после.",[39,2973,2975],{"id":2974},"от-сделай-фичу-к-какое-изменение-мы-хотим-получить","От «сделай фичу» к «какое изменение мы хотим получить?»",[12,2977,2978],{},"Фраза «сделай авторизацию» кажется задачей. На самом деле это название целого леса, в котором ещё не проложена ни одна тропинка.",[12,2980,2981],{},"Для кого авторизация? Какие роли существуют? Какие действия должен видеть пользователь, а какие — сервис? Где заканчивается публичный маршрут и начинается внутренний? Можно ли менять существующий контракт? Что происходит со старыми сессиями? Как проверить, что чужой пользователь не получил доступ? И, наконец, можно ли сегодня вообще трогать production?",[12,2983,2984],{},"Пока на эти вопросы нет ответа, агенту нельзя давать задачу: иначе он начнёт отвечать за меня.",[12,2986,2987],{},"Плохая постановка выглядит так:",[107,2989,2992],{"className":2990,"code":2991,"language":112,"meta":1122},[110],"Добавь авторизацию и задеплой.\n",[62,2993,2991],{"__ignoreMap":113},[12,2995,2996],{},"В ней нет цели, нет границ и нет критерия результата. Есть только глагол, который может означать двадцать разных решений.",[12,2998,2999],{},"Нормальная постановка устроена иначе:",[107,3001,3004],{"className":3002,"code":3003,"language":112,"meta":1122},[110],"Нужно закрыть один конкретный сценарий записи данных:\nизменять запись может только её владелец.\n\nСначала установи текущий контракт по коду, тестам и runtime.\nНе расширяй права «на всякий случай» и не меняй публичные маршруты.\nСначала добавь проверку, что другой пользователь получает отказ.\nProduction не трогай.\n\nГотовность: целевой тест, сборка затронутого пакета,\nпроверка diff и список изменённых контрактов.\n",[62,3005,3003],{"__ignoreMap":113},[12,3007,3008],{},"Это не «магический промпт» и не набор волшебных слов. Здесь зафиксировано управленческое решение:",[47,3010,3011,3014,3017,3020],{},[50,3012,3013],{},"какой риск я закрываю;",[50,3015,3016],{},"что считаю допустимой границей изменения;",[50,3018,3019],{},"каким будет доказательство результата;",[50,3021,3022],{},"какое действие сейчас запрещено.",[12,3024,3025],{},"Если я не могу это сформулировать, дело обычно не в агенте. Скорее всего, я сам ещё не разобрался с задачей.",[39,3027,3029],{"id":3028},"хорошая-задача-начинается-с-контекста","Хорошая задача начинается с контекста",[12,3031,3032],{},"Человек в команде часто накапливает контекст годами. Он знает, где находится код, как устроен релиз, почему нельзя чистить эту таблицу и какой endpoint на самом деле проверяет пользователь.",[12,3034,3035,3036,3039],{},"Агент приходит в проект почти как новый сотрудник. Только он очень быстро и без устали читает то количество файлов, которое человек обычно откладывает «на потом». И да, иногда ему приходится отдельно объяснять, что документацию надо читать ",[34,3037,3038],{},"до"," того, как он начнёт уверенно чинить то, чего не понял.",[12,3041,3042],{},"У меня это стало почти ритуалом.",[12,3044,3045],{},"Перед заметной задачей агент сначала должен выяснить:",[166,3047,3048,3051,3054,3057,3060,3063],{},[50,3049,3050],{},"где он находится;",[50,3052,3053],{},"какой репозиторий и какая ветка являются рабочими;",[50,3055,3056],{},"есть ли незакоммиченные изменения;",[50,3058,3059],{},"где лежит подтверждённый контекст проекта;",[50,3061,3062],{},"что говорит актуальный план;",[50,3064,3065],{},"что реально происходит в коде, данных и runtime.",[12,3067,3068],{},"Последний пункт важнее остальных. В документации может быть написано, что система работает на одной версии. В Git может лежать другая. На сервере — третья. А пользователь может открыть четвёртую, потому что у него закешировалась старая страница или он вообще смотрит не на то окружение.",[12,3070,3071],{},"Поэтому я стараюсь держаться правила:",[25,3073,3074],{},[12,3075,3076],{},"Память, старый план и уверенный ответ агента не доказывают ничего. Опираться нужно на проверяемое состояние кода, данных и работающей системы.",[12,3078,3079,3080,37],{},"Это не значит, что документации нельзя доверять. Хорошая документация помогает быстро понять, ",[34,3081,3082],{},"что проверить и зачем",[39,3084,3086],{"id":3085},"документация-которую-действительно-читают","Документация, которую действительно читают",[12,3088,3089],{},"Существует старый жанр инженерного юмора: документация — это место, куда информация уходит, чтобы никогда не вернуться.",[12,3091,3092],{},"С агентами у меня получилось чуть иначе. Документация стала рабочим инструментом, а не приложением к проекту.",[12,3094,3095],{},"У каждого заметного продукта есть несколько разных типов знания.",[298,3097,3098,3108],{},[301,3099,3100],{},[304,3101,3102,3105],{},[307,3103,3104],{},"Что нужно узнать",[307,3106,3107],{},"Где это должно быть зафиксировано",[313,3109,3110,3118,3126,3134,3142],{},[304,3111,3112,3115],{},[318,3113,3114],{},"Что подтверждено и принято",[318,3116,3117],{},"Краткий актуальный контекст проекта",[304,3119,3120,3123],{},[318,3121,3122],{},"Что делать дальше",[318,3124,3125],{},"Текущий план или backlog",[304,3127,3128,3131],{},[318,3129,3130],{},"Почему было принято старое решение",[318,3132,3133],{},"Исторический план или журнал решений",[304,3135,3136,3139],{},[318,3137,3138],{},"Как безопасно провести операцию",[318,3140,3141],{},"Runbook, deploy-инструкция, troubleshooting",[304,3143,3144,3147],{},[318,3145,3146],{},"Что однажды уже сломалось",[318,3148,3149],{},"Gotcha, тест, инвариант, проверочный сценарий",[12,3151,3152],{},"Важно не смешивать эти слои.",[12,3154,3155],{},"Исторический план — это не приказ продолжать работу с места, где остановились полгода назад. Он может объяснить, почему архитектура выглядит именно так. Но текущую задачу надо начинать с того, что реально подтверждено сегодня.",[12,3157,3158],{},"Документ со списком прошлых релизов — не замена проверке production. Он полезен, чтобы понимать, что спросить у системы. Но всё равно нужно посмотреть текущий revision, состояние процессов, health-check и нужный пользовательский маршрут.",[12,3160,3161],{},"Агент умеет быстро читать много, но это не повод читать всё подряд. Я задаю порядок: правила проекта, актуальный контекст, текущий план, затем код и состояние работающей системы.",[12,3163,3164],{},"Похоже, я наконец нашёл читателя для технической документации.",[39,3166,3168],{"id":3167},"пять-слоёв-постановки-задачи","Пять слоёв постановки задачи",[12,3170,3171],{},"Со временем у меня сложилась простая конструкция. Почти любую работу с агентом можно проверить по пяти слоям.",[152,3173,3175],{"id":3174},"_1-цель","1. Цель",[12,3177,3178],{},"Не «добавить кнопку», а ответить на вопросы:",[47,3180,3181,3184,3187,3190],{},[50,3182,3183],{},"кто получает новое действие;",[50,3185,3186],{},"какую проблему оно решает;",[50,3188,3189],{},"что меняется в пользовательском сценарии;",[50,3191,3192],{},"что сознательно не входит в задачу.",[12,3194,3195],{},"Например, цель может звучать так: «пользователь должен видеть понятную причину отказа и знать, что делать дальше». Это лучше, чем «сделай красивое уведомление».",[12,3197,3198],{},"В первой формулировке есть результат. Во второй — только эстетическое пожелание, которое можно трактовать бесконечно.",[152,3200,3202],{"id":3201},"_2-реальность","2. Реальность",[12,3204,3205],{},"До плана нужно установить факты.",[12,3207,3208],{},"Не «вроде бы сервис использует такую-то очередь», а проверить код и состояние системы. Не «кажется, endpoint защищён», а посмотреть маршрут, policy, тест и фактический HTTP-ответ. Не «релиз уже выкачен», а сверить revision и публичный маршрут.",[12,3210,3211],{},"Этот этап иногда выглядит как потеря времени. Особенно когда хочется немедленно дать агенту команду «исправляй». Но именно он спасает от классического сценария: три часа мы лечили проблему в одном окружении, а пользователь всё это время работал в другом.",[152,3213,3215],{"id":3214},"_3-границы","3. Границы",[12,3217,3218],{},"В хорошей задаче нужно назвать и то, что сделать, и то, чего делать нельзя.",[12,3220,215],{},[47,3222,3223,3226,3229,3232,3235,3238],{},[50,3224,3225],{},"не трогать production без отдельного решения;",[50,3227,3228],{},"не менять инфраструктуру ради удобства одного патча;",[50,3230,3231],{},"не удалять данные широким запросом;",[50,3233,3234],{},"не раскрывать конфигурацию и секреты;",[50,3236,3237],{},"не исправлять соседние подсистемы «заодно»;",[50,3239,3240],{},"не стирать чужие незакоммиченные изменения.",[12,3242,3243],{},"Границы особенно важны потому, что агент очень охотно помогает. Иногда настолько охотно, что начинает чинить не только указанную проблему, но и весь мир вокруг неё. Для человека это называют инициативностью. В работе с агентом это повод ещё раз проверить границы задачи.",[152,3245,3247],{"id":3246},"_4-доказательство-готовности","4. Доказательство готовности",[12,3249,3250],{},"Фразы «код написан» недостаточно.",[12,3252,3253],{},"«Тест прошёл» — тоже не всегда готовность.",[12,3255,3256],{},"В зависимости от задачи доказательство может включать:",[47,3258,3259,3262,3265,3268,3271,3274,3277,3280],{},[50,3260,3261],{},"regression test на конкретный контракт;",[50,3263,3264],{},"сборку затронутого приложения;",[50,3266,3267],{},"проверку API или очереди;",[50,3269,3270],{},"подтверждённое состояние в базе;",[50,3272,3273],{},"desktop- и mobile-проверку публичного сценария;",[50,3275,3276],{},"независимый review;",[50,3278,3279],{},"exact revision на сервере;",[50,3281,3282],{},"возможность отката.",[12,3284,3285],{},"Список не должен быть длинным. Он должен соответствовать риску. Для текстовой правки не нужен военный совет. Для изменения авторизации или записи данных недостаточно фразы «вроде работает».",[152,3287,3289],{"id":3288},"_5-след-знания","5. След знания",[12,3291,3292],{},"После заметной работы результат не должен оставаться только в чате.",[12,3294,3295],{},"Если выяснилось новое ограничение — оно попадает в документ или runbook. Если найден опасный сценарий — появляется тест. Если повторяется диагностический путь — он сохраняется как процедура. Если обновился контракт — это отражается в актуальном контексте.",[12,3297,3298],{},"Так появляется память разработки, а не склад заметок. В следующий раз агент не начинает заново из археологических раскопок, а я не пытаюсь вспомнить, почему месяц назад мы запретили «простое» решение.",[12,3300,3301],{},"Эти слои лучше работают не как чек-лист в конце, а как последовательность принятия решения:",[107,3303,3307],{"className":3304,"code":3305,"language":3306,"meta":113,"style":113},"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",[62,3308,3309,3314,3319,3324,3329],{"__ignoreMap":113},[2354,3310,3311],{"class":2356,"line":2357},[2354,3312,3313],{},"flowchart TB\n",[2354,3315,3316],{"class":2356,"line":794},[2354,3317,3318],{},"  goal[1 · Цель] --> facts[2 · Проверенные факты]\n",[2354,3320,3321],{"class":2356,"line":800},[2354,3322,3323],{},"  facts --> scope[3 · Границы изменения]\n",[2354,3325,3326],{"class":2356,"line":2374},[2354,3327,3328],{},"  scope --> proof[4 · Доказательство готовности]\n",[2354,3330,3331],{"class":2356,"line":2381},[2354,3332,3333],{},"  proof --> memory[5 · След знания]\n",[39,3335,3337],{"id":3336},"агент-не-должен-быть-универсальным-исполнителем","Агент не должен быть универсальным исполнителем",[12,3339,3340],{},"Самый опасный запрос к AI звучит просто: «разберись со всем».",[12,3342,3343],{},"Иногда я тоже так думаю. Особенно когда вижу старый сервис, несколько слоёв документации, очередь, фоновые задачи, непонятное состояние данных и один маленький баг, который почему-то не хочет быть маленьким.",[12,3345,3346],{},"Но в таких случаях универсальный агент быстро становится универсальным источником правдоподобных объяснений. Он может найти десять мест, которые «похожи на проблему», предложить большую переработку и даже честно написать, что всё проверил. А потом окажется, что главный сценарий никто не запускал.",[12,3348,3349],{},"Поэтому я разделяю роли.",[298,3351,3352,3361],{},[301,3353,3354],{},[304,3355,3356,3359],{},[307,3357,3358],{},"Роль",[307,3360,1220],{},[313,3362,3363,3371,3379,3387,3395],{},[304,3364,3365,3368],{},[318,3366,3367],{},"Исследователь",[318,3369,3370],{},"Собирает факты о коде, документации, данных и runtime",[304,3372,3373,3376],{},[318,3374,3375],{},"Исполнитель",[318,3377,3378],{},"Делает ограниченное изменение в согласованном scope",[304,3380,3381,3384],{},[318,3382,3383],{},"Ревьюер",[318,3385,3386],{},"Ищет пропущенные контракты, риски и слабые проверки",[304,3388,3389,3392],{},[318,3390,3391],{},"Принимающий",[318,3393,3394],{},"Независимо подтверждает, что результат действительно работает",[304,3396,3397,3400],{},[318,3398,3399],{},"Ведущий",[318,3401,3402],{},"Связывает цель, риск, архитектуру и решение владельца продукта",[12,3404,3405],{},"Иногда все эти роли выполняет один агент в несколько заходов. Иногда для независимости полезно разделить их. Но смысл остаётся: результат исполнителя не должен автоматически становиться истиной только потому, что он звучит убедительно.",[25,3407,3408],{},[12,3409,3410],{},"Отчёт агента — это гипотеза до тех пор, пока она не подтверждена кодом, тестом, системой или независимой проверкой.",[12,3412,3413],{},"Особенно это относится к авторизации, данным, платежам, очередям, внешним интеграциям и production.",[39,3415,3417],{"id":3416},"почему-скорость-не-равна-отмене-проверок","Почему скорость не равна отмене проверок",[12,3419,3420],{},"Есть две одинаково вредные крайности.",[12,3422,3423],{},"Первая: запускать полный набор проверок после каждой запятой в документации. Это выглядит строго, но постепенно превращает разработку в ритуал. Люди и агенты начинают ждать завершения тяжёлых процессов, не понимая, что именно они проверяют.",[12,3425,3426],{},"Вторая: «быстро сделать, потом разберёмся». Это обычно означает, что разбираться будут уже с последствиями — в логах, в базе, в рабочее время и в чужом настроении.",[12,3428,3429,3430,37],{},"Я стараюсь использовать третий вариант: ",[34,3431,3432],{},"сила проверки должна соответствовать цене ошибки",[298,3434,3435,3444],{},[301,3436,3437],{},[304,3438,3439,3441],{},[307,3440,2674],{},[307,3442,3443],{},"Что достаточно проверить",[313,3445,3446,3454,3462,3470,3478],{},[304,3447,3448,3451],{},[318,3449,3450],{},"Документация или изолированный текст",[318,3452,3453],{},"Diff и непротиворечивость фактам",[304,3455,3456,3459],{},[318,3457,3458],{},"Локальная бизнес-логика",[318,3460,3461],{},"Точный regression test и сборка затронутого компонента",[304,3463,3464,3467],{},[318,3465,3466],{},"Публичный интерфейс",[318,3468,3469],{},"Нужный пользовательский flow на desktop и mobile",[304,3471,3472,3475],{},[318,3473,3474],{},"Очередь, writer, данные",[318,3476,3477],{},"Инварианты, состояние в базе, защита от частичной записи",[304,3479,3480,3483],{},[318,3481,3482],{},"Авторизация, деньги, production",[318,3484,3485],{},"Exact revision, независимый review, rollback и runtime smoke",[12,3487,3488],{},"Это не означает, что я всегда угадываю идеальный набор проверок. Но сама постановка вопроса меняет работу.",[12,3490,3491],{},"Не «как заставить агента сделать всё быстро?», а «какая ошибка здесь будет самой дорогой и как её поймать раньше пользователя?»",[39,3493,3495],{"id":3494},"production-это-не-место-для-продолжения-разработки","Production — это не место для продолжения разработки",[12,3497,3498],{},"Отдельная дисциплина нужна для релизов.",[12,3500,3501,3502,3505],{},"Когда система работает для пользователей, нельзя считать успехом ни ",[62,3503,3504],{},"git push",", ни зелёную сборку, ни сообщение process manager-а «online». Все эти вещи полезны, но каждая доказывает только свою маленькую часть истории.",[12,3507,3508],{},"Рабочая цепочка выглядит примерно так:",[107,3510,3512],{"className":3304,"code":3511,"language":3306,"meta":113,"style":113},"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",[62,3513,3514,3518,3523,3528,3533,3538,3543,3548],{"__ignoreMap":113},[2354,3515,3516],{"class":2356,"line":2357},[2354,3517,3313],{},[2354,3519,3520],{"class":2356,"line":794},[2354,3521,3522],{},"  change[Локальное изменение] --> checks[Проверка]\n",[2354,3524,3525],{"class":2356,"line":800},[2354,3526,3527],{},"  checks --> revision[Зафиксированный revision]\n",[2354,3529,3530],{"class":2356,"line":2374},[2354,3531,3532],{},"  revision --> candidate[Точный release candidate]\n",[2354,3534,3535],{"class":2356,"line":2381},[2354,3536,3537],{},"  candidate --> switch[Атомарное переключение]\n",[2354,3539,3540],{"class":2356,"line":2387},[2354,3541,3542],{},"  switch --> health[Health-check]\n",[2354,3544,3545],{"class":2356,"line":2392},[2354,3546,3547],{},"  health --> smoke[Пользовательский smoke]\n",[2354,3549,3550],{"class":2356,"line":2398},[2354,3551,3552],{},"  smoke --> rollback[Возможность rollback]\n",[12,3554,3555],{},"Я сознательно стараюсь не «доделывать на сервере». Сервер не должен становиться местом, где пишется код, исправляется lockfile, создаётся коммит или принимается архитектурное решение в полночь под давлением ошибки.",[12,3557,3558],{},"Production должен применять уже подготовленный релиз. И этот релиз должен иметь точный идентификатор: вот revision, вот сборка, вот проверка, вот предыдущая рабочая точка, к которой можно вернуться.",[12,3560,3561],{},"Такой подход кажется медленнее ровно до первого случая, когда нужно понять: пользователь видит новый код или старый? Система упала из-за релиза или проблема была раньше? Что именно откатывать? Есть ли у нас вообще куда откатываться?",[12,3563,3564],{},"После этого словосочетание «давайте быстро поправим на сервере» начинает звучать как предложение чинить проводку мокрыми руками. Возможно, получится. Но лучше сначала выключить питание.",[39,3566,3568],{"id":3567},"промпт-часть-инженерной-системы","Промпт — часть инженерной системы",[12,3570,3571],{},"Когда говорят о prompt engineering, часто представляют удачную формулировку, которая заставляет модель выдать нужный ответ с первого раза.",[12,3573,3574],{},"В разработке мне важнее другое. Промпт — это форма, в которой я фиксирую управленческое решение. Он не должен быть красивым. Он должен быть проверяемым.",[12,3576,3577],{},"Например, рабочее задание агенту может выглядеть так:",[107,3579,3582],{"className":3580,"code":3581,"language":112,"meta":1122},[110],"Контекст:\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",[62,3583,3581],{"__ignoreMap":113},[12,3585,3586],{},"В таком тексте нет просьбы «будь экспертом мирового уровня». Я не прошу агента «проявить инициативу» и не заставляю его писать эссе о том, как прекрасно он понял задачу.",[12,3588,3589],{},"Я задаю ему рабочую среду: вот цель, вот порядок, вот границы, вот форма результата.",[12,3591,3592],{},"А ещё я могу сказать самое полезное: «остановись перед следующим опасным действием». Агент не обидится, не закатит глаза и не скажет, что ему нужно больше доверять. Он просто остановится. В мире разработки это недооценённое качество.",[39,3594,3596],{"id":3595},"после-ошибки-нужен-не-новый-промпт-а-новая-защита","После ошибки нужен не новый промпт, а новая защита",[12,3598,3599],{},"Когда агент делает неверный шаг, очень легко начать бесконечный цикл:",[107,3601,3604],{"className":3602,"code":3603,"language":112,"meta":113},[110],"Не сработало → попробуй ещё → не сработало → попробуй по-другому.\n",[62,3605,3603],{"__ignoreMap":113},[12,3607,3608],{},"Иногда второй заход действительно нужен. Но если ошибка повторяется, проблема обычно уже не в конкретной формулировке. Значит, в системе отсутствует защита.",[12,3610,3611],{},"Я стараюсь разбирать такие случаи иначе:",[107,3613,3616],{"className":3614,"code":3615,"language":112,"meta":113},[110],"Симптом\n→ факты\n→ root cause\n→ минимальное исправление\n→ regression test или инвариант\n→ обновлённый контекст\n",[62,3617,3615],{"__ignoreMap":113},[12,3619,3620],{},"Например, если однажды выяснилось, что фоновая задача может завершиться без ошибки, но не выполнить полезную работу, недостаточно просто поправить обработчик. Нужно добавить проверку её реального результата.",[12,3622,3623],{},"Если можно перепутать окружения, нужен предохранитель, который заставит сначала подтвердить цель действия. Если deploy-скрипт может взять не тот revision, ему нужен exact-SHA контракт. Если документ расходится с кодом, нужно не только исправить документ, но и понять, почему он перестал обновляться.",[12,3625,3626,3627,3630],{},"В этом месте AI особенно полезен. Он умеет быстро помочь превратить разовый урок в тест, правило, runbook или проверку. Но решение о том, ",[34,3628,3629],{},"какая защита действительно нужна",", остаётся за мной.",[39,3632,3634],{"id":3633},"чего-ai-не-решает","Чего AI не решает",[12,3636,3637],{},"Важно не превратить всё это в новую форму AI-оптимизма.",[12,3639,3640],{},"Агент не знает автоматически:",[47,3642,3643,3646,3649,3652,3655,3658],{},[50,3644,3645],{},"какой продукт нужен людям;",[50,3647,3648],{},"какой риск допустим для бизнеса;",[50,3650,3651],{},"когда стоит отказаться от идеи;",[50,3653,3654],{},"что можно считать достаточным доказательством;",[50,3656,3657],{},"какая часть старой системы ценна, а какая давно просится на покой;",[50,3659,3660],{},"почему пользователь недоволен, даже если формально все тесты зелёные.",[12,3662,3663],{},"Он также не заменяет обратную связь от живых людей. Можно идеально организовать pipeline, покрыть тестами контракты, написать прекрасную документацию — и всё равно построить вещь, которая никому не нужна.",[12,3665,3666],{},"AI не отменяет продуктовую ответственность. Он лишь делает дороже попытку от неё спрятаться.",[39,3668,3670],{"id":3669},"вопросы-и-ответы","Вопросы и ответы",[152,3672,3674],{"id":3673},"как-ставить-задачи-ai-агенту-в-разработке","Как ставить задачи AI-агенту в разработке?",[12,3676,3677],{},"Сначала назвать цель и риск, затем дать агенту проверяемый контекст, границы изменения и критерий готовности. Короткая команда может быть началом разговора, но не заменяет постановку задачи.",[152,3679,3681],{"id":3680},"почему-ai-агенту-недостаточно-короткого-промпта","Почему AI-агенту недостаточно короткого промпта?",[12,3683,3684],{},"Агент не живёт внутри проекта: он не знает актуальное состояние кода, данных, окружений и старых ограничений, пока это не подтверждено. Без контекста он вынужден выбирать важные ответы вместо владельца задачи.",[152,3686,3688],{"id":3687},"как-безопасно-использовать-ai-при-production-deploy","Как безопасно использовать AI при production deploy?",[12,3690,3691],{},"Сначала подготовить и проверить конкретный revision вне production. Затем применять только этот revision, фиксировать health-check и отдельно проходить пользовательский smoke-сценарий. Если риск не согласован, агент должен остановиться до опасного действия.",[39,3693,3695],{"id":3694},"управление-стало-разговором-но-не-разговором-ни-о-чём","Управление стало разговором — но не разговором ни о чём",[12,3697,3698],{},"Работа с агентом изменила моё представление об управлении разработкой.",[12,3700,3701],{},"Раньше я больше думал о распределении задач: что отдать, в каком порядке сделать, кому поручить проверку. Сейчас фокус сместился. Самая важная часть работы происходит раньше кода:",[47,3703,3704,3707,3710,3713,3716,3719],{},[50,3705,3706],{},"правильно назвать цель;",[50,3708,3709],{},"отделить факт от предположения;",[50,3711,3712],{},"обозначить границы;",[50,3714,3715],{},"определить риск;",[50,3717,3718],{},"договориться о доказательстве результата;",[50,3720,3721],{},"сохранить знание после завершения.",[12,3723,3724],{},"Получается, что управление всё чаще сводится к качеству диалога. Но не к разговору ради разговора. К разговору, после которого появляется конкретный проверяемый результат.",[25,3726,3727],{},[12,3728,3729],{},"Чем сильнее AI участвует в разработке, тем меньше можно управлять намёками.",[12,3731,3732],{},"Каждое неясное слово в задаче становится риском. Каждая непроверенная гипотеза — потенциальным багом. Каждая хорошо поставленная цель — возможностью двигаться быстрее без лишнего героизма.",[12,3734,3735],{},"Я продолжаю строить эту систему: уточнять контекст, превращать ошибки в проверки, отделять исследование от изменений и учиться ставить задачи так, чтобы за диалогом всегда оставался работающий результат.",[12,3737,3738],{},"И, пожалуй, это пока самый полезный эффект AI в разработке. Не то, что он пишет код. А то, что рядом с ним приходится наконец ясно объяснять, зачем этот код нужен.",[12,3740,3741,3742,37],{},"Наблюдения об AI в разработке и о том, что в этой работе остаётся на стороне человека, я продолжаю собирать в Telegram-канале ",[94,3743,3746],{"href":3744,"rel":3745},"https:\u002F\u002Ft.me\u002Fstrunimisli",[98],"«Струны, мысли»",[2835,3748,3749],{},"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":113,"searchDepth":794,"depth":794,"links":3751},[3752,3753,3754,3755,3756,3757,3764,3765,3766,3767,3768,3769,3770,3775],{"id":1823,"depth":794,"text":1824},{"id":2931,"depth":794,"text":2932},{"id":2974,"depth":794,"text":2975},{"id":3028,"depth":794,"text":3029},{"id":3085,"depth":794,"text":3086},{"id":3167,"depth":794,"text":3168,"children":3758},[3759,3760,3761,3762,3763],{"id":3174,"depth":800,"text":3175},{"id":3201,"depth":800,"text":3202},{"id":3214,"depth":800,"text":3215},{"id":3246,"depth":800,"text":3247},{"id":3288,"depth":800,"text":3289},{"id":3336,"depth":794,"text":3337},{"id":3416,"depth":794,"text":3417},{"id":3494,"depth":794,"text":3495},{"id":3567,"depth":794,"text":3568},{"id":3595,"depth":794,"text":3596},{"id":3633,"depth":794,"text":3634},{"id":3669,"depth":794,"text":3670,"children":3771},[3772,3773,3774],{"id":3673,"depth":800,"text":3674},{"id":3680,"depth":800,"text":3681},{"id":3687,"depth":800,"text":3688},{"id":3694,"depth":794,"text":3695},"2026-08-11","Как я выстраиваю разработку с AI-агентом: через цели, контекст, ограничения, проверку фактов и доказательства результата.",{},"\u002Fblog\u002F2026-08-11-ai-upravlenie-razrabotkoj",{"title":2881,"description":3777},"blog\u002F2026-08-11-ai-upravlenie-razrabotkoj",[825,829,3783,826,3784],"управление","мысли","2KE0r-c898KARjeA8befh6xQ7RkWoXBdw-XGXwQ1YA0",{"id":3787,"title":3788,"acrostic":7,"body":3789,"date":3864,"description":3865,"duration":7,"emoji":7,"extension":816,"faq":7,"featured":817,"format":7,"image":7,"level":7,"media":7,"meta":3866,"navigation":819,"path":3867,"price":7,"schedule":7,"seo":3868,"seoTitle":7,"serviceType":7,"status":7,"stem":3869,"tags":3870,"tech":7,"toc":817,"url":7,"__hash__":3873},"blog\u002Fblog\u002F2026-08-04-dumat-energozatratno.md","Думать энергозатратно",{"type":9,"value":3790,"toc":3862},[3791,3794,3797,3800,3803,3806,3809,3812,3815,3818,3821,3824,3827,3844,3847,3850,3853,3856,3859],[12,3792,3793],{},"Думать энергозатратно.",[12,3795,3796],{},"Мозг — один из самых требовательных к энергии органов. Даже в состоянии покоя он потребляет заметную долю ресурсов организма. А когда нужно разобраться в новой, неочевидной задаче, построить модель происходящего, выбрать направление и принять решение — это ощущается почти физически.",[12,3798,3799],{},"Поэтому нам часто не хочется думать.",[12,3801,3802],{},"Мы выбираем знакомые шаблоны, опираемся на прошлый опыт, повторяем уже сработавшие решения. Это не обязательно признак лени или слабости. Скорее, естественный способ экономить ресурс.",[12,3804,3805],{},"Но именно там, где шаблонов недостаточно, начинается настоящая работа: нужно искать новое решение, удерживать в голове противоречия, проверять гипотезы, признавать, что прежняя схема больше не подходит.",[12,3807,3808],{},"Сейчас часть этой нагрузки берёт на себя искусственный интеллект.",[12,3810,3811],{},"ИИ может быстро написать типовой код, разложить задачу на подзадачи, собрать варианты реализации, подготовить тесты, найти очевидную ошибку. То, на что раньше уходили часы ручной работы, теперь иногда занимает минуты.",[12,3813,3814],{},"Это действительно меняет скорость разработки.",[12,3816,3817],{},"Но есть важная оговорка: ИИ не отменяет необходимость думать. Он переносит её выше по уровню.",[12,3819,3820],{},"Раньше скорость создания продукта зависела от всей цепочки: от автора идеи и архитектора до разработчика, который реализует очередную небольшую часть системы. Каждому нужно было остановиться, понять контекст и принять решение.",[12,3822,3823],{},"Теперь значительную часть низового труда можно автоматизировать. Робот не устает писать код, не теряет концентрацию на рутинных правках и способен очень быстро перебрать варианты.",[12,3825,3826],{},"А вот человеку остаётся самое сложное:",[47,3828,3829,3832,3835,3838,3841],{},[50,3830,3831],{},"понять, какую проблему мы вообще решаем;",[50,3833,3834],{},"сформулировать цель так, чтобы она не развалилась при реализации;",[50,3836,3837],{},"выбрать ограничения и критерии качества;",[50,3839,3840],{},"увидеть последствия решения для продукта, людей и бизнеса;",[50,3842,3843],{},"вовремя остановить систему, которая уверенно строит не то.",[12,3845,3846],{},"Если дать ИИ свободу без ясного каркаса и контроля, он легко построит вавилонскую башню из кода: много файлов, функций, абстракций и активности — но без цельной архитектуры и понятной ценности.",[12,3848,3849],{},"Поэтому настоящий предел скорости разработки сегодня — не скорость генерации кода.",[12,3851,3852],{},"Он упирается в человеческую способность собраться, найти силы, выделить время и по-настоящему подумать: что именно нужно сделать и почему.",[12,3854,3855],{},"Этот барьер вряд ли исчезнет полностью. Возможно, ИИ будет всё лучше ставить промежуточные цели и предлагать решения. Но исходный замысел, каркас системы и ответственность за направление пока остаются человеческой работой.",[12,3857,3858],{},"ИИ делает работу быстрее.",[12,3860,3861],{},"Но думать за нас — особенно о важном — он пока не отменяет.",{"title":113,"searchDepth":794,"depth":794,"links":3863},[],"2026-08-04","ИИ ускоряет создание кода, но не отменяет главную человеческую работу: сформулировать задачу, спроектировать систему и взять ответственность за решение.",{},"\u002Fblog\u002F2026-08-04-dumat-energozatratno",{"title":3788,"description":3865},"blog\u002F2026-08-04-dumat-energozatratno",[3871,829,3872],"ии","мышление","VObIrQdtM415tg47o04mnjebtR8Hb1DZVRwGxjCgMlo",{"id":3875,"title":3876,"acrostic":7,"body":3877,"date":3989,"description":3990,"duration":7,"emoji":7,"extension":816,"faq":7,"featured":817,"format":7,"image":7,"level":7,"media":7,"meta":3991,"navigation":819,"path":3992,"price":7,"schedule":7,"seo":3993,"seoTitle":7,"serviceType":7,"status":7,"stem":3994,"tags":3995,"tech":7,"toc":817,"url":7,"__hash__":3998},"blog\u002Fblog\u002F2026-07-09-telegram-invite-reality.md","Как я пытаюсь раскачать телеграм-канал: битва с лимитами",{"type":9,"value":3878,"toc":3982},[3879,3882,3885,3889,3892,3895,3898,3902,3905,3908,3911,3915,3918,3921,3927,3933,3937,3940,3954,3957,3961,3967,3973,3979],[12,3880,3881],{},"У меня есть канал — «Струны, мысли». Стихи, музыка, мысли. Недавно решил попробовать пригласить туда людей из своих контактов. Тысяча с лишним человек — среди них точно есть те, кому это откликнется.",[12,3883,3884],{},"Плюс у меня есть AI-агент. Он умеет писать скрипты, работать с Telegram API, отслеживать прогресс. Казалось бы — идеальный инструмент для массовой рассылки.",[39,3886,3888],{"id":3887},"первый-запуск","Первый запуск",[12,3890,3891],{},"8 июля, вечер. Агент отфильтровал контакты — около 600 ботов и мёртвых душ отсеялись, осталось 1158 реальных людей. Запустили скрипт.",[12,3893,3894],{},"24 приглашения — и Telegram разорвал сессию. Просто отключил аккаунт от API. Без предупреждения, без объяснений.",[12,3896,3897],{},"Пришлось заново авторизоваться. Потеряли час.",[39,3899,3901],{"id":3900},"вторая-попытка","Вторая попытка",[12,3903,3904],{},"На следующий день решили действовать иначе. Сначала — тихие инвайты в канал (107 человек добавлены, даже не заметили). Потом — личные сообщения с приглашением. Честные, без маркетингового шлака: «Привет! Это массовая рассылка, но канал мой, стихи тоже мои. Вот ссылка».",[12,3906,3907],{},"67 сообщений за 20 минут. И снова — «Too many requests». Аккаунт забанен.",[12,3909,3910],{},"На этот раз бан подольше. Часы.",[39,3912,3914],{"id":3913},"третья-попытка","Третья попытка",[12,3916,3917],{},"Переписали скрипт. Теперь он работает в двух режимах: invite в канал + личное сообщение, с паузой 31 секунда между приглашениями. При rate limit — ждёт час и пробует снова. Запустили в фоне.",[12,3919,3920],{},"Но выяснилось две вещи, которые усложнили автоматизацию.",[12,3922,3923,3926],{},[34,3924,3925],{},"Первое:"," Telegram не даёт отправлять больше 20–30 личных сообщений в день незнакомым людям. Не в час — в день. Приглашения в канал — около 30 в час. Это не баг, это политика платформы. И она не написана нигде в явном виде — только в FloodWaitError, который приходит после факта.",[12,3928,3929,3932],{},[34,3930,3931],{},"Второе:"," мой AI-агент и скрипт рассылки используют одну и ту же сессию Telegram. Они не могут работать одновременно. Каждый запуск скрипта требует остановки агента. Каждый ответ агента — остановки скрипта.",[39,3934,3936],{"id":3935},"где-мы-сейчас","Где мы сейчас",[12,3938,3939],{},"Скрипт работает. Медленно, по одному приглашению в 31 секунду, с часовыми паузами при каждом бане. Из 1158 контактов:",[47,3941,3942,3945,3948,3951],{},[50,3943,3944],{},"100 человек добавлены в канал (тихо, без уведомлений)",[50,3946,3947],{},"72 получили личное приглашение",[50,3949,3950],{},"22 пропущены — закрытые настройки приватности",[50,3952,3953],{},"954 ждут своей очереди",[12,3955,3956],{},"Баны снимаются. Скрипт снова стучится в API. Так и ломимся — по часу в час, по одному приглашению за раз.",[39,3958,3960],{"id":3959},"что-понял-на-этом-пути","Что понял на этом пути",[12,3962,3963,3966],{},[34,3964,3965],{},"Telegram защищает пользователей, а не создателей контента."," Лимиты — это философия платформы: рост должен быть органическим. Но «органический» не значит «ждать, пока само придёт». Значит — идти к людям, но медленно, с уважением к правилам.",[12,3968,3969,3972],{},[34,3970,3971],{},"AI — не кнопка «сделать всё»."," Агент пишет скрипты, обрабатывает ошибки, адаптируется к лимитам. Но он не может обойти фундаментальное ограничение платформы. Зато он может терпеливо ждать и пробовать снова — в отличие от человека, которому это наскучит через два часа.",[12,3974,3975,3978],{},[34,3976,3977],{},"1158 приглашений — это марафон, не спринт."," При текущем темпе на всё уйдут несколько дней. И это нормально. Каждый, кто примет приглашение, будет тем, кто увидел реальное приглашение от реального человека — а не спам из ниоткуда.",[12,3980,3981],{},"Продолжение следует. Скрипт работает.",{"title":113,"searchDepth":794,"depth":794,"links":3983},[3984,3985,3986,3987,3988],{"id":3887,"depth":794,"text":3888},{"id":3900,"depth":794,"text":3901},{"id":3913,"depth":794,"text":3914},{"id":3935,"depth":794,"text":3936},{"id":3959,"depth":794,"text":3960},"2026-07-09","История о том, как AI-автоматизация массовых приглашений столкнулась с реальностью телеграм-лимитов",{},"\u002Fblog\u002F2026-07-09-telegram-invite-reality",{"title":3876,"description":3990},"blog\u002F2026-07-09-telegram-invite-reality",[3996,825,3997,3784],"telegram","опыт","gGQprx9Q2ELGhjkWm1QiNpHXVK3P5xEBRLSu0ZOxxI0",{"id":4000,"title":4001,"acrostic":7,"body":4002,"date":4091,"description":4092,"duration":7,"emoji":7,"extension":816,"faq":7,"featured":817,"format":7,"image":7,"level":7,"media":7,"meta":4093,"navigation":819,"path":4094,"price":7,"schedule":7,"seo":4095,"seoTitle":7,"serviceType":7,"status":7,"stem":4096,"tags":4097,"tech":7,"toc":817,"url":7,"__hash__":4099},"blog\u002Fblog\u002F2026-07-08-o-privychke-i-merakh.md","О привычке и мерах",{"type":9,"value":4003,"toc":4085},[4004,4007,4010,4014,4021,4024,4027,4034,4037,4041,4044,4047,4050,4053,4056,4060,4063,4066,4069,4073,4076,4079,4082],[12,4005,4006],{},"Монтень ушёл из суда, заперся в башне своего замка и тридцать лет писал книгу о себе. Не о политике, не о войнах — о том, как он сам устроен. Что его злит, что радует, почему он делает одно и не делает другое. «Опыты» — это толстая тетрадь честных записей. Без претензии на истину.",[12,4008,4009],{},"Я не ушёл в замок. Но я тоже веду записи. Только мои — не про личные нравы, а про код, системы и привычки, которые в них пролезают.",[39,4011,4013],{"id":4012},"привычка","Привычка",[12,4015,4016,4017,4020],{},"Монтень говорил: «Привычка — тихая и незаметная управительница». Она не приказывает — она просто делает за нас. Открываешь проект — Ctrl+P, открываешь терминал, пишешь ",[62,4018,4019],{},"npm run dev",". Новый проект — те же клавиши. Не задумываешься.",[12,4022,4023],{},"И это хорошо. Без привычки невозможно работать. Когда я впервые начал со Strapi 5, каждый шаг требовал усилия: как устроены content types, как работает REST API, где права, как деплоить. Сейчас — автоматизм. Пять минут и новый сервис на ногах.",[12,4025,4026],{},"Но Монтень предупреждал и о другой стороне. Привычка, которая помогает, одновременно слепит. Ты делаешь то же самое, потому что делал раньше, а не потому что это лучший способ.",[12,4028,4029,4030,4033],{},"Я три года писал на Vue. Потом на проекте потребовался React — и я ловил себя на том, что ищу во фреймворке вещи, которых там нет. Vue-привычки. Реактивность через ",[62,4031,4032],{},"ref",", composition API, single-file components. В React это всё устроено иначе, и вместо того чтобы думать на языке нового инструмента, я пытался заставить его работать по-старому.",[12,4035,4036],{},"Монтень так и писал: «Обычай заслоняет нам истинный вид вещей». Фреймворк — это не просто инструмент. Это набор привычек. Сменить стек — значит сменить мышление. А это тяжело.",[39,4038,4040],{"id":4039},"о-мерах","О мерах",[12,4042,4043],{},"В другом эссе Монтень рассуждает об излишествах. Он за умеренность — не потому что крайности плохи сами по себе, а потому что они мешают видеть цель. Ешь слишком много — забудешь вкус еды. Читаешь слишком много — забудешь, зачем читал.",[12,4045,4046],{},"В разработке это проявляется как архитектурный жор.",[12,4048,4049],{},"У меня проект, где 15 PM2-процессов. Frontend, backend, 10 парсеров, анализатор, дайджест, сборщик фото. Когда я рассказываю об этом, люди спрашивает: «Зачем так много?»",[12,4051,4052],{},"И я сам задаю себе тот же вопрос. Потому что когда запускал — каждый сервис казался необходимым. Один парсер на площадку. Один процесс на аналитику. Логично. Но логика каждого отдельного решения не гарантирует логику целого. Можно сделать сто правильных шагов и прийти в тупик.",[12,4054,4055],{},"Монтень бы понял. Он писал: «Наше положение привычно, и вот мы привыкли быть». 15 процессов — это не катастрофа. Но я знаю, что 8 хватило бы. Знаю — потому что уже проходил через это. Сначала всё кажется необходимым. Потом смотришь и видишь дублирование, лишние прослойки, сервис, который делает ровно одну вещь раз в сутки и мог бы быть cron-задачей.",[39,4057,4059],{"id":4058},"опыт-учит-задним-числом","Опыт учит задним числом",[12,4061,4062],{},"Главная мысль Монтеня: опыт приходит после того, как ты уже всё сделал. Нельзя прочитать книгу и стать мудрым. Нужно набить шишки. Но можно — и нужно — честно оглядываться назад и спрашивать: а зачем я это сделал?",[12,4064,4065],{},"Каждую неделю я нахожу в своём коде что-то, что переписал бы иначе. Не потому что было плохо — потому что теперь я знаю больше. Два месяца назад это было правильное решение. Сегодня — нет. И это нормально. Монтень переписывал «Опыты» пятнадцать лет, добавляя и зачёркивая. Книга росла вместе с ним.",[12,4067,4068],{},"Код — тоже. Не бывает финальной архитектуры. Бывает текущая, которая работает, и следующая, которая будет работать лучше. Между ними — опыт. Не книжный, не из документации. Свой, набитый на своих ошибках.",[39,4070,4072],{"id":4071},"привычка-как-мера","Привычка как мера",[12,4074,4075],{},"Вот что я понял, читая Монтеня: привычка и мера — это не два разных предмета. Это одно и то же. Привычка — это внутренняя мера. Ты делаешь ровно столько, сколько делал раньше. Ни больше, ни меньше.",[12,4077,4078],{},"Иногда этого достаточно. Автоматизмы экономят время и силы. Но иногда привычная мера устарела. Проект вырос, задачи изменились, а ты всё ещё делаешь так, как делал полгода назад. Не потому что так лучше — потому что так привычно.",[12,4080,4081],{},"Монтень не давал рецептов. Он говорил: «Я не учу — я рассказываю». Вот и я рассказываю. О том, как привычка помогает строить сервисы. И о том, как та же привычка мешает их упрощать. О мерах — которые приходят только с опытом, а опыт — только с ошибками.",[12,4083,4084],{},"Иногда достаточно остановиться и спросить: я делаю так, потому что это правильно, или потому что я так привык?",{"title":113,"searchDepth":794,"depth":794,"links":4086},[4087,4088,4089,4090],{"id":4012,"depth":794,"text":4013},{"id":4039,"depth":794,"text":4040},{"id":4058,"depth":794,"text":4059},{"id":4071,"depth":794,"text":4072},"2026-07-08","Монтень считал, что привычка делает нас рабами. В разработке то же самое — только рабами фреймворков и паттернов",{},"\u002Fblog\u002F2026-07-08-o-privychke-i-merakh",{"title":4001,"description":4092},"blog\u002F2026-07-08-o-privychke-i-merakh",[3784,829,4098],"философия","x9l2xBnSlfbg9Ooz-ZCtX7KMM4aQ2_3bD4Uf1DdG1C8",{"id":4101,"title":4102,"acrostic":7,"body":4103,"date":4438,"description":4439,"duration":7,"emoji":7,"extension":816,"faq":7,"featured":817,"format":7,"image":7,"level":7,"media":7,"meta":4440,"navigation":819,"path":4441,"price":7,"schedule":7,"seo":4442,"seoTitle":7,"serviceType":7,"status":7,"stem":4443,"tags":4444,"tech":7,"toc":817,"url":7,"__hash__":4450},"blog\u002Fblog\u002F2026-07-07-aklab-ai-development.md","AKLAB: как я строю автоматический мониторинг недвижимости для инвесторов",{"type":9,"value":4104,"toc":4429},[4105,4108,4111,4114,4121,4125,4128,4131,4134,4137,4230,4233,4236,4247,4251,4254,4257,4263,4266,4272,4275,4279,4282,4288,4291,4297,4300,4303,4306,4310,4313,4319,4325,4331,4337,4341,4411,4413,4427],[12,4106,4107],{},"Я делаю сервис мониторинга инвестиционной недвижимости — AKLAB. Он автоматически находит объекты, которые стоят значительно ниже рыночных эталонов. Парсит 10 федеральных площадок, анализирует отклонения от эталонных цен, присылает утренний дайджест на email.",[12,4109,4110],{},"Основной фокус — коммерческая недвижимость: офисы, склады, торговые помещения. Но мониторим также земельные участки и квартиры.",[12,4112,4113],{},"За полтора месяца довёл проект от идеи до продакшена. Рассказываю, как устроено.",[12,4115,4116],{},[4117,4118],"img",{"alt":4119,"src":4120},"Дашборд AKLAB — тёмная тема","\u002Fuploads\u002Faklab-dashboard-dark.png",[39,4122,4124],{"id":4123},"зачем","Зачем",[12,4126,4127],{},"Рынок инвестиционной недвижимости — это торги. Сбербанк-АСТ, Алфалот, М-ЕТС, ГИС Торги, ЕТПРФ, Инвест Москва и другие. На каждой площадке — сотни лотов. Просматривать их вручную каждый день — нереально.",[12,4129,4130],{},"AKLAB делает это за меня: парсит площадки ночью, анализирует отклонения от эталонов, утром присылает результат на почту.",[39,4132,4133],{"id":1178},"Архитектура",[12,4135,4136],{},"Один репозиторий, 15 PM2-процессов:",[298,4138,4139,4151],{},[301,4140,4141],{},[304,4142,4143,4145,4148],{},[307,4144,1217],{},[307,4146,4147],{},"Порт",[307,4149,4150],{},"Описание",[313,4152,4153,4164,4175,4186,4197,4208,4219],{},[304,4154,4155,4158,4161],{},[318,4156,4157],{},"Frontend (Vue 3 + Vite + Tailwind)",[318,4159,4160],{},":5174",[318,4162,4163],{},"Dashboard, Настройки, Карточки объектов",[304,4165,4166,4169,4172],{},[318,4167,4168],{},"Backend (Strapi 5 + SQLite)",[318,4170,4171],{},":1338",[318,4173,4174],{},"REST API, Admin Panel, Cron scheduler",[304,4176,4177,4180,4183],{},[318,4178,4179],{},"10 парсеров (Playwright\u002Ffetch)",[318,4181,4182],{},":1345–1355",[318,4184,4185],{},"alfalot, torgi-gov, sberbank-ast, m-ets …",[304,4187,4188,4191,4194],{},[318,4189,4190],{},"Analyzer",[318,4192,4193],{},":1341",[318,4195,4196],{},"Сравнение с эталонами",[304,4198,4199,4202,4205],{},[318,4200,4201],{},"Digest",[318,4203,4204],{},":1342",[318,4206,4207],{},"Утренний email-дайджест",[304,4209,4210,4213,4216],{},[318,4211,4212],{},"Photo",[318,4214,4215],{},":1356",[318,4217,4218],{},"Фото из карточек",[304,4220,4221,4224,4227],{},[318,4222,4223],{},"Очередь",[318,4225,4226],{},"—",[318,4228,4229],{},"@aklab\u002Fsqlite-queue",[12,4231,4232],{},"Backend — Strapi 5.44 + SQLite. Выбрал Strapi, потому что из коробки получаю REST API, админку, систему прав и кастомные контроллеры. Не нужно писать boilerplate.",[12,4234,4235],{},"Frontend — Vue 3 + Vite + Tailwind. Дашборд с фильтрами по городу, цене и типу объекта, карточки с галереей фото.",[12,4237,4238,4239,4242,4243,4246],{},"Парсеры — каждый микросервис в отдельной папке, shared-модули в ",[62,4240,4241],{},"_shared\u002F",". Один манифест ",[62,4244,4245],{},"services.json"," управляет портами, health-checks и PM2-конфигом.",[39,4248,4250],{"id":4249},"парсинг","Парсинг",[12,4252,4253],{},"Ночью запускаются 10 парсеров одновременно. Каждый обходит свою площадку, находит новые лоты и проверяет обновления старых.",[12,4255,4256],{},"Парсинг работает в две фазы — и это не просто «скан, потом загрузка». Это принципиальное решение, которое экономит время и ресурсы.",[12,4258,4259,4262],{},[34,4260,4261],{},"Phase 1 — Scan."," Парсер обходит ленту площадки и собирает только карточные данные: цена, площадь, адрес, тип помещения. Тут же, на лету, применяет фильтры. Не попадает в нужный регион — отбрасывается. Площадь меньше минимума — отбрасывается. Цена выше порога — отбрасывается. Стоп-слова в названии — отбрасывается. Всё это происходит до того, как я потратил хоть одну лишнюю секунду на детальную выгрузку.",[12,4264,4265],{},"Типичный сценарий: площадка выдаёт 200 лотов по всей России. После фильтрации по региону (Москва + МО) остаётся 30. После фильтрации по площади и цене — 12. Именно эти 12 и пойдут во вторую фазу, а не все 200.",[12,4267,4268,4271],{},[34,4269,4270],{},"Phase 2 — Fetch Details."," Для каждого прошедшего фильтр лота парсер заходит в карточку и забирает полное описание, фотографии, документы, условия торгов. Это дорогая операция — каждый запрос это реальный HTTP-запрос к площадке, с ожиданием загрузки, иногда с обходом JavaScript-рендеринга через Playwright.",[12,4273,4274],{},"Две фазы позволяют не грузить детали для объектов, которые заведомо не подходят. На некоторых площадках фильтрация отсекает 80–90% лотов ещё на этапе scan.",[39,4276,4278],{"id":4277},"скоринг","Скоринг",[12,4280,4281],{},"После парсинга analyzer оценивает каждый объект по сравнению с эталонными ценами.",[12,4283,4284,4287],{},[34,4285,4286],{},"Эталоны"," — это заранее заданные ориентиры стоимости за квадратный метр для каждого типа помещения в каждом регионе. Не «средняя цена по рынку», а конкретные контрольные точки, которые я веду вручную и корректирую по мере накопления данных.",[12,4289,4290],{},"Для каждого объекта analyzer считает отклонение от эталона:",[107,4292,4295],{"className":4293,"code":4294,"language":112},[110],"deviation = (эталонная_цена − фактическая_цена) \u002F эталонная_цена × 100\n",[62,4296,4294],{"__ignoreMap":113},[12,4298,4299],{},"Если отклонение превышает порог (например, 20%) — объект попадает в фокус. Чем больше отклонение, тем выше фокус-скор.",[12,4301,4302],{},"Кроме отклонения, на скор влияют дополнительные факторы: тип торгов (банкротство vs реализация), наличие фото, полнота описания, сроки торгов. Объект с высоким отклонением, но без фотографий и с неполным описанием получит скор ниже, чем объект с аналогичным отклонением, но полной карточкой.",[12,4304,4305],{},"Весь парсинг и анализ происходит ночью. Утром digest формирует email-дайджест по объектам, попавшим в фокус, и отправляет мне на почту.",[39,4307,4309],{"id":4308},"как-ai-помогает","Как AI помогает",[12,4311,4312],{},"Я разрабатываю AKLAB с AI-ассистентом. Вот что это даёт на практике:",[12,4314,4315,4318],{},[34,4316,4317],{},"Параллельная работа."," AI одновременно пишет код для нескольких сервисов — парсера, analyzer, фронтенд-компонента. Я ревьюю результат, а не пишу с нуля.",[12,4320,4321,4324],{},[34,4322,4323],{},"Документация."," После каждого изменения AI обновляет внутреннюю документацию: архитектурные решения, known issues, deployment notes. Всё актуально в каждый момент времени.",[12,4326,4327,4330],{},[34,4328,4329],{},"Тесты."," AI генерирует тесты параллельно с кодом. Не «напиши потом тесты» — а сразу вместе с фичей.",[12,4332,4333,4336],{},[34,4334,4335],{},"Деплой."," Один скрипт: коммит, пуш, npm install, build 10 сервисов, перезапуск PM2, health-check. 3–5 минут от команды до рабочего продакшена.",[39,4338,4340],{"id":4339},"цифры","Цифры",[298,4342,4343,4353],{},[301,4344,4345],{},[304,4346,4347,4350],{},[307,4348,4349],{},"Метрика",[307,4351,4352],{},"Значение",[313,4354,4355,4363,4371,4379,4387,4395,4403],{},[304,4356,4357,4360],{},[318,4358,4359],{},"Версия",[318,4361,4362],{},"v1.1.43",[304,4364,4365,4368],{},[318,4366,4367],{},"PM2-процессов",[318,4369,4370],{},"15",[304,4372,4373,4376],{},[318,4374,4375],{},"Активных парсеров",[318,4377,4378],{},"10",[304,4380,4381,4384],{},[318,4382,4383],{},"Площадок",[318,4385,4386],{},"10 федеральных",[304,4388,4389,4392],{},[318,4390,4391],{},"Тестов",[318,4393,4394],{},"578",[304,4396,4397,4400],{},[318,4398,4399],{},"Коммитов",[318,4401,4402],{},"200+",[304,4404,4405,4408],{},[318,4406,4407],{},"Время от идеи до prod",[318,4409,4410],{},"1.5 месяца",[39,4412,1752],{"id":1751},[47,4414,4415,4418,4421,4424],{},[50,4416,4417],{},"Email-дайджест с аналитикой по трендам",[50,4419,4420],{},"Расширение на больше площадок и регионов",[50,4422,4423],{},"API для партнёров",[50,4425,4426],{},"Предсказание доходности на основе исторических данных",[784,4428],{},{"title":113,"searchDepth":794,"depth":794,"links":4430},[4431,4432,4433,4434,4435,4436,4437],{"id":4123,"depth":794,"text":4124},{"id":1178,"depth":794,"text":4133},{"id":4249,"depth":794,"text":4250},{"id":4277,"depth":794,"text":4278},{"id":4308,"depth":794,"text":4309},{"id":4339,"depth":794,"text":4340},{"id":1751,"depth":794,"text":1752},"2026-07-07","10 парсеров, 15 сервисов, 578 тестов. Как я строю платформу для инвесторов в недвижимость с помощью AI.",{},"\u002Fblog\u002F2026-07-07-aklab-ai-development",{"title":4102,"description":4439},"blog\u002F2026-07-07-aklab-ai-development",[4445,825,829,4446,4447,4448,4449],"aklab","strapi","vue","недвижимость","инвестиции","NgOyUcftyQjU9k1ghD0wHeO2LsIUkgKlZjFav3qstgc",{"id":4452,"title":4453,"acrostic":7,"body":4454,"date":4461,"description":4462,"duration":7,"emoji":7,"extension":816,"faq":7,"featured":817,"format":7,"image":7,"level":7,"media":4463,"meta":4467,"navigation":819,"path":4468,"price":7,"schedule":7,"seo":4469,"seoTitle":7,"serviceType":7,"status":7,"stem":4470,"tags":4471,"tech":7,"toc":817,"url":7,"__hash__":4473},"blog\u002Fblog\u002F2026-03-14-improvizaciya.md","Импровизация (14 марта)",{"type":9,"value":4455,"toc":4459},[4456],[12,4457,4458],{},"Живая акустическая импровизация, записанная 14 марта.",{"title":113,"searchDepth":794,"depth":794,"links":4460},[],"2026-03-14","Акустическая гитара, свежая импровизация.",[4464],{"type":4465,"url":4466,"title":4453},"audio","\u002Fmusic\u002F14-mar-1222.mp3",{},"\u002Fblog\u002F2026-03-14-improvizaciya",{"title":4453,"description":4462},"blog\u002F2026-03-14-improvizaciya",[4472],"музыка","8tBvhLmSw3k7YN0s4RuppHBhnjaYZ9-n6ULY5X0DtlM",{"id":4475,"title":4476,"acrostic":7,"body":4477,"date":4507,"description":4508,"duration":7,"emoji":7,"extension":816,"faq":7,"featured":817,"format":7,"image":7,"level":7,"media":7,"meta":4509,"navigation":819,"path":4512,"price":7,"schedule":7,"seo":4513,"seoTitle":7,"serviceType":7,"status":7,"stem":4514,"tags":4515,"tech":7,"toc":817,"url":7,"__hash__":4517},"blog\u002Fblog\u002F2026-03-13-help-people.md","Помочь можно только тому, кто готов",{"type":9,"value":4478,"toc":4505},[4479,4482,4485,4488,4491,4494,4497,4500],[12,4480,4481],{},"Иногда ловлю себя на мысли, что очень хочу приносить пользу. Не просто быть рядом, а именно — быть полезным. Помогать близким, да и вообще — людям. Делать так, чтобы кому-то стало легче, понятнее, лучше.",[12,4483,4484],{},"Умею, казалось бы, немало. Могу сайт помочь сделать. Могу разобраться с ИИ, внедрить, прокачать процессы. Казалось бы — бери и делай, приноси пользу.",[12,4486,4487],{},"Но что-то не складывается.",[12,4489,4490],{},"И ведь знаю я эту мудрость, которую не первый раз слышу: «Люди сопротивляются новому, даже если понимают, что оно к лучшему». Знаю — и всё равно каждый раз удивляюсь. Вроде человек сам просил помощи. Вроде сам понимает, что надо что-то менять. А потом — тишина. Или отговорки. Или просто игнор.",[12,4492,4493],{},"Может, конечно, это я где-то не так подхожу. Может, не умею правильно донести. Может, навязываюсь там, где не надо.",[12,4495,4496],{},"А может, всё просто — помочь можно только тому, кто сам готов эту помощь принять. Не за руку тянуть, а просто быть рядом, когда спросят.",[12,4498,4499],{},"Но всё равно — хочется. Чтобы получалось. Чтобы не зря.",[25,4501,4502],{},[12,4503,4504],{},"«...и может быть станем, станем мы друг другу нужней...» — иногда эта строчка из 7Б застревает в голове. Вот бы так. Вот бы получалось.",{"title":113,"searchDepth":794,"depth":794,"links":4506},[],"2026-03-13","О желании приносить пользу и о том, почему это не всегда получается",{"externalLinks":4510},{"telegram":4511},"tg:\u002F\u002Fresolve?domain=strunimisli&post=11","\u002Fblog\u002F2026-03-13-help-people",{"title":4476,"description":4508},"blog\u002F2026-03-13-help-people",[4516,3784],"личное","j1sATirO1E67Dnf68VmZhA_IgY7DXmNZg0NdbGYVxho",{"id":4519,"title":4520,"acrostic":7,"body":4521,"date":4598,"description":4599,"duration":7,"emoji":7,"extension":816,"faq":7,"featured":817,"format":7,"image":7,"level":7,"media":7,"meta":4600,"navigation":819,"path":4601,"price":7,"schedule":7,"seo":4602,"seoTitle":7,"serviceType":7,"status":7,"stem":4603,"tags":4604,"tech":7,"toc":817,"url":7,"__hash__":4606},"blog\u002Fblog\u002F2026-03-10-ai-changed-rules.md","AI изменил правила: как один разработчик заменяет команду",{"type":9,"value":4522,"toc":4592},[4523,4526,4530,4536,4542,4546,4572,4576,4579,4582,4586],[12,4524,4525],{},"За 30 лет в IT я видел много технологических революций. Но ни одна из них не была такой быстрой и глубокой, как AI.",[39,4527,4529],{"id":4528},"было-стало","Было \u002F Стало",[12,4531,4532,4535],{},[34,4533,4534],{},"Раньше:"," чтобы создать SaaS-продукт, нужна команда из 5-10 человек. Frontend, backend, дизайнер, DevOps, тестировщик.",[12,4537,4538,4541],{},[34,4539,4540],{},"Сейчас:"," один разработчик с AI-инструментами делает то же самое. Claude пишет код, GPT генерирует контент, Replicate создаёт изображения, а я собираю всё это в продукт.",[39,4543,4545],{"id":4544},"мой-стек-продуктивности","Мой стек продуктивности",[47,4547,4548,4554,4560,4566],{},[50,4549,4550,4553],{},[34,4551,4552],{},"Claude Code"," — написание и рефакторинг кода",[50,4555,4556,4559],{},[34,4557,4558],{},"Yandex GPT"," — генерация контента на русском",[50,4561,4562,4565],{},[34,4563,4564],{},"GPT-4"," — сложные аналитические задачи",[50,4567,4568,4571],{},[34,4569,4570],{},"Replicate"," — генерация изображений",[39,4573,4575],{"id":4574},"что-это-меняет","Что это меняет",[12,4577,4578],{},"Порог входа в создание продуктов снизился радикально. Теперь важна не размер команды, а качество идеи и способность быстро итерировать.",[12,4580,4581],{},"Один человек с правильными инструментами может конкурировать с командами. Не потому что он лучше — потому что AI убрал bottleneck в исполнении.",[39,4583,4585],{"id":4584},"главный-навык-2026-года","Главный навык 2026 года",[12,4587,4588,4589,37],{},"Не программирование. Не дизайн. А умение правильно декомпозировать задачу и поставить её AI. Это новый вид инженерии — ",[34,4590,4591],{},"инженерия промптов и процессов",{"title":113,"searchDepth":794,"depth":794,"links":4593},[4594,4595,4596,4597],{"id":4528,"depth":794,"text":4529},{"id":4544,"depth":794,"text":4545},{"id":4574,"depth":794,"text":4575},{"id":4584,"depth":794,"text":4585},"2026-03-10","30 лет в IT научили меня одному — адаптируйся или проиграешь",{},"\u002Fblog\u002F2026-03-10-ai-changed-rules",{"title":4520,"description":4599},"blog\u002F2026-03-10-ai-changed-rules",[825,3784,4605],"продуктивность","7X2yLb6-QceOE5kpg_oozrJoijN8dDcvIY7BrTS4oZI",{"id":4608,"title":4609,"acrostic":7,"body":4610,"date":4629,"description":4630,"duration":7,"emoji":7,"extension":816,"faq":7,"featured":817,"format":7,"image":7,"level":7,"media":7,"meta":4631,"navigation":819,"path":4634,"price":7,"schedule":7,"seo":4635,"seoTitle":7,"serviceType":7,"status":7,"stem":4636,"tags":4637,"tech":7,"toc":817,"url":7,"__hash__":4638},"blog\u002Fblog\u002F2026-03-09-struny-myslej.md","Струны мыслей",{"type":9,"value":4611,"toc":4627},[4612,4615,4618,4621,4624],[12,4613,4614],{},"Решил завести этот канал для себя. Не для проекта, не для аудитории — просто место, куда можно положить мысли, которые сами просятся наружу.",[12,4616,4617],{},"Я Александр. Разработчик, предприниматель, музыкант. Странное сочетание, но мне кажется, именно оно делает меня тем, кто я есть. В голове постоянно что-то происходит — то про AI и технологии, то про то, как строить дела, то про то, как всё это не усложнять. А ещё есть музыка. Она занимает огромное место в моей душе, и здесь я буду делиться своими произведениями — не потому что они идеальные, а потому что они мои.",[12,4619,4620],{},"Это не бизнес-канал. Это дневник. Записи о том, что думаю, пока еду куда-то или сижу ночью с гитарой. Мысли об AI, который меня завораживает. Размышления о стартапах — не как учить, а как самому ошибаться и учиться. Продуктивность — но без токсичного позитива, просто честно о том, что работает и что нет.",[12,4622,4623],{},"А ещё здесь будет музыка. Не концертные записи и не продакшн уровня студии — живой звук, мысли в нотах, иногда просто настроение, которое вылилось в мелодию.",[12,4625,4626],{},"Если это кому-то откликнется — хорошо. Если нет — тоже.",{"title":113,"searchDepth":794,"depth":794,"links":4628},[],"2026-03-09","Зачем я завёл личный канал — место для мыслей, музыки и честных записей",{"externalLinks":4632},{"telegram":4633},"tg:\u002F\u002Fresolve?domain=strunimisli&post=2","\u002Fblog\u002F2026-03-09-struny-myslej",{"title":4609,"description":4630},"blog\u002F2026-03-09-struny-myslej",[4516],"8LfKUqraECTM7ZDjCDyccqANqrJYF254hFHJ80YToJk",{"id":4640,"title":4641,"acrostic":7,"body":4642,"date":4744,"description":4745,"duration":7,"emoji":7,"extension":816,"faq":7,"featured":817,"format":7,"image":7,"level":7,"media":7,"meta":4746,"navigation":819,"path":4747,"price":7,"schedule":7,"seo":4748,"seoTitle":7,"serviceType":7,"status":7,"stem":4749,"tags":4750,"tech":7,"toc":817,"url":7,"__hash__":4752},"blog\u002Fblog\u002F2026-03-08-architecture.md","Архитектура TiROBOTS: как устроена AI‑платформа",{"type":9,"value":4643,"toc":4738},[4644,4647,4651,4677,4681,4684,4698,4701,4705,4711,4714,4718],[12,4645,4646],{},"Когда я начинал TiROBOTS, стояла задача: построить платформу, которая будет легко масштабироваться и поддерживаться одним разработчиком.",[39,4648,4650],{"id":4649},"стек","Стек",[47,4652,4653,4659,4665,4671],{},[50,4654,4655,4658],{},[34,4656,4657],{},"Frontend:"," Vue 3 + Tailwind CSS",[50,4660,4661,4664],{},[34,4662,4663],{},"Backend:"," Strapi 5 (headless CMS)",[50,4666,4667,4670],{},[34,4668,4669],{},"AI:"," Yandex GPT для текстов, Replicate для изображений",[50,4672,4673,4676],{},[34,4674,4675],{},"Инфраструктура:"," PM2, Nginx, Ubuntu",[39,4678,4680],{"id":4679},"почему-strapi","Почему Strapi",[12,4682,4683],{},"Strapi даёт из коробки:",[47,4685,4686,4689,4692,4695],{},[50,4687,4688],{},"REST и GraphQL API",[50,4690,4691],{},"Админку для контент-менеджмента",[50,4693,4694],{},"Систему ролей и прав",[50,4696,4697],{},"Кастомные контроллеры",[12,4699,4700],{},"Это позволило сосредоточиться на бизнес-логике, а не на бойлерплейте.",[39,4702,4704],{"id":4703},"архитектура-ai-пайплайна","Архитектура AI-пайплайна",[107,4706,4709],{"className":4707,"code":4708,"language":112},[110],"Тема → Генерация текста (GPT) → Ревью (Главный редактор) → Генерация изображения (Replicate) → Публикация\n",[62,4710,4708],{"__ignoreMap":113},[12,4712,4713],{},"Каждый этап — отдельный сервис. Если AI сгенерировал плохой текст, главный редактор отправляет на переработку.",[39,4715,4717],{"id":4716},"уроки","Уроки",[166,4719,4720,4726,4732],{},[50,4721,4722,4725],{},[34,4723,4724],{},"Не усложняй раньше времени."," Начал с монолита, разделю когда понадобится",[50,4727,4728,4731],{},[34,4729,4730],{},"AI нужен контекст."," Чем больше контекста даёшь модели, тем лучше результат",[50,4733,4734,4737],{},[34,4735,4736],{},"Мониторинг критичен."," Когда роботы работают 24\u002F7, нужно знать что происходит",{"title":113,"searchDepth":794,"depth":794,"links":4739},[4740,4741,4742,4743],{"id":4649,"depth":794,"text":4650},{"id":4679,"depth":794,"text":4680},{"id":4703,"depth":794,"text":4704},{"id":4716,"depth":794,"text":4717},"2026-03-08","Vue 3 + Strapi 5 + Yandex GPT — как всё это работает вместе",{},"\u002Fblog\u002F2026-03-08-architecture",{"title":4641,"description":4745},"blog\u002F2026-03-08-architecture",[4751,1178,4447,4446],"tirobots","I9NByyPwHKcDOaujP1aG__wCvuDpnp1_j90iJN4BB6o",{"id":4754,"title":4755,"acrostic":7,"body":4756,"date":4832,"description":4833,"duration":7,"emoji":7,"extension":816,"faq":7,"featured":817,"format":7,"image":7,"level":7,"media":7,"meta":4834,"navigation":819,"path":4835,"price":7,"schedule":7,"seo":4836,"seoTitle":7,"serviceType":7,"status":7,"stem":4837,"tags":4838,"tech":7,"toc":817,"url":7,"__hash__":4840},"blog\u002Fblog\u002F2026-03-07-how-it-started.md","Как я решил автоматизировать контент‑маркетинг",{"type":9,"value":4757,"toc":4825},[4758,4761,4765,4768,4772,4775,4779,4782,4796,4799,4803,4806,4820,4822],[12,4759,4760],{},"Всё началось с простого наблюдения: ведение контент-каналов отнимает безумное количество времени. Придумать тему, написать текст, сделать картинку, опубликовать в нужное время — и так каждый день.",[39,4762,4764],{"id":4763},"проблема","Проблема",[12,4766,4767],{},"Я вёл несколько Telegram-каналов и тратил на это 10-15 часов в неделю. При этом качество контента было нестабильным — когда устаёшь, посты получаются хуже.",[39,4769,4771],{"id":4770},"идея","Идея",[12,4773,4774],{},"А что если AI может не просто помогать с текстом, а полностью вести канал? С определённым tone of voice, стратегией, расписанием?",[39,4776,4778],{"id":4777},"первые-эксперименты","Первые эксперименты",[12,4780,4781],{},"Начал с простого — скрипт, который:",[166,4783,4784,4787,4790,4793],{},[50,4785,4786],{},"Берёт тему из списка",[50,4788,4789],{},"Генерирует текст через Yandex GPT",[50,4791,4792],{},"Создаёт изображение через Replicate",[50,4794,4795],{},"Публикует в Telegram по расписанию",[12,4797,4798],{},"Результат превзошёл ожидания. Посты были не хуже написанных вручную, а иногда даже лучше — AI не устаёт и не теряет фокус.",[39,4800,4802],{"id":4801},"от-скрипта-к-платформе","От скрипта к платформе",[12,4804,4805],{},"Один скрипт превратился в платформу TiROBOTS. Добавил:",[47,4807,4808,4811,4814,4817],{},[50,4809,4810],{},"Веб-интерфейс для управления",[50,4812,4813],{},"Роль «Главного редактора» — задаёт стратегию",[50,4815,4816],{},"Несколько AI-роботов с разными специализациями",[50,4818,4819],{},"Аналитику эффективности",[39,4821,1752],{"id":1751},[12,4823,4824],{},"Сейчас TiROBOTS — это полноценная платформа для автоматизации контент-маркетинга. Но я вижу её будущее шире — как хаб AI-роботов для разных задач бизнеса.",{"title":113,"searchDepth":794,"depth":794,"links":4826},[4827,4828,4829,4830,4831],{"id":4763,"depth":794,"text":4764},{"id":4770,"depth":794,"text":4771},{"id":4777,"depth":794,"text":4778},{"id":4801,"depth":794,"text":4802},{"id":1751,"depth":794,"text":1752},"2026-03-07","От идеи до продакшена — один разработчик и один AI",{},"\u002Fblog\u002F2026-03-07-how-it-started",{"title":4755,"description":4833},"blog\u002F2026-03-07-how-it-started",[825,4751,4839],"история","qMmW7-j3p9MkqKRv_DaoI98E0BUne2t3e_RgyJ3sbFU",{"id":4842,"title":4843,"acrostic":7,"body":4844,"date":4851,"description":4852,"duration":7,"emoji":7,"extension":816,"faq":7,"featured":817,"format":7,"image":7,"level":7,"media":4853,"meta":4856,"navigation":819,"path":4857,"price":7,"schedule":7,"seo":4858,"seoTitle":7,"serviceType":7,"status":7,"stem":4859,"tags":4860,"tech":7,"toc":817,"url":7,"__hash__":4861},"blog\u002Fblog\u002F2025-06-01-potihonechku-daleko-cover.md","Потихонечку — далеко (Cover)",{"type":9,"value":4845,"toc":4849},[4846],[12,4847,4848],{},"Акустический кавер.",{"title":113,"searchDepth":794,"depth":794,"links":4850},[],"2025-06-01","Кавер на акустической гитаре.",[4854],{"type":4465,"url":4855,"title":4843},"\u002Fmusic\u002Fpotikhonechku-daleko-cover.mp3",{},"\u002Fblog\u002F2025-06-01-potihonechku-daleko-cover",{"title":4843,"description":4852},"blog\u002F2025-06-01-potihonechku-daleko-cover",[4472],"PaLnyOBXJVyRw6jbiuQbGjBB89QMGwFGXCYQ9qDbFco",{"id":4863,"title":4864,"acrostic":7,"body":4865,"date":4872,"description":4873,"duration":7,"emoji":7,"extension":816,"faq":7,"featured":817,"format":7,"image":7,"level":7,"media":4874,"meta":4877,"navigation":819,"path":4878,"price":7,"schedule":7,"seo":4879,"seoTitle":7,"serviceType":7,"status":7,"stem":4880,"tags":4881,"tech":7,"toc":817,"url":7,"__hash__":4882},"blog\u002Fblog\u002F2025-01-24-improvizaciya.md","Импровизация (24 января)",{"type":9,"value":4866,"toc":4870},[4867],[12,4868,4869],{},"Fingerstyle-импровизация на акустической гитаре.",{"title":113,"searchDepth":794,"depth":794,"links":4871},[],"2025-01-24","Акустическая гитара, fingerstyle импровизация.",[4875],{"type":4465,"url":4876,"title":4864},"\u002Fmusic\u002F24-jan-1115.mp3",{},"\u002Fblog\u002F2025-01-24-improvizaciya",{"title":4864,"description":4873},"blog\u002F2025-01-24-improvizaciya",[4472],"bjdlpCC2vLziYprV48lRGPUnbx7MvLr1ZZh8Q72u-cg",{"id":4884,"title":4885,"acrostic":7,"body":4886,"date":4908,"description":4909,"duration":7,"emoji":7,"extension":816,"faq":7,"featured":817,"format":7,"image":7,"level":7,"media":7,"meta":4910,"navigation":819,"path":4911,"price":7,"schedule":7,"seo":4912,"seoTitle":7,"serviceType":7,"status":7,"stem":4913,"tags":4914,"tech":7,"toc":817,"url":7,"__hash__":4915},"blog\u002Fblog\u002F2020-01-01-deneg-kotorykh-net.md","Деньги, которых нет",{"type":9,"value":4887,"toc":4906},[4888,4891,4894,4897,4900,4903],[12,4889,4890],{},"У меня была беседа с человеком, который успешно играл на бирже и однажды решил вывести все деньги в кэш.",[12,4892,4893],{},"Уж так он успешно до этого играл, что денег оказалось очень много. Вот прям реально несколько чемоданов.",[12,4895,4896],{},"Это, как он рассказывал, тоже было недёшево – комиссия за обналичивание такой суммы была запредельной, но он всё же пошел на эту трату, так как был твёрд в своем решении. В этот момент, говорит, когда ему озвучили размер комиссионных, он в первый раз почувствовал укол какой-то плохо еще осознаваемой мысли.",[12,4898,4899],{},"Ну вот, говорит, посидел на чемоданах пару дней, он пошел и купил за наличные панамеру. Мог, в принципе, какую угодно тачку купить, но эта вот попала под руку, как говорится. Эта покупка была похожа на небольшой перерасчет портфеля акций в связи с коррекцией рынка. Пока он не видел этих денег вживую, он по-другому ощущал их ценность, поэтому для него было открытием, что оказывается вымутить понамеру, а для держателя капитала это можно объяснить коррекцией.",[12,4901,4902],{},"Потом он сделал еще несколько покупок, но быстро понял, что это тупо. Тупо держать такую большую сумму в чемоданах, да еще и собранных в одном месте. Тупо, что это место – квартира. Тупо вообще вся эта затея.",[12,4904,4905],{},"Деньги были переведены обратно в безнал.",{"title":113,"searchDepth":794,"depth":794,"links":4907},[],"2020-01-01","Человек, который обналичил всё",{},"\u002Fblog\u002F2020-01-01-deneg-kotorykh-net",{"title":4885,"description":4909},"blog\u002F2020-01-01-deneg-kotorykh-net",[4839,3784],"-L0m9kWzyTo3Yzr5IU88DYVwJcPWWrJdWyvz1a7yjqo",{"id":4917,"title":4918,"acrostic":7,"body":4919,"date":4908,"description":4935,"duration":7,"emoji":7,"extension":816,"faq":7,"featured":817,"format":7,"image":7,"level":7,"media":7,"meta":4936,"navigation":819,"path":4937,"price":7,"schedule":7,"seo":4938,"seoTitle":7,"serviceType":7,"status":7,"stem":4939,"tags":4940,"tech":7,"toc":817,"url":7,"__hash__":4941},"blog\u002Fblog\u002F2020-01-01-dragotsennyj-kamen.md","Драгоценный камень в куче угля",{"type":9,"value":4920,"toc":4933},[4921,4924,4927,4930],[12,4922,4923],{},"Однажды я нашёл в куче угля маленький рубин. Дело было так. Еще с детства у меня в голове отложилась информация, что в угле можно найти много чего интересного. Например, ракушку древнего моллюска. Потом я узнал как появляются драгоценные камни и где их чаще всего находят. В принципе, для получения каменного угля и для получения драгоценных камней необходимы сходные процессы – высокое давление и температура. Поэтому, есть не нулевая вероятность найти в куче угля драгоценный камень.",[12,4925,4926],{},"Дело происходило, когда я служил в армии. Привезли уголь и сгрузили его на территории склада, к которому мы были прикомандированы. И вот сидели мы как-то с пацанами рядом с этой кучей, я им рассказываю про эту вот не нулевую вероятность и у них на глазах начинаю искать. Поискав какое-то время, бросаю это занятие, ребята посмеиваются. Потом, на следующий день я опять присаживался рядом с кучей и сидел, внимательно просматривая каждый квадратный сантиметр. Прошло несколько дней. И вот однажды я нашёл! Маленький камушек рубинового цвета. Кто-то из парней предложил попробовать поцарапать стекло этим камушком. Мол, если расцарапает, то да действительно рубин. У меня было зеркальце и мы попробовали им поцарапать поверхность. Камешек уверенно прорезал борозду на стекле!",[12,4928,4929],{},"К чему я это рассказываю?",[12,4931,4932],{},"Я много раз был свидетелем того, как происходили события, вероятность которых была крайне мала.",{"title":113,"searchDepth":794,"depth":794,"links":4934},[],"Не нулевая вероятность",{},"\u002Fblog\u002F2020-01-01-dragotsennyj-kamen",{"title":4918,"description":4935},"blog\u002F2020-01-01-dragotsennyj-kamen",[4839,3784],"ReSvh8Q8ni8J7tDte_S_5SolExGDBVCMxmtEAIRGbv0",{"id":4943,"title":4944,"acrostic":7,"body":4945,"date":4908,"description":4952,"duration":7,"emoji":7,"extension":816,"faq":7,"featured":817,"format":7,"image":7,"level":7,"media":7,"meta":4953,"navigation":819,"path":4954,"price":7,"schedule":7,"seo":4955,"seoTitle":7,"serviceType":7,"status":7,"stem":4956,"tags":4957,"tech":7,"toc":817,"url":7,"__hash__":4959},"blog\u002Fblog\u002F2020-01-01-lyudi-pozhivshie.md","Люди, пожившие на этом свете",{"type":9,"value":4946,"toc":4950},[4947],[12,4948,4949],{},"Люди, пожившие на этом свете, наполнятся воспоминаниями и размышлениями о событиях, которые травмируют их психику. Дети помогают не сойти с ума. Это банальная мысль – рождаемость должна быть, как минимум на том же уровне, как и смертность, а лучше выше, чтобы цивилизация развивалась. Но функция детей не только продолжение рода, но и помощь взрослым. Без них взрослые бы «загнались».",{"title":113,"searchDepth":794,"depth":794,"links":4951},[],"Дети помогают не сойти с ума",{},"\u002Fblog\u002F2020-01-01-lyudi-pozhivshie",{"title":4944,"description":4952},"blog\u002F2020-01-01-lyudi-pozhivshie",[4958,3784],"размышление","zUyXsqORRwh6hQ778jHyNVtVIac8gRo8Wszdg8guXOs",{"id":4961,"title":4962,"acrostic":7,"body":4963,"date":4908,"description":4979,"duration":7,"emoji":7,"extension":816,"faq":7,"featured":817,"format":7,"image":7,"level":7,"media":7,"meta":4980,"navigation":819,"path":4981,"price":7,"schedule":7,"seo":4982,"seoTitle":7,"serviceType":7,"status":7,"stem":4983,"tags":4984,"tech":7,"toc":817,"url":7,"__hash__":4985},"blog\u002Fblog\u002F2020-01-01-pustye-otnosheniya.md","Пустые, ненужные отношения",{"type":9,"value":4964,"toc":4977},[4965,4968,4971,4974],[12,4966,4967],{},"Как так получилось, что то, что имело большую ценность, стало пустым и ненужным? Я пытаюсь разгадать, что это? К чему этот урок? И закончен ли он?",[12,4969,4970],{},"Может то, что мне сейчас кажется пустым, попозже будет видеться обратным?",[12,4972,4973],{},"Чтобы продвигаться, нам необходимо принимать решения. Каждое принятое решение – это смена, корректировка курса. И получается, что мой корабль попал в магнитную аномалию. Компас показывает удивительное…",[12,4975,4976],{},"Когда барахлит компас, отложите в сторону карты. Просто внимательно смотрите вперед, чтобы вовремя обруливать препятствия и ждите ночей, чтобы ориентироваться по звёздам.",{"title":113,"searchDepth":794,"depth":794,"links":4978},[],"Когда барахлит компас, смотрите на звёзды",{},"\u002Fblog\u002F2020-01-01-pustye-otnosheniya",{"title":4962,"description":4979},"blog\u002F2020-01-01-pustye-otnosheniya",[4958],"tQYgVIj0RrbHM-2pue2OefsdjMD46CkFc3HL5StVQZ0",{"id":4987,"title":4988,"acrostic":7,"body":4989,"date":4908,"description":5031,"duration":7,"emoji":7,"extension":816,"faq":7,"featured":817,"format":7,"image":7,"level":7,"media":7,"meta":5032,"navigation":819,"path":5033,"price":7,"schedule":7,"seo":5034,"seoTitle":7,"serviceType":7,"status":7,"stem":5035,"tags":5036,"tech":7,"toc":817,"url":7,"__hash__":5037},"blog\u002Fblog\u002F2020-01-01-sobralsya-ya-umirat.md","Собрался я умирать, ребята…",{"type":9,"value":4990,"toc":5029},[4991,4993,4996,4999,5002,5005,5008,5011,5014,5017,5020,5023,5026],[12,4992,4988],{},[12,4994,4995],{},"Не переживайте, речь не о суициде. Просто что-то сегодня замкнуло в моей голове и как-то стало очень понятно, что времени-то всё меньше! А я туплю.",[12,4997,4998],{},"Задал себе такой вот вопрос – вот если умру прям сейчас, что останется недоделанным? К осуществлению каких целей, желаний я даже не приступал, откладывая их «до лучших времен»?",[12,5000,5001],{},"Ну набралось у меня парочка, да и то, в принципе, не такие уж и критично важные… Я уже так давно живу с пониманием механизма материализации мысли, что все мои мечты уже сбылись. Только и успеваю придумывать что-нибудь новое, потом реализовывать.",[12,5003,5004],{},"В конечном итоге, каждый получает то, что он хочет. Та ситуация, в которой вы сейчас находитесь, образовалась в результате ваших стремлений и связанных с ними решений.",[12,5006,5007],{},"Если вы предприниматель со стажем, то вы меня поймете. Когда над тобой нет начальника, то вы сами определяете, чем вам и когда заниматься. Это классная штука – свобода, но есть обратная сторона у этой медали. Впрочем, это не медаль. Свободу не вручают и не выдают в кассе. Свободу берут. И вот я беру уже эту свободу с 2003 года, как открыл свое первое юрлицо. Сначала о чем-то просто мечтаю, если мечта манит, то меняю статус «мечта» на «цель», потом делаю шаг на пути к ней, другой, третий и всегда (!) обнаруживаю, что мне помогают. Разное в помощь. Люди, конечно же, в первую очередь. Но частенько случаются случайности, типа того, как подходишь к пешеходному переходу и в этот момент, как раз загорается зеленый свет. Ну ладно, речь не о вселенской помощи.",[12,5009,5010],{},"Я понял, что не так уж много, как оказалось, у меня таких мечт, которые я откладывал в долгий ящик… А мечты, которые я не успел воплотить – это и не мечты вовсе, а просто видение будущего. Вот будут еще дирижабли летать повсеместно, увидите сами!",[12,5012,5013],{},"Да и хрен с ними, мне тут подумалось, с этими неисполненными мечтами. Отпустил их и понял… что готов умереть. Ничего такого страшного не произойдет. Я везде, где надо, продублировал доступы надежным людям к всяким там сайтам и панелям управления, ну а то, что загнется без меня, значит не так и нужно было…",[12,5015,5016],{},"Эта вот «готовность» меня ошеломила.",[12,5018,5019],{},"А вот дальше пришло осознание, что это есть главное отличие нас, мужчин, от женщин. Женщина должна жить ради жизни, а от мужчины требуется готовность умереть ради неё.",[12,5021,5022],{},"Только не надо путать готовность и желание)",[12,5024,5025],{},"Новый уровень свободы.",[12,5027,5028],{},"А в ситуации, когда внутри нас борются два противоречивых желания, побеждает тот волк, которого мы лучше кормим",{"title":113,"searchDepth":794,"depth":794,"links":5030},[],"Не переживайте, речь не о суициде",{},"\u002Fblog\u002F2020-01-01-sobralsya-ya-umirat",{"title":4988,"description":5031},"blog\u002F2020-01-01-sobralsya-ya-umirat",[4958],"gBdlbvxE_crJNRBWgREvua6YSVu4hnSEXac6cQ4OSF4",{"id":5039,"title":5040,"acrostic":7,"body":5041,"date":4908,"description":5066,"duration":7,"emoji":7,"extension":816,"faq":7,"featured":817,"format":7,"image":7,"level":7,"media":7,"meta":5067,"navigation":819,"path":5068,"price":7,"schedule":7,"seo":5069,"seoTitle":7,"serviceType":7,"status":7,"stem":5070,"tags":5071,"tech":7,"toc":817,"url":7,"__hash__":5072},"blog\u002Fblog\u002F2020-01-01-topchemy-na-meste.md","Топчемся на месте или двигаемся?",{"type":9,"value":5042,"toc":5064},[5043,5046,5049,5052,5055,5058,5061],[12,5044,5045],{},"Мы представляем из себя то, о чём думаем целыми днями. В каждом мгновении, которое мы проживаем, мы имеем возможность поменять направление нашего движения. Конечно, есть такое понятие, как инерция и поэтому после поворота руля, корабль еще всё равно двигается в прежнем направлении. Кроме того, иногда нужно сменить курс, чтобы обогнуть какое-то препятствие и в этот момент, со стороны кажется, что мы двигаемся совсем не в том направлении, в котором надо бы. Мы не плывем по течению, не плывем против течения, мы плывём к цели! Лавируя между кусками дерьма, плывущиму навстречу, мы можем даже в какой-то момент оказаться на месте, где уже были раньше и тогда кто-то имеет право сказать, что мы топчемся на месте. Но! Мы живы, мы вместе, а значит всё хорошо. Главное не забывать о цели. Вот о ней я и хочу порассуждать.",[12,5047,5048],{},"За последнее время я все чаще дискутирую с разными людьми о цели бизнеса. В уставе каждой компании сказано, что цель бизнеса – прибыль. Поэтому, бизнесмены сначала очень удивляются и смотрят на меня, как на дурака, когда я им заявляю, что никогда не ставил прибыль во главу угла. Я хочу большего, чем просто прибыль. Стремление к гармонии – вот главный мой императив. А что такое гармония? Универсального ответа, справедливого для всех, наверное нет. Да я и не хочу говорить за всех. Скажу за себя – гармония это когда совесть не болит. А у меня она не болит. Я знаю, что есть за мной грешки, типа не заплаченных вовремя пенсионных взносов или налогов, но всё равно не болит! И не потому, что знаю, как распределяются эти налоги, а потому знаю, что я, как единица, приношу ПОЛЬЗУ окружающим меня людям. Польза эта выражается по разному. Это может быть быстрая реакция на сломавшийся сервер, может просто подбадривающие слова, а может и обратное – вот к примеру, вчера я сознательно отключил сервер одной фирме, которая уже пять месяцев не платит за хостинг. У нас там такие отношения с владельцами компании, что я могу быть спокоен – эти неоплаченные месяцы в конце концов будут всё же оплачены. Я и не отключал, просто напоминал об этом периодически управляющим. У меня есть понимание, что тот факт, что я всё же отключил сервер, создало проблемы для управляющих и, может быть, их даже могут уволить. Но уволят их за халатность, а это значит эта компания получит шанс стать лучше (если, конечно, на их место придут менее халатные люди). А те, кого уволят, получат шанс задуматься над своими ошибками и больше их не совершать.",[12,5050,5051],{},"Кто-то согласен работать с мудаками, лишь бы они деньги платили. Они любят говорить фразу: «Ничего личного – это бизнес». А я не такой! Как только я вычисляю мудака, я стремлюсь порвать с ним отношения. И не жалко мне незаработанных миллионов!",[12,5053,5054],{},"Такая стратегия возможна, только когда есть на кого опереться. Я и опираюсь. Опираюсь на родителей. Опираюсь на жену, когда по несколько месяцев нет доходов и мы оплачиваем продукты и секции там всякие, на которые ходит ребенок, её зарплатой. Опираюсь на друзей, когда прихожу к ним, чтобы погреться немного.",[12,5056,5057],{},"Опираюсь и знаю, что моя стратегия, как бумеранг, приносит мне счастье. Не контактировать с мудаками – это ли не счастье? Не счастье ли иметь теплые дружественные отношения с клиентами? А не счастье ли, когда твой сотрудник, говорит самокритично о своей работе? Я уже долго следую своей стратегии и это дает плоды – мудаков в моем близком окружении нет. Я счастлив)",[12,5059,5060],{},"Мы не топчемся на месте. Мы развиваемся и этот процесс не всегда напоминает рост дерева. Потому что мы не деревья. Мы делаем ошибки, учимся на них. Или не учимся и тогда, ситуации повторяются, пока мы не научимся.",[12,5062,5063],{},"У меня спрашивают, трудно ли быть предпринимателем. Надо просто любить людей, отвечаю я им. И вот этому-то и приходится всё время учиться. Как только научишься немного, обретешь внутренний стержень. Учась дальше, обретаешь надежную команду. Продвигаясь дальше в своем обучении, обретаешь хороших клиентов. А там и благоденствие недалеко!",{"title":113,"searchDepth":794,"depth":794,"links":5065},[],"Стремление к гармонии — главный императив",{},"\u002Fblog\u002F2020-01-01-topchemy-na-meste",{"title":5040,"description":5066},"blog\u002F2020-01-01-topchemy-na-meste",[4958],"eMNLdEQLUgyNA5v4U5102TDtXN-LhPi7dYJA8UdRZog",[5074,5086],{"slug":5075,"title":5076,"date":5077,"tags":5078,"description":5081,"media":5082,"externalLinks":5083,"source":5084,"publishedAt":5085},"2026-06-03-odin-na-odin-s-beskonechnostyu","Один на один с бесконечностью","2026-06-03",[3784,4098,5079,5080],"космос","чудо","Один во Вселенной — это тюрьма или школа любви? Размышление о том, почему мы не видим других цивилизаций, и что это говорит о нас самих.",[],{},"openclaw-voice-transcription","2026-06-03T09:18:41.161Z",{"slug":5087,"title":5088,"date":5089,"tags":5090,"description":5091,"media":5092,"externalLinks":5093,"source":5094,"publishedAt":5095},"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":5097,"date":814,"description":815,"duration":7,"emoji":7,"extension":816,"faq":7,"featured":817,"format":7,"image":7,"level":7,"media":7,"meta":5637,"navigation":819,"path":820,"price":7,"schedule":7,"seo":5638,"seoTitle":822,"serviceType":7,"status":7,"stem":823,"tags":5639,"tech":7,"toc":819,"url":7,"__hash__":830},{"type":9,"value":5098,"toc":5618},[5099,5101,5103,5105,5107,5111,5115,5117,5119,5147,5152,5154,5156,5161,5163,5167,5169,5171,5173,5177,5179,5181,5183,5185,5190,5204,5206,5208,5210,5212,5217,5219,5221,5223,5228,5230,5234,5236,5238,5256,5258,5260,5262,5267,5269,5271,5276,5278,5320,5322,5324,5326,5328,5334,5336,5350,5352,5354,5358,5360,5362,5376,5378,5380,5382,5384,5389,5391,5393,5395,5397,5399,5401,5417,5419,5421,5426,5428,5430,5432,5434,5448,5450,5452,5454,5456,5461,5463,5465,5469,5471,5476,5478,5480,5492,5494,5496,5498,5500,5502,5504,5520,5522,5538,5542,5544,5548,5550,5552,5556,5558,5574,5576,5578,5583,5585,5587,5589,5594,5596,5598,5608,5610,5612,5614],[12,5100,14],{},[12,5102,17],{},[12,5104,20],{},[12,5106,23],{},[25,5108,5109],{},[12,5110,29],{},[12,5112,32,5113,37],{},[34,5114,36],{},[39,5116,42],{"id":41},[12,5118,45],{},[47,5120,5121,5123,5125,5127,5131,5137,5139,5141,5143,5145],{},[50,5122,52],{},[50,5124,55],{},[50,5126,58],{},[50,5128,5129,65],{},[62,5130,64],{},[50,5132,5133,71,5135,65],{},[62,5134,70],{},[62,5136,74],{},[50,5138,77],{},[50,5140,80],{},[50,5142,83],{},[50,5144,86],{},[50,5146,89],{},[12,5148,92,5149,37],{},[94,5150,99],{"href":96,"rel":5151},[98],[12,5153,102],{},[12,5155,105],{},[107,5157,5159],{"className":5158,"code":111,"language":112,"meta":113},[110],[62,5160,111],{"__ignoreMap":113},[12,5162,118],{},[12,5164,121,5165,124],{},[62,5166,64],{},[12,5168,127],{},[39,5170,131],{"id":130},[12,5172,134],{},[12,5174,137,5175,141],{},[62,5176,140],{},[12,5178,144],{},[12,5180,147],{},[12,5182,150],{},[152,5184,155],{"id":154},[12,5186,158,5187,164],{},[94,5188,163],{"href":161,"rel":5189},[98],[166,5191,5192,5194,5196,5198,5200,5202],{},[50,5193,170],{},[50,5195,173],{},[50,5197,176],{},[50,5199,179],{},[50,5201,182],{},[50,5203,185],{},[12,5205,188],{},[12,5207,191],{},[12,5209,194],{},[152,5211,198],{"id":197},[12,5213,201,5214,37],{},[94,5215,206],{"href":204,"rel":5216},[98],[12,5218,209],{},[12,5220,212],{},[12,5222,215],{},[107,5224,5226],{"className":5225,"code":219,"language":112,"meta":113},[110],[62,5227,219],{"__ignoreMap":113},[12,5229,224],{},[12,5231,227,5232,37],{},[34,5233,230],{},[39,5235,234],{"id":233},[12,5237,237],{},[47,5239,5240,5242,5244,5246,5248,5250,5252,5254],{},[50,5241,242],{},[50,5243,245],{},[50,5245,248],{},[50,5247,251],{},[50,5249,254],{},[50,5251,257],{},[50,5253,260],{},[50,5255,263],{},[12,5257,266],{},[12,5259,269],{},[12,5261,272],{},[107,5263,5265],{"className":5264,"code":276,"language":112,"meta":113},[110],[62,5266,276],{"__ignoreMap":113},[12,5268,281],{},[12,5270,284],{},[12,5272,287,5273,293],{},[94,5274,292],{"href":290,"rel":5275},[98],[12,5277,296],{},[298,5279,5280,5288],{},[301,5281,5282],{},[304,5283,5284,5286],{},[307,5285,309],{},[307,5287,198],{},[313,5289,5290,5296,5302,5308,5314],{},[304,5291,5292,5294],{},[318,5293,320],{},[318,5295,323],{},[304,5297,5298,5300],{},[318,5299,328],{},[318,5301,331],{},[304,5303,5304,5306],{},[318,5305,336],{},[318,5307,339],{},[304,5309,5310,5312],{},[318,5311,344],{},[318,5313,347],{},[304,5315,5316,5318],{},[318,5317,352],{},[318,5319,355],{},[12,5321,358],{},[39,5323,362],{"id":361},[12,5325,365],{},[152,5327,369],{"id":368},[12,5329,5330,71,5332,376],{},[62,5331,74],{},[62,5333,70],{},[12,5335,379],{},[47,5337,5338,5340,5342,5344,5346,5348],{},[50,5339,384],{},[50,5341,387],{},[50,5343,390],{},[50,5345,393],{},[50,5347,396],{},[50,5349,399],{},[12,5351,402],{},[12,5353,405],{},[25,5355,5356],{},[12,5357,410],{},[152,5359,414],{"id":413},[12,5361,417],{},[47,5363,5364,5366,5368,5370,5372,5374],{},[50,5365,422],{},[50,5367,425],{},[50,5369,428],{},[50,5371,431],{},[50,5373,434],{},[50,5375,437],{},[12,5377,440],{},[152,5379,444],{"id":443},[12,5381,447],{},[12,5383,450],{},[107,5385,5387],{"className":5386,"code":454,"language":112,"meta":113},[110],[62,5388,454],{"__ignoreMap":113},[12,5390,459],{},[12,5392,462],{},[39,5394,466],{"id":465},[12,5396,469],{},[12,5398,472],{},[12,5400,475],{},[47,5402,5403,5405,5407,5409,5411,5413,5415],{},[50,5404,480],{},[50,5406,483],{},[50,5408,486],{},[50,5410,489],{},[50,5412,492],{},[50,5414,495],{},[50,5416,498],{},[12,5418,501],{},[12,5420,504],{},[107,5422,5424],{"className":5423,"code":508,"language":112,"meta":113},[110],[62,5425,508],{"__ignoreMap":113},[12,5427,513],{},[39,5429,517],{"id":516},[12,5431,520],{},[12,5433,523],{},[47,5435,5436,5438,5440,5442,5444,5446],{},[50,5437,528],{},[50,5439,531],{},[50,5441,534],{},[50,5443,537],{},[50,5445,540],{},[50,5447,543],{},[12,5449,546],{},[12,5451,549],{},[12,5453,552],{},[12,5455,555],{},[107,5457,5459],{"className":5458,"code":559,"language":112,"meta":113},[110],[62,5460,559],{"__ignoreMap":113},[12,5462,564],{},[39,5464,568],{"id":567},[12,5466,571,5467,37],{},[62,5468,574],{},[12,5470,577],{},[107,5472,5474],{"className":5473,"code":581,"language":112,"meta":113},[110],[62,5475,581],{"__ignoreMap":113},[12,5477,586],{},[12,5479,589],{},[166,5481,5482,5484,5486,5488,5490],{},[50,5483,594],{},[50,5485,597],{},[50,5487,600],{},[50,5489,603],{},[50,5491,606],{},[12,5493,609],{},[39,5495,613],{"id":612},[12,5497,616],{},[12,5499,619],{},[12,5501,622],{},[12,5503,625],{},[47,5505,5506,5508,5510,5512,5514,5516,5518],{},[50,5507,630],{},[50,5509,633],{},[50,5511,636],{},[50,5513,639],{},[50,5515,642],{},[50,5517,645],{},[50,5519,648],{},[12,5521,651],{},[47,5523,5524,5526,5528,5530,5532,5534,5536],{},[50,5525,656],{},[50,5527,659],{},[50,5529,662],{},[50,5531,665],{},[50,5533,668],{},[50,5535,671],{},[50,5537,674],{},[12,5539,677,5540,681],{},[62,5541,680],{},[12,5543,684],{},[25,5545,5546],{},[12,5547,689],{},[39,5549,693],{"id":692},[12,5551,696],{},[12,5553,699,5554,702],{},[62,5555,140],{},[12,5557,705],{},[166,5559,5560,5562,5564,5566,5568,5570,5572],{},[50,5561,710],{},[50,5563,713],{},[50,5565,716],{},[50,5567,719],{},[50,5569,722],{},[50,5571,725],{},[50,5573,728],{},[12,5575,731],{},[12,5577,734],{},[107,5579,5581],{"className":5580,"code":738,"language":112,"meta":113},[110],[62,5582,738],{"__ignoreMap":113},[12,5584,743],{},[39,5586,747],{"id":746},[12,5588,750],{},[107,5590,5592],{"className":5591,"code":754,"language":112,"meta":113},[110],[62,5593,754],{"__ignoreMap":113},[12,5595,759],{},[12,5597,762],{},[166,5599,5600,5602,5604,5606],{},[50,5601,767],{},[50,5603,770],{},[50,5605,773],{},[50,5607,776],{},[12,5609,779],{},[12,5611,782],{},[784,5613],{},[12,5615,788,5616,37],{},[94,5617,792],{"href":791},{"title":113,"searchDepth":794,"depth":794,"links":5619},[5620,5621,5625,5626,5631,5632,5633,5634,5635,5636],{"id":41,"depth":794,"text":42},{"id":130,"depth":794,"text":131,"children":5622},[5623,5624],{"id":154,"depth":800,"text":155},{"id":197,"depth":800,"text":198},{"id":233,"depth":794,"text":234},{"id":361,"depth":794,"text":362,"children":5627},[5628,5629,5630],{"id":368,"depth":800,"text":369},{"id":413,"depth":800,"text":414},{"id":443,"depth":800,"text":444},{"id":465,"depth":794,"text":466},{"id":516,"depth":794,"text":517},{"id":567,"depth":794,"text":568},{"id":612,"depth":794,"text":613},{"id":692,"depth":794,"text":693},{"id":746,"depth":794,"text":747},{},{"title":6,"description":815},[825,826,827,828,829],1787677655943]