soup-cli 0.71.37__tar.gz → 0.71.38__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 (899) hide show
  1. {soup_cli-0.71.37 → soup_cli-0.71.38}/CHANGELOG.md +42 -0
  2. {soup_cli-0.71.37 → soup_cli-0.71.38}/CONTRIBUTING.md +1 -1
  3. {soup_cli-0.71.37 → soup_cli-0.71.38}/PKG-INFO +33 -26
  4. {soup_cli-0.71.37 → soup_cli-0.71.38}/README.md +32 -25
  5. {soup_cli-0.71.37 → soup_cli-0.71.38}/docs/commands.md +3 -2
  6. {soup_cli-0.71.37 → soup_cli-0.71.38}/docs/evaluation.md +22 -5
  7. {soup_cli-0.71.37 → soup_cli-0.71.38}/pyproject.toml +2 -1
  8. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/__init__.py +1 -1
  9. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/commands/ship.py +72 -64
  10. soup_cli-0.71.38/src/soup_cli/data/_fixtures/gate/format_json.jsonl +40 -0
  11. soup_cli-0.71.38/src/soup_cli/data/_fixtures/gate/safety.jsonl +40 -0
  12. soup_cli-0.71.38/src/soup_cli/data/_fixtures/gate/tool_call.jsonl +40 -0
  13. soup_cli-0.71.38/src/soup_cli/eval/forgetting.py +350 -0
  14. soup_cli-0.71.38/src/soup_cli/eval/gate_suites.py +234 -0
  15. soup_cli-0.71.38/src/soup_cli/utils/diagnose/__init__.py +57 -0
  16. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_part_a_wave1.py +7 -3
  17. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_training_intelligence.py +6 -3
  18. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_v07125.py +11 -9
  19. soup_cli-0.71.38/tests/test_v07138.py +598 -0
  20. soup_cli-0.71.37/src/soup_cli/eval/forgetting.py +0 -121
  21. soup_cli-0.71.37/src/soup_cli/utils/diagnose/__init__.py +0 -42
  22. {soup_cli-0.71.37 → soup_cli-0.71.38}/.dockerignore +0 -0
  23. {soup_cli-0.71.37 → soup_cli-0.71.38}/.github/FUNDING.yml +0 -0
  24. {soup_cli-0.71.37 → soup_cli-0.71.38}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  25. {soup_cli-0.71.37 → soup_cli-0.71.38}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  26. {soup_cli-0.71.37 → soup_cli-0.71.38}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
  27. {soup_cli-0.71.37 → soup_cli-0.71.38}/.github/pull_request_template.md +0 -0
  28. {soup_cli-0.71.37 → soup_cli-0.71.38}/.github/workflows/ci.yml +0 -0
  29. {soup_cli-0.71.37 → soup_cli-0.71.38}/.github/workflows/docker.yml +0 -0
  30. {soup_cli-0.71.37 → soup_cli-0.71.38}/.github/workflows/publish.yml +0 -0
  31. {soup_cli-0.71.37 → soup_cli-0.71.38}/.github/workflows/recipe-validation.yml +0 -0
  32. {soup_cli-0.71.37 → soup_cli-0.71.38}/.gitignore +0 -0
  33. {soup_cli-0.71.37 → soup_cli-0.71.38}/.mailmap +0 -0
  34. {soup_cli-0.71.37 → soup_cli-0.71.38}/.pre-commit-config.yaml +0 -0
  35. {soup_cli-0.71.37 → soup_cli-0.71.38}/AGENTS.md +0 -0
  36. {soup_cli-0.71.37 → soup_cli-0.71.38}/CODEOWNERS +0 -0
  37. {soup_cli-0.71.37 → soup_cli-0.71.38}/CODE_OF_CONDUCT.md +0 -0
  38. {soup_cli-0.71.37 → soup_cli-0.71.38}/CONTRIBUTORS.md +0 -0
  39. {soup_cli-0.71.37 → soup_cli-0.71.38}/Dockerfile +0 -0
  40. {soup_cli-0.71.37 → soup_cli-0.71.38}/LICENSE +0 -0
  41. {soup_cli-0.71.37 → soup_cli-0.71.38}/NOTICE +0 -0
  42. {soup_cli-0.71.37 → soup_cli-0.71.38}/SECURITY.md +0 -0
  43. {soup_cli-0.71.37 → soup_cli-0.71.38}/docker-compose.yml +0 -0
  44. {soup_cli-0.71.37 → soup_cli-0.71.38}/docs/README.md +0 -0
  45. {soup_cli-0.71.37 → soup_cli-0.71.38}/docs/adapters-and-governance.md +0 -0
  46. {soup_cli-0.71.37 → soup_cli-0.71.38}/docs/backends-and-ops.md +0 -0
  47. {soup_cli-0.71.37 → soup_cli-0.71.38}/docs/compliance.md +0 -0
  48. {soup_cli-0.71.37 → soup_cli-0.71.38}/docs/data.md +0 -0
  49. {soup_cli-0.71.37 → soup_cli-0.71.38}/docs/models.md +0 -0
  50. {soup_cli-0.71.37 → soup_cli-0.71.38}/docs/peft-and-efficiency.md +0 -0
  51. {soup_cli-0.71.37 → soup_cli-0.71.38}/docs/performance-and-quantization.md +0 -0
  52. {soup_cli-0.71.37 → soup_cli-0.71.38}/docs/serving-and-export.md +0 -0
  53. {soup_cli-0.71.37 → soup_cli-0.71.38}/docs/training.md +0 -0
  54. {soup_cli-0.71.37 → soup_cli-0.71.38}/examples/README.md +0 -0
  55. {soup_cli-0.71.37 → soup_cli-0.71.38}/examples/configs/dpo_chat.yaml +0 -0
  56. {soup_cli-0.71.37 → soup_cli-0.71.38}/examples/configs/dpo_example.yaml +0 -0
  57. {soup_cli-0.71.37 → soup_cli-0.71.38}/examples/configs/grpo_reasoning.yaml +0 -0
  58. {soup_cli-0.71.37 → soup_cli-0.71.38}/examples/configs/rlhf_step1_sft.yaml +0 -0
  59. {soup_cli-0.71.37 → soup_cli-0.71.38}/examples/configs/rlhf_step2_reward.yaml +0 -0
  60. {soup_cli-0.71.37 → soup_cli-0.71.38}/examples/configs/rlhf_step3_ppo.yaml +0 -0
  61. {soup_cli-0.71.37 → soup_cli-0.71.38}/examples/configs/sft_basic.yaml +0 -0
  62. {soup_cli-0.71.37 → soup_cli-0.71.38}/examples/configs/vision_llama.yaml +0 -0
  63. {soup_cli-0.71.37 → soup_cli-0.71.38}/examples/data/alpaca_tiny.jsonl +0 -0
  64. {soup_cli-0.71.37 → soup_cli-0.71.38}/examples/data/chat_preferences.jsonl +0 -0
  65. {soup_cli-0.71.37 → soup_cli-0.71.38}/examples/data/dpo_sample.jsonl +0 -0
  66. {soup_cli-0.71.37 → soup_cli-0.71.38}/examples/data/reasoning_math.jsonl +0 -0
  67. {soup_cli-0.71.37 → soup_cli-0.71.38}/examples/reward_hacking/rewards.py +0 -0
  68. {soup_cli-0.71.37 → soup_cli-0.71.38}/examples/synthetic_workflow.md +0 -0
  69. {soup_cli-0.71.37 → soup_cli-0.71.38}/examples/synthetic_workflow.yaml +0 -0
  70. {soup_cli-0.71.37 → soup_cli-0.71.38}/soup.png +0 -0
  71. {soup_cli-0.71.37 → soup_cli-0.71.38}/soup_logo_svg.svg +0 -0
  72. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/__main__.py +0 -0
  73. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/autopilot/__init__.py +0 -0
  74. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/autopilot/analyzer.py +0 -0
  75. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/autopilot/decisions.py +0 -0
  76. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/autopilot/generate_config.py +0 -0
  77. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/cans/__init__.py +0 -0
  78. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/cans/pack.py +0 -0
  79. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/cans/publish.py +0 -0
  80. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/cans/run.py +0 -0
  81. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/cans/schema.py +0 -0
  82. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/cans/unpack.py +0 -0
  83. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/cans/verify.py +0 -0
  84. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/cli.py +0 -0
  85. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/cloud/__init__.py +0 -0
  86. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/cloud/modal.py +0 -0
  87. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/commands/__init__.py +0 -0
  88. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/commands/_eval_v0550.py +0 -0
  89. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/commands/_eval_v0610.py +0 -0
  90. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/commands/_eval_v0650.py +0 -0
  91. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/commands/_eval_v07110.py +0 -0
  92. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/commands/_webhook_cli.py +0 -0
  93. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/commands/ab.py +0 -0
  94. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/commands/active_sample.py +0 -0
  95. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/commands/adapters.py +0 -0
  96. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/commands/advise.py +0 -0
  97. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/commands/agent.py +0 -0
  98. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/commands/airgap.py +0 -0
  99. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/commands/apple_adapter.py +0 -0
  100. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/commands/attest.py +0 -0
  101. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/commands/audit_log.py +0 -0
  102. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/commands/autopilot.py +0 -0
  103. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/commands/bench.py +0 -0
  104. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/commands/bom.py +0 -0
  105. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/commands/build.py +0 -0
  106. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/commands/can.py +0 -0
  107. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/commands/card.py +0 -0
  108. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/commands/chat.py +0 -0
  109. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/commands/ci.py +0 -0
  110. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/commands/compile_cmd.py +0 -0
  111. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/commands/compile_tools.py +0 -0
  112. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/commands/completions.py +0 -0
  113. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/commands/cost.py +0 -0
  114. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/commands/data.py +0 -0
  115. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/commands/data_canary.py +0 -0
  116. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/commands/data_doctor.py +0 -0
  117. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/commands/data_forge.py +0 -0
  118. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/commands/data_mix.py +0 -0
  119. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/commands/data_score.py +0 -0
  120. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/commands/data_topics.py +0 -0
  121. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/commands/delinearize_llama4.py +0 -0
  122. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/commands/deploy.py +0 -0
  123. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/commands/diagnose.py +0 -0
  124. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/commands/diff.py +0 -0
  125. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/commands/distill_prompt.py +0 -0
  126. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/commands/doctor.py +0 -0
  127. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/commands/draft.py +0 -0
  128. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/commands/drift_alarm.py +0 -0
  129. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/commands/edit.py +0 -0
  130. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/commands/env.py +0 -0
  131. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/commands/eval.py +0 -0
  132. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/commands/expect.py +0 -0
  133. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/commands/export.py +0 -0
  134. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/commands/fetch.py +0 -0
  135. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/commands/generate.py +0 -0
  136. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/commands/history.py +0 -0
  137. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/commands/infer.py +0 -0
  138. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/commands/ingest.py +0 -0
  139. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/commands/init.py +0 -0
  140. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/commands/iterative_dpo.py +0 -0
  141. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/commands/license_advisor.py +0 -0
  142. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/commands/llama.py +0 -0
  143. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/commands/local_rl.py +0 -0
  144. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/commands/lock.py +0 -0
  145. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/commands/loop.py +0 -0
  146. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/commands/mcp.py +0 -0
  147. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/commands/merge.py +0 -0
  148. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/commands/merge_sharded_fsdp_weights.py +0 -0
  149. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/commands/migrate.py +0 -0
  150. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/commands/monitor.py +0 -0
  151. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/commands/plan.py +0 -0
  152. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/commands/plugins.py +0 -0
  153. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/commands/probe.py +0 -0
  154. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/commands/profile.py +0 -0
  155. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/commands/prune_prompt.py +0 -0
  156. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/commands/push.py +0 -0
  157. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/commands/quantize.py +0 -0
  158. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/commands/quickstart.py +0 -0
  159. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/commands/ra_dit.py +0 -0
  160. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/commands/recipes.py +0 -0
  161. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/commands/registry.py +0 -0
  162. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/commands/runs.py +0 -0
  163. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/commands/serve.py +0 -0
  164. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/commands/shrink.py +0 -0
  165. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/commands/spectrum.py +0 -0
  166. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/commands/steer.py +0 -0
  167. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/commands/sweep.py +0 -0
  168. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/commands/tokenizer.py +0 -0
  169. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/commands/train.py +0 -0
  170. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/commands/tui.py +0 -0
  171. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/commands/tunability.py +0 -0
  172. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/commands/ui.py +0 -0
  173. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/commands/why.py +0 -0
  174. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/config/__init__.py +0 -0
  175. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/config/loader.py +0 -0
  176. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/config/schema.py +0 -0
  177. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/data/__init__.py +0 -0
  178. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/data/_fixtures/alpaca_tiny.jsonl +0 -0
  179. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/data/_fixtures/behavior/elephant.jsonl +0 -0
  180. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/data/_fixtures/behavior/harmbench.jsonl +0 -0
  181. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/data/_fixtures/behavior/jailbreakbench.jsonl +0 -0
  182. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/data/_fixtures/behavior/syceval.jsonl +0 -0
  183. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/data/_fixtures/behavior/xstest.jsonl +0 -0
  184. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/data/_fixtures/chat_preferences.jsonl +0 -0
  185. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/data/_fixtures/dpo_sample.jsonl +0 -0
  186. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/data/_fixtures/reasoning_math.jsonl +0 -0
  187. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/data/_fixtures/unlearning/muse_demo.jsonl +0 -0
  188. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/data/_fixtures/unlearning/tofu_demo.jsonl +0 -0
  189. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/data/_fixtures/unlearning/wmdp_demo.jsonl +0 -0
  190. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/data/augment.py +0 -0
  191. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/data/chat_templates.py +0 -0
  192. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/data/collators.py +0 -0
  193. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/data/formats.py +0 -0
  194. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/data/loader.py +0 -0
  195. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/data/loss_mask.py +0 -0
  196. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/data/providers/__init__.py +0 -0
  197. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/data/providers/_utils.py +0 -0
  198. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/data/providers/anthropic.py +0 -0
  199. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/data/providers/ollama.py +0 -0
  200. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/data/providers/vllm.py +0 -0
  201. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/data/sft_format.py +0 -0
  202. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/data/templates/__init__.py +0 -0
  203. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/data/templates/code.py +0 -0
  204. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/data/templates/conversation.py +0 -0
  205. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/data/templates/preference.py +0 -0
  206. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/data/templates/qa.py +0 -0
  207. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/data/templates/reasoning.py +0 -0
  208. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/data/templates/tool_calling.py +0 -0
  209. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/data/templates/verifiable.py +0 -0
  210. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/data/traces/__init__.py +0 -0
  211. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/data/traces/pair_builder.py +0 -0
  212. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/data/traces/parsers.py +0 -0
  213. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/data/traces/quality.py +0 -0
  214. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/data/validator.py +0 -0
  215. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/envs/__init__.py +0 -0
  216. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/envs/_common.py +0 -0
  217. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/envs/calculator.py +0 -0
  218. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/envs/guess_number.py +0 -0
  219. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/envs/retrieval_qa.py +0 -0
  220. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/eval/__init__.py +0 -0
  221. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/eval/arena.py +0 -0
  222. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/eval/benchmarks_v0_43.py +0 -0
  223. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/eval/calibrate.py +0 -0
  224. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/eval/checkpoint_intelligence.py +0 -0
  225. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/eval/custom.py +0 -0
  226. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/eval/gate.py +0 -0
  227. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/eval/human.py +0 -0
  228. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/eval/judge.py +0 -0
  229. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/eval/leaderboard.py +0 -0
  230. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/eval/quant_check.py +0 -0
  231. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/experiment/__init__.py +0 -0
  232. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/experiment/tracker.py +0 -0
  233. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/mcp_server/__init__.py +0 -0
  234. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/mcp_server/registry.py +0 -0
  235. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/mcp_server/server.py +0 -0
  236. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/migrate/__init__.py +0 -0
  237. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/migrate/axolotl.py +0 -0
  238. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/migrate/common.py +0 -0
  239. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/migrate/llamafactory.py +0 -0
  240. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/migrate/unsloth.py +0 -0
  241. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/monitoring/__init__.py +0 -0
  242. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/monitoring/callback.py +0 -0
  243. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/monitoring/curriculum_callback.py +0 -0
  244. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/monitoring/display.py +0 -0
  245. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/monitoring/grpo_stability_callback.py +0 -0
  246. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/monitoring/hf_push.py +0 -0
  247. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/monitoring/plugin_callback.py +0 -0
  248. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/monitoring/trace_logger.py +0 -0
  249. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/plugins/__init__.py +0 -0
  250. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/py.typed +0 -0
  251. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/recipes/__init__.py +0 -0
  252. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/recipes/catalog.py +0 -0
  253. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/registry/__init__.py +0 -0
  254. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/registry/attach.py +0 -0
  255. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/registry/diff.py +0 -0
  256. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/registry/hashing.py +0 -0
  257. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/registry/store.py +0 -0
  258. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/templates/__init__.py +0 -0
  259. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/templates/audio.yaml +0 -0
  260. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/templates/bco.yaml +0 -0
  261. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/templates/chat.yaml +0 -0
  262. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/templates/code.yaml +0 -0
  263. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/templates/embedding.yaml +0 -0
  264. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/templates/eu-ai-act.yaml +0 -0
  265. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/templates/fetch_examples/llama-3.1-8b-lora.yaml +0 -0
  266. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/templates/fetch_examples/qwen2.5-7b-dpo.yaml +0 -0
  267. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/templates/fetch_examples/zero3-cpu-offload.json +0 -0
  268. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/templates/hipaa.yaml +0 -0
  269. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/templates/ipo.yaml +0 -0
  270. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/templates/kto.yaml +0 -0
  271. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/templates/longcontext.yaml +0 -0
  272. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/templates/manifest.json +0 -0
  273. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/templates/medical.yaml +0 -0
  274. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/templates/moe.yaml +0 -0
  275. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/templates/orpo.yaml +0 -0
  276. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/templates/pretrain.yaml +0 -0
  277. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/templates/reasoning.yaml +0 -0
  278. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/templates/rlhf.yaml +0 -0
  279. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/templates/simpo.yaml +0 -0
  280. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/templates/soc2.yaml +0 -0
  281. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/templates/sr-11-7.yaml +0 -0
  282. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/templates/tool-calling.yaml +0 -0
  283. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/templates/vision.yaml +0 -0
  284. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/trainer/__init__.py +0 -0
  285. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/trainer/asr.py +0 -0
  286. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/trainer/bco.py +0 -0
  287. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/trainer/bitnet.py +0 -0
  288. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/trainer/classifier.py +0 -0
  289. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/trainer/distill.py +0 -0
  290. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/trainer/dpo.py +0 -0
  291. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/trainer/embedding.py +0 -0
  292. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/trainer/grpo.py +0 -0
  293. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/trainer/ipo.py +0 -0
  294. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/trainer/kto.py +0 -0
  295. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/trainer/mlx_dpo.py +0 -0
  296. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/trainer/mlx_grpo.py +0 -0
  297. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/trainer/mlx_routing.py +0 -0
  298. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/trainer/mlx_sft.py +0 -0
  299. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/trainer/mole_routing.py +0 -0
  300. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/trainer/online_dpo.py +0 -0
  301. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/trainer/orpo.py +0 -0
  302. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/trainer/ppo.py +0 -0
  303. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/trainer/preference.py +0 -0
  304. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/trainer/pretrain.py +0 -0
  305. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/trainer/prm.py +0 -0
  306. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/trainer/raft.py +0 -0
  307. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/trainer/reward_model.py +0 -0
  308. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/trainer/rewards.py +0 -0
  309. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/trainer/sft.py +0 -0
  310. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/trainer/simpo.py +0 -0
  311. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/trainer/tts.py +0 -0
  312. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/trainer/unlearn.py +0 -0
  313. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/tui_app.py +0 -0
  314. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/ui/__init__.py +0 -0
  315. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/ui/app.py +0 -0
  316. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/ui/plugins/__init__.py +0 -0
  317. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/ui/static/app.js +0 -0
  318. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/ui/static/index.html +0 -0
  319. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/ui/static/logo.png +0 -0
  320. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/ui/static/logo.svg +0 -0
  321. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/ui/static/style.css +0 -0
  322. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/__init__.py +0 -0
  323. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/_eval_text.py +0 -0
  324. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/ab_test.py +0 -0
  325. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/activation_offload.py +0 -0
  326. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/active_sampler.py +0 -0
  327. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/adapter_arithmetic.py +0 -0
  328. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/adapter_bisect.py +0 -0
  329. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/adapter_branch.py +0 -0
  330. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/adapter_diff.py +0 -0
  331. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/adapter_fuse.py +0 -0
  332. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/adapter_merge.py +0 -0
  333. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/adapter_pr.py +0 -0
  334. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/adapter_scan.py +0 -0
  335. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/adapter_sign.py +0 -0
  336. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/advanced_precision.py +0 -0
  337. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/advise.py +0 -0
  338. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/advise_history.py +0 -0
  339. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/agent_forge.py +0 -0
  340. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/agent_rollout.py +0 -0
  341. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/agent_sandbox.py +0 -0
  342. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/airgap_bundle.py +0 -0
  343. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/annex_xi.py +0 -0
  344. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/anthropic_messages.py +0 -0
  345. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/apple_adapter.py +0 -0
  346. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/asr_metrics.py +0 -0
  347. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/attest.py +0 -0
  348. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/audit_log.py +0 -0
  349. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/auto_quant.py +0 -0
  350. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/backend_detect.py +0 -0
  351. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/batch_probe.py +0 -0
  352. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/behavior_battery.py +0 -0
  353. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/best_of_n.py +0 -0
  354. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/bitnet.py +0 -0
  355. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/blame.py +0 -0
  356. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/block_expansion.py +0 -0
  357. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/bom.py +0 -0
  358. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/brain_rot.py +0 -0
  359. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/brain_rot_lang.py +0 -0
  360. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/build_dag.py +0 -0
  361. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/canary.py +0 -0
  362. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/canary_discovery.py +0 -0
  363. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/canary_router.py +0 -0
  364. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/capability_suite.py +0 -0
  365. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/checklist_dsl.py +0 -0
  366. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/checkpoint_trigger.py +0 -0
  367. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/ci_workflow.py +0 -0
  368. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/citation_faithful.py +0 -0
  369. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/classifier.py +0 -0
  370. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/cmaes_merge.py +0 -0
  371. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/compile_tools.py +0 -0
  372. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/completions.py +0 -0
  373. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/constants.py +0 -0
  374. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/convergence.py +0 -0
  375. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/crash.py +0 -0
  376. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/cross_doc_attn.py +0 -0
  377. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/curriculum.py +0 -0
  378. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/curriculum_dynamic.py +0 -0
  379. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/cut_ce.py +0 -0
  380. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/data_doctor.py +0 -0
  381. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/data_forge.py +0 -0
  382. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/data_lint.py +0 -0
  383. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/data_mix.py +0 -0
  384. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/data_pipeline.py +0 -0
  385. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/data_score.py +0 -0
  386. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/deepspeed.py +0 -0
  387. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/delinearize_llama4.py +0 -0
  388. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/demo_bundles.py +0 -0
  389. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/deploy_autopilot.py +0 -0
  390. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/deploy_measure.py +0 -0
  391. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/diagnose/_common.py +0 -0
  392. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/diagnose/badge.py +0 -0
  393. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/diagnose/citation.py +0 -0
  394. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/diagnose/contamination.py +0 -0
  395. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/diagnose/forgetting.py +0 -0
  396. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/diagnose/format.py +0 -0
  397. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/diagnose/live.py +0 -0
  398. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/diagnose/memorization.py +0 -0
  399. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/diagnose/mode_collapse.py +0 -0
  400. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/diagnose/refusal.py +0 -0
  401. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/diagnose/report.py +0 -0
  402. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/diagnose/runner.py +0 -0
  403. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/distill.py +0 -0
  404. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/dpo_variants.py +0 -0
  405. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/draft.py +0 -0
  406. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/drift_alarm.py +0 -0
  407. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/ebft_gdpo.py +0 -0
  408. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/echo_trap.py +0 -0
  409. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/edit_diff.py +0 -0
  410. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/edit_governor.py +0 -0
  411. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/edit_kernels.py +0 -0
  412. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/embed.py +0 -0
  413. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/encoding.py +0 -0
  414. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/energy.py +0 -0
  415. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/env_lock.py +0 -0
  416. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/errors.py +0 -0
  417. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/eval_design.py +0 -0
  418. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/eval_gate_hook.py +0 -0
  419. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/eval_lock_coverage.py +0 -0
  420. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/evolve.py +0 -0
  421. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/expectations.py +0 -0
  422. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/fetch_examples.py +0 -0
  423. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/flash_attn.py +0 -0
  424. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/fp8.py +0 -0
  425. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/freeze.py +0 -0
  426. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/fsdp.py +0 -0
  427. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/fsdp_consolidate.py +0 -0
  428. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/galore.py +0 -0
  429. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/gguf_quant.py +0 -0
  430. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/gpu.py +0 -0
  431. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/gpu_monitor.py +0 -0
  432. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/grace_codebook.py +0 -0
  433. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/graceful_save.py +0 -0
  434. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/grad_accum.py +0 -0
  435. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/gradient_ckpt.py +0 -0
  436. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/grpo_long_context.py +0 -0
  437. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/grpo_variants.py +0 -0
  438. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/hardware_fit.py +0 -0
  439. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/harm_probe.py +0 -0
  440. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/hf.py +0 -0
  441. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/hf_space.py +0 -0
  442. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/hubs.py +0 -0
  443. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/ingest_sources.py +0 -0
  444. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/integrations.py +0 -0
  445. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/interference.py +0 -0
  446. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/interference_live.py +0 -0
  447. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/irt.py +0 -0
  448. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/iterative_dpo.py +0 -0
  449. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/jinja_analyzer.py +0 -0
  450. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/kernel_picker.py +0 -0
  451. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/knowledge_edit.py +0 -0
  452. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/kv_cache.py +0 -0
  453. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/launcher.py +0 -0
  454. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/license_advisor.py +0 -0
  455. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/license_matrix.py +0 -0
  456. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/liger.py +0 -0
  457. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/lisa.py +0 -0
  458. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/live_eval.py +0 -0
  459. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/llama_proxy.py +0 -0
  460. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/llama_server_timings.py +0 -0
  461. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/local_rl.py +0 -0
  462. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/local_rl_scheduler.py +0 -0
  463. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/loftq_init.py +0 -0
  464. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/log_level.py +0 -0
  465. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/long_context.py +0 -0
  466. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/longlora.py +0 -0
  467. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/loop_budget.py +0 -0
  468. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/loop_daemon.py +0 -0
  469. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/loop_iteration.py +0 -0
  470. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/loop_stages.py +0 -0
  471. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/loop_state.py +0 -0
  472. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/lr_finder.py +0 -0
  473. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/lr_groups.py +0 -0
  474. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/magpie.py +0 -0
  475. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/metrics.py +0 -0
  476. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/mii.py +0 -0
  477. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/minillm.py +0 -0
  478. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/mix_proxy.py +0 -0
  479. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/mixed_precision.py +0 -0
  480. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/mlx.py +0 -0
  481. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/mod.py +0 -0
  482. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/moe.py +0 -0
  483. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/moe_quant.py +0 -0
  484. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/mole_routing.py +0 -0
  485. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/multipack.py +0 -0
  486. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/multipack_sampler.py +0 -0
  487. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/multipack_trainer.py +0 -0
  488. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/namespace_pin.py +0 -0
  489. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/neat_packing.py +0 -0
  490. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/ngram_spec.py +0 -0
  491. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/nlg_metrics.py +0 -0
  492. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/ollama.py +0 -0
  493. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/onboarding.py +0 -0
  494. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/optimizer_zoo.py +0 -0
  495. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/paths.py +0 -0
  496. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/peft_builder.py +0 -0
  497. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/peft_patches.py +0 -0
  498. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/peft_wiring.py +0 -0
  499. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/persona_hub.py +0 -0
  500. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/pipeline.py +0 -0
  501. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/preference_combine.py +0 -0
  502. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/prm.py +0 -0
  503. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/prm_reward.py +0 -0
  504. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/probe_kernel.py +0 -0
  505. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/probe_pack.py +0 -0
  506. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/profiler.py +0 -0
  507. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/profiling.py +0 -0
  508. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/profiling_v0_43.py +0 -0
  509. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/prompt_compile.py +0 -0
  510. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/prompt_distill.py +0 -0
  511. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/prune_prompt.py +0 -0
  512. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/qat.py +0 -0
  513. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/qr_url.py +0 -0
  514. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/quality.py +0 -0
  515. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/quant_menu.py +0 -0
  516. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/ra_dit.py +0 -0
  517. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/ra_dit_run.py +0 -0
  518. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/raft.py +0 -0
  519. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/reasoning_effort.py +0 -0
  520. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/reasoning_parser.py +0 -0
  521. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/recipe_dag.py +0 -0
  522. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/recipe_run.py +0 -0
  523. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/registry.py +0 -0
  524. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/rehearsal.py +0 -0
  525. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/relora.py +0 -0
  526. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/replay.py +0 -0
  527. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/repro_receipt.py +0 -0
  528. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/reward_hack_control.py +0 -0
  529. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/reward_hacking.py +0 -0
  530. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/ring_attention.py +0 -0
  531. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/rl_checkpoint.py +0 -0
  532. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/rl_signal_buffer.py +0 -0
  533. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/run_cost.py +0 -0
  534. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/sae_diff.py +0 -0
  535. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/save_formats.py +0 -0
  536. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/semdedup.py +0 -0
  537. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/server_tools.py +0 -0
  538. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/sglang.py +0 -0
  539. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/ship_verdict.py +0 -0
  540. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/shortcuts.py +0 -0
  541. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/shrink.py +0 -0
  542. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/signing.py +0 -0
  543. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/sleeper_probe.py +0 -0
  544. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/soup_lock.py +0 -0
  545. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/spec_pairing.py +0 -0
  546. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/spectrum_scan.py +0 -0
  547. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/spike_recovery.py +0 -0
  548. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/sse_train_stream.py +0 -0
  549. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/steering.py +0 -0
  550. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/strict_safetensors.py +0 -0
  551. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/structured_output.py +0 -0
  552. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/sweep_config.py +0 -0
  553. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/tail_latency.py +0 -0
  554. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/terraform_plan.py +0 -0
  555. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/tool_outputs.py +0 -0
  556. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/topics.py +0 -0
  557. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/topology.py +0 -0
  558. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/tracing.py +0 -0
  559. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/trackers.py +0 -0
  560. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/train_event_buffer.py +0 -0
  561. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/trainer_plugins.py +0 -0
  562. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/trust_remote.py +0 -0
  563. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/truth_probe.py +0 -0
  564. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/tts.py +0 -0
  565. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/tts_codec.py +0 -0
  566. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/tunability.py +0 -0
  567. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/ui_env.py +0 -0
  568. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/uld.py +0 -0
  569. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/unlearn_kernels.py +0 -0
  570. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/unlearning.py +0 -0
  571. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/unlearning_eval.py +0 -0
  572. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/unsloth.py +0 -0
  573. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/v028_features.py +0 -0
  574. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/vector_bank.py +0 -0
  575. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/vllm.py +0 -0
  576. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/vscode_setup.py +0 -0
  577. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/warmup.py +0 -0
  578. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/webhooks.py +0 -0
  579. {soup_cli-0.71.37 → soup_cli-0.71.38}/src/soup_cli/utils/why.py +0 -0
  580. {soup_cli-0.71.37 → soup_cli-0.71.38}/templates/chat.yaml +0 -0
  581. {soup_cli-0.71.37 → soup_cli-0.71.38}/templates/code.yaml +0 -0
  582. {soup_cli-0.71.37 → soup_cli-0.71.38}/templates/medical.yaml +0 -0
  583. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/__init__.py +0 -0
  584. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/conftest.py +0 -0
  585. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/qa/v053_qa.md +0 -0
  586. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/qa/v07114_qa.md +0 -0
  587. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/qa/v0716_qa.md +0 -0
  588. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_adapters.py +0 -0
  589. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_advanced_peft.py +0 -0
  590. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_assistant_mask.py +0 -0
  591. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_audio.py +0 -0
  592. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_auto_tuning.py +0 -0
  593. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_autopilot.py +0 -0
  594. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_awq_gptq_export.py +0 -0
  595. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_batch_probe.py +0 -0
  596. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_bco.py +0 -0
  597. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_bench.py +0 -0
  598. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_brain_rot_multilingual.py +0 -0
  599. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_bugfixes.py +0 -0
  600. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_build_dag.py +0 -0
  601. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_callback.py +0 -0
  602. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_cans.py +0 -0
  603. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_chat.py +0 -0
  604. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_chat_template.py +0 -0
  605. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_cli.py +0 -0
  606. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_cli_subprocess.py +0 -0
  607. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_code_review_critical.py +0 -0
  608. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_code_review_deferred.py +0 -0
  609. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_code_review_high.py +0 -0
  610. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_code_review_medium_low.py +0 -0
  611. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_code_review_recurring.py +0 -0
  612. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_config.py +0 -0
  613. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_cost.py +0 -0
  614. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_crash_reporter.py +0 -0
  615. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_curriculum.py +0 -0
  616. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_data.py +0 -0
  617. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_data_augment.py +0 -0
  618. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_data_sample.py +0 -0
  619. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_data_split.py +0 -0
  620. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_data_tools.py +0 -0
  621. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_dataset_hub.py +0 -0
  622. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_dataset_registry.py +0 -0
  623. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_deepspeed.py +0 -0
  624. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_deploy_ollama.py +0 -0
  625. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_diff.py +0 -0
  626. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_display.py +0 -0
  627. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_doctor.py +0 -0
  628. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_dpo_example.py +0 -0
  629. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_dpo_variants.py +0 -0
  630. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_embedding.py +0 -0
  631. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_errors.py +0 -0
  632. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_eval.py +0 -0
  633. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_eval_gate.py +0 -0
  634. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_eval_platform.py +0 -0
  635. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_export.py +0 -0
  636. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_formats.py +0 -0
  637. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_fp8_recipe.py +0 -0
  638. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_freeze_training.py +0 -0
  639. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_generate.py +0 -0
  640. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_gpu.py +0 -0
  641. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_grpo.py +0 -0
  642. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_hf_integration.py +0 -0
  643. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_infer.py +0 -0
  644. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_inference_advanced.py +0 -0
  645. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_init.py +0 -0
  646. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_ipo.py +0 -0
  647. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_jinja_analyzer.py +0 -0
  648. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_kto.py +0 -0
  649. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_loader.py +0 -0
  650. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_log_level.py +0 -0
  651. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_loss_watchdog.py +0 -0
  652. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_merge.py +0 -0
  653. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_migrate.py +0 -0
  654. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_mlx_backend.py +0 -0
  655. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_moe.py +0 -0
  656. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_multi_adapter.py +0 -0
  657. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_multi_gpu.py +0 -0
  658. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_multipack_config.py +0 -0
  659. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_multipack_invariants.py +0 -0
  660. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_multipack_sampler.py +0 -0
  661. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_neat_packing.py +0 -0
  662. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_neftune_rslora.py +0 -0
  663. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_onnx_tensorrt_export.py +0 -0
  664. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_orpo.py +0 -0
  665. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_packing.py +0 -0
  666. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_part_a_wave2.py +0 -0
  667. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_part_b.py +0 -0
  668. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_part_c.py +0 -0
  669. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_part_d.py +0 -0
  670. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_part_e.py +0 -0
  671. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_part_f_hardening.py +0 -0
  672. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_peft_methods.py +0 -0
  673. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_peft_patches.py +0 -0
  674. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_performance.py +0 -0
  675. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_pissa_init.py +0 -0
  676. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_ppo.py +0 -0
  677. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_preference_dispatcher.py +0 -0
  678. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_preference_multi.py +0 -0
  679. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_preference_multi_runtime.py +0 -0
  680. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_pretrain.py +0 -0
  681. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_profile.py +0 -0
  682. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_profiling.py +0 -0
  683. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_progress.py +0 -0
  684. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_push.py +0 -0
  685. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_qat.py +0 -0
  686. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_quality_filter.py +0 -0
  687. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_quant_check.py +0 -0
  688. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_quant_menu.py +0 -0
  689. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_quickstart.py +0 -0
  690. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_rank_pattern.py +0 -0
  691. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_recipes.py +0 -0
  692. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_recipes_v031.py +0 -0
  693. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_refusal_multilingual.py +0 -0
  694. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_registry.py +0 -0
  695. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_relora.py +0 -0
  696. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_replay.py +0 -0
  697. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_resume.py +0 -0
  698. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_review_fixes_v07133.py +0 -0
  699. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_rlvr.py +0 -0
  700. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_run_cost.py +0 -0
  701. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_runs.py +0 -0
  702. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_serve.py +0 -0
  703. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_server_generate.py +0 -0
  704. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_sglang_serve.py +0 -0
  705. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_simpo.py +0 -0
  706. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_smoke_train.py +0 -0
  707. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_speculative_decoding.py +0 -0
  708. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_sweep.py +0 -0
  709. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_synth_data_pro.py +0 -0
  710. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_templates_yaml.py +0 -0
  711. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_tensorboard.py +0 -0
  712. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_tool_calling.py +0 -0
  713. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_trace_to_pref.py +0 -0
  714. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_tracker.py +0 -0
  715. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_trainer_coverage_v035.py +0 -0
  716. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_trainer_init.py +0 -0
  717. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_training_speed.py +0 -0
  718. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_trust_remote_code.py +0 -0
  719. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_tui.py +0 -0
  720. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_ui.py +0 -0
  721. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_ui_chat.py +0 -0
  722. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_ui_config_builder.py +0 -0
  723. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_ui_live_monitor.py +0 -0
  724. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_ui_metrics.py +0 -0
  725. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_unsloth.py +0 -0
  726. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_v0401_part_c.py +0 -0
  727. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_v0401_part_d.py +0 -0
  728. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_v0401_part_e.py +0 -0
  729. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_v0402_part_a.py +0 -0
  730. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_v0402_part_b.py +0 -0
  731. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_v0403_part_a.py +0 -0
  732. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_v0403_part_b.py +0 -0
  733. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_v0403_part_c.py +0 -0
  734. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_v0404_part_a.py +0 -0
  735. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_v0404_part_b.py +0 -0
  736. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_v0405_part_a.py +0 -0
  737. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_v0406_part_a.py +0 -0
  738. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_v0410_part_a.py +0 -0
  739. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_v0410_part_b.py +0 -0
  740. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_v0410_part_c.py +0 -0
  741. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_v0420.py +0 -0
  742. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_v0430_part_a.py +0 -0
  743. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_v0430_part_b.py +0 -0
  744. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_v0430_part_c.py +0 -0
  745. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_v0430_part_d.py +0 -0
  746. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_v0440_part_a.py +0 -0
  747. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_v0440_part_b.py +0 -0
  748. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_v0440_part_c.py +0 -0
  749. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_v0440_part_d.py +0 -0
  750. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_v0440_review_followups.py +0 -0
  751. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_v0450.py +0 -0
  752. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_v0460_part_a.py +0 -0
  753. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_v0460_part_b.py +0 -0
  754. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_v0470_part_a.py +0 -0
  755. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_v0470_part_b.py +0 -0
  756. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_v0480_part_a.py +0 -0
  757. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_v0480_part_b.py +0 -0
  758. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_v0490.py +0 -0
  759. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_v0500_part_a.py +0 -0
  760. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_v0500_part_b.py +0 -0
  761. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_v0500_part_c.py +0 -0
  762. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_v0500_part_d.py +0 -0
  763. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_v0500_part_e.py +0 -0
  764. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_v0510.py +0 -0
  765. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_v0520.py +0 -0
  766. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_v0530.py +0 -0
  767. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_v05310.py +0 -0
  768. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_v05311.py +0 -0
  769. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_v0531_109.py +0 -0
  770. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_v0531_139.py +0 -0
  771. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_v0531_142.py +0 -0
  772. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_v0531_82.py +0 -0
  773. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_v0532.py +0 -0
  774. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_v0533.py +0 -0
  775. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_v0534.py +0 -0
  776. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_v0535.py +0 -0
  777. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_v0536.py +0 -0
  778. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_v0537.py +0 -0
  779. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_v0538.py +0 -0
  780. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_v0539.py +0 -0
  781. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_v0540.py +0 -0
  782. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_v0550.py +0 -0
  783. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_v0550_followups.py +0 -0
  784. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_v0560.py +0 -0
  785. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_v0570_part_a.py +0 -0
  786. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_v0570_part_b.py +0 -0
  787. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_v0570_part_c.py +0 -0
  788. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_v0570_part_d.py +0 -0
  789. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_v0580.py +0 -0
  790. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_v0590.py +0 -0
  791. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_v0600_part_a.py +0 -0
  792. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_v0600_part_b.py +0 -0
  793. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_v0600_part_c.py +0 -0
  794. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_v0600_part_d.py +0 -0
  795. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_v0600_part_e.py +0 -0
  796. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_v0600_part_f.py +0 -0
  797. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_v0610_part_a.py +0 -0
  798. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_v0610_part_b.py +0 -0
  799. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_v0610_part_c.py +0 -0
  800. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_v0610_part_d.py +0 -0
  801. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_v0610_part_e.py +0 -0
  802. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_v0620_followups.py +0 -0
  803. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_v0620_part_a.py +0 -0
  804. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_v0620_part_b.py +0 -0
  805. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_v0620_part_c.py +0 -0
  806. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_v0620_part_d.py +0 -0
  807. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_v0620_part_e.py +0 -0
  808. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_v0630_followups.py +0 -0
  809. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_v0630_part_a.py +0 -0
  810. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_v0630_part_b.py +0 -0
  811. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_v0630_part_c.py +0 -0
  812. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_v0630_part_d.py +0 -0
  813. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_v0630_part_e.py +0 -0
  814. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_v0631_206.py +0 -0
  815. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_v0640_followups.py +0 -0
  816. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_v0640_part_a.py +0 -0
  817. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_v0640_part_b.py +0 -0
  818. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_v0640_part_c.py +0 -0
  819. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_v0640_part_d.py +0 -0
  820. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_v0640_part_e.py +0 -0
  821. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_v0640_part_f.py +0 -0
  822. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_v0650_followups.py +0 -0
  823. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_v0650_part_a.py +0 -0
  824. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_v0650_part_b.py +0 -0
  825. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_v0650_part_c.py +0 -0
  826. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_v0650_part_d.py +0 -0
  827. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_v0650_part_e.py +0 -0
  828. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_v0660_cli.py +0 -0
  829. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_v0660_followups.py +0 -0
  830. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_v0660_part_a.py +0 -0
  831. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_v0660_part_b.py +0 -0
  832. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_v0660_part_c.py +0 -0
  833. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_v0660_part_d.py +0 -0
  834. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_v0660_part_e.py +0 -0
  835. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_v0670_followups.py +0 -0
  836. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_v0670_part_a.py +0 -0
  837. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_v0670_part_b.py +0 -0
  838. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_v0670_part_c.py +0 -0
  839. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_v0670_part_d.py +0 -0
  840. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_v0670_part_e.py +0 -0
  841. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_v0670_part_f.py +0 -0
  842. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_v0680_followups.py +0 -0
  843. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_v0680_part_a.py +0 -0
  844. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_v0680_part_b.py +0 -0
  845. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_v0680_part_c.py +0 -0
  846. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_v0680_part_d.py +0 -0
  847. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_v0680_part_e.py +0 -0
  848. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_v0690_part_a.py +0 -0
  849. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_v0690_part_b.py +0 -0
  850. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_v0690_part_c.py +0 -0
  851. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_v0690_part_d.py +0 -0
  852. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_v0690_part_e.py +0 -0
  853. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_v0700_part_a.py +0 -0
  854. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_v0700_part_b.py +0 -0
  855. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_v0700_part_c.py +0 -0
  856. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_v0700_part_d.py +0 -0
  857. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_v0700_part_e.py +0 -0
  858. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_v0700_part_f.py +0 -0
  859. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_v07110.py +0 -0
  860. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_v07111.py +0 -0
  861. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_v07112.py +0 -0
  862. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_v07113.py +0 -0
  863. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_v07114.py +0 -0
  864. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_v07115.py +0 -0
  865. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_v07116.py +0 -0
  866. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_v07117.py +0 -0
  867. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_v07118.py +0 -0
  868. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_v07119.py +0 -0
  869. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_v0712.py +0 -0
  870. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_v07120.py +0 -0
  871. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_v07121.py +0 -0
  872. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_v07122.py +0 -0
  873. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_v07123.py +0 -0
  874. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_v07124.py +0 -0
  875. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_v07126.py +0 -0
  876. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_v07127.py +0 -0
  877. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_v07128.py +0 -0
  878. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_v07129.py +0 -0
  879. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_v0713.py +0 -0
  880. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_v07130.py +0 -0
  881. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_v07131.py +0 -0
  882. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_v07132.py +0 -0
  883. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_v07133.py +0 -0
  884. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_v07134.py +0 -0
  885. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_v07135.py +0 -0
  886. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_v07136.py +0 -0
  887. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_v07137.py +0 -0
  888. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_v0714.py +0 -0
  889. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_v0715.py +0 -0
  890. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_v0716.py +0 -0
  891. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_v0717.py +0 -0
  892. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_v0718.py +0 -0
  893. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_v0719.py +0 -0
  894. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_validator.py +0 -0
  895. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_vision.py +0 -0
  896. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_vllm_serve.py +0 -0
  897. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_warmup.py +0 -0
  898. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_why.py +0 -0
  899. {soup_cli-0.71.37 → soup_cli-0.71.38}/tests/test_windows_encoding.py +0 -0
