TGViewer
🇺🇦 Math.random(): community of engineers 🇺🇦 Math.random(): community of engineers @mathrandomcommunity · 1.25K subscribers
Post #986 551
Агент пише швидше, ніж ти встигаєш читати? Ось 10 перевірок, які зменшують обсяг коду для ручного рев'ю.

Evil Martians зібрали десять перевірок для фронтенду на TypeScript і React. Все конкретно, з інструментами і причинами.

⏺ Не дати написати зайве

Генеруйте типи з OpenAPI-специфікації. Найтиповіший дефект AI-коду - поле, якого не існує. Модель бачить поруч user і пише user.fullName, хоча бекенд віддає firstName і lastName. Якщо типи живуть окремо від специфікації, TypeScript це пропустить. Один опис API на два боки прибирає цілий клас багів ще на старті.

Опишіть межі шарів у лінтері. Модель не тримає в голові вашу архітектуру між сесіями і тягне код до середнього по GitHub. eslint-plugin-boundaries задає напрямок залежностей: сервіс не може імпортувати компонент.

⏺ Знайти те, що вже написано

Запустіть mutation testing. Покриття показує лише те, що рядок виконався - навіть якщо тест перевіряє мок і завжди зелений. Stryker навмисно ламає код і дивиться, чи впаде тест. Так видно, чи ваші тести взагалі щось ловлять.

Пошукайте дублікати. Дев'ятим у списку йде jscpd - мій інструмент, тому скажу відверто і про плюси, і про ліміти.

Порада авторів слушна: ставте різні пороги для JSX і для бізнес-логіки. Повторення розмітки часто є нормою, повторення логіки майже завжди стає проблемою. У Evil Martians дві копії розійшлися, і той самий підсумок зарплати показував 23 години 30 хвилин в одному місці та 0 годин 00 хвилин в іншому.

Межа, яку вони назвали, тримається на тому, що jscpd шукає текстову схожість. На днях вийшов 5.2.0, і саме її я і закривав.

--ignore-identifiers і --ignore-literals нормалізують токени перед хешуванням: копія, що відрізняється лише іменами, тепер знаходиться і позначається як renamed.

--max-gap-lines зшиває копію зі вставленим рядком посередині в один клон замість двох коротких.

А для JS і TS з'явився --similarity: кожна функція порівнюється за мішком 4-грам типів вузлів синтаксичного дерева.

⏺ Зробити перевірки обов'язковими

Заблокуйте мердж у CI. Перевірка працює тільки тоді, коли гілка не йде далі: формат, лінтер, tsc, юніт-тести, mutation testing на дифі. Деплой стартує лише після зеленого світла.

Вмикайте поступово. Спочатку правила як warnings і тільки на змінених файлах. Зловило реальний баг - підвищуйте до error, і аж потім ставте жорсткий гейт. Інакше команда почне шукати обхідні шляхи.

⏺ Де закінчується автоматика

Зелений статус усіх десяти перевірок не означає, що код хороший. Він означає лише те, що перевірки не знайшли того, що вміють шукати.

Жоден інструмент не скаже, що ви зробили не ту фічу або що ця абстракція тут зайва. Смак та архітектура залишаються на нас.

💬 Повний список: evilmartians.com/chronicles/ten-anti-ai-slop-moves-for-frontend-projects-going-faster-than-humans-can-review

Скільки з цих перевірок уже стоїть у вашому CI?

🔥 - більшість, і вони блокують мердж
👀 - поки що тільки лінтер
evilmartians.com 10 anti-AI slop moves for frontend projects going faster than humans can review—Martian Chronicles, Evil Martians’ team blog Ten checks that catch what AI-written frontend code hides: contract codegen, boundary linting, mutation testing, and dead-code detectors.
  • 👍 7
  • 🔥 5
  • 👀 5
  • ❤ 3
More from @mathrandomcommunity
  1. Sep 30, 2026Подивись, як AI-судді розбирають код агента👆 Це тестова гра нашої команди в ololo. Навіщо…
  2. Sep 30, 2026video post
  3. Sep 29, 2026Найнебезпечніша фраза від AI-агента: «Готово, тести проходять». Мій агент пише її щодня. З…
  4. Sep 29, 2026video post
  5. Sep 24, 2026Нова модель Jev від TypeSafe AI стала однією з найпомітніших новинок останнього тижня 🆕 Я…
  6. Sep 21, 2026Ваш агент платить за генерацію тексту там, де йому потрібна відповідь «так» або «ні». Таке…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →