Skip to content
This repository was archived by the owner on Sep 11, 2026. It is now read-only.
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
58 changes: 36 additions & 22 deletions crates/rules-contract/wit/world.wit
Original file line number Diff line number Diff line change
Expand Up @@ -88,27 +88,39 @@ world plugin {
/// (`crates/rules-core/src/diagnostics.rs`): `reason`/`message` обов'язкові,
/// `file` опційний posix-relative шлях, `severity` з дефолтом `error`.
///
/// # `file: none` для `concern-scope::per-file` — ВІДКРИТЕ питання, не
/// заборона (задача fix/napi-empty-fix-batch)
/// # `file: none` для `concern-scope::per-file` — ДОЗВОЛЕНО (рішення (б))
///
/// Схема НЕ вимагає `file` для `per-file`-концерну: агрегована
/// Схема НЕ вимагає `file` для `per-file`-концерну, і це свідомо: агрегована
/// діагностика (одна на весь прогін зовнішнього тула, що сам не
/// атрибутує вивід по файлах — приклад: `python/ruff`,
/// `crates/plugin-lang-python/src/lib.rs::detect_ruff`) — легітимний
/// `detect()`-результат, ЦЯ record цього не забороняє. Але контракт
/// СВІДОМО НЕ визначає, як host має будувати `fix-request.files`
/// (нижче), коли `fix`-запит несе такі діагностики: ні мовчазний
/// порожній `files` (гість не відрізнить «файлів немає» від «хост їх не
/// передав» — вада #513, `crates/rules-napi/src/lib.rs::run_wasm_concern_fix`,
/// доккомент `ambiguous_empty_fix_batch_err`), ні full-scope glob-обхід
/// (безпечний лише для `scope: full` — для `per-file` він розширив би
/// `fix` за межі дельти) тут не встановлені як дефолт. Сьогоднішній
/// host — fail-loud на цьому стані (типізована помилка, не здогадка).
/// Наступний, хто чіпає це поле: або (а) заборонити `file: none` для
/// `per-file`-концернів явно тут, у схемі/доккоменті, або (б) додати
/// цій record-і чи `fix-request` спосіб нести «per-file-делта без
/// per-diagnostic атрибуції» (напр. окреме поле файлів на рівні
/// batch-у) — не вгадуй, обирай і документуй тут.
/// `detect()`-результат. `file: none` тут означає рівно «детектор не
/// знає, який файл», і це чесніше за вигадану атрибуцію.
///
/// Питання, яке #517 лишив відкритим — заборонити такий стан для
/// `per-file` (варіант (а)) чи дати спосіб нести дельту без
/// per-diagnostic атрибуції (варіант (б)) — вирішене на користь (б).
/// Причина: дельта — властивість ЗАПИТУ, а не діагностики. Варіант (а)
/// змусив би кожен агрегований детектор парсити вивід тула лише заради
/// host-механіки, якій відповідність «діагностика → файл» не потрібна:
/// фіксер такого концерну хоче СПИСОК ТАРГЕТІВ (`ruff check --fix`
/// <targets>), а не мапу.
///
/// Розширювати цю схему для (б) не довелось: `fix-request.files` —
/// окреме поле, не похідне від `diagnostics`, — існує з `3.0.0`.
/// Бракувало лише проводки на host-боці, і вона зроблена там:
/// `run_wasm_concern_fix` приймає `delta_files` (той самий список, що
/// йде в `run_wasm_concern` на детекті) і заповнює ним `files`, коли
/// жодна діагностика не назвала файл. Жодного ABI-руху, жодного version
/// bump. Host і далі fail-loud, коли дельти немає взагалі
/// (`ambiguous_empty_fix_batch_err`) — мовчазний порожній `files` був би
/// регресом до #513: гість не відрізнить «файлів немає» від «хост їх не
/// передав».
///
/// Межа рішення (і єдине, заради чого варто повертатись до (а)): fix
/// ПІДМНОЖИНИ діагностик агрегованого концерну лишається неможливим —
/// для нього потрібна саме атрибуція. Сьогодні такого споживача немає
/// (`applyT0` передає всі violations концерну одним масивом).
///
/// `data` — JSON-рядок (серіалізований `serde_json::Value::Object`), не
/// структурний тип: WIT record/variant не підтримує довільний
Expand Down Expand Up @@ -161,11 +173,13 @@ world plugin {
/// Вхід `fix`: ті самі файли й концерн, що й `detect`, плюс діагностики,
/// для яких запитується fix (підмножина результату `detect`).
///
/// Host сьогодні виводить `files` із `diagnostics[].file` (не з
/// незалежного delta-списку `detect`-виклику) — коли жодна діагностика
/// не несе `file`, дивись відкрите питання біля `record diagnostic`
/// (`file: none` для `per-file`): цей запис нічого не гарантує щодо
/// того, звідки host бере `files` у такому разі.
/// Звідки host бере `files`: спершу з `diagnostics[].file` (найвужчий
/// batch — рівно ті файли, на які вказують діагностики); коли жодна
/// діагностика не несе `file` — з full-scope glob-обходу для
/// `scope: full` концернів, інакше з явної дельти запиту, яку передає
/// оркестрація (рішення (б), доккомент біля `record diagnostic`). Це
/// host-політика, не гарантія схеми: гість НЕ має покладатись на те,
/// що `files` — саме файли його діагностик.
record fix-request {
concern-id: string,
files: list<source-file>,
Expand Down
Loading
Loading