freesolo-flash-dev 1.2.68__tar.gz → 1.2.69__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 (592) hide show
  1. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/CHANGELOG.md +1 -0
  2. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/Dockerfile.worker +4 -3
  3. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/PKG-INFO +1 -1
  4. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/docker/kernel_fingerprint.py +1 -0
  5. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/docker/make_rp_handler.py +17 -8
  6. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/providers/_lifecycle/bootstrap.py +41 -62
  7. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/providers/_lifecycle/instance.py +4 -3
  8. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/providers/_lifecycle/provider.py +3 -3
  9. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/providers/_lifecycle/terminal_artifacts.py +14 -7
  10. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/providers/_lifecycle/worker.py +105 -40
  11. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/providers/base.py +1 -1
  12. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/providers/lambda_/__init__.py +2 -2
  13. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/providers/lambda_/jobs/__init__.py +19 -17
  14. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/providers/lambda_/jobs/builders.py +2 -2
  15. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/providers/runpod/__init__.py +2 -2
  16. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/providers/runpod/job_execution.py +7 -1
  17. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/providers/runpod/jobs.py +7 -3
  18. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/providers/runpod/serverless/__init__.py +1 -1
  19. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/providers/runpod/serverless/endpoints.py +173 -172
  20. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/providers/vast/__init__.py +2 -2
  21. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/providers/vast/jobs/__init__.py +4 -4
  22. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/providers/vast/jobs/builders.py +2 -2
  23. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/runner/__init__.py +21 -1
  24. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/runner/artifacts.py +0 -22
  25. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/runner/reconciliation.py +11 -0
  26. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/runner/status.py +70 -4
  27. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/runner/submit.py +29 -6
  28. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/runner/supervise/attach.py +29 -33
  29. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/runner/supervise/lifecycle.py +19 -26
  30. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/runner/supervise/seed_submission.py +17 -9
  31. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/runtime_capsule/profiles.py +2 -1
  32. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/server/domain/run_registry.py +3 -2
  33. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/server/platform/runtime.py +6 -0
  34. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/server/routes/runs.py +4 -1
  35. freesolo_flash_dev-1.2.69/flash/source_snapshot.py +387 -0
  36. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/pyproject.toml +2 -2
  37. freesolo_flash_dev-1.2.69/tests/_helpers/source_snapshot.py +13 -0
  38. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_cancel_remote.py +9 -5
  39. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_client_server_integration.py +3 -0
  40. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_env_publish.py +15 -0
  41. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_env_rate_limit_resolve.py +7 -0
  42. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_env_ref_pinning.py +15 -2
  43. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_flash_worker.py +135 -89
  44. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_instance_bootstrap_coverage.py +208 -57
  45. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_jobs.py +157 -161
  46. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_lambda_runner.py +77 -73
  47. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_managed_hf_repo.py +4 -4
  48. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_multi_gpu_gate.py +6 -0
  49. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_opd_resume_safety.py +23 -9
  50. freesolo_flash_dev-1.2.69/tests/test_orchestrator_flash.py +484 -0
  51. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_provider_routing.py +109 -44
  52. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_resume_on_retry.py +10 -1
  53. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_runmgmt.py +32 -13
  54. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_server_api.py +42 -26
  55. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_server_billing.py +4 -0
  56. freesolo_flash_dev-1.2.69/tests/test_source_attestation_flow.py +189 -0
  57. freesolo_flash_dev-1.2.69/tests/test_source_snapshot.py +201 -0
  58. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_teacher_broker.py +18 -2
  59. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_terminal_artifacts.py +14 -0
  60. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_vast_runner.py +21 -10
  61. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_weight_cache.py +56 -1
  62. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/uv.lock +1 -1
  63. freesolo_flash_dev-1.2.68/tests/test_orchestrator_flash.py +0 -563
  64. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/.dockerignore +0 -0
  65. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/.env.example +0 -0
  66. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/.github/CODEOWNERS +0 -0
  67. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  68. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  69. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
  70. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  71. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/.github/dependabot.yml +0 -0
  72. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/.github/workflows/auto-rebake.yml +0 -0
  73. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/.github/workflows/bake-kernel-cache.yml +0 -0
  74. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/.github/workflows/ci.yml +0 -0
  75. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/.github/workflows/main-source-guard.yml +0 -0
  76. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/.github/workflows/notify-tests-repo.yml +0 -0
  77. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/.github/workflows/publish-dev.yml +0 -0
  78. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/.github/workflows/publish-image.yml +0 -0
  79. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/.github/workflows/publish.yml +0 -0
  80. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/.github/workflows/version-parity.yml +0 -0
  81. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/.github/workflows/worker-image.yml +0 -0
  82. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/.gitignore +0 -0
  83. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/CODE_OF_CONDUCT.md +0 -0
  84. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/CONTRIBUTING.md +0 -0
  85. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/Dockerfile +0 -0
  86. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/LICENSE +0 -0
  87. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/NOTICE +0 -0
  88. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/README.md +0 -0
  89. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/SECURITY.md +0 -0
  90. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/SELF_HOSTING.md +0 -0
  91. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/build/kernel_cache/.gitignore +0 -0
  92. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/build/kernel_cache/.keep +0 -0
  93. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/deploy/infisical/README.md +0 -0
  94. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/deploy/infisical/entrypoint.sh +0 -0
  95. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/docker/Dockerfile.kernelcache +0 -0
  96. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/docker/Dockerfile.kernelcache.relayer +0 -0
  97. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/docker/bake_kernel_cache.py +0 -0
  98. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/docker/bake_pod_entry.py +0 -0
  99. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/docker/extract_cudart_fix.py +0 -0
  100. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/__init__.py +0 -0
  101. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/_internal/__init__.py +0 -0
  102. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/_internal/channel.py +0 -0
  103. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/_internal/diagnostics.py +0 -0
  104. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/_internal/fileio.py +0 -0
  105. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/_internal/logging.py +0 -0
  106. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/_internal/paths.py +0 -0
  107. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/adapters/__init__.py +0 -0
  108. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/adapters/artifacts.py +0 -0
  109. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/adapters/fused_experts.py +0 -0
  110. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/adapters/lora_rank.py +0 -0
  111. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/cli/__init__.py +0 -0
  112. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/cli/__main__.py +0 -0
  113. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/cli/commands/__init__.py +0 -0
  114. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/cli/commands/deploy.py +0 -0
  115. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/cli/commands/env/__init__.py +0 -0
  116. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/cli/commands/env/episode.py +0 -0
  117. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/cli/commands/env/eval.py +0 -0
  118. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/cli/commands/env/eval_args.py +0 -0
  119. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/cli/commands/env/imports.py +0 -0
  120. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/cli/commands/env/list.py +0 -0
  121. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/cli/commands/env/push.py +0 -0
  122. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/cli/commands/env/retained.py +0 -0
  123. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/cli/commands/env/setup.py +0 -0
  124. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/cli/commands/env/setup_wandb.py +0 -0
  125. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/cli/commands/env/test.py +0 -0
  126. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/cli/commands/env/test_evaluations.py +0 -0
  127. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/cli/commands/env/test_params.py +0 -0
  128. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/cli/commands/env/test_warnings.py +0 -0
  129. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/cli/commands/prompt_budget.py +0 -0
  130. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/cli/commands/traces.py +0 -0
  131. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/cli/commands/train_cost.py +0 -0
  132. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/cli/scaffold/TRAINING.md +0 -0
  133. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/cli/scaffold/__init__.py +0 -0
  134. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/cli/ui/__init__.py +0 -0
  135. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/cli/ui/cost.py +0 -0
  136. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/cli/ui/env_panels.py +0 -0
  137. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/cli/ui/heartbeat.py +0 -0
  138. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/cli/ui/render.py +0 -0
  139. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/cli/ui/tables.py +0 -0
  140. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/cli/ui/tty.py +0 -0
  141. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/client/__init__.py +0 -0
  142. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/client/config.py +0 -0
  143. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/client/freesolo_api.py +0 -0
  144. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/client/http.py +0 -0
  145. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/client/runtime_secrets.py +0 -0
  146. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/client/shapes.py +0 -0
  147. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/client/specs.py +0 -0
  148. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/client/streaming.py +0 -0
  149. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/content/__init__.py +0 -0
  150. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/content/multimodal.py +0 -0
  151. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/content/structured_outputs.py +0 -0
  152. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/content/thinking.py +0 -0
  153. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/core/__init__.py +0 -0
  154. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/core/catalog.py +0 -0
  155. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/core/spec.py +0 -0
  156. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/core/spec_persistence.py +0 -0
  157. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/cost/__init__.py +0 -0
  158. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/cost/analytical.py +0 -0
  159. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/cost/facts.py +0 -0
  160. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/cost/spec.py +0 -0
  161. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/cost/types.py +0 -0
  162. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/__init__.py +0 -0
  163. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/huggingface.py +0 -0
  164. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/plan/__init__.py +0 -0
  165. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/plan/kv_sizing.py +0 -0
  166. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/plan/model_config_probe.py +0 -0
  167. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/plan/prompt_budget.py +0 -0
  168. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/plan/recipe.py +0 -0
  169. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/plan/steps.py +0 -0
  170. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/plan/vram.py +0 -0
  171. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/profiling/__init__.py +0 -0
  172. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/profiling/dataset_profile.py +0 -0
  173. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/profiling/image_tokens.py +0 -0
  174. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/profiling/reasoning_render.py +0 -0
  175. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/profiling/sft_image_rows.py +0 -0
  176. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/profiling/sft_workload.py +0 -0
  177. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/profiling/tokenizer.py +0 -0
  178. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/profiling/workload_profile.py +0 -0
  179. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/result/__init__.py +0 -0
  180. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/result/accounting.py +0 -0
  181. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/result/rollout_samples.py +0 -0
  182. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/worker/__init__.py +0 -0
  183. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/worker/__main__.py +0 -0
  184. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/worker/backend_common.py +0 -0
  185. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/worker/entry/__init__.py +0 -0
  186. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/worker/entry/opd.py +0 -0
  187. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/worker/entry/rl.py +0 -0
  188. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/worker/entry/sft.py +0 -0
  189. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/worker/io/__init__.py +0 -0
  190. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/worker/io/heartbeat.py +0 -0
  191. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/worker/io/hf.py +0 -0
  192. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/worker/io/prefetch.py +0 -0
  193. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/worker/io/wandb_log.py +0 -0
  194. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/worker/model/__init__.py +0 -0
  195. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/worker/model/adapter.py +0 -0
  196. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/worker/model/chatml_mask.py +0 -0
  197. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/worker/model/decoding.py +0 -0
  198. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/worker/model/lora.py +0 -0
  199. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/worker/model/packing.py +0 -0
  200. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/worker/opd_train.py +0 -0
  201. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/worker/opd_train_runner.py +0 -0
  202. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/worker/perf/__init__.py +0 -0
  203. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/worker/perf/diagnostics.py +0 -0
  204. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/worker/perf/lifecycle.py +0 -0
  205. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/worker/perf/liger.py +0 -0
  206. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/worker/perf/memory.py +0 -0
  207. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/worker/rl_train.py +0 -0
  208. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/worker/rl_train_runner.py +0 -0
  209. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/worker/runtime/__init__.py +0 -0
  210. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/worker/runtime/kernel_warmup.py +0 -0
  211. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/worker/runtime/pkg_proxy.py +0 -0
  212. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/worker/runtime/rng.py +0 -0
  213. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/worker/score_batcher.py +0 -0
  214. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/worker/sft_train.py +0 -0
  215. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/worker/sft_train_runner.py +0 -0
  216. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/worker/teacher/__init__.py +0 -0
  217. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/worker/teacher/client.py +0 -0
  218. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/worker/teacher/encoding.py +0 -0
  219. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/worker/teacher/tokenizer_align.py +0 -0
  220. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/worker/train/__init__.py +0 -0
  221. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/worker/train/core/__init__.py +0 -0
  222. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/worker/train/core/checkpoint_lifecycle.py +0 -0
  223. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/worker/train/core/child/__init__.py +0 -0
  224. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/worker/train/core/child/glue.py +0 -0
  225. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/worker/train/core/child/runtime.py +0 -0
  226. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/worker/train/core/step_timing.py +0 -0
  227. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/worker/train/finalize.py +0 -0
  228. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/worker/train/opd/__init__.py +0 -0
  229. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/worker/train/opd/batching.py +0 -0
  230. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/worker/train/opd/bridge.py +0 -0
  231. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/worker/train/opd/bridge_failures.py +0 -0
  232. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/worker/train/opd/child/__init__.py +0 -0
  233. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/worker/train/opd/child/bridge.py +0 -0
  234. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/worker/train/opd/child/entry.py +0 -0
  235. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/worker/train/opd/child/multiturn.py +0 -0
  236. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/worker/train/opd/child/plugin.py +0 -0
  237. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/worker/train/opd/child/replay_guard.py +0 -0
  238. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/worker/train/opd/child/runtime.py +0 -0
  239. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/worker/train/opd/child/structured.py +0 -0
  240. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/worker/train/opd/failures.py +0 -0
  241. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/worker/train/opd/gkd.py +0 -0
  242. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/worker/train/opd/multiturn_validation.py +0 -0
  243. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/worker/train/opd/overrides.py +0 -0
  244. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/worker/train/opd/prompts.py +0 -0
  245. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/worker/train/opd/reporting.py +0 -0
  246. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/worker/train/opd/scoring.py +0 -0
  247. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/worker/train/opd/state.py +0 -0
  248. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/worker/train/opd/validation.py +0 -0
  249. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/worker/train/rl/__init__.py +0 -0
  250. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/worker/train/rl/checkpoints.py +0 -0
  251. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/worker/train/rl/child/__init__.py +0 -0
  252. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/worker/train/rl/child/entry.py +0 -0
  253. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/worker/train/rl/child/multiturn.py +0 -0
  254. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/worker/train/rl/child/patches.py +0 -0
  255. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/worker/train/rl/child/plugin.py +0 -0
  256. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/worker/train/rl/config.py +0 -0
  257. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/worker/train/rl/inputs.py +0 -0
  258. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/worker/train/rl/multi_turn.py +0 -0
  259. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/worker/train/rl/reward_module.py +0 -0
  260. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/worker/train/rl/scoring.py +0 -0
  261. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/worker/train/rl/single_turn.py +0 -0
  262. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/worker/train/rl/verl_config.py +0 -0
  263. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/worker/train/sft/__init__.py +0 -0
  264. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/worker/train/sft/checkpoints.py +0 -0
  265. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/worker/train/sft/child/entry.py +0 -0
  266. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/worker/train/sft/child/plugin.py +0 -0
  267. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/worker/train/sft/config.py +0 -0
  268. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/worker/verl/__init__.py +0 -0
  269. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/worker/verl/capabilities.py +0 -0
  270. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/worker/verl/checkpoints.py +0 -0
  271. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/worker/verl/child_io.py +0 -0
  272. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/worker/verl/diagnostics.py +0 -0
  273. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/worker/verl/parallelism.py +0 -0
  274. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/worker/verl/parent_work.py +0 -0
  275. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/engine/worker_entrypoint.py +0 -0
  276. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/envs/__init__.py +0 -0
  277. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/envs/adapter.py +0 -0
  278. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/envs/base.py +0 -0
  279. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/envs/cache_security.py +0 -0
  280. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/envs/dataset_selection.py +0 -0
  281. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/envs/evaluations.py +0 -0
  282. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/envs/identity.py +0 -0
  283. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/envs/loader.py +0 -0
  284. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/envs/namespace_listing.py +0 -0
  285. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/envs/package/__init__.py +0 -0
  286. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/envs/package/direct_tokens.py +0 -0
  287. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/envs/package/limits.py +0 -0
  288. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/envs/package/unpack.py +0 -0
  289. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/envs/pull.py +0 -0
  290. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/providers/__init__.py +0 -0
  291. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/providers/_lifecycle/__init__.py +0 -0
  292. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/providers/_lifecycle/auth.py +0 -0
  293. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/providers/_lifecycle/bootstrap_console.py +0 -0
  294. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/providers/_lifecycle/bootstrap_pip.py +0 -0
  295. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/providers/_lifecycle/bootstrap_secrets.py +0 -0
  296. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/providers/_lifecycle/deadline.py +0 -0
  297. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/providers/_lifecycle/host/__init__.py +0 -0
  298. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/providers/_lifecycle/host/deadline_sleep.py +0 -0
  299. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/providers/_lifecycle/host/failmark.py +0 -0
  300. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/providers/_lifecycle/host/hostlog.py +0 -0
  301. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/providers/_lifecycle/http.py +0 -0
  302. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/providers/_lifecycle/poll.py +0 -0
  303. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/providers/_lifecycle/poll_instance.py +0 -0
  304. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/providers/allocator.py +0 -0
  305. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/providers/artifacts/__init__.py +0 -0
  306. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/providers/artifacts/hf.py +0 -0
  307. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/providers/artifacts/preload_runpod.py +0 -0
  308. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/providers/artifacts/weight_cache.py +0 -0
  309. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/providers/fit_errors.py +0 -0
  310. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/providers/lambda_/api.py +0 -0
  311. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/providers/lambda_/auth.py +0 -0
  312. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/providers/lambda_/gpus.py +0 -0
  313. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/providers/lambda_/jobs/reap.py +0 -0
  314. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/providers/lambda_/preflight.py +0 -0
  315. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/providers/lambda_/pricing.py +0 -0
  316. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/providers/preflight.py +0 -0
  317. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/providers/realized.py +0 -0
  318. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/providers/runpod/api.py +0 -0
  319. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/providers/runpod/auth.py +0 -0
  320. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/providers/runpod/cost.py +0 -0
  321. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/providers/runpod/gpus.py +0 -0
  322. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/providers/runpod/preflight.py +0 -0
  323. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/providers/runpod/pricing.py +0 -0
  324. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/providers/runpod/resources.py +0 -0
  325. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/providers/sharding.py +0 -0
  326. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/providers/vast/api.py +0 -0
  327. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/providers/vast/auth.py +0 -0
  328. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/providers/vast/preflight.py +0 -0
  329. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/providers/vast/pricing.py +0 -0
  330. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/py.typed +0 -0
  331. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/runner/attempts.py +0 -0
  332. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/runner/costs.py +0 -0
  333. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/runner/deadlines.py +0 -0
  334. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/runner/preparation.py +0 -0
  335. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/runner/results/__init__.py +0 -0
  336. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/runner/results/checkpoints.py +0 -0
  337. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/runner/results/verified_revisions.py +0 -0
  338. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/runner/supervise/__init__.py +0 -0
  339. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/runner/supervise/deploy.py +0 -0
  340. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/runner/supervise/recovery.py +0 -0
  341. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/runner/supervise/retry_decision.py +0 -0
  342. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/runner/supervise/transitions.py +0 -0
  343. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/runner/weight_cache.py +0 -0
  344. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/runtime_capsule/__init__.py +0 -0
  345. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/runtime_capsule/build.py +0 -0
  346. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/runtime_capsule/manifest.py +0 -0
  347. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/schema/__init__.py +0 -0
  348. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/schema/fields.py +0 -0
  349. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/serve/__init__.py +0 -0
  350. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/serve/adapter_check.py +0 -0
  351. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/serve/deploy.py +0 -0
  352. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/serve/errors.py +0 -0
  353. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/serve/export.py +0 -0
  354. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/serve/preflight.py +0 -0
  355. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/serve/responses.py +0 -0
  356. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/serve/streaming.py +0 -0
  357. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/serve/thinking.py +0 -0
  358. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/serve/urls.py +0 -0
  359. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/server/__init__.py +0 -0
  360. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/server/__main__.py +0 -0
  361. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/server/app.py +0 -0
  362. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/server/billing/__init__.py +0 -0
  363. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/server/billing/charges.py +0 -0
  364. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/server/billing/retry.py +0 -0
  365. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/server/domain/__init__.py +0 -0
  366. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/server/domain/checkpoints.py +0 -0
  367. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/server/domain/environment_registry.py +0 -0
  368. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/server/domain/envs.py +0 -0
  369. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/server/domain/projects.py +0 -0
  370. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/server/domain/reconcile.py +0 -0
  371. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/server/domain/repo_cleanup.py +0 -0
  372. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/server/domain/teacher_broker.py +0 -0
  373. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/server/domain/teacher_errors.py +0 -0
  374. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/server/domain/teacher_requests.py +0 -0
  375. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/server/platform/__init__.py +0 -0
  376. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/server/platform/auth.py +0 -0
  377. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/server/platform/db.py +0 -0
  378. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/server/platform/deps.py +0 -0
  379. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/server/platform/internal_client.py +0 -0
  380. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/server/platform/locks.py +0 -0
  381. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/server/routes/__init__.py +0 -0
  382. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/server/routes/envs.py +0 -0
  383. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/server/routes/meta.py +0 -0
  384. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/server/routes/serving.py +0 -0
  385. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/server/routes/serving_completion.py +0 -0
  386. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/server/routes/serving_revisions.py +0 -0
  387. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/server/routes/serving_smoke.py +0 -0
  388. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/server/routes/teacher.py +0 -0
  389. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/teacher/__init__.py +0 -0
  390. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/teacher/limits.py +0 -0
  391. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/flash/teacher/retry_contract.py +0 -0
  392. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/scripts/build_dev_dist.py +0 -0
  393. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/scripts/check_file_size.py +0 -0
  394. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/scripts/check_function_size.py +0 -0
  395. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/scripts/check_verl_pin_exists.py +0 -0
  396. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/scripts/scrub_history.sh +0 -0
  397. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/__init__.py +0 -0
  398. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/_helpers/__init__.py +0 -0
  399. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/_helpers/profile.py +0 -0
  400. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/_helpers/runner.py +0 -0
  401. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/_helpers/specs.py +0 -0
  402. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/_helpers/teacher.py +0 -0
  403. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/_helpers/vast.py +0 -0
  404. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/capture_image_sft_processor_oracle.py +0 -0
  405. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/conftest.py +0 -0
  406. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/fixtures/image_sft_processor_oracle.json +0 -0
  407. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/fixtures/math_eval.jsonl +0 -0
  408. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/fixtures/math_train.jsonl +0 -0
  409. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/live/__init__.py +0 -0
  410. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/live/conftest.py +0 -0
  411. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/live/test_lambda_live.py +0 -0
  412. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/live/test_runpod_live.py +0 -0
  413. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/live/test_sft_thinking_render_live.py +0 -0
  414. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/live/test_vast_live.py +0 -0
  415. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_accounting_coverage.py +0 -0
  416. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_adapter_shard_completeness.py +0 -0
  417. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_agent_flash_cli_contract.py +0 -0
  418. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_algorithms.py +0 -0
  419. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_allocator.py +0 -0
  420. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_backend_common.py +0 -0
  421. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_backend_jobspec_contract.py +0 -0
  422. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_bake_kernel_cache.py +0 -0
  423. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_base_model_provenance.py +0 -0
  424. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_billing_retry.py +0 -0
  425. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_build_context_contract.py +0 -0
  426. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_catalog_consistency.py +0 -0
  427. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_catalog_only_models.py +0 -0
  428. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_charge_pricing.py +0 -0
  429. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_checkpoint_lifecycle.py +0 -0
  430. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_checkpoints.py +0 -0
  431. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_cli_commands.py +0 -0
  432. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_cli_commands_coverage.py +0 -0
  433. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_cli_credential_shadowing.py +0 -0
  434. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_cli_errors.py +0 -0
  435. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_cli_estimate.py +0 -0
  436. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_cli_gpus_flag.py +0 -0
  437. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_cli_help.py +0 -0
  438. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_cli_main_coverage.py +0 -0
  439. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_cli_managed.py +0 -0
  440. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_cli_render_coverage.py +0 -0
  441. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_cli_render_theme.py +0 -0
  442. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_cli_traces.py +0 -0
  443. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_cli_wandb_warning.py +0 -0
  444. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_client.py +0 -0
  445. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_client_import_purity.py +0 -0
  446. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_client_stream_reads.py +0 -0
  447. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_config_env_vars.py +0 -0
  448. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_config_overrides.py +0 -0
  449. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_console_upload.py +0 -0
  450. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_controlled_experiment_repairs.py +0 -0
  451. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_cost_analytical.py +0 -0
  452. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_cost_equation.py +0 -0
  453. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_cost_estimate.py +0 -0
  454. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_cost_hardware.py +0 -0
  455. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_cost_models.py +0 -0
  456. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_dataset_profile.py +0 -0
  457. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_deploy_alias_move_warning.py +0 -0
  458. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_deploy_latency.py +0 -0
  459. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_dev_channel.py +0 -0
  460. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_disk_gb.py +0 -0
  461. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_endpoint_name.py +0 -0
  462. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_env_cache_evict.py +0 -0
  463. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_env_delete.py +0 -0
  464. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_env_download.py +0 -0
  465. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_env_download_api.py +0 -0
  466. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_env_evaluations.py +0 -0
  467. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_env_list_api.py +0 -0
  468. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_env_list_cli.py +0 -0
  469. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_env_list_hub.py +0 -0
  470. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_env_no_install.py +0 -0
  471. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_env_pull.py +0 -0
  472. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_env_pull_coverage.py +0 -0
  473. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_env_pull_loader_coverage.py +0 -0
  474. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_env_pull_managed_control_plane.py +0 -0
  475. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_env_push.py +0 -0
  476. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_env_test.py +0 -0
  477. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_envs_coverage.py +0 -0
  478. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_export.py +0 -0
  479. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_flash_mvp.py +0 -0
  480. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_flashinfer_cache_dirs.py +0 -0
  481. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_freesolo_api_transport.py +0 -0
  482. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_fused_expert_warmstart.py +0 -0
  483. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_github_urlopen_retry.py +0 -0
  484. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_gpu_type_single_field.py +0 -0
  485. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_gpus.py +0 -0
  486. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_grpo_params.py +0 -0
  487. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_grpo_resident_sizing.py +0 -0
  488. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_grpo_reward_batching.py +0 -0
  489. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_health_liveness.py +0 -0
  490. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_hf_retry.py +0 -0
  491. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_idle_endpoint_reaper.py +0 -0
  492. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_image_sft_markers.py +0 -0
  493. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_image_sft_processor_parity.py +0 -0
  494. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_image_tokens.py +0 -0
  495. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_infisical_secrets.py +0 -0
  496. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_internal_client.py +0 -0
  497. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_kernel_cache.py +0 -0
  498. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_kernel_fingerprint.py +0 -0
  499. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_kv_util.py +0 -0
  500. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_lambda_api_coverage.py +0 -0
  501. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_logging.py +0 -0
  502. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_login_perms.py +0 -0
  503. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_lora_rank_coverage.py +0 -0
  504. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_lora_rank_preflight.py +0 -0
  505. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_managed_config_fields.py +0 -0
  506. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_metrics_schema_agent_contract.py +0 -0
  507. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_mig_guard.py +0 -0
  508. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_multimodal_training.py +0 -0
  509. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_named_reward_metrics.py +0 -0
  510. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_oom_escalate_gpu.py +0 -0
  511. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_opd.py +0 -0
  512. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_opd_limits.py +0 -0
  513. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_opd_multiturn_eos_boundary.py +0 -0
  514. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_opd_multiturn_failure_exit.py +0 -0
  515. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_opd_replay_guard.py +0 -0
  516. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_opd_train.py +0 -0
  517. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_packing.py +0 -0
  518. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_packing_coverage.py +0 -0
  519. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_parasail_teacher.py +0 -0
  520. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_persisted_spec_envelope.py +0 -0
  521. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_poll_helpers.py +0 -0
  522. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_preflight.py +0 -0
  523. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_projects.py +0 -0
  524. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_prompt_budget.py +0 -0
  525. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_provider_preflight_coverage.py +0 -0
  526. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_provider_teardown_robustness.py +0 -0
  527. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_providers_symmetry.py +0 -0
  528. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_realized_cost.py +0 -0
  529. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_repo_cleanup.py +0 -0
  530. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_resolve_params_b.py +0 -0
  531. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_rl_train.py +0 -0
  532. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_rollout_samples.py +0 -0
  533. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_runpod_api_delete.py +0 -0
  534. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_runpod_key_fingerprint.py +0 -0
  535. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_runpod_key_waterfall.py +0 -0
  536. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_runtime_capsule.py +0 -0
  537. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_serve.py +0 -0
  538. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_serve_reasoning_content.py +0 -0
  539. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_server_app_coverage.py +0 -0
  540. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_server_auth_singleflight.py +0 -0
  541. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_server_checkpoints_coverage.py +0 -0
  542. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_server_db.py +0 -0
  543. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_server_envs_coverage.py +0 -0
  544. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_server_locks_coverage.py +0 -0
  545. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_server_standalone.py +0 -0
  546. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_serving_context_preflight.py +0 -0
  547. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_serving_contract.py +0 -0
  548. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_serving_schema_coverage.py +0 -0
  549. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_sft_chunked_nll.py +0 -0
  550. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_sft_example_selection.py +0 -0
  551. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_sft_gc_off.py +0 -0
  552. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_sft_max_context.py +0 -0
  553. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_sft_startup_block.py +0 -0
  554. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_sft_train.py +0 -0
  555. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_sft_workload.py +0 -0
  556. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_spec_and_validation.py +0 -0
  557. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_spec_contract_bytes.py +0 -0
  558. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_step_floor.py +0 -0
  559. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_step_metrics.py +0 -0
  560. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_step_timing.py +0 -0
  561. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_structured_outputs.py +0 -0
  562. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_teacher_encoding_contract.py +0 -0
  563. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_thinking_config.py +0 -0
  564. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_train_context_preflight.py +0 -0
  565. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_training_controls.py +0 -0
  566. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_type_comment_prose.py +0 -0
  567. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_vast_api.py +0 -0
  568. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_vast_api_coverage.py +0 -0
  569. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_vast_offers.py +0 -0
  570. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_vast_provider_coverage.py +0 -0
  571. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_verified_revisions.py +0 -0
  572. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_verifiers.py +0 -0
  573. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_verl_checkpoint_export.py +0 -0
  574. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_verl_child_plugins.py +0 -0
  575. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_verl_silence_watchdog.py +0 -0
  576. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_version.py +0 -0
  577. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_vl_warmstart_adapter_keys.py +0 -0
  578. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_vram_architecture.py +0 -0
  579. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_wandb_link.py +0 -0
  580. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_wandb_naming.py +0 -0
  581. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_warmstart_adapter_download.py +0 -0
  582. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_warmstart_cross_repo.py +0 -0
  583. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_warmstart_error_attribution.py +0 -0
  584. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_worker_dryrun.py +0 -0
  585. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_worker_hardexit.py +0 -0
  586. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_worker_image.py +0 -0
  587. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_worker_init_heartbeat.py +0 -0
  588. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_worker_stack.py +0 -0
  589. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_worker_thinking.py +0 -0
  590. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_workflow_contracts.py +0 -0
  591. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_workload_profile.py +0 -0
  592. {freesolo_flash_dev-1.2.68 → freesolo_flash_dev-1.2.69}/tests/test_zero2_sharding_gate.py +0 -0
