Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions docs/evidence/next-bug-class-2026-10/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
repro/c_runtime_dictionary/BuggyMeziantou.cs
**/bin/
**/obj/
repro/c_analyzers/BuggyMeziantou.cs
63 changes: 63 additions & 0 deletions docs/evidence/next-bug-class-2026-10/00-preregistration.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
# Next real-bug class — pre-registration (Phase 0)

Записано 2026-10-18 до любых экспериментов. Own.NET `main` = `2fefb19f` (merge #411). Worktree
`ownnet-research-next` (detached, без изменений). Отчёты — `ownnet-evidence/next-class/` (вне репозитория,
чтобы рабочее дерево оставалось чистым).

## Общий бюджет

Один агентский рабочий день на все три кандидата. Порядок: Phase 1 (три дешёвых воспроизведения) ≤ 20 %,
Phase 2 (реальные баги) ≤ 45 %, Phase 3 (только лучший кандидат) ≤ 20 %, отчёт ≤ 15 %. Не больше 15 реальных
кандидатов «в глубину» на все три класса. После провала необходимого условия — KILL этого кандидата, его
остаток бюджета переходит к сильнейшему, а не делится поровну.

Порог GO (предложенный, не установленный ранее):
- ≥ 2 независимо подтверждённых реальных дефекта из разных репозиториев, адресуемых кандидатом, без
продемонстрированной неприемлемой потери точности; ИЛИ
- 1 независимо подтверждённый дефект высокой важности, пропущенный Own.NET и хотя бы одним успешно
запущенным релевантным анализатором, плюс малый правдоподобный путь реализации и негативные контроли.

## A — #382 canonical first-party call facts

Что должно быть правдой: существуют реальные дефекты владения, которые Own.NET пропускает (или ложно
сообщает) ИМЕННО потому, что первопартийный вызов свёрнут фронтендом в `release`/`use`/escape, и которые
ядро нашло бы, получив `call`.

| # | Необходимое условие | Самый дешёвый контрпример | KILL |
|---|---|---|---|
| A1 | На `main` фронтенд теряет вызов: `ForwardDynamic` → `use`, summary `forwarded = no` | извлечь `GuardedConsumeSample.cs`, посмотреть факты и `summaries` | вызов уже сохраняется или summary уже `may` |
| A2 | Ядро даёт `may` / OWN051, если подать `call` (временная правка фактов, вне репо) | повторить пробу из #382 на `main` | ядро не выводит `may` из `call` |
| A3 | Синтетический FN: вызывающий, который использует ресурс после guarded-forward, молчит на `main` и получает диагностику при `call` | одна синтетическая пара, факты правятся вручную | разницы нет |
| A4 | Реальный дефект: пара bug/fix, где владение передаётся через первопартийную обёртку (forward / guarded dispose / dispose-flag) и Own.NET на buggy молчит из-за свёртки | поиск в имеющихся парах исследования (60 пар) и узкий поиск на GitHub | 0 реальных дефектов этого механизма после ≤ 6 глубоких кандидатов |

Предупреждение до начала: известные реальные свидетели #382 (C12/C13/C16 dotnet/runtime) — ложные
срабатывания, уже снятые #381; «recall side» в #382 — гипотеза без реального бага. Свидетели, которые
сводятся к уже известному ограничению, считаются DUPLICATE, не новым багом.

## B — #406 closure capture, non-escaping synchronous delegate

Что должно быть правдой: реальный код теряет освобождение локала, захваченного синхронно вызываемым
локальным делегатом, и разработчики это исправляли.

| # | Необходимое условие | Самый дешёвый контрпример | KILL |
|---|---|---|---|
| B1 | FN воспроизводится на `main` из-за правила «захват = escape» | сэмпл из #406 + проверка, что без лямбды OWN001 есть | OWN001 и так выдаётся, или причина другая |
| B2 | ShareX-подобный async-случай молчит на `main` (контроль, который нельзя сломать) | `ForEachAsync`-форма | — (контроль) |
| B3 | Реальный дефект: пара bug/fix, где утёкший disposable захвачен **синхронно** вызываемой локальной лямбдой/локальной функцией | поиск в парах исследования + узкий GitHub-поиск | 0 реальных после ≤ 5 глубоких кандидатов |

## C — #400 CollectionsMarshal borrowed-view invalidation

Что должно быть правдой: реальный код использует `CollectionsMarshal.AsSpan` после структурной мутации
списка, это наблюдаемо ломается, и разработчики это исправляли; существующие анализаторы это не ловят.

| # | Необходимое условие | Самый дешёвый контрпример | KILL |
|---|---|---|---|
| C1 | Наблюдаемый stale-view при принудительной реаллокации; негативные контроли чисты | маленькая консольная программа (runtime) | эффект не наблюдается |
| C2 | Существующие .NET-анализаторы не покрывают узкий паттерн | поиск правил CAxxxx / IDE / известных анализаторов | есть зрелое правило |
| C3 | Реальный дефект: пара bug/fix «AsSpan → Add/Remove → использование вида» | поиск коммитов/PR/issue на GitHub | 0 реальных после ≤ 4 глубоких кандидатов |

## Запреты (из задания)

Без production-кода, OwnIR, широкого рефакторинга ядра, полного перепрогона корпуса без дешёвого гейта,
инфраструктуры для конкурентов, расширения поиска после проваленного гейта, P-037 (#304 заморожен),
#407 (deferred), без issue/PR/push. Временные пробы — только во временных каталогах.
Loading
Loading