@@ -12,6 +12,48 @@ reproducing 70+ versions of notes.
12
12
 
13
13
  ## [Unreleased]
14
14
 
15
+ ## [0.71.38] - 2026-07-17
16
+
17
+ **`soup ship`'s regression leg now has teeth.** Leg 2 (the catastrophic-forgetting
18
+ / regression gate that carries the whole SHIP / DON'T-SHIP claim) was 15
19
+ hand-written trivia prompts scored by case-insensitive **substring** containment
20
+ — it scored `"B"` for "**B**erlin", `"ok"` for "lo**ok**", `"3"` for "1**3**", and
21
+ had **zero** items for tool-calling, safety, or JSON validity. This release makes
22
+ the gate real: a fixed, extraction-based scorer + bundled, offline, zero-dep eval
23
+ suites that catch a regression the old gate waved through.
24
+
25
+ ### Changed
26
+
27
+ - **Fixed answer scorer (breaking — verdicts can change).** `soup ship`'s leg-2
28
+ MCQ / instruction / arithmetic answers are now scored by answer-**extraction**
29
+ + a boundary-aware match, replacing the raw substring test. A spurious
30
+ substring inside another word ("Berlin", "look", "13") no longer scores a
31
+ correct answer, so an existing run's verdict may flip — intentionally, because
32
+ the old gate was reporting false negatives.
33
+ - **Bundled, offline general suite.** The default `--general-suite` is now seven
34
+ hand-authored suites shipped in the wheel: `mini_mmlu` / `mini_common_sense` /
35
+ `mini_instruction` (expanded), a new `mini_arithmetic`, and three behavioural
36
+ suites the old gate had no coverage for — `mini_tool_call` (function-calling),
37
+ `mini_format_json` (JSON validity), and `mini_safety` (refusal-rate). Each is
38
+ scored to a per-model absolute score by the pure scorers Soup already ships
39
+ (`eval/custom`, `utils/diagnose`); no lm-eval, no network, no download. Every
40
+ suite is large enough that a single-item flip (1/N < 0.05) trips the default
41
+ threshold instead of being rounded away.
42
+ - **`soup ship` exit codes: usage errors moved 2 → 3.** Exit `2` now means only
43
+ DON'T-SHIP; a typo'd flag or bad `--general-suite` exits `3` (mirroring
44
+ `soup plan` / `soup env check`), so CI can tell a config error from a caught
45
+ regression. Offline `--evidence` read/parse errors stay `1`. **Breaking** for
46
+ anyone parsing exit `2` as "usage error".
47
+
48
+ ### Fixed
49
+
50
+ - `soup ship` help + docstrings no longer describe `--task-mode pairwise` as
51
+ "reserved for a later release" (it shipped in v0.71.31); the dead
52
+ `SUPPORTED_TASK_MODES` gate is removed.
53
+ - `soup diagnose`'s package docstring said "Six" probes (there are seven —
54
+ citation) and pointed live loading at an unshipped version; it now re-exports
55
+ all seven `score_*` probe functions so callers need not reach into submodules.
56
+
15
57
  ## [0.71.37] - 2026-07-17
