Архив рубрики ~Лента новостей~

Я собрал конвейер аналитики банков на LLM-агентах. Показываю, где он остановил 7 из 31

Я собрал конвейер аналитики банков на LLM-агентах. Показываю, где он остановил 7 из 31
Я собрал конвейер аналитики банков на LLM-агентах. Показываю, где он остановил 7 из 31

У проекта есть работающий сайт: ortant.net. На нём 24 принятых исследования, десять досье банков, карта покрытия данных и раздел с методикой. Исследование можно не только прочитать, но и заказать: конструктор собирает вопрос из готовых блоков (банк, окно, фокус), система бесплатно показывает паспорт данных с ценой, и после подтверждения идёт прогон. Медиана прогона $0,132 и 12,8 минуты; результат открывается своей страницей.

Строил я это не как аналитику с выгрузками: работу внутри делают языковые модели, и ролей у них в прогоне шесть. Пять обозревателей потоков, по одному на поток. Исследовательский агент, который достаёт содержание из хранилища. Три советника, каждый со своей гипотезой. Председатель, который сводит их предложения. Проверка утверждений. Репортёр. Моделей за этими ролями пять, все открытые. Для кода я использовал Codex и Claude Code.

Статья про то, чем всё это удержано от вранья. Семь прогонов из тридцати одного до читателя не дошли: их задержал гейт публикации, и у каждой остановки записан код причины. Ниже показываю сами барьеры: из чего они собраны, что остановили и что пропустили.

Прогон здесь — это одно исследование одного банка за один период; на витрине они названы исследованиями, в манифесте прогонами. За 80 календарных дней это 774 коммита и 24 опубликованных исследования. Числа всюду даны со знаменателями. Чего в статье не будет: обучающего материала по агентам и статистике, сравнения с чужими решениями, обещаний внедрения и цифры выгоды без метода расчёта.

Коротко

  • Что построено. Витрина ortant.net: 24 принятых исследования, 10 досье банков, карта покрытия и конструктор, который запускает новый прогон по вопросу гостя.

  • Что внутри прогона. Семь потоков публичных данных, шесть ролей на открытых моделях, четыре барьера от паспорта данных до гейта публикации; медиана прогона $0,132 и 12,8 минуты.

  • Что проверялось. Связаны ли изменения в разных публичных источниках у одного банка в одном окне.

  • Что остановлено. 7 прогонов из 31: у четырёх не собрался синтез, у двух в читательский текст попала запрещённая на витрине лексика, у одного ложно сработал распознаватель личных данных.

  • Отдельный эксперимент. Статистическая проверка одной гипотезы на панели регулятора дала ноль: β = +0,626 при ожидавшемся минусе. Это боковая ветка, помеченная пригодной только для разработки, а не то, что стоит на витрине.

  • Что не работает. Прогнозный слой оказался хуже наивной базы и удалён; 51 статистическая «находка» рассыпалась при перепроверке; совет моделей покупает охват, а не точность.

  • Где артефакт. Сайт, манифест прогонов, события жизненного цикла, отчёты приёмки и метаанализа — ссылки в конце.

Что стоит на сайте

Витрина ortant.net — она же и продукт: всё, что система произвела, лежит там, а не в отчётах для себя. Разделов у меня пять: главное, исследования, банки, методика, система. В коде это 87 маршрутов и 36 515 строк на Python, то есть слой, который к сбору данных отношения не имеет вовсе.

Исследования. Принятых карточек 24, и каждая отвечает на один вопрос про один банк в одном окне. Страница собрана из семи блоков: шапка, итог кейса, вердикт проверки, что наблюдали, связь между потоками, чего нельзя утверждать, техническое приложение. Главными я считаю, пожалуй, два последних. «Чего нельзя утверждать» выписывает сама система в том же прогоне, а в техническом приложении лежат источники, стоимость этого прогона и его след. Расклад по 24 принятым такой: 23 выдержали проверку утверждений, ни одно не опровергнуто, одно остановилось на границе данных. У 17 из 24 качество оснований помечено ограниченным, отметку эту ставит система, и стоит она на самой карточке, не в примечании мелким шрифтом. Опубликовал я, впрочем, не всё, что сделано, и видно это из того же каталога: карточек в нём 50, из них публичных 24, не показаны 19, задержаны гейтом 7. Под манифестом корпуса 652 файла.

Банки, методика, состояние машины. Досье десять: профиль банка, помесячный финансовый ряд, исследования по нему, состояние источников, из которых он собран. Методика — справочный центр: порядок стадий, что проверяет каждый барьер, что значит каждый вердикт. Раздел «Система» показывает машину изнутри: гейты, публикацию, модели с ценами и фактически потраченным, страницы данных и покрытия. Деньги и стек я открыл гостю без всякого входа, и решение это осознанное: система, которая называет свою цену, проверяема снаружи.

Запуск. Исследование можно не только читать. Конструктор собирает вопрос из готовых блоков: банк — один из десяти в реестре, окно — целыми месяцами внутри фактического покрытия базы, фокус — из конечного списка тем, плюс уточнение до двухсот знаков. Собрать неисполнимый запрос нельзя по построению, поэтому ветки отказа у конструктора нет вовсе. Раньше на этом месте стояло свободное поле, и каждый класс вопросов, которого система не тянула, добавлял свой стоп, свою оговорку и свою поверхность дефектов.

