Anchor-and-Harvest Curriculum: A Fully Unmasked Non-LLM Curriculum for Craftax
Organizations: Brown University · York University · Sun Yat-sen University · The Chinese University of Hong Kong, Shenzhen
Abstract
We introduce Anchor-and-Harvest Curriculum (AHC), a domain-informed, rule-based training system for Craftax-Full. AHC combines achievement-oriented tasks, harvested initial-state progress, difficulty adaptation, bounded selection, and original-task practice. It uses no LLM inference and keeps all 43 actions available. At 2,005,401,600 PPO rollout transitions, three primary AHC runs obtain native-task return (sample SD), compared with for fresh native PPO-GTrXL with the same student architecture and evaluation protocol. Evaluation uses ten stochastic rollouts on each of 1024 fixed worlds per model. An additional cohort of three AHC runs reaches . Two single-component ablations retain similar mean returns, while jointly freezing difficulty and removing inherited progress gives . All-67-achievement profiles show that most of the return difference comes from Intermediate achievements, while the deepest-floor achievements remain unsolved. A Skill-Preflight diagnosis with a 14B teacher shows how prerequisite and floor-access constraints restrict practice. AHC and three 14B diagnostic configurations reach aggregate returns near the reported 80B DiCode mean of 45.88 and below the 235B mean of 48.55. These results show that an explicit curriculum without LLM inference can reach returns comparable to those reported for LLM-generated curricula on Craftax-Full, without action masking.
Figures & tables
| Enumerate tasks and task variants | Select eligible units and one native anchor | Initialize practice and set difficulty | Train student and harvest progress |
| Item | Setting |
|---|---|
| Environment | Craftax-Symbolic-v1, Craftax 1.4.5 |
| Budget | 2,005,401,600 PPO rollout transitions (15300 updates); harvest and controller statistics reuse these rollouts; evaluation is excluded |
| Endpoints | Update 15300 (final) and 7600 (below 1B); diagnostic tail window 14400–15300 |
| Evaluation | 1024 fixed worlds 10 stochastic rollouts, 8192-step cap; historical comparisons use one rollout per world |
| Actions and inputs | 43 actions, no filter; 67-dimensional task indicator |
| Training-state access | Harvested progress, softened dynamics, engine-informed dependency graph |
| Warrior (s1) | Recovery | ||||
|---|---|---|---|---|---|
| Configuration | Graph and comparison scope | Tail | Final | Tail | Final |
| longStack | Original graph; floor clause on | 4.54 | 6.74 | 0/3 | 0/3 |
| repairF | Repaired graph; API-reference differs | 14.36 | 16.11 | 3/3 | 3/3 |
| shufGraph | Fixed shuffled graph; changes both graph consumers | 14.97 | 16.02 | 3/3 | 3/3 |
| Last ten checkpoints | Checkpoint 15300 | |||
|---|---|---|---|---|
| Configuration | Return | Individual runs | Return | Individual runs |
| base15 | 45.016 / 42.476 / 44.296 | 46.024 / 42.549 / 44.955 | ||
| longStack | 44.726 / 43.157 / 44.159 | 45.016 / 43.545 / 45.206 | ||
| Last ten checkpoints | Checkpoint 15300 | |||
|---|---|---|---|---|
| Skill | base15 | longStack | base15 | longStack |
| Mine entry | ||||
| Defeat gnome warrior | ||||
| Defeat gnome archer | ||||
| Eat bat | ||||
| Observation | Design response |
|---|---|
| Some downstream targets are not directly schedulable | Use the graph for downstream value and explicit, separately specified eligibility/frontier rules. |
| Direct deep-floor practice can be restricted | Represent harvested floor progress through procedurally generated, floor-indexed worlds. |
| Difficult tasks can lose selection or parent opportunities | Admit fresh eligible units, mix rank priority with staleness, and adapt task difficulty. |
| Scalar return conceals skill differences | Monitor the original task and report raw held-out skill rates alongside return. |
| Task class | Target | Initialization and dynamics | Candidate qualification |
|---|---|---|---|
| Family L1/L2 | Craft the recipe’s mapped achievement | Harvested signature on its recorded floor; recipe tools/resource support; both base labels have | Usable bank and equipment-chain check; no depth-neighbor gate |
| Depth L1/L2 | Enter floor | Signature from , split by gate-progress bin ; L1 native dynamics, L2 starts at | Bank, neighbor unlock and official-feedback frontier cap |
| Ordinary achievement L0 | One of the 47 non-recipe, non-entry achievements | Signature at its harvested floor; no base surgery/toolkit; | Bank and applicable controller checks |
| Family L4 (official-reset level) | Same twelve recipe achievements | Ordinary native reset; no harvested-state initialization or toolkit; | Requires an official-anchor reading; not eligible for fresh-unit priority |
| Step | Operation |
|---|---|
| 1 | Initialize enumerated units, bank, world pool, per-unit statistics, and session RNG. Perform the 200-update initialization. |
| 2 | For each of 151 sessions, create scheduled task variants; retain units with supply, then apply unlocking, chain, frontier, and retirement rules. |
| 3 | Admit fresh eligible units first; fill the remaining 15-unit capacity by rank/staleness sampling without replacement. Append the original-task anchor. |
| 4 | Assemble curriculum states from harvested signatures and official worlds; apply each unit’s difficulty setting. Reweight and normalize environment shares. |
| 5 | Run 100 PPO updates. Harvest progress and collect conditional unit success and original-task achievement readings. |
| 6 | Update EMA statistics, difficulty, graduation, parking, and regression state; persist the bank/controller and proceed to the next session. |
| Training cohort | GPU | Update 7600 | Update 15300 |
|---|---|---|---|
| Primary AHC | L40S | ||
| Additional AHC | A100 | ||
| Fresh native PPO-GTrXL | RTX A6000 |
| metric | seed 0 | seed 1 | seed 2 | mean sample SD |
|---|---|---|---|---|
| mean return | 46.945 | 47.105 | 46.051 | |
| mean performance (%) | 20.772 | 20.843 | 20.377 | |
| average episode length | 1451.2 | 1583.3 | 1355.3 | |
| enter_gnomish_mines (%) | 28.281 | 27.500 | 23.369 | |
| defeat_gnome_warrior (%) | 21.504 | 21.738 | 17.510 | |
| defeat_gnome_archer (%) | 13.682 | 14.160 | 13.555 |
| Training GPU | Cohort | Seed | Return | Boundary |
|---|---|---|---|---|
| L40S | Primary | 0 | 46.861 | Yes |
| L40S | Primary | 1 | 47.268 | Yes |
| L40S | Primary | 2 | 46.134 | Yes |
| A100 | Additional | 1 | 45.205 | No |
| A100 | Additional | 4 | 47.269 | Yes |
| A100 | Additional | 5 | 44.951 | No |
| Model | Budget (B) | Return | I-18 | Entry | Warrior | W entry |
|---|---|---|---|---|---|---|
| AHC, checkpoint 7600 (L40S) | 0.996 | |||||
| AHC, checkpoint 7600 (A100) | 0.996 | |||||
| Fresh native PPO, update 7600 | 0.996 | 0 | 0 | |||
| Native PPO, update 7000 (guard-on) | 0.918 | |||||
| Native PPO, update 8000 (guard-on) | 1.049 | 0 | 0 | |||
| L40S AHC, checkpoint 15300 | 2.005 |
| Cohort | Total | (25) | (18) | (15) | (9) | Residual |
|---|---|---|---|---|---|---|
| L40S AHC | 4.795 | 1.115 | 3.615 | 0.072 | 0 | |
| A100 AHC | 4.171 | 1.128 | 2.854 | 0.187 | 0 | 0.002 |
| D4-A | 4.196 | 1.046 | 3.038 | 0.116 | 0 | |
| D4-H | 4.512 | 0.527 | 3.955 | 0.021 | 0 | 0.009 |
| D4-AH | 3.230 | 0.696 | 2.508 | 0.021 | 0 | 0.004 |
| Arm | GPU | Return | Lowest | Highest | M4 (%) | O14 (%) |
|---|---|---|---|---|---|---|
| Full AHC, primary | L40S | 46.05 | 47.10 | |||
| D4-A: fixed difficulty | A6000 | 45.22 | 47.45 | |||
| D4-H: no progress init. | A6000 | 44.73 | 47.78 | |||
| D4-AH: joint | A6000 | 42.68 | 48.17 | |||
| Full AHC, additional | A100 | 45.33 | 47.50 |
| Training seed | Elapsed (hh:mm:ss) | Allocated L40S GPU h |
|---|---|---|
| 0 | 17:50:18 | 17.8383 |
| 1 | 17:33:14 | 17.5539 |
| 2 | 17:37:21 | 17.6225 |
| Completed-job total | 53:00:53 | 53.0147 |
Appendix figures & tables26 assets
Supplementary material from the paper’s appendix.
Appendix
| Part | Fields stored | Bounds / assembly |
|---|---|---|
| player_level | Selects floor-indexed pool; variant floors are not overridden. | |
| Full monsters_killed vector | Copy compatible vector prefix; retain per-floor gate progress. | |
| Wood, stone, coal, iron, diamond, sapling; pickaxe and sword tiers | Material caps ; tool tiers copied as recorded. | |
| Four inventory.armour slots | Copy recorded values; no fixed armour grant. | |
| Torches, arrows, ruby, sapphire, bow, books, potion slots | Caps 12 for torches/arrows, 9 for gems, 3 per potion slot; bow/books copied. | |
| Excluded | Map, position, timestep, health/needs, actors, historical achievement bits | Never copy these from the harvested state; derive already-earned achievement flags. |
| Step | Operation |
|---|---|
| 1 | For selected unit , obtain entries from its bank or variant-parent bank. Official-practice units obtain no entries. Skip entries without a signature. |
| 2 | Set ; for D4-H (and D4-AH), replace it by . Set ; variant floors remain unspecified in the resolved configuration. |
| 3 | Draw from the official pool at ; skip if unavailable. Clone . Its map, actors, position, timestep and vitals are not inherited. |
| 4 | Copy each nonempty signature field , preserving engine dtypes. Copy array prefixes; merge variant scalar prefill as , with omitted signature scalars defaulting to zero. |
| 5 | Ensure goal-recipe ore supply, then configured lighting. Apply explicit variant softening, otherwise the unit’s sigma specification. Non-axis units have (native). |
| 6 | Recompute inventory-derived achievement bits; mark entered floors from . Require the goal bit to remain false. Attach and build observation. |
| Task UID | Seed 0 | Seed 1 | Seed 2 |
|---|---|---|---|
| fam:iron_pickaxe|L1|i0 : selected sessions | 24 | 29 | 34 |
| First / last selection | 2 / 144 | 2 / 148 | 2 / 148 |
| depth:f1g8|L2 : selected sessions | 7 | 12 | 32 |
| First / last selection | 2 / 21 | 2 / 23 | 2 / 54 |
| Training seed | Units in export | Variants | Selected | First exit |
|---|---|---|---|---|
| 0 | 191 | 44 | 132 | 82 |
| 1 | 203 | 56 | 145 | 84 |
| 2 | 200 | 53 | 144 | 82 |
| Cohort | Runs | Cases | Retained updates |
|---|---|---|---|
| Primary L40S AHC | 3 | 6 | 7600, 15300 |
| Additional A100 AHC | 3 | 6 | 7600, 15300 |
| Fresh native PPO | 3 | 6 | 7600, 15300 |
| D4-A / D4-H / D4-AH | 3 each | 9 | 15300 |
| Historical guard-stopped PPO | 3 | 9 | 7000, 8000, last accepted endpoint |
| Additional A100 D4-A | 1 | 1 | 15300 |
| Training GPU | Seed | Return | Mine entry | Warrior | Archer | Bat | Remainder |
|---|---|---|---|---|---|---|---|
| L40S | 0 | 46.861 | 28.52 | 22.36 | 14.45 | 18.95 | 44.33 |
| L40S | 1 | 47.268 | 28.03 | 21.78 | 13.28 | 19.73 | 44.78 |
| L40S | 2 | 46.134 | 23.73 | 18.16 | 14.94 | 18.95 | 43.86 |
| A100 | 1 | 45.205 | 21.78 | 0.00 | 0.00 | 0.00 | 44.55 |
| A100 | 4 | 47.269 | 29.00 | 23.54 | 18.07 | 22.36 | 44.48 |
| A100 | 5 | 44.951 | 19.53 | 1.66 | 0.29 | 0.88 | 44.28 |
| System | Training seed | Return | Mine entry | Warrior | Archer | Bat |
|---|---|---|---|---|---|---|
| AHC | 0 | 46.860676 | 28.515625 | 22.363281 | 14.453125 | 18.945312 |
| AHC | 1 | 47.267670 | 28.027344 | 21.777344 | 13.281250 | 19.726562 |
| AHC | 2 | 46.134350 | 23.730469 | 18.164062 | 14.941406 | 18.945312 |
| base15 | 1 | 46.023933 | 24.804688 | 21.093750 | 14.550781 | 20.507812 |
| base15 | 2 | 42.548748 | 13.964844 | 11.523438 | 7.714844 | 10.644531 |
| base15 | 3 | 44.954964 | 21.191406 | 17.382812 | 7.617188 | 14.062500 |
| Model | Seed | Update | Return | SE | I-18 | M4 | O14 | Mine n | W n (%entry) |
|---|---|---|---|---|---|---|---|---|---|
| L40S AHC | 0 | 15300 | 46.945 | 0.189 | 48.70 | 20.62 | 56.72 | 2896 | 2202 (76.0) |
| L40S AHC | 1 | 15300 | 47.105 | 0.190 | 48.67 | 20.79 | 56.64 | 2816 | 2226 (79.0) |
| L40S AHC | 2 | 15300 | 46.051 | 0.198 | 47.17 | 18.16 | 55.46 | 2393 | 1793 (74.9) |
| L40S AHC | 0 | 7600 | 39.924 | 0.187 | 36.92 | 2.52 | 46.74 | 1006 | 10 (1.0) |
| L40S AHC | 1 | 7600 | 40.065 | 0.190 | 36.89 | 1.66 | 46.96 | 666 | 7 (1.1) |
| L40S AHC | 2 | 7600 | 36.078 | 0.237 | 30.70 | 4.54 | 38.18 | 654 | 448 (68.5) |
| Current matched cohorts | |||||||
|---|---|---|---|---|---|---|---|
| Achievement | M4 | L40S AHC 7600 | L40S AHC 15300 | A100 AHC 7600 | A100 AHC 15300 | Fresh PPO 7600 | Fresh PPO 15300 |
| collect_sapphire | 12.22 | 21.07 | 13.46 | 21.62 | 11.10 | 18.23 | |
| collect_ruby | 12.04 | 21.28 | 13.53 | 21.65 | 11.31 | 17.96 | |
| make_diamond_pickaxe | 1.76 | 3.18 | 2.01 | 3.26 | 1.51 | 2.56 | |
| make_diamond_sword | 1.92 | 4.06 | 2.17 | 4.23 | 1.65 | 2.95 | |
| make_iron_armour | 15.71 | 30.98 | 18.25 | 30.33 | 4.33 | 8.02 | |
| Training seed | Update 7600: 996,147,200 transitions | Update 15300: 2,005,401,600 transitions |
|---|---|---|
| 0 | Present; 12 files | Present; 12 files |
| 1 | Present; 12 files | Present; 11 files |
| 2 | Present; 11 files | Present; 11 files |
| Parameter | Value |
|---|---|
| GTrXL layers / attention heads | 2 / 8 |
| Embedding / QKV / hidden width; activation | 256 / 256 / 256; ReLU |
| Transformer gating; gate bias | Enabled; 2.0 |
| Memory / gradient window (steps) | 128 / 64 |
| Task conditioning; action set | 67-dimensional achievement indicator; 43 actions |
| Parallel environments / rollout steps | 1024 / 128 |
| Arm | Difficulty A | Progress H | Task / completion reward | Entropy stop |
|---|---|---|---|---|
| Full AHC | Adaptive | Enabled | Curriculum + native anchor; +20 on curriculum success | 0.15 |
| D4-A | Fixed native dynamics | Enabled | Same task interface | 0.15 |
| D4-H | Adaptive | Neutral floor-zero signature | Same task interface | 0.15 |
| D4-AH | Fixed native dynamics | Neutral floor-zero signature | Same task interface | 0.15 |
| Fresh native PPO | Native dynamics | Native resets | Original task only; native reward | Disabled |
| Seed | Return | Performance (%) | Mean episode length | Training RTX A6000 GPU h |
|---|---|---|---|---|
| 0 | 41.843 | 18.514706 | 1337.300 | 22.4089 |
| 1 | 40.668 | 17.994696 | 1351.456 | 22.9050 |
| 2 | 42.068 | 18.614149 | 1159.646 | 20.8015 |
| Intervention | Seed | Return | Performance (%) | Episode length |
|---|---|---|---|---|
| Fixed difficulty | 0 | 47.812920 | 21.156158 | 1462.630 |
| Fixed difficulty | 1 | 45.908348 | 20.313429 | 1553.788 |
| Fixed difficulty | 2 | 45.132290 | 19.970039 | 1457.445 |
| No progress initialization | 0 | 46.757309 | 20.689075 | 2115.051 |
| No progress initialization | 1 | 44.585232 | 19.727980 | 1216.120 |
| No progress initialization | 2 | 48.070557 | 21.270159 | 1616.744 |
| Training seed | Mine entry | Warrior | Archer | Bat |
|---|---|---|---|---|
| 0 | 22.4 | 0.1 | 0.1 | 0.0 |
| 1 | 41.9 | 36.8 | 29.9 | 36.4 |
| 2 | 34.7 | 26.8 | 15.3 | 25.2 |
| Reported mean | 33.0 | 21.2 | 15.1 | 20.5 |
| Arm | Graph change | Scheduler, gate, and prompt change |
|---|---|---|
| longStack | Original 67-node, 94-edge graph | Prerequisite scheduler; R3 floor clause enabled |
| repairF | Replace mine-entry prerequisite with dungeon entry for warrior, archer, and bat only | Scheduler and R3 use repaired graph; mastered-prerequisite exemption retained; API-reference content differs |
| shufGraph | Fixed double-edge rewiring, seed 20260804; 79 of 94 original edges replaced | Scheduler and R3 use shuffled graph; target identities and scaffold checks both change |
| Surgical | Original graph retained | Only floor-granted achievements removed from R3 scaffold checks; premark/inventory channels and R1/R2 retained |
| Seed | Updates | Valid transitions | Return | Mine entry | Warrior | Archer | Bat |
|---|---|---|---|---|---|---|---|
| 0 | 14600 | 1,913,651,200 | 42.086 | 7.266 | 0 | 0 | 0.029 |
| 1 | 15000 | 1,966,080,000 | 40.249 | 2.275 | 0 | 0 | 0 |
| 2 | 13600 | 1,782,579,200 | 41.867 | 4.648 | 0 | 0.020 | 0.029 |
| System | seed 0 | seed 1 | seed 2 | Mean sample SD |
|---|---|---|---|---|
| AHC (single rollout) | 46.861 | 47.268 | 46.134 | |
| DiCode (collaborator reproduction) | 46.74 | 50.93 | 48.64 |
| configuration | seed | mines | warrior | archer | eat_bat |
|---|---|---|---|---|---|
| shufGraph | s1 | 19.06 | 14.97 | 11.00 | 15.05 |
| s2 | 26.94 | 22.00 | 13.89 | 21.02 | |
| s3 | 26.33 | 21.13 | 13.50 | 19.38 | |
| repairF | s1 | 19.73 | 14.36 | 5.15 | 5.83 |
| s2 | 23.37 | 18.17 | 12.66 | 15.78 | |
| s3 | 29.30 | 24.06 | 18.73 | 22.67 |
| configuration | seed | return | last-ten | mines | warrior | archer | eat_bat |
|---|---|---|---|---|---|---|---|
| shufGraph | s1 | 45.480 | 45.661 | 20.21 | 16.02 | 12.11 | 15.62 |
| s2 | 47.652 | 46.520 | 29.00 | 25.10 | 16.60 | 23.83 | |
| s3 | 47.848 | 47.041 | 29.98 | 24.41 | 15.23 | 22.75 | |
| repairF | s1 | 44.908 | 44.368 | 22.85 | 16.11 | 4.88 | 7.23 |
| s2 | 45.980 | 46.270 | 22.36 | 16.21 | 11.82 | 15.33 | |
| s3 | 48.484 | 47.328 | 33.50 | 27.44 | 21.39 | 26.37 |
| System | Return | Mine entry | Warrior | Archer | Bat |
|---|---|---|---|---|---|
| AHC | |||||
| base15 | |||||
| longStack |
| Model | Budget (B) | LLM | Mask | Return |
|---|---|---|---|---|
| Near 1B transitions | ||||
| PPO-GTrXL (maintainer board) | 1.000 | No | None | 41.36 |
| Near 2B transitions | ||||
| PPO-GTrXL (DiCode report) | 2.000 | No | None | 41.59 |
| DiCode 30B (reported) | 2.000 | Yes | Not audited | |
| DiCode 80B (reported) | 2.000 | Yes | Not audited | |
| Comparison | Difference | Welch 95% interval |
|---|---|---|
| L40S AHC fresh PPO, update 7600 | ||
| A100 AHC fresh PPO, update 7600 | ||
| L40S AHC fresh PPO, update 15300 | ||
| A100 AHC fresh PPO, update 15300 | ||
| D4-A fresh PPO, update 15300 | ||
| D4-H fresh PPO, update 15300 |
Curriculum RL
Curriculum reinforcement learning organizes tasks, examples, or training conditions to help agents learn complex behaviors efficiently.
See all 121 papers