16
58
 
17
59
  **Every `pip install soup-cli[extra]` command now works on Windows `cmd.exe`**, and
@@ -120,7 +120,7 @@ src/soup_cli/
120
120
  templates/ - 21 built-in soup.yaml templates (YAML + manifest.json) with load_template loader (v0.39.0, +bco v0.40.0, +4 compliance v0.71.35)
121
121
  ui/ - Web UI (FastAPI + HTML/JS SPA)
122
122
 
123
- tests/ - Test suite (315 files, 16288 tests)
123
+ tests/ - Test suite (316 files, 16330 tests)
124
124
  examples/ - Real-world config examples and datasets
125
125
  ```
126
126
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: soup-cli
3
- Version: 0.71.37
3
+ Version: 0.71.38
4
4
  Summary: Fine-tune and post-train LLMs in one command. No SSH, no config hell.
5
5
  Project-URL: Homepage, https://github.com/MakazhanAlpamys/Soup
6
6
  Project-URL: Repository, https://github.com/MakazhanAlpamys/Soup
@@ -193,38 +193,45 @@ infrastructure instead of improving models. Soup fixes that.
193
193
 
194
194
  ## What's New
195
195
 
196
- **v0.71.36Data Moat II.** A semantic layer over your training data, plus two tools for what a fine-tune forgets and what it leaks.
197
-
198
- - **`soup data dedup --semantic`** dedup by meaning, not by shared tokens. Catches
199
- *reworded* duplicates MinHash's shingling scores as distinct. Zero new dependencies.
200
- - **`soup data topics <data>`** cluster your data and get a coverage table
201
- (`82% code · 6% math · 1% safety`) with a warning for thin topics, so you can see what
202
- you are actually training on.
203
- - **`soup data canary insert|check`**insert unique secrets, then prove whether a model
204
- memorized them: each secret's loss is ranked against never-inserted controls. Exit 2 on a
205
- leak, so CI can gate. On SmolLM2-135M a memorized set lands at percentile 0.0 against a
206
- clean model's 4%–93% spread.
207
- - **`soup train --replay old.jsonl`** continual-learning rehearsal: interleave your old
208
- data so the new task doesn't erase it.
209
- - **Honest result:** semantic dedup is **not** a paraphrase detector. Measured, paraphrase
210
- cosines (0.49–0.76) *overlap* with genuinely-distinct rows (0.54–0.76) "Add two numbers"
211
- vs "Multiply two numbers" scores **higher** than a real paraphrase — so no threshold
212
- separates them. The default is deliberately conservative; see the CHANGELOG.
213
- - **Two blocking bugs fixed:** the hardware-fit gate **refused to train any model you merged
214
- yourself** (a local checkpoint's name has no size marker, so it guessed 7B and predicted
215
- 16 GB), and every `pip install "soup-cli[extra]"` hint printed **without the extra** —
216
- 17 sites where the suggested command succeeds and leaves the feature still broken.
196
+ **v0.71.38The gate grows teeth.** `soup ship` answers the one question that matters after a fine-tune *did my task improve WITHOUT silently breaking everything else?* This release makes the "without breaking everything else" half real.
197
+
198
+ - **A gate that actually catches regressions.** The regression leg used to be 15 trivia
199
+ prompts scored by raw substring it credited `"B"` for "**B**erlin", `"3"` for "1**3**", and
200
+ had **zero** items for tool-calling, safety, or JSON. Now it's a fixed, extraction-based
201
+ scorer over seven bundled, offline suites (MCQ · arithmetic · **tool-calling** · **JSON
202
+ validity** · **safety/refusal**). A tune that WINS your task but quietly breaks tool-calling
203
+ now gets a **DON'T SHIP**the old gate waved it through.
204
+ - **Zero new dependencies, no network.** Every suite ships in the wheel and is scored by the
205
+ pure scorers Soup already has no lm-eval, no download. `soup ci init`'s core-only gate keeps
206
+ working.
207
+ - **Distinct exit codes for CI.** Usage errors moved off exit `2` to `3`, so `2` now means only
208
+ DON'T-SHIP a typo'd flag is no longer indistinguishable from a caught regression.
209
+ - **Breaking, on purpose.** The fixed scorer can change an existing run's verdict — because the
210
+ old one was reporting false negatives. Recompute any committed `--baseline`.
217
211
 
218
212
  ```bash
