Рекурсивне самовдосконалення мов: шліфування інтелекту коду для ~280 мов
> Ми підтримуємо інтелект коду для ~280 мов. Жодна людина не здатна вручну перевірити це. Тож ми побудували цикл рекурсивного самовдосконалення мов — вибіркова перевірка, LLM як суддя, виправлення одного пункту, повторна валідація — і запускаємо його з флотом ізольованих агентів, доки вилучення не стане справді правильним, а не просто «зеленим».
Числа в цьому дописі відображають стан системи на момент публікації (травень 2026). Актуальні цифри дивіться на нашій сторінці команди.
Maguyva вилучає символи, посилання та граф залежностей із вихідного коду приблизно 280 мов. Кожна мова — це кастомний обробник tree-sitter — запити, евристики, крайові випадки — і кожен обробник може бути хибним по-своєму, тонко й непомітно. Виклик методу, поданий як читання. Функція, приписана не тій зовнішній області видимості. Зв’язок, якого просто не існує.
Це неможливо перевірити вручну. Жодна команда не здатна прочитати результати вилучення для 280 граматик і виявити погані ребра графа. Тож цікаве запитання не «чи правильне наше вилучення» — а «як дізнатися, що воно неправильне, за такого масштабу, без людини в кожному циклі». Наша відповідь — рекурсивне самовдосконалення мов: цикл якості, керований мовними агентами, LLM у ролі судді, і одне правило, яке ми постійно засвоюємо заново: зелений не означає правильний.
Зелений не означає правильний
Кожна мова має набір фікстур, і перевірка перед випуском оцінює її за п’ятьма вимірами — точність, структурна цілісність, повнота, якість та продуктивність. Мова стає GREEN (зеленою) лише тоді, коли на її фікстурах precision ≥ 0.95, recall ≥ 0.99 та F1 ≥ 0.97, з щонайменше 20 очікуваними ребрами для статистичної довіри. Нижче цього — YELLOW чи RED, і мова не постачається.
Ця перевірка необхідна, але недостатня. Фікстури перевіряються за фікстурами, які написали ми самі. Вони кодують випадки, які ми вже передбачили. Обробник може бути бездоганним на своїх фікстурах і все одно спотворювати патерн, який трапляється лише в реальному коді — макро-ідіому, метод з обмеженнями узагальненого типу, мовну особливість, для якої ніхто не написав фікстуру. GREEN означає, що фікстури проходять. Це не означає, що реальний репозиторій вилучається чисто. Тож циклу доводиться залишити фікстури позаду й перевірити реальний код.
Внутрішній цикл: вибіркова перевірка, суддя, виправлення, доведення
Основний цикл обробляє одну мову за раз:
┌──────────────────────────────────────────────────────────┐
│ │
▼ │
1. corpus run ── clone real-world repos, extract relationships │
│ │
▼ │
2. spot-check 100 edges (seed 42, then seed 123 to cross-check) │
│ │
▼ │
3. LLM judge classifies every sampled edge: │
CORRECT · FALSE_POSITIVE · TYPE_ERROR · │
SCOPE_ERROR · METADATA_ERROR │
│ │
▼ │
4. fix ONE thing — handler .py, .scm query, or config │
│ │
▼ │
5. re-validate — F1 + re-classify + manifest diff (no regressions)│
│ │
better? ──no──► revert, try a different fix ────────────────────┤
│ yes │
▼ │
6. promote the fix into fixtures (a permanent regression guard) ──┘
Кілька принципів допомагають цьому процесу давати результат, а не тупцювати на місці.
Суддя — це агент, а не виклик API. Коли ми кажемо «LLM як суддя», ми маємо на увазі, що сам мовний агент звіряє кожне вибране ребро графа з реальним вихідним кодом і класифікує його за фіксованою рубрикою з п’яти категорій: чи це ребро правильне, хибнопозитивне, правильний зв’язок з неправильним типом, прив’язане не до тієї області видимості, чи несе неправильні метадані? Ця рубрика — вся суть гри: «23% рівень помилок» нічого не означає, доки ви не знаєте, чи це реальні дефекти, чи суддя рахує неправильно.
Виправити одну річ, потім довести це. Кожна ітерація змінює рівно один редагований файл, потім повторно виконує перевірку в незмінному тестовому середовищі і зберігає зміну лише тоді, коли F1 покращується, а повторна класифікація виглядає краще. Якщо ні — зміна відкочується. Жодного пакетного набору правок на основі припущень, жодного «має стати краще». Зміна заслуговує на своє місце, або зникає. А коли виправлення закріплюється, воно потрапляє в набір фікстур — тож баг, який воно виправило, більше ніколи мовчки не повернеться. Саме цей крок промоції робить цикл рекурсивним, а не просто повторюваним: кожен прохід зміцнює оракул, проти якого валідується наступний прохід.
Урок, який ми постійно засвоюємо заново: метрики завищують кількість проблем
Ось пастка, і ми прямо в неї потрапили. Вторинні метрики корпусу — як часто вилучена ціль не має символу, який можна визначити, скільки символів виглядають «осиротілими» і так далі — масово завищують кількість проблем. Здебільшого це артефакти парадигми, а не баги.
Найчистіший приклад: llvm одного разу показав 73% рівень «джерела без символу» і був заклеймований як катастрофічний. Ми копнули глибше. Реальна точність становила 98.5%. «Відсутні символи» майже всі були легітимними зовнішніми посиланнями — викликами до стандартної бібліотеки, до фреймворків, до коду, що живе поза репозиторієм. Метрика вимірювала властивість мови, а не дефект обробника. Мови на кшталт Zig, COBOL та Odin показують рівень «осиротілості» 65–70% і при цьому цілком правильні; у COBOL не було жодної реальної помилки.
Якби ми дозволили цим числам керувати роботою, ми витратили б тижні на «виправлення» обробників, які вже були правильними, ігноруючи мови з тихими, реальними багами. Висновок різкий: агреговані метрики в найкращому разі — грубий сигнал для тріажу. Справжній сигнал якості — це вибіркова перевірка з класифікацією ребер — погляд на реальні ребра в реальних репозиторіях і суддівство по одному. Дані понад інтуїцію, але лише коли ви знаєте, які дані кажуть правду.
Зовнішній цикл: флот, а не марафон
Обробка однієї мови за раз для всіх 280 тривала б вічність, тож внутрішній цикл обгорнутий у зовнішній, що запускає багато мов паралельно.
pick a wave of near-GREEN / high-error languages
│
▼
fan out 10–15 agents, each ISOLATED in its own git worktree,
each grinding ONE language, committing to its own branch
│
▼
orchestrator integrates serially: file-scoped apply, then
`manifest diff` — any cross-language regression blocks the batch
│
▼
gated push (reviewed and confirmed) ──► rotate to the next wave
Кожен агент працює у тимчасовому робочому дереві (worktree), щоб вони не заважали одне одному. Оркестратор інтегрує їхні виправлення по одному, кожне за перевіркою регресії на повному маніфесті: зміна, яка допомагає своїй власній мові, але тихо ламає три інші, не приймається. Інтеграція проходить перевірку й отримує підтвердження, перш ніж щось буде відправлено (push) — перевірка на регресії визначає, що безпечно, людина все ще вирішує, що постачається. Потім пул перемикається на наступний набір мов, і весь процес запускається знову.
Що досі недосконале
Суддя може помилятися, і в цієї помилковості є напрямок: агент, що працює з надто малим контекстом, завищує кількість проблем. В одній партії вісім мов було позначено з 5–20% помилок; під час перевірки реальний баг підтвердився лише в одній мові — решта були помилками судді через пропуск власної семантики мови (один рядок джерела легітимно породжує кілька ребер, зв’язування параметрів моделюється як присвоєння, мови з посиланням на кожен ідентифікатор). Саме тому ми вибираємо з двома сідами (seeds) і перехресно перевіряємо, і саме тому розбіжність між суддею і фікстурами трактується як найцікавіший сигнал, а не остаточний вердикт — іноді помиляється саме фікстура.
Ми також чесні щодо мети. Мета — нуль реальних помилок, крапка — але «нуль» це напрямок, до якого ми послідовно рухаємося, вдосконалюючи підтримку кожної мови, а не галочка, яку можна поставити. Завжди є ще один репозиторій з ще однією ідіомою.
Заслужене, а не заявлене
Усе, що Maguyva робить для агента — знаходить символ, простежує залежність, відповідає на запитання з цитованим кодом — спирається на те, що вилучення, на якому все це ґрунтується, працює правильно. У межах 280 мов «правильність» не можна просто заявити; її потрібно постійно заслуговувати на реальному коді. Цикл — це те, як ми її заслуговуємо: автономний цикл вибіркової перевірки й виправлення, що ставиться до власних метрик з підозрою, доводить кожну зміну і перетворює кожне виправлення на запобіжник проти наступної регресії. Це не гламурно. Це та робота, яка дозволяє нам сказати «ми підтримуємо вашу мову» і мати це на увазі. Зелений — легко. Правильний — заслужений.
Читайте також
Ще з журналу розробки Maguyva
Чому ми оновили пошук коду до voyage-4-large_
Ми перевели наші ембеддинги коду на voyage-4-large — модель, що наразі очолює публічний рейтинг RTEB для пошуку коду. Чесна версія: компроміс, на який ми йдемо, що ми насправді індексуємо, і чому ми платимо за преміум-ембеддинги.
Мультимодальний пошук зі злиттям: обираємо правильний ретрівер для кожного запиту_
Запит на кшталт «де визначено parseConfig» потребує іншого пошуку, ніж «як працює автентифікація». Maguyva класифікує намір, відповідно зважує чотири режими пошуку і зливає результати за допомогою зваженого Reciprocal Rank Fusion.
Прогресивне розкриття: вікна CLI в агентні системи_
Агентні системи за замовчуванням непрозорі. Прогресивне розкриття дає операторам багаторівневі подання CLI — від швидких перевірок статусу до повної внутрішньої структури агентів і трейсів рішень.