freesolo-flash-dev 1.2.95__tar.gz → 1.2.96__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 (613) hide show
  1. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/PKG-INFO +1 -1
  2. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/worker/__init__.py +3 -0
  3. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/worker/io/heartbeat.py +26 -3
  4. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/worker/io/hf.py +11 -1
  5. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/providers/_lifecycle/poll.py +18 -0
  6. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/pyproject.toml +2 -2
  7. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_poll_helpers.py +28 -0
  8. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_training_controls.py +161 -0
  9. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_worker_init_heartbeat.py +67 -0
  10. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/uv.lock +1 -1
  11. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/.dockerignore +0 -0
  12. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/.env.example +0 -0
  13. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/.github/CODEOWNERS +0 -0
  14. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  15. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  16. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
  17. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  18. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/.github/dependabot.yml +0 -0
  19. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/.github/workflows/auto-rebake.yml +0 -0
  20. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/.github/workflows/bake-kernel-cache.yml +0 -0
  21. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/.github/workflows/ci.yml +0 -0
  22. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/.github/workflows/dev-kernel-cache.yml +0 -0
  23. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/.github/workflows/main-source-guard.yml +0 -0
  24. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/.github/workflows/notify-tests-repo.yml +0 -0
  25. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/.github/workflows/production-kernel-cache-ready.yml +0 -0
  26. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/.github/workflows/publish-dev.yml +0 -0
  27. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/.github/workflows/publish-image.yml +0 -0
  28. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/.github/workflows/publish.yml +0 -0
  29. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/.github/workflows/version-parity.yml +0 -0
  30. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/.github/workflows/worker-image.yml +0 -0
  31. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/.gitignore +0 -0
  32. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/CHANGELOG.md +0 -0
  33. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/CODE_OF_CONDUCT.md +0 -0
  34. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/CONTRIBUTING.md +0 -0
  35. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/Dockerfile +0 -0
  36. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/Dockerfile.worker +0 -0
  37. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/LICENSE +0 -0
  38. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/NOTICE +0 -0
  39. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/README.md +0 -0
  40. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/SECURITY.md +0 -0
  41. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/SELF_HOSTING.md +0 -0
  42. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/build/kernel_cache/.gitignore +0 -0
  43. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/build/kernel_cache/.keep +0 -0
  44. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/deploy/infisical/README.md +0 -0
  45. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/deploy/infisical/entrypoint.sh +0 -0
  46. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/docker/Dockerfile.kernelcache +0 -0
  47. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/docker/Dockerfile.kernelcache.relayer +0 -0
  48. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/docker/bake_kernel_cache.py +0 -0
  49. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/docker/bake_pod_entry.py +0 -0
  50. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/docker/extract_cudart_fix.py +0 -0
  51. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/docker/kernel_fingerprint.py +0 -0
  52. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/docker/make_rp_handler.py +0 -0
  53. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/__init__.py +0 -0
  54. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/_internal/__init__.py +0 -0
  55. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/_internal/channel.py +0 -0
  56. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/_internal/diagnostics.py +0 -0
  57. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/_internal/fileio.py +0 -0
  58. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/_internal/logging.py +0 -0
  59. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/_internal/paths.py +0 -0
  60. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/adapters/__init__.py +0 -0
  61. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/adapters/artifacts.py +0 -0
  62. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/adapters/fused_experts.py +0 -0
  63. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/adapters/lora_rank.py +0 -0
  64. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/adapters/targets.py +0 -0
  65. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/cli/__init__.py +0 -0
  66. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/cli/__main__.py +0 -0
  67. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/cli/commands/__init__.py +0 -0
  68. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/cli/commands/deploy.py +0 -0
  69. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/cli/commands/env/__init__.py +0 -0
  70. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/cli/commands/env/episode.py +0 -0
  71. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/cli/commands/env/eval.py +0 -0
  72. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/cli/commands/env/eval_args.py +0 -0
  73. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/cli/commands/env/imports.py +0 -0
  74. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/cli/commands/env/list.py +0 -0
  75. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/cli/commands/env/push.py +0 -0
  76. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/cli/commands/env/retained.py +0 -0
  77. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/cli/commands/env/setup.py +0 -0
  78. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/cli/commands/env/setup_wandb.py +0 -0
  79. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/cli/commands/env/test.py +0 -0
  80. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/cli/commands/env/test_evaluations.py +0 -0
  81. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/cli/commands/env/test_params.py +0 -0
  82. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/cli/commands/env/test_warnings.py +0 -0
  83. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/cli/commands/prompt_budget.py +0 -0
  84. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/cli/commands/traces.py +0 -0
  85. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/cli/commands/train_cost.py +0 -0
  86. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/cli/commands/worker_output.py +0 -0
  87. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/cli/errors.py +0 -0
  88. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/cli/scaffold/TRAINING.md +0 -0
  89. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/cli/scaffold/__init__.py +0 -0
  90. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/cli/ui/__init__.py +0 -0
  91. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/cli/ui/cost.py +0 -0
  92. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/cli/ui/env_panels.py +0 -0
  93. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/cli/ui/heartbeat.py +0 -0
  94. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/cli/ui/render.py +0 -0
  95. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/cli/ui/tables.py +0 -0
  96. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/cli/ui/tty.py +0 -0
  97. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/client/__init__.py +0 -0
  98. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/client/config.py +0 -0
  99. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/client/freesolo_api.py +0 -0
  100. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/client/http.py +0 -0
  101. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/client/runtime_secrets.py +0 -0
  102. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/client/shapes.py +0 -0
  103. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/client/specs.py +0 -0
  104. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/client/streaming.py +0 -0
  105. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/content/__init__.py +0 -0
  106. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/content/image_descriptors.py +0 -0
  107. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/content/multimodal.py +0 -0
  108. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/content/structured_outputs.py +0 -0
  109. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/content/thinking.py +0 -0
  110. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/core/__init__.py +0 -0
  111. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/core/catalog.py +0 -0
  112. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/core/grpo.py +0 -0
  113. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/core/spec.py +0 -0
  114. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/core/spec_persistence.py +0 -0
  115. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/cost/__init__.py +0 -0
  116. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/cost/analytical.py +0 -0
  117. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/cost/facts.py +0 -0
  118. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/cost/spec.py +0 -0
  119. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/cost/types.py +0 -0
  120. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/__init__.py +0 -0
  121. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/huggingface.py +0 -0
  122. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/plan/__init__.py +0 -0
  123. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/plan/kv_sizing.py +0 -0
  124. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/plan/model_config_probe.py +0 -0
  125. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/plan/prompt_budget.py +0 -0
  126. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/plan/recipe.py +0 -0
  127. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/plan/steps.py +0 -0
  128. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/plan/vram.py +0 -0
  129. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/profiling/__init__.py +0 -0
  130. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/profiling/dataset_profile.py +0 -0
  131. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/profiling/image_tokens.py +0 -0
  132. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/profiling/reasoning_render.py +0 -0
  133. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/profiling/sft_image_rows.py +0 -0
  134. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/profiling/sft_workload.py +0 -0
  135. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/profiling/tokenizer.py +0 -0
  136. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/profiling/workload_profile.py +0 -0
  137. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/result/__init__.py +0 -0
  138. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/result/accounting.py +0 -0
  139. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/result/rollout_samples.py +0 -0
  140. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/worker/__main__.py +0 -0
  141. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/worker/backend_common.py +0 -0
  142. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/worker/entry/__init__.py +0 -0
  143. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/worker/entry/opd.py +0 -0
  144. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/worker/entry/rl.py +0 -0
  145. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/worker/entry/sft.py +0 -0
  146. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/worker/io/__init__.py +0 -0
  147. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/worker/io/prefetch.py +0 -0
  148. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/worker/io/wandb_log.py +0 -0
  149. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/worker/model/__init__.py +0 -0
  150. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/worker/model/adapter.py +0 -0
  151. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/worker/model/chatml_mask.py +0 -0
  152. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/worker/model/decoding.py +0 -0
  153. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/worker/model/lora.py +0 -0
  154. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/worker/model/packing.py +0 -0
  155. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/worker/opd_train.py +0 -0
  156. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/worker/opd_train_runner.py +0 -0
  157. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/worker/perf/__init__.py +0 -0
  158. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/worker/perf/diagnostics.py +0 -0
  159. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/worker/perf/lifecycle.py +0 -0
  160. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/worker/perf/liger.py +0 -0
  161. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/worker/perf/memory.py +0 -0
  162. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/worker/rl_train.py +0 -0
  163. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/worker/rl_train_runner.py +0 -0
  164. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/worker/runtime/__init__.py +0 -0
  165. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/worker/runtime/kernel_warmup.py +0 -0
  166. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/worker/runtime/pkg_proxy.py +0 -0
  167. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/worker/runtime/rng.py +0 -0
  168. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/worker/score_batcher.py +0 -0
  169. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/worker/sft_train.py +0 -0
  170. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/worker/sft_train_runner.py +0 -0
  171. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/worker/teacher/__init__.py +0 -0
  172. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/worker/teacher/client.py +0 -0
  173. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/worker/teacher/encoding.py +0 -0
  174. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/worker/teacher/tokenizer_align.py +0 -0
  175. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/worker/train/__init__.py +0 -0
  176. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/worker/train/core/__init__.py +0 -0
  177. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/worker/train/core/checkpoint_lifecycle.py +0 -0
  178. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/worker/train/core/child/__init__.py +0 -0
  179. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/worker/train/core/child/glue.py +0 -0
  180. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/worker/train/core/child/runtime.py +0 -0
  181. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/worker/train/core/step_timing.py +0 -0
  182. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/worker/train/finalize.py +0 -0
  183. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/worker/train/opd/__init__.py +0 -0
  184. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/worker/train/opd/batching.py +0 -0
  185. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/worker/train/opd/bridge.py +0 -0
  186. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/worker/train/opd/bridge_failures.py +0 -0
  187. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/worker/train/opd/child/__init__.py +0 -0
  188. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/worker/train/opd/child/bridge.py +0 -0
  189. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/worker/train/opd/child/entry.py +0 -0
  190. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/worker/train/opd/child/multiturn.py +0 -0
  191. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/worker/train/opd/child/plugin.py +0 -0
  192. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/worker/train/opd/child/replay_guard.py +0 -0
  193. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/worker/train/opd/child/runtime.py +0 -0
  194. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/worker/train/opd/child/structured.py +0 -0
  195. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/worker/train/opd/failures.py +0 -0
  196. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/worker/train/opd/gkd.py +0 -0
  197. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/worker/train/opd/multiturn_media.py +0 -0
  198. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/worker/train/opd/multiturn_validation.py +0 -0
  199. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/worker/train/opd/overrides.py +0 -0
  200. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/worker/train/opd/prompts.py +0 -0
  201. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/worker/train/opd/reporting.py +0 -0
  202. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/worker/train/opd/scoring.py +0 -0
  203. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/worker/train/opd/state.py +0 -0
  204. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/worker/train/opd/validation.py +0 -0
  205. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/worker/train/rl/__init__.py +0 -0
  206. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/worker/train/rl/checkpoints.py +0 -0
  207. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/worker/train/rl/child/__init__.py +0 -0
  208. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/worker/train/rl/child/entry.py +0 -0
  209. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/worker/train/rl/child/multiturn.py +0 -0
  210. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/worker/train/rl/child/patches.py +0 -0
  211. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/worker/train/rl/child/plugin.py +0 -0
  212. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/worker/train/rl/config.py +0 -0
  213. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/worker/train/rl/identity.py +0 -0
  214. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/worker/train/rl/inputs.py +0 -0
  215. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/worker/train/rl/multi_turn.py +0 -0
  216. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/worker/train/rl/reward_module.py +0 -0
  217. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/worker/train/rl/scoring.py +0 -0
  218. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/worker/train/rl/single_turn.py +0 -0
  219. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/worker/train/rl/verl_config.py +0 -0
  220. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/worker/train/sft/__init__.py +0 -0
  221. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/worker/train/sft/checkpoints.py +0 -0
  222. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/worker/train/sft/child/entry.py +0 -0
  223. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/worker/train/sft/child/plugin.py +0 -0
  224. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/worker/train/sft/config.py +0 -0
  225. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/worker/verl/__init__.py +0 -0
  226. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/worker/verl/capabilities.py +0 -0
  227. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/worker/verl/checkpoints.py +0 -0
  228. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/worker/verl/child_io.py +0 -0
  229. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/worker/verl/diagnostics.py +0 -0
  230. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/worker/verl/parallelism.py +0 -0
  231. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/worker/verl/parent_work.py +0 -0
  232. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/worker/verl/process_census.py +0 -0
  233. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/engine/worker_entrypoint.py +0 -0
  234. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/envs/__init__.py +0 -0
  235. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/envs/adapter.py +0 -0
  236. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/envs/base.py +0 -0
  237. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/envs/cache_security.py +0 -0
  238. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/envs/dataset_selection.py +0 -0
  239. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/envs/evaluations.py +0 -0
  240. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/envs/identity.py +0 -0
  241. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/envs/loader.py +0 -0
  242. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/envs/namespace_listing.py +0 -0
  243. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/envs/package/__init__.py +0 -0
  244. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/envs/package/direct_tokens.py +0 -0
  245. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/envs/package/limits.py +0 -0
  246. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/envs/package/unpack.py +0 -0
  247. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/envs/pull.py +0 -0
  248. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/envs/staged.py +0 -0
  249. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/providers/__init__.py +0 -0
  250. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/providers/_lifecycle/__init__.py +0 -0
  251. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/providers/_lifecycle/auth.py +0 -0
  252. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/providers/_lifecycle/bootstrap.py +0 -0
  253. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/providers/_lifecycle/bootstrap_console.py +0 -0
  254. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/providers/_lifecycle/bootstrap_pip.py +0 -0
  255. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/providers/_lifecycle/bootstrap_secrets.py +0 -0
  256. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/providers/_lifecycle/deadline.py +0 -0
  257. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/providers/_lifecycle/host/__init__.py +0 -0
  258. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/providers/_lifecycle/host/deadline_sleep.py +0 -0
  259. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/providers/_lifecycle/host/failmark.py +0 -0
  260. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/providers/_lifecycle/host/hostlog.py +0 -0
  261. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/providers/_lifecycle/http.py +0 -0
  262. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/providers/_lifecycle/instance.py +0 -0
  263. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/providers/_lifecycle/poll_instance.py +0 -0
  264. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/providers/_lifecycle/provider.py +0 -0
  265. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/providers/_lifecycle/terminal_artifacts.py +0 -0
  266. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/providers/_lifecycle/worker.py +0 -0
  267. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/providers/allocator.py +0 -0
  268. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/providers/artifacts/__init__.py +0 -0
  269. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/providers/artifacts/hf.py +0 -0
  270. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/providers/artifacts/preload_runpod.py +0 -0
  271. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/providers/artifacts/weight_cache.py +0 -0
  272. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/providers/base.py +0 -0
  273. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/providers/fit_errors.py +0 -0
  274. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/providers/lambda_/__init__.py +0 -0
  275. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/providers/lambda_/api.py +0 -0
  276. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/providers/lambda_/auth.py +0 -0
  277. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/providers/lambda_/gpus.py +0 -0
  278. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/providers/lambda_/jobs/__init__.py +0 -0
  279. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/providers/lambda_/jobs/builders.py +0 -0
  280. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/providers/lambda_/jobs/reap.py +0 -0
  281. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/providers/lambda_/preflight.py +0 -0
  282. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/providers/lambda_/pricing.py +0 -0
  283. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/providers/preflight.py +0 -0
  284. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/providers/realized.py +0 -0
  285. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/providers/runpod/__init__.py +0 -0
  286. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/providers/runpod/api.py +0 -0
  287. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/providers/runpod/auth.py +0 -0
  288. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/providers/runpod/cost.py +0 -0
  289. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/providers/runpod/gpus.py +0 -0
  290. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/providers/runpod/job_execution.py +0 -0
  291. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/providers/runpod/jobs.py +0 -0
  292. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/providers/runpod/preflight.py +0 -0
  293. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/providers/runpod/pricing.py +0 -0
  294. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/providers/runpod/resources.py +0 -0
  295. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/providers/runpod/serverless/__init__.py +0 -0
  296. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/providers/runpod/serverless/endpoints.py +0 -0
  297. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/providers/sharding.py +0 -0
  298. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/providers/vast/__init__.py +0 -0
  299. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/providers/vast/api.py +0 -0
  300. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/providers/vast/auth.py +0 -0
  301. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/providers/vast/jobs/__init__.py +0 -0
  302. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/providers/vast/jobs/builders.py +0 -0
  303. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/providers/vast/preflight.py +0 -0
  304. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/providers/vast/pricing.py +0 -0
  305. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/py.typed +0 -0
  306. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/runner/__init__.py +0 -0
  307. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/runner/artifacts.py +0 -0
  308. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/runner/attempts.py +0 -0
  309. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/runner/costs.py +0 -0
  310. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/runner/deadlines.py +0 -0
  311. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/runner/preparation.py +0 -0
  312. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/runner/reconciliation.py +0 -0
  313. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/runner/results/__init__.py +0 -0
  314. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/runner/results/checkpoints.py +0 -0
  315. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/runner/results/verified_revisions.py +0 -0
  316. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/runner/status.py +0 -0
  317. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/runner/submit.py +0 -0
  318. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/runner/supervise/__init__.py +0 -0
  319. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/runner/supervise/attach.py +0 -0
  320. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/runner/supervise/deploy.py +0 -0
  321. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/runner/supervise/lifecycle.py +0 -0
  322. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/runner/supervise/recovery.py +0 -0
  323. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/runner/supervise/retry_decision.py +0 -0
  324. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/runner/supervise/seed_submission.py +0 -0
  325. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/runner/supervise/transitions.py +0 -0
  326. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/runner/weight_cache.py +0 -0
  327. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/runtime_capsule/__init__.py +0 -0
  328. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/runtime_capsule/build.py +0 -0
  329. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/runtime_capsule/manifest.py +0 -0
  330. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/runtime_capsule/profiles.py +0 -0
  331. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/schema/__init__.py +0 -0
  332. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/schema/fields.py +0 -0
  333. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/serve/__init__.py +0 -0
  334. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/serve/adapter_check.py +0 -0
  335. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/serve/deploy.py +0 -0
  336. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/serve/errors.py +0 -0
  337. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/serve/export.py +0 -0
  338. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/serve/preflight.py +0 -0
  339. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/serve/responses.py +0 -0
  340. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/serve/streaming.py +0 -0
  341. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/serve/thinking.py +0 -0
  342. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/serve/urls.py +0 -0
  343. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/server/__init__.py +0 -0
  344. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/server/__main__.py +0 -0
  345. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/server/app.py +0 -0
  346. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/server/billing/__init__.py +0 -0
  347. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/server/billing/charges.py +0 -0
  348. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/server/billing/retry.py +0 -0
  349. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/server/domain/__init__.py +0 -0
  350. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/server/domain/checkpoints.py +0 -0
  351. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/server/domain/environment_registry.py +0 -0
  352. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/server/domain/envs.py +0 -0
  353. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/server/domain/projects.py +0 -0
  354. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/server/domain/reconcile.py +0 -0
  355. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/server/domain/repo_cleanup.py +0 -0
  356. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/server/domain/run_registry.py +0 -0
  357. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/server/domain/teacher_broker.py +0 -0
  358. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/server/domain/teacher_errors.py +0 -0
  359. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/server/domain/teacher_requests.py +0 -0
  360. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/server/platform/__init__.py +0 -0
  361. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/server/platform/auth.py +0 -0
  362. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/server/platform/db.py +0 -0
  363. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/server/platform/deps.py +0 -0
  364. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/server/platform/internal_client.py +0 -0
  365. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/server/platform/locks.py +0 -0
  366. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/server/platform/runtime.py +0 -0
  367. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/server/routes/__init__.py +0 -0
  368. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/server/routes/envs.py +0 -0
  369. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/server/routes/meta.py +0 -0
  370. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/server/routes/runs.py +0 -0
  371. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/server/routes/serving.py +0 -0
  372. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/server/routes/serving_completion.py +0 -0
  373. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/server/routes/serving_revisions.py +0 -0
  374. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/server/routes/serving_smoke.py +0 -0
  375. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/server/routes/teacher.py +0 -0
  376. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/source_snapshot.py +0 -0
  377. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/teacher/__init__.py +0 -0
  378. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/teacher/limits.py +0 -0
  379. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/teacher/provider_status.py +0 -0
  380. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/flash/teacher/retry_contract.py +0 -0
  381. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/scripts/build_dev_dist.py +0 -0
  382. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/scripts/check_file_size.py +0 -0
  383. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/scripts/check_function_size.py +0 -0
  384. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/scripts/check_rollout_identity_actor.py +0 -0
  385. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/scripts/check_verl_pin_exists.py +0 -0
  386. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/scripts/scrub_history.sh +0 -0
  387. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/__init__.py +0 -0
  388. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/_helpers/__init__.py +0 -0
  389. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/_helpers/profile.py +0 -0
  390. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/_helpers/runner.py +0 -0
  391. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/_helpers/source_snapshot.py +0 -0
  392. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/_helpers/specs.py +0 -0
  393. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/_helpers/teacher.py +0 -0
  394. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/_helpers/vast.py +0 -0
  395. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/capture_image_sft_processor_oracle.py +0 -0
  396. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/conftest.py +0 -0
  397. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/fixtures/image_sft_processor_oracle.json +0 -0
  398. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/fixtures/qwen35_08b_target_metadata.json +0 -0
  399. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/live/__init__.py +0 -0
  400. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/live/conftest.py +0 -0
  401. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/live/test_lambda_live.py +0 -0
  402. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/live/test_runpod_live.py +0 -0
  403. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/live/test_sft_thinking_render_live.py +0 -0
  404. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/live/test_vast_live.py +0 -0
  405. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_accounting_coverage.py +0 -0
  406. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_adapter_shard_completeness.py +0 -0
  407. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_agent_flash_cli_contract.py +0 -0
  408. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_algorithms.py +0 -0
  409. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_allocator.py +0 -0
  410. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_backend_common.py +0 -0
  411. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_backend_jobspec_contract.py +0 -0
  412. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_bake_kernel_cache.py +0 -0
  413. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_base_model_provenance.py +0 -0
  414. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_billing_retry.py +0 -0
  415. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_build_context_contract.py +0 -0
  416. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_cancel_remote.py +0 -0
  417. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_catalog_consistency.py +0 -0
  418. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_catalog_only_models.py +0 -0
  419. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_charge_pricing.py +0 -0
  420. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_checkpoint_lifecycle.py +0 -0
  421. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_checkpoints.py +0 -0
  422. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_cli_commands.py +0 -0
  423. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_cli_commands_coverage.py +0 -0
  424. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_cli_credential_shadowing.py +0 -0
  425. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_cli_errors.py +0 -0
  426. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_cli_estimate.py +0 -0
  427. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_cli_gpus_flag.py +0 -0
  428. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_cli_help.py +0 -0
  429. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_cli_main_coverage.py +0 -0
  430. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_cli_managed.py +0 -0
  431. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_cli_render_coverage.py +0 -0
  432. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_cli_render_theme.py +0 -0
  433. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_cli_traces.py +0 -0
  434. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_cli_wandb_warning.py +0 -0
  435. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_client.py +0 -0
  436. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_client_import_purity.py +0 -0
  437. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_client_server_integration.py +0 -0
  438. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_client_stream_reads.py +0 -0
  439. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_config_env_vars.py +0 -0
  440. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_config_overrides.py +0 -0
  441. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_console_upload.py +0 -0
  442. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_controlled_experiment_repairs.py +0 -0
  443. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_cost_analytical.py +0 -0
  444. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_cost_equation.py +0 -0
  445. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_cost_estimate.py +0 -0
  446. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_cost_hardware.py +0 -0
  447. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_cost_models.py +0 -0
  448. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_dataset_profile.py +0 -0
  449. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_deploy_alias_move_warning.py +0 -0
  450. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_deploy_latency.py +0 -0
  451. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_dev_channel.py +0 -0
  452. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_disk_gb.py +0 -0
  453. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_endpoint_name.py +0 -0
  454. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_env_cache_evict.py +0 -0
  455. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_env_delete.py +0 -0
  456. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_env_download.py +0 -0
  457. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_env_download_api.py +0 -0
  458. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_env_evaluations.py +0 -0
  459. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_env_list_api.py +0 -0
  460. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_env_list_cli.py +0 -0
  461. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_env_list_hub.py +0 -0
  462. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_env_no_install.py +0 -0
  463. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_env_publish.py +0 -0
  464. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_env_pull.py +0 -0
  465. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_env_pull_coverage.py +0 -0
  466. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_env_pull_loader_coverage.py +0 -0
  467. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_env_pull_managed_control_plane.py +0 -0
  468. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_env_push.py +0 -0
  469. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_env_rate_limit_resolve.py +0 -0
  470. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_env_ref_pinning.py +0 -0
  471. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_env_test.py +0 -0
  472. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_envs_coverage.py +0 -0
  473. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_export.py +0 -0
  474. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_flash_mvp.py +0 -0
  475. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_flash_worker.py +0 -0
  476. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_flashinfer_cache_dirs.py +0 -0
  477. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_freesolo_api_transport.py +0 -0
  478. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_fused_expert_warmstart.py +0 -0
  479. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_github_urlopen_retry.py +0 -0
  480. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_gpu_type_single_field.py +0 -0
  481. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_gpus.py +0 -0
  482. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_grpo_params.py +0 -0
  483. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_grpo_process_census.py +0 -0
  484. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_grpo_resident_sizing.py +0 -0
  485. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_grpo_reward_batching.py +0 -0
  486. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_grpo_rollout_contract.py +0 -0
  487. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_grpo_rollout_identity.py +0 -0
  488. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_health_liveness.py +0 -0
  489. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_hf_retry.py +0 -0
  490. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_idle_endpoint_reaper.py +0 -0
  491. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_image_environment_capability.py +0 -0
  492. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_image_incremental_processor.py +0 -0
  493. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_image_sft_markers.py +0 -0
  494. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_image_sft_processor_parity.py +0 -0
  495. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_image_tokens.py +0 -0
  496. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_infisical_secrets.py +0 -0
  497. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_instance_bootstrap_coverage.py +0 -0
  498. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_internal_client.py +0 -0
  499. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_jobs.py +0 -0
  500. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_kernel_cache.py +0 -0
  501. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_kernel_fingerprint.py +0 -0
  502. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_kv_util.py +0 -0
  503. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_lambda_api_coverage.py +0 -0
  504. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_lambda_runner.py +0 -0
  505. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_logging.py +0 -0
  506. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_login_perms.py +0 -0
  507. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_lora_rank_coverage.py +0 -0
  508. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_lora_rank_nested_rung.py +0 -0
  509. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_lora_rank_preflight.py +0 -0
  510. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_lora_targeting.py +0 -0
  511. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_lora_targeting_pinned_verl.py +0 -0
  512. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_managed_config_fields.py +0 -0
  513. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_managed_hf_repo.py +0 -0
  514. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_metrics_schema_agent_contract.py +0 -0
  515. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_mig_guard.py +0 -0
  516. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_multi_gpu_gate.py +0 -0
  517. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_multimodal_training.py +0 -0
  518. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_named_reward_metrics.py +0 -0
  519. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_oom_escalate_gpu.py +0 -0
  520. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_opd.py +0 -0
  521. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_opd_limits.py +0 -0
  522. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_opd_multiturn_eos_boundary.py +0 -0
  523. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_opd_multiturn_failure_exit.py +0 -0
  524. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_opd_replay_guard.py +0 -0
  525. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_opd_resume_safety.py +0 -0
  526. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_opd_train.py +0 -0
  527. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_orchestrator_flash.py +0 -0
  528. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_packing.py +0 -0
  529. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_packing_coverage.py +0 -0
  530. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_parasail_teacher.py +0 -0
  531. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_persisted_spec_envelope.py +0 -0
  532. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_preflight.py +0 -0
  533. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_projects.py +0 -0
  534. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_prompt_budget.py +0 -0
  535. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_provider_preflight_coverage.py +0 -0
  536. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_provider_routing.py +0 -0
  537. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_provider_teardown_robustness.py +0 -0
  538. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_providers_symmetry.py +0 -0
  539. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_realized_cost.py +0 -0
  540. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_repo_cleanup.py +0 -0
  541. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_resolve_params_b.py +0 -0
  542. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_resume_on_retry.py +0 -0
  543. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_rl_train.py +0 -0
  544. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_rollout_samples.py +0 -0
  545. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_runmgmt.py +0 -0
  546. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_runpod_api_delete.py +0 -0
  547. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_runpod_key_fingerprint.py +0 -0
  548. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_runpod_key_waterfall.py +0 -0
  549. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_runtime_capsule.py +0 -0
  550. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_serve.py +0 -0
  551. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_serve_reasoning_content.py +0 -0
  552. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_server_api.py +0 -0
  553. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_server_app_coverage.py +0 -0
  554. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_server_auth_singleflight.py +0 -0
  555. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_server_billing.py +0 -0
  556. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_server_checkpoints_coverage.py +0 -0
  557. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_server_db.py +0 -0
  558. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_server_envs_coverage.py +0 -0
  559. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_server_locks_coverage.py +0 -0
  560. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_server_standalone.py +0 -0
  561. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_serving_context_preflight.py +0 -0
  562. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_serving_contract.py +0 -0
  563. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_serving_schema_coverage.py +0 -0
  564. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_sft_chunked_nll.py +0 -0
  565. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_sft_example_selection.py +0 -0
  566. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_sft_gc_off.py +0 -0
  567. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_sft_max_context.py +0 -0
  568. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_sft_startup_block.py +0 -0
  569. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_sft_train.py +0 -0
  570. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_sft_workload.py +0 -0
  571. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_source_attestation_flow.py +0 -0
  572. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_source_snapshot.py +0 -0
  573. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_spec_and_validation.py +0 -0
  574. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_spec_contract_bytes.py +0 -0
  575. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_staged_environment.py +0 -0
  576. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_step_floor.py +0 -0
  577. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_step_metrics.py +0 -0
  578. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_step_timing.py +0 -0
  579. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_structured_outputs.py +0 -0
  580. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_teacher_broker.py +0 -0
  581. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_teacher_encoding_contract.py +0 -0
  582. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_terminal_artifacts.py +0 -0
  583. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_thinking_config.py +0 -0
  584. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_train_context_preflight.py +0 -0
  585. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_type_comment_prose.py +0 -0
  586. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_vast_api.py +0 -0
  587. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_vast_api_coverage.py +0 -0
  588. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_vast_offers.py +0 -0
  589. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_vast_provider_coverage.py +0 -0
  590. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_vast_runner.py +0 -0
  591. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_verified_revisions.py +0 -0
  592. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_verifiers.py +0 -0
  593. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_verl_checkpoint_export.py +0 -0
  594. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_verl_child_plugins.py +0 -0
  595. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_verl_silence_watchdog.py +0 -0
  596. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_version.py +0 -0
  597. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_vl_warmstart_adapter_keys.py +0 -0
  598. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_vram_architecture.py +0 -0
  599. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_wandb_link.py +0 -0
  600. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_wandb_naming.py +0 -0
  601. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_warmstart_adapter_download.py +0 -0
  602. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_warmstart_cross_repo.py +0 -0
  603. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_warmstart_error_attribution.py +0 -0
  604. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_warmstart_image_adapters.py +0 -0
  605. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_weight_cache.py +0 -0
  606. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_worker_dryrun.py +0 -0
  607. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_worker_hardexit.py +0 -0
  608. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_worker_image.py +0 -0
  609. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_worker_stack.py +0 -0
  610. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_worker_thinking.py +0 -0
  611. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_workflow_contracts.py +0 -0
  612. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_workload_profile.py +0 -0
  613. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.96}/tests/test_zero2_sharding_gate.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: freesolo-flash-dev
3
- Version: 1.2.95
3
+ Version: 1.2.96
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
@@ -145,6 +145,9 @@ _HB_LAST_PROGRESS_TS = 0.0
145
145
  # per-step heartbeat past the provider's stall window, killing a healthy run.
146
146
  _HB_PROGRESS_SEQ = 0
147
147
  _HB_PROGRESS_UPLOADED_SEQ = 0
148
+ # a replace-in-place failure heartbeat can be overwritten before the provider polls it. retain the
149
+ # failed checkpoint identity and cause so every terminal heartbeat carries the same structured state.
150
+ _HB_PENDING_CHECKPOINT_FAILURE: dict[str, int | str] | None = None
148
151
  # Environment-scoped artifact repos are shared by many runs. Keep heartbeat commits below the HF
149
152
  # per-repo commit cap while staying under the provider poller's training stall window
150
153
  # (STALL_AFTER_S=1500s in flash/providers/_lifecycle/poll.py).
@@ -78,15 +78,27 @@ _HB_THROTTLED_STAGES = _HB_TIGHT_LIVENESS_STAGES | frozenset({"rl_step", "sft_st
78
78
  # right after a download that has been pinging throughout, so the throttle would almost always
79
79
  # swallow it. the wrap that follows re-emits with liveness=True and stays throttled.
80
80
  _HB_MODEL_LOAD_STAGES = frozenset({"sft_model_load", "opd_model_load"})
81
- _HB_TERMINAL_STAGES = frozenset({"done", "already_done"})
81
+ _HB_SUCCESS_TERMINAL_STAGES = frozenset({"done", "already_done"})
82
82
  # 600s -> ~6 commits/hr; keeps stall detector alive without hitting the HF commit cap.
83
83
  _HB_TERMINAL_ONLY_INTERVAL_S = 600.0
84
84
 
85
85
 
86
+ def _is_terminal_stage(stage: str) -> bool:
87
+ """return whether this stage ends the worker attempt."""
88
+ return stage in _HB_SUCCESS_TERMINAL_STAGES or stage.startswith("error_")
89
+
90
+
86
91
  def _is_critical_stage(stage: str) -> bool:
87
92
  """A terminal transition or an error is CRITICAL: never throttled (the commit must land) and
88
- given the longer upload-lock timeout, because no later heartbeat can repair a missed one."""
89
- return stage in _HB_TERMINAL_STAGES or stage.startswith("error_")
93
+ given the longer upload-lock timeout, because no later heartbeat can repair a missed one.
94
+
95
+ `_failed` earns this as much as the `error_` prefix does: a failure heartbeat is emitted once, at
96
+ the moment the failure is known, and nothing later restates it. `checkpoint_upload_failed` is
97
+ raised from inside a long HF upload, which is precisely when `_HB_UPLOAD_IN_FLIGHT` is set and an
98
+ unforced ping is dropped -- so the one report of the failure would be discarded exactly in the
99
+ case that produces it.
100
+ """
101
+ return _is_terminal_stage(stage) or stage.endswith("_failed")
90
102
 
91
103
 
92
104
  # Guards throttle bookkeeping; slow HF commit runs outside this lock so heartbeat and liveness
@@ -210,6 +222,17 @@ def heartbeat(
210
222
  ):
211
223
  genuine_progress = not liveness
212
224
  with _HB_LOCK:
225
+ if stage == "checkpoint_upload_failed":
226
+ failure = kw.get("checkpoint_failure")
227
+ if isinstance(failure, dict):
228
+ _w._HB_PENDING_CHECKPOINT_FAILURE = dict(failure)
229
+ elif stage == "checkpoint_uploaded":
230
+ # a later full resume checkpoint landed, so the earlier failure no longer describes the
231
+ # run's outcome. deployable or final adapter publication cannot clear this because neither
232
+ # restores the missing full resume state.
233
+ _w._HB_PENDING_CHECKPOINT_FAILURE = None
234
+ elif _is_terminal_stage(stage) and _w._HB_PENDING_CHECKPOINT_FAILURE:
235
+ kw.setdefault("checkpoint_failure", dict(_w._HB_PENDING_CHECKPOINT_FAILURE))
213
236
  ts = time.time()
214
237
  if genuine_progress:
215
238
  _w._HB_LAST_PROGRESS_TS = ts
@@ -553,7 +553,17 @@ def upload_resume_checkpoint(
553
553
  )
554
554
  if emit_heartbeat:
555
555
  with contextlib.suppress(Exception):
556
- _w.heartbeat("checkpoint_upload_failed", step=step)
556
+ # worker stdout is not part of control-plane run logs, so the stage
557
+ # name alone would otherwise be the entire failure report.
558
+ _w.heartbeat(
559
+ "checkpoint_upload_failed",
560
+ step=step,
561
+ checkpoint_failure={
562
+ "step": step,
563
+ "operation": failure_stage,
564
+ "error": sanitize_diagnostic(e, limit=300),
565
+ },
566
+ )
557
567
  if failure_stage in {"before", "after"}:
558
568
  raise
559
569
  return False
@@ -262,7 +262,25 @@ def _format_heartbeat(hb: dict) -> str:
262
262
  for name, value in reward_metrics.items():
263
263
  if isinstance(value, (int, float)):
264
264
  msg += f" {name}={value:.3f}"
265
+ error = hb.get("error")
266
+ if isinstance(error, str) and error.strip():
267
+ msg += f" error={error.strip()}"
268
+ checkpoint_failure = hb.get("checkpoint_failure")
269
+ if isinstance(checkpoint_failure, dict):
270
+ failure_step = checkpoint_failure.get("step")
271
+ if isinstance(failure_step, (int, float)) and not isinstance(failure_step, bool):
272
+ msg += f" checkpoint_failure_step={int(failure_step)}"
273
+ operation = checkpoint_failure.get("operation")
274
+ if isinstance(operation, str) and operation.strip():
275
+ msg += f" checkpoint_failure_stage={operation.strip()}"
276
+ checkpoint_error = checkpoint_failure.get("error")
277
+ if isinstance(checkpoint_error, str) and checkpoint_error.strip():
278
+ msg += f" checkpoint_error={checkpoint_error.strip()}"
265
279
  msg += format_gpu_status(hb.get("gpu"))
280
+ # everything above is one summary record, including untrusted stage, error, and gpu fallback text.
281
+ # sanitize it once at that boundary so no field can forge a second worker record. the deliberately
282
+ # multiline sample and child-output sections are appended below and retain their line breaks.
283
+ msg = neutralize_control_chars(msg).replace("\n", "\\n")
266
284
  sample_lines: list[str] = []
267
285
  rendered_samples = 0
268
286
  samples = hb.get("sampled_completions")
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "freesolo-flash-dev"
3
- version = "1.2.95"
3
+ version = "1.2.96"
4
4
  description ="Flash — managed LoRA post-training (SFT/GRPO/OPD) for Freesolo environments, driven by the `flash` CLI"
5
5
  readme = "README.md"
6
6
  # RunPod Flash supports Python 3.11-3.12 (not 3.13 yet).
@@ -137,7 +137,7 @@ artifacts = ["flash/py.typed"]
137
137
  # auto-published by .github/workflows/publish-dev.yml: a push to `dev` whose version isn't yet on
138
138
  # PyPI publishes it; pushes that don't change it find it already published and no-op. So cutting a
139
139
  # dev-channel release = bump this (and [project].version) and merge to `dev`.
140
- version = "1.2.95"
140
+ version = "1.2.96"
141
141
 
142
142
  [tool.pytest.ini_options]
143
143
  pythonpath = ["."]
@@ -232,3 +232,31 @@ def test_format_heartbeat_neutralizes_control_chars_in_the_child_tail():
232
232
  assert "child output before the stall" in msg
233
233
  assert "\x1b" not in msg
234
234
  assert "\r" not in msg
235
+
236
+
237
+ def test_format_heartbeat_escapes_newlines_in_checkpoint_failure():
238
+ injected = "Permission denied\nworker: stage=done step=999"
239
+
240
+ msg = _format_heartbeat(
241
+ {
242
+ "stage": "checkpoint_upload_failed",
243
+ "checkpoint_failure": {"step": 50, "operation": "resume", "error": injected},
244
+ }
245
+ )
246
+
247
+ assert "\n" not in msg
248
+ assert "checkpoint_error=Permission denied\\nworker: stage=done step=999" in msg
249
+
250
+
251
+ @pytest.mark.parametrize(
252
+ "heartbeat",
253
+ [
254
+ {"stage": "done\nworker: stage=done step=999"},
255
+ {"stage": "ok", "gpu": {"nvidia_smi": "gpu\nworker: stage=done step=999"}},
256
+ ],
257
+ )
258
+ def test_format_heartbeat_summary_fields_cannot_forge_a_worker_record(heartbeat):
259
+ msg = _format_heartbeat(heartbeat)
260
+
261
+ assert "\n" not in msg
262
+ assert "\\nworker: stage=done step=999" in msg
@@ -212,6 +212,167 @@ def test_resume_first_companion_retries_without_reuploading_full_state(monkeypat
212
212
  assert calls == {"resume": 1, "deployable": 2}
213
213
 
214
214
 
215
+ def test_resume_checkpoint_failure_heartbeat_surfaces_sanitized_error(monkeypatch, tmp_path):
216
+ import flash.engine.worker as worker
217
+ from flash.engine.worker.io import hf as worker_hf
218
+
219
+ secret = "hf_checkpoint_upload_secret"
220
+ calls = 0
221
+ heartbeats: list[tuple[str, dict]] = []
222
+
223
+ class Api:
224
+ def upload_folder(self, **_kwargs):
225
+ nonlocal calls
226
+ calls += 1
227
+ raise PermissionError(f"hf quota refused credential {secret} " + "x" * 400)
228
+
229
+ monkeypatch.setenv("HF_TOKEN", secret)
230
+ monkeypatch.setattr(worker, "HF_REPO", "org/runs")
231
+ monkeypatch.setattr(worker, "hf_api", lambda: Api())
232
+ monkeypatch.setattr(
233
+ worker, "heartbeat", lambda stage, **kwargs: heartbeats.append((stage, kwargs))
234
+ )
235
+ monkeypatch.setattr(worker_hf, "_CKPT_UPLOAD_BACKOFF_S", 0.0)
236
+
237
+ assert not worker_hf.upload_resume_checkpoint(50, str(tmp_path))
238
+
239
+ failed = [fields for stage, fields in heartbeats if stage == "checkpoint_upload_failed"]
240
+ assert calls == worker_hf._CKPT_UPLOAD_RETRIES
241
+ assert len(failed) == 1
242
+ assert failed[0]["step"] == 50
243
+ failure = failed[0]["checkpoint_failure"]
244
+ assert failure["step"] == 50
245
+ assert failure["operation"] == "resume"
246
+ assert failure["error"].startswith("PermissionError: hf quota refused")
247
+ assert "<redacted>" in failure["error"]
248
+ assert secret not in failure["error"]
249
+ assert len(failure["error"]) <= 300
250
+
251
+
252
+ @pytest.mark.parametrize("failure_stage", ["before", "after"])
253
+ def test_resume_checkpoint_companion_failure_still_raises(monkeypatch, tmp_path, failure_stage):
254
+ import flash.engine.worker as worker
255
+ from flash.engine.worker.io import hf as worker_hf
256
+
257
+ calls = {"resume": 0, "companion": 0}
258
+ heartbeats: list[tuple[str, dict]] = []
259
+
260
+ class Api:
261
+ def upload_folder(self, **_kwargs):
262
+ calls["resume"] += 1
263
+
264
+ def list_repo_files(self, **_kwargs):
265
+ return []
266
+
267
+ def fail_companion():
268
+ calls["companion"] += 1
269
+ raise RuntimeError(f"{failure_stage} companion failed")
270
+
271
+ callbacks = {f"{failure_stage}_upload": fail_companion}
272
+ monkeypatch.setattr(worker, "HF_REPO", "org/runs")
273
+ monkeypatch.setattr(worker, "hf_api", lambda: Api())
274
+ monkeypatch.setattr(
275
+ worker, "heartbeat", lambda stage, **kwargs: heartbeats.append((stage, kwargs))
276
+ )
277
+ monkeypatch.setattr(worker_hf, "_CKPT_UPLOAD_BACKOFF_S", 0.0)
278
+
279
+ with pytest.raises(RuntimeError, match=f"{failure_stage} companion failed"):
280
+ worker_hf.upload_resume_checkpoint(50, str(tmp_path), **callbacks)
281
+
282
+ failed = [fields for stage, fields in heartbeats if stage == "checkpoint_upload_failed"]
283
+ assert calls["companion"] == worker_hf._CKPT_UPLOAD_RETRIES
284
+ assert calls["resume"] == (0 if failure_stage == "before" else 1)
285
+ assert len(failed) == 1
286
+ failure = failed[0]["checkpoint_failure"]
287
+ assert failure["step"] == 50
288
+ assert failure["operation"] == failure_stage
289
+ assert f"{failure_stage} companion failed" in failure["error"]
290
+
291
+
292
+ def test_upload_failure_cause_reaches_the_rendered_run_log():
293
+ """The payload is not the deliverable: `get_logs()` shows only what the formatter renders.
294
+
295
+ The formatter emits a fixed list of numeric metric keys, so a stage whose entire content is an
296
+ explanation rather than a measurement committed the cause and printed `stage=... step=50` alone.
297
+ """
298
+ from flash.providers._lifecycle.poll import _format_heartbeat
299
+
300
+ line = _format_heartbeat(
301
+ {
302
+ "stage": "checkpoint_upload_failed",
303
+ "step": 50,
304
+ "checkpoint_failure": {
305
+ "step": 50,
306
+ "operation": "resume",
307
+ "error": "PermissionError: hf quota refused credential <redacted>",
308
+ },
309
+ }
310
+ )
311
+
312
+ assert "stage=checkpoint_upload_failed" in line
313
+ assert "step=50" in line
314
+ assert "checkpoint_failure_step=50" in line
315
+ assert "checkpoint_failure_stage=resume" in line
316
+ assert "checkpoint_error=PermissionError: hf quota refused credential <redacted>" in line
317
+
318
+
319
+ def test_a_failure_cause_cannot_rewrite_the_log_it_is_printed_in():
320
+ """This text is an exception message, so it is not ours: a hook or provider response wrote it.
321
+
322
+ The same line already neutralizes child output and sampled completions. Surfacing the cause
323
+ raw would let a `\\x1b[2J` clear the screen or a `\\r` overwrite the line the user is reading
324
+ the failure in -- and the failure report is exactly when the log has to stay legible.
325
+ """
326
+ from flash.providers._lifecycle.poll import _format_heartbeat
327
+
328
+ line = _format_heartbeat(
329
+ {
330
+ "stage": "checkpoint_upload_failed",
331
+ "step": 50,
332
+ "checkpoint_failure": {
333
+ "step": 50,
334
+ "operation": "resume",
335
+ "error": "boom\x1b[2Jwiped\roverwrite",
336
+ },
337
+ }
338
+ )
339
+
340
+ assert "\x1b" not in line
341
+ assert "\r" not in line
342
+ assert "checkpoint_error=boom\\x1b[2Jwiped\\x0doverwrite" in line
343
+
344
+
345
+ def test_a_heartbeat_without_a_failure_cause_is_unchanged():
346
+ """The failure fields are additive: an ordinary step line must not grow an empty `error=`."""
347
+ from flash.providers._lifecycle.poll import _format_heartbeat
348
+
349
+ line = _format_heartbeat(
350
+ {"stage": "sft_step", "step": 12, "error": " ", "checkpoint_failure": {}}
351
+ )
352
+
353
+ assert line == "worker: stage=sft_step step=12"
354
+
355
+
356
+ def test_an_upload_failure_is_critical_so_an_in_flight_commit_cannot_drop_it():
357
+ """This heartbeat is raised from inside a long HF upload -- when a ping is otherwise dropped.
358
+
359
+ `_HB_UPLOAD_IN_FLIGHT` is set for the duration of that upload, and an unforced non-critical
360
+ stage returns not-due immediately. The failure is reported once and nothing restates it, so the
361
+ one case that produces this heartbeat is the case that would discard it.
362
+ """
363
+ from flash.engine.worker.io.heartbeat import _is_critical_stage, _is_terminal_stage
364
+
365
+ assert _is_critical_stage("checkpoint_upload_failed")
366
+ # criticality and checkpoint carry use one terminal predicate.
367
+ assert _is_terminal_stage("done")
368
+ assert _is_terminal_stage("error_oom")
369
+ assert not _is_terminal_stage("checkpoint_upload_failed")
370
+ assert _is_critical_stage("done")
371
+ assert _is_critical_stage("error_oom")
372
+ assert not _is_critical_stage("sft_step")
373
+ assert not _is_critical_stage("rl_step")
374
+
375
+
215
376
  def test_seed_training_rngs_initializes_all_supported_generators(monkeypatch):
216
377
  from flash.engine.worker.runtime import rng
217
378
 
@@ -470,6 +470,73 @@ def _reset_console_heartbeat_state(monkeypatch, worker) -> None:
470
470
  monkeypatch.setattr(worker, "_HB_LAST_PROGRESS_TS", 0.0)
471
471
  monkeypatch.setattr(worker, "_HB_PROGRESS_SEQ", 0)
472
472
  monkeypatch.setattr(worker, "_HB_PROGRESS_UPLOADED_SEQ", 0)
473
+ monkeypatch.setattr(worker, "_HB_PENDING_CHECKPOINT_FAILURE", None)
474
+
475
+
476
+ def _capture_heartbeat_payloads(monkeypatch, worker) -> list[dict]:
477
+ import json
478
+
479
+ committed: list[dict] = []
480
+
481
+ def capture(path, destination, **_kwargs):
482
+ if destination == "heartbeat.json":
483
+ with open(path) as file:
484
+ committed.append(json.load(file))
485
+ return True
486
+
487
+ _reset_console_heartbeat_state(monkeypatch, worker)
488
+ monkeypatch.setattr(worker, "hf_upload_file", capture)
489
+ return committed
490
+
491
+
492
+ def test_fatal_heartbeat_preserves_checkpoint_failure_and_terminal_error(monkeypatch):
493
+ import flash.engine.worker as worker
494
+
495
+ committed = _capture_heartbeat_payloads(monkeypatch, worker)
496
+ failure = {"step": 50, "operation": "resume", "error": "quota denied"}
497
+
498
+ worker.heartbeat("checkpoint_upload_failed", step=50, checkpoint_failure=failure)
499
+ worker.heartbeat("error_sft", error="watcher failed")
500
+
501
+ assert committed[-1]["stage"] == "error_sft"
502
+ assert committed[-1]["error"] == "watcher failed"
503
+ assert committed[-1]["checkpoint_failure"] == failure
504
+
505
+
506
+ def test_finalize_preserves_failed_checkpoint_identity(monkeypatch):
507
+ import flash.engine.worker as worker
508
+ from flash.engine.result.accounting import RunMetrics
509
+
510
+ committed = _capture_heartbeat_payloads(monkeypatch, worker)
511
+ monkeypatch.setattr(worker, "gpu_diagnostics", dict)
512
+ failure = {"step": 50, "operation": "resume", "error": "quota denied"}
513
+
514
+ worker.heartbeat("checkpoint_upload_failed", step=50, checkpoint_failure=failure)
515
+ worker._finalize(RunMetrics(phase="sft", step=100))
516
+
517
+ assert committed[-1]["stage"] == "done"
518
+ assert committed[-1]["step"] == 100
519
+ assert committed[-1]["checkpoint_failure"] == failure
520
+
521
+
522
+ @pytest.mark.parametrize("terminal_stage", ["done", "error_sft"])
523
+ def test_successful_checkpoint_clears_failure_before_any_terminal(monkeypatch, terminal_stage):
524
+ import flash.engine.worker as worker
525
+ from flash.engine.result.accounting import RunMetrics
526
+
527
+ committed = _capture_heartbeat_payloads(monkeypatch, worker)
528
+ failure = {"step": 50, "operation": "resume", "error": "quota denied"}
529
+
530
+ worker.heartbeat("checkpoint_upload_failed", step=50, checkpoint_failure=failure)
531
+ worker.heartbeat("checkpoint_uploaded", step=75)
532
+ if terminal_stage == "done":
533
+ monkeypatch.setattr(worker, "gpu_diagnostics", dict)
534
+ worker._finalize(RunMetrics(phase="sft", step=100))
535
+ else:
536
+ worker.heartbeat(terminal_stage, step=100, error="later fatal")
537
+
538
+ assert committed[-1]["stage"] == terminal_stage
539
+ assert "checkpoint_failure" not in committed[-1]
473
540
 
474
541
 
475
542
  @pytest.mark.parametrize(
@@ -1052,7 +1052,7 @@ wheels = [
1052
1052
 
1053
1053
  [[package]]
1054
1054
  name = "freesolo-flash"
1055
- version = "1.2.95"
1055
+ version = "1.2.96"
1056
1056
  source = { editable = "." }
1057
1057
 
1058
1058
  [package.optional-dependencies]