AAYMA
RU
Войти

DalaAI — Граф денег

Офлайн-пайплайн и автономный HTML-экран сети переводов: 2 248 клиентов получают одну из 6 объяснимых ролей, приоритет и кластер, формируется очередь…

Доведённый продукт
Команда «ZherimAI» 22💬 0 комментариевс 18 сентября 2026 г.

О проекте

Команда: ZherimAI
Кейс HackAlem.ai: Финансы — Freedom
Стадия: Доведённый продукт

Задача кейса: «Граф денег»: восстановить структуру организованной группы по сети транзакций (AML)

Суть

Офлайн-пайплайн и автономный HTML-экран сети переводов: 2 248 клиентов получают одну из 6 объяснимых ролей, приоритет и кластер, формируется очередь топ-50 на проверку и карточка по любому gid.

Как устроено

run.py читает три parquet (узлы, рёбра, транзакции), валидирует входы, считает графовые и временные признаки, по порогам присваивает роли (coordinator/consolidator/distributor/transit/terminal/peripheral), кластеризует сеть Louvain и считает составной priority_score. На выходе CSV по обязательным схемам, report.json и self-contained network.html с поиском, карточками и разбивкой приоритета. Дополнительно: сценарии удаления топ-N узлов (resilience), 5 прогонов Louvain и 11 сценариев весов (sensitivity), запросы недостающих данных. Опциональный LLM только выбирает разрешённый инструмент графа, основной расчёт работает без ключа.

Ключевые решения

  • Louvain
  • ролевые правила с порогами
  • приоритетный скоринг
  • временная достижимость
  • направленные циклы
  • resilience-анализ удаления топ-N
  • анализ чувствительности
  • tool selection LLM

Метрики

4,79 с на расчёт; 98 тестов PASS; 48 сообществ; 391→204 достижимых пар после удаления топ-5 не-seed

Особенности

Сильный акцент на проверяемости: evidence с числами до 200 символов, gid как строки в UI из-за точности JS Number, анализ чувствительности кластеров/весов и сценарий «удаления» узлов вместо заявленной accuracy при отсутствии разметки.

Стек

Python 3.13 · pandas/parquet · HTML/JS standalone viewer · uv


Проект создан за 5 часов на финале хакатона HackAlem.ai (23 сентября 2026, Астана). Код — BAITC-Hacks/hack-0c0b2c2f-zherimai.

README

README.md

DalaAI — Граф денег

Кого проверить первым — и почему? Приложение помогает AML-аналитику банка выбрать клиентов для проверки по наблюдаемым переводам. Карточка объясняет роль, приоритет, связи и следующий запрос данных.

2 248 клиентов · 6 объяснимых ролей · топ-50 · локальный экран сети

Посмотреть готовое приложение

  1. Скачайте репозиторий: Code → Download ZIP, затем распакуйте архив.
  2. Откройте out/network.html двойным щелчком.
  3. Нажмите «Первый в очереди» или вставьте полный gid в поиск, например 100000000331309100.

Для просмотра готового результата Python, сервер и интернет не нужны. GitHub показывает исходный код HTML — открывайте скачанный файл. Карточку можно сохранить кнопкой «Скачать карточку»; верхние ссылки выгружают CSV.

Результаты — гипотезы для проверки, не утверждения о виновности. Приоритет и сила правила не являются вероятностью нарушения.

Быстрый запуск

Чтобы пересчитать результат из исходных данных, откройте терминал в распакованной папке проекта, где лежат run.py и requirements.txt. Три parquet уже находятся в data/.

Нужен Python 3.13. Выберите инструкцию для своей ОС. Первичная установка пакетов требует интернета; повторный расчёт работает без сети, API-ключей и GPU. Активация окружения и создание .env не требуются.

Windows / PowerShell — установить и запустить

Если Python 3.13 уже установлен, скопируйте блок в PowerShell:

py -3.13 -m venv .venv
if ($LASTEXITCODE -ne 0) { throw 'Не удалось создать окружение Python 3.13' }
.\.venv\Scripts\python.exe -m pip install -r requirements.txt
if ($LASTEXITCODE -ne 0) { throw 'Не удалось установить зависимости' }
.\.venv\Scripts\python.exe run.py --data data --out out
if ($LASTEXITCODE -ne 0) { throw 'Расчёт завершился ошибкой' }
Start-Process .\out\network.html

После успешного расчёта приложение откроется в браузере. Если py -3.13 недоступен, используйте блок «Python 3.13 не установлен» ниже.

Повторный расчёт — одна команда:

.\.venv\Scripts\python.exe run.py --data data --out out

Дождитесь PASS, затем откройте out/network.html или обновите уже открытую страницу.

macOS / Linux — установить и запустить

Если Python 3.13 уже установлен:

python3.13 -m venv .venv && .venv/bin/python -m pip install -r requirements.txt && .venv/bin/python run.py --data data --out out

После сообщения PASS откройте out/network.html в браузере.

Повторный расчёт — одна команда:

.venv/bin/python run.py --data data --out out

Команды проверены на macOS; полный Python-пайплайн на Linux пока не подтверждён.

Python 3.13 не установлен — подготовка через uv