@@ -21,6 +21,7 @@ This file starts at 1.1.35. Earlier releases are not reconstructed here; use
21
21
 
22
22
  ### Changed
23
23
 
24
+ - Managed attempts now pin, verify, and report one immutable Flash source archive across retries and recovery.
24
25
  - Multi-turn GRPO now clones each sibling rollout from the task state that produced its prepared
25
26
  prompt. Environments that record randomized episode choices on the task during `start_episode`
26
27
  are stepped and scored against the same episode the model saw, without sharing mutable state
@@ -1,5 +1,5 @@
1
1
  # Flash prebuilt WORKER image — the full training stack baked in for RunPod workers.
2
- # The worker still fetches the flash `code/**` from HF at runtime, so only DEPS live here.
2
+ # the worker fetches one pinned source archive at runtime; the trusted verifier is baked here.
3
3
  #
4
4
  # this image name is defined in flash/providers/_lifecycle/worker.py. it must be
5
5
  # published to GHCR and the package set PUBLIC (no registry login is configured) so RunPod can
@@ -460,7 +460,8 @@ print(' gdn boundary resets: fla', M.version('flash-linear-attention'), 'and ca
460
460
  # from the real _train_body source in providers/runpod/serverless/endpoints.py (single source of truth;
461
461
  # _train_body is self-contained — every name is imported inside its body) and run it as the CMD so the
462
462
  # image is a self-contained RunPod Serverless worker. Build context is the repo root.
463
- COPY flash/providers/runpod/serverless/endpoints.py docker/make_rp_handler.py /tmp/rpgen/
464
- RUN python /tmp/rpgen/make_rp_handler.py /tmp/rpgen/endpoints.py /rp_handler.py \
463
+ COPY flash/providers/runpod/serverless/endpoints.py flash/source_snapshot.py docker/make_rp_handler.py /tmp/rpgen/
464
+ RUN cp /tmp/rpgen/source_snapshot.py /source_snapshot.py \
465
+ && python /tmp/rpgen/make_rp_handler.py /tmp/rpgen/endpoints.py /tmp/rpgen/source_snapshot.py /rp_handler.py \
465
466
  && python -c "import ast; ast.parse(open('/rp_handler.py').read()); print('rp_handler OK')"
466
467
  CMD ["python", "-u", "/rp_handler.py"]
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: freesolo-flash-dev
3
- Version: 1.2.68
3
+ Version: 1.2.69
4
4
  Summary: Flash — managed LoRA post-training (SFT/GRPO/OPD) for Freesolo environments, driven by the `flash` CLI
5
5
  Project-URL: Homepage, https://github.com/freesolo-co/flash
6
6
  Project-URL: Repository, https://github.com/freesolo-co/flash
@@ -236,6 +236,7 @@ def collect_inputs(
236
236
  root / "flash" / "providers" / "runpod" / "serverless" / "endpoints.py"
237
237
  ),
238
238
  "make_rp_handler_sha256": _sha256_file(root / "docker" / "make_rp_handler.py"),
239
+ "source_snapshot_sha256": _sha256_file(root / "flash" / "source_snapshot.py"),
239
240
  }