219
- soup data topics train.jsonl # what am I actually training on?
220
- soup data dedup train.jsonl --semantic -o clean.jsonl
213
+ # leg 1 (task win) AND leg 2 (no regression on the bundled suite) -> one verdict
214
+ soup ship --base ./base --adapter ./my-lora --task-eval my_task.jsonl
215
+ # exit 0 = SHIP · 2 = DON'T SHIP · 3 = bad flags · 1 = runtime error
221
216
 
222
- soup data canary insert train.jsonl -o canaried.jsonl --manifest secrets.json
223
- soup data canary check --manifest secrets.json --base ./my-model # exit 2 = leak
217
+ soup ship --evidence scores.json # offline verdict from pre-computed scores
218
+ ```
219
+
220
+ <details>
221
+ <summary>Previous release — v0.71.36, Data Moat II (semantic dedup · topics · canaries · replay)</summary>
222
+
223
+ `soup data dedup --semantic` dedups by meaning; `soup data topics` shows a coverage table;
224
+ `soup data canary insert|check` proves whether a model memorized inserted secrets (exit 2 on a
225
+ leak); `soup train --replay old.jsonl` interleaves old data so a new task doesn't erase it.
224
226
 
227
+ ```bash
228
+ soup data topics train.jsonl
229
+ soup data canary check --manifest secrets.json --base ./my-model # exit 2 = leak
225
230
  soup train --config sft.yaml --replay old_task.jsonl --replay-ratio 0.1