Установите uv по официальной инструкции. Он самостоятельно скачает нужный Python. Выполняйте команды из папки проекта; подготовка требует интернета.

Windows PowerShell:

uv venv --managed-python --python 3.13 .venv
if ($LASTEXITCODE -ne 0) { throw 'Не удалось подготовить Python 3.13' }
uv pip install --python .\.venv\Scripts\python.exe -r requirements.txt
if ($LASTEXITCODE -ne 0) { throw 'Не удалось установить зависимости' }
.\.venv\Scripts\python.exe run.py --data data --out out
if ($LASTEXITCODE -ne 0) { throw 'Расчёт завершился ошибкой' }
Start-Process .\out\network.html

macOS / Linux:

uv venv --managed-python --python 3.13 .venv && uv pip install --python .venv/bin/python -r requirements.txt && .venv/bin/python run.py --data data --out out

После PASS откройте out/network.html. В дальнейшем используйте команду повторного расчёта для своей ОС — uv и сеть уже не нужны.

Для машины без интернета заранее подготовьте Python 3.13 и совместимые пакеты: инструкция offline-установки. Установщик и wheelhouse/ не включены в репозиторий. Поддержка Python 3.12 не заявляется.

Что получает аналитик

После расчёта все результаты находятся в out/:

ФайлЧто открыть или проверить
network.htmlПриложение: сеть переводов и карточки клиентов
nodes_roles.csvРоли, приоритеты и объяснения всех клиентов
clusters.csvСообщества и гипотезы по группам
top_nodes.csvОчередь из 50 клиентов для проверки
report.jsonФактическое время расчёта и контрольные показатели

Контрольная сборка DalaAI на macOS ARM64/Python 3.13.15: 4,79 с на расчёт, без установки зависимостей; 98 тестов PASS. Протокол. Среды и границы проверок раскрыты ниже.

AI в продукте: опциональный LLM выбирает разрешённый инструмент графа. Основной расчёт и экран работают без ключа; встроенный браузерный помощник использует правила.

Короткий маршрут жюри · Примеры разбора клиентов · Подробная установка

Подробности для проверки

Откройте нужный раздел. Формулы, ограничения и протоколы сохранены полностью.

Возможности, пользовательский сценарий и полный состав результатов
РезультатЧто это даёт аналитику
2 248 узлов, включая 19 изолятовНи один клиент из входной таблицы не потерян
6 ролей с порогами и числовыми объяснениямиНазначение роли можно проверить по метрикам любого gid
Топ-50, в первых 20 нет seedОчередь смещает внимание на узлы за пределами исходного списка seed
48 сообществ + группа изолятовВидны группы связей и гипотезы для дальнейшей проверки
391 → 204 достижимых пар после удаления топ-5 не-seedПроверяемый сценарий изменения связности; не оценка предотвращённых нарушений

Распределение ролей: 21 coordinator · 42 consolidator · 43 distributor · 36 transit · 566 terminal · 1 540 peripheral. Роль, score и кластер — основания для проверки, не утверждение о виновности. Размеченной истины нет, поэтому accuracy и вероятности нарушения не заявляются.

Что реализовано

Обязательный пункт кейсаРеализация
Один запуск от parquet до результата менее чем за 5 минутrun.py: проверка входов, расчёт, выгрузки и встроенная валидация
Роль, score и evidence у каждого узлаВсе 2 248 gid; шесть формальных ролей; evidence с числами до 200 символов
Объяснение произвольного gidКарточка с порогами, метриками, одновременно сработавшими правилами и составом приоритета
Кластеры и гипотезыПолное покрытие узлов; размеры, seed и внутренний оборот каждой группы
Не менее 20 приоритетов и экран сетиТоп-50, направления переводов, роли/кластеры, поиск, переходы по связям и TXT-карточка

Дополнительно: временные признаки и достижимость по датам, направленные циклы, сценарии удаления топ-N, чувствительность кластеров/приоритетов, запросы недостающих данных и опциональный AI-планировщик. Возможности и их ограничения описаны ниже.

Как работает решение

  1. Запустите расчёт на исходных nodes, edges и transactions из data/.
  2. Откройте out/network.html: сначала показан обзор всей сети без выбранного клиента. Нажмите «Первый в очереди», строку топ-листа либо найдите полный gid.
  3. В карточке проверьте роль, её правило, входящие/исходящие связи, слагаемые приоритета и ограничения. Перейдите к контрагенту или сохраните карточку в TXT.
  4. Используйте следующий запрос данных из карточки и data_requests.csv для углублённой проверки. Автоматическое обвинение, блокировка счетов или отправка запросов во внешние системы не выполняются.

Все выходные файлы и обязательные схемы

ФайлСодержание
out/nodes_roles.csvВсе 2 248 gid, роли, scores, cluster_id, числовые evidence и дополнительные объяснимые признаки
out/clusters.csvРазмер, seed, внутренний оборот, пять приоритетных gid и гипотеза каждого кластера
out/top_nodes.csv50 приоритетных узлов с обоснованием и следующим действием
out/network.htmlАвтономная сеть с направлением переводов, ролями/кластерами, поиском и карточками
out/report.jsonПараметры и фактические результаты текущего прогона, время, контрольные показатели
out/data_requests.csvКакие данные запросить для узлов с ограниченной видимостью
out/resilience.csvИзменение наблюдаемой сети после удаления приоритетных узлов
out/node_stability.csvУстойчивость сообщества и положения каждого gid в очереди проверки
out/sensitivity.csv5 запусков Louvain и 11 сценариев весов приоритета

