fix(pipeline-status): ignore issue refs inside code spans in PR body #93
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
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?
Контекст
PR #92 (test: regression guard для дубликатов Closes) упал в ложный AMBIGUOUS: оракул распознал цитаты тестовых данных в body PR —
`Closes #45 Closes #45`,`Closes #45 Fixes #47`— как реальные Closes-связи к issue #45/#47. Реальные привязки были только к #86 (автогенерированныйCloses #86). Итог: «несколько issue в body» → AMBIGUOUS → батч остановлен, PR ожидает правки body вручную.Корень: regex резолюции issue в
pipeline-status.pyматчит#Nпо всему телу PR без учёта markdown-контекста. Агенты часто цитируют примеры body-строк в описании PR — это класс ложных срабатываний.Задача
Научить оракул игнорировать упоминания
#Nвнутри code-спанов (backtick-спаны`...`, многострочные блоки ```) и блочных цитат (>) при резолюции issue по PR body. РеальныйCloses #Nвне этих конструкций матчится как раньше.Альтернатива (НЕ предпочтительная): экранирование в
create-pr— хрупко, не защищает от правок body вручную. Выбран путь оракула.Контракты
Closes #N/Fixes #N/Resolves #Nвне code-спанов и цитат → резолюция как раньше (ISSUE DONE).#Nвнутри backtick-спанов, многострочных code-блоков и строк>→ не влияют на резолюцию.Инварианты
Граничные случаи
body содержит `Closes #45` в примере→ не матч.\nCloses #45\n→ не матч.> Closes #45→ не матч.Closes #45в обычном тексте рядом с цитатой → матч.см. #45) — вне scope (и так не матчится).Влияние на связанные компоненты
pipeline-status.py(функция резолюции issue) +tests/test_pipeline_status.py.pipeline-status.tsне меняется (контракт NEXT/verdict тот же).Вне scope
Критерии приемки
`Closes #45`в backtick-спане +Closes #86в тексте → ISSUE DONE (#86), не AMBIGUOUS.Closes #N→ не влияют.