gradlab 0.1.2__tar.gz → 0.2.2__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (350) hide show
  1. {gradlab-0.1.2 → gradlab-0.2.2}/.gitignore +4 -0
  2. {gradlab-0.1.2 → gradlab-0.2.2}/METRICS.md +83 -21
  3. {gradlab-0.1.2 → gradlab-0.2.2}/PKG-INFO +40 -29
  4. {gradlab-0.1.2 → gradlab-0.2.2}/README.md +28 -17
  5. {gradlab-0.1.2 → gradlab-0.2.2}/experiments/goals/Breakout-Atari2600-v0/_goal.yaml +20 -2
  6. gradlab-0.2.2/experiments/goals/Breakout-Atari2600-v0/recipes/ppo-ball-state.yaml +62 -0
  7. gradlab-0.2.2/experiments/goals/Breakout-Atari2600-v0/recipes/ppo-fusion-256.yaml +5 -0
  8. gradlab-0.2.2/experiments/goals/Breakout-Atari2600-v0/recipes/ppo.yaml +26 -0
  9. {gradlab-0.1.2 → gradlab-0.2.2}/experiments/goals/SuperMarioBros-Nes-v0/_goal-family-common.yaml +1 -1
  10. {gradlab-0.1.2 → gradlab-0.2.2}/experiments/goals/VizdoomDeathmatch-v1/recipes/gradoom-ppo.yaml +9 -5
  11. {gradlab-0.1.2 → gradlab-0.2.2}/experiments/goals/_vizdoom-common.yaml +1 -1
  12. gradlab-0.2.2/experiments/goals/_workspaces.yaml +170 -0
  13. {gradlab-0.1.2 → gradlab-0.2.2}/experiments/goals/alepy__mspacman/_goal.yaml +1 -1
  14. gradlab-0.2.2/experiments/recipes/_presets/breakout-ball-state-ablation-ppo.yaml +53 -0
  15. {gradlab-0.1.2 → gradlab-0.2.2}/pyproject.toml +23 -27
  16. {gradlab-0.1.2 → gradlab-0.2.2}/src/gradlab/__init__.py +1 -1
  17. {gradlab-0.1.2 → gradlab-0.2.2}/src/gradlab/action_codecs.py +5 -5
  18. {gradlab-0.1.2 → gradlab-0.2.2}/src/gradlab/action_contract.py +156 -40
  19. gradlab-0.2.2/src/gradlab/action_overrides.py +364 -0
  20. {gradlab-0.1.2 → gradlab-0.2.2}/src/gradlab/action_profiles.py +2 -2
  21. {gradlab-0.1.2 → gradlab-0.2.2}/src/gradlab/batch_runtime.py +37 -15
  22. {gradlab-0.1.2 → gradlab-0.2.2}/src/gradlab/benchmark.py +1 -1
  23. {gradlab-0.1.2 → gradlab-0.2.2}/src/gradlab/benchmark_profiles.py +0 -3
  24. {gradlab-0.1.2 → gradlab-0.2.2}/src/gradlab/callbacks.py +19 -0
  25. {gradlab-0.1.2 → gradlab-0.2.2}/src/gradlab/checkpoint_acceptance.py +2 -4
  26. gradlab-0.2.2/src/gradlab/coordinator_connection.py +255 -0
  27. {gradlab-0.1.2 → gradlab-0.2.2}/src/gradlab/dataset_cli.py +1 -1
  28. {gradlab-0.1.2 → gradlab-0.2.2}/src/gradlab/dataset_providers.py +35 -17
  29. {gradlab-0.1.2 → gradlab-0.2.2}/src/gradlab/env.py +28 -2
  30. {gradlab-0.1.2 → gradlab-0.2.2}/src/gradlab/env_identity.py +50 -5
  31. {gradlab-0.1.2 → gradlab-0.2.2}/src/gradlab/env_metadata.py +4 -4
  32. {gradlab-0.1.2 → gradlab-0.2.2}/src/gradlab/env_providers.py +128 -15
  33. {gradlab-0.1.2 → gradlab-0.2.2}/src/gradlab/env_registry.py +11 -11
  34. {gradlab-0.1.2 → gradlab-0.2.2}/src/gradlab/environment_fields.py +2 -2
  35. {gradlab-0.1.2 → gradlab-0.2.2}/src/gradlab/eval_metrics.py +1 -1
  36. {gradlab-0.1.2 → gradlab-0.2.2}/src/gradlab/experiment_cli.py +227 -30
  37. {gradlab-0.1.2 → gradlab-0.2.2}/src/gradlab/gradoom_device_runtime.py +92 -1
  38. {gradlab-0.1.2 → gradlab-0.2.2}/src/gradlab/lifecycle_certification.py +16 -6
  39. {gradlab-0.1.2 → gradlab-0.2.2}/src/gradlab/local_train.py +1 -1
  40. {gradlab-0.1.2 → gradlab-0.2.2}/src/gradlab/manual_evaluation.py +2 -4
  41. {gradlab-0.1.2 → gradlab-0.2.2}/src/gradlab/metric_names.py +37 -1
  42. gradlab-0.2.2/src/gradlab/modal_app_lifecycle.py +203 -0
  43. {gradlab-0.1.2 → gradlab-0.2.2}/src/gradlab/operator_credentials.py +54 -1
  44. {gradlab-0.1.2 → gradlab-0.2.2}/src/gradlab/play_application.py +16 -0
  45. {gradlab-0.1.2 → gradlab-0.2.2}/src/gradlab/play_catalog.py +143 -11
  46. {gradlab-0.1.2 → gradlab-0.2.2}/src/gradlab/play_debug.py +16 -0
  47. {gradlab-0.1.2 → gradlab-0.2.2}/src/gradlab/play_runtime.py +35 -5
  48. {gradlab-0.1.2 → gradlab-0.2.2}/src/gradlab/play_session.py +66 -6
  49. {gradlab-0.1.2 → gradlab-0.2.2}/src/gradlab/play_web.py +136 -30
  50. {gradlab-0.1.2 → gradlab-0.2.2}/src/gradlab/playback_worker.py +7 -0
  51. {gradlab-0.1.2 → gradlab-0.2.2}/src/gradlab/player_publication.py +1 -1
  52. {gradlab-0.1.2 → gradlab-0.2.2}/src/gradlab/policy_runtime.py +12 -0
  53. {gradlab-0.1.2 → gradlab-0.2.2}/src/gradlab/preprocessing.py +1 -1
  54. {gradlab-0.1.2 → gradlab-0.2.2}/src/gradlab/provider_config.py +1 -1
  55. {gradlab-0.1.2 → gradlab-0.2.2}/src/gradlab/publication.py +1 -1
  56. {gradlab-0.1.2 → gradlab-0.2.2}/src/gradlab/recipe_documents.py +28 -9
  57. {gradlab-0.1.2 → gradlab-0.2.2}/src/gradlab/rom_assets.py +5 -5
  58. {gradlab-0.1.2 → gradlab-0.2.2}/src/gradlab/rom_cli.py +3 -3
  59. {gradlab-0.1.2 → gradlab-0.2.2}/src/gradlab/run_contracts.py +3 -0
  60. {gradlab-0.1.2 → gradlab-0.2.2}/src/gradlab/run_supervisor.py +32 -15
  61. {gradlab-0.1.2 → gradlab-0.2.2}/src/gradlab/runtime_refs.py +123 -2
  62. {gradlab-0.1.2 → gradlab-0.2.2}/src/gradlab/state_archive.py +2 -2
  63. {gradlab-0.1.2 → gradlab-0.2.2}/src/gradlab/task_kernels.py +299 -19
  64. {gradlab-0.1.2 → gradlab-0.2.2}/src/gradlab/training/ppo_engine.py +20 -1
  65. {gradlab-0.1.2 → gradlab-0.2.2}/src/gradlab/training/sb3_on_policy.py +3 -0
  66. {gradlab-0.1.2 → gradlab-0.2.2}/src/gradlab/training_metrics.py +11 -0
  67. {gradlab-0.1.2 → gradlab-0.2.2}/src/gradlab/turbo_api.py +37 -2
  68. {gradlab-0.1.2 → gradlab-0.2.2}/src/gradlab/vizdoom_assets.py +9 -3
  69. {gradlab-0.1.2 → gradlab-0.2.2}/src/gradlab/wandb_publisher.py +9 -0
  70. {gradlab-0.1.2 → gradlab-0.2.2}/src/gradlab/wandb_workspace_declarations.py +129 -8
  71. {gradlab-0.1.2 → gradlab-0.2.2}/src/gradlab/wandb_workspaces.py +2 -0
  72. {gradlab-0.1.2 → gradlab-0.2.2}/src/gradlab/web_player/app.js +141 -159
  73. gradlab-0.2.2/src/gradlab/web_player/event-colors.js +38 -0
  74. {gradlab-0.1.2 → gradlab-0.2.2}/src/gradlab/web_player/index.html +0 -10
  75. {gradlab-0.1.2 → gradlab-0.2.2}/src/gradlab/web_player/panels/README.md +8 -8
  76. {gradlab-0.1.2 → gradlab-0.2.2}/src/gradlab/web_player/panels/attribution.js +1 -1
  77. {gradlab-0.1.2 → gradlab-0.2.2}/src/gradlab/web_player/panels/catalog.js +26 -61
  78. {gradlab-0.1.2 → gradlab-0.2.2}/src/gradlab/web_player/panels/cnn.js +2 -2
  79. gradlab-0.2.2/src/gradlab/web_player/panels/diagnostic-availability.js +26 -0
  80. {gradlab-0.1.2 → gradlab-0.2.2}/src/gradlab/web_player/panels/events.js +12 -2
  81. {gradlab-0.1.2 → gradlab-0.2.2}/src/gradlab/web_player/panels/game.js +128 -33
  82. {gradlab-0.1.2 → gradlab-0.2.2}/src/gradlab/web_player/panels/manager.js +3 -3
  83. {gradlab-0.1.2 → gradlab-0.2.2}/src/gradlab/web_player/panels/observation.js +68 -29
  84. {gradlab-0.1.2 → gradlab-0.2.2}/src/gradlab/web_player/panels/reward-breakdown.js +4 -2
  85. {gradlab-0.1.2 → gradlab-0.2.2}/src/gradlab/web_player/panels/runtime.js +22 -0
  86. {gradlab-0.1.2 → gradlab-0.2.2}/src/gradlab/web_player/panels/telemetry-panel.js +395 -105
  87. {gradlab-0.1.2 → gradlab-0.2.2}/src/gradlab/web_player/panels/telemetry.js +4 -4
  88. {gradlab-0.1.2 → gradlab-0.2.2}/src/gradlab/web_player/panels/workspace.js +58 -33
  89. {gradlab-0.1.2 → gradlab-0.2.2}/src/gradlab/web_player/playback-settings.js +43 -5
  90. gradlab-0.2.2/src/gradlab/web_player/playback-transition.js +8 -0
  91. {gradlab-0.1.2 → gradlab-0.2.2}/src/gradlab/web_player/player-presentation.js +12 -1
  92. {gradlab-0.1.2 → gradlab-0.2.2}/src/gradlab/web_player/sources/browser.js +767 -458
  93. {gradlab-0.1.2 → gradlab-0.2.2}/src/gradlab/web_player/styles.css +673 -396
  94. gradlab-0.2.2/src/gradlab/web_player/synchronized-presentation.js +61 -0
  95. {gradlab-0.1.2 → gradlab-0.2.2}/src/gradlab/web_player/tabler-icons.svg +2 -0
  96. gradlab-0.1.2/experiments/goals/Breakout-Atari2600-v0/recipes/ppo.yaml +0 -5
  97. gradlab-0.1.2/experiments/goals/_workspaces.yaml +0 -86
  98. {gradlab-0.1.2 → gradlab-0.2.2}/LICENSE +0 -0
  99. {gradlab-0.1.2 → gradlab-0.2.2}/THIRD_PARTY_NOTICES.md +0 -0
  100. {gradlab-0.1.2 → gradlab-0.2.2}/experiments/goals/Acrobot-v1/_goal.yaml +0 -0
  101. {gradlab-0.1.2 → gradlab-0.2.2}/experiments/goals/Acrobot-v1/recipes/ppo.yaml +0 -0
  102. {gradlab-0.1.2 → gradlab-0.2.2}/experiments/goals/Blackjack-v1/_goal.yaml +0 -0
  103. {gradlab-0.1.2 → gradlab-0.2.2}/experiments/goals/Blackjack-v1/recipes/ppo.yaml +0 -0
  104. {gradlab-0.1.2 → gradlab-0.2.2}/experiments/goals/Breakout-Atari2600-v0/recipes/go-explore-20m.yaml +0 -0
  105. {gradlab-0.1.2 → gradlab-0.2.2}/experiments/goals/Breakout-Atari2600-v0/recipes/ppo-128x64.yaml +0 -0
  106. {gradlab-0.1.2 → gradlab-0.2.2}/experiments/goals/Breakout-Atari2600-v0/recipes/ppo-archive-curriculum.yaml +0 -0
  107. {gradlab-0.1.2 → gradlab-0.2.2}/experiments/goals/Breakout-Atari2600-v0/recipes/ppo-stable-updates.yaml +0 -0
  108. {gradlab-0.1.2 → gradlab-0.2.2}/experiments/goals/CartPole-v1/_goal.yaml +0 -0
  109. {gradlab-0.1.2 → gradlab-0.2.2}/experiments/goals/CartPole-v1/recipes/ppo.yaml +0 -0
  110. {gradlab-0.1.2 → gradlab-0.2.2}/experiments/goals/CliffWalking-v1/_goal.yaml +0 -0
  111. {gradlab-0.1.2 → gradlab-0.2.2}/experiments/goals/CliffWalking-v1/recipes/ppo.yaml +0 -0
  112. {gradlab-0.1.2 → gradlab-0.2.2}/experiments/goals/CliffWalkingSlippery-v1/_goal.yaml +0 -0
  113. {gradlab-0.1.2 → gradlab-0.2.2}/experiments/goals/CliffWalkingSlippery-v1/recipes/ppo.yaml +0 -0
  114. {gradlab-0.1.2 → gradlab-0.2.2}/experiments/goals/FrozenLake-v1/_goal.yaml +0 -0
  115. {gradlab-0.1.2 → gradlab-0.2.2}/experiments/goals/FrozenLake-v1/recipes/ppo.yaml +0 -0
  116. {gradlab-0.1.2 → gradlab-0.2.2}/experiments/goals/FrozenLake8x8-v1/_goal.yaml +0 -0
  117. {gradlab-0.1.2 → gradlab-0.2.2}/experiments/goals/FrozenLake8x8-v1/recipes/ppo.yaml +0 -0
  118. {gradlab-0.1.2 → gradlab-0.2.2}/experiments/goals/LunarLander-v3/_goal.yaml +0 -0
  119. {gradlab-0.1.2 → gradlab-0.2.2}/experiments/goals/LunarLander-v3/recipes/ppo.yaml +0 -0
  120. {gradlab-0.1.2 → gradlab-0.2.2}/experiments/goals/MountainCar-v0/_goal.yaml +0 -0
  121. {gradlab-0.1.2 → gradlab-0.2.2}/experiments/goals/MountainCar-v0/recipes/ppo.yaml +0 -0
  122. {gradlab-0.1.2 → gradlab-0.2.2}/experiments/goals/SuperMarioBros-Nes-v0/EndToEnd/_goal.yaml +0 -0
  123. {gradlab-0.1.2 → gradlab-0.2.2}/experiments/goals/SuperMarioBros-Nes-v0/EndToEnd/recipes/ppo.yaml +0 -0
  124. {gradlab-0.1.2 → gradlab-0.2.2}/experiments/goals/SuperMarioBros-Nes-v0/Level1-1/_goal.yaml +0 -0
  125. {gradlab-0.1.2 → gradlab-0.2.2}/experiments/goals/SuperMarioBros-Nes-v0/Level1-1/recipes/a2c.yaml +0 -0
  126. {gradlab-0.1.2 → gradlab-0.2.2}/experiments/goals/SuperMarioBros-Nes-v0/Level1-1/recipes/dstack-smoke.yaml +0 -0
  127. {gradlab-0.1.2 → gradlab-0.2.2}/experiments/goals/SuperMarioBros-Nes-v0/Level1-1/recipes/go-explore-20m.yaml +0 -0
  128. {gradlab-0.1.2 → gradlab-0.2.2}/experiments/goals/SuperMarioBros-Nes-v0/Level1-1/recipes/jerk.yaml +0 -0
  129. {gradlab-0.1.2 → gradlab-0.2.2}/experiments/goals/SuperMarioBros-Nes-v0/Level1-1/recipes/ppo.yaml +0 -0
  130. {gradlab-0.1.2 → gradlab-0.2.2}/experiments/goals/SuperMarioBros-Nes-v0/Level1-1/recipes/turbo-demo.yaml +0 -0
  131. {gradlab-0.1.2 → gradlab-0.2.2}/experiments/goals/SuperMarioBros-Nes-v0/Level1-2/_goal.yaml +0 -0
  132. {gradlab-0.1.2 → gradlab-0.2.2}/experiments/goals/SuperMarioBros-Nes-v0/Level1-2/recipes/ppo.yaml +0 -0
  133. {gradlab-0.1.2 → gradlab-0.2.2}/experiments/goals/SuperMarioBros-Nes-v0/Level1-3/_goal.yaml +0 -0
  134. {gradlab-0.1.2 → gradlab-0.2.2}/experiments/goals/SuperMarioBros-Nes-v0/Level1-3/recipes/ppo-train-clear-100.yaml +0 -0
  135. {gradlab-0.1.2 → gradlab-0.2.2}/experiments/goals/SuperMarioBros-Nes-v0/Level1-3/recipes/ppo.yaml +0 -0
  136. {gradlab-0.1.2 → gradlab-0.2.2}/experiments/goals/SuperMarioBros-Nes-v0/Level1-4/_goal.yaml +0 -0
  137. {gradlab-0.1.2 → gradlab-0.2.2}/experiments/goals/SuperMarioBros-Nes-v0/Level1-4/recipes/ppo-l14-soft-update.yaml +0 -0
  138. {gradlab-0.1.2 → gradlab-0.2.2}/experiments/goals/SuperMarioBros-Nes-v0/Level2-1/_goal.yaml +0 -0
  139. {gradlab-0.1.2 → gradlab-0.2.2}/experiments/goals/SuperMarioBros-Nes-v0/Level2-1/recipes/ppo.yaml +0 -0
  140. {gradlab-0.1.2 → gradlab-0.2.2}/experiments/goals/SuperMarioBros-Nes-v0/Level2-2/_goal.yaml +0 -0
  141. {gradlab-0.1.2 → gradlab-0.2.2}/experiments/goals/SuperMarioBros-Nes-v0/Level2-2/recipes/ppo.yaml +0 -0
  142. {gradlab-0.1.2 → gradlab-0.2.2}/experiments/goals/SuperMarioBros-Nes-v0/Level2-3/_goal.yaml +0 -0
  143. {gradlab-0.1.2 → gradlab-0.2.2}/experiments/goals/SuperMarioBros-Nes-v0/Level2-3/recipes/ppo.yaml +0 -0
  144. {gradlab-0.1.2 → gradlab-0.2.2}/experiments/goals/SuperMarioBros-Nes-v0/Level2-4/_goal.yaml +0 -0
  145. {gradlab-0.1.2 → gradlab-0.2.2}/experiments/goals/SuperMarioBros-Nes-v0/Level2-4/recipes/ppo.yaml +0 -0
  146. {gradlab-0.1.2 → gradlab-0.2.2}/experiments/goals/SuperMarioBros-Nes-v0/Level3-1/_goal.yaml +0 -0
  147. {gradlab-0.1.2 → gradlab-0.2.2}/experiments/goals/SuperMarioBros-Nes-v0/Level3-1/recipes/ppo.yaml +0 -0
  148. {gradlab-0.1.2 → gradlab-0.2.2}/experiments/goals/SuperMarioBros-Nes-v0/Level3-2/_goal.yaml +0 -0
  149. {gradlab-0.1.2 → gradlab-0.2.2}/experiments/goals/SuperMarioBros-Nes-v0/Level3-2/recipes/ppo.yaml +0 -0
  150. {gradlab-0.1.2 → gradlab-0.2.2}/experiments/goals/SuperMarioBros-Nes-v0/Level3-3/_goal.yaml +0 -0
  151. {gradlab-0.1.2 → gradlab-0.2.2}/experiments/goals/SuperMarioBros-Nes-v0/Level3-3/recipes/ppo.yaml +0 -0
  152. {gradlab-0.1.2 → gradlab-0.2.2}/experiments/goals/SuperMarioBros-Nes-v0/Level3-4/_goal.yaml +0 -0
  153. {gradlab-0.1.2 → gradlab-0.2.2}/experiments/goals/SuperMarioBros-Nes-v0/Level3-4/recipes/ppo.yaml +0 -0
  154. {gradlab-0.1.2 → gradlab-0.2.2}/experiments/goals/SuperMarioBros-Nes-v0/Level4-1/_goal.yaml +0 -0
  155. {gradlab-0.1.2 → gradlab-0.2.2}/experiments/goals/SuperMarioBros-Nes-v0/Level4-1/recipes/ppo.yaml +0 -0
  156. {gradlab-0.1.2 → gradlab-0.2.2}/experiments/goals/SuperMarioBros-Nes-v0/Level4-2/_goal.yaml +0 -0
  157. {gradlab-0.1.2 → gradlab-0.2.2}/experiments/goals/SuperMarioBros-Nes-v0/Level4-2/recipes/ppo.yaml +0 -0
  158. {gradlab-0.1.2 → gradlab-0.2.2}/experiments/goals/SuperMarioBros-Nes-v0/Level4-3/_goal.yaml +0 -0
  159. {gradlab-0.1.2 → gradlab-0.2.2}/experiments/goals/SuperMarioBros-Nes-v0/Level4-3/recipes/ppo.yaml +0 -0
  160. {gradlab-0.1.2 → gradlab-0.2.2}/experiments/goals/SuperMarioBros-Nes-v0/Level4-4/_goal.yaml +0 -0
  161. {gradlab-0.1.2 → gradlab-0.2.2}/experiments/goals/SuperMarioBros-Nes-v0/Level4-4/recipes/ppo.yaml +0 -0
  162. {gradlab-0.1.2 → gradlab-0.2.2}/experiments/goals/SuperMarioBros-Nes-v0/Levels_1-1_1-2/_goal.yaml +0 -0
  163. {gradlab-0.1.2 → gradlab-0.2.2}/experiments/goals/SuperMarioBros-Nes-v0/Levels_1-1_1-2/recipes/ppo.yaml +0 -0
  164. {gradlab-0.1.2 → gradlab-0.2.2}/experiments/goals/SuperMarioBros-Nes-v0/Levels_1-1_1-2/recipes/raw-advantage.yaml +0 -0
  165. {gradlab-0.1.2 → gradlab-0.2.2}/experiments/goals/SuperMarioBros-Nes-v0/_goal-common.yaml +0 -0
  166. {gradlab-0.1.2 → gradlab-0.2.2}/experiments/goals/SuperMarioBros-Nes-v0/_reports.yaml +0 -0
  167. {gradlab-0.1.2 → gradlab-0.2.2}/experiments/goals/SuperMarioBros-Nes-v0/_reward-shapes-common.yaml +0 -0
  168. {gradlab-0.1.2 → gradlab-0.2.2}/experiments/goals/Taxi-v3/_goal.yaml +0 -0
  169. {gradlab-0.1.2 → gradlab-0.2.2}/experiments/goals/Taxi-v3/recipes/ppo.yaml +0 -0
  170. {gradlab-0.1.2 → gradlab-0.2.2}/experiments/goals/VizdoomBasic-Plus-v1/_goal.yaml +0 -0
  171. {gradlab-0.1.2 → gradlab-0.2.2}/experiments/goals/VizdoomBasic-Plus-v1/recipes/ppo.yaml +0 -0
  172. {gradlab-0.1.2 → gradlab-0.2.2}/experiments/goals/VizdoomBasic-v1/_goal.yaml +0 -0
  173. {gradlab-0.1.2 → gradlab-0.2.2}/experiments/goals/VizdoomBasic-v1/recipes/ppo.yaml +0 -0
  174. {gradlab-0.1.2 → gradlab-0.2.2}/experiments/goals/VizdoomDeadlyCorridor-v1/_goal.yaml +0 -0
  175. {gradlab-0.1.2 → gradlab-0.2.2}/experiments/goals/VizdoomDeadlyCorridor-v1/recipes/ppo.yaml +0 -0
  176. {gradlab-0.1.2 → gradlab-0.2.2}/experiments/goals/VizdoomDeathmatch-v1/_goal.yaml +0 -0
  177. {gradlab-0.1.2 → gradlab-0.2.2}/experiments/goals/VizdoomDeathmatch-v1/recipes/ppo.yaml +0 -0
  178. {gradlab-0.1.2 → gradlab-0.2.2}/experiments/goals/VizdoomDefendCenter-v1/_goal.yaml +0 -0
  179. {gradlab-0.1.2 → gradlab-0.2.2}/experiments/goals/VizdoomDefendCenter-v1/recipes/ppo.yaml +0 -0
  180. {gradlab-0.1.2 → gradlab-0.2.2}/experiments/goals/VizdoomDefendLine-Plus-v1/_goal.yaml +0 -0
  181. {gradlab-0.1.2 → gradlab-0.2.2}/experiments/goals/VizdoomDefendLine-Plus-v1/recipes/ppo.yaml +0 -0
  182. {gradlab-0.1.2 → gradlab-0.2.2}/experiments/goals/VizdoomDefendLine-v1/_goal.yaml +0 -0
  183. {gradlab-0.1.2 → gradlab-0.2.2}/experiments/goals/VizdoomDefendLine-v1/recipes/ppo.yaml +0 -0
  184. {gradlab-0.1.2 → gradlab-0.2.2}/experiments/goals/VizdoomHealthGathering-Plus-v1/_goal.yaml +0 -0
  185. {gradlab-0.1.2 → gradlab-0.2.2}/experiments/goals/VizdoomHealthGathering-Plus-v1/recipes/ppo.yaml +0 -0
  186. {gradlab-0.1.2 → gradlab-0.2.2}/experiments/goals/VizdoomHealthGathering-v1/_goal.yaml +0 -0
  187. {gradlab-0.1.2 → gradlab-0.2.2}/experiments/goals/VizdoomHealthGathering-v1/recipes/ppo.yaml +0 -0
  188. {gradlab-0.1.2 → gradlab-0.2.2}/experiments/goals/VizdoomHealthGatheringSupreme-v1/_goal.yaml +0 -0
  189. {gradlab-0.1.2 → gradlab-0.2.2}/experiments/goals/VizdoomHealthGatheringSupreme-v1/recipes/ppo.yaml +0 -0
  190. {gradlab-0.1.2 → gradlab-0.2.2}/experiments/goals/VizdoomMyWayHome-v1/_goal.yaml +0 -0
  191. {gradlab-0.1.2 → gradlab-0.2.2}/experiments/goals/VizdoomMyWayHome-v1/recipes/ppo-cell-novelty.yaml +0 -0
  192. {gradlab-0.1.2 → gradlab-0.2.2}/experiments/goals/VizdoomMyWayHome-v1/recipes/ppo.yaml +0 -0
  193. {gradlab-0.1.2 → gradlab-0.2.2}/experiments/goals/VizdoomPredictPosition-v1/_goal.yaml +0 -0
  194. {gradlab-0.1.2 → gradlab-0.2.2}/experiments/goals/VizdoomPredictPosition-v1/recipes/ppo.yaml +0 -0
  195. {gradlab-0.1.2 → gradlab-0.2.2}/experiments/goals/VizdoomTakeCover-v1/_goal.yaml +0 -0
  196. {gradlab-0.1.2 → gradlab-0.2.2}/experiments/goals/VizdoomTakeCover-v1/recipes/ppo.yaml +0 -0
  197. {gradlab-0.1.2 → gradlab-0.2.2}/experiments/goals/_catalog.yaml +0 -0
  198. {gradlab-0.1.2 → gradlab-0.2.2}/experiments/goals/_gymnasium-classic-control-common.yaml +0 -0
  199. {gradlab-0.1.2 → gradlab-0.2.2}/experiments/goals/_gymnasium-discrete-common.yaml +0 -0
  200. {gradlab-0.1.2 → gradlab-0.2.2}/experiments/goals/alepy__mspacman/recipes/ppo.yaml +0 -0
  201. {gradlab-0.1.2 → gradlab-0.2.2}/experiments/goals/gradlab__bandit/_goal.yaml +0 -0
  202. {gradlab-0.1.2 → gradlab-0.2.2}/experiments/goals/gradlab__bandit/recipes/ppo.yaml +0 -0
  203. {gradlab-0.1.2 → gradlab-0.2.2}/experiments/recipes/_presets/atari-ppo.yaml +0 -0
  204. {gradlab-0.1.2 → gradlab-0.2.2}/experiments/recipes/_presets/breakout-high-throughput-ppo.yaml +0 -0
  205. {gradlab-0.1.2 → gradlab-0.2.2}/experiments/recipes/_presets/classic-control-ppo.yaml +0 -0
  206. {gradlab-0.1.2 → gradlab-0.2.2}/experiments/recipes/_presets/gymnasium-discrete-ppo.yaml +0 -0
  207. {gradlab-0.1.2 → gradlab-0.2.2}/experiments/recipes/_presets/mario-mixed-ppo.yaml +0 -0
  208. {gradlab-0.1.2 → gradlab-0.2.2}/experiments/recipes/_presets/mario-single-on-policy.yaml +0 -0
  209. {gradlab-0.1.2 → gradlab-0.2.2}/experiments/recipes/_presets/mario-single-ppo.yaml +0 -0
  210. {gradlab-0.1.2 → gradlab-0.2.2}/experiments/recipes/_presets/vizdoom-basic-ppo.yaml +0 -0
  211. {gradlab-0.1.2 → gradlab-0.2.2}/experiments/recipes/_presets/vizdoom-defend-line-ppo.yaml +0 -0
  212. {gradlab-0.1.2 → gradlab-0.2.2}/experiments/recipes/_presets/vizdoom-health-gathering-ppo.yaml +0 -0
  213. {gradlab-0.1.2 → gradlab-0.2.2}/src/gradlab/action_distributions.py +0 -0
  214. {gradlab-0.1.2 → gradlab-0.2.2}/src/gradlab/action_program.py +0 -0
  215. {gradlab-0.1.2 → gradlab-0.2.2}/src/gradlab/actor_critic_policy.py +0 -0
  216. {gradlab-0.1.2 → gradlab-0.2.2}/src/gradlab/artifacts.py +0 -0
  217. {gradlab-0.1.2 → gradlab-0.2.2}/src/gradlab/bandit_env.py +0 -0
  218. {gradlab-0.1.2 → gradlab-0.2.2}/src/gradlab/boundary_schema.py +0 -0
  219. {gradlab-0.1.2 → gradlab-0.2.2}/src/gradlab/catalog_errors.py +0 -0
  220. {gradlab-0.1.2 → gradlab-0.2.2}/src/gradlab/catalog_jobs.py +0 -0
  221. {gradlab-0.1.2 → gradlab-0.2.2}/src/gradlab/cell_graph.py +0 -0
  222. {gradlab-0.1.2 → gradlab-0.2.2}/src/gradlab/checkpoint_contract.py +0 -0
  223. {gradlab-0.1.2 → gradlab-0.2.2}/src/gradlab/cli_args.py +0 -0
  224. {gradlab-0.1.2 → gradlab-0.2.2}/src/gradlab/cli_parser.py +0 -0
  225. {gradlab-0.1.2 → gradlab-0.2.2}/src/gradlab/clock.py +0 -0
  226. {gradlab-0.1.2 → gradlab-0.2.2}/src/gradlab/config_loader.py +0 -0
  227. {gradlab-0.1.2 → gradlab-0.2.2}/src/gradlab/config_validation.py +0 -0
  228. {gradlab-0.1.2 → gradlab-0.2.2}/src/gradlab/contract_inspection.py +0 -0
  229. {gradlab-0.1.2 → gradlab-0.2.2}/src/gradlab/contract_versions.py +0 -0
  230. {gradlab-0.1.2 → gradlab-0.2.2}/src/gradlab/dataset_contract.py +0 -0
  231. {gradlab-0.1.2 → gradlab-0.2.2}/src/gradlab/dataset_hub.py +0 -0
  232. {gradlab-0.1.2 → gradlab-0.2.2}/src/gradlab/dataset_media.py +0 -0
  233. {gradlab-0.1.2 → gradlab-0.2.2}/src/gradlab/dataset_minari.py +0 -0
  234. {gradlab-0.1.2 → gradlab-0.2.2}/src/gradlab/dataset_record.py +0 -0
  235. {gradlab-0.1.2 → gradlab-0.2.2}/src/gradlab/dataset_store.py +0 -0
  236. {gradlab-0.1.2 → gradlab-0.2.2}/src/gradlab/device.py +0 -0
  237. {gradlab-0.1.2 → gradlab-0.2.2}/src/gradlab/dotenv.py +0 -0
  238. {gradlab-0.1.2 → gradlab-0.2.2}/src/gradlab/dstack_backend.py +0 -0
  239. {gradlab-0.1.2 → gradlab-0.2.2}/src/gradlab/early_stop.py +0 -0
  240. {gradlab-0.1.2 → gradlab-0.2.2}/src/gradlab/env_cli.py +0 -0
  241. {gradlab-0.1.2 → gradlab-0.2.2}/src/gradlab/env_config.py +0 -0
  242. {gradlab-0.1.2 → gradlab-0.2.2}/src/gradlab/eval.py +0 -0
  243. {gradlab-0.1.2 → gradlab-0.2.2}/src/gradlab/eval_backend.py +0 -0
  244. {gradlab-0.1.2 → gradlab-0.2.2}/src/gradlab/eval_runner.py +0 -0
  245. {gradlab-0.1.2 → gradlab-0.2.2}/src/gradlab/evaluation_attempts.py +0 -0
  246. {gradlab-0.1.2 → gradlab-0.2.2}/src/gradlab/evaluation_fence.py +0 -0
  247. {gradlab-0.1.2 → gradlab-0.2.2}/src/gradlab/evaluation_projection.py +0 -0
  248. {gradlab-0.1.2 → gradlab-0.2.2}/src/gradlab/experiment_contracts.py +0 -0
  249. {gradlab-0.1.2 → gradlab-0.2.2}/src/gradlab/file_utils.py +0 -0
  250. {gradlab-0.1.2 → gradlab-0.2.2}/src/gradlab/go_explore.py +0 -0
  251. {gradlab-0.1.2 → gradlab-0.2.2}/src/gradlab/goal_catalog.py +0 -0
  252. {gradlab-0.1.2 → gradlab-0.2.2}/src/gradlab/goal_catalog_projection.py +0 -0
  253. {gradlab-0.1.2 → gradlab-0.2.2}/src/gradlab/goal_schema.py +0 -0
  254. {gradlab-0.1.2 → gradlab-0.2.2}/src/gradlab/goal_variants.py +0 -0
  255. {gradlab-0.1.2 → gradlab-0.2.2}/src/gradlab/gymnasium_vec_env.py +0 -0
  256. {gradlab-0.1.2 → gradlab-0.2.2}/src/gradlab/jerk.py +0 -0
  257. {gradlab-0.1.2 → gradlab-0.2.2}/src/gradlab/job_queue.py +0 -0
  258. {gradlab-0.1.2 → gradlab-0.2.2}/src/gradlab/jobs_cli.py +0 -0
  259. {gradlab-0.1.2 → gradlab-0.2.2}/src/gradlab/json_utils.py +0 -0
  260. {gradlab-0.1.2 → gradlab-0.2.2}/src/gradlab/local_paths.py +0 -0
  261. {gradlab-0.1.2 → gradlab-0.2.2}/src/gradlab/main.py +0 -0
  262. {gradlab-0.1.2 → gradlab-0.2.2}/src/gradlab/metric_store.py +0 -0
  263. {gradlab-0.1.2 → gradlab-0.2.2}/src/gradlab/modal_app.py +0 -0
  264. {gradlab-0.1.2 → gradlab-0.2.2}/src/gradlab/modal_eval_backend.py +0 -0
  265. {gradlab-0.1.2 → gradlab-0.2.2}/src/gradlab/modal_eval_config.py +0 -0
  266. {gradlab-0.1.2 → gradlab-0.2.2}/src/gradlab/modal_eval_protocol.py +0 -0
  267. {gradlab-0.1.2 → gradlab-0.2.2}/src/gradlab/modal_eval_storage.py +0 -0
  268. {gradlab-0.1.2 → gradlab-0.2.2}/src/gradlab/modal_eval_worker.py +0 -0
  269. {gradlab-0.1.2 → gradlab-0.2.2}/src/gradlab/model_inputs.py +0 -0
  270. {gradlab-0.1.2 → gradlab-0.2.2}/src/gradlab/model_sources.py +0 -0
  271. {gradlab-0.1.2 → gradlab-0.2.2}/src/gradlab/operator_environment.py +0 -0
  272. {gradlab-0.1.2 → gradlab-0.2.2}/src/gradlab/play.py +0 -0
  273. {gradlab-0.1.2 → gradlab-0.2.2}/src/gradlab/play_attribution.py +0 -0
  274. {gradlab-0.1.2 → gradlab-0.2.2}/src/gradlab/play_capture.py +0 -0
  275. {gradlab-0.1.2 → gradlab-0.2.2}/src/gradlab/play_catalog_authority.py +0 -0
  276. {gradlab-0.1.2 → gradlab-0.2.2}/src/gradlab/play_cnn.py +0 -0
  277. {gradlab-0.1.2 → gradlab-0.2.2}/src/gradlab/play_processing.py +0 -0
  278. {gradlab-0.1.2 → gradlab-0.2.2}/src/gradlab/play_termination.py +0 -0
  279. {gradlab-0.1.2 → gradlab-0.2.2}/src/gradlab/policy_bundle.py +0 -0
  280. {gradlab-0.1.2 → gradlab-0.2.2}/src/gradlab/policy_execution.py +0 -0
  281. {gradlab-0.1.2 → gradlab-0.2.2}/src/gradlab/policy_model_config.py +0 -0
  282. {gradlab-0.1.2 → gradlab-0.2.2}/src/gradlab/policy_models.py +0 -0
  283. {gradlab-0.1.2 → gradlab-0.2.2}/src/gradlab/policy_observation.py +0 -0
  284. {gradlab-0.1.2 → gradlab-0.2.2}/src/gradlab/policy_registry.py +0 -0
  285. {gradlab-0.1.2 → gradlab-0.2.2}/src/gradlab/ppo.py +0 -0
  286. {gradlab-0.1.2 → gradlab-0.2.2}/src/gradlab/provider_data/stable_retro/Breakout-Atari2600-v0/data.json +0 -0
  287. {gradlab-0.1.2 → gradlab-0.2.2}/src/gradlab/publication_credentials.py +0 -0
  288. {gradlab-0.1.2 → gradlab-0.2.2}/src/gradlab/publication_evidence.py +0 -0
  289. {gradlab-0.1.2 → gradlab-0.2.2}/src/gradlab/publication_jobs.py +0 -0
  290. {gradlab-0.1.2 → gradlab-0.2.2}/src/gradlab/r2_store.py +0 -0
  291. {gradlab-0.1.2 → gradlab-0.2.2}/src/gradlab/ranking.py +0 -0
  292. {gradlab-0.1.2 → gradlab-0.2.2}/src/gradlab/recipe_catalog.py +0 -0
  293. {gradlab-0.1.2 → gradlab-0.2.2}/src/gradlab/recipe_schema.py +0 -0
  294. {gradlab-0.1.2 → gradlab-0.2.2}/src/gradlab/recipe_variants.py +0 -0
  295. {gradlab-0.1.2 → gradlab-0.2.2}/src/gradlab/reward_programs.py +0 -0
  296. {gradlab-0.1.2 → gradlab-0.2.2}/src/gradlab/reward_transform.py +0 -0
  297. {gradlab-0.1.2 → gradlab-0.2.2}/src/gradlab/rom_runtime.py +0 -0
  298. {gradlab-0.1.2 → gradlab-0.2.2}/src/gradlab/routed_policy.py +0 -0
  299. {gradlab-0.1.2 → gradlab-0.2.2}/src/gradlab/run_authority.py +0 -0
  300. {gradlab-0.1.2 → gradlab-0.2.2}/src/gradlab/runtime_contract.py +0 -0
  301. {gradlab-0.1.2 → gradlab-0.2.2}/src/gradlab/sb3_models.py +0 -0
  302. {gradlab-0.1.2 → gradlab-0.2.2}/src/gradlab/schedules.py +0 -0
  303. {gradlab-0.1.2 → gradlab-0.2.2}/src/gradlab/seeds.py +0 -0
  304. {gradlab-0.1.2 → gradlab-0.2.2}/src/gradlab/supervision_fault_learner.py +0 -0
  305. {gradlab-0.1.2 → gradlab-0.2.2}/src/gradlab/supervisor_ledger.py +0 -0
  306. {gradlab-0.1.2 → gradlab-0.2.2}/src/gradlab/supervisor_runtime.py +0 -0
  307. {gradlab-0.1.2 → gradlab-0.2.2}/src/gradlab/task_advantage.py +0 -0
  308. {gradlab-0.1.2 → gradlab-0.2.2}/src/gradlab/templates/model_card_v3.md.j2 +0 -0
  309. {gradlab-0.1.2 → gradlab-0.2.2}/src/gradlab/templates/model_card_v4.md.j2 +0 -0
  310. {gradlab-0.1.2 → gradlab-0.2.2}/src/gradlab/train.py +0 -0
  311. {gradlab-0.1.2 → gradlab-0.2.2}/src/gradlab/train_config.py +0 -0
  312. {gradlab-0.1.2 → gradlab-0.2.2}/src/gradlab/training/__init__.py +0 -0
  313. {gradlab-0.1.2 → gradlab-0.2.2}/src/gradlab/training/go_explore.py +0 -0
  314. {gradlab-0.1.2 → gradlab-0.2.2}/src/gradlab/training/jerk.py +0 -0
  315. {gradlab-0.1.2 → gradlab-0.2.2}/src/gradlab/training/ppo.py +0 -0
  316. {gradlab-0.1.2 → gradlab-0.2.2}/src/gradlab/training/sb3.py +0 -0
  317. {gradlab-0.1.2 → gradlab-0.2.2}/src/gradlab/training/sb3_helpers.py +0 -0
  318. {gradlab-0.1.2 → gradlab-0.2.2}/src/gradlab/training/sb3_vec_env.py +0 -0
  319. {gradlab-0.1.2 → gradlab-0.2.2}/src/gradlab/training_backend.py +0 -0
  320. {gradlab-0.1.2 → gradlab-0.2.2}/src/gradlab/training_lifecycle.py +0 -0
  321. {gradlab-0.1.2 → gradlab-0.2.2}/src/gradlab/training_tui.py +0 -0
  322. {gradlab-0.1.2 → gradlab-0.2.2}/src/gradlab/training_tui.tcss +0 -0
  323. {gradlab-0.1.2 → gradlab-0.2.2}/src/gradlab/trusted_inputs.py +0 -0
  324. {gradlab-0.1.2 → gradlab-0.2.2}/src/gradlab/validation.py +0 -0
  325. {gradlab-0.1.2 → gradlab-0.2.2}/src/gradlab/video.py +0 -0
  326. {gradlab-0.1.2 → gradlab-0.2.2}/src/gradlab/wandb_leaders.py +0 -0
  327. {gradlab-0.1.2 → gradlab-0.2.2}/src/gradlab/wandb_reports.py +0 -0
  328. {gradlab-0.1.2 → gradlab-0.2.2}/src/gradlab/wandb_utils.py +0 -0
  329. {gradlab-0.1.2 → gradlab-0.2.2}/src/gradlab/web_player/documents/diff.js +0 -0
  330. {gradlab-0.1.2 → gradlab-0.2.2}/src/gradlab/web_player/documents/syntax.js +0 -0
  331. {gradlab-0.1.2 → gradlab-0.2.2}/src/gradlab/web_player/documents/viewer.js +0 -0
  332. {gradlab-0.1.2 → gradlab-0.2.2}/src/gradlab/web_player/episode-report.js +0 -0
  333. {gradlab-0.1.2 → gradlab-0.2.2}/src/gradlab/web_player/favicon.svg +0 -0
  334. {gradlab-0.1.2 → gradlab-0.2.2}/src/gradlab/web_player/fonts/ChivoVariable.woff2 +0 -0
  335. {gradlab-0.1.2 → gradlab-0.2.2}/src/gradlab/web_player/fonts/InterVariable-Italic.woff2 +0 -0
  336. {gradlab-0.1.2 → gradlab-0.2.2}/src/gradlab/web_player/fonts/InterVariable.woff2 +0 -0
  337. {gradlab-0.1.2 → gradlab-0.2.2}/src/gradlab/web_player/fonts/JetBrainsMonoVariable-Italic.woff2 +0 -0
  338. {gradlab-0.1.2 → gradlab-0.2.2}/src/gradlab/web_player/fonts/JetBrainsMonoVariable.woff2 +0 -0
  339. {gradlab-0.1.2 → gradlab-0.2.2}/src/gradlab/web_player/oauth_complete.html +0 -0
  340. {gradlab-0.1.2 → gradlab-0.2.2}/src/gradlab/web_player/oauth_complete.js +0 -0
  341. {gradlab-0.1.2 → gradlab-0.2.2}/src/gradlab/web_player/panels/action-contract.js +0 -0
  342. {gradlab-0.1.2 → gradlab-0.2.2}/src/gradlab/web_player/panels/controls.js +0 -0
  343. {gradlab-0.1.2 → gradlab-0.2.2}/src/gradlab/web_player/panels/diagnostic-overlays.js +0 -0
  344. {gradlab-0.1.2 → gradlab-0.2.2}/src/gradlab/web_player/panels/layout-sizing.js +0 -0
  345. {gradlab-0.1.2 → gradlab-0.2.2}/src/gradlab/web_player/panels/raw.js +0 -0
  346. {gradlab-0.1.2 → gradlab-0.2.2}/src/gradlab/web_player/panels/shared.js +0 -0
  347. {gradlab-0.1.2 → gradlab-0.2.2}/src/gradlab/web_player/tabler-chevron-down.svg +0 -0
  348. {gradlab-0.1.2 → gradlab-0.2.2}/src/gradlab/web_player/vendor/gridstack/gridstack-all.js +0 -0
  349. {gradlab-0.1.2 → gradlab-0.2.2}/src/gradlab/web_player/vendor/gridstack/gridstack.min.css +0 -0
  350. {gradlab-0.1.2 → gradlab-0.2.2}/src/gradlab/youtube_publication.py +0 -0