Фиксированные обязательные схемы сохраняются; дополнительные поля разрешены ТЗ:

nodes_roles.csv: gid, role, role_score, cluster_id, priority_score, evidence
clusters.csv: cluster_id, n_nodes, n_seed, sum_kzt_internal, top_gids, hypothesis
top_nodes.csv: rank, gid, role, priority_score, why

evidence содержит числа и не превышает 200 символов. Gid хранятся как целые в Python/CSV и как строки в интерфейсе: 18-значные идентификаторы превышают точность JavaScript Number. При открытии CSV в Excel импортируйте gid как текст.

Исходные данные и архитектура

Данные и интеграции

Источник — обезличенные данные организаторов HackAlem AI, только для хакатона; внешнего обогащения нет.

ВходСтрокСодержание
data/nodes.parquet2 248gid, минимальная глубина обхода, is_seed
data/edges.parquet3 119Направленные пары, суммы и число переводов
data/transactions.parquet4 840Даты и суммы отдельных операций

Наблюдаются внутрибанковские переводы за 1–31 июля 2026, от 5 000 KZT, четыре колена исходящего обхода от 81 seed. Оборот — 365 890 012,01 KZT. В полном графе 35 слабосвязных компонент: 16 с рёбрами и 19 изолятов. 444 узла на глубине 4 имеют нулевой наблюдаемый выход.

Загрузчик сверяет типы и схемы, уникальность gid/рёбер, концы рёбер, период, порог и агрегаты transactions ↔ edges. Допуск сумм — 0,01 KZT; ошибки останавливают расчёт. Распределения и обоснование порогов: разведка данных, README датасета.

Обязательных внешних интеграций нет. OpenAI Responses API используется только по явному запросу в опциональном CLI; основной расчёт и браузер к нему не обращаются.

Схема решения

Схема на одном слайде.

flowchart LR
    A[3 parquet организаторов] --> B[Проверка схем и агрегатов]
    B --> C[Направленный граф и временные признаки]
    C --> D[Правила ролей и приоритет]
    C --> E[Louvain на ненаправленной проекции]
    E --> D
    D --> F[CSV и числовые объяснения]
    F --> G[Автономная сеть и карточки]
    F --> H[Локальные инструменты аналитика]
    I[Опциональный LLM: один проверяемый план] -.-> H
    F --> J[Валидация и отчёт]
КомпонентыОтветственность
aml/load.py, features.py, temporal_reach.pyЗагрузка, направленные/временные признаки и полнота наблюдения
aml/roles.py, clusters.py, priority.pyПороговые роли, сообщества и прозрачная очередь
aml/explain.py, resilience.py, sensitivity.pyОбоснования, следующий запрос, удаление узлов и чувствительность
aml/viewer.py, viewer_template.htmlАвтономный Canvas-интерфейс с направлением связей
aml/assistant.py, ai_assistant.pyЛокальные запросы; опциональный ограниченный LLM-планировщик
run.py, validate.py, aml/validate*.py, tests/Сборка, контроль результата и регрессии
Методика: метрики, роли, формулы и кластеры

Метрики

  • in_deg/out_deg — число разных плательщиков/получателей; in_kzt/out_kzt — суммы; in_tx/out_tx — число операций. Средний чек равен сумме, делённой на число операций.
  • pass_through=out_kzt/in_kzt определён только при положительном входе; иначе технический 0 и pass_through_defined=False. Входящие seed неполны, поэтому их ratio не используется для назначения transit.
  • seed_reach — число других seed с направленным путём до узла без учёта дат; seed_payers — прямые seed-плательщики. Достижимость не устанавливает источник денег.
  • PageRank использует направления и суммы (tol=1e-10, max_iter=1000, стандартный damping). Betweenness — точная нормированная центральность на направленном невзвешенном графе; расстояние — число шагов.
  • fast_out_share сопоставляет входящие суммы FIFO с ещё не использованными исходящими через 1–2 дня. Исходящая сумма не расходуется повторно; операции того же дня исключены. matched_lag_days — средний лаг, взвешенный сопоставленной суммой, 0 при отсутствии сопоставления.
  • max_payers_same_day — максимум разных плательщиков за день; burst_share — доля входа+выхода в самый активный день; near_threshold_share — доля операций в [5 000; 10 000) KZT. Это признаки, а не доказательство дробления.
  • in_cycle — участие в направленной сильно связной компоненте с несколькими узлами или петле. reciprocal_neighbors — взаимные связи; repeat_routes — инцидентные рёбра с несколькими переводами, не многошаговые повторяющиеся маршруты. volume_depth_percentile сравнивает log-оборот с тем же коленом.