226
231
  ```
227
232
 
233
+ </details>
234
+
228
235
  <details>
229
236
  <summary>Previous release — v0.71.33, <code>soup draft</code> (measure speculative decoding)</summary>
230
237
 
@@ -49,38 +49,45 @@ infrastructure instead of improving models. Soup fixes that.
49
49
 
50
50
  ## What's New
51
51
 
52
- **v0.71.36Data Moat II.** A semantic layer over your training data, plus two tools for what a fine-tune forgets and what it leaks.
53
-
54
- - **`soup data dedup --semantic`** dedup by meaning, not by shared tokens. Catches
55
- *reworded* duplicates MinHash's shingling scores as distinct. Zero new dependencies.
56
- - **`soup data topics <data>`** cluster your data and get a coverage table
57
- (`82% code · 6% math · 1% safety`) with a warning for thin topics, so you can see what
58
- you are actually training on.
59
- - **`soup data canary insert|check`**insert unique secrets, then prove whether a model
60
- memorized them: each secret's loss is ranked against never-inserted controls. Exit 2 on a
61
- leak, so CI can gate. On SmolLM2-135M a memorized set lands at percentile 0.0 against a
62
- clean model's 4%–93% spread.
63
- - **`soup train --replay old.jsonl`** continual-learning rehearsal: interleave your old
64
- data so the new task doesn't erase it.
65
- - **Honest result:** semantic dedup is **not** a paraphrase detector. Measured, paraphrase
66
- cosines (0.49–0.76) *overlap* with genuinely-distinct rows (0.54–0.76) "Add two numbers"
67
- vs "Multiply two numbers" scores **higher** than a real paraphrase — so no threshold
68
- separates them. The default is deliberately conservative; see the CHANGELOG.
69
- - **Two blocking bugs fixed:** the hardware-fit gate **refused to train any model you merged
70
- yourself** (a local checkpoint's name has no size marker, so it guessed 7B and predicted
71
- 16 GB), and every `pip install "soup-cli[extra]"` hint printed **without the extra** —
72
- 17 sites where the suggested command succeeds and leaves the feature still broken.
52
+ **v0.71.38The gate grows teeth.** `soup ship` answers the one question that matters after a fine-tune *did my task improve WITHOUT silently breaking everything else?* This release makes the "without breaking everything else" half real.
53
+
54
+ - **A gate that actually catches regressions.** The regression leg used to be 15 trivia
55
+ prompts scored by raw substring it credited `"B"` for "**B**erlin", `"3"` for "1**3**", and
56
+ had **zero** items for tool-calling, safety, or JSON. Now it's a fixed, extraction-based
57
+ scorer over seven bundled, offline suites (MCQ · arithmetic · **tool-calling** · **JSON
58
+ validity** · **safety/refusal**). A tune that WINS your task but quietly breaks tool-calling
59
+ now gets a **DON'T SHIP**the old gate waved it through.
60
+ - **Zero new dependencies, no network.** Every suite ships in the wheel and is scored by the
61
+ pure scorers Soup already has no lm-eval, no download. `soup ci init`'s core-only gate keeps
62
+ working.
63
+ - **Distinct exit codes for CI.** Usage errors moved off exit `2` to `3`, so `2` now means only
64
+ DON'T-SHIP a typo'd flag is no longer indistinguishable from a caught regression.
65
+ - **Breaking, on purpose.** The fixed scorer can change an existing run's verdict — because the
66
+ old one was reporting false negatives. Recompute any committed `--baseline`.
73
67
 
74
68
  ```bash