Конструктор запроса на витрине

Страница ortant.net/research/new: из чего гость собирает исследование. Дальше идут бесплатный паспорт данных по этому банку и окну, цена и одно подтверждение.

Паспорт данных показывает, что по выбранному банку и окну есть в базе и сколько будет стоить прогон; платная часть начинается только после отдельного подтверждения. Результат открывается своей страницей и проходит тот же пост-конвейер, что и библиотечные кейсы: авто-редакцию, замер достоверности, сборку скачиваемых отчётов. Почему запуск всё-таки закрыт ключом, если остальное открыто? Потому что прогон тратит деньги с моего счёта. Ключ я выдаю на три полных исследования, и упирается он в потолок $3 на профиль: это страховка от бага, а не тариф.

Что проверялось и почему это не очевидно

Коротко о том, кто пишет. Я пришёл из продуктовой аналитики в банке: отсюда и выбор домена, и то, что статистики в статье больше, чем кода. Мерило успеха: ответ на вопрос о связи потоков, каким бы он ни вышел.

Проверяется связь между потоками: совпадение изменений в двух источниках у одного банка в одном окне. Жалобы выросли — сдвинулись ли вклады. Банк перестал нанимать — видно ли это в отчётности. Каждый источник по отдельности давно доступен; ни один не сводит их в одно окно и не говорит, совпали ли изменения по времени.

Неочевидна задача из-за разреженности. Поле для всех расчётов — таблица «банк на месяц»: десять банков, по которым идут прогоны, на месяцы, где у банка есть хоть одна запись; всего 1 023 ячейки, в каждой отмечено, какие из семи потоков принесли данные. Больше чем по одному потоку заполнены 242, у 76 % ячеек потоков не больше одного. Межпотоковая гипотеза проверяется на четверти поля; любой вывод обязан нести этот знаменатель.

Матрица покрытия: банки на месяцы
Матрица покрытия: банки на месяцы

Матрица покрытия «банк × месяц»: ячеек с двумя и более потоками — 242 из 1 023. Ось обрезана на 2010-м; более старые даты (дефекты источников) учтены за краем. Та же карта дырами наружу — на витрине: ortant.net/research/coverage.

Дальше банки названы там, где утверждение опирается на официальный источник и читатель может его проверить, и не названы, где сигнал слабый или допускает несколько объяснений. Ни одно наблюдение здесь не является оценкой надёжности банка, аудиторским заключением или рейтингом.

Продукт системы — опубликованное исследование: страница с вопросом про один банк в одном окне и проверенным ответом. Одно покажу сразу, до разбора устройства: оно ещё вернётся дальше. Вопрос был такой: движутся ли вместе жалобы клиентов и вклады физлиц у МКБ (Московского кредитного банка) с января 2025 по июнь 2026. Поисковый поток дал в феврале 2026 года две экстремальные аномалии, запросы «мкб не работает» и «мкб сбой». Отчётность за март показала рост розничных вкладов на 3,5 процента. Всплеск запросов был; что за ним стояло, данные не говорят. Оттока в отчётности за март не видно.

Откуда данные и чего они стоят

Потоков семь. Поток — одна линия сбора: свой источник, свой разбор, своя таблица. Реестр потоков лежит в коде, в question_families.py, а витрина исследований раскладывает данные по шести другим именам — так что число семь надо брать из реестра, а не с экрана. Точнее, из константы аналитических потоков: рядом лежит служебная архивная обёртка вне аналитики. Объёмы в таблице — срез на конец фазы сбора.

Поток

Источник

Записей

Что даёт

Отзывы

публичные страницы отзывов о банках

10 234

жалобы и их темы

Поисковый спрос

статистика поисковых запросов

164 235

внимание к банку помесячно

Отчётность

показатели банков с агрегатора

5 809

размер, вклады, кредиты

Действия

госзакупки, корпоративные раскрытия, вакансии

2 983

что банк делает деньгами

Миграция

запросы о закрытии и открытии счетов

331

намерение уйти или прийти

Кадры

посты корпоративных блогов

308

о чём банк говорит как наниматель

Регуляторные события

публикации регулятора и санкционные списки

151

внешний шок

Гипотезы проверяются не об эти семь потоков. Опорный ряд отдельный: панель регулятора на 2,4 миллиона строк, сведённая в таблицу «банк, месяц, показатель» — оборотная ведомость и финрезультат, а не годовая отчётность по МСФО.

Правовая рамка: система собирает сигналы о банках как о юридических лицах и досье на физических лиц не строит. Имена клиентов и сотрудников, телефоны, номера карт вырезаются из отзыва на входе, и дальше в анализ, в промпты и на витрину идёт только обезличенная версия. Источники публичные.

Зачем на входе барьер, видно на одном случае. 9 июня выяснилось, что в потоке корпоративных раскрытий семь идентификаторов юрлиц из девяти вели на чужие компании: под идентификатором Т-Банка в выборку попал сочинский отель. После пересборки осталось 766 реальных раскрытий у четырёх проверенных эмитентов, остальные банки помечены как источник без ленты.

