Skip to content

Releases

v0.7.0

Choose a tag to compare

@github-actions github-actions released this 26 Aug 08:16
2a8dc49

Что нового

  • Лежащее хранилище стало сигналом, а не двадцатью минутами тишины (PRI-268). При
    остановленных контейнерах prepare_task_context отвечал через десятки минут и отдавал
    обезличенный пробел «статус индекса недоступен»: ни причины, ни лекарства — а solve-task
    молча собирал бриф на выпотрошенном контексте, внешне неотличимом от полного.
    • Каждая запись gaps несёт cause и remedy. cause — storage_unavailable либо
      unknown; remedy — команда reviewer start или null, если хранилища удалённые
      (локальному docker-стеку там нечего чинить). Скилл ветвится по машиночитаемому классу, а
      не по прозе reason. Расширение аддитивное: section и reason на месте, прежние
      потребители не ломаются.
    • Первая упавшая секция замыкает остальные. Восемь из девяти секций ходят в стор, и
      каждая ждала собственный 30-секундный таймаут пула. Теперь первая недоступность взводит
      флаг на один вызов, остальные секции получают свой default и запись «пропущено: хранилище
      не отвечает». Ответ — один таймаут вместо восьми, при этом payload по-прежнему содержит
      все девять ключей.
    • Причина определяется по типу исключения, а не по тексту (reviewer/storage_health.py):
      в тексте psycopg.OperationalError живёт DSN с паролем. Под «хранилище лежит» попадают
      psycopg.OperationalError (а с ним и psycopg_pool.PoolTimeout — его подкласс) и neo4j
      ServiceUnavailable/SessionExpired. psycopg.ProgrammingError и neo4j AuthError —
      намеренно нет: ошибку схемы и неверные креды reviewer start не лечит, и маскировать их
      под «инфраструктура лежит» значило бы врать.
    • «Доска не настроена» больше не выглядит как «доска недоступна» — пробел warm_board
      различает эти два случая.
    • index_batch перестал ломиться в мёртвый пул по задаче за раз. Было 47 задач × 30 с;
      теперь первый же сбой соединения гасит все store-фазы пачки, включая граф. Шаг
      эмбеддингов под флагом не выполняется — квота Voyage (3 RPM / 10K TPM) не тратится на то,
      что некуда записать. Длина результата и инвариант watermark сохранены: пропущенные задачи
      получают retry_required: true, курсор не двигается. Тот же флаг заведён в
      refresh_meta_batch.
    • Новый шаг 0a. скилла solve-task, перед всеми прочими проверками. Скилл называет
      потерянные секции и предлагает три варианта: «Поднять сейчас» (reviewer start,
      показывается только при наличии remedy), «Подниму сам» (пауза до подтверждения, затем
      один повторный prepare_task_context), «Продолжить без контекста» (запись в
      Constraints / open questions брифа). В full-auto вопрос не задаётся: берётся первый
      вариант, а без remedy — третий, решение пишется в run-state. Сервер контейнеры не
      поднимает никогда
      — он называет лекарство, применять его решает человек.
  • Офлайн-харнесс: context-recall — второй знаменатель качества брифа (PRI-261, PRI-262,
    PRI-266). core-recall меряет файлы, которые надо изменить; файлы, которые надо
    прочитать, он структурно не видит — ни в recall, ни как штраф precision. Новый знаменатель
    — контекстное ядро из графа: соседи по исходящим CALLS/IMPLEMENTS на один хоп от
    символов, задетых диффом.
    • Метрика офлайн-only: считает python -m eval.solve_task_metrics replay; в таблицу
      brief_quality и в онлайн-снимок она не пишется.
    • Новый флаг прогона --context-seeds: lines — разрешённые имена берутся только с
      изменённых строк; lines+signature (дефолт) — плюс имена из шапки символа-сида
      (декораторы, аннотации параметров и возврата, дефолты, базы классов). Режим — рычаг
      рантайма, а не правка кода между замерами: обе стороны A/B обязаны сниматься одним
      исходником.
    • Новые строки агрегата — context-recall (медиана), union-precision (медиана),
      context измерено, context без точки измерения; новые колонки по задаче — ctx,
      ctx_hit, ctx_recall, u_prec; отдельный блок «Статусы контекста» — это шкала
      обхода, а не измерения по ядру.
    • Пустой знаменатель и неопределимый называются разными именами:
      empty_context_denominator (обход дал пусто), undefined_context_denominator
      (изменённое ядро целиком не-Python — сидов не возникнет ни при какой настройке фильтра;
      таких 14 из 65), context_retrieval_failed (сбой самого обхода).
    • Гейт «≥ 50 % осмысленных путей» взят со второй попытки, и обе стороны остались в отчётах:
      сидирование целым символом — 41.8 %, отрицательный результат (PRI-261); построчное
      сидирование — 64.0 % (PRI-262); возврат покрытия шапкой сигнатуры — 33 задачи с
      измеренным знаменателем вместо 31 при точности 58.6 % (PRI-266). Цена размена названа,
      а не сглажена: мусорных путей 76 → 9, но и осмысленных 23 → 16.

