AAYMA
RU
Войти

Money graph

AML-пайплайн и Streamlit-«рабочее место аналитика» по графу переводов (2248 клиентов, 81 seed).

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

О проекте

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

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

Суть

AML-пайплайн и Streamlit-«рабочее место аналитика» по графу переводов (2248 клиентов, 81 seed). Каждому клиенту назначаются роль, кластер и приоритет проверки с числовым обоснованием, выпускается список запросов на недостающие данные. Есть опциональный LangGraph-ассистент.

Как устроено

По трём parquet-файлам считаются степени, суммы KZT, centrality, HITS, короткие циклы, FIFO pass-through за 2 дня и флаги по суммам. Деньги seed'ов распространяются по рёбрам пропорционально KZT. Для 444 клиентов на глубине 4 без обхода исходящих логистическая регрессия, обученная на глубинах 1–3, оценивает P(forwards). Шесть упорядоченных правил назначают роли, Louvain выделяет сообщества с гипотезами. Приоритет складывается из 5 взвешенных компонент: seed-деньги, роль, число seed'ов, betweenness, removal impact. Пайплайн детерминирован, UI на Streamlit с pyvis-графом, ассистент на LangGraph с guardrail по gid.

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

  • Louvain
  • betweenness
  • HITS
  • cycle detection
  • FIFO pass-through
  • seed-flow propagation
  • logistic regression
  • removal-impact resilience
  • LangGraph
  • pyvis

Метрики

CV AUC 0.733 (модель P(forwards) для глубины 4); роли: terminal 1133, peripheral 907, transit 107, distributor 50, consolidator 29, coordinator 22; 45 кластеров

Особенности

Команда учитывает обрыв обхода на глубине 4: клиенты без видимых исходящих не записываются в терминалы, а получают вероятность пересылки от модели. В data_requests.csv пайплайн говорит, какие данные запросить дальше. Все пороги с обоснованиями вынесены в config.yaml. Выход воспроизводится побайтно.

Стек

Python · pandas · NetworkX · Streamlit · plotly · pyvis · LangGraph · Docker · Makefile · pytest

Модели

gpt-4.1-mini


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

README

README.md

Money graph

Follow money from known seeds, inspect the evidence, and choose the next data request.

Русская версия

Team ker1mGo, case «Граф денег». An AML analyst knows 81 clients who received drug-related money (the seeds) and has their outgoing transfers four hops deep: 2,248 clients in total. Our tool answers the analyst's question "which of these clients should I look at first, and why?" It gives every client a role, a group and a review priority, each with the evidence behind it. Every finding is a hypothesis for an analyst to check, never an accusation.

Investigate page with the money-flow graph and a client dossier

Demo video: docs/media/demo.webm

Contents: Launch · How it works · Roles and thresholds · Data schemas · Demo walkthrough · Limitations · Scaling · Assistant · Commands

Launch

You need Python 3.12 and make (or Docker, see below). Run everything from the repository root.

1. Install

python3.12 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt

2. Configure (optional)

The pipeline and the viewer need no configuration. Only the optional Assistant page needs an API key:

cp .env.example .env

Then open .env in any editor and fill in what you need:

OPENAI_API_KEY=sk-...        # enables the Assistant page; leave empty to skip it
OPENAI_MODEL=                # empty = gpt-4.1-mini
OPENAI_BASE_URL=             # empty = api.openai.com; set it for any OpenAI-compatible endpoint
MONEYGRAPH_PORT=             # Docker only; empty = 8501

.env is ignored by git and never copied into the Docker image.

3. Run the pipeline (the one command that produces the results)

make run

It reads project_docs/data/, runs offline in about 10 seconds and writes the three required files out/nodes_roles.csv, out/clusters.csv and out/top_nodes.csv, plus the evidence the viewer uses. The run is deterministic: it reproduces the committed out/ snapshot byte for byte (only the timings in pipeline_metadata.json change).

4. Open the viewer

make app

Then go to http://localhost:8501.

