О проекте
Команда: Vector field
Кейс HackAlem.ai: Финансы — Freedom
Стадия: Доведённый продукт
Задача кейса: «Граф денег»: восстановить структуру организованной группы по сети транзакций (AML)
Суть
AML-инструмент: из трёх Parquet строит направленный граф, присваивает роли (consolidator, distributor, transit, terminal, coordinator, peripheral) и приоритет проверки всем 2248 узлам, выделяет 105 сообществ и показывает очередь, карточку «почему» и граф; опционально работает OpenAI-Investigator.
Как устроено
Детерминированный Python-pipeline (pandas, NetworkX) проверяет схемы, считает признаки, роли по пороговым правилам, Louvain-кластеры (seed=42) и направленную betweenness; приоритет задаётся взвешенной суммой шести positive-midrank перцентилей (seed-связи, достижимость ≤4 шага, число отправителей/получателей, объём, betweenness). Результаты сохраняются в 3 CSV и JSON snapshot, который отдаёт FastAPI; React + Cytoscape.js показывает очередь и подграф. Investigator на OpenAI Responses API использует 4 read-only инструмента (get_entity_profile, get_subgraph, rank_entities, find_common_recipients), ответы проверяются на ссылки GID.
Ключевые решения
- NetworkX
- Louvain
- betweenness centrality
- positive midrank
- rule-based роли
- function calling
- grounding-проверка фактов
Метрики
2248 узлов, 105 кластеров; полный pipeline 3,339 с, повтор 3,073 с, выходы совпали побайтово
Особенности
Прозрачная формула приоритета с шестью сохраняемыми вкладами как evidence; роли подаются как гипотезы, а не вероятность преступления; побайтовая воспроизводимость CSV и SHA-256 manifest в submission/.
Стек
Python · pandas · NumPy · PyArrow · NetworkX · FastAPI · Pydantic · React · TypeScript · Vite · Cytoscape.js
Модели
gpt-5.6-luna
Проект создан за 5 часов на финале хакатона HackAlem.ai (23 сентября 2026, Астана). Код — BAITC-Hacks/hack-836cc3bf-vector-field.
README
README.mdHackAlem — объяснимая очередь проверки финансовой сети
Кого проверить первым, почему и какие связи это подтверждают? HackAlem помогает AML-аналитику ответить на эти вопросы по предоставленной транзакционной сети: от исходных Parquet до ранжированного списка, карточки с числовыми основаниями и направленного графа.
Приоритет означает порядок дальнейшей проверки. Роли — гипотезы о функции узла в наблюдаемой сети. Ни один из этих показателей не является вероятностью преступления.
Быстрый запуск · Сценарий для жюри · Готовые CSV · Проверки ядра · Проверки нового UI
1. Название проекта
HackAlem — объяснимая очередь проверки финансовой сети. Решение кейса «Граф денег: восстановление финансовой структуры организованной группы по транзакционной сети».
2. Проблема и пользователи
Большой список переводов сам по себе не объясняет, с какого участника начинать исследование. Аналитику нужно сопоставить входящие и исходящие связи, связи с исходными участниками, положение в сети и ограничения выборки.
HackAlem собирает эти признаки в проверяемую очередь. Для каждого узла доступны основания роли и приоритета, наблюдаемые переводы, связи и следующий запрос недостающих данных. Это прототип поддержки аналитического исследования; решения о клиентах он не принимает.
3. Что реализовано
| Возможность | Что получает пользователь |
|---|---|
| Полный расчёт исходного кейса | Три Parquet → три CSV и единый JSON snapshot без API key |
| Роли и приоритеты | Все 2248 узлов, включая 19 изолированных seed; основная роль, вторичные признаки, раздельные оценки роли и приоритета |
| Объяснения | Шесть числовых вкладов в приоритет, исходные метрики, ссылки на evidence и ограничения каждого профиля |
| Кластеры | 105 рассчитанных сообществ, их состав в результатах, агрегаты и шаблонные гипотезы |
| Рабочий экран | Очередь, фильтры, поиск полного GID по всей выборке, карточка «Почему этот узел», направленный граф |
| Исследование окружения | Выбор узла, стрелки, легенда, граница depth=4, счётчики скрытых соседей и расширение подграфа |
| Экспорт | Скачивание nodes_roles.csv, clusters.csv, top_nodes.csv из интерфейса |
| Опциональный Investigator | Вопрос по всей сети или выбранному узлу; факты, ссылки на GID, переход из ответа в граф и реальные вызовы инструментов |
| Работа без AI | При отсутствии ключа, ошибке или таймауте модели аналитика, поиск, карточки, граф и CSV продолжают работать |
На проверенном Windows-окружении полный pipeline занял 3,339 с, повтор — 3,073 с; все четыре выходных файла совпали побайтово. Проверка чистого Git checkout заняла 3,250 с и воспроизвела те же результаты. Это измерения на текущем наборе, не обещание производительности для произвольной сети.
4. Как работает решение
- Пользователь передаёт папку с
nodes.parquet,edges.parquet,transactions.parquet. - Pipeline проверяет схемы, идентификаторы, суммы переводов и количества операций. Повторяющиеся строки transactions без transaction_id сохраняются.
- Python строит граф всех узлов, рассчитывает признаки, роли, сообщества и приоритеты по общим правилам.
- Результаты сохраняются в CSV и snapshot. API и интерфейс используют этот же расчёт; клики не запускают аналитику заново.
- Аналитик выбирает узел из очереди или находит произвольный GID, изучает основания и направленные связи. Ограниченный подграф не меняет метрики карточки.
- При наличии ключа Investigator уточняет исследование через ограниченные read-only инструменты. Из его вывода можно перейти к соответствующему узлу и проверить факты.
Откуда берутся роли и баллы
Правила версии v0 реализованы в pipeline/config.py и pipeline/run.py. Нет отдельных правил для демонстрационных GID.
| Роль | Основные условия допуска |
|---|---|
consolidator — консолидация | Не менее 3 разных отправителей |
distributor — распределение | Не менее 10 разных получателей |
transit — гипотеза транзита | Вход и выход >0; ≥2 операций с каждой стороны; наблюдаемый out/in от 0,8 до 1,2; не seed, depth<4 |
terminal — гипотеза конечного получателя | Не seed, depth<4; вход >0; out/in≤0,1; входящие на ≥2 датах; последний вход не позднее 29 июля |
coordinator — структурный посредник, кандидат | Входящие и исходящие связи; достижимость от ≥2 seed; betweenness≥90-го квантиля положительных значений; межкластерный объём≥20% |
peripheral — недостаточно признаков роли | Ни одна из ролей не прошла условия допуска |
Для допустимых ролей сила сигнала умножается на эвристический коэффициент: 0,85 для consolidator/distributor, 0,60 для transit, 0,50 для terminal, 0,55 для coordinator. Основная роль выбирается по максимальному score; равенства разрешаются фиксированным порядком из конфигурации. При одной операции score ограничен 0,40; fallback — 0,15, для изолята — 0,05. Другие допустимые роли сохраняются как вторичные.
Приоритет считается отдельно:
priority = 0.175 × p(прямые seed-отправители)
+ 0.175 × p(достижимость от seed за ≤4 шага)
+ 0.250 × p(число отправителей)
+ 0.200 × p(max(наблюдаемый вход, наблюдаемый выход))
+ 0.100 × p(betweenness)
+ 0.100 × p(число получателей)
p(x) — positive midrank по положительным значениям признака во всей сети: (число меньших + 0.5 × число равных) / N; нули получают 0. Шесть вкладов сохраняются как evidence и доступны для сверки в карточке. Веса — прозрачная политика MVP; их оптимальность на размеченных данных не установлена. Подробности: решения о методике, BUILD_BRIEF.
5. Технологии
| Слой | Используется в репозитории |
|---|---|
| Аналитика | Python, pandas, NumPy, PyArrow, NetworkX; направленная невзвешенная betweenness, Louvain с seed=42 |
| Backend | FastAPI, Pydantic, Uvicorn; HTTP JSON API над snapshot |
| Интерфейс | TypeScript, React, Vite, Cytoscape.js |
| AI | OpenAI Python SDK, Responses API; модель по умолчанию gpt-5.6-luna, настройка через OPENAI_MODEL |
| Проверки | Python unittest, проверки реальных Parquet и контрактов, TypeScript/Vite build, браузерные сценарии |
| Хранение | Исходные Parquet, CSV и JSON snapshot; данные API в памяти процесса |
Зафиксированные Python-зависимости: requirements-lock.txt. Frontend-зависимости: package.json и package-lock.json. Реальные AI-сценарии проверены с gpt-5.6-luna; доступ к модели зависит от настроек аккаунта OpenAI.
6. Архитектура проекта
flowchart LR
P[3 исходных Parquet] --> V[Проверка схем и агрегатов]
V --> A[Детерминированная аналитика Python]
A --> C[3 CSV]
A --> S[JSON snapshot]
S --> API[FastAPI]
API --> UI[React: очередь, карточка, граф]
S --> T[4 read-only инструмента]
T <--> I[Один Investigator / OpenAI]
I --> G[Проверка ссылок и фактов]
G --> UI
| Каталог | Назначение |
|---|---|
case/ | Официальное задание и исходные данные |
pipeline/ | Проверка входов, признаки, роли, кластеры, CSV и snapshot |
backend/ | API, экспорт, загрузка snapshot, вызов Investigator |
frontend/ | Единый аналитический экран |
agent/ | Один bounded Investigator, адаптер OpenAI и проверка ответов |
shared/ | TypeScript-контракт v1 и синтетические fixtures |
integration/ | Интеграционные тесты и отчёты проверок |
submission/ | Готовые CSV, manifest с SHA-256 и резервный пакет |
scripts/demo.py | Локальный запуск pipeline → API → собранный UI |
docs/ | Методика, контракт, ограничения и сценарий демо |
API: GET /api/summary, /api/entities, /api/entities/{gid}, /api/subgraph, /api/clusters, /api/export/{filename}; POST /api/investigate. Формы ответов и ошибки описаны в API_CONTRACT.md.
GID хранится как int64 в аналитике и как точная десятичная строка в HTTP, React и инструментах. UI не вычисляет роли или баллы по показанной части графа. Investigator использует get_entity_profile, get_subgraph, rank_entities, find_common_recipients; изменять данные и выполнять банковские действия он не может.
7. Установка и запуск
Проверенная конфигурация: Windows, Python 3.14.7, Node.js 24.21.0. Нужны Git, Python, Node.js/npm и место для зависимостей. Команды ниже выполняются из корня репозитория. Ключ OpenAI для основного решения не требуется.
Получить проект
git clone https://github.com/BAITC-Hacks/hack-836cc3bf-vector-field.git
cd hack-836cc3bf-vector-field
Доступ к клонированию определяется правами репозитория.
Windows PowerShell
python -m venv .venv
.\.venv\Scripts\python.exe -m pip install -r requirements-lock.txt
npm.cmd ci --prefix frontend
npm.cmd run build --prefix frontend
.\.venv\Scripts\python.exe scripts/demo.py --no-ai
macOS / Linux
Эквивалентные команды приведены для воспроизведения; запуск на этих ОС в финальной проверке не выполнялся.
python3 -m venv .venv
.venv/bin/python -m pip install -r requirements-lock.txt
npm ci --prefix frontend
npm run build --prefix frontend
.venv/bin/python scripts/demo.py --no-ai
Открыть http://127.0.0.1:8000/. Launcher сначала рассчитывает данные, затем запускает FastAPI и production UI. Остановка — Ctrl+C. При занятом порте добавить --port 8014 и открыть соответствующий адрес.
Исходная папка по умолчанию: case/data (1)/data. Для отдельного расчёта другой папки:
.\.venv\Scripts\python.exe -m pipeline --data 'case/data (1)/data' --out pipeline/out
Выходы: pipeline/out/nodes_roles.csv, clusters.csv, top_nodes.csv, snapshot.json. После успешного расчёта scripts/demo.py --skip-pipeline --no-ai использует существующие результаты.
Подключить Investigator — необязательно
Остановить сервер и установить переменные окружения перед повторным запуском:
$env:OPENAI_API_KEY='<ваш API key>'
$env:OPENAI_MODEL='gpt-5.6-luna'
.\.venv\Scripts\python.exe scripts/demo.py --skip-pipeline
Для macOS/Linux используются export OPENAI_API_KEY='…', export OPENAI_MODEL='gpt-5.6-luna' и .venv/bin/python scripts/demo.py --skip-pipeline.
Ключ хранить локально и не коммитить. Пример настроек — .env.example. Файл .env читается launcher только при явном --env-file .env; обычный Uvicorn автоматически его не загружает. --no-ai отключает AI даже при наличии ключа. Запрос AI отправляет ограниченные результаты инструментов внешнему OpenAI API; вызовы могут тарифицироваться провайдером.
Резервное демо без Node и повторного расчёта
После установки Python-зависимостей можно восстановить проверенные выходы и собранный интерфейс:
.\.venv\Scripts\python.exe -m zipfile -e submission/backup.zip .
.\.venv\Scripts\python.exe scripts/demo.py --skip-pipeline --no-ai
Распаковка заменяет одноимённые локальные файлы в pipeline/out/ и frontend/dist/. Это сохранённый проверенный результат, не новый расчёт. Резерв не содержит ключей, зависимостей или сгенерированных AI-ответов. Контрольные суммы — в manifest.json.
8. Как проверить решение
Пятиминутный сценарий для жюри
- Запустить приложение. Сводка должна показать 2248 узлов, 3119 направленных связей, 4840 переводов и 105 кластеров. Первый узел очереди выбирается автоматически.
- Найти
100000003115284100. В карточке: 8 отправителей, 15 входящих операций, 2 160 500 KZT; priority0.922834. Раскрыть шесть вкладов приоритета и основания роли. Граф содержит 10 узлов и 11 направленных связей. - Нажать «2 узла»: интерфейс покажет 8 скрытых соседей и 10 скрытых рёбер. Расширить окружение; метрики карточки останутся прежними.
- Проверить
100000000018102100: depth=4, недостаточно признаков роли; нулевой выход не выдается за доказательство terminal. Проверить изолят100000000456947100: полная карточка и отсутствие наблюдаемых связей. - Ввести
999999999999999999: получить «Узел не найден». Скачать три CSV через «Экспорт CSV». - Если настроен AI, выбрать «Вся сеть» и спросить: «Какие узлы проверить первыми и почему?». Открыть GID из ответа на графе. Для узлового вопроса выбрать «Выбранный узел»: «Что известно об узле 100000003115284100 и какие признаки поддерживают его приоритет?».
Дополнительный пример: 100000002578405100 — 116 получателей; после расширения окружения 117 узлов / 118 рёбер. Кнопка «Всё окружение» возвращает общий обзор. Подробный сценарий: docs/DEMO.md.
Автоматические и интеграционные проверки
.\.venv\Scripts\python.exe -m unittest pipeline.test_pipeline -v
.\.venv\Scripts\python.exe -m unittest discover -s agent -p 'test_*.py' -v
.\.venv\Scripts\python.exe -m unittest backend.test_openai_model -v
.\.venv\Scripts\python.exe -m unittest discover -s integration -p 'test_*.py' -v
npm.cmd run build --prefix frontend
Зафиксированный итог ядра — 52 Python-теста PASS: pipeline 4, agent 32, backend 2, integration 14. Тесты проверяют реальные входные данные и инварианты; сетевые вызовы модели в автоматических тестах подменены. Отдельно в production UI прошли два реальных AI-вопроса, переход finding → graph, поиск, изолят, boundary, неизвестный GID, усечение графа и три скачивания CSV.
Доказательства и точные условия: FINAL_GATE.md, FINAL_UX_INTEGRATION.md. Последний UI изменяет только представление и взаимодействие; core, scoring и контракт сохранены. Локальная повторная установка frontend остановилась из-за заполнения диска; сборка выполнена на ранее установленных зависимостях того же lockfile. Первая чистая установка зафиксирована в core gate.
9. Данные и интеграции
Источник — три предоставленных кейсом файла в case/data (1)/data:
| Файл | Содержимое текущей выборки |
|---|---|
nodes.parquet | 2248 узлов, признаки seed и глубины обхода |
edges.parquet | 3119 направленных агрегированных связей |
transactions.parquet | 4840 наблюдаемых переводов |
Период — июль 2026, внутрибанковские переводы от 5000 KZT, исходящий обход до 4 колен от 81 seed. Граф содержит 35 слабосвязных компонент, включая 19 изолятов. 97 повторяющихся строк transactions сохранены: отсутствие transaction_id не позволяет считать их ошибочными дублями. Суммы и количества сверяются с edges.
В официальном кейсе данные обозначены как обезличенные, GID — синтетический идентификатор без привязки к личности; данные предоставлены для использования в рамках хакатона. shared/fixtures.json содержит отдельные синтетические примеры контракта и не служит источником финальных scores.
Результаты в submission/:
nodes_roles.csv— 2248 строк;gid,role,role_score,cluster_id,priority_score,evidence.clusters.csv— 105 строк;cluster_id,n_nodes,n_seed,sum_kzt_internal,top_gids,hypothesis.top_nodes.csv— 100 уникальных узлов;rank,gid,role,priority_score,why, сортировка priority DESC / gid ASC.
Баллы конечны и находятся в [0,1]; краткое evidence непустое, числовое и не длиннее 200 символов. Полные факты хранятся в snapshot. Единственная опциональная внешняя интеграция во время работы — OpenAI API. Подключения к банковским системам и внешнего обогащения данных нет.
10. Ограничения текущей версии
- Неполная наблюдаемость. Другие банки, переводы ниже порога, остатки и другие периоды неизвестны. Входящие переводы неполны для всех узлов; исходящие depth=4 обрезаны.
- Гипотезы вместо установленных фактов о клиентах. Нет размеченных истинных ролей; accuracy/F1 и экономия времени аналитика не измерялись.
peripheralне означает безопасность клиента;coordinatorне доказывает управление сетью. - Нет доказательства движения тех же средств. Даты имеют точность до дня; путь в агрегированном графе не устанавливает хронологию и происхождение денег. out/in не является балансом.
- AI ограничен. Backend проверяет GID, evidence и соответствие фактов snapshot, но не доказывает каждое утверждение свободного текста. Есть лимиты tools и времени; при сбое доступна основная аналитика.
- Кластеры в UI представлены базово. Есть рассчитанные результаты, фильтрация/идентификаторы и CSV; отдельного развитого рабочего места исследования кластеров нет.
- Прототип локального исследования. Нет production-развёртывания, аутентификации, workflow, банковских действий или собственного обученного ML. Запуск на втором ноутбуке и macOS/Linux не подтверждён финальным gate.
- Масштабирование до ~1 млн узлов — план. Точная betweenness и NetworkX в памяти потребуют пакетной обработки, компактного графового движка, приближённой центральности и серверных подграфов. Это описано в BUILD_BRIEF, но не реализовано и не измерено на таком масштабе.
11. Демо и deployed-версия
Публичная deployed-версия в репозитории не подтверждена. Проверенный способ демонстрации — локальный запуск на http://127.0.0.1:8000/ по инструкции выше.
Для показа без пересчёта используется submission/backup.zip. Для независимой проверки — исходные данные, исходный код, три CSV, SHA-256 manifest и отчёты в integration/.
Авторы коммитов
История коммитов
- 2026-09-23 17:38fix: polish final investigation demo uxDau27
- 2026-09-23 17:53Merge final UI and jury README (#3)femaledelta
- 2026-09-23 17:52docs: rewrite Russian README for hackathon juryfemaledelta
- 2026-09-23 17:50docs: update case alignment assessmentnnurkass
- 2026-09-23 17:48docs: prove integrated final UI and refresh demo backupfemaledelta
- 2026-09-23 17:47Merge remote-tracking branch 'origin/codex/frontend' into codex/frontendnnurkass
- 2026-09-23 17:46docs: assess alignment with official casennurkass
- 2026-09-23 17:44fix: polish final investigation demo uxDau27
Все коммиты (43)
- 2026-09-23 17:38Merge verified HackAlem submission closure (#2)femaledelta
- 2026-09-23 17:37docs: prove final live Investigator and demo gatefemaledelta
- 2026-09-23 17:27docs: record verified submission branch publicationfemaledelta
- 2026-09-23 17:24fix: close submission evidence and reproducibility gapsfemaledelta
- 2026-09-23 16:16feat: integrate live investigator with bounded backend runtimeDau27
- 2026-09-23 16:51docs: record final main live integration gatefemaledelta
- 2026-09-23 16:48fix(agent): align finding instructions with grounding guardfemaledelta
- 2026-09-23 16:41merge: reconcile stage two runtime and verified live Investigator flowfemaledelta
- 2026-09-23 16:29merge: integrate grounded real Investigator adapterfemaledelta
- 2026-09-23 16:28merge: integrate completed frontend Investigator UXfemaledelta
- 2026-09-23 16:19fix: complete Luna live provider gate with grounded evidencefemaledelta
- 2026-09-23 15:17Merge live HackAlem integrationDau27
- 2026-09-23 15:14chore: omit frontend push-flow placeholder from integrationDau27
- 2026-09-23 15:13merge: incorporate latest backend and agent checkpointDau27
- 2026-09-23 15:11feat: serve live snapshot to API agent and frontendDau27
- 2026-09-23 16:03feat(frontend): render grounded Investigator results in live workspacennurkass
- 2026-09-23 16:01feat: wire optional OpenAI investigator through snapshot toolsfemaledelta
- 2026-09-23 14:50merge: integrate published frontend branchDau27
- 2026-09-23 14:33test(pipeline): verify live CSV invariants and document runDau27
- 2026-09-23 14:29feat(pipeline): add deterministic parquet analytics and CSV exportsDau27
- 2026-09-23 15:01docs: make root README reflect verified CSV pipelinennurkass
- 2026-09-23 14:48feat: add fixture-backed frontend investigation screenfemaledelta
- 2026-09-23 14:41test: verify pipeline profiles through agent boundarynnurkass
- 2026-09-23 14:39Merge remote-tracking branch 'origin/codex/agent' into codex/integration-backend-agentnnurkass
- 2026-09-23 14:39docs: require verified commit and push after each stagennurkass
- 2026-09-23 14:37merge: bring shared contract v1 and decisions into codex/frontendfemaledelta
- 2026-09-23 14:36agent: expose trusted facts with tool observationsnnurkass
- 2026-09-23 14:35agent: add bounded investigator loop and trusted tool sessionnnurkass
- 2026-09-23 14:30agent: derive citable evidence from common recipient pathsnnurkass
- 2026-09-23 14:27chore: add unnamed placeholder filefemaledelta
- 2026-09-23 14:15agent: add fixture-backed investigator boundary and fact validationnnurkass
- 2026-09-23 14:07docs: add stage one prompts for backend frontend and agent ownersnnurkass
- 2026-09-23 14:04docs: clarify score evidence and freeze review decisionsnnurkass
- 2026-09-23 14:01docs: lock shared API contract v1 and 270 minute execution plannnurkass
- 2026-09-23 13:49docs: establish shared HackAlem context and implementation guidancennurkass
Структура репозитория (109 файлов)
.env.example .gitattributes .gitignore AGENTS.md README.md agent/INVESTIGATOR_INSTRUCTIONS.md agent/README.md agent/STAGE_01_NOTES.md agent/__init__.py agent/boundary.py agent/evidence.py agent/fixture_provider.py agent/harness.py agent/live_smoke.py agent/openai_model.py agent/requirements.txt agent/session.py agent/test_harness.py agent/test_openai_model.py agent/test_session.py agent/test_stage01.py agent/validation.py analysis/README.md analysis/audit_dataset.py analysis/dataset_audit.json analysis/node_metrics.csv analysis/requirements.txt backend/README.md backend/__init__.py backend/app.py backend/requirements.txt backend/service.py backend/test_openai_model.py case/HackAlem AI_ Граф денег_ восстановление финансовой структуры организованной группы по транзакционной сети.md case/README.md case/data (1)/data/edges.parquet case/data (1)/data/nodes.parquet case/data (1)/data/transactions.parquet case/starter (1)/starter/README.md case/starter (1)/starter/requirements.txt case/starter (1)/starter/starter.py context/HACKALEM_CONTEXT_FOR_CODEX.md context/HACKALEM_TEAM_CONTEXT_FOR_CODEX.md context/HackAlem 2026 — Full Team Execution Plan.md docs/API_CONTRACT.md docs/BUILD_BRIEF.md docs/DECISIONS.md docs/DEMO.md docs/EXECUTION_PLAN_270_MIN.md docs/RED_TEAM_REVIEW.md docs/STAGE_01_PROMPTS.md frontend/FINAL_UX_GATE.md frontend/README.md frontend/index.html frontend/package-lock.json frontend/package.json frontend/src/App.tsx frontend/src/components/BriefHeader.tsx frontend/src/components/Dossier.css frontend/src/components/Dossier.tsx frontend/src/components/FixtureScenarios.tsx frontend/src/components/GraphPanel.css frontend/src/components/GraphPanel.tsx frontend/src/components/InvestigationResult.tsx frontend/src/components/Investigator.css frontend/src/components/InvestigatorPanel.tsx frontend/src/components/PriorityQueue.tsx frontend/src/components/SearchBox.tsx frontend/src/components/States.tsx frontend/src/data/fixtureProvider.ts frontend/src/data/format.ts frontend/src/data/httpProvider.ts frontend/src/data/index.ts frontend/src/data/labels.ts frontend/src/data/limitations.ts frontend/src/data/provider.ts frontend/src/data/useAsyncData.ts frontend/src/main.tsx frontend/src/styles.css frontend/src/vite-env.d.ts frontend/tsconfig.json frontend/vite.config.ts integration/FINAL_GATE.md integration/FINAL_UX_INTEGRATION.md integration/README.md integration/STAGE2_CLOSURE.md integration/test_ai_model_path.py integration/test_live_service.py integration/test_pipeline_agent.py pipeline/.gitignore pipeline/README.md pipeline/__init__.py pipeline/__main__.py pipeline/config.py pipeline/requirements.txt pipeline/run.py pipeline/snapshot.py pipeline/test_pipeline.py requirements-lock.txt scripts/demo.py shared/README.md shared/contracts.ts shared/fixtures.json submission/README.md submission/backup.zip submission/clusters.csv submission/manifest.json submission/nodes_roles.csv submission/top_nodes.csv
Обсуждение 0 комментариев
Войдите, чтобы комментироватьПока нет комментариев — будьте первым.