Skip to content

Tags

Tags give the ability to mark specific points in history as being important
  • t0198-f2f3-spec-2026-10-03

    TODO-0198: F2/F3 SPEC, gate 'не хуже хардкода', каркас + эксперты
  • p3-routing-kind-2026-10-03

    P3 Э-3: routing_kind + честный знаменатель, 379/541 = 70.1%
  • p1-audit-0174-2026-10-03

    TODO-0174 P1: аудит шага — ОТКЛОНЁН, 5 блокеров
    
    Коммит bf88254 содержал только тест (1 файл, +417) без кода, который он
    проверяет. Независимый аудит переполучил все числа и нашёл:
    
    1. В коммите нет кода, сообщение коммита описывало 5 файлов.
    2. Охранный тест test_stand_covers_new_paths пересобирает стенд у себя
       (свой SQLite + save_news_hits + add_proactive_trigger). Настоящий стенд
       делает только init_store. Оба мира дают 51, наборы разные 2-на-2.
       Реальный стенд не задевает 4 из 10 зон (news_digest 0/14,
       reminder_cancel_miss 0/14, context_overflow 0/7, web_search_digest 0/14).
    3. reminder_topic: перестановка _CALENDAR_TOPIC меняет 5 из 6 проб
       mention -> calendar.
    4. skills.py:1587 — английский ответ стал немецким («aktualisiert.»).
    5. conftest.py: reload(server) переприсваивает server._relay_rooms новым {},
       test_relay.py держит старый объект из коллекции ->
       test_relay_duplex детерминированно падает (1 failed/113 passed против
       114 passed на исходной фикстуре). Правка при этом не нужна.
    
    Плюс 4 крупных (_TOPIC_CREATE пере-матчит «listeme 3 ekle»; _FORGET
    починил 2 языка из 7; 17 мёртвых строк skills.py:1615-1631; литералы
    yumurta в продовом regex) и 3 мелочи.
    
    Полный прогон agent_core: 1 failed, 1928 passed, 3 skipped, 462 subtests,
    772.02s — единственный сбой это блокер 5.
    
    Состояние зафиксировано для разбора, НЕ как принятая работа.
    Отчёт: TODOs/TODO-0174/P1-AUDIT-2026-10-03.md
  • plan-0174-improvement-order-2026-10-03

    TODO-0174 improvement order: P0 before F1
  • plan-0198-nemotron-diarize-2026-10-03

    TODO-0198 JUN-READY: Nemotron-3 diarization plan
  • plan-0196-cloud-plans-2026-10-02

  • strategy-2026-09-30

    TODO-0194 · стратегия корпуса против хардкода и запрет регресса
    
    Прод не трогаем: 77.3% против 82.8% означает, что модель проигрывает собственной
    исходной логике.
    
    Измерено, почему хардкод побеждает. 75.5% корпуса сидит в четырёх метках, из них
    47.6% — класс <LLM>. 4702 строки (13.1%) — настоящие намерения, помеченные
    «инструмента нет», потому что регулярка не распознала: «запоини что я в Берлине»
    это memory_remember. Мы учим модель отказывать там, где регулярка сдалась, то
    есть на своём поле. Языки вымирают незаметно: fr закрывает 12 намерений из 73.
    
    Концепция: хардкод есть конечный перебор паттернов, и если носитель обучения
    подмножество этих паттернов, модель по построению не может его превзойти. Поэтому
    разметка перестаёт быть выводом регулярки и становится конструкцией, генерация
    идёт от семантической рамки, слой <LLM> делится на три класса, на каждое
    намерение ставится пол и потолок.
    
    Храповик запрещает регресс: 85 полов по языкам и намерениям могут только
    растивать. Проверено вживую — итерация с растущим агрегатом и умирающими
    uk/tr/es/fr отклонена. Тактическая честность: расхождение ledger с последним
    замером обнаруживается, иначе вписанный вручную floor 99.9 заблокировал бы все
    честные итерации навсегда.
    
    Золотой набор пуст: без человека он останется пустым, и это единственная опора,
    которую нельзя сгенерировать.
  • counterfactual-2026-09-30

    TODO-0193 · контрофактик: 901 строка зря уходит в LLM, но исполнить метку нечем
    
    Интеграция в бой заблокирована конструктивно, а не организационно: 30 функций
    try_*, ноль адресуемых по имени метки. Тень вместо роутера.
    
    Из 10977 тестовых на 1406 регулярки сдались при реальном намерении, и модель
    указывает верный инструмент на 901 — 8.2% трафика. Потолок 91.0% против 82.8%.
    
    Порог доверия непригоден: точность падает с уверенностью, 26.9% на margin 0.99.
    План «порог 0.85 → раскатка» в исходном виде нерабочий.
    
    Первая версия скрипта выдала выдуманные «1.1%» из-за чужого токенизатора.
    Воспроизведение метрики из compare.json поставлено предохранителем перед любым
    выводом — сработал и заблокировал мусор.
  • autopilot-2026-09-30

    TODO-0192 · автономный прогон, сверка с живым Алексом, гипотезы против фактов
    
    Одна команда без агента: пайплайн, сверка с ЖИВЫМ инстансом по HTTP в
    работающий контейнер, проверка гипотез, заявка круглым столам.
    
    Сверка идёт по трём осям сразу — язык × флоу × домен, пять флоу: canon, typo,
    hedge, partial, compound. 30 сценариев, живой ответил на все 30.
    
    Гипотезы против фактов: 7 подтверждено, 1 опровергнута. Важнее самого этого —
    механизм сначала ВРАЛ: операторы > и < не были реализованы вовсе, и вердикты
    выходили случайными, а в отчёт не писались total/replied, из-за чего факт
    читался нулём. У каждой оператора теперь тест на границе, а check_hypotheses
    принимает гипотезы и факты параметрами, иначе его нечем тестировать.
    
    По стендам честно: круглые столы в репозитории — разбор архитектуры экспертами,
    гостевых фраз на семи языках там нет. Синтезировать немецкие и турецкие
    экспертные диалоги я не стал — это тот же класс выдумки, что дал 6002 смеси
    языков и +23.9 п.п. роста бенчмарка, принятого за рост модели. Заявка собрана,
    метки без сида перечислены, требования к реплике прописаны.
  • iter0191-handoff-2026-09-30

    TODO-0191 · виток закрыт, передача джунам и Талосу
    
    Ветка iter/0190-ml-router. Прод не тронут.
    
    ЧТО РЕАЛЬНО СДЕЛАНО
      корпус 36 016 строк · 2 131 сид · 7 языков · 74 метки
      модель 77.3% против живых 82.8%, разрыв 5.5 п.п.
      ни один язык не ниже 67% (было 13% на fr)
      ONNX opset 17, seq динамический, сверка с fp32 3.81e-06
      67 тестов пайплайна, 1 751+ тест на проду
    
    ЧТО НЕ ДОСТИГНУТО И ПРЕДСКАЗАНО ЗАРАНЕЕ
      гейт 85% не пройден, и он не будет достигнут увеличением модели: гибрид
      уехал в порог 1.0, в бою берутся одни регулярки; модель выигрывает только
      там, где регулярок нет (lat 54.9% против 29.6%)
      главный остаток — 100 непереведённых слотов каталога и инциденты только на
      ru/de/en (2/2/2/0 в остальных). Это перевод, а не код
      77.3% оптимистичны: все 10 977 тестовых строк участвовали в выборе порога,
      отложенного набора не существует
      модель на NPU не запускалась: формат готов, совместимость с XDNA не проверена
    
    ЧТО СРАБОТАЛО И ПОВТОРЯЕМО
      заморозка нижних 6 слоёв +32 п.п. на dev и lr=1e-4 после неё +12.6.
      Обе оси от узкого места Radeon 890M, а не от архитектуры. На другом железе
      перепроверить обе.
    
    ОДИННАДЦАТЬ УРОКОВ в SPEC.md раздел 5 — от «меряй, где теряется результат»
    до «set("a-z") даёт три символа, а не диапазон». Каждый стоил реального прогона.
  • iter0190-close-2026-09-30

    TODO-0190: кривая объёма, раунд 2 авто-поиска, ONNX для NPU
    
    Кривая объёма больше не плоская: 5.24% на 20 сидах → 20.41% на 300, дальше
    спад -3.4 п.п. Объём помогает, но не бесконечно. Помеха названа: подрезка по
    сидам убирает и метки, поэтому кривая мерит «объём + состав» вместе.
    
    Раунд 2 авто-поиска: lr=1e-4 дал dev 17.69% → 30.35%. Вместе с заморозкой
    6 слоёв из раунда 1 — около +45 п.п., и обе оси от узкого места Radeon 890M,
    а не от архитектуры модели.
    
    Экспорт ONNX сделан и проверен: 110 КБ граф + 471 МБ весов, opset 17,
    74 метки, seq динамический, расхождение с fp32 3.81e-06, метки совпали 5/5.
    На NPU не запускалась — формат корректен, совместимость с XDNA не проверена.
    
    Итог: модель 77.3% против живых 82.8%, разрыв 5.5 п.п.
  • paraphrase-seeds-2026-09-29

    TODO-0188 · перефразы: +23.9 п.п. оказалось мусором, честный результат 61.6%
    
    Перефразы вместо вариаций — правильная идея: у большинства меток был ровно один
    сид, и из-за этого нельзя было построить честный отложенный набор (dev сжался
    до 58 строк и трёх меток, кривая «объём → точность» вышла плоской на всех
    объёмах). Перефраза — это независимый сид, и это разблокировало валидацию.
    
    ПЕРВАЯ ЦИФРА БЫЛА НЕВЕРНОЙ, И ВОТ ПОЧЕМУ. Прогон дал «47.3% → 71.2%», что
    выглядело отличным результатом. Проверка на смешение языков показала:
    
        'а, не мог бы ты merke dass ich in berlin bin'   ← русский + немецкий
        'ну, не мог бы ты retiens que je vis à berlin'  ← русский + французский
        'короче, не мог бы ты hatırla ki berlin'deyim'  ← русский + турецкий
    
    Словари синонимов и рамки вежливости РУССКИЕ, а применил я их ко всем языкам.
    20 514 из 32 729 перефраз — 63% — оказались смесью двух языков, попали в корпус
    с метками от живого кода и обучали модель мусору. Именно поэтому вырос и
    эталон: регулярки узнавали двухязычный мусор лучше модели, и «рост» на 23.9
    пункта был ростом БЕНЧМАРКА, а не модели.
    
    Починено: генерация разрешена только языку с собственным словарём, то есть
    пока только русскому. Покрыто тремя тестами, включая прямой — немецкий сид
    обязан дать ПУСТО, а не смесь.
    
    ЧЕСТНЫЙ РЕЗУЛЬТАТ после починки
      было  8 968 строк, 533 сида, модель 47.3%, живой 56.4%
      стало 17 229 строк, 905 сидов, модель 61.6%, живой 71.9%
    Разрыв сократился с -9.1 до -10.3 п.п. — почти без изменений, и это правда.
    Модель выигрывает у регулярок на en (+19.3), de (+0.9) и lat (+50.8),
    проигрывает на ru, es, tr.
    
    ГЛАВНЫЙ ЭФФЕКТ ПЕРЕФРАЗ НЕ В ЦИФРЕ ТОЧНОСТИ, А В СТРУКТУРЕ: меток с двумя и
    более независимыми сидами стало 61 из 72 вместо 20 из 65. Именно это сделало
    валидацию различающей и открыло возможность честно измерить зависимость от
    объёма, а не гоняться за процентами.
    
    ОСТАЛОСЬ: словари переводов не написаны, поэтому перефразы только на русском,
    а нехватка данных больше всего именно у de/en/fr/es/uk/tr. Это следующий рычаг
    и следующая задача.
  • hybrid-dispatch-2026-09-29

    TODO-0186 · гибрид «модель/регулярки»: 63.7%, и где именно расходятся
    
    Главный результат: раз регулярки остаются в бою, спорный вопрос не «лучше ли
    модель», а где каждая линия выигрывает.
    
        модель 57.4%   живой 53.4%   ГИБРИД 63.7% при пороге доверия 0.08
    
    Порог — плато 0.08..0.32 в пределах 1 п.п. от лучшего, то есть не остриё.
    Проверено тестом: гибрид обязан быть не хуже обеих чистых линий, а порог
    обязан лежать плато, а не быть одиночным максимумом. Оба свойства зафиксированы
    тестами, иначе «порог 0.08» нечем было бы защитить от подгонки.
    
    ТАБЛИЦА ПАРИТЕТА, 65 ИНСТРУМЕНТОВ — TODO-0186/PARITY.md
    
    Артефакт, который едва не провёл. Первый подсчёт дал «регулярки выигрывают
    56% строк, модель 37%». Разбор: метка <LLM> занимает 324 строки из 1414, то
    есть 23% теста, и на ней регулярки дают 96% против 54.9%. Но <LLM> — не
    навык, а «ничего не вернуть», и правильный ответ там и есть пустой ответ:
    выигрыш по построению. Без отделения этого класса вывод ПЕРЕВОРАЧИВАЕТСЯ.
    Столбец «реальный навык» в таблице теперь несёт это явно.
    
    Честная картина по 64 реальным навыкам:
        модель    41 метка, 518 строк (48%)
        регулярки 15 меток, 463 строк (42%)
        ничья      8 меток, 109 строк (10%)
    
    Закономерность, которая делает гибрид осмысленным: модель сильна там, где
    регулярок НЕТ (companion_seed 0%→100%, prompt_help 26%→93%), и слаба там, где
    регулярки заточены (reminder_set 76%→21%, memory_forget 71%→27%, короткие
    menu_подписи 83%→54%). Ни одна чистая линия не выигрывает — только диспетчер.
    
    ДВА ДЕФЕКТА, КОТОРЫЕ НАДО РАЗОБРАТЬ
      companion_shelf_recommend — модель 0.0% при 40 строках. Не «плохо», а ровно
      ноль: похоже на вырождение класса в тренировке.
      reminder_set — 20.7% против 75.9%, целое семейство напоминаний.
    
    ВАЛИДАЦИЯ, ТРИ ПОПЫТКИ, КАЖДАЯ ВСКРЫЛА СВОЙ КЛАСС ОШИБКИ
      нарезка по строкам → val 97.6% при test 60%: измеряет запоминание;
      нарезка по сидам → val падает 43→35, test растёт 42→52, и early-stop выбрал
      ХУДШУЮ эпоху, потому что у 45 из 65 меток сид ровно один и он целиком уходил
      в валидацию, метка исчезала из обучения;
      только метки с >=2 сидами → val и test движутся вместе (45.0% и 61.2%).
    Guard на потерю меток при отрезании теперь есть, и он покрыт тестом.
    
    ЧЕСТНО ПРО ЦИФРУ: гейт 85% НЕ пройден (модель 57.4%). Прошлые 89.3% были на
    одних say_ru, самом лёгком подмножестве. Все 1414 тестовых строк участвовали
    в выборе порога, поэтому 63.7% — оптимистично: отложенного набора у нас нет.
    Гибрид нигде не применён в коде, это расчёт, не боевая логика.
  • domain-registry-core-2026-09-29

    TODO-0182/0183 · домены незнания: ядро готово, до продукта не доведено
    
    Смена постановки за день, зафиксирована честно.
    
    БЫЛО: «автодобавление неизвестных тем» — то есть сбор фраз.
    СТАЛО: регулярная проверка ДОМЕНОВ, где Алекс не спец, и три разных ответа:
    домена нет — спросить; домен в работе — сообщить со сроком; срок наступил —
    сообщить самому.
    
    Ключевая развилка, которую я упустил в первой постановке: фраза != домен. Про
    марки велосипедов, про марки машин и «а BMW надёжный» — три фразы, один домен.
    Сбор по фразам дал бы 402 записи и ноль инсайта. Домены уже названы в
    shelf_competence.v1.json: 71 роль, 61 уникальный, вторая таксономия не заводится.
    
    ГОТОВО И ПРОВЕРЕНО (TDD, 11 тестов)
    - observe(): один домен — одна запись со счётчиком, не папка на вопрос
    - reply_for(): спросить / «уже работаю, ориентир на дату» / «теперь в теме»
    - check_due(): какие сроки наступили
    - seed_from_competence(): 61 домен «уже спец» — по ним молчит
    Регресс: 1775 passed, 462 subtests (было 1764, +11).
    
    НЕ ПОДКЛЮЧЕНО К ПРОДУ
    domain_registry.py не вызывается ни одним обработчиком. Никто не зовёт reply_for,
    никто не зовёт check_due. APScheduler в проекте нет, отдельного воркера в compose
    нет — периодика требует правки фонового потока агента, то есть production-кода в
    критичном пути. Остаток завёлся отдельным TODO-0183, работа остановлена владельцем.
    Прод не тронут.
    
    ДВА РЕШЕНИЯ, КОТОРЫЕ НЕЛЬЗЯ ПЕРЕПИСАТЬ
    - check_due() подсвечивает срок, но НЕ завершает работу. Срок наступил != работа
      сделана. Если дату подтверждает таймер, Алекс начнёт врать «стал спец» по
      календарю — тот же класс выдумки, что TODO-0181. В done переводит только
      ручной complete().
    - «Изначально компетентный» и «стал компетентным» — разные вещи. Их смешал,
      Алекс хвастался «кстати, теперь в теме» тем, что и так умеет, на каждом
      вопросе. Тест поймал, добавлено поле known.
    
    УРОК ДНЯ, ЗАПИСАННЫЙ В 0177/0179/0180
    Симптом «ответ оборвался на третьем пункте списка» имел ДВЕ причины: потолок
    120 токенов и обрезку по предложениям. Я закрыл первую, не проверив на проде, и
    объявил победу. Симптом «плохой топ-10» оказался добивкой не-немецкими марками,
    а не повторами, которые я закрыл и записал в графе «сделано». Общее: выбирать
    параметр по названию и называть закрытым то, что не проверено на живом ответе.
  • reply-truncation-lists-2026-09-29

    TODO-0177..0181 · обрезанные ответы разобраны до причины, grounding ждёт решения
    
    За день снят один симптом с двумя разными причинами и один симптом, у которого
    причина оказалась не той, что думали.
    
    ЗАКРЫТО
    - TODO-0179: _clip_voice резал нумерованные списки посредине. Разрез шёл по
      `[.!?...] + пробел`, а пункты разделены \n, который в класс не входит — весь
      список склеивался в одно «предложение» и отсчёт до voice_max_sentences=3
      не совпадал с пунктами. Строка в 79 символов с хвостом «3.» воспроизводится
      из _clip_voice(full, 3) побайтово. После фикса: 99 и 921 символ доезжают.
    - TODO-0177: потолок генерации 120 → 1024 токенов, ALEX_MAX_TOKENS.
    - TODO-0180: дубликаты в одном списке (модель добирала «топ-10» повторами,
      Specialized и Cube шли дважды). Повторы убраны, потеря пунктов сказана вслух.
    
    ОТКРЫТО, ЖДЁТ РЕШЕНИЯ ВЛАДЕЛЬЦА
    - TODO-0181: Алекс добивает «топ-10» не-немецкими марками и ОБОСНОВЫВАЕТ их
      («Bianchi итальянский, но компоненты связаны с немецкими рынками»). Проверить
      факт регуляркой нельзя, эвристика выкинет настоящие Cube и Canyon вместе с
      мусором. Нужен grounding-слой либо запрет добивать список до N.
    
    ЧЕСТНО ПРО ПРОВЕРКУ
    - Фикс 120 → 1024 объявлен закрытым и не закрывал симптом: «топ-10 марок» —
      это ~25 токенов, при лимите 1024 обрезаться не может. Симптом имел две
      причины, я закрыл одну и не проверил на проде сразу.
    - Детеп повторов задеплоен и на живом ответе не сработал ни разу. Настоящая
      причина — добивка неподходящими брендами. Закрыт симптом, выглядевший
      причиной.
    - Правильный первый шаг в обоих случаях — curl на бэкенд и длина ответа,
      а не выбор параметра по названию.
    
    Прод: смоук 14/0, регрессия 1764 passed, 462 subtests. Ответы упираются в 1024
    токена при длинных обоснованиях — отмечено, не чинилось.
  • proactive-alarm-accepted-2026-09-26

    TODO-0169 · будильник напоминаний принят владельцем в браузере
    
    Сквозной сценарий подтверждён: постановка голосом → подтверждение с меткой
    времени → пузырь в чате → модал со списком и деактивацией → звонок → голос на
    звонке («Внимание. …»).
    
    Эта приёмка закрыла 4 бага, невидимых в коде: клиентский навык перехватывал
    команду (R20), цепочка брала таймер один раз при открытии страницы (R21),
    shell-ловитель съедал команды с числом (R22), парсер не знал форм времени без
    числа (R23). Плюс R24: клиент теперь сообщает метку сборки, service worker
    обновляется сам.
    
    Итог: agent_core 1746 passed, FE 345, tsc чисто, локали 181=181 ×7,
    lang_audit 41×7.
  • inventory-0174-f0-2026-09-26

  • proactive-reminder-reltime-build-2026-09-26

  • plan-0174-intent-truth-learn-2026-09-26

    TODO-0174 epic plan: phrase→allowlist tool→truth→self-learn (F0–F7)
  • proactive-reminder-truth-2026-09-26

    LLM больше не выдумывает напоминания и не врёт об удалении