Временная достижимость рассчитывается отдельно: temporal_seed_reach_strict_days требует строго возрастающих дней, temporal_seed_reach_upper допускает возможный порядок в один день. Seed доступны с начала месяца, собственный seed исключён; всегда strict_days ≤ upper ≤ seed_reach. Суммы и происхождение средств эти пути не прослеживают. У лидера очереди структурно достижимы 7 seed, по датам — 1; приоритет остаётся структурным, различие показано в карточке.

Роли и пороги

Порядок: coordinator → consolidator → distributor → transit → terminal → peripheral. Сначала определяются базовые роли, затем coordinator может заменить результат. Соседи-хабы для coordinator определяются непосредственно порогами, поэтому результат не зависит от очередности обхода узлов. Пороговые значения находятся в aml/roles.py.

matched_roles сохраняет все одновременно выполненные правила. Например, coordinator может показывать также консолидацию и веерное распределение. Основная role выбирается по приоритету правил; top_nodes.why дополнительно раскрывает оба направления потока, слагаемые приоритета и next_request.

РольФормальное правило
coordinatorЕсть вход и выход; ≥2 разных соседей с in_deg≥5 или out_deg≥10; seed_reach≥3; betweenness ≥q99 по всем узлам и строго >0
consolidatorin_deg≥5; сумма и seed-плательщики показаны в объяснении
distributorout_deg≥10
transitНе seed; есть вход и выход; 0,8≤pass_through≤1,2; in_kzt≥50 000
terminaldepth<4, in_kzt≥50 000 и либо out_deg=0, либо не-seed с pass_through≤0,2 и in_kzt≥200 000
peripheralНи одно предыдущее правило не выполнено; недостаток признаков, а не низкий риск

Обоснование: q95 входящей степени равен 3, исходящей — 5; пороги 5 и 10 выделяют наблюдаемую концентрацию выше основной массы. Медиана входа — 50 000 KZT; 200 000 выше q75≈164 528. Из 72 узлов с отношением 0,8–1,2 дополнительные условия отсеивают неполные/малые наблюдения. Порог q99 betweenness на предоставленном графе примерно 0,001989231914, фактическое значение сохраняется при расчёте. Порог не выбирается под заранее заданные gid.

Сила свидетельств role_score

Обозначим clip(x)=min(1,max(0,x)), b99 — q99 betweenness, f=fast_out_share, p=pass_through:

РольФормула
coordinator0,5 + 0,5×clip(betweenness/max(b99,1e-15) − 1)
consolidator0,5 + 0,5×clip((in_deg−5)/10)
distributor0,5 + 0,5×clip((out_deg−10)/30)
transit0,5 + 0,25×max(0,1−abs(p−1)/0,2) + 0,25×f
terminal0,5 + 0,5×clip((in_kzt/50 000−1)/9)
peripheral0,25, если узел обрезан или изолирован; иначе 0,5

Для consolidator на обрезанном четвёртом колене score дополнительно умножается на 0,8. Итог ограничивается [0,1] и округляется до 6 знаков. Высокий score означает силу заданного правила, не достоверность обвинения. Для peripheral фиксированный score отражает остаточное правило и неполноту наблюдения.

Приоритет для аналитика

raw = 0.30 × role_weight
    + 0.25 × log1p(seed_reach) / max(max(log1p(seed_reach)), 1)
    + 0.20 × log1p(in_kzt + out_kzt) / max(max(log1p(in_kzt + out_kzt)), 1)
    + 0.15 × percentile_rank(pagerank)
    + 0.10 × patterns
priority_score = clip(raw × (0.6 if is_seed else 1))

Веса ролей: coordinator=1; consolidator=0,9; distributor=0,8; transit=0,6; terminal=0,5; peripheral=0,1. percentile_rank — средний ранг связок, делённый на число узлов. patterns — среднее трёх индикаторов: fast_out_share≥0,5, max_payers_same_day≥3, in_cycle=True. Итог округляется до 8 знаков; при равенстве выше меньший gid.

Seed понижаются множителем 0,6, поскольку уже известны и кейс требует перенести внимание на другие узлы. Каждое слагаемое сохранено в CSV (priority_role, priority_reach, priority_volume, priority_pagerank, priority_patterns, seed_discount), поэтому позицию можно объяснить. Критичность после удаления узла не добавляется скрытым бонусом в score.

Кластеры

Только кластеризация игнорирует направление. Встречные суммы A→B и B→A складываются; вес ненаправленной пары — log1p(общая сумма). Louvain использует seed=42, resolution=1; узлы и рёбра заранее сортируются. Сообщества нумеруются по размеру, затем минимальному gid. Число групп не подгоняется под подсказку организаторов.

В текущем результате 48 сообществ, из них 9 содержат несколько seed. Все 19 изолятов входят в техническую группу 0, которая не объявляется сообществом. Внутренний оборот считается по исходным направленным суммам, без логарифма и удвоения. top_gids — пять приоритетных клиентов группы.

Гипотезы строятся по правилам: сбор от ≥3 seed; веерное распределение; ≥2 транзитных узла; иначе наблюдаемая связанная активность. Разведка запускает Louvain вместе с изолятами, а основной расчёт отдельно; это меняет случайный обход. Для проверки продукта используйте out/clusters.csv и out/report.json.

Помощник, AI и чувствительность результата

Интерфейс и помощник