With Docker instead of steps 1–4 (optionally do step 2 first):

docker compose up --build

This runs the pipeline in a container without network access, then serves the viewer on http://localhost:8501. Stop it with docker compose down.

How it works

flowchart LR
  D[("Input: 3 parquet files<br/>2,248 clients · 3,119 links · 4,840 transfers")] --> M["Metrics<br/>degrees and KZT · centrality and cycles<br/>FIFO pass-through · amount flags<br/>seed-money flow"]
  M --> T["Depth-4 model<br/>P(forwards)"]
  M --> R["Roles<br/>6 ordered rules + numeric evidence"]
  T --> R
  R --> C["Clusters<br/>Louvain + hypothesis"]
  R --> P["Priority<br/>5 weighted components + why"]
  C --> P
  P --> O[("out/<br/>nodes_roles · clusters · top_nodes<br/>rule traces · data requests")]
  O --> V["Streamlit case desk<br/>graph · dossier · method"]
  O --> A["Optional assistant<br/>LangGraph + gid guardrail"]

The method in five steps:

  1. Measure every client. Distinct payers and recipients, KZT in and out, centrality, short cycles, how much of the incoming money leaves within two days (matched transfer by transfer), and amount patterns such as repeated or round sums.
  2. Follow the seed money. Starting from the seeds' outgoing transfers, money is passed along each link in proportion to KZT, never more than a client actually sent. This estimates how much seed money reaches each client and from how many seeds.
  3. Handle the edge of the data. The crawl stopped at depth 4, so 444 clients there have no visible outgoing transfers. Instead of calling them end recipients, a small logistic regression trained on depths 1–3 (where outflows were crawled) estimates whether each one passes money on (cross-validated AUC 0.733).
  4. Assign roles and groups. Six ordered, documented rules give each client one role with a score and a numeric evidence line. Louvain community detection groups clients, and each group gets a hypothesis.
  5. Rank for review. Priority combines seed money reached, role, number of source seeds, betweenness, and how much seed flow disappears if the client is removed. Every client gets a plain-language why.

What is different from a naive approach:

Naive interpretationOur treatment
No outgoing transfers means an end recipientThe 444 depth-4 clients were never crawled for outgoing transfers; we separate 1,071 observed from 62 inferred terminals
Biggest degree or PageRank is the review orderPriority follows where seed money actually goes, and a resilience test shows the trade-off honestly
A score is enoughEach client's dossier shows every rule condition with its value and threshold, the nearest missed rule, the priority breakdown and the seed-money paths
Missing data is just missingdata_requests.csv says what to request next: hop-5 outflows, seed inflows, small unlinked groups

Each pipeline step in moneygraph/ exposes compute(ctx) and returns columns keyed by gid; run.py merges them in order. All thresholds and weights live in moneygraph/config.yaml, each with its reason. The pipeline never imports the viewer or the assistant; both only read out/.

Roles and thresholds

Rules are checked top to bottom and the first match wins; other rules that also match are listed in secondary_roles.

#RoleRuleWhy
1coordinator(pays ≥ 2 distinct seeds, or on cycles of length ≤ 4 with ≥ 2 seeds) and (reachable from ≥ 2 seeds, or betweenness ≥ p98)sends money back into several known couriers while sitting between seed flows
2distributorout_deg ≥ 10 and out_deg ≥ 3 × max(in_deg, 1)fan-out: few sources, many recipients (hubs up to 116 recipients)
3consolidatorin_deg ≥ 5 and (pass_through ≤ 0.5 or out_deg ≤ in_deg / 3)many distinct payers, few exits; in_deg ≥ 5 is the 98th percentile
4transitnon-seed, in ≥ 1, out ≥ 1, and (0.8 ≤ pass_through ≤ 1.2, or ≥ 50% of inflow forwarded within 2 days while pass_through ≤ 2)passes money on without holding it
5terminalout = 0, in ≥ 1, and depth ≤ 3 (terminal_observed), or depth 4 with P(forwards) < 0.3 (terminal_inferred)depth 1–3 outflows were crawled, so a sink there is observed; at depth 4 it can only be inferred
6peripheraleverything else: truncated_unknown, truncated_likely_forwarding (P > 0.6), seed_no_outgoing, no_edges, weak_signalstays inside the role dictionary while being honest about gaps

