fix(pipeline-status): ignore issue refs inside code spans in PR body #96
Loading…
Reference in a new issue
No description provided.
Delete branch "fix/pipeline-status/ignore-code-spans"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Что сделано
Оракул pipeline-status теперь игнорирует упоминания issue-номеров внутри markdown-конструкций при резолюции issue по PR body:
check_issueиfind_open_prs_for_issueиспользуют отмаскированный body — реальные привязки вне этих конструкций матчатся как раньше;gh pr view --json bodyпарсится черезjson.loadsперед маскированием, чтобы экранированные переносы строк корректно обрабатывались quote-регексом.Почему
Агенты часто цитируют примеры body-строк в описании PR — это класс ложных срабатываний: оракул распознавал цитаты тестовых данных как реальные Closes-связи и падал в ложный AMBIGUOUS, останавливая батч.
Watch out
Pending
Closes #93
Code Review Summary
PR исправляет класс ложных срабатываний: оракул pipeline-status теперь игнорирует Closes/Fixes/Resolves-ссылки внутри inline code-спанов, многострочных code-блоков и блочных цитат при резолюции issue по PR body. Реализация чистая: три модульных regex-константы,
_mask_code_and_quotes(11 строк) с документированным порядком маскирования (блоки → спаны → цитаты, с сохранением структуры строк),_closure_refsкак единая точка входа дляcheck_issueиfind_open_prs_for_issue. 15 новых тестов покрывают все ветки, включая незакрытый backtick и сохранение AMBIGUOUS для реальных множественных ссылок. 140 тестов зелёные, ruff чист, CI green.Positives
"\n" * countсохраняет структуру строк для quote-якоряsorted(matches)— исправление недетерминированного порядка set-итерации в AMBIGUOUS-сообщении (раньше порядок номеров мог меняться между запусками)CLOSURE_RE.search(body) and ...вfind_open_prs_for_issue—refsнепустой уже implies search matchjson.loadsс fallback на raw-строку — корректно обрабатывает экранированные\nизgh pr view --json body(иначе quote-регекс с якорем на начало строки не сработал бы)CLOSURE_RE/_closure_refsиспользуются только в pipeline-status.py; writercreate-pr.ts:138добавляетCloses #Nв plain text (не в code span) → связь writer↔reader не нарушена; формат вывода фаз и NEXT-строк не меняетсяSuggestions (info, not blocking)
test_check_issue_ignores_refs_in_quoteиtest_check_issue_parses_json_body_before_maskingиспользуют идентичные body и assertions — второй тест дублирует покрытие первого, но служит документацией JSON-escape рациональности; допустимо, можно объединитьVerdict: APPROVE