<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator><link href="https://vladtrc.github.io/contextrot/feed.xml" rel="self" type="application/atom+xml" /><link href="https://vladtrc.github.io/contextrot/" rel="alternate" type="text/html" /><updated>2026-04-09T12:42:29+00:00</updated><id>https://vladtrc.github.io/contextrot/feed.xml</id><title type="html">contextrot</title><subtitle></subtitle><entry><title type="html">Культ HTMX + daisyUI</title><link href="https://vladtrc.github.io/contextrot/2026/04/htmx-daisyui-strengths-weaknesses/" rel="alternate" type="text/html" title="Культ HTMX + daisyUI" /><published>2026-04-08T00:00:00+00:00</published><updated>2026-04-08T00:00:00+00:00</updated><id>https://vladtrc.github.io/contextrot/2026/04/htmx-daisyui-strengths-weaknesses</id><content type="html" xml:base="https://vladtrc.github.io/contextrot/2026/04/htmx-daisyui-strengths-weaknesses/"><![CDATA[<p>После того как мы кратко познакомились с htmx и всё таки решили пойти в крестовый поход против <code class="language-plaintext highlighter-rouge">javascript</code>, <code class="language-plaintext highlighter-rouge">vite</code>, <code class="language-plaintext highlighter-rouge">react</code>, <code class="language-plaintext highlighter-rouge">ангуляра</code> и здравого смысла, пора задуматься какие же задачи мы можем решить с помощью htmx а какие - нет.</p>

<p>Htmx решает одну задачу: обновляет определенную часть интерфейса куском HTML который вернул сервер. Можно настраивать когда обновлять, что именно менять и как это встраивать в DOM, но суть именно такая.
Сам по себе htmx никак не отвечает за стили и не диктует, как оформлять интерфейс. Этот вопрос я предлагаю закрывать через… daisyUI!</p>

<p><code class="language-plaintext highlighter-rouge">daisyUI</code> - слой поверх <code class="language-plaintext highlighter-rouge">tailwind</code> который даёт готовые классы-компоненты. Честно, уважаемые читатели, я пробовал довольно много решений которые должны “просто работать”:</p>
<ol>
  <li>Вайбкодить весь сырой css без какой-либо библиотеки - оказалось что тут не всё так просто и задачки занимали <em>ОЧЕНЬ</em> много времени даже простые даже если как-то структурировать css. И много токенов уходило на “поддержку” этих стилей</li>
  <li>Вайбкодить весь сырой css с помощью “очистителей” то есть чтото типа <a href="https://piccalil.li/blog/a-more-modern-css-reset">a-more-modern-css-reset</a> - разницы с первым пунктом особо не заметил.</li>
  <li>CSS first библиотеки а-ля “picocss”, решения в которых весь css написан за тебя то есть твой &lt;/button&gt; выглядит уже совсем не как дефолтный. У LLMок, по моему опыту, начинаются трудности поскольку бОльшая часть css находится вне проекта и, соответственно, вне контекста.</li>
  <li>Tailwind CDN - честно, я практически переставал понимать десятки классов которые клод пихал в атрибуты… это тоже становилось довольно тяжело</li>
</ol>

<p>Напомню что я преследовал оч конкретную цель - вайбкодинг фронта для:</p>
<ul>
  <li>админок</li>
  <li>внутренних панелей</li>
  <li>MVP</li>
</ul>

<p>И вот тут я пришёл к <code class="language-plaintext highlighter-rouge">daisyUI</code>! Это заранее написанные и сгруппированные tailwind классы, на нашей стороне количество стилей ну МИНИМАЛЬНО. На актуальном <code class="language-plaintext highlighter-rouge">daisyUI v5</code> это выглядит примерно так.</p>

<p>Чистый <code class="language-plaintext highlighter-rouge">Tailwind</code>:</p>

<div class="language-html highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nt">&lt;div</span> <span class="na">class=</span><span class="s">"rounded-lg border border-gray-200 bg-white p-6 shadow-sm"</span><span class="nt">&gt;</span>
  <span class="nt">&lt;h2</span> <span class="na">class=</span><span class="s">"text-xl font-semibold text-gray-900"</span><span class="nt">&gt;</span>Delete post<span class="nt">&lt;/h2&gt;</span>
  <span class="nt">&lt;p</span> <span class="na">class=</span><span class="s">"mt-2 text-sm text-gray-500"</span><span class="nt">&gt;</span>
    This action is irreversible.
  <span class="nt">&lt;/p&gt;</span>
  <span class="nt">&lt;div</span> <span class="na">class=</span><span class="s">"mt-4 flex justify-end gap-2"</span><span class="nt">&gt;</span>
    <span class="nt">&lt;button</span> <span class="na">class=</span><span class="s">"inline-flex h-10 items-center justify-center rounded-md border border-gray-200 px-4 text-sm font-medium transition hover:bg-gray-100"</span><span class="nt">&gt;</span>
      Cancel
    <span class="nt">&lt;/button&gt;</span>
    <span class="nt">&lt;button</span> <span class="na">class=</span><span class="s">"inline-flex h-10 items-center justify-center rounded-md bg-red-600 px-4 text-sm font-medium text-white transition hover:opacity-90"</span><span class="nt">&gt;</span>
      Delete
    <span class="nt">&lt;/button&gt;</span>
  <span class="nt">&lt;/div&gt;</span>
<span class="nt">&lt;/div&gt;</span>
</code></pre></div></div>

<p><code class="language-plaintext highlighter-rouge">daisyUI</code>:</p>

<div class="language-html highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nt">&lt;div</span> <span class="na">class=</span><span class="s">"card bg-base-100 shadow-sm border border-base-300"</span><span class="nt">&gt;</span>
  <span class="nt">&lt;div</span> <span class="na">class=</span><span class="s">"card-body"</span><span class="nt">&gt;</span>
    <span class="nt">&lt;h2</span> <span class="na">class=</span><span class="s">"card-title"</span><span class="nt">&gt;</span>Delete post<span class="nt">&lt;/h2&gt;</span>
    <span class="nt">&lt;p&gt;</span>This action is irreversible.<span class="nt">&lt;/p&gt;</span>
    <span class="nt">&lt;div</span> <span class="na">class=</span><span class="s">"card-actions justify-end"</span><span class="nt">&gt;</span>
      <span class="nt">&lt;button</span> <span class="na">class=</span><span class="s">"btn"</span><span class="nt">&gt;</span>Cancel<span class="nt">&lt;/button&gt;</span>
      <span class="nt">&lt;button</span> <span class="na">class=</span><span class="s">"btn btn-error"</span><span class="nt">&gt;</span>Delete<span class="nt">&lt;/button&gt;</span>
    <span class="nt">&lt;/div&gt;</span>
  <span class="nt">&lt;/div&gt;</span>
<span class="nt">&lt;/div&gt;</span>
</code></pre></div></div>

<p>Для моего юзкейса это важно не потому, что daisyUI какой-то “магический фреймворк красоты”, а потому что он снижает LOC и снижает шансы что LLMка случайно сгенерит свалку из десятков 27 utility-классов половину из которых потом забудет. Сами авторы <code class="language-plaintext highlighter-rouge">daisyUI</code> поддерживают актуальную LLM-first документацию где чё использовать!</p>

<p>Честно, даже не хочется расписывать особо технические плюсы минусы. Я не фронтендер и сам эти стили не читаю… Самое главное МНЕ что такое решение просто работает и позволяет не тратить большое кол-во токенов на поддержку этого чудища. Если замечаю что становится подозрительно много стилей промчу что-то вроде “изучи доку <code class="language-plaintext highlighter-rouge">daisyUI</code> и подумай не нарушаем ли мы базовые принципы”. Кода стилей становится существенно меньше)0))</p>

<p>Давайте поговорим про ощутимые минусы.
Всё вот это “удобно, zero-build, кайф” очень отрезвляется ситуацией в которой кто-то заходит на сайтик и видит какую-то сломанную дичь… Почему? Потому что HTML у нас может приехать нормально с нашего сервера, а вот CSS едет отдельным запросом на внешний CDN.</p>

<p>Типичный zero-build кусок выглядит так:</p>

<div class="language-html highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nt">&lt;link</span>
  <span class="na">href=</span><span class="s">"https://cdn.jsdelivr.net/npm/daisyui@5"</span>
  <span class="na">rel=</span><span class="s">"stylesheet"</span>
  <span class="na">type=</span><span class="s">"text/css"</span>
<span class="nt">/&gt;</span>
<span class="nt">&lt;script </span><span class="na">src=</span><span class="s">"https://cdn.jsdelivr.net/npm/@tailwindcss/browser@4"</span><span class="nt">&gt;&lt;/script&gt;</span>
</code></pre></div></div>

<p>То есть страница открывается не одним монолитным “сайт загрузился”, а цепочкой:</p>

