CoolFace
Datasetpublic

koushikz1/arc-agi-2-jepa-episodes

ARC-AGI-2 masked-demonstration episodes (JEPA-ready) A task-level reasoning dataset built from the official ARC-AGI-2 tasks. Every row is an episode: a set of demonstration pairs (context), one held-out test_input, and the target_output the model must produce by inferring the rule shared by the demonstrations. It is not an input grid -> output grid dataset; the unit of learning is the task rule. Built 2026-09-25 with scripts/build_arc2_episodes.py (seed 20260925). Everything… See the full description on the dataset page: https://huggingface.co/datasets/koushikz1/arc-agi-2-jepa-episodes.

sourceHugging Faceapache-2.0updated 2d agoView on Hugging Face
1likes39downloads
Dataset Card

ARC-AGI-2 masked-demonstration episodes (JEPA-ready)

A task-level reasoning dataset built from the official ARC-AGI-2 tasks. Every row is an episode: a set of demonstration pairs (context), one held-out test_input, and the target_output the model must produce by inferring the rule shared by the demonstrations. It is not an input grid -> output grid dataset; the unit of learning is the task rule.

Built 2026-09-25 with scripts/build_arc2_episodes.py (seed 20260925). Everything below that is a number was computed from the files in this repository.

What is in it

