freesolo-flash-dev 1.2.22__tar.gz → 1.2.28__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 (537) hide show
  1. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/PKG-INFO +1 -1
  2. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/cli/ui/heartbeat.py +61 -0
  3. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/engine/worker/io/heartbeat.py +13 -6
  4. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/engine/worker/opd_train_runner.py +8 -87
  5. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/engine/worker/rl_train.py +6 -2
  6. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/engine/worker/rl_train_runner.py +25 -10
  7. freesolo_flash_dev-1.2.28/flash/engine/worker/train/core/step_timing.py +62 -0
  8. freesolo_flash_dev-1.2.28/flash/engine/worker/train/opd/state.py +92 -0
  9. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/providers/runpod/job_execution.py +15 -1
  10. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/pyproject.toml +2 -2
  11. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_jobs.py +148 -2
  12. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_rl_train.py +3 -2
  13. freesolo_flash_dev-1.2.28/tests/test_step_timing.py +389 -0
  14. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/uv.lock +1 -1
  15. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/.dockerignore +0 -0
  16. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/.env.example +0 -0
  17. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/.github/CODEOWNERS +0 -0
  18. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  19. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  20. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
  21. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  22. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/.github/dependabot.yml +0 -0
  23. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/.github/workflows/auto-rebake.yml +0 -0
  24. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/.github/workflows/bake-kernel-cache.yml +0 -0
  25. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/.github/workflows/ci.yml +0 -0
  26. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/.github/workflows/main-source-guard.yml +0 -0
  27. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/.github/workflows/notify-tests-repo.yml +0 -0
  28. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/.github/workflows/publish-dev.yml +0 -0
  29. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/.github/workflows/publish-image.yml +0 -0
  30. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/.github/workflows/publish.yml +0 -0
  31. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/.github/workflows/version-parity.yml +0 -0
  32. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/.github/workflows/worker-image.yml +0 -0
  33. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/.gitignore +0 -0
  34. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/CHANGELOG.md +0 -0
  35. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/CODE_OF_CONDUCT.md +0 -0
  36. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/CONTRIBUTING.md +0 -0
  37. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/Dockerfile +0 -0
  38. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/Dockerfile.worker +0 -0
  39. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/LICENSE +0 -0
  40. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/NOTICE +0 -0
  41. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/README.md +0 -0
  42. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/SECURITY.md +0 -0
  43. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/SELF_HOSTING.md +0 -0
  44. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/build/kernel_cache/.gitignore +0 -0
  45. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/build/kernel_cache/.keep +0 -0
  46. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/deploy/infisical/README.md +0 -0
  47. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/deploy/infisical/entrypoint.sh +0 -0
  48. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/docker/Dockerfile.kernelcache +0 -0
  49. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/docker/Dockerfile.kernelcache.relayer +0 -0
  50. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/docker/bake_kernel_cache.py +0 -0
  51. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/docker/bake_pod_entry.py +0 -0
  52. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/docker/extract_cudart_fix.py +0 -0
  53. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/docker/kernel_fingerprint.py +0 -0
  54. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/docker/make_rp_handler.py +0 -0
  55. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/__init__.py +0 -0
  56. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/_internal/__init__.py +0 -0
  57. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/_internal/channel.py +0 -0
  58. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/_internal/diagnostics.py +0 -0
  59. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/_internal/fileio.py +0 -0
  60. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/_internal/logging.py +0 -0
  61. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/_internal/paths.py +0 -0
  62. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/adapters/__init__.py +0 -0
  63. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/adapters/artifacts.py +0 -0
  64. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/adapters/lora_rank.py +0 -0
  65. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/cli/__init__.py +0 -0
  66. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/cli/__main__.py +0 -0
  67. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/cli/commands/__init__.py +0 -0
  68. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/cli/commands/deploy.py +0 -0
  69. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/cli/commands/env/__init__.py +0 -0
  70. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/cli/commands/env/episode.py +0 -0
  71. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/cli/commands/env/eval.py +0 -0
  72. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/cli/commands/env/eval_args.py +0 -0
  73. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/cli/commands/env/imports.py +0 -0
  74. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/cli/commands/env/list.py +0 -0
  75. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/cli/commands/env/push.py +0 -0
  76. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/cli/commands/env/retained.py +0 -0
  77. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/cli/commands/env/setup.py +0 -0
  78. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/cli/commands/env/test.py +0 -0
  79. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/cli/commands/env/test_evaluations.py +0 -0
  80. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/cli/commands/env/test_params.py +0 -0
  81. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/cli/commands/env/test_warnings.py +0 -0
  82. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/cli/commands/traces.py +0 -0
  83. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/cli/commands/train_cost.py +0 -0
  84. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/cli/scaffold/TRAINING.md +0 -0
  85. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/cli/scaffold/__init__.py +0 -0
  86. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/cli/ui/__init__.py +0 -0
  87. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/cli/ui/cost.py +0 -0
  88. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/cli/ui/env_panels.py +0 -0
  89. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/cli/ui/render.py +0 -0
  90. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/cli/ui/tables.py +0 -0
  91. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/cli/ui/tty.py +0 -0
  92. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/client/__init__.py +0 -0
  93. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/client/config.py +0 -0
  94. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/client/freesolo_api.py +0 -0
  95. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/client/http.py +0 -0
  96. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/client/runtime_secrets.py +0 -0
  97. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/client/shapes.py +0 -0
  98. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/client/specs.py +0 -0
  99. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/client/streaming.py +0 -0
  100. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/content/__init__.py +0 -0
  101. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/content/multimodal.py +0 -0
  102. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/content/structured_outputs.py +0 -0
  103. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/content/thinking.py +0 -0
  104. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/core/__init__.py +0 -0
  105. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/core/catalog.py +0 -0
  106. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/core/spec.py +0 -0
  107. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/cost/__init__.py +0 -0
  108. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/cost/analytical.py +0 -0
  109. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/cost/facts.py +0 -0
  110. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/cost/spec.py +0 -0
  111. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/cost/types.py +0 -0
  112. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/engine/__init__.py +0 -0
  113. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/engine/plan/__init__.py +0 -0
  114. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/engine/plan/kv_sizing.py +0 -0
  115. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/engine/plan/model_config_probe.py +0 -0
  116. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/engine/plan/recipe.py +0 -0
  117. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/engine/plan/steps.py +0 -0
  118. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/engine/plan/vram.py +0 -0
  119. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/engine/profiling/__init__.py +0 -0
  120. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/engine/profiling/dataset_profile.py +0 -0
  121. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/engine/profiling/reasoning_render.py +0 -0
  122. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/engine/profiling/sft_workload.py +0 -0
  123. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/engine/profiling/tokenizer.py +0 -0
  124. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/engine/profiling/workload_profile.py +0 -0
  125. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/engine/result/__init__.py +0 -0
  126. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/engine/result/accounting.py +0 -0
  127. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/engine/result/rollout_samples.py +0 -0
  128. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/engine/worker/__init__.py +0 -0
  129. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/engine/worker/__main__.py +0 -0
  130. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/engine/worker/backend_common.py +0 -0
  131. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/engine/worker/entry/__init__.py +0 -0
  132. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/engine/worker/entry/opd.py +0 -0
  133. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/engine/worker/entry/rl.py +0 -0
  134. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/engine/worker/entry/sft.py +0 -0
  135. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/engine/worker/io/__init__.py +0 -0
  136. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/engine/worker/io/hf.py +0 -0
  137. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/engine/worker/io/prefetch.py +0 -0
  138. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/engine/worker/io/wandb_log.py +0 -0
  139. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/engine/worker/model/__init__.py +0 -0
  140. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/engine/worker/model/adapter.py +0 -0
  141. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/engine/worker/model/decoding.py +0 -0
  142. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/engine/worker/model/lora.py +0 -0
  143. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/engine/worker/model/packing.py +0 -0
  144. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/engine/worker/opd_train.py +0 -0
  145. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/engine/worker/perf/__init__.py +0 -0
  146. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/engine/worker/perf/diagnostics.py +0 -0
  147. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/engine/worker/perf/lifecycle.py +0 -0
  148. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/engine/worker/perf/liger.py +0 -0
  149. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/engine/worker/perf/memory.py +0 -0
  150. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/engine/worker/runtime/__init__.py +0 -0
  151. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/engine/worker/runtime/kernel_warmup.py +0 -0
  152. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/engine/worker/runtime/pkg_proxy.py +0 -0
  153. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/engine/worker/runtime/rng.py +0 -0
  154. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/engine/worker/score_batcher.py +0 -0
  155. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/engine/worker/sft_train.py +0 -0
  156. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/engine/worker/sft_train_runner.py +0 -0
  157. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/engine/worker/teacher/__init__.py +0 -0
  158. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/engine/worker/teacher/client.py +0 -0
  159. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/engine/worker/teacher/encoding.py +0 -0
  160. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/engine/worker/teacher/tokenizer_align.py +0 -0
  161. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/engine/worker/train/__init__.py +0 -0
  162. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/engine/worker/train/core/__init__.py +0 -0
  163. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/engine/worker/train/core/child/__init__.py +0 -0
  164. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/engine/worker/train/core/child/glue.py +0 -0
  165. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/engine/worker/train/finalize.py +0 -0
  166. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/engine/worker/train/opd/__init__.py +0 -0
  167. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/engine/worker/train/opd/batching.py +0 -0
  168. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/engine/worker/train/opd/bridge.py +0 -0
  169. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/engine/worker/train/opd/child/__init__.py +0 -0
  170. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/engine/worker/train/opd/child/bridge.py +0 -0
  171. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/engine/worker/train/opd/child/multiturn.py +0 -0
  172. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/engine/worker/train/opd/child/plugin.py +0 -0
  173. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/engine/worker/train/opd/child/structured.py +0 -0
  174. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/engine/worker/train/opd/failures.py +0 -0
  175. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/engine/worker/train/opd/gkd.py +0 -0
  176. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/engine/worker/train/opd/multiturn_validation.py +0 -0
  177. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/engine/worker/train/opd/overrides.py +0 -0
  178. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/engine/worker/train/opd/prompts.py +0 -0
  179. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/engine/worker/train/opd/reporting.py +0 -0
  180. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/engine/worker/train/opd/scoring.py +0 -0
  181. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/engine/worker/train/opd/validation.py +0 -0
  182. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/engine/worker/train/rl/__init__.py +0 -0
  183. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/engine/worker/train/rl/checkpoints.py +0 -0
  184. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/engine/worker/train/rl/child/__init__.py +0 -0
  185. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/engine/worker/train/rl/child/multiturn.py +0 -0
  186. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/engine/worker/train/rl/child/plugin.py +0 -0
  187. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/engine/worker/train/rl/config.py +0 -0
  188. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/engine/worker/train/rl/inputs.py +0 -0
  189. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/engine/worker/train/rl/multi_turn.py +0 -0
  190. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/engine/worker/train/rl/scoring.py +0 -0
  191. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/engine/worker/train/rl/shims.py +0 -0
  192. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/engine/worker/train/rl/single_turn.py +0 -0
  193. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/engine/worker/train/rl/verl_config.py +0 -0
  194. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/engine/worker/train/sft/__init__.py +0 -0
  195. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/engine/worker/train/sft/checkpoints.py +0 -0
  196. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/engine/worker/train/sft/config.py +0 -0
  197. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/engine/worker/verl/__init__.py +0 -0
  198. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/engine/worker/verl/capabilities.py +0 -0
  199. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/engine/worker/verl/checkpoints.py +0 -0
  200. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/engine/worker/verl/child_io.py +0 -0
  201. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/engine/worker/verl/diagnostics.py +0 -0
  202. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/engine/worker/verl/parallelism.py +0 -0
  203. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/engine/worker_entrypoint.py +0 -0
  204. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/envs/__init__.py +0 -0
  205. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/envs/adapter.py +0 -0
  206. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/envs/base.py +0 -0
  207. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/envs/cache_security.py +0 -0
  208. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/envs/dataset_selection.py +0 -0
  209. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/envs/evaluations.py +0 -0
  210. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/envs/identity.py +0 -0
  211. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/envs/loader.py +0 -0
  212. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/envs/namespace_listing.py +0 -0
  213. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/envs/package/__init__.py +0 -0
  214. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/envs/package/limits.py +0 -0
  215. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/envs/package/unpack.py +0 -0
  216. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/envs/pull.py +0 -0
  217. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/providers/__init__.py +0 -0
  218. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/providers/_lifecycle/__init__.py +0 -0
  219. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/providers/_lifecycle/auth.py +0 -0
  220. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/providers/_lifecycle/bootstrap.py +0 -0
  221. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/providers/_lifecycle/bootstrap_pip.py +0 -0
  222. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/providers/_lifecycle/bootstrap_secrets.py +0 -0
  223. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/providers/_lifecycle/deadline.py +0 -0
  224. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/providers/_lifecycle/http.py +0 -0
  225. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/providers/_lifecycle/instance.py +0 -0
  226. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/providers/_lifecycle/poll.py +0 -0
  227. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/providers/_lifecycle/poll_instance.py +0 -0
  228. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/providers/_lifecycle/provider.py +0 -0
  229. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/providers/_lifecycle/worker.py +0 -0
  230. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/providers/allocator.py +0 -0
  231. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/providers/artifacts/__init__.py +0 -0
  232. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/providers/artifacts/hf.py +0 -0
  233. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/providers/artifacts/preload_runpod.py +0 -0
  234. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/providers/artifacts/weight_cache.py +0 -0
  235. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/providers/base.py +0 -0
  236. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/providers/fit_errors.py +0 -0
  237. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/providers/lambda_/__init__.py +0 -0
  238. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/providers/lambda_/api.py +0 -0
  239. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/providers/lambda_/auth.py +0 -0
  240. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/providers/lambda_/gpus.py +0 -0
  241. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/providers/lambda_/jobs/__init__.py +0 -0
  242. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/providers/lambda_/jobs/builders.py +0 -0
  243. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/providers/lambda_/jobs/reap.py +0 -0
  244. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/providers/lambda_/preflight.py +0 -0
  245. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/providers/lambda_/pricing.py +0 -0
  246. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/providers/preflight.py +0 -0
  247. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/providers/realized.py +0 -0
  248. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/providers/runpod/__init__.py +0 -0
  249. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/providers/runpod/api.py +0 -0
  250. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/providers/runpod/auth.py +0 -0
  251. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/providers/runpod/cost.py +0 -0
  252. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/providers/runpod/gpus.py +0 -0
  253. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/providers/runpod/jobs.py +0 -0
  254. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/providers/runpod/preflight.py +0 -0
  255. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/providers/runpod/pricing.py +0 -0
  256. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/providers/runpod/resources.py +0 -0
  257. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/providers/runpod/serverless/__init__.py +0 -0
  258. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/providers/runpod/serverless/endpoints.py +0 -0
  259. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/providers/sharding.py +0 -0
  260. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/providers/vast/__init__.py +0 -0
  261. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/providers/vast/api.py +0 -0
  262. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/providers/vast/auth.py +0 -0
  263. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/providers/vast/jobs/__init__.py +0 -0
  264. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/providers/vast/jobs/builders.py +0 -0
  265. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/providers/vast/preflight.py +0 -0
  266. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/providers/vast/pricing.py +0 -0
  267. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/py.typed +0 -0
  268. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/runner/__init__.py +0 -0
  269. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/runner/artifacts.py +0 -0
  270. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/runner/attempts.py +0 -0
  271. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/runner/costs.py +0 -0
  272. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/runner/deadlines.py +0 -0
  273. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/runner/preparation.py +0 -0
  274. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/runner/reconciliation.py +0 -0
  275. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/runner/results/__init__.py +0 -0
  276. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/runner/results/checkpoints.py +0 -0
  277. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/runner/results/verified_revisions.py +0 -0
  278. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/runner/status.py +0 -0
  279. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/runner/submit.py +0 -0
  280. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/runner/supervise/__init__.py +0 -0
  281. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/runner/supervise/attach.py +0 -0
  282. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/runner/supervise/deploy.py +0 -0
  283. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/runner/supervise/lifecycle.py +0 -0
  284. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/runner/supervise/recovery.py +0 -0
  285. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/runner/supervise/retry_decision.py +0 -0
  286. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/runner/supervise/seed_submission.py +0 -0
  287. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/runner/supervise/transitions.py +0 -0
  288. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/runner/weight_cache.py +0 -0
  289. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/schema/__init__.py +0 -0
  290. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/schema/fields.py +0 -0
  291. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/serve/__init__.py +0 -0
  292. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/serve/adapter_check.py +0 -0
  293. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/serve/deploy.py +0 -0
  294. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/serve/errors.py +0 -0
  295. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/serve/export.py +0 -0
  296. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/serve/preflight.py +0 -0
  297. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/serve/responses.py +0 -0
  298. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/serve/streaming.py +0 -0
  299. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/serve/thinking.py +0 -0
  300. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/serve/urls.py +0 -0
  301. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/server/__init__.py +0 -0
  302. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/server/__main__.py +0 -0
  303. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/server/app.py +0 -0
  304. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/server/billing/__init__.py +0 -0
  305. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/server/billing/charges.py +0 -0
  306. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/server/billing/retry.py +0 -0
  307. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/server/domain/__init__.py +0 -0
  308. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/server/domain/checkpoints.py +0 -0
  309. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/server/domain/environment_registry.py +0 -0
  310. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/server/domain/envs.py +0 -0
  311. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/server/domain/projects.py +0 -0
  312. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/server/domain/reconcile.py +0 -0
  313. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/server/domain/repo_cleanup.py +0 -0
  314. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/server/domain/run_registry.py +0 -0
  315. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/server/domain/teacher_broker.py +0 -0
  316. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/server/domain/teacher_errors.py +0 -0
  317. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/server/domain/teacher_requests.py +0 -0
  318. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/server/platform/__init__.py +0 -0
  319. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/server/platform/auth.py +0 -0
  320. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/server/platform/db.py +0 -0
  321. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/server/platform/deps.py +0 -0
  322. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/server/platform/internal_client.py +0 -0
  323. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/server/platform/locks.py +0 -0
  324. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/server/platform/runtime.py +0 -0
  325. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/server/routes/__init__.py +0 -0
  326. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/server/routes/envs.py +0 -0
  327. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/server/routes/meta.py +0 -0
  328. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/server/routes/runs.py +0 -0
  329. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/server/routes/serving.py +0 -0
  330. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/server/routes/serving_completion.py +0 -0
  331. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/server/routes/serving_revisions.py +0 -0
  332. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/server/routes/serving_smoke.py +0 -0
  333. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/server/routes/teacher.py +0 -0
  334. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/teacher/__init__.py +0 -0
  335. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/teacher/limits.py +0 -0
  336. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/flash/teacher/retry_contract.py +0 -0
  337. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/scripts/build_dev_dist.py +0 -0
  338. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/scripts/check_file_size.py +0 -0
  339. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/scripts/check_function_size.py +0 -0
  340. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/scripts/check_verl_pin_exists.py +0 -0
  341. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/scripts/scrub_history.sh +0 -0
  342. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/__init__.py +0 -0
  343. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/_helpers/__init__.py +0 -0
  344. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/_helpers/profile.py +0 -0
  345. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/_helpers/runner.py +0 -0
  346. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/_helpers/specs.py +0 -0
  347. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/_helpers/teacher.py +0 -0
  348. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/_helpers/vast.py +0 -0
  349. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/conftest.py +0 -0
  350. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/fixtures/math_eval.jsonl +0 -0
  351. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/fixtures/math_train.jsonl +0 -0
  352. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/live/__init__.py +0 -0
  353. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/live/conftest.py +0 -0
  354. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/live/test_lambda_live.py +0 -0
  355. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/live/test_runpod_live.py +0 -0
  356. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/live/test_sft_thinking_render_live.py +0 -0
  357. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/live/test_vast_live.py +0 -0
  358. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_accounting_coverage.py +0 -0
  359. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_adapter_shard_completeness.py +0 -0
  360. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_agent_flash_cli_contract.py +0 -0
  361. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_algorithms.py +0 -0
  362. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_allocator.py +0 -0
  363. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_backend_common.py +0 -0
  364. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_backend_jobspec_contract.py +0 -0
  365. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_bake_kernel_cache.py +0 -0
  366. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_base_model_provenance.py +0 -0
  367. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_billing_retry.py +0 -0
  368. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_build_context_contract.py +0 -0
  369. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_cancel_remote.py +0 -0
  370. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_catalog_consistency.py +0 -0
  371. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_catalog_only_models.py +0 -0
  372. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_charge_pricing.py +0 -0
  373. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_checkpoints.py +0 -0
  374. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_cli_commands.py +0 -0
  375. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_cli_commands_coverage.py +0 -0
  376. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_cli_credential_shadowing.py +0 -0
  377. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_cli_errors.py +0 -0
  378. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_cli_estimate.py +0 -0
  379. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_cli_gpus_flag.py +0 -0
  380. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_cli_help.py +0 -0
  381. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_cli_main_coverage.py +0 -0
  382. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_cli_managed.py +0 -0
  383. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_cli_render_coverage.py +0 -0
  384. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_cli_render_theme.py +0 -0
  385. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_cli_traces.py +0 -0
  386. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_cli_wandb_warning.py +0 -0
  387. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_client.py +0 -0
  388. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_client_import_purity.py +0 -0
  389. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_client_server_integration.py +0 -0
  390. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_client_stream_reads.py +0 -0
  391. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_config_env_vars.py +0 -0
  392. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_config_overrides.py +0 -0
  393. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_controlled_experiment_repairs.py +0 -0
  394. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_cost_analytical.py +0 -0
  395. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_cost_equation.py +0 -0
  396. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_cost_estimate.py +0 -0
  397. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_cost_hardware.py +0 -0
  398. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_cost_models.py +0 -0
  399. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_dataset_profile.py +0 -0
  400. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_deploy_latency.py +0 -0
  401. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_dev_channel.py +0 -0
  402. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_disk_gb.py +0 -0
  403. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_endpoint_name.py +0 -0
  404. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_env_cache_evict.py +0 -0
  405. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_env_delete.py +0 -0
  406. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_env_download.py +0 -0
  407. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_env_download_api.py +0 -0
  408. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_env_evaluations.py +0 -0
  409. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_env_list_api.py +0 -0
  410. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_env_list_cli.py +0 -0
  411. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_env_list_hub.py +0 -0
  412. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_env_no_install.py +0 -0
  413. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_env_publish.py +0 -0
  414. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_env_pull.py +0 -0
  415. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_env_pull_coverage.py +0 -0
  416. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_env_pull_loader_coverage.py +0 -0
  417. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_env_pull_managed_control_plane.py +0 -0
  418. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_env_push.py +0 -0
  419. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_env_rate_limit_resolve.py +0 -0
  420. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_env_ref_pinning.py +0 -0
  421. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_env_test.py +0 -0
  422. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_envs_coverage.py +0 -0
  423. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_export.py +0 -0
  424. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_flash_mvp.py +0 -0
  425. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_flash_worker.py +0 -0
  426. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_flashinfer_cache_dirs.py +0 -0
  427. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_freesolo_api_transport.py +0 -0
  428. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_github_urlopen_retry.py +0 -0
  429. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_gpu_type_single_field.py +0 -0
  430. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_gpus.py +0 -0
  431. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_grpo_params.py +0 -0
  432. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_grpo_resident_sizing.py +0 -0
  433. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_grpo_reward_batching.py +0 -0
  434. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_health_liveness.py +0 -0
  435. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_hf_retry.py +0 -0
  436. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_idle_endpoint_reaper.py +0 -0
  437. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_infisical_secrets.py +0 -0
  438. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_instance_bootstrap_coverage.py +0 -0
  439. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_internal_client.py +0 -0
  440. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_kernel_cache.py +0 -0
  441. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_kernel_fingerprint.py +0 -0
  442. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_kv_util.py +0 -0
  443. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_lambda_api_coverage.py +0 -0
  444. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_lambda_runner.py +0 -0
  445. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_logging.py +0 -0
  446. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_login_perms.py +0 -0
  447. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_lora_rank_coverage.py +0 -0
  448. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_lora_rank_preflight.py +0 -0
  449. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_managed_config_fields.py +0 -0
  450. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_managed_hf_repo.py +0 -0
  451. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_metrics_schema_agent_contract.py +0 -0
  452. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_mig_guard.py +0 -0
  453. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_multi_gpu_gate.py +0 -0
  454. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_multimodal_training.py +0 -0
  455. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_named_reward_metrics.py +0 -0
  456. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_oom_escalate_gpu.py +0 -0
  457. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_opd.py +0 -0
  458. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_opd_limits.py +0 -0
  459. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_opd_multiturn_eos_boundary.py +0 -0
  460. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_opd_resume_safety.py +0 -0
  461. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_opd_train.py +0 -0
  462. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_orchestrator_flash.py +0 -0
  463. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_packing.py +0 -0
  464. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_packing_coverage.py +0 -0
  465. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_parasail_teacher.py +0 -0
  466. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_poll_helpers.py +0 -0
  467. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_preflight.py +0 -0
  468. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_projects.py +0 -0
  469. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_provider_preflight_coverage.py +0 -0
  470. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_provider_routing.py +0 -0
  471. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_provider_teardown_robustness.py +0 -0
  472. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_providers_symmetry.py +0 -0
  473. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_realized_cost.py +0 -0
  474. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_repo_cleanup.py +0 -0
  475. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_resolve_params_b.py +0 -0
  476. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_resume_on_retry.py +0 -0
  477. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_rollout_samples.py +0 -0
  478. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_runmgmt.py +0 -0
  479. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_runpod_api_delete.py +0 -0
  480. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_runpod_key_fingerprint.py +0 -0
  481. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_runpod_key_waterfall.py +0 -0
  482. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_serve.py +0 -0
  483. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_serve_reasoning_content.py +0 -0
  484. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_server_api.py +0 -0
  485. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_server_app_coverage.py +0 -0
  486. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_server_auth_singleflight.py +0 -0
  487. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_server_billing.py +0 -0
  488. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_server_checkpoints_coverage.py +0 -0
  489. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_server_db.py +0 -0
  490. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_server_envs_coverage.py +0 -0
  491. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_server_locks_coverage.py +0 -0
  492. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_server_standalone.py +0 -0
  493. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_serving_context_preflight.py +0 -0
  494. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_serving_contract.py +0 -0
  495. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_serving_schema_coverage.py +0 -0
  496. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_sft_chunked_nll.py +0 -0
  497. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_sft_example_selection.py +0 -0
  498. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_sft_gc_off.py +0 -0
  499. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_sft_max_context.py +0 -0
  500. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_sft_startup_block.py +0 -0
  501. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_sft_train.py +0 -0
  502. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_sft_workload.py +0 -0
  503. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_spec_and_validation.py +0 -0
  504. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_step_floor.py +0 -0
  505. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_step_metrics.py +0 -0
  506. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_structured_outputs.py +0 -0
  507. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_teacher_broker.py +0 -0
  508. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_teacher_encoding_contract.py +0 -0
  509. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_thinking_config.py +0 -0
  510. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_train_context_preflight.py +0 -0
  511. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_training_controls.py +0 -0
  512. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_type_comment_prose.py +0 -0
  513. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_vast_api.py +0 -0
  514. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_vast_api_coverage.py +0 -0
  515. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_vast_offers.py +0 -0
  516. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_vast_provider_coverage.py +0 -0
  517. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_vast_runner.py +0 -0
  518. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_verified_revisions.py +0 -0
  519. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_verifiers.py +0 -0
  520. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_version.py +0 -0
  521. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_vl_warmstart_adapter_keys.py +0 -0
  522. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_vram_architecture.py +0 -0
  523. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_wandb_link.py +0 -0
  524. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_wandb_naming.py +0 -0
  525. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_warmstart_adapter_download.py +0 -0
  526. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_warmstart_cross_repo.py +0 -0
  527. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_warmstart_error_attribution.py +0 -0
  528. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_weight_cache.py +0 -0
  529. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_worker_dryrun.py +0 -0
  530. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_worker_hardexit.py +0 -0
  531. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_worker_image.py +0 -0
  532. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_worker_init_heartbeat.py +0 -0
  533. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_worker_stack.py +0 -0
  534. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_worker_thinking.py +0 -0
  535. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_workflow_contracts.py +0 -0
  536. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/tests/test_workload_profile.py +0 -0
  537. {freesolo_flash_dev-1.2.22 → freesolo_flash_dev-1.2.28}/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.22