Карта показывает стрелки переводов, роли или кластеры, очередь, фильтры и окружение выбранного узла на один/два шага. Карточка и TXT сохраняют правила, метрики, состав приоритета, временную достижимость, чувствительность и следующий запрос. Gid остаются строками целиком. Изоляты доступны в поиске; их устойчивость сообщества помечена «Не оценивалась».

РежимЧто действительно делает
Помощник в HTMLБез LLM: полные команды топ, кластеры, ограничения, gid или Объясни <gid>; до 3 разных gid. Неподдержанный вопрос/неизвестный gid даёт пояснение, не выдуманный ответ
Локальный CLIКарточка, кратчайший направленный путь, общие прямые получатели, сводка кластера по поддерживаемым формулировкам
Опциональный AI CLILLM выбирает один из инструментов get_node, paths, common_receivers, cluster_summary; аргументы валидируются, инструмент и шаблон фактического ответа выполняются локально

Пример без ключа:

.venv/bin/python -m aml.assistant --out out --data data --question 'Объясни 100000000331309100'

Онлайн-планирование включается только с --online, OPENAI_API_KEY и OPENAI_MODEL. Проверенная модель — gpt-5.4-nano-2026-03-17. В API передаётся вопрос с псевдонимами вместо gid, схема инструментов и допустимые псевдонимы; граф, метрики и результаты инструментов остаются локальными. Остальной текст вопроса не обезличивается автоматически.

Ограничения вызовов: один запрос, максимум 1 024 выходных токена, 20 попыток по умолчанию в постоянном локальном журнале, без повторов. При отсутствии настроек или ошибке — явно обозначенный локальный режим. Браузер не хранит ключи. Полный запуск: AI-помощник.

Проверка AI: 20 тестов с подменой HTTP; живая оценка — 12/12 подготовленных случаев (11 онлайн и один локальный отказ). Это малый набор разработки, не accuracy ролей и не гарантия понимания любого вопроса. Результаты, расход и ограничения бюджета.

Чувствительность и изменение сети

  • Кластеры: пять seed Louvain 42–46 на неизменной проекции дают 43–49 сообществ без изолятов. ARI альтернатив к исходному разбиению — 0,671–0,690; средний Jaccard состава — 0,658. Это показывает неопределённость границ, а не истинный состав группы.
  • Приоритет: исходные веса и 10 вариантов изменения одного веса на ±20% с нормировкой. В альтернативных топах остаются 18–20 из исходных 20 клиентов; 18 входят во все 11 сценариев. Пороги ролей, данные и скидка seed не варьируются.
  • Удаление топ-N: сценарии 0/5/10/20 приоритетных не-seed. Цели — базовые consolidator, включая переопределённых coordinator. При удалении топ-5 остаётся 204 из 391 достижимой пары seed→цель; 148 пар теряются к сохранившимся целям. Удаление самих получателей учитывается отдельно.
  • Полнота: data_requests.csv предлагает запросить следующее колено, внешние входящие/остаток, наличные, межбанковские и подпороговые операции в зависимости от ограничений узла.

Методика и границы: sensitivity-method.md. Устойчивость не равна точности, а сценарий удаления не измеряет предотвращённый ущерб.

Как проверить расчёт: команды, примеры и протоколы

Как проверять

После команды запуска:

.venv/bin/python validate.py --data data --out out
.venv/bin/python -m unittest discover -s tests
.venv/bin/python scripts/audit_top.py --data data --out out

На Windows замените исполняемый файл на .\.venv\Scripts\python.exe. Для программной проверки взаимодействий интерфейса дополнительно нужен Node.js: node scripts/check_viewer.cjs out/network.html. Node не нужен для расчёта или открытия HTML.

Воспроизводимый сценарий жюри:

  1. Запустить расчёт из исходных parquet в новую выходную папку, без готовых результатов. Проверить время <300 с и встроенный PASS.
  2. Проверить 2 248 уникальных gid, шесть допустимых ролей, непустые evidence с числами ≤200 символов, scores в [0,1], согласованные кластеры и отсортированный топ ≥20.
  3. Открыть экран, найти любые три gid, объяснить правило по метрикам и перейти по входящим/исходящим связям. Примеры ниже помогают проверить разные ограничения.
  4. Проверить отсутствие terminal у depth=4 и наличие 19 изолятов; повторить расчёт и сравнить CSV. Время в report.json может отличаться.
ПримерgidЧто проверить
Лидер очереди1000000003313091005 плательщиков, 99 получателей, 11 структурных соседей; coordinator по q99. 7 seed без дат и 1 по датам — разные показатели
Транзит100000000201868100Не seed; вход/выход по 190 000 KZT, ratio=1,0; временное сопоставление не доказывает те же деньги
Граница выгрузки100000002622822100Depth=4, вход 750 000 KZT, выхода нет; peripheral, а не terminal

Эти примеры взяты из результата и не встроены в алгоритм. Независимый audit_top.py читает parquet без импорта расчётных модулей; сверяет суммы, степени, достижимость, временное сопоставление через max-flow и сценарии удаления. Разбор всех ролей, демо на 5 минут.

Фактические проверки