Seeds never use in_kzt or pass_through, because their inflow is under-counted by construction. role_score measures how far a client clears each threshold: 0.5 + 0.5 × mean(clip((x − thr) / thr, 0, 1)); observed terminals score 0.9, inferred terminals 1 − P(forwards). The evidence line always carries the numbers, e.g. 8 payers (2 seeds) → 2.16M in; sends on 24%; to 2 recipients; up to 7 payers same day; seed money in 875k; flags burst.

Result on the supplied data: terminal 1,133 · peripheral 907 · transit 107 · distributor 50 · consolidator 29 · coordinator 22.

Priority = seed factor × Σ weight × percentile rank, rescaled so the top client is 1. The weights are seed money reaching the client 0.30, role 0.25, number of source seeds 0.15, betweenness 0.15 and removal impact 0.15. Seeds get a factor of 0.85 because they are already known, and the top 30 contains none of them.

The depth-4 model, clusters, priority and resilience are documented with all their numbers in docs/methodology.md.

Data schemas

Input (project_docs/data/, supplied, never modified)

FileRowsColumns
nodes.parquet2,248gid int64 client id · depth int64 first hop where the client appeared (0 = seed) · is_seed bool
edges.parquet3,119src int64 payer · dst int64 recipient · sum_kzt float64 July total · n_tx int64 transfers · depth int8 hop where the link was found
transactions.parquet4,840src int64 · dst int64 · date date · sum_kzt float64 single transfer (≥ 5,000 KZT)

Required outputs (out/)

nodes_roles.csv: one row per client, 2,248 rows.

ColumnTypeMeaning
gidint64client id
rolestrcoordinator, distributor, consolidator, transit, terminal or peripheral
role_scorefloat 0–1how clearly the role's thresholds are met
cluster_idintcommunity; 0 = clients with no transfers
priority_scorefloat 0–1review priority; the top client is 1
evidencestr ≤ 200why this role, with numbers
role_detailstrfiner label, e.g. terminal_observed, terminal_inferred, truncated_unknown, seed_no_outgoing
secondary_rolesstrother roles whose rules also match, ;-separated
depth, is_seedint, boolcopied from the input

clusters.csv: one row per community, 45 rows.

ColumnTypeMeaning
cluster_idintcommunity id (0 = no transfers)
n_nodes, n_seedintclients and seeds in it
sum_kzt_internalfloatKZT on links inside the community
top_gidsstrtop 5 clients by priority, ;-separated
hypothesisstrwhat the group may be, e.g. "possible collection cell: …", with numbers
dominant_rolesstrmost common non-peripheral roles, e.g. terminal:112;transit:15;distributor:7
seed_flow_infloatmodelled seed money reaching the community

top_nodes.csv: the 30 highest-priority clients, sorted.

ColumnTypeMeaning
rankint1 = look first
gid, role, priority_scoreint64, str, floatas in nodes_roles.csv
whystrthe three biggest priority contributions in words
cluster_id, evidenceint, stras in nodes_roles.csv

Supporting outputs (out/)

FileContents
data_requests.csvgid, reason, suggested_request; reasons: truncated_likely_forwarding, seed_no_outgoing, seed_inflow_undercounted, small_component
resilience.csvn_removed, strategy, largest_wcc, n_components, seed_flow_reach for strategies priority, degree, degree_nonseed, random
truncation_model.jsondepth-4 model features, cross-validated AUC, coefficients, predicted vs observed forwarding rate
rule_traces.json, seed_paths.jsonevery rule condition per client, the nearest missed rule, estimated seed-money paths
features.parquetevery computed metric per client (see docs/design.md)
edges.parquet, transactions.parquetthe transfer evidence, exported so the viewer reads only out/
pipeline_metadata.jsonconfiguration used and measured step timings
bench.csv, bench.svg, bench_metadata.jsonscale measurements from make bench

Demo walkthrough

  1. Briefing: the case scope and data caveats, then open the first review candidate.
  2. Investigate: search any part of a gid, focus a client, expand one or two hops and follow the transfer arrows. The dossier shows each role condition, the priority breakdown and the estimated seed-money paths.
  3. Clusters and Priorities: compare group hypotheses and see why a client enters the review queue.
  4. Data gaps: the requests for the next crawl, instead of treating missing outflow as a finding.
  5. Method & scale: depth-4 model validation, resilience, measured runtime and the configuration used. The Assistant page is optional; every other page works without a key.

Limitations

  • Nothing here is a verdict. Roles, clusters and priorities are hypotheses built only from transfer structure, amounts and dates.
  • No ground truth. Thresholds come from the data's percentiles and the task's hints. They are explainable, not validated.
  • The graph is a crawl around 81 seeds. Centrality is centrality within this sample, and depth-4 clients are under-observed by construction.
  • Seed flow is a model. Money is split by KZT share and capped at each client's outflow; it is not transaction-level attribution.
  • Clusters ignore direction. Louvain runs on the undirected projection; direction is used everywhere else.
  • Priority is not disruption. Removing the top 50 by degree fragments the network more; removing our top 50 cuts seed money reaching depth ≥ 2 to 60%, versus 85% for the top 50 non-seeds by degree.
  • Transfers below 5,000 KZT are invisible, so structuring under the threshold cannot be detected.

How each data limitation from the task is handled: docs/methodology.md.

Scaling

Measured with make bench on graphs lifted from the supplied degree and amount distributions (one run each, Intel Core i5-10200H):

ModeClientsTransfersCore pipeline
Exact centrality, ×12,2484,8404.90 s
Sampled betweenness (32 sources), ×1022,48048,40017.25 s
Sampled betweenness (32 sources), ×100224,800484,000205.83 s

The benchmark led to a 140× faster temporal step. At ×100 the largest remaining steps are resilience, priority and role assignment. Details: docs/methodology.md.

What changes at ~1 million clients

A million-node graph has not been built or measured; this is the plan, not an implementation. The method stays the same (the same rules, seed-money flow, depth-4 model and priority components); what changes is how each part is computed.

PartNow (2,248 clients)At ~1M clientsWhy
Loading and per-client aggregatespandas in memoryPolars or DuckDB, columnar and out-of-coretens of millions of transfers no longer fit comfortably in pandas
Graph librarynetworkxigraph or graph-tool on one machine; GraphFrames (Spark) if distributednetworkx is pure Python and becomes the bottleneck
Betweennessexactsampled from k source nodes (already supported and benchmarked above), or dropped in favour of seed-flow metricsexact betweenness grows roughly with nodes × edges
CommunitiesLouvainLeiden (igraph / leidenalg)faster and guarantees well-connected communities
Seed-money flow6 sparse matrix-vector productsunchanged, on a larger CSR matrixalready linear in the number of links
Reachable seeds per clientone BFS per seedone multi-source BFS with a bitset per seed, or HyperLogLog countersavoids 81 separate traversals
Removal impact and resiliencefull rerun for the top 100still top-K only, or approximated by the flow passing through the clienta full rerun per client does not scale
Role rules and priorityrow-by-row evaluationvectorised column expressionsthe rules are simple thresholds, so they vectorise directly
Updatesfull recompute each runincremental: new transfers update aggregates and re-propagate only from affected clientsrecomputing everything daily is wasteful
Crawlfixed 4 hopsextend one hop at a time where data_requests.csv pointsspend the next crawl where the uncertainty is
Vieweroffline SVG graph of an ego networkWebGL rendering (sigma.js or cosmograph), still bounded ego graphs and clustersnever draw the whole graph

Optional assistant

After setting OPENAI_API_KEY in .env (see Launch), the Assistant page answers questions such as «кто собирает деньги с этих пятерых: …» through read-only graph tools. A guardrail checks that every gid it cites exists, and it never assigns roles or priorities. Its evaluation on questions generated from the graph reached gid recall 1.00, precision 0.84 and 0 unknown gids. See docs/assistant.md.

Commands

CommandPurpose
make runCompute roles, clusters, priorities, model report and data requests offline
make appLaunch the viewer on port 8501
make testRun the offline tests; generated outputs go to temporary directories
make checkLint, formatting check and tests (needs requirements-dev.txt)
make edaPrint the exploratory data findings
make benchGenerate the scale measurements and chart
make evalEvaluate the assistant; requires an API key
make docker-up / make docker-downStart or stop the Docker Compose setup

make uses .venv/bin/python when it exists; override with PY=/path/to/python. make run OUT=/tmp/moneygraph-output checks a change without replacing the committed snapshot.

Structure

moneygraph/       Data loading, analytics, rules and export pipeline
agent/            Read-only graph queries, fact cards and the optional assistant
app/              Streamlit entry point, pages, dossier, charts and SVG graph
  static/         Bundled fonts and their license
tests/            Offline regression and integration tests
docs/             Architecture, methodology and assistant reference
project_docs/     Original task, dataset description and supplied parquet data
out/              Committed case snapshot produced by `make run`

Reference

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

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

Shoplikov Alisher 72aruzhannurman 37mrqwer 27

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

  • 2026-09-23 18:00add russian readmeShoplikov Alisher
  • 2026-09-23 17:56add demo videoShoplikov Alisher
  • 2026-09-23 17:52merge final review: remove tracing, readme schemas and launch guideShoplikov Alisher
  • 2026-09-23 17:52feat: special solution casemrqwer
  • 2026-09-23 17:51merge russian interface into reviewShoplikov Alisher
  • 2026-09-23 17:50merge russian interface polishShoplikov Alisher
  • 2026-09-23 17:50verify localized evidence and document fresh clone launchShoplikov Alisher
  • 2026-09-23 17:49drop agent instructions file and tool-specific ignoresShoplikov Alisher
Все коммиты (136)
  • 2026-09-23 17:49restore supplied starter code, keep it out of lintingShoplikov Alisher
  • 2026-09-23 17:49rewrite contributing guideShoplikov Alisher
  • 2026-09-23 17:49readme: launch guide, method, schemas, scaling to 1mShoplikov Alisher
  • 2026-09-23 17:49remove langfuse tracingShoplikov Alisher
  • 2026-09-23 17:49list only the settings the code reads in .env.exampleShoplikov Alisher
  • 2026-09-23 17:49merge remote cleanup and preserve russian interfaceShoplikov Alisher
  • 2026-09-23 17:42refine russian analyst workspace and responsive graphShoplikov Alisher
  • 2026-09-23 17:30merge project cleanup with latest workspacearuzhannurman
  • 2026-09-23 17:24clean project structure and development workflowaruzhannurman
  • 2026-09-23 17:20merge analytics evidence and measured scalingShoplikov Alisher
  • 2026-09-23 17:20merge docker delivery and method documentationShoplikov Alisher
  • 2026-09-23 17:20merge analyst workspace redesignShoplikov Alisher
  • 2026-09-23 17:20normalize exported chart formattingShoplikov Alisher
  • 2026-09-23 17:18merge measured delivery documentationShoplikov Alisher
  • 2026-09-23 17:18add offline selectable money flow graphShoplikov Alisher
  • 2026-09-23 17:18build analyst workspace with auditable dossiersShoplikov Alisher
  • 2026-09-23 17:17align delivery notes with the svg viewerShoplikov Alisher
  • 2026-09-23 17:16record measured scale and finish delivery checksShoplikov Alisher
  • 2026-09-23 17:16merge measured scale and exported evidenceShoplikov Alisher
  • 2026-09-23 17:16read case evidence only from pipeline exportsShoplikov Alisher
  • 2026-09-23 17:14publish evidence and measured scaling artifactsShoplikov Alisher
  • 2026-09-23 17:13merge analytics evidence and scalingShoplikov Alisher
  • 2026-09-23 17:13merge local delivery and method pageShoplikov Alisher
  • 2026-09-23 17:11measure and optimize pipeline scalingShoplikov Alisher
  • 2026-09-23 17:10add auditable role and seed flow evidenceShoplikov Alisher
  • 2026-09-23 17:10explain the case workflow and measured limitsShoplikov Alisher
  • 2026-09-23 17:09show method evidence and scale measurementsShoplikov Alisher
  • 2026-09-23 17:01add reproducible container launchShoplikov Alisher
  • 2026-09-23 16:27note that design.md is the original planShoplikov Alisher
  • 2026-09-23 16:27commit pipeline outputs, keep features.parquet ignoredShoplikov Alisher
  • 2026-09-23 16:27add outputs from current mainShoplikov Alisher
  • 2026-09-23 16:26merge track/a: demo prep doneShoplikov Alisher
  • 2026-09-23 16:24tick a7mrqwer
  • 2026-09-23 16:09merge track/b: readme roles sectionShoplikov Alisher
  • 2026-09-23 16:06readme: add roles and truncation sectionShoplikov Alisher
  • 2026-09-23 16:06tick b6, b7, b8Shoplikov Alisher
  • 2026-09-23 16:01merge track/a: roles and truncation readme textShoplikov Alisher
  • 2026-09-23 15:59Merge remote-tracking branch 'origin/main' into track/amrqwer
  • 2026-09-23 15:57merge track/b: headless app, clean-clone quickstartShoplikov Alisher
  • 2026-09-23 15:57merge track/c: langfuse flush, assistant readmeShoplikov Alisher
  • 2026-09-23 15:55run app headless so first-run email prompt doesn't blockShoplikov Alisher
  • 2026-09-23 15:55tick c9 c10aruzhannurman
  • 2026-09-23 15:54only print data request counts when verbosearuzhannurman
  • 2026-09-23 15:54readme: assistant sectionaruzhannurman
  • 2026-09-23 15:52update priority numbers after role threshold changesShoplikov Alisher
  • 2026-09-23 15:51Merge remote-tracking branch 'origin/main' into track/caruzhannurman
  • 2026-09-23 15:49pass verbose to steps, refresh readme numbers after transit capShoplikov Alisher
  • 2026-09-23 15:48flush langfuse traces before short runs exitaruzhannurman
  • 2026-09-23 15:48merge track/c: data requests and data gaps viewShoplikov Alisher
  • 2026-09-23 15:48merge track/a: transit cap, betweenness percentileShoplikov Alisher
  • 2026-09-23 15:46Merge remote-tracking branch 'origin/main' into track/caruzhannurman
  • 2026-09-23 15:46fix coefficient reading in roles sectionmrqwer
  • 2026-09-23 15:46tick a10mrqwer
  • 2026-09-23 15:46Merge remote-tracking branch 'origin/main' into track/amrqwer
  • 2026-09-23 15:46add roles and truncation readme text for bmrqwer
  • 2026-09-23 15:43refresh top 30 and resilience numbers after coordinator changeShoplikov Alisher
  • 2026-09-23 15:43merge track/a: tighten coordinatorShoplikov Alisher
  • 2026-09-23 15:43merge track/b: priority, resilience, readmeShoplikov Alisher
  • 2026-09-23 15:42tick a9mrqwer
  • 2026-09-23 15:42add fast pass-through cap for transitmrqwer
  • 2026-09-23 15:42cap fast-pass transit, show betweenness as percentilemrqwer
  • 2026-09-23 15:42print percentiles only on verbose runsmrqwer
  • 2026-09-23 15:40readme: priority, resilience, limitations, scaling, outputsShoplikov Alisher
  • 2026-09-23 15:38priority score with removal impact and why textShoplikov Alisher
  • 2026-09-23 15:38tick b4, note resilience resultShoplikov Alisher
  • 2026-09-23 15:37test coordinator needs two seedsmrqwer
  • 2026-09-23 15:37tick a8mrqwer
  • 2026-09-23 15:36tick c8aruzhannurman
  • 2026-09-23 15:36add data gaps expander to overviewaruzhannurman
  • 2026-09-23 15:36add small component threshold for data requestsaruzhannurman
  • 2026-09-23 15:36build data requests for truncated nodes, seeds and small componentsaruzhannurman
  • 2026-09-23 15:36load data requests in storearuzhannurman
  • 2026-09-23 15:36require coordinators to pay two seedsmrqwer
  • 2026-09-23 15:31merge review: checkpoint 2 fixesShoplikov Alisher
  • 2026-09-23 15:31add langchain so the langfuse callback can loadShoplikov Alisher
  • 2026-09-23 15:31use unique gid tail for graph labelsShoplikov Alisher
  • 2026-09-23 15:31write truncation model json and data requests stubShoplikov Alisher
  • 2026-09-23 15:31switch to review-then-merge workflow, add gotchasShoplikov Alisher
  • 2026-09-23 15:31add round 2 milestones from reviewShoplikov Alisher
  • 2026-09-23 15:28tick c7aruzhannurman
  • 2026-09-23 15:26add demo picks from current outputsaruzhannurman
  • 2026-09-23 15:26load env once so a missing key stays missingaruzhannurman
  • 2026-09-23 15:26add demo shortcuts and demo question to apparuzhannurman
  • 2026-09-23 15:22tick a6mrqwer
  • 2026-09-23 15:22add truncation model for depth-4 sinksmrqwer
  • 2026-09-23 15:21tick c6aruzhannurman
  • 2026-09-23 15:21add agent eval on graph-derived questionsaruzhannurman
  • 2026-09-23 15:20tick a5mrqwer
  • 2026-09-23 15:20add toy-graph tests for role rulesmrqwer
  • 2026-09-23 15:19add ordered role rules, scores and evidencemrqwer
  • 2026-09-23 15:19tick a4mrqwer
  • 2026-09-23 15:18tick c5aruzhannurman
  • 2026-09-23 15:18add fact cards with cached llm summaryaruzhannurman
  • 2026-09-23 15:18keep cited gids in answer orderaruzhannurman
  • 2026-09-23 15:18add assistant tab and fact card on node pagearuzhannurman
  • 2026-09-23 15:16tick a3mrqwer
  • 2026-09-23 15:16add seed flow propagation and seed source countsmrqwer
  • 2026-09-23 15:16tick c4aruzhannurman
  • 2026-09-23 15:15add kzt from group to common collectorsaruzhannurman
  • 2026-09-23 15:15add agent tools over storearuzhannurman
  • 2026-09-23 15:15add langgraph agent with gid guardrailaruzhannurman
  • 2026-09-23 15:15test tools and guardrail with scripted llmaruzhannurman
  • 2026-09-23 15:13tick a2mrqwer
  • 2026-09-23 15:13add temporal flag thresholds to configmrqwer
  • 2026-09-23 15:13add fifo fast pass-through, activity profile and flagsmrqwer
  • 2026-09-23 15:11add seed, hits, betweenness and cycle featuresmrqwer
  • 2026-09-23 15:11tick a1mrqwer
  • 2026-09-23 15:11tick c3aruzhannurman
  • 2026-09-23 15:11add plotly charts for card and overviewaruzhannurman
  • 2026-09-23 15:11add node card and overview pagesaruzhannurman
  • 2026-09-23 15:08don't repeat cluster counts in captionaruzhannurman
  • 2026-09-23 15:08tick c1 c2aruzhannurman
  • 2026-09-23 15:07add graph store with query functionsaruzhannurman
  • 2026-09-23 15:07add store tests on toy grapharuzhannurman
  • 2026-09-23 15:07add pyvis ego graph rendereraruzhannurman
  • 2026-09-23 15:07add gid search, network and top list pagesaruzhannurman
  • 2026-09-23 15:05readme: quickstart, diagram, outputs, clusters, data limitationsShoplikov Alisher
  • 2026-09-23 15:03tick b3Shoplikov Alisher
  • 2026-09-23 15:03louvain clusters on undirected log-weighted projectionShoplikov Alisher
  • 2026-09-23 15:03don't count cluster 0 as multi-seedShoplikov Alisher
  • 2026-09-23 14:53add project setup: requirements, makefile, gitignoreShoplikov Alisher
  • 2026-09-23 14:53add pipeline skeleton with stub stepsShoplikov Alisher
  • 2026-09-23 14:53add output schema testsShoplikov Alisher
  • 2026-09-23 14:53add placeholder viewerShoplikov Alisher
  • 2026-09-23 14:53add design notesShoplikov Alisher
  • 2026-09-23 14:53add team workflow and track checklistsShoplikov Alisher
  • 2026-09-23 14:27task descriptionShoplikov Alisher
  • 2026-09-23 14:24project docsShoplikov Alisher
Структура репозитория (102 файлов)
.dockerignore
.env.example
.gitignore
.streamlit/config.toml
CONTRIBUTING.md
Dockerfile
Makefile
README.md
README.ru.md
agent/__init__.py
agent/cards.py
agent/config.py
agent/eval.py
agent/graph.py
agent/identifiers.py
agent/store.py
agent/tools.py
app/__init__.py
app/app.py
app/charts.py
app/dossier.py
app/graph.js
app/graphview.py
app/pages/assistant.py
app/pages/briefing.py
app/pages/clusters.py
app/pages/data_gaps.py
app/pages/investigate.py
app/pages/method.py
app/pages/priorities.py
app/presentation.py
app/static/FONT-LICENSE.txt
app/static/Ubuntu-B.ttf
app/static/Ubuntu-M.ttf
app/static/Ubuntu-R.ttf
app/static/UbuntuMono-R.ttf
app/style.css
app/theme.py
app/ui.py
compose.yaml
docs/assistant.md
docs/design.md
docs/media/demo.webm
docs/media/investigate.png
docs/methodology.md
docs/quickstart-ru.md
moneygraph/__init__.py
moneygraph/bench.py
moneygraph/clusters.py
moneygraph/config.yaml
moneygraph/data.py
moneygraph/data_requests.py
moneygraph/eda.py
moneygraph/explain.py
moneygraph/export.py
moneygraph/features.py
moneygraph/formatting.py
moneygraph/paths.py
moneygraph/priority.py
moneygraph/roles.py
moneygraph/run.py
moneygraph/seed_paths.py
moneygraph/taint.py
moneygraph/temporal.py
moneygraph/truncation.py
out/bench.csv
out/bench.svg
out/bench_metadata.json
out/clusters.csv
out/data_requests.csv
out/edges.parquet
out/features.parquet
out/nodes_roles.csv
out/pipeline_metadata.json
out/resilience.csv
out/rule_traces.json
out/seed_paths.json
out/top_nodes.csv
out/transactions.parquet
out/truncation_model.json
project_docs/README.md
project_docs/Task_Description.md
project_docs/data/edges.parquet
project_docs/data/nodes.parquet
project_docs/data/transactions.parquet
project_docs/starter/README.md
project_docs/starter/requirements.txt
project_docs/starter/starter.py
pyproject.toml
requirements-dev.txt
requirements.txt
tests/conftest.py
tests/test_agent.py
tests/test_app.py
tests/test_explainability.py
tests/test_graphview.py
tests/test_no_hardcode.py
tests/test_outputs.py
tests/test_presentation.py
tests/test_rules.py
tests/test_scale.py
tests/test_store.py
Ветки (8)

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

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

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