Repository navigation
Releases
v0.7.0
Что нового
- Лежащее хранилище стало сигналом, а не двадцатью минутами тишины (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и neo4jAuthError—
намеренно нет: ошибку схемы и неверные креды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.
- Метрика офлайн-only: считает
Изменено
- Стартовая панель
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
Что нового
-
Секция
## Relevant codeбрифаsolve-taskперестала показывать два файла из
двадцати. Задача формулируется абзацами и списками, а ретрив шёл одним размытым
запросом: медиана core-recall была 0.225. Сквозной итог четырёх рычагов на одном
индексе — медиана 0.75, bulk-медиана 0.5833.-
Мультизапрос с RRF-слиянием (PRI-255). Подзапросы извлекаются детерминированно —
пункты списков под «что сделать» / «критерии приёмки» плюс пул технических
идентификаторов, до 20 штук; эмбеддятся одним батчем, выдачи сливаются RRF.
Реранка в этом пути нет намеренно: cliff-отсечка по скорам реранкера против
многотемного запроса и была механизмом, схлопывавшим выдачу до двух файлов.
Вырожденный вход (задача без списков) даёт один подзапрос и прежнее поведение. -
Файловый бюджет секции — новый блок
.review.ymlcontext_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
Что нового
-
Семейство однотипных символов — ретрив перестал показывать одного представителя вместо
всех. На задачах-развёртках («поправь во всех адаптерах досок») поиск находил один-два
класса и молчал о том, что менять надо одиннадцать.- Новый 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(). - Тестовые дубли из выдачи не выбрасываются, но уходят в хвост и считаются в шапке.
- Новый session-less MCP-тул
-
Качество брифа
solve-taskстало измеримым, а не ощущаемым. При каждой реальной
публикации ревью пути из секции## Relevant codeбрифа сопоставляются с фактическим
диффом PR; результат копится в БД и виден на новой странице Quality веб-админки
(GET /api/quality).- Считается core-recall — по ядру (
reviewer/**/*.py,plugin/**не-.md, корневые
*.py) и только по файлам, существовавшим до PR. Сырой recall на том же корпусе давал
медиану 15 % против 67 % у core: он мерил размер диффа, а не качество поиска. - «Нет точки измерения» — это статус, а не ноль: у задачи, чей дифф состоит из тестов и
доков, качество ретрива не определено, и на графике точка просто не появляется. - Расчётное ядро одно на онлайн и офлайн — иначе числа «до» и «после» были бы посчитаны
разными линейками. - Сбой метрики не может помешать публикации ревью, недоступная БД даёт пустую форму, а не 500.
- Считается core-recall — по ядру (
-
Расход ревью виден в админке — по стадиям и в сопоставимых единицах. Раньше у всех
реальных прогонов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.ymlsummary_paths.ignore— фильтр, действующий только на
кластеризацию сводок; ревью-индекс он не трогает, тесты по-прежнему ищутся и
комментируются. Дефолт["tests", "test"], явный[]выключает фильтр. При сбое чтения
политики возвращается дефолт, а не пустой список. - Один субагент на порцию до 15 путей вместо одного на файл.
- Новый session-less тул
-
Офлайн-харнесс метрик
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
Что нового
- У версий появился след. Раньше пакет уезжал на 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
Что нового
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
v0.4.8
Что нового
- Канал репорта багов самого 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
v0.4.6
Исправлено
- Индексация с pgvector ≥ 0.4 — драйвер стал отдавать
Vectorбез
__iter__, и код, полагавшийся на итерируемость, падал. Зависимость больше не
берётся «любой сверху». reviewer --versionтеперь существует; из--helpубрано обещание, которого
--pathне выполнял.