Текущая сборка DalaAI: 98 тестов PASS, расчёт из новой исходной папки без out — 4,79 с по внешнему таймеру; валидатор, аудит и DOM-регрессии прошли, 7 CSV и HTML совпали с рабочей сборкой на macOS ARM64/Python 3.13.15. Использовано ранее отдельно подготовленное Python-окружение с закреплёнными зависимостями; время установки пакетов не входит в измерение. Все семь CSV также совпали с версией до переименования. Протокол DalaAI.

Windows 11/Python 3.13.15: отдельно проверена чистая установка из локальных wheels, затем c31e093 — 90 тестов / 95 с QA-обёрткой, девять подмен валидатора отклонены, UTF-8 проверен в cp1251. Отдельная загрузка Python через uv также прошла. Между Windows-прогонами результаты побайтно одинаковы; с Git сравниваются после нормализации LF/CRLF. Это не проверка последующих UI-изменений. Протокол Windows.

Linux-установка и нагрузка на миллионе узлов не проверены. DOM-тесты не заменяют визуальный просмотр в браузере; Python socket-guard не является системным firewall. Исторические измерения и внешние отзывы с границами — в docs/verification.md. Репетиция «три gid за минуту» требует человека и не выдаётся за выполненный автоматический тест.

Ограничения данных и план масштабирования

Ловушки и ограничения

ОграничениеКак учитываем
444 узла четвёртого колена без выходаФлаг обрыва, запрет terminal, осторожное evidence, запрос следующего колена
Входящие seed неполныНет транзитной роли на основе ratio; предупреждение о неполной наблюдаемости
Выход больше входаunobserved_funding при выходе >1,2 входа и положительном выходе: возможны невидимые поступления или начальный остаток, а не доказанный внешний доход
19 seed без рёберУзлы загружаются прежде рёбер и сохраняются; технический cluster 0
Только внутрибанк и порог ≥5 000Terminal — получатель в видимой выборке; запрашиваем наличные, межбанк и малые переводы
Даты без времени сутокВ FIFO исключено совпадение дня; связь тех же денег не доказана
Нет клиентских атрибутов и ground truthТолько структура/суммы/даты; никаких ФИО, доходов, обученной accuracy или обвинений
Ограниченный месяц наблюденияСовпадение потоков и связи не означают общность экономической цели

Устойчивость — структурный сценарий удаления узлов, а не прогноз предотвращённого ущерба. Полноценные повторяющиеся многошаговые маршруты, HITS, обученная модель и подтверждённая работа на миллионе узлов не заявлены. Опциональный внешний планировщик проверен на ограниченном наборе вопросов; ошибка выбора инструмента на иной формулировке возможна. Роль coordinator показывает структурную связность и не устанавливает организатора группы.

Рост до 1 млн узлов

Это план развития, не результат нагрузочного теста. Первым узким местом станет точная betweenness и Python-объекты NetworkX: заменить их приближённой betweenness по выборке источников и компактным графовым движком (например, igraph). Агрегации транзакций перенести в колоночную обработку/SQL, хранить рёбра партициями; признаки считать инкрементально по новым датам.

Достижимость от небольшого набора seed можно хранить битовыми масками и распространять по DAG сильно связных компонент. Сообщества пересчитывать по затронутым областям или применять Leiden с проверкой сопоставимости. В интерфейс отдавать подграф выбранного узла/кластера и агрегированные связи, а не миллион узлов сразу. Точные текущие правила и семантика направлений сохраняются; приближения и новые пороги требуют отдельной оценки стабильности и времени.

Технологии, лицензии, вклад команды и локальная версия

Источники, технологии и вклад

  • Языки: Python 3.13 для расчёта и CLI; JavaScript, HTML и CSS для автономного интерфейса. Граф рисуется встроенным Canvas-кодом, без внешних CDN и обязательного веб-сервера. Опциональный планировщик обращается к OpenAI Responses API; проверенная модель — gpt-5.4-nano-2026-03-17. Других внешних источников данных и обязательных API нет.
  • Датасет и starter/ — материалы организаторов HackAlem AI. Стартовый код оставлен отдельно; он использован как справка по загрузке, базовым метрикам и контракту CSV. Он не выполняет классификацию вместо решения команды.
  • Код и документация разработаны с помощью Codex. AI-агент используется при разработке; аналитические роли продукта рассчитываются прозрачными правилами. Применение AI не выдаётся за качество обученной модели.
  • Python: pandas 3.0.6, PyArrow 25.0.1, NetworkX 3.7, NumPy 2.5.3, SciPy 1.18.1; вспомогательные зависимости python-dateutil 2.9.0.post0 и six 1.17.0. Точные версии — в requirements.txt.
  • Первичные проекты: pandas, Apache Arrow, NetworkX, NumPy, SciPy, dateutil, six. Основные лицензии соответственно BSD-3-Clause, Apache-2.0, BSD-3-Clause, BSD-3-Clause, BSD-3-Clause, Apache-2.0/BSD-3-Clause и MIT; бинарные сборки могут содержать компоненты с дополнительными лицензиями, перечисленными в их metadata/LICENSE.
УчастникПодтверждённая область вклада
a4nsОсновной пайплайн, методика, независимые аудиты, AI-планировщик, интеграция и README
AlexandrЭкран сети, карточки, навигация, экспорт и UI-проверки
ErzhanЛокальный помощник, независимые проверки Windows, подмены валидатора и подготовка демо

