Audit-first intrusion-detection benchmarking with time-robust evaluation and leakage diagnostics.
Quickstart · Contract · Repo Map · Docs · Contributing
TRACER is a benchmark contract plus a Python toolkit for intrusion-detection evaluation. It standardizes the prediction unit, protocol surface, and reporting invariants; exposes shortcut-sensitive baselines and time_robust controls; and keeps public claims tied to reproducible commands, manifests, and artifacts.
TRACER is evaluation infrastructure. It is not a SOC deployment guarantee, not a generic concept-drift benchmark by default, and not a claim that one pooled metric transfers to every dataset or environment.
| Surface | Value |
|---|---|
| Repository | kmccleary3301/tracer_ids |
| Python package | tracer_ids |
| CLI | tracer |
| Contract version | tracer-contract-1.0 |
| Prediction unit | transaction window |
| Core protocols | baseline, time_robust |
| Shortcut controls | time-only baseline, dataset-ID baseline |
| Primary audience | researchers, ML engineers, security practitioners, OSS contributors |
| Support floor | Python 3.10+ |
| License | MIT |
| Signal | State | Notes |
|---|---|---|
| CI smoke | 🟢 | CLI help, claims validation, portability checks, dry-run pipeline wiring |
| Release build | 🟢 | Wheel + sdist build workflow |
| Code scanning | 🔵 | Manual CodeQL workflow is present |
| Repro extended | 🔵 | Container smoke plus optional self-hosted GPU lane |
| Public claims discipline | 🟢 | Claims map, benchmark contract, manifest validation, release checklist |
- Why TRACER exists
- What the repository includes
- First five minutes
- Installation
- Common workflows
- CLI reference
- Benchmark contract and reporting model
- Repository map
- Code and module guide
- Documentation guide
- Reproducibility, claims, and release discipline
- Examples
- Contribution and project policy
- Citation, license, and security
Most IDS benchmark tables compress a large amount of protocol and data-hygiene complexity into one number. TRACER treats that as a methodological problem, not just a presentation problem.
TRACER is built around three commitments:
- Protocol is part of the result. Baseline and
time_robustruns are different evaluation conditions, not cosmetic variants. - Shortcut capacity should be measured directly. Time-only and dataset-ID baselines are explicit reporting surfaces, not private diagnostics.
- Claims should be auditable. Public-facing results should map back to commands, configs, manifests, and artifact paths.
flowchart LR
A[Raw IDS sources<br/>PCAP / flows / CSV] --> B[Dataset parsers<br/>windowized records]
B --> C[TRACER prediction unit<br/>transaction window]
C --> D[Protocols<br/>baseline / time_robust]
D --> E[Metrics and reports<br/>pooled + per-dataset]
E --> F[Claims surface<br/>contract + manifests + artifacts]
| Area | Included here | Why it matters |
|---|---|---|
| Benchmark contract | docs/benchmark_contract.md |
Fixes semantics for protocols, metrics, prediction unit, and non-claims |
| CLI workflows | tracer_ids/cli.py |
Gives a small, stable surface for validation and dry-run usage |
| Data pipeline | tracer_ids/data/ and tracer_ids/dataset_parsers/ |
Parses heterogeneous datasets into TRACER-compatible window records |
| Model implementations | tracer_ids/models/ |
Baseline neural model family support and training-time integration |
| Tabular tooling | tracer_ids/tabular/ |
Non-neural baselines and tabular feature paths |
| Training orchestration | tracer_ids/training/ |
Pretraining, fine-tuning, metrics logging, manifest-aware runs |
| Validation scripts | scripts/ci/ and scripts/validate_claims_map.py |
Prevents silent drift in paths, manifests, and claims structure |
| Paper/figure utilities | scripts/figures/ and scripts/final_sprint/ |
Rebuilds aggregate reports, figures, and artifact ledgers |
If you only want to verify the repo surface without datasets or expensive runs:
/usr/bin/miniconda3/bin/pip install -e .[dev]
tracer quickstart
tracer validate-claims
make portability-check
make manifest-checkExpected quickstart output is intentionally lightweight:
[ConfigEnv] resolved ... token(s) ...
[PipelineProfile] python pretrain.py --config ... --precompute-transforms all=false
That output means the wiring path is intact and the repo can resolve config tokens, route through the profile wrapper, and stop short of expensive execution.
What this quickstart does not do
- It does not download datasets.
- It does not run model training.
- It does not certify benchmark correctness beyond the validated dry-run surface.
- It does verify that the public CLI, config resolution, and portability/claims guardrails are wired coherently.
The most reliable local path today is a conda-backed Python environment with an editable install.
/usr/bin/miniconda3/bin/pip install -e .[dev]
python -m tracer_ids.cli --help
tracer --help| Variable | Status | Purpose |
|---|---|---|
TRACER_DATA_ROOT |
preferred | Dataset root override for portable orchestration scripts |
TRACER_CACHE_ROOT |
preferred | Cache root override |
TRACER_CONDA_SH |
preferred | Conda activation script path |
TRACER_CONDA_ENV |
preferred | Conda environment name |
MNI_DATA_ROOT |
legacy alias | Backward-compatible dataset root override |
MNI_CACHE_ROOT |
legacy alias | Backward-compatible cache override |
MNI_CONDA_SH |
legacy alias | Backward-compatible conda script path |
MNI_CONDA_ENV |
legacy alias | Backward-compatible conda environment name |
Example:
export TRACER_DATA_ROOT=/data/network_anomaly_datasets
export TRACER_CACHE_ROOT="$TRACER_DATA_ROOT/.tracer_cache"
export TRACER_CONDA_SH=/usr/bin/miniconda3/etc/profile.d/conda.sh
export TRACER_CONDA_ENV=NP_6For more detail, see docs/install.md.
| Goal | Command | Output |
|---|---|---|
| Dry-run the portable pipeline path | tracer quickstart |
Prints the orchestrated command path without running training |
| Validate public claim block structure | tracer validate-claims |
Checks the claims schema in docs/final_sprint/CLAIMS.md |
| Guard portable entrypoints against local path leakage | make portability-check |
Fails on hardcoded-path regressions in portable shells/scripts |
| Validate discovered run manifests | make manifest-check |
Checks manifest YAML structure when manifests are present |
| Run the profile wrapper directly | python scripts/run_pipeline_profile.py --profile dev --dry-run |
Exercises config resolution and launch wiring |
| Build aggregate result JSONs | make aggregates |
Produces aggregate benchmark summaries under logs/final_runs/ |
| Build figure panels | make figures-core |
Recreates core paper figures into the configured targets directory |
| Build artifact ledger | make artifact-ledger |
Regenerates artifacts_final/ledger/ outputs |
| If you are... | Start here |
|---|---|
| Researcher checking scope and claims | docs/getting_started.md, docs/benchmark_contract.md, docs/final_sprint/CLAIMS.md |
| ML engineer validating local wiring | docs/quickstart.md, docs/micro_run.md, docs/reproducibility.md |
| Security practitioner auditing benchmark claims | docs/faq.md, docs/claims/README.md, docs/benchmark_contract.md |
| Contributor adding datasets or improving tooling | CONTRIBUTING.md, docs/cookbook_add_dataset_parser.md, docs/engineering_guide_data_pipeline.md |
TRACER keeps the top-level CLI intentionally small:
| Command | What it does |
|---|---|
tracer ci-verify |
Runs the local CI smoke wrapper |
tracer profile |
Passes through to scripts/run_pipeline_profile.py |
tracer quickstart |
Runs the portable dry-run quickstart |
tracer validate-claims |
Validates claims markdown structure |
tracer portability-check |
Runs hardcoded-path portability checks |
tracer manifest-check |
Validates run-manifest YAML structure |
Example:
tracer profile --profile dev --dry-runThe contract is not an appendix detail. It is part of the repository surface.
| Contract surface | TRACER policy |
|---|---|
| Prediction unit | transaction window |
| Canonical label | type |
| Native label retention | true_label when available |
| Mandatory pooled reporting | yes |
| Mandatory per-dataset reporting | yes |
| Negative controls | required where claim-relevant |
| Public non-claims | explicit and versioned |
| Protocol | Intent | Boundary |
|---|---|---|
baseline |
Standard split/evaluation path | Reference condition, not the only condition |
time_robust |
Stress-tests schedule-sensitive behavior | Not a generic concept-drift guarantee |
| Task | Primary metric | Reporting requirement |
|---|---|---|
| Classification | macro-F1 | pooled + per-dataset summaries |
| Anomaly detection | AUPRC | prevalence caveats must remain explicit |
Canonical references:
- docs/benchmark_contract.md
- docs/reproducibility.md
- docs/final_sprint/CLAIMS.md
- docs/final_sprint/SCOPE_LOCK_CONTRACT.md
tracer_ids/
├── cli.py # small public CLI surface
├── data/ # loaders, transforms, samplers, caching helpers
├── dataset_parsers/ # dataset-specific ingestion/parsing
├── ids/ # IDS-specific types, parsing, scoring helpers
├── models/ # neural baselines and model wrappers
├── tabular/ # tabular feature extraction / baselines
├── training/ # pretraining, fine-tuning, metrics logging
├── utils/ # manifests, env resolution, profiling, cache utilities
└── misc/legacy_root/ # migration shims and legacy compatibility helpers
scripts/
├── ci/ # repo guards for portability and manifests
├── figures/ # figure generation and composition
├── final_sprint/ # artifact ledger and thesis/paper helpers
├── helpers/ # shell bootstrap helpers
├── hpo/ # HPO support code
├── ops/ # portable shell entrypoints
├── overnight/ # long-run orchestration helpers
└── pcap/ # PCAP preprocessing utilities
configs/ # benchmark, dataset, baseline, and HPO configs
docker/ # Snort/Suricata/Zeek support assets
docs/ # benchmark contract, install, quickstart, claims, guides
tests/ # unit and migration/repro checks
.github/workflows/ # CI, release build, repro-extended, CodeQL
What is intentionally not in the tracked repository surface
- Large run logs and local caches under
run_logs*/,logs/, and cache directories. - Scratch planning material and temporary writeups under
docs_tmp/. - Machine-local thesis and artifact workspaces that are reproducible or too environment-specific to version directly.
| Path | Focus |
|---|---|
tracer_ids/data/ |
Data loading, caching, transforms, split-time behavior |
tracer_ids/dataset_parsers/ |
Dataset-specific parse layers and conversion into TRACER-compatible records |
tracer_ids/models/ |
Neural baseline implementations and wrappers |
tracer_ids/tabular/ |
Tabular feature extraction and benchmark support |
tracer_ids/training/ |
Training loops, metrics registry, W&B integration |
tracer_ids/utils/run_manifest.py |
Lightweight manifest generation for reproducibility tracking |
scripts/run_pipeline_profile.py |
Main profile wrapper for dry-runs and scoped execution |
scripts/validate_claims_map.py |
Claims schema enforcement |
scripts/ci/check_hardcoded_paths.py |
Portable path guard |
scripts/ci/validate_run_manifests.py |
Manifest structure validator |
The repository now has enough surface area that a docs index is useful. Start with docs/README.md for a categorized documentation map.
| Topic | Start here |
|---|---|
| Install and local setup | docs/install.md |
| Dry-run verification | docs/quickstart.md |
| Scoped small-run path | docs/micro_run.md |
| Benchmark semantics | docs/benchmark_contract.md |
| Reproducibility policy | docs/reproducibility.md |
| Claims mapping | docs/claims/README.md |
| Contribution path | docs/cookbook_add_dataset_parser.md |
| Voice and messaging constraints | docs/brand_voice.md |
| Launch/release operations | docs/launch_ops.md, docs/release_checklist.md |
TRACER treats release quality as part of technical quality.
| Guardrail | Enforced by |
|---|---|
| Claims structure | tracer validate-claims |
| Portable shell entrypoints | make portability-check |
| Manifest structure | make manifest-check |
| Release packaging | GitHub Actions release-build workflow |
| Container / optional GPU repro lanes | GitHub Actions repro-extended workflow |
- CHANGELOG.md
- docs/release_checklist.md
- docs/repro_manifest_schema.yaml
- docs/claims/README.md
- docs/final_sprint/CLAIMS.md
tracer quickstart
tracer validate-claims
make portability-check
make manifest-checkTRACER_DATA_ROOT=/path/to/datasets \
python scripts/run_pipeline_profile.py --profile dev --dry-runTRACER_DATA_ROOT=/path/to/datasets \
python scripts/run_pipeline_profile.py \
--profile dev \
--pretrain-arg=--sample-multiplier \
--pretrain-arg=0.01make aggregatesmake figures-core
make compose
make artifact-ledgerMore command surfaces worth knowing about
| Command / target | When to use it |
|---|---|
tracer ci-verify |
local CI-style smoke wrapper |
tracer profile --profile dev --dry-run |
direct access to the profile orchestrator |
make aggregates |
regenerate aggregate JSON summaries |
make figures-core |
regenerate core figure panels |
make compose |
compose multi-panel figures |
make artifact-ledger |
rebuild small tracked artifact ledgers |
Before opening a PR, run the smallest relevant validation surface you can justify.
| Change type | Expected evidence |
|---|---|
| Docs / messaging only | link check + relevant markdown sanity |
| CLI / portability changes | tracer quickstart, make portability-check |
| Claims or release surface changes | tracer validate-claims, make manifest-check |
| Loader / pipeline orchestration changes | dry-run profile path plus targeted script checks |
Primary references:
- CONTRIBUTING.md
- SECURITY.md
- docs/cookbook_add_dataset_parser.md
- docs/engineering_guide_data_pipeline.md
| Topic | Location |
|---|---|
| Citation metadata | CITATION.cff |
| License | LICENSE |
| Security policy | SECURITY.md |
| Code of conduct | CODE_OF_CONDUCT.md |
If you are looking for the shortest navigation path:
- install the package: docs/install.md
- verify the surface: docs/quickstart.md
- understand the benchmark semantics: docs/benchmark_contract.md
- audit the claims surface: docs/claims/README.md
- work on the pipeline: docs/engineering_guide_data_pipeline.md