<ul>
  <li>браузер получает HTML</li>
  <li>видит ссылку на внешний стайлщит</li>
  <li>идет в другой домен за CSS</li>
  <li>ждет пока тот ответит</li>
  <li>только потом нормально красит интерфейс</li>
</ul>

<p>И вот этот внешний CDN может тупить, быть временно недоступен. У пользователя может резаться доступ корпоративной сетью, адблоком, провайдером, чем угодно(( Причём с @tailwindcss/browser ситуация сложнее чем с обычным CSS: это не файл со стилями, а JS который сканирует DOM и генерирует CSS прямо  браузере — значит даже при доступном CDN стили могут не применится если скрипт упал, не успел отработать до рендера, или ещё чего. Такое происходит(</p>

<p>В этот момент пользователь видит что кнопки расползлись, карточки исчезли, отступы умерли, интерфейс ВСЁ</p>

<p>Чисто технически можно попробовать:</p>
<ul>
  <li>Вшивать css себе в свой бэк т.е в свою static директорию.
    <ul>
      <li>Плюсы: независимость от внешнего CDN, полный контроль над тем что и откуда грузится, LLMке проще работать с локальным файлом</li>
      <li>Минусы: начинаешь сам отвечать за доставку, кеширование и обновление этих стилей</li>
    </ul>
  </li>
  <li>Добавить немного JS который прячет <code class="language-plaintext highlighter-rouge">body</code> до загрузки CDN и показывает обратно по <code class="language-plaintext highlighter-rouge">onload</code>/<code class="language-plaintext highlighter-rouge">onerror</code>, плюс таймаут на случай зависания:
    <div class="language-html highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nt">&lt;style&gt;body</span> <span class="p">{</span> <span class="nl">visibility</span><span class="p">:</span> <span class="nb">hidden</span> <span class="p">}</span><span class="nt">&lt;/style&gt;</span>
<span class="nt">&lt;script
  </span><span class="na">src=</span><span class="s">"https://cdn.jsdelivr.net/npm/@tailwindcss/browser@4"</span>
  <span class="na">onload=</span><span class="s">"document.body.style.visibility=''"</span>
  <span class="na">onerror=</span><span class="s">"document.body.style.visibility=''"</span><span class="nt">&gt;</span>
<span class="nt">&lt;/script&gt;</span>
<span class="nt">&lt;script&gt;</span><span class="nx">setTimeout</span><span class="p">(()</span> <span class="o">=&gt;</span> <span class="nb">document</span><span class="p">.</span><span class="nx">body</span><span class="p">.</span><span class="nx">style</span><span class="p">.</span><span class="nx">visibility</span> <span class="o">=</span> <span class="dl">''</span><span class="p">,</span> <span class="mi">3000</span><span class="p">)</span><span class="nt">&lt;/script&gt;</span>
</code></pre></div>    </div>
    <ul>
      <li>Плюсы: пользователь не видит сломанный интерфейс, только пустую страницу на момент загрузки</li>
      <li>Минусы: если CDN совсем умер — 3 секунды белого экрана перед тем как таймаут сработает</li>
    </ul>
  </li>
  <li>Реально собирать css с помощью (условно) ноды отдельным процессом
    <ul>
      <li>Получится уже не чистый zero-build, зато это самый взрослый вариант если проект ВДРУГ вырос</li>
    </ul>
  </li>
</ul>

<p>Я ничего этого не использовал потому что нет необходимости эти проблемы решать, я перезагружу страничку итд. Всё работает четко в 90% случаев ну и конкретно для моего юзкейса этого достаточно.</p>

<p>Обязательно попробую какие-то решения выше и отпишу… Вообщем, использовать <code class="language-plaintext highlighter-rouge">htmx</code> вместе с <code class="language-plaintext highlighter-rouge">daisyUI</code> это некая БАЗА из моего практического опыта</p>]]></content><author><name></name></author><summary type="html"><![CDATA[После того как мы кратко познакомились с htmx и всё таки решили пойти в крестовый поход против javascript, vite, react, ангуляра и здравого смысла, пора задуматься какие же задачи мы можем решить с помощью htmx а какие - нет.]]></summary></entry><entry><title type="html">Баны Claude Code и CC Gateway</title><link href="https://vladtrc.github.io/contextrot/2026/04/claude-code-bans-cc-gateway/" rel="alternate" type="text/html" title="Баны Claude Code и CC Gateway" /><published>2026-04-01T00:00:00+00:00</published><updated>2026-04-01T00:00:00+00:00</updated><id>https://vladtrc.github.io/contextrot/2026/04/claude-code-bans-cc-gateway</id><content type="html" xml:base="https://vladtrc.github.io/contextrot/2026/04/claude-code-bans-cc-gateway/"><![CDATA[<p>У вас забанили аккаунт Claude Code? Известная проблема. Благодаря вчерашней утечке исходников удалось зареверсить внутрянку и понять механику телеметрии которая летит в Anthropic.</p>

<p><strong>Что мы теперь знаем:</strong></p>

<p>Claude Code собирает 640+ типов телеметрии по 3 параллельным каналам, снимает fingerprint вашей машины по 40+ параметрам и стучит домой каждые 5 секунд. Device ID, email, версия ОС, установленные рантаймы, тип шелла, архитектура CPU и объём RAM — всё это непрерывно улетает на серверы.</p>

<p><strong>“Решение”: CC Gateway</strong></p>

<p>https://github.com/motiful/cc-gateway</p>

<p>Умельцы сотворили reverse proxy, который встаёт между Claude Code и серверами Anthropic. Вся телеметрия проходит через него и нормализуется до единого «канонического» профиля.</p>

<p><strong>Что именно подменяется:</strong></p>

<p>— device_id, email, session metadata → единый канонический ID
— весь env-объект (40+ полей: ОС, архитектура, Node.js, терминал, пакетные менеджеры, CI-флаги) → полностью свапается
— физическая RAM, heap size → маскируются под стандартные значения
— системный промпт: блок <code class="language-plaintext highlighter-rouge">&lt;env&gt;</code>, который CC вставляет в каждый запрос (Platform, Shell, OS Version, рабочая директория) → тоже перезаписывается
— OAuth-токен менеджится централизованно: клиентские машины вообще не контактируют с platform.claude.com</p>

<p><strong>Три слоя защиты:</strong></p>

<ol>
  <li>env vars — Claude Code добровольно роутит трафик через гейтвей</li>
  <li>clash rules — блокируют прямые соединения с anthropic.com на сетевом уровне (страховка от хардкода в новых версиях)</li>
  <li>сам гейтвей — перезаписывает все 40+ fingerprint-измерений в реальном времени</li>
</ol>

<p>Клиентские машины не требуют браузерного логина — гейтвей сам обновляет OAuth-токены.</p>

<p><strong>Почему я осуждаю использование этой темы и думаю что это плохая идея:</strong></p>

<ol>
  <li>
    <p>Централизованный OAuth-менеджер означает что все ваши токены проходят через чужой прокси. Что происходит с этими токенами — неизвестно))</p>
  </li>
  <li>
    <p>Это прямое нарушение ToS. Не серая зона — нарушение. Попытка обмануть систему детектирования, думаю, не так сложно ловится)) Где вы возьмёте ещё одну старую гугл почту и зарубежную карту?</p>
  </li>
</ol>]]></content><author><name></name></author><summary type="html"><![CDATA[У вас забанили аккаунт Claude Code? Известная проблема. Благодаря вчерашней утечке исходников удалось зареверсить внутрянку и понять механику телеметрии которая летит в Anthropic.]]></summary></entry><entry><title type="html">Почему случайная проекция не совсем магия</title><link href="https://vladtrc.github.io/contextrot/2026/03/jl-projection/" rel="alternate" type="text/html" title="Почему случайная проекция не совсем магия" /><published>2026-03-30T00:00:00+00:00</published><updated>2026-03-30T00:00:00+00:00</updated><id>https://vladtrc.github.io/contextrot/2026/03/jl-projection</id><content type="html" xml:base="https://vladtrc.github.io/contextrot/2026/03/jl-projection/"><![CDATA[<!-- AUTOGENERATED FROM sandbox/jl_projection/source.md -->

<p>Помним ту недавнюю статью? Под капотом там из математики лемма Джонсона и Линденштрауса, она очень круто но непонятно звучит.</p>

<p>“Если у тебя есть много точек в пространстве очень высокой размерности, их можно спроецировать в пространство намного меньшей размерности и при этом все попарные расстояния между точками почти не изменятся.”</p>

<p>Чё? Меняем количество размерностей вниз и расстояние между точками сохраняется? Ну давайте проверим. Сделаем проекцию кубика на плоскость и назовём вершины <code class="language-plaintext highlighter-rouge">A...H</code>, а их тени на плоскости <code class="language-plaintext highlighter-rouge">A'...H'</code>.</p>

<p><img src="/contextrot/assets/jl_projection/projection_3d_to_2d.png" alt="Куб в удобном ракурсе (поворот по x: 28°, по y: -22°, по z: 18°) с вершинами A-H и их проекциями A'-H'" /></p>

