cmpnd 0.41.0__tar.gz → 0.42.0__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 (370) hide show
  1. {cmpnd-0.41.0 → cmpnd-0.42.0}/PKG-INFO +4 -6
  2. {cmpnd-0.41.0 → cmpnd-0.42.0}/cmpnd/cli/commands/top.py +1 -2
  3. {cmpnd-0.41.0 → cmpnd-0.42.0}/cmpnd/cli/shell.py +1 -1
  4. {cmpnd-0.41.0 → cmpnd-0.42.0}/cmpnd/cli/trace_render.py +2 -2
  5. {cmpnd-0.41.0 → cmpnd-0.42.0}/cmpnd/packaging.py +2 -2
  6. {cmpnd-0.41.0 → cmpnd-0.42.0}/docs/sdk-instrumentation.md +1 -1
  7. {cmpnd-0.41.0 → cmpnd-0.42.0}/ingest/pyproject.toml +1 -1
  8. {cmpnd-0.41.0 → cmpnd-0.42.0}/pyproject.toml +10 -18
  9. {cmpnd-0.41.0 → cmpnd-0.42.0}/scripts/require_version_bump.py +2 -11
  10. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/integration/test_unhappy_path.py +1 -2
  11. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/stress/_readiness.py +1 -1
  12. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/test_cli/test_traces_search_wire.py +2 -4
  13. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/test_require_version_bump.py +0 -7
  14. {cmpnd-0.41.0 → cmpnd-0.42.0}/uv.lock +464 -925
  15. {cmpnd-0.41.0 → cmpnd-0.42.0}/.gitignore +0 -0
  16. {cmpnd-0.41.0 → cmpnd-0.42.0}/AGENTS.md +0 -0
  17. {cmpnd-0.41.0 → cmpnd-0.42.0}/CLAUDE.md +0 -0
  18. {cmpnd-0.41.0 → cmpnd-0.42.0}/README.md +0 -0
  19. {cmpnd-0.41.0 → cmpnd-0.42.0}/cmpnd/__init__.py +0 -0
  20. {cmpnd-0.41.0 → cmpnd-0.42.0}/cmpnd/_assessments.py +0 -0
  21. {cmpnd-0.41.0 → cmpnd-0.42.0}/cmpnd/_authored_import.py +0 -0
  22. {cmpnd-0.41.0 → cmpnd-0.42.0}/cmpnd/_deployments.py +0 -0
  23. {cmpnd-0.41.0 → cmpnd-0.42.0}/cmpnd/_exporter_pool.py +0 -0
  24. {cmpnd-0.41.0 → cmpnd-0.42.0}/cmpnd/_gepa_patch.py +0 -0
  25. {cmpnd-0.41.0 → cmpnd-0.42.0}/cmpnd/_http.py +0 -0
  26. {cmpnd-0.41.0 → cmpnd-0.42.0}/cmpnd/_program_patch.py +0 -0
  27. {cmpnd-0.41.0 → cmpnd-0.42.0}/cmpnd/_rlm_patch.py +0 -0
  28. {cmpnd-0.41.0 → cmpnd-0.42.0}/cmpnd/_runtime_tools.py +0 -0
  29. {cmpnd-0.41.0 → cmpnd-0.42.0}/cmpnd/_timespec.py +0 -0
  30. {cmpnd-0.41.0 → cmpnd-0.42.0}/cmpnd/_traces.py +0 -0
  31. {cmpnd-0.41.0 → cmpnd-0.42.0}/cmpnd/_valsets.py +0 -0
  32. {cmpnd-0.41.0 → cmpnd-0.42.0}/cmpnd/authored.py +0 -0
  33. {cmpnd-0.41.0 → cmpnd-0.42.0}/cmpnd/callback.py +0 -0
  34. {cmpnd-0.41.0 → cmpnd-0.42.0}/cmpnd/cli/__init__.py +0 -0
  35. {cmpnd-0.41.0 → cmpnd-0.42.0}/cmpnd/cli/api_client.py +0 -0
  36. {cmpnd-0.41.0 → cmpnd-0.42.0}/cmpnd/cli/commands/__init__.py +0 -0
  37. {cmpnd-0.41.0 → cmpnd-0.42.0}/cmpnd/cli/commands/admin.py +0 -0
  38. {cmpnd-0.41.0 → cmpnd-0.42.0}/cmpnd/cli/commands/assessments.py +0 -0
  39. {cmpnd-0.41.0 → cmpnd-0.42.0}/cmpnd/cli/commands/auth.py +0 -0
  40. {cmpnd-0.41.0 → cmpnd-0.42.0}/cmpnd/cli/commands/datasets.py +0 -0
  41. {cmpnd-0.41.0 → cmpnd-0.42.0}/cmpnd/cli/commands/deployments.py +0 -0
  42. {cmpnd-0.41.0 → cmpnd-0.42.0}/cmpnd/cli/commands/evals.py +0 -0
  43. {cmpnd-0.41.0 → cmpnd-0.42.0}/cmpnd/cli/commands/login.py +0 -0
  44. {cmpnd-0.41.0 → cmpnd-0.42.0}/cmpnd/cli/commands/optimizations.py +0 -0
  45. {cmpnd-0.41.0 → cmpnd-0.42.0}/cmpnd/cli/commands/org.py +0 -0
  46. {cmpnd-0.41.0 → cmpnd-0.42.0}/cmpnd/cli/commands/programs.py +0 -0
  47. {cmpnd-0.41.0 → cmpnd-0.42.0}/cmpnd/cli/commands/provider_credentials.py +0 -0
  48. {cmpnd-0.41.0 → cmpnd-0.42.0}/cmpnd/cli/commands/signatures.py +0 -0
  49. {cmpnd-0.41.0 → cmpnd-0.42.0}/cmpnd/cli/commands/tool_servers.py +0 -0
  50. {cmpnd-0.41.0 → cmpnd-0.42.0}/cmpnd/cli/commands/traces.py +0 -0
  51. {cmpnd-0.41.0 → cmpnd-0.42.0}/cmpnd/cli/commands/valsets.py +0 -0
  52. {cmpnd-0.41.0 → cmpnd-0.42.0}/cmpnd/cli/credentials.py +0 -0
  53. {cmpnd-0.41.0 → cmpnd-0.42.0}/cmpnd/cli/deprecation.py +0 -0
  54. {cmpnd-0.41.0 → cmpnd-0.42.0}/cmpnd/cli/pagination.py +0 -0
  55. {cmpnd-0.41.0 → cmpnd-0.42.0}/cmpnd/cli/tree_help.py +0 -0
  56. {cmpnd-0.41.0 → cmpnd-0.42.0}/cmpnd/cli/verbs.py +0 -0
  57. {cmpnd-0.41.0 → cmpnd-0.42.0}/cmpnd/client.py +0 -0
  58. {cmpnd-0.41.0 → cmpnd-0.42.0}/cmpnd/configuration.py +0 -0
  59. {cmpnd-0.41.0 → cmpnd-0.42.0}/cmpnd/context.py +0 -0
  60. {cmpnd-0.41.0 → cmpnd-0.42.0}/cmpnd/dataset_sync.py +0 -0
  61. {cmpnd-0.41.0 → cmpnd-0.42.0}/cmpnd/datasets.py +0 -0
  62. {cmpnd-0.41.0 → cmpnd-0.42.0}/cmpnd/decorators.py +0 -0
  63. {cmpnd-0.41.0 → cmpnd-0.42.0}/cmpnd/deployment.py +0 -0
  64. {cmpnd-0.41.0 → cmpnd-0.42.0}/cmpnd/deployment_metadata.py +0 -0
  65. {cmpnd-0.41.0 → cmpnd-0.42.0}/cmpnd/deployment_runs.py +0 -0
  66. {cmpnd-0.41.0 → cmpnd-0.42.0}/cmpnd/eval_handler.py +0 -0
  67. {cmpnd-0.41.0 → cmpnd-0.42.0}/cmpnd/execution.py +0 -0
  68. {cmpnd-0.41.0 → cmpnd-0.42.0}/cmpnd/exporter.py +0 -0
  69. {cmpnd-0.41.0 → cmpnd-0.42.0}/cmpnd/exporter_http.py +0 -0
  70. {cmpnd-0.41.0 → cmpnd-0.42.0}/cmpnd/helpers.py +0 -0
  71. {cmpnd-0.41.0 → cmpnd-0.42.0}/cmpnd/identity.py +0 -0
  72. {cmpnd-0.41.0 → cmpnd-0.42.0}/cmpnd/imaging.py +0 -0
  73. {cmpnd-0.41.0 → cmpnd-0.42.0}/cmpnd/ir/__init__.py +0 -0
  74. {cmpnd-0.41.0 → cmpnd-0.42.0}/cmpnd/ir/decode.py +0 -0
  75. {cmpnd-0.41.0 → cmpnd-0.42.0}/cmpnd/ir/encode.py +0 -0
  76. {cmpnd-0.41.0 → cmpnd-0.42.0}/cmpnd/ir/hash.py +0 -0
  77. {cmpnd-0.41.0 → cmpnd-0.42.0}/cmpnd/ir/program.py +0 -0
  78. {cmpnd-0.41.0 → cmpnd-0.42.0}/cmpnd/ir/reflection.py +0 -0
  79. {cmpnd-0.41.0 → cmpnd-0.42.0}/cmpnd/ir/types.py +0 -0
  80. {cmpnd-0.41.0 → cmpnd-0.42.0}/cmpnd/ir/xxh64.py +0 -0
  81. {cmpnd-0.41.0 → cmpnd-0.42.0}/cmpnd/lm_configuration.py +0 -0
  82. {cmpnd-0.41.0 → cmpnd-0.42.0}/cmpnd/mcp_servers.py +0 -0
  83. {cmpnd-0.41.0 → cmpnd-0.42.0}/cmpnd/models.py +0 -0
  84. {cmpnd-0.41.0 → cmpnd-0.42.0}/cmpnd/optimization.py +0 -0
  85. {cmpnd-0.41.0 → cmpnd-0.42.0}/cmpnd/optimizers/__init__.py +0 -0
  86. {cmpnd-0.41.0 → cmpnd-0.42.0}/cmpnd/optimizers/gepa.py +0 -0
  87. {cmpnd-0.41.0 → cmpnd-0.42.0}/cmpnd/optimizers/gepa_callback.py +0 -0
  88. {cmpnd-0.41.0 → cmpnd-0.42.0}/cmpnd/optimizers/resume.py +0 -0
  89. {cmpnd-0.41.0 → cmpnd-0.42.0}/cmpnd/optimizers/tracker.py +0 -0
  90. {cmpnd-0.41.0 → cmpnd-0.42.0}/cmpnd/programs.py +0 -0
  91. {cmpnd-0.41.0 → cmpnd-0.42.0}/cmpnd/references.py +0 -0
  92. {cmpnd-0.41.0 → cmpnd-0.42.0}/cmpnd/retry.py +0 -0
  93. {cmpnd-0.41.0 → cmpnd-0.42.0}/cmpnd/traces.py +0 -0
  94. {cmpnd-0.41.0 → cmpnd-0.42.0}/docs/2026-04-02-code-review.md +0 -0
  95. {cmpnd-0.41.0 → cmpnd-0.42.0}/docs/cli.md +0 -0
  96. {cmpnd-0.41.0 → cmpnd-0.42.0}/docs/client.md +0 -0
  97. {cmpnd-0.41.0 → cmpnd-0.42.0}/docs/custom-proposer.md +0 -0
  98. {cmpnd-0.41.0 → cmpnd-0.42.0}/docs/plans/2026-04-05-train-val-dataset-capture-design.md +0 -0
  99. {cmpnd-0.41.0 → cmpnd-0.42.0}/docs/plans/2026-04-05-train-val-dataset-capture.md +0 -0
  100. {cmpnd-0.41.0 → cmpnd-0.42.0}/docs/reading-traces.md +0 -0
  101. {cmpnd-0.41.0 → cmpnd-0.42.0}/examples/generalizing_proposer.py +0 -0
  102. {cmpnd-0.41.0 → cmpnd-0.42.0}/examples/local_ollama.py +0 -0
  103. {cmpnd-0.41.0 → cmpnd-0.42.0}/ingest/LINEAGE.md +0 -0
  104. {cmpnd-0.41.0 → cmpnd-0.42.0}/ingest/README.md +0 -0
  105. {cmpnd-0.41.0 → cmpnd-0.42.0}/ingest/cmpnd_ingest/__init__.py +0 -0
  106. {cmpnd-0.41.0 → cmpnd-0.42.0}/ingest/cmpnd_ingest/bodies.py +0 -0
  107. {cmpnd-0.41.0 → cmpnd-0.42.0}/ingest/cmpnd_ingest/exporter_http.py +0 -0
  108. {cmpnd-0.41.0 → cmpnd-0.42.0}/ingest/cmpnd_ingest/protocols.py +0 -0
  109. {cmpnd-0.41.0 → cmpnd-0.42.0}/ingest/cmpnd_ingest/py.typed +0 -0
  110. {cmpnd-0.41.0 → cmpnd-0.42.0}/ingest/cmpnd_ingest/request_log.py +0 -0
  111. {cmpnd-0.41.0 → cmpnd-0.42.0}/ingest/cmpnd_ingest/retry.py +0 -0
  112. {cmpnd-0.41.0 → cmpnd-0.42.0}/ingest/cmpnd_ingest/trace_facts.py +0 -0
  113. {cmpnd-0.41.0 → cmpnd-0.42.0}/scripts/audit-sdist.sh +0 -0
  114. {cmpnd-0.41.0 → cmpnd-0.42.0}/scripts/capture_review_run.py +0 -0
  115. {cmpnd-0.41.0 → cmpnd-0.42.0}/scripts/check-pip-install.sh +0 -0
  116. {cmpnd-0.41.0 → cmpnd-0.42.0}/scripts/check_release_artifacts.py +0 -0
  117. {cmpnd-0.41.0 → cmpnd-0.42.0}/scripts/fixtures/review_run.json.gz +0 -0
  118. {cmpnd-0.41.0 → cmpnd-0.42.0}/scripts/gepa_resume_bug.py +0 -0
  119. {cmpnd-0.41.0 → cmpnd-0.42.0}/scripts/release-stress.sh +0 -0
  120. {cmpnd-0.41.0 → cmpnd-0.42.0}/scripts/seed_review_run.py +0 -0
  121. {cmpnd-0.41.0 → cmpnd-0.42.0}/scripts/test-in-linux.sh +0 -0
  122. {cmpnd-0.41.0 → cmpnd-0.42.0}/stubs/dspy/__init__.pyi +0 -0
  123. {cmpnd-0.41.0 → cmpnd-0.42.0}/stubs/dspy/primitives/__init__.pyi +0 -0
  124. {cmpnd-0.41.0 → cmpnd-0.42.0}/stubs/dspy/primitives/prediction.pyi +0 -0
  125. {cmpnd-0.41.0 → cmpnd-0.42.0}/stubs/dspy/utils/__init__.pyi +0 -0
  126. {cmpnd-0.41.0 → cmpnd-0.42.0}/stubs/dspy/utils/callback.pyi +0 -0
  127. {cmpnd-0.41.0 → cmpnd-0.42.0}/stubs/dspy/utils/dummies.pyi +0 -0
  128. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/__init__.py +0 -0
  129. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/_deployment_signature_helpers.py +0 -0
  130. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/_exporter_helpers.py +0 -0
  131. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/_fake_clock.py +0 -0
  132. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/_identity_helpers.py +0 -0
  133. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/_resolve_refs.py +0 -0
  134. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/_traced_run.py +0 -0
  135. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/conftest.py +0 -0
  136. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/e2e/__init__.py +0 -0
  137. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/e2e/committee_task.py +0 -0
  138. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/e2e/conftest.py +0 -0
  139. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/e2e/data/committee_train.ndjson.gz +0 -0
  140. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/e2e/data/committee_val.ndjson.gz +0 -0
  141. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/e2e/fake_lm.py +0 -0
  142. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/e2e/helpers.py +0 -0
  143. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/e2e/target_capabilities.py +0 -0
  144. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/e2e/test_assessments_cli.py +0 -0
  145. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/e2e/test_capture_prompts.py +0 -0
  146. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/e2e/test_composite_module.py +0 -0
  147. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/e2e/test_dataset_auto_creation.py +0 -0
  148. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/e2e/test_deploy_execute.py +0 -0
  149. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/e2e/test_deploy_pandas.py +0 -0
  150. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/e2e/test_deploy_programs.py +0 -0
  151. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/e2e/test_edge_cases.py +0 -0
  152. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/e2e/test_example_hash.py +0 -0
  153. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/e2e/test_gepa_optimization.py +0 -0
  154. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/e2e/test_interpreter_spans.py +0 -0
  155. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/e2e/test_lm_accuracy.py +0 -0
  156. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/e2e/test_module_tracing.py +0 -0
  157. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/e2e/test_optimization_lineage.py +0 -0
  158. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/e2e/test_optimization_metric_identity.py +0 -0
  159. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/e2e/test_optimize_failures.py +0 -0
  160. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/e2e/test_optimize_loop.py +0 -0
  161. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/e2e/test_optimize_review_committee.py +0 -0
  162. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/e2e/test_optimize_server_owned_completion.py +0 -0
  163. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/e2e/test_parallel_export.py +0 -0
  164. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/e2e/test_project_attribution.py +0 -0
  165. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/e2e/test_react_tool_spans.py +0 -0
  166. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/e2e/test_save_load.py +0 -0
  167. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/e2e/test_trace_structure.py +0 -0
  168. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/e2e/test_traces_read.py +0 -0
  169. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/e2e/test_user_attribution.py +0 -0
  170. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/e2e/test_valsets_cli.py +0 -0
  171. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/identity_vectors/01_predict_qa.json +0 -0
  172. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/identity_vectors/02_predict_renamed_field.json +0 -0
  173. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/identity_vectors/03_chain_of_thought_qa.json +0 -0
  174. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/identity_vectors/04_predict_richer_types.json +0 -0
  175. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/identity_vectors/05_composite_two_predicts.json +0 -0
  176. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/identity_vectors/06_multichaincomparison.json +0 -0
  177. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/identity_vectors/07_program_of_thought.json +0 -0
  178. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/identity_vectors/08_opaque_module.json +0 -0
  179. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/identity_vectors/09_predict_pydantic_field.json +0 -0
  180. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/identity_vectors/10_react.json +0 -0
  181. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/identity_vectors/11_refine.json +0 -0
  182. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/identity_vectors/12_retrieve.json +0 -0
  183. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/identity_vectors/13_knn.json +0 -0
  184. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/identity_vectors/14_parallel.json +0 -0
  185. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/identity_vectors/README.md +0 -0
  186. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/ingest_conformance.py +0 -0
  187. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/integration/__init__.py +0 -0
  188. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/integration/authored_optimize/judge.py +0 -0
  189. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/integration/authored_optimize/optimize_hosted.py +0 -0
  190. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/integration/conftest.py +0 -0
  191. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/integration/hosted_mcp_tool_optimize_probe.py +0 -0
  192. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/integration/hosted_optimize_probe.py +0 -0
  193. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/integration/optimization_run_probe.py +0 -0
  194. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/integration/test_cli_deploy_smoketest.py +0 -0
  195. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/integration/test_logs_renders_traces.py +0 -0
  196. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/integration/test_optimization_run.py +0 -0
  197. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/integration/test_optimizing_progress.py +0 -0
  198. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/load/__init__.py +0 -0
  199. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/load/__main__.py +0 -0
  200. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/load/drain.py +0 -0
  201. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/load/ingest.py +0 -0
  202. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/load/latency_transport.py +0 -0
  203. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/load/rlm_shape.py +0 -0
  204. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/load/rlm_size_report.py +0 -0
  205. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/load/sweep.py +0 -0
  206. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/load/test_rlm_shape.py +0 -0
  207. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/load/test_rlm_size_report.py +0 -0
  208. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/parity/__init__.py +0 -0
  209. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/parity/conftest.py +0 -0
  210. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/parity/seed_parity.py +0 -0
  211. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/parity/test_auth.py +0 -0
  212. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/parity/test_datasets.py +0 -0
  213. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/parity/test_deployments.py +0 -0
  214. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/parity/test_evals.py +0 -0
  215. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/parity/test_health.py +0 -0
  216. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/parity/test_modules.py +0 -0
  217. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/parity/test_optimizations.py +0 -0
  218. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/parity/test_programs.py +0 -0
  219. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/parity/test_signatures.py +0 -0
  220. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/parity/test_trace_streaming.py +0 -0
  221. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/parity/test_traces.py +0 -0
  222. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/span_reference_fixture.py +0 -0
  223. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/stress/__init__.py +0 -0
  224. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/stress/_provider.py +0 -0
  225. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/stress/_reliability.py +0 -0
  226. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/stress/_result.py +0 -0
  227. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/stress/mint_bedrock_token.py +0 -0
  228. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/stress/test_deploy_programs.py +0 -0
  229. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/stress/test_multi_client_stress.py +0 -0
  230. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/stress/test_optimize_client_committee.py +0 -0
  231. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/stress/test_optimize_loop.py +0 -0
  232. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/stress/test_optimize_loop_wasm.py +0 -0
  233. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/stress/test_optimize_stress.py +0 -0
  234. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/stress/test_provider_roles.py +0 -0
  235. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/stress/test_readiness.py +0 -0
  236. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/stress/test_real_provider_twins.py +0 -0
  237. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/stress/test_reliability.py +0 -0
  238. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/stress/test_reliability_classify.py +0 -0
  239. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/stress/test_rlm_wasm.py +0 -0
  240. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/stress/test_trace_search.py +0 -0
  241. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/test_adapter_reentrancy.py +0 -0
  242. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/test_assessments_api.py +0 -0
  243. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/test_authored.py +0 -0
  244. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/test_authored_bundle_collisions.py +0 -0
  245. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/test_authored_metric_contract.py +0 -0
  246. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/test_authored_named_models.py +0 -0
  247. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/test_authored_optimize.py +0 -0
  248. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/test_callback.py +0 -0
  249. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/test_candidate_lineage.py +0 -0
  250. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/test_cli/__init__.py +0 -0
  251. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/test_cli/conftest.py +0 -0
  252. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/test_cli/test_admin.py +0 -0
  253. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/test_cli/test_api_client.py +0 -0
  254. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/test_cli/test_assessments.py +0 -0
  255. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/test_cli/test_auth.py +0 -0
  256. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/test_cli/test_credentials.py +0 -0
  257. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/test_cli/test_datasets.py +0 -0
  258. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/test_cli/test_deployment_runs.py +0 -0
  259. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/test_cli/test_deployments.py +0 -0
  260. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/test_cli/test_evals.py +0 -0
  261. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/test_cli/test_login.py +0 -0
  262. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/test_cli/test_main.py +0 -0
  263. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/test_cli/test_optimizations.py +0 -0
  264. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/test_cli/test_org.py +0 -0
  265. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/test_cli/test_pagination.py +0 -0
  266. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/test_cli/test_parity.py +0 -0
  267. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/test_cli/test_programs.py +0 -0
  268. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/test_cli/test_provider_credentials.py +0 -0
  269. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/test_cli/test_schema_sample.py +0 -0
  270. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/test_cli/test_shell.py +0 -0
  271. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/test_cli/test_signatures.py +0 -0
  272. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/test_cli/test_tool_servers.py +0 -0
  273. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/test_cli/test_top.py +0 -0
  274. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/test_cli/test_traces.py +0 -0
  275. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/test_cli/test_tree_help.py +0 -0
  276. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/test_cli/test_valsets.py +0 -0
  277. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/test_client.py +0 -0
  278. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/test_clustering/__init__.py +0 -0
  279. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/test_clustering/conftest.py +0 -0
  280. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/test_clustering/test_edge_cases.py +0 -0
  281. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/test_clustering/test_hash_consistency.py +0 -0
  282. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/test_clustering/test_type_conversion.py +0 -0
  283. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/test_cmp551_grouping_identity.py +0 -0
  284. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/test_configuration.py +0 -0
  285. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/test_context.py +0 -0
  286. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/test_context_propagation.py +0 -0
  287. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/test_dataset_polling.py +0 -0
  288. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/test_dataset_sync.py +0 -0
  289. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/test_datasets.py +0 -0
  290. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/test_decorators.py +0 -0
  291. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/test_deploy.py +0 -0
  292. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/test_deploy_mcp_tool_references.py +0 -0
  293. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/test_deploy_program_id.py +0 -0
  294. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/test_deployment_metadata.py +0 -0
  295. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/test_deployment_runs.py +0 -0
  296. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/test_deployments_read.py +0 -0
  297. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/test_eval.py +0 -0
  298. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/test_eval_example_attribution.py +0 -0
  299. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/test_eval_start.py +0 -0
  300. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/test_eval_trace_grouping.py +0 -0
  301. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/test_exception_paths.py +0 -0
  302. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/test_execute.py +0 -0
  303. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/test_execute_run_identity.py +0 -0
  304. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/test_exporter.py +0 -0
  305. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/test_exporter_queue.py +0 -0
  306. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/test_exporter_real.py +0 -0
  307. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/test_fake_lm.py +0 -0
  308. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/test_gepa_callback.py +0 -0
  309. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/test_gepa_integration.py +0 -0
  310. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/test_gepa_output_normalization.py +0 -0
  311. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/test_gepa_resume.py +0 -0
  312. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/test_identity.py +0 -0
  313. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/test_imaging.py +0 -0
  314. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/test_import_weight.py +0 -0
  315. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/test_ingest_conformance.py +0 -0
  316. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/test_ingest_second_producer.py +0 -0
  317. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/test_integration.py +0 -0
  318. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/test_interpreter_callback.py +0 -0
  319. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/test_ir_encoder_properties.py +0 -0
  320. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/test_ir_golden_vectors.py +0 -0
  321. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/test_ir_roundtrip.py +0 -0
  322. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/test_lm15_native_calls.py +0 -0
  323. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/test_lm_configuration.py +0 -0
  324. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/test_lm_usage_shapes.py +0 -0
  325. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/test_mcp_tools.py +0 -0
  326. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/test_models.py +0 -0
  327. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/test_multi_client_stress_readiness.py +0 -0
  328. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/test_optimization_progress.py +0 -0
  329. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/test_optimization_start.py +0 -0
  330. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/test_optimize.py +0 -0
  331. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/test_optimize_budget.py +0 -0
  332. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/test_optimize_lift.py +0 -0
  333. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/test_optimize_lms.py +0 -0
  334. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/test_optimize_proposer.py +0 -0
  335. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/test_optimize_reflection_lm.py +0 -0
  336. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/test_optimize_terminal_failure.py +0 -0
  337. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/test_packaging.py +0 -0
  338. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/test_packaging_callable_source.py +0 -0
  339. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/test_packaging_mcp_tools.py +0 -0
  340. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/test_packaging_program_source.py +0 -0
  341. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/test_poll_until.py +0 -0
  342. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/test_program_identity.py +0 -0
  343. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/test_program_lineage_persist.py +0 -0
  344. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/test_programs_create.py +0 -0
  345. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/test_project_payload.py +0 -0
  346. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/test_real_provider_twins_readiness.py +0 -0
  347. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/test_reflector_properties.py +0 -0
  348. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/test_reflector_smoke.py +0 -0
  349. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/test_release_stress_script.py +0 -0
  350. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/test_repro_reactv2_bugs.py +0 -0
  351. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/test_retry.py +0 -0
  352. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/test_reversible_failures.py +0 -0
  353. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/test_rlm_patch.py +0 -0
  354. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/test_run_attribution_paths.py +0 -0
  355. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/test_runtime_tools.py +0 -0
  356. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/test_schemas.py +0 -0
  357. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/test_seed_review_run.py +0 -0
  358. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/test_signature_inputs.py +0 -0
  359. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/test_span_references.py +0 -0
  360. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/test_span_sent_once.py +0 -0
  361. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/test_trace_context_concurrency.py +0 -0
  362. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/test_trace_fact_wire_contract.py +0 -0
  363. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/test_trace_facts.py +0 -0
  364. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/test_trace_render.py +0 -0
  365. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/test_traces_read.py +0 -0
  366. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/test_tracked_gepa.py +0 -0
  367. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/test_tracker_enrich.py +0 -0
  368. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/test_truncation.py +0 -0
  369. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/test_valsets_api.py +0 -0
  370. {cmpnd-0.41.0 → cmpnd-0.42.0}/tests/test_xxh64.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: cmpnd