@@ -3,6 +3,10 @@ __pycache__/
3
3
  *.py[cod]
4
4
  *$py.class
5
5
 
6
+ output/
7
+ tmp/
8
+ docs/research/
9
+
6
10
  # Virtual environments and local package managers
7
11
  .venv/
8
12
  .venv*/
@@ -1,8 +1,15 @@
1
- # Metrics schema v19
1
+ # Metrics schema v20
2
2
 
3
3
  This file is the source of truth for gradlab telemetry. The Python registry loads the table below
4
4
  and requires every emitted metric to match an exact registry entry or a bounded template.
5
5
 
6
+ `Training Success` is a provisional Run classification produced by a Research Goal's declared
7
+ threshold over training-time metrics. It is a cheap proxy used to classify and compare Runs; it
8
+ does not establish that a Research Goal is solved. `Acceptance` is the separate determination from
9
+ an Evaluated Goal's stricter checkpoint evaluation on seeds different from the training seeds.
10
+ Only Acceptance can authorize Promotion, and neither metric delivery nor its W&B projection is the
11
+ authority for that decision.
12
+
6
13
  ## Surfaces and dimensions
7
14
 
8
15
  - W&B is the authoritative scientific metric surface. One supervisor process inside the training
@@ -28,7 +35,7 @@ and requires every emitted metric to match an exact registry entry or a bounded
28
35
  `checkpoint_eval_contract`; the catalog must validate that expected absence against the immutable
29
36
  recipe and W&B run dimensions without suppressing otherwise compatible training-proxy history.
30
37
  Full-evaluation columns remain unavailable until verified checkpoint-evaluation evidence exists.
31
- - W&B config contains run-defining dimensions: `metrics_schema_version: 19`,
38
+ - W&B config contains run-defining dimensions: `metrics_schema_version: 20`,
32
39
  `metrics_episode_window_size: 100`, `training_backend_id`,
33
40
  `training_backend_config_hash`, `algorithm_id`, goal,
34
41
  environment, starts, seed, frame skip, environment count, hyperparameters, eval protocol, and
@@ -36,9 +43,13 @@ and requires every emitted metric to match an exact registry entry or a bounded
36
43
  `dstack_coordinator_id`, `dstack_project`, `dstack_task`, and `attempt_id`; these are immutable
37
44
  run/attempt dimensions, not scientific metrics.
38
45
  - `experiments/goals/_workspaces.yaml` is the presentation source for managed W&B project
39
- workspace views. It selects registered metrics without emitting aliases or changing their
40
- scientific axes or semantics; every project resolved from an active checked-in goal inherits its
41
- default profile unless the declaration assigns a complete project-specific profile.
46
+ workspace views. It selects registered metrics and derives each panel title from its exact metric
47
+ selectors without emitting aliases or changing their scientific axes or semantics; every project
48
+ resolved from an active checked-in goal inherits its default profile unless the declaration
49
+ assigns a complete project-specific profile. Project overrides omit panels or individual metric
50
+ selectors that do not apply to that project's active goals and recipes rather than rendering
51
+ empty placeholders. A managed line panel contains one distinct measure; only mutually exclusive
52
+ algorithm-specific variants of that same measure share a panel.
42
53
  - `goal_contract_sha256` is the semantic SHA-256 of the fully composed, rendered, validated goal
43
54
  contract. Generated goal reports use it with `goal_slug` to keep current-contract leaderboards
44
55
  comparable; noncurrent contracts are not queried or rendered.
@@ -64,10 +75,12 @@ and requires every emitted metric to match an exact registry entry or a bounded
64
75
  or its bounded in-browser history, are not emitted metrics, and must not be interpreted as aliases
65
76
  for similarly named W&B registry entries. `reward/provider` is the provider output before the
66
77
  task program and gradlab-owned reward transform; `reward/shaped` is the final policy-facing reward
67
- after task shaping, scaling, and clipping. Playback computes realized return-to-go and `V(s) -
68
- G(s)` only for a terminal, stochastic, policy-driven trajectory whose policy environment,
69
- reward stream, discount, action sampling, and boundary/bootstrap semantics match training.
70
- Otherwise those critic diagnostics are explicitly unavailable rather than numerically compared.
78
+ after task shaping, scaling, and clipping. Playback computes return-to-go and `V(s) - G(s)` only
79
+ for a completed, stochastic, policy-driven trajectory whose policy environment, reward stream,
80
+ discount, action sampling, and boundary/bootstrap semantics match training. True terminations use
81
+ a zero terminal value; truncations use the checkpoint critic's value of the exact final policy
82
+ input and display that bootstrap explicitly. Otherwise those critic diagnostics are explicitly
83
+ unavailable rather than numerically compared.
71
84
 
72
85
  The active checkpoint protocol is `acceptance`; complete accepted evidence additionally emits the
73
86
  `full` metric family. Dimension IDs must be unique and match `[A-Za-z0-9_.-]+`; unsafe IDs are
@@ -103,7 +116,7 @@ Asynchronous evaluations may arrive after later training rows without changing t
103
116
  X-axis. Each producer writes only its applicable scientific axis; durable delivery order uses
104
117
  `orchestration/event/sequence`.
105
118
 
106
- Current runs declare schema v19, and the supervisor validates and emits only v19 names. GradLab
119
+ Current runs declare schema v20, and the supervisor validates and emits only v20 names. GradLab
107
120
  does not read, project, or preserve noncurrent W&B or R2 schemas.
108
121
 
109
122
  All metrics whose path contains `rolling` use the run-configured
@@ -124,7 +137,16 @@ metric path. `cumulative` explicitly means all eligible observations seen so far
124
137
  absent from the policy observation, visually similar early and late states are aliased for the
125
138
  critic, which can amplify the terminal-horizon discrepancy. Learner explained variance uses its
126
139
  rollout value targets and is not the same statistic as a single playback trajectory's
127
- `V(s) - G(s)`.
140
+ `V(s) - G(s)`. A true termination closes the return with zero future value. A truncation does not:
141
+ the unobserved continuation prevents a fully realized Monte Carlo `G(s)`, but a
142
+ truncation-compatible N-step diagnostic can close the trace with the exact final policy input's
143
+ critic value: `Ĝ_t = r_t + γ r_{t+1} + … + γ^{T-t} V(s_T)`. That quantity is partly bootstrapped,
144
+ not a fully realized return or generally the learner's GAE lambda-return, and is valid for critic
145
+ comparison only when the final observation, preprocessing and conditioning, checkpoint critic,
146
+ discount, and truncation semantics match the training value contract. Playback labels this
147
+ bootstrap when it computes the diagnostic and withholds the comparison if the exact final-state
148
+ critic value is unavailable; treating truncation as termination by substituting a zero bootstrap
149
+ would fabricate a misleading residual.
128
150
  - Mario recipes disable automatic checkpoint evaluation and stop when
129
151
  `train/outcome/success/starts/all/rolling/rate/min` first reaches one. For a single start,
130
152
  that means 100 consecutive genuine target-origin clears; for multiple starts, every configured
@@ -170,8 +192,11 @@ metric path. `cumulative` explicitly means all eligible observations seen so far
170
192
  action-space-only minimum or maximum. The bounds remain a pure policy-space calculation used by
171
193
  diagnostics and are not duplicated as W&B metrics.
172
194
  - Actor-critic explained variance is `1 - Var(value_target - value_prediction) /
173
- Var(value_target)`: one is perfect, zero means the critic explains no more target variance than a
174
- constant baseline, and negative values are worse than that baseline. A near-zero value is not by
195
+ Var(value_target)`: one means the residual variance is zero (perfect up to a constant prediction
196
+ offset), zero means the critic explains no more target variance than a constant baseline, and
197
+ negative values are worse than that baseline. Because variance centers the residuals, explained
198
+ variance alone does not detect constant value bias; pair it with residual bias or calibration
199
+ measures when absolute accuracy matters. A near-zero value is not by
175
200
  itself evidence of exploding value loss. Pair it with value-prediction and advantage dispersion:
176
201
  predictions with much less dispersion than the residual advantages indicate a mostly
177
202
  state-insensitive baseline, while tiny target variance can make the ratio ill-conditioned.
@@ -198,6 +223,28 @@ metric path. `cumulative` explicitly means all eligible observations seen so far
198
223
  evaluation performance. A threshold condition with `progress_baseline` additionally emits
199
224
  `train/early_stop/{condition}/target/progress` as the current metric's clamped fraction from that
200
225
  baseline to its threshold. Only goal-owned checkpoint evaluation may establish acceptance.
226
+ - `train/episode/length/origin/all/rolling/mean` counts policy transitions, so one step represents
227
+ four native frames in the current Breakout contract. It combines target- and archive-origin
228
+ episodes and is therefore not a clean survival comparison when archive curricula differ. Within
229
+ identical start, frame-skip, reset, and termination contracts, increasing length can indicate
230
+ better ball defense when target return or progress also improves and failure-reason rates do not;
231
+ it can instead reflect delayed serving, low-progress play, or the episode cap, while faster wall
232
+ completion can shorten a successful episode. Treat it as a diagnostic, not a monotonic success or
233
+ acceptance measure.
234
+ - Breakout declares `score` as reward-independent episode progress.
235
+ `train/progress/score/origin/target/rolling/mean` is the mean terminal provider-native Atari
236
+ score over the most recent target-origin episodes, including warm-up before the 100-episode
237
+ window is full. GradLab-owned life-loss and serve-stall penalties do not change it. Atari score
238
+ weights brick rows differently, so this metric is not a brick count; it remains an online
239
+ behavior-policy training proxy rather than frozen-checkpoint evaluation evidence.
240
+ - Breakout also declares `bricks_destroyed` and `bricks_destroyed_normalized` as
241
+ reward-independent episode progress. Their `train/progress/{progress}/origin/target/rolling/mean`
242
+ metrics average the terminal cumulative values over the most recent 100 target-origin episodes,
243
+ while `train/progress/{progress}/origin/target/rolling/max` reports the maximum over that same
244
+ window. The normalized value is the `0.0..1.0` two-wall completion fraction. Both statistics
245
+ include warm-up before the window is full and are online behavior-policy training proxies rather
246
+ than frozen-checkpoint evaluation evidence. Breakout ranks runs first by the rolling maximum
247
+ terminal `bricks_destroyed` count, then by the earliest training step.
201
248
  - Training episode reduction aggregates return, length, outcome, success, the explicitly supported
202
249
  target-origin cell-novelty statistic, and goal-declared numeric episode progress fields.
203
250
  Progress field names refer to task-semantic signals and must be populated independently of the
@@ -217,11 +264,19 @@ metric path. `cumulative` explicitly means all eligible observations seen so far
217
264
  between-rollout time includes optimizer updates, callbacks, and logging, so it is deliberately
218
265
  not named optimization time. The corresponding rates are
219
266
  `train/throughput/loop/rate` and `train/throughput/provider/step/rate`.
220
- - Reward components are emitted only when active. Each component has mean, nonzero rate, and share;
267
+ - Reward components are emitted only when configured. Each component mean includes every policy
268
+ transition in the rollout, including zero-valued transitions; nonzero rate separately reports
269
+ the fraction on which the component contributed. Each component also has an absolute share;
221
270
  raw reward appears only when it differs from shaped reward. Mario's `progress` component includes
222
271
  both its base new-progress reward and any configured additional new-progress reward above
223
- `progress_reward_boost_start_x`. ViZDoom Deathmatch's optional `sample-factory-v0` shape exposes
224
- `kill`, `death`, `hit`, `damage`, `health`, `armor`, `weapon`, `ammo`, and `weapon_hold`
272
+ `progress_reward_boost_start_x`. An identity task's `event` component is the sum of its declared
273
+ signed `event_rewards` for events firing on that transition. Its per-event reward metrics split
274
+ that sum by declared event. An identity `equals` event contributes on every policy transition
275
+ whose post-transition signal matches; `previous_equals` contributes when the signal at the start
276
+ of the transition matches, using the reset signal on the first transition when available;
277
+ `equals_for` contributes only when the consecutive-match counter first reaches its threshold.
278
+ ViZDoom Deathmatch's optional `sample-factory-v0` shape
279
+ exposes `kill`, `death`, `hit`, `damage`, `health`, `armor`, `weapon`, `ammo`, and `weapon_hold`
225
280
  components; their sum is the pre-transform task reward and excludes the replaced provider reward.
226
281
  - The player's protocol-v8 Reward analysis ledger is local playback telemetry, not a W&B metric.
227
282
  It shows raw component values, multiplies each impact by the unit-interval reward scale,
@@ -254,9 +309,11 @@ metric path. `cumulative` explicitly means all eligible observations seen so far
254
309
  - Episode-return means are neither a best-episode metric nor the score of a currently visible lane:
255
310
  they reduce the configured recent episode window across all applicable vector lanes. W&B chart
256
311
  smoothing, when enabled, is applied on top of that already-rolling value. Under the root Breakout
257
- contract (`reward_mode: native`, unclipped), shaped episode return is the sum of Atari row-score
258
- deltas, so individual 400-plus games can coexist with a much lower mean when other lanes finish
259
- with lower scores.
312
+ goal contract (`reward_mode: native`, unclipped), shaped episode return is the sum of Atari
313
+ row-score deltas unless a recipe declares additional shaping. The checked-in Breakout `ppo`
314
+ recipe subtracts five through its `event` reward component whenever `lives` decreases, so its
315
+ shaped episode return is native score minus five per life lost. Individual 400-plus games can
316
+ coexist with a much lower mean when other lanes finish with lower scores.
260
317
  - Episode returns, success rates, failure reasons, policy entropy, and optimizer diagnostics
261
318
  describe performance or mechanism; no one of them should be treated as a generic stall-stop
262
319
  signal. A configured plateau condition may watch any registered numeric training metric, with
@@ -353,10 +410,13 @@ unevaluated for future explicit user action. dstack process exit alone is never
353
410
  |---|---|---|---|---|---|---|
354
411
  | `train/episode/return/shaped/origin/target/rolling/mean` | Recent target return mean | Mean shaped return over the most recent genuine target-origin episodes, including warm-up before the configured window is full. | return | rollout | history | last |
355
412
  | `train/episode/return/shaped/origin/target/rolling/max` | Recent target return max | Maximum shaped return over the same recent target-origin episodes as the rolling mean. | return | rollout | history | last |
356
- | `train/episode/length/origin/all/rolling/mean` | Recent episode length mean | Mean length over the most recent genuine completed episodes across target and archive origins. | steps | rollout | history | last |
413
+ | `train/episode/length/origin/all/rolling/mean` | Recent episode length mean | Mean policy-transition count over the most recent genuine completed episodes across target and archive origins. | steps | rollout | history | last |
357
414
  | `train/exploration/cell/unique/origin/target/rolling/mean` | Recent target unique cells mean | Mean episodic unique-cell count over recent target-origin episodes when cell-novelty shaping is active; the reset cell is included. | cells | rollout | history | last |
358
415
  | `train/progress/{progress}/origin/target/rolling/mean` | Recent target {progress} mean | Mean of a goal-declared finite numeric progress field over recent genuine target-origin episodes. | value | rollout | history | last |
416
+ | `train/progress/{progress}/origin/target/rolling/max` | Recent target {progress} max | Maximum of a goal-declared finite numeric progress field over recent genuine target-origin episodes. | value | rollout | history | last |
359
417
  | `train/episode/completed/count` | Completed episodes | Cumulative genuine completed training episodes across origins. | episodes | rollout | history | last |
418
+ | `train/outcome/failure/reason/{reason}/count` | Failure {reason} count | Cumulative unsuccessful completed episodes containing the reason; reason presence is counted at most once per episode. | episodes | rollout | history | last |
419
+ | `train/outcome/failure/reason/{reason}/rolling/count` | Recent failure {reason} count | Unsuccessful completed episodes containing the reason among the most recent 100 genuine completed episodes, including warm-up before the window is full; reason presence is counted at most once per episode. | episodes | rollout | history | last |
360
420
  | `train/outcome/failure/reason/{reason}/rolling/rate` | Recent failure {reason} rate | Recent unsuccessful completed episodes containing the reason divided by all recent completed episodes; reason presence is boolean per episode. | fraction | rollout | history | last |
361
421
  | `train/outcome/success/start/{start}/episode/count` | Successful target episodes from {start} | Cumulative successful genuine target-origin episodes from one start. | episodes | rollout | history | last |
362
422
  | `train/outcome/success/start/{start}/rolling/rate` | Recent success rate from {start} | Success fraction over recent genuine target-origin attempts from one start. | fraction | rollout | history | last |
@@ -371,9 +431,11 @@ unevaluated for future explicit user action. dstack process exit alone is never
371
431
  | `train/reward/shaped/nonzero/rate` | Shaped nonzero reward rate | Fraction of learner-facing per-step rewards that are nonzero after scaling and clipping. | fraction | rollout | history | last |
372
432
  | `train/reward/raw/mean` | Raw reward mean | Mean completed task reward immediately before gradlab-owned scaling and clipping, emitted when distinct from shaped reward. | scalar | rollout | history | last |
373
433
  | `train/reward/raw/std` | Raw reward std | Standard deviation of completed task reward immediately before gradlab-owned scaling and clipping, emitted when distinct from shaped reward. | scalar | rollout | history | last |
374
- | `train/reward/component/{component}/mean` | Reward {component} mean | Mean active reward-component contribution in pre-transform task-reward units. | scalar | rollout | history | last |
434
+ | `train/reward/component/{component}/mean` | Reward {component} mean | Mean configured reward-component contribution over every policy transition in the rollout, including zero-valued transitions, in pre-transform task-reward units. | scalar | rollout | history | last |
375
435
  | `train/reward/component/{component}/nonzero/rate` | Reward {component} activity rate | Fraction of active reward-component values that are nonzero. | fraction | rollout | history | last |
376
436
  | `train/reward/component/{component}/share` | Reward {component} share | Absolute contribution share computed from components in pre-transform task-reward units. | fraction | rollout | history | last |
437
+ | `train/reward/event/{event}/mean` | Reward event {event} mean | Mean contribution from one declared event reward in pre-transform task-reward units. | scalar | rollout | history | last |
438
+ | `train/reward/event/{event}/nonzero/rate` | Reward event {event} activity rate | Fraction of policy transitions on which one declared event reward contributes a nonzero value. | fraction | rollout | history | last |
377
439
  | `train/algorithm/ppo/update/approx_kl` | PPO approximate KL | Approximate KL divergence for the PPO update. | scalar | rollout | history | last |
378
440
  | `train/algorithm/ppo/update/clip_fraction` | PPO clip fraction | Fraction of sampled policy ratios outside PPO's clipping interval. | fraction | rollout | history | last |
379
441
  | `train/algorithm/jerk/retained/count` | JERK retained sequences | Distinct action sequences retained by JERK search. | sequences | rollout | history | last |
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.4
1
+ Metadata-Version: 2.5
2
2
  Name: gradlab
3
- Version: 0.1.2
3
+ Version: 0.2.2
4
4
  Summary: Generic reinforcement-learning lab for training and evaluating game agents
5
5
  License-Expression: MIT
6
6
  License-File: LICENSE
@@ -9,12 +9,18 @@ Requires-Dist: aiohttp<4,>=3.14.3
9
9
  Requires-Dist: ale-py<0.13,>=0.12
10
10
  Requires-Dist: boto3<2,>=1.34
11
11
  Requires-Dist: box2d-py==2.3.5
12
- Requires-Dist: breakout-turbo-env==0.5.5; sys_platform == 'darwin' and platform_machine == 'arm64'
13
- Requires-Dist: breakout-turbo-env==0.5.5; sys_platform == 'linux' and platform_machine == 'x86_64'
14
12
  Requires-Dist: captum<1,>=0.9
15
13
  Requires-Dist: certifi>=2026.5.20
16
- Requires-Dist: gradoom==0.1.0a3; sys_platform == 'darwin' and platform_machine == 'arm64'
17
- Requires-Dist: gradoom==0.1.0a3; sys_platform == 'linux' and platform_machine == 'x86_64'
14
+ Requires-Dist: env-breakoutatari2600-turbo-native==0.5.11; sys_platform == 'darwin' and platform_machine == 'arm64'
15
+ Requires-Dist: env-breakoutatari2600-turbo-native==0.5.11; sys_platform == 'linux' and platform_machine == 'x86_64'
16
+ Requires-Dist: env-gradoom-turbo-torch==0.2.1; sys_platform == 'darwin' and platform_machine == 'arm64'
17
+ Requires-Dist: env-gradoom-turbo-torch==0.2.1; sys_platform == 'linux' and platform_machine == 'x86_64'
18
+ Requires-Dist: env-stableretro-turbo==1.0.1.post48; sys_platform == 'darwin' and platform_machine == 'arm64'
19
+ Requires-Dist: env-stableretro-turbo==1.0.1.post48; sys_platform == 'linux' and platform_machine == 'x86_64'
20
+ Requires-Dist: env-supermariobrosnes-turbo-emu==0.7.3; sys_platform == 'darwin' and platform_machine == 'arm64'
21
+ Requires-Dist: env-supermariobrosnes-turbo-emu==0.7.3; sys_platform == 'linux' and platform_machine == 'x86_64'
22
+ Requires-Dist: env-vizdoom-turbo==1.3.0.post30; sys_platform == 'darwin' and platform_machine == 'arm64'
23
+ Requires-Dist: env-vizdoom-turbo==1.3.0.post30; sys_platform == 'linux' and platform_machine == 'x86_64'
18
24
  Requires-Dist: gymnasium<1.3,>=1.2
19
25
  Requires-Dist: huggingface-hub<2,>=1.0
20
26
  Requires-Dist: jinja2<4,>=3.1
@@ -28,17 +34,11 @@ Requires-Dist: pygame-ce<3,>=2.5
28
34
  Requires-Dist: pyyaml<7,>=6
29
35
  Requires-Dist: rich<16,>=15
30
36
  Requires-Dist: stable-baselines3<3,>=2.3
31
- Requires-Dist: stable-retro-turbo==1.0.1.post43; sys_platform == 'darwin' and platform_machine == 'arm64'
32
- Requires-Dist: stable-retro-turbo==1.0.1.post43; sys_platform == 'linux' and platform_machine == 'x86_64'
33
- Requires-Dist: supermariobrosnes-turbo==0.6.6; sys_platform == 'darwin' and platform_machine == 'arm64'
34
- Requires-Dist: supermariobrosnes-turbo==0.6.6; sys_platform == 'linux' and platform_machine == 'x86_64'
35
37
  Requires-Dist: tensorboard<3,>=2.16
36
38
  Requires-Dist: textual<9,>=8.2.8
37
39
  Requires-Dist: torch==2.13.0; sys_platform == 'darwin' and platform_machine == 'arm64'
38
40
  Requires-Dist: torch==2.13.0; sys_platform == 'linux' and platform_machine == 'x86_64'
39
41
  Requires-Dist: tqdm<5,>=4.67
40
- Requires-Dist: vizdoom-turbo==1.3.0.post26; sys_platform == 'darwin' and platform_machine == 'arm64'
41
- Requires-Dist: vizdoom-turbo==1.3.0.post26; sys_platform == 'linux' and platform_machine == 'x86_64'
42
42
  Requires-Dist: wandb-workspaces<0.5,>=0.4
43
43
  Requires-Dist: wandb<0.23,>=0.18
44
44
  Provides-Extra: dataset
@@ -64,7 +64,7 @@ with portable policies and evidence-backed results.
64
64
  Try the bundled ROM-free smoke recipe without cloning, credentials, or a ROM:
65
65
 
66
66
  ```bash
67
- uvx gradlab@0.1.2 train gradlab__bandit/ppo
67
+ uvx gradlab@0.2.2 train gradlab__bandit/ppo
68
68
  ```
69
69
 
70
70
  The run writes a directly playable policy below `~/.config/gradlab/runs/`.
@@ -110,8 +110,9 @@ gradlab train Blackjack-v1/ppo
110
110
 
111
111
  Use `gymnasium:<environment-id>` for the qualified environment ID. These goals
112
112
  use isolated spawned lanes, explicit masked resets, native rewards, and RGB
113
- rendering through the same training, evaluation, publication, and playback
114
- workflows as other GradLab providers. Native categorical observations remain
113
+ rendering through the same training, checkpoint-publication, and playback
114
+ workflows as other GradLab providers. They can establish Training Success but
115
+ cannot establish Acceptance, Promotion, or Release. Native categorical observations remain
115
116
  categorical; Blackjack uses the fixed `MultiDiscrete([32, 11, 2])` encoding
116
117
  `(player sum, dealer card, usable ace)`.
117
118
 
@@ -165,20 +166,28 @@ install -m 600 ops/operator.example.toml ~/.config/gradlab/operator.toml
165
166
  gradlab experiment operator-preflight --json
166
167
  ```
167
168
 
168
- Then launch a checked-in goal and recipe with a finite duration and a specific
169
- description:
169
+ Then launch a checked-in recipe using its resolved goal and bounded defaults:
170
170
 
171
171
  ```bash
172
172
  gradlab experiment launch \
173
- --goal-file experiments/goals/SuperMarioBros-Nes-v0/Level1-1/_goal.yaml \
174
173
  --recipe-file experiments/goals/SuperMarioBros-Nes-v0/Level1-1/recipes/ppo.yaml \
175
- --seed 123 \
176
- --run-description "Mario Level1-1 PPO seed 123" \
177
- --compute local \
178
- --max-duration 48h \
179
- --json
174
+ --follow
180
175
  ```
181
176
 
177
+ The recipe path identifies its owning goal. The launch seed defaults to `12`,
178
+ the description defaults to `<goal> <recipe> seed <seed>`, compute defaults to
179
+ the configured local fleet, and maximum duration defaults to 48 hours.
180
+ `--follow` keeps the command attached after submission, streams authoritative
181
+ run-state changes, and exits when training and its terminal drain are complete.
182
+ Interrupting the client stops the stream without canceling the remote run. Omit
183
+ the flag to retain asynchronous submission. Add `--json` for typed JSON Lines
184
+ events (`launch`, `status`, and `terminal`).
185
+
186
+ When the selected coordinator declares `ssh_tunnel` metadata in private
187
+ `operator.toml`, this same command reuses an existing local endpoint or opens a
188
+ temporary SSH tunnel automatically. The tunnel remains attached for the full
189
+ command and is closed on exit only when GradLab created it.
190
+
182
191
  Local compute requires an enrolled fleet in
183
192
  `~/.config/gradlab/instances.md`. Paid cloud compute is always bounded and
184
193
  explicitly authorized. See [COMPUTE.md](COMPUTE.md) and the
@@ -189,9 +198,9 @@ explicitly authorized. See [COMPUTE.md](COMPUTE.md) and the
189
198
  - GradLab requires Python 3.14 and uses `uv` with a committed lockfile and a
190
199
  seven-day dependency age gate. Supported binary targets are macOS arm64 and
191
200
  Linux x86_64.
192
- - Local `gradlab train` runs disable W&B and checkpoint evaluation by default.
193
- They are training-only and cannot establish goal acceptance or checkpoint
194
- promotion.
201
+ - Local `gradlab train` Runs disable W&B and acceptance evaluation by default.
202
+ They can establish Training Success but cannot establish Acceptance or
203
+ Promotion.
195
204
  - `gradlab.ppo` is the opt-in tensor-native PPO backend. It accepts the
196
205
  `sb3.ppo` configuration surface plus `precision` (`fp32`, `amp-fp16`, or
197
206
  `amp-bf16`) and an `execution_profile`. `sb3-parity` preserves SB3's eager,
@@ -210,9 +219,11 @@ explicitly authorized. See [COMPUTE.md](COMPUTE.md) and the
210
219
  - dstack task success is not scientific success. A queued run succeeds only
211
220
  when its terminal receipt proves checkpoint publication, evaluation drain,
212
221
  promotion state, and metric delivery.
213
- - [SPECS.md](SPECS.md) defines product requirements, [METRICS.md](METRICS.md)
214
- defines metric semantics, and [experiments/README.md](experiments/README.md)
215
- explains the checked-in research contracts.
222
+ - [SPECS.md](SPECS.md) defines project-wide product requirements,
223
+ [docs/specs/](docs/specs/README.md) defines scoped product requirements,
224
+ [METRICS.md](METRICS.md) defines metric semantics, and
225
+ [experiments/README.md](experiments/README.md) explains the checked-in
226
+ research contracts.
216
227
 
217
228
  ## Architecture
218
229
 
@@ -12,7 +12,7 @@ with portable policies and evidence-backed results.
12
12
  Try the bundled ROM-free smoke recipe without cloning, credentials, or a ROM:
13
13
 
14
14
  ```bash
15
- uvx gradlab@0.1.2 train gradlab__bandit/ppo
15
+ uvx gradlab@0.2.2 train gradlab__bandit/ppo
16
16
  ```
17
17
 
18
18
  The run writes a directly playable policy below `~/.config/gradlab/runs/`.
@@ -58,8 +58,9 @@ gradlab train Blackjack-v1/ppo
58
58
 
59
59
  Use `gymnasium:<environment-id>` for the qualified environment ID. These goals
60
60
  use isolated spawned lanes, explicit masked resets, native rewards, and RGB
61
- rendering through the same training, evaluation, publication, and playback
62
- workflows as other GradLab providers. Native categorical observations remain
61
+ rendering through the same training, checkpoint-publication, and playback
62
+ workflows as other GradLab providers. They can establish Training Success but
63
+ cannot establish Acceptance, Promotion, or Release. Native categorical observations remain
63
64
  categorical; Blackjack uses the fixed `MultiDiscrete([32, 11, 2])` encoding
64
65
  `(player sum, dealer card, usable ace)`.
65
66
 
@@ -113,20 +114,28 @@ install -m 600 ops/operator.example.toml ~/.config/gradlab/operator.toml
113
114
  gradlab experiment operator-preflight --json
114
115
  ```
115
116
 
116
- Then launch a checked-in goal and recipe with a finite duration and a specific
117
- description:
117
+ Then launch a checked-in recipe using its resolved goal and bounded defaults:
118
118
 
119
119
  ```bash
120
120
  gradlab experiment launch \
121
- --goal-file experiments/goals/SuperMarioBros-Nes-v0/Level1-1/_goal.yaml \
122
121
  --recipe-file experiments/goals/SuperMarioBros-Nes-v0/Level1-1/recipes/ppo.yaml \
