Базова лінія якості
Знято 2026-08-25 на коміті 227d962, одразу після ввімкнення аналізаторів у 0.19.0.
До цього релізу в бекенді не було жодного аналізатора: ні Directory.Build.props, ні
.editorconfig для C#, ні SonarAnalyzer/Roslynator. Ввімкнено було тільки Nullable=enable, і його
попередження ніхто не рахував. Ці числа — точка відліку, а не мета на завтра.
Гейт не блокує: попередження лишаються попередженнями, CI показує їх у зведенні. Причина в тому, що впровадити аналізатори на 646 файлах і одразу зробити їх помилками означало б спинити роботу.
Бекенд — 652 попередження
Section titled “Бекенд — 652 попередження”| Проєкт | Попереджень |
|---|---|
| tests | 248 |
| ProjectK.BusinessLogic | 163 |
| ProjectK.API | 100 |
| ProjectK.Infrastructure | 96 |
| ProjectK.Common | 45 |
За джерелом:
| Родина | Кількість | Що це |
|---|---|---|
CS (компілятор) |
232 | Nullability — було видно й раніше, просто ніхто не дивився |
CA (.NET-аналізатори) |
246 | Нове |
S (Sonar) |
158 | Нове |
RCS (Roslynator) |
2 | Нове |
Найчастіші правила:
| Правило | Кількість | Суть |
|---|---|---|
| CS8625 | 119 | null у non-nullable параметр |
| CS8618 | 77 | Non-nullable поле не ініціалізоване |
| CA1848 | 74 | Логування без LoggerMessage-делегатів |
| S8969 | 46 | Sonar |
| CA1873 | 40 | Дорогий аргумент логування обчислюється завжди |
| CA1861 | 23 | Константні масиви в аргументах |
| CA1859 | 21 | Конкретні типи замість інтерфейсів у гарячих шляхах |
| CA1305 | 16 | Форматування без IFormatProvider |
Що свідомо приглушено
Section titled “Що свідомо приглушено”- CA1707 у тестах — 545 із 546 випадків це імена виду
Method_Scenario_Expectation. Це наша конвенція, і вона ховала все інше. У продакшн-коді правило працює. - CA2201 і CS8618 у тестах — кидати
new Exceptionіз тестового дубля і присвоювати фікстури вsetupце норма. Аналізатор підтвердив, що в продакшн-коді жодногоthrow new Exceptionнемає — ручний аудит, з якого починалась ця сторінка, був точний. - CS1591 (відсутній XML-коментар) — окрема задача з документації, не шум у щоденній збірці.
Без цих приглушень було б 1245 — майже вдвічі більше, і 44% становила б одна тестова конвенція.
Фронтенд — 18 попереджень
Section titled “Фронтенд — 18 попереджень”| Правило | Кількість |
|---|---|
sonarjs/assertions-in-tests |
5 |
sonarjs/no-nested-template-literals |
3 |
sonarjs/void-use |
2 |
sonarjs/no-forced-browser-interaction |
2 |
sonarjs/cognitive-complexity |
2 |
| решта поодинці | 4 |
Помилок 0 — лінт проходить.
Що змінилось у налаштуванні
Section titled “Що змінилось у налаштуванні”- Додано
eslint-plugin-sonarjs; правила зrecommendedпонижено доwarn, щоб знахідки були видні, але не валили збірку. Правила, якіrecommendedлишає вимкненими, вимкнені й далі — інакше вмикається понад 900 стилістичних зауважень на кшталтfile-header. - Зона лінта розширена на
e2e/**, який раніше не перевірявся взагалі. Це одразу знайшло невикористаний аргумент уpage-title.spec.ts. - У spec- і e2e-файлах вимкнено
no-duplicate-string,no-identical-functions,no-hardcoded-passwordsіprefer-specific-assertions— засіяні креденшели й повтори у фікстурах це суть тестів, а не борг.
Тести й покриття
Section titled “Тести й покриття”| Кількість | |
|---|---|
| Бекенд | 724 |
| Фронтенд | 614 |
| E2E (Playwright) | 97 |
Покриття збиралось і збирається обома боками (coverlet.collector, karma-coverage), але в CI не
збиралось і ніде не примусове. Порогів навмисно не ставимо, доки не буде видно реальну цифру.
Як звіряти
Section titled “Як звіряти”Бекенд:
dotnet build Backend/ProjectK.Backend/ProjectK.Backend.sln -v q --nologoФронтенд:
cd Frontend/projectk-frontend && npx ng lintНаприкінці 0.19.0 кількість попереджень має впасти, покриття — не впасти.
Іменування — 2026-09-11
Section titled “Іменування — 2026-09-11”E2E після всього: 101/101 на перезібраному образі, після двох виправлень у коді (мапа AutoMapper для списку виховників; літерал імені дії, зачеплений перейменуванням) і однієї спеки.
DEBT-06: 165 імен запитів, хендлерів, валідаторів і обробників подій приведено до одного стилю,
NamingRules в архітектурних тестах не дає йому розповзтися. DEBT-07: один макет модуля на
фронтенді, kebab-case для файлів моделей і функцій, hex-фолбеки в CSS зняті. Обидва — без
семантичних змін; 1077 + 664 тести зелені.
Формат — 2026-09-11
Section titled “Формат — 2026-09-11”dotnet format прогнано по всьому бекенду (file-scoped namespaces, зайві using, пробіли, без BOM;
міграції виключено). dotnet format --verify-no-changes --exclude "**/Migrations/**" чистий і
стоїть у CI як advisory-крок. Кількість аналізаторних попереджень не змінилась: форматер їх не
торкається.
Повторний знімок — 2026-09-11 (після першого ярусу до 1.0)
Section titled “Повторний знімок — 2026-09-11 (після першого ярусу до 1.0)”Тести: бекенд 1073 (523 · 472 · 69 · 9), фронт 664. dotnet list package --vulnerable --include-transitive — чисто в усіх девʼяти проєктах; npm audit --omit=dev — чисто, dev-ланцюг
(karma, browserslist, fast-uri через @angular-devkit) лишається до наступного мажора
angular-eslint.
Повторний знімок — 2026-09-11 (main після 0.20.0-beta)
Section titled “Повторний знімок — 2026-09-11 (main після 0.20.0-beta)”Знято під час аудиту готовності до 1.0, тим самим способом, що й вище.
| Було (2026-08-25) | Стало | |
|---|---|---|
Попереджень бекенду (dotnet build -c Release --no-incremental, унікальних) |
652 | 776 |
Попереджень фронту (ng lint) |
18 | 18 (0 помилок) |
| Тестів бекенду | 724 | 1032 (508 + 446 + 69 + 9, після аудитних виправлень) |
| Тестів фронту | 614 | 652 (два спеки битого register/manager знято) |
| E2E (Playwright) | 97 | 101 |
Бекендних попереджень стало більше, а не менше: 0.20.0 додала ~370 файлів (членства, імпорт,
реєстр) під тими самими аналізаторами. Найчастіші правила ті самі — CS8625 (143), CA1848 (73),
CS8618 (65), S8969 (58), CA1873 (39). Три файли тестів dotnet format позначає як
CHARSET (не UTF-8) — див. задачу FMT-01.
Вразливих пакетів у продакшн-проєктах немає (dotnet list package --vulnerable,
npm audit --omit=dev). У тестових проєктах — транзитивні SQLitePCLRaw.lib.e_sqlite3 2.1.11
(API.Tests) і MessagePack 2.5.192 (LoadTests); у devDependencies фронту — qs через karma.