3
- Version: 0.41.0
3
+ Version: 0.42.0
4
4
  Summary: DSPy observability and deployment SDK for cmpnd
5
5
  Project-URL: Homepage, https://cmpnd.ai
6
6
  Author-email: cmpnd <hello@cmpnd.ai>
@@ -10,14 +10,13 @@ Classifier: Development Status :: 3 - Alpha
10
10
  Classifier: Intended Audience :: Developers
11
11
  Classifier: License :: OSI Approved :: MIT License
12
12
  Classifier: Programming Language :: Python :: 3
13
- Classifier: Programming Language :: Python :: 3.10
14
13
  Classifier: Programming Language :: Python :: 3.11
15
14
  Classifier: Programming Language :: Python :: 3.12
16
15
  Classifier: Programming Language :: Python :: 3.13
17
16
  Classifier: Programming Language :: Python :: 3.14
18
17
  Classifier: Programming Language :: Python :: 3.15
19
18
  Classifier: Topic :: Software Development :: Libraries :: Python Modules
20
- Requires-Python: >=3.10
19
+ Requires-Python: >=3.11
21
20
  Requires-Dist: dspy>=3.1.3
22
21
  Requires-Dist: httpx>=0.27.0
23
22
  Requires-Dist: ipython>=8.20
@@ -32,8 +31,7 @@ Requires-Dist: gepa; extra == 'dev'
32
31
  Requires-Dist: hypothesis>=6.100; extra == 'dev'
