freesolo-flash-dev 1.2.95__tar.gz → 1.2.97__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.97}/PKG-INFO +1 -1
  2. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/cli/commands/__init__.py +30 -11
  3. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/cli/commands/train_cost.py +103 -6
  4. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/cli/commands/worker_output.py +20 -11
  5. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/engine/worker/__init__.py +3 -0
  6. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/engine/worker/io/heartbeat.py +26 -3
  7. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/engine/worker/io/hf.py +11 -1
  8. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/envs/identity.py +10 -0
  9. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/providers/_lifecycle/poll.py +18 -0
  10. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/pyproject.toml +2 -2
  11. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/test_cli_commands.py +249 -10
  12. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/test_cli_commands_coverage.py +11 -3
  13. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/test_cli_estimate.py +85 -2
  14. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/test_poll_helpers.py +28 -0
  15. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/test_training_controls.py +161 -0
  16. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/test_worker_init_heartbeat.py +67 -0
  17. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/uv.lock +1 -1
  18. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/.dockerignore +0 -0
  19. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/.env.example +0 -0
  20. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/.github/CODEOWNERS +0 -0
  21. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  22. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  23. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
  24. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  25. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/.github/dependabot.yml +0 -0
  26. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/.github/workflows/auto-rebake.yml +0 -0
  27. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/.github/workflows/bake-kernel-cache.yml +0 -0
  28. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/.github/workflows/ci.yml +0 -0
  29. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/.github/workflows/dev-kernel-cache.yml +0 -0
  30. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/.github/workflows/main-source-guard.yml +0 -0
  31. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/.github/workflows/notify-tests-repo.yml +0 -0
  32. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/.github/workflows/production-kernel-cache-ready.yml +0 -0
  33. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/.github/workflows/publish-dev.yml +0 -0
  34. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/.github/workflows/publish-image.yml +0 -0
  35. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/.github/workflows/publish.yml +0 -0
  36. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/.github/workflows/version-parity.yml +0 -0
  37. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/.github/workflows/worker-image.yml +0 -0
  38. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/.gitignore +0 -0
  39. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/CHANGELOG.md +0 -0
  40. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/CODE_OF_CONDUCT.md +0 -0
  41. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/CONTRIBUTING.md +0 -0
  42. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/Dockerfile +0 -0
  43. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/Dockerfile.worker +0 -0
  44. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/LICENSE +0 -0
  45. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/NOTICE +0 -0
  46. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/README.md +0 -0
  47. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/SECURITY.md +0 -0
  48. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/SELF_HOSTING.md +0 -0
  49. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/build/kernel_cache/.gitignore +0 -0
  50. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/build/kernel_cache/.keep +0 -0
  51. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/deploy/infisical/README.md +0 -0
  52. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/deploy/infisical/entrypoint.sh +0 -0
  53. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/docker/Dockerfile.kernelcache +0 -0
  54. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/docker/Dockerfile.kernelcache.relayer +0 -0
  55. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/docker/bake_kernel_cache.py +0 -0
  56. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/docker/bake_pod_entry.py +0 -0
  57. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/docker/extract_cudart_fix.py +0 -0
  58. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/docker/kernel_fingerprint.py +0 -0
  59. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/docker/make_rp_handler.py +0 -0
  60. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/__init__.py +0 -0
  61. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/_internal/__init__.py +0 -0
  62. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/_internal/channel.py +0 -0
  63. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/_internal/diagnostics.py +0 -0
  64. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/_internal/fileio.py +0 -0
  65. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/_internal/logging.py +0 -0
  66. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/_internal/paths.py +0 -0
  67. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/adapters/__init__.py +0 -0
  68. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/adapters/artifacts.py +0 -0
  69. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/adapters/fused_experts.py +0 -0
  70. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/adapters/lora_rank.py +0 -0
  71. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/adapters/targets.py +0 -0
  72. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/cli/__init__.py +0 -0
  73. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/cli/__main__.py +0 -0
  74. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/cli/commands/deploy.py +0 -0
  75. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/cli/commands/env/__init__.py +0 -0
  76. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/cli/commands/env/episode.py +0 -0
  77. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/cli/commands/env/eval.py +0 -0
  78. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/cli/commands/env/eval_args.py +0 -0
  79. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/cli/commands/env/imports.py +0 -0
  80. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/cli/commands/env/list.py +0 -0
  81. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/cli/commands/env/push.py +0 -0
  82. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/cli/commands/env/retained.py +0 -0
  83. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/cli/commands/env/setup.py +0 -0
  84. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/cli/commands/env/setup_wandb.py +0 -0
  85. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/cli/commands/env/test.py +0 -0
  86. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/cli/commands/env/test_evaluations.py +0 -0
  87. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/cli/commands/env/test_params.py +0 -0
  88. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/cli/commands/env/test_warnings.py +0 -0
  89. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/cli/commands/prompt_budget.py +0 -0
  90. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/cli/commands/traces.py +0 -0
  91. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/cli/errors.py +0 -0
  92. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/cli/scaffold/TRAINING.md +0 -0
  93. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/cli/scaffold/__init__.py +0 -0
  94. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/cli/ui/__init__.py +0 -0
  95. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/cli/ui/cost.py +0 -0
  96. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/cli/ui/env_panels.py +0 -0
  97. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/cli/ui/heartbeat.py +0 -0
  98. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/cli/ui/render.py +0 -0
  99. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/cli/ui/tables.py +0 -0
  100. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/cli/ui/tty.py +0 -0
  101. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/client/__init__.py +0 -0
  102. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/client/config.py +0 -0
  103. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/client/freesolo_api.py +0 -0
  104. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/client/http.py +0 -0
  105. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/client/runtime_secrets.py +0 -0
  106. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/client/shapes.py +0 -0
  107. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/client/specs.py +0 -0
  108. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/client/streaming.py +0 -0
  109. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/content/__init__.py +0 -0
  110. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/content/image_descriptors.py +0 -0
  111. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/content/multimodal.py +0 -0
  112. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/content/structured_outputs.py +0 -0
  113. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/content/thinking.py +0 -0
  114. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/core/__init__.py +0 -0
  115. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/core/catalog.py +0 -0
  116. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/core/grpo.py +0 -0
  117. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/core/spec.py +0 -0
  118. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/core/spec_persistence.py +0 -0
  119. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/cost/__init__.py +0 -0
  120. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/cost/analytical.py +0 -0
  121. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/cost/facts.py +0 -0
  122. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/cost/spec.py +0 -0
  123. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/cost/types.py +0 -0
  124. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/engine/__init__.py +0 -0
  125. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/engine/huggingface.py +0 -0
  126. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/engine/plan/__init__.py +0 -0
  127. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/engine/plan/kv_sizing.py +0 -0
  128. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/engine/plan/model_config_probe.py +0 -0
  129. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/engine/plan/prompt_budget.py +0 -0
  130. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/engine/plan/recipe.py +0 -0
  131. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/engine/plan/steps.py +0 -0
  132. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/engine/plan/vram.py +0 -0
  133. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/engine/profiling/__init__.py +0 -0
  134. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/engine/profiling/dataset_profile.py +0 -0
  135. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/engine/profiling/image_tokens.py +0 -0
  136. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/engine/profiling/reasoning_render.py +0 -0
  137. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/engine/profiling/sft_image_rows.py +0 -0
  138. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/engine/profiling/sft_workload.py +0 -0
  139. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/engine/profiling/tokenizer.py +0 -0
  140. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/engine/profiling/workload_profile.py +0 -0
  141. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/engine/result/__init__.py +0 -0
  142. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/engine/result/accounting.py +0 -0
  143. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/engine/result/rollout_samples.py +0 -0
  144. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/engine/worker/__main__.py +0 -0
  145. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/engine/worker/backend_common.py +0 -0
  146. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/engine/worker/entry/__init__.py +0 -0
  147. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/engine/worker/entry/opd.py +0 -0
  148. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/engine/worker/entry/rl.py +0 -0
  149. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/engine/worker/entry/sft.py +0 -0
  150. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/engine/worker/io/__init__.py +0 -0
  151. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/engine/worker/io/prefetch.py +0 -0
  152. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/engine/worker/io/wandb_log.py +0 -0
  153. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/engine/worker/model/__init__.py +0 -0
  154. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/engine/worker/model/adapter.py +0 -0
  155. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/engine/worker/model/chatml_mask.py +0 -0
  156. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/engine/worker/model/decoding.py +0 -0
  157. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/engine/worker/model/lora.py +0 -0
  158. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/engine/worker/model/packing.py +0 -0
  159. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/engine/worker/opd_train.py +0 -0
  160. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/engine/worker/opd_train_runner.py +0 -0
  161. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/engine/worker/perf/__init__.py +0 -0
  162. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/engine/worker/perf/diagnostics.py +0 -0
  163. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/engine/worker/perf/lifecycle.py +0 -0
  164. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/engine/worker/perf/liger.py +0 -0
  165. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/engine/worker/perf/memory.py +0 -0
  166. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/engine/worker/rl_train.py +0 -0
  167. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/engine/worker/rl_train_runner.py +0 -0
  168. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/engine/worker/runtime/__init__.py +0 -0
  169. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/engine/worker/runtime/kernel_warmup.py +0 -0
  170. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/engine/worker/runtime/pkg_proxy.py +0 -0
  171. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/engine/worker/runtime/rng.py +0 -0
  172. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/engine/worker/score_batcher.py +0 -0
  173. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/engine/worker/sft_train.py +0 -0
  174. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/engine/worker/sft_train_runner.py +0 -0
  175. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/engine/worker/teacher/__init__.py +0 -0
  176. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/engine/worker/teacher/client.py +0 -0
  177. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/engine/worker/teacher/encoding.py +0 -0
  178. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/engine/worker/teacher/tokenizer_align.py +0 -0
  179. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/engine/worker/train/__init__.py +0 -0
  180. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/engine/worker/train/core/__init__.py +0 -0
  181. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/engine/worker/train/core/checkpoint_lifecycle.py +0 -0
  182. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/engine/worker/train/core/child/__init__.py +0 -0
  183. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/engine/worker/train/core/child/glue.py +0 -0
  184. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/engine/worker/train/core/child/runtime.py +0 -0
  185. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/engine/worker/train/core/step_timing.py +0 -0
  186. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/engine/worker/train/finalize.py +0 -0
  187. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/engine/worker/train/opd/__init__.py +0 -0
  188. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/engine/worker/train/opd/batching.py +0 -0
  189. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/engine/worker/train/opd/bridge.py +0 -0
  190. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/engine/worker/train/opd/bridge_failures.py +0 -0
  191. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/engine/worker/train/opd/child/__init__.py +0 -0
  192. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/engine/worker/train/opd/child/bridge.py +0 -0
  193. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/engine/worker/train/opd/child/entry.py +0 -0
  194. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/engine/worker/train/opd/child/multiturn.py +0 -0
  195. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/engine/worker/train/opd/child/plugin.py +0 -0
  196. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/engine/worker/train/opd/child/replay_guard.py +0 -0
  197. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/engine/worker/train/opd/child/runtime.py +0 -0
  198. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/engine/worker/train/opd/child/structured.py +0 -0
  199. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/engine/worker/train/opd/failures.py +0 -0
  200. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/engine/worker/train/opd/gkd.py +0 -0
  201. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/engine/worker/train/opd/multiturn_media.py +0 -0
  202. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/engine/worker/train/opd/multiturn_validation.py +0 -0
  203. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/engine/worker/train/opd/overrides.py +0 -0
  204. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/engine/worker/train/opd/prompts.py +0 -0
  205. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/engine/worker/train/opd/reporting.py +0 -0
  206. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/engine/worker/train/opd/scoring.py +0 -0
  207. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/engine/worker/train/opd/state.py +0 -0
  208. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/engine/worker/train/opd/validation.py +0 -0
  209. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/engine/worker/train/rl/__init__.py +0 -0
  210. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/engine/worker/train/rl/checkpoints.py +0 -0
  211. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/engine/worker/train/rl/child/__init__.py +0 -0
  212. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/engine/worker/train/rl/child/entry.py +0 -0
  213. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/engine/worker/train/rl/child/multiturn.py +0 -0
  214. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/engine/worker/train/rl/child/patches.py +0 -0
  215. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/engine/worker/train/rl/child/plugin.py +0 -0
  216. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/engine/worker/train/rl/config.py +0 -0
  217. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/engine/worker/train/rl/identity.py +0 -0
  218. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/engine/worker/train/rl/inputs.py +0 -0
  219. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/engine/worker/train/rl/multi_turn.py +0 -0
  220. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/engine/worker/train/rl/reward_module.py +0 -0
  221. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/engine/worker/train/rl/scoring.py +0 -0
  222. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/engine/worker/train/rl/single_turn.py +0 -0
  223. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/engine/worker/train/rl/verl_config.py +0 -0
  224. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/engine/worker/train/sft/__init__.py +0 -0
  225. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/engine/worker/train/sft/checkpoints.py +0 -0
  226. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/engine/worker/train/sft/child/entry.py +0 -0
  227. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/engine/worker/train/sft/child/plugin.py +0 -0
  228. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/engine/worker/train/sft/config.py +0 -0
  229. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/engine/worker/verl/__init__.py +0 -0
  230. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/engine/worker/verl/capabilities.py +0 -0
  231. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/engine/worker/verl/checkpoints.py +0 -0
  232. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/engine/worker/verl/child_io.py +0 -0
  233. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/engine/worker/verl/diagnostics.py +0 -0
  234. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/engine/worker/verl/parallelism.py +0 -0
  235. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/engine/worker/verl/parent_work.py +0 -0
  236. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/engine/worker/verl/process_census.py +0 -0
  237. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/engine/worker_entrypoint.py +0 -0
  238. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/envs/__init__.py +0 -0
  239. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/envs/adapter.py +0 -0
  240. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/envs/base.py +0 -0
  241. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/envs/cache_security.py +0 -0
  242. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/envs/dataset_selection.py +0 -0
  243. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/envs/evaluations.py +0 -0
  244. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/envs/loader.py +0 -0
  245. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/envs/namespace_listing.py +0 -0
  246. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/envs/package/__init__.py +0 -0
  247. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/envs/package/direct_tokens.py +0 -0
  248. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/envs/package/limits.py +0 -0
  249. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/envs/package/unpack.py +0 -0
  250. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/envs/pull.py +0 -0
  251. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/envs/staged.py +0 -0
  252. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/providers/__init__.py +0 -0
  253. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/providers/_lifecycle/__init__.py +0 -0
  254. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/providers/_lifecycle/auth.py +0 -0
  255. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/providers/_lifecycle/bootstrap.py +0 -0
  256. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/providers/_lifecycle/bootstrap_console.py +0 -0
  257. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/providers/_lifecycle/bootstrap_pip.py +0 -0
  258. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/providers/_lifecycle/bootstrap_secrets.py +0 -0
  259. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/providers/_lifecycle/deadline.py +0 -0
  260. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/providers/_lifecycle/host/__init__.py +0 -0
  261. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/providers/_lifecycle/host/deadline_sleep.py +0 -0
  262. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/providers/_lifecycle/host/failmark.py +0 -0
  263. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/providers/_lifecycle/host/hostlog.py +0 -0
  264. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/providers/_lifecycle/http.py +0 -0
  265. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/providers/_lifecycle/instance.py +0 -0
  266. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/providers/_lifecycle/poll_instance.py +0 -0
  267. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/providers/_lifecycle/provider.py +0 -0
  268. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/providers/_lifecycle/terminal_artifacts.py +0 -0
  269. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/providers/_lifecycle/worker.py +0 -0
  270. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/providers/allocator.py +0 -0
  271. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/providers/artifacts/__init__.py +0 -0
  272. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/providers/artifacts/hf.py +0 -0
  273. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/providers/artifacts/preload_runpod.py +0 -0
  274. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/providers/artifacts/weight_cache.py +0 -0
  275. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/providers/base.py +0 -0
  276. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/providers/fit_errors.py +0 -0
  277. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/providers/lambda_/__init__.py +0 -0
  278. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/providers/lambda_/api.py +0 -0
  279. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/providers/lambda_/auth.py +0 -0
  280. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/providers/lambda_/gpus.py +0 -0
  281. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/providers/lambda_/jobs/__init__.py +0 -0
  282. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/providers/lambda_/jobs/builders.py +0 -0
  283. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/providers/lambda_/jobs/reap.py +0 -0
  284. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/providers/lambda_/preflight.py +0 -0
  285. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/providers/lambda_/pricing.py +0 -0
  286. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/providers/preflight.py +0 -0
  287. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/providers/realized.py +0 -0
  288. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/providers/runpod/__init__.py +0 -0
  289. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/providers/runpod/api.py +0 -0
  290. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/providers/runpod/auth.py +0 -0
  291. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/providers/runpod/cost.py +0 -0
  292. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/providers/runpod/gpus.py +0 -0
  293. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/providers/runpod/job_execution.py +0 -0
  294. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/providers/runpod/jobs.py +0 -0
  295. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/providers/runpod/preflight.py +0 -0
  296. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/providers/runpod/pricing.py +0 -0
  297. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/providers/runpod/resources.py +0 -0
  298. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/providers/runpod/serverless/__init__.py +0 -0
  299. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/providers/runpod/serverless/endpoints.py +0 -0
  300. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/providers/sharding.py +0 -0
  301. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/providers/vast/__init__.py +0 -0
  302. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/providers/vast/api.py +0 -0
  303. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/providers/vast/auth.py +0 -0
  304. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/providers/vast/jobs/__init__.py +0 -0
  305. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/providers/vast/jobs/builders.py +0 -0
  306. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/providers/vast/preflight.py +0 -0
  307. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/providers/vast/pricing.py +0 -0
  308. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/py.typed +0 -0
  309. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/runner/__init__.py +0 -0
  310. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/runner/artifacts.py +0 -0
  311. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/runner/attempts.py +0 -0
  312. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/runner/costs.py +0 -0
  313. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/runner/deadlines.py +0 -0
  314. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/runner/preparation.py +0 -0
  315. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/runner/reconciliation.py +0 -0
  316. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/runner/results/__init__.py +0 -0
  317. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/runner/results/checkpoints.py +0 -0
  318. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/runner/results/verified_revisions.py +0 -0
  319. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/runner/status.py +0 -0
  320. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/runner/submit.py +0 -0
  321. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/runner/supervise/__init__.py +0 -0
  322. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/runner/supervise/attach.py +0 -0
  323. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/runner/supervise/deploy.py +0 -0
  324. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/runner/supervise/lifecycle.py +0 -0
  325. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/runner/supervise/recovery.py +0 -0
  326. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/runner/supervise/retry_decision.py +0 -0
  327. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/runner/supervise/seed_submission.py +0 -0
  328. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/runner/supervise/transitions.py +0 -0
  329. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/runner/weight_cache.py +0 -0
  330. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/runtime_capsule/__init__.py +0 -0
  331. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/runtime_capsule/build.py +0 -0
  332. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/runtime_capsule/manifest.py +0 -0
  333. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/runtime_capsule/profiles.py +0 -0
  334. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/schema/__init__.py +0 -0
  335. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/schema/fields.py +0 -0
  336. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/serve/__init__.py +0 -0
  337. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/serve/adapter_check.py +0 -0
  338. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/serve/deploy.py +0 -0
  339. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/serve/errors.py +0 -0
  340. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/serve/export.py +0 -0
  341. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/serve/preflight.py +0 -0
  342. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/serve/responses.py +0 -0
  343. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/serve/streaming.py +0 -0
  344. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/serve/thinking.py +0 -0
  345. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/serve/urls.py +0 -0
  346. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/server/__init__.py +0 -0
  347. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/server/__main__.py +0 -0
  348. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/server/app.py +0 -0
  349. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/server/billing/__init__.py +0 -0
  350. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/server/billing/charges.py +0 -0
  351. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/server/billing/retry.py +0 -0
  352. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/server/domain/__init__.py +0 -0
  353. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/server/domain/checkpoints.py +0 -0
  354. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/server/domain/environment_registry.py +0 -0
  355. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/server/domain/envs.py +0 -0
  356. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/server/domain/projects.py +0 -0
  357. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/server/domain/reconcile.py +0 -0
  358. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/server/domain/repo_cleanup.py +0 -0
  359. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/server/domain/run_registry.py +0 -0
  360. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/server/domain/teacher_broker.py +0 -0
  361. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/server/domain/teacher_errors.py +0 -0
  362. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/server/domain/teacher_requests.py +0 -0
  363. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/server/platform/__init__.py +0 -0
  364. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/server/platform/auth.py +0 -0
  365. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/server/platform/db.py +0 -0
  366. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/server/platform/deps.py +0 -0
  367. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/server/platform/internal_client.py +0 -0
  368. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/server/platform/locks.py +0 -0
  369. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/server/platform/runtime.py +0 -0
  370. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/server/routes/__init__.py +0 -0
  371. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/server/routes/envs.py +0 -0
  372. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/server/routes/meta.py +0 -0
  373. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/server/routes/runs.py +0 -0
  374. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/server/routes/serving.py +0 -0
  375. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/server/routes/serving_completion.py +0 -0
  376. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/server/routes/serving_revisions.py +0 -0
  377. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/server/routes/serving_smoke.py +0 -0
  378. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/server/routes/teacher.py +0 -0
  379. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/source_snapshot.py +0 -0
  380. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/teacher/__init__.py +0 -0
  381. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/teacher/limits.py +0 -0
  382. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/teacher/provider_status.py +0 -0
  383. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/flash/teacher/retry_contract.py +0 -0
  384. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/scripts/build_dev_dist.py +0 -0
  385. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/scripts/check_file_size.py +0 -0
  386. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/scripts/check_function_size.py +0 -0
  387. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/scripts/check_rollout_identity_actor.py +0 -0
  388. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/scripts/check_verl_pin_exists.py +0 -0
  389. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/scripts/scrub_history.sh +0 -0
  390. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/__init__.py +0 -0
  391. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/_helpers/__init__.py +0 -0
  392. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/_helpers/profile.py +0 -0
  393. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/_helpers/runner.py +0 -0
  394. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/_helpers/source_snapshot.py +0 -0
  395. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/_helpers/specs.py +0 -0
  396. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/_helpers/teacher.py +0 -0
  397. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/_helpers/vast.py +0 -0
  398. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/capture_image_sft_processor_oracle.py +0 -0
  399. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/conftest.py +0 -0
  400. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/fixtures/image_sft_processor_oracle.json +0 -0
  401. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/fixtures/qwen35_08b_target_metadata.json +0 -0
  402. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/live/__init__.py +0 -0
  403. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/live/conftest.py +0 -0
  404. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/live/test_lambda_live.py +0 -0
  405. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/live/test_runpod_live.py +0 -0
  406. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/live/test_sft_thinking_render_live.py +0 -0
  407. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/live/test_vast_live.py +0 -0
  408. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/test_accounting_coverage.py +0 -0
  409. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/test_adapter_shard_completeness.py +0 -0
  410. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/test_agent_flash_cli_contract.py +0 -0
  411. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/test_algorithms.py +0 -0
  412. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/test_allocator.py +0 -0
  413. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/test_backend_common.py +0 -0
  414. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/test_backend_jobspec_contract.py +0 -0
  415. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/test_bake_kernel_cache.py +0 -0
  416. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/test_base_model_provenance.py +0 -0
  417. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/test_billing_retry.py +0 -0
  418. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/test_build_context_contract.py +0 -0
  419. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/test_cancel_remote.py +0 -0
  420. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/test_catalog_consistency.py +0 -0
  421. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/test_catalog_only_models.py +0 -0
  422. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/test_charge_pricing.py +0 -0
  423. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/test_checkpoint_lifecycle.py +0 -0
  424. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/test_checkpoints.py +0 -0
  425. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/test_cli_credential_shadowing.py +0 -0
  426. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/test_cli_errors.py +0 -0
  427. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/test_cli_gpus_flag.py +0 -0
  428. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/test_cli_help.py +0 -0
  429. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/test_cli_main_coverage.py +0 -0
  430. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/test_cli_managed.py +0 -0
  431. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/test_cli_render_coverage.py +0 -0
  432. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/test_cli_render_theme.py +0 -0
  433. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/test_cli_traces.py +0 -0
  434. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/test_cli_wandb_warning.py +0 -0
  435. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/test_client.py +0 -0
  436. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/test_client_import_purity.py +0 -0
  437. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/test_client_server_integration.py +0 -0
  438. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/test_client_stream_reads.py +0 -0
  439. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/test_config_env_vars.py +0 -0
  440. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/test_config_overrides.py +0 -0
  441. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/test_console_upload.py +0 -0
  442. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/test_controlled_experiment_repairs.py +0 -0
  443. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/test_cost_analytical.py +0 -0
  444. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/test_cost_equation.py +0 -0
  445. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/test_cost_estimate.py +0 -0
  446. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/test_cost_hardware.py +0 -0
  447. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/test_cost_models.py +0 -0
  448. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/test_dataset_profile.py +0 -0
  449. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/test_deploy_alias_move_warning.py +0 -0
  450. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/test_deploy_latency.py +0 -0
  451. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/test_dev_channel.py +0 -0
  452. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/test_disk_gb.py +0 -0
  453. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/test_endpoint_name.py +0 -0
  454. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/test_env_cache_evict.py +0 -0
  455. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/test_env_delete.py +0 -0
  456. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/test_env_download.py +0 -0
  457. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/test_env_download_api.py +0 -0
  458. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/test_env_evaluations.py +0 -0
  459. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/test_env_list_api.py +0 -0
  460. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/test_env_list_cli.py +0 -0
  461. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/test_env_list_hub.py +0 -0
  462. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/test_env_no_install.py +0 -0
  463. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/test_env_publish.py +0 -0
  464. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/test_env_pull.py +0 -0
  465. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/test_env_pull_coverage.py +0 -0
  466. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/test_env_pull_loader_coverage.py +0 -0
  467. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/test_env_pull_managed_control_plane.py +0 -0
  468. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/test_env_push.py +0 -0
  469. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/test_env_rate_limit_resolve.py +0 -0
  470. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/test_env_ref_pinning.py +0 -0
  471. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/test_env_test.py +0 -0
  472. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/test_envs_coverage.py +0 -0
  473. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/test_export.py +0 -0
  474. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/test_flash_mvp.py +0 -0
  475. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/test_flash_worker.py +0 -0
  476. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/test_flashinfer_cache_dirs.py +0 -0
  477. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/test_freesolo_api_transport.py +0 -0
  478. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/test_fused_expert_warmstart.py +0 -0
  479. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/test_github_urlopen_retry.py +0 -0
  480. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/test_gpu_type_single_field.py +0 -0
  481. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/test_gpus.py +0 -0
  482. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/test_grpo_params.py +0 -0
  483. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/test_grpo_process_census.py +0 -0
  484. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/test_grpo_resident_sizing.py +0 -0
  485. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/test_grpo_reward_batching.py +0 -0
  486. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/test_grpo_rollout_contract.py +0 -0
  487. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/test_grpo_rollout_identity.py +0 -0
  488. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/test_health_liveness.py +0 -0
  489. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/test_hf_retry.py +0 -0
  490. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/test_idle_endpoint_reaper.py +0 -0
  491. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/test_image_environment_capability.py +0 -0
  492. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/test_image_incremental_processor.py +0 -0
  493. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/test_image_sft_markers.py +0 -0
  494. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/test_image_sft_processor_parity.py +0 -0
  495. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/test_image_tokens.py +0 -0
  496. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/test_infisical_secrets.py +0 -0
  497. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/test_instance_bootstrap_coverage.py +0 -0
  498. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/test_internal_client.py +0 -0
  499. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/test_jobs.py +0 -0
  500. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/test_kernel_cache.py +0 -0
  501. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/test_kernel_fingerprint.py +0 -0
  502. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/test_kv_util.py +0 -0
  503. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/test_lambda_api_coverage.py +0 -0
  504. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/test_lambda_runner.py +0 -0
  505. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/test_logging.py +0 -0
  506. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/test_login_perms.py +0 -0
  507. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/test_lora_rank_coverage.py +0 -0
  508. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/test_lora_rank_nested_rung.py +0 -0
  509. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/test_lora_rank_preflight.py +0 -0
  510. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/test_lora_targeting.py +0 -0
  511. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/test_lora_targeting_pinned_verl.py +0 -0
  512. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/test_managed_config_fields.py +0 -0
  513. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/test_managed_hf_repo.py +0 -0
  514. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/test_metrics_schema_agent_contract.py +0 -0
  515. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/test_mig_guard.py +0 -0
  516. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/test_multi_gpu_gate.py +0 -0
  517. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/test_multimodal_training.py +0 -0
  518. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/test_named_reward_metrics.py +0 -0
  519. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/test_oom_escalate_gpu.py +0 -0
  520. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/test_opd.py +0 -0
  521. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/test_opd_limits.py +0 -0
  522. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/test_opd_multiturn_eos_boundary.py +0 -0
  523. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/test_opd_multiturn_failure_exit.py +0 -0
  524. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/test_opd_replay_guard.py +0 -0
  525. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/test_opd_resume_safety.py +0 -0
  526. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/test_opd_train.py +0 -0
  527. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/test_orchestrator_flash.py +0 -0
  528. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/test_packing.py +0 -0
  529. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/test_packing_coverage.py +0 -0
  530. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/test_parasail_teacher.py +0 -0
  531. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/test_persisted_spec_envelope.py +0 -0
  532. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/test_preflight.py +0 -0
  533. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/test_projects.py +0 -0
  534. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/test_prompt_budget.py +0 -0
  535. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/test_provider_preflight_coverage.py +0 -0
  536. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/test_provider_routing.py +0 -0
  537. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/test_provider_teardown_robustness.py +0 -0
  538. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/test_providers_symmetry.py +0 -0
  539. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/test_realized_cost.py +0 -0
  540. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/test_repo_cleanup.py +0 -0
  541. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/test_resolve_params_b.py +0 -0
  542. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/test_resume_on_retry.py +0 -0
  543. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/test_rl_train.py +0 -0
  544. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/test_rollout_samples.py +0 -0
  545. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/test_runmgmt.py +0 -0
  546. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/test_runpod_api_delete.py +0 -0
  547. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/test_runpod_key_fingerprint.py +0 -0
  548. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/test_runpod_key_waterfall.py +0 -0
  549. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/test_runtime_capsule.py +0 -0
  550. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/test_serve.py +0 -0
  551. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/test_serve_reasoning_content.py +0 -0
  552. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/test_server_api.py +0 -0
  553. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/test_server_app_coverage.py +0 -0
  554. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/test_server_auth_singleflight.py +0 -0
  555. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/test_server_billing.py +0 -0
  556. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/test_server_checkpoints_coverage.py +0 -0
  557. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/test_server_db.py +0 -0
  558. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/test_server_envs_coverage.py +0 -0
  559. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/test_server_locks_coverage.py +0 -0
  560. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/test_server_standalone.py +0 -0
  561. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/test_serving_context_preflight.py +0 -0
  562. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/test_serving_contract.py +0 -0
  563. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/test_serving_schema_coverage.py +0 -0
  564. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/test_sft_chunked_nll.py +0 -0
  565. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/test_sft_example_selection.py +0 -0
  566. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/test_sft_gc_off.py +0 -0
  567. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/test_sft_max_context.py +0 -0
  568. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/test_sft_startup_block.py +0 -0
  569. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/test_sft_train.py +0 -0
  570. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/test_sft_workload.py +0 -0
  571. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/test_source_attestation_flow.py +0 -0
  572. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/test_source_snapshot.py +0 -0
  573. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/test_spec_and_validation.py +0 -0
  574. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/test_spec_contract_bytes.py +0 -0
  575. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/test_staged_environment.py +0 -0
  576. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/test_step_floor.py +0 -0
  577. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/test_step_metrics.py +0 -0
  578. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/test_step_timing.py +0 -0
  579. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/test_structured_outputs.py +0 -0
  580. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/test_teacher_broker.py +0 -0
  581. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/test_teacher_encoding_contract.py +0 -0
  582. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/test_terminal_artifacts.py +0 -0
  583. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/test_thinking_config.py +0 -0
  584. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/test_train_context_preflight.py +0 -0
  585. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/test_type_comment_prose.py +0 -0
  586. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/test_vast_api.py +0 -0
  587. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/test_vast_api_coverage.py +0 -0
  588. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/test_vast_offers.py +0 -0
  589. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/test_vast_provider_coverage.py +0 -0
  590. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/test_vast_runner.py +0 -0
  591. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/test_verified_revisions.py +0 -0
  592. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/test_verifiers.py +0 -0
  593. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/test_verl_checkpoint_export.py +0 -0
  594. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/test_verl_child_plugins.py +0 -0
  595. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/test_verl_silence_watchdog.py +0 -0
  596. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/test_version.py +0 -0
  597. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/test_vl_warmstart_adapter_keys.py +0 -0
  598. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/test_vram_architecture.py +0 -0
  599. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/test_wandb_link.py +0 -0
  600. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/test_wandb_naming.py +0 -0
  601. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/test_warmstart_adapter_download.py +0 -0
  602. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/test_warmstart_cross_repo.py +0 -0
  603. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/test_warmstart_error_attribution.py +0 -0
  604. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/test_warmstart_image_adapters.py +0 -0
  605. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/test_weight_cache.py +0 -0
  606. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/test_worker_dryrun.py +0 -0
  607. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/test_worker_hardexit.py +0 -0
  608. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/test_worker_image.py +0 -0
  609. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/test_worker_stack.py +0 -0
  610. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/test_worker_thinking.py +0 -0
  611. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/test_workflow_contracts.py +0 -0
  612. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/tests/test_workload_profile.py +0 -0
  613. {freesolo_flash_dev-1.2.95 → freesolo_flash_dev-1.2.97}/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.97
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
@@ -7,6 +7,7 @@ import os
7
7
  import sys
