Разборы, рецепты и инструменты по LLM и агентам, которые можно применить: о чём статья — что главное — что попробовать за вечер.
🗓 окно 31 августа — 7 сентября 2026⚡ статей: 10👀 на заметку: 4📡 отсканировано: 242
📝 О чём пишут на этой неделе
Неделя сложилась вокруг одного сюжета: агент ломается молча. Модель не зовёт инструмент и придумывает данные, метрика RAG валит строку, где агент решил не искать, чекаут из соседней сессии откатывает чужое рабочее дерево — и ни в одном из случаев никто не получает ошибку. Ответ у авторов одинаковый и скучный в хорошем смысле: перестать уговаривать модель прозой и поставить проверку, которая ломается сама. Вторая линия недели — счёт: сколько токенов стоит обвязка компонента, во что обходится агенту повторное чтение одного и того же файла и почему в MCP решили убрать сессию целиком.
⚡
Главные статьи недели
Десять статей, которые прошли вычитку на 4–5 и пережили попытку опровержения. У каждой последним пунктом «Главного» стоит дыра, найденная при проверке.
01
Агент на Pydantic AI, который обязан спросить разрешение перед разрушающим вызовом
Автор собрал чат-агента, у которого удаление задач требует явного согласия человека, и показал, почему это не закрывается строчкой в промпте. Интересна не сама фича, а способ: тип ответа объявлен объединением, поэтому каждый прогон заканчивается либо ответом, либо запросом разрешения, и обе ветки приходится обработать в коде.
🔑 Главное
@agent.tool(requires_approval=True) останавливает вызов до решения человека: прогон возвращает DeferredToolRequests со списком отложенных вызовов вместо ответа.
Модель попыталась обойти механизм по-человечески — спросила разрешение текстом прямо в чате. Лечится инструкцией звать инструмент напрямую и не переспрашивать в переписке.
Дельту текста при стриминге структурированного вывода автор достаёт сам: stream_output(debounce_by=None) отдаёт снимки, разница берётся через removeprefix.
Двадцать тестов гоняются на FunctionModel без ключа API и проверяют точный порядок событий на проводе, вплоть до того, что approval_request идёт последним.
Дыра: переносится только половина на pydantic-ai. Транспорт, схема AsyncAPI и тестовый харнесс держатся на chanx — библиотеке самого автора. В демо нет аутентификации, а отложенные подтверждения лежат в обычном словаре в памяти процесса и не переживают рестарт.
⚡ Попробовать за вечер
Повесить requires_approval=True на один разрушающий инструмент своего агента и перевести output_type в объединение с DeferredToolRequests.
Написать один тест на FunctionModel, который сценарит вызов инструмента и проверяет порядок событий, не обращаясь к модели.
Метрика: из 10 запросов на удаление — сколько раз агент остановился на подтверждении и сколько раз вместо этого спросил согласие текстом.
from article
На картинке: прогон остановлен на разрушающем вызове, а не после него: поле ввода заблокировано до ответа человека, и это состояние приходит по проводу отдельным событием.
Модель молча не позвала инструмент и придумала данные — и как сломать выдумку механически
✍ Peter DongoHackerNoon⏱ ≈12 минon-device-airagllm-hallucination
О чём
Автор дал локальной модели инструмент поиска по своей библиотеке сниппетов и двадцать ответов подряд принял за правду. Выяснилось, что модель в большинстве случаев инструмент не звала вообще, а названия сниппетов сочиняла. Ценна тут не привязка к iOS, а то, как перестроен пайплайн: выдумке больше не с чем совпасть.
🔑 Главное
Принудительный режим не лечит: с toolCallingMode = .required модель ищет, её просят продолжить, она ищет снова, и приложение виснет на одном слове.
Замер убил исходную посылку: сравнение CSSearchQuery и CSUserQuery дало 2 и 4 результата, а семантический запрос — ноль. Никакой семантики в индексе не было.
Переполнение «Provided 13 672 tokens, but the maximum allowed is 8 192» дал не объём выдачи, а гайд инструмента по умолчанию; вылечено переключением на .focused(.items) с .compact.
Новая схема отбирает у модели право породить идентификатор: модель выдаёт 3–6 ключевых слов при temperature = 0, детерминированный поиск возвращает реальные строки, модель выбирает только из пронумерованного списка, и ответ механически сверяется с кандидатами.
Дыра: перестроенный пайплайн показан ровно одним сквозным прогоном против примерно двадцати ответов на сломанной версии. Репозитория нет, приложение хакатонное, а сверка — простое вхождение подстроки: ложное срабатывание на заголовке внутри другого заголовка автор не разбирает.
⚡ Попробовать за вечер
Добавить в свой RAG или tool-use механическую сверку: пересечение того, что назвала модель, с тем, что реально вернул ретривер, и выводить пустое пересечение на экран, а не в лог.
Перестроить один шаг по схеме «модель → ключевые слова → детерминированный поиск → выбор из пронумерованного списка».
Метрика: на 20 вопросах — доля ответов, где названный моделью идентификатор отсутствует в выдаче ретривера; замерить до и после перестройки.
from article
На картинке: два столбца — что модель назвала и что есть в библиотеке. Пересечение пустое, и именно это несовпадение автор потом сделал автоматической проверкой.
Автор посчитал через tiktoken четыре формата разметки на пяти одинаковых по смыслу сэмплах и разложил разницу до отдельных токенов. Полезно всем, кто отдаёт агенту компоненты целиком: дорога оказалась не разметка и не длинные имена атрибутов, а сама обёртка файла.
🔑 Главное
Множители против победителя: Pug ×1.000 · HTML ×1.608 · JSX ×1.879 · TSX ×1.944 — TSX дороже Pug на 94%.
Миф про className мёртв: на двенадцати атрибутах в сэмплах class стоит 53 токена и className ровно столько же.
Вся наценка JSX над HTML — это обвязка компонента, около 11 токенов на файл, плюс 7 за фрагмент и 3 за переформатирование Prettier. Тело разметки в трёх сэмплах из пяти совпадает с HTML токен в токен.
TSX над JSX отличается ровно на аннотацию типа: 3 токена на файл, разница 451 − 436 = 15 = 3 × 5 и больше ничего.
Дыра: сам эксперимент не перепроверить — методология, сэмплы и счётный скрипт выйдут только с финальной частью серии. Замеры сняты на cl100k_base, и автор прямо пишет, что это не то, что видит актуальная модель Claude, а устойчивость рейтинга между токенизаторами он заявляет, но не показывает.
⚡ Попробовать за вечер
Прогнать трёхстрочный счётчик из статьи (tiktoken.get_encoding("cl100k_base") и len(enc.encode(...))) на самом большом своём компоненте.
Удалить первую и последнюю строку файла, сделать dedent и посчитать снова: разница и есть цена обвязки.
Метрика: сколько токенов на компонент съедает обвязка; умножить на число компонентов, которые агент читает за одну сессию.
Параллельные агенты: два отказа без единой ошибки в логе и правила, которые их закрывают
✍ Pavel KuzinHackerNoon⏱ ≈14 минai-agentsdeveloper-productivity
О чём
С 7 января автор вёл четыре репозитория одного продукта командой из шести агентских ролей: 458 коммитов и 42 релиза. Статья не про скорость, а про два отказа, которые ничем себя не выдают, и про ограничения, которые их снимают. Половина правил — чистая работа с git, и она применима далеко за пределами iOS.
🔑 Главное
Фантомные агенты: после ошибки при спавне конфиг показывал троих, а интерфейс — семь-восемь активных ходов. Меньше чем за десять минут это съело около половины миллиона токенов и половину лимита сессии, и выборочно убить их нельзя. Правило: спавн упал — останавливаемся, ретрая нет.
Общее рабочее дерево: чекаут из другой сессии в том же клоне откатил дерево iOS-воркера и перезаписал файл проекта. Ошибки не получает никто. Страховка встроена в git: одна и та же ветка не может быть выкачена в двух рабочих деревьях сразу.
Отсюда правило: свой worktree на каждого пишущего агента, основной клон сначала отпускает ветку через git switch --detach, для iOS — ещё и отдельный путь derived data.
Симуляторы адресуются только по UDID через xcrun simctl create: выбор по имени недетерминирован. Полная пересборка релиза iOS занимает 25–30 минут, поэтому перезапускается один упавший job через gh run rerun --job, а не весь workflow.
Дыра: воспроизводятся гардрейлы, но не постановка. Команда из шести ролей описана только прозой, конфигов и репозитория нет, формат токен-листа для кросс-платформенного хэша из текста выпал, а весь опыт — один разработчик и один непроверяемый извне проект.
⚡ Попробовать за вечер
Развести пишущих агентов по своим worktree: в основном клоне git switch --detach, затем создать рабочее дерево на нужную ветку.
Ввести правило «спавн агента упал — стоп, зовём человека» и после ближайшей ошибки проверить в интерфейсе, сколько ходов на самом деле активно.
Метрика: за неделю — сколько раз агенты наступили друг другу на рабочее дерево; целевое значение ноль.
Автор прогнал RAGAS по агентному RAG на Cohere, Pinecone и агенте с одним инструментом и получил низкие числа, которые не стал прятать. Главная находка не в числах: метрики ломает не ретривер, а сам агент. Когда он решает не искать, список контекстов пуст, и обе retrieval-метрики валят строку независимо от того, насколько хорош ответ.
Разбор по строкам показал другое: низкая точность ретривера — это дыра в покрытии корпуса, а не плохой поиск. Вопросы про кеширование экспертов и выгрузку весов в индексе просто отсутствуют.
Отдельная «злая» строка: полнота контекста 0,10 при faithfulness 0,96 и корректности 0,27 — модель безупречно верна плохому контексту, и одно среднее это скрывает.
Версионная ловушка названа прямо: в RAGAS 0.3.x колонка вопроса называется user_input, а не question, и старый код индексирует несуществующую колонку.
Дыра: опровержение сняло балл с 5 до 4. Сам eval-скрипт и вызов evaluate() в статье не показаны, версии не запинены вопреки собственному совету автора, датасет не назван, а рекомендация разбивать средние по факту вызова инструмента в цифрах не подтверждена — сколько строк прошли без поиска, статья не сообщает.
⚡ Попробовать за вечер
Записывать на каждый вопрос флаг «ретривер сработал» и число вызовов инструмента, а средние считать отдельно по группам.
Выводить не только среднее по метрикам, но и построчный фрейм: на 10–15 вопросах сразу видно, где кончился корпус, а где ошибся поиск.
Метрика: доля строк с пустым списком контекстов и насколько сдвинутся средние, если эти строки убрать.
from article
На картинке: в построчной таблице у первого вопроса точность и полнота контекста равны нулю, а корректность ответа заметно выше нуля. Такие строки и создают провал среднего.
Ревизия MCP 2026-07-28 отменяет протокольную сессию и вызов initialize: версия протокола и возможности клиента едут метаданными в каждом запросе, возможности сервера берутся по требованию. Для того, кто держит MCP-сервер, это не новость из ленты, а список работ с датами.
🔑 Главное
Убраны ping, отдельная установка уровня логов и индивидуальные подписки: вместо них один поток subscriptions/listen. Возможности сервера теперь запрашиваются через server/discover.
Resumability тоже убрана: реплей по Last-Event-ID больше не поддержан, клиент переотправляет запрос с новым идентификатором.
MRTR разворачивает направление вызова: сервер возвращает input_required с request state, клиент дозаполняет и повторяет вызов. Каждый успешный результат теперь несёт поле resultType, а POST в Streamable HTTP — заголовок Mcp-Method, чтобы прокси маршрутизировал, не читая тело.
Аудит перед миграцией сформулирован исполнимо: искать всё, что доверяет session ID, кэши, привязанные к соединению, и list-ответы, зависящие от соединения. Персональные результаты помечаются cacheScope private.
Дыра: это карта миграции, а не рецепт. Ни кода, ни команд, ни ссылки на спецификацию, ни версий SDK; имя поля с пер-запросными метаданными не названо, поэтому написать новый формат по статье нельзя, а срок удаления старого транспорта HTTP+SSE по ней не вычислить.
⚡ Попробовать за вечер
Прогрепать свой MCP-сервер на session ID, на кэши, живущие внутри соединения, и на списки инструментов и ресурсов, которые различаются от клиента к клиенту.
Если сервер возвращает request state — подписать его HMAC и вшить владельца, срок жизни и отпечаток исходного вызова: он приходит обратно через клиента и считается управляемым атакующим.
Метрика: число мест в коде, которые перестанут работать без сессии. Запас по времени для Roots, Sampling и Logging — до ревизии не раньше 2027-07-28.
Четырнадцать месяцев работы с Claude Code на сервисе примерно с тысячей эндпоинтов. Корпус правил дорос до восемнадцати файлов и больше 5 000 строк, но правила всё равно нарушались. Автор перестал добавлять текст и ввёл лестницу: правило, которое агент продолжает ломать, каждый раз спускается на ступень ближе к механике.
🔑 Главное
Ступени по возрастанию жёсткости: проза → доставка той же прозы хуком → меньшая единица работы → разделение прав на запись по ролям → allow-list команд → тесты как критерий готовности, написанные не разработчиком → exit-код и запрет записи вне досягаемости агента → недопустимое состояние просто невозможно выразить.
Хук перед компактацией занимает 24 строки: он впрыскивает инструкцию в контекст прямо перед сжатием, и правило переживает саммари. Хук условной подгрузки документации на 68 строк, по признанию автора, помог мало.
Цена посчитана: корпус правил упал с 5 000 строк примерно до 1 000, зато аппарат вырос — 13 хуков примерно на 1 300 строк плюс конфиг прав на 86 строк.
Наблюдение, ради которого стоит читать: против настоящего механического запрета агент возвращался и говорил, что не может; против мягкого правила обычно находил обход.
Дыра: кода хука нет — из 24 строк приведена ровно одна, ни имени события, ни конфига, ни репозитория. Все измеренные цифры взяты из нерецензированных препринтов, и автор это оговаривает; совет «переписать never в always» тоже оттуда, у себя он его не проверял, а собственные тайминги дисквалифицирует сам.
⚡ Попробовать за вечер
Взять правило, которое вы уже записали в CLAUDE.md или AGENTS.md трижды, и спустить его на ступень: превратить в проверку, в запрет записи по пути или в команду, которой нет в allow-list.
Отобрать у роли-ревьюера право писать в те файлы, которые она проверяет, — по статье именно это правило агент ломал охотнее всего.
Метрика: сколько раз за неделю пришлось повторить это правило руками; сравнить с неделей до спуска.
Долгая автономка: машинно-проверяемый артефакт и валидатор на каждом коммите
✍ Nicolas FränkelHackerNoon⏱ ≈8 минclaude-codeagent-skillsautonomous-runs
О чём
За неполный месяц автор собрал агентом больше 600 персон и до 12 поколений родословной. Генеалогия здесь фон. Переносимое — устройство долгого автономного прогона: как сделать так, чтобы агент не портил результат незаметно и чтобы ночная сессия не съедала контекст и квоту.
🔑 Главное
Формат артефакта выбран машинно-проверяемый — GEDCOM 5.5.1, а не более свежая версия: с новой мало что совместимо, а внешний валидатор нужен именно готовый.
Главный гейт: проверять структуру файла на каждом коммите, локальным pre-commit-хуком или задачей в CI. Иначе поломка всплывёт через десятки коммитов, и разбирать её будет уже нечем.
Повторяющиеся инструкции вынесены в скиллы: они не раздувают контекст по умолчанию и подтягиваются по описанию, когда оно совпало с задачей.
Раскладка ночных прогонов: субагент работает и коммитит в ветку worktree, главный агент проверяет и мёржит. Субагенты последовательные, а не параллельные, иначе квота кончается в середине месяца.
Дыра: механизм назван на уровне категории. Ни валидатора, ни хука, ни команды, ни репозитория и ни одного текста скилла; сколько поломок проверка реально поймала, автор не сообщает, так что «агент не сломает файл незаметно» — следствие самой проверки, а не измеренный результат.
⚡ Попробовать за вечер
Выбрать в своём долгом агентском проекте формат артефакта, у которого есть внешний валидатор, и повесить валидатор на pre-commit.
Переписать повторяющийся кусок системного промпта в скилл с описанием-триггером, чтобы он подтягивался по задаче, а не висел в контексте постоянно.
Метрика: за неделю автономных прогонов — сколько коммитов отбито валидатором до того, как их увидел человек.
Автор за выходные обучил крошечный GPT на санскрите и подробно описал, что сломалось первым. Сломалась токенизация: словарь через set(text) режет кластеры деванагари на куски, которые сами по себе ничего не значат. Приём переносится на любой корпус с диакритикой, эмодзи или неевропейским письмом.
🔑 Главное
Кластеры распадаются на глазах: один слог собирается из двух, трёх и четырёх кодовых пунктов, и посимвольный словарь превращает его в набор осколков.
Замена на разбиение по графемам regex.findall(r"\X", text) меняет словарь с 50 на 160, а длину последовательности — с 845 на 476 токенов, то есть на 44% короче на том же тексте.
На одной фразе разница видна сразу: 32 токена при разбиении по кодовым пунктам против 17 по графемам.
Порядок диакритики чинится нормализацией unicodedata.normalize("NFC", text) до токенизации, а скрипт подготовки данных сам меряет долю нужного письма в файле и отбраковывает сканы, где её мало.
Дыра: ссылка на репозиторий — незаполненный плейсхолдер, поэтому команды запуска модели повторить не по чему, переносится только сама замена токенизатора. Цифры сняты на корпусе из двадцати стихов и 845 символов; на большом корпусе словарь графем растёт куда выше 160, и этот размен автор не мерил.
⚡ Попробовать за вечер
Прогнать на своём не-латинском корпусе оба варианта — sorted(set(text)) и regex.findall(r"\X", text) — и сравнить размер словаря с длиной последовательности.
Добавить нормализацию NFC перед токенизацией и посмотреть, сколько сломанных кластеров после этого исчезло.
Метрика: длина последовательности на одном и том же тексте до и после, плюс доля токенов словаря, которые не отображаются как самостоятельный знак.
from article
На картинке: вывод обучающего прогона, где тип токенизатора и размер словаря печатаются в одну строку с объёмом корпуса. Цифры здесь от полного прогона и не совпадают с таблицей сравнения на стартовом корпусе из статьи.
Короткая заметка про поле description во frontmatter файла скилла. Автор разбирает, что именно агент читает, прежде чем решить, стоит ли открывать сам файл, предлагает жёсткую форму записи и, что важнее, даёт бинарный способ проверить результат.
🔑 Главное
Форма записи: когда читать, когда применять, что делает. Три предложения — цель, а не потолок: четвёртое, по наблюдению автора, обычно оказывается замаскированной оговоркой.
Триггер живёт в двух местах — в имени скилла и в первой строке описания, поэтому имя даётся по моменту обращения, а не по теме. Переименование входит в рецепт наравне с правкой текста.
Проверка бинарная и повторяемая: дать задачу-триггер агенту, который скилл ни разу не видел, и посмотреть, откроет ли он файл сам.
Границы названы честно: разные харнессы взвешивают описания по-разному, а проза не даёт гарантий, которые даёт скриптовое правило.
Дыра: три предложения — цель, а не правило, и единственный образцовый пример в самой статье состоит из четырёх. Выгоды (быстрее роутинг, меньше промахов, дешевле контекст) заявлены без единого замера, а холодный тест — одно наблюдение без базлайна и без числа прогонов.
⚡ Попробовать за вечер
Переписать description у двух своих скиллов по схеме «когда читать / когда применять / что делает» и заодно переименовать их по моменту обращения.
Сравнить пары скиллов с близкими темами: если описания неразличимы, разделить скилл надвое или развести триггеры.
Метрика: из 10 триггерных задач на чистой сессии — сколько раз скилл открылся сам, до и после правки.
from article
На картинке: собственная инфографика статьи. Шаг «назвать скилл как триггер» стоит первым — это подтверждает, что имя работает наравне с описанием, хотя заголовок говорит только про три предложения.
Прочитано и размечено 38 статей, но в рецепт «попробовать вечером» сложились не все. Эти четыре стоит держать в голове: у них сильные измерения или сильная постановка вопроса, а вот повторить по ним нечего.
🧾 Один PR на 800 строк обошёлся в 156 млн токенов контекста
512 обращений к модели, пик окна 459 тысяч токенов, около 41 доллара за изменение, диф которого человек читает за пять минут. Измерения подробные, но лекарство — закрытый продукт того же автора, и ни одной цифры «после» в статье нет.
Мейнтейнеры отсмотрели агентские PR, уже прошедшие проверку, и отклонили примерно половину — не из-за придирок, а из-за поломанной функциональности. Дальше статья предлагает пять гейтов пайплайна, но конфиг агента в ней, по признанию автора, не настоящий синтаксис.
Идея сама по себе переносима: разметить коннекторы на два класса по чувствительности данных и разрешить песочнице с открытым egress видеть только «чистые». Реализация целиком внутри Tailscale и закрытого шлюза, а эффект не измерен ни одной цифрой.
Завершённые вызовы модели чекпоинтятся в Postgres и при восстановлении реплеятся, а не идут заново к провайдеру. Автор честно оговаривает, что шаги выполняются как минимум один раз, так что ключи идемпотентности всё равно нужны, — но сам эксперимент он только спроектировал, цифр нет.
Три вещи, которые действительно сделаю, а не «прочитаю ещё раз».
Посчитать: прогнать счётчик tiktoken по трём самым большим компонентам, которые агент читает чаще всего, и выяснить, сколько токенов из них уходит на обвязку файла.
до среды
Развести: перевести пишущих агентов в отдельные git worktree и убрать автоматический ретрай при неудачном спавне.
до пятницы
Разделить: добавить в eval-логи флаг «ретривер сработал» и пересчитать средние отдельно по группам с поиском и без.
до воскресенья
#
Метаданные
сгенерировано 2026-09-07T13:44:29Z
окно 2026-08-31 — 2026-09-07 (7 дней)
отсканировано / в дайджест 242 / 14
воронка по теме прошли 66, прочитано и размечено 38, в карточки — 10
источник поисковый индекс HackerNoon, неделя целиком (не выборка по тегам)
покрытие окна полное, отказов при сборе 0
счётчик прочтений доступен у 209 статей из 242: у материалов моложе двух суток его ещё нет