240
241
  return cache_inputs, base_inputs_partial
241
242
 
@@ -5,11 +5,10 @@ This makes the worker image a *self-contained RunPod Serverless worker* (Pattern
5
5
  Flash deploys it as a custom image (client mode), the baked CMD runs this handler, which reads the
6
6
  job payload from job["input"] and runs the training via `_train_body`.
7
7
 
8
- `_train_body` is fully self-contained (every name it uses is imported inside its body and it fetches
9
- the flash `code/**` from HF at runtime), so extracting just its source needs no flash import.
10
- Single source of truth: it's generated from the real `_train_body`, so it can't drift.
8
+ `_train_body` imports its trusted verifier from the sibling module baked into the image, then fetches
9
+ the pinned Flash source archive from HF.
11
10
 
12
- Usage: python make_rp_handler.py <path-to-endpoints.py> <out-path>
11
+ Usage: python make_rp_handler.py <path-to-endpoints.py> <path-to-source-snapshot.py> <out-path>
13
12
  """
14
13
 
15
14
  import ast
@@ -17,9 +16,11 @@ import sys
17
16
 
18
17
 
19
18
  def main() -> int:
20
- if len(sys.argv) != 3:
21
- raise SystemExit(f"usage: {sys.argv[0]} <path-to-endpoints.py> <out-path>")
22
- src_path, out_path = sys.argv[1], sys.argv[2]
19
+ if len(sys.argv) != 4:
20
+ raise SystemExit(
21
+ f"usage: {sys.argv[0]} <path-to-endpoints.py> <path-to-source-snapshot.py> <out-path>"
22
+ )
23
+ src_path, verifier_path, out_path = sys.argv[1], sys.argv[2], sys.argv[3]
23
24
  with open(src_path, encoding="utf-8") as f:
24
25
  src = f.read()
25
26
  fn_src = None
@@ -29,12 +30,20 @@ def main() -> int:
29
30
  break
30
31
  if not fn_src:
31
32
  raise SystemExit("could not find _train_body in " + src_path)
33
+ with open(verifier_path, "rb") as f:
34
+ verifier = f.read()
35
+ ast.parse(verifier, filename=verifier_path)
32
36
  out = (
33
37
  "# AUTO-GENERATED by flash/docker/make_rp_handler.py from providers/runpod/train/endpoints.py.\n"
34
38
  "# Do not edit; the worker image regenerates it at build time.\n"
35
39
  "import runpod\n\n" + fn_src + "\n\ndef handler(job):\n"
36
40
  ' """RunPod Serverless entry: the job payload is the control plane\'s train input."""\n'
37
- ' return _train_body(job["input"])\n\n'
41
+ " try:\n"
42
+ ' return _train_body(job["input"])\n'
43
+ " except Exception as exc:\n"
44
+ ' if getattr(exc, "flash_retriable", False):\n'
45
+ ' return {"error": str(exc), "_flash_retriable": True}\n'
46
+ " raise\n\n"
38
47
  'runpod.serverless.start({"handler": handler})\n'
39
48
  )
