Ваш AI-агент не понимает код. Он просто очень уверенно угадывает — поэтому мы создали SLICER
“AI agents write units of changes that look good in isolation. They are consistent with themselves and your prompt. But respect for the whole…”
«AI-агенты создают отдельные изменения, которые хорошо выглядят сами по себе. Они согласованы внутри себя и соответствуют вашему запросу. Но целостность всей системы при этом остаётся без внимания».
— Mo Bitar, создатель Standard Notes, после двух лет активной разработки с AI
AI-агент хорошо пишет код локально, но теряет систему целиком — поэтому мы создали CodeSlicer

Содержание
По отдельности всё работает. Вместе — разваливается
AI-агент хорошо пишет код локально. Он добавляет функцию, чинит тест, меняет компонент или создаёт endpoint. Изменение выглядит аккуратно, проходит ближайшие проверки и соответствует последнему сообщению пользователя.
А потом ломается сайт, пропадает часть пользовательского сценария или внезапно перестаёт работать соседний сервис. В коде нет одной очевидной строки с ошибкой: проблема возникает на границе нескольких модулей.
Локально — блеск. Глобально — каша.
Проблема появляется позже, когда нужно посмотреть на систему целиком:
один агент выбирает provider, не заметив вторую реализацию;
другой меняет HTTP wrapper, но не видит backend route;
третий исправляет service, не зная о background consumer;
четвёртый обновляет frontend client, но оставляет старый barrel export;
тесты проходят в одном сценарии, а соседний пользовательский путь перестаёт работать.
Каждый отдельный фрагмент может выглядеть правильно. Общая система при этом становится несогласованной. Агент пишет хорошие отдельные главы, но постепенно теряет сюжет всей книги.
Большой проект больше похож на нервную систему, чем на набор независимых файлов. Сигнал от одной функции проходит через DI-контейнер, сервисы, базы данных, HTTP-границы, очереди, frontend и тесты.
Одна правка в сигнатуре или provider binding (связывании зависимости с реализацией) может пройти через несколько языков и слоёв проекта. Главный вопрос не в том, где встречается имя функции, а в том, какие пути между компонентами существуют на самом деле.
Опытный разработчик может чувствовать эти связи из контекста проекта. AI-агент вынужден восстанавливать их по частям, в пределах текущего контекстного окна. Он может открыть не тот файл, забыть ранее найденную альтернативу или достроить правдоподобный target (целевой символ) там, где доказательств недостаточно.
Разработчик может помнить, какой provider создаёт сервис, какой wrapper ведёт к endpoint и почему два метода с одинаковым именем живут в разных классах. Агенту приходится собирать этот пазл вслепую — по кусочкам, без картинки на коробке.
Отсюда возникает центральный вопрос статьи:
Как отличить настоящую связь в кодовой базе от убедительной истории, которую достроил AI?
Какой именно save вызывается?
Рассмотрим простой код:
class OrderService:
def __init__(self, repository):
self.repository = repository
def create_order(self, order):
return self.repository.save(order)Первое предположение выглядит очевидным:
self.repository → OrderRepository → OrderRepository.saveНо такой вызов сам по себе не доказывает target. В проекте могут существовать OrderRepository.save, PaymentRepository.save, AuditRepository.save и MockRepository.save. Объект может приходить через constructor DI, provider, factory, registry или runtime-конфигурацию.
Extractor видит наблюдаемый факт:
receiver: self.repository
method: saveДальше нужно проверить constructor parameter, provider binding, concrete type, field assignment и method lookup. Только такая цепочка позволяет связать вызов с конкретным методом.
Вероятная связь и доказанная связь — не одно и то же. Confidence без evidence — это просто красиво оформленная догадка.
Решение проблемы
Вайбкодинг ускоряет написание кода, но плохо отвечает на вопрос: что ещё изменится после этой правки?
Изменение одного метода может пройти через несколько уровней:
React-компонент
→ hook
→ API client
→ HTTP wrapper
→ endpoint
→ backend route
→ service
→ repository
→ database
→ background taskОбычный поиск по строке видит совпадение имени. AI-агент может прочитать несколько файлов, но часто теряет связь между ними, особенно когда в проекте есть dependency injection, aliases и re-export, вложенные router prefixes, динамические HTTP paths, несколько классов с одинаковыми методами, frontend и backend на разных языках, фоновые задачи и event handlers.
CodeSlicer — локальный CLI, MCP-сервер и визуальный интерфейс, которые строят граф влияния проекта и отвечают не только «где встречается символ», а:
Что затронет изменение, почему система считает это связанным и каким частям результата можно доверять?