История Git сохраняет настоящее авторство и время. Общая память команды: TEAM_CONTEXT.md, TASKS.md, правила совместной работы. Фактические протоколы проверок отделены от планов и человеческой репетиции.

Развёрнутая версия

Публичная deployed-версия не размещена. DalaAI запускается локально: откройте out/network.html после расчёта или скачайте сохранённый HTML из репозитория. GitHub показывает исходный текст HTML, а не работающий экран. Сервер и публикация сайта не требуются.

Соответствие требованиям конкурса

Соответствие критериям конкурса

Веса ниже — шкала ТЗ, не самооценка заработанных баллов.

КритерийМатериалы для проверки
Соответствие задаче и работоспособность — 25Пять обязательных функций, полный запуск, три CSV фиксированной схемы, поиск произвольного gid
Техническая реализация, включая AI — 25Направленные метрики, даты, прозрачные роли/приоритет, кластеры; ограниченный LLM-планировщик с проверкой аргументов
README и воспроизводимость — 25Закреплённые зависимости, Windows/uv/offline-инструкции, валидатор, тесты, независимый аудит и протоколы
Ценность — 15Очередь проверки, числовые основания, конкурирующие признаки и конкретный следующий запрос данных
Потенциал и оригинальность — 10Учёт границы наблюдения, чувствительность, различие структуры и дат, сценарии удаления и план масштабирования

Пункты промпта организаторов

Пункт инструкцииГде раскрыт
1–2. Название, проблема и пользовательЗаголовок и вступление
3. Реализованные функцииЧто реализовано
4. Пользовательский сценарийКак работает решение
5–6. Технологии и архитектураСхема, AI, источники и технологии
7. Установка и запускБыстрый запуск, подробная подготовка
8. Сценарий проверкиКак проверять
9. Данные и интеграцииИсточники данных
10. ОграниченияЛовушки, масштабирование
11. Deployed-версияЛокальная версия

Подача через платформу выполняется отдельно от push: текст и порядок сдачи, условия Положения и ТЗ.

Звёзды
⭐ 0
Форки
0
Язык
HTML
Последний push
в прошлом месяце
Коммиты
49
Авторы
4
Файлы
107
Ветки
3

Авторы коммитов

a4ns 26Erzhan 12Alexandr 9font-weight 2

История коммитов

  • 2026-09-23 17:47merge: accept Erzhan complete card QA and Windows release proofa4ns
  • 2026-09-23 17:45docs(qa): verify branded Windows release and refreshed offline packageErzhan
  • 2026-09-23 17:44test(qa): verify every DalaAI card and text export against source artifactsErzhan
  • 2026-09-23 17:42docs: record verified final team integration for resubmissiona4ns
  • 2026-09-23 17:41merge: accept Alexandr final README and Windows instructionsa4ns
  • 2026-09-23 17:41merge: include Erzhan measured performance and QA reporta4ns
  • 2026-09-23 17:37docs: close external review and prepare evidence-based defensea4ns
  • 2026-09-23 17:37docs: simplify judging guide and Windows quick startAlexandr
Все коммиты (49)
  • 2026-09-23 17:36Merge remote-tracking branch 'origin/main' into codex/qa-erzhanErzhan
  • 2026-09-23 17:30docs(qa): summarize Dala AI data and measured optimization prioritiesErzhan
  • 2026-09-23 17:30docs: present DalaAI against hackathon requirementsa4ns
  • 2026-09-23 17:21merge: accept Alexandr overview selection refinementa4ns
  • 2026-09-23 17:00fix(ui): start network overview without selected clientAlexandr
  • 2026-09-23 16:58docs: clarify pre-deadline submission updates and review evidencea4ns
  • 2026-09-23 16:48docs: align README with all eleven organizer requirementsa4ns
  • 2026-09-23 16:38chore: verify integrated release and prepare technical submissiona4ns
  • 2026-09-23 16:37merge: integrate Alexandr card exports and navigation fixesa4ns
  • 2026-09-23 16:37merge: accept Erzhan Windows integration and rehearsal reportsa4ns
  • 2026-09-23 16:35fix: explain role precedence and verify pre-submission builda4ns
  • 2026-09-23 16:33fix(ui): preserve card evidence and clarify filtered selectionAlexandr
  • 2026-09-23 16:32docs(demo): prepare Erzhan rehearsal with verified graph casesErzhan
  • 2026-09-23 16:27docs(qa): accept integrated validator and Windows uv bootstrapErzhan
  • 2026-09-23 16:25merge: accept Erzhan clean Windows installation verificationa4ns
  • 2026-09-23 16:24Merge commit 'c31e093600e00dd6bf384407101b73d491fff85f' into codex/qa-erzhanErzhan
  • 2026-09-23 16:20test(qa): verify clean Windows install from local wheelsErzhan
  • 2026-09-23 16:19fix: document verified Python bootstrap and explicit UTF-8 outputa4ns
  • 2026-09-23 16:12fix: verify source facts and reject unsupported analyst queriesa4ns
  • 2026-09-23 16:08merge: integrate Erzhan offline query validationa4ns
  • 2026-09-23 16:07fix(assistant): reject unsupported and incomplete offline queriesErzhan
  • 2026-09-23 16:05merge: open the first analyst card on loada4ns
  • 2026-09-23 16:03fix: validate diagnostic artifacts and complete analyst cardsa4ns
  • 2026-09-23 16:03merge: accept Erzhan independent Windows QA reporta4ns
  • 2026-09-23 16:00docs(qa): verify Windows main and Alexandr UI changesErzhan
  • 2026-09-23 16:00fix(ui): show priority breakdown on initial cardAlexandr
  • 2026-09-23 15:55merge: integrate Alexandr node priority explanationsa4ns
  • 2026-09-23 15:51feat(ui): explain priority components in node cardAlexandr
  • 2026-09-23 15:46test: verify live AI routing on reviewed graph queriesa4ns
  • 2026-09-23 15:35feat: audit graph evidence and add bounded AI planninga4ns
  • 2026-09-23 15:22Merge branch 'main' of https://github.com/BAITC-Hacks/hack-0c0b2c2f-zherimaiAlexandr
  • 2026-09-23 15:22made some testsAlexandr
  • 2026-09-23 15:04docs: share Codex context and assign team workstreamsa4ns
  • 2026-09-23 14:51feat: add reproducible money graph analysis and offline viewera4ns
  • 2026-09-23 14:03start from hereAlexandr
  • 2026-09-23 14:02123Erzhan
  • 2026-09-23 14:00first commitErzhan
  • 2026-09-23 13:56docs: describe Zherimai dataseta4ns
  • 2026-09-23 13:54readme changeAlexandr
  • 2026-09-18 18:41Delete Testfont-weight
  • 2026-09-18 18:39Create Testfont-weight