40
49
  # Validate it parses before baking.
@@ -20,6 +20,7 @@ from datetime import UTC, datetime
20
20
  from email.utils import parsedate_to_datetime
21
21
 
22
22
  if __package__:
23
+ from flash import source_snapshot as _source_snapshot
23
24
  from flash.providers._lifecycle import bootstrap_console as _bootstrap_console
24
25
  from flash.providers._lifecycle import bootstrap_pip
25
26
  from flash.providers._lifecycle.bootstrap_secrets import (
@@ -32,6 +33,7 @@ else:
32
33
  # same directory, and the script directory leads sys.path.
33
34
  import bootstrap_console as _bootstrap_console # type: ignore[no-redef]
34
35
  import bootstrap_pip # type: ignore[no-redef]
36
+ import source_snapshot as _source_snapshot # type: ignore[no-redef]
35
37
  from bootstrap_secrets import ( # type: ignore[no-redef]
36
38
  _payload_secrets,
37
39
  _read_console_tail,
@@ -139,38 +141,22 @@ def _arm(payload: dict) -> str:
139
141
  return str(payload.get("flash_arm") or "instance")
140
142
 
141
143
 
142
- def _code_prefix(payload: dict) -> str:
143
- raw = payload.get("code_prefix")
144
- if not isinstance(raw, str) or not raw.strip():
145
- raise ValueError("missing code_prefix")
146
- prefix = raw.strip().strip("/")
147
- parts = prefix.split("/")
148
- digest = parts[1] if len(parts) == 3 else ""
149
- if (
150
- len(parts) != 3
151
- or parts[0] != "code"
152
- or parts[2] != "flash"
153
- or len(digest) != 32
154
- or any(c not in "0123456789abcdef" for c in digest)
155
- ):
156
- raise ValueError(f"invalid code_prefix: {prefix!r}")
157
- return prefix
144
+ def _source_descriptor(payload: dict):
145
+ return _source_snapshot.parse_descriptor(payload.get("source_snapshot"))
158
146
 
159
147
 
160
148
  def _code_dir(payload: dict) -> str:
161
- raw = payload.get("code_prefix")
162
- if not isinstance(raw, str) or not raw.strip():
163
- return os.path.join(CODE_ROOT, "code")
164
- return os.path.join(CODE_ROOT, os.path.dirname(_code_prefix(payload)))
149
+ return str(
150
+ _source_snapshot.attempt_materialization_path(
151
+ CODE_ROOT,
152
+ payload.get("run_id"),
153
+ payload.get("attempt"),
154
+ )
155
+ )
165
156
 
166
157
 
167
158
  def _hf_status_code(exc: BaseException) -> int | None:
168
- response = getattr(exc, "response", None)
169
- code = getattr(response, "status_code", None)
170
- try:
171
- return int(code)
172
- except (TypeError, ValueError):
173
- return None
159
+ return _source_snapshot.response_status_code(exc)
174
160
 
175
161
 
176
162
  def _hf_retry_after(exc: BaseException) -> float | None:
@@ -208,7 +194,7 @@ def _hf_call(call, label: str, *, deadline_at: float | None = None, secrets: dic
208
194
  try:
209
195
  return call()
210
196
  except Exception as exc:
211
- if _hf_status_code(exc) not in _HF_TRANSIENT_STATUS_CODES or attempt >= len(
197
+ if not _source_snapshot.is_transient_fetch_error(exc) or attempt >= len(
212
198
  _HF_RETRY_DELAYS_S
213
199
  ):
214
200
  raise
@@ -580,45 +566,36 @@ def install_extra_pip(payload: dict) -> None:
580
566
 
581
567
 
582
568
  def fetch_code(payload: dict) -> None:
583
- from huggingface_hub import HfApi, hf_hub_download
569
+ from huggingface_hub import hf_hub_download
584
570
 
585
571
  deadline_at = require_deadline_at(payload)
586
- prefix = _code_prefix(payload)
572
+ descriptor = _source_descriptor(payload)
587
573
  token = (payload.get("env") or {}).get("HF_TOKEN")
588
- api = HfApi(token=token)
589
- files = [
590
- entry.path
591
- for entry in _hf_call(
592
- lambda: list(
593
- api.list_repo_tree(
594
- repo_id=payload["hf_repo"],
595
- repo_type="dataset",
596
- path_in_repo=prefix,
597
- recursive=True,
598
- token=token,
599
- )
600
- ),
601
- f"list flash code under {payload['hf_repo']}:{prefix}",
602
- deadline_at=deadline_at,
603
- secrets=_payload_secrets(payload),
604
- )
605
- if getattr(entry, "path", None) and getattr(entry, "size", None) is not None
606
- ]
607
- if not files:
608
- raise RuntimeError(f"no flash code files found under {payload['hf_repo']}:{prefix}")
609
- for filename in files:
610
- _hf_call(
611
- lambda filename=filename: hf_hub_download(
574
+ try:
575
+ archive_path = _hf_call(
576
+ lambda: hf_hub_download(
612
577
  repo_id=payload["hf_repo"],
613
578
  repo_type="dataset",
614
- filename=filename,
615
- local_dir=CODE_ROOT,
579
+ filename=descriptor.archive_path,
580
+ revision=descriptor.revision,
616
581
  token=token,
617
582
  ),
618
- f"download flash code file {payload['hf_repo']}:{filename}",
583
+ "download pinned flash source snapshot",
619
584
  deadline_at=deadline_at,
620
585
  secrets=_payload_secrets(payload),
621
586
  )
587
+ except Exception as exc:
588
+ error_type = (
589
+ RetriableBootstrapError
590
+ if _source_snapshot.is_transient_fetch_error(exc)
591
+ else RuntimeError
592
+ )
593
+ raise error_type("failed to fetch the pinned flash source snapshot") from None
594
+ _source_snapshot.materialize_verified_archive_file(
595
+ archive_path,
596
+ descriptor,
597
+ _code_dir(payload),
598
+ )
622
599
 
623
600
 
624
601
  def run_mode(payload: dict, env: dict, mode: str, deadline_ts: float) -> int:
@@ -780,6 +757,12 @@ def write_attempt_marker(payload: dict, ok: bool, error: str = "", retriable: bo
780
757
  "run_id": run_id,
781
758
  "ts": now,
782
759
  }
760
+ if ok:
761
+ marker["source_attestation"] = _source_snapshot.source_attestation(
762
+ _source_descriptor(payload),
763
+ run_id=run_id,
764
+ attempt=attempt,
765
+ )
783
766
  p = "/tmp/attempt_marker.json"
784
767
  with open(p, "w") as f:
785
768
  json.dump(marker, f)
@@ -924,13 +907,9 @@ def main() -> int:
924
907
  error = "model preload failed" if not ok else ""
925
908
  return 0 if ok else 1
926
909
  deadline_watchdog = arm_deadline_watchdog(deadline, payload)
910
+ # fetch and verify the pinned archive before pip, downloaded imports, path mutation, or child.
911
+ fetch_code(payload)
927
912
  install_extra_pip(payload)
928
- # Pre-worker HF fetch of the run's own code (control plane uploaded it before submit), same
929
- # infra-shaped class as fetch_spec_from_hf above: a transient HF blip must retry, not fail.
930
- try:
931
- fetch_code(payload)
932
- except Exception:
933
- raise RetriableBootstrapError("failed to fetch run code from HF") from None
934
913
  env = build_worker_env(payload)
935
914
  phase = payload["phase"]
936
915
  for stale in ("/tmp/train_meta.json", "/tmp/metrics.json"):
@@ -191,7 +191,7 @@ def build_payload(
191
191
  cache_host_mount: str | None = None,
192
192
  mode: str | None = None,
193
193
  models: list | None = None,
194
- code_prefix: str | None = None,
194
+ source_snapshot: dict | None = None,
195
195
  deadline_at: float | None = None,
196
196
  ) -> dict:
197
197
  """The bootstrap's input — field-compatible with the RunPod ``_train_body`` payload, plus the
@@ -203,7 +203,7 @@ def build_payload(
203
203
  build_worker_env,
204
204
  strip_runpod_volume_env,
205
205
  )
206
- from flash.runner import flash_code_prefix
206
+ from flash.source_snapshot import parse_descriptor
207
207
 
208
208
  canonical_seed = require_matching_seed(spec, seed)
209
209
  # strip the runpod-only volume redirect; point base-model prefetch at this provider's cache unless the user overrode it.
@@ -233,12 +233,13 @@ def build_payload(
233
233
  # [environment] pip is appended to the worker requirement, never substituted for it.
234
234
  "extra_pip": worker_pip_with_extras(spec.environment.id, spec.environment.pip),
235
235
  "hf_prefix": f"{spec.phase}/{spec.run_id}",
236
- "code_prefix": code_prefix or flash_code_prefix(),
237
236
  "deadline_at": absolute_deadline,
238
237
  "run_created_at": absolute_deadline - max_wall_seconds,
239
238
  "run_max_wall_seconds": max_wall_seconds,
240
239
  "attempt": attempt_id,
241
240
  }
241
+ if mode != "preload":
242
+ payload["source_snapshot"] = parse_descriptor(source_snapshot).to_dict()
242
243
  if cache_host_mount:
243
244
  payload["cache_host_mount"] = cache_host_mount
244
245
  # Carry the mount sentinel filename so the bootstrap's mount-check reads it from one constant.
@@ -66,7 +66,7 @@ class InstanceProvider(abc.ABC):
66
66
  on_handle: Any,
67
67
  attempt: int,
68
68
  runtime_secrets: dict[str, str] | None,
69
- code_prefix: str | None,
69
+ source_snapshot: dict | None,
70
70
  deadline_at: float | None,
71
71
  ) -> PollResult: ...
72
72
 
@@ -122,7 +122,7 @@ class InstanceProvider(abc.ABC):
122
122
  attempt: int = 0,
123
123
  runtime_secrets: dict[str, str] | None = None,
124
124
  on_last_gpu: bool = False,
125
- code_prefix: str | None = None,
125
+ source_snapshot: dict | None = None,
126
126
  _deadline_at: float | None = None,
127
127
  ) -> PollResult:
128
128
  from flash.core.spec import require_matching_seed
@@ -136,7 +136,7 @@ class InstanceProvider(abc.ABC):
136
136
  on_handle=on_handle,
137
137
  attempt=attempt,
138
138
  runtime_secrets=runtime_secrets,
139
- code_prefix=code_prefix,
139
+ source_snapshot=source_snapshot,
140
140
  deadline_at=_deadline_at,
141
141
  )
142
142
 
@@ -156,19 +156,22 @@ def decode_terminal_marker(
156
156
  the caller allows. A marker that cannot be verified must never settle an attempt.
157
157
  """
158
158
  marker = json.loads(raw)
159
- if not isinstance(marker, dict) or set(marker) != {
160
- "attempt",
161
- "error",
162
- "ok",
163
- "retriable",
164
- "run_id",
165
- "ts",
159
+ base_fields = {"attempt", "error", "ok", "retriable", "run_id", "ts"}
160
+ if not isinstance(marker, dict) or set(marker) not in {
161
+ frozenset(base_fields),
162
+ frozenset(base_fields | {"source_attestation"}),
166
163
  }:
167
164
  raise ValueError("invalid terminal marker schema")
168
165
  marker_attempt = marker["attempt"]
169
166
  ts = marker["ts"]
170
167
  error = marker["error"]
171
168
  now = time.time()
169
+ if "source_attestation" in marker:
170
+ from flash.source_snapshot import parse_attestation
171
+
172
+ attestation = parse_attestation(marker["source_attestation"])
173
+ if attestation["run_id"] != run_id or attestation["attempt"] != attempt:
174
+ raise ValueError("invalid terminal marker source identity")
172
175
  if (
173
176
  isinstance(launch_floor, bool)
174
177
  or not isinstance(launch_floor, (int, float))
@@ -258,4 +261,8 @@ def resolve_terminal_artifacts(
258
261
  marker=marker,
259
262
  metrics_unparseable=raw_metrics is not None,
260
263
  )
264
+ if "source_attestation" in marker:
265
+ from flash.source_snapshot import TERMINAL_ATTESTATION_KEY
266
+
267
+ metrics = {**metrics, TERMINAL_ATTESTATION_KEY: marker["source_attestation"]}
261
268
  return TerminalResolution(TerminalKind.SUCCESS, metrics=metrics, marker=marker)
@@ -1,10 +1,11 @@
1
- """Provider-neutral worker packaging: the deps/image/env every rent-a-box or serverless worker ships, plus upload_code for the HF code snapshot. Shared kernel — no provider package imports another for this."""
1
+ """Provider-neutral worker packaging and immutable managed source publication."""
2
2
 
3
3
  from __future__ import annotations
4
4
 
5
5
  import os
6
6
  import time
7
7
  from io import BytesIO
8
+ from pathlib import Path
8
9
 
9
10
  from flash._internal.diagnostics import SECRET_ENV_KEYS_ENV
10
11
  from flash._internal.logging import get_logger
@@ -205,9 +206,6 @@ def build_worker_env(
205
206
  return env
206
207
 
207
208
 
208
- _CODE_SNAPSHOT_COMPLETE = ".flash-code-snapshot-complete"
209
-
210
-
211
209
  def _hf_call(call, label: str, *, deadline_at: float | None = None):
212
210
  return hf_call(
213
211
  call,
@@ -246,53 +244,120 @@ def _ensure_private_artifact_repo(
246
244
  )
247
245
 
248
246
 
249
- def upload_code(
247
+ def _repo_revision(api, repo: str, *, deadline_at: float | None) -> str:
248
+ info = _hf_call(
249
+ lambda: api.repo_info(repo_id=repo, repo_type="dataset"),
250
+ f"read artifact repo revision {repo}",
251
+ deadline_at=deadline_at,
252
+ )
253
+ revision = str(getattr(info, "sha", None) or getattr(info, "oid", None) or "").strip()
254
+ if not revision:
255
+ raise RuntimeError("artifact repository revision is unavailable")
256
+ return revision
257
+
258
+
259
+ def _download_source_archive(
260
+ repo: str,
261
+ archive_path: str,
262
+ revision: str,
263
+ token: str | None,
264
+ *,
265
+ deadline_at: float | None,
266
+ ) -> bytes | None:
267
+ from huggingface_hub import hf_hub_download
268
+
269
+ try:
270
+ local_path = _hf_call(
271
+ lambda: hf_hub_download(
272
+ repo_id=repo,
273
+ repo_type="dataset",
274
+ filename=archive_path,
275
+ revision=revision,
276
+ token=token,
277
+ ),
278
+ f"download source snapshot {repo}:{archive_path}@{revision}",
279
+ deadline_at=deadline_at,
280
+ )
281
+ except Exception as exc:
282
+ if hf_status_code(exc) == 404 or exc.__class__.__name__ in {
283
+ "EntryNotFoundError",
284
+ "LocalEntryNotFoundError",
285
+ }:
286
+ return None
287
+ raise
288
+ with open(local_path, "rb") as source:
289
+ return source.read()
290
+
291
+
292
+ def publish_source_snapshot(
250
293
  repo: str | None = None,
251
294
  *,
252
- code_prefix: str | None = None,
253
295
  deadline_at: float | None = None,
254
- ) -> str:
255
- """Upload the ``flash`` package to its content-addressed HF artifact prefix."""
296
+ ) -> dict:
297
+ """Publish one deterministic source archive and return its immutable descriptor."""
256
298
  from huggingface_hub import HfApi
257
299
 
258
300
  import flash
259
- from flash.runner import flash_code_prefix
301
+ from flash.source_snapshot import (
302
+ build_source_archive,
303
+ canonical_archive_path,
304
+ descriptor_for_archive,
305
+ read_verified_archive,
306
+ sha256_bytes,
307
+ )
260
308
 
261
309
  if not repo:
262
310
  raise RuntimeError(
263
311
  "hf_repo must be set (the run's [train] hf_repo: HF dataset repo for code + artifacts)"
264
312
  )
265
313
  token = os.environ.get("HF_TOKEN")
266
- pkg_dir = os.path.realpath(os.path.dirname(os.path.abspath(flash.__file__)))
267
314
  api = HfApi(token=token)
268
315
  _ensure_private_artifact_repo(api, repo, deadline_at=deadline_at)
269
- code_prefix = code_prefix or flash_code_prefix()
270
- code_marker = f"{code_prefix}/{_CODE_SNAPSHOT_COMPLETE}"
271
- if _hf_call(
272
- lambda: api.file_exists(repo_id=repo, filename=code_marker, repo_type="dataset"),
273
- f"check flash code snapshot {repo}:{code_marker}",
274
- deadline_at=deadline_at,
275
- ):
276
- return repo
277
- _hf_call(
278
- lambda: api.upload_folder(
279
- folder_path=pkg_dir,
280
- path_in_repo=code_prefix,
281
- repo_id=repo,
282
- repo_type="dataset",
283
- ignore_patterns=["__pycache__/*", "*.pyc", "*.pyo"],
284
- ),
285
- f"upload flash code to {repo}:{code_prefix}",
286
- deadline_at=deadline_at,
287
- )
288
- _hf_call(
289
- lambda: api.upload_file(
290
- path_or_fileobj=BytesIO(b"complete\n"),
291
- path_in_repo=code_marker,
292
- repo_id=repo,
293
- repo_type="dataset",
294
- ),
295
- f"mark flash code snapshot complete {repo}:{code_marker}",
296
- deadline_at=deadline_at,
297
- )
298
- return repo
316
+ package_dir = os.path.realpath(os.path.dirname(os.path.abspath(flash.__file__)))
317
+ archive = build_source_archive(package_dir=Path(package_dir))
318
+ digest = sha256_bytes(archive)
319
+ archive_path = canonical_archive_path(digest)
320
+
321
+ def verified_at(revision: str) -> dict | None:
322
+ candidate = _download_source_archive(
323
+ repo,
324
+ archive_path,
325
+ revision,
326
+ token,
327
+ deadline_at=deadline_at,
328
+ )
329
+ if candidate is None:
330
+ return None
331
+ descriptor = descriptor_for_archive(archive, revision)
332
+ read_verified_archive(candidate, descriptor)
333
+ return descriptor.to_dict()
334
+
335
+ head = _repo_revision(api, repo, deadline_at=deadline_at)
336
+ existing = verified_at(head)
337
+ if existing is not None:
338
+ return existing
339
+ try:
340
+ commit = _hf_call(
341
+ lambda: api.upload_file(
342
+ path_or_fileobj=BytesIO(archive),
343
+ path_in_repo=archive_path,
344
+ repo_id=repo,
345
+ repo_type="dataset",
346
+ commit_message=f"publish flash source {digest}",
347
+ ),
348
+ f"publish source snapshot {repo}:{archive_path}",
349
+ deadline_at=deadline_at,
350
+ )
351
+ revision = str(getattr(commit, "oid", None) or "").strip()
352
+ if not revision:
353
+ raise RuntimeError("source snapshot publication returned no immutable revision")
354
+ published = verified_at(revision)
355
+ if published is None:
356
+ raise RuntimeError("published source snapshot is not readable at its commit revision")
357
+ return published
358
+ except Exception:
359
+ winner_revision = _repo_revision(api, repo, deadline_at=deadline_at)
360
+ winner = verified_at(winner_revision)
361
+ if winner is not None:
362
+ return winner
363
+ raise
@@ -903,7 +903,7 @@ class Provider(Protocol):
903
903
  attempt: int = 0,
904
904
  runtime_secrets: dict[str, str] | None = None,
905
905
  on_last_gpu: bool = False,
906
- code_prefix: str | None = None,
906
+ source_snapshot: dict | None = None,
907
907
  _deadline_at: float | None = None,
908
908
  ) -> PollResult:
909
909
  """Deploy/rent -> submit -> persist handle (via ``on_handle``) -> poll to terminal.
@@ -55,7 +55,7 @@ class LambdaProvider(InstanceProvider):
55
55
  on_handle: Any,
56
56
  attempt: int,
57
57
  runtime_secrets: dict[str, str] | None,
58
- code_prefix: str | None,
58
+ source_snapshot: dict | None,
59
59
  deadline_at: float | None,
60
60
  ) -> PollResult:
61
61
  from flash.providers.lambda_.jobs import submit_run_lambda
@@ -67,7 +67,7 @@ class LambdaProvider(InstanceProvider):
67
67
  on_handle=on_handle,
68
68
  attempt=attempt,
69
69
  runtime_secrets=runtime_secrets,
70
- code_prefix=code_prefix,
70
+ source_snapshot=source_snapshot,
71
71
  deadline_at=deadline_at,
72
72
  )
73
73