33
32
  Requires-Dist: jsonschema>=4.0; extra == 'dev'
34
33
  Requires-Dist: litellm; extra == 'dev'
35
- Requires-Dist: numpy>=1.26; (python_version < '3.11') and extra == 'dev'
36
- Requires-Dist: numpy>=2.3; (python_version >= '3.11') and extra == 'dev'
34
+ Requires-Dist: numpy>=2.3; extra == 'dev'
37
35
  Requires-Dist: pandas>=2.2; extra == 'dev'
38
36
  Requires-Dist: pillow>=10.0; extra == 'dev'
39
37
  Requires-Dist: pytest-asyncio>=0.23; extra == 'dev'
@@ -43,7 +41,7 @@ Requires-Dist: pytest>=8.0; extra == 'dev'
43
41
  Requires-Dist: ruff>=0.4.0; extra == 'dev'
44
42
  Requires-Dist: twine>=7.0; extra == 'dev'
45
43
  Provides-Extra: fake-provider
46
- Requires-Dist: cmpnd-fake-provider; (python_version >= '3.11') and extra == 'fake-provider'
44
+ Requires-Dist: cmpnd-fake-provider; extra == 'fake-provider'
47
45
  Provides-Extra: images
48
46
  Requires-Dist: pillow>=10.0; extra == 'images'