CodeSlicer можно подключить к KODIK IDE, Cursor, Windsurf, Codex, Claude Code, Antigravity и другим AI-агентам через CLI, MCP и agent skills. Инструмент не заменяет редактор, а даёт агенту проверяемый граф проекта и контекст влияния.
Главное свойство CodeSlicer — разделение факта и гипотезы:
extractor извлекает то, что непосредственно написано в коде;
resolver пытается связать факт с конкретным символом;
support pack добавляет правила конкретного фреймворка;
quality guard проверяет provenance и противоречия;
impact query строит цепочку и помечает слабые участки;
AI получает граф как контекст, но не может напрямую записать в него подтверждённую связь.

Что получает разработчик
Результатом является не картинка ради картинки, а воспроизводимый GraphDocument. В нём есть узлы, рёбра, статусы разрешения, confidence, evidence chain и provenance.
{
"from": "OrderService.create_order",
"to": "OrderRepository.save",
"kind": "CALLS",
"resolution_status": "resolved",
"evidence_class": "static_inferred",
"validation_status": "not_validated",
"confidence": 0.86,
"resolver_id": "typed_receiver_resolver",
"source_fact_ids": [
"fact:field-binding:self.repository",
"fact:call:self.repository.save",
"fact:declaration:OrderRepository.save"
],
"evidence": [
"constructor parameter repository: OrderRepository",
"self.repository = repository",
"self.repository.save(order)"
]
}Если target нельзя выбрать однозначно, система не должна угадывать:
ambiguous
unresolved
unsupported_semantics
quarantineЭто менее эффектно, чем нарисовать лишнюю стрелку, но гораздо полезнее для PR-review и агентской разработки.
Не просто граф
Визуальная карта сама по себе не отвечает на вопрос, что делать после изменения. Для агента ценность появляется, когда он получает компактный impact slice (ограниченный срез области влияния):
изменённый узел
+ связанные callers и callees
+ endpoints и пользовательские сценарии
+ релевантные тесты
+ evidence каждой связи
+ альтернативные кандидаты
+ unresolved boundariesCodeSlicer не заменяет IDE и не пишет код вместо агента. Агент по-прежнему принимает решение и редактирует проект. CodeSlicer отвечает на другой вопрос:
Какой минимальный и проверяемый контекст нужен агенту именно для этой задачи?
Сценарии использования
Найти причину поломки сайта
После изменения OrderRepository.save агент запрашивает:
Покажи все подтверждённые и вероятные цепочки, которые могут быть затронуты изменением OrderRepository.save.
Отдельно покажи frontend, routes, background tasks, tests и unresolved areas.Ответом становится не список совпадений, а impact-цепочка с доказательствами.
Проверить pull request
В текущем PR-review workflow CodeSlicer принимает diff, сопоставляет изменённые файлы и символы с графом, а затем выдаёт must_change, should_review, possibly_related, подозрительные связи, рекомендуемые тесты и причины высокого риска.
Важно: diff определяет изменённые символы, но не заменяет полный анализ проекта. Для большого проекта нужен предварительно сохранённый граф или incremental workflow.
Дать AI-агенту компактный контекст
Вместо передачи всего репозитория агент получает изменённый узел, релевантный подграф, лучшие evidence paths, необходимые фрагменты файлов и unresolved/suspicious boundaries.
Это позволяет строить агентов для code review, миграций, рефакторинга и диагностики без постоянного повторного обхода всей кодовой базы.
Разобраться в незнакомом проекте
Сначала CodeSlicer показывает inventory, языки, библиотеки, routes, tests и архитектурные кластеры. Затем агент может задать типизированные вопросы:
Какие frontend-компоненты вызывают этот endpoint?
Какие сервисы используют этот repository?
Почему это ребро существует?
Какие области проекта не удалось разрешить?Исследовать неизвестную библиотеку
В экспериментальном research workflow неизвестная библиотека не становится автоматически доверенным знанием. Система создаёт research task, а внешний AI-агент изучает официальную документацию и исходный код, формирует candidate support pack, добавляет positive и forbidden fixtures, запускает mutation и determinism tests, проходит trust lifecycle и только затем подключает правило к обычному анализу.
Как работает алгоритм