8
8
  import time
9
9
  import uuid
10
+ from typing import NamedTuple
10
11
 
11
12
  from flash import __version__
12
13
  from flash._internal.channel import BRAND_NAME, CLI_NAME
@@ -424,6 +425,8 @@ def cmd_train(args) -> int:
424
425
  )
425
426
  else:
426
427
  print(json.dumps(status, indent=2))
428
+ if spec.algorithm == "sft":
429
+ _print_published_sft_environment_note(status, spec)
427
430
  _print_unpacked_batch_warning(status, spec) # after the payload, so stdout stays parseable
428
431
  print_status_prompt_budget_warning(status)
429
432
  _print_reasoning_loss_warning(status)
@@ -599,12 +602,17 @@ def _log_follow_metric_rows(status: dict | None, seen_steps: set) -> list[str]:
599
602
  return rows
600
603
 
601
604
 
602
- def _poll_logs(client: ApiClient, run_id: str, interval: float) -> tuple[str, bool]:
603
- """Stream offset-paged logs until the run reaches a terminal state.
605
+ class _LogPollResult(NamedTuple):
606
+ state: str
607
+ printed_any: bool
608
+ live_attempt: int | None
604
609
 
605
- Returns (terminal state, whether any log bytes were printed)."""
610
+
611
+ def _poll_logs(client: ApiClient, run_id: str, interval: float) -> _LogPollResult:
612
+ """Stream logs until terminal and return the final state, output, and attempt snapshot."""
606
613
  offset = 0
