This repository was archived by the owner on Sep 11, 2026. It is now read-only.
Repository navigation
feat(rules-napi): дельта запиту у fix-контурі — рішення (б) відкритого питання #517 - #519
Merged
Merged
Conversation
…о питання #517 #517 зробив неоднозначний порожній fix-батч гучною помилкою і лишив розвилку у WIT-доккоменті: заборонити `file: none` для `per-file` (а) чи дати спосіб нести дельту без per-diagnostic атрибуції (б). Обрано (б). Корінь був не в тому, що «контракт мовчить», а в асиметрії двох napi-сигнатур: `run_wasm_concern` ПРИЙМАЄ дельту явним параметром, `run_wasm_concern_fix` реконструює її з `diagnostics[].file`. Інформація в системі була — JS тримає `item.files` і сусіднім викликом віддає її в `detect`. Прогалина проводки, не знання. Розширювати WIT не довелось: `fix-request.files` існує з 3.0.0 як окреме поле, не похідне від `diagnostics`. Додано шостий опційний `delta_files` у napi й проводку `item.files` → `loadT0Patterns` → `wasmFixPattern`. Жодного ABI-руху, guest-и не чіпані. Порядок джерел `FixRequest::files`: `diagnostics[].file` → full-scope glob для `scope: full` → явна дельта → типізована помилка. Помилка #517 лишається backstop-ом на проводку; порожня дельта за відповідь не приймається. Знімає «Перешкоду 1» з розбору порту `python/ruff` (#516) — той лишається відкладеним тільки через межу exec-tool. Тести: cargo rules-napi 10 → 13, новий fix-delta-files.test.mjs (2) на host-проводку. Обидва якорі перевірено дією — нейтралізація гілки валить рівно rust-тест, зняття аргументу — рівно JS-тест. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
6 tasks done
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to subscribe to this conversation on GitHub.
Already have an account?
Sign in.
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Що це
Закриває відкрите питання, яке лишив по собі #517: заборонити
file: noneдляper-file-концернів (варіант а) чи дати спосіб нести per-file-дельту без per-diagnostic атрибуції (варіант б). Обрано (б).Чому не (а)
file: noneдля агрегованого детектора — чесне твердження «я не знаю, який файл».python/ruff(detect_ruff) повертає одну діагностику на весь прогінruff check, бо тула не атрибутує свій вивід по файлах.Варіант (а) змусив би кожен такий детектор парсити вивід і синтезувати N діагностик — заради host-механіки, якій відповідність «діагностика → файл» не потрібна: фіксер такого концерну хоче список таргетів (
ruff check --fix <targets>), а не мапу. Тобто робота на кожен агрегований концерн, щоб задовольнити обмеження, яке саме по собі зайве.Що виявилось при розборі
Корінь був не в тому, що «контракт мовчить», а в асиметрії двох napi-сигнатур:
detectприймає дельту явним параметром,fix— реконструює її зdiagnostics[].file. Інформація в системі була (JS тримаєitem.filesі сусіднім викликом віддає її вdetect) — її просто не проведено до fix-шляху. Прогалина проводки, не знання.Зміна
WIT розширювати не довелось:
fix-request.files— окреме поле, не похідне відdiagnostics, — існує з3.0.0. Додано лише проводку:run_wasm_concern_fixприймає шостий, опційнийdelta_files;run-fix.mjsпередає тудиitem.files(черезloadT0Patterns→wasmFixPattern, вшито в замикання з тієї ж причини, що йcwd:T0Pattern.test(violations)не приймаєctx, а план будується вже вtest()).Жодного ABI-руху, жодного version bump, guest-и не чіпані.
Порядок джерел
FixRequest::filesпісля зміни:diagnostics[].filefile(найвужчий батч, пріоритет незмінний)scope: fullper-fileз агрегованими діагностикамиПомилка #517 лишається backstop-ом на проводку, а не основною поведінкою: мовчазний
Vec::new()тут був би регресом до #513. Порожня дельта (Some([])) за відповідь не приймається — це той самий нерозрізненний стан, що й відсутня.Межа рішення
Fix підмножини діагностик агрегованого концерну лишається неможливим — для нього потрібна саме атрибуція, тобто варіант (а). Сьогодні такого споживача немає:
applyT0передає всі violations концерну одним масивом. Задокументовано в WIT і §2.53.Стосунок до #516
«Перешкода 1 — продакшн-міст не доносить до гостя жодного файлу» цією зміною знята. Порт
python/ruffлишається відкладеним, але тільки через Перешкоду 2 (exec-tool у fix-контурі). При мержі обох PR текст §2.51 варто прочитати з цією поправкою — вона записана в §2.53.Тести
cargo test -p rules-napi10 → 13 (+3: дельта доносить файли до гостя;diagnostic.fileмає пріоритет над дельтою; порожня дельта і далі падає).npm/scripts/lib/lint-surface/tests/fix-delta-files.test.mjs(2) — закриває саме host-проводку: без нього обидві половини були б зелені поодинці, а фіча не працювала б.delta_filesвалить рівно rust-тест, зняття аргументу вwasmFixPattern— рівно JS-тест.wasm-plugin-parity+wasm-fix-e2e+ новий файл — 267/267.Побічне спостереження (не в цьому PR)
Під час прогону вітест видав:
poolOptions was removed in Vitest 4. ТобтоpoolOptions.forks.maxForks: 4, який я додав раніше як обмежувач кількості node-процесів, інертний — у vitest 4 це top-levelmaxWorkers. Окрема правка.🤖 Generated with Claude Code