<p>На рисуночке можно выделить <code class="language-plaintext highlighter-rouge">CE</code> и <code class="language-plaintext highlighter-rouge">C'E'</code>. Давайте явно посчитаем обе. У этих точек одинаковая координата <code class="language-plaintext highlighter-rouge">z</code>, так что проекция вообще ничего не теряет:</p>

<p><img src="/contextrot/assets/jl_projection/cube_projection_distances.png" alt="Расчёт расстояний CE и C'E' до и после проекции" /></p>

<p>Обалдеть!!! Оно работает?? Нет, я так просто не поверю. Посчитаем все <code class="language-plaintext highlighter-rouge">28</code> попарных расстояний между вершинами куба до и после проекции.</p>

<p>По горизонтали и вертикали сами вершины <code class="language-plaintext highlighter-rouge">A...H</code>. В каждой заполненной ячейке написано <code class="language-plaintext highlighter-rouge">до - после</code>, а строкой ниже - насколько расстояние схлопнулось. Цвет ячейки тоже показывает величину искажения: чем зеленее, тем меньше проекция наврала; чем краснее, тем сильнее всё поехало.</p>

<p><img src="/contextrot/assets/jl_projection/cube_distance_shift.png" alt="Матрица расстояний между вершинами куба: в ячейках показано, как расстояние до проекции отличается от расстояния после, а цвет плавно меняется от зелёного при малом искажении к красному при большом" /></p>

<p>Вот тут то всё становится ясно. Обман)) AH у нас из 3.5 уменьшилось до 1.2!</p>

<p>Но мы на кубе не останавливаемся, друзья мои. Смысл леммы именно в словах “очень высокой размерности”. Попробуем чуть повысить размерность. Посчитаем среднее отклонение у нашего куба:</p>

<p><img src="/contextrot/assets/jl_projection/cube_mean_distortion.png" alt="Куб: 3D -&gt; 2D: точки показывают попарные расстояния до и после проекции, подпись внутри графика показывает среднее относительное искажение (20.8%)" /></p>

<p>Среднее относительное искажение тут довольно жирное. Куб вообще плохой кандидат на роль “типичных данных”: он слишком регулярный, слишком игрушечный и слишком привязан к своим осям.</p>

<p>А теперь возьмем столько же случайных точек, примерно в таком же диапазоне попарных расстояний, но уже в <code class="language-plaintext highlighter-rouge">4D</code> и <code class="language-plaintext highlighter-rouge">5D</code>, и посмотрим два одиночных прогона рядом:</p>

<p><img src="/contextrot/assets/jl_projection/random_4d_5d_side_by_side.png" alt="Два маленьких точечных графика рядом для случайных точек при проекциях 4D -&gt; 3D и 5D -&gt; 4D; среднее искажение в этих прогонах равно 37.7% и 20.2%" /></p>

<p>Получается, пока, не совсем понятно. В одном прогоне <code class="language-plaintext highlighter-rouge">4D</code> может выглядеть даже хуже куба, а <code class="language-plaintext highlighter-rouge">5D</code> уже лучше. Это нормально: точек мало, примеры шумные, глазом тут легко обмануться.</p>

<p>Уже лучше. И это важный кусок интуиции: когда ты теряешь одну координату из трёх, ты ампутируешь треть пространства. Когда теряешь одну координату из пяти, это уже не так драматично.</p>

<p>Короче, строим график:</p>

<p><img src="/contextrot/assets/jl_projection/distortion_vs_target_dim.png" alt="График среднего относительного искажения при случайной проекции из D в D-1: по мере роста исходной размерности потеря одной координаты в среднем вредит меньше" /></p>

<p>Это ещё не сама формулировка леммы Джонсона и Линденштрауса, а только разминка перед ней. Но уже видно главное: чем выше исходная размерность, тем менее катастрофичной становится потеря небольшого числа направлений.</p>

<p>Но среднее искажение само по себе немного жулик. Оно может выглядеть прилично, даже если несколько пар точек уже улетели в кювет.</p>

<p>Поэтому вводим более злой критерий. Берем допуск <code class="language-plaintext highlighter-rouge">ε</code> и говорим: нас устраивает только такая проекция, где для каждой пары точек новое расстояние <code class="language-plaintext highlighter-rouge">d'</code> попадает в коридор вокруг старого <code class="language-plaintext highlighter-rouge">d</code>:</p>

<p><img src="/contextrot/assets/jl_projection/eps_corridor_formula.png" alt="ε-коридор для расстояния после проекции" /></p>

<p>На графике “до и после” это не какая-то абстракция, а просто клин вокруг диагонали <code class="language-plaintext highlighter-rouge">d' = d</code>. Чем меньше <code class="language-plaintext highlighter-rouge">ε</code>, тем уже клин и тем вреднее проверка. Чем больше <code class="language-plaintext highlighter-rouge">ε</code>, тем легче объявить победу, но тем слабее смысл фразы “расстояния почти сохранились”.</p>

<p><img src="/contextrot/assets/jl_projection/epsilon_corridor_scatter.png" alt="Точечный график попарных расстояний до и после случайной проекции 32D -&gt; 16D: оранжевый клин показывает ε-коридор шириной 25% вокруг диагонали, внутри него осталось 172 из 190 пар точек" /></p>

<p>Вот теперь можно честно формализовать, что значит “почти не изменились”. В оригинальной статье Джонсона и Линденштрауса 1984 года запись суше и слегка в других терминах, но смысл уже ровно этот: все пары должны остаться внутри одного и того же <code class="language-plaintext highlighter-rouge">ε</code>-коридора.</p>

<p>Важная мысль: магия не в том, что математика заранее нашла “мусорные оси”. Наоборот, в хорошем режиме работает почти случайное сжатие. В высоких размерностях структура расстояний часто оказывается размазана так, что случайный низкоразмерный взгляд всё ещё сохраняет главное.</p>

<p>Именно поэтому в машинном обучении подобные штуки звучат не как философия про геометрию, а как очень практичный вопрос про память, задержку и цену работы модели.</p>

<p>Если записать это в привычной современной нотации, формулировка леммы примерно такая. Для любого набора из <code class="language-plaintext highlighter-rouge">n</code> точек и любого <code class="language-plaintext highlighter-rouge">0 &lt; ε &lt; 1</code> существует отображение в <code class="language-plaintext highlighter-rouge">k</code> измерений такое, что для любых двух точек <code class="language-plaintext highlighter-rouge">u, v</code>:</p>

<p><img src="/contextrot/assets/jl_projection/jl_lemma_formula.png" alt="Формулировка леммы Джонсона и Линденштрауса" /></p>

<p>То есть все попарные расстояния сохраняются с мультипликативной ошибкой не больше <code class="language-plaintext highlighter-rouge">ε</code>.</p>

<p>А главное вот что: нужная размерность <code class="language-plaintext highlighter-rouge">k</code> растёт не от исходной размерности пространства, а примерно как логарифм числа точек, делённый на <code class="language-plaintext highlighter-rouge">ε^2</code>. В одной из стандартных оценок достаточно взять:</p>

<p><img src="/contextrot/assets/jl_projection/jl_dimension_bound_formula.png" alt="Оценка на достаточную размерность k" /></p>

<p>Вот где и сидит настоящий прикол. Тебе не нужно тащить исходные <code class="language-plaintext highlighter-rouge">10000</code> или <code class="language-plaintext highlighter-rouge">100000</code> координат. Если точек конечное число, а небольшое искажение терпимо, то можно ужать пространство в разы и иногда на порядки, не убив геометрию.</p>]]></content><author><name></name></author><summary type="html"><![CDATA[]]></summary></entry><entry><title type="html">Думайте. Ну или не думайте</title><link href="https://vladtrc.github.io/contextrot/2026/03/ai-sycophancy-delusion/" rel="alternate" type="text/html" title="Думайте. Ну или не думайте" /><published>2026-03-17T00:00:00+00:00</published><updated>2026-03-17T00:00:00+00:00</updated><id>https://vladtrc.github.io/contextrot/2026/03/ai-sycophancy-delusion</id><content type="html" xml:base="https://vladtrc.github.io/contextrot/2026/03/ai-sycophancy-delusion/"><![CDATA[<p>Гарри Тан, CEO многоизвестного Y Combinator, на прошлой неделе выложил на GitHub репозиторий с промптами для Claude Code. Назвал своё изобретение gstack. Внутри это markdown-файлы с ролями: CEO Review, Engineering Manager, Release Manager, QA, ну идея совсем не сложная: держать AI в отдельных “режимах”, чтобы он не смешивал планирование с шиппингом.</p>

<p>Один скилл в gstack получил респект со стороны вайбкодеров: <code class="language-plaintext highlighter-rouge">/plan-ceo-review</code>. Оценить рынок, найти реальную возможность, спросить “зачем это строить” до того как начнёшь. Тан пропустил через себя тысячи стартапов — его продуктовая интуиция в промпте это не маркетинг, это реальный актив. Если хочешь проверить идею или понять масштаб — вот где он действительно компетентен.</p>