Изменено

  • Стартовая панель solve-task стала дословной и полной. Три вопроса — Brief model tier,
    Interaction mode, Execution strategy — задаются одной панелью с этими заголовками;
    переформулировать их своими словами, дробить на несколько панелей или опустить любой из трёх
    запрещено. После ответа скилл сверяется, что спросил все три, и добирает недостающее
    немедленно: ответы управляют преflight-вопросами, поэтому поздний ответ не управляет ничем.
  • Константа RRF объявлена ровно один раз (PRI-267) — reviewer/rrf.py::RRF_K. Оба SQL
    (index/store.py, tasks/store.py) берут её именованным параметром, числового литерала в
    знаменателе нет вовсе. План запроса не изменился — замер EXPLAIN приложен к спеке.

Исправлено

  • Прогон офлайн-харнесса больше не стирает ручной разбор отчётов (PRI-265). snapshot и
    replay переписывали eval/*_report.md целиком, унося накопленные разборы приёмок —
    единственное место, где живут числа и оговорки прошлых замеров. Граница теперь проводится
    явным маркером <!-- generated:end … -->, хвост за ним переносится дословно (срезом
    исходной строки, а не пересборкой), а отчёт без маркера прогон отвергает до дорогой
    части — не после того, как Voyage и обход графа уже отработали.

v0.6.0

Choose a tag to compare

@github-actions github-actions released this 19 Aug 09:24
bb5c875

Что нового

  • Секция ## Relevant code брифа solve-task перестала показывать два файла из
    двадцати.
    Задача формулируется абзацами и списками, а ретрив шёл одним размытым
    запросом: медиана core-recall была 0.225. Сквозной итог четырёх рычагов на одном
    индексе — медиана 0.75, bulk-медиана 0.5833.

    • Мультизапрос с RRF-слиянием (PRI-255). Подзапросы извлекаются детерминированно —
      пункты списков под «что сделать» / «критерии приёмки» плюс пул технических
      идентификаторов, до 20 штук; эмбеддятся одним батчем, выдачи сливаются RRF.
      Реранка в этом пути нет намеренно: cliff-отсечка по скорам реранкера против
      многотемного запроса и была механизмом, схлопывавшим выдачу до двух файлов.
      Вырожденный вход (задача без списков) даёт один подзапрос и прежнее поведение.

    • Файловый бюджет секции — новый блок .review.yml context_limits.code_section
      (PRI-256, PRI-259). Раньше выдачу резала арифметика, а не ранжирование: 15 чанков
      по 2000 символов упирались в общий потолок 8000 — до сборщика брифа физически
      доезжали 4 блока, остальные 11 отбрасывались молча.

      • max_files (20) — сколько различных файлов попадёт в секцию;
      • max_chunks_per_file (1) — сколько чанков берётся с одного файла;
      • chars_per_file (975) — доля символов на файл; ниже этого значения в блоке
        перестают читаться сигнатура символа и несколько строк тела;
      • max_augmented_files (3) — резерв слотов под подмешанный сигнал (ниже).

      Дефолты подобраны замером: обмен ширины на глубину (было 12 файлов по 1300
      символов) плюс рост операционного бюджета на 25 % — ширина покупает recall
      напрямую, глубина метрикой не измеряется вовсе, поэтому у chars_per_file
      есть пол, взятый не из метрики.

    • Подмешивание diff-путей похожих задач (PRI-257). Файл, который гибрид нашёл, но
      ранжировал слишком низко, теперь доезжает до секции: пути реальных диффов похожих
      задач берутся из истории прогонов (brief_quality), а при пустой истории — из
      git по ключу задачи и его алиасам. Резерв фактический: без кандидатов гибрид
      получает бюджет целиком. Сколько файлов пришло не из гибрида, видно прямо в тексте
      секции — нота — подмешано N файлов: similar-diffs (квота Q). Замер: медиана
      core-recall 0.5 → 0.75, 28 попаданий в ядро на 35 подмешанных путей, ни одной
      задачи с падением.

  • Replay-режим офлайн-харнесса — рычаг ретрива теперь можно измерить до мержа
    (PRI-254). python -m eval.solve_task_metrics replay прогоняет ретрив по корпусу
    задач на живом индексе и печатает A/B против сохранённого снимка:

    • --variant — что прогонять: baseline (текущий прод-путь), limits (он же с
      оверрайдами), multiquery, similar_paths;
    • --set РАЗДЕЛ.КЛЮЧ=ЗНАЧЕНИЕ — оверрайд лимитов для limits, повторяемый;
    • --baseline last|-N|имя-варианта — переиспользовать снимок как сторону «до»
      вместо повторного прогона;
    • --limit N — усечь корпус (снимок помечается частичным), --repo, --branch.

    Снимок пишет ветку и sha индекса: сравнивать стороны, посчитанные на разных
    индексах, бессмысленно, и теперь это видно.

    • python -m eval.solve_task_metrics subqueries — распределение числа подзапросов
      по размеру задачи.
  • reviewer config show перестал врать про потерянные подсекции (PRI-260). Слияние
    слоёв политики стало рекурсивным: домашний слой, сказавший про один лист, больше не
    уносит соседние ключи коммиченного .review.yml.

    • sources и shadowed называют путь до листа
      (context_limits.code_section.max_files), а не верхний ключ — иначе «подсекцию
      затёрли» неотличимо от «её и не было».
    • task_board — единственный атомарный ключ, сливается целиком: частичный домашний
      task_board: {type: jira} поверх коммиченного yougile дал бы конфиг доски,
      которого не писал ни один слой.
    • Явный пустой mapping (context_limits: {}) — это высказывание слоя «секции нет», а
      не молчание; списки и скаляры по-прежнему заменяются целиком.
    • Новая строка worktree_drift: несохранённая правка .review.yml в клоне
      больше не выглядит как действующая политика. Статусы — drifted (перечисляются
      разошедшиеся листовые ключи, без значений), clean, absent_in_worktree,
      absent_in_blob, ref_not_head (запрошенный ref — не HEAD клона, сравнение
      пропущено), unknown (виден только в --json). На эффективную политику не влияет.
    • Способ чтения коммиченного слоя виден: committed: git-blob (объект git на ref)
      или vcs (API хостинга).

Изменено

  • Эффективная политика репозитория может измениться после обновления — там, где
    домашний слой задавал часть подсекции. Раньше он заменял верхний ключ целиком, теперь
    сливается по листу, и молчаливо потерянные значения коммиченного слоя вернутся в
    силу. Проверить до обновления и после: reviewer config show.
  • review_runs.config_sources хранит листовые пути ("paths.ignore") вместо верхних
    ключей ("paths"). Маркера версии у строки нет, старые строки остаются в прежней
    форме — аналитика по этой колонке обязана учитывать обе.
  • Глобальный max_tool_result_chars больше не ограничивает секцию code — ею
    управляет только context_limits.code_section. Верхнего предохранителя нет:
    max_files: 200 даст тул-результат под 400 тыс. символов (симметрично
    search_codebase.ceiling, где предела тоже нет).

Исправлено

  • Env-фолбэк политики не разбирает task_board на подполя — иначе env-слой смешивался
    бы с файловым внутри связного контракта доски.
  • Сканер плагина в CI смотрит на plugin/, а не на весь репозиторий.

Не вошло (измерено и снято)

  • Git-со-изменяемость как источник подмешивания: 4 попадания в ядро на 34 подмешанных
    пути, просадка bulk и одна вытесненная core-задача. Ловит спутники правки, не ядро.
  • Разворот кластеров сводок подсистем в пути-кандидаты (PRI-258): 2 попадания на 92
    пути, вытеснено 9 хитов, которые гибрид находил сам. Попадание в подсистему не есть
    попадание в ядро правки. Отрицательные результаты обоих замеров зафиксированы в
    eval/replay_report.md — воспроизводить не стоит.

v0.5.0

Choose a tag to compare

@github-actions github-actions released this 15 Aug 11:43
5563f8b

Что нового

  • Семейство однотипных символов — ретрив перестал показывать одного представителя вместо
    всех.
    На задачах-развёртках («поправь во всех адаптерах досок») поиск находил один-два
    класса и молчал о том, что менять надо одиннадцать.

    • Новый session-less MCP-тул family(repo, node_id, branch) — «кто ещё такой же»:
      наследники, сиблинги по общей базе и структурные реализации контракта. Работает там, где
      рёбер наследования нет в принципе: typing.Protocol структурной типизацией рёбер не даёт.
    • implementations больше не отвечает голым «не найдены», когда семейство существует, —
      он явно отсылает к family.
    • Структурный сигнал считает покрытие контракта с учётом унаследованных методов (только
      собственные давали 6 адаптеров из 11, с унаследованными — 11 из 11) и не применяется на
      контракте меньше трёх не-dunder методов: на тонком контракте совпадение имён ничего не
      значит. Пропуск сигнала называется в шапке ответа, а не остаётся молчаливым.
    • Наследование классов теперь извлекается из синтаксиса (tree-sitter) и сливается с рёбрами
      SCIP: scip-python 0.6.6 не эмитит информацию о классе, упомянутом в файле выше своего
      определения, — а под это попадали все 11 адаптеров досок, зарегистрированных в
      provider_spec().
    • Тестовые дубли из выдачи не выбрасываются, но уходят в хвост и считаются в шапке.
  • Качество брифа solve-task стало измеримым, а не ощущаемым. При каждой реальной
    публикации ревью пути из секции ## Relevant code брифа сопоставляются с фактическим
    диффом PR; результат копится в БД и виден на новой странице Quality веб-админки
    (GET /api/quality).

    • Считается core-recall — по ядру (reviewer/**/*.py, plugin/** не-.md, корневые
      *.py) и только по файлам, существовавшим до PR. Сырой recall на том же корпусе давал
      медиану 15 % против 67 % у core: он мерил размер диффа, а не качество поиска.
    • «Нет точки измерения» — это статус, а не ноль: у задачи, чей дифф состоит из тестов и
      доков, качество ретрива не определено, и на графике точка просто не появляется.
    • Расчётное ядро одно на онлайн и офлайн — иначе числа «до» и «после» были бы посчитаны
      разными линейками.
    • Сбой метрики не может помешать публикации ревью, недоступная БД даёт пустую форму, а не 500.
  • Расход ревью виден в админке — по стадиям и в сопоставимых единицах. Раньше у всех
    реальных прогонов usage и total_cost были пусты: MCP-сервер видит только свои
    тул-вызовы, а не ходы оркестратора и субагентов.

    • Клиентский PreToolUse-хук review_cost.py снимает расход окна ревью и кладёт sidecar,
      который читает publish_review. Явные аргументы CLI имеют приоритет пофайлово:
      CLI, отдающий model, но не расход, sidecar-данные не теряет.
    • total_cost считается взвешиванием бакетов (fresh_in ×1, output ×5,
      cache_write ×1.25, cache_read ×0.1), а не сложением токенов: сырая сумма завышает
      стоимость в 4.1 раза, потому что 88 % объёма — дешёвый cache-read. Единицы условные,
      поэтому знак доллара из админки убран.
    • Серверный трейс шагов (стадия, тул, размер выданного payload) пишется независимо от
      хуков и работает в любом CLI; админка сливает оба канала, стадия без данных о расходе
      показывает null, а не 0.
    • Канал файловый: при удалённом MCP хук и сервер не делят файловую систему — штатный
      случай «sidecar отсутствует», ревью публикуется без метаданных расхода.
  • solve-task доходит до брифа за один серверный вызов вместо семи. Новый session-less
    тул prepare_task_context(repo, key, branch, warm_board=True) отдаёт единым payload
    свежесть индекса, прогрев доски, саму задачу, связанные и похожие задачи, релевантный код и
    тест-образцы. Прежние тулы сохранены и вызываются только явными фолбэками; за LLM осталось
    то, что требует суждения. Сбой любой секции даёт запись в gaps, а не исключение.

  • Полный проход /summarize-subsystems перестал читать репозиторий целиком. Было: 478
    файлов исходниками (~106k строк) и по субагенту на файл — больше миллиона токенов за прогон.

    • Новый session-less тул get_file_skeletons(repo, paths, branch) отдаёт скелеты порцией
      (до 25 путей за вызов, 2000 строк на файл). Источник — проиндексированные чанки, а не
      файл на диске: свежесть сводки считается по скелету, и чтение с диска рассинхронизировало
      бы вход job'а с тем, что его инвалидирует. Цена — модульный докстринг в скелет не попадает.
    • Новый ключ .review.yml summary_paths.ignore — фильтр, действующий только на
      кластеризацию сводок; ревью-индекс он не трогает, тесты по-прежнему ищутся и
      комментируются. Дефолт ["tests", "test"], явный [] выключает фильтр. При сбое чтения
      политики возвращается дефолт, а не пустой список.
    • Один субагент на порцию до 15 путей вместо одного на файл.
  • Офлайн-харнесс метрик solve-task — eval/solve_task_metrics/, только stdlib:

    • python -m eval.solve_task_metrics snapshot — пересчитать метрики, сохранить срез,
      обновить отчёт;
    • stats --last 10 — тренд последних срезов без пересчёта;
    • compare --back 1 — дельты с учётом полярности метрики;
    • forecast — прогноз core-recall интервалом по размеру знаменателя ядра.

    Показал, что этап сбора контекста — около 10 % полной цены задачи «под ключ»
    (681.5K против 5.97M взвешенных единиц, медианы).

Изменено

  • reviewer index печатает разбивку рёбер по типам и предупреждает о просадке полноты
    графа против предыдущего индекса той же ветки (порог 10 %, не равенство). Счётчики
    персистятся в index_meta; отсутствие колонки читается как «замера не было», команда не
    падает.

Исправлено

  • Граф больше не связывает продовый код со случайными тестами. Идентификатор local N в
    SCIP уникален только внутри своего документа, а парсер клал такие символы в общую карту:
    local 0 из reviewer/app.py и из tests/web/test_pool.py были одним ключом. На этом
    репозитории — 14942 фиктивных ребра из 30254 (49 %). Теперь local-символы резолвятся в
    пределах документа, внутрифайловые рёбра сохранены. Побочно исчез «недетерминизм» числа
    рёбер между прогонами: он был следствием того же дефекта.
  • Инкрементальный self-heal графа перестал терять и подделывать IMPLEMENTS. Смена базы
    класса оставляла фантомное ребро, а первая версия фикса, наоборот, теряла валидное, когда
    база лежит в неизменённом файле. Базы наследования резолвятся по символам, уже
    существующим в графе; добавка применяется только к наследованию, не к CALLS.
  • Замер стоимости solve-task больше не раздувается правками брифа. Хук brief_cost.py
    пересчитывал блок токенов при каждой перезаписи, втягивая в число брейншторм, план и
    реализацию; теперь окно запечатано, повторный запуск — no-op.
  • Файловый job сводок отбраковывает усечённый скелет и fail-soft ноты вместо того, чтобы
    суммаризовать текст ошибки и персистить фрагмент как полный.
  • Задачи без файлов ядра в диффе учитываются как «нет точки измерения», а не как нулевой
    recall; ground truth офлайн-харнесса строится только по настоящим Merge pull request
    (sync-мержи раздували знаменатель одной задачи с 17 файлов до 195).

Требуется действие после обновления

  • Переиндексируйте граф: reviewer index /path/to/repo --ref <branch>. Число рёбер упадёт
    примерно на 41 % (на этом репозитории 34287 → ~18100) — это удаление фикции, а не потеря
    полноты (настоящих рёбер 17683 против 17776, разница 0.5 %). Первый прогон один раз
    напечатает предупреждение о просадке — это ожидаемо.
  • Сводки подсистем пересоберутся полностью при первом полном /summarize-subsystems:
    сменился вход фрагмента (скелет вместо исходника) и состав кластеров (фильтр тестов входит
    в layout_token). Старые сводки продолжают отдаваться потребителям до атомарной замены
    каждого bundle, осиротевшие tests/* вычищает штатный prune на полном непрерванном
    проходе. Ручных миграций БД не требуется.

v0.4.11

Choose a tag to compare

@github-actions github-actions released this 13 Aug 12:39
1d468f9

Что нового

  • У версий появился след. Раньше пакет уезжал на PyPI при каждом push в main,
    но в репозитории не оставалось ни тега, ни описания изменений: 57 выпущенных
    версий и ноль точек навигации по истории. Теперь каждая публикация создаёт тег
    vX.Y.Z и GitHub Release, а его тело — секция CHANGELOG.md, написанная перед
    мержем человеком. Теги v0.1.0–v0.4.9 проставлены задним числом по коммитам
    смены версии, ноты восстановлены начиная с 0.4.6.
  • Ноты пишутся до мержа, а не генерируются постфактум. Maintainer-скилл
    /release собирает коммиты, тела PR и спеки, группирует изменения по смыслу
    (одна фича — один пункт с раскрытыми под-пунктами, а не пятнадцать строк
    feat(...) и не одна строка вместо фичи), показывает черновик на правку и
    только после этого бампает версию, пересобирает манифесты codex и доводит
    релиз до main. Скилл живёт вне plugin/ — пользователям плагина он не нужен.
  • Отсутствующая секция CHANGELOG.md не роняет деплой: пакет к этому моменту уже
    на PyPI, поэтому релиз создаётся из списка коммитов с предупреждением в логе.

v0.4.10

Choose a tag to compare

@mimfort mimfort released this 13 Aug 17:24

Что нового

  • reviewer start и reviewer stop — поднять и штатно остановить локальную
    инфраструктуру (ParadeDB, Neo4j) одной командой, не помня синтаксис
    docker compose. reviewer check теперь сам советует reviewer start, если
    хранилища недоступны, а перед запуском и остановкой предупреждает, что именно
    сейчас произойдёт с контейнерами. Dev-сервисы получили healthcheck, поэтому
    «поднялось» означает «готово принимать запросы», а не «процесс стартовал».
  • Порты хранилищ настраиваются — PARADEDB_PUBLISH_PORT (5433),
    NEO4J_BOLT_PUBLISH_PORT (7687) и NEO4J_HTTP_PUBLISH_PORT (7474) задаются
    через окружение и спрашиваются в мастере установки, с производным дефолтом из
    уже введённого DSN/URI. Если порт разошёлся с PG_DSN или NEO4J_URI, мастер
    предупредит: раньше такое расхождение всплывало только при первом падении
    подключения. HTTP-порт Neo4j в сверку не входит — выводить его не из чего.
  • solve-task спрашивает, как вести задачу — один раз, на старте. Первым
    шагом скилл показывает единственную панель с тремя вопросами: тир модели для
    брифа, режим взаимодействия и стратегия исполнения. Раньше единственным
    вопросом за весь прогон был тир модели, а всё остальное было зашито намертво.
    • Режимы взаимодействия. обычный (дефолт) — как прежде: брейншторм
      задаёт вопросы, спека и план ждут твоего апрува. auto — вопросы
      задаются, но апрувы спеки и плана не запрашиваются. full-auto — на
      каждой развилке берётся рекомендованный вариант, вопросов нет вовсе;
      режим для задач с готовым описанием и критериями приёмки — на расплывчатой
      формулировке он глушит тот самый канал, по которому в дизайн попадает
      недостающее. В auto и full-auto спека и план всё равно пишутся и
      коммитятся: снимается только человеческий апрув.
    • Стратегии исполнения. inline, subagent (дефолт), lite и
      auto. lite — облегчённый профиль поверх subagent-driven-development:
      ревьюер диспатчится раз на группу смежных задач, а не после каждой, потолок
      fix-раундов снижен с пяти до трёх, эскалация модели начинается раньше. План
      из шести задач — 6 имплементеров + 2 ревьюера вместо 6 + 6. auto выбирает
      стратегию сам после написания плана, по числу задач, затронутых файлов и
      рисковым признакам. Финальное ревью всей ветки остаётся обязательным при
      любой стратегии и любом режиме, включая full-auto, — отключить его нельзя.
    • Выбор переживает перезапуск. Он пишется в git-ignored файл прогона
      (.superpowers/solve-task/<KEY>.md), а не в спеку и не в план: запись
      «решения приняты за пользователя» в коммиченном артефакте была бы распиской
      в том, что дизайн никто не согласовывал. В full-auto туда же построчно
      ложится каждое решение, взятое за тебя по рекомендации.

v0.4.9

Choose a tag to compare

@mimfort mimfort released this 13 Aug 12:17

Изменено

  • Reference-блок репорта багов подключается к скиллам в сжатом виде — заметно
    меньше токенов в промпте каждого субагента при том же поведении.

v0.4.8

Choose a tag to compare

@mimfort mimfort released this 13 Aug 12:17

Что нового

  • Канал репорта багов самого reviewer — тул report_bug и скилл
    report-bug заводят анонимизированный issue в mimfort/rag_for_git, когда
    ломается сам инструмент. Фаза предпросмотра — серверный инвариант: без явного
    подтверждения человека ничего не отправляется. Триаж отсекает чужие проблемы
    (окружение, внешние сервисы, код пользователя, права, поведение LLM), а
    анонимизация детерминирована и не доверена модели. Канал выключается двумя
    независимыми рубильниками: REVIEW_BUG_REPORTS=false в окружении деплоя и
    bug_reports: false в .review.yml конкретного репозитория.
  • Автотриггер репорта — PostToolUse-хук замечает traceback из reviewer/
    и недокументированные статусы тулов, поэтому дефект предлагается завести в тот
    момент, когда он воспроизвёлся, а не постфактум по памяти.

Исправлено

  • finish_task больше не выдаёт «ссылка на задачу уже была в теле PR» за сбой:
    идемпотентный no-op и настоящая неудача теперь различимы в ответе.

v0.4.7

Choose a tag to compare

@mimfort mimfort released this 13 Aug 12:17

Что нового

  • reviewer check проверяет, что вектор из pgvector читается как list[float] —
    та самая несовместимость, что сломала индексацию в 0.4.6, теперь ловится
    диагностикой до прогона, а не в середине индексации.

v0.4.6

Choose a tag to compare

@mimfort mimfort released this 13 Aug 12:17

Исправлено

  • Индексация с pgvector ≥ 0.4 — драйвер стал отдавать Vector без
    __iter__, и код, полагавшийся на итерируемость, падал. Зависимость больше не
    берётся «любой сверху».
  • reviewer --version теперь существует; из --help убрано обещание, которого
    --path не выполнял.