§ Computer Vision Active

Digit Recognizer

Legacy MNIST kept as the canonical scaffold — the smoke-test that proves challenge.json, the dashboard registry, the remote bootstrap, and the submit-to-Kaggle flow all still work.

dataset 42k train · 28k test · 28×28 grayscale images
metric accuracy higher is better
infra sbl1 · local vast.ai · remote GPU
last touched 2026-02-15 kaggle competition ↗
technique stack
scaffold templatesmoke test

The role this entry plays

Every new competition in this repo is registered the same way: challenge.json on disk, an entry in the operator dashboard, a handful of shell scripts wired through the Makefile (sync, train, pull, submit), and an AGENTS.md describing the Codex flow. When any of that scaffold breaks, MNIST is the cheapest way to find out.

So digit-recognizer stays in the registry as a known-good smoke test. Its current state is not the score — it’s the contract.

Dataset spotlight

Data schema

data schema MNIST (Kaggle digit-recognizer)
column type note
label target 0–9 (training only)
pixel0…pixel783 numeric row-major flatten of 28×28 grayscale, 0–255

42,000 train rows · 28,000 test rows. The smallest possible CV competition — which is what makes it useful as a plumbing check.

The scaffold contract

challenge.json json · 24 lines
{
  "id": "digit-recognizer",
  "name": "Digit Recognizer",
  "project_dir": "digit-recognizer",
  "kaggle_competition": "digit-recognizer",
  "description": "Legacy MNIST classification smoke-test kept as a standard registered challenge.",
  "outputs_dir": "outputs",
  "training_log": "training_log.jsonl",
  "metrics_log": "training_log.jsonl",
  "submissions_log": "submissions_log.jsonl",
  "remote_host": "vast",
  "remote_session": "training",
  "remote_session_prefix": "",
  "remote_project_dir": "",
  "remote_path_export": "export PATH=\"$HOME/.local/bin:$PATH\"",
  "remote_training_log": "outputs/train.log",
  "actions": {
    "sync_train": "scripts/sync-to-gpu.sh",
    "pull_results": "scripts/pull-results.sh",
    "submit": "scripts/submit-to-kaggle.sh",
    "stop_training": "scripts/stop-training.sh"
  }
}
challenge.json — the smallest valid project descriptor. Every new competition in the repo starts from a structure like this. view on github ↗

Why a smoke test matters

When a Kaggle competition takes weeks of remote training, the operational surface is less forgiving than the modeling surface. A typo in a sync script, a stale Kaggle auth token, a dashboard endpoint that quietly stopped routing — these silently waste days. MNIST takes minutes to train and seconds to submit. If it doesn’t go end-to-end, something in the plumbing is wrong, and we know before paying for GPU.

This entry doesn’t compete. It guards the path that lets real competitions compete.

→ For the operational stack this scaffold lives on, see the workflow page.