Skip to content

FlowRadar v2

Overview

FlowRadar v2 evaluates a complete training and inference pipeline. Miners submit a trainer and detector instead of a single fixed heuristic file.

The challenge trains every submission with the same mandatory v2_train_data.csv, then evaluates the trained model against v2_test_data.csv.

Miner Output

The miner API must return:

{
  "commit_files": [
    {
      "file_name": "train.py",
      "content": "..."
    },
    {
      "file_name": "submissions.py",
      "content": "..."
    }
  ]
}

commit_files must contain exactly one train.py and one submissions.py.

Training Contract

The challenge invokes:

python train.py <training_csv> <model_json>

train.py must:

  • read the mandatory CSV path from sys.argv[1]
  • use vpn_is_enabled as the label
  • write valid JSON to sys.argv[2]
  • finish within the configured training timeout
  • keep the generated JSON below the configured model-size limit

Production always provides v2_train_data.csv. A miner cannot provide or choose a different training dataset.

The model JSON remains temporary inside the FlowRadar container and is removed after scoring.

Model Weight Policy

Miners must not embed model weights in train.py or submissions.py. Prohibited content includes:

  • pretrained parameters
  • serialized or encoded model blobs
  • hard-coded learned coefficients or weight arrays
  • lookup tables representing externally learned model state
  • fallback weights used when the generated model is unavailable

All learned weights must be generated by train.py from the mandatory v2_train_data.csv during the current scoring run. submissions.py may only use those weights through the provided model argument.

Ordinary algorithm configuration and hyperparameters are allowed when they do not contain pretrained or externally generated learned state.

Inference Contract

submissions.py must expose:

def detect_vpn(features: dict, model: dict) -> bool:
    ...
  • features contains one row from v2_test_data.csv.
  • The challenge removes vpn_is_enabled before inference.
  • model is the parsed JSON produced by train.py.
  • The function must return a Python boolean.

Empty CSV cells are passed as JSON null. Inference should tolerate missing optional fields, numeric values, JA4 strings, and sequence strings.

Isolation

Training and inference execute inside an isolated FlowRadar container:

  • miner scripts and training data are mounted read-only
  • the model is written only to temporary container storage
  • the container uses an internal network
  • training timeout and model JSON validation are enforced
  • the container is destroyed after scoring

Scoring

FlowRadar uses F1 score for the VPN-positive class:

precision = TP / (TP + FP)
recall = TP / (TP + FN)
F1 = 2 * precision * recall / (precision + recall)

Scoring can stop early when request failures exceed the configured acceptable miss count.

Submission Limits

  • exactly two commit files
  • maximum configured line count per file
  • valid JSON model output
  • model JSON within configured size limit
  • training within the configured timeout
  • inference within the configured per-request timeout
  • no bypass, obfuscation, host-access, or environment-escape techniques
  • no embedded, pretrained, or externally generated learned weights

V1 Compatibility Testing

V1 data has 34 columns and uses is_vpn. It is available only for optional inference robustness testing.

Do not train the production submission with v1 data. Train with v2_train_data.csv, rename the v1 test label to vpn_is_enabled, and reindex the v1 test file to the v2 column shape.

See the Testing Manual for the conversion command.