Структура репозитория (107 файлов)
.env.example
.gitignore
AGENTS.md
PLAN.md
README.md
TASKS.md
TEAM_CONTEXT.md
aml/__init__.py
aml/ai_assistant.py
aml/assistant.py
aml/clusters.py
aml/explain.py
aml/features.py
aml/load.py
aml/priority.py
aml/resilience.py
aml/roles.py
aml/sensitivity.py
aml/temporal_reach.py
aml/validate.py
aml/validate_diagnostics.py
aml/viewer.py
aml/viewer_template.html
data/README.md
data/edges.parquet
data/nodes.parquet
data/transactions.parquet
docs/ai-assistant.md
docs/ai-eval-cases.json
docs/ai-eval-cases.md
docs/ai-eval-results.json
docs/analysis.json
docs/analysis.md
docs/architecture.svg
docs/assignments.md
docs/budget.md
docs/commit-plan.md
docs/compliance.md
docs/dalaai-release-verification.json
docs/demo-day-brief.md
docs/demo.md
docs/final-integration-verification.json
docs/handoffs/all-node-viewer-qa-erzhan.json
docs/handoffs/all-node-viewer-qa-erzhan.md
docs/handoffs/assistant-routing-erzhan.md
docs/handoffs/browser-assistant-integration.md
docs/handoffs/dalaai-windows-release-erzhan.json
docs/handoffs/dalaai-windows-release-erzhan.md
docs/handoffs/data-optimization-erzhan-20260923.json
docs/handoffs/data-optimization-erzhan-20260923.md
docs/handoffs/external-review-followup.md
docs/handoffs/offline-windows-erzhan.json
docs/handoffs/offline-windows-erzhan.md
docs/handoffs/qa-erzhan-20260923.json
docs/handoffs/qa-erzhan-20260923.md
docs/handoffs/qa-integration-erzhan-c31e093.json
docs/handoffs/rehearsal-erzhan.md
docs/handoffs/review-closure-1735.md
docs/handoffs/ui-alexandr.md
docs/handoffs/ui-integration.md
docs/install.md
docs/judging-guide.md
docs/pre-submit-verification.json
docs/rehearsal.md
docs/resubmission-verification.json
docs/sensitivity-method.md
docs/submission.md
docs/team-workflow.md
docs/top20-audit.md
docs/uv-verification.json
docs/uv-verification.md
docs/validator-acceptance.json
docs/verification-integration.json
docs/verification-integration.md
docs/verification-update.md
docs/verification.md
out/clusters.csv
out/data_requests.csv
out/network.html
out/node_stability.csv
out/nodes_roles.csv
out/report.json
out/resilience.csv
out/sensitivity.csv
out/top_nodes.csv
requirements.txt
run.py
scripts/analyze.py
scripts/audit_top.py
scripts/check_viewer.cjs
scripts/evaluate_ai.py
starter/README.md
starter/requirements.txt
starter/starter.py
tests/check_all_viewer_nodes.py
tests/run_without_network.py
tests/test_ai_assistant.py
tests/test_assistant.py
tests/test_diagnostic_validation.py
tests/test_explanations.py
tests/test_invariants.py
tests/test_offline_runner.py
tests/test_sensitivity.py
tests/test_source_validation.py
tests/test_temporal_reach.py
tests/test_viewer.py
validate.py
Ветки (3)

Обсуждение 0 комментариев

Войдите, чтобы комментировать

Пока нет комментариев — будьте первым.