49
47
  Provides-Extra: mcp
@@ -83,8 +83,7 @@ def _parse_iso(ts: str | None) -> datetime | None:
83
83
  if not ts:
84
84
  return None
85
85
  try:
86
- # Rails serializes with "Z"; Python <3.11 parsed via fromisoformat needed +00:00
87
- return datetime.fromisoformat(ts.replace("Z", "+00:00"))
86
+ return datetime.fromisoformat(ts)
88
87
  except (ValueError, TypeError):
89
88
  return None
90
89
 
@@ -644,7 +644,7 @@ def _enable_readline(namespace: dict[str, Any]) -> None:
644
644
  def _launch_repl(namespace: dict[str, Any], banner: str) -> None:
645
645
  """Prefer IPython (Jedi completion, history, multi-line); fall back to stdlib."""
646
646
  try:
647
- from IPython import start_ipython # pyright: ignore[reportAttributeAccessIssue]
647
+ from IPython import start_ipython
648
648
  from traitlets.config import Config
649
649
  except ImportError:
650
650
  import code
@@ -194,8 +194,8 @@ _TS_RE = re.compile(r"^(\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2})(\.\d+)?(Z|[+-]\d{2}
194
194
 
195
195
  def _parse_ts(value: Any) -> datetime.datetime | None:
196
196
  """Parse an RFC3339 timestamp tolerantly. Server emits nanosecond (9-digit)
197
- fractions that datetime.fromisoformat rejects, so truncate the fraction to
198
- microseconds and normalize a trailing Z. Returns None on anything unparsable
197
+ fractions, so truncate the fraction to microseconds, the precision datetime
198
+ holds, and normalize a trailing Z. Returns None on anything unparsable
199
199
  — the caller degrades (offset 0) rather than crashing."""
200
200
  if not isinstance(value, str):
201
201
  return None
@@ -460,8 +460,8 @@ def _collect_inlined_base_imports(
460
460
  if typing_extensions.is_typeddict(ann_type):
461
461
  # A TypedDict subclass reports `dict` as its base — the name its source
462
462
  # actually spells survives only in the text. Use typing_extensions for
463
- # the bare spelling because Pydantic requires it on Python 3.10 and
464
- # 3.11. Import both modules to cover either qualified spelling.
463
+ # the bare spelling because Pydantic requires it on Python 3.11.
464
+ # Import both modules to cover either qualified spelling.
465
465
  imports.add(ImportEntry("typing_extensions", "TypedDict"))
466
466
  imports.add(ImportEntry("typing_extensions"))
467
467
  imports.add(ImportEntry("typing"))
@@ -444,7 +444,7 @@ base written inside a function belongs to no module's globals, so a bare name
444
444
  falls back to the runtime base at that position. A `TypedDict` subclass is the
445
445
  one base read off the class rather than the text, because it reports `dict`:
446
446
  `typing_extensions` supplies the name, which is what pydantic requires on Python
447
- 3.10 and 3.11.
447
+ 3.11.
448
448
 
449
449
  Two shapes refuse the package rather than deploying a program that raises
450
450
  `NameError` on its first call, which is well after deploy reported it ready:
@@ -11,7 +11,7 @@ description = "The cmpnd ingest transport: the HTTP client that pushes traces, o
11
11
  readme = "README.md"
12
12
  # `cmpnd`'s floor: these modules ship inside its wheel, so they must import on
13
13
  # every Python it supports.
14
- requires-python = ">=3.10"
14
+ requires-python = ">=3.11"
15
15
  license = {text = "MIT"}
16
16
  authors = [
17
17
  {name = "cmpnd", email = "hello@cmpnd.ai"}
@@ -5,10 +5,10 @@ name = "cmpnd"
5
5
  # it's new) — no git tags. Bump with `uv version --bump {minor,patch}` or by
6
6
  # hand. Runtime `cmpnd.__version__` reads installed metadata, so it tracks
7
7
  # this automatically. See docs/plans/2026-07-02-sdk-pypi-tag-free-publish.md.
8
- version = "0.41.0"
8
+ version = "0.42.0"
9
9
  description = "DSPy observability and deployment SDK for cmpnd"
10
10
  readme = "README.md"
11
- requires-python = ">=3.10"
11
+ requires-python = ">=3.11"
12
12
  license = {text = "MIT"}
13
13
  authors = [
14
14
  {name = "cmpnd", email = "hello@cmpnd.ai"}
@@ -19,7 +19,6 @@ classifiers = [
19
19
  "Intended Audience :: Developers",
20
20
  "License :: OSI Approved :: MIT License",
21
21
  "Programming Language :: Python :: 3",
22
- "Programming Language :: Python :: 3.10",
23
22
  "Programming Language :: Python :: 3.11",
24
23
  "Programming Language :: Python :: 3.12",
25
24
  "Programming Language :: Python :: 3.13",
@@ -47,7 +46,7 @@ dependencies = [
47
46
  "pydantic>=2.0",
48
47
  # Detects TypedDicts from both typing and typing_extensions, and supplies
49
48
  # the spelling Pydantic requires when generated programs run on Python
50
- # 3.10 or 3.11.
49
+ # 3.11.
51
50
  "typing-extensions>=4.1.0",
52
51
  # Still required, and still the fast path — but `cmpnd/ir/xxh64.py` no
53
52
  # longer *needs* it: it falls back to a pure-Python xxh64 that the tests
@@ -57,9 +56,8 @@ dependencies = [
57
56
  # install should have it.
58
57
  "xxhash>=3.0.0",
59
58
  # Powers the interactive `cmpnd` shell (Jedi completion, multi-line,
60
- # history search, syntax highlighting). No upper cap: pip/uv resolves
61
- # 8.x on Python 3.10 and 9.x on 3.11+. The shell falls back to stdlib
62
- # `code.interact` + rlcompleter if IPython somehow can't import.
59
+ # history search, syntax highlighting). No upper cap. The shell falls back
60
+ # to stdlib `code.interact` + rlcompleter if IPython somehow can't import.
63
61
  "ipython>=8.20",
64
62
  ]
65
63
 
@@ -108,10 +106,8 @@ dev = [
108
106
  # test_reflector_smoke.py builds numpy fixtures. dspy <=3.2.x required numpy
109
107
  # unconditionally so it rode in transitively; dspy 3.3.0 moved numpy behind a
110
108
  # `numpy` extra, so declare it directly as the test dependency it always was.
111
- # numpy 2.3 dropped Python 3.10 and is the first release with cp314 wheels. Split the
112
- # requirement so the >=3.10 lock keeps 2.2.x for 3.10 only and 3.11+ installs from wheels.
113
- "numpy>=1.26; python_version < '3.11'",
114
- "numpy>=2.3; python_version >= '3.11'",
109
+ # numpy 2.3 is the first release with cp314 wheels.
110
+ "numpy>=2.3",
115
111
  # tests/e2e/test_deploy_pandas.py deploys a program and a metric that import pandas,
116
112
  # because the worker's kernel ships it. The SDK reads a function's imports from the
117
113
  # live module before packaging it, so pandas has to be importable on the client.
@@ -131,12 +127,8 @@ dev = [
131
127
  # integration stack points programs at. Carried as an SDK extra so a single
132
128
  # `uv run --project python-sdk --extra fake-provider` brings up the SDK and the
133
129
  # provider together — no separate venv to forget about.
134
- #
135
- # It targets python >=3.11, so the marker is gated: without it, resolution for
136
- # the (3.10-supporting) SDK fails. The extra is dev-only and we always run it on
137
- # 3.11+ (bin/setup uses 3.11).
138
130
  fake-provider = [
139
- "cmpnd-fake-provider; python_version >= '3.11'",
131
+ "cmpnd-fake-provider",
140
132
  ]
141
133
 
142
134
  [tool.uv.sources]
@@ -231,7 +223,7 @@ markers = [
231
223
 
232
224
  [tool.ruff]
233
225
  line-length = 120
234
- target-version = "py310"
226
+ target-version = "py311"
235
227
 
236
228
  [tool.ruff.lint]
237
229
  select = ["E", "F", "I", "W"]
@@ -263,7 +255,7 @@ select = ["E", "F", "I", "W"]
263
255
  # no relaxations, so it gets no executionEnvironment of its own.
264
256
  include = ["cmpnd", "ingest/cmpnd_ingest", "examples", "tests/stress", "tests/e2e", "tests/load"]
265
257
  stubPath = "stubs"
266
- pythonVersion = "3.10"
258
+ pythonVersion = "3.11"
267
259
  reportAny = false
268
260
  reportExplicitAny = false
269
261
  reportUnknownMemberType = false
@@ -30,6 +30,7 @@ import hashlib
30
30
  import io
31
31
  import json
32
32
  import sys
33
+ import tomllib
33
34
  import urllib.error
34
35
  import urllib.request
35
36
  import zipfile
@@ -77,17 +78,7 @@ def wheel_sources(blob: bytes) -> dict[str, str]:
77
78
 
78
79
 
79
80
  def declared_version(pyproject: Path) -> str:
80
- """The version `[project]` names.
81
-
82
- tomllib is imported here, not at module scope, because the SDK supports
83
- Python >= 3.10 and tomllib arrived in 3.11: a developer on the floor version
84
- would otherwise get a bare ImportError on a script that has nothing to do
85
- with their interpreter. CI's sdk-lint runs 3.12.
86
- """
87
- if sys.version_info < (3, 11):
88
- raise SystemExit("this check needs Python >= 3.11 for tomllib; try `uv run --python 3.12` (CI uses 3.12)")
89
- import tomllib
90
-
81
+ """The version `[project]` names."""
91
82
  with pyproject.open("rb") as handle:
92
83
  return tomllib.load(handle)["project"]["version"]
93
84
 
@@ -93,8 +93,7 @@ def _malformed_zip() -> bytes:
93
93
  def _parse_iso(ts: str | None) -> datetime | None:
94
94
  if not ts:
95
95
  return None
96
- # Rails serializes timestamps with a trailing "Z" or "+00:00".
97
- return datetime.fromisoformat(ts.replace("Z", "+00:00"))
96
+ return datetime.fromisoformat(ts)
98
97
 
99
98
 
100
99
  # ---------------------------------------------------------------------------
@@ -116,7 +116,7 @@ def read_tolerating_timeout(
116
116
  "not published yet", so they must fail rather than be retried to the deadline.
117
117
  Every other exception still surfaces too, so a real HTTP error (which the
118
118
  callers raise as ``AssertionError``) still fails fast. ``socket.timeout`` is an
119
- alias of ``TimeoutError`` on Python 3.10+, so the checks cover it. Pair with
119
+ alias of ``TimeoutError``, so the checks cover it. Pair with
120
120
  ``wait_for_publication``'s ``read_timeout`` cap, which bounds how long each
121
121
  such request can block before it is retried.
122
122
  """
@@ -266,11 +266,9 @@ class TestRelativeWindowFlags:
266
266
  after = dt.datetime.now(dt.timezone.utc)
267
267
  emitted = mock_client.post.call_args[1]["json"]["start_time_from"]
268
268
  # The wire form is Z-suffixed UTC, which is what the route's parser
269
- # accepts. fromisoformat only learned to read that suffix in 3.11, and
270
- # the package supports 3.10 — so swap it for the offset it abbreviates,
271
- # as cmpnd/cli/commands/top.py does for the same reason.
269
+ # accepts.
272
270
  assert emitted.endswith("Z"), f"expected a Z-suffixed UTC timestamp, got {emitted!r}"
273
- sent = dt.datetime.fromisoformat(emitted.replace("Z", "+00:00"))
271
+ sent = dt.datetime.fromisoformat(emitted)
274
272
  assert before - delta - dt.timedelta(seconds=2) <= sent <= after - delta + dt.timedelta(seconds=2)
275
273
 
276
274
  def test_absolute_from_passes_through(self, mock_client):
@@ -8,7 +8,6 @@ from __future__ import annotations
8
8
 
9
9
  import importlib.util
10
10
  import io
11
- import sys
12
11
  import zipfile
13
12
  from pathlib import Path
14
13
 
@@ -64,12 +63,6 @@ class TestWheelSources:
64
63
  assert set(rvb.wheel_sources(blob)) == {"cmpnd/a.py", "cmpnd_ingest/b.py"}
65
64
 
66
65
 
67
- # Only this class reads pyproject.toml, and only tomllib can — which arrived in
68
- # 3.11 while this package still supports 3.10, so the sdk-test matrix runs these
69
- # on an interpreter the tool itself refuses. Scoped to the class rather than the
70
- # module so 3.10 still covers extraction, comparison and reporting, which are
71
- # where the logic lives. The tool runs on 3.12 in sdk-lint.
72
- @pytest.mark.skipif(sys.version_info < (3, 11), reason="the check needs tomllib (3.11+); sdk-lint runs 3.12")
73
66
  class TestCheck:
74
67
  def test_passes_when_the_version_is_new_to_pypi(self, tmp_path: Path):
75
68
  make_tree(tmp_path, "9.9.9", {"cmpnd/a.py": "x = 1"})