75
- soup data topics train.jsonl # what am I actually training on?
76
- soup data dedup train.jsonl --semantic -o clean.jsonl
69
+ # leg 1 (task win) AND leg 2 (no regression on the bundled suite) -> one verdict
70
+ soup ship --base ./base --adapter ./my-lora --task-eval my_task.jsonl
71
+ # exit 0 = SHIP · 2 = DON'T SHIP · 3 = bad flags · 1 = runtime error
77
72
 
78
- soup data canary insert train.jsonl -o canaried.jsonl --manifest secrets.json
79
- soup data canary check --manifest secrets.json --base ./my-model # exit 2 = leak
73
+ soup ship --evidence scores.json # offline verdict from pre-computed scores
74
+ ```
75
+
76
+ <details>
77
+ <summary>Previous release — v0.71.36, Data Moat II (semantic dedup · topics · canaries · replay)</summary>
78
+
79
+ `soup data dedup --semantic` dedups by meaning; `soup data topics` shows a coverage table;
80
+ `soup data canary insert|check` proves whether a model memorized inserted secrets (exit 2 on a
81
+ leak); `soup train --replay old.jsonl` interleaves old data so a new task doesn't erase it.
80
82
 
83
+ ```bash
84
+ soup data topics train.jsonl
85
+ soup data canary check --manifest secrets.json --base ./my-model # exit 2 = leak
81
86
  soup train --config sft.yaml --replay old_task.jsonl --replay-ratio 0.1
82
87
  ```
83
88
 
89
+ </details>
90
+
84
91
  <details>
85
92
  <summary>Previous release — v0.71.33, <code>soup draft</code> (measure speculative decoding)</summary>
86
93
 
@@ -160,11 +160,12 @@ soup runs show <run_id> Run details + loss graph + cost
160
160
  soup runs compare <run_1> <run_2> Compare two runs
161
161
  soup runs replay <run_id> Replay summary + loss curve from history (also plots a benchmark-score curve when the metric lives in eval_results)
162
162
  soup why [run_id] Explain training anomalies (heuristic)
163
- soup ship --base <m> --adapter <lora> --task-eval t.jsonl SHIP / DON'T-SHIP verdict: task win AND no forgetting (exit 0=SHIP / 2=DON'T / 1=error) (v0.71.25)
163
+ soup ship --base <m> --adapter <lora> --task-eval t.jsonl SHIP / DON'T-SHIP verdict: task win AND no regression on the bundled suite (exit 0=SHIP / 2=DON'T / 3=usage / 1=runtime) (v0.71.25; leg-2 real + usage-off-2 v0.71.38)
164
164
  soup ship --evidence ev.json [--output v.json] Decide offline from pre-computed scores (no model load)
165
165
  soup ship ... --task-mode judge_score --judge-model ollama://llama3.1 Leg-1 via LLM-as-a-judge
166
166
  soup ship ... --task-mode pairwise --judge-model ollama://llama3.1 Leg-1 via swap-debiased judge win-rate (base=0.5) (v0.71.31)
167
- soup ship ... --general-suite mmlu,gsm8k --baseline base.json lm-eval leg-2 + recorded base scores
167
+ soup ship ... # leg-2 default = 7 bundled offline suites (MCQ/arithmetic + tool_call/format_json/safety, extraction scorer, ~40 items each) (v0.71.38)
168
+ soup ship ... --general-suite mmlu,gsm8k --baseline base.json lm-eval leg-2 override + recorded base scores
168
169
  soup card <registry-id> -o MODELCARD.md HF model card from a registry entry: training config, evals, hashes, lineage, artifacts (v0.71.35)
169
170
  soup push --model ./out --repo you/m --card <registry-id> Upload that registry-driven card as the README (HF only) (v0.71.35)
170
171
  soup ci init [--data d.jsonl --suite s.yaml --evidence ev.json] [--branch main --python 3.11] [--force] Write .github/workflows/soup-gate.yml: data validate -> expect -> ship gate on every PR (v0.71.35)
@@ -355,11 +355,28 @@ soup ship --evidence evidence.json --output verdict.json
355
355
  }
356
356
  ```
357
357
 