configrowswhat
tasks1,120the official tasks (1,000 training + 120 public evaluation) with a task-level split label and per-task statistics
episodes6,077masked-demonstration episodes from the real tasks: canonical (context = the task's train pairs, target = a test pair) and loo (leave-one-out: every pair becomes the target once, all other pairs are context)
episodes_aug43,0728 deterministic augmentations of every episodes row in train/val/test (dihedral transform + colour permutation with colour 0 fixed, applied consistently to every grid of the episode); invertible via the stored dihedral and color_perm
arcgen_fresh10,464fresh episodes sampled from ARC-GEN generator output (google/ARC-GEN, rule-exact programmatic generators for 891 of the 1,000 training tasks): 12 episodes per task, 3–5 context pairs each, grids never seen in the official files
sdg_hard1,8248 episodes from each of 228 sandbox-verified synthetic puzzles written from hard ARC-AGI-2-style rule summaries (30 pairs per puzzle)
counterfactual6,077up to 4 wrong outputs per episodes row: a wrong orientation of the truth, a wrong colouring of the truth, a 5–15 % cell corruption, and another task's output of the same shape — negatives for contrastive / JEPA InfoNCE objectives
rule_programs891the ARC-GEN generator source (Python) for every covered task: the task's rule as executable code

Row counts per split are in analysis.md and stats.json.

Split rule (task-level, never example-level)

1000 training tasks  --seeded shuffle-->  train 800 | val 100 | test 100
 120 public evaluation tasks           -->  eval_public (benchmark only; never train on it)

No episode of a task appears in more than one split. arcgen_fresh, counterfactual and rule_programs inherit the split of their task, so arcgen_fresh/val and arcgen_fresh/test are held-out rule families with fresh grids — the validation signal you actually want (rule generalisation), rather than a random example split that leaks the rule. The full id lists are in splits.json.

Why an extra 800/100/100 split of the training tasks is not enough on its own: the training tasks are measurably easier than the evaluation tasks (table below), and public checkpoints such as the NVARC qwen3_4b_grids15_sft139 have already been trained on all 1,000 of them. For a model trained from scratch on this dataset, eval_public is a clean 120-task benchmark; for a model initialised from a public ARC checkpoint, only the Kaggle leaderboard is a clean readout.

Measured analysis: training vs public evaluation tasks

statistictraining (1,000)public evaluation (120)
demonstration pairs per task (histogram)2: 158, 3: 575, 4: 189, 5: 49, 6: 18, 7: 8, 8: 2, 10: 12: 34, 3: 61, 4: 18, 5: 6, 6: 1
tasks with more than one test input6.9 %37.5 %
median of the task's largest grid side1526
median of the task's largest grid area (cells)180621
tasks whose largest side is 30 (the maximum)5.6 %30.8 %
median number of colours (input / output)6 / 68 / 8
output shape same as input (all pairs)68.0 %67.5 %
output shape constant across pairs but different from input15.4 %1.7 %
output shrinks / grows / mixed11.9 / 3.6 / 1.1 %23.3 / 0.8 / 6.7 %
at least one demonstration input with a dihedral symmetry24.9 %11.7 %
output shape consistent across all pairs41.3 %20.8 %
tasks with an ARC-GEN generator89.1 %0 %

Reading: the evaluation set is a different regime, not a random sample of the training set. Grids are 3.4× larger by median area, one task in three uses the maximum 30×30, multi-test tasks are 5× more common, and rule-exact generators exist for none of them. ARC Prize's own report calls the training set "not difficulty-calibrated" and the evaluation sets calibrated against human testing. Any local score on the training distribution therefore overstates evaluation performance; that is the reason the arcgen_fresh held-out families are provided as a relative gate rather than an absolute one.

Schemas

episodes / episodes_aug / arcgen_fresh / sdg_hard

json
{"episode_id": "0934a4d8_loo_2", "task_id": "0934a4d8", "split": "train", "kind": "loo",
 "target_index": 2, "n_context": 3, "target_shape": [9, 3],
 "context": [{"input": [[...]], "output": [[...]]}, ...],
 "test_input": [[...]], "target_output": [[...]]}

episodes_aug adds base_episode_id, aug_id, dihedral (one of identity, rot90, rot180, rot270, fliph, flipv, transpose, antitranspose) and `colorperm (list of 10 ints, perm[0] == 0). arcgenfresh` / `sdghard carry source instead of kind/target_index`.

tasks: task_id, source_split, split, train, test, n_train, n_test, input_shapes, output_shapes, max_side, max_area, n_colors_in, n_colors_out, shape_relation, any_symmetric_input, output_shape_consistent, arcgen_generator, arcgen_fresh_pairs (test pairs include their outputs).

counterfactual: episode_id, task_id, split, target_shape, negatives: [{kind, detail, grid}].

rule_programs: task_id, split, language, source, license, generator_source.

Grids are lists of lists of ints 0–9, height and width 1–30.

Loading

python
from datasets import load_dataset
ep   = load_dataset("koushikz1/arc-agi-2-jepa-episodes", "episodes")        # train/val/test/eval_public
aug  = load_dataset("koushikz1/arc-agi-2-jepa-episodes", "episodes_aug")
gen  = load_dataset("koushikz1/arc-agi-2-jepa-episodes", "arcgen_fresh")    # held-out families in val/test
neg  = load_dataset("koushikz1/arc-agi-2-jepa-episodes", "counterfactual")

Using it with a JEPA-style model: what the evidence supports

No JEPA-family model (I-JEPA, V-JEPA 2, DSeq-JEPA) has a published ARC-AGI-1 or ARC-AGI-2 score, and the best verified hidden-set score of any small latent / recursive / object-centric ARC-AGI-2 system is 27.08 (a ~200 M LongT5 with test-time LoRA; HRM 2 %, TRM ~6–11 %, TOPAS 12–19 %). Every system above 50 % on the 2026 Kaggle leaderboard is an LLM-class model trained for weeks on private data. This dataset therefore cannot promise any accuracy; what it does is make the one JEPA variant with a defensible role trainable and testable without leaking the evaluation tasks:

ARC-JEPA-S (task-latent JEPA as a selector and hardness scorer, not as the solver).

  • —Context encoder E over the demonstration pairs (+ test input) → task latent z; looped predictor P (weight-tied, K ∈ {1, 4}) → ẑ; EMA target encoder G over (test_input, target_output).
  • —Loss L = 1 − cos(ẑ, sg[G(x_t, y_t)]) + InfoNCE(ẑ; G(x_t, y_t) vs G(x_t, y_neg)) with the negatives from counterfactual (wrong orientation, wrong colouring, near-miss corruption, other-task output) plus in-batch targets; optional VICReg term to prevent collapse.
  • —Data: episodes_aug + arcgen_fresh/train + sdg_hard for training; arcgen_fresh/val for early stopping; arcgen_fresh/test and episodes/test for the held-out family readout; eval_public untouched.
  • —Test time: a few gradient steps on z against the leave-one-out demonstration loss (LPN-style latent search), then score every candidate output y_c of an external proposer by cos(ẑ, G(x_t, y_c)).
  • —Keep bar before it touches a submission: it must select at least 3 more correct outputs than the incumbent log-probability selector on saved candidate pools, with no losses on unanimous pools.

Do not use it as a stand-alone solver: the 22-op DSL executors and per-task latent models in the proposals this dataset was built for measure 0–10 % on ARC-AGI-2 in every published or locally measured attempt, and the benchmark was explicitly designed against brute-force program search.

Sources and licences

  • —ARC-AGI-2 tasks: https://github.com/arcprize/ARC-AGI-2 (Apache-2.0). The 1,000 training tasks are byte-identical to the Kaggle competition files (verified).
  • —ARC-GEN generators and the fresh pairs sampled from them: https://github.com/google/ARC-GEN (Copyright 2025 Google LLC, Apache-2.0). rule_programs redistributes the generator source verbatim with its licence header.
  • —sdg_hard: synthetic puzzles written and sandbox-verified by the dataset author's pipeline (CC0).
  • —Human-difficulty labels (arcprize human testing) are not included; the referenced repository was not reachable at build time.

Provenance

scripts/build_arc2_episodes.py reproduces every file from the sources above with --seed 20260925 (--aug 8 --arcgen-episodes 12 --sdg-episodes 8). Integrity checks run at build time: split id sets are disjoint; no episode contains its own target pair in the context; 300/300 sampled augmentations invert exactly to their base episode; no counterfactual negative equals its truth.

Citation

@misc{arc_agi_2_jepa_episodes_2026,
  title  = {ARC-AGI-2 masked-demonstration episodes (JEPA-ready)},
  author = {koushikz1},
  year   = {2026},
  url    = {https://huggingface.co/datasets/koushikz1/arc-agi-2-jepa-episodes}
}

Please also cite ARC-AGI-2 (Chollet et al., 2025, arXiv:2505.11831) and ARC-GEN (Google, 2025, arXiv:2511.00162).