[{"data":1,"prerenderedAt":6679},["ShallowReactive",2],{"blog-posts":3,"blog-runtime-posts":6464,"blog-2026-08-29-ot-chana-moloka-k-phaseshift":6487},[4,632,925,1437,2228,2577,2846,3195,4271,5177,5265,5390,5491,5842,5865,5909,5998,6030,6144,6232,6253,6274,6307,6333,6351,6377,6429],{"id":5,"title":6,"acrostic":7,"body":8,"date":615,"description":616,"duration":7,"emoji":7,"extension":617,"faq":7,"featured":618,"format":7,"image":7,"level":7,"media":7,"meta":619,"navigation":620,"path":621,"price":7,"schedule":7,"seo":622,"seoTitle":623,"serviceType":7,"status":7,"stem":624,"tags":625,"tech":7,"toc":620,"url":7,"__hash__":631},"blog\u002Fblog\u002F2026-08-29-kogda-nadzor-meshaet-ai-agentam.md","Когда директор мешает AI-агентам работать",null,{"type":9,"value":10,"toc":592},"minimark",[11,21,24,27,30,33,38,41,44,47,99,102,105,109,112,117,120,123,127,130,133,137,140,143,146,150,153,156,172,175,178,181,193,196,200,203,210,213,216,237,240,244,247,250,253,256,259,262,273,276,280,283,286,289,295,298,315,318,338,341,345,348,404,416,419,423,426,432,439,443,446,463,466,470,473,476,480,483,502,505,509,512,518,524,527,530,534,537,540,560,563,567,570,573,576,579,582,585],[12,13,14,15,20],"p",{},"Недавно я описал свою систему работы с проектными AI-агентами как ",[16,17,19],"a",{"href":18},"\u002Fblog\u002F2026-08-27-ai-avtopilot-upravlenie-proektnymi-agentami","автопилот",". У каждого проекта есть отдельный lead-агент, а основной профиль Hermes играет роль директора: следит за границами, проверяет результаты и принимает завершение.",[12,22,23],{},"На схеме всё выглядело убедительно. Затем я дал двум агентам общую большую задачу, оставил директора вести их несколько дней и получил более полезный результат, чем ещё одна удачная демонстрация.",[12,25,26],{},"Система закончила работу. Но директор периодически мешал собственным исполнителям.",[12,28,29],{},"Он отправлял новую команду, пока проектный агент ещё выполнял предыдущую. Сам запускал проверки, которые уже шли в другом контуре. Однажды два управляющих потока дошли до одной операции почти одновременно. Защитные механизмы не допустили опасных последствий, но организационная ошибка была настоящей.",[12,31,32],{},"Это текст о том, почему хороший надзор определяется не количеством проверок, а умением вовремя ничего не делать.",[34,35,37],"h2",{"id":36},"что-мы-на-самом-деле-проверяли","Что мы на самом деле проверяли",[12,39,40],{},"Задача связывала два продукта. Один должен был подготовить данные, второй принять их, сохранить и показать в каталоге. Работа включала API-контракт, фильтрацию, фоновые процессы, интерфейс, тесты, Git, CI, несколько выпусков и проверку живого контура.",[12,42,43],{},"У каждого проекта был свой Hermes-профиль, документация, репозиторий и Telegram-бот. Над ними работал основной профиль. Дополнительно раз в несколько минут просыпался временный governor: читал сообщения, сравнивал их с планом и при необходимости вмешивался.",[12,45,46],{},"Роли изначально были простыми:",[48,49,50,63],"table",{},[51,52,53],"thead",{},[54,55,56,60],"tr",{},[57,58,59],"th",{},"Участник",[57,61,62],{},"Ответственность",[64,65,66,75,83,91],"tbody",{},[54,67,68,72],{},[69,70,71],"td",{},"Владелец",[69,73,74],{},"Цель, приоритеты, допустимый риск, открытие production",[54,76,77,80],{},[69,78,79],{},"Директор",[69,81,82],{},"Границы, контрольные точки, независимая приёмка",[54,84,85,88],{},[69,86,87],{},"Проектный lead",[69,89,90],{},"Реализация внутри своего проекта",[54,92,93,96],{},[69,94,95],{},"Governor",[69,97,98],{},"Пассивное наблюдение между контрольными точками",[12,100,101],{},"На практике границы поплыли. Директор не ограничился приёмкой и начал помогать исполнению. Governor не всегда оставался пассивным. Проектный агент получал всё новые сообщения и естественно переключался на самое свежее указание.",[12,103,104],{},"Получилась знакомая управленческая проблема, только на скорости программного агента: руководитель видит работу в процессе, хочет немедленно улучшить её и сам становится источником задержек.",[34,106,108],{"id":107},"когда-вмешательство-было-необходимо","Когда вмешательство было необходимо",[12,110,111],{},"Полностью отказаться от steering было бы неверным выводом. Несколько вмешательств действительно спасли работу.",[113,114,116],"h3",{"id":115},"исполнитель-пошёл-не-в-тот-контур","Исполнитель пошёл не в тот контур",[12,118,119],{},"В одном из эпизодов агент начал готовить production-контур, хотя задача относилась только к существующему dev-окружению. Здесь нельзя ждать следующего планового отчёта. Директор должен немедленно закрыть опасную ветку действий, проверить, что побочных эффектов не произошло, и заново обозначить разрешённую топологию.",[12,121,122],{},"Это нормальный аварийный steering.",[113,124,126],{"id":125},"неуспешная-проверка-была-принята-за-зелёную","Неуспешная проверка была принята за зелёную",[12,128,129],{},"Другой агент сообщил об успешном gate, хотя часть команд завершилась из-за неверного окружения и не проверила то, ради чего запускалась. Директор прочитал фактические exit-коды, нашёл обязательные параметры и потребовал повторить проверки корректно.",[12,131,132],{},"Такое вмешательство тоже оправданно. Надзор существует в том числе для того, чтобы отличать «команда закончилась» от «критерий проверен».",[113,134,136],{"id":135},"опасное-действие-требовало-независимого-допуска","Опасное действие требовало независимого допуска",[12,138,139],{},"Перед удалением большого количества Git-веток агент подготовил recovery bundle. Директор отдельно проверил его целостность, права, состав refs и только потом разрешил удаление.",[12,141,142],{},"Здесь разделение ролей сработало как задумано: lead подготовил действие, директор проверил необратимую границу, lead продолжил.",[12,144,145],{},"Во всех трёх случаях был новый существенный факт: неверный target, ложный green или необратимое действие. Именно новый факт, а не беспокойство наблюдателя, оправдывал сообщение.",[34,147,149],{"id":148},"как-новое-сообщение-ломает-поток-агента","Как новое сообщение ломает поток агента",[12,151,152],{},"У человека новое сообщение может полежать непрочитанным. Для диалогового агента оно становится новым верхнеуровневым turn и часто меняет приоритет прямо сейчас.",[12,154,155],{},"Во время одной проверки директор отправил проектному агенту четыре уточнения примерно за пять минут:",[157,158,159,163,166,169],"ol",{},[160,161,162],"li",{},"предыдущие проверки нельзя считать зелёными;",[160,164,165],{},"для frontend нужны точные URL;",[160,167,168],{},"API-команда вообще не выполнилась;",[160,170,171],{},"причина следующего сбоя находится в валидации окружения.",[12,173,174],{},"Каждое сообщение было технически верным. Вместе они образовали плохой способ управления.",[12,176,177],{},"Директор расследовал проблему по частям и сразу транслировал каждую находку. Агент в это время запускал команды, получал новую инструкцию, перестраивал план и снова получал уточнение. Вместо одного исправляющего пакета возникла серия переключений контекста.",[12,179,180],{},"Правильнее было сначала закончить read-only расследование, собрать все четыре факта и отправить одну команду:",[182,183,189],"pre",{"className":184,"code":186,"language":187,"meta":188},[185],"language-text","CORRECTION PACKET CP-17\n\nПричина: обязательные gates не доказаны из-за трёх ошибок окружения.\n\nВыполни после завершения текущей безопасной команды:\n1. ...\n2. ...\n3. ...\n\nПредыдущие указания CP-14–CP-16 этим сообщением заменены.\nВерни один aggregate checkpoint после всех трёх проверок.\n","text","prompt",[190,191,186],"code",{"__ignoreMap":192},"",[12,194,195],{},"Для агента важна не только правильность указания. Важна его атомарность.",[34,197,199],{"id":198},"молчание-не-означает-простой","Молчание не означает простой",[12,201,202],{},"Ещё одна ошибка была связана с наблюдением за длинными командами.",[12,204,205,206,209],{},"Если в истории несколько минут нет нового сообщения, легко решить, что агент остановился. На самом деле он может собирать проект, ждать CI, выполнять тесты или находиться внутри длинного tool call. В нашем надзоре семиминутная тишина иногда уже считалась ",[190,207,208],{},"STALLED",".",[12,211,212],{},"Для серьёзной кодовой работы это слишком агрессивный порог.",[12,214,215],{},"Отсутствие нового текста говорит только об отсутствии нового текста. Оно ничего не доказывает о процессе. До steering нужно проверить хотя бы один источник живости:",[217,218,219,222,225,228,231],"ul",{},[160,220,221],{},"существует ли активный процесс;",[160,223,224],{},"меняется ли его вывод;",[160,226,227],{},"появился ли обещанный artifact;",[160,229,230],{},"истёк ли заранее согласованный срок этапа;",[160,232,233,234,209],{},"зафиксировал ли агент blocker или ",[190,235,236],{},"STOP_EFFECTS",[12,238,239],{},"Если lead сообщил: «запускаю полную сборку, следующий checkpoint через 20 минут», директор не должен на восьмой минуте присылать новую задачу. Он должен поставить таймер на двадцатую.",[34,241,243],{"id":242},"худшая-ошибка-проверяющий-стал-вторым-исполнителем","Худшая ошибка: проверяющий стал вторым исполнителем",[12,245,246],{},"Самый неприятный эпизод произошёл не из-за частого polling.",[12,248,249],{},"У нас одновременно работали foreground-директор и периодический governor. Оба обладали достаточным контекстом и разрешением пройти следующий gate. Оба увидели готовность к одной activation-операции. В результате одинаковое действие было начато дважды.",[12,251,252],{},"Обе попытки завершились fail-close, а состояние системы осталось безопасным. Но ссылаться на защиту как на оправдание нельзя. Она сработала после того, как координация уже дала сбой.",[12,254,255],{},"Причина проста: у действия не было единственного владельца.",[12,257,258],{},"Мы использовали технические locks внутри скриптов, но не зафиксировали управленческую lease: кто именно сейчас имеет право нажать кнопку. Foreground-директор считал себя активным оператором. Governor считал то же самое. Проектный lead выполнял ранее выданный маршрут.",[12,260,261],{},"После инцидента governor был остановлен, а агент получил явное ограничение. Это исправило текущую ситуацию, но правильный порядок должен быть обратным:",[157,263,264,267,270],{},[160,265,266],{},"назначить одного владельца effectful-фазы;",[160,268,269],{},"всем остальным оставить только чтение;",[160,271,272],{},"и только затем открывать действие.",[12,274,275],{},"Техническая идемпотентность обязательна. Она не заменяет организационное владение.",[34,277,279],{"id":278},"надзор-и-выполнение-нужно-физически-разделить","Надзор и выполнение нужно физически разделить",[12,281,282],{},"Директор несколько раз запускал те же тесты, читал тот же worktree и проверял те же ветки, пока lead ещё работал. Часть этих проверок была полезна. Но некоторые команды меняли локальное состояние: устанавливали зависимости, обновляли кеш или забирали ownership cleanup-фазы.",[12,284,285],{},"После этого доказательства становились менее чистыми. Если проверяющий изменил среду исполнителя, уже трудно сказать, чей именно процесс создал результат.",[12,287,288],{},"Поэтому я ввожу простое правило:",[290,291,292],"blockquote",{},[12,293,294],{},"Пока lead владеет фазой, директор может читать, но не должен менять его рабочую среду.",[12,296,297],{},"Независимая приёмка начинается после freeze point. Проектный агент сообщает:",[217,299,300,303,306,309,312],{},[160,301,302],{},"точный commit или artifact;",[160,304,305],{},"завершённые команды и exit-коды;",[160,307,308],{},"отсутствие активных процессов;",[160,310,311],{},"scope изменений;",[160,313,314],{},"ожидаемое состояние runtime.",[12,316,317],{},"Только после этого директор запускает свои проверки. Если ему всё же нужно забрать работу, используется отдельный takeover-протокол:",[157,319,320,326,329,332,335],{},[160,321,322,325],{},[190,323,324],{},"STOP_AFTER_SAFE_BOUNDARY",";",[160,327,328],{},"подтверждение агента, что write-поток остановлен;",[160,330,331],{},"read-back Git, процессов и runtime;",[160,333,334],{},"смена владельца фазы;",[160,336,337],{},"одно новое действие.",[12,339,340],{},"Нельзя просто начать делать ту же работу быстрее.",[34,342,344],{"id":343},"новый-протокол-вмешательства","Новый протокол вмешательства",[12,346,347],{},"После этой сессии я бы разделил steering на три класса.",[48,349,350,363],{},[51,351,352],{},[54,353,354,357,360],{},[57,355,356],{},"Класс",[57,358,359],{},"Когда применяется",[57,361,362],{},"Поведение",[64,364,365,378,391],{},[54,366,367,372,375],{},[69,368,369],{},[190,370,371],{},"RED",[69,373,374],{},"Риск production, секретов, потери данных, двойного эффекта",[69,376,377],{},"Немедленно остановить новые действия",[54,379,380,385,388],{},[69,381,382],{},[190,383,384],{},"AMBER",[69,386,387],{},"Неверный gate, scope drift, stale base, неподтверждённое утверждение",[69,389,390],{},"Доставить на ближайшей безопасной границе",[54,392,393,398,401],{},[69,394,395],{},[190,396,397],{},"NOTE",[69,399,400],{},"Улучшение, вопрос, дополнительная проверка",[69,402,403],{},"Накопить до следующего checkpoint",[12,405,406,407,409,410,412,413,415],{},"Один ",[190,408,371],{}," может прервать поток. ",[190,411,384],{}," не должен создавать каскад сообщений: замечания собираются в один correction packet. ",[190,414,397],{}," вообще не отправляется исполнителю посреди фазы.",[12,417,418],{},"К этому нужны ещё несколько правил.",[113,420,422],{"id":421},"один-контроллер-на-одно-действие","Один контроллер на одно действие",[12,424,425],{},"Перед deploy, merge, очисткой refs или изменением runtime фиксируются:",[182,427,430],{"className":428,"code":429,"language":187,"meta":192},[185],"phase: production-deploy\nowner: project-lead\nverifier: director\nother-controllers: read-only\noperation-id: DEPLOY-2026-08-29-01\n",[190,431,429],{"__ignoreMap":192},[12,433,434,435,438],{},"Повторная команда с тем же ",[190,436,437],{},"operation-id"," обязана считаться дублем. Если foreground принимает управление, cron-governor сначала ставится на паузу.",[113,440,442],{"id":441},"тихое-окно-после-steering","Тихое окно после steering",[12,444,445],{},"После обычного correction packet директор не пишет снова до одного из событий:",[217,447,448,451,454,460],{},[160,449,450],{},"агент вернул checkpoint;",[160,452,453],{},"истёк оговорённый срок;",[160,455,456,457,459],{},"появился новый ",[190,458,371],{},"-факт;",[160,461,462],{},"активный процесс закончился с ошибкой.",[12,464,465],{},"Для короткой диагностики окно может быть десять минут. Для сборки, CI или большой кодовой волны — двадцать–сорок. Универсального пятиминутного polling недостаточно.",[113,467,469],{"id":468},"отчёт-владельцу-не-должен-будить-исполнителя","Отчёт владельцу не должен будить исполнителя",[12,471,472],{},"Директор может сообщать владельцу о прогрессе, не посылая ничего проектному агенту. Наблюдение и steering — разные операции.",[12,474,475],{},"Это особенно важно для Telegram-агентов: сообщение «я проверил, всё пока хорошо» не помогает lead, но всё равно создаёт новый turn.",[113,477,479],{"id":478},"после-compaction-требуется-дедупликация","После compaction требуется дедупликация",[12,481,482],{},"Длинная сессия переживает compaction, ротации и повторное чтение handoff. Перед новым эффектом контроллер должен сверить:",[217,484,485,490,493,496,499],{},[160,486,487,488,325],{},"последний принятый ",[190,489,437],{},[160,491,492],{},"текущего владельца фазы;",[160,494,495],{},"точный SHA;",[160,497,498],{},"наличие уже запущенной операции;",[160,500,501],{},"не является ли сообщение повтором старого gate.",[12,503,504],{},"Большой контекст сам по себе не даёт права продолжать. После сотен сообщений полезнее короткий factual ledger, чем попытка держать всю историю в голове.",[34,506,508],{"id":507},"что-должны-делать-проектные-агенты","Что должны делать проектные агенты",[12,510,511],{},"Проблема была не только у директора. Lead тоже может защищать рабочий поток.",[12,513,514,515,517],{},"В начале длинного этапа проектный агент должен назвать фазу, owner, ожидаемое время и следующий checkpoint. Получив ",[190,516,384],{}," во время безопасной команды, он может ответить:",[182,519,522],{"className":520,"code":521,"language":187,"meta":192},[185],"Принято. Текущая read-only сборка продолжается.\nПрименю correction packet после её завершения.\nНовых effects до reconcile не начинаю.\n",[190,523,521],{"__ignoreMap":192},[12,525,526],{},"Если два контроллера дали несовместимые effectful-команды, lead не выбирает более свежую автоматически. Он останавливается перед эффектом и возвращает конфликт ownership.",[12,528,529],{},"Это не непослушание. Это нормальная защита от гонки управления.",[34,531,533],{"id":532},"как-оценивать-качество-директора","Как оценивать качество директора",[12,535,536],{},"Раньше я смотрел на полноту проверки: нашёл ли директор ошибки, сверил ли Git, прочитал ли runtime, потребовал ли доказательства.",[12,538,539],{},"Теперь добавляю другие метрики:",[217,541,542,545,548,551,554,557],{},[160,543,544],{},"сколько steering-сообщений пришлось на одну фазу;",[160,546,547],{},"сколько из них содержали новый существенный факт;",[160,549,550],{},"сколько correction packet были дополнены через минуту ещё одним уточнением;",[160,552,553],{},"сколько раз директор запускал команду в рабочей среде lead;",[160,555,556],{},"сколько effectful-фаз имели больше одного активного контроллера;",[160,558,559],{},"сколько времени lead работал без ненужного переключения контекста.",[12,561,562],{},"Хороший директор не тот, кто чаще вмешивается. Он тот, после чьего вмешательства работа становится определённее.",[34,564,566],{"id":565},"автопилоту-нужен-спокойный-пилот","Автопилоту нужен спокойный пилот",[12,568,569],{},"Проектные агенты в этой истории хорошо справились со своей частью. Они соблюдали fail-closed границы, останавливались при ошибках, сохраняли handoff и в итоге довели оба проекта до проверенного состояния.",[12,571,572],{},"Директор тоже сделал много полезного: поймал неверный target, не принял ложные зелёные проверки, защищал необратимые операции и независимо сверил результат.",[12,574,575],{},"Но полезность отдельных вмешательств не отменяет системной ошибки. Я слишком часто передавал промежуточные мысли как новые команды. Несколько раз заходил в рабочую зону lead. Один раз допустил двух активных операторов у одной кнопки.",[12,577,578],{},"Мой прошлый вывод звучал так: автономность определяется правильно выбранным расстоянием между вмешательствами.",[12,580,581],{},"Теперь я бы добавил: это расстояние должен соблюдать и тот, кто наблюдает.",[583,584],"hr",{},[12,586,587,588,209],{},"Если вы строите работу нескольких AI-агентов, начните не с количества автоматизации, а с ролей, ownership фаз, handoff и правил вмешательства. Я могу помочь спроектировать такой контур, проверить его на реальной задаче и настроить Hermes-профили без гонки между исполнителями и надзором. ",[16,589,591],{"href":590},"\u002Fcontact","Опишите вашу задачу",{"title":192,"searchDepth":593,"depth":593,"links":594},2,[595,596,602,603,604,605,606,612,613,614],{"id":36,"depth":593,"text":37},{"id":107,"depth":593,"text":108,"children":597},[598,600,601],{"id":115,"depth":599,"text":116},3,{"id":125,"depth":599,"text":126},{"id":135,"depth":599,"text":136},{"id":148,"depth":593,"text":149},{"id":198,"depth":593,"text":199},{"id":242,"depth":593,"text":243},{"id":278,"depth":593,"text":279},{"id":343,"depth":593,"text":344,"children":607},[608,609,610,611],{"id":421,"depth":599,"text":422},{"id":441,"depth":599,"text":442},{"id":468,"depth":599,"text":469},{"id":478,"depth":599,"text":479},{"id":507,"depth":593,"text":508},{"id":532,"depth":593,"text":533},{"id":565,"depth":593,"text":566},"2026-08-29","Разбор реальной длительной работы двух AI-агентов: когда вмешательство руководителя спасает выпуск, а когда прерывает поток, создаёт гонку и превращает надзор в микроменеджмент.","md",false,{},true,"\u002Fblog\u002F2026-08-29-kogda-nadzor-meshaet-ai-agentam",{"title":6,"description":616},"Надзор за AI-агентами без гонок и микроменеджмента","blog\u002F2026-08-29-kogda-nadzor-meshaet-ai-agentam",[626,627,628,629,630],"ai","агенты","hermes","управление","разработка","us9bCS3U5tfo5D2vp8NDIjabFhK8yafAcJEl0UCry48",{"id":633,"title":634,"acrostic":7,"body":635,"date":615,"description":912,"duration":7,"emoji":7,"extension":617,"faq":7,"featured":618,"format":7,"image":7,"level":7,"media":7,"meta":913,"navigation":620,"path":914,"price":7,"schedule":7,"seo":915,"seoTitle":916,"serviceType":7,"status":7,"stem":917,"tags":918,"tech":7,"toc":620,"url":7,"__hash__":924},"blog\u002Fblog\u002F2026-08-29-ot-chana-moloka-k-phaseshift.md","От чана с молоком к PhaseShift: как я пришёл к идее анализа устойчивости",{"type":9,"value":636,"toc":898},[637,640,643,646,649,658,662,665,668,671,674,677,680,683,687,690,693,696,699,704,707,710,756,759,763,766,769,772,775,778,781,785,788,791,794,797,800,804,807,811,814,818,821,825,828,831,834,837,840,844,847,850,853,856,860,863,866,869,872,876,879,882,889,891],[12,638,639],{},"Всё началось с вопроса, который не имел никакого отношения к серверам: может ли молоко в большом чане с одного края уже скиснуть, а с другого всё ещё оставаться свежим?",[12,641,642],{},"Как бытовая задача этот вопрос довольно быстро теряет смысл. Молоко перемешивается, температура выравнивается, бактерии распространяются, поэтому чёткой границы между «свежим» и «скисшим» почти наверняка не будет.",[12,644,645],{},"Но меня зацепило другое: в какой момент система становится уже другой системой?",[12,647,648],{},"Снаружи молоко какое-то время выглядит прежним. Внутри меняется кислотность, идут химические и биологические процессы, перестраивается структура. Потом наступает момент, после которого свойства продукта меняются качественно.",[12,650,651,652,209],{},"Так разговор о молоке привёл меня к фазовым переходам. А от них — к IT-инфраструктуре и идее ",[16,653,657],{"href":654,"rel":655},"https:\u002F\u002Fphaseshift.tirobots.ru",[656],"nofollow","PhaseShift",[34,659,661],{"id":660},"зелёная-панель-ещё-не-доказывает-устойчивость","Зелёная панель ещё не доказывает устойчивость",[12,663,664],{},"Работая со сложными системами, я привык смотреть на текущее состояние.",[12,666,667],{},"Процессор не перегружен. Памяти хватает. Ошибок мало. Задержки укладываются в норматив. Очереди не переполнены, база отвечает, на панели всё зелёное.",[12,669,670],{},"Это важная информация. Но она не отвечает на вопрос, насколько хорошо система выдержит следующее небольшое возмущение.",[12,672,673],{},"Представим два одинаковых контура. У них одна нагрузка, близкие показатели CPU и примерно одинаковое время ответа. Затем входящий поток ненадолго возрастает.",[12,675,676],{},"Первый контур возвращается к обычному режиму за пять секунд, второй — за сорок. Через месяц первый по-прежнему восстанавливается быстро, а второму уже требуется полторы минуты. При этом привычные метрики всё ещё могут оставаться в допустимых пределах.",[12,678,679],{},"На обычном dashboard системы выглядят одинаково. По характеру реакции это уже две разные системы.",[12,681,682],{},"Меня интересует именно этот разрыв: метрики ещё говорят «норма», но способность справляться с изменениями уже ухудшается.",[34,684,686],{"id":685},"смотреть-не-только-на-состояние-но-и-на-реакцию","Смотреть не только на состояние, но и на реакцию",[12,688,689],{},"Классический мониторинг отвечает на вопрос: «Что происходит сейчас?»",[12,691,692],{},"PhaseShift должен добавить к нему другой: «Как система реагирует на происходящее и как эта реакция меняется со временем?»",[12,694,695],{},"В живой инфраструктуре постоянно возникают небольшие возмущения. Растёт поток запросов, замедляется сервис, увеличивается задержка базы, появляется короткая очередь, перезапускается процесс или на несколько секунд ухудшается сеть. Само по себе такое событие ещё не авария.",[12,697,698],{},"Для анализа важна вся последовательность:",[290,700,701],{},[12,702,703],{},"возмущение → отклик → распространение → восстановление",[12,705,706],{},"Насколько сильно система отклонилась от обычного режима? Сколько компонентов затронуло изменение? Усилилась проблема по дороге или затухла? Появились ли повторные запросы? Когда исчезла очередь? Сколько времени заняло восстановление?",[12,708,709],{},"И главное: как ответы на эти вопросы меняются от недели к неделе.",[48,711,712,722],{},[51,713,714],{},[54,715,716,719],{},[57,717,718],{},"Традиционный мониторинг",[57,720,721],{},"Анализ устойчивости",[64,723,724,732,740,748],{},[54,725,726,729],{},[69,727,728],{},"Показывает текущее значение метрики",[69,730,731],{},"Измеряет реакцию на изменение",[54,733,734,737],{},[69,735,736],{},"Сравнивает значение с порогом",[69,738,739],{},"Сравнивает похожие эпизоды между собой",[54,741,742,745],{},[69,743,744],{},"Фиксирует уже возникшее отклонение",[69,746,747],{},"Ищет изменение характера восстановления",[54,749,750,753],{},[69,751,752],{},"Отвечает «что сейчас не так»",[69,754,755],{},"Помогает понять, уменьшается ли запас устойчивости",[12,757,758],{},"Я не хочу заменить мониторинг ещё одной панелью. Задача в том, чтобы добавить новый слой наблюдения поверх уже существующих инструментов.",[34,760,762],{"id":761},"почему-меня-заинтересовало-время-восстановления","Почему меня заинтересовало время восстановления",[12,764,765],{},"В теории динамических систем есть явление, которое называют critical slowing down, или критическим замедлением. При приближении к критическому состоянию некоторые системы медленнее возвращаются к равновесию после небольших воздействий.",[12,767,768],{},"Серверный кластер, конечно, не чан молока и не термодинамическая система. Нельзя просто взять физическую формулу и объявить, что теперь она предсказывает аварии в Kubernetes. Это было бы эффектно, но бездоказательно.",[12,770,771],{},"Полезна сама постановка вопроса.",[12,773,774],{},"У инфраструктуры есть обычный режим работы. Есть естественные возмущения, отклик и скорость возвращения к исходному состоянию. Есть чувствительность к размеру воздействия и распространение реакции между зависимыми компонентами.",[12,776,777],{},"Если после похожих событий восстановление занимало семь секунд, затем девять, двенадцать и двадцать, это стоит исследовать. Возможно, это ранний признак снижения устойчивости, а возможно, обычный шум. Разницу нужно доказывать экспериментально.",[12,779,780],{},"Мне нравится, что эта гипотеза проверяема. Можно построить стенд и последовательно уменьшать пул соединений, увеличивать задержку зависимого сервиса, ограничивать ресурсы или усиливать конкуренцию за блокировки. Затем смотреть, какие характеристики меняются до явного отказа и повторяется ли этот эффект на разных системах.",[34,782,784],{"id":783},"единицей-анализа-становится-эпизод","Единицей анализа становится эпизод",[12,786,787],{},"Если просто собрать ещё больше метрик, получится ещё одна система мониторинга. Таких систем уже достаточно.",[12,789,790],{},"Поэтому базовой единицей анализа я считаю законченный эпизод поведения.",[12,792,793],{},"Например, входящий поток вырос на 15 процентов. Через секунду увеличилось время ответа одного сервиса. Ещё через две секунды стало больше соединений с базой, затем начала расти очередь и появились повторные запросы. Поток уже вернулся к норме, а очередь исчезла только через сорок секунд.",[12,795,796],{},"Такой эпизод можно сравнить с десятками похожих случаев в прошлом. Тогда виден не только пик конкретной метрики, но и то, стала ли система реагировать сильнее, распространяется ли возмущение дальше и требуется ли ей больше времени на восстановление.",[12,798,799],{},"Здесь появляются три полезных направления измерения.",[113,801,803],{"id":802},"время-восстановления","Время восстановления",[12,805,806],{},"Сколько времени проходит между окончанием возмущения и возвращением системы к обычному режиму. Важно не отдельное значение, а его тренд для сопоставимых событий.",[113,808,810],{"id":809},"чувствительность","Чувствительность",[12,812,813],{},"Одинаковое воздействие может со временем вызывать всё более сильную реакцию. Если рост нагрузки на 10 процентов раньше увеличивал latency на 5 процентов, а теперь на 20, система стала чувствительнее, даже если оба значения пока не пересекли аварийный порог.",[113,815,817],{"id":816},"распространение","Распространение",[12,819,820],{},"Небольшое замедление базы в устойчивом контуре быстро затухает. В менее устойчивом оно приводит к накоплению соединений, retries, дополнительной нагрузке и новым очередям в соседних сервисах. Локальное событие превращается в цепную реакцию.",[34,822,824],{"id":823},"наблюдать-без-переписывания-приложений","Наблюдать без переписывания приложений",[12,826,827],{},"Я хочу начать с пассивного наблюдения. Инфраструктура и без искусственных экспериментов каждый день переживает множество небольших изменений. Сначала нужно научиться находить их и корректно измерять ответ.",[12,829,830],{},"Базовая схема PhaseShift предполагает небольшие агенты на серверах и центральный аналитический контур внутри инфраструктуры заказчика. Агенты наблюдают за операционной системой, процессами, ресурсами и сетевыми соединениями. Для этого не требуется переписывать приложения и обязательно встраивать библиотеку в каждый сервис.",[12,832,833],{},"По наблюдаемым взаимодействиям можно постепенно восстановить фактическую карту зависимостей. Не ту схему, которую однажды нарисовали в документации, а живую структуру: кто с кем общается, где меняется время ответа, как возникают очереди и по какой цепочке распространяется возмущение.",[12,835,836],{},"Интеграции с базами данных, оркестраторами, брокерами сообщений и существующим мониторингом могут обогатить картину. Но базовая ценность должна появляться раньше, уже из системной, процессной и сетевой телеметрии.",[12,838,839],{},"Для такого продукта on-prem развёртывание выглядит естественно. Внутренние адреса, топология, процессы и служебная телеметрия остаются в контуре компании. Анализ выполняется там же, без обязательной отправки данных наружу.",[34,841,843],{"id":842},"индекс-без-объяснения-бесполезен","Индекс без объяснения бесполезен",[12,845,846],{},"Рано или поздно появится соблазн свести всё к одному числу: например, показать индекс устойчивости 82 из 100.",[12,848,849],{},"Красивое число нарисовать легко. Гораздо труднее объяснить, откуда оно взялось.",[12,851,852],{},"Если PhaseShift сообщает о снижении устойчивости, инженер должен иметь возможность пройти от общей оценки к фактору, компоненту, событию и исходным наблюдениям. Например, увидеть, что время восстановления выросло, одинаковое возмущение стало затрагивать больше сервисов, а характер реакции изменился после конкретного выпуска.",[12,854,855],{},"Без такой трассировки индекс останется гаданием. С ней он может стать рабочим инженерным ориентиром.",[34,857,859],{"id":858},"чего-я-пока-не-знаю","Чего я пока не знаю",[12,861,862],{},"Сейчас PhaseShift — продуктовая и исследовательская гипотеза. Я ещё не могу честно сказать, что существует универсальная формула, которая заранее обнаружит значительную часть будущих аварий.",[12,864,865],{},"Возможно, первая модель окажется неверной. Вторая тоже. Может выясниться, что единого индекса не существует и для разных классов систем нужны разные модели. Или что часть красивых ранних признаков исчезает при проверке на реальной инфраструктуре.",[12,867,868],{},"Так и должна выглядеть исследовательская работа. Мне предстоит построить экспериментальный контур, создавать контролируемые ухудшения, собирать данные и отбрасывать признаки, которые убедительно выглядят только на отдельных примерах.",[12,870,871],{},"Активные пробы тоже возможны: короткий импульс нагрузки, небольшая задержка или временное ограничение ресурса. Но начинать с них рано. Сначала пассивная модель должна доказать, что умеет находить полезный сигнал в естественном поведении системы.",[34,873,875],{"id":874},"и-всё-таки-при-чём-здесь-молоко","И всё-таки при чём здесь молоко",[12,877,878],{},"Чан с молоком остался хорошей метафорой не потому, что IT-инфраструктура подчиняется тем же физическим законам.",[12,880,881],{},"Внутри системы уже могут идти процессы, которые меняют её поведение, пока снаружи она выглядит прежней. Поэтому вопрос остаётся тем же: можно ли заметить приближение качественного изменения раньше, чем оно станет очевидной аварией?",[12,883,884,885,209],{},"Я собираю PhaseShift, чтобы проверить эту гипотезу на практике. Следить за развитием проекта можно на ",[16,886,888],{"href":654,"rel":887},[656],"phaseshift.tirobots.ru",[583,890],{},[12,892,893,894,897],{},"Если вы отвечаете за сложную инфраструктуру и хотите проверить подход на реальных сценариях отказа и восстановления, ",[16,895,896],{"href":590},"напишите мне",". Мне особенно интересны системы, в которых обычный мониторинг показывает норму, а инженеры уже чувствуют, что контур стал восстанавливаться хуже.",{"title":192,"searchDepth":593,"depth":593,"links":899},[900,901,902,903,908,909,910,911],{"id":660,"depth":593,"text":661},{"id":685,"depth":593,"text":686},{"id":761,"depth":593,"text":762},{"id":783,"depth":593,"text":784,"children":904},[905,906,907],{"id":802,"depth":599,"text":803},{"id":809,"depth":599,"text":810},{"id":816,"depth":599,"text":817},{"id":823,"depth":593,"text":824},{"id":842,"depth":593,"text":843},{"id":858,"depth":593,"text":859},{"id":874,"depth":593,"text":875},"Как мысленный эксперимент с чаном молока привёл меня к идее PhaseShift — системы, которая оценивает не только текущие метрики инфраструктуры, но и её реакцию на возмущения и скорость восстановления.",{},"\u002Fblog\u002F2026-08-29-ot-chana-moloka-k-phaseshift",{"title":634,"description":912},"PhaseShift: как появилась идея анализа устойчивости IT-систем","blog\u002F2026-08-29-ot-chana-moloka-k-phaseshift",[919,920,921,922,923],"инфраструктура","devops","устойчивость","observability","phaseshift","xj4q21jmGWKgW0jTFm2QZ5SoCGGWK2KmO2pGo0FYMLM",{"id":926,"title":927,"acrostic":7,"body":928,"date":1428,"description":1429,"duration":7,"emoji":7,"extension":617,"faq":7,"featured":618,"format":7,"image":7,"level":7,"media":7,"meta":1430,"navigation":620,"path":18,"price":7,"schedule":7,"seo":1431,"seoTitle":1432,"serviceType":7,"status":7,"stem":1433,"tags":1434,"tech":7,"toc":620,"url":7,"__hash__":1436},"blog\u002Fblog\u002F2026-08-27-ai-avtopilot-upravlenie-proektnymi-agentami.md","AI-автопилот, а не беспилотник: как я управляю проектными агентами",{"type":9,"value":929,"toc":1416},[930,933,940,943,946,949,953,956,959,962,965,972,975,979,982,985,988,991,1014,1017,1021,1024,1027,1030,1033,1036,1090,1093,1176,1179,1183,1194,1197,1203,1206,1210,1213,1216,1219,1239,1242,1245,1249,1252,1255,1258,1261,1264,1267,1270,1273,1276,1280,1283,1286,1292,1298,1304,1308,1311,1363,1366,1369,1373,1376,1379,1382,1385,1392,1395,1397,1402,1406],[12,931,932],{},"Современный самолёт умеет долго лететь на автопилоте. Система выдерживает маршрут, высоту и скорость, снимая с экипажа часть рутинной нагрузки. Но из кабины не исчезает пилот. Он выбирает режим автоматизации, следит за ним и должен быть готов вмешаться, если условия изменились или система повела себя не так.",[12,934,935,936],{},"Этот принцип хорошо описан в материалах EASA об автоматизации: она освобождает внимание пилота для принятия решений, но экипаж должен выбирать подходящий уровень автоматизации и контролировать его.",[937,938,939],"span",{},"1",[12,941,942],{},"Примерно к такой модели я пришёл в работе с AI-агентами.",[12,944,945],{},"Я не хочу следить за каждой командой в терминале и каждым заполнением контекста. Но и идея «дать агенту задачу и забыть» меня не устраивает. Между постоянным ручным управлением и бесконтрольной автономностью нужен рабочий режим, в котором агент получает свободу внутри заранее определённых границ.",[12,947,948],{},"Для себя я называю его AI-автопилотом.",[34,950,952],{"id":951},"сначала-был-один-профиль-на-все-проекты","Сначала был один профиль на все проекты",[12,954,955],{},"Первое время я работал с Hermes через один профиль. Когда нужно было перейти к другому проекту, я вызывал соответствующий skill.",[12,957,958],{},"Такой skill переключал рабочую папку и сразу просил агента прочитать проектную документацию, актуальный план и handoff: короткую запись о текущей фазе, выполненных действиях, известных ограничениях и следующем безопасном шаге.",[12,960,961],{},"После этого агент понимал, что мы строим, где находится бизнес-логика, какие решения уже приняты и что нельзя трогать без отдельного согласования.",[12,963,964],{},"Эта схема хорошо работает, пока проекты идут последовательно. Но когда я занимался одним проектом, остальные ждали. Один профиль физически не мог одновременно вести несколько длительных задач.",[12,966,967,968,209],{},"Поэтому я разделил Hermes на проектные профили. У каждого появился собственный контекст, Telegram-бот, история сессий и рабочие правила. Об устройстве профилей, памяти и общей библиотеки skills я подробно писал в статье ",[16,969,971],{"href":970},"\u002Fblog\u002F2026-08-25-profili-hermes-otdelnyy-kontekst-obshchie-navyki","«Профили Hermes: отдельный контекст, общие навыки»",[12,973,974],{},"После разделения проектный агент мог оставаться внутри своего проекта и продолжать согласованный план. Но почти сразу возник следующий вопрос: кто будет следить за самими агентами?",[34,976,978],{"id":977},"основной-профиль-стал-диспетчером","Основной профиль стал диспетчером",[12,980,981],{},"Я оставил основной профиль Hermes над проектными агентами. Его задача состоит не в том, чтобы повторно писать за них код. Он следит за ходом длительной работы.",[12,983,984],{},"Обычно процесс начинается вручную. Я прихожу к проектному агенту, формулирую задачу, обсуждаю архитектуру, ограничения и критерии готовности. Мы составляем план. Агент начинает работу.",[12,986,987],{},"Когда маршрут понятен и безопасная рабочая фаза уже началась, я возвращаюсь в основной профиль и прошу его подхватить управление проектным агентом.",[12,989,990],{},"С этого момента основной профиль:",[217,992,993,996,999,1002,1005,1008,1011],{},[160,994,995],{},"читает сообщения проектного агента;",[160,997,998],{},"проверяет, соответствует ли работа согласованному плану;",[160,1000,1001],{},"следит за контекстом сессии;",[160,1003,1004],{},"организует handoff и переход в новую сессию;",[160,1006,1007],{},"не разрешает перезапуск во время незавершённой операции;",[160,1009,1010],{},"проверяет Git, документацию и доступное live-состояние;",[160,1012,1013],{},"принимает или отклоняет отчёт о завершении.",[12,1015,1016],{},"Так выглядит нажатие кнопки «Автопилот». Я перестаю наблюдать за каждым инструментальным вызовом, но не теряю контроль над маршрутом и критическими точками.",[34,1018,1020],{"id":1019},"одного-промпта-оказалось-мало","Одного промпта оказалось мало",[12,1022,1023],{},"Правила можно записать в системном prompt, проектной документации и памяти. Я так и делал. Но длинная задача постоянно меняет состояние.",[12,1025,1026],{},"В начале мы только исследуем систему. Затем редактируем код. Потом проверяем dev-контур. Иногда отдельно открываем production. После завершения нужно остановить новые действия, сохранить handoff и убрать временные процессы.",[12,1028,1029],{},"Агенту недостаточно знать общие правила проекта. Ему нужно понимать текущий режим работы прямо сейчас.",[12,1031,1032],{},"Для этого я сформулировал рабочий контракт и вместе с Hermes оформил его в пользовательский плагин Work Governor.",[12,1034,1035],{},"Он добавляет к каждому ходу короткий рабочий контракт:",[48,1037,1038,1048],{},[51,1039,1040],{},[54,1041,1042,1045],{},[57,1043,1044],{},"Поле",[57,1046,1047],{},"Что оно определяет",[64,1049,1050,1058,1066,1074,1082],{},[54,1051,1052,1055],{},[69,1053,1054],{},"Project",[69,1056,1057],{},"Какой проект сейчас активен",[54,1059,1060,1063],{},[69,1061,1062],{},"Mode",[69,1064,1065],{},"Идёт аудит, работа с кодом, dev-проверка или production",[54,1067,1068,1071],{},[69,1069,1070],{},"Defaults",[69,1072,1073],{},"Какие действия разрешены в этом режиме",[54,1075,1076,1079],{},[69,1077,1078],{},"Delegation",[69,1080,1081],{},"Можно ли подключать других агентов",[54,1083,1084,1087],{},[69,1085,1086],{},"Completion",[69,1088,1089],{},"Кто и по каким доказательствам принимает завершение",[12,1091,1092],{},"Вместо одного размытого разрешения «работай» появляются отдельные состояния.",[48,1094,1095,1105],{},[51,1096,1097],{},[54,1098,1099,1102],{},[57,1100,1101],{},"Режим",[57,1103,1104],{},"Граница работы",[64,1106,1107,1117,1126,1136,1146,1156,1166],{},[54,1108,1109,1114],{},[69,1110,1111],{},[190,1112,1113],{},"audit",[69,1115,1116],{},"Только чтение и анализ",[54,1118,1119,1123],{},[69,1120,1121],{},[190,1122,190],{},[69,1124,1125],{},"Локальные изменения без деплоя",[54,1127,1128,1133],{},[69,1129,1130],{},[190,1131,1132],{},"dev",[69,1134,1135],{},"Проверка и выпуск в тестовый контур без production",[54,1137,1138,1143],{},[69,1139,1140],{},[190,1141,1142],{},"prod",[69,1144,1145],{},"Явно открытая работа с production",[54,1147,1148,1153],{},[69,1149,1150],{},[190,1151,1152],{},"wrapup",[69,1154,1155],{},"Фиксация результата и безопасная уборка",[54,1157,1158,1163],{},[69,1159,1160],{},[190,1161,1162],{},"stopped",[69,1164,1165],{},"Новые побочные эффекты запрещены",[54,1167,1168,1173],{},[69,1169,1170],{},[190,1171,1172],{},"done_waiting_owner",[69,1174,1175],{},"Результат принят, агент ждёт нового решения владельца",[12,1177,1178],{},"Мне нравится эта часть авиационной метафоры. Автопилот не получает абстрактное право «управлять самолётом как угодно». Он работает в выбранном режиме, внутри эксплуатационных ограничений и с понятным способом отключения.",[34,1180,1182],{"id":1181},"почему-work-governor-пока-только-наблюдает","Почему Work Governor пока только наблюдает",[12,1184,1185,1186,1189,1190,1193],{},"Сейчас плагин работает в ",[190,1187,1188],{},"shadow","-режиме. Он добавляет контракт, классифицирует действия и записывает решения ",[190,1191,1192],{},"would_block",", но пока не блокирует каждый подозрительный вызов инструмента физически.",[12,1195,1196],{},"Это намеренное ограничение. Политика безопасности тоже может ошибаться. Если включить жёсткое применение сразу, неверно сформулированное правило способно остановить нормальную работу в самый неподходящий момент.",[12,1198,1199,1200,209],{},"Сначала я хочу увидеть ложные срабатывания, исправить противоречия и проверить поведение на реальных сценариях. Только после этого можно переводить отдельные правила в режим ",[190,1201,1202],{},"enforce",[12,1204,1205],{},"Такой подход кажется мне надёжнее красивого обещания полной автономности. Сначала наблюдение, затем ограниченное применение и лишь потом расширение полномочий.",[34,1207,1209],{"id":1208},"handoff-это-передача-управления","Handoff — это передача управления",[12,1211,1212],{},"Контекст любой длинной сессии заканчивается. Продолжать работу до последнего токена опасно: модель начинает хуже удерживать ранние решения, а важные ограничения растворяются среди сотен сообщений и результатов инструментов.",[12,1214,1215],{},"Поэтому проектный агент должен вовремя остановиться в безопасной точке и подготовить factual handoff.",[12,1217,1218],{},"В нём фиксируются:",[217,1220,1221,1224,1227,1230,1233,1236],{},[160,1222,1223],{},"текущее состояние Git и рабочей ветки;",[160,1225,1226],{},"что уже сделано и чем это подтверждено;",[160,1228,1229],{},"какие файлы изменены;",[160,1231,1232],{},"какие процессы ещё выполняются;",[160,1234,1235],{},"что запрещено делать без новой команды;",[160,1237,1238],{},"следующий проверяемый шаг.",[12,1240,1241],{},"Перед новой сессией основной профиль проверяет handoff. В проектном каталоге должен остаться один актуальный документ, без конкурирующих старых версий и без секретов. Затем запускается новая сессия, агент читает handoff и заново проверяет Git и live-состояние.",[12,1243,1244],{},"Это важное различие. Handoff не переносит слепую уверенность старой сессии. Он переносит утверждения, которые новая сессия должна перепроверить по первоисточникам.",[34,1246,1248],{"id":1247},"семь-часов-на-автопилоте","Семь часов на автопилоте",[12,1250,1251],{},"Первую полноценную проверку этой схемы я провёл на одном из проектов.",[12,1253,1254],{},"Проектный агент закончил большую локальную фазу и сообщил, что контекст подходит к пределу. Впереди оставались review, commit, CI, merge, выпуск в dev-контур и публичная приёмка.",[12,1256,1257],{},"Я поручил основному профилю вести его дальше до полного завершения плана. Основной профиль запросил handoff, прочитал его обратно, открыл проектному агенту новую сессию и потребовал начать с нового Git-preflight.",[12,1259,1260],{},"Затем он создал периодический надзор. Примерно каждые десять минут отдельный запуск проверял сообщения проектного агента, состояние задачи и ближайший контрольный рубеж. Если агент был занят длительной операцией, надзор не мешал ему и не перезапускал сессию. Если контекст приближался к пределу, применялся тот же протокол: безопасная точка, handoff, read-back, новая сессия.",[12,1262,1263],{},"От передачи управления до принятого завершения прошло около семи часов.",[12,1265,1266],{},"Но важен не сам срок. Основной профиль не ограничился пересылкой оптимистичных отчётов другого агента.",[12,1268,1269],{},"Когда проектный агент объявил работу завершённой, надзор независимо прочитал сообщения, проверил Git и актуальную документацию. Оказалось, что техническая работа действительно закончена, но в канонических документах остались противоречащие друг другу утверждения о текущем состоянии.",[12,1271,1272],{},"Основной профиль не принял completion. Он вернул проектному агенту одну узкую задачу: исправить расхождение, не расширяя scope и не затрагивая runtime. Только после отдельного изменения, проверок и повторного чтения документации работа была принята.",[12,1274,1275],{},"Именно в этот момент схема перестала быть для меня красивой диаграммой. Автопилот поддерживал движение по маршруту и обнаружил, что формально выполненная работа ещё не соответствует критериям завершения.",[34,1277,1279],{"id":1278},"остановка-не-должна-создавать-новую-аварию","Остановка не должна создавать новую аварию",[12,1281,1282],{},"У управления агентами есть неприятная тонкость. Фраза «остановись» может означать разные вещи.",[12,1284,1285],{},"Чаще всего я хочу запретить новые действия: не начинать следующий этап, не создавать новый PR, не выполнять deploy. Но это не означает, что нужно оборвать запись файла или убить процесс посередине критической операции.",[12,1287,1288,1289,209],{},"Поэтому Work Governor различает естественную остановку и принудительную команду ",[190,1290,1291],{},"\u002Fstop",[12,1293,1294,1295,1297],{},"Обычная фраза «не продолжай» переводит работу в состояние ",[190,1296,1162],{},": новые эффекты запрещены, но уже запущенные процессы не уничтожаются автоматически. Принудительное завершение фоновых процессов остаётся отдельным явным действием.",[12,1299,1300,1301,1303],{},"Похожим образом устроено завершение задачи. После принятого completion контракт переходит в ",[190,1302,1172],{},". Разрешены read-only проверка и безопасная уборка, но агент не может сам придумать следующую задачу. Временный надзор удаляется, а проектный агент ждёт новой команды.",[34,1305,1307],{"id":1306},"кто-за-что-отвечает","Кто за что отвечает",[12,1309,1310],{},"В этой системе нет одного «самого умного» агента, которому можно передать всё.",[48,1312,1313,1321],{},[51,1314,1315],{},[54,1316,1317,1319],{},[57,1318,59],{},[57,1320,62],{},[64,1322,1323,1331,1339,1347,1355],{},[54,1324,1325,1328],{},[69,1326,1327],{},"Я",[69,1329,1330],{},"Цель, приоритеты, архитектурные решения, допустимый риск и открытие production",[54,1332,1333,1336],{},[69,1334,1335],{},"Основной профиль",[69,1337,1338],{},"Надзор, handoff, смена сессий, независимая проверка и completion gate",[54,1340,1341,1344],{},[69,1342,1343],{},"Проектный агент",[69,1345,1346],{},"Выполнение согласованного плана внутри проекта",[54,1348,1349,1352],{},[69,1350,1351],{},"Субагенты",[69,1353,1354],{},"Узкие независимые исследования, реализация или review",[54,1356,1357,1360],{},[69,1358,1359],{},"Work Governor",[69,1361,1362],{},"Текущий режим, границы побочных эффектов и переходы между состояниями",[12,1364,1365],{},"Проектному агенту можно дать постоянное разрешение работать как lead и подключать субагентов. Но такое разрешение не открывает production и не снимает с него обязанность самостоятельно проверить их результат.",[12,1367,1368],{},"Основной профиль тоже не принимает продуктовые решения за меня. Он должен вернуть управление, если изменились условия, возник новый риск или работа вышла за согласованный маршрут.",[34,1370,1372],{"id":1371},"что-автоматизация-действительно-изменила","Что автоматизация действительно изменила",[12,1374,1375],{},"Раньше длительная агентная работа требовала постоянного присутствия. Нужно было замечать заполнение контекста, просить записать handoff, открывать новую сессию, повторять ограничения, следить за CI и разбираться, можно ли верить финальному отчёту.",[12,1377,1378],{},"Теперь значительную часть этой нагрузки берёт на себя основной профиль.",[12,1380,1381],{},"Я всё ещё начинаю задачу сам. Я определяю маршрут и критические ограничения. Я отдельно открываю опасные этапы и принимаю результат. Но между этими точками мне не нужно смотреть на каждую команду.",[12,1383,1384],{},"Это и есть полезная для меня автономность: не отсутствие человека, а правильно выбранное расстояние между его вмешательствами.",[12,1386,1387,1388,1391],{},"Work Governor пока развивается. ",[190,1389,1390],{},"Shadow","-режим нужно пройти на большем количестве сценариев, а правила ещё будут меняться. Проектные агенты тоже ошибаются, как и основной профиль, который за ними наблюдает. Поэтому независимые источники, тесты, Git и публичная приёмка никуда не исчезают.",[12,1393,1394],{},"Я не строю беспилотную разработку. Я строю автопилот, который берёт на себя рутину, соблюдает режимы и возвращает управление там, где требуется решение пилота.",[583,1396],{},[12,1398,1399,1400,209],{},"Если вы ведёте несколько проектов и хотите передать AI-агентам длительную работу без потери контроля, я могу помочь разделить проектные профили, настроить handoff и собрать проверяемый контур управления агентами. ",[16,1401,591],{"href":590},[34,1403,1405],{"id":1404},"sources","Sources",[12,1407,1408,1410,1411,1415],{},[937,1409,939],{}," ",[16,1412,1413],{"href":1413,"rel":1414},"https:\u002F\u002Fwww.easa.europa.eu\u002Fsites\u002Fdefault\u002Ffiles\u002Fdfu\u002Fsms-docs-EASp-SYS5.6---Automation-Policy---14-Jan-2013.pdf",[656]," — EASA Automation Policy: Bridging Design and Training Principles",{"title":192,"searchDepth":593,"depth":593,"links":1417},[1418,1419,1420,1421,1422,1423,1424,1425,1426,1427],{"id":951,"depth":593,"text":952},{"id":977,"depth":593,"text":978},{"id":1019,"depth":593,"text":1020},{"id":1181,"depth":593,"text":1182},{"id":1208,"depth":593,"text":1209},{"id":1247,"depth":593,"text":1248},{"id":1278,"depth":593,"text":1279},{"id":1306,"depth":593,"text":1307},{"id":1371,"depth":593,"text":1372},{"id":1404,"depth":593,"text":1405},"2026-08-27","Как я разделил работу между проектными агентами, передал надзор основному профилю Hermes и добавил Work Governor, handoff и проверяемые границы автономности.",{},{"title":927,"description":1429},"AI-автопилот для проектных агентов: Hermes и Work Governor","blog\u002F2026-08-27-ai-avtopilot-upravlenie-proektnymi-agentami",[626,627,628,1435,630],"автоматизация","CjY74hqK83RHjgErsl1NAe_hmEFrlnwGOuwx21rWWiE",{"id":1438,"title":1439,"acrostic":7,"body":1440,"date":2219,"description":2220,"duration":7,"emoji":7,"extension":617,"faq":7,"featured":618,"format":7,"image":7,"level":7,"media":7,"meta":2221,"navigation":620,"path":970,"price":7,"schedule":7,"seo":2222,"seoTitle":2223,"serviceType":7,"status":7,"stem":2224,"tags":2225,"tech":7,"toc":620,"url":7,"__hash__":2227},"blog\u002Fblog\u002F2026-08-25-profili-hermes-otdelnyy-kontekst-obshchie-navyki.md","Профили Hermes: отдельный контекст, общие навыки",{"type":9,"value":1441,"toc":2200},[1442,1445,1448,1451,1454,1459,1466,1470,1473,1513,1521,1524,1527,1533,1536,1542,1545,1549,1552,1559,1562,1565,1568,1572,1581,1601,1604,1607,1610,1614,1622,1625,1628,1631,1637,1640,1646,1650,1653,1679,1682,1685,1688,1694,1697,1700,1709,1712,1765,1768,1772,1775,1779,1786,1789,1809,1812,1815,1820,1824,1827,1847,1850,1854,1857,1860,1866,1869,1872,1876,1879,1882,1885,1908,1911,1914,1920,1923,1927,1930,1933,1953,1956,1959,1962,1965,1971,1974,1978,1984,1987,1993,1996,1999,2016,2019,2023,2026,2029,2032,2035,2058,2061,2084,2091,2094,2099,2103,2106,2112,2115,2138,2141,2144,2150,2153,2157,2160,2166,2169,2172,2186,2189,2192,2194],[12,1443,1444],{},"Когда я начал использовать Hermes сразу в нескольких проектах, всё работало через один общий профиль. Один Telegram-бот, одна история, один набор настроек и одна память.",[12,1446,1447],{},"Поначалу это было удобно. Агент знал мои предпочтения, понимал рабочие привычки и мог переходить между задачами без дополнительной настройки. Но постепенно общий контекст превратился из преимущества в источник ошибок.",[12,1449,1450],{},"У проектов были разные репозитории, способы деплоя и ограничения. Где-то можно было свободно менять тестовые данные, а где-то требовалась осторожность. Где-то агенту были нужны инструменты для работы с инфраструктурой, а где-то — только анализ кода.",[12,1452,1453],{},"Чем больше таких правил появлялось, тем труднее было ответить на простой вопрос:",[290,1455,1456],{},[12,1457,1458],{},"Какой проект агент сейчас считает своим?",[12,1460,1461,1462,209],{},"Я решил разделить Hermes на отдельные проектные профили. Но довольно быстро выяснилось, что создать несколько Telegram-ботов недостаточно. Нужно было решить более сложную задачу: ",[1463,1464,1465],"strong",{},"разделить контекст проектов, не размножив при этом память и рабочие процедуры",[34,1467,1469],{"id":1468},"профиль-это-не-просто-отдельный-чат","Профиль — это не просто отдельный чат",[12,1471,1472],{},"В Hermes профиль — это самостоятельное домашнее пространство агента. У него могут быть свои:",[217,1474,1475,1478,1481,1484,1489,1498,1501,1504,1507,1510],{},[160,1476,1477],{},"конфигурация;",[160,1479,1480],{},"модель и провайдер;",[160,1482,1483],{},"API-ключи и токены;",[160,1485,1486,325],{},[190,1487,1488],{},"SOUL.md",[160,1490,1491,1494,1495,325],{},[190,1492,1493],{},"MEMORY.md"," и ",[190,1496,1497],{},"USER.md",[160,1499,1500],{},"история сессий;",[160,1502,1503],{},"skills;",[160,1505,1506],{},"MCP-серверы;",[160,1508,1509],{},"cron-задачи;",[160,1511,1512],{},"gateway-процесс.",[12,1514,1515,1516,209],{},"Это хорошо описано в ",[16,1517,1520],{"href":1518,"rel":1519},"https:\u002F\u002Fhermes-agent.nousresearch.com\u002Fdocs\u002Fuser-guide\u002Fprofiles",[656],"документации Hermes о профилях",[12,1522,1523],{},"Для каждого проекта я создал отдельный профиль, отдельный Telegram-бот и отдельный gateway. Также задал рабочий каталог, из которого агент начинает выполнять команды.",[12,1525,1526],{},"Получилась понятная схема:",[182,1528,1531],{"className":1529,"code":1530,"language":187,"meta":192},[185],"Telegram-бот\n    ↓\nотдельный gateway\n    ↓\nпрофиль Hermes\n    ↓\nрабочий каталог проекта\n",[190,1532,1530],{"__ignoreMap":192},[12,1534,1535],{},"Но здесь есть важное ограничение: профиль изолирует состояние самого Hermes, а не всю операционную систему.",[12,1537,1538,1539,1541],{},"Рабочий каталог задаёт начальную директорию, но не превращает профиль в файловую песочницу. Если terminal backend работает локально, агент по-прежнему имеет права текущего пользователя. Поэтому ограничения в ",[190,1540,1488],{}," помогают управлять поведением, но не заменяют Docker, отдельного системного пользователя или другую техническую изоляцию.",[12,1543,1544],{},"Тем не менее для моей задачи профиль решил главное: перестал смешиваться проектный контекст.",[34,1546,1548],{"id":1547},"память-оказалась-не-одним-механизмом","Память оказалась не одним механизмом",[12,1550,1551],{},"Следующая проблема появилась почти сразу.",[12,1553,1554,1555,1558],{},"Я спросил нового проектного агента, работает ли у него MemPalace. Он проверил поле ",[190,1556,1557],{},"memory.provider",", увидел, что оно пустое, и сообщил, что MemPalace не подключён.",[12,1560,1561],{},"Формально проверка выглядела логично. Но она была основана на неверном предположении: что любая внешняя память Hermes обязательно должна быть настроена как memory provider.",[12,1563,1564],{},"На самом деле в моей архитектуре MemPalace подключается через MCP.",[12,1566,1567],{},"Это два разных механизма.",[113,1569,1571],{"id":1570},"memory-provider-hermes","Memory provider Hermes",[12,1573,1574,1575,1580],{},"Hermes поддерживает внешние memory provider plugins. Согласно ",[16,1576,1579],{"href":1577,"rel":1578},"https:\u002F\u002Fhermes-agent.nousresearch.com\u002Fdocs\u002Fuser-guide\u002Ffeatures\u002Fmemory-providers",[656],"официальной документации",", активный provider может автоматически:",[157,1582,1583,1586,1589,1592,1595,1598],{},[160,1584,1585],{},"добавлять найденный контекст в системный prompt;",[160,1587,1588],{},"искать релевантные воспоминания перед очередным ходом;",[160,1590,1591],{},"синхронизировать диалог после ответа;",[160,1593,1594],{},"извлекать новые факты при завершении сессии;",[160,1596,1597],{},"зеркалировать записи встроенной памяти;",[160,1599,1600],{},"предоставлять собственные инструменты для поиска и записи.",[12,1602,1603],{},"Это удобная архитектура: агент получает память автоматически, без отдельного решения о том, когда её искать.",[12,1605,1606],{},"Но у автоматизма есть цена. Подобранный provider-контекст попадает во входной контекст модели. Даже если он не нужен для конкретного вопроса, он занимает часть контекстного окна на соответствующих вызовах.",[12,1608,1609],{},"Кэширование prompt может влиять на стоимость обработки повторяющегося префикса, но не отменяет сам объём контекста и его влияние на внимание модели.",[113,1611,1613],{"id":1612},"mempalace-через-mcp","MemPalace через MCP",[12,1615,1616,1617,209],{},"MemPalace появился в моём рабочем процессе раньше, чем отдельные проектные профили. Исторически я подключил его как внешний сервер инструментов через ",[16,1618,1621],{"href":1619,"rel":1620},"https:\u002F\u002Fhermes-agent.nousresearch.com\u002Fdocs\u002Fuser-guide\u002Ffeatures\u002Fmcp",[656],"Model Context Protocol",[12,1623,1624],{},"Когда в Hermes появились полноценные memory providers, я не стал автоматически переносить туда уже работающую память. Сначала это было следствием истории системы, а затем стало осознанным архитектурным решением.",[12,1626,1627],{},"Hermes знает, что инструменты MemPalace существуют, но содержимое дворца памяти не добавляется автоматически в каждый запрос. Агент обращается к нему только тогда, когда задача требует исторического контекста.",[12,1629,1630],{},"Например:",[182,1632,1635],{"className":1633,"code":1634,"language":187,"meta":192},[185],"Пользователь спрашивает о прошлом решении\n    ↓\nагент вызывает поиск в MemPalace\n    ↓\nполучает несколько релевантных записей\n    ↓\nпроверяет их по текущему коду или документации\n    ↓\nформирует ответ\n",[190,1636,1634],{"__ignoreMap":192},[12,1638,1639],{},"Если пользователь просит поправить текст, проверить синтаксис или выполнить другую локальную задачу, проектная история может вообще не загружаться.",[12,1641,1642,1643,209],{},"Именно это стало основной причиной, по которой я ",[1463,1644,1645],{},"умышленно не стал использовать memory provider Hermes для MemPalace",[34,1647,1649],{"id":1648},"почему-память-вызывается-по-требованию","Почему память вызывается по требованию",[12,1651,1652],{},"Проектная память со временем становится большой. В ней накапливаются:",[217,1654,1655,1658,1661,1664,1667,1670,1673,1676],{},[160,1656,1657],{},"архитектурные решения;",[160,1659,1660],{},"причины прошлых ошибок;",[160,1662,1663],{},"сведения об инфраструктуре;",[160,1665,1666],{},"результаты расследований;",[160,1668,1669],{},"принятые ограничения;",[160,1671,1672],{},"дневники завершённых сессий;",[160,1674,1675],{},"связи между компонентами;",[160,1677,1678],{},"устаревшие факты, которые всё ещё важны как история.",[12,1680,1681],{},"Всё это полезно, но не всё нужно в каждом запросе.",[12,1683,1684],{},"Автоматическая подстановка памяти хорошо работает, когда агенту почти всегда требуется персональный или исторический контекст. У меня другой сценарий: много проектов и большое количество технических операций, значительная часть которых не требует обращения к прошлому.",[12,1686,1687],{},"Поэтому я выбрал постепенное раскрытие контекста:",[182,1689,1692],{"className":1690,"code":1691,"language":187,"meta":192},[185],"Загружается постоянно:\n├── профильные правила\n├── короткая память о пользователе\n├── несколько критичных ограничений\n└── компактный индекс доступных возможностей\n\nЗагружается по необходимости:\n├── история решений из MemPalace\n├── подробности прошлых ошибок\n├── инфраструктурные сведения\n├── полные инструкции skills\n└── дополнительные проектные документы\n",[190,1693,1691],{"__ignoreMap":192},[12,1695,1696],{},"Такой подход уменьшает объём входного контекста в обычных вызовах. Вместо всей накопленной памяти модель получает только несколько фрагментов, найденных под конкретную задачу.",[12,1698,1699],{},"Это не означает, что MCP работает совершенно бесплатно. У модели остаётся информация о доступных инструментах, а поиск памяти требует дополнительного tool-вызова. При первом обращении появляется небольшая задержка.",[12,1701,1702,1703,1708],{},"Hermes решает часть этой проблемы с помощью ",[16,1704,1707],{"href":1705,"rel":1706},"https:\u002F\u002Fhermes-agent.nousresearch.com\u002Fdocs\u002Fuser-guide\u002Ffeatures\u002Ftool-search",[656],"Tool Search",": полные схемы MCP-инструментов могут загружаться по требованию, а в постоянном контексте остаётся более компактный каталог возможностей.",[12,1710,1711],{},"Получается осознанный обмен:",[48,1713,1714,1723],{},[51,1715,1716],{},[54,1717,1718,1721],{},[57,1719,1720],{},"Автоматический provider",[57,1722,1613],{},[64,1724,1725,1733,1741,1749,1757],{},[54,1726,1727,1730],{},[69,1728,1729],{},"Память подбирается автоматически",[69,1731,1732],{},"Агент должен решить, когда искать",[54,1734,1735,1738],{},[69,1736,1737],{},"Меньше риск забыть про прошлый контекст",[69,1739,1740],{},"Меньше лишнего контекста в обычных вызовах",[54,1742,1743,1746],{},[69,1744,1745],{},"Дополнительный контекст может появляться перед ходами",[69,1747,1748],{},"В prompt попадают только результаты выполненного поиска",[54,1750,1751,1754],{},[69,1752,1753],{},"Меньше tool-вызовов",[69,1755,1756],{},"Поиск требует отдельного вызова",[54,1758,1759,1762],{},[69,1760,1761],{},"Удобен для постоянно нужной персональной памяти",[69,1763,1764],{},"Удобен для большой проектной базы знаний",[12,1766,1767],{},"Для моей работы второй вариант оказался предсказуемее и экономнее по контексту.",[34,1769,1771],{"id":1770},"три-уровня-памяти","Три уровня памяти",[12,1773,1774],{},"В результате память разделилась на три уровня.",[113,1776,1778],{"id":1777},"_1-короткая-встроенная-память","1. Короткая встроенная память",[12,1780,1781,1494,1783,1785],{},[190,1782,1497],{},[190,1784,1493],{}," остаются включёнными.",[12,1787,1788],{},"В них хранятся только сведения, которые полезны почти в каждой сессии:",[217,1790,1791,1794,1797,1800,1803,1806],{},[160,1792,1793],{},"язык общения;",[160,1795,1796],{},"устойчивые предпочтения;",[160,1798,1799],{},"постоянные ограничения;",[160,1801,1802],{},"правила безопасности;",[160,1804,1805],{},"несколько фактов об окружении;",[160,1807,1808],{},"принятый стиль работы.",[12,1810,1811],{},"Эти файлы загружаются вместе с профилем, поэтому должны оставаться короткими. Если складывать туда историю всех проектов, я вернусь к исходной проблеме: каждый запрос будет нести большой объём нерелевантного контекста.",[12,1813,1814],{},"Моё практическое правило:",[290,1816,1817],{},[12,1818,1819],{},"Во встроенную память попадает только то, что стоит повторять модели почти в каждом диалоге.",[113,1821,1823],{"id":1822},"_2-большая-проектная-память","2. Большая проектная память",[12,1825,1826],{},"MemPalace хранит знания, которые важны в будущем, но не нужны постоянно:",[217,1828,1829,1832,1835,1838,1841,1844],{},[160,1830,1831],{},"почему было принято определённое решение;",[160,1833,1834],{},"какие варианты уже проверяли;",[160,1836,1837],{},"в чём заключалась root cause;",[160,1839,1840],{},"какие ошибки нельзя повторять;",[160,1842,1843],{},"как устроен компонент;",[160,1845,1846],{},"что осталось нерешённым.",[12,1848,1849],{},"Память разделена по проектам логически, но доступна через общий MCP. Агент начинает поиск с нужного проектного раздела и расширяет его только для межпроектной инфраструктуры.",[113,1851,1853],{"id":1852},"_3-актуальные-первоисточники","3. Актуальные первоисточники",[12,1855,1856],{},"MemPalace хранит историю. История не всегда равна текущему состоянию.",[12,1858,1859],{},"Поэтому найденная запись не становится окончательным доказательством. После поиска агент проверяет факты по источнику, который отражает актуальное состояние:",[182,1861,1864],{"className":1862,"code":1863,"language":187,"meta":192},[185],"MemPalace\n    ↓\nпроектная документация\n    ↓\nGit и текущий код\n    ↓\nlive runtime, API или база данных\n",[190,1865,1863],{"__ignoreMap":192},[12,1867,1868],{},"Если в памяти записано, что сервис работал на определённом адресе несколько месяцев назад, это исторический факт. Чтобы назвать адрес текущим, нужно проверить инфраструктуру.",[12,1870,1871],{},"Такой порядок защищает от одной из самых опасных ошибок долговременной памяти: уверенного использования устаревшей информации.",[34,1873,1875],{"id":1874},"цена-памяти-по-требованию","Цена памяти по требованию",[12,1877,1878],{},"У этой архитектуры есть очевидный риск: агент может не вызвать поиск, даже когда прошлый контекст нужен.",[12,1880,1881],{},"Автоматический provider решает эту задачу сам. В MCP-варианте нужно научить агента распознавать ситуации, в которых память обязательна.",[12,1883,1884],{},"Для этого в профильных правилах появились явные триггеры:",[217,1886,1887,1890,1893,1896,1899,1902,1905],{},[160,1888,1889],{},"вопрос о прошлом решении;",[160,1891,1892],{},"работа с инфраструктурой;",[160,1894,1895],{},"повторная ошибка;",[160,1897,1898],{},"неизвестный способ деплоя;",[160,1900,1901],{},"упоминание известной особенности проекта;",[160,1903,1904],{},"продолжение работы после долгого перерыва;",[160,1906,1907],{},"расхождение между текущей сессией и проектной документацией.",[12,1909,1910],{},"При таких запросах агент должен сначала искать в MemPalace, а уже затем предлагать действия.",[12,1912,1913],{},"Важно было зафиксировать и порядок обработки ошибки:",[182,1915,1918],{"className":1916,"code":1917,"language":187,"meta":192},[185],"MemPalace\n→ troubleshooting-документация\n→ текущий код\n→ live-состояние\n→ исправление\n",[190,1919,1917],{"__ignoreMap":192},[12,1921,1922],{},"Без этого агент мог сразу начать экспериментировать и повторить проблему, которая уже была расследована раньше.",[34,1924,1926],{"id":1925},"skills-это-тоже-память-но-процедурная","Skills — это тоже память, но процедурная",[12,1928,1929],{},"После разделения обычной памяти возник аналогичный вопрос со skills.",[12,1931,1932],{},"Skills содержат не факты о проектах, а проверенные способы выполнения задач:",[217,1934,1935,1938,1941,1944,1947,1950],{},[160,1936,1937],{},"как проводить аудит;",[160,1939,1940],{},"как отлаживать определённый класс ошибок;",[160,1942,1943],{},"как выполнять релиз;",[160,1945,1946],{},"как проверять инфраструктуру;",[160,1948,1949],{},"как оформлять результат;",[160,1951,1952],{},"какие защитные проверки обязательны.",[12,1954,1955],{},"Изначально такие skills копировались в каждый профиль. Это казалось логичным: профиль отдельный, значит и инструкции должны лежать внутри него.",[12,1957,1958],{},"Но копии быстро начали расходиться.",[12,1960,1961],{},"Исправление, сделанное в основной библиотеке, не попадало в старые профили. Хуже того, profile-local skill с тем же именем мог иметь более высокий приоритет и незаметно скрывать обновлённую общую версию.",[12,1963,1964],{},"Получилась классическая проблема дублирования:",[182,1966,1969],{"className":1967,"code":1968,"language":187,"meta":192},[185],"общий skill v3\n├── профиль 1: копия v1\n├── профиль 2: копия v2\n└── профиль 3: локально изменённая v1\n",[190,1970,1968],{"__ignoreMap":192},[12,1972,1973],{},"Невозможно было уверенно сказать, по какой процедуре работает конкретный агент.",[34,1975,1977],{"id":1976},"общая-библиотека-вместо-копий","Общая библиотека вместо копий",[12,1979,1980,1981,209],{},"Решением стала единая каноническая библиотека skills, подключённая к профилям через ",[190,1982,1983],{},"skills.external_dirs",[12,1985,1986],{},"Теперь профиль хранит собственные правила и память, но процедуры берёт из общего источника:",[182,1988,1991],{"className":1989,"code":1990,"language":187,"meta":192},[185],"Профиль 1 ─┐\nПрофиль 2 ─┼──→ общая Git-библиотека skills\nПрофиль 3 ─┘\n",[190,1992,1990],{"__ignoreMap":192},[12,1994,1995],{},"Новые профили создаются без копирования всей библиотеки. Локальный skill допускается только как намеренное исключение. Если процедура подходит нескольким профилям, исправляется каноническая версия.",[12,1997,1998],{},"После изменения skill проходит:",[157,2000,2001,2004,2007,2010,2013],{},[160,2002,2003],{},"проверку структуры;",[160,2005,2006],{},"валидацию связанных файлов и скриптов;",[160,2008,2009],{},"review diff;",[160,2011,2012],{},"обновление семантического индекса;",[160,2014,2015],{},"проверку загрузки из проектного профиля.",[12,2017,2018],{},"Так я получил общие навыки без общей истории и без смешивания проектных ограничений.",[34,2020,2022],{"id":2021},"почему-skills-тоже-не-исполняются-из-mempalace","Почему skills тоже не исполняются из MemPalace",[12,2024,2025],{},"В какой-то момент появилась естественная идея: если MemPalace умеет семантический поиск, почему бы не хранить там полные тексты skills и не исполнять найденную инструкцию?",[12,2027,2028],{},"От этого варианта я отказался.",[12,2030,2031],{},"Семантическая база хорошо отвечает на вопрос: «Какой skill подходит к этой задаче?» Но она не должна самостоятельно отвечать на вопрос: «Какой текст сейчас разрешено исполнять?»",[12,2033,2034],{},"Если полная инструкция извлекается из поисковой базы, усложняется контроль:",[217,2036,2037,2040,2043,2046,2049,2052,2055],{},[160,2038,2039],{},"происхождения;",[160,2041,2042],{},"версии;",[160,2044,2045],{},"изменений;",[160,2047,2048],{},"связанного кода;",[160,2050,2051],{},"валидности скриптов;",[160,2053,2054],{},"отката;",[160,2056,2057],{},"намеренных локальных исключений.",[12,2059,2060],{},"Поэтому MemPalace хранит только поисковый индекс:",[217,2062,2063,2066,2069,2072,2075,2078,2081],{},[160,2064,2065],{},"название skill;",[160,2067,2068],{},"краткое описание;",[160,2070,2071],{},"путь;",[160,2073,2074],{},"категорию;",[160,2076,2077],{},"версию;",[160,2079,2080],{},"хэш;",[160,2082,2083],{},"подсказки для поиска.",[12,2085,2086,2087,2090],{},"Найденная запись считается метаданными. После поиска агент загружает канонический ",[190,2088,2089],{},"SKILL.md"," штатным инструментом Hermes. Исполняемым источником остаётся файловая библиотека под Git.",[12,2092,2093],{},"Это тот же принцип, что и с проектной памятью:",[290,2095,2096],{},[12,2097,2098],{},"Поисковая система помогает найти источник, но не заменяет сам источник.",[34,2100,2102],{"id":2101},"конфигурация-ещё-не-означает-что-всё-работает","Конфигурация ещё не означает, что всё работает",[12,2104,2105],{},"Во время настройки профилей я столкнулся ещё с одной проблемой: успешная команда не всегда означала успешную цепочку.",[12,2107,2108,2109,2111],{},"Одна из первых команд добавления MemPalace дошла до интерактивного подтверждения, но не сохранила конфигурацию. При этом пустой ",[190,2110,1557],{}," отвлёк диагностику в неправильную сторону.",[12,2113,2114],{},"После этого проверка стала состоять из нескольких уровней:",[157,2116,2117,2120,2123,2126,2129,2132,2135],{},[160,2118,2119],{},"MCP присутствует в конфигурации профиля;",[160,2121,2122],{},"соединение с сервером устанавливается;",[160,2124,2125],{},"Hermes обнаруживает ожидаемые инструменты;",[160,2127,2128],{},"инструменты доступны в новой или перезагруженной сессии;",[160,2130,2131],{},"реальный запрос из Telegram доходит до нужного gateway;",[160,2133,2134],{},"профиль вызывает MemPalace;",[160,2136,2137],{},"ответ возвращается в тот же чат.",[12,2139,2140],{},"Появилась и отдельная операционная тонкость. После перезапуска gateway тестовое сообщение можно отправить слишком рано: Telegram его уже примет, но новое поколение polling ещё не будет готово его обработать.",[12,2142,2143],{},"Поэтому окончательная проверка выглядит так:",[182,2145,2148],{"className":2146,"code":2147,"language":187,"meta":192},[185],"Telegram\n→ gateway нужного профиля\n→ модель\n→ MCP\n→ MemPalace\n→ ответ в Telegram\n",[190,2149,2147],{"__ignoreMap":192},[12,2151,2152],{},"Только успешная сквозная цепочка считается доказательством работоспособности.",[34,2154,2156],{"id":2155},"что-в-итоге-получилось","Что в итоге получилось",[12,2158,2159],{},"Сейчас архитектура разделяет не агентов целиком, а разные виды их знаний.",[182,2161,2164],{"className":2162,"code":2163,"language":187,"meta":192},[185],"Отдельно для каждого профиля:\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",[190,2165,2163],{"__ignoreMap":192},[12,2167,2168],{},"Главное решение здесь не в количестве ботов. Отдельные боты — только видимая часть системы.",[12,2170,2171],{},"Настоящая архитектура определяется ответами на четыре вопроса:",[157,2173,2174,2177,2180,2183],{},[160,2175,2176],{},"Что агент должен знать всегда?",[160,2178,2179],{},"Что нужно загружать только для конкретной задачи?",[160,2181,2182],{},"Какие знания принадлежат одному проекту?",[160,2184,2185],{},"Какие процедуры должны быть одинаковыми для всех профилей?",[12,2187,2188],{},"Я оставил во встроенной памяти только короткий обязательный контекст. Большую проектную память подключил через MCP и вызываю по необходимости. Skills вынес в общую версионируемую библиотеку, а MemPalace использую как индекс для их поиска.",[12,2190,2191],{},"Так профили сохраняют собственную проектную идентичность, но не превращаются в изолированные копии, которые постепенно забывают общие правила.",[583,2193],{},[12,2195,2196,2197,209],{},"Если вы используете AI-агентов в нескольких проектах и контекст уже начал смешиваться, я могу помочь разделить профили, спроектировать уровни памяти и собрать общую библиотеку проверяемых процедур. ",[16,2198,2199],{"href":590},"Расскажите мне о своей задаче",{"title":192,"searchDepth":593,"depth":593,"links":2201},[2202,2203,2207,2208,2213,2214,2215,2216,2217,2218],{"id":1468,"depth":593,"text":1469},{"id":1547,"depth":593,"text":1548,"children":2204},[2205,2206],{"id":1570,"depth":599,"text":1571},{"id":1612,"depth":599,"text":1613},{"id":1648,"depth":593,"text":1649},{"id":1770,"depth":593,"text":1771,"children":2209},[2210,2211,2212],{"id":1777,"depth":599,"text":1778},{"id":1822,"depth":599,"text":1823},{"id":1852,"depth":599,"text":1853},{"id":1874,"depth":593,"text":1875},{"id":1925,"depth":593,"text":1926},{"id":1976,"depth":593,"text":1977},{"id":2021,"depth":593,"text":2022},{"id":2101,"depth":593,"text":2102},{"id":2155,"depth":593,"text":2156},"2026-08-25","Как я разделил Hermes по проектным профилям, оставил короткую память локальной, подключил MemPalace через MCP и вынес skills в общую библиотеку.",{},{"title":1439,"description":2220},"Профили Hermes: контекст, память и общие skills","blog\u002F2026-08-25-profili-hermes-otdelnyy-kontekst-obshchie-navyki",[626,627,628,2226,630],"память","iVREG2IpzvWnKMedD29hYoC2dnLriv6o0sZJJI1zg_I",{"id":2229,"title":2230,"acrostic":7,"body":2231,"date":2567,"description":2568,"duration":7,"emoji":7,"extension":617,"faq":7,"featured":618,"format":7,"image":7,"level":7,"media":7,"meta":2569,"navigation":620,"path":2570,"price":7,"schedule":7,"seo":2571,"seoTitle":7,"serviceType":7,"status":7,"stem":2572,"tags":2573,"tech":7,"toc":620,"url":7,"__hash__":2576},"blog\u002Fblog\u002F2026-08-23-slozhnost-nikuda-ne-ischezla.md","Сложность никуда не исчезла — я научился с ней справляться",{"type":9,"value":2232,"toc":2556},[2233,2236,2239,2242,2245,2248,2251,2271,2274,2278,2281,2284,2287,2290,2293,2296,2300,2303,2306,2335,2338,2341,2344,2347,2351,2354,2357,2360,2363,2366,2371,2374,2377,2381,2384,2387,2390,2393,2396,2400,2403,2406,2409,2429,2432,2436,2439,2442,2445,2448,2451,2458,2461,2465,2468,2471,2474,2491,2494,2497,2500,2505,2508,2512,2515,2521,2524,2527,2531,2534,2537,2540,2543,2546,2549,2551],[12,2234,2235],{},"В разработке программ есть свой ритм.",[12,2237,2238],{},"Сначала главное — чтобы всё заработало. Потом хочется, чтобы интерфейс выглядел достойно. Следом начинается доводка: нужно вычистить ошибки, подтянуть производительность, разобраться с крайними случаями, настроить мониторинг. Когда приложение состоит из пары экранов, обо всём этом обычно не думаешь.",[12,2240,2241],{},"Затем приходит самый непростой этап: сделать так, чтобы спустя полгода в коде смог разобраться человек, который не держит устройство всей системы в голове. Раньше до этого этапа у меня часто просто не доходили руки.",[12,2243,2244],{},"Продукт уже работает, им пользуются, новые функции постепенно появляются. Возникает логичный вопрос: зачем тратить время на документацию, архитектурные правила, тесты и рефакторинг, если заказчик этого почти не видит?",[12,2246,2247],{},"Но проходит время, и простая правка, которая раньше занимала пару часов, растягивается на два дня. Ещё через год на неё может уйти неделя. Обычно дело не в том, что код превратился в кошмар. Просто вокруг него накопился огромный пласт знаний, которые остались в чьей-то голове и нигде не были зафиксированы.",[12,2249,2250],{},"Появляются обычные вопросы, на которые нет ответа в документации:",[217,2252,2253,2256,2259,2262,2265,2268],{},[160,2254,2255],{},"зачем нужны два почти одинаковых сервиса;",[160,2257,2258],{},"какой из них считать основным;",[160,2260,2261],{},"почему это поле обязательно;",[160,2263,2264],{},"можно ли менять этот endpoint;",[160,2266,2267],{},"почему нельзя перезапускать процесс;",[160,2269,2270],{},"что сломается, если убрать странную проверку.",[12,2272,2273],{},"Когда-то кто-то всё это понимал. Иногда этим человеком был я сам.",[34,2275,2277],{"id":2276},"сложность-это-не-количество-файлов","Сложность — это не количество файлов",[12,2279,2280],{},"Раньше я думал, что управлять сложностью — значит построить правильную архитектуру: грамотно разделить систему на модули, не плодить лишние зависимости, использовать понятные шаблоны, выносить общее, писать тесты.",[12,2282,2283],{},"Всё это действительно важно. Но со временем мой взгляд изменился.",[12,2285,2286],{},"Большая система всё равно останется большой. Если в ней несколько приложений, база данных, очередь задач, десяток сервисов, внешние API, фоновые процессы и разные окружения, никакой рефакторинг не превратит её в простой калькулятор.",[12,2288,2289],{},"Поэтому я больше не пытаюсь сделать сложные системы простыми. Я стараюсь сделать их понятными.",[12,2291,2292],{},"Это не одно и то же.",[12,2294,2295],{},"Простота зависит от масштаба задачи. Понятность — от того, насколько хорошо зафиксированы устройство системы, принятые решения и способы проверки.",[34,2297,2299],{"id":2298},"пишу-инструкцию-для-следующего-разработчика","Пишу инструкцию для следующего разработчика",[12,2301,2302],{},"Только теперь этим следующим разработчиком всё чаще становится AI.",[12,2304,2305],{},"Для каждого серьёзного проекта я готовлю краткий документ — карту системы. Не толстую документацию на сотни страниц, а рабочий ориентир:",[217,2307,2308,2311,2314,2317,2320,2323,2326,2329,2332],{},[160,2309,2310],{},"что я строю;",[160,2312,2313],{},"из каких частей состоит система;",[160,2315,2316],{},"где живёт бизнес-логика;",[160,2318,2319],{},"что считается главным источником данных;",[160,2321,2322],{},"как данные проходят через систему;",[160,2324,2325],{},"какие существуют окружения;",[160,2327,2328],{},"как устроен релиз;",[160,2330,2331],{},"какие решения уже приняты;",[160,2333,2334],{},"какие части лучше не менять, пока не разберёшься в последствиях.",[12,2336,2337],{},"Раньше такой документ один раз читал новый сотрудник. Потом карта устаревала и постепенно превращалась в археологическую находку.",[12,2339,2340],{},"С AI ситуация оказалась интереснее. Агент действительно читает карту перед каждой задачей. Документация перестала быть формальностью, которую пишут «потому что положено». Она стала частью рабочего процесса.",[12,2342,2343],{},"Сначала агент получает контекст, затем изучает код.",[12,2345,2346],{},"Разница кажется небольшой, но на практике она огромна. Без контекста AI быстро придумывает собственную версию архитектуры. Эта версия может быть вполне логичной, аккуратной и даже красивой. Проблема в том, что она не совпадает с системой, которая уже работает.",[34,2348,2350],{"id":2349},"хорошие-и-плохие-примеры","Хорошие и плохие примеры",[12,2352,2353],{},"Если однажды в проекте удалось грамотно решить типовую задачу — сделать API-контроллер, воркер, компонент, работу с очередью или интеграцию с внешним сервисом, — нет смысла заставлять следующего агента снова изобретать решение.",[12,2355,2356],{},"Я сохраняю такие реализации как эталонные примеры. Перед созданием нового компонента агент сначала смотрит, как подобные компоненты принято делать в этом проекте. Он не должен слепо копировать код. Важнее понять подход: структуру, границы ответственности, обработку ошибок и способ проверки.",[12,2358,2359],{},"Рядом постепенно появилась обратная коллекция: примеры того, как делать не стоит. Она оказалась даже полезнее.",[12,2361,2362],{},"Например, ответ языковой модели нельзя сразу отдавать пользователю. Модель может вернуть служебный текст, неожиданную разметку, некорректные данные или убедительно сформулированную ошибку.",[12,2364,2365],{},"Можно один раз исправить такой баг и забыть о нём. А можно сохранить правило:",[290,2367,2368],{},[12,2369,2370],{},"Результат LLM — это недоверенный ввод. Перед использованием его нужно проверить.",[12,2372,2373],{},"Тогда ошибка оставляет после себя не только исправленный код, но и новое знание.",[12,2375,2376],{},"Мне нравится мысль, что каждый хорошо разобранный баг должен немного снижать вероятность следующего. Иначе я буду бесконечно исправлять одну и ту же ошибку в разных местах.",[34,2378,2380],{"id":2379},"один-факт-одно-место","Один факт — одно место",[12,2382,2383],{},"Есть простой способ незаметно нарастить сложность: скопировать один список в четыре разных файла.",[12,2385,2386],{},"Через несколько месяцев эти списки неизбежно начнут отличаться. То же самое происходит с типами данных, конфигурациями, правилами, URL, промптами, статусами и бизнес-ограничениями.",[12,2388,2389],{},"Поэтому я стараюсь находить для каждого такого факта одно главное место.",[12,2391,2392],{},"Если есть список сервисов, остальные конфигурации должны строиться на его основе. Если определён общий контракт данных, приложения должны использовать его, а не создавать собственные похожие версии. Если существует системный промпт, не нужно хранить ещё одну его копию прямо в коде.",[12,2394,2395],{},"Здесь нет сложной архитектурной теории. Если факт записан только в одном месте, невозможно забыть обновить его копию в другом — потому что копии нет.",[34,2397,2399],{"id":2398},"самая-опасная-фраза-заодно","Самая опасная фраза — «заодно»",[12,2401,2402],{},"AI охотно помогает. Просишь его исправить одну ошибку, а он замечает ещё три потенциальные проблемы, устаревшую библиотеку и дублирование логики. Иногда заодно предлагает перестроить половину архитектуры.",[12,2404,2405],{},"Нередко он прав. Но исходная задача всё равно заключалась в том, чтобы исправить одну ошибку.",[12,2407,2408],{},"Поэтому я стал гораздо строже задавать границы работы. Перед заметным изменением агент должен понимать:",[217,2410,2411,2414,2417,2420,2423,2426],{},[160,2412,2413],{},"что именно нужно изменить;",[160,2415,2416],{},"что не входит в задачу;",[160,2418,2419],{},"какие части системы могут быть затронуты;",[160,2421,2422],{},"как выглядит готовый результат;",[160,2424,2425],{},"чем этот результат будет проверен;",[160,2427,2428],{},"какие действия могут привести к неприятным последствиям.",[12,2430,2431],{},"Особенно важно явно перечислять то, чего делать не нужно. Большинство неприятностей в разработке начинается с безобидной фразы: «А давайте заодно…»",[34,2433,2435],{"id":2434},"я-больше-не-верю-фразе-всё-работает","Я больше не верю фразе «всё работает»",[12,2437,2438],{},"Это относится не только к AI.",[12,2440,2441],{},"Разработчик пишет код, проверяет его и говорит: «Работает». Но что именно он проверил? Какой результат получил? Соответствует ли это реальному пользовательскому сценарию?",[12,2443,2444],{},"Теперь для каждого изменения я стараюсь заранее построить понятный путь проверки.",[12,2446,2447],{},"Если исправляю баг, сначала по возможности воспроизвожу его тестом. Тест падает. Я вношу исправление. Тест проходит. Затем проверяю модуль целиком и сборку. Если изменение затрагивает соседние части системы, проверяю и их. Для критичных функций иду дальше и прохожу настоящий пользовательский сценарий.",[12,2449,2450],{},"Количество тестов само по себе ничего не доказывает. Важно, чтобы доказательство соответствовало утверждению.",[12,2452,2453,2454,2457],{},"Зелёный unit-тест не гарантирует, что функция работает в production. Статус процесса ",[190,2455,2456],{},"online"," не означает, что пользователь может выполнить нужное действие. Фраза AI «задача полностью выполнена» — это уверенное мнение, а не доказательство.",[12,2459,2460],{},"Если я утверждаю, что функция работает, у меня должен быть результат проверки именно этой функции.",[34,2462,2464],{"id":2463},"документация-стала-результатом-работы","Документация стала результатом работы",[12,2466,2467],{},"Здесь AI заметно изменил экономику процесса.",[12,2469,2470],{},"Раньше после большой задачи приходилось выбирать: двигаться дальше или остановиться и подробно описать сделанное. Нетрудно догадаться, какой вариант чаще побеждал.",[12,2472,2473],{},"Теперь значительную часть этой работы можно поручить агенту:",[217,2475,2476,2479,2482,2485,2488],{},[160,2477,2478],{},"изменился архитектурный контракт — обновить его описание;",[160,2480,2481],{},"нашлась повторяющаяся ошибка — добавить её в список антипаттернов;",[160,2483,2484],{},"появился новый сервис — дополнить карту проекта;",[160,2486,2487],{},"изменился пользовательский сценарий — проверить связанные тесты и документацию;",[160,2489,2490],{},"найден удачный способ решения — сохранить его как пример.",[12,2492,2493],{},"Конечно, за документацией тоже нужно следить. AI способен уверенно описать собственные догадки как существующее устройство системы. Поэтому код, конфигурация и работающий runtime остаются главными источниками фактов. Документ должен сверяться с ними, а не подменять их.",[12,2495,2496],{},"Но поддерживать документацию стало настолько дешевле, что уже странно этого не делать.",[12,2498,2499],{},"У меня получился повторяющийся цикл:",[12,2501,2502],{},[1463,2503,2504],{},"задача → код → проверка → новое знание → документация → контекст для следующей задачи",[12,2506,2507],{},"Проект накапливает не только код. Он накапливает опыт работы с этим кодом.",[34,2509,2511],{"id":2510},"с-чего-начать","С чего начать",[12,2513,2514],{},"Для такого подхода необязательно сразу создавать сложную систему правил. В качестве отправной точки можно дать агенту базовый промпт:",[182,2516,2519],{"className":2517,"code":2518,"language":187,"meta":188},[185],"Перед тем как вносить изменения, разберись, как устроен проект:\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",[190,2520,2518],{"__ignoreMap":192},[12,2522,2523],{},"Сам по себе этот промпт не сотворит чудес. Если в проекте нет нормального контекста, тестов и понятных правил, агенту не на что будет опереться.",[12,2525,2526],{},"Но с чего-то нужно начинать.",[34,2528,2530],{"id":2529},"четвёртый-этап-я-больше-не-откладываю","Четвёртый этап я больше не откладываю",[12,2532,2533],{},"Раньше я сначала запускал программу, затем дорабатывал интерфейс и стабилизировал систему. О документации, архитектурных правилах и накопленных знаниях вспоминал, когда проект уже начинал трещать под собственной тяжестью. Если на это оставались время и бюджет.",[12,2535,2536],{},"Теперь четвёртый этап можно выполнять постепенно, одновременно с основной работой.",[12,2538,2539],{},"Написал код — оставил тест. Принял решение — зафиксировал его. Наступил на грабли — положил их в каталог и подписал. Нашёл хороший способ решить типовую задачу — сохранил его как эталон.",[12,2541,2542],{},"Следующий AI-агент приходит уже не в пустое поле. Он получает опыт предыдущих задач: карту системы, принятые решения, рабочие примеры, известные ошибки и способы проверки.",[12,2544,2545],{},"Сложность никуда не исчезла. Большая система осталась большой системой. Но всё меньше её частей держится только в моей памяти.",[12,2547,2548],{},"И этого уже достаточно, чтобы работать с ней увереннее.",[583,2550],{},[12,2552,2553,2554,209],{},"Если в вашем проекте слишком многое держится в головах отдельных людей, я могу помочь собрать карту системы, определить источники истины и настроить работу AI-агентов так, чтобы они начинали с контекста и заканчивали проверяемым результатом. ",[16,2555,2199],{"href":590},{"title":192,"searchDepth":593,"depth":593,"links":2557},[2558,2559,2560,2561,2562,2563,2564,2565,2566],{"id":2276,"depth":593,"text":2277},{"id":2298,"depth":593,"text":2299},{"id":2349,"depth":593,"text":2350},{"id":2379,"depth":593,"text":2380},{"id":2398,"depth":593,"text":2399},{"id":2434,"depth":593,"text":2435},{"id":2463,"depth":593,"text":2464},{"id":2510,"depth":593,"text":2511},{"id":2529,"depth":593,"text":2530},"2026-08-23","Как карты проектов, эталонные решения, тесты и документация помогают мне управлять сложностью и безопаснее работать с AI-агентами.",{},"\u002Fblog\u002F2026-08-23-slozhnost-nikuda-ne-ischezla",{"title":2230,"description":2568},"blog\u002F2026-08-23-slozhnost-nikuda-ne-ischezla",[626,630,2574,2575,627],"архитектура","документация","u2IpebkyZ2KkR21aYLFIdOnMu7sqcDfubssSzmqIzJY",{"id":2578,"title":2579,"acrostic":7,"body":2580,"date":2836,"description":2837,"duration":7,"emoji":7,"extension":617,"faq":7,"featured":618,"format":7,"image":7,"level":7,"media":7,"meta":2838,"navigation":620,"path":2839,"price":7,"schedule":7,"seo":2840,"seoTitle":2841,"serviceType":7,"status":7,"stem":2842,"tags":2843,"tech":7,"toc":620,"url":7,"__hash__":2845},"blog\u002Fblog\u002F2026-08-13-bystryy-deploy-statey.md","Как я ускорил деплой контента в Nuxt: с 12 минут до 21 секунды",{"type":9,"value":2581,"toc":2824},[2582,2585,2588,2592,2595,2598,2602,2605,2643,2650,2660,2664,2670,2674,2677,2700,2703,2707,2713,2717,2724,2727,2730,2734,2737,2740,2743,2747,2750,2805,2808,2811,2814,2817],[12,2583,2584],{},"Исправить слово или запятую в статье можно за несколько секунд. Но на моём сайте после такой правки запускался полный выпуск: установка зависимостей, сборка Nuxt и админки, генерация страниц, перезапуск приложения и итоговые проверки.",[12,2586,2587],{},"Последний успешный полный workflow перед запуском новой схемы шёл 12 минут 53 секунды. Для изменений в коде это нормально. Для исправленной запятой — слишком долго.",[34,2589,2591],{"id":2590},"я-разделил-два-разных-выпуска","Я разделил два разных выпуска",[12,2593,2594],{},"Полный деплой остался для кода, конфигурации и смешанных изменений. Для статей я сделал отдельный путь, который принимает только Markdown блога и не пересобирает всё приложение.",[12,2596,2597],{},"Это не сокращённая версия обычного деплоя. Быстрый путь работает с отдельной проекцией контента, проверяет точный Git-коммит и переключает новую версию целиком. Если что-то идёт не так, сайт возвращается к предыдущему состоянию.",[34,2599,2601],{"id":2600},"как-устроен-быстрый-путь","Как устроен быстрый путь",[12,2603,2604],{},"Я добавил три компонента:",[48,2606,2607,2617],{},[51,2608,2609],{},[54,2610,2611,2614],{},[57,2612,2613],{},"Компонент",[57,2615,2616],{},"Что делает",[64,2618,2619,2627,2635],{},[54,2620,2621,2624],{},[69,2622,2623],{},"Fast renderer",[69,2625,2626],{},"Готовит разрешённые страницы из выбранного Git-снимка",[54,2628,2629,2632],{},[69,2630,2631],{},"Gateway",[69,2633,2634],{},"Направляет обычные запросы в основное приложение, а разрешённые маршруты — в renderer",[54,2636,2637,2640],{},[69,2638,2639],{},"Активный указатель",[69,2641,2642],{},"Связывает публичные маршруты с точным Git-коммитом",[12,2644,2645,2646,2649],{},"Главная страница, список блога, сама статья и sitemap должны видеть один и тот же набор материалов. Простого копирования ",[190,2647,2648],{},".md"," на сервер для этого недостаточно: основное приложение продолжит работать с данными и HTML из прежней сборки.",[12,2651,2652,2653,1494,2656,2659],{},"Поэтому renderer читает полный снимок блога из Git и создаёт новую проекцию. Gateway использует её только для маршрутов из строгого списка. Административные страницы, API, неизвестные URL и методы кроме ",[190,2654,2655],{},"GET",[190,2657,2658],{},"HEAD"," остаются на основном приложении.",[113,2661,2663],{"id":2662},"промпт-спроектировать-быстрый-путь-для-контента","Промпт: спроектировать быстрый путь для контента",[182,2665,2668],{"className":2666,"code":2667,"language":187,"meta":188},[185],"Я хочу отделить публикацию 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",[190,2669,2667],{"__ignoreMap":192},[34,2671,2673],{"id":2672},"как-теперь-публикуется-статья","Как теперь публикуется статья",[12,2675,2676],{},"Быстрый выпуск получает полный 40-символьный SHA и выполняет несколько шагов:",[157,2678,2679,2685,2688,2691,2694,2697],{},[160,2680,2681,2682,209],{},"Проверяет, что коммит совпадает с вершиной ",[190,2683,2684],{},"origin\u002Fmain",[160,2686,2687],{},"Подтверждает, что во всём наборе изменений есть только разрешённые Markdown-файлы.",[160,2689,2690],{},"Формирует полную проекцию блога для выбранного SHA.",[160,2692,2693],{},"Записывает её в неизменяемый файл.",[160,2695,2696],{},"Атомарно переключает активный указатель.",[160,2698,2699],{},"Открывает главную, блог, sitemap и изменённые статьи через HTTP.",[12,2701,2702],{},"Перед началом скрипт сохраняет исходный SHA и прежний активный указатель. Если синхронизация или HTTP-проверка завершается ошибкой, он возвращает оба значения назад. Читатель видит либо предыдущую целую версию сайта, либо новую.",[113,2704,2706],{"id":2705},"промпт-проверить-выпуск-перед-подтверждением-успеха","Промпт: проверить выпуск перед подтверждением успеха",[182,2708,2711],{"className":2709,"code":2710,"language":187,"meta":188},[185],"Проверь завершившийся 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",[190,2712,2710],{"__ignoreMap":192},[34,2714,2716],{"id":2715},"где-проходит-граница","Где проходит граница",[12,2718,2719,2720,2723],{},"Быстрый путь разрешает добавлять, изменять и удалять только датированные файлы ",[190,2721,2722],{},"content\u002Fblog\u002F*.md",". Он проверяет весь diff от активной production-версии до запрошенного коммита.",[12,2725,2726],{},"Переименование, копирование, пустой diff, изменение кода или смешанный набор файлов отправляются в полный деплой. Если классификатор не может доказать, что перед ним только статьи, ускорения не будет.",[12,2728,2729],{},"Это ограничение важнее самой скорости. Без него отдельный путь постепенно превратился бы в запасной деплой для любых изменений.",[34,2731,2733],{"id":2732},"эта-статья-стала-проверкой-нового-пути","Эта статья стала проверкой нового пути",[12,2735,2736],{},"Когда быстрый деплой был готов, его требовалось проверить настоящей публикацией. Я решил не создавать проходную тестовую заметку, а написать статью о самой работе. Тема того стоила: ожидаемый путь публикации сокращался с почти 13 минут до нескольких секунд.",[12,2738,2739],{},"Черновик родился в той же рабочей сессии с AI-агентом, где я вводил новую схему в production. В контексте ещё оставались исходная задача, неудачные проверки, откаты, команды и фактическая приёмка. Из этого журнала я собрал последовательный рассказ, а код и логи не позволили приписать системе то, чего она ещё не доказала.",[12,2741,2742],{},"Получился полезный цикл: рабочая сессия дала материал для статьи, а статья стала первым реальным тестом результата этой сессии.",[34,2744,2746],{"id":2745},"что-показала-первая-публикация","Что показала первая публикация",[12,2748,2749],{},"Первый успешный выпуск этой статьи занял 21 секунду по времени GitHub Actions. Сам production-скрипт от начала проверки до завершения локальной приёмки отработал за 13,36 секунды.",[48,2751,2752,2763],{},[51,2753,2754],{},[54,2755,2756,2759],{},[57,2757,2758],{},"Этап",[57,2760,2762],{"align":2761},"right","Время",[64,2764,2765,2773,2781,2789,2797],{},[54,2766,2767,2770],{},[69,2768,2769],{},"Проверка набора файлов",[69,2771,2772],{"align":2761},"1,73 с",[54,2774,2775,2778],{},[69,2776,2777],{},"Git-проверка и переход",[69,2779,2780],{"align":2761},"1,01 с",[54,2782,2783,2786],{},[69,2784,2785],{},"Синхронизация контента",[69,2787,2788],{"align":2761},"2,91 с",[54,2790,2791,2794],{},[69,2792,2793],{},"HTTP-приёмка",[69,2795,2796],{"align":2761},"7,67 с",[54,2798,2799,2802],{},[69,2800,2801],{},"Весь production-скрипт",[69,2803,2804],{"align":2761},"13,36 с",[12,2806,2807],{},"Для сравнения я беру одинаковую внешнюю границу — длительность job в GitHub Actions. Полный workflow шёл 12 минут 53 секунды, быстрый — 21 секунду. В этой публикации выпуск ускорился в 36,8 раза.",[12,2809,2810],{},"Основной Nuxt-процесс, renderer и gateway не перезапускались: их PID и счётчики перезапусков до и после совпали. При этом сохранились проверка точного SHA, контроль набора файлов, согласованность маршрутов, HTTP-приёмка и автоматический откат.",[12,2812,2813],{},"Полный деплой никуда не исчез. Он по-прежнему обслуживает изменения в коде и остаётся точкой восстановления. Следующая полная сборка включает опубликованные статьи в обычный Nuxt-артефакт, после чего временная проекция больше не нужна.",[12,2815,2816],{},"Эта статья стала первой принятой проверкой быстрого пути. Два следующих обновления того же Markdown также прошли без полной сборки и перезапуска процессов. Быстрый выпуск теперь обслуживает обычные правки статей, а полный деплой остаётся для изменений в коде и включает актуальный контент в основной Nuxt-артефакт.",[12,2818,2819,2820,2823],{},"У вас публикация одной правки тоже запускает долгую сборку? ",[16,2821,2822],{"href":590},"Напишите мне",". Я посмотрю, где в проекте проходит граница между контентом и кодом, и помогу спроектировать быстрый путь так, чтобы он не обходил проверки и rollback.",{"title":192,"searchDepth":593,"depth":593,"links":2825},[2826,2827,2830,2833,2834,2835],{"id":2590,"depth":593,"text":2591},{"id":2600,"depth":593,"text":2601,"children":2828},[2829],{"id":2662,"depth":599,"text":2663},{"id":2672,"depth":593,"text":2673,"children":2831},[2832],{"id":2705,"depth":599,"text":2706},{"id":2715,"depth":593,"text":2716},{"id":2732,"depth":593,"text":2733},{"id":2745,"depth":593,"text":2746},"2026-08-13","Как я отделил публикацию Markdown от полной сборки Nuxt-сайта и сократил время выпуска статьи с 12 минут 53 секунд до 21 секунды.",{},"\u002Fblog\u002F2026-08-13-bystryy-deploy-statey",{"title":2579,"description":2837},"Как ускорить деплой контента в Nuxt с 12 минут до 21 секунды","blog\u002F2026-08-13-bystryy-deploy-statey",[630,920,2844,626],"nuxt","1n9Sf3zXrOYTRK2HYmG9VeX610rfCZ8PNaTY3It3_qE",{"id":2847,"title":2848,"acrostic":7,"body":2849,"date":2836,"description":3185,"duration":7,"emoji":7,"extension":617,"faq":7,"featured":618,"format":7,"image":7,"level":7,"media":7,"meta":3186,"navigation":620,"path":3187,"price":7,"schedule":7,"seo":3188,"seoTitle":3189,"serviceType":7,"status":7,"stem":3190,"tags":3191,"tech":7,"toc":620,"url":7,"__hash__":3194},"blog\u002Fblog\u002F2026-08-13-ot-open-source-k-multitenant-saas.md","От open-source для одного автосервиса к мультитенантному SaaS",{"type":9,"value":2850,"toc":3175},[2851,2854,2857,2860,2863,2866,2869,2872,2876,2879,2882,2885,2888,2891,2914,2917,2920,2923,2927,2930,2933,2936,2939,2942,2947,2950,2953,2976,2979,2983,2986,2989,2992,2995,2998,3001,3004,3007,3010,3013,3018,3021,3025,3028,3031,3034,3037,3040,3043,3047,3050,3053,3056,3059,3062,3085,3088,3091,3094,3097,3101,3104,3107,3110,3113,3116,3119,3123,3126,3129,3132,3135,3138,3141,3144,3148,3151,3154,3157,3160,3163,3166,3169],[12,2852,2853],{},"Когда я начинал этот проект, задача выглядела довольно понятно.",[12,2855,2856],{},"Нужно было сделать код для одного автосервиса. Предполагалось, что затем владельцы других сервисов смогут взять open-source продукт, развернуть его у себя и пользоваться им самостоятельно: вести клиентов, автомобили, заказы, документы и работу сотрудников.",[12,2858,2859],{},"Для первого этапа такая модель была естественной. Она позволяла сосредоточиться на самом продукте, а не на платформе вокруг него. У каждого сервиса была бы своя установка, свои данные, своё окружение и свой темп обновлений.",[12,2861,2862],{},"Но по мере работы стало видно, что продукт идёт в другую сторону.",[12,2864,2865],{},"Нам нужен был не набор независимых установок, а единый сервис для многих автосервисов. Такой, где организация создаёт своё рабочее пространство, получает изолированные данные и обновления без отдельного развёртывания каждой новой версии.",[12,2867,2868],{},"Так проект перешёл от open-source модели к мультитенантному SaaS.",[12,2870,2871],{},"На словах это иногда звучит как небольшая архитектурная задача: добавить организациям идентификаторы, разделить данные, настроить роли. На деле пришлось пересмотреть почти все границы продукта.",[34,2873,2875],{"id":2874},"старая-модель-перестала-отвечать-на-новые-вопросы","Старая модель перестала отвечать на новые вопросы",[12,2877,2878],{},"Установка для одного автосервиса и SaaS для множества организаций могут выполнять похожие функции. В обоих случаях есть клиенты, автомобили, заказы, сотрудники и документы.",[12,2880,2881],{},"Но ответственность устроена по-разному.",[12,2883,2884],{},"В самостоятельной установке каждый владелец сервиса отвечает за своё окружение. Он решает, когда обновляться, как поддерживать инфраструктуру и что делать, если версия продукта расходится с другими установками.",[12,2886,2887],{},"В SaaS система одна, но внутри неё работают независимые организации. Они не должны видеть данные друг друга, влиять на чужие процессы или получать доступ к действиям, которые не относятся к их роли.",[12,2889,2890],{},"Из-за этого появились вопросы, которые нельзя было оставлять на потом:",[217,2892,2893,2896,2899,2902,2905,2908,2911],{},[160,2894,2895],{},"как пользователь создаёт организацию и попадает в нужный автосервис;",[160,2897,2898],{},"кому принадлежат автомобили, заказы и документы;",[160,2900,2901],{},"что видит владелец автомобиля;",[160,2903,2904],{},"какие действия доступны сотруднику сервиса;",[160,2906,2907],{},"что может делать механик;",[160,2909,2910],{},"где заканчиваются права организации и начинаются полномочия самой платформы;",[160,2912,2913],{},"как выпускать обновления одновременно для всех, не превращая каждый релиз в отдельный проект.",[12,2915,2916],{},"Пока продукт рассчитан на одну установку, часть этих вопросов легко не заметить. Когда внутри одной системы появляются разные организации, неявные договорённости становятся риском.",[12,2918,2919],{},"Я понял, что недостаточно добавить к старой модели несколько новых полей и назвать результат мультитенантностью. В таком случае старый продукт остаётся внутри нового, а вокруг него постепенно растут исключения, флаги и переходники.",[12,2921,2922],{},"Через несколько месяцев уже трудно понять, что относится к текущей модели, а что осталось от прежней.",[34,2924,2926],{"id":2925},"не-добавлять-слой-сверху-а-поменять-основу","Не добавлять слой сверху, а поменять основу",[12,2928,2929],{},"Главное решение здесь было не техническим, а продуктовым.",[12,2931,2932],{},"Проект всё ещё находился в разработке. Не было клиентского трафика и данных, ради которых пришлось бы годами поддерживать прежнюю логику. Поэтому я выбрал более прямой путь: не строить совместимость с тем, что больше не нужно.",[12,2934,2935],{},"Если старая сущность или сценарий противоречили новой модели, их не нужно было сохранять «на всякий случай». Их можно было убрать.",[12,2937,2938],{},"Это не сделало работу маленькой. Зато она стала честнее.",[12,2940,2941],{},"Вместо вопроса «как сохранить все старые сценарии?» появился другой:",[290,2943,2944],{},[12,2945,2946],{},"Какая модель нужна продукту сейчас и какие границы в ней нельзя размывать?",[12,2948,2949],{},"Основой стала понятная последовательность: исходный запрос превращается в сервисный запрос, затем в заказ конкретного автосервиса. История изменений заказа сохраняется отдельно, чтобы новые правки не переписывали прошлое задним числом.",[12,2951,2952],{},"Когда процесс определён, проще задать остальные границы:",[217,2954,2955,2958,2961,2964,2967,2970,2973],{},[160,2956,2957],{},"кому принадлежит заказ;",[160,2959,2960],{},"кто имеет право его увидеть;",[160,2962,2963],{},"кто меняет статус;",[160,2965,2966],{},"что может делать сервис;",[160,2968,2969],{},"что относится к работе механика;",[160,2971,2972],{},"какие данные должен видеть владелец автомобиля;",[160,2974,2975],{},"где проходит граница между организациями.",[12,2977,2978],{},"Это не универсальная схема для любого продукта. Но для нашей платформы она стала опорой, от которой можно проверять решения.",[34,2980,2982],{"id":2981},"разные-роли-не-должны-жить-в-одном-кабинете","Разные роли не должны жить в одном кабинете",[12,2984,2985],{},"На ранней стадии продукта хочется собрать всё в одном интерфейсе. Кажется, что так быстрее: один фронтенд, одна навигация, а лишние пункты меню можно скрывать в зависимости от роли.",[12,2987,2988],{},"Проблема в том, что скрытое меню не создаёт границ.",[12,2990,2991],{},"Владелец автомобиля, сотрудник сервиса, механик и платформенный администратор смотрят на один и тот же заказ по-разному. У них разные задачи, разный объём информации и разная цена ошибки.",[12,2993,2994],{},"Поэтому я разделил эти сценарии.",[12,2996,2997],{},"Публичная часть рассказывает о сервисе и ведёт человека в нужный путь.",[12,2999,3000],{},"Кабинет владельца автомобиля нужен для его машин, заявок и истории обслуживания.",[12,3002,3003],{},"Рабочее пространство автосервиса предназначено для заказов, клиентов, автомобилей, документов, сотрудников и внутренних процессов организации.",[12,3005,3006],{},"Рабочее место механика намеренно уже. Механик должен видеть назначенные ему работы, а не всю коммерческую и клиентскую информацию сервиса.",[12,3008,3009],{},"Отдельно существует платформенное администрирование. Это не кабинет автосервиса с дополнительными кнопками, а контур управления самой платформой.",[12,3011,3012],{},"Такое разделение добавляет работы на старте. Зато у каждого интерфейса появляется простой вопрос:",[290,3014,3015],{},[12,3016,3017],{},"Что этот человек должен сделать здесь сейчас?",[12,3019,3020],{},"Если на него нет ясного ответа, экран или действие, вероятно, лишние.",[34,3022,3024],{"id":3023},"роль-это-не-настройка-интерфейса","Роль — это не настройка интерфейса",[12,3026,3027],{},"При переходе к SaaS легко принять визуальные ограничения за настоящую защиту.",[12,3029,3030],{},"Например, можно скрыть от механика кнопку редактирования. Это полезно для интерфейса, но ничего не гарантирует, если сервер всё равно принимает запрос.",[12,3032,3033],{},"Поэтому правила должны работать не только на экране. Система сама определяет, кто выполняет действие, к какой организации относится пользователь, в каком рабочем контексте он находится и имеет ли право на конкретный запрос.",[12,3035,3036],{},"Интерфейс помогает человеку не ошибиться. Окончательное решение остаётся за сервером.",[12,3038,3039],{},"То же относится к данным. Если механику не нужны финансовые сведения, лишние данные клиента или служебные поля, их не стоит просто прятать в интерфейсе. Они не должны попадать в его рабочий набор данных вовсе.",[12,3041,3042],{},"Это не попытка усложнить продукт. Это нормальная дисциплина для системы, где рядом работают разные организации и разные роли.",[34,3044,3046],{"id":3045},"почему-я-не-стал-переписывать-всё-одним-заходом","Почему я не стал переписывать всё одним заходом",[12,3048,3049],{},"Большие переделки часто ломаются не потому, что команда не умеет писать код. Они ломаются, когда изменения невозможно проверить по частям.",[12,3051,3052],{},"Поэтому переход я разделил на шесть волн разработки.",[12,3054,3055],{},"Сначала нужно было зафиксировать доменную модель и убрать то, что конфликтовало с ней. Затем отдельно выстраивались сценарии доступа, жизненный цикл заказов, интерфейсы разных ролей, операционный контур и выпуск.",[12,3057,3058],{},"У каждой волны был свой проверяемый вопрос.",[12,3060,3061],{},"Не «готов ли уже весь продукт?», а, например:",[217,3063,3064,3067,3070,3073,3076,3079,3082],{},[160,3065,3066],{},"работают ли организации только со своими данными;",[160,3068,3069],{},"не остались ли активные сценарии прежней модели;",[160,3071,3072],{},"можно ли получить доступ к чужому заказу прямым запросом;",[160,3074,3075],{},"не выдаёт ли публичная ссылка лишнюю информацию;",[160,3077,3078],{},"сохраняется ли история изменений;",[160,3080,3081],{},"видит ли механик только назначенные ему работы;",[160,3083,3084],{},"можно ли развернуть новую версию и подтвердить её состояние без ручных действий на сервере.",[12,3086,3087],{},"Каждая волна должна была заканчиваться не отчётом о проделанной работе, а доказательствами: тестами, сборкой, проверкой схемы данных, проверкой прав доступа, отсутствием устаревших маршрутов и проверкой выпуска.",[12,3089,3090],{},"AI-агенты здесь заметно ускорили работу. Они помогали параллельно исследовать разные части проекта, находить старые зависимости, готовить проверки и проверять достижимость маршрутов.",[12,3092,3093],{},"Но направление и приёмка оставались за мной.",[12,3095,3096],{},"Агент может предложить изменение или сообщить, что задача завершена. Он не решает, какую старую сущность нужно сохранить, где проходит продуктовая граница между ролями и достаточно ли доказательств перед выпуском. Его отчёт остаётся гипотезой, пока я не проверю код, тесты и фактическое поведение системы.",[34,3098,3100],{"id":3099},"временные-решения-быстро-становятся-постоянными","Временные решения быстро становятся постоянными",[12,3102,3103],{},"Во время большого перехода постоянно хочется сказать: «Пока оставим старое, потом разберёмся».",[12,3105,3106],{},"Иногда это необходимо. Если в системе уже есть пользователи, исторические данные и обязательства, переход должен быть осторожным.",[12,3108,3109],{},"Но когда продукт ещё можно менять свободно, временная совместимость быстро обрастает постоянными ветками.",[12,3111,3112],{},"Остаётся старый маршрут «на всякий случай». Прежняя сущность продолжает использоваться в одном экране. Новый сценарий начинает принимать два формата данных. В интерфейсе появляется переключатель между старым и новым поведением.",[12,3114,3115],{},"Через несколько месяцев трудно объяснить, что из этого действительно нужно продукту, а что просто осталось от незавершённого переезда.",[12,3117,3118],{},"Я старался не поддерживать старую модель там, где она мешала новой. Это помогло упростить не презентацию, а реальное поведение системы: убрать лишние ветки, исключения и правила, которые держатся только на памяти людей, работавших с проектом раньше.",[34,3120,3122],{"id":3121},"production-тоже-часть-продукта","Production — тоже часть продукта",[12,3124,3125],{},"После того как код написан и тесты проходят, легко решить, что работа закончена.",[12,3127,3128],{},"На самом деле начинается другой этап.",[12,3130,3131],{},"Для SaaS недостаточно, чтобы проект собирался на локальной машине. Нужно понимать, как он запускается, где хранятся данные, какие сервисы доступны извне, как разделены окружения, что произойдёт при ошибке и как подтвердить, что новая версия действительно работает.",[12,3133,3134],{},"Поэтому выпуск я проверял отдельно.",[12,3136,3137],{},"До него были резервные копии и подготовленный путь отката. После него — состояние процессов, доступность публичных точек входа, целостность базы и отсутствие открытых наружу внутренних сервисов.",[12,3139,3140],{},"Это не самая заметная часть работы. Её не покажешь красивым скриншотом. Но именно здесь становится понятно, есть ли перед тобой продукт или просто набор исходников.",[12,3142,3143],{},"Переход на мультитенантную модель завершён. Платформа работает как единый SaaS-продукт, а не как кодовая база для множества самостоятельных установок.",[34,3145,3147],{"id":3146},"что-дальше","Что дальше",[12,3149,3150],{},"На этом работа не закончилась.",[12,3152,3153],{},"Переход на SaaS решил одну большую задачу: теперь продукт построен как единая платформа с разделёнными организациями, ролями и рабочими сценариями.",[12,3155,3156],{},"Но архитектурная готовность не означает, что интерфейс уже идеален.",[12,3158,3159],{},"Сейчас я отдельно переделываю UI. Это другая работа: как сделать сложную систему понятной для владельца автомобиля, сотрудника сервиса, механика и администратора платформы. Когда там появится материал, которым можно делиться, я расскажу об этом отдельно.",[12,3161,3162],{},"Эта история для меня не только про автосервисы и мультитенантность.",[12,3164,3165],{},"Она про момент, когда нужно признать: первоначальная версия продукта выполнила свою задачу, но больше не подходит следующей версии замысла.",[12,3167,3168],{},"В такой момент не всегда нужно аккуратно развивать то, что уже есть. Иногда честнее заново определить основу, разделить переход на проверяемые части и оставить в системе только то, что действительно нужно будущему продукту.",[12,3170,3171,3172,3174],{},"Если вы тоже переводите продукт из самостоятельных установок в единый сервис, ",[16,3173,896],{"href":590},". Я помогу разобрать границы данных, ролей, сценариев доступа и выпусков, которые стоит определить до того, как переход обрастёт временной совместимостью.",{"title":192,"searchDepth":593,"depth":593,"links":3176},[3177,3178,3179,3180,3181,3182,3183,3184],{"id":2874,"depth":593,"text":2875},{"id":2925,"depth":593,"text":2926},{"id":2981,"depth":593,"text":2982},{"id":3023,"depth":593,"text":3024},{"id":3045,"depth":593,"text":3046},{"id":3099,"depth":593,"text":3100},{"id":3121,"depth":593,"text":3122},{"id":3146,"depth":593,"text":3147},"Почему я отказался от модели самостоятельных open-source установок и как перевёл разрабатываемую платформу автосервисов на мультитенантный SaaS.",{},"\u002Fblog\u002F2026-08-13-ot-open-source-k-multitenant-saas",{"title":2848,"description":3185},"Как перевести продукт из open-source в мультитенантный SaaS","blog\u002F2026-08-13-ot-open-source-k-multitenant-saas",[630,3192,2574,3193],"saas","автосервисы","QLNoN3ETI4iw7QvXpguCi0hvXZYrCiW1LW-LzCHlakY",{"id":3196,"title":3197,"acrostic":7,"body":3198,"date":4259,"description":4260,"duration":7,"emoji":7,"extension":617,"faq":7,"featured":618,"format":7,"image":7,"level":7,"media":7,"meta":4261,"navigation":620,"path":4262,"price":7,"schedule":7,"seo":4263,"seoTitle":4264,"serviceType":7,"status":7,"stem":4265,"tags":4266,"tech":7,"toc":620,"url":7,"__hash__":4270},"blog\u002Fblog\u002F2026-08-12-lichnyy-sayt-ai-agenty.md","Личный сайт в эпоху AI-агентов: как запустить и развивать его без хаоса",{"type":9,"value":3199,"toc":4230},[3200,3203,3206,3209,3212,3215,3219,3239,3243,3246,3249,3252,3255,3260,3263,3266,3269,3273,3276,3279,3333,3336,3341,3344,3348,3351,3354,3357,3377,3380,3383,3388,3391,3395,3401,3404,3408,3411,3414,3417,3434,3437,3441,3447,3450,3454,3457,3460,3463,3517,3520,3523,3528,3532,3538,3542,3545,3548,3602,3605,3608,3612,3615,3618,3635,3641,3644,3647,3664,3667,3670,3674,3681,3684,3701,3704,3707,3712,3715,3720,3723,3727,3730,3741,3939,3942,3946,3952,3955,3959,3962,3966,3972,3976,3982,3986,3992,3996,3999,4002,4005,4049,4052,4056,4059,4113,4116,4119,4122,4126,4129,4198,4201,4205,4208,4211,4214,4217,4220,4226],[12,3201,3202],{},"Личный сайт легко представить как разовую задачу: купить домен, выбрать шаблон, написать «обо мне», добавить контакты — и наконец-то поставить галочку.",[12,3204,3205],{},"Но через несколько месяцев оказывается, что на сайте висит старая услуга, в проектах не видно последних работ, блог ждёт первую публикацию, а форму связи страшно трогать, потому что непонятно, кто и как её настраивал.",[12,3207,3208],{},"С появлением AI-агентов проблема не исчезла. Сайт стало проще быстро собрать, написать для него тексты и даже развернуть на сервере. Но скорость не гарантирует, что он окажется полезным, узнаваемым и живым. За вечер агент способен предложить структуру, сгенерировать блоки и составить план публикаций. С той же скоростью он может наполнить сайт общими словами, выдуманными кейсами и разделами, которые никто не будет поддерживать.",[12,3210,3211],{},"Поэтому для меня личный сайт — не «страница о себе» и не демонстрация того, что AI умеет писать код. Это рабочая площадка, где постепенно собираются проекты, мысли, доказательства опыта и поводы начать разговор.",[12,3213,3214],{},"AI здесь не заменяет автора. Он помогает превратить живой опыт в материал, проверить повторяющиеся вещи и поддерживать ритм обновлений. Но цель сайта, факты, интонация и решение о публикации остаются за человеком.",[34,3216,3218],{"id":3217},"коротко","Коротко",[217,3220,3221,3224,3227,3230,3233,3236],{},[160,3222,3223],{},"Сначала нужно определить роль сайта: что посетитель должен понять и сделать, а не выбирать шаблон.",[160,3225,3226],{},"Лучшая основа для статьи или кейса часто появляется не в пустом документе, а в голосовой заметке после работы, встречи или мысли в дороге.",[160,3228,3229],{},"Агент может расшифровать запись, выделить структуру, подготовить черновик и проверить материал, но не должен придумывать факты и публиковать без подтверждения.",[160,3231,3232],{},"Первую версию сайта стоит ограничить несколькими рабочими сценариями: понять, чем я занимаюсь, увидеть результаты, прочитать материалы и связаться.",[160,3234,3235],{},"Для собственного сайта я рекомендую Nuxt: он даёт серверный рендеринг, хорошую основу для SEO, Markdown-контент и возможность добавлять формы и интеграции без смены платформы.",[160,3237,3238],{},"Сайт лучше размещать на контролируемом VPS или выделенном сервере, а обновления проводить по понятному, проверяемому процессу.",[34,3240,3242],{"id":3241},"сайт-не-визитка-а-собственная-площадка","Сайт — не визитка, а собственная площадка",[12,3244,3245],{},"Социальные сети, мессенджеры, площадки для портфолио и агрегаторы полезны. Они помогают знакомиться, получать внимание и поддерживать связь. Но правила там всегда чужие: меняется алгоритм, исчезает формат, публикация уходит глубоко в ленту, а аккаунт может попасть под ограничения.",[12,3247,3248],{},"Сайт не отменяет эти каналы. Он связывает их между собой.",[12,3250,3251],{},"В коротком посте я могу оставить одну мысль и привести человека к подробной статье. В описании проекта — показать не только красивый скриншот, но и задачу, ход решения, ограничения и результат. На странице услуг — объяснить, в каком формате начинается работа. В контактах — предложить простой путь к разговору.",[12,3253,3254],{},"Поэтому до дизайна и кода я бы зафиксировал роль сайта одной фразой. Например:",[290,3256,3257],{},[12,3258,3259],{},"Помочь посетителю быстро понять, чем я занимаюсь, увидеть реальные работы и материалы, а затем выбрать следующий шаг: написать, обсудить проект или вернуться за новой заметкой.",[12,3261,3262],{},"Это не рекламный слоган, а критерий для следующих решений.",[12,3264,3265],{},"Если хочется добавить новый раздел, я могу спросить: он помогает посетителю пройти нужный маршрут или просто кажется хорошей идеей? Если хочется переделать главную, станет ли яснее, что здесь происходит? Если ответ неясен, вероятно, задача ещё не проработана.",[12,3267,3268],{},"Без этой опоры личный сайт быстро превращается в склад блоков: проекты, навыки, сертификаты, отзывы, блог, восемь иконок, анимация и ссылка на мессенджер. Формально всё на месте, но человеку по-прежнему непонятно, зачем он сюда пришёл.",[34,3270,3272],{"id":3271},"распределить-роли-автор-агент-и-работающая-система","Распределить роли: автор, агент и работающая система",[12,3274,3275],{},"AI-агенты особенно полезны там, где нужно быстро разобрать много материала, подготовить несколько вариантов или не забыть повторяющуюся проверку. Но они не получают автоматически право решать, что является правдой обо мне и моём деле.",[12,3277,3278],{},"Я разделяю ответственность так:",[48,3280,3281,3291],{},[51,3282,3283],{},[54,3284,3285,3288],{},[57,3286,3287],{},"За автором",[57,3289,3290],{},"Можно поручить AI-помощнику",[64,3292,3293,3301,3309,3317,3325],{},[54,3294,3295,3298],{},[69,3296,3297],{},"Цель сайта, аудитория и позиционирование",[69,3299,3300],{},"Исследование структуры похожих сайтов и сценариев посетителя",[54,3302,3303,3306],{},[69,3304,3305],{},"Факты, реальные проекты, обещания и границы",[69,3307,3308],{},"Расшифровка голосовых заметок и выделение тем",[54,3310,3311,3314],{},[69,3312,3313],{},"Личный голос и финальная редактура",[69,3315,3316],{},"План статьи, варианты заголовков, черновик из моих материалов",[54,3318,3319,3322],{},[69,3320,3321],{},"Решение о публикации",[69,3323,3324],{},"Проверка ссылок, метаданных, доступности и чек-листа",[54,3326,3327,3330],{},[69,3328,3329],{},"Доступы, production и рискованные изменения",[69,3331,3332],{},"Сборка, тесты, отчёт об изменённых файлах и рисках",[12,3334,3335],{},"Такое разделение не означает, что агенту нельзя доверять. Оно делает доверие понятным: я вижу, какую часть работы он ускоряет и где решение должен принять я.",[290,3337,3338],{},[12,3339,3340],{},"Агентский отчёт — это полезная гипотеза. Доказательством он становится после проверки текста, кода, публичной страницы или нужного пользовательского сценария.",[12,3342,3343],{},"Это особенно важно для личного сайта. Один выдуманный результат в кейсе подрывает доверие сильнее, чем отсутствие десятка красивых карточек. Одна сломанная форма связи может стоить реального разговора. А одна самовольная публикация превращает помощника в источник риска.",[34,3345,3347],{"id":3346},"начинать-статью-можно-с-голосовой-заметки","Начинать статью можно с голосовой заметки",[12,3349,3350],{},"Самая трудная часть регулярных обновлений сайта часто не техническая. Нужно сесть перед пустым документом и собрать мысли в связный текст. После рабочего дня, встречи или сложного проекта на это обычно не хватает времени — хотя именно тогда в голове есть живые детали.",[12,3352,3353],{},"Поэтому я считаю голосовую заметку хорошей стартовой точкой.",[12,3355,3356],{},"Можно открыть диктофон и за несколько минут проговорить:",[217,3358,3359,3362,3365,3368,3371,3374],{},[160,3360,3361],{},"что произошло;",[160,3363,3364],{},"какая была задача;",[160,3366,3367],{},"почему она оказалась непростой;",[160,3369,3370],{},"какое решение я выбрал;",[160,3372,3373],{},"что сработало или не сработало;",[160,3375,3376],{},"какой вывод может быть полезен другому человеку.",[12,3378,3379],{},"Не нужно пытаться говорить литературно. На этом этапе важнее сохранить ход мысли, конкретные обстоятельства и собственную интонацию. Голосом часто легче сказать: «я сначала думал так, но потом увидел вот это», чем немедленно превратить опыт в гладкий текст.",[12,3381,3382],{},"Дальше появляется понятный маршрут:",[290,3384,3385],{},[12,3386,3387],{},"рабочее событие или мысль → голосовая заметка → расшифровка → структура от агента → проверка фактов автором → черновик → техническая проверка → публикация.",[12,3389,3390],{},"Расшифровка — не готовая статья. В ней будут повторы, обрывки фраз, оговорки и мысли, которые хорошо звучат в разговоре, но не обязаны попадать в публичный текст. Это сырьё с реальным материалом, а не попытка AI заполнить тишину общими фразами.",[113,3392,3394],{"id":3393},"промпт-из-голосовой-расшифровки-в-план-и-черновик","Промпт: из голосовой расшифровки в план и черновик",[182,3396,3399],{"className":3397,"code":3398,"language":187,"meta":188},[185],"Я дам тебе расшифровку моей голосовой заметки для личного сайта.\n\nТвоя задача:\n1. Выделить главную мысль, целевую аудиторию и практическую пользу.\n2. Отделить подтверждённые факты от личных оценок,\n   предположений и мест, которые нужно уточнить.\n3. Предложить 4–6 информативных заголовков без кликбейта.\n4. Собрать подробный план статьи.\n5. Подготовить черновик от первого лица, сохраняя мою интонацию.\n\nОграничения:\n- Не выдумывай факты, кейсы, цифры, клиентов или результаты.\n- Не заменяй конкретику общими рекламными формулировками.\n- Не публикуй и не меняй файлы.\n- Если материала недостаточно, сначала задай точные вопросы.\n\nФормат ответа:\n1. Главная мысль.\n2. Что требует уточнения.\n3. Варианты заголовка.\n4. План.\n5. Черновик.\n",[190,3400,3398],{"__ignoreMap":192},[12,3402,3403],{},"Перед публикацией я всё равно проверяю имена, даты, цифры, обещания, описание результатов и собственную интонацию. Агент может хорошо структурировать мысль, но не знает без моей проверки, какая деталь конфиденциальна, какой пример можно вынести публично и где я сам ещё сомневаюсь.",[34,3405,3407],{"id":3406},"сначала-бриф-потом-страницы","Сначала бриф, потом страницы",[12,3409,3410],{},"У сайта личного бренда есть простая задача: помочь человеку быстро сориентироваться. Но для каждого автора конкретный маршрут будет своим.",[12,3412,3413],{},"Кому-то нужно собирать заявки на услуги. Кому-то — показывать опыт, чтобы проще проходить собеседования и начинать партнёрства. Кому-то важнее регулярно публиковать материалы и строить вокруг них профессиональное сообщество.",[12,3415,3416],{},"Прежде чем открывать редактор или давать агенту команду «сделай сайт», я бы ответил на несколько вопросов:",[157,3418,3419,3422,3425,3428,3431],{},[160,3420,3421],{},"Для кого сайт?",[160,3423,3424],{},"Что этот человек должен понять за первую минуту?",[160,3426,3427],{},"Какое действие для него главное: написать, оставить заявку, изучить проекты, прочитать материал, записаться на обучение?",[160,3429,3430],{},"Какие доказательства у меня уже есть: проекты, отзывы, заметки, выступления, продукты?",[160,3432,3433],{},"Что сознательно не входит в первую версию?",[12,3435,3436],{},"Последний вопрос часто спасает запуск. Он не даёт превратить небольшой сайт в бесконечный проект с личным кабинетом, каталогом, десятками пустых разделов и космическим кораблём на первом экране.",[113,3438,3440],{"id":3439},"промпт-интервью-для-брифа-сайта","Промпт: интервью для брифа сайта",[182,3442,3445],{"className":3443,"code":3444,"language":187,"meta":188},[185],"Помоги мне подготовить бриф для личного сайта.\n\nПроведи интервью: задавай по одному короткому вопросу за раз.\nСначала выясни:\n- кому нужен сайт;\n- что посетитель должен понять за первую минуту;\n- какое действие для него главное;\n- какие проекты, услуги, материалы и доказательства уже есть;\n- что не входит в первую версию;\n- кто и как будет обновлять сайт после запуска.\n\nПравила:\n- Не предлагай дизайн и технологии, пока не собран смысловой бриф.\n- Не придумывай опыт, отзывы, результаты или позиционирование вместо меня.\n- Если я отвечаю расплывчато, задай уточняющий вопрос с примером выбора.\n\nВ финале подготовь:\n1. Цель сайта в одной фразе.\n2. Портреты основных посетителей.\n3. Три–пять ключевых сценариев.\n4. Состав первой версии.\n5. Список недостающих материалов.\n6. Риски и открытые вопросы.\n",[190,3446,3444],{"__ignoreMap":192},[12,3448,3449],{},"Такой промпт полезен не только в разговоре с агентом. Он заставляет сформулировать то, что обычно остаётся в голове, а потом превращается в противоречивые пожелания к дизайну.",[34,3451,3453],{"id":3452},"первая-версия-должна-работать-а-не-казаться-полной","Первая версия должна работать, а не казаться полной",[12,3455,3456],{},"Есть соблазн сначала сделать «полный» сайт: собрать все проекты за десять лет, написать большую биографию, найти идеальные фотографии, придумать страницу для каждой услуги, перенести старые тексты и ещё добавить несколько функций на будущее.",[12,3458,3459],{},"Так сайт начинает выглядеть серьёзно — и долго не выходит к людям.",[12,3461,3462],{},"Я бы запускал первую версию, когда она честно и понятно решает несколько главных сценариев:",[48,3464,3465,3475],{},[51,3466,3467],{},[54,3468,3469,3472],{},[57,3470,3471],{},"Сценарий посетителя",[57,3473,3474],{},"Что должно быть на сайте",[64,3476,3477,3485,3493,3501,3509],{},[54,3478,3479,3482],{},[69,3480,3481],{},"Человек впервые видит ссылку",[69,3483,3484],{},"Ясная главная страница: кто я и чем занимаюсь",[54,3486,3487,3490],{},[69,3488,3489],{},"Потенциальный клиент оценивает опыт",[69,3491,3492],{},"Несколько конкретных проектов, подход и удобный контакт",[54,3494,3495,3498],{},[69,3496,3497],{},"Коллега или читатель хочет понять мой взгляд",[69,3499,3500],{},"Заметки, статьи, выступления или другие материалы",[54,3502,3503,3506],{},[69,3504,3505],{},"Человек возвращается позже",[69,3507,3508],{},"Признаки живого сайта: актуальные проекты и новые публикации",[54,3510,3511,3514],{},[69,3512,3513],{},"Нужен конкретный ответ",[69,3515,3516],{},"Быстрый путь к услуге, статье или форме связи",[12,3518,3519],{},"Для старта обычно достаточно главной, проектов, заметок и контактов. Услуги, обучение, музыка, стихи или другие разделы стоит добавлять не потому, что «так бывает у личных сайтов», а когда они поддерживают реальную часть моей работы.",[12,3521,3522],{},"Вместо двадцати поверхностных карточек лучше показать три проекта, о которых можно рассказать по существу. Вместо биографии на пять экранов — несколько точных абзацев. Вместо блока «скоро здесь будет блог» — одна содержательная заметка, у которой есть авторская мысль.",[290,3524,3525],{},[12,3526,3527],{},"Первая версия сайта должна быть достаточно маленькой, чтобы её запустить, и достаточно содержательной, чтобы за неё не было неловко.",[113,3529,3531],{"id":3530},"промпт-карта-первой-версии-сайта","Промпт: карта первой версии сайта",[182,3533,3536],{"className":3534,"code":3535,"language":187,"meta":188},[185],"На основе моего утверждённого брифа предложи первую версию личного сайта.\n\nНужен не дизайн и не код, а рабочая карта:\n- страницы и их роль;\n- главные сценарии посетителя;\n- содержание каждого первого экрана;\n- обязательные материалы, которые нужно подготовить;\n- что можно отложить после запуска;\n- риски, если какой-то раздел будет пустым или неподтверждённым.\n\nПриоритизируй решения по принципу:\nсначала понятность предложения, реальные доказательства опыта\nи простой способ связаться; затем декоративные и необязательные элементы.\n\nНе выдумывай кейсы, статистику и отзывы.\nВ конце составь короткий список задач на первую неделю.\n",[190,3537,3535],{"__ignoreMap":192},[34,3539,3541],{"id":3540},"содержание-появляется-раньше-финального-дизайна","Содержание появляется раньше финального дизайна",[12,3543,3544],{},"Иногда работу строят так: сначала дизайн, потом вёрстка, потом настройка, а в конце кто-то срочно заполняет страницы текстами. Обычно это видно: заголовки получаются общими, карточки — одинаковыми, а раздел «обо мне» состоит из слов «опытный», «креативный» и «ответственный».",[12,3546,3547],{},"Я бы собрал хотя бы черновое содержание до финального интерфейса. Не идеальные тексты, а ясные ответы на вопросы:",[48,3549,3550,3560],{},[51,3551,3552],{},[54,3553,3554,3557],{},[57,3555,3556],{},"Раздел",[57,3558,3559],{},"Вопрос, на который он отвечает",[64,3561,3562,3570,3578,3586,3594],{},[54,3563,3564,3567],{},[69,3565,3566],{},"Главная",[69,3568,3569],{},"Кто я и почему здесь стоит задержаться?",[54,3571,3572,3575],{},[69,3573,3574],{},"Проекты",[69,3576,3577],{},"Какие задачи я умею доводить до результата?",[54,3579,3580,3583],{},[69,3581,3582],{},"Услуги или обучение",[69,3584,3585],{},"В каком формате можно работать вместе?",[54,3587,3588,3591],{},[69,3589,3590],{},"Заметки",[69,3592,3593],{},"Как я думаю, принимаю решения и объясняю сложное?",[54,3595,3596,3599],{},[69,3597,3598],{},"Контакты",[69,3600,3601],{},"Как начать разговор без лишних препятствий?",[12,3603,3604],{},"Тогда интерфейс помогает содержанию, а не заставляет его подстраиваться под случайный шаблон.",[12,3606,3607],{},"AI здесь хорошо работает как редактор и исследователь. Он может заметить повторы, предложить порядок, показать места без фактов и подготовить несколько вариантов заголовка. Но я не поручал бы ему самостоятельно «писать позиционирование»: результат почти наверняка окажется гладким, но слишком похожим на сотни других сайтов.",[34,3609,3611],{"id":3610},"технологии-почему-я-рекомендую-nuxt","Технологии: почему я рекомендую Nuxt",[12,3613,3614],{},"После смысла и содержания приходит вопрос о стеке. В нём легко увязнуть: спорить о правильном фреймворке, CMS, хостинге и количестве библиотек.",[12,3616,3617],{},"Для личного сайта я смотрю на выбор прагматично. Технология должна помогать:",[157,3619,3620,3623,3626,3629,3632],{},[160,3621,3622],{},"быстро и надёжно отдавать страницу посетителю;",[160,3624,3625],{},"удобно публиковать и обновлять материалы;",[160,3627,3628],{},"давать хорошую базу для поисковой видимости;",[160,3630,3631],{},"не превращать небольшую правку в отдельный технический проект;",[160,3633,3634],{},"позволять постепенно добавлять формы и интеграции, когда они действительно понадобятся.",[12,3636,3637,3638,209],{},"Для таких задач я рекомендую ",[1463,3639,3640],{},"Nuxt",[12,3642,3643],{},"Nuxt построен на Vue и может рендерить страницы на сервере. Это значит, что посетитель и поисковый робот получают готовый HTML, а не пустую страницу, которую браузер должен сначала собрать из JavaScript. Для личного сайта это помогает скорости первого отображения и создаёт нормальную основу для SEO.",[12,3645,3646],{},"Ещё несколько практических причин:",[217,3648,3649,3652,3655,3658,3661],{},[160,3650,3651],{},"статьи, проекты и другие материалы удобно хранить в Markdown рядом с кодом;",[160,3653,3654],{},"метаданные страницы — title, description, Open Graph, canonical URL и structured data — можно держать в одном понятном процессе;",[160,3656,3657],{},"sitemap можно генерировать автоматически;",[160,3659,3660],{},"публичные страницы, формы и серверные API находятся в одном проекте;",[160,3662,3663],{},"сначала можно сделать спокойный контентный сайт, а затем добавить заявки, интеграции или небольшую админку без переезда на другую платформу.",[12,3665,3666],{},"Nuxt не делает SEO автоматически. Он даёт нужные механизмы, но название страницы, описание, понятная структура, реальные материалы, скорость, доступность и последующая проверка всё равно остаются работой автора и разработчика.",[12,3668,3669],{},"Markdown тоже не решает всё сам. Он хорош, когда у сайта есть понятный процесс редактуры: материал можно написать, увидеть diff, проверить ссылку и сохранить историю изменений. Если автору удобнее работать только в визуальном редакторе и он не хочет иметь дело с Git, нужно сразу предусмотреть другой безопасный путь публикации.",[34,3671,3673],{"id":3672},"где-размещать-сайт-контролируемый-vps-или-выделенный-сервер","Где размещать сайт: контролируемый VPS или выделенный сервер",[12,3675,3676,3677,3680],{},"Сайт лучше размещать в инфраструктуре, которой я могу управлять. На практике для личного сайта обычно достаточно надёжного ",[1463,3678,3679],{},"VPS"," — выделенного виртуального сервера. Для более требовательной системы или при особых требованиях можно использовать физический выделенный сервер.",[12,3682,3683],{},"Дело не в том, чтобы любой личный сайт обязательно жил на большой машине. Дело в контроле:",[217,3685,3686,3689,3692,3695,3698],{},[160,3687,3688],{},"домен, доступы и конфигурация принадлежат владельцу сайта;",[160,3690,3691],{},"можно подключать формы, почту, webhooks, CRM и другие интеграции;",[160,3693,3694],{},"есть понятная резервная копия и возможность восстановиться;",[160,3696,3697],{},"можно управлять обновлениями, а не ждать, пока конструктор поменяет правила;",[160,3699,3700],{},"инфраструктура не ограничивает развитие сайта одним набором возможностей.",[12,3702,3703],{},"При этом собственный сервер требует дисциплины. Нужно следить за обновлениями системы, резервными копиями, TLS-сертификатами, журналами, доступами и состоянием приложения. Если эти обязанности никто не берёт на себя, «свой сервер» быстро превращается не в свободу, а в забытый ящик с паролями.",[12,3705,3706],{},"Я бы придерживался простого правила:",[290,3708,3709],{},[12,3710,3711],{},"Сервер должен применять подготовленную версию сайта. В полночь не стоит дописывать на нём код и исправлять текст напрямую.",[12,3713,3714],{},"Нормальный путь обновления выглядит так:",[290,3716,3717],{},[12,3718,3719],{},"изменение в исходном коде или контенте → проверка → зафиксированная версия → публикация именно этой версии → health-check → проверка публичной страницы.",[12,3721,3722],{},"Так проще ответить на важные вопросы: какая версия сейчас работает, что именно изменилось, открывается ли новый маршрут и куда вернуться, если после публикации что-то пошло не так.",[34,3724,3726],{"id":3725},"настроить-ai-агента-как-участника-проекта","Настроить AI-агента как участника проекта",[12,3728,3729],{},"Агент работает заметно лучше, когда у него есть актуальный контекст. Не многотомная энциклопедия, а короткий документ с ответами на главные вопросы до начала работы.",[12,3731,3732,3733,3736,3737,3740],{},"Его можно назвать ",[190,3734,3735],{},"PROJECT_CONTEXT.md",", ",[190,3738,3739],{},"CLAUDE.md"," или иначе — название не главное. Важно содержание:",[182,3742,3745],{"className":3743,"code":3744,"language":617,"meta":192,"style":192},"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",[190,3746,3747,3755,3760,3765,3772,3778,3783,3789,3795,3800,3806,3812,3818,3823,3829,3839,3847,3855,3863,3868,3874,3882,3890,3898,3906,3911,3917,3925,3931],{"__ignoreMap":192},[937,3748,3751],{"class":3749,"line":3750},"line",1,[937,3752,3754],{"class":3753},"sq-ep","# Контекст личного сайта\n",[937,3756,3757],{"class":3749,"line":593},[937,3758,3759],{"emptyLinePlaceholder":620},"\n",[937,3761,3762],{"class":3749,"line":599},[937,3763,3764],{"class":3753},"## Цель\n",[937,3766,3768],{"class":3749,"line":3767},4,[937,3769,3771],{"class":3770},"sVt8B","Помогать посетителю понять, чем я занимаюсь, увидеть реальные работы\n",[937,3773,3775],{"class":3749,"line":3774},5,[937,3776,3777],{"class":3770},"и выбрать следующий шаг: написать, обсудить проект или прочитать материал.\n",[937,3779,3781],{"class":3749,"line":3780},6,[937,3782,3759],{"emptyLinePlaceholder":620},[937,3784,3786],{"class":3749,"line":3785},7,[937,3787,3788],{"class":3753},"## Аудитория\n",[937,3790,3792],{"class":3749,"line":3791},8,[937,3793,3794],{"class":3770},"[Кто обычно приходит на сайт и зачем.]\n",[937,3796,3798],{"class":3749,"line":3797},9,[937,3799,3759],{"emptyLinePlaceholder":620},[937,3801,3803],{"class":3749,"line":3802},10,[937,3804,3805],{"class":3753},"## Стек\n",[937,3807,3809],{"class":3749,"line":3808},11,[937,3810,3811],{"class":3770},"Nuxt, серверный рендеринг, Markdown для статей и проектов,\n",[937,3813,3815],{"class":3749,"line":3814},12,[937,3816,3817],{"class":3770},"VPS или выделенный сервер для production.\n",[937,3819,3821],{"class":3749,"line":3820},13,[937,3822,3759],{"emptyLinePlaceholder":620},[937,3824,3826],{"class":3749,"line":3825},14,[937,3827,3828],{"class":3753},"## Контент\n",[937,3830,3832,3836],{"class":3749,"line":3831},15,[937,3833,3835],{"class":3834},"s4XuR","-",[937,3837,3838],{"class":3770}," Пишем от первого лица.\n",[937,3840,3842,3844],{"class":3749,"line":3841},16,[937,3843,3835],{"class":3834},[937,3845,3846],{"class":3770}," Не выдумываем факты, клиентов, цифры и результаты.\n",[937,3848,3850,3852],{"class":3749,"line":3849},17,[937,3851,3835],{"class":3834},[937,3853,3854],{"class":3770}," Голосовые расшифровки — это исходный материал, не готовая публикация.\n",[937,3856,3858,3860],{"class":3749,"line":3857},18,[937,3859,3835],{"class":3834},[937,3861,3862],{"class":3770}," Автор подтверждает финальный текст перед публикацией.\n",[937,3864,3866],{"class":3749,"line":3865},19,[937,3867,3759],{"emptyLinePlaceholder":620},[937,3869,3871],{"class":3749,"line":3870},20,[937,3872,3873],{"class":3753},"## Правила изменений\n",[937,3875,3877,3879],{"class":3749,"line":3876},21,[937,3878,3835],{"class":3834},[937,3880,3881],{"class":3770}," Сначала исследование и план, затем минимальное изменение.\n",[937,3883,3885,3887],{"class":3749,"line":3884},22,[937,3886,3835],{"class":3834},[937,3888,3889],{"class":3770}," Не менять production, доступы, секреты и инфраструктуру без отдельной команды.\n",[937,3891,3893,3895],{"class":3749,"line":3892},23,[937,3894,3835],{"class":3834},[937,3896,3897],{"class":3770}," Не расширять задачу «заодно».\n",[937,3899,3901,3903],{"class":3749,"line":3900},24,[937,3902,3835],{"class":3834},[937,3904,3905],{"class":3770}," После работы вернуть список изменённых файлов, проверки, риски и открытые вопросы.\n",[937,3907,3909],{"class":3749,"line":3908},25,[937,3910,3759],{"emptyLinePlaceholder":620},[937,3912,3914],{"class":3749,"line":3913},26,[937,3915,3916],{"class":3753},"## Публикация\n",[937,3918,3920,3922],{"class":3749,"line":3919},27,[937,3921,3835],{"class":3834},[937,3923,3924],{"class":3770}," Перед публикацией проверить ссылки, метаданные, мобильное отображение\n",[937,3926,3928],{"class":3749,"line":3927},28,[937,3929,3930],{"class":3770},"  и основной пользовательский сценарий.\n",[937,3932,3934,3936],{"class":3749,"line":3933},29,[937,3935,3835],{"class":3834},[937,3937,3938],{"class":3770}," Публикация — отдельное подтверждённое действие.\n",[12,3940,3941],{},"Рядом с контекстом полезно вести два разных списка: текущий план и журнал принятых решений. План отвечает на вопрос «что делать дальше», а журнал — «почему когда-то выбрали именно этот путь». Не стоит превращать старые решения в автоматический приказ продолжать работу: сначала их нужно сверить с реальным состоянием сайта.",[113,3943,3945],{"id":3944},"промпт-безопасная-работа-агента-в-существующем-сайте","Промпт: безопасная работа агента в существующем сайте",[182,3947,3950],{"className":3948,"code":3949,"language":187,"meta":188},[185],"Ты работаешь с существующим личным сайтом.\n\nПеред любыми изменениями:\n1. Прочитай контекст проекта и правила публикации.\n2. Проверь текущую ветку и наличие незакоммиченных изменений.\n3. Установи фактическое состояние по коду, контенту и нужному runtime,\n   а не только по старой документации.\n4. Сначала предложи минимальный план и перечисли риски.\n\nВо время работы:\n- Не выдумывай факты для публичных материалов.\n- Не публикуй сайт, не меняй production, секреты, доступы\n  или инфраструктуру без отдельной команды.\n- Не расширяй scope до соседних улучшений «заодно».\n- Сохраняй авторский голос; спорные места помечай вопросами.\n\nГотовность:\n- список изменённых файлов;\n- результат релевантных проверок;\n- проверенные пользовательские сценарии;\n- оставшиеся риски и действия, которые требуют решения автора.\n",[190,3951,3949],{"__ignoreMap":192},[12,3953,3954],{},"Такой договор делает поведение агента предсказуемым. Он не обязан быть «универсальным исполнителем, который разберётся со всем». Ему нужны ясная цель, границы и форма результата.",[34,3956,3958],{"id":3957},"готовые-промпты-для-регулярных-обновлений","Готовые промпты для регулярных обновлений",[12,3960,3961],{},"После запуска главная задача — не потерять ритм. Я бы не строил контент-план на год вперёд и не обещал публиковать по три материала в неделю. Гораздо полезнее завести простой повторяемый процесс и наполнять его реальными поводами.",[113,3963,3965],{"id":3964},"промпт-новая-заметка-или-кейс-из-рабочих-материалов","Промпт: новая заметка или кейс из рабочих материалов",[182,3967,3970],{"className":3968,"code":3969,"language":187,"meta":188},[185],"Помоги подготовить новую публикацию для личного сайта.\n\nВот исходные материалы: [вставить голосовую расшифровку, тезисы,\nзаметки, ссылки на подтверждённые материалы].\n\nСначала:\n1. Сформулируй, какую проблему читателя может закрыть публикация.\n2. Отдели подтверждённые факты от непроверенных утверждений.\n3. Покажи, чего не хватает для честного кейса или статьи.\n4. Предложи 4–6 заголовков и рекомендуемый формат:\n   заметка, разбор, кейс, инструкция или FAQ.\n\nТолько после этого подготовь структуру и черновик от первого лица.\n\nНе добавляй несуществующие цифры, клиентов, отзывы или результаты.\nНе публикуй материал и не меняй файлы.\n",[190,3971,3969],{"__ignoreMap":192},[113,3973,3975],{"id":3974},"промпт-аудит-страницы-перед-публикацией","Промпт: аудит страницы перед публикацией",[182,3977,3980],{"className":3978,"code":3979,"language":187,"meta":188},[185],"Проведи 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",[190,3981,3979],{"__ignoreMap":192},[113,3983,3985],{"id":3984},"промпт-еженедельный-редакторский-обзор","Промпт: еженедельный редакторский обзор",[182,3987,3990],{"className":3988,"code":3989,"language":187,"meta":188},[185],"Помоги провести еженедельный обзор личного сайта.\n\nЯ дам тебе список событий недели: завершённые задачи, вопросы клиентов,\nголосовые заметки, черновики, новые проекты и изменения услуг.\n\nТвоя задача:\n1. Найти один-два реалистичных повода для обновления сайта.\n2. Для каждого предложить формат: заметка, кейс, обновление проекта,\n   FAQ или изменение страницы услуги.\n3. Объяснить пользу для посетителя.\n4. Указать, какие факты или материалы нужно подтвердить.\n5. Составить небольшой план на следующую неделю.\n\nНе придумывай темы, которых нет в материалах.\nНе публикуй и не меняй сайт.\nПриоритизируй регулярность и содержание, а не количество публикаций.\n",[190,3991,3989],{"__ignoreMap":192},[34,3993,3995],{"id":3994},"цикл-обновлений-не-ждать-большой-темы","Цикл обновлений: не ждать большой темы",[12,3997,3998],{},"Сильный материал часто начинается не с идеи «надо написать статью», а с повторяющегося рабочего момента.",[12,4000,4001],{},"Я дважды объяснил один подход в переписке. Завершил часть проекта. Получил вопрос, на который сайт пока не отвечает. Поменял формат работы. Разобрался с ошибкой, которая может быть полезна другим. Всё это поводы для обновления.",[12,4003,4004],{},"Я бы использовал такой короткий цикл:",[157,4006,4007,4013,4019,4025,4031,4037,4043],{},[160,4008,4009,4012],{},[1463,4010,4011],{},"Заметить повод."," Сохранить его голосовой заметкой, тезисом или ссылкой.",[160,4014,4015,4018],{},[1463,4016,4017],{},"Собрать исходный материал."," Расшифровать запись, приложить факты, скриншоты, документы или ссылки.",[160,4020,4021,4024],{},[1463,4022,4023],{},"Дать агенту структуру."," Попросить выделить пользу, вопросы и возможный формат.",[160,4026,4027,4030],{},[1463,4028,4029],{},"Проверить содержание."," Убрать конфиденциальное, подтвердить факты, вернуть собственную интонацию.",[160,4032,4033,4036],{},[1463,4034,4035],{},"Проверить техническую часть."," Ссылки, метаданные, мобильное отображение, форму связи, если она затронута.",[160,4038,4039,4042],{},[1463,4040,4041],{},"Опубликовать отдельным решением."," Не считать публикацию побочным эффектом редактуры.",[160,4044,4045,4048],{},[1463,4046,4047],{},"Сохранить вывод."," Если появился новый процесс, ограничение или полезный вопрос — обновить контекст сайта или checklist.",[12,4050,4051],{},"Тогда блог перестаёт быть обязанностью «вести контент» и становится способом не терять накопленный опыт.",[34,4053,4055],{"id":4054},"сила-проверки-должна-соответствовать-цене-ошибки","Сила проверки должна соответствовать цене ошибки",[12,4057,4058],{},"Не всякая правка требует одинакового ритуала. Исправить опечатку — не то же самое, что поменять форму заявки или деплой-процесс.",[48,4060,4061,4071],{},[51,4062,4063],{},[54,4064,4065,4068],{},[57,4066,4067],{},"Тип изменения",[57,4069,4070],{},"Что проверить",[64,4072,4073,4081,4089,4097,4105],{},[54,4074,4075,4078],{},[69,4076,4077],{},"Текст, иллюстрация, ссылка",[69,4079,4080],{},"Смысл, факты, орфография, рабочая ссылка и отображение",[54,4082,4083,4086],{},[69,4084,4085],{},"Новая статья или проект",[69,4087,4088],{},"Заголовок, описание, структура, SEO-метаданные, mobile и desktop",[54,4090,4091,4094],{},[69,4092,4093],{},"Навигация или интерфейс",[69,4095,4096],{},"Главный пользовательский маршрут, адаптивность, доступность, ссылки",[54,4098,4099,4102],{},[69,4100,4101],{},"Форма или интеграция",[69,4103,4104],{},"Отправка данных, ошибка, защита, доставка заявки и сообщение пользователю",[54,4106,4107,4110],{},[69,4108,4109],{},"Сервер и production-процесс",[69,4111,4112],{},"Точный revision, резервная точка, health-check и проверка публичного маршрута",[12,4114,4115],{},"Это не бюрократия, а способ не тратить час на проверку одной запятой и не публиковать важное изменение со словами «вроде работает».",[12,4117,4118],{},"Особенно важно не давать AI-агенту больше полномочий, чем ему действительно нужны. Для подготовки черновика не нужен доступ к production. Для аудита SEO не нужны секреты. Для проверки страницы часто достаточно read-only доступа и списка маршрутов.",[12,4120,4121],{},"Если ошибка повторилась, я бы не ограничивался новой формулировкой промпта. Лучше оставить защиту: checklist, тест, правило в проектном контексте или короткую инструкцию по проверке. Тогда следующий человек или агент начинает не с той же ошибки, а с опыта, который уже стал частью процесса.",[34,4123,4125],{"id":4124},"что-можно-сделать-в-первую-неделю","Что можно сделать в первую неделю",[12,4127,4128],{},"Запуск не обязательно растягивать на месяцы. Если есть решение и исходные материалы, за первую неделю можно собрать рабочую основу.",[48,4130,4131,4141],{},[51,4132,4133],{},[54,4134,4135,4138],{},[57,4136,4137],{},"День",[57,4139,4140],{},"Результат",[64,4142,4143,4150,4158,4166,4174,4182,4190],{},[54,4144,4145,4147],{},[69,4146,939],{},[69,4148,4149],{},"Бриф: роль сайта, аудитория, главное действие посетителя",[54,4151,4152,4155],{},[69,4153,4154],{},"2",[69,4156,4157],{},"Карта разделов и три–пять пользовательских сценариев",[54,4159,4160,4163],{},[69,4161,4162],{},"3",[69,4164,4165],{},"Голосовые заметки или черновики для главной, проектов и контактов",[54,4167,4168,4171],{},[69,4169,4170],{},"4",[69,4172,4173],{},"Структура контента и выбор технической основы: Nuxt, домен, VPS или сервер",[54,4175,4176,4179],{},[69,4177,4178],{},"5",[69,4180,4181],{},"Первая версия страниц и проверка на телефоне и компьютере",[54,4183,4184,4187],{},[69,4185,4186],{},"6",[69,4188,4189],{},"Формы, ссылки, базовые SEO-метаданные, доступность и резервная стратегия",[54,4191,4192,4195],{},[69,4193,4194],{},"7",[69,4196,4197],{},"Публикация подготовленной версии, public smoke-проверка и список следующих обновлений",[12,4199,4200],{},"У кого-то первый сайт будет состоять из одной сильной страницы и контактов. У кого-то сразу появятся проекты и несколько заметок. Это нормально. Важнее не количество разделов, а наличие публичного маршрута: человек открывает ссылку, понимает предложение, видит подтверждения и знает, что делать дальше.",[34,4202,4204],{"id":4203},"личный-сайт-становится-сильнее-от-накопления-доверия","Личный сайт становится сильнее от накопления доверия",[12,4206,4207],{},"AI сделал производство текста и кода быстрым. Поэтому особенно заметной становится разница между просто заполненным сайтом и сайтом, в котором есть живой опыт.",[12,4209,4210],{},"Второй не пытается убедить посетителя множеством громких слов. Он постепенно показывает: вот что я делаю, вот как думаю, вот какие вопросы разбираю, вот что изменилось с прошлого раза, вот как со мной можно продолжить разговор.",[12,4212,4213],{},"Голосовые заметки помогают не терять материал в моменте. AI-помощник помогает превратить его в структуру, черновик и проверяемый процесс. Nuxt и контролируемый сервер дают техническую основу, на которой сайт можно спокойно развивать, а не собирать заново при каждой новой задаче.",[12,4215,4216],{},"Но главный актив всё равно не стек и не количество агентов. Это ясный голос автора, реальные факты и привычка возвращаться к сайту с новым содержанием.",[12,4218,4219],{},"Я бы не ждал идеальной версии. Лучше начать с небольшой честной площадки, настроить безопасный цикл обновлений и оставить на ней место для следующей мысли — возможно, уже записанной сегодня в диктофон.",[12,4221,4222,4223,4225],{},"Если вы хотите запустить личный сайт или привести в порядок тот, который давно не обновлялся, ",[16,4224,896],{"href":590},". Для начала разберём роль сайта, соберём реальные материалы и определим первую версию, которую можно спокойно развивать.",[4227,4228,4229],"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":192,"searchDepth":593,"depth":593,"links":4231},[4232,4233,4234,4235,4238,4241,4244,4245,4246,4247,4250,4255,4256,4257,4258],{"id":3217,"depth":593,"text":3218},{"id":3241,"depth":593,"text":3242},{"id":3271,"depth":593,"text":3272},{"id":3346,"depth":593,"text":3347,"children":4236},[4237],{"id":3393,"depth":599,"text":3394},{"id":3406,"depth":593,"text":3407,"children":4239},[4240],{"id":3439,"depth":599,"text":3440},{"id":3452,"depth":593,"text":3453,"children":4242},[4243],{"id":3530,"depth":599,"text":3531},{"id":3540,"depth":593,"text":3541},{"id":3610,"depth":593,"text":3611},{"id":3672,"depth":593,"text":3673},{"id":3725,"depth":593,"text":3726,"children":4248},[4249],{"id":3944,"depth":599,"text":3945},{"id":3957,"depth":593,"text":3958,"children":4251},[4252,4253,4254],{"id":3964,"depth":599,"text":3965},{"id":3974,"depth":599,"text":3975},{"id":3984,"depth":599,"text":3985},{"id":3994,"depth":593,"text":3995},{"id":4054,"depth":593,"text":4055},{"id":4124,"depth":593,"text":4125},{"id":4203,"depth":593,"text":4204},"2026-08-12","Как запустить сайт личного бренда с AI-помощниками: от голосовой заметки и первой версии до Nuxt, VPS и безопасного цикла обновлений.",{},"\u002Fblog\u002F2026-08-12-lichnyy-sayt-ai-agenty",{"title":3197,"description":4260},"Личный сайт и AI-агенты: запуск и обновления","blog\u002F2026-08-12-lichnyy-sayt-ai-agenty",[626,4267,4268,630,4269],"сайт","личный бренд","контент","1mag4GKjfAApBFcZYVIEnmVkXm2jMWon7oGjPpmm-fM",{"id":4272,"title":4273,"acrostic":7,"body":4274,"date":5168,"description":5169,"duration":7,"emoji":7,"extension":617,"faq":7,"featured":618,"format":7,"image":7,"level":7,"media":7,"meta":5170,"navigation":620,"path":5171,"price":7,"schedule":7,"seo":5172,"seoTitle":7,"serviceType":7,"status":7,"stem":5173,"tags":5174,"tech":7,"toc":620,"url":7,"__hash__":5176},"blog\u002Fblog\u002F2026-08-11-ai-upravlenie-razrabotkoj.md","Управление разработкой с AI-агентом: контекст вместо задач",{"type":9,"value":4275,"toc":5142},[4276,4279,4282,4285,4288,4293,4296,4299,4305,4307,4321,4325,4328,4331,4334,4337,4340,4343,4357,4364,4368,4371,4374,4377,4380,4386,4389,4392,4398,4401,4415,4418,4422,4425,4432,4435,4438,4458,4461,4464,4469,4475,4479,4482,4485,4488,4542,4545,4548,4551,4554,4557,4561,4564,4568,4571,4585,4588,4591,4595,4598,4601,4604,4608,4611,4613,4633,4636,4640,4643,4646,4649,4675,4678,4682,4685,4688,4691,4694,4726,4730,4733,4736,4739,4742,4795,4798,4803,4806,4810,4813,4816,4819,4825,4878,4881,4884,4888,4891,4898,4901,4945,4948,4951,4954,4957,4961,4964,4967,4970,4976,4979,4982,4985,4989,4992,4998,5001,5004,5010,5013,5016,5023,5027,5030,5033,5053,5056,5059,5063,5067,5070,5074,5077,5081,5084,5088,5091,5094,5114,5117,5122,5125,5128,5131,5139],[12,4277,4278],{},"Компании покупают лицензии, объявляют AI-стратегии, считают токены и показывают красивые демо. Потом оказывается, что пользователи не пришли, продукт не решает их задачу, а за результат как будто никто не отвечает: он потерялся между презентацией, подрядчиком и чат-ботом.",[12,4280,4281],{},"Проблема часто не в самой модели, а в слабом управлении разработкой. Если в обычном проекте неясно, что именно строят, для кого и как будут проверять результат, AI этого не исправит. Он лишь позволит ошибаться быстрее.",[12,4283,4284],{},"У меня был другой путь. Я не «внедрял AI в компанию» и не измерял эффективность числом сгенерированных строк. Я начал использовать AI-агента как постоянного участника разработки. Он может исследовать, выполнять ограниченные задачи, проводить ревью, а иногда выступает неприятным собеседником, который заставляет ещё раз объяснить, чего именно я хочу.",[12,4286,4287],{},"И довольно быстро понял простую вещь:",[290,4289,4290],{},[12,4291,4292],{},"AI не отменяет управление разработкой. С ним слабые места управления просто становятся заметнее.",[12,4294,4295],{},"Раньше часть управления можно было держать в голове. Сильному разработчику достаточно сказать: «посмотри, почему не работает фильтр» — и он сам поймёт, в каком сервисе искать, что не трогать, какие данные опасны и где проверить результат.",[12,4297,4298],{},"Агент этого не знает. Не потому, что он глупый. Он просто не живёт внутри моего проекта: не помнит вчерашний разговор у кофемашины, не знает, почему сервер нельзя трогать в середине дня, и не чувствует затылком, что фраза «давайте заодно обновим зависимости» сейчас пахнет трёхдневным приключением.",[12,4300,4301,4302,209],{},"Поэтому я иначе стал ставить задачи. Для каждой заметной работы я собираю ",[1463,4303,4304],{},"цель, контекст, ограничения и доказательство готовности",[34,4306,3218],{"id":3217},[217,4308,4309,4312,4315,4318],{},[160,4310,4311],{},"AI одинаково ускоряет порядок и хаос.",[160,4313,4314],{},"Задача для AI-агента должна описывать цель, подтверждённый контекст, границы и доказательство готовности.",[160,4316,4317],{},"Перед production нужен не «зелёный билд», а точный revision, health-check и пользовательская проверка.",[160,4319,4320],{},"Повторившаяся ошибка должна оставлять защиту: тест, инвариант, runbook или обновлённый контекст.",[34,4322,4324],{"id":4323},"ai-ускоряет-и-порядок-и-беспорядок","AI ускоряет и порядок, и беспорядок",[12,4326,4327],{},"Есть удобная сказка: достаточно дать команде хороший AI-инструмент, и производительность вырастет сама. В этой сказке нейросеть сидит рядом, мгновенно пишет код, тесты, документацию и, вероятно, ещё слегка массирует плечи перед релизом.",[12,4329,4330],{},"В реальности AI ускоряет не только полезную работу.",[12,4332,4333],{},"Когда задача сформулирована ясно, агент быстро помогает изучить код, увидеть риски, написать тест, подготовить небольшой патч и проверить его. Если задача туманная, он с такой же скоростью создаёт несколько правдоподобных вариантов неправильного решения.",[12,4335,4336],{},"Если в проекте есть актуальные документы, агент опирается на них и меньше изобретает архитектуру заново. Если документация устарела, он уверенно цитирует вчерашний мир. Это не злой умысел. Просто модель не умеет отличать «документ лежит рядом с кодом» от «документ всё ещё правда» без проверки.",[12,4338,4339],{},"Если у процесса есть понятные ворота перед production, AI помогает проходить их быстрее. Если таких ограничений нет, он может быстро сделать то, чего делать было нельзя.",[12,4341,4342],{},"Поэтому я не считаю, что AI делает разработку проще. Он ускоряет то, что уже есть:",[217,4344,4345,4348,4351,4354],{},[160,4346,4347],{},"ясный процесс;",[160,4349,4350],{},"работающий порядок;",[160,4352,4353],{},"хаос;",[160,4355,4356],{},"последствия плохо поставленной задачи.",[12,4358,4359,4360,4363],{},"Поэтому разговор об AI в разработке для меня начинается с вопроса: ",[1463,4361,4362],{},"как у нас устроено принятие решений?"," Выбор модели идёт после.",[34,4365,4367],{"id":4366},"от-сделай-фичу-к-какое-изменение-мы-хотим-получить","От «сделай фичу» к «какое изменение мы хотим получить?»",[12,4369,4370],{},"Фраза «сделай авторизацию» кажется задачей. На самом деле это название целого леса, в котором ещё не проложена ни одна тропинка.",[12,4372,4373],{},"Для кого авторизация? Какие роли существуют? Какие действия должен видеть пользователь, а какие — сервис? Где заканчивается публичный маршрут и начинается внутренний? Можно ли менять существующий контракт? Что происходит со старыми сессиями? Как проверить, что чужой пользователь не получил доступ? И, наконец, можно ли сегодня вообще трогать production?",[12,4375,4376],{},"Пока на эти вопросы нет ответа, агенту нельзя давать задачу: иначе он начнёт отвечать за меня.",[12,4378,4379],{},"Плохая постановка выглядит так:",[182,4381,4384],{"className":4382,"code":4383,"language":187,"meta":188},[185],"Добавь авторизацию и задеплой.\n",[190,4385,4383],{"__ignoreMap":192},[12,4387,4388],{},"В ней нет цели, нет границ и нет критерия результата. Есть только глагол, который может означать двадцать разных решений.",[12,4390,4391],{},"Нормальная постановка устроена иначе:",[182,4393,4396],{"className":4394,"code":4395,"language":187,"meta":188},[185],"Нужно закрыть один конкретный сценарий записи данных:\nизменять запись может только её владелец.\n\nСначала установи текущий контракт по коду, тестам и runtime.\nНе расширяй права «на всякий случай» и не меняй публичные маршруты.\nСначала добавь проверку, что другой пользователь получает отказ.\nProduction не трогай.\n\nГотовность: целевой тест, сборка затронутого пакета,\nпроверка diff и список изменённых контрактов.\n",[190,4397,4395],{"__ignoreMap":192},[12,4399,4400],{},"Это не «магический промпт» и не набор волшебных слов. Здесь зафиксировано управленческое решение:",[217,4402,4403,4406,4409,4412],{},[160,4404,4405],{},"какой риск я закрываю;",[160,4407,4408],{},"что считаю допустимой границей изменения;",[160,4410,4411],{},"каким будет доказательство результата;",[160,4413,4414],{},"какое действие сейчас запрещено.",[12,4416,4417],{},"Если я не могу это сформулировать, дело обычно не в агенте. Скорее всего, я сам ещё не разобрался с задачей.",[34,4419,4421],{"id":4420},"хорошая-задача-начинается-с-контекста","Хорошая задача начинается с контекста",[12,4423,4424],{},"Человек в команде часто накапливает контекст годами. Он знает, где находится код, как устроен релиз, почему нельзя чистить эту таблицу и какой endpoint на самом деле проверяет пользователь.",[12,4426,4427,4428,4431],{},"Агент приходит в проект почти как новый сотрудник. Только он очень быстро и без устали читает то количество файлов, которое человек обычно откладывает «на потом». И да, иногда ему приходится отдельно объяснять, что документацию надо читать ",[1463,4429,4430],{},"до"," того, как он начнёт уверенно чинить то, чего не понял.",[12,4433,4434],{},"У меня это стало почти ритуалом.",[12,4436,4437],{},"Перед заметной задачей агент сначала должен выяснить:",[157,4439,4440,4443,4446,4449,4452,4455],{},[160,4441,4442],{},"где он находится;",[160,4444,4445],{},"какой репозиторий и какая ветка являются рабочими;",[160,4447,4448],{},"есть ли незакоммиченные изменения;",[160,4450,4451],{},"где лежит подтверждённый контекст проекта;",[160,4453,4454],{},"что говорит актуальный план;",[160,4456,4457],{},"что реально происходит в коде, данных и runtime.",[12,4459,4460],{},"Последний пункт важнее остальных. В документации может быть написано, что система работает на одной версии. В Git может лежать другая. На сервере — третья. А пользователь может открыть четвёртую, потому что у него закешировалась старая страница или он вообще смотрит не на то окружение.",[12,4462,4463],{},"Поэтому я стараюсь держаться правила:",[290,4465,4466],{},[12,4467,4468],{},"Память, старый план и уверенный ответ агента не доказывают ничего. Опираться нужно на проверяемое состояние кода, данных и работающей системы.",[12,4470,4471,4472,209],{},"Это не значит, что документации нельзя доверять. Хорошая документация помогает быстро понять, ",[1463,4473,4474],{},"что проверить и зачем",[34,4476,4478],{"id":4477},"документация-которую-действительно-читают","Документация, которую действительно читают",[12,4480,4481],{},"Существует старый жанр инженерного юмора: документация — это место, куда информация уходит, чтобы никогда не вернуться.",[12,4483,4484],{},"С агентами у меня получилось чуть иначе. Документация стала рабочим инструментом, а не приложением к проекту.",[12,4486,4487],{},"У каждого заметного продукта есть несколько разных типов знания.",[48,4489,4490,4500],{},[51,4491,4492],{},[54,4493,4494,4497],{},[57,4495,4496],{},"Что нужно узнать",[57,4498,4499],{},"Где это должно быть зафиксировано",[64,4501,4502,4510,4518,4526,4534],{},[54,4503,4504,4507],{},[69,4505,4506],{},"Что подтверждено и принято",[69,4508,4509],{},"Краткий актуальный контекст проекта",[54,4511,4512,4515],{},[69,4513,4514],{},"Что делать дальше",[69,4516,4517],{},"Текущий план или backlog",[54,4519,4520,4523],{},[69,4521,4522],{},"Почему было принято старое решение",[69,4524,4525],{},"Исторический план или журнал решений",[54,4527,4528,4531],{},[69,4529,4530],{},"Как безопасно провести операцию",[69,4532,4533],{},"Runbook, deploy-инструкция, troubleshooting",[54,4535,4536,4539],{},[69,4537,4538],{},"Что однажды уже сломалось",[69,4540,4541],{},"Gotcha, тест, инвариант, проверочный сценарий",[12,4543,4544],{},"Важно не смешивать эти слои.",[12,4546,4547],{},"Исторический план — это не приказ продолжать работу с места, где остановились полгода назад. Он может объяснить, почему архитектура выглядит именно так. Но текущую задачу надо начинать с того, что реально подтверждено сегодня.",[12,4549,4550],{},"Документ со списком прошлых релизов — не замена проверке production. Он полезен, чтобы понимать, что спросить у системы. Но всё равно нужно посмотреть текущий revision, состояние процессов, health-check и нужный пользовательский маршрут.",[12,4552,4553],{},"Агент умеет быстро читать много, но это не повод читать всё подряд. Я задаю порядок: правила проекта, актуальный контекст, текущий план, затем код и состояние работающей системы.",[12,4555,4556],{},"Похоже, я наконец нашёл читателя для технической документации.",[34,4558,4560],{"id":4559},"пять-слоёв-постановки-задачи","Пять слоёв постановки задачи",[12,4562,4563],{},"Со временем у меня сложилась простая конструкция. Почти любую работу с агентом можно проверить по пяти слоям.",[113,4565,4567],{"id":4566},"_1-цель","1. Цель",[12,4569,4570],{},"Не «добавить кнопку», а ответить на вопросы:",[217,4572,4573,4576,4579,4582],{},[160,4574,4575],{},"кто получает новое действие;",[160,4577,4578],{},"какую проблему оно решает;",[160,4580,4581],{},"что меняется в пользовательском сценарии;",[160,4583,4584],{},"что сознательно не входит в задачу.",[12,4586,4587],{},"Например, цель может звучать так: «пользователь должен видеть понятную причину отказа и знать, что делать дальше». Это лучше, чем «сделай красивое уведомление».",[12,4589,4590],{},"В первой формулировке есть результат. Во второй — только эстетическое пожелание, которое можно трактовать бесконечно.",[113,4592,4594],{"id":4593},"_2-реальность","2. Реальность",[12,4596,4597],{},"До плана нужно установить факты.",[12,4599,4600],{},"Не «вроде бы сервис использует такую-то очередь», а проверить код и состояние системы. Не «кажется, endpoint защищён», а посмотреть маршрут, policy, тест и фактический HTTP-ответ. Не «релиз уже выкачен», а сверить revision и публичный маршрут.",[12,4602,4603],{},"Этот этап иногда выглядит как потеря времени. Особенно когда хочется немедленно дать агенту команду «исправляй». Но именно он спасает от классического сценария: три часа мы лечили проблему в одном окружении, а пользователь всё это время работал в другом.",[113,4605,4607],{"id":4606},"_3-границы","3. Границы",[12,4609,4610],{},"В хорошей задаче нужно назвать и то, что сделать, и то, чего делать нельзя.",[12,4612,1630],{},[217,4614,4615,4618,4621,4624,4627,4630],{},[160,4616,4617],{},"не трогать production без отдельного решения;",[160,4619,4620],{},"не менять инфраструктуру ради удобства одного патча;",[160,4622,4623],{},"не удалять данные широким запросом;",[160,4625,4626],{},"не раскрывать конфигурацию и секреты;",[160,4628,4629],{},"не исправлять соседние подсистемы «заодно»;",[160,4631,4632],{},"не стирать чужие незакоммиченные изменения.",[12,4634,4635],{},"Границы особенно важны потому, что агент очень охотно помогает. Иногда настолько охотно, что начинает чинить не только указанную проблему, но и весь мир вокруг неё. Для человека это называют инициативностью. В работе с агентом это повод ещё раз проверить границы задачи.",[113,4637,4639],{"id":4638},"_4-доказательство-готовности","4. Доказательство готовности",[12,4641,4642],{},"Фразы «код написан» недостаточно.",[12,4644,4645],{},"«Тест прошёл» — тоже не всегда готовность.",[12,4647,4648],{},"В зависимости от задачи доказательство может включать:",[217,4650,4651,4654,4657,4660,4663,4666,4669,4672],{},[160,4652,4653],{},"regression test на конкретный контракт;",[160,4655,4656],{},"сборку затронутого приложения;",[160,4658,4659],{},"проверку API или очереди;",[160,4661,4662],{},"подтверждённое состояние в базе;",[160,4664,4665],{},"desktop- и mobile-проверку публичного сценария;",[160,4667,4668],{},"независимый review;",[160,4670,4671],{},"exact revision на сервере;",[160,4673,4674],{},"возможность отката.",[12,4676,4677],{},"Список не должен быть длинным. Он должен соответствовать риску. Для текстовой правки не нужен военный совет. Для изменения авторизации или записи данных недостаточно фразы «вроде работает».",[113,4679,4681],{"id":4680},"_5-след-знания","5. След знания",[12,4683,4684],{},"После заметной работы результат не должен оставаться только в чате.",[12,4686,4687],{},"Если выяснилось новое ограничение — оно попадает в документ или runbook. Если найден опасный сценарий — появляется тест. Если повторяется диагностический путь — он сохраняется как процедура. Если обновился контракт — это отражается в актуальном контексте.",[12,4689,4690],{},"Так появляется память разработки, а не склад заметок. В следующий раз агент не начинает заново из археологических раскопок, а я не пытаюсь вспомнить, почему месяц назад мы запретили «простое» решение.",[12,4692,4693],{},"Эти слои лучше работают не как чек-лист в конце, а как последовательность принятия решения:",[182,4695,4699],{"className":4696,"code":4697,"language":4698,"meta":192,"style":192},"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",[190,4700,4701,4706,4711,4716,4721],{"__ignoreMap":192},[937,4702,4703],{"class":3749,"line":3750},[937,4704,4705],{},"flowchart TB\n",[937,4707,4708],{"class":3749,"line":593},[937,4709,4710],{},"  goal[1 · Цель] --> facts[2 · Проверенные факты]\n",[937,4712,4713],{"class":3749,"line":599},[937,4714,4715],{},"  facts --> scope[3 · Границы изменения]\n",[937,4717,4718],{"class":3749,"line":3767},[937,4719,4720],{},"  scope --> proof[4 · Доказательство готовности]\n",[937,4722,4723],{"class":3749,"line":3774},[937,4724,4725],{},"  proof --> memory[5 · След знания]\n",[34,4727,4729],{"id":4728},"агент-не-должен-быть-универсальным-исполнителем","Агент не должен быть универсальным исполнителем",[12,4731,4732],{},"Самый опасный запрос к AI звучит просто: «разберись со всем».",[12,4734,4735],{},"Иногда я тоже так думаю. Особенно когда вижу старый сервис, несколько слоёв документации, очередь, фоновые задачи, непонятное состояние данных и один маленький баг, который почему-то не хочет быть маленьким.",[12,4737,4738],{},"Но в таких случаях универсальный агент быстро становится универсальным источником правдоподобных объяснений. Он может найти десять мест, которые «похожи на проблему», предложить большую переработку и даже честно написать, что всё проверил. А потом окажется, что главный сценарий никто не запускал.",[12,4740,4741],{},"Поэтому я разделяю роли.",[48,4743,4744,4753],{},[51,4745,4746],{},[54,4747,4748,4751],{},[57,4749,4750],{},"Роль",[57,4752,2616],{},[64,4754,4755,4763,4771,4779,4787],{},[54,4756,4757,4760],{},[69,4758,4759],{},"Исследователь",[69,4761,4762],{},"Собирает факты о коде, документации, данных и runtime",[54,4764,4765,4768],{},[69,4766,4767],{},"Исполнитель",[69,4769,4770],{},"Делает ограниченное изменение в согласованном scope",[54,4772,4773,4776],{},[69,4774,4775],{},"Ревьюер",[69,4777,4778],{},"Ищет пропущенные контракты, риски и слабые проверки",[54,4780,4781,4784],{},[69,4782,4783],{},"Принимающий",[69,4785,4786],{},"Независимо подтверждает, что результат действительно работает",[54,4788,4789,4792],{},[69,4790,4791],{},"Ведущий",[69,4793,4794],{},"Связывает цель, риск, архитектуру и решение владельца продукта",[12,4796,4797],{},"Иногда все эти роли выполняет один агент в несколько заходов. Иногда для независимости полезно разделить их. Но смысл остаётся: результат исполнителя не должен автоматически становиться истиной только потому, что он звучит убедительно.",[290,4799,4800],{},[12,4801,4802],{},"Отчёт агента — это гипотеза до тех пор, пока она не подтверждена кодом, тестом, системой или независимой проверкой.",[12,4804,4805],{},"Особенно это относится к авторизации, данным, платежам, очередям, внешним интеграциям и production.",[34,4807,4809],{"id":4808},"почему-скорость-не-равна-отмене-проверок","Почему скорость не равна отмене проверок",[12,4811,4812],{},"Есть две одинаково вредные крайности.",[12,4814,4815],{},"Первая: запускать полный набор проверок после каждой запятой в документации. Это выглядит строго, но постепенно превращает разработку в ритуал. Люди и агенты начинают ждать завершения тяжёлых процессов, не понимая, что именно они проверяют.",[12,4817,4818],{},"Вторая: «быстро сделать, потом разберёмся». Это обычно означает, что разбираться будут уже с последствиями — в логах, в базе, в рабочее время и в чужом настроении.",[12,4820,4821,4822,209],{},"Я стараюсь использовать третий вариант: ",[1463,4823,4824],{},"сила проверки должна соответствовать цене ошибки",[48,4826,4827,4836],{},[51,4828,4829],{},[54,4830,4831,4833],{},[57,4832,4067],{},[57,4834,4835],{},"Что достаточно проверить",[64,4837,4838,4846,4854,4862,4870],{},[54,4839,4840,4843],{},[69,4841,4842],{},"Документация или изолированный текст",[69,4844,4845],{},"Diff и непротиворечивость фактам",[54,4847,4848,4851],{},[69,4849,4850],{},"Локальная бизнес-логика",[69,4852,4853],{},"Точный regression test и сборка затронутого компонента",[54,4855,4856,4859],{},[69,4857,4858],{},"Публичный интерфейс",[69,4860,4861],{},"Нужный пользовательский flow на desktop и mobile",[54,4863,4864,4867],{},[69,4865,4866],{},"Очередь, writer, данные",[69,4868,4869],{},"Инварианты, состояние в базе, защита от частичной записи",[54,4871,4872,4875],{},[69,4873,4874],{},"Авторизация, деньги, production",[69,4876,4877],{},"Exact revision, независимый review, rollback и runtime smoke",[12,4879,4880],{},"Это не означает, что я всегда угадываю идеальный набор проверок. Но сама постановка вопроса меняет работу.",[12,4882,4883],{},"Не «как заставить агента сделать всё быстро?», а «какая ошибка здесь будет самой дорогой и как её поймать раньше пользователя?»",[34,4885,4887],{"id":4886},"production-это-не-место-для-продолжения-разработки","Production — это не место для продолжения разработки",[12,4889,4890],{},"Отдельная дисциплина нужна для релизов.",[12,4892,4893,4894,4897],{},"Когда система работает для пользователей, нельзя считать успехом ни ",[190,4895,4896],{},"git push",", ни зелёную сборку, ни сообщение process manager-а «online». Все эти вещи полезны, но каждая доказывает только свою маленькую часть истории.",[12,4899,4900],{},"Рабочая цепочка выглядит примерно так:",[182,4902,4904],{"className":4696,"code":4903,"language":4698,"meta":192,"style":192},"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",[190,4905,4906,4910,4915,4920,4925,4930,4935,4940],{"__ignoreMap":192},[937,4907,4908],{"class":3749,"line":3750},[937,4909,4705],{},[937,4911,4912],{"class":3749,"line":593},[937,4913,4914],{},"  change[Локальное изменение] --> checks[Проверка]\n",[937,4916,4917],{"class":3749,"line":599},[937,4918,4919],{},"  checks --> revision[Зафиксированный revision]\n",[937,4921,4922],{"class":3749,"line":3767},[937,4923,4924],{},"  revision --> candidate[Точный release candidate]\n",[937,4926,4927],{"class":3749,"line":3774},[937,4928,4929],{},"  candidate --> switch[Атомарное переключение]\n",[937,4931,4932],{"class":3749,"line":3780},[937,4933,4934],{},"  switch --> health[Health-check]\n",[937,4936,4937],{"class":3749,"line":3785},[937,4938,4939],{},"  health --> smoke[Пользовательский smoke]\n",[937,4941,4942],{"class":3749,"line":3791},[937,4943,4944],{},"  smoke --> rollback[Возможность rollback]\n",[12,4946,4947],{},"Я сознательно стараюсь не «доделывать на сервере». Сервер не должен становиться местом, где пишется код, исправляется lockfile, создаётся коммит или принимается архитектурное решение в полночь под давлением ошибки.",[12,4949,4950],{},"Production должен применять уже подготовленный релиз. И этот релиз должен иметь точный идентификатор: вот revision, вот сборка, вот проверка, вот предыдущая рабочая точка, к которой можно вернуться.",[12,4952,4953],{},"Такой подход кажется медленнее ровно до первого случая, когда нужно понять: пользователь видит новый код или старый? Система упала из-за релиза или проблема была раньше? Что именно откатывать? Есть ли у нас вообще куда откатываться?",[12,4955,4956],{},"После этого словосочетание «давайте быстро поправим на сервере» начинает звучать как предложение чинить проводку мокрыми руками. Возможно, получится. Но лучше сначала выключить питание.",[34,4958,4960],{"id":4959},"промпт-часть-инженерной-системы","Промпт — часть инженерной системы",[12,4962,4963],{},"Когда говорят о prompt engineering, часто представляют удачную формулировку, которая заставляет модель выдать нужный ответ с первого раза.",[12,4965,4966],{},"В разработке мне важнее другое. Промпт — это форма, в которой я фиксирую управленческое решение. Он не должен быть красивым. Он должен быть проверяемым.",[12,4968,4969],{},"Например, рабочее задание агенту может выглядеть так:",[182,4971,4974],{"className":4972,"code":4973,"language":187,"meta":188},[185],"Контекст:\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",[190,4975,4973],{"__ignoreMap":192},[12,4977,4978],{},"В таком тексте нет просьбы «будь экспертом мирового уровня». Я не прошу агента «проявить инициативу» и не заставляю его писать эссе о том, как прекрасно он понял задачу.",[12,4980,4981],{},"Я задаю ему рабочую среду: вот цель, вот порядок, вот границы, вот форма результата.",[12,4983,4984],{},"А ещё я могу сказать самое полезное: «остановись перед следующим опасным действием». Агент не обидится, не закатит глаза и не скажет, что ему нужно больше доверять. Он просто остановится. В мире разработки это недооценённое качество.",[34,4986,4988],{"id":4987},"после-ошибки-нужен-не-новый-промпт-а-новая-защита","После ошибки нужен не новый промпт, а новая защита",[12,4990,4991],{},"Когда агент делает неверный шаг, очень легко начать бесконечный цикл:",[182,4993,4996],{"className":4994,"code":4995,"language":187,"meta":192},[185],"Не сработало → попробуй ещё → не сработало → попробуй по-другому.\n",[190,4997,4995],{"__ignoreMap":192},[12,4999,5000],{},"Иногда второй заход действительно нужен. Но если ошибка повторяется, проблема обычно уже не в конкретной формулировке. Значит, в системе отсутствует защита.",[12,5002,5003],{},"Я стараюсь разбирать такие случаи иначе:",[182,5005,5008],{"className":5006,"code":5007,"language":187,"meta":192},[185],"Симптом\n→ факты\n→ root cause\n→ минимальное исправление\n→ regression test или инвариант\n→ обновлённый контекст\n",[190,5009,5007],{"__ignoreMap":192},[12,5011,5012],{},"Например, если однажды выяснилось, что фоновая задача может завершиться без ошибки, но не выполнить полезную работу, недостаточно просто поправить обработчик. Нужно добавить проверку её реального результата.",[12,5014,5015],{},"Если можно перепутать окружения, нужен предохранитель, который заставит сначала подтвердить цель действия. Если deploy-скрипт может взять не тот revision, ему нужен exact-SHA контракт. Если документ расходится с кодом, нужно не только исправить документ, но и понять, почему он перестал обновляться.",[12,5017,5018,5019,5022],{},"В этом месте AI особенно полезен. Он умеет быстро помочь превратить разовый урок в тест, правило, runbook или проверку. Но решение о том, ",[1463,5020,5021],{},"какая защита действительно нужна",", остаётся за мной.",[34,5024,5026],{"id":5025},"чего-ai-не-решает","Чего AI не решает",[12,5028,5029],{},"Важно не превратить всё это в новую форму AI-оптимизма.",[12,5031,5032],{},"Агент не знает автоматически:",[217,5034,5035,5038,5041,5044,5047,5050],{},[160,5036,5037],{},"какой продукт нужен людям;",[160,5039,5040],{},"какой риск допустим для бизнеса;",[160,5042,5043],{},"когда стоит отказаться от идеи;",[160,5045,5046],{},"что можно считать достаточным доказательством;",[160,5048,5049],{},"какая часть старой системы ценна, а какая давно просится на покой;",[160,5051,5052],{},"почему пользователь недоволен, даже если формально все тесты зелёные.",[12,5054,5055],{},"Он также не заменяет обратную связь от живых людей. Можно идеально организовать pipeline, покрыть тестами контракты, написать прекрасную документацию — и всё равно построить вещь, которая никому не нужна.",[12,5057,5058],{},"AI не отменяет продуктовую ответственность. Он лишь делает дороже попытку от неё спрятаться.",[34,5060,5062],{"id":5061},"вопросы-и-ответы","Вопросы и ответы",[113,5064,5066],{"id":5065},"как-ставить-задачи-ai-агенту-в-разработке","Как ставить задачи AI-агенту в разработке?",[12,5068,5069],{},"Сначала назвать цель и риск, затем дать агенту проверяемый контекст, границы изменения и критерий готовности. Короткая команда может быть началом разговора, но не заменяет постановку задачи.",[113,5071,5073],{"id":5072},"почему-ai-агенту-недостаточно-короткого-промпта","Почему AI-агенту недостаточно короткого промпта?",[12,5075,5076],{},"Агент не живёт внутри проекта: он не знает актуальное состояние кода, данных, окружений и старых ограничений, пока это не подтверждено. Без контекста он вынужден выбирать важные ответы вместо владельца задачи.",[113,5078,5080],{"id":5079},"как-безопасно-использовать-ai-при-production-deploy","Как безопасно использовать AI при production deploy?",[12,5082,5083],{},"Сначала подготовить и проверить конкретный revision вне production. Затем применять только этот revision, фиксировать health-check и отдельно проходить пользовательский smoke-сценарий. Если риск не согласован, агент должен остановиться до опасного действия.",[34,5085,5087],{"id":5086},"управление-стало-разговором-но-не-разговором-ни-о-чём","Управление стало разговором — но не разговором ни о чём",[12,5089,5090],{},"Работа с агентом изменила моё представление об управлении разработкой.",[12,5092,5093],{},"Раньше я больше думал о распределении задач: что отдать, в каком порядке сделать, кому поручить проверку. Сейчас фокус сместился. Самая важная часть работы происходит раньше кода:",[217,5095,5096,5099,5102,5105,5108,5111],{},[160,5097,5098],{},"правильно назвать цель;",[160,5100,5101],{},"отделить факт от предположения;",[160,5103,5104],{},"обозначить границы;",[160,5106,5107],{},"определить риск;",[160,5109,5110],{},"договориться о доказательстве результата;",[160,5112,5113],{},"сохранить знание после завершения.",[12,5115,5116],{},"Получается, что управление всё чаще сводится к качеству диалога. Но не к разговору ради разговора. К разговору, после которого появляется конкретный проверяемый результат.",[290,5118,5119],{},[12,5120,5121],{},"Чем сильнее AI участвует в разработке, тем меньше можно управлять намёками.",[12,5123,5124],{},"Каждое неясное слово в задаче становится риском. Каждая непроверенная гипотеза — потенциальным багом. Каждая хорошо поставленная цель — возможностью двигаться быстрее без лишнего героизма.",[12,5126,5127],{},"Я продолжаю строить эту систему: уточнять контекст, превращать ошибки в проверки, отделять исследование от изменений и учиться ставить задачи так, чтобы за диалогом всегда оставался работающий результат.",[12,5129,5130],{},"И, пожалуй, это пока самый полезный эффект AI в разработке. Не то, что он пишет код. А то, что рядом с ним приходится наконец ясно объяснять, зачем этот код нужен.",[12,5132,5133,5134,209],{},"Наблюдения об AI в разработке и о том, что в этой работе остаётся на стороне человека, я продолжаю собирать в Telegram-канале ",[16,5135,5138],{"href":5136,"rel":5137},"https:\u002F\u002Ft.me\u002Fstrunimisli",[656],"«Струны, мысли»",[4227,5140,5141],{},"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":192,"searchDepth":593,"depth":593,"links":5143},[5144,5145,5146,5147,5148,5149,5156,5157,5158,5159,5160,5161,5162,5167],{"id":3217,"depth":593,"text":3218},{"id":4323,"depth":593,"text":4324},{"id":4366,"depth":593,"text":4367},{"id":4420,"depth":593,"text":4421},{"id":4477,"depth":593,"text":4478},{"id":4559,"depth":593,"text":4560,"children":5150},[5151,5152,5153,5154,5155],{"id":4566,"depth":599,"text":4567},{"id":4593,"depth":599,"text":4594},{"id":4606,"depth":599,"text":4607},{"id":4638,"depth":599,"text":4639},{"id":4680,"depth":599,"text":4681},{"id":4728,"depth":593,"text":4729},{"id":4808,"depth":593,"text":4809},{"id":4886,"depth":593,"text":4887},{"id":4959,"depth":593,"text":4960},{"id":4987,"depth":593,"text":4988},{"id":5025,"depth":593,"text":5026},{"id":5061,"depth":593,"text":5062,"children":5163},[5164,5165,5166],{"id":5065,"depth":599,"text":5066},{"id":5072,"depth":599,"text":5073},{"id":5079,"depth":599,"text":5080},{"id":5086,"depth":593,"text":5087},"2026-08-11","Как я выстраиваю разработку с AI-агентом: через цели, контекст, ограничения, проверку фактов и доказательства результата.",{},"\u002Fblog\u002F2026-08-11-ai-upravlenie-razrabotkoj",{"title":4273,"description":5169},"blog\u002F2026-08-11-ai-upravlenie-razrabotkoj",[626,630,629,627,5175],"мысли","2KE0r-c898KARjeA8befh6xQ7RkWoXBdw-XGXwQ1YA0",{"id":5178,"title":5179,"acrostic":7,"body":5180,"date":5255,"description":5256,"duration":7,"emoji":7,"extension":617,"faq":7,"featured":618,"format":7,"image":7,"level":7,"media":7,"meta":5257,"navigation":620,"path":5258,"price":7,"schedule":7,"seo":5259,"seoTitle":7,"serviceType":7,"status":7,"stem":5260,"tags":5261,"tech":7,"toc":618,"url":7,"__hash__":5264},"blog\u002Fblog\u002F2026-08-04-dumat-energozatratno.md","Думать энергозатратно",{"type":9,"value":5181,"toc":5253},[5182,5185,5188,5191,5194,5197,5200,5203,5206,5209,5212,5215,5218,5235,5238,5241,5244,5247,5250],[12,5183,5184],{},"Думать энергозатратно.",[12,5186,5187],{},"Мозг — один из самых требовательных к энергии органов. Даже в состоянии покоя он потребляет заметную долю ресурсов организма. А когда нужно разобраться в новой, неочевидной задаче, построить модель происходящего, выбрать направление и принять решение — это ощущается почти физически.",[12,5189,5190],{},"Поэтому нам часто не хочется думать.",[12,5192,5193],{},"Мы выбираем знакомые шаблоны, опираемся на прошлый опыт, повторяем уже сработавшие решения. Это не обязательно признак лени или слабости. Скорее, естественный способ экономить ресурс.",[12,5195,5196],{},"Но именно там, где шаблонов недостаточно, начинается настоящая работа: нужно искать новое решение, удерживать в голове противоречия, проверять гипотезы, признавать, что прежняя схема больше не подходит.",[12,5198,5199],{},"Сейчас часть этой нагрузки берёт на себя искусственный интеллект.",[12,5201,5202],{},"ИИ может быстро написать типовой код, разложить задачу на подзадачи, собрать варианты реализации, подготовить тесты, найти очевидную ошибку. То, на что раньше уходили часы ручной работы, теперь иногда занимает минуты.",[12,5204,5205],{},"Это действительно меняет скорость разработки.",[12,5207,5208],{},"Но есть важная оговорка: ИИ не отменяет необходимость думать. Он переносит её выше по уровню.",[12,5210,5211],{},"Раньше скорость создания продукта зависела от всей цепочки: от автора идеи и архитектора до разработчика, который реализует очередную небольшую часть системы. Каждому нужно было остановиться, понять контекст и принять решение.",[12,5213,5214],{},"Теперь значительную часть низового труда можно автоматизировать. Робот не устает писать код, не теряет концентрацию на рутинных правках и способен очень быстро перебрать варианты.",[12,5216,5217],{},"А вот человеку остаётся самое сложное:",[217,5219,5220,5223,5226,5229,5232],{},[160,5221,5222],{},"понять, какую проблему мы вообще решаем;",[160,5224,5225],{},"сформулировать цель так, чтобы она не развалилась при реализации;",[160,5227,5228],{},"выбрать ограничения и критерии качества;",[160,5230,5231],{},"увидеть последствия решения для продукта, людей и бизнеса;",[160,5233,5234],{},"вовремя остановить систему, которая уверенно строит не то.",[12,5236,5237],{},"Если дать ИИ свободу без ясного каркаса и контроля, он легко построит вавилонскую башню из кода: много файлов, функций, абстракций и активности — но без цельной архитектуры и понятной ценности.",[12,5239,5240],{},"Поэтому настоящий предел скорости разработки сегодня — не скорость генерации кода.",[12,5242,5243],{},"Он упирается в человеческую способность собраться, найти силы, выделить время и по-настоящему подумать: что именно нужно сделать и почему.",[12,5245,5246],{},"Этот барьер вряд ли исчезнет полностью. Возможно, ИИ будет всё лучше ставить промежуточные цели и предлагать решения. Но исходный замысел, каркас системы и ответственность за направление пока остаются человеческой работой.",[12,5248,5249],{},"ИИ делает работу быстрее.",[12,5251,5252],{},"Но думать за нас — особенно о важном — он пока не отменяет.",{"title":192,"searchDepth":593,"depth":593,"links":5254},[],"2026-08-04","ИИ ускоряет создание кода, но не отменяет главную человеческую работу: сформулировать задачу, спроектировать систему и взять ответственность за решение.",{},"\u002Fblog\u002F2026-08-04-dumat-energozatratno",{"title":5179,"description":5256},"blog\u002F2026-08-04-dumat-energozatratno",[5262,630,5263],"ии","мышление","VObIrQdtM415tg47o04mnjebtR8Hb1DZVRwGxjCgMlo",{"id":5266,"title":5267,"acrostic":7,"body":5268,"date":5380,"description":5381,"duration":7,"emoji":7,"extension":617,"faq":7,"featured":618,"format":7,"image":7,"level":7,"media":7,"meta":5382,"navigation":620,"path":5383,"price":7,"schedule":7,"seo":5384,"seoTitle":7,"serviceType":7,"status":7,"stem":5385,"tags":5386,"tech":7,"toc":618,"url":7,"__hash__":5389},"blog\u002Fblog\u002F2026-07-09-telegram-invite-reality.md","Как я пытаюсь раскачать телеграм-канал: битва с лимитами",{"type":9,"value":5269,"toc":5373},[5270,5273,5276,5280,5283,5286,5289,5293,5296,5299,5302,5306,5309,5312,5318,5324,5328,5331,5345,5348,5352,5358,5364,5370],[12,5271,5272],{},"У меня есть канал — «Струны, мысли». Стихи, музыка, мысли. Недавно решил попробовать пригласить туда людей из своих контактов. Тысяча с лишним человек — среди них точно есть те, кому это откликнется.",[12,5274,5275],{},"Плюс у меня есть AI-агент. Он умеет писать скрипты, работать с Telegram API, отслеживать прогресс. Казалось бы — идеальный инструмент для массовой рассылки.",[34,5277,5279],{"id":5278},"первый-запуск","Первый запуск",[12,5281,5282],{},"8 июля, вечер. Агент отфильтровал контакты — около 600 ботов и мёртвых душ отсеялись, осталось 1158 реальных людей. Запустили скрипт.",[12,5284,5285],{},"24 приглашения — и Telegram разорвал сессию. Просто отключил аккаунт от API. Без предупреждения, без объяснений.",[12,5287,5288],{},"Пришлось заново авторизоваться. Потеряли час.",[34,5290,5292],{"id":5291},"вторая-попытка","Вторая попытка",[12,5294,5295],{},"На следующий день решили действовать иначе. Сначала — тихие инвайты в канал (107 человек добавлены, даже не заметили). Потом — личные сообщения с приглашением. Честные, без маркетингового шлака: «Привет! Это массовая рассылка, но канал мой, стихи тоже мои. Вот ссылка».",[12,5297,5298],{},"67 сообщений за 20 минут. И снова — «Too many requests». Аккаунт забанен.",[12,5300,5301],{},"На этот раз бан подольше. Часы.",[34,5303,5305],{"id":5304},"третья-попытка","Третья попытка",[12,5307,5308],{},"Переписали скрипт. Теперь он работает в двух режимах: invite в канал + личное сообщение, с паузой 31 секунда между приглашениями. При rate limit — ждёт час и пробует снова. Запустили в фоне.",[12,5310,5311],{},"Но выяснилось две вещи, которые усложнили автоматизацию.",[12,5313,5314,5317],{},[1463,5315,5316],{},"Первое:"," Telegram не даёт отправлять больше 20–30 личных сообщений в день незнакомым людям. Не в час — в день. Приглашения в канал — около 30 в час. Это не баг, это политика платформы. И она не написана нигде в явном виде — только в FloodWaitError, который приходит после факта.",[12,5319,5320,5323],{},[1463,5321,5322],{},"Второе:"," мой AI-агент и скрипт рассылки используют одну и ту же сессию Telegram. Они не могут работать одновременно. Каждый запуск скрипта требует остановки агента. Каждый ответ агента — остановки скрипта.",[34,5325,5327],{"id":5326},"где-мы-сейчас","Где мы сейчас",[12,5329,5330],{},"Скрипт работает. Медленно, по одному приглашению в 31 секунду, с часовыми паузами при каждом бане. Из 1158 контактов:",[217,5332,5333,5336,5339,5342],{},[160,5334,5335],{},"100 человек добавлены в канал (тихо, без уведомлений)",[160,5337,5338],{},"72 получили личное приглашение",[160,5340,5341],{},"22 пропущены — закрытые настройки приватности",[160,5343,5344],{},"954 ждут своей очереди",[12,5346,5347],{},"Баны снимаются. Скрипт снова стучится в API. Так и ломимся — по часу в час, по одному приглашению за раз.",[34,5349,5351],{"id":5350},"что-понял-на-этом-пути","Что понял на этом пути",[12,5353,5354,5357],{},[1463,5355,5356],{},"Telegram защищает пользователей, а не создателей контента."," Лимиты — это философия платформы: рост должен быть органическим. Но «органический» не значит «ждать, пока само придёт». Значит — идти к людям, но медленно, с уважением к правилам.",[12,5359,5360,5363],{},[1463,5361,5362],{},"AI — не кнопка «сделать всё»."," Агент пишет скрипты, обрабатывает ошибки, адаптируется к лимитам. Но он не может обойти фундаментальное ограничение платформы. Зато он может терпеливо ждать и пробовать снова — в отличие от человека, которому это наскучит через два часа.",[12,5365,5366,5369],{},[1463,5367,5368],{},"1158 приглашений — это марафон, не спринт."," При текущем темпе на всё уйдут несколько дней. И это нормально. Каждый, кто примет приглашение, будет тем, кто увидел реальное приглашение от реального человека — а не спам из ниоткуда.",[12,5371,5372],{},"Продолжение следует. Скрипт работает.",{"title":192,"searchDepth":593,"depth":593,"links":5374},[5375,5376,5377,5378,5379],{"id":5278,"depth":593,"text":5279},{"id":5291,"depth":593,"text":5292},{"id":5304,"depth":593,"text":5305},{"id":5326,"depth":593,"text":5327},{"id":5350,"depth":593,"text":5351},"2026-07-09","История о том, как AI-автоматизация массовых приглашений столкнулась с реальностью телеграм-лимитов",{},"\u002Fblog\u002F2026-07-09-telegram-invite-reality",{"title":5267,"description":5381},"blog\u002F2026-07-09-telegram-invite-reality",[5387,626,5388,5175],"telegram","опыт","gGQprx9Q2ELGhjkWm1QiNpHXVK3P5xEBRLSu0ZOxxI0",{"id":5391,"title":5392,"acrostic":7,"body":5393,"date":5482,"description":5483,"duration":7,"emoji":7,"extension":617,"faq":7,"featured":618,"format":7,"image":7,"level":7,"media":7,"meta":5484,"navigation":620,"path":5485,"price":7,"schedule":7,"seo":5486,"seoTitle":7,"serviceType":7,"status":7,"stem":5487,"tags":5488,"tech":7,"toc":618,"url":7,"__hash__":5490},"blog\u002Fblog\u002F2026-07-08-o-privychke-i-merakh.md","О привычке и мерах",{"type":9,"value":5394,"toc":5476},[5395,5398,5401,5405,5412,5415,5418,5425,5428,5432,5435,5438,5441,5444,5447,5451,5454,5457,5460,5464,5467,5470,5473],[12,5396,5397],{},"Монтень ушёл из суда, заперся в башне своего замка и тридцать лет писал книгу о себе. Не о политике, не о войнах — о том, как он сам устроен. Что его злит, что радует, почему он делает одно и не делает другое. «Опыты» — это толстая тетрадь честных записей. Без претензии на истину.",[12,5399,5400],{},"Я не ушёл в замок. Но я тоже веду записи. Только мои — не про личные нравы, а про код, системы и привычки, которые в них пролезают.",[34,5402,5404],{"id":5403},"привычка","Привычка",[12,5406,5407,5408,5411],{},"Монтень говорил: «Привычка — тихая и незаметная управительница». Она не приказывает — она просто делает за нас. Открываешь проект — Ctrl+P, открываешь терминал, пишешь ",[190,5409,5410],{},"npm run dev",". Новый проект — те же клавиши. Не задумываешься.",[12,5413,5414],{},"И это хорошо. Без привычки невозможно работать. Когда я впервые начал со Strapi 5, каждый шаг требовал усилия: как устроены content types, как работает REST API, где права, как деплоить. Сейчас — автоматизм. Пять минут и новый сервис на ногах.",[12,5416,5417],{},"Но Монтень предупреждал и о другой стороне. Привычка, которая помогает, одновременно слепит. Ты делаешь то же самое, потому что делал раньше, а не потому что это лучший способ.",[12,5419,5420,5421,5424],{},"Я три года писал на Vue. Потом на проекте потребовался React — и я ловил себя на том, что ищу во фреймворке вещи, которых там нет. Vue-привычки. Реактивность через ",[190,5422,5423],{},"ref",", composition API, single-file components. В React это всё устроено иначе, и вместо того чтобы думать на языке нового инструмента, я пытался заставить его работать по-старому.",[12,5426,5427],{},"Монтень так и писал: «Обычай заслоняет нам истинный вид вещей». Фреймворк — это не просто инструмент. Это набор привычек. Сменить стек — значит сменить мышление. А это тяжело.",[34,5429,5431],{"id":5430},"о-мерах","О мерах",[12,5433,5434],{},"В другом эссе Монтень рассуждает об излишествах. Он за умеренность — не потому что крайности плохи сами по себе, а потому что они мешают видеть цель. Ешь слишком много — забудешь вкус еды. Читаешь слишком много — забудешь, зачем читал.",[12,5436,5437],{},"В разработке это проявляется как архитектурный жор.",[12,5439,5440],{},"У меня проект, где 15 PM2-процессов. Frontend, backend, 10 парсеров, анализатор, дайджест, сборщик фото. Когда я рассказываю об этом, люди спрашивает: «Зачем так много?»",[12,5442,5443],{},"И я сам задаю себе тот же вопрос. Потому что когда запускал — каждый сервис казался необходимым. Один парсер на площадку. Один процесс на аналитику. Логично. Но логика каждого отдельного решения не гарантирует логику целого. Можно сделать сто правильных шагов и прийти в тупик.",[12,5445,5446],{},"Монтень бы понял. Он писал: «Наше положение привычно, и вот мы привыкли быть». 15 процессов — это не катастрофа. Но я знаю, что 8 хватило бы. Знаю — потому что уже проходил через это. Сначала всё кажется необходимым. Потом смотришь и видишь дублирование, лишние прослойки, сервис, который делает ровно одну вещь раз в сутки и мог бы быть cron-задачей.",[34,5448,5450],{"id":5449},"опыт-учит-задним-числом","Опыт учит задним числом",[12,5452,5453],{},"Главная мысль Монтеня: опыт приходит после того, как ты уже всё сделал. Нельзя прочитать книгу и стать мудрым. Нужно набить шишки. Но можно — и нужно — честно оглядываться назад и спрашивать: а зачем я это сделал?",[12,5455,5456],{},"Каждую неделю я нахожу в своём коде что-то, что переписал бы иначе. Не потому что было плохо — потому что теперь я знаю больше. Два месяца назад это было правильное решение. Сегодня — нет. И это нормально. Монтень переписывал «Опыты» пятнадцать лет, добавляя и зачёркивая. Книга росла вместе с ним.",[12,5458,5459],{},"Код — тоже. Не бывает финальной архитектуры. Бывает текущая, которая работает, и следующая, которая будет работать лучше. Между ними — опыт. Не книжный, не из документации. Свой, набитый на своих ошибках.",[34,5461,5463],{"id":5462},"привычка-как-мера","Привычка как мера",[12,5465,5466],{},"Вот что я понял, читая Монтеня: привычка и мера — это не два разных предмета. Это одно и то же. Привычка — это внутренняя мера. Ты делаешь ровно столько, сколько делал раньше. Ни больше, ни меньше.",[12,5468,5469],{},"Иногда этого достаточно. Автоматизмы экономят время и силы. Но иногда привычная мера устарела. Проект вырос, задачи изменились, а ты всё ещё делаешь так, как делал полгода назад. Не потому что так лучше — потому что так привычно.",[12,5471,5472],{},"Монтень не давал рецептов. Он говорил: «Я не учу — я рассказываю». Вот и я рассказываю. О том, как привычка помогает строить сервисы. И о том, как та же привычка мешает их упрощать. О мерах — которые приходят только с опытом, а опыт — только с ошибками.",[12,5474,5475],{},"Иногда достаточно остановиться и спросить: я делаю так, потому что это правильно, или потому что я так привык?",{"title":192,"searchDepth":593,"depth":593,"links":5477},[5478,5479,5480,5481],{"id":5403,"depth":593,"text":5404},{"id":5430,"depth":593,"text":5431},{"id":5449,"depth":593,"text":5450},{"id":5462,"depth":593,"text":5463},"2026-07-08","Монтень считал, что привычка делает нас рабами. В разработке то же самое — только рабами фреймворков и паттернов",{},"\u002Fblog\u002F2026-07-08-o-privychke-i-merakh",{"title":5392,"description":5483},"blog\u002F2026-07-08-o-privychke-i-merakh",[5175,630,5489],"философия","x9l2xBnSlfbg9Ooz-ZCtX7KMM4aQ2_3bD4Uf1DdG1C8",{"id":5492,"title":5493,"acrostic":7,"body":5494,"date":5829,"description":5830,"duration":7,"emoji":7,"extension":617,"faq":7,"featured":618,"format":7,"image":7,"level":7,"media":7,"meta":5831,"navigation":620,"path":5832,"price":7,"schedule":7,"seo":5833,"seoTitle":7,"serviceType":7,"status":7,"stem":5834,"tags":5835,"tech":7,"toc":618,"url":7,"__hash__":5841},"blog\u002Fblog\u002F2026-07-07-aklab-ai-development.md","AKLAB: как я строю автоматический мониторинг недвижимости для инвесторов",{"type":9,"value":5495,"toc":5820},[5496,5499,5502,5505,5512,5516,5519,5522,5525,5528,5621,5624,5627,5638,5642,5645,5648,5654,5657,5663,5666,5670,5673,5679,5682,5688,5691,5694,5697,5701,5704,5710,5716,5722,5728,5732,5802,5804,5818],[12,5497,5498],{},"Я делаю сервис мониторинга инвестиционной недвижимости — AKLAB. Он автоматически находит объекты, которые стоят значительно ниже рыночных эталонов. Парсит 10 федеральных площадок, анализирует отклонения от эталонных цен, присылает утренний дайджест на email.",[12,5500,5501],{},"Основной фокус — коммерческая недвижимость: офисы, склады, торговые помещения. Но мониторим также земельные участки и квартиры.",[12,5503,5504],{},"За полтора месяца довёл проект от идеи до продакшена. Рассказываю, как устроено.",[12,5506,5507],{},[5508,5509],"img",{"alt":5510,"src":5511},"Дашборд AKLAB — тёмная тема","\u002Fuploads\u002Faklab-dashboard-dark.png",[34,5513,5515],{"id":5514},"зачем","Зачем",[12,5517,5518],{},"Рынок инвестиционной недвижимости — это торги. Сбербанк-АСТ, Алфалот, М-ЕТС, ГИС Торги, ЕТПРФ, Инвест Москва и другие. На каждой площадке — сотни лотов. Просматривать их вручную каждый день — нереально.",[12,5520,5521],{},"AKLAB делает это за меня: парсит площадки ночью, анализирует отклонения от эталонов, утром присылает результат на почту.",[34,5523,5524],{"id":2574},"Архитектура",[12,5526,5527],{},"Один репозиторий, 15 PM2-процессов:",[48,5529,5530,5542],{},[51,5531,5532],{},[54,5533,5534,5536,5539],{},[57,5535,2613],{},[57,5537,5538],{},"Порт",[57,5540,5541],{},"Описание",[64,5543,5544,5555,5566,5577,5588,5599,5610],{},[54,5545,5546,5549,5552],{},[69,5547,5548],{},"Frontend (Vue 3 + Vite + Tailwind)",[69,5550,5551],{},":5174",[69,5553,5554],{},"Dashboard, Настройки, Карточки объектов",[54,5556,5557,5560,5563],{},[69,5558,5559],{},"Backend (Strapi 5 + SQLite)",[69,5561,5562],{},":1338",[69,5564,5565],{},"REST API, Admin Panel, Cron scheduler",[54,5567,5568,5571,5574],{},[69,5569,5570],{},"10 парсеров (Playwright\u002Ffetch)",[69,5572,5573],{},":1345–1355",[69,5575,5576],{},"alfalot, torgi-gov, sberbank-ast, m-ets …",[54,5578,5579,5582,5585],{},[69,5580,5581],{},"Analyzer",[69,5583,5584],{},":1341",[69,5586,5587],{},"Сравнение с эталонами",[54,5589,5590,5593,5596],{},[69,5591,5592],{},"Digest",[69,5594,5595],{},":1342",[69,5597,5598],{},"Утренний email-дайджест",[54,5600,5601,5604,5607],{},[69,5602,5603],{},"Photo",[69,5605,5606],{},":1356",[69,5608,5609],{},"Фото из карточек",[54,5611,5612,5615,5618],{},[69,5613,5614],{},"Очередь",[69,5616,5617],{},"—",[69,5619,5620],{},"@aklab\u002Fsqlite-queue",[12,5622,5623],{},"Backend — Strapi 5.44 + SQLite. Выбрал Strapi, потому что из коробки получаю REST API, админку, систему прав и кастомные контроллеры. Не нужно писать boilerplate.",[12,5625,5626],{},"Frontend — Vue 3 + Vite + Tailwind. Дашборд с фильтрами по городу, цене и типу объекта, карточки с галереей фото.",[12,5628,5629,5630,5633,5634,5637],{},"Парсеры — каждый микросервис в отдельной папке, shared-модули в ",[190,5631,5632],{},"_shared\u002F",". Один манифест ",[190,5635,5636],{},"services.json"," управляет портами, health-checks и PM2-конфигом.",[34,5639,5641],{"id":5640},"парсинг","Парсинг",[12,5643,5644],{},"Ночью запускаются 10 парсеров одновременно. Каждый обходит свою площадку, находит новые лоты и проверяет обновления старых.",[12,5646,5647],{},"Парсинг работает в две фазы — и это не просто «скан, потом загрузка». Это принципиальное решение, которое экономит время и ресурсы.",[12,5649,5650,5653],{},[1463,5651,5652],{},"Phase 1 — Scan."," Парсер обходит ленту площадки и собирает только карточные данные: цена, площадь, адрес, тип помещения. Тут же, на лету, применяет фильтры. Не попадает в нужный регион — отбрасывается. Площадь меньше минимума — отбрасывается. Цена выше порога — отбрасывается. Стоп-слова в названии — отбрасывается. Всё это происходит до того, как я потратил хоть одну лишнюю секунду на детальную выгрузку.",[12,5655,5656],{},"Типичный сценарий: площадка выдаёт 200 лотов по всей России. После фильтрации по региону (Москва + МО) остаётся 30. После фильтрации по площади и цене — 12. Именно эти 12 и пойдут во вторую фазу, а не все 200.",[12,5658,5659,5662],{},[1463,5660,5661],{},"Phase 2 — Fetch Details."," Для каждого прошедшего фильтр лота парсер заходит в карточку и забирает полное описание, фотографии, документы, условия торгов. Это дорогая операция — каждый запрос это реальный HTTP-запрос к площадке, с ожиданием загрузки, иногда с обходом JavaScript-рендеринга через Playwright.",[12,5664,5665],{},"Две фазы позволяют не грузить детали для объектов, которые заведомо не подходят. На некоторых площадках фильтрация отсекает 80–90% лотов ещё на этапе scan.",[34,5667,5669],{"id":5668},"скоринг","Скоринг",[12,5671,5672],{},"После парсинга analyzer оценивает каждый объект по сравнению с эталонными ценами.",[12,5674,5675,5678],{},[1463,5676,5677],{},"Эталоны"," — это заранее заданные ориентиры стоимости за квадратный метр для каждого типа помещения в каждом регионе. Не «средняя цена по рынку», а конкретные контрольные точки, которые я веду вручную и корректирую по мере накопления данных.",[12,5680,5681],{},"Для каждого объекта analyzer считает отклонение от эталона:",[182,5683,5686],{"className":5684,"code":5685,"language":187},[185],"deviation = (эталонная_цена − фактическая_цена) \u002F эталонная_цена × 100\n",[190,5687,5685],{"__ignoreMap":192},[12,5689,5690],{},"Если отклонение превышает порог (например, 20%) — объект попадает в фокус. Чем больше отклонение, тем выше фокус-скор.",[12,5692,5693],{},"Кроме отклонения, на скор влияют дополнительные факторы: тип торгов (банкротство vs реализация), наличие фото, полнота описания, сроки торгов. Объект с высоким отклонением, но без фотографий и с неполным описанием получит скор ниже, чем объект с аналогичным отклонением, но полной карточкой.",[12,5695,5696],{},"Весь парсинг и анализ происходит ночью. Утром digest формирует email-дайджест по объектам, попавшим в фокус, и отправляет мне на почту.",[34,5698,5700],{"id":5699},"как-ai-помогает","Как AI помогает",[12,5702,5703],{},"Я разрабатываю AKLAB с AI-ассистентом. Вот что это даёт на практике:",[12,5705,5706,5709],{},[1463,5707,5708],{},"Параллельная работа."," AI одновременно пишет код для нескольких сервисов — парсера, analyzer, фронтенд-компонента. Я ревьюю результат, а не пишу с нуля.",[12,5711,5712,5715],{},[1463,5713,5714],{},"Документация."," После каждого изменения AI обновляет внутреннюю документацию: архитектурные решения, known issues, deployment notes. Всё актуально в каждый момент времени.",[12,5717,5718,5721],{},[1463,5719,5720],{},"Тесты."," AI генерирует тесты параллельно с кодом. Не «напиши потом тесты» — а сразу вместе с фичей.",[12,5723,5724,5727],{},[1463,5725,5726],{},"Деплой."," Один скрипт: коммит, пуш, npm install, build 10 сервисов, перезапуск PM2, health-check. 3–5 минут от команды до рабочего продакшена.",[34,5729,5731],{"id":5730},"цифры","Цифры",[48,5733,5734,5744],{},[51,5735,5736],{},[54,5737,5738,5741],{},[57,5739,5740],{},"Метрика",[57,5742,5743],{},"Значение",[64,5745,5746,5754,5762,5770,5778,5786,5794],{},[54,5747,5748,5751],{},[69,5749,5750],{},"Версия",[69,5752,5753],{},"v1.1.43",[54,5755,5756,5759],{},[69,5757,5758],{},"PM2-процессов",[69,5760,5761],{},"15",[54,5763,5764,5767],{},[69,5765,5766],{},"Активных парсеров",[69,5768,5769],{},"10",[54,5771,5772,5775],{},[69,5773,5774],{},"Площадок",[69,5776,5777],{},"10 федеральных",[54,5779,5780,5783],{},[69,5781,5782],{},"Тестов",[69,5784,5785],{},"578",[54,5787,5788,5791],{},[69,5789,5790],{},"Коммитов",[69,5792,5793],{},"200+",[54,5795,5796,5799],{},[69,5797,5798],{},"Время от идеи до prod",[69,5800,5801],{},"1.5 месяца",[34,5803,3147],{"id":3146},[217,5805,5806,5809,5812,5815],{},[160,5807,5808],{},"Email-дайджест с аналитикой по трендам",[160,5810,5811],{},"Расширение на больше площадок и регионов",[160,5813,5814],{},"API для партнёров",[160,5816,5817],{},"Предсказание доходности на основе исторических данных",[583,5819],{},{"title":192,"searchDepth":593,"depth":593,"links":5821},[5822,5823,5824,5825,5826,5827,5828],{"id":5514,"depth":593,"text":5515},{"id":2574,"depth":593,"text":5524},{"id":5640,"depth":593,"text":5641},{"id":5668,"depth":593,"text":5669},{"id":5699,"depth":593,"text":5700},{"id":5730,"depth":593,"text":5731},{"id":3146,"depth":593,"text":3147},"2026-07-07","10 парсеров, 15 сервисов, 578 тестов. Как я строю платформу для инвесторов в недвижимость с помощью AI.",{},"\u002Fblog\u002F2026-07-07-aklab-ai-development",{"title":5493,"description":5830},"blog\u002F2026-07-07-aklab-ai-development",[5836,626,630,5837,5838,5839,5840],"aklab","strapi","vue","недвижимость","инвестиции","NgOyUcftyQjU9k1ghD0wHeO2LsIUkgKlZjFav3qstgc",{"id":5843,"title":5844,"acrostic":7,"body":5845,"date":5852,"description":5853,"duration":7,"emoji":7,"extension":617,"faq":7,"featured":618,"format":7,"image":7,"level":7,"media":5854,"meta":5858,"navigation":620,"path":5859,"price":7,"schedule":7,"seo":5860,"seoTitle":7,"serviceType":7,"status":7,"stem":5861,"tags":5862,"tech":7,"toc":618,"url":7,"__hash__":5864},"blog\u002Fblog\u002F2026-03-14-improvizaciya.md","Импровизация (14 марта)",{"type":9,"value":5846,"toc":5850},[5847],[12,5848,5849],{},"Живая акустическая импровизация, записанная 14 марта.",{"title":192,"searchDepth":593,"depth":593,"links":5851},[],"2026-03-14","Акустическая гитара, свежая импровизация.",[5855],{"type":5856,"url":5857,"title":5844},"audio","\u002Fmusic\u002F14-mar-1222.mp3",{},"\u002Fblog\u002F2026-03-14-improvizaciya",{"title":5844,"description":5853},"blog\u002F2026-03-14-improvizaciya",[5863],"музыка","8tBvhLmSw3k7YN0s4RuppHBhnjaYZ9-n6ULY5X0DtlM",{"id":5866,"title":5867,"acrostic":7,"body":5868,"date":5898,"description":5899,"duration":7,"emoji":7,"extension":617,"faq":7,"featured":618,"format":7,"image":7,"level":7,"media":7,"meta":5900,"navigation":620,"path":5903,"price":7,"schedule":7,"seo":5904,"seoTitle":7,"serviceType":7,"status":7,"stem":5905,"tags":5906,"tech":7,"toc":618,"url":7,"__hash__":5908},"blog\u002Fblog\u002F2026-03-13-help-people.md","Помочь можно только тому, кто готов",{"type":9,"value":5869,"toc":5896},[5870,5873,5876,5879,5882,5885,5888,5891],[12,5871,5872],{},"Иногда ловлю себя на мысли, что очень хочу приносить пользу. Не просто быть рядом, а именно — быть полезным. Помогать близким, да и вообще — людям. Делать так, чтобы кому-то стало легче, понятнее, лучше.",[12,5874,5875],{},"Умею, казалось бы, немало. Могу сайт помочь сделать. Могу разобраться с ИИ, внедрить, прокачать процессы. Казалось бы — бери и делай, приноси пользу.",[12,5877,5878],{},"Но что-то не складывается.",[12,5880,5881],{},"И ведь знаю я эту мудрость, которую не первый раз слышу: «Люди сопротивляются новому, даже если понимают, что оно к лучшему». Знаю — и всё равно каждый раз удивляюсь. Вроде человек сам просил помощи. Вроде сам понимает, что надо что-то менять. А потом — тишина. Или отговорки. Или просто игнор.",[12,5883,5884],{},"Может, конечно, это я где-то не так подхожу. Может, не умею правильно донести. Может, навязываюсь там, где не надо.",[12,5886,5887],{},"А может, всё просто — помочь можно только тому, кто сам готов эту помощь принять. Не за руку тянуть, а просто быть рядом, когда спросят.",[12,5889,5890],{},"Но всё равно — хочется. Чтобы получалось. Чтобы не зря.",[290,5892,5893],{},[12,5894,5895],{},"«...и может быть станем, станем мы друг другу нужней...» — иногда эта строчка из 7Б застревает в голове. Вот бы так. Вот бы получалось.",{"title":192,"searchDepth":593,"depth":593,"links":5897},[],"2026-03-13","О желании приносить пользу и о том, почему это не всегда получается",{"externalLinks":5901},{"telegram":5902},"tg:\u002F\u002Fresolve?domain=strunimisli&post=11","\u002Fblog\u002F2026-03-13-help-people",{"title":5867,"description":5899},"blog\u002F2026-03-13-help-people",[5907,5175],"личное","j1sATirO1E67Dnf68VmZhA_IgY7DXmNZg0NdbGYVxho",{"id":5910,"title":5911,"acrostic":7,"body":5912,"date":5989,"description":5990,"duration":7,"emoji":7,"extension":617,"faq":7,"featured":618,"format":7,"image":7,"level":7,"media":7,"meta":5991,"navigation":620,"path":5992,"price":7,"schedule":7,"seo":5993,"seoTitle":7,"serviceType":7,"status":7,"stem":5994,"tags":5995,"tech":7,"toc":618,"url":7,"__hash__":5997},"blog\u002Fblog\u002F2026-03-10-ai-changed-rules.md","AI изменил правила: как один разработчик заменяет команду",{"type":9,"value":5913,"toc":5983},[5914,5917,5921,5927,5933,5937,5963,5967,5970,5973,5977],[12,5915,5916],{},"За 30 лет в IT я видел много технологических революций. Но ни одна из них не была такой быстрой и глубокой, как AI.",[34,5918,5920],{"id":5919},"было-стало","Было \u002F Стало",[12,5922,5923,5926],{},[1463,5924,5925],{},"Раньше:"," чтобы создать SaaS-продукт, нужна команда из 5-10 человек. Frontend, backend, дизайнер, DevOps, тестировщик.",[12,5928,5929,5932],{},[1463,5930,5931],{},"Сейчас:"," один разработчик с AI-инструментами делает то же самое. Claude пишет код, GPT генерирует контент, Replicate создаёт изображения, а я собираю всё это в продукт.",[34,5934,5936],{"id":5935},"мой-стек-продуктивности","Мой стек продуктивности",[217,5938,5939,5945,5951,5957],{},[160,5940,5941,5944],{},[1463,5942,5943],{},"Claude Code"," — написание и рефакторинг кода",[160,5946,5947,5950],{},[1463,5948,5949],{},"Yandex GPT"," — генерация контента на русском",[160,5952,5953,5956],{},[1463,5954,5955],{},"GPT-4"," — сложные аналитические задачи",[160,5958,5959,5962],{},[1463,5960,5961],{},"Replicate"," — генерация изображений",[34,5964,5966],{"id":5965},"что-это-меняет","Что это меняет",[12,5968,5969],{},"Порог входа в создание продуктов снизился радикально. Теперь важна не размер команды, а качество идеи и способность быстро итерировать.",[12,5971,5972],{},"Один человек с правильными инструментами может конкурировать с командами. Не потому что он лучше — потому что AI убрал bottleneck в исполнении.",[34,5974,5976],{"id":5975},"главный-навык-2026-года","Главный навык 2026 года",[12,5978,5979,5980,209],{},"Не программирование. Не дизайн. А умение правильно декомпозировать задачу и поставить её AI. Это новый вид инженерии — ",[1463,5981,5982],{},"инженерия промптов и процессов",{"title":192,"searchDepth":593,"depth":593,"links":5984},[5985,5986,5987,5988],{"id":5919,"depth":593,"text":5920},{"id":5935,"depth":593,"text":5936},{"id":5965,"depth":593,"text":5966},{"id":5975,"depth":593,"text":5976},"2026-03-10","30 лет в IT научили меня одному — адаптируйся или проиграешь",{},"\u002Fblog\u002F2026-03-10-ai-changed-rules",{"title":5911,"description":5990},"blog\u002F2026-03-10-ai-changed-rules",[626,5175,5996],"продуктивность","7X2yLb6-QceOE5kpg_oozrJoijN8dDcvIY7BrTS4oZI",{"id":5999,"title":6000,"acrostic":7,"body":6001,"date":6020,"description":6021,"duration":7,"emoji":7,"extension":617,"faq":7,"featured":618,"format":7,"image":7,"level":7,"media":7,"meta":6022,"navigation":620,"path":6025,"price":7,"schedule":7,"seo":6026,"seoTitle":7,"serviceType":7,"status":7,"stem":6027,"tags":6028,"tech":7,"toc":618,"url":7,"__hash__":6029},"blog\u002Fblog\u002F2026-03-09-struny-myslej.md","Струны мыслей",{"type":9,"value":6002,"toc":6018},[6003,6006,6009,6012,6015],[12,6004,6005],{},"Решил завести этот канал для себя. Не для проекта, не для аудитории — просто место, куда можно положить мысли, которые сами просятся наружу.",[12,6007,6008],{},"Я Александр. Разработчик, предприниматель, музыкант. Странное сочетание, но мне кажется, именно оно делает меня тем, кто я есть. В голове постоянно что-то происходит — то про AI и технологии, то про то, как строить дела, то про то, как всё это не усложнять. А ещё есть музыка. Она занимает огромное место в моей душе, и здесь я буду делиться своими произведениями — не потому что они идеальные, а потому что они мои.",[12,6010,6011],{},"Это не бизнес-канал. Это дневник. Записи о том, что думаю, пока еду куда-то или сижу ночью с гитарой. Мысли об AI, который меня завораживает. Размышления о стартапах — не как учить, а как самому ошибаться и учиться. Продуктивность — но без токсичного позитива, просто честно о том, что работает и что нет.",[12,6013,6014],{},"А ещё здесь будет музыка. Не концертные записи и не продакшн уровня студии — живой звук, мысли в нотах, иногда просто настроение, которое вылилось в мелодию.",[12,6016,6017],{},"Если это кому-то откликнется — хорошо. Если нет — тоже.",{"title":192,"searchDepth":593,"depth":593,"links":6019},[],"2026-03-09","Зачем я завёл личный канал — место для мыслей, музыки и честных записей",{"externalLinks":6023},{"telegram":6024},"tg:\u002F\u002Fresolve?domain=strunimisli&post=2","\u002Fblog\u002F2026-03-09-struny-myslej",{"title":6000,"description":6021},"blog\u002F2026-03-09-struny-myslej",[5907],"8LfKUqraECTM7ZDjCDyccqANqrJYF254hFHJ80YToJk",{"id":6031,"title":6032,"acrostic":7,"body":6033,"date":6135,"description":6136,"duration":7,"emoji":7,"extension":617,"faq":7,"featured":618,"format":7,"image":7,"level":7,"media":7,"meta":6137,"navigation":620,"path":6138,"price":7,"schedule":7,"seo":6139,"seoTitle":7,"serviceType":7,"status":7,"stem":6140,"tags":6141,"tech":7,"toc":618,"url":7,"__hash__":6143},"blog\u002Fblog\u002F2026-03-08-architecture.md","Архитектура TiROBOTS: как устроена AI‑платформа",{"type":9,"value":6034,"toc":6129},[6035,6038,6042,6068,6072,6075,6089,6092,6096,6102,6105,6109],[12,6036,6037],{},"Когда я начинал TiROBOTS, стояла задача: построить платформу, которая будет легко масштабироваться и поддерживаться одним разработчиком.",[34,6039,6041],{"id":6040},"стек","Стек",[217,6043,6044,6050,6056,6062],{},[160,6045,6046,6049],{},[1463,6047,6048],{},"Frontend:"," Vue 3 + Tailwind CSS",[160,6051,6052,6055],{},[1463,6053,6054],{},"Backend:"," Strapi 5 (headless CMS)",[160,6057,6058,6061],{},[1463,6059,6060],{},"AI:"," Yandex GPT для текстов, Replicate для изображений",[160,6063,6064,6067],{},[1463,6065,6066],{},"Инфраструктура:"," PM2, Nginx, Ubuntu",[34,6069,6071],{"id":6070},"почему-strapi","Почему Strapi",[12,6073,6074],{},"Strapi даёт из коробки:",[217,6076,6077,6080,6083,6086],{},[160,6078,6079],{},"REST и GraphQL API",[160,6081,6082],{},"Админку для контент-менеджмента",[160,6084,6085],{},"Систему ролей и прав",[160,6087,6088],{},"Кастомные контроллеры",[12,6090,6091],{},"Это позволило сосредоточиться на бизнес-логике, а не на бойлерплейте.",[34,6093,6095],{"id":6094},"архитектура-ai-пайплайна","Архитектура AI-пайплайна",[182,6097,6100],{"className":6098,"code":6099,"language":187},[185],"Тема → Генерация текста (GPT) → Ревью (Главный редактор) → Генерация изображения (Replicate) → Публикация\n",[190,6101,6099],{"__ignoreMap":192},[12,6103,6104],{},"Каждый этап — отдельный сервис. Если AI сгенерировал плохой текст, главный редактор отправляет на переработку.",[34,6106,6108],{"id":6107},"уроки","Уроки",[157,6110,6111,6117,6123],{},[160,6112,6113,6116],{},[1463,6114,6115],{},"Не усложняй раньше времени."," Начал с монолита, разделю когда понадобится",[160,6118,6119,6122],{},[1463,6120,6121],{},"AI нужен контекст."," Чем больше контекста даёшь модели, тем лучше результат",[160,6124,6125,6128],{},[1463,6126,6127],{},"Мониторинг критичен."," Когда роботы работают 24\u002F7, нужно знать что происходит",{"title":192,"searchDepth":593,"depth":593,"links":6130},[6131,6132,6133,6134],{"id":6040,"depth":593,"text":6041},{"id":6070,"depth":593,"text":6071},{"id":6094,"depth":593,"text":6095},{"id":6107,"depth":593,"text":6108},"2026-03-08","Vue 3 + Strapi 5 + Yandex GPT — как всё это работает вместе",{},"\u002Fblog\u002F2026-03-08-architecture",{"title":6032,"description":6136},"blog\u002F2026-03-08-architecture",[6142,2574,5838,5837],"tirobots","I9NByyPwHKcDOaujP1aG__wCvuDpnp1_j90iJN4BB6o",{"id":6145,"title":6146,"acrostic":7,"body":6147,"date":6223,"description":6224,"duration":7,"emoji":7,"extension":617,"faq":7,"featured":618,"format":7,"image":7,"level":7,"media":7,"meta":6225,"navigation":620,"path":6226,"price":7,"schedule":7,"seo":6227,"seoTitle":7,"serviceType":7,"status":7,"stem":6228,"tags":6229,"tech":7,"toc":618,"url":7,"__hash__":6231},"blog\u002Fblog\u002F2026-03-07-how-it-started.md","Как я решил автоматизировать контент‑маркетинг",{"type":9,"value":6148,"toc":6216},[6149,6152,6156,6159,6163,6166,6170,6173,6187,6190,6194,6197,6211,6213],[12,6150,6151],{},"Всё началось с простого наблюдения: ведение контент-каналов отнимает безумное количество времени. Придумать тему, написать текст, сделать картинку, опубликовать в нужное время — и так каждый день.",[34,6153,6155],{"id":6154},"проблема","Проблема",[12,6157,6158],{},"Я вёл несколько Telegram-каналов и тратил на это 10-15 часов в неделю. При этом качество контента было нестабильным — когда устаёшь, посты получаются хуже.",[34,6160,6162],{"id":6161},"идея","Идея",[12,6164,6165],{},"А что если AI может не просто помогать с текстом, а полностью вести канал? С определённым tone of voice, стратегией, расписанием?",[34,6167,6169],{"id":6168},"первые-эксперименты","Первые эксперименты",[12,6171,6172],{},"Начал с простого — скрипт, который:",[157,6174,6175,6178,6181,6184],{},[160,6176,6177],{},"Берёт тему из списка",[160,6179,6180],{},"Генерирует текст через Yandex GPT",[160,6182,6183],{},"Создаёт изображение через Replicate",[160,6185,6186],{},"Публикует в Telegram по расписанию",[12,6188,6189],{},"Результат превзошёл ожидания. Посты были не хуже написанных вручную, а иногда даже лучше — AI не устаёт и не теряет фокус.",[34,6191,6193],{"id":6192},"от-скрипта-к-платформе","От скрипта к платформе",[12,6195,6196],{},"Один скрипт превратился в платформу TiROBOTS. Добавил:",[217,6198,6199,6202,6205,6208],{},[160,6200,6201],{},"Веб-интерфейс для управления",[160,6203,6204],{},"Роль «Главного редактора» — задаёт стратегию",[160,6206,6207],{},"Несколько AI-роботов с разными специализациями",[160,6209,6210],{},"Аналитику эффективности",[34,6212,3147],{"id":3146},[12,6214,6215],{},"Сейчас TiROBOTS — это полноценная платформа для автоматизации контент-маркетинга. Но я вижу её будущее шире — как хаб AI-роботов для разных задач бизнеса.",{"title":192,"searchDepth":593,"depth":593,"links":6217},[6218,6219,6220,6221,6222],{"id":6154,"depth":593,"text":6155},{"id":6161,"depth":593,"text":6162},{"id":6168,"depth":593,"text":6169},{"id":6192,"depth":593,"text":6193},{"id":3146,"depth":593,"text":3147},"2026-03-07","От идеи до продакшена — один разработчик и один AI",{},"\u002Fblog\u002F2026-03-07-how-it-started",{"title":6146,"description":6224},"blog\u002F2026-03-07-how-it-started",[626,6142,6230],"история","qMmW7-j3p9MkqKRv_DaoI98E0BUne2t3e_RgyJ3sbFU",{"id":6233,"title":6234,"acrostic":7,"body":6235,"date":6242,"description":6243,"duration":7,"emoji":7,"extension":617,"faq":7,"featured":618,"format":7,"image":7,"level":7,"media":6244,"meta":6247,"navigation":620,"path":6248,"price":7,"schedule":7,"seo":6249,"seoTitle":7,"serviceType":7,"status":7,"stem":6250,"tags":6251,"tech":7,"toc":618,"url":7,"__hash__":6252},"blog\u002Fblog\u002F2025-06-01-potihonechku-daleko-cover.md","Потихонечку — далеко (Cover)",{"type":9,"value":6236,"toc":6240},[6237],[12,6238,6239],{},"Акустический кавер.",{"title":192,"searchDepth":593,"depth":593,"links":6241},[],"2025-06-01","Кавер на акустической гитаре.",[6245],{"type":5856,"url":6246,"title":6234},"\u002Fmusic\u002Fpotikhonechku-daleko-cover.mp3",{},"\u002Fblog\u002F2025-06-01-potihonechku-daleko-cover",{"title":6234,"description":6243},"blog\u002F2025-06-01-potihonechku-daleko-cover",[5863],"PaLnyOBXJVyRw6jbiuQbGjBB89QMGwFGXCYQ9qDbFco",{"id":6254,"title":6255,"acrostic":7,"body":6256,"date":6263,"description":6264,"duration":7,"emoji":7,"extension":617,"faq":7,"featured":618,"format":7,"image":7,"level":7,"media":6265,"meta":6268,"navigation":620,"path":6269,"price":7,"schedule":7,"seo":6270,"seoTitle":7,"serviceType":7,"status":7,"stem":6271,"tags":6272,"tech":7,"toc":618,"url":7,"__hash__":6273},"blog\u002Fblog\u002F2025-01-24-improvizaciya.md","Импровизация (24 января)",{"type":9,"value":6257,"toc":6261},[6258],[12,6259,6260],{},"Fingerstyle-импровизация на акустической гитаре.",{"title":192,"searchDepth":593,"depth":593,"links":6262},[],"2025-01-24","Акустическая гитара, fingerstyle импровизация.",[6266],{"type":5856,"url":6267,"title":6255},"\u002Fmusic\u002F24-jan-1115.mp3",{},"\u002Fblog\u002F2025-01-24-improvizaciya",{"title":6255,"description":6264},"blog\u002F2025-01-24-improvizaciya",[5863],"bjdlpCC2vLziYprV48lRGPUnbx7MvLr1ZZh8Q72u-cg",{"id":6275,"title":6276,"acrostic":7,"body":6277,"date":6299,"description":6300,"duration":7,"emoji":7,"extension":617,"faq":7,"featured":618,"format":7,"image":7,"level":7,"media":7,"meta":6301,"navigation":620,"path":6302,"price":7,"schedule":7,"seo":6303,"seoTitle":7,"serviceType":7,"status":7,"stem":6304,"tags":6305,"tech":7,"toc":618,"url":7,"__hash__":6306},"blog\u002Fblog\u002F2020-01-01-deneg-kotorykh-net.md","Деньги, которых нет",{"type":9,"value":6278,"toc":6297},[6279,6282,6285,6288,6291,6294],[12,6280,6281],{},"У меня была беседа с человеком, который успешно играл на бирже и однажды решил вывести все деньги в кэш.",[12,6283,6284],{},"Уж так он успешно до этого играл, что денег оказалось очень много. Вот прям реально несколько чемоданов.",[12,6286,6287],{},"Это, как он рассказывал, тоже было недёшево – комиссия за обналичивание такой суммы была запредельной, но он всё же пошел на эту трату, так как был твёрд в своем решении. В этот момент, говорит, когда ему озвучили размер комиссионных, он в первый раз почувствовал укол какой-то плохо еще осознаваемой мысли.",[12,6289,6290],{},"Ну вот, говорит, посидел на чемоданах пару дней, он пошел и купил за наличные панамеру. Мог, в принципе, какую угодно тачку купить, но эта вот попала под руку, как говорится. Эта покупка была похожа на небольшой перерасчет портфеля акций в связи с коррекцией рынка. Пока он не видел этих денег вживую, он по-другому ощущал их ценность, поэтому для него было открытием, что оказывается вымутить понамеру, а для держателя капитала это можно объяснить коррекцией.",[12,6292,6293],{},"Потом он сделал еще несколько покупок, но быстро понял, что это тупо. Тупо держать такую большую сумму в чемоданах, да еще и собранных в одном месте. Тупо, что это место – квартира. Тупо вообще вся эта затея.",[12,6295,6296],{},"Деньги были переведены обратно в безнал.",{"title":192,"searchDepth":593,"depth":593,"links":6298},[],"2020-01-01","Человек, который обналичил всё",{},"\u002Fblog\u002F2020-01-01-deneg-kotorykh-net",{"title":6276,"description":6300},"blog\u002F2020-01-01-deneg-kotorykh-net",[6230,5175],"-L0m9kWzyTo3Yzr5IU88DYVwJcPWWrJdWyvz1a7yjqo",{"id":6308,"title":6309,"acrostic":7,"body":6310,"date":6299,"description":6326,"duration":7,"emoji":7,"extension":617,"faq":7,"featured":618,"format":7,"image":7,"level":7,"media":7,"meta":6327,"navigation":620,"path":6328,"price":7,"schedule":7,"seo":6329,"seoTitle":7,"serviceType":7,"status":7,"stem":6330,"tags":6331,"tech":7,"toc":618,"url":7,"__hash__":6332},"blog\u002Fblog\u002F2020-01-01-dragotsennyj-kamen.md","Драгоценный камень в куче угля",{"type":9,"value":6311,"toc":6324},[6312,6315,6318,6321],[12,6313,6314],{},"Однажды я нашёл в куче угля маленький рубин. Дело было так. Еще с детства у меня в голове отложилась информация, что в угле можно найти много чего интересного. Например, ракушку древнего моллюска. Потом я узнал как появляются драгоценные камни и где их чаще всего находят. В принципе, для получения каменного угля и для получения драгоценных камней необходимы сходные процессы – высокое давление и температура. Поэтому, есть не нулевая вероятность найти в куче угля драгоценный камень.",[12,6316,6317],{},"Дело происходило, когда я служил в армии. Привезли уголь и сгрузили его на территории склада, к которому мы были прикомандированы. И вот сидели мы как-то с пацанами рядом с этой кучей, я им рассказываю про эту вот не нулевую вероятность и у них на глазах начинаю искать. Поискав какое-то время, бросаю это занятие, ребята посмеиваются. Потом, на следующий день я опять присаживался рядом с кучей и сидел, внимательно просматривая каждый квадратный сантиметр. Прошло несколько дней. И вот однажды я нашёл! Маленький камушек рубинового цвета. Кто-то из парней предложил попробовать поцарапать стекло этим камушком. Мол, если расцарапает, то да действительно рубин. У меня было зеркальце и мы попробовали им поцарапать поверхность. Камешек уверенно прорезал борозду на стекле!",[12,6319,6320],{},"К чему я это рассказываю?",[12,6322,6323],{},"Я много раз был свидетелем того, как происходили события, вероятность которых была крайне мала.",{"title":192,"searchDepth":593,"depth":593,"links":6325},[],"Не нулевая вероятность",{},"\u002Fblog\u002F2020-01-01-dragotsennyj-kamen",{"title":6309,"description":6326},"blog\u002F2020-01-01-dragotsennyj-kamen",[6230,5175],"ReSvh8Q8ni8J7tDte_S_5SolExGDBVCMxmtEAIRGbv0",{"id":6334,"title":6335,"acrostic":7,"body":6336,"date":6299,"description":6343,"duration":7,"emoji":7,"extension":617,"faq":7,"featured":618,"format":7,"image":7,"level":7,"media":7,"meta":6344,"navigation":620,"path":6345,"price":7,"schedule":7,"seo":6346,"seoTitle":7,"serviceType":7,"status":7,"stem":6347,"tags":6348,"tech":7,"toc":618,"url":7,"__hash__":6350},"blog\u002Fblog\u002F2020-01-01-lyudi-pozhivshie.md","Люди, пожившие на этом свете",{"type":9,"value":6337,"toc":6341},[6338],[12,6339,6340],{},"Люди, пожившие на этом свете, наполнятся воспоминаниями и размышлениями о событиях, которые травмируют их психику. Дети помогают не сойти с ума. Это банальная мысль – рождаемость должна быть, как минимум на том же уровне, как и смертность, а лучше выше, чтобы цивилизация развивалась. Но функция детей не только продолжение рода, но и помощь взрослым. Без них взрослые бы «загнались».",{"title":192,"searchDepth":593,"depth":593,"links":6342},[],"Дети помогают не сойти с ума",{},"\u002Fblog\u002F2020-01-01-lyudi-pozhivshie",{"title":6335,"description":6343},"blog\u002F2020-01-01-lyudi-pozhivshie",[6349,5175],"размышление","zUyXsqORRwh6hQ778jHyNVtVIac8gRo8Wszdg8guXOs",{"id":6352,"title":6353,"acrostic":7,"body":6354,"date":6299,"description":6370,"duration":7,"emoji":7,"extension":617,"faq":7,"featured":618,"format":7,"image":7,"level":7,"media":7,"meta":6371,"navigation":620,"path":6372,"price":7,"schedule":7,"seo":6373,"seoTitle":7,"serviceType":7,"status":7,"stem":6374,"tags":6375,"tech":7,"toc":618,"url":7,"__hash__":6376},"blog\u002Fblog\u002F2020-01-01-pustye-otnosheniya.md","Пустые, ненужные отношения",{"type":9,"value":6355,"toc":6368},[6356,6359,6362,6365],[12,6357,6358],{},"Как так получилось, что то, что имело большую ценность, стало пустым и ненужным? Я пытаюсь разгадать, что это? К чему этот урок? И закончен ли он?",[12,6360,6361],{},"Может то, что мне сейчас кажется пустым, попозже будет видеться обратным?",[12,6363,6364],{},"Чтобы продвигаться, нам необходимо принимать решения. Каждое принятое решение – это смена, корректировка курса. И получается, что мой корабль попал в магнитную аномалию. Компас показывает удивительное…",[12,6366,6367],{},"Когда барахлит компас, отложите в сторону карты. Просто внимательно смотрите вперед, чтобы вовремя обруливать препятствия и ждите ночей, чтобы ориентироваться по звёздам.",{"title":192,"searchDepth":593,"depth":593,"links":6369},[],"Когда барахлит компас, смотрите на звёзды",{},"\u002Fblog\u002F2020-01-01-pustye-otnosheniya",{"title":6353,"description":6370},"blog\u002F2020-01-01-pustye-otnosheniya",[6349],"tQYgVIj0RrbHM-2pue2OefsdjMD46CkFc3HL5StVQZ0",{"id":6378,"title":6379,"acrostic":7,"body":6380,"date":6299,"description":6422,"duration":7,"emoji":7,"extension":617,"faq":7,"featured":618,"format":7,"image":7,"level":7,"media":7,"meta":6423,"navigation":620,"path":6424,"price":7,"schedule":7,"seo":6425,"seoTitle":7,"serviceType":7,"status":7,"stem":6426,"tags":6427,"tech":7,"toc":618,"url":7,"__hash__":6428},"blog\u002Fblog\u002F2020-01-01-sobralsya-ya-umirat.md","Собрался я умирать, ребята…",{"type":9,"value":6381,"toc":6420},[6382,6384,6387,6390,6393,6396,6399,6402,6405,6408,6411,6414,6417],[12,6383,6379],{},[12,6385,6386],{},"Не переживайте, речь не о суициде. Просто что-то сегодня замкнуло в моей голове и как-то стало очень понятно, что времени-то всё меньше! А я туплю.",[12,6388,6389],{},"Задал себе такой вот вопрос – вот если умру прям сейчас, что останется недоделанным? К осуществлению каких целей, желаний я даже не приступал, откладывая их «до лучших времен»?",[12,6391,6392],{},"Ну набралось у меня парочка, да и то, в принципе, не такие уж и критично важные… Я уже так давно живу с пониманием механизма материализации мысли, что все мои мечты уже сбылись. Только и успеваю придумывать что-нибудь новое, потом реализовывать.",[12,6394,6395],{},"В конечном итоге, каждый получает то, что он хочет. Та ситуация, в которой вы сейчас находитесь, образовалась в результате ваших стремлений и связанных с ними решений.",[12,6397,6398],{},"Если вы предприниматель со стажем, то вы меня поймете. Когда над тобой нет начальника, то вы сами определяете, чем вам и когда заниматься. Это классная штука – свобода, но есть обратная сторона у этой медали. Впрочем, это не медаль. Свободу не вручают и не выдают в кассе. Свободу берут. И вот я беру уже эту свободу с 2003 года, как открыл свое первое юрлицо. Сначала о чем-то просто мечтаю, если мечта манит, то меняю статус «мечта» на «цель», потом делаю шаг на пути к ней, другой, третий и всегда (!) обнаруживаю, что мне помогают. Разное в помощь. Люди, конечно же, в первую очередь. Но частенько случаются случайности, типа того, как подходишь к пешеходному переходу и в этот момент, как раз загорается зеленый свет. Ну ладно, речь не о вселенской помощи.",[12,6400,6401],{},"Я понял, что не так уж много, как оказалось, у меня таких мечт, которые я откладывал в долгий ящик… А мечты, которые я не успел воплотить – это и не мечты вовсе, а просто видение будущего. Вот будут еще дирижабли летать повсеместно, увидите сами!",[12,6403,6404],{},"Да и хрен с ними, мне тут подумалось, с этими неисполненными мечтами. Отпустил их и понял… что готов умереть. Ничего такого страшного не произойдет. Я везде, где надо, продублировал доступы надежным людям к всяким там сайтам и панелям управления, ну а то, что загнется без меня, значит не так и нужно было…",[12,6406,6407],{},"Эта вот «готовность» меня ошеломила.",[12,6409,6410],{},"А вот дальше пришло осознание, что это есть главное отличие нас, мужчин, от женщин. Женщина должна жить ради жизни, а от мужчины требуется готовность умереть ради неё.",[12,6412,6413],{},"Только не надо путать готовность и желание)",[12,6415,6416],{},"Новый уровень свободы.",[12,6418,6419],{},"А в ситуации, когда внутри нас борются два противоречивых желания, побеждает тот волк, которого мы лучше кормим",{"title":192,"searchDepth":593,"depth":593,"links":6421},[],"Не переживайте, речь не о суициде",{},"\u002Fblog\u002F2020-01-01-sobralsya-ya-umirat",{"title":6379,"description":6422},"blog\u002F2020-01-01-sobralsya-ya-umirat",[6349],"gBdlbvxE_crJNRBWgREvua6YSVu4hnSEXac6cQ4OSF4",{"id":6430,"title":6431,"acrostic":7,"body":6432,"date":6299,"description":6457,"duration":7,"emoji":7,"extension":617,"faq":7,"featured":618,"format":7,"image":7,"level":7,"media":7,"meta":6458,"navigation":620,"path":6459,"price":7,"schedule":7,"seo":6460,"seoTitle":7,"serviceType":7,"status":7,"stem":6461,"tags":6462,"tech":7,"toc":618,"url":7,"__hash__":6463},"blog\u002Fblog\u002F2020-01-01-topchemy-na-meste.md","Топчемся на месте или двигаемся?",{"type":9,"value":6433,"toc":6455},[6434,6437,6440,6443,6446,6449,6452],[12,6435,6436],{},"Мы представляем из себя то, о чём думаем целыми днями. В каждом мгновении, которое мы проживаем, мы имеем возможность поменять направление нашего движения. Конечно, есть такое понятие, как инерция и поэтому после поворота руля, корабль еще всё равно двигается в прежнем направлении. Кроме того, иногда нужно сменить курс, чтобы обогнуть какое-то препятствие и в этот момент, со стороны кажется, что мы двигаемся совсем не в том направлении, в котором надо бы. Мы не плывем по течению, не плывем против течения, мы плывём к цели! Лавируя между кусками дерьма, плывущиму навстречу, мы можем даже в какой-то момент оказаться на месте, где уже были раньше и тогда кто-то имеет право сказать, что мы топчемся на месте. Но! Мы живы, мы вместе, а значит всё хорошо. Главное не забывать о цели. Вот о ней я и хочу порассуждать.",[12,6438,6439],{},"За последнее время я все чаще дискутирую с разными людьми о цели бизнеса. В уставе каждой компании сказано, что цель бизнеса – прибыль. Поэтому, бизнесмены сначала очень удивляются и смотрят на меня, как на дурака, когда я им заявляю, что никогда не ставил прибыль во главу угла. Я хочу большего, чем просто прибыль. Стремление к гармонии – вот главный мой императив. А что такое гармония? Универсального ответа, справедливого для всех, наверное нет. Да я и не хочу говорить за всех. Скажу за себя – гармония это когда совесть не болит. А у меня она не болит. Я знаю, что есть за мной грешки, типа не заплаченных вовремя пенсионных взносов или налогов, но всё равно не болит! И не потому, что знаю, как распределяются эти налоги, а потому знаю, что я, как единица, приношу ПОЛЬЗУ окружающим меня людям. Польза эта выражается по разному. Это может быть быстрая реакция на сломавшийся сервер, может просто подбадривающие слова, а может и обратное – вот к примеру, вчера я сознательно отключил сервер одной фирме, которая уже пять месяцев не платит за хостинг. У нас там такие отношения с владельцами компании, что я могу быть спокоен – эти неоплаченные месяцы в конце концов будут всё же оплачены. Я и не отключал, просто напоминал об этом периодически управляющим. У меня есть понимание, что тот факт, что я всё же отключил сервер, создало проблемы для управляющих и, может быть, их даже могут уволить. Но уволят их за халатность, а это значит эта компания получит шанс стать лучше (если, конечно, на их место придут менее халатные люди). А те, кого уволят, получат шанс задуматься над своими ошибками и больше их не совершать.",[12,6441,6442],{},"Кто-то согласен работать с мудаками, лишь бы они деньги платили. Они любят говорить фразу: «Ничего личного – это бизнес». А я не такой! Как только я вычисляю мудака, я стремлюсь порвать с ним отношения. И не жалко мне незаработанных миллионов!",[12,6444,6445],{},"Такая стратегия возможна, только когда есть на кого опереться. Я и опираюсь. Опираюсь на родителей. Опираюсь на жену, когда по несколько месяцев нет доходов и мы оплачиваем продукты и секции там всякие, на которые ходит ребенок, её зарплатой. Опираюсь на друзей, когда прихожу к ним, чтобы погреться немного.",[12,6447,6448],{},"Опираюсь и знаю, что моя стратегия, как бумеранг, приносит мне счастье. Не контактировать с мудаками – это ли не счастье? Не счастье ли иметь теплые дружественные отношения с клиентами? А не счастье ли, когда твой сотрудник, говорит самокритично о своей работе? Я уже долго следую своей стратегии и это дает плоды – мудаков в моем близком окружении нет. Я счастлив)",[12,6450,6451],{},"Мы не топчемся на месте. Мы развиваемся и этот процесс не всегда напоминает рост дерева. Потому что мы не деревья. Мы делаем ошибки, учимся на них. Или не учимся и тогда, ситуации повторяются, пока мы не научимся.",[12,6453,6454],{},"У меня спрашивают, трудно ли быть предпринимателем. Надо просто любить людей, отвечаю я им. И вот этому-то и приходится всё время учиться. Как только научишься немного, обретешь внутренний стержень. Учась дальше, обретаешь надежную команду. Продвигаясь дальше в своем обучении, обретаешь хороших клиентов. А там и благоденствие недалеко!",{"title":192,"searchDepth":593,"depth":593,"links":6456},[],"Стремление к гармонии — главный императив",{},"\u002Fblog\u002F2020-01-01-topchemy-na-meste",{"title":6431,"description":6457},"blog\u002F2020-01-01-topchemy-na-meste",[6349],"eMNLdEQLUgyNA5v4U5102TDtXN-LhPi7dYJA8UdRZog",[6465,6477],{"slug":6466,"title":6467,"date":6468,"tags":6469,"description":6472,"media":6473,"externalLinks":6474,"source":6475,"publishedAt":6476},"2026-06-03-odin-na-odin-s-beskonechnostyu","Один на один с бесконечностью","2026-06-03",[5175,5489,6470,6471],"космос","чудо","Один во Вселенной — это тюрьма или школа любви? Размышление о том, почему мы не видим других цивилизаций, и что это говорит о нас самих.",[],{},"openclaw-voice-transcription","2026-06-03T09:18:41.161Z",{"slug":6478,"title":6479,"date":6480,"tags":6481,"description":6482,"media":6483,"externalLinks":6484,"source":6485,"publishedAt":6486},"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":633,"title":634,"acrostic":7,"body":6488,"date":615,"description":912,"duration":7,"emoji":7,"extension":617,"faq":7,"featured":618,"format":7,"image":7,"level":7,"media":7,"meta":6676,"navigation":620,"path":914,"price":7,"schedule":7,"seo":6677,"seoTitle":916,"serviceType":7,"status":7,"stem":917,"tags":6678,"tech":7,"toc":620,"url":7,"__hash__":924},{"type":9,"value":6489,"toc":6662},[6490,6492,6494,6496,6498,6503,6505,6507,6509,6511,6513,6515,6517,6519,6521,6523,6525,6527,6529,6533,6535,6537,6573,6575,6577,6579,6581,6583,6585,6587,6589,6591,6593,6595,6597,6599,6601,6603,6605,6607,6609,6611,6613,6615,6617,6619,6621,6623,6625,6627,6629,6631,6633,6635,6637,6639,6641,6643,6645,6647,6649,6651,6656,6658],[12,6491,639],{},[12,6493,642],{},[12,6495,645],{},[12,6497,648],{},[12,6499,651,6500,209],{},[16,6501,657],{"href":654,"rel":6502},[656],[34,6504,661],{"id":660},[12,6506,664],{},[12,6508,667],{},[12,6510,670],{},[12,6512,673],{},[12,6514,676],{},[12,6516,679],{},[12,6518,682],{},[34,6520,686],{"id":685},[12,6522,689],{},[12,6524,692],{},[12,6526,695],{},[12,6528,698],{},[290,6530,6531],{},[12,6532,703],{},[12,6534,706],{},[12,6536,709],{},[48,6538,6539,6547],{},[51,6540,6541],{},[54,6542,6543,6545],{},[57,6544,718],{},[57,6546,721],{},[64,6548,6549,6555,6561,6567],{},[54,6550,6551,6553],{},[69,6552,728],{},[69,6554,731],{},[54,6556,6557,6559],{},[69,6558,736],{},[69,6560,739],{},[54,6562,6563,6565],{},[69,6564,744],{},[69,6566,747],{},[54,6568,6569,6571],{},[69,6570,752],{},[69,6572,755],{},[12,6574,758],{},[34,6576,762],{"id":761},[12,6578,765],{},[12,6580,768],{},[12,6582,771],{},[12,6584,774],{},[12,6586,777],{},[12,6588,780],{},[34,6590,784],{"id":783},[12,6592,787],{},[12,6594,790],{},[12,6596,793],{},[12,6598,796],{},[12,6600,799],{},[113,6602,803],{"id":802},[12,6604,806],{},[113,6606,810],{"id":809},[12,6608,813],{},[113,6610,817],{"id":816},[12,6612,820],{},[34,6614,824],{"id":823},[12,6616,827],{},[12,6618,830],{},[12,6620,833],{},[12,6622,836],{},[12,6624,839],{},[34,6626,843],{"id":842},[12,6628,846],{},[12,6630,849],{},[12,6632,852],{},[12,6634,855],{},[34,6636,859],{"id":858},[12,6638,862],{},[12,6640,865],{},[12,6642,868],{},[12,6644,871],{},[34,6646,875],{"id":874},[12,6648,878],{},[12,6650,881],{},[12,6652,884,6653,209],{},[16,6654,888],{"href":654,"rel":6655},[656],[583,6657],{},[12,6659,893,6660,897],{},[16,6661,896],{"href":590},{"title":192,"searchDepth":593,"depth":593,"links":6663},[6664,6665,6666,6667,6672,6673,6674,6675],{"id":660,"depth":593,"text":661},{"id":685,"depth":593,"text":686},{"id":761,"depth":593,"text":762},{"id":783,"depth":593,"text":784,"children":6668},[6669,6670,6671],{"id":802,"depth":599,"text":803},{"id":809,"depth":599,"text":810},{"id":816,"depth":599,"text":817},{"id":823,"depth":593,"text":824},{"id":842,"depth":593,"text":843},{"id":858,"depth":593,"text":859},{"id":874,"depth":593,"text":875},{},{"title":634,"description":912},[919,920,921,922,923],1788035832073]