3
+ Version: 1.2.28
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
@@ -332,6 +332,60 @@ def _superseded_hint(
332
332
  )
333
333
 
334
334
 
335
+ def _finite_positive(value: object) -> float | None:
336
+ """return a finite positive number from an untrusted heartbeat field."""
337
+ if isinstance(value, bool) or not isinstance(value, (int, float)):
338
+ return None
339
+ try:
340
+ number = float(value)
341
+ except OverflowError:
342
+ return None
343
+ return number if number > 0 and math.isfinite(number) else None
344
+
345
+
346
+ def _humanize_duration(seconds: float) -> str:
347
+ if seconds < 90:
348
+ return f"{seconds:.0f}s"
349
+ if seconds < 5400:
350
+ return f"{seconds / 60:.0f}m"
351
+ return f"{seconds / 3600:.1f}h"
352
+
353
+
354
+ def _humanize_step_duration(seconds: float) -> str:
355
+ if seconds < 10:
356
+ return f"{seconds:.1f}s"
357
+ if seconds < 600:
358
+ return f"{seconds:.0f}s"
359
+ return f"{seconds / 60:.1f}m"
360
+
361
+
362
+ def _step_timing_pairs(
363
+ heartbeat: dict,
364
+ *,
365
+ running: bool,
366
+ current_attempt: bool,
367
+ ) -> list[tuple[str, str]]:
368
+ """render measured RL pace only for the live running attempt."""
369
+ if not running or not current_attempt or heartbeat.get("stage") != "rl_step":
370
+ return []
371
+ step_duration_s = _finite_positive(heartbeat.get("step_duration_s"))
372
+ if step_duration_s is None:
373
+ return []
374
+
375
+ projected_remaining_s = _finite_positive(heartbeat.get("projected_remaining_s"))
376
+ pairs = [("median pace", f"{_humanize_step_duration(step_duration_s)}/step")]
377
+ if projected_remaining_s is not None:
378
+ pairs.append(("mean ETA", f"~{_humanize_duration(projected_remaining_s)} left"))
379
+ if heartbeat.get("wall_deadline_at_risk") is True and projected_remaining_s is not None:
380
+ pairs.append(
381
+ (
382
+ "warning",
383
+ "mean-based remaining-time projection exceeds the run's wall time left",
384
+ )
385
+ )
386
+ return pairs
387
+
388
+
335
389
  def _heartbeat_pairs(obj: dict) -> list[tuple[str, str]]:
336
390
  """Worker heartbeat rows for the status panel: stage, step, age, and a quiet-is-normal hint."""
337
391
  hb = obj.get("last_heartbeat")
@@ -363,6 +417,13 @@ def _heartbeat_pairs(obj: dict) -> list[tuple[str, str]]:
363
417
  if datacenter:
364
418
  label = "datacenter" if from_current_attempt else "datacenter (previous attempt)"
365
419
  pairs.append((label, str(datacenter)[:64]))
420
+ pairs.extend(
421
+ _step_timing_pairs(
422
+ hb,
423
+ running=running,
424
+ current_attempt=from_current_attempt,
425
+ )
426
+ )
366
427
  stale_step = _stale_step_hint(
367
428
  hb,
368
429
  heartbeat_age_seconds,
@@ -139,7 +139,13 @@ def _console_heartbeat_snapshot(payload: dict, payload_committed: bool = True) -
139
139
 
140
140
 
141
141
  def heartbeat(
142
- stage: str, *, liveness: bool = False, force: bool = False, initial: bool = False, **kw
142
+ stage: str,
143
+ *,
144
+ liveness: bool = False,
145
+ force: bool = False,
146
+ initial: bool = False,
147
+ first_timing: bool = False,
148
+ **kw,
143
149
  ):
144
150
  global _HB_CLAIM_SEQ
145
151
  genuine_progress = not liveness
@@ -204,18 +210,19 @@ def heartbeat(
204
210
  # requires a step advance, but a sample-bearing payload may match the committed step because
205
211
  # the liveness daemon can commit that step first without the samples. the per-force floor still
206
212
  # coalesces fast bursts to protect the hf commit cap, while an unrelated liveness commit does
207
- # not arm the floor and therefore cannot suppress the first sample-bearing payload.
213
+ # not arm the floor and therefore cannot suppress the first sample-bearing payload. the first
214
+ # timing payload gets one dedicated floor bypass because the forced metrics-only payload just
215
+ # before it armed that clock; its caller retries this flag until the timing upload succeeds.
208
216
  if force and not upload_due:
209
217
  fstep = kw.get("step")
210
218
  has_samples = bool(kw.get("sampled_completions"))
219
+ first_timing_due = first_timing and "step_duration_s" in kw
211
220
  force_step_due = isinstance(fstep, (int, float)) and (
212
221
  fstep > _w._HB_LAST_COMMITTED_STEP
213
222
  or (has_samples and fstep == _w._HB_LAST_COMMITTED_STEP)
214
223
  )
215
- if (
216
- force_step_due
217
- and (now - _w._HB_LAST_FORCED_UPLOAD) >= _w._HB_FORCE_MIN_INTERVAL_S
218
- ):
224
+ force_floor_due = (now - _w._HB_LAST_FORCED_UPLOAD) >= _w._HB_FORCE_MIN_INTERVAL_S
225
+ if force_step_due and (first_timing_due or force_floor_due):
219
226
  upload_due = True
220
227
  # the initial training snapshot must land before the shared throttle can hide it.
221
228
  if initial:
@@ -10,7 +10,6 @@ import os
10
10
  import random
11
11
  import shutil
12
12
  import time
13
- from dataclasses import dataclass
14
13
  from pathlib import Path
15
14
  from typing import Any
16
15
 
@@ -19,6 +18,14 @@ from flash.engine.worker import opd_train as _opd_train
19
18
  from flash.engine.worker.train.opd.reporting import (
20
19
  _build_train_note_sections as _build_train_note_sections,
21
20
  )
21
+ from flash.engine.worker.train.opd.state import (
22
+ _ChildCallbacks,
23
+ _ChildResult,
24
+ _OpdRequest,
25
+ _PromptState,
26
+ _RuntimeState,
27
+ _WorkloadState,
28
+ )
22
29
  from flash.engine.worker.verl.child_io import (
23
30
  LORA_ROLLOUT_GUARD_SHIM,
24
31
  render_lora_rollout_guard_fragment,
@@ -29,92 +36,6 @@ from flash.engine.worker.verl.parallelism import (
29
36
  )
30
37
 
31
38
 
32
- @dataclass(frozen=True)
33
- class _OpdRequest:
34
- spec: Any
35
- env: Any
36
- multi_turn: bool
37
- max_turns: int
38
- knobs: Any
39
- model_id: str
40
- model_revision: str
41
- structured_outputs: Any = None
42
- model_vocab_size: int | None = None
43
-
44
-
45
- @dataclass(frozen=True)
46
- class _PromptState:
47
- teacher: Any
48
- tokenizer: Any
49
- thinking_prefill: str
50
- max_model_len: int
51
- prompt_budget: int
52
- prompts: list[Any]
53
- dropped_long: int
54
-
55
-
56
- @dataclass(frozen=True)
57
- class _WorkloadState:
58
- prompts_per_step: int
59
- update_horizon: int
60
- prompt_pool_fingerprint: str
61
- workdir: str
62
- shim_dir: str
63
- local_dir: str
64
- export_root: str
65
- mutation_failure_path: str
66
- score_delivery_failure_path: str
67
- abandonment_failure_path: str
68
- resample_failure_path: str
69
- cycle_commit_failure_path: str
70
- train_file: str
71
- val_file: str
72
- lora_rank: int
73
- lora_alpha: int
74
- target_modules: Any
75
- warmstart_adapter: str | None
76
-
77
-
78
- @dataclass(frozen=True)
79
- class _RuntimeState:
80
- python_bin: str
81
- model_path: str
82
- gpu_count: int
83
- save_freq: int
84
- loggers: list[str]
85
- project_name: str
86
- experiment_name: str
87
- gdn_reset_arch: str | None
88
- entry_path: str
89
- reward_path: str
90
- resume_step: int
91
- resume_state: dict[str, Any] | None
92
- bridge: Any
93
-
94
-
95
- @dataclass(frozen=True)
96
- class _ChildCallbacks:
97
- on_line: Any
98
- on_step: Any
99
- child_heartbeat: Any
100
- liveness_fields: Any
101
- progress: dict[str, Any]
102
- wandb_link: dict[str, str | None]
103
- child_tail: Any
104
-
105
-
106
- @dataclass(frozen=True)
107
- class _ChildResult:
108
- final_accounting: dict[str, Any]
109
- actor_dir: str
110
- final_step: int
111
- train_wall: float
112
- peak_gpu_gb: float
113
- train_started_at: float
114
- wandb_url: str | None
115
- wandb_id: str | None
116
-
117
-
118
39
  def _prepare_request(spec: Any) -> _OpdRequest:
119
40
  env = _opd_train._w.require_active_env()
120
41
  if getattr(env, "is_tool_env", False):
@@ -387,8 +387,11 @@ def run_rl_train():
387
387
  return state.progress["step"]
388
388
 
389
389
  def _reward_observability() -> dict:
390
- """return reward metrics and sampled completions for one heartbeat."""
391
- return reward_runtime.observability.heartbeat_fields()
390
+ """return reward observability and measured pace for one heartbeat."""
391
+ return {
392
+ **reward_runtime.observability.heartbeat_fields(),
393
+ **_step_timing_fields(inp, state),
394
+ }
392
395
 
393
396
  with liveness_heartbeat(
394
397
  "rl_step",
@@ -491,6 +494,7 @@ from flash.engine.worker.rl_train_runner import ( # noqa: E402,F401
491
494
  _RewardRuntime,
492
495
  _start_resume_uploader,
493
496
  _start_reward_runtime,
497
+ _step_timing_fields,
494
498
  _StepMetricState,
495
499
  _validate_rl_child,
496
500
  _write_rl_shim,
@@ -39,6 +39,7 @@ from flash.engine.worker.io.heartbeat import (
39
39
  )
40
40
  from flash.engine.worker.perf import gpu_diagnostics, wait_for_gpu
41
41
  from flash.engine.worker.runtime.pkg_proxy import W as _w
42
+ from flash.engine.worker.train.core.step_timing import StepTiming
42
43
  from flash.engine.worker.train.rl.multi_turn import (
43
44
  MultiTurnBridge,
44
45
  copy_multi_turn_child_modules,
@@ -80,9 +81,10 @@ class _StepMetricState:
80
81
  loss_curve: list[float] = field(default_factory=list)
81
82
  adv_spread_history: list[float] = field(default_factory=list)
82
83
  last_dump_step: list[int] = field(default_factory=lambda: [-1])
83
- step_line_times: list[float] = field(default_factory=list)
84
84
  metrics_last: list[dict] = field(default_factory=list)
85
+ step_timing: StepTiming = field(default_factory=StepTiming)
85
86
  sent_first_metrics: bool = False
87
+ sent_first_timing: bool = False
86
88
 
87
89
 
88
90
  @dataclass
@@ -455,16 +457,23 @@ def _build_rl_child_env(inp, files, loggers, reward_url):
455
457
  return env_for_verl
456
458
 
457
459
 
460
+ def _step_timing_fields(inp, state: _StepMetricState) -> dict:
461
+ return state.step_timing.heartbeat_fields(
462
+ current_step=state.progress["step"],
463
+ total_steps=int(inp["steps"]),
464
+ remaining_wall_s=_w._remaining_worker_wall_seconds(),
465
+ )
466
+
467
+
458
468
  def _ingest_step_metrics(
459
469
  line: str,
460
470
  inp,
461
471
  state: _StepMetricState,
462
472
  _reward_observability: Callable[[], dict],
463
473
  ) -> None:
464
- sent_first_metrics = state.sent_first_metrics
465
474
  step_metrics = parse_verl_step_metrics(line)
466
475
  if step_metrics is not None:
467
- state.step_line_times.append(time.time())
476
+ state.step_timing.record_duration(parse_verl_metric(line, "timing_s/step"))
468
477
  # a run constant rather than a verl metric, so it is stamped here from
469
478
  # the resolved run config.
470
479
  step_metrics["max_completion_tokens"] = inp["max_completion"]
@@ -472,19 +481,25 @@ def _ingest_step_metrics(
472
481
  # the worker's error path reads this global, so a run that dies mid-training
473
482
  # still reports the steps it did complete (worker/__init__.py:_err_metrics).
474
483
  LATEST_GRPO_METRICS_LAST[:] = state.metrics_last
475
- # rl_train_start arms a 900s throttle, so force the first backlog through like
476
- # heartbeat.py force_first_samples and retry until committed. later emissions remain
477
- # throttled to protect the hf commit cap.
478
- if not sent_first_metrics:
479
- sent_first_metrics = _w.heartbeat(
484
+ heartbeat_fields = _reward_observability()
485
+ has_step_timing = "step_duration_s" in heartbeat_fields
486
+ # rl_train_start arms a 900s throttle, so force until both the first backlog and the first
487
+ # usable timing payload commit. the backlog commit also arms the force floor, so mark the first
488
+ # timing attempt for the wrapper's dedicated floor bypass until that upload succeeds.
489
+ if not state.sent_first_metrics or (has_step_timing and not state.sent_first_timing):
490
+ heartbeat_committed = _w.heartbeat(
480
491
  "rl_step",
481
492
  force=True,
493
+ first_timing=has_step_timing and not state.sent_first_timing,
482
494
  step=step_metrics["step"],
483
495
  metrics_last=list(state.metrics_last),
484
- **_reward_observability(),
496
+ **heartbeat_fields,
485
497
  gpu=gpu_diagnostics(include_torch=False),
486
498
  )
487
- state.sent_first_metrics = sent_first_metrics
499
+ if heartbeat_committed:
500
+ state.sent_first_metrics = True
501
+ if has_step_timing:
502
+ state.sent_first_timing = True
488
503
  # per-step series for train_meta observability parity. these live on the same
489
504
  # line as everything else: verl's only console metric sink is LocalLogger,
490
505
  # which always prints "step:N - ..." (verl/utils/logger/aggregate_logger.py),
@@ -0,0 +1,62 @@
1
+ """RL step pace derived from Verl's native per-step duration metric."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import math
6
+ import statistics
7
+ from dataclasses import dataclass, field
8
+
9
+ _RETAINED_DURATION_SAMPLES = 64
10
+
11
+
12
+ @dataclass
13
+ class StepTiming:
14
+ """Retain recent steady-state RL durations for heartbeat projections."""
15
+
16
+ _warmup_seen: bool = False
17
+ _durations: list[float] = field(default_factory=list)
18
+
19
+ def record_duration(self, duration: float | None) -> None:
20
+ """record one positive native duration from a parsed Verl training step."""
21
+ if duration is None or duration <= 0:
22
+ return
23
+ if not self._warmup_seen:
24
+ self._warmup_seen = True
25
+ return
26
+ self._durations = [*self._durations, duration][-_RETAINED_DURATION_SAMPLES:]
27
+
28
+ def heartbeat_fields(
29
+ self,
30
+ *,
31
+ current_step: int,
32
+ total_steps: int,
33
+ remaining_wall_s: float | None,
34
+ ) -> dict[str, float | bool]:
35
+ """Return measured pace and a best-effort remaining-training projection."""
36
+ durations = self._durations
37
+ if not durations:
38
+ return {}
39
+
40
+ remaining_steps = max(0, int(total_steps) - int(current_step))
41
+ try:
42
+ median_duration_s = statistics.median(durations)
43
+ mean_duration_s = statistics.fmean(durations)
44
+ projected_remaining_s = mean_duration_s * remaining_steps
45
+ except OverflowError:
46
+ return {}
47
+ if not all(
48
+ math.isfinite(value)
49
+ for value in (median_duration_s, mean_duration_s, projected_remaining_s)
50
+ ):
51
+ return {}
52
+ fields: dict[str, float | bool] = {
53
+ "step_duration_s": median_duration_s,
54
+ "projected_remaining_s": projected_remaining_s,
55
+ }
56
+ if (
57
+ remaining_wall_s is not None
58
+ and remaining_wall_s >= 0
59
+ and projected_remaining_s > remaining_wall_s
60
+ ):
61
+ fields["wall_deadline_at_risk"] = True
62
+ return fields
@@ -0,0 +1,92 @@
1
+ """immutable state carriers for OPD parent-runner stages."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from dataclasses import dataclass
6
+ from typing import Any
7
+
8
+
9
+ @dataclass(frozen=True)
10
+ class _OpdRequest:
11
+ spec: Any
12
+ env: Any
13
+ multi_turn: bool
14
+ max_turns: int
15
+ knobs: Any
16
+ model_id: str
17
+ model_revision: str
18
+ structured_outputs: Any = None
19
+ model_vocab_size: int | None = None
20
+
21
+
22
+ @dataclass(frozen=True)
23
+ class _PromptState:
24
+ teacher: Any
25
+ tokenizer: Any
26
+ thinking_prefill: str
27
+ max_model_len: int
28
+ prompt_budget: int
29
+ prompts: list[Any]
30
+ dropped_long: int
31
+
32
+
33
+ @dataclass(frozen=True)
34
+ class _WorkloadState:
35
+ prompts_per_step: int
36
+ update_horizon: int
37
+ prompt_pool_fingerprint: str
38
+ workdir: str
39
+ shim_dir: str
40
+ local_dir: str
41
+ export_root: str
42
+ mutation_failure_path: str
43
+ score_delivery_failure_path: str
44
+ abandonment_failure_path: str
45
+ resample_failure_path: str
46
+ cycle_commit_failure_path: str
47
+ train_file: str
48
+ val_file: str
49
+ lora_rank: int
50
+ lora_alpha: int
51
+ target_modules: Any
52
+ warmstart_adapter: str | None
53
+
54
+
55
+ @dataclass(frozen=True)
56
+ class _RuntimeState:
57
+ python_bin: str
58
+ model_path: str
59
+ gpu_count: int
60
+ save_freq: int
61
+ loggers: list[str]
62
+ project_name: str
63
+ experiment_name: str
64
+ gdn_reset_arch: str | None
65
+ entry_path: str
66
+ reward_path: str
67
+ resume_step: int
68
+ resume_state: dict[str, Any] | None
69
+ bridge: Any
70
+
71
+
72
+ @dataclass(frozen=True)
73
+ class _ChildCallbacks:
74
+ on_line: Any
75
+ on_step: Any
76
+ child_heartbeat: Any
77
+ liveness_fields: Any
78
+ progress: dict[str, Any]
79
+ wandb_link: dict[str, str | None]
80
+ child_tail: Any
81
+
82
+
83
+ @dataclass(frozen=True)
84
+ class _ChildResult:
85
+ final_accounting: dict[str, Any]
86
+ actor_dir: str
87
+ final_step: int
88
+ train_wall: float
89
+ peak_gpu_gb: float
90
+ train_started_at: float
91
+ wandb_url: str | None
92
+ wandb_id: str | None
@@ -513,7 +513,21 @@ def _classify_queue_state(
513
513
  # between unhealthy and empty cannot make a broken box look like starvation.
514
514
  state.ever_saw_worker = True
515
515
  if any(workers.get(k) for k in ("throttled", "unhealthy", "initializing")) or not usable:
516
- context.say(f"queued; workers: {workers}")
516
+ message = f"queued; workers: {workers}"
517
+ if (
518
+ not usable
519
+ and not recovering
520
+ and not state.ever_saw_worker
521
+ and state.queued_timer.since is not None
522
+ ):
523
+ elapsed_s = max(0, int(now - state.queued_timer.since))
524
+ budget = (
525
+ f"{context.queue_grace_s:g}s"
526
+ if _jobs.math.isfinite(context.queue_grace_s)
527
+ else "unbounded"
528
+ )
529
+ message += f"; waited {elapsed_s}s of {budget} capacity grace"
530
+ context.say(message)
517
531
  if state.unhealthy_timer.expired(
518
532
  workers.get("unhealthy") and not usable and not recovering,
519
533
  now,
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "freesolo-flash-dev"
3
- version = "1.2.22"
3
+ version = "1.2.28"
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.22"
140
+ version = "1.2.28"
141
141
 
142
142
  [tool.pytest.ini_options]
143
143
  pythonpath = ["."]