Схема показывает основной конвейер: проект сначала превращается в raw facts, затем факты нормализуются и разрешаются в semantic graph. Support packs подключаются к этапам семантического связывания, а неизвестные участки уходят в отдельный research workflow. AI предлагает правила и тесты, но не записывает подтверждённые рёбра напрямую.
Этапы конвейера
Этап | Что происходит | Результат |
|---|---|---|
Inventory | Определяются языки, manifests, локальные модули, dev/test и внешние зависимости | область анализа и dependency classification |
Scan plan | Исключаются node_modules, build, vendor, generated и бинарные файлы | список файлов для обработки |
Extraction | Python AST и parser-backed extractors извлекают declarations, imports, callsites, routes и assignments | raw facts |
Normalization | Стабилизируются canonical IDs, объединяются источники, сохраняется provenance | нормализованный FactDocument |
Semantic binding | Связываются импорты, параметры, поля, receivers, constructors и return values | кандидаты semantic edges |
Precision resolution | Выбирается exact target или создаётся ambiguous/unresolved результат | ResolvedGraphDocument |
Support packs | Подключаются правила FastAPI, React, SQLAlchemy, Celery и других библиотек | framework-specific edges с rule ID |
Quality gates | Проверяются status, confidence cap, provenance, dangling edges и forbidden patterns | пригодный для query граф |
Impact query | Выполняется ограниченный обход вверх и вниз по графу | impact report и объяснение цепочки |
Почему support pack — это не просто набор regex
Support pack описывает, как библиотека участвует в нескольких слоях:
APIRouter
→ route declaration
→ include_router prefix
→ handler
→ Depends provider
→ serviceКаждое framework-specific ребро должно иметь attribution:
{
"support_pack": "python/fastapi",
"rule_id": "fastapi.apirouter.post",
"rule_version": "1.0.0",
"trust_level": "verified_on_fixture",
"resolver_hook": "fastapi_router_resolver",
"matched_pattern": "@router.post",
"evidence": [
"local route decorator",
"parent router prefix",
"app.include_router prefix"
]
}AI может предложить pack, но не может самостоятельно перевести его в confirmed без validation.
Статусы и доверие
confidence отвечает на вопрос «насколько сильна цепочка доказательств», а validation_status — «проверялась ли она наблюдением».
resolution_status: resolved | ambiguous | unresolved
evidence_class: static_proven | static_inferred | support_pack
validation_status: not_validated | runtime_observedЕсли путь состоит из нескольких рёбер, его статус определяется самым слабым участком. Это не даёт длинной цепочке стать подтверждённой из-за нескольких сильных рёбер и одного слабого.
Что происходит при изменении проекта
В экспериментальном incremental workflow CodeSlicer сохраняет стабильные RawFact:
fact_id
fact_kind
canonical subject
canonical target
normalized properties
evidence location
provides dependency keys
consumes dependency keysПосле изменения файла вычисляется FactDiff, затем через reverse dependency index находятся affected facts, edges и resolvers. Незатронутые факты и рёбра переиспользуются, а derived annotations пересчитываются детерминированно.
Как проверяется достоверность
Нельзя доказать качество impact analyzer только количеством nodes и edges. Поэтому benchmark проверяет не только наличие ожидаемых связей, но и отсутствие ложных.
Expected и forbidden edges
Для каждого fixture задаются две группы:
expected_edges
forbidden_edgesНапример, для fullstack order-flow ожидается связь OrderRepository.save с OrderService.create_order и POST /api/v1/shop/orders. При этом users route и saveOrderDraft должны быть исключены, даже если их имена похожи.
Mutation testing
Система намеренно меняет evidence:
удаляет constructor binding;
заменяет provider;
добавляет второго кандидата;
удаляет import;
меняет receiver type;
убирает HTTP wrapper;
меняет route prefix.
Ожидаемый результат — edge исчезает, target меняется, статус становится ambiguous, создаётся quarantine или снижается confidence. Связь не может остаться прежней confirmed только потому, что совпало имя метода.
Determinism
Одинаковый проект с одинаковой конфигурацией должен давать одинаковые canonical IDs, logical edges, unknown-region fingerprints и core semantic fingerprint. Timestamp, абсолютный временный путь и порядок runtime observations не должны менять смысловой результат.
Runtime observation не является абсолютной истиной
Если тест реально прошёл через вызов, это подтверждает только наблюдение в конкретном сценарии, окружении и конфигурации. Это не доказывает, что тот же путь выполняется всегда.
Корректный статус выглядит так:
STATIC_RESOLVED + RUNTIME_OBSERVEDА отсутствие вызова в одном тесте не считается доказательством отсутствия связи. Ветка могла не выполниться, объект мог быть замокан, а instrumentation мог не поддержать subprocess или async boundary.
Что измерять на реальном проекте
Метрика | Что показывает |
|---|---|
TP / FP / FN | точность размеченных semantic edges |
forbidden violations | сколько запрещённых связей создано |
resolution coverage | какую долю eligible callsites удалось разрешить |
actionable unresolved | сколько неизвестных областей действительно требуют работы |
mutation pass rate | реагирует ли resolver на потерю evidence |
determinism | стабилен ли результат между запусками |
incremental equivalence | совпадает ли incremental graph с clean rebuild |
Высокая precision на маленьком fixture не означает полного понимания любой production-кодовой базы. Это означает, что конкретный паттерн доказуемо поддерживается.
Что показали тесты
Техническая схема имеет смысл только тогда, когда её можно проверить на размеченных сценариях. На текущем наборе тестовых сценариев результаты такие.
Python semantic resolution
Метрика | Результат |
|---|---|
Тестовые сценарии | 21 |
Mutation-сценарии | 29 |
Размеченные обязательные semantic edges | 20 |
True positive | 20 |
False positive | 0 |
False negative | 0 |
TypeScript и frontend-backend bridge
12 тестовых сценариев;
15 mutation-сценариев;
4 cross-language сценария;
endpoint precision: 1.0;
forbidden violations: 0.
Эти результаты относятся только к размеченным и поддерживаемым паттернам. Они не означают, что CodeSlicer уже полностью понимает любую production-кодовую базу. Их смысл в другом: на конкретных конструкциях можно показать не только найденные связи, но и отсутствие запрещённых связей, реакцию на потерю evidence и стабильность результата.
Как выглядит результат