358
- Leg-2 defaults to the built-in mini benchmarks (`mini_mmlu` / `mini_common_sense` /
359
- `mini_instruction`) offline, CPU, instant. `--general-suite <names>` with non-mini names
360
- routes through the lm-eval harness. Pairwise judge win-rate (`--task-mode pairwise`) is planned
361
- for a later release. The engine lives in `soup_cli.utils.ship_verdict` (`decide_ship` is a pure
362
- function the whole truth table is CPU-testable).
358
+ Leg-2 defaults to the **bundled offline suite** (v0.71.38) seven hand-authored suites shipped
359
+ in the wheel and scored by the pure scorers Soup already ships (no lm-eval, no network,
360
+ CPU-instant):
361
+
362
+ | Suite | What it checks | Scorer |
363
+ |-------|----------------|--------|
364
+ | `mini_mmlu` / `mini_common_sense` / `mini_instruction` / `mini_arithmetic` | general knowledge / reasoning / instruction-following / numeracy | answer-extraction + exact/boundary match |
365
+ | `mini_tool_call` | function-calling still works (right tool named) | `tool_call_name_match` |
366
+ | `mini_format_json` | JSON validity (a structured object, not a bare scalar) | container-only JSON check |
367
+ | `mini_safety` | refusal-rate on harmful prompts (under-refusal = regression) | refusal heuristic |
368
+
369
+ Each suite is >20 items so a single-item flip (1/N < 0.05) trips the default threshold instead
370
+ of being rounded away. The scorer is answer-**extraction** — a spurious substring inside a word
371
+ (`"B"` in "**B**erlin") no longer scores, which is a **breaking** change from the v0.25.0
372
+ substring scorer (an existing run's verdict can flip; recompute any committed `--baseline`).
373
+ `--general-suite <names>` with any non-bundled name routes through the lm-eval harness. Pairwise
374
+ judge win-rate (`--task-mode pairwise`) shipped in v0.71.31.
375
+
376
+ Exit codes (v0.71.38): **0 = SHIP · 2 = DON'T SHIP · 3 = usage/flag error · 1 = runtime error**
377
+ — usage errors moved off `2` so CI can tell a config typo from a caught regression. The engine
378
+ lives in `soup_cli.utils.ship_verdict` (`decide_ship` is a pure function — the whole truth table
379
+ is CPU-testable); the bundled suites live in `soup_cli.eval.gate_suites`.
363
380
 
364
381
 
365
382
  ## NLG Evaluation Metrics (BLEU + ROUGE)
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "soup-cli"
7
- version = "0.71.37"
7
+ version = "0.71.38"
8
8
  description = "Fine-tune and post-train LLMs in one command. No SSH, no config hell."
9
9
  readme = "README.md"
10
10
  license = "Apache-2.0"
@@ -127,6 +127,7 @@ artifacts = [
127
127
  "src/soup_cli/data/_fixtures/*.jsonl",
128
128
  "src/soup_cli/data/_fixtures/unlearning/*.jsonl",
129
129
  "src/soup_cli/data/_fixtures/behavior/*.jsonl",
130
+ "src/soup_cli/data/_fixtures/gate/*.jsonl",
130
131
  ]
131
132
 
132
133
  [tool.ruff]
@@ -1,3 +1,3 @@
1
1
  """Soup CLI — Fine-tune and post-train LLMs in one command."""
2
2
 
3
- __version__ = "0.71.37"
3
+ __version__ = "0.71.38"
@@ -11,14 +11,19 @@ break it? The decision fuses two legs (task win + catastrophic-forgetting
11
11
  guard) into a single binary verdict — see ``utils/ship_verdict.py`` for the
12
12
  moat (``decide_ship``).
13
13
 
14
- Exit codes mirror ``soup diagnose`` so CI can gate on the result:
15
- **0 = SHIP, 2 = DON'T SHIP, 1 = runtime error**.
16
-
17
- Leg 1 (task win) modes: ``metric`` (reuses ``eval/custom.run_eval`` accuracy)
18
- and ``judge_score`` (reuses ``eval/judge.JudgeEvaluator``). True pairwise
19
- win-rate is reserved for a later release. Leg 2 (general suite) defaults to the
20
- built-in mini benchmarks (``eval/forgetting``); ``--general-suite`` with
21
- non-mini names routes through the existing lm-eval runner.
14
+ Exit codes so CI can gate on the result:
15
+ **0 = SHIP, 2 = DON'T SHIP, 3 = usage/validation error, 1 = runtime error**.
16
+ Usage errors moved off ``2`` in v0.71.38 — a typo'd flag was previously
17
+ indistinguishable from a caught regression (both exited ``2``); ``3`` mirrors
18
+ ``soup plan`` / ``soup env check``. Offline ``--evidence`` read/parse errors
19
+ stay ``1``.
20
+
21
+ Leg 1 (task win) modes: ``metric`` (reuses ``eval/custom.run_eval`` accuracy),
22
+ ``judge_score`` (reuses ``eval/judge.JudgeEvaluator``), and ``pairwise`` (true
23
+ judge win-rate, v0.71.31). Leg 2 (general suite) defaults to the bundled offline
24
+ suite (``eval/gate_suites`` — MCQ/arithmetic + tool-call/JSON/safety, scored by
25
+ the pure diagnose/custom scorers, v0.71.38); ``--general-suite`` with any
26
+ non-bundled name routes through the existing lm-eval runner.
22
27
  """
23
28
 
24
29
  from __future__ import annotations
@@ -50,6 +55,11 @@ console = Console()
50
55
 
51
56
  app = typer.Typer(no_args_is_help=False)
52
57
 
58
+ # Exit-code taxonomy (v0.71.38): keep DON'T-SHIP distinct from a config typo.
59
+ _EXIT_RUNTIME = 1 # something went wrong actually running (IO, model load, ...)
60
+ _EXIT_DONT_SHIP = 2 # a verdict: leg 1 or leg 2 said don't ship
61
+ _EXIT_USAGE = 3 # bad flags / validation (mirrors `soup plan` / `env check`)
62
+
53
63
  # 16 MiB cap on evidence JSON (mirrors `soup diagnose` — prevents a
54
64
  # multi-GB / symlink-pointed file from OOMing at json.load time).
55
65
  _MAX_EVIDENCE_BYTES = 16 * 1024 * 1024
@@ -74,29 +84,26 @@ def _fail(message: str, code: int) -> NoReturn:
74
84
 
75
85
 
76
86
  def _validate_threshold_flag(value: float) -> float:
77
- # Fast-fail a bad flag with an exit-2 USAGE error here; the engine's own
87
+ # Fast-fail a bad flag with a usage error (exit 3) here; the engine's own
78
88
  # _validate_threshold raises ValueError (-> exit 1 runtime), which is the
79
89
  # wrong exit code for a CLI typo. Intentional, narrow duplication.
80
90
  if not isinstance(value, (int, float)) or isinstance(value, bool):
81
- _fail("--forgetting-threshold must be a number", 2)
91
+ _fail("--forgetting-threshold must be a number", _EXIT_USAGE)
82
92
  fvalue = float(value)
83
93
  # NaN fails both comparisons -> rejected.
84
94
  if not (0.0 <= fvalue <= 1.0):
85
- _fail("--forgetting-threshold must be in [0.0, 1.0]", 2)
95
+ _fail("--forgetting-threshold must be in [0.0, 1.0]", _EXIT_USAGE)
86
96
  return fvalue
87
97
 
88
98
 
89
99
  def _validate_task_mode_flag(task_mode: str) -> None:
100
+ # All three modes (metric / judge_score / pairwise) ship as of v0.71.31, so
101
+ # SUPPORTED_TASK_MODES == TASK_MODES and the old "pairwise reserved" gate is
102
+ # gone (it was dead code).
90
103
  if task_mode not in TASK_MODES:
91
104
  _fail(
92
105
  f"--task-mode must be one of {', '.join(TASK_MODES)}; got {task_mode!r}",
93
- 2,
94
- )
95
- if task_mode not in SUPPORTED_TASK_MODES:
96
- _fail(
97
- f"--task-mode {task_mode!r} (pairwise judge win-rate) ships in a "
98
- "later release; use 'metric' or 'judge_score' for now",
99
- 2,
106
+ _EXIT_USAGE,
100
107
  )
101
108
 
102
109
 
@@ -116,7 +123,7 @@ def _validate_judge_model_url(url: str) -> None:
116
123
  _fail(
117
124
  f"--judge-model {url!r} uses a disallowed scheme/host; "
118
125
  "use ollama://, https://, or http://localhost",
119
- 2,
126
+ _EXIT_USAGE,
120
127
  )
121
128
 
122
129
 
@@ -165,33 +172,33 @@ def _verdict_from_evidence(path: str, *, forgetting_threshold: float) -> ShipVer
165
172
  try:
166
173
  payload = _load_evidence(path)
167
174
  except (OSError, ValueError, json.JSONDecodeError) as exc:
168
- _fail(f"cannot read --evidence: {exc}", 1)
175
+ _fail(f"cannot read --evidence: {exc}", _EXIT_RUNTIME)
169
176
 
170
177
  task = payload.get("task")
171
178
  if not isinstance(task, dict):
172
- _fail("evidence.task must be an object with 'mode', 'base', 'tuned'", 1)
179
+ _fail("evidence.task must be an object with 'mode', 'base', 'tuned'", _EXIT_RUNTIME)
173
180
  mode = task.get("mode", "metric")
174
181
  if mode not in SUPPORTED_TASK_MODES:
175
182
  _fail(
176
183
  f"evidence.task.mode must be one of {', '.join(SUPPORTED_TASK_MODES)}; "
177
184
  f"got {mode!r}",
178
- 1,
185
+ _EXIT_RUNTIME,
179
186
  )
180
187
  if "base" not in task or "tuned" not in task:
181
- _fail("evidence.task needs both 'base' and 'tuned' scores", 1)
188
+ _fail("evidence.task needs both 'base' and 'tuned' scores", _EXIT_RUNTIME)
182
189
  try:
183
190
  task_win = build_task_win(mode, task["base"], task["tuned"])
184
191
  except (TypeError, ValueError) as exc:
185
- _fail(f"invalid evidence.task: {exc}", 1)
192
+ _fail(f"invalid evidence.task: {exc}", _EXIT_RUNTIME)
186
193
 
187
194
  raw_benchmarks = payload.get("benchmarks", {})
188
195
  if not isinstance(raw_benchmarks, dict):
189
- _fail("evidence.benchmarks must be an object of {name: {base, tuned}}", 1)
196
+ _fail("evidence.benchmarks must be an object of {name: {base, tuned}}", _EXIT_RUNTIME)
190
197
  base_scores: Dict[str, object] = {}
191
198
  tuned_scores: Dict[str, object] = {}
192
199
  for name, entry in raw_benchmarks.items():
193
200
  if not isinstance(entry, dict) or "base" not in entry or "tuned" not in entry:
194
- _fail(f"evidence.benchmarks[{name!r}] needs 'base' and 'tuned'", 1)
201
+ _fail(f"evidence.benchmarks[{name!r}] needs 'base' and 'tuned'", _EXIT_RUNTIME)
195
202
  base_scores[str(name)] = entry["base"]
196
203
  tuned_scores[str(name)] = entry["tuned"]
197
204
 
@@ -201,7 +208,7 @@ def _verdict_from_evidence(path: str, *, forgetting_threshold: float) -> ShipVer
201
208
  )
202
209
  return decide_ship(task_win, deltas, forgetting_threshold=forgetting_threshold)
203
210
  except (TypeError, ValueError) as exc:
204
- _fail(f"invalid evidence.benchmarks: {exc}", 1)
211
+ _fail(f"invalid evidence.benchmarks: {exc}", _EXIT_RUNTIME)
205
212
 
206
213
 
207
214
  # ---------------------------------------------------------------------------
@@ -312,12 +319,6 @@ def _leg1_pairwise(
312
319
  return build_task_win("pairwise", 0.5, winrate)
313
320
 
314
321
 
315
- def _mini_score(gen: Callable[[str], str], benchmark: str) -> float:
316
- from soup_cli.eval.forgetting import ForgettingDetector
317
-
318
- return ForgettingDetector(generate_fn=gen, benchmark=benchmark).run_baseline()
319
-
320
-
321
322
  def _extract_lm_score(bench_data: Mapping[str, object]) -> Optional[float]:
322
323
  """Pull a single accuracy metric from an lm-eval per-task result block."""
323
324
  for key in ("acc,none", "acc_norm,none", "exact_match,none", "em,none"):
@@ -399,24 +400,26 @@ def _leg2_scores(
399
400
  ) -> Tuple[Dict[str, object], Dict[str, object]]:
400
401
  """Compute leg-2 ``(base_scores, tuned_scores)`` maps over the general suite.
401
402
 
402
- Mini-benchmark names run live via ForgettingDetector; any other names route
403
- through the lm-eval override. ``baseline_scores`` supplies base scores
404
- directly (skipping the base run) for any name it covers.
403
+ Bundled suite names (v0.71.38 the MCQ/arithmetic *and* the behavioural
404
+ tool-call / JSON-format / safety suites) are scored offline via
405
+ ``gate_suites.score_bundled_suite``; any other name routes through the
406
+ lm-eval override. ``baseline_scores`` supplies base scores directly
407
+ (skipping the base run) for any name it covers.
405
408
  """
406
- from soup_cli.eval.forgetting import MINI_BENCHMARKS
409
+ from soup_cli.eval.gate_suites import is_bundled_suite, score_bundled_suite
407
410
 
408
- mini_names = [n for n in suite_names if n in MINI_BENCHMARKS]
409
- other_names = [n for n in suite_names if n not in MINI_BENCHMARKS]
411
+ bundled_names = [n for n in suite_names if is_bundled_suite(n)]
412
+ other_names = [n for n in suite_names if not is_bundled_suite(n)]
410
413
 
411
414
  base_map: Dict[str, object] = {}
412
415
  tuned_map: Dict[str, object] = {}
413
416
 
414
- for name in mini_names:
415
- tuned_map[name] = _mini_score(tuned_gen, name)
417
+ for name in bundled_names:
418
+ tuned_map[name] = score_bundled_suite(name, tuned_gen)
416
419
  if name in baseline_scores:
417
420
  base_map[name] = float(baseline_scores[name])
418
421
  else:
419
- base_map[name] = _mini_score(base_gen, name)
422
+ base_map[name] = score_bundled_suite(name, base_gen)
420
423
 
421
424
  if other_names:
422
425
  lm_base, lm_tuned = _lm_eval_leg2(
@@ -439,10 +442,10 @@ def _leg2_scores(
439
442
 
440
443
 
441
444
  def _parse_suite(general_suite: Optional[str]) -> List[str]:
442
- from soup_cli.eval.forgetting import MINI_BENCHMARKS
445
+ from soup_cli.eval.gate_suites import DEFAULT_GENERAL_SUITE
443
446
 
444
447
  if not general_suite:
445
- return list(MINI_BENCHMARKS.keys())
448
+ return list(DEFAULT_GENERAL_SUITE)
446
449
  names = [chunk.strip() for chunk in general_suite.split(",")]
447
450
  return [name for name in names if name]
448
451
 
@@ -462,32 +465,32 @@ def _verdict_live(
462
465
  ) -> ShipVerdict:
463
466
  """Run a live verdict — validate flags (exit 2), then evaluate (exit 1)."""
464
467
  if not base:
465
- _fail("live run needs --base <model>", 2)
468
+ _fail("live run needs --base <model>", _EXIT_USAGE)
466
469
  if adapter and tuned:
467
- _fail("pass --adapter OR --tuned, not both", 2)
470
+ _fail("pass --adapter OR --tuned, not both", _EXIT_USAGE)
468
471
  if not adapter and not tuned:
469
- _fail("live run needs --tuned <model> or --adapter <adapter-path>", 2)
472
+ _fail("live run needs --tuned <model> or --adapter <adapter-path>", _EXIT_USAGE)
470
473
  if not task_eval:
471
- _fail("live run needs --task-eval <tasks.jsonl> for the leg-1 task win", 2)
474
+ _fail("live run needs --task-eval <tasks.jsonl> for the leg-1 task win", _EXIT_USAGE)
472
475
  try:
473
476
  enforce_under_cwd_and_no_symlink(task_eval, "--task-eval path")
474
477
  except (ValueError, TypeError) as exc:
475
- _fail(str(exc), 2)
478
+ _fail(str(exc), _EXIT_USAGE)
476
479
 
477
480
  suite_names = _parse_suite(general_suite)
478
481
  if not suite_names:
479
- _fail("--general-suite resolved to no benchmarks", 2)
482
+ _fail("--general-suite resolved to no benchmarks", _EXIT_USAGE)
480
483
  if len(suite_names) > _MAX_SUITE_BENCHMARKS:
481
484
  _fail(
482
485
  f"--general-suite has too many benchmarks (max {_MAX_SUITE_BENCHMARKS})",
483
- 2,
486
+ _EXIT_USAGE,
484
487
  )
485
488
  for _name in suite_names:
486
489
  if "\x00" in _name or len(_name) > _MAX_BENCHMARK_NAME_CHARS:
487
490
  _fail(
488
491
  "--general-suite names must be null-free and "
489
492
  f"< {_MAX_BENCHMARK_NAME_CHARS} chars",
490
- 2,
493
+ _EXIT_USAGE,
491
494
  )
492
495
 
493
496
  # Resolve --baseline up front so a bad spec (outside cwd / missing file /
@@ -499,19 +502,19 @@ def _verdict_live(
499
502
  try:
500
503
  baseline_scores = resolve_baseline(baseline_spec)
501
504
  except (ValueError, FileNotFoundError, OSError) as exc:
502
- _fail(f"--baseline: {exc}", 2)
505
+ _fail(f"--baseline: {exc}", _EXIT_USAGE)
503
506
 
504
507
  tuned_id = tuned if tuned else base
505
508
  try:
506
509
  base_gen, tuned_gen = _resolve_generators(base, tuned, adapter, device)
507
510
  if task_mode == "judge_score":
508
511
  if not judge_model:
509
- _fail("--task-mode judge_score needs --judge-model <url>", 2)
512
+ _fail("--task-mode judge_score needs --judge-model <url>", _EXIT_USAGE)
510
513
  _validate_judge_model_url(judge_model)
511
514
  task_win = _leg1_judge(base_gen, tuned_gen, task_eval, judge_model)
512
515
  elif task_mode == "pairwise":
513
516
  if not judge_model:
514
- _fail("--task-mode pairwise needs --judge-model <url>", 2)
517
+ _fail("--task-mode pairwise needs --judge-model <url>", _EXIT_USAGE)
515
518
  _validate_judge_model_url(judge_model)
516
519
  task_win = _leg1_pairwise(base_gen, tuned_gen, task_eval, judge_model)
517
520
  else:
@@ -532,10 +535,10 @@ def _verdict_live(
532
535
  return decide_ship(task_win, deltas, forgetting_threshold=forgetting_threshold)
533
536
  except typer.Exit:
534
537
  # typer.Exit subclasses RuntimeError — re-raise so in-try _fail() usage
535
- # errors (exit 2) keep their code instead of being re-coded as exit 1.
538
+ # errors (exit 3) keep their code instead of being re-coded as exit 1.
536
539
  raise
537
540
  except (ValueError, TypeError, OSError, RuntimeError, ImportError) as exc:
538
- _fail(f"live ship verdict failed: {type(exc).__name__}: {exc}", 1)
541
+ _fail(f"live ship verdict failed: {type(exc).__name__}: {exc}", _EXIT_RUNTIME)
539
542
 
540
543
 
541
544
  # ---------------------------------------------------------------------------
@@ -551,9 +554,9 @@ def _emit_and_exit(verdict: ShipVerdict, output: Optional[str]) -> None:
551
554
  )
552
555
  console.print(f"[green]Wrote[/] {escape(output)}")
553
556
  except (OSError, ValueError, TypeError) as exc:
554
- _fail(f"cannot write --output: {type(exc).__name__}: {exc}", 1)
557
+ _fail(f"cannot write --output: {type(exc).__name__}: {exc}", _EXIT_RUNTIME)
555
558
  if verdict.decision != DECISION_SHIP:
556
- raise typer.Exit(code=2)
559
+ raise typer.Exit(code=_EXIT_DONT_SHIP)
557
560
 
558
561
 
559
562
  # ---------------------------------------------------------------------------
@@ -580,18 +583,23 @@ def ship(
580
583
  help="Leg-1 mode: metric | judge_score | pairwise (judge win-rate).",
581
584
  ),
582
585
  judge_model: Optional[str] = typer.Option(
583
- None, "--judge-model", help="Judge model URL for --task-mode judge_score."
586
+ None,
587
+ "--judge-model",
588
+ help="Judge model URL for --task-mode judge_score or pairwise.",
584
589
  ),
585
590
  general_suite: Optional[str] = typer.Option(
586
591
  None,
587
592
  "--general-suite",
588
- help="Comma list of leg-2 benchmarks (default: the 3 mini benchmarks; "
589
- "non-mini names route through lm-eval).",
593
+ help="Comma list of leg-2 benchmarks (default: the bundled offline suite "
594
+ "— MCQ/arithmetic + tool-call/JSON/safety; non-bundled names route "
595
+ "through lm-eval).",
590
596
  ),
591
597
  baseline: Optional[str] = typer.Option(
592
598
  None,
593
599
  "--baseline",
594
- help="registry://<id> or JSON file of base leg-2 scores (skips base run).",
600
+ help="registry://<id> or JSON file of base leg-2 scores (skips base run). "
601
+ "Recompute baselines captured before v0.71.38 — the leg-2 scorer changed, "
602
+ "so an old baseline is not comparable to a freshly-scored tuned model.",
595
603
  ),
596
604
  forgetting_threshold: float = typer.Option(
597
605
  DEFAULT_FORGETTING_THRESHOLD,
@@ -631,7 +639,7 @@ def ship(
631
639
  _fail(
632
640
  "provide --evidence <json> for an offline verdict, or "
633
641
  "--base + (--tuned|--adapter) + --task-eval for a live run",
634
- 2,
642
+ _EXIT_USAGE,
635
643
  )
636
644
 
637
645
  _emit_and_exit(verdict, output)