Семь потоков, их объёмы и опорный ряд отчётности
Семь потоков, их объёмы и опорный ряд отчётности

Семь потоков и их объёмы: 184 051 запись, из них 164 235 — поисковый спрос. Опорная панель регулятора больше их всех вместе в тринадцать раз.

Что уже пробовали и почему это не ответ

Первая версия обещала больше: направленную стрелку перетока, собранную из поисковых запросов о закрытии и открытии счетов. Пробный расчёт её убил. Совместная встречаемость оттока у одного и притока у другого тонет в общем движении рынка: 67 упорядоченных пар банков из 72 возможных, почти полный граф, а шок ставки зажигал веер ложных стрелок сразу у всех. Направление осталось невыводимым, и на месте стрелки теперь двусторонний признак намерения.

Чем источники неполны

Часть источников закрыта совсем. Магазин приложений Apple убрал приложения подсанкционных банков, раздел вакансий Avito закрыт антиботом, деловые сети закрыты из России, а личный интерфейс Telegram упирается в лимит частоты на регистрации (этот, наверное, ещё вернётся). Тут, собственно, разбирать нечего: источник либо есть, либо его нет.

Опаснее источники, работающие наполовину: они возвращают правдоподобные данные. Вакансии банков собирались со страниц выдачи, потому что дата публикации лежит за авторизацией: анонимный запрос отдаёт 403, и все 978 строк несут время сбора вместо времени публикации. Это записано флагом в самих данных: расчёт, где вакансии участвуют датой, обязан на него смотреть. Внутри работающих потоков данные тоже лежат неровно. В двадцати четырёх опубликованных исследованиях отчётность есть в каждом, отзывы и поисковый спрос в двадцати, действия банков в двенадцати, миграция в семи, а регуляторные события ни разу. Кадровых сигналов нет даже группой: их некуда показывать. То есть из семи потоков до читателя доходят пять.

Как из отчётности получается число

Если вы не работали с месячными формами банковской отчётности, вам достаточно одного: сырое значение сравнивать между банками нельзя; всё дальнейшее — приведение к сравнимому виду. Считается не уровень, а помесячное относительное изменение: так Сбер и Точка сравниваются по темпу, и три порядка разницы перестают затирать сигнал. Дальше каждому изменению нужен фон: рост вкладов на три процента в месяц, когда весь сектор растёт на четыре, это падение.

Фонов четыре, нормы под них считаются заранее, офлайн. Перцентиль изменения банка внутри всего сектора за этот месяц. Перцентиль внутри своего кластера, то есть среди банков того же типа. Изменение за вычетом секторной сезонной нормы для этого календарного месяца. И флаг «двигался весь рынок», который поднимается, когда аномальных банков в месяце набирается четверть и больше. Все четыре уходят в промпт модели с расшифровкой, что каждое поле значит: модель, которая видит только сырой рост, объявит его находкой.

Проверка норм на осмысленность поймала артефакт, ради которого и строилась. Причина в самой форме: январское значение — это годовой баланс с учётом событий после отчётной даты, а не операционный. Поэтому январские активы каждый год стоят выше февральских, и так у десяти с лишним банков: по медиане в 1,4 раза, а у крупнейшего банка выборки — впятеро. До починки он давал фальшивую сезонность и два ложных общесекторных шока. После исключения января у активов в списке шоков остались ровно два месяца, оба на начале пандемии.

Витрина признаков строится строго по прошлому: окно тянется только по подряд идущим месяцам внутри одной эпохи и не перешагивает семнадцатимесячную дыру с января 2022 по май 2023, когда регулятор отчётность не публиковал. Пропуски не заполняются.

С отзывами то же требование, только к разметке. Отзыв попадает в поток не сырым: его относят к одному из шести классов, и качество разметки измерено на эталоне из 379 отзывов: macro-F1 вышел 0,8077 при объявленном заранее пороге приёмки 0,75. Первые двести объектов эталона размечали три модели — согласие между ними 0,788 по Флейссу; дальше добирала одна модель, с ручной правкой поверх.

Почему третья попытка, а не первая

Первая итерация промпта прошла гейт впритык: macro-F1 0,7594 на тогдашнем эталоне из трёхсот отзывов, а у класса «проблема на стороне поддержки» точность 0,35. Вторая подняла точность и обрушила полноту, метрика упала ниже порога: прогон я отменил, промпт даже не сохранил.

Чинить надо было не промпт. В эталоне у этого класса лежало семнадцать примеров, и разброс оценки при таком числе — порядка двенадцати пунктов: любая правка неотличима от шума. Сначала я добрал класс с семнадцати примеров до сорока двух, разброс сузился примерно до семи, и только после этого третья итерация дала 0,8077 — уже на доборанном эталоне, так что с первой напрямую это число не сравнивается.

То же на живом числе

У МКБ розничные вклады выросли с 699 906 млн рублей в феврале 2026 года до 724 404 в марте, это 3,5 процента. Само по себе это не значит ничего; значит то, что перцентиль такого изменения в секторе 85,6. На этом и держится вывод, что за февральским всплеском запросов оттока не последовало.

