freesolo-flash-dev 1.2.67__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.67 → freesolo_flash_dev-1.2.69}/CHANGELOG.md +1 -0
  2. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/Dockerfile.worker +4 -3
  3. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/PKG-INFO +1 -1
  4. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/docker/kernel_fingerprint.py +1 -0
  5. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/docker/make_rp_handler.py +17 -8
  6. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/cli/commands/env/push.py +14 -1
  7. freesolo_flash_dev-1.2.69/flash/envs/package/direct_tokens.py +136 -0
  8. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/providers/_lifecycle/bootstrap.py +41 -62
  9. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/providers/_lifecycle/instance.py +4 -3
  10. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/providers/_lifecycle/provider.py +3 -3
  11. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/providers/_lifecycle/terminal_artifacts.py +14 -7
  12. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/providers/_lifecycle/worker.py +105 -40
  13. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/providers/base.py +1 -1
  14. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/providers/lambda_/__init__.py +2 -2
  15. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/providers/lambda_/jobs/__init__.py +19 -17
  16. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/providers/lambda_/jobs/builders.py +2 -2
  17. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/providers/runpod/__init__.py +2 -2
  18. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/providers/runpod/job_execution.py +7 -1
  19. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/providers/runpod/jobs.py +7 -3
  20. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/providers/runpod/serverless/__init__.py +1 -1
  21. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/providers/runpod/serverless/endpoints.py +173 -172
  22. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/providers/vast/__init__.py +2 -2
  23. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/providers/vast/jobs/__init__.py +4 -4
  24. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/providers/vast/jobs/builders.py +2 -2
  25. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/runner/__init__.py +21 -1
  26. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/runner/artifacts.py +0 -22
  27. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/runner/reconciliation.py +11 -0
  28. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/runner/status.py +70 -4
  29. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/runner/submit.py +29 -6
  30. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/runner/supervise/attach.py +29 -33
  31. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/runner/supervise/lifecycle.py +19 -26
  32. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/runner/supervise/seed_submission.py +17 -9
  33. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/runtime_capsule/profiles.py +2 -1
  34. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/server/domain/envs.py +9 -0
  35. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/server/domain/run_registry.py +3 -2
  36. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/server/platform/runtime.py +6 -0
  37. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/server/routes/runs.py +4 -1
  38. freesolo_flash_dev-1.2.69/flash/source_snapshot.py +387 -0
  39. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/pyproject.toml +2 -2
  40. freesolo_flash_dev-1.2.69/tests/_helpers/source_snapshot.py +13 -0
  41. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/tests/test_cancel_remote.py +9 -5
  42. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/tests/test_client_server_integration.py +3 -0
  43. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/tests/test_env_publish.py +102 -0
  44. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/tests/test_env_push.py +198 -0
  45. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/tests/test_env_rate_limit_resolve.py +7 -0
  46. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/tests/test_env_ref_pinning.py +15 -2
  47. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/tests/test_flash_worker.py +135 -89
  48. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/tests/test_instance_bootstrap_coverage.py +208 -57
  49. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/tests/test_jobs.py +157 -161
  50. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/tests/test_lambda_runner.py +77 -73
  51. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/tests/test_managed_hf_repo.py +4 -4
  52. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/tests/test_multi_gpu_gate.py +6 -0
  53. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/tests/test_opd_resume_safety.py +23 -9
  54. freesolo_flash_dev-1.2.69/tests/test_orchestrator_flash.py +484 -0
  55. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/tests/test_provider_routing.py +109 -44
  56. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/tests/test_resume_on_retry.py +10 -1
  57. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/tests/test_runmgmt.py +32 -13
  58. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/tests/test_server_api.py +42 -26
  59. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/tests/test_server_billing.py +4 -0
  60. freesolo_flash_dev-1.2.69/tests/test_source_attestation_flow.py +189 -0
  61. freesolo_flash_dev-1.2.69/tests/test_source_snapshot.py +201 -0
  62. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/tests/test_teacher_broker.py +18 -2
  63. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/tests/test_terminal_artifacts.py +14 -0
  64. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/tests/test_vast_runner.py +21 -10
  65. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/tests/test_weight_cache.py +56 -1
  66. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/uv.lock +1 -1
  67. freesolo_flash_dev-1.2.67/tests/test_orchestrator_flash.py +0 -563
  68. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/.dockerignore +0 -0
  69. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/.env.example +0 -0
  70. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/.github/CODEOWNERS +0 -0
  71. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  72. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  73. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
  74. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  75. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/.github/dependabot.yml +0 -0
  76. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/.github/workflows/auto-rebake.yml +0 -0
  77. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/.github/workflows/bake-kernel-cache.yml +0 -0
  78. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/.github/workflows/ci.yml +0 -0
  79. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/.github/workflows/main-source-guard.yml +0 -0
  80. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/.github/workflows/notify-tests-repo.yml +0 -0
  81. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/.github/workflows/publish-dev.yml +0 -0
  82. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/.github/workflows/publish-image.yml +0 -0
  83. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/.github/workflows/publish.yml +0 -0
  84. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/.github/workflows/version-parity.yml +0 -0
  85. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/.github/workflows/worker-image.yml +0 -0
  86. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/.gitignore +0 -0
  87. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/CODE_OF_CONDUCT.md +0 -0
  88. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/CONTRIBUTING.md +0 -0
  89. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/Dockerfile +0 -0
  90. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/LICENSE +0 -0
  91. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/NOTICE +0 -0
  92. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/README.md +0 -0
  93. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/SECURITY.md +0 -0
  94. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/SELF_HOSTING.md +0 -0
  95. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/build/kernel_cache/.gitignore +0 -0
  96. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/build/kernel_cache/.keep +0 -0
  97. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/deploy/infisical/README.md +0 -0
  98. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/deploy/infisical/entrypoint.sh +0 -0
  99. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/docker/Dockerfile.kernelcache +0 -0
  100. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/docker/Dockerfile.kernelcache.relayer +0 -0
  101. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/docker/bake_kernel_cache.py +0 -0
  102. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/docker/bake_pod_entry.py +0 -0
  103. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/docker/extract_cudart_fix.py +0 -0
  104. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/__init__.py +0 -0
  105. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/_internal/__init__.py +0 -0
  106. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/_internal/channel.py +0 -0
  107. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/_internal/diagnostics.py +0 -0
  108. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/_internal/fileio.py +0 -0
  109. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/_internal/logging.py +0 -0
  110. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/_internal/paths.py +0 -0
  111. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/adapters/__init__.py +0 -0
  112. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/adapters/artifacts.py +0 -0
  113. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/adapters/fused_experts.py +0 -0
  114. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/adapters/lora_rank.py +0 -0
  115. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/cli/__init__.py +0 -0
  116. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/cli/__main__.py +0 -0
  117. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/cli/commands/__init__.py +0 -0
  118. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/cli/commands/deploy.py +0 -0
  119. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/cli/commands/env/__init__.py +0 -0
  120. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/cli/commands/env/episode.py +0 -0
  121. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/cli/commands/env/eval.py +0 -0
  122. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/cli/commands/env/eval_args.py +0 -0
  123. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/cli/commands/env/imports.py +0 -0
  124. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/cli/commands/env/list.py +0 -0
  125. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/cli/commands/env/retained.py +0 -0
  126. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/cli/commands/env/setup.py +0 -0
  127. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/cli/commands/env/setup_wandb.py +0 -0
  128. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/cli/commands/env/test.py +0 -0
  129. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/cli/commands/env/test_evaluations.py +0 -0
  130. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/cli/commands/env/test_params.py +0 -0
  131. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/cli/commands/env/test_warnings.py +0 -0
  132. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/cli/commands/prompt_budget.py +0 -0
  133. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/cli/commands/traces.py +0 -0
  134. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/cli/commands/train_cost.py +0 -0
  135. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/cli/scaffold/TRAINING.md +0 -0
  136. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/cli/scaffold/__init__.py +0 -0
  137. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/cli/ui/__init__.py +0 -0
  138. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/cli/ui/cost.py +0 -0
  139. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/cli/ui/env_panels.py +0 -0
  140. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/cli/ui/heartbeat.py +0 -0
  141. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/cli/ui/render.py +0 -0
  142. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/cli/ui/tables.py +0 -0
  143. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/cli/ui/tty.py +0 -0
  144. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/client/__init__.py +0 -0
  145. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/client/config.py +0 -0
  146. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/client/freesolo_api.py +0 -0
  147. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/client/http.py +0 -0
  148. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/client/runtime_secrets.py +0 -0
  149. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/client/shapes.py +0 -0
  150. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/client/specs.py +0 -0
  151. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/client/streaming.py +0 -0
  152. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/content/__init__.py +0 -0
  153. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/content/multimodal.py +0 -0
  154. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/content/structured_outputs.py +0 -0
  155. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/content/thinking.py +0 -0
  156. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/core/__init__.py +0 -0
  157. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/core/catalog.py +0 -0
  158. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/core/spec.py +0 -0
  159. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/core/spec_persistence.py +0 -0
  160. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/cost/__init__.py +0 -0
  161. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/cost/analytical.py +0 -0
  162. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/cost/facts.py +0 -0
  163. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/cost/spec.py +0 -0
  164. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/cost/types.py +0 -0
  165. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/engine/__init__.py +0 -0
  166. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/engine/huggingface.py +0 -0
  167. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/engine/plan/__init__.py +0 -0
  168. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/engine/plan/kv_sizing.py +0 -0
  169. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/engine/plan/model_config_probe.py +0 -0
  170. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/engine/plan/prompt_budget.py +0 -0
  171. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/engine/plan/recipe.py +0 -0
  172. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/engine/plan/steps.py +0 -0
  173. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/engine/plan/vram.py +0 -0
  174. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/engine/profiling/__init__.py +0 -0
  175. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/engine/profiling/dataset_profile.py +0 -0
  176. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/engine/profiling/image_tokens.py +0 -0
  177. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/engine/profiling/reasoning_render.py +0 -0
  178. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/engine/profiling/sft_image_rows.py +0 -0
  179. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/engine/profiling/sft_workload.py +0 -0
  180. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/engine/profiling/tokenizer.py +0 -0
  181. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/engine/profiling/workload_profile.py +0 -0
  182. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/engine/result/__init__.py +0 -0
  183. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/engine/result/accounting.py +0 -0
  184. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/engine/result/rollout_samples.py +0 -0
  185. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/engine/worker/__init__.py +0 -0
  186. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/engine/worker/__main__.py +0 -0
  187. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/engine/worker/backend_common.py +0 -0
  188. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/engine/worker/entry/__init__.py +0 -0
  189. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/engine/worker/entry/opd.py +0 -0
  190. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/engine/worker/entry/rl.py +0 -0
  191. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/engine/worker/entry/sft.py +0 -0
  192. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/engine/worker/io/__init__.py +0 -0
  193. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/engine/worker/io/heartbeat.py +0 -0
  194. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/engine/worker/io/hf.py +0 -0
  195. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/engine/worker/io/prefetch.py +0 -0
  196. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/engine/worker/io/wandb_log.py +0 -0
  197. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/engine/worker/model/__init__.py +0 -0
  198. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/engine/worker/model/adapter.py +0 -0
  199. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/engine/worker/model/chatml_mask.py +0 -0
  200. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/engine/worker/model/decoding.py +0 -0
  201. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/engine/worker/model/lora.py +0 -0
  202. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/engine/worker/model/packing.py +0 -0
  203. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/engine/worker/opd_train.py +0 -0
  204. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/engine/worker/opd_train_runner.py +0 -0
  205. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/engine/worker/perf/__init__.py +0 -0
  206. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/engine/worker/perf/diagnostics.py +0 -0
  207. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/engine/worker/perf/lifecycle.py +0 -0
  208. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/engine/worker/perf/liger.py +0 -0
  209. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/engine/worker/perf/memory.py +0 -0
  210. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/engine/worker/rl_train.py +0 -0
  211. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/engine/worker/rl_train_runner.py +0 -0
  212. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/engine/worker/runtime/__init__.py +0 -0
  213. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/engine/worker/runtime/kernel_warmup.py +0 -0
  214. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/engine/worker/runtime/pkg_proxy.py +0 -0
  215. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/engine/worker/runtime/rng.py +0 -0
  216. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/engine/worker/score_batcher.py +0 -0
  217. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/engine/worker/sft_train.py +0 -0
  218. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/engine/worker/sft_train_runner.py +0 -0
  219. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/engine/worker/teacher/__init__.py +0 -0
  220. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/engine/worker/teacher/client.py +0 -0
  221. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/engine/worker/teacher/encoding.py +0 -0
  222. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/engine/worker/teacher/tokenizer_align.py +0 -0
  223. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/engine/worker/train/__init__.py +0 -0
  224. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/engine/worker/train/core/__init__.py +0 -0
  225. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/engine/worker/train/core/checkpoint_lifecycle.py +0 -0
  226. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/engine/worker/train/core/child/__init__.py +0 -0
  227. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/engine/worker/train/core/child/glue.py +0 -0
  228. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/engine/worker/train/core/child/runtime.py +0 -0
  229. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/engine/worker/train/core/step_timing.py +0 -0
  230. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/engine/worker/train/finalize.py +0 -0
  231. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/engine/worker/train/opd/__init__.py +0 -0
  232. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/engine/worker/train/opd/batching.py +0 -0
  233. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/engine/worker/train/opd/bridge.py +0 -0
  234. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/engine/worker/train/opd/bridge_failures.py +0 -0
  235. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/engine/worker/train/opd/child/__init__.py +0 -0
  236. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/engine/worker/train/opd/child/bridge.py +0 -0
  237. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/engine/worker/train/opd/child/entry.py +0 -0
  238. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/engine/worker/train/opd/child/multiturn.py +0 -0
  239. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/engine/worker/train/opd/child/plugin.py +0 -0
  240. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/engine/worker/train/opd/child/replay_guard.py +0 -0
  241. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/engine/worker/train/opd/child/runtime.py +0 -0
  242. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/engine/worker/train/opd/child/structured.py +0 -0
  243. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/engine/worker/train/opd/failures.py +0 -0
  244. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/engine/worker/train/opd/gkd.py +0 -0
  245. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/engine/worker/train/opd/multiturn_validation.py +0 -0
  246. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/engine/worker/train/opd/overrides.py +0 -0
  247. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/engine/worker/train/opd/prompts.py +0 -0
  248. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/engine/worker/train/opd/reporting.py +0 -0
  249. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/engine/worker/train/opd/scoring.py +0 -0
  250. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/engine/worker/train/opd/state.py +0 -0
  251. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/engine/worker/train/opd/validation.py +0 -0
  252. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/engine/worker/train/rl/__init__.py +0 -0
  253. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/engine/worker/train/rl/checkpoints.py +0 -0
  254. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/engine/worker/train/rl/child/__init__.py +0 -0
  255. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/engine/worker/train/rl/child/entry.py +0 -0
  256. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/engine/worker/train/rl/child/multiturn.py +0 -0
  257. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/engine/worker/train/rl/child/patches.py +0 -0
  258. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/engine/worker/train/rl/child/plugin.py +0 -0
  259. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/engine/worker/train/rl/config.py +0 -0
  260. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/engine/worker/train/rl/inputs.py +0 -0
  261. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/engine/worker/train/rl/multi_turn.py +0 -0
  262. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/engine/worker/train/rl/reward_module.py +0 -0
  263. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/engine/worker/train/rl/scoring.py +0 -0
  264. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/engine/worker/train/rl/single_turn.py +0 -0
  265. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/engine/worker/train/rl/verl_config.py +0 -0
  266. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/engine/worker/train/sft/__init__.py +0 -0
  267. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/engine/worker/train/sft/checkpoints.py +0 -0
  268. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/engine/worker/train/sft/child/entry.py +0 -0
  269. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/engine/worker/train/sft/child/plugin.py +0 -0
  270. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/engine/worker/train/sft/config.py +0 -0
  271. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/engine/worker/verl/__init__.py +0 -0
  272. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/engine/worker/verl/capabilities.py +0 -0
  273. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/engine/worker/verl/checkpoints.py +0 -0
  274. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/engine/worker/verl/child_io.py +0 -0
  275. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/engine/worker/verl/diagnostics.py +0 -0
  276. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/engine/worker/verl/parallelism.py +0 -0
  277. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/engine/worker/verl/parent_work.py +0 -0
  278. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/engine/worker_entrypoint.py +0 -0
  279. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/envs/__init__.py +0 -0
  280. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/envs/adapter.py +0 -0
  281. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/envs/base.py +0 -0
  282. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/envs/cache_security.py +0 -0
  283. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/envs/dataset_selection.py +0 -0
  284. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/envs/evaluations.py +0 -0
  285. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/envs/identity.py +0 -0
  286. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/envs/loader.py +0 -0
  287. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/envs/namespace_listing.py +0 -0
  288. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/envs/package/__init__.py +0 -0
  289. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/envs/package/limits.py +0 -0
  290. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/envs/package/unpack.py +0 -0
  291. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/envs/pull.py +0 -0
  292. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/providers/__init__.py +0 -0
  293. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/providers/_lifecycle/__init__.py +0 -0
  294. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/providers/_lifecycle/auth.py +0 -0
  295. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/providers/_lifecycle/bootstrap_console.py +0 -0
  296. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/providers/_lifecycle/bootstrap_pip.py +0 -0
  297. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/providers/_lifecycle/bootstrap_secrets.py +0 -0
  298. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/providers/_lifecycle/deadline.py +0 -0
  299. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/providers/_lifecycle/host/__init__.py +0 -0
  300. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/providers/_lifecycle/host/deadline_sleep.py +0 -0
  301. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/providers/_lifecycle/host/failmark.py +0 -0
  302. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/providers/_lifecycle/host/hostlog.py +0 -0
  303. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/providers/_lifecycle/http.py +0 -0
  304. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/providers/_lifecycle/poll.py +0 -0
  305. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/providers/_lifecycle/poll_instance.py +0 -0
  306. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/providers/allocator.py +0 -0
  307. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/providers/artifacts/__init__.py +0 -0
  308. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/providers/artifacts/hf.py +0 -0
  309. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/providers/artifacts/preload_runpod.py +0 -0
  310. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/providers/artifacts/weight_cache.py +0 -0
  311. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/providers/fit_errors.py +0 -0
  312. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/providers/lambda_/api.py +0 -0
  313. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/providers/lambda_/auth.py +0 -0
  314. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/providers/lambda_/gpus.py +0 -0
  315. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/providers/lambda_/jobs/reap.py +0 -0
  316. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/providers/lambda_/preflight.py +0 -0
  317. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/providers/lambda_/pricing.py +0 -0
  318. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/providers/preflight.py +0 -0
  319. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/providers/realized.py +0 -0
  320. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/providers/runpod/api.py +0 -0
  321. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/providers/runpod/auth.py +0 -0
  322. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/providers/runpod/cost.py +0 -0
  323. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/providers/runpod/gpus.py +0 -0
  324. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/providers/runpod/preflight.py +0 -0
  325. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/providers/runpod/pricing.py +0 -0
  326. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/providers/runpod/resources.py +0 -0
  327. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/providers/sharding.py +0 -0
  328. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/providers/vast/api.py +0 -0
  329. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/providers/vast/auth.py +0 -0
  330. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/providers/vast/preflight.py +0 -0
  331. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/providers/vast/pricing.py +0 -0
  332. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/py.typed +0 -0
  333. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/runner/attempts.py +0 -0
  334. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/runner/costs.py +0 -0
  335. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/runner/deadlines.py +0 -0
  336. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/runner/preparation.py +0 -0
  337. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/runner/results/__init__.py +0 -0
  338. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/runner/results/checkpoints.py +0 -0
  339. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/runner/results/verified_revisions.py +0 -0
  340. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/runner/supervise/__init__.py +0 -0
  341. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/runner/supervise/deploy.py +0 -0
  342. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/runner/supervise/recovery.py +0 -0
  343. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/runner/supervise/retry_decision.py +0 -0
  344. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/runner/supervise/transitions.py +0 -0
  345. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/runner/weight_cache.py +0 -0
  346. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/runtime_capsule/__init__.py +0 -0
  347. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/runtime_capsule/build.py +0 -0
  348. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/runtime_capsule/manifest.py +0 -0
  349. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/schema/__init__.py +0 -0
  350. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/schema/fields.py +0 -0
  351. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/serve/__init__.py +0 -0
  352. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/serve/adapter_check.py +0 -0
  353. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/serve/deploy.py +0 -0
  354. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/serve/errors.py +0 -0
  355. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/serve/export.py +0 -0
  356. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/serve/preflight.py +0 -0
  357. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/serve/responses.py +0 -0
  358. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/serve/streaming.py +0 -0
  359. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/serve/thinking.py +0 -0
  360. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/serve/urls.py +0 -0
  361. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/server/__init__.py +0 -0
  362. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/server/__main__.py +0 -0
  363. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/server/app.py +0 -0
  364. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/server/billing/__init__.py +0 -0
  365. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/server/billing/charges.py +0 -0
  366. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/server/billing/retry.py +0 -0
  367. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/server/domain/__init__.py +0 -0
  368. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/server/domain/checkpoints.py +0 -0
  369. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/server/domain/environment_registry.py +0 -0
  370. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/server/domain/projects.py +0 -0
  371. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/server/domain/reconcile.py +0 -0
  372. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/server/domain/repo_cleanup.py +0 -0
  373. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/server/domain/teacher_broker.py +0 -0
  374. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/server/domain/teacher_errors.py +0 -0
  375. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/server/domain/teacher_requests.py +0 -0
  376. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/server/platform/__init__.py +0 -0
  377. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/server/platform/auth.py +0 -0
  378. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/server/platform/db.py +0 -0
  379. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/server/platform/deps.py +0 -0
  380. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/server/platform/internal_client.py +0 -0
  381. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/server/platform/locks.py +0 -0
  382. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/server/routes/__init__.py +0 -0
  383. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/server/routes/envs.py +0 -0
  384. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/server/routes/meta.py +0 -0
  385. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/server/routes/serving.py +0 -0
  386. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/server/routes/serving_completion.py +0 -0
  387. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/server/routes/serving_revisions.py +0 -0
  388. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/server/routes/serving_smoke.py +0 -0
  389. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/server/routes/teacher.py +0 -0
  390. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/teacher/__init__.py +0 -0
  391. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/teacher/limits.py +0 -0
  392. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/flash/teacher/retry_contract.py +0 -0
  393. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/scripts/build_dev_dist.py +0 -0
  394. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/scripts/check_file_size.py +0 -0
  395. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/scripts/check_function_size.py +0 -0
  396. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/scripts/check_verl_pin_exists.py +0 -0
  397. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/scripts/scrub_history.sh +0 -0
  398. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/tests/__init__.py +0 -0
  399. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/tests/_helpers/__init__.py +0 -0
  400. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/tests/_helpers/profile.py +0 -0
  401. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/tests/_helpers/runner.py +0 -0
  402. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/tests/_helpers/specs.py +0 -0
  403. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/tests/_helpers/teacher.py +0 -0
  404. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/tests/_helpers/vast.py +0 -0
  405. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/tests/capture_image_sft_processor_oracle.py +0 -0
  406. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/tests/conftest.py +0 -0
  407. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/tests/fixtures/image_sft_processor_oracle.json +0 -0
  408. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/tests/fixtures/math_eval.jsonl +0 -0
  409. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/tests/fixtures/math_train.jsonl +0 -0
  410. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/tests/live/__init__.py +0 -0
  411. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/tests/live/conftest.py +0 -0
  412. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/tests/live/test_lambda_live.py +0 -0
  413. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/tests/live/test_runpod_live.py +0 -0
  414. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/tests/live/test_sft_thinking_render_live.py +0 -0
  415. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/tests/live/test_vast_live.py +0 -0
  416. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/tests/test_accounting_coverage.py +0 -0
  417. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/tests/test_adapter_shard_completeness.py +0 -0
  418. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/tests/test_agent_flash_cli_contract.py +0 -0
  419. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/tests/test_algorithms.py +0 -0
  420. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/tests/test_allocator.py +0 -0
  421. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/tests/test_backend_common.py +0 -0
  422. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/tests/test_backend_jobspec_contract.py +0 -0
  423. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/tests/test_bake_kernel_cache.py +0 -0
  424. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/tests/test_base_model_provenance.py +0 -0
  425. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/tests/test_billing_retry.py +0 -0
  426. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/tests/test_build_context_contract.py +0 -0
  427. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/tests/test_catalog_consistency.py +0 -0
  428. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/tests/test_catalog_only_models.py +0 -0
  429. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/tests/test_charge_pricing.py +0 -0
  430. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/tests/test_checkpoint_lifecycle.py +0 -0
  431. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/tests/test_checkpoints.py +0 -0
  432. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/tests/test_cli_commands.py +0 -0
  433. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/tests/test_cli_commands_coverage.py +0 -0
  434. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/tests/test_cli_credential_shadowing.py +0 -0
  435. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/tests/test_cli_errors.py +0 -0
  436. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/tests/test_cli_estimate.py +0 -0
  437. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/tests/test_cli_gpus_flag.py +0 -0
  438. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/tests/test_cli_help.py +0 -0
  439. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/tests/test_cli_main_coverage.py +0 -0
  440. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/tests/test_cli_managed.py +0 -0
  441. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/tests/test_cli_render_coverage.py +0 -0
  442. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/tests/test_cli_render_theme.py +0 -0
  443. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/tests/test_cli_traces.py +0 -0
  444. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/tests/test_cli_wandb_warning.py +0 -0
  445. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/tests/test_client.py +0 -0
  446. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/tests/test_client_import_purity.py +0 -0
  447. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/tests/test_client_stream_reads.py +0 -0
  448. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/tests/test_config_env_vars.py +0 -0
  449. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/tests/test_config_overrides.py +0 -0
  450. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/tests/test_console_upload.py +0 -0
  451. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/tests/test_controlled_experiment_repairs.py +0 -0
  452. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/tests/test_cost_analytical.py +0 -0
  453. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/tests/test_cost_equation.py +0 -0
  454. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/tests/test_cost_estimate.py +0 -0
  455. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/tests/test_cost_hardware.py +0 -0
  456. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/tests/test_cost_models.py +0 -0
  457. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/tests/test_dataset_profile.py +0 -0
  458. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/tests/test_deploy_alias_move_warning.py +0 -0
  459. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/tests/test_deploy_latency.py +0 -0
  460. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/tests/test_dev_channel.py +0 -0
  461. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/tests/test_disk_gb.py +0 -0
  462. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/tests/test_endpoint_name.py +0 -0
  463. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/tests/test_env_cache_evict.py +0 -0
  464. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/tests/test_env_delete.py +0 -0
  465. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/tests/test_env_download.py +0 -0
  466. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/tests/test_env_download_api.py +0 -0
  467. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/tests/test_env_evaluations.py +0 -0
  468. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/tests/test_env_list_api.py +0 -0
  469. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/tests/test_env_list_cli.py +0 -0
  470. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/tests/test_env_list_hub.py +0 -0
  471. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/tests/test_env_no_install.py +0 -0
  472. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/tests/test_env_pull.py +0 -0
  473. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/tests/test_env_pull_coverage.py +0 -0
  474. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/tests/test_env_pull_loader_coverage.py +0 -0
  475. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/tests/test_env_pull_managed_control_plane.py +0 -0
  476. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/tests/test_env_test.py +0 -0
  477. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/tests/test_envs_coverage.py +0 -0
  478. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/tests/test_export.py +0 -0
  479. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/tests/test_flash_mvp.py +0 -0
  480. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/tests/test_flashinfer_cache_dirs.py +0 -0
  481. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/tests/test_freesolo_api_transport.py +0 -0
  482. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/tests/test_fused_expert_warmstart.py +0 -0
  483. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/tests/test_github_urlopen_retry.py +0 -0
  484. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/tests/test_gpu_type_single_field.py +0 -0
  485. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/tests/test_gpus.py +0 -0
  486. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/tests/test_grpo_params.py +0 -0
  487. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/tests/test_grpo_resident_sizing.py +0 -0
  488. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/tests/test_grpo_reward_batching.py +0 -0
  489. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/tests/test_health_liveness.py +0 -0
  490. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/tests/test_hf_retry.py +0 -0
  491. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/tests/test_idle_endpoint_reaper.py +0 -0
  492. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/tests/test_image_sft_markers.py +0 -0
  493. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/tests/test_image_sft_processor_parity.py +0 -0
  494. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/tests/test_image_tokens.py +0 -0
  495. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/tests/test_infisical_secrets.py +0 -0
  496. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/tests/test_internal_client.py +0 -0
  497. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/tests/test_kernel_cache.py +0 -0
  498. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/tests/test_kernel_fingerprint.py +0 -0
  499. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/tests/test_kv_util.py +0 -0
  500. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/tests/test_lambda_api_coverage.py +0 -0
  501. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/tests/test_logging.py +0 -0
  502. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/tests/test_login_perms.py +0 -0
  503. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/tests/test_lora_rank_coverage.py +0 -0
  504. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/tests/test_lora_rank_preflight.py +0 -0
  505. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/tests/test_managed_config_fields.py +0 -0
  506. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/tests/test_metrics_schema_agent_contract.py +0 -0
  507. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/tests/test_mig_guard.py +0 -0
  508. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/tests/test_multimodal_training.py +0 -0
  509. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/tests/test_named_reward_metrics.py +0 -0
  510. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/tests/test_oom_escalate_gpu.py +0 -0
  511. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/tests/test_opd.py +0 -0
  512. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/tests/test_opd_limits.py +0 -0
  513. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/tests/test_opd_multiturn_eos_boundary.py +0 -0
  514. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/tests/test_opd_multiturn_failure_exit.py +0 -0
  515. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/tests/test_opd_replay_guard.py +0 -0
  516. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/tests/test_opd_train.py +0 -0
  517. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/tests/test_packing.py +0 -0
  518. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/tests/test_packing_coverage.py +0 -0
  519. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/tests/test_parasail_teacher.py +0 -0
  520. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/tests/test_persisted_spec_envelope.py +0 -0
  521. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/tests/test_poll_helpers.py +0 -0
  522. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/tests/test_preflight.py +0 -0
  523. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/tests/test_projects.py +0 -0
  524. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/tests/test_prompt_budget.py +0 -0
  525. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/tests/test_provider_preflight_coverage.py +0 -0
  526. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/tests/test_provider_teardown_robustness.py +0 -0
  527. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/tests/test_providers_symmetry.py +0 -0
  528. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/tests/test_realized_cost.py +0 -0
  529. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/tests/test_repo_cleanup.py +0 -0
  530. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/tests/test_resolve_params_b.py +0 -0
  531. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/tests/test_rl_train.py +0 -0
  532. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/tests/test_rollout_samples.py +0 -0
  533. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/tests/test_runpod_api_delete.py +0 -0
  534. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/tests/test_runpod_key_fingerprint.py +0 -0
  535. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/tests/test_runpod_key_waterfall.py +0 -0
  536. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/tests/test_runtime_capsule.py +0 -0
  537. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/tests/test_serve.py +0 -0
  538. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/tests/test_serve_reasoning_content.py +0 -0
  539. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/tests/test_server_app_coverage.py +0 -0
  540. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/tests/test_server_auth_singleflight.py +0 -0
  541. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/tests/test_server_checkpoints_coverage.py +0 -0
  542. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/tests/test_server_db.py +0 -0
  543. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/tests/test_server_envs_coverage.py +0 -0
  544. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/tests/test_server_locks_coverage.py +0 -0
  545. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/tests/test_server_standalone.py +0 -0
  546. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/tests/test_serving_context_preflight.py +0 -0
  547. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/tests/test_serving_contract.py +0 -0
  548. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/tests/test_serving_schema_coverage.py +0 -0
  549. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/tests/test_sft_chunked_nll.py +0 -0
  550. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/tests/test_sft_example_selection.py +0 -0
  551. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/tests/test_sft_gc_off.py +0 -0
  552. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/tests/test_sft_max_context.py +0 -0
  553. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/tests/test_sft_startup_block.py +0 -0
  554. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/tests/test_sft_train.py +0 -0
  555. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/tests/test_sft_workload.py +0 -0
  556. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/tests/test_spec_and_validation.py +0 -0
  557. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/tests/test_spec_contract_bytes.py +0 -0
  558. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/tests/test_step_floor.py +0 -0
  559. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/tests/test_step_metrics.py +0 -0
  560. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/tests/test_step_timing.py +0 -0
  561. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/tests/test_structured_outputs.py +0 -0
  562. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/tests/test_teacher_encoding_contract.py +0 -0
  563. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/tests/test_thinking_config.py +0 -0
  564. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/tests/test_train_context_preflight.py +0 -0
  565. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/tests/test_training_controls.py +0 -0
  566. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/tests/test_type_comment_prose.py +0 -0
  567. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/tests/test_vast_api.py +0 -0
  568. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/tests/test_vast_api_coverage.py +0 -0
  569. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/tests/test_vast_offers.py +0 -0
  570. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/tests/test_vast_provider_coverage.py +0 -0
  571. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/tests/test_verified_revisions.py +0 -0
  572. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/tests/test_verifiers.py +0 -0
  573. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/tests/test_verl_checkpoint_export.py +0 -0
  574. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/tests/test_verl_child_plugins.py +0 -0
  575. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/tests/test_verl_silence_watchdog.py +0 -0
  576. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/tests/test_version.py +0 -0
  577. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/tests/test_vl_warmstart_adapter_keys.py +0 -0
  578. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/tests/test_vram_architecture.py +0 -0
  579. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/tests/test_wandb_link.py +0 -0
  580. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/tests/test_wandb_naming.py +0 -0
  581. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/tests/test_warmstart_adapter_download.py +0 -0
  582. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/tests/test_warmstart_cross_repo.py +0 -0
  583. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/tests/test_warmstart_error_attribution.py +0 -0
  584. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/tests/test_worker_dryrun.py +0 -0
  585. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/tests/test_worker_hardexit.py +0 -0
  586. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/tests/test_worker_image.py +0 -0
  587. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/tests/test_worker_init_heartbeat.py +0 -0
  588. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/tests/test_worker_stack.py +0 -0
  589. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/tests/test_worker_thinking.py +0 -0
  590. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/tests/test_workflow_contracts.py +0 -0
  591. {freesolo_flash_dev-1.2.67 → freesolo_flash_dev-1.2.69}/tests/test_workload_profile.py +0 -0
  592. {freesolo_flash_dev-1.2.67 → 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.67
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.
@@ -716,7 +716,20 @@ def cmd_env_push(args) -> int:
716
716
  readme = pkg / "README.md"
717
717
  if not readme.exists():
718
718
  readme.write_text(f"# {env_name}\n\nFlash Freesolo environment.\n")
719
- # One progress widget spans both phases the user otherwise waits through silently:
719
+ from flash.envs.package.direct_tokens import (
720
+ DirectTokenScanError,
721
+ package_contains_direct_token,
722
+ )
723
+
724
+ try:
725
+ contains_direct_token = package_contains_direct_token(pkg)
726
+ except DirectTokenScanError:
727
+ return _err("environment package could not be scanned safely")
728
+ if contains_direct_token:
729
+ return _err(
730
+ "environment package contains a direct access token; remove it before publishing"
731
+ )
732
+ # one progress widget spans both phases the user otherwise waits through silently:
720
733
  # packaging (walk + gzip, slow for large datasets) and the upload itself.
721
734
  bar = _UploadProgress(env_name)
722
735
  bar.status("packaging environment")
@@ -0,0 +1,136 @@
1
+ """Bounded raw-byte scanning for direct environment package tokens."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import os
6
+ import re
7
+ import stat
8
+ from collections.abc import Iterator
9
+ from pathlib import Path
10
+
11
+ _CHUNK_SIZE = 64 * 1024
12
+ _URLSAFE_CLASS = rb"A-Za-z0-9_-"
13
+ _ALPHANUMERIC_CLASS = rb"A-Za-z0-9"
14
+ _TOKEN_RULES = (
15
+ (b"fslo_", _URLSAFE_CLASS, 45),
16
+ (b"hf_", _ALPHANUMERIC_CLASS, 34),
17
+ (b"pit_", _ALPHANUMERIC_CLASS, 64),
18
+ )
19
+ _TOKEN_PATTERNS = tuple(
20
+ re.compile(
21
+ rb"(?<!["
22
+ + _URLSAFE_CLASS
23
+ + rb"])(?:"
24
+ + re.escape(prefix)
25
+ + rb")(["
26
+ + body_class
27
+ + rb"]{"
28
+ + str(body_length).encode()
29
+ + rb"})(?!["
30
+ + _URLSAFE_CLASS
31
+ + rb"])"
32
+ )
33
+ for prefix, body_class, body_length in _TOKEN_RULES
34
+ )
35
+ _MAX_TOKEN_SIZE = max(len(prefix) + body_length for prefix, _, body_length in _TOKEN_RULES)
36
+ _OVERLAP = _MAX_TOKEN_SIZE + 1
37
+ _PLACEHOLDER_BODIES = frozenset(
38
+ {
39
+ b"exampletoken",
40
+ b"notarealtoken",
41
+ b"placeholdertoken",
42
+ b"replacemewithtoken",
43
+ b"testtoken",
44
+ b"yourapitokenhere",
45
+ b"yourtokenhere",
46
+ }
47
+ )
48
+
49
+
50
+ class DirectTokenScanError(Exception):
51
+ """A package could not be scanned without following or skipping a member."""
52
+
53
+ def __init__(self) -> None:
54
+ super().__init__("package scan failed")
55
+
56
+
57
+ def _is_obvious_placeholder(body: bytes) -> bool:
58
+ normalized = body.lower().translate(None, b"_-")
59
+ if normalized in _PLACEHOLDER_BODIES:
60
+ return True
61
+ return bool(normalized) and normalized[:1] in {b"0", b"x"} and len(set(normalized)) == 1
62
+
63
+
64
+ def _buffer_contains_direct_token(data: bytes, *, start_at: int, finalized_start_end: int) -> bool:
65
+ for pattern in _TOKEN_PATTERNS:
66
+ for match in pattern.finditer(data):
67
+ if match.start() < start_at:
68
+ continue
69
+ if match.start() >= finalized_start_end:
70
+ break
71
+ if not _is_obvious_placeholder(match.group(1)):
72
+ return True
73
+ return False
74
+
75
+
76
+ def _file_contains_direct_token(path: Path) -> bool:
77
+ flags = os.O_RDONLY | getattr(os, "O_BINARY", 0) | getattr(os, "O_NOFOLLOW", 0)
78
+ fd: int | None = os.open(path, flags)
79
+ try:
80
+ if not stat.S_ISREG(os.fstat(fd).st_mode):
81
+ raise DirectTokenScanError
82
+ with os.fdopen(fd, "rb") as stream:
83
+ fd = None
84
+ data = b""
85
+ buffer_start = 0
86
+ finalized_start = 0
87
+ while chunk := stream.read(_CHUNK_SIZE):
88
+ data += chunk
89
+ start_at = finalized_start - buffer_start
90
+ finalized_start_end = max(start_at, len(data) - _MAX_TOKEN_SIZE)
91
+ if _buffer_contains_direct_token(
92
+ data,
93
+ start_at=start_at,
94
+ finalized_start_end=finalized_start_end,
95
+ ):
96
+ return True
97
+ finalized_start = buffer_start + finalized_start_end
98
+ keep_from = max(0, len(data) - _OVERLAP)
99
+ data = data[keep_from:]
100
+ buffer_start += keep_from
101
+ return _buffer_contains_direct_token(
102
+ data,
103
+ start_at=finalized_start - buffer_start,
104
+ finalized_start_end=len(data),
105
+ )
106
+ finally:
107
+ if fd is not None:
108
+ os.close(fd)
109
+
110
+
111
+ def _regular_files(directory: Path) -> Iterator[Path]:
112
+ with os.scandir(directory) as listing:
113
+ entries = sorted(listing, key=lambda entry: entry.name)
114
+ for entry in entries:
115
+ if entry.is_symlink():
116
+ raise DirectTokenScanError
117
+ if entry.is_dir(follow_symlinks=False):
118
+ yield from _regular_files(Path(entry.path))
119
+ elif entry.is_file(follow_symlinks=False):
120
+ yield Path(entry.path)
121
+ else:
122
+ raise DirectTokenScanError
123
+
124
+
125
+ def package_contains_direct_token(root: Path) -> bool:
126
+ """Return whether a package tree contains a supported direct issued-token form."""
127
+ try:
128
+ root_stat = os.stat(root, follow_symlinks=False)
129
+ if not stat.S_ISDIR(root_stat.st_mode):
130
+ raise DirectTokenScanError
131
+ return any(_file_contains_direct_token(path) for path in _regular_files(root))
132
+ except DirectTokenScanError:
133
+ raise
134
+ except OSError:
135
+ pass
136
+ raise DirectTokenScanError
@@ -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)