123
- --seed 123 \
124
- --run-description "Mario Level1-1 PPO seed 123" \
125
- --compute local \
126
- --max-duration 48h \
127
- --json
122
+ --follow
128
123
  ```
129
124
 
125
+ The recipe path identifies its owning goal. The launch seed defaults to `12`,
126
+ the description defaults to `<goal> <recipe> seed <seed>`, compute defaults to
127
+ the configured local fleet, and maximum duration defaults to 48 hours.
128
+ `--follow` keeps the command attached after submission, streams authoritative
129
+ run-state changes, and exits when training and its terminal drain are complete.
130
+ Interrupting the client stops the stream without canceling the remote run. Omit
131
+ the flag to retain asynchronous submission. Add `--json` for typed JSON Lines
132
+ events (`launch`, `status`, and `terminal`).
133
+
134
+ When the selected coordinator declares `ssh_tunnel` metadata in private
135
+ `operator.toml`, this same command reuses an existing local endpoint or opens a
136
+ temporary SSH tunnel automatically. The tunnel remains attached for the full
137
+ command and is closed on exit only when GradLab created it.
138
+
130
139
  Local compute requires an enrolled fleet in
131
140
  `~/.config/gradlab/instances.md`. Paid cloud compute is always bounded and
132
141
  explicitly authorized. See [COMPUTE.md](COMPUTE.md) and the
@@ -137,9 +146,9 @@ explicitly authorized. See [COMPUTE.md](COMPUTE.md) and the
137
146
  - GradLab requires Python 3.14 and uses `uv` with a committed lockfile and a
138
147
  seven-day dependency age gate. Supported binary targets are macOS arm64 and
139
148
  Linux x86_64.
140
- - Local `gradlab train` runs disable W&B and checkpoint evaluation by default.
141
- They are training-only and cannot establish goal acceptance or checkpoint
142
- promotion.
149
+ - Local `gradlab train` Runs disable W&B and acceptance evaluation by default.
150
+ They can establish Training Success but cannot establish Acceptance or
151
+ Promotion.
143
152
  - `gradlab.ppo` is the opt-in tensor-native PPO backend. It accepts the
144
153
  `sb3.ppo` configuration surface plus `precision` (`fp32`, `amp-fp16`, or
145
154
  `amp-bf16`) and an `execution_profile`. `sb3-parity` preserves SB3's eager,
@@ -158,9 +167,11 @@ explicitly authorized. See [COMPUTE.md](COMPUTE.md) and the
158
167
  - dstack task success is not scientific success. A queued run succeeds only
159
168
  when its terminal receipt proves checkpoint publication, evaluation drain,
160
169
  promotion state, and metric delivery.
161
- - [SPECS.md](SPECS.md) defines product requirements, [METRICS.md](METRICS.md)
162
- defines metric semantics, and [experiments/README.md](experiments/README.md)
163
- explains the checked-in research contracts.
170
+ - [SPECS.md](SPECS.md) defines project-wide product requirements,
171
+ [docs/specs/](docs/specs/README.md) defines scoped product requirements,
172
+ [METRICS.md](METRICS.md) defines metric semantics, and
173
+ [experiments/README.md](experiments/README.md) explains the checked-in
174
+ research contracts.
164
175
 
165
176
  ## Architecture
166
177
 
@@ -9,14 +9,18 @@ tags:
9
9
  title: Atari 2600 Breakout wall completion
10
10
  objective:
11
11
  rank:
12
- - max(train/episode/return/shaped/origin/target/rolling/mean)
12
+ - max(train/progress/bricks_destroyed/origin/target/rolling/max)
13
13
  - min(train/global_step)
14
14
  train:
15
15
  checkpoint_freq: 500000
16
+ episode_progress_fields:
17
+ - score
18
+ - bricks_destroyed
19
+ - bricks_destroyed_normalized
16
20
  environment:
17
21
  # Breakout Turbo is the default ROM-free implementation. The complete contract is
18
22
  # intentionally accepted by Stable Retro Turbo so only env_provider needs to change.
19
- env_provider: &breakout_provider breakout-turbo-env
23
+ env_provider: &breakout_provider env-breakoutatari2600-turbo-native
20
24
  env_config:
21
25
  <<: &breakout_env_config
22
26
  game: Breakout-Atari2600-v0
@@ -56,6 +60,16 @@ train:
56
60
  action:
57
61
  # GradLab normalizes both providers to 0=NOOP, 1=FIRE, 2=RIGHT, 3=LEFT.
58
62
  set: native
63
+ conditional_overrides:
64
+ - id: auto_serve
65
+ when:
66
+ signal: ball_y
67
+ operation: equals
68
+ value: 0
69
+ replace_with:
70
+ # Stable Retro names the Atari controller trigger BUTTON; in Breakout
71
+ # this is the FIRE action that launches the waiting ball.
72
+ semantic_id: button
59
73
  signals:
60
74
  ball_y: ball_y
61
75
  walls_cleared: walls_cleared
@@ -66,6 +80,8 @@ train:
66
80
  ball_vy: ball_vy
67
81
  # The live-state curriculum groups reachable Breakout states by score stage.
68
82
  score: score
83
+ bricks_destroyed: bricks_destroyed
84
+ bricks_destroyed_normalized: bricks_destroyed_normalized
69
85
  events:
70
86
  serve_stall:
71
87
  signal: ball_y
@@ -82,3 +98,5 @@ train:
82
98
  reward_mode: native
83
99
  reward_scale: 1.0
84
100
  reward_clip: false
101
+ event_rewards:
102
+ serve_stall: -5.0
@@ -0,0 +1,62 @@
1
+ defaults:
2
+ - ../../../recipes/_presets/breakout-ball-state-ablation-ppo@_global_
3
+ - _self_
4
+ recipe_id: ppo-ball-state
5
+ description: Native Breakout PPO with centered ball position, velocity, and paddle position fused after the visual encoder.
6
+ train:
7
+ environment:
8
+ task:
9
+ model_inputs:
10
+ schema_version: 1
11
+ context:
12
+ ball_x:
13
+ signal: policy_ball_x
14
+ update: transition
15
+ encoding:
16
+ kind: continuous
17
+ scale: 2.0
18
+ offset: -1.0
19
+ # Provider ratios deliberately preserve off-viewport values.
20
+ low: null
21
+ high: null
22
+ clip: false
23
+ ball_y:
24
+ signal: policy_ball_y
25
+ update: transition
26
+ encoding:
27
+ kind: continuous
28
+ scale: 2.0
29
+ offset: -1.0
30
+ low: null
31
+ high: null
32
+ clip: false
33
+ ball_vx:
34
+ signal: policy_ball_vx
35
+ update: transition
36
+ encoding:
37
+ kind: continuous
38
+ scale: 1.0
39
+ offset: 0.0
40
+ low: null
41
+ high: null
42
+ clip: false
43
+ ball_vy:
44
+ signal: policy_ball_vy
45
+ update: transition
46
+ encoding:
47
+ kind: continuous
48
+ scale: 1.0
49
+ offset: 0.0
50
+ low: null
51
+ high: null
52
+ clip: false
53
+ paddle_x:
54
+ signal: policy_paddle_x
55
+ update: transition
56
+ encoding:
57
+ kind: continuous
58
+ scale: 2.0
59
+ offset: -1.0
60
+ low: null
61
+ high: null
62
+ clip: false
@@ -0,0 +1,5 @@
1
+ defaults:
2
+ - ../../../recipes/_presets/breakout-ball-state-ablation-ppo@_global_
3
+ - _self_
4
+ recipe_id: ppo-fusion-256
5
+ description: Architecture-matched native Breakout PPO control with a 256-unit post-CNN fusion layer but no privileged state inputs.
@@ -0,0 +1,26 @@
1
+ defaults:
2
+ - ../../../recipes/_presets/breakout-high-throughput-ppo@_global_
3
+ - _self_
4
+ recipe_id: ppo
5
+ description: High-throughput three-action PPO for {{ goal_id }} with learning-rate and entropy decay plus five-point life-loss and serve-stall penalties.
6
+ train:
7
+ environment:
8
+ env_config:
9
+ env_args:
10
+ # Both Breakout providers compile this table to the same three-action
11
+ # semantic contract: BUTTON/FIRE, RIGHT, LEFT. NOOP remains available
12
+ # only to the reset randomizer, outside the policy action space.
13
+ use_restricted_actions:
14
+ - [BUTTON]
15
+ - [RIGHT]
16
+ - [LEFT]
17
+ task:
18
+ signals:
19
+ lives: lives
20
+ events:
21
+ life_loss:
22
+ signal: lives
23
+ operation: decrease
24
+ reward:
25
+ event_rewards:
26
+ life_loss: -5.0
@@ -32,7 +32,7 @@ train:
32
32
  action: stop
33
33
  environment:
34
34
  # SuperMarioBros-NES Turbo supplies SuperMarioBrosNesTurboVecEnv.
35
- env_provider: &mario_env_provider supermariobrosnes-turbo
35
+ env_provider: &mario_env_provider env-supermariobrosnes-turbo-emu
36
36
  env_config:
37
37
  <<: &mario_env_config
38
38
  # Stable Retro-compatible game id passed to SuperMarioBrosNesTurboVecEnv.
@@ -5,14 +5,18 @@ recipe_id: gradoom-ppo
5
5
  description: GPU-resident GraDOOM Deathmatch PPO trained on one RTX 4090 and evaluated zero-shot in reference ViZDoom.
6
6
  reward_shape: native-v1
7
7
  train:
8
- timesteps: 500000000
8
+ timesteps: 50000000
9
+ checkpoint_eval_backend: none
9
10
  environment:
10
- # Training uses GraDOOM; the goal-owned checkpoint evaluator remains vizdoom-turbo.
11
- env_provider: gradoom
11
+ # Training uses GraDOOM; the goal-owned checkpoint evaluator remains env-vizdoom-turbo.
12
+ env_provider: env-gradoom-turbo-torch
12
13
  env_config:
14
+ # GPU-resident GraDOOM scales to thousands of lanes; 2048 won the 128..4096
15
+ # time-to-rolling-kills sweep on beast-3 (~9.5k steps/s, best kills curve).
16
+ n_envs: 2048
13
17
  env_args:
14
- # GraDOOM is single-stream GPU execution; this compatibility knob is intentionally inert.
15
- num_threads: 1
18
+ # GraDOOM is single-stream GPU execution; the API expects None for device-backed execution.
19
+ num_threads: null
16
20
  # Keep the supported eager engine until the production CUDA graph passes its release gate.
17
21
  compile_engine: false
18
22
  preprocessing:
@@ -75,7 +75,7 @@ train:
75
75
  # Define the provider, environment, preprocessing, and task contract used for training.
76
76
  environment:
77
77
  # Select the environment provider and anchor it for evaluation reuse.
78
- env_provider: &vizdoom_provider vizdoom-turbo
78
+ env_provider: &vizdoom_provider env-vizdoom-turbo
79
79
  # Define provider-independent and provider-specific environment settings.
80
80
  env_config:
81
81
  # Anchor the complete base environment mapping for evaluation reuse.