Рекурсивне самовдосконалення мов: шліфування інтелекту коду для ~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.
Спостережуваність агентів: хуки, Alloy та Grafana_
Ми під'єднали Claude Code та Codex до єдиного стеку Grafana за допомогою OpenTelemetry та Alloy, а потім використали трейси й логи, щоб знаходити та виправляти проблеми в поведінці агентів у джерелі.