Use this before the paper freezes. The KDD 2026 CFP lists reproducibility of results among the factors area chairs weigh in acceptance recommendations — at this venue it is a scored dimension, not a virtue. The bar is shaped by what KDD papers claim: pipelines over large, messy, sometimes proprietary data, where the reader must be able to tell exactly which parts they can rerun, which they can rebuild, and which they must take on documented trust.
Declare every result in the paper as one of:
An ADS paper is usually tier 2-3; a Research Track paper claiming tier 1 while shipping tier 2 is what burns trust in review.
The stages that silently decide results in data-mining papers, and what to pin:
| Pipeline stage | What must be pinned | Classic KDD reviewer catch |
|---|---|---|
| Data acquisition | Version/date of each dataset, filtering rules, dedup | "Which snapshot of the graph?" |
| Preprocessing | Feature construction code, normalization, leakage guards | Target leakage via time-travel features |
| Splits | Split logic (temporal vs random), exact seeds, cold-start handling | Random splits on temporal data inflating results |
| Negative sampling | Ratio, distribution, per-epoch resampling or not | Baselines run with a different sampling scheme |
| Baselines | Source of implementation, tuning budget per baseline | Own method tuned for weeks, baselines run at defaults |
| Hardware/compute | Machines, memory, wall-clock per experiment | Throughput claims with no hardware context |
Equal-tuning-budget disclosure matters more at KDD than almost anywhere: the venue's history is full of boosting/embedding/GNN comparisons decided by tuning asymmetry.
Every reported number should trace to a committed config, and the mapping should be mechanical:
# repro/manifest.py - emitted next to every result file
import json, subprocess, time
def write_manifest(cfg, dataset_stats, out="results/manifest.json"):
manifest = {
"config_file": cfg.path, # one config per table row
"seed": cfg.seed, # and the full seed list for repeats
"dataset": dataset_stats, # {"name":..., "rows":..., "edges":..., "snapshot":...}
"git_commit": subprocess.check_output(
["git", "rev-parse", "HEAD"]).decode().strip(),
"wall_clock_sec": cfg.elapsed,
"hardware": cfg.hardware, # e.g. "1x A100-80GB, 256GB RAM"
"timestamp": time.strftime("%Y-%m-%dT%H:%M:%SZ"),
}
json.dump(manifest, open(out, "w"), indent=2)
Tables generated from manifests cannot drift from the artifact — the failure mode where the PDF says 0.847 and the repo reproduces 0.831 is a rebuttal-phase disaster, and KDD rebuttals cannot even link to a corrected artifact.
For post-launch numbers, reproducibility means specification: metric definitions, measurement window, traffic allocation, ramp schedule, guardrails, and any seasonal confounders in the window. A reader should be able to audit the measurement, even though they cannot repeat it. Blur only what confidentiality forces (absolute denominators can become relative lifts), and say explicitly what was blurred and why.
A recommendation paper reports wins on two public datasets and one "large industrial dataset." The tier audit finds: public results are rerunnable (good); the industrial result is attested but the paper's abstract says "we release all code and data" — written before the legal review pulled the industrial set. Left uncorrected, that sentence is the kind of paper-vs-reality contradiction a practitioner reviewer catches in minutes and generalizes from ("what else is oversold?"). The repair:
Reproducibility review at KDD is largely consistency review: the checklist is the paper against itself.
Run this list the week before the paper freezes, while fixes are still cheap:
[Tier map] <headline table: rerunnable/rebuildable/attested, per major result>
[Pipeline pins] <acquisition/preprocessing/splits/sampling/baselines/compute status>
[Tuning symmetry] <our budget vs baseline budget, disclosed where>
[Variance story] <repeats + seeds at which scales>
[ADS measurement spec] complete / gaps: <...> / N-A
[Trust risks] <paper-artifact drift, leakage, undeclared selection>