У каждого узла есть canonical identity, kind, location, язык, роль и связи. У каждого ребра — kind, direction, confidence, status, resolver и цепочка evidence.
Пример маршрута:
HTTP POST /api/v1/shop/orders
← FastAPI create_order
← OrderService.create_order
← OrderRepository.save
Или fullstack-цепочка:
OrderCreateForm
← useOrders
← api.orders.createOrder
← HTTP POST /api/v1/shop/orders
← FastAPI route
Чем CodeSlicer отличается от похожих инструментов
Важно не сравнивать инструменты только по слову «граф». Они решают разные задачи.
Инструмент | Основной фокус | Сильная сторона | Реальное отличие CodeSlicer |
|---|---|---|---|
Graphify | локальный code knowledge graph для AI-ассистента | широкая AST-карта, CLI/MCP, query/path/explain, локальная работа | CodeSlicer сфокусирован на impact workflow, framework support packs, endpoint bridge и quality-gated semantic resolution |
Sourcegraph | code search и code navigation на уровне организации | go-to-definition, references, implementations, cross-repository navigation, SCIP indexers | CodeSlicer — локальный проектный graph/impact engine, а не hosted code intelligence-платформа |
CodeSee | визуальные Codebase Maps, Review Maps и Service Maps | onboarding, совместная визуализация, review map и командные automation | CodeSlicer хранит evidence/status/confidence на semantic edges и рассчитан на CLI/MCP-агентов и локальный PR impact |
Joern | security research и Code Property Graph | CPG, taint/dataflow, query DSL, vulnerability research | CodeSlicer не заменяет security analyzer; он специализируется на изменениях, runtime paths, endpoint chains и агентском контексте |
Semgrep / CodeQL | правила, SAST и data-flow/security findings | поиск уязвимостей и policy violations | CodeSlicer отвечает на другой вопрос: какие части системы затронет изменение и почему |
Graphify, CodeSee, Sourcegraph и Joern не нужно объявлять хуже. CodeSlicer может дополнять их:
Graphify / Sourcegraph → навигация и обзор
Joern / Semgrep / CodeQL → security и data-flow findings
CodeSlicer → impact, provenance, framework chains и контекст для агента
Сравнение сделано по официальным материалам:
Что можно построить поверх CodeSlicer
Semantic graph — это инфраструктурный слой. На его основе можно строить несколько продуктов.
Багфиксы с ограниченной областью поиска
Если после создания заказа не обновляется остаток товара, агент получает не весь проект, а цепочку:
POST /orders
→ OrderService
→ OrderRepository
→ InventoryClient
→ stock update event
→ связанные тестыЭто не гарантирует автоматическое обнаружение причины. Зато уменьшает пространство поиска и показывает места, где нужно проверить альтернативные реализации.
Выбор тестов
При изменении метода можно найти связанные regression cases, незакрытые ветки, тесты на соседние endpoints и high-risk edges, которые стоит подтвердить runtime trace. Так test selection становится анализом реальной цепочки, а не поиском файлов по похожему имени.
Code review и оценка риска
PR review может показать:
HIGH:
изменена общая authorization-функция
затронуто 14 endpoints
tests покрывают только 8
UNKNOWN:
один путь проходит через dynamic providerТакой отчёт отделяет обязательные проверки от вероятных и неизвестных.
Безопасный рефакторинг и миграции
Перед изменением публичной сигнатуры, DTO, endpoint или database model можно построить область влияния. Это применимо к переименованиям, миграции REST API, обновлению библиотеки, замене HTTP wrapper и разделению монолита.
Incident response
Во время инцидента исходной точкой может быть endpoint, stack trace, event name или database table. Граф помогает восстановить upstream и downstream:
runtime symptom
→ handler
→ service
→ external client
→ event consumer
→ affected testsто не замена logs и distributed tracing, а способ связать runtime-сигнал со структурой исходного кода.
Multi-agent разработка
Большую задачу можно разделить по веткам impact graph:
agent 1 → backend route и service
agent 2 → frontend client и component
agent 3 → database и migration
agent 4 → tests и verificationКаждый агент получает собственный slice и список границ, которые нельзя считать подтверждёнными.
Security impact
CodeSlicer не заменяет taint analyzer или vulnerability scanner. Но после обнаружения опасного sink он может показать, какие внешние entrypoints до него доходят, какие сервисы используют уязвимый wrapper, какие endpoints затронуты и где остаётся unresolved dynamic dispatch.
Почему регситрация библиотек важнее ещё одного промта
Если каждый пользователь отдельно просит AI исследовать одну и ту же библиотеку, появляются несовместимые и непроверенные правила. Проверенный registry может хранить не только support pack, но и его доказательную базу:
library metadata
→ supported versions
→ semantic rules
→ official sources
→ positive fixtures
→ forbidden cases
→ mutation history
→ trust level
→ compatibility reportПользовательский CodeSlicer при этом остаётся лёгким и локальным. Он получает версионированные правила, но исходный проект и GraphDocument продолжают храниться у пользователя.
Это не «облако, которое знает всё автоматически». Это каталог проверенных правил, где каждый pack проходит validation и имеет историю доверия.
После анализа большая кодовая база не обязана превратиться в полностью зелёную сеть. Правильный результат выглядит так:
confirmed
inferred
ambiguous
unresolved
unsupported_semanticsНеизвестность — часть результата, а не ошибка интерфейса. Если resolver не может доказать target, безопаснее вернуть unresolved, чем показать уверенную связь, которая приведёт агента к неправильному файлу.
Что будет дальше
Ближайшие технические задачи
расширение semantic providers для TypeScript/JavaScript;
повышение точности Go и Java без притворства compiler-level parity;
реальные incremental rebuild и equivalence checks;
runtime observation для pytest и других тестовых runners;
больше negative и mutation benchmarks;
безопасное закрытие unknown regions через повторяемые research tasks;
лучшее измерение context selection и token saving.
Библиотечный registry
Следующий этап — вынести локальные support packs в отдельное версионированное хранилище с compatibility reports, fixtures и историей validation. Подробно идея registry разобрана выше.
Локальный CodeSlicer при этом останется лёгким: CLI, MCP, parser, graph, cache и данные проекта будут работать у пользователя, а registry будет поставлять проверенные правила и их доказательную базу. Неизвестная библиотека может быть исследована агентом пользователя, но это будет candidate knowledge до прохождения validation.
Возможная модель монетизации
Базовый локальный движок может оставаться бесплатным и открытым: CLI, MCP, локальный parser, локальный GraphDocument, базовые public support packs и визуальный интерфейс.
Платными могут быть отдельные сервисы:
Verified Registry — проверенные packs, версии, fixtures и совместимость;
Private Registry — внутренние библиотеки и закрытые framework rules организации;
Team Impact CI — PR checks, history, dashboards и policy gates;
Research and Verification — исследование неизвестных библиотек с автоматической проверкой pack;
Enterprise self-hosted — registry и CI внутри VPC.
Ключевое ограничение: платный registry не должен означать обязательную загрузку исходного кода пользователя. В базовой модели CodeSlicer анализирует проект локально, а registry поставляет только версионированные правила и их доказательную базу.
Итог
CodeSlicer — не попытка заменить все существующие инструменты анализа кода одним графом. Это слой, который отвечает на другой вопрос:
Если изменить этот узел, какие части системы могут пострадать, какая цепочка это доказывает и где анализатор сам не уверен?
Для человека это impact report. Для AI-агента — компактный, структурированный и проверяемый контекст. Для команды — возможность обсуждать изменения через реальные цепочки, а не через догадки по совпадению имён.
AI уже научился быстро писать код. Теперь ему нужен слой, который не даст потерять систему целиком.