607
614
  printed_any = False
615
+ attempt: int | None = None
608
616
  last_progress: str | None = None
609
617
  seen_metric_steps: set = set()
610
618
  spinner = _LogFollowSpinner(run_id)
@@ -620,6 +628,7 @@ def _poll_logs(client: ApiClient, run_id: str, interval: float) -> tuple[str, bo
620
628
  # from the run status endpoint. The log page's embedded state is only a fallback for
621
629
  # older servers or test doubles.
622
630
  status = client.get_run(run_id)
631
+ attempt = render.live_attempt(status) if isinstance(status, dict) else attempt
623
632
  state, progress = _log_follow_progress(status, str(page.get("state") or ""))
624
633
  metric_rows = _log_follow_metric_rows(status, seen_metric_steps)
625
634
  if metric_rows:
@@ -628,7 +637,7 @@ def _poll_logs(client: ApiClient, run_id: str, interval: float) -> tuple[str, bo
628
637
  print(row, file=sys.stderr, flush=True)
629
638
  if state in _CLI_DONE_STATES:
630
639
  spinner.clear()
631
- return state, printed_any
640
+ return _LogPollResult(state, printed_any, attempt)
632
641
  if not spinner.enabled and progress != last_progress:
633
642
  print(f"status: {progress}", file=sys.stderr, flush=True)
634
643
  last_progress = progress
@@ -677,12 +686,12 @@ def _print_detached_note(run_id: str) -> None:
677
686
  def _follow_run(client: ApiClient, run_id: str) -> int:
678
687
  """Poll logs until the run reaches a terminal state, then print the final status."""
679
688
  try:
680
- state, _ = _poll_logs(client, run_id, interval=2.0)
689
+ result = _poll_logs(client, run_id, interval=2.0)
681
690
  except KeyboardInterrupt:
682
691
  _print_detached_note(run_id)
683
692
  return 130
684
693
  print(_render_status(client.get_run(run_id)))
685
- return 0 if state in _OK_STATES else 1
694
+ return 0 if result.state in _OK_STATES else 1
686
695
 
687
696
 
688
697
  def _follow_status(
@@ -710,16 +719,23 @@ def cmd_log(args) -> int:
710
719
  client = client_from_config()
711
720
  if getattr(args, "follow", False):
712
721
  try:
713
- state, printed_any = _poll_logs(client, args.run_id, interval=2.0)
722
+ result = _poll_logs(client, args.run_id, interval=2.0)
714
723
  except KeyboardInterrupt:
715
724
  _print_detached_note(args.run_id)
716
725
  return 130
717
- _print_worker_output(client, args.run_id, printed_any=printed_any)
718
- return 0 if state in _OK_STATES else 1
726
+ sections = _worker_sections(client, args.run_id)
727
+ _print_worker_output(
728
+ sections,
729
+ printed_any=result.printed_any,
730
+ current_attempt=result.live_attempt,
731
+ )
732
+ return 0 if result.state in _OK_STATES else 1
719
733
  text = str(client.get_logs(args.run_id, offset=0).get("logs") or "")
720
734
  if text:
721
735
  print(text, end="" if text.endswith("\n") else "\n")
722
- _print_worker_output(client, args.run_id, printed_any=bool(text))
736
+ sections = _worker_sections(client, args.run_id)
737
+ attempt = _snapshot_live_attempt(client, args.run_id) if sections else None
738
+ _print_worker_output(sections, printed_any=bool(text), current_attempt=attempt)
723
739
  return 0
724
740
 
725
741
 
@@ -953,6 +969,7 @@ from flash.cli.commands.train_cost import ( # noqa: E402,F401
953
969
  _cmd_train_cost,
954
970
  _cmd_train_cost_offline,
955
971
  _cmd_train_cost_sft,
972
+ _print_published_sft_environment_note,
956
973
  _print_reasoning_loss_warning,
957
974
  _print_sft_cost,
958
975
  _print_train_schema_compatibility,
@@ -961,9 +978,11 @@ from flash.cli.commands.train_cost import ( # noqa: E402,F401
961
978
  _warn_if_wandb_requested_without_key,
962
979
  )
963
980
 
964
- # re-exported so `commands._print_worker_output(...)` keeps resolving for `cmd_log` and the CLI tests.
981
+ # re-exported because cmd_log and focused cli tests address these through the command package.
965
982
  from flash.cli.commands.worker_output import ( # noqa: E402,F401
966
983
  _artifact_attempt,
967
984
  _print_worker_output,
985
+ _snapshot_live_attempt,
968
986
  _worker_section_name,
987
+ _worker_sections,
969
988
  )
@@ -114,8 +114,19 @@ def _client_train_schema(authored_train_keys: frozenset[str]) -> dict:
114
114
  }
115
115
 
116
116
 
117
+ def _has_inline_records(spec) -> bool:
118
+ """Whether this config supplied its SFT rows inline rather than from the resolved package.
119
+
120
+ One predicate for every surface that attributes the counts -- the cost rows and the provenance
121
+ note sit within a few lines of each other, so disagreeing about where the data came from would
122
+ print two contradictory answers in one quote.
123
+ """
124
+ params = getattr(getattr(spec, "environment", None), "params", None)
125
+ return isinstance(params, dict) and params.get("records") is not None
126
+
127
+
117
128
  def _sft_cost_rows(spec, profile: dict) -> list[tuple[str, str | None]]:
118
- """Rows describing the packaged-dataset estimate behind an SFT quote.
129
+ """Rows describing the published packaged-dataset estimate behind an SFT quote.
119
130
 
120
131
  Only aggregates the server actually returned are shown. A field that is absent is dropped
121
132
  rather than defaulted, so the panel never reports a count the profile did not compute.
@@ -125,19 +136,34 @@ def _sft_cost_rows(spec, profile: dict) -> list[tuple[str, str | None]]:
125
136
  value = profile.get(key)
126
137
  return value if isinstance(value, int) and not isinstance(value, bool) else None
127
138
 
139
+ def text(key: str) -> str:
140
+ value = profile.get(key)
141
+ return value.strip() if isinstance(value, str) else ""
142
+
128
143
  steps = count("authoritative_steps")
144
+ source = count("source_examples")
129
145
  retained, selected = count("retained_examples"), count("selected_examples")
130
146
  dropped = count("dropped_examples")
131
147
  compute, supervised = (
132
148
  count("authoritative_compute_tokens"),
133
149
  count("authoritative_supervised_tokens"),
134
150
  )
135
- packing = str(profile.get("packing_mode") or "")
136
- architecture = str(profile.get("architecture_mode") or "")
137
- digest = str(profile.get("content_digest") or "")
151
+ packing = text("packing_mode")
152
+ architecture = text("architecture_mode")
153
+ environment_id = text("environment_id")
154
+ environment_revision = text("environment_revision")
155
+ digest = text("content_digest")
156
+ # inline `[environment.params] records` supply the rows from the request body, so the resolved
157
+ # package contributed the environment but not the dataset. labelling those counts "published
158
+ # copy" names a source they did not come from. one adjective decides all three rows, so they
159
+ # cannot describe the same quote two different ways.
160
+ inline_records = _has_inline_records(spec)
161
+ origin = "inline records" if inline_records else "published copy"
162
+ resolved = "resolved" if inline_records else "published"
138
163
  examples = None
139
164
  if retained is not None and selected is not None:
140
- examples = f"{retained:,} trained of {selected:,} selected"
165
+ examples = f"{retained:,} trained of {selected:,} selected from "
166
+ examples += f"{source:,} source rows in {origin}" if source is not None else origin
141
167
  if dropped:
142
168
  examples += f" ({dropped:,} dropped)"
143
169
  tokens = None
@@ -147,10 +173,15 @@ def _sft_cost_rows(spec, profile: dict) -> list[tuple[str, str | None]]:
147
173
  tokens += f", {supervised:,} supervised"
148
174
  return [
149
175
  ("run", f"{spec.model} [SFT{f', {steps} steps' if steps is not None else ''}]"),
176
+ ("env", f"{resolved} environment {environment_id}" if environment_id else None),
177
+ (
178
+ "revision",
179
+ f"{environment_revision[:12]} ({resolved} commit)" if environment_revision else None,
180
+ ),
150
181
  ("workload", f"{packing} ({architecture})" if packing and architecture else None),
151
182
  ("examples", examples),
152
183
  ("tokens", tokens),
153
- ("profile", digest[:12] or None),
184
+ ("digest", digest[:12] or None),
154
185
  ]
155
186
 
156
187
 
@@ -218,6 +249,71 @@ def _print_reasoning_loss_warning(status: object) -> None:
218
249
  print(render.warn(message) if render.styled() else f"warning: {message}", file=sys.stderr)
219
250
 
220
251
 
252
+ def _print_published_sft_environment_note(status: object, spec) -> None:
253
+ """Warn when SFT counts came from a published managed or GitHub environment."""
254
+ if _has_inline_records(spec):
255
+ return
256
+
257
+ profile = status.get("workload_profile") if isinstance(status, dict) else None
258
+ if not isinstance(profile, dict):
259
+ return
260
+ environment_id = profile.get("environment_id")
261
+ revision = profile.get("environment_revision")
262
+ if not isinstance(environment_id, str) or not environment_id.strip():
263
+ return
264
+ if not isinstance(revision, str) or not revision.strip():
265
+ return
266
+
267
+ environment_id = environment_id.strip()
268
+ advice = _republish_advice(environment_id)
269
+ if advice is None:
270
+ return
271
+
272
+ source = profile.get("source_examples")
273
+ source_suffix = (
274
+ f" ({source:,} source rows)"
275
+ if isinstance(source, int) and not isinstance(source, bool)
276
+ else ""
277
+ )
278
+ message = (
279
+ f"published environment: {environment_id} @ {revision.strip()[:12]}{source_suffix}. "
280
+ "SFT dataset counts come from this resolved published copy, not local files. "
281
+ f"{advice}"
282
+ )
283
+ print(render.note(message) if render.styled() else message, file=sys.stderr)
284
+
285
+
286
+ def _republish_advice(environment_id: str) -> str | None:
287
+ """Return conditional remediation for a managed or GitHub environment id."""
288
+ from flash.envs.identity import (
289
+ canonical_managed_environment_slug,
290
+ github_environment_ref_is_pinned,
291
+ is_github_environment_ref,
292
+ )
293
+
294
+ prefix = "If you expected local dataset edits to be included, "
295
+ try:
296
+ managed_slug = canonical_managed_environment_slug(environment_id)
297
+ except ValueError:
298
+ return None
299
+ if managed_slug is not None:
300
+ return (
301
+ f"{prefix}run `{_commands().CLI_NAME} env push --name NAME "
302
+ "--project PROJECT_UUID [path]` again for this managed environment."
303
+ )
304
+ if not is_github_environment_ref(environment_id):
305
+ return None
306
+ if github_environment_ref_is_pinned(environment_id):
307
+ return (
308
+ f"{prefix}publish the new commit, then update [environment] id to the full new commit "
309
+ "SHA; the existing immutable SHA cannot move."
310
+ )
311
+ return (
312
+ f"{prefix}make the named remote branch or tag point at the new commit. A tag may instead "
313
+ "need a new tag and an updated [environment] id rather than moving the existing tag."
314
+ )
315
+
316
+
221
317
  def _print_sft_cost(status: dict, spec) -> None:
222
318
  total = status.get("estimated_cost_usd") if isinstance(status, dict) else None
223
319
  if not isinstance(total, (int, float)) or isinstance(total, bool):
@@ -234,6 +330,7 @@ def _print_sft_cost(status: dict, spec) -> None:
234
330
  if value is not None:
235
331
  print(f"{key.ljust(8)}: {value}")
236
332
  print(f"{'TOTAL'.ljust(8)}: ${float(total):.2f}")
333
+ _print_published_sft_environment_note(status, spec)
237
334
  print(
238
335
  "tokens, retained rows, truncation, and optimizer steps are estimated from packaged "
239
336
  "input/output fields plus contract_text, contract_path, or TRAINING_CONTRACT.md. other "
@@ -17,8 +17,11 @@ import re
17
17
  from typing import TYPE_CHECKING
18
18
 
19
19
  from flash.cli.ui import render
20
+ from flash.client import ClientError
20
21
 
21
22
  if TYPE_CHECKING:
23
+ from collections.abc import Mapping
24
+
22
25
  from flash.client import ApiClient
23
26
 
24
27
 
@@ -42,18 +45,24 @@ def _worker_section_name(name: str, current_attempt: int | None) -> str:
42
45
  return f"{name} (attempt={attempt}, current attempt)"
43
46
 
44
47
 
45
- def _print_worker_output(client: ApiClient, run_id: str, *, printed_any: bool = False) -> bool:
46
- worker_output = client.get_worker_output(run_id) or {}
47
- if not worker_output:
48
- return printed_any
48
+ def _worker_sections(client: ApiClient, run_id: str) -> dict[str, str]:
49
+ """Fetch only worker artifacts with printable text."""
50
+ return {name: text for name, text in (client.get_worker_output(run_id) or {}).items() if text}
51
+
52
+
53
+ def _snapshot_live_attempt(client: ApiClient, run_id: str) -> int | None:
54
+ """Read the live attempt without letting a heading lookup hide diagnostic artifacts."""
49
55
  try:
50
- current_attempt = render.live_attempt(client.get_run(run_id) or {})
51
- except Exception:
52
- # artifact text is best-effort diagnostic output; a status refresh failure must not hide it.
53
- current_attempt = None
54
- for name, text in worker_output.items():
55
- if not text:
56
- continue
56
+ return render.live_attempt(client.get_run(run_id) or {})
57
+ except ClientError:
58
+ return None
59
+
60
+
61
+ def _print_worker_output(
62
+ sections: Mapping[str, str], *, printed_any: bool = False, current_attempt: int | None = None
63
+ ) -> bool:
64
+ """Print worker artifacts under headings naming the attempt that produced them."""
65
+ for name, text in sections.items():
57
66
  # label provenance from the filename rather than letting the final section, which is merely
58
67
  # the last one appended, read as the live attempt's output.
59
68
  section_name = _worker_section_name(name, current_attempt)
@@ -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
@@ -255,3 +255,13 @@ def _is_safe_github_path_parts(parts: list[str] | tuple[str, ...]) -> bool:
255
255
  def is_commit_sha(value: str) -> bool:
256
256
  """True when value is a full 40-hex-char git commit id (an immutable ref)."""
257
257
  return _COMMIT_SHA_RE.fullmatch(value) is not None
258
+
259
+
260
+ def github_environment_ref_is_pinned(value: str) -> bool:
261
+ """True when a ``github:`` environment id names an immutable commit.
262
+
263
+ Only the SHA case is decidable from the id. Branches and tags share one string shape, so callers
264
+ must give symbolic-ref advice that is valid for either rather than assuming the ref is movable.
265
+ """
266
+ parsed = _parse_github_environment_ref(value)
267
+ return parsed is not None and is_commit_sha(parsed.ref)
@@ -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.97"
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.97"
141
141
 
142
142
  [tool.pytest.ini_options]
143
143
  pythonpath = ["."]