<p>Но этот скилл один из пятнадцати. Рядом Engineering Manager, Release Manager, QA. И вот с этим уже вопрос: человек, который хорошо умеет оценивать рынки, упаковал это в полный инженерный процесс — как будто продуктовая интуиция автоматически распространяется на архитектуру и шиппинг. Менеджеры, неделю назад узнавшие что такое Claude Code, уже рассказывают разработчикам как правильно работать с AI. Опять же, никто не спорит, гейткипинг это плохо и надо поощрять людей которые приходят!</p>

<p>Отдельная ирония: tech-журналюги освещают gstack в восторженных тонах. Таких статей несколько, все под копирку — автор просит Claude оценить gstack, Claude хвалит. Круг галлюцинаций с положительной обратной связью: Claude помогал Тану строить уверенность в своём стэке, 20 тысяч звёзд на GitHub подтвердили что всё верно, и теперь тот же Claude пишет пресс-ревью на свою же работу.</p>

<p>Исследование 2023 года от Anthropic: крупные модели стабильно ведут себя подобострастно — стараются выдать ответ, совпадающий с точкой зрения пользователя. Модели обучены с вами соглашаться((</p>

<p>В 2025 году в Nature Machine Intelligence — участники систематически переоценивали точность ответов LLM. Длинные ответы делали людей увереннее, даже когда дополнительный объём не добавлял никакой точности. AI просто звучал более основательно! Люди верили длине, не содержанию.</p>

<p>И последний из интересных: в октябре 2025 года вышло исследование Aalto University, ~ 500 участников решали задачи из LSAT (логические вопросы уровня юридической школы). Половина использовала ChatGPT, половина нет.</p>

<p>Группа с ChatGPT справлялась объективно лучше, это ожидаемо. Но абсолютно каждый пользователь AI переоценил свой результат. Те, кто считал себя “AI-грамотными” — люди с техническим пониманием инструментов — переоценивали больше всего! Причем большинство участников копировали вопрос в ChatGPT, получали ответ и принимали его. Один промпт. Никаких follow-up вопросов))) Более научное название такого явления — cognitive offloading, то есть человек передаёт мышление машине и не просит его обратно, “подумай за меня”.</p>

<h2 id="корпы-делают-вид-что-это-исправляют">Корпы делают вид что это исправляют…</h2>

<p>Апрель 2025. OpenAI обновили GPT-4o — сделали его более “интуитивным и поддерживающим”. Честно, я тогда активно пользовался но ничо не заметил. Однако юзеры сразу начали сообщать о странном поведении: модель поддерживала бизнес-идею описанную как полный мусор, поощряла человека, сказавшего что он прекращает принимать лекарства, отвечала на тревожные признания фразой “я горжусь тобой, что ты это говоришь”.</p>

<p>Многоуважаемый Сэм Альтман написал в Твиттере что “последние обновления сделали GPT-4o слишком подхалимским”. Откат якобы занял четыре дня. Хотя, честно, до сих пор я в плане критики меньше доверяю гпт. Ну слишком он дружелюбно настроен.</p>

<p>Есть такие мысли, что в OpenAI ллм оптимизировалась под “нравится ли это пользователю прямо сейчас” вместо “реально ли это помогает пользователю”.</p>

<h2 id="менеджеры-стали-инженерами">Менеджеры стали инженерами…</h2>

<p>IBM в мае 2025 опросил 2000 CEO из 33 стран. 61% сказали что активно внедряют AI-агентов.</p>

<p>Это люди, которые получили инструмент, постоянно с ними соглашающийся. Который строит детальные бизнес-кейсы под любую идею которую им принесёшь. Который не играет роль адвоката дьявола — он играет роль придворного. Именно поэтому gstack от CEO YC выглядит снаружи совершенно нормально, почти авторитетно. Потому что CEO провёл сотни часов в диалоге с системой, которая никогда не говорила ему “это плохая идея”.</p>

<h2 id="что-реально-помогает">Что реально помогает</h2>

<p>Исследователи из Aalto сформулировали проблему в одном предложении: AI делает вас эффективнее, но хуже понимать <em>насколько вы реально эффективны</em>.</p>

<p>Я не исследователь. Но я использую ровно ОДНУ технику спасения от такого поведения. <strong>Конкретная враждебная роль!</strong> “Ты — конкурент, который считает что наш план провалится. Объясни почему, с конкретикой.”. Нужна роль с мотивацией, которая имеет с вами явный конфликт интересов. Грубо говоря, всю эту вежливость и подобострастность направляем против себя.
Пишу своё резюме — прошу ревью со стороны работодателя. 
Спорю с управляющей компанией — прошу сыграть роль ИХ юриста.
Пишу код — готовлюсь к замещению агентами.</p>

<hr />

<details>
<summary>Источники</summary>

- [garrytan/gstack — GitHub](https://github.com/garrytan/gstack)
- [Y Combinator's CEO Shared His Claude Code Prompt. It Solves the Wrong Problem — Medium](https://medium.com/@rentierdigital/y-combinators-ceo-shared-his-claude-code-prompt-it-solves-the-wrong-problem-c1d0c7a245c3)
- [Towards Understanding Sycophancy in Language Models — arXiv (ICLR 2024)](https://arxiv.org/abs/2310.13548)
- [What large language models know and what people think they know — Nature Machine Intelligence (2025)](https://www.nature.com/articles/s42256-024-00976-7)
- [AI use makes us overestimate our cognitive performance — Aalto University (2025)](https://www.aalto.fi/en/news/ai-use-makes-us-overestimate-our-cognitive-performance)
- [Sycophantic AI increases attitude extremity and overconfidence — PsyArXiv (2025)](https://osf.io/preprints/psyarxiv/vmyek_v1)
- [Sycophancy in GPT-4o — OpenAI](https://openai.com/index/sycophancy-in-gpt-4o/)
- [OpenAI rolls back ChatGPT sycophancy update — TechCrunch (2025)](https://techcrunch.com/2025/04/29/openai-rolls-back-update-that-made-chatgpt-too-sycophant-y/)
- [IBM 2025 CEO Study — IBM Newsroom](https://newsroom.ibm.com/2025-05-06-ibm-study-ceos-double-down-on-ai-while-navigating-enterprise-hurdles)

</details>]]></content><author><name></name></author><summary type="html"><![CDATA[Гарри Тан, CEO многоизвестного Y Combinator, на прошлой неделе выложил на GitHub репозиторий с промптами для Claude Code. Назвал своё изобретение gstack. Внутри это markdown-файлы с ролями: CEO Review, Engineering Manager, Release Manager, QA, ну идея совсем не сложная: держать AI в отдельных “режимах”, чтобы он не смешивал планирование с шиппингом.]]></summary></entry><entry><title type="html">ЭР ЭЛ ЭМ</title><link href="https://vladtrc.github.io/contextrot/2026/03/rlm-context-as-environment/" rel="alternate" type="text/html" title="ЭР ЭЛ ЭМ" /><published>2026-03-16T00:00:00+00:00</published><updated>2026-03-16T00:00:00+00:00</updated><id>https://vladtrc.github.io/contextrot/2026/03/rlm-context-as-environment</id><content type="html" xml:base="https://vladtrc.github.io/contextrot/2026/03/rlm-context-as-environment/"><![CDATA[<p>Чем больше токенов в контексте, тем хуже модель рассуждает над каждым из них. Фундаментальное свойство “attention”, общее для всех моделей. На 1M токенах даже опус 4.6 перестаёт быть полезен.</p>

<p>Идея RLM: <strong>использовать контекст как внешнюю среду, а не место куда надо всё запихать</strong>.</p>

<p>Весь длинный контекст хранится как переменная в персистентном Python (или каком-то другом) REPL. Модель его не видит, пишет код чтобы с ним взаимодействовать: читает кусками, строит индексы, делает срезы. Как разработчик с SQL базой: смотришь на данные через запросы, не грузишь всю базу в память.</p>

<p><em>Задача: найти паттерн ошибок в JSON-логе на 50MB (~10M токенов, 2.8M событий).</em></p>

<table>
  <thead>
    <tr>
      <th>Шаг</th>
      <th>Обычный агент (read_file) — что в контексте</th>
      <th>Токены</th>
      <th>RLM — что в контексте</th>
      <th>Токены</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Системный промпт</td>
      <td><code class="language-plaintext highlighter-rouge">"You are a helpful assistant..."</code></td>
      <td>50</td>
      <td><code class="language-plaintext highlighter-rouge">"Your context: 52 428 800 chars. Available: context, llm_query(), FINAL()"</code></td>
      <td>70</td>
    </tr>
    <tr>
      <td>Запрос</td>
      <td><code class="language-plaintext highlighter-rouge">"Найди паттерн ошибок в логах"</code></td>
      <td>60</td>
      <td><code class="language-plaintext highlighter-rouge">"Найди паттерн ошибок в логах"</code></td>
      <td>80</td>
    </tr>
    <tr>
      <td>Чтение файла</td>
      <td>Tool call <code class="language-plaintext highlighter-rouge">read_file("app.log")</code> → <code class="language-plaintext highlighter-rouge">{"level":"error","msg":"timeout","svc":"auth"...</code> <em>(середина JSON-объекта, структура сломана)</em></td>
      <td>560</td>
      <td><code class="language-plaintext highlighter-rouge">&gt;&gt;&gt; import json; data = json.loads(context)</code> → <code class="language-plaintext highlighter-rouge">[stdout: 31 chars · "Loaded: 2 847 291 events"]</code></td>
      <td>110</td>
    </tr>
    <tr>
      <td>Агрегация</td>
      <td>ещё вызовы <code class="language-plaintext highlighter-rouge">read_file</code> с разными офсетами — фрагменты без связи, агрегировать нельзя</td>
      <td>1060</td>
      <td><code class="language-plaintext highlighter-rouge">&gt;&gt;&gt; errors = [e for e in data if e['level']=='error']; print(len(errors), errors[0])</code> → <code class="language-plaintext highlighter-rouge">[stdout: 61 chars · "18 442 errors · {'ts':'2026-01-14T03:12:01','svc':'auth'..."]</code></td>
      <td>160</td>
    </tr>
    <tr>
      <td>Группировка по сервису</td>
      <td><em>(нет единого представления данных — файл читается кусками)</em></td>
      <td>—</td>
      <td><code class="language-plaintext highlighter-rouge">&gt;&gt;&gt; from collections import Counter; print(Counter(e['svc'] for e in errors).most_common(5))</code> → <code class="language-plaintext highlighter-rouge">[stdout: 78 chars · "[('auth', 9821), ('payments', 5302)...]"]</code></td>
      <td>210</td>
    </tr>
  </tbody>
</table>

<p>Основной смысл на который тут стоит обратить внимание — слева всё копится в контексте в надежде на то что attention сможет сделать агрегацию во время инференса. Справа же нагрузка на attention сильно ниже тк контекст следит за переменными/синтаксисом питона/etc, не за сырыми данными. Если в контексте лежат структурированные данные — JSON, CSV, XML — модель может распарсить их питоном и делать с ними что угодно: фильтровать, агрегировать, трансформировать. Точечный поиск по всему объёму данных — один вызов <code class="language-plaintext highlighter-rouge">string.find()</code>!</p>

<p>И, конеш, как и для любого нового концепта, есть впечатляющие бенчмарки:</p>

<p>BrowseComp+ (1000 документов, 6–11M токенов — ответ на каждый вопрос разбросан по нескольким из них, нужно сшить):</p>
<ul>
  <li>RAG + BM25: <strong>51%</strong></li>
  <li>Summary agent: <strong>70.5%</strong></li>
  <li>RLM (GPT-5 корень + GPT-5 mini субвызовы): <strong>91.3%</strong></li>
</ul>

<p>OOLONG-Pairs (нужно обработать все пары записей в документе и агрегировать результат — квадратичная по сложности задача):</p>
<ul>
  <li>Чистый GPT-5: <strong>&lt;0.1%</strong></li>
  <li>RLM с GPT-5: <strong>58%</strong></li>
</ul>

<h2 id="claude-code-же-уже-так-делает">Claude Code же уже так делает?</h2>

<p>“Так это ж просто субагенты, мы так уже делаем.. мой клодкод всё это умеет… он скрипты внутри запускает!”. И частично это справедливо — паттерн не новый и результаты похожи. Но есть три конкретных отличия которые важны.</p>

<p>Посмотрим на то, куда физически попадают данные в каждом случае.</p>

<p>Наивный агент: <code class="language-plaintext highlighter-rouge">read_file</code> → текст файла в контексте оркестратора. Вместе с system prompt и километрами обсуждений/вызовов инструментов/etc.</p>

<p>Claude Code с субагентами: файл читается внутри изолированного субагента, в контекст оркестратора идёт только резюме. Лучше — но резюме всё равно токены в истории. И с каждым следующим субагентом их становится больше. К тому же данную фичу клод использует достаточно…консервативно. И скорость потребления токенов ВЗЛЕТАЕТ так, что недельную “норму” можно оприходовать за два “продуктивных” вечера.</p>

<p>В RLM же мы видим такую картину: файл → Python-переменная в REPL. Ни в чьём контексте. В системном промпте модели написано только: “у тебя есть переменная <code class="language-plaintext highlighter-rouge">context</code>, используй <code class="language-plaintext highlighter-rouge">llm_query()</code> для субзапросов, <code class="language-plaintext highlighter-rouge">FINAL()</code> для финального ответа”. Модель пишет код — <code class="language-plaintext highlighter-rouge">data[100000:150000]</code>, <code class="language-plaintext highlighter-rouge">Counter(e['svc'] for e in errors)</code> — получает маленький stdout. Только он идёт в историю. Сам файл остался переменной. Это именно то что показано в таблице выше: оркестратор на 10M токенов данных держит в контексте ~210 токенов.</p>

<p><strong>Рекурсия происходит внутри кода, не в истории сообщений.</strong> Вызов агента в Claude Code — событие в диалоге, оно логируется. В RLM рекурсия — Python-функция в REPL:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="o">&gt;&gt;&gt;</span> <span class="n">auth_errors</span> <span class="o">=</span> <span class="p">[</span><span class="n">e</span> <span class="k">for</span> <span class="n">e</span> <span class="ow">in</span> <span class="n">data</span> <span class="k">if</span> <span class="n">e</span><span class="p">[</span><span class="s">'svc'</span><span class="p">]</span> <span class="o">==</span> <span class="s">'auth'</span><span class="p">][:</span><span class="mi">500</span><span class="p">]</span>
<span class="o">&gt;&gt;&gt;</span> <span class="n">pattern</span> <span class="o">=</span> <span class="n">llm_query</span><span class="p">(</span><span class="n">auth_errors</span><span class="p">,</span> <span class="s">"найди паттерн ошибок"</span><span class="p">)</span>
<span class="p">[</span><span class="n">stdout</span><span class="p">:</span> <span class="mi">43</span> <span class="n">chars</span> <span class="err">·</span> <span class="s">"timeout на /api/refresh после 2AM UTC"</span><span class="p">]</span>
</code></pre></div></div>

<p>Субагент получил 500 записей, думал сколько угодно токенов — оркестратор увидел одну строку. <code class="language-plaintext highlighter-rouge">pattern</code> — просто переменная.</p>

<p>Авторы в статьях разграничивают: агент — это автономия, пространство действий, цикл наблюдения. RLM — это REPL для управления длинным контекстом. В общем, RLM может быть внутри агента, но текущие агенты != RLM.</p>

<h2 id="почему-этого-нет-в-продакшне">Почему этого нет в продакшне</h2>

<p>Нам рассказывают что в Anthropic уже кодят агенты и решают любые задачки, время между теорией и продом сокращается в разы. Так почему ж мы этого не видим?</p>

<p>Вышел <a href="https://arxiv.org/abs/2603.02615">независимый reproduction paper</a> (“Think, But Don’t Overthink”) и несколько практических тестов на DeepSeek v3.2 / Kimi K2.</p>

<p><strong>Глубина рекурсии &gt; 1 ломает всё.</strong> Kimi K2, который сам по себе делает 86.6% на задачах с длинным контекстом, под RLM depth=1 (корневая модель вызывает субагента — один уровень) падает до 60%, при depth=2 (субагент сам запускает ещё субагента — два уровня вложенности) — до 55%. RLM сделал сильную модель хуже. DeepSeek на depth=2 тоже деградирует: 42% → 34%. Теоретическая красота истинной рекурсии разбивается о то что модели в ней не умеют надёжно работать(( ну по крайней мере ПОКА что не умеют</p>

<p><strong>Три задокументированных сценария отказа:</strong> параметрическая галлюцинация (модель игнорирует контекст и отвечает из обучающих весов), потеря структуры вывода (возвращает сырой Python вместо ответа), бесконечные циклы псевдоверификации (без финального ответа). Задержка при двух уровнях рекурсии вырастает с 3.6 секунды до 344 секунд, абсолютная руина</p>

<p><strong>Работает только на моделях с сильным кодингом.</strong> Модель должна сама написать корректный Python для неизвестной структуры данных — слабее базовый уровень кодинга, хуже результат( Конечно там можно добавить хакерские вещи типа проверки кода и итерации пока не получим корректный вариант… Но, кмк, основная идея в том что ЛЛМка достаточно умна чтобы ваншотить код а не сидеть его дебажить итерационно.</p>

<p>Помимо теоретической есть инфраструктурная сложность: постоянная сессия Python REPL с доступом к данным пользователя — это переписывать весь текущий sandbox, совсем другой мониторинг и точки отказа. Стандартная инфраструктура не хранит состояние (писал об этом в прошлых постах) итд</p>

<p>Будет ли в эксплуатации? Вероятнее всего, да. Теория вышла в декабре 2025, воспроизводящая работа — в марте 2026. Цикл от “интересный препринт” до “в работе” обычно год+. Сценарии отказов имеются — но, понятно, что это не SOTA модели и в целом они не были натренированы на существование внутри REPLa.</p>

<details>
<summary>Источники</summary>

- [Recursive Language Models — arXiv (2025)](https://arxiv.org/abs/2512.24601)
- [Think, But Don't Overthink: Reproducing Recursive Language Models — arXiv (2026)](https://arxiv.org/abs/2603.02615)

</details>

<hr />]]></content><author><name></name></author><summary type="html"><![CDATA[Чем больше токенов в контексте, тем хуже модель рассуждает над каждым из них. Фундаментальное свойство “attention”, общее для всех моделей. На 1M токенах даже опус 4.6 перестаёт быть полезен.]]></summary></entry><entry><title type="html">Разработчики не терпилы</title><link href="https://vladtrc.github.io/contextrot/2026/03/engineers-invade/" rel="alternate" type="text/html" title="Разработчики не терпилы" /><published>2026-03-15T00:00:00+00:00</published><updated>2026-03-15T00:00:00+00:00</updated><id>https://vladtrc.github.io/contextrot/2026/03/engineers-invade</id><content type="html" xml:base="https://vladtrc.github.io/contextrot/2026/03/engineers-invade/"><![CDATA[<p>Пол Конингэм из Сиднея — айтишник, дата/ML-спец. Его собачка Розочка заболела раком. Ветеринары дали ей от одного до шести месяцев. Рак мастоцитов — хирургия, химиотерапия, иммунотерапия только замедляли болезнь.</p>

<p>Пол потратил ~$3k на секвенирование ДНК опухоли, прогнал мутации через ChatGPT и AlphaFold, спроектировал кастомную mRNA-вакцину. Попросил команду UNSW RNA сделать её физически. Самый долгий шаг — не секвенирование и не моделирование. Три месяца ушло на этические согласования и бюрократические документы.</p>

<p>Опухоль уменьшилась на 75%. Профессора подтвердили: вакцина легитимна.</p>

<p>Пол не биолог и не фармацевт. Умеет обращаться с данными, строить пайплайны, формулировать задачи. Остальное дали инструменты.</p>

<p>Щас со всех сторон трубят о бесполезности айтишников.
У разработчиков определённо есть минусы. Я понимаю, почему с нами никто не хочет работать:</p>
<ul>
  <li>не ходим в душ</li>
  <li>жмотимся и не тратим бабосы на жизненные удовольствия</li>
  <li>не социализируемся</li>
  <li>имеем странное чувство юмора</li>
</ul>

<p>Но мы умеем быстро разбирать чужие системы, структурировать хаос и собирать пайплайны из разрозненной информации. Что, по-вашему, мы будем делать, когда нас начнут выгонять из уютных офисов Сбера и Яндекса, заменяя на <code class="language-plaintext highlighter-rouge">skills.md</code> + Claude Opus 4.9? Думаете, пойдём плакаться друг другу и билдить очередной убыточный B2C SaaS?)))</p>

<p>Инженеры, биологи, юристы — мы придём конкурировать за ваше рабочее место. Большая часть работы в этих профессиях — поиск, структурирование, координация. Мы умеем это делать. С ллмками цикл вхождения в чужой домен стал ещё короче.</p>

<h2 id="но-нет-моя-работа-слишком-сложна-и-за-пол-годика-вы-ничего-не-поймёте">Но нет!! Моя РАБота слишком сложна и за пол годика вы ничего не поймёте!!</h2>

<p>Во Вьетнаме военные корпсмены (медбратья ВМФ США) делали на практике то, что гражданская система потом отказывалась признавать: сортировку раненых, экстренные процедуры, самостоятельную работу там, где врача не было рядом. Базовая подготовка корпсмена — 19 недель. После этого часть шла прямо к морским пехотинцам в поле и выполняла там работу, на которую у гражданского медика уходят годы лицензированного обучения. Дома эта компетентность исчезала на бумаге. Чтобы работать легально, нужно было заново покупать входной билет — платное гражданское переобучение с нуля.</p>

<p>В 1965 году профессор Duke University Eugene Stead запустил первую программу Physician Assistant из бывших корпсменов. Stead легализовал компетентность, которую гражданская медицина упорно отказывалась признавать.</p>

<p>На войне тебе доверяют спасать людей. В мирной системе — сначала купи правильную бумажку. Медсёстры-анестезиологи (CRNAs), которые делают ту же работу что анестезиологи-врачи, получают организованное сопротивление каждый раз, когда пытаются расширить независимую практику.</p>

<p>Война убрала барьеры принудительно. Барьеры оказались организационными. Профессию защищал контроль входа, а не сложность самой работы. Когда в профессию врывается поток мотивированных людей с коротким циклом обучения, часть “ремесла избранных” превращается в воспроизводимый пайплайн.</p>

<h2 id="что-на-самом-деле-защитит-вас-на-рабочем-месте">Что на самом деле защитит вас на РАБочем месте</h2>

<p><strong>Регуляция и лицензии.</strong> Врач без диплома не подпишет рецепт. Юрист без адвокатского удостоверения не выступит в суде. Реальная стена. Гейткипинг как в истории выше.</p>

<p><strong>Физическое присутствие и доверие.</strong> Десять лет в одной компании — это не только экспертиза. Это репутация и политический капитал.</p>

<p><strong>Реальная экспертиза, которая не в тексте.</strong> Есть знание, которое не оцифровано. Хирург знает что-то руками. Переговорщик — интуицией. AI про такие вещи понятия не имеет, как и большинство людей снаружи.</p>

<p>Всё остальное — переложение бумажек, форматирование отчётов, проведение совещаний, координация через email — защищает всё хуже. Если значимая часть вашей работы уже лежит в текстах, таблицах и регламентах, другие могут быстро её применить.</p>

<h2 id="угроза-не-только-сверху">Угроза не только сверху</h2>

<p>Стандартный совет в эпоху AI: “станьте незаменимым экспертом”. Углубляйтесь, специализируйтесь, делайте то, что AI не умеет.</p>

<p>Но пока вы углубляетесь в свою нишу, в неё с другой стороны заходит человек с другим бэкграундом и инструментами, которые компенсируют отсутствие глубины скоростью. И предлагает работу дешевле.</p>

<p>Вертикальное замещение — это AI вместо вас. Горизонтальное — инженер из другой профессии вместо вас. Первое можно переждать. Второе бьёт быстрее: инженер не ждёт, пока подешевеет, он ищет где применить навыки и продать труд дороже.</p>

<p>Выгоняют из удалёнки на 400к в бигтехе? Нас это устраивает. Если ваша деятельность высоко оплачивается и включает агрегацию и структуризацию информации, мы уже смотрим на ваше тёплое креслице.</p>

<p>ИСПУГАЛИСЬ?? Да лажно вам, обратных примеров тоже достаточно.</p>

<p>Кори ЛаШанс — инженер-механик, промышленное трубопроводное строительство, Хьюстон. Работает с химическими заводами и нефтеперерабатывающими предприятиями. Он построил приложение, которое читает изометрические чертежи трубопроводов и автоматически извлекает всё: количество сварных швов, характеристики материалов, коды комплектующих.</p>

<p>Десять минут на один чертёж стали 60 секундами. Сто чертежей — пять минут.</p>

<p>Кори вайбкодил восемь недель, параллельно с основной работой. За это время с нуля освоил Claude Code, терминал, VS Code. Его цех использует приложение каждый день. Когда он объясняет коллегам что сделал, они смотрят на него как на инопланетянина.</p>

<p>«Я сделал это без чьей-либо помощи — только AI. Любимые инструменты: скриншоты, пошаговые инструкции и просьба к Claude объяснить как будто мне пять лет.»</p>

<p>Горизонтальные переходы идут в обе стороны. Разработчики идут в чужие домены. Специалисты из других областей осваивают инструменты, которые раньше требовали найма программиста. Барьеры не исчезают — стоимость их перехода падает. Интересных историй будет больше!</p>

<hr />

<details>
<summary>Источники</summary>

- [AI-Designed mRNA Vaccine Shrinks Dog's Cancer Tumor](https://awesomeagents.ai/news/ai-mrna-vaccine-dog-cancer-rosie/)
- [Paul turns to AI to save his dog from terminal cancer — UNSW](https://www.unsw.edu.au/news/2025/06/paul-turns-to-ai-to-save-his-dog-from-terminal-cancer)
- [Australian Tech Founder Uses ChatGPT and AlphaFold to Design Dog Cancer Vaccine — IBTimes](https://www.ibtimes.co.uk/sydney-data-engineer-mrna-cancer-vaccine-dog-1785607)
- [Eugene A. Stead, Jr., MD — Physician Assistant History Society](https://pahx.org/bios/stead-jr-eugene/)
- [Veterans: The Foundation of the PA Profession — Duke University](https://medschool.duke.edu/blog/veterans-foundation-pa-profession)
- [Education and Practice Barriers for Certified Registered Nurse Anesthetists — OJIN](https://ojin.nursingworld.org/table-of-contents/volume-19-2014/number-2-may-2014/barriers-for-certified-registered-nurse-anesthetists-/)
- [Hospital Corpsman Basic — METC](https://www.metc.mil/Academics/Courses/Hospital-Corpsman/Hospital-Corpsman-Basic/)
- [Cory LaChance — Todd Saunders on X](https://x.com/toddsaunders/status/2034243420147859716)

</details>]]></content><author><name></name></author><summary type="html"><![CDATA[Пол Конингэм из Сиднея — айтишник, дата/ML-спец. Его собачка Розочка заболела раком. Ветеринары дали ей от одного до шести месяцев. Рак мастоцитов — хирургия, химиотерапия, иммунотерапия только замедляли болезнь.]]></summary></entry><entry><title type="html">Сокращаем потребление токенов БЕСПЛАТНО!</title><link href="https://vladtrc.github.io/contextrot/2026/03/vibecoders-black-box/" rel="alternate" type="text/html" title="Сокращаем потребление токенов БЕСПЛАТНО!" /><published>2026-03-15T00:00:00+00:00</published><updated>2026-03-15T00:00:00+00:00</updated><id>https://vladtrc.github.io/contextrot/2026/03/vibecoders-black-box</id><content type="html" xml:base="https://vladtrc.github.io/contextrot/2026/03/vibecoders-black-box/"><![CDATA[<p>Недавно ко мне обратились с просьбой помочь с вайбкодингом. Назвали три проблемы: Claude жрёт слишком много токенов, новые фичи добавляются очень долго и ломают предыдущие, сложный или ненадёжный деплой.</p>

<p>Я отвечаю людям с таким запросом, как мне кажется, наиболее здраво. Предлагаю вместо подбора магического стэка, секретных практик CLAUDE.md, каких-то нишевых расширений MCP серверов с SKILLS.md … просто задуматься чё вообще они делают и начать понимать то, что выплёвывает LLM. То есть, непосредственно, стать разработчиком! ШОК. Мы же пытаемся от них избавиться… но ведь… программисты… ВСЁ…</p>

<p>Знаете, как будто бизнес ждёт очередного чуда — вот-вот будет машина, которая полностью заменит всех разрабов)) Ну, смотрите, там уже компиляторы клод пишет! Нужно просто сделать более грамотный CLAUDE.md, надо просто скопипастить startup project вот смотрите умные люди с github приготовили как раз для небольших стартапов… Просто хочется чтобы за меня ВСЁ сделали! То есть хочется черную коробочку которая бы решала все мои проблемы!</p>

<p>У меня один вопрос: вам вообще комфортно с тем, что ваш продукт работает на чёрной коробке, о внутренностях которой вы ничего не знаете? Мне, честно, не очень…</p>

<h2 id="проблема-1-выбор-технического-стэка">Проблема 1: Выбор технического стэка</h2>

<p>У меня выборка не большая но я вижу что ребята на вопросы о техническом стэке говорят ЛЛМкам “давай сделаем просто, потом допилим”. С одной стороны в чём они не правы. Реально же все хотят сделать “просто”! И спорить не с чем, я-то и сам, разраб, пытаюсь сделать как можно проще.</p>

<p>Но вот нюанс: а мы делаем проще для кого? Для ллки? Для себя? Для клиентов? А как мы можем выбрать простое решение если мы не сказали ЛЛМке что именно нам технически требуется? У меня нет четкой статистики но я ЧУВСТВУЮ паучьим чутьём что для ЛЛМки “просто” = react / python+jinja+vanilla js. Откуда она знает, у нас будет много интерактивности на стороне клиента или сервера? Нужно данные сохранять локально или иметь БД? Откуда ллмка знает, у нас будет мобильное приложение? Может у вас есть в голове идеи прикрутить реалтайм чат? 
Я честно хз в чём проблема потратить пару деньков посмотреть технических видосов со сравнением какой техстэк когда применять. Ну или самое простое - напрямую початиться об этом с LLM. Написать все планы на проект “мне нужен сайт похожий на профи ру где заказчик заполняет заявку Х и потом идёт проверка У …” - составить подробный диздок ПЕРЕД началом разработки. И дать ллмке время подумать как это РЕАЛЬНО ПРОСТО реализовать.</p>

<p>Мой совет архитектуры веба для начинающих вайбкодеров с целью экономить токены:</p>

<p><code class="language-plaintext highlighter-rouge">uv python fastapi(sync) jinja htmx alpine daisyui(cdn)</code>.</p>

<p>Использовать на свой страх и риск.</p>

<h2 id="проблема-2-не-следить-за-loc">Проблема 2: Не следить за LOC</h2>
<p>Я бы относился к коду как к стоимости которую мы платим за какую-то фичу. То есть любая доп строка — не важно это конфиг или бизнес-логика или SQL — стоит какое-то количество “валюты”. Это лишний контекст, лишние токены, лишняя сложность в конце концов. Самый ад начинается тогда, когда немало строк становятся “мёртвыми” — то есть строки кода никогда не исполняются! Они буквально не нужны… но они все равно тратят токены и усложняют код. Ллмка кушает их и может приходить к абсолютно неверным заключениям… отсюда и отвал уже рабочего функционала. Если вам впадлу прямо следить за каждым файликом то я советую хотя бы изредка запускать утилиту по подсчёту LOC проекта и сравнивать с какой-то предыдущей версией.</p>

<p>Относиться к этому так: мы добавили функционал фильтрации по частичному вводу идентификатора. Нам это стоило +440 строк и +2 файла. Можете даже у ЛЛМ спросить нормальная ли это “цена” за такую фичу или вас заскамили.</p>

<p>И ещё пара вещей пока не забыл:</p>

<ul>
  <li><strong>Текущий клод ваншотит порядка 90% не сложных задач.</strong> Если вы не можете “подвинуть кнопочку” или “перекрасить сайдбар” или “пересчитать колонку” уже полчаса — в проекте ЯВНО чёто не так. Я бы рекомендовал общаться с LLM уже не “вот надо теперь прибавить тут 12.46”  — я бы уже начинал спрашивать “а почему эта задача занимает столько времени?”. Я бы такие ситуации трактовал как сигналы о том, что настало время изменить инструментарий для выполнения вашей задачи.</li>
  <li><strong>Поток данных.</strong> Откуда у вас берутся данные? Сохраняются ли они вообще или используются один раз на каждый запрос? Какие API внешние используем? Что хранится на сервере или облаке? Что будет если не заплатим? Есть бекапы? А мб бэкапим данные которые в целом не особо то и важны?</li>
  <li><strong>Секреты.</strong> Ваша LLM без зазрения совести прочитает ваш <code class="language-plaintext highlighter-rouge">.env</code>, ребят)) Я, лично, шифрую ценные данные и даю возможность читать мой конфиг, там ничего полезного нет. Решение не идеальное тк ЛЛМ чисто технически может найти на компе ключ и расшифровать. Но у вас вообще хоть какое-то решение этой проблемы есть?</li>
</ul>

<h2 id="и-конечно-git">И, конечно, Git!</h2>
<p>Git решает конкретные задачи: История изменений. Возможность откатиться. Посмотреть текущий diff (как раз тот самый промежуточный результат). Пуш, коммит, пулл, мердж реквест… Плюс рекомендую глянуть базу того, как именно гит связан с деплоем, узнать что такое ci/cd и подумать нужен ли он конкретно вам.</p>

<h2 id="я-не-то-чтобы-верю-в-идеальную-чёрную-коробку">Я не то чтобы верю в идеальную чёрную коробку</h2>

<p>LLM выдаёт человекочитаемые промежуточные результаты. Код — это текст. Объяснения — текст. Архитектурные решения — текст. Вы можете остановиться в любой момент, прочитать что происходит, и сказать “нет, не туда”.</p>

<p>Если бы LLM сразу писала бинарник — ей было бы мало смысла. Вы бы просто получали исполняемый файл и надеялись что он делает то что нужно. Никакого контроля. Но именно потому что результат читаемый — у вас есть точки входа для коррекции на каждом шаге. Это и есть основная фича которая делает инструмент полезным!</p>

<p>Уважаемые вайбкодеры, не бойтесь погрузиться поглубже в ваши инструменты. Это не рокет саенс и от вас никто никаких секретов не скрывает. Вся инфа о разработке ПО в ютюбе, в статьях на хабре, да много где.</p>

<p>Чем больше вы понимаете текст на инопланетном языке, который за вас пишет агент, тем меньше токенов вы тратите, тем дольше живёт ваша архитектура приложения, тем понятнее для вас деплой итд</p>]]></content><author><name></name></author><summary type="html"><![CDATA[Недавно ко мне обратились с просьбой помочь с вайбкодингом. Назвали три проблемы: Claude жрёт слишком много токенов, новые фичи добавляются очень долго и ломают предыдущие, сложный или ненадёжный деплой.]]></summary></entry><entry><title type="html">Context rot: почему модель тупеет посреди разговора</title><link href="https://vladtrc.github.io/contextrot/2026/03/context-rot/" rel="alternate" type="text/html" title="Context rot: почему модель тупеет посреди разговора" /><published>2026-03-06T00:00:00+00:00</published><updated>2026-03-06T00:00:00+00:00</updated><id>https://vladtrc.github.io/contextrot/2026/03/context-rot</id><content type="html" xml:base="https://vladtrc.github.io/contextrot/2026/03/context-rot/"><![CDATA[<p>Знакомо: длинный чат с агентом, всё шло хорошо, а на 40-м сообщении он начинает путать файлы, забывать что вы договорились тремя сообщениями назад, повторять одни и те же предложения. Вся информация чисто технически в чате есть — он её сам туда написал. Но “полезность” ответов деградирует с каждым шагом.</p>

<p>Это context rot.</p>

<h2 id="не-только-вблизи-лимита">Не только вблизи лимита</h2>

<p>Интуиция подсказывает: ну окно же 200к токенов, пока я в пределах — всё ок. Нет. Модель с окном в 1M токенов начинает страдать уже на 50к. Деградация не ступенчатая (“работало → перестало”), а плавная — каждый килотокен контекста чуть-чуть снижает качество. Просто на 20к вы этого не замечаете, а на 80к уже бесит.</p>

<h2 id="и-это-ещё-и-дорого">И это ещё и дорого</h2>

<p>Gemini берёт $1.25/M токенов при коротком контексте и $2.50/M при длинном. Больше токенов = дороже и ХУЖЕ одновременно. Платите вдвое больше за ответы которые вдвое тупее. Скам!</p>

<h2 id="что-делать-нам-вайбкодерам">Что делать нам, вайбкодерам</h2>

<ul>
  <li><strong>Изменились условия — редактируйте сообщение выше, не дописывайте новое.</strong> Каждое новое сообщение это +токены в контекст. Отредактировали — контекст не вырос.</li>
  <li><strong>Тема сменилась — новый чат.</strong> Не продолжайте разговор про деплой в чате где обсуждали архитектуру БД. Это разные контексты, они загрязняют друг друга.</li>
  <li><strong>Смотрите на процент оставшегося контекста</strong> в Claude Code / Codex. Этот индикатор не декоративный.</li>
  <li><strong>Параллельная задачка — другой агент.</strong> Не засоряйте контекст текущего. Кстати в Claude Code появилась интересная фича — прямо в середине общения с Sonnet можно попросить запустить подзадачу на Opus.</li>
  <li><strong>Skills, MCPs и прочее — не бесплатные.</strong> Каждый подключенный MCP сервер это токены в контексте. Каждый skill это описание которое занимает место. Помните пост про <a href="/2026/03/agent-context-tax/">налог на контекст</a>?</li>
</ul>

<p><em>В следующих постах: RAG, RLM, subagent architectures — как с этим борются (или пытаются бороться).</em></p>]]></content><author><name></name></author><summary type="html"><![CDATA[Знакомо: длинный чат с агентом, всё шло хорошо, а на 40-м сообщении он начинает путать файлы, забывать что вы договорились тремя сообщениями назад, повторять одни и те же предложения. Вся информация чисто технически в чате есть — он её сам туда написал. Но “полезность” ответов деградирует с каждым шагом.]]></summary></entry><entry><title type="html">No-code умер, а его мечта сбылась</title><link href="https://vladtrc.github.io/contextrot/2026/03/nocode-dead-text-won/" rel="alternate" type="text/html" title="No-code умер, а его мечта сбылась" /><published>2026-03-06T00:00:00+00:00</published><updated>2026-03-06T00:00:00+00:00</updated><id>https://vladtrc.github.io/contextrot/2026/03/nocode-dead-text-won</id><content type="html" xml:base="https://vladtrc.github.io/contextrot/2026/03/nocode-dead-text-won/"><![CDATA[<p>Был на конференции в прошлом году. Чел рассказывал: у нас вот LOW CODE платформа для тестирования гипотез. Соединяешь два прямоугольника в веб-интерфейсе — вуаля, процесс передачи данных. Из Кафки в Постгрес, из Монги в Кафку! До меня микрофон не дошёл, но первое что хотел спросить — а чем это отличается от Apache NiFi?</p>

<h2 id="текст--прямоугольники">Текст &gt; прямоугольники</h2>

<p>Моё мнение: текст — лучшее хранилище для алгоритмов. Никакие визуальные решения меня не убеждали.</p>

<p>Хотя бы один вопрос: а что с version control? Текст версионируется, диффается, ревьюится. Визуальные блоки — нет. Окей окей обходы есть))) Тот же NiFi умеет подключаться к гиту. Но возникает вопрос: зачем редактировать блоки визуально, чтобы потом сгенерировать код? Может наоборот — писать код и смотреть визуализацию?</p>

<h2 id="тренд">Тренд</h2>

<p>Визуальный drag-and-drop no-code в упадке. Вендоры отказываются. Платформы которые вчера продавали “соедини два блока”, сегодня прикручивают AI-генерацию и переименовываются.</p>

<h2 id="мечта-сбылась">Мечта сбылась</h2>

<p>И вот что интересно — no-code умер, а его мечта сбылась. Идея “не технический человек создаёт софт” никуда не делась. Но вместо появления очень интеллектуальных соединений прямоугольников в вебе — промпты пишут на естественном языке.</p>

<p>Текст победил дважды: и как способ хранить алгоритмы, и как способ их создавать.</p>]]></content><author><name></name></author><summary type="html"><![CDATA[Был на конференции в прошлом году. Чел рассказывал: у нас вот LOW CODE платформа для тестирования гипотез. Соединяешь два прямоугольника в веб-интерфейсе — вуаля, процесс передачи данных. Из Кафки в Постгрес, из Монги в Кафку! До меня микрофон не дошёл, но первое что хотел спросить — а чем это отличается от Apache NiFi?]]></summary></entry><entry><title type="html">Голубой океан</title><link href="https://vladtrc.github.io/contextrot/2026/03/ai-companions-blue-ocean/" rel="alternate" type="text/html" title="Голубой океан" /><published>2026-03-06T00:00:00+00:00</published><updated>2026-03-06T00:00:00+00:00</updated><id>https://vladtrc.github.io/contextrot/2026/03/ai-companions-blue-ocean</id><content type="html" xml:base="https://vladtrc.github.io/contextrot/2026/03/ai-companions-blue-ocean/"><![CDATA[<p>Пока обсуждают изъезженный на западе блэкпил, продают курсы для луксмакса за 100 долларов — находятся смелые люди которые видят в сложившейся ситуации целевую аудиторию и ВОЗМОЖНОСТИ. Тот самый голубой океан! Одинокие платежеспособные ребятки жаждут женского внимания и на помощь им пришли платные подписки на ИИ))</p>

<p>Candy AI запустились в конце 2023, к концу 2025 вышли на $25M ARR. И это не самый большой игрок. Chai AI имеет $30M ARR на 12 человек. $2.5M на сотрудника. Это в 12 раз эффективнее среднего SaaS. И это из тех компаний которые всё-таки решили “легализоваться”.</p>

<h2 id="как-это-устроено">Как это устроено</h2>

<p>Кабанчики арендуют GPU на время из дата-центров. Запускают abliterated модели. Обходят комиссию Google/Apple находясь в вебе. И приносят прибыль!</p>

<p>Abliteration — техника, которая убирает механизм отказа из любой open-source модели без дообучения. На Hugging Face уже тысячи таких моделей. Есть инструмент Heretic, который делает это полностью автоматически — запускаешь одну команду и получаешь расцензуренную модель, которая сохраняет интеллект оригинала.</p>

<p>Порог входа для среднего айтишника: пару вечеров с клодом и десятки долларов.</p>

<h2 id="вопросы">Вопросы</h2>

<p>Легально ли это? Как с этим бороться? Будут ли вообще с этим бороться? Столько вопросов… А пока мы их задаём регуляторам и ждём ответа — смелые и смышлённые набирают себе квартиры на Петроградке.</p>

<p>P.S. Канал не призывает к действиям и не поощряет заработок в серых зонах законодательства.</p>]]></content><author><name></name></author><summary type="html"><![CDATA[Пока обсуждают изъезженный на западе блэкпил, продают курсы для луксмакса за 100 долларов — находятся смелые люди которые видят в сложившейся ситуации целевую аудиторию и ВОЗМОЖНОСТИ. Тот самый голубой океан! Одинокие платежеспособные ребятки жаждут женского внимания и на помощь им пришли платные подписки на ИИ))]]></summary></entry></feed>