И тут же граница, но не та, что я думал. Критик — агент, который в том же прогоне перепроверяет каждый вывод, — записал его как неподтверждаемый: секторного фона в его контексте не было. А в данных фон был: перцентиль лежал во входе агентов, собиравших выводы (советников и председателя), а до критика просто не доехал. Барьер тут ни при чём: сработал разрыв контекста между агентами.

Конвейер: от вопроса гостя до карточки

Прогон идёт от собранного вопроса до готовой страницы, и страницу эту я дальше называю карточкой. Барьером я называю место, где конвейер может отказаться отдать результат дальше; в коде это называется gate. Дальше «гейт» значит конкретную проверку с вердиктом, а «барьер» остаётся зонтичным словом. Вердиктов у гейта ровно три: пропустить, воздержаться, не пропустить.

Стадий двенадцать, и три из них проходят до первого платного вызова: это моё требование к системе, а не свойство ядра.

Полный прогон: двенадцать стадий и три барьера
Полный прогон: двенадцать стадий и три барьера

Тот же порядок стадий читатель видит на витрине в разделе «Методика»: ortant.net/how-it-works.

Порядок такой. Конструктор собирает вопрос, паспорт данных показывает, что по этому банку и окну есть в базе, гость подтверждает цену. Всё это бесплатно; дальше платная часть. Пять обозревателей разбирают каждый свой поток за окно и приводят наблюдения к общему виду; потоков при этом семь — два сводятся арифметикой, без модели. Отсюда и «три из пяти» в машинных отчётах: знаменатель этой дроби — пять обозревателей, а не семь потоков реестра. Исследовательский агент достаёт из хранилища векторов содержание — тексты отзывов и прочее сырьё под вопрос. Три советника независимо предлагают гипотезы о связях между потоками, председатель сводит предложения в набор кандидатов, проверка утверждений каждого кандидата подтверждает или отклоняет — и при отказе возвращает синтез на второй заход; число заходов ограничено. Репортёр собирает читаемый отчёт с числами и границами. После него идёт пост-конвейер — авто-редакция, замер достоверности, сборка скачиваний, — и только потом три гейта публикации. Запускается всё графом: управляющий узел раздаёт работу параллельно и ждёт всех.

Зачем тут три советника, а не один? Ответ на этот вопрос я получил позже, чем построил слой, и он, конечно, неутешительный: он ниже, в разделе про совет моделей. Пока — кто именно работает в прогоне и на какой модели.

Роль в прогоне

Модель

Обозреватели потоков и репортёр

qwen/qwen3.6-35b-a3b

Исследовательский агент

deepseek/deepseek-v4-flash

Советник-эрудит

moonshotai/kimi-k2.6

Советник-контрарианец

z-ai/glm-5.1

Советник-скептик

deepseek/deepseek-v3.2

Председатель

deepseek/deepseek-v4-flash

Проверка утверждений

deepseek/deepseek-v4-flash

Моделей пять, и все открытые: с 28 июня я держу прогон только на них, и он вышел почти втрое дешевле. Закреплено это кодом, а не договорённостью: функция выбора профиля закрытую модель не отдаёт даже по явному флагу. Два исключения записаны в докстринге того же модуля: классификатор отзывов и эмбеддинги остались на прежних моделях, но работают они до прогона, на входе данных.

Центральная функция конвейера выглядит так.

def verification_failed( verdicts: list[dict], correlations_were_empty: bool, n_correlations: int, ) -> bool: «»»[C4-FIX-002] fail-closed gate: True когда верификация физически НЕ сделана. … «»» if correlations_were_empty: return False if not verdicts: return True if len(verdicts) != n_correlations: return True return False 5f17a9d4412e274877fdb592525e8d88

Функция отвечает на вопрос «сверка вообще была», и только на него. Вердиктов обязано быть ровно столько же, сколько корреляций: если их меньше, значит часть никто не смотрел, и функция возвращает True: верификация провалена. Законное молчание тут одно: пустое окно, где корреляций не нашлось и проверять нечего.

Это и есть принцип, на котором держится всё остальное: при любой неясности ответ «нет», а не «наверное, да». Пропущенная проверка неотличима от проваленной.

Метка C4-FIX-002 — инвентарный номер поломки, из которой функция выросла. 2 июня старая проверка при непустых корреляциях и пустом списке вердиктов проходила все ветки «нет» — потому что any() по пустому списку даёт ложь — и возвращала «одобрено». Ретрай спасти не мог: оркестратор ветвился по тому же полю, которое врало. Проверка была жива, а её отрицательный вердикт недостижим.

Барьеры и что они остановили

Осторожность нужна с одним. Гейта в коде два: публикации и пост-ранный, проверяющий трассу после прогона. Знаменателей же три: пост-ранный записан дважды, в трассе прогона и в манифесте кампании, на вложенных множествах.

Барьер

Что проверяет

Прошло

Не прошло

Гейт публикации

готовность карточки к показу

24 из 31

7

Проверка утверждений

утверждение против своего доказательства; счёт по 50 карточкам корня, не по 31 прогону

4 235 из 4 383

109 провалено, 39 ограничено

Пост-ранный гейт

трассу прогона целиком

13 из 79 без замечаний

66 на ревизию

он же, срез кампании

те же трассы, только 31 прогон

9 из 31

22 на ревизию

Сборка поверх всех кейсов

пригодность кандидата к сводному анализу

3 из 23

20 исключено

Одна строка тут, впрочем, не про остановку: провал утверждения ставит пометку, но публикацию не блокирует. 87 провалов из 109 уехали на витрину внутри опубликованных карточек. Это самое мягкое место конвейера: единственный барьер про смысл и единственный без права остановки. Балансовое равенство простое: 31 = 24 + 7, и причины остановки записаны в манифесте кодами, а не свободным текстом. Ложное срабатывание распознавателя личных данных прогон всё равно оставило задержанным.

Прогон, который выглядел успехом

10 июня корреляционный скринер, сплошной перебор связей по полю, отработал: 834 теста, 51 связь пережила отбор, семь золотых проверок из двенадцати попали. Негативный контроль среди двенадцати вёл себя правильно: попадания там не ждали, и его не случилось. А одно из семи попаданий позже само оказалось календарным артефактом. Это выглядело как работающая система, и я почти сел писать про неё. Насторожило одно: у всех находок стояло одно и то же значение p — 0,000999.

Перестановочная схема сэмплировала сдвиги с возвратом вместо перебора, и p упиралось в пол: единица на тысячу и одну перестановку. Адверсариальный разбор показал анти-консервативность до 285 раз: то, что схема называла шансом один к тысяче, в худшем случае было шансом один к трём с половиной. Честный прогон на том же поле дал 719 тестов вместо 834 (фиксы подняли порог длины ряда и выкинули пары-тождества) и ноль выживших: минимальный q, то есть p после поправки на множественность, оказался 0,62. Ни одна из пятидесяти одной находки находкой не была, и из семи золотых попаданий не осталось ни одного. Барьер, который это поймал, — не гейт в коде, а требование, чтобы у распределения был предъявлен пол.

Что нашлось внутри четырёх несобравшихся синтезов

28 июля я разбирал причину деградации и нашёл вторую поломку, которую не искал. У трёх прогонов из четырёх внутренняя роль конвейера вытекла в читательский текст: девять читательских строк объясняли ограничение разбора «сбоем при слиянии данных с председателем совета директоров». Председатель есть у совета моделей внутри конвейера. Банку в этих строках выдумали орган управления.

Отдельно стоит прогон по Точке (PASS пост-ранного гейта при несобравшемся синтезе получил и Райффайзен — из четырёх деградировавших молча прошли двое): гейт публикации его задержал, а пост-ранный поставил PASS, и внутренняя роль осталась в трёх полях карточки — проверки на это тогда просто не было. Я перенёс её в источник: теперь выгрузка отклоняет внутренние роли во всех полях, попадающих на карточку.

Порог достоверности я объявил числом до прогонов: гейт требует 0,85, фактический минимум по кампании 0,9195. За кампанию порог не сработал ни разу; считается достоверность механически, долей утверждений без фантомных ссылок: это целостность ссылок, а не правдивость. Расклад исходов у опубликованных карточек при этом подозрительно ровный: 23 подтверждено, одна с недостатком данных. Гейт к ровности причастен: из четырёх вердиктов «недостаток данных» в кампании три он и задержал. Но подтверждено по кампании двадцать семь прогонов из тридцати одного, и высокая ли это доля из-за свойств вопросов или из-за мягкости оценки — разделить пока нечем.

class PublicationGateVerdict(StrEnum): PASS = «PASS» ABSTAIN = «ABSTAIN» FAIL = «FAIL» class ApprovalAttestationV1(BaseModel): «»»Content-addressed proof that all three publication gates passed.»»» … editorial_gate: Literal[«PASS»] evidence_claim_gate: Literal[«PASS»] language_gate: Literal[«PASS»]

Перечисление задаёт три исхода гейта, и непроходных среди них два. В запись аттестации типом впускается один: поле объявлено как Literal[«PASS»], и ABSTAIN с FAIL проверку в нём не проходят. Аттестации на карточку, которую гейт не пропустил, не существует как объекта: её нельзя собрать, а значит и сохранить.

Происхождение и неизменяемость данных

Корпус — все принятые исследования как одно неизменяемое целое. Имя папки исследования равно хешу тождества (банк, окно, вопрос), а имя ревизии внутри равно хешу содержимого: другие байты под тем же именем не лягут. Механизм тот же, на котором стоит git: если он вам знаком, сама адресация не новость; свои здесь только правила канона.

Чтобы хеш имел смысл, одно и то же содержимое обязано давать байт в байт один и тот же файл. Отсюда канонический вид записи: порядок ключей фиксирован, время без часового пояса запрещено, дробные числа хранятся строками. Публикация не умеет ни удалять, ни переименовывать: другие байты по занятому пути дают ошибку. Отозвать опубликованную карточку можно только новым переходом жизненного цикла, WITHDRAWN: правки старого не существует.

Под манифестом корпуса 652 файла, физически в корне 704 (разница ровно 52 — файлы блокировок, вынесенные явным правилом). Перепись работает как контракт: в ней записано, сколько карточек и какой расклад ожидается, и при другом раскладе витрина обязана отказаться, а не подстроиться.

Показанный результат вместо описания механизма

Описания механизма тут мало; вот вывод приёмки корня из репозитория.

{ «product_root»: «reports/research_case_generations/product-v7», «review_date»: «2026-07-28», «verdict»: «PASS», «gate»: «DATA_QUALITY», «disposition»: «ACCEPTED», «full_corpus_checks»: { «decimal_rebuild»: «50/50 PASS», «reader_projection»: «50/50 PASS», «html»: «50/50 PASS», «measurement_units»: «50/50 PASS», «pii»: «50/50 PASS», «public_language»: «50/50 PASS», «natasha_documents»: 50, «natasha_findings»: 0, «reviewed_false_positives»: 2 }, «sample»: {«research_cases»: 30, «defects»: 0, «seed»: 20260728, «sample_id»: «1940f43b828a4cc6d2774785c5982088…»}, «semantic_inventory»: {«managed_files»: 652, «excluded_paths»: «locks/**»}, «failures»: [] }

Шесть проверок прошли по всем пятидесяти карточкам корня (24 опубликованным, 19 внутренним, 7 задержанным гейтом): пересборка из канонического вида, читательская проекция, разметка страницы, единицы измерения, поиск личных данных, язык витрины. Отдельная выборка в тридцать карточек дала ноль дефектов; она воспроизводима: зерно лежит в самом отчёте. Вывод сокращён: убраны идентификаторы выборки, перепись корпуса, коммит сборки и семь хешей. Тот же принцип работает и на карточке: ниже фрагмент страницы из начала статьи, рядом с выводом — блок «чего нельзя утверждать», выписанный системой, а не мной задним числом.

Карточка исследования на витрине
Карточка исследования на витрине

Кадр карточки с витрины ortant.net: под выводом о росте вкладов система сама выписала четыре запрета — что именно по этому прогону утверждать нельзя.

Отдельный эксперимент: одна гипотеза на панели регулятора

Рядом с прогонами есть боковая ветка: проверить одну гипотезу статистически — не по семи потокам, а по панели регулятора. На витрине она стоит отдельной страницей и помечена пригодной только для разработки: это не то, что система выпускает наружу как исследование. В статье она нужна ради другого — на ней видно, чем отрицательный результат удерживается от подгонки.

Гипотеза записана и закоммичена до того, как посчитан результат, и после не менялась. Держится это не на датах коммитов: манифест стадии мощности несёт список разрешённого к чтению, и исходов в нём нет. Одного протокол не снимает: заморозке предшествовали недели работы с тем же полем, включая скринер из раздела о барьерах; степени свободы накоплены до фиксации. Заморожено было вот что.

Что заморожено до расчёта

Значение

Гипотеза

опережающий разрыв роста кредитов и депозитов связан с более низким последующим ростом активов

Ожидаемый знак

β < 0, проверяем только его

Модель

линейная регрессия с устойчивыми к неоднородности ошибками, HC3

Схема проверки

перестановочная по Фридману и Лейну, 9 999 перестановок

Интервал

бутстрап Маммена на уровне банка, 9 999 повторов

Поправка на множественность

Бенджамини и Хохберг, внутри семейства из трёх гипотез

Минимально значимый размер связи

0,65

Порог мощности

0,8

Минус ожидался из логики фондирования: кредиты, растущие быстрее депозитов, оставляют разрыв, который дальше должен сдерживать рост баланса. В спецификации заморожен только знак; механизм я проговариваю уже здесь, после результата.

Кого берут в расчёт, решалось до исхода: из пятидесяти кредитных организаций панели регулятора после исключения небанковских осталось 48 банков, 27 из них прошли по полноте отчётности и присутствию в корпусе, а замороженный жребий (по шесть банков из каждого терциля по активам) отобрал 18. Методы в таблице выбраны под малое число кластеров, но 18 кластеров мало при любой технике. В коде лежит явный список запрещённых входов: значения исхода, оценки эффекта и p-значения в отбор не допускаются. На это есть поведенческий тест — подмена окна исхода на заведомую чушь отбора не меняет.

Результат: β = +0,626 при бутстрап-интервале от −0,284 до 1,288, p = 0,9831, q = 0,9919. Знак противоположен предсказанному, вердикт «не подтверждено», стоимость расчёта нулевая: обращений к модели он не требует.

Чего этот результат не доказывает

Отсутствие связи я, впрочем, не доказал: формального теста на эквивалентность не делал. При поочерёдном исключении банков оценка остаётся положительной все 18 раз, минимальная +0,258: знак устойчив, величина нет. С интервалом, накрывающим ноль, это не спорит: интервал про неопределённость оценки, исключение банков про её пересчёты. Нулём в отчёте записана устойчивость ожидавшегося минуса: его не было ни разу. Но обратную гипотезу это не подтверждает: её никто не объявлял заранее. Или просто плохо искали? Минимально значимый размер связи объявлен до расчёта; симуляция дизайна при нём даёт 87,96 % при пороге 0,8. Только это мощность одного звена, теста на коэффициент, а не всей связки барьеров. Про связи меньшего размера дизайн не высказывается вовсе.

Два разреза объявлены заранее, вместе с основным: и розница, и корпоративный портфель дали плюс, причём у корпоративного оценка неотличима от нуля, а у розницы отличима; обе записи в отчёте метаанализа. Перебирать что-то ещё после результата спецификация запрещает. Объём надо назвать точно: 18 банков и 36 единиц анализа (два непересекающихся окна на банк); 1 080 наблюдений — это 18 банков на пять показателей и двенадцать месяцев.

И самая неудобная оговорка: без неё результат читается неверно. Замороженное семейство вопроса целиком лежит внутри отчётности: и признак, и исход берутся из одной формы. Межпотоковые семейства в реестре объявлены, но ни одно не дошло до полной статистической проверки: мешает та самая разреженность из начала статьи, да и поле там другое — десять банков, по которым идут прогоны, а не панель регулятора. Проверено то, на что хватило данных, а не то, ради чего строилась система. Независимой выборки нет, и до её появления результат помечен пригодным только для разработки. Отсюда и ответ, зачем этому расчёту конвейер: сам он обходится без моделей; у конвейера он берёт только корпус, по присутствию в котором отбиралась когорта.

Перестановочное распределение и устойчивость знака
Перестановочное распределение и устойчивость знака

Наблюдённое β в правом хвосте перестановочного распределения. Ожидался минус; при исключении любого банка по очереди знак не менялся. Те же числа в интерфейсе — ortant.net/research/meta-analysis.

Отдельно — чего в системе больше нет. Прогнозный слой я построил: локальные проекции по Жорда, длинные разности, кластерные ошибки. Проверка вне выборки против наивных базовых линий дала отношение ошибок 1,030 к случайному блужданию и 1,020 к авторегрессии первого порядка, то есть хуже, чем «завтра будет как вчера». 23 июня слой сначала отвязали от продакшена, а через час удалили — вместе с шестнадцатью тестами.

И признак после этого из выводов убран.

Стоимость инференса

Медиана прогона сегодня $0,132, и 84,9 процента стоимости кампании съедает один слой, поиск сигналов. Расходы держит не обещание — числа: доллар на вызов, доллар на модуль, пять на прогон, пять в сутки на витрину. Потолок проверяется до вызова по самой дорогой его версии, а серийный драйвер останавливается сам на $2,85 при потолке серии в три.

Стоимость прогона по слоям конвейера
Стоимость прогона по слоям конвейера

Совет моделей, который оказался не тем, чем я его считал

Один раз я совет сокращал. Хронолог jamba ещё 11 июня, на аудите происхождения прогона, оказался главным источником дат без основания в данных; чинил дважды: промптом, затем детерминированным пост-контролем; не помогло. Скоркард 14 июня подвёл черту: одна дожившая корреляция из шести, ноль находок, привязанных к данным банка, фабрикация 9,83 против 0,38 у следующего, 45 процентов бюджета советников.

Сам совет я проверил позже, и результат оказался не тем, ради которого он строился. Охват он даёт: из 185 связей всех тридцати одного прогона 92 нашёл ровно один советник из трёх. Точности не даёт: доля подтверждённых у найденных одним советником 62,0 процента, тремя — 58,5, и разница между одиночкой и консенсусом неотличима от нуля. Единственное прямое сравнение — на размеченном наборе из 200 отзывов: большинство из трёх моделей и одна лучшая дали одинаковую точность. Три советника съедают 82 процента стоимости прогона: они и есть начинка слоя поиска сигналов из раздела о стоимости. А то, что я считал главным доказательством их пользы, им не оказалось: выдумки снял не совет, а две регулярки, сверяющие ссылки на кластеры с содержимым промпта: 215 фантомных ссылок против четырнадцати отклонений председателем.

Итог: совет покупает охват, а не точность.

Что не работает

Что барьеры пропустили

Когда я отбирал опубликованное исследование для статьи, первый кандидат отвалился на разборе своей страницы. В блоке источников лежали 32 отзыва, и 17 из них были о других банках, восемь датированы за два года до начала заявленного окна. На одной странице одна и та же величина стояла и в триллионах, и в миллиардах рублей. Формулировка «недостаточно данных» встречалась семь раз при вердикте «утверждения проверены». Считал я это глазами по отрисованной странице: проверка единиц из приёмки смотрит только допустимость подписей, а согласованность чисел на странице не проверяет никто. И всё это прошло приёмку.

Трижды сломанным оказывался мой собственный измеритель

Барьер проверяет вывод. А кто проверяет барьер? Ответа три, и все три неприятные. Инструкция о заземлении не доходила до шести слоёв из семи: она стояла за служебным маркером конца промпта, а тест проверял, что файл читается, — не что текст доехал до модели. Тест был зелёный, механизм мёртвый.

Промпты резались на вложенном ограждении кода, и проверяющий видел 58 строк из 243; на этих обрезках уже была проведена серия сравнений моделей, и повтор на полных промптах вывод перевернул. А «тяжёлые банки», которых я нашёл и записал, оказались багом регулярки: граница слова не срабатывала перед T в метке времени.

Что это доказывает

Ни одно из чисел выше не доказывает, что система отвечает верно.

Доказывают они другое: она умеет отказывать, отказ виден снаружи, и цена отказа названа. Отказывает пока по форме: барьер ловит то, под что заточен.

Что при этом построено и работает: витрина с 24 принятыми исследованиями и десятью досье банков, конвейер из двенадцати стадий, который доводит вопрос до карточки за 12,8 минуты и $0,132, и три барьера — за кампанию они задержали семь прогонов из тридцати одного.

Проверять на слово ничего не нужно: и карточки, и их отказы, и цены прогонов, и дыры покрытия открыты на сайте без входа.

Артефакты и ссылки

Витрина: https://ortant.net — 24 принятых исследования, десять досье банков, карта покрытия с дырами, методика, конструктор запроса. Там же лежит всё, о чём я писал выше: страница каждого исследования с блоком «чего нельзя утверждать», раздел «Система» с ценами и фактическими тратами. Запуск нового исследования идёт по ключу, остальное открыто без входа. Отчёт метаанализа стоит отдельной страницей: https://ortant.net/research/meta-analysis — замороженная спецификация, результат, устойчивость при исключении банков, расчёт мощности.

Репозиторий: https://github.com/Ortant333/ortant-banks — снимок без истории разработки. Внутри манифест прогонов с полем публикации и кодом причины остановки: балансовое равенство пересчитывается одной строкой. Там же события жизненного цикла, по файлу на переход, отчёт приёмки корня с зерном выборки и манифесты стадий метаанализа: outcomes_read: false, список разрешённых к чтению файлов, отметка «опубликовано до доступа к исходам».

Если что-то из этого не сходится с текстом, считать надо файл.

Числа в статье срезаны на 31 июля 2026 года.

Источник: habr.com

Оцените материал:

Поделиться
Понравилась статья? Расскажите другим
ВКонтакте
Читайте также
Новости робототехники План оздоровления компании Lucid основан на экономии 1,4 млрд долларов денежных средств и развитии роботакси. Архив рубрики ~Обо всем~ Иридиевый катализатор селективно расщепил полиуретан в смеси пластиков. Это поможет перерабатывать спортивную одежду и купальники Новости робототехники Робот с дугами на спине прокатился с горки. Он умеет подтягиваться на руках и перекатываться через голову Новости робототехники Zoox представляет собой готовый продукт для производства роботакси для расширения в США. Архив рубрики ~Обо всем~ Рыбы-симбионты ускорили заживление ран у кораллов. Раны затягивались на 38–55 процентов быстрее Новости робототехники Гуманоиды не будут масштабироваться на заводах, пока затраты не снизятся. Новости робототехники Музыкальный фрагмент из фильма ужасов вдохновил на создание носимого устройства, превращающего движения робота в предупреждающую музыку. Архив рубрики ~Обо всем~ Длину бедра назвали маркером риска сахарного диабета. Ученые нашли его с помощью машинного обучения и использовали в скрининговом тесте Архив рубрики ~Коротко из Telegram~ Стартап Autonomous представил физический ключ Autonomous Key с помощью которого… Архив рубрики ~Коротко из Telegram~ Kimi K3 теперь можно бесплатно погонять на 50 млн токенов… Архив рубрики ~Коротко из Telegram~ Генерим лучшие резюме, которые проходят ИИ-скрининг и попадают к живым… Архив рубрики ~Коротко из Telegram~ Автономный агент OpenAI на бенчмарке ExploitGym (с намеренно отключёнными… Архив рубрики ~Коротко из Telegram~ Профили Telegram готовятся к масштабному обновлению — дизайнер мессенджера… Новости робототехники Reimagine Robotics выходит из скрытности с роботами, которые «обучаются на работе» Новости робототехники План оздоровления компании Lucid основан на экономии 1,4 млрд долларов денежных средств и развитии роботакси. Архив рубрики ~Обо всем~ Иридиевый катализатор селективно расщепил полиуретан в смеси пластиков. Это поможет перерабатывать спортивную одежду и купальники Новости робототехники Робот с дугами на спине прокатился с горки. Он умеет подтягиваться на руках и перекатываться через голову Новости робототехники Zoox представляет собой готовый продукт для производства роботакси для расширения в США. Архив рубрики ~Обо всем~ Рыбы-симбионты ускорили заживление ран у кораллов. Раны затягивались на 38–55 процентов быстрее Новости робототехники Гуманоиды не будут масштабироваться на заводах, пока затраты не снизятся. Новости робототехники Музыкальный фрагмент из фильма ужасов вдохновил на создание носимого устройства, превращающего движения робота в предупреждающую музыку. Архив рубрики ~Обо всем~ Длину бедра назвали маркером риска сахарного диабета. Ученые нашли его с помощью машинного обучения и использовали в скрининговом тесте Архив рубрики ~Коротко из Telegram~ Стартап Autonomous представил физический ключ Autonomous Key с помощью которого… Архив рубрики ~Коротко из Telegram~ Kimi K3 теперь можно бесплатно погонять на 50 млн токенов… Архив рубрики ~Коротко из Telegram~ Генерим лучшие резюме, которые проходят ИИ-скрининг и попадают к живым… Архив рубрики ~Коротко из Telegram~ Автономный агент OpenAI на бенчмарке ExploitGym (с намеренно отключёнными… Архив рубрики ~Коротко из Telegram~ Профили Telegram готовятся к масштабному обновлению — дизайнер мессенджера… Новости робототехники Reimagine Robotics выходит из скрытности с роботами, которые «обучаются на работе»

Оставить комментарий