scientific-computing-system 2.2.0__tar.gz → 2.2.2__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 (435) hide show
  1. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/.github/workflows/cli-package-smoke.yml +8 -3
  2. scientific_computing_system-2.2.2/.github/workflows/npm-publish.yml +403 -0
  3. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/.github/workflows/release.yml +14 -0
  4. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/.github/workflows/tests.yml +60 -0
  5. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/CHANGELOG.md +403 -0
  6. scientific_computing_system-2.2.2/CITATION.cff +54 -0
  7. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/CONTRIBUTING.md +1 -1
  8. scientific_computing_system-2.2.2/PKG-INFO +316 -0
  9. scientific_computing_system-2.2.2/README.md +220 -0
  10. scientific_computing_system-2.2.2/SECURITY.md +182 -0
  11. scientific_computing_system-2.2.2/codemeta.json +28 -0
  12. scientific_computing_system-2.2.2/docs/ARCHITECTURE.md +375 -0
  13. scientific_computing_system-2.2.2/docs/api.md +350 -0
  14. scientific_computing_system-2.2.2/docs/benchmarks.md +177 -0
  15. scientific_computing_system-2.2.2/docs/checks/verify_provenance_claims.py +468 -0
  16. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/docs/cookbook.md +18 -3
  17. scientific_computing_system-2.2.2/docs/getting-started.md +260 -0
  18. scientific_computing_system-2.2.2/docs/index.md +153 -0
  19. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/docs/ml_reference.md +30 -11
  20. scientific_computing_system-2.2.2/docs/related.md +22 -0
  21. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/docs/research-workflows.md +41 -9
  22. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/docs/tutorials/core_demo.md +6 -2
  23. scientific_computing_system-2.2.2/docs/tutorials/data_analysis_demo.md +85 -0
  24. scientific_computing_system-2.2.2/docs/tutorials/diffeq_demo.md +66 -0
  25. scientific_computing_system-2.2.2/docs/tutorials/graph_demo.md +61 -0
  26. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/docs/tutorials/math_utils_demo.md +7 -3
  27. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/docs/tutorials/ml_advanced_demo.md +3 -1
  28. scientific_computing_system-2.2.2/docs/tutorials/montecarlo_demo.md +64 -0
  29. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/docs/tutorials/nlp_attention_demo.md +48 -14
  30. scientific_computing_system-2.2.2/docs/why-pure-python.md +67 -0
  31. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/mkdocs.yml +1 -0
  32. scientific_computing_system-2.2.2/npm.test.js +984 -0
  33. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/package.json +2 -3
  34. scientific_computing_system-2.2.2/paper.bib +20 -0
  35. scientific_computing_system-2.2.2/paper.md +55 -0
  36. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/pyproject.toml +12 -1
  37. scientific_computing_system-2.2.2/requirements-build.lock +491 -0
  38. scientific_computing_system-2.2.2/scripts/check_release_toolchain.py +551 -0
  39. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/scripts/check_version_lockstep.py +26 -0
  40. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/scripts/verify_release_integrity.py +29 -1
  41. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/src/cds/_version.py +1 -1
  42. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/src/cds/cli/__init__.py +11 -1
  43. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/src/cds/cli/_parser.py +0 -4
  44. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/src/cds/ml/model_selection.py +12 -4
  45. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/src/cds/ml/voting.py +8 -2
  46. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/src/cds/tools/adapters.py +18 -6
  47. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/src/cds/tools/registry.py +3 -4
  48. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/tests/test_bootstrap.py +2 -2
  49. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/tests/test_cli.py +28 -0
  50. scientific_computing_system-2.2.2/tests/test_codemeta_version_lockstep.py +239 -0
  51. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/tests/test_fitting_bootstrap.py +10 -11
  52. scientific_computing_system-2.2.2/tests/test_protocol_placeholders.py +204 -0
  53. scientific_computing_system-2.2.2/tests/test_provenance_claims.py +384 -0
  54. scientific_computing_system-2.2.2/tests/test_readme_surface.py +142 -0
  55. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/tests/test_release_contract.py +17 -1
  56. scientific_computing_system-2.2.2/tests/test_release_toolchain.py +713 -0
  57. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/tests/test_tool_adapters.py +2 -4
  58. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/tests/test_tools_registry.py +5 -3
  59. scientific_computing_system-2.2.2/tests/test_verify_release_integrity.py +222 -0
  60. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/tests/test_workflow_tooling.py +6 -1
  61. scientific_computing_system-2.2.0/.github/workflows/npm-publish.yml +0 -27
  62. scientific_computing_system-2.2.0/CITATION.cff +0 -29
  63. scientific_computing_system-2.2.0/PKG-INFO +0 -175
  64. scientific_computing_system-2.2.0/README.md +0 -79
  65. scientific_computing_system-2.2.0/SECURITY.md +0 -82
  66. scientific_computing_system-2.2.0/docs/ARCHITECTURE.md +0 -252
  67. scientific_computing_system-2.2.0/docs/api.md +0 -133
  68. scientific_computing_system-2.2.0/docs/benchmarks.md +0 -62
  69. scientific_computing_system-2.2.0/docs/getting-started.md +0 -185
  70. scientific_computing_system-2.2.0/docs/index.md +0 -119
  71. scientific_computing_system-2.2.0/docs/related.md +0 -14
  72. scientific_computing_system-2.2.0/docs/tutorials/data_analysis_demo.md +0 -43
  73. scientific_computing_system-2.2.0/docs/tutorials/diffeq_demo.md +0 -48
  74. scientific_computing_system-2.2.0/docs/tutorials/graph_demo.md +0 -45
  75. scientific_computing_system-2.2.0/docs/tutorials/montecarlo_demo.md +0 -42
  76. scientific_computing_system-2.2.0/docs/why-pure-python.md +0 -19
  77. scientific_computing_system-2.2.0/npm.test.js +0 -169
  78. scientific_computing_system-2.2.0/requirements-build.lock +0 -17
  79. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/.github/workflows/benchmarks.yml +0 -0
  80. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/.github/workflows/bot-reviewer.yml +0 -0
  81. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/.github/workflows/changelog.yml +0 -0
  82. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/.github/workflows/codeql.yml +0 -0
  83. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/.github/workflows/pr-automation.yml +0 -0
  84. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/.github/workflows/pypi-registry-smoke.yml +0 -0
  85. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/.gitignore +0 -0
  86. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/LICENSE +0 -0
  87. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/benchmarks/results.json +0 -0
  88. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/benchmarks/robust_runner.py +0 -0
  89. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/benchmarks/run_benchmarks.py +0 -0
  90. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/bin/scs.js +0 -0
  91. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/dashboard/app.py +0 -0
  92. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/docs/CASE_STUDY_HUBBLE.md +0 -0
  93. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/docs/CASE_STUDY_QUANTUM_ML.md +0 -0
  94. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/docs/assets/icon.svg +0 -0
  95. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/docs/assets/logo.svg +0 -0
  96. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/docs/maintenance.md +0 -0
  97. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/docs/stylesheets/extra.css +0 -0
  98. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/docs/tour_of_numerical_methods.md +0 -0
  99. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/docs/tutorials/fft2_demo.md +0 -0
  100. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/docs/tutorials/hypothesis_demo.md +0 -0
  101. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/docs/tutorials/hypothesis_tests_demo.md +0 -0
  102. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/docs/tutorials/hypothesis_with_stats_demo.md +0 -0
  103. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/docs/tutorials/knowledge_demo.md +0 -0
  104. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/docs/tutorials/linalg_demo.md +0 -0
  105. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/docs/tutorials/ml_and_viz_demo.md +0 -0
  106. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/docs/tutorials/ml_demo.md +0 -0
  107. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/docs/tutorials/modeling_demo.md +0 -0
  108. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/docs/tutorials/nlp_bpe_demo.md +0 -0
  109. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/docs/tutorials/nlp_mini_gpt_demo.md +0 -0
  110. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/docs/tutorials/nlp_viz.md +0 -0
  111. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/docs/tutorials/numerical_integration_demo.md +0 -0
  112. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/docs/tutorials/optimization_demo.md +0 -0
  113. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/docs/tutorials/pandas_io_demo.md +0 -0
  114. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/docs/tutorials/pca_demo.md +0 -0
  115. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/docs/tutorials/probability_demo.md +0 -0
  116. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/docs/tutorials/quantum_demo.md +0 -0
  117. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/docs/tutorials/quick_start.md +0 -0
  118. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/docs/tutorials/scientific_demo.md +0 -0
  119. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/docs/tutorials/signals_demo.md +0 -0
  120. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/docs/tutorials/stats_demo.md +0 -0
  121. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/docs/tutorials/stiff_ode_demo.md +0 -0
  122. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/docs/tutorials/time_series_demo.md +0 -0
  123. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/examples/core_demo.py +0 -0
  124. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/examples/data_analysis_demo.py +0 -0
  125. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/examples/diffeq_demo.py +0 -0
  126. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/examples/discovery_pipeline_demo.py +0 -0
  127. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/examples/ensemble_showcase.py +0 -0
  128. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/examples/fft2_demo.py +0 -0
  129. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/examples/graph_demo.py +0 -0
  130. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/examples/hypothesis_custom_generator.py +0 -0
  131. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/examples/hypothesis_demo.py +0 -0
  132. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/examples/hypothesis_tests_demo.py +0 -0
  133. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/examples/hypothesis_with_stats_demo.py +0 -0
  134. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/examples/interpolate_demo.py +0 -0
  135. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/examples/knowledge_demo.py +0 -0
  136. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/examples/linalg_demo.py +0 -0
  137. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/examples/math_utils_demo.py +0 -0
  138. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/examples/ml_and_viz_demo.py +0 -0
  139. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/examples/modeling_demo.py +0 -0
  140. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/examples/montecarlo_demo.py +0 -0
  141. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/examples/nlp_attention_demo.py +0 -0
  142. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/examples/nlp_bpe_demo.py +0 -0
  143. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/examples/nlp_mini_gpt_demo.py +0 -0
  144. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/examples/nlp_viz_demo.py +0 -0
  145. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/examples/numerical_integration_demo.py +0 -0
  146. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/examples/optimization_demo.py +0 -0
  147. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/examples/pca_demo.py +0 -0
  148. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/examples/pde_demo.py +0 -0
  149. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/examples/plot_demo.py +0 -0
  150. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/examples/plotting_notebook.ipynb +0 -0
  151. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/examples/probability_demo.py +0 -0
  152. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/examples/quantum_demo.py +0 -0
  153. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/examples/scientific_demo.py +0 -0
  154. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/examples/signals_demo.py +0 -0
  155. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/examples/stats_demo.py +0 -0
  156. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/examples/tour_of_numerical_methods.ipynb +0 -0
  157. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/index.js +0 -0
  158. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/requirements-dev.lock +0 -0
  159. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/requirements.lock +0 -0
  160. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/scripts/check_version_discipline.py +0 -0
  161. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/scripts/publish.py +0 -0
  162. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/scripts/verify_cli_install.py +0 -0
  163. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/scripts/verify_cookbook.py +0 -0
  164. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/scripts/verify_ml_reference.py +0 -0
  165. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/scripts/verify_pypi_release.py +0 -0
  166. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/src/cds/__init__.py +0 -0
  167. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/src/cds/__main__.py +0 -0
  168. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/src/cds/_paths.py +0 -0
  169. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/src/cds/bayes/__init__.py +0 -0
  170. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/src/cds/bayes/conjugate.py +0 -0
  171. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/src/cds/causal.py +0 -0
  172. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/src/cds/cli/__main__.py +0 -0
  173. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/src/cds/cli/_handlers.py +0 -0
  174. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/src/cds/cli/_style.py +0 -0
  175. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/src/cds/cli/_system_info.py +0 -0
  176. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/src/cds/core/__init__.py +0 -0
  177. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/src/cds/core/_numeric.py +0 -0
  178. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/src/cds/core/models.py +0 -0
  179. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/src/cds/data_analysis/__init__.py +0 -0
  180. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/src/cds/data_analysis/dataset.py +0 -0
  181. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/src/cds/data_analysis/loader.py +0 -0
  182. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/src/cds/data_analysis/pandas_io.py +0 -0
  183. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/src/cds/data_analysis/transform.py +0 -0
  184. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/src/cds/data_analysis/viz.py +0 -0
  185. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/src/cds/data_io/__init__.py +0 -0
  186. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/src/cds/data_io/scientific.py +0 -0
  187. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/src/cds/data_io/streaming.py +0 -0
  188. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/src/cds/diffeq/__init__.py +0 -0
  189. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/src/cds/diffeq/_implicit.py +0 -0
  190. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/src/cds/diffeq/solvers.py +0 -0
  191. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/src/cds/diffeq/symplectic.py +0 -0
  192. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/src/cds/fractals/__init__.py +0 -0
  193. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/src/cds/fractals/sets.py +0 -0
  194. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/src/cds/genetics/__init__.py +0 -0
  195. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/src/cds/genetics/sequence.py +0 -0
  196. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/src/cds/graph/__init__.py +0 -0
  197. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/src/cds/graph/algorithms.py +0 -0
  198. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/src/cds/hypothesis/__init__.py +0 -0
  199. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/src/cds/hypothesis/evaluator.py +0 -0
  200. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/src/cds/hypothesis/generator.py +0 -0
  201. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/src/cds/hypothesis/mining.py +0 -0
  202. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/src/cds/infotheory/__init__.py +0 -0
  203. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/src/cds/infotheory/measures.py +0 -0
  204. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/src/cds/interpolate/__init__.py +0 -0
  205. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/src/cds/knowledge/__init__.py +0 -0
  206. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/src/cds/knowledge/graph.py +0 -0
  207. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/src/cds/knowledge/notes.py +0 -0
  208. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/src/cds/knowledge/retrieval.py +0 -0
  209. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/src/cds/math_utils/__init__.py +0 -0
  210. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/src/cds/math_utils/calculus.py +0 -0
  211. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/src/cds/math_utils/linalg.py +0 -0
  212. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/src/cds/math_utils/special.py +0 -0
  213. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/src/cds/math_utils/svd.py +0 -0
  214. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/src/cds/ml/__init__.py +0 -0
  215. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/src/cds/ml/boosting.py +0 -0
  216. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/src/cds/ml/clustering.py +0 -0
  217. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/src/cds/ml/decomposition.py +0 -0
  218. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/src/cds/ml/ensemble.py +0 -0
  219. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/src/cds/ml/linear_models.py +0 -0
  220. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/src/cds/ml/metrics.py +0 -0
  221. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/src/cds/ml/naive_bayes.py +0 -0
  222. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/src/cds/ml/neighbors.py +0 -0
  223. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/src/cds/ml/neural.py +0 -0
  224. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/src/cds/ml/preprocessing.py +0 -0
  225. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/src/cds/ml/tree.py +0 -0
  226. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/src/cds/modeling/__init__.py +0 -0
  227. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/src/cds/modeling/_base.py +0 -0
  228. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/src/cds/modeling/_nodes.py +0 -0
  229. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/src/cds/modeling/expression.py +0 -0
  230. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/src/cds/modeling/fitting.py +0 -0
  231. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/src/cds/modeling/model.py +0 -0
  232. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/src/cds/modeling/solver.py +0 -0
  233. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/src/cds/montecarlo/__init__.py +0 -0
  234. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/src/cds/montecarlo/markov.py +0 -0
  235. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/src/cds/montecarlo/methods.py +0 -0
  236. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/src/cds/nlp/__init__.py +0 -0
  237. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/src/cds/nlp/attention.py +0 -0
  238. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/src/cds/nlp/autograd/__init__.py +0 -0
  239. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/src/cds/nlp/autograd/_grad.py +0 -0
  240. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/src/cds/nlp/autograd/ops.py +0 -0
  241. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/src/cds/nlp/autograd/tensor.py +0 -0
  242. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/src/cds/nlp/bpe.py +0 -0
  243. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/src/cds/nlp/data.py +0 -0
  244. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/src/cds/nlp/embed.py +0 -0
  245. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/src/cds/nlp/layers.py +0 -0
  246. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/src/cds/nlp/model.py +0 -0
  247. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/src/cds/nlp/optim.py +0 -0
  248. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/src/cds/nlp/training.py +0 -0
  249. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/src/cds/nlp/viz.py +0 -0
  250. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/src/cds/numerical_integration/__init__.py +0 -0
  251. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/src/cds/numerical_integration/quadrature.py +0 -0
  252. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/src/cds/optimization/__init__.py +0 -0
  253. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/src/cds/optimization/_metaheuristics.py +0 -0
  254. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/src/cds/optimization/constrained.py +0 -0
  255. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/src/cds/optimization/minimize.py +0 -0
  256. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/src/cds/pde/__init__.py +0 -0
  257. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/src/cds/plot/__init__.py +0 -0
  258. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/src/cds/plot/_backend.py +0 -0
  259. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/src/cds/plot/charts.py +0 -0
  260. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/src/cds/probability/__init__.py +0 -0
  261. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/src/cds/probability/_advanced.py +0 -0
  262. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/src/cds/probability/distributions.py +0 -0
  263. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/src/cds/probability/extra_distributions.py +0 -0
  264. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/src/cds/provenance/__init__.py +0 -0
  265. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/src/cds/provenance/manifest.py +0 -0
  266. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/src/cds/py.typed +0 -0
  267. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/src/cds/quantum/__init__.py +0 -0
  268. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/src/cds/quantum/circuit.py +0 -0
  269. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/src/cds/quantum/multi_qubit.py +0 -0
  270. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/src/cds/quantum/simulator.py +0 -0
  271. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/src/cds/scientific/__init__.py +0 -0
  272. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/src/cds/scientific/constants.py +0 -0
  273. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/src/cds/scientific/formulas.py +0 -0
  274. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/src/cds/sensitivity.py +0 -0
  275. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/src/cds/signals/__init__.py +0 -0
  276. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/src/cds/signals/filters.py +0 -0
  277. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/src/cds/signals/processing.py +0 -0
  278. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/src/cds/signals/stft.py +0 -0
  279. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/src/cds/signals/wavelet.py +0 -0
  280. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/src/cds/stats/__init__.py +0 -0
  281. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/src/cds/stats/_distributions.py +0 -0
  282. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/src/cds/stats/bootstrap.py +0 -0
  283. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/src/cds/stats/descriptive.py +0 -0
  284. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/src/cds/stats/hypothesis_tests.py +0 -0
  285. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/src/cds/stats/multiple_testing.py +0 -0
  286. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/src/cds/stats/nonparametric.py +0 -0
  287. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/src/cds/stats/power.py +0 -0
  288. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/src/cds/stats/regression.py +0 -0
  289. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/src/cds/stats/time_series.py +0 -0
  290. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/src/cds/tools/__init__.py +0 -0
  291. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/src/cds/uncertainty/__init__.py +0 -0
  292. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/src/cds/uncertainty/propagation.py +0 -0
  293. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/src/cds/units/__init__.py +0 -0
  294. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/src/cds/units/core.py +0 -0
  295. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/src/cds/validation/__init__.py +0 -0
  296. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/src/cds/validation/adequacy.py +0 -0
  297. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/src/cds/validation/checks.py +0 -0
  298. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/src/cds/validation/drift.py +0 -0
  299. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/src/cds/validation/report.py +0 -0
  300. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/src/cds/wavelets/__init__.py +0 -0
  301. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/src/cds/wavelets/haar.py +0 -0
  302. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/src/cds/workflow/__init__.py +0 -0
  303. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/src/cds/workflow/engine.py +0 -0
  304. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/src/cds/workflow/gates.py +0 -0
  305. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/src/cds/workflow/orchestrator.py +0 -0
  306. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/src/cds/workflow/selection.py +0 -0
  307. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/src/cds/workflow/tooling.py +0 -0
  308. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/src/cds/workflow/types.py +0 -0
  309. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/tests/__init__.py +0 -0
  310. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/tests/conftest.py +0 -0
  311. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/tests/test_advanced_fitting.py +0 -0
  312. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/tests/test_audit_completion_coverage.py +0 -0
  313. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/tests/test_audit_guard_coverage.py +0 -0
  314. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/tests/test_audit_hardening.py +0 -0
  315. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/tests/test_audit_hardening_coverage.py +0 -0
  316. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/tests/test_bayes_v2.py +0 -0
  317. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/tests/test_benchmarks.py +0 -0
  318. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/tests/test_causal.py +0 -0
  319. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/tests/test_cli_color.py +0 -0
  320. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/tests/test_cli_extended.py +0 -0
  321. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/tests/test_cli_system_info.py +0 -0
  322. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/tests/test_constrained_opt.py +0 -0
  323. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/tests/test_core.py +0 -0
  324. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/tests/test_data_analysis.py +0 -0
  325. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/tests/test_data_analysis_lazy_bridge.py +0 -0
  326. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/tests/test_data_analysis_pandas_io.py +0 -0
  327. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/tests/test_data_io.py +0 -0
  328. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/tests/test_data_io_optional_backends.py +0 -0
  329. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/tests/test_data_io_scientific.py +0 -0
  330. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/tests/test_dataset.py +0 -0
  331. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/tests/test_dev_numpy_pin_contract.py +0 -0
  332. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/tests/test_diffeq.py +0 -0
  333. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/tests/test_diffeq_implicit.py +0 -0
  334. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/tests/test_domain_validation.py +0 -0
  335. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/tests/test_edge_misc_numerical.py +0 -0
  336. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/tests/test_edge_ml_quantum_linalg.py +0 -0
  337. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/tests/test_edge_nlp.py +0 -0
  338. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/tests/test_edge_quantum_evaluator_cli.py +0 -0
  339. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/tests/test_edge_stats_optimization_signals.py +0 -0
  340. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/tests/test_extra_distributions.py +0 -0
  341. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/tests/test_fft2.py +0 -0
  342. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/tests/test_fractals.py +0 -0
  343. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/tests/test_genetics.py +0 -0
  344. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/tests/test_graph.py +0 -0
  345. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/tests/test_hardening_privacy_provenance.py +0 -0
  346. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/tests/test_hypothesis.py +0 -0
  347. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/tests/test_hypothesis_engine.py +0 -0
  348. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/tests/test_hypothesis_mining.py +0 -0
  349. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/tests/test_hypothesis_tests.py +0 -0
  350. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/tests/test_infotheory.py +0 -0
  351. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/tests/test_interpolate.py +0 -0
  352. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/tests/test_knowledge.py +0 -0
  353. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/tests/test_layering.py +0 -0
  354. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/tests/test_linalg_extended.py +0 -0
  355. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/tests/test_linalg_qr_cholesky.py +0 -0
  356. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/tests/test_markov.py +0 -0
  357. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/tests/test_math_utils.py +0 -0
  358. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/tests/test_ml_boosting.py +0 -0
  359. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/tests/test_ml_clustering.py +0 -0
  360. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/tests/test_ml_ensemble.py +0 -0
  361. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/tests/test_ml_knn.py +0 -0
  362. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/tests/test_ml_linreg.py +0 -0
  363. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/tests/test_ml_logreg.py +0 -0
  364. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/tests/test_ml_metrics.py +0 -0
  365. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/tests/test_ml_model_selection.py +0 -0
  366. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/tests/test_ml_naive_bayes.py +0 -0
  367. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/tests/test_ml_pca.py +0 -0
  368. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/tests/test_ml_preprocessing.py +0 -0
  369. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/tests/test_ml_tree.py +0 -0
  370. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/tests/test_ml_viz.py +0 -0
  371. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/tests/test_ml_voting.py +0 -0
  372. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/tests/test_modeling.py +0 -0
  373. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/tests/test_modeling_fit_validation.py +0 -0
  374. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/tests/test_montecarlo.py +0 -0
  375. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/tests/test_multi_qubit.py +0 -0
  376. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/tests/test_nlp_attention.py +0 -0
  377. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/tests/test_nlp_autograd.py +0 -0
  378. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/tests/test_nlp_bpe.py +0 -0
  379. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/tests/test_nlp_embed.py +0 -0
  380. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/tests/test_nlp_layers.py +0 -0
  381. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/tests/test_nlp_model.py +0 -0
  382. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/tests/test_nlp_training.py +0 -0
  383. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/tests/test_nlp_viz.py +0 -0
  384. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/tests/test_numerical_integration.py +0 -0
  385. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/tests/test_numerical_invariants.py +0 -0
  386. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/tests/test_numerical_oracles.py +0 -0
  387. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/tests/test_optimization.py +0 -0
  388. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/tests/test_optimization_metaheuristics.py +0 -0
  389. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/tests/test_path_confinement.py +0 -0
  390. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/tests/test_pde.py +0 -0
  391. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/tests/test_plot_charts.py +0 -0
  392. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/tests/test_plot_lazy.py +0 -0
  393. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/tests/test_power.py +0 -0
  394. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/tests/test_probability.py +0 -0
  395. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/tests/test_probability_advanced.py +0 -0
  396. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/tests/test_property_invariants.py +0 -0
  397. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/tests/test_provenance.py +0 -0
  398. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/tests/test_provenance_audit_hardening.py +0 -0
  399. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/tests/test_public_api.py +0 -0
  400. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/tests/test_quantum.py +0 -0
  401. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/tests/test_readme_badges.py +0 -0
  402. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/tests/test_retrieval.py +0 -0
  403. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/tests/test_runtime_dependency_graph.py +0 -0
  404. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/tests/test_scientific.py +0 -0
  405. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/tests/test_selection_audit_hardening.py +0 -0
  406. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/tests/test_sensitivity.py +0 -0
  407. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/tests/test_sensitivity_global.py +0 -0
  408. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/tests/test_signals.py +0 -0
  409. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/tests/test_signals_filters.py +0 -0
  410. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/tests/test_special_invariants.py +0 -0
  411. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/tests/test_special_numerics.py +0 -0
  412. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/tests/test_statistical_audit.py +0 -0
  413. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/tests/test_stats.py +0 -0
  414. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/tests/test_stats_audit_coverage.py +0 -0
  415. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/tests/test_stats_multiple_testing.py +0 -0
  416. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/tests/test_stats_nonparametric.py +0 -0
  417. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/tests/test_stats_time_series.py +0 -0
  418. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/tests/test_stft.py +0 -0
  419. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/tests/test_streaming_analytics.py +0 -0
  420. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/tests/test_svd.py +0 -0
  421. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/tests/test_symplectic.py +0 -0
  422. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/tests/test_uncertainty.py +0 -0
  423. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/tests/test_units.py +0 -0
  424. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/tests/test_validation.py +0 -0
  425. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/tests/test_validation_adequacy.py +0 -0
  426. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/tests/test_validation_advanced.py +0 -0
  427. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/tests/test_validation_drift.py +0 -0
  428. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/tests/test_wavelet.py +0 -0
  429. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/tests/test_wavelets_v2.py +0 -0
  430. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/tests/test_workflow.py +0 -0
  431. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/tests/test_workflow_gates.py +0 -0
  432. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/tests/test_workflow_orchestrator.py +0 -0
  433. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/tests/test_workflow_orchestrator_blocked_review.py +0 -0
  434. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/tests/test_workflow_selection.py +0 -0
  435. {scientific_computing_system-2.2.0 → scientific_computing_system-2.2.2}/tests/test_workflow_selection_coverage.py +0 -0
@@ -33,10 +33,15 @@ jobs:
33
33
  with:
34
34
  python-version: "3.12"
35
35
  - name: Build wheel
36
+ # bash, not the Windows default PowerShell: `set -euo pipefail` is bash
37
+ # syntax and pwsh rejects it with "A parameter cannot be found that
38
+ # matches parameter name 'euo'". The other steps in this job pin the
39
+ # shell for the same reason.
40
+ shell: bash
36
41
  run: |
37
- python -m pip install --upgrade pip
38
- pip install build
39
- python -m build --wheel
42
+ set -euo pipefail
43
+ python -m pip install --require-hashes --only-binary=:all: -r requirements-build.lock
44
+ python -m build --wheel --no-isolation
40
45
  - name: Install wheel instead of source tree
41
46
  shell: bash
42
47
  run: |
@@ -0,0 +1,403 @@
1
+ name: npm Publish
2
+
3
+ # Sole npm publish authority for this repository.
4
+ #
5
+ # ## What this package is
6
+ #
7
+ # `scientific-computing-system` on npm is a *launcher shim*: it ships
8
+ # `index.js` and `bin/scs.js` (plus README/CHANGELOG/LICENSE/SECURITY) and
9
+ # nothing else. It contains no Python. `scs` locates a Python interpreter and
10
+ # execs `python -m cds`, which comes from the PyPI distribution. The npm package
11
+ # is therefore only useful alongside `pip install scientific-computing-system`;
12
+ # the launcher exits non-zero with an actionable message when no interpreter or
13
+ # no `cds` package is present. This is stated in package.json's description and
14
+ # asserted by npm.test.js.
15
+ #
16
+ # ## Authentication: two supported modes
17
+ #
18
+ # OIDC trusted publishing (preferred, the default). npm receives this job's
19
+ # OIDC identity token (audience `npm:registry.npmjs.org`) and exchanges it for a
20
+ # short-lived, single-use publish credential scoped to this repository, this
21
+ # workflow file and this environment. No long-lived registry secret is involved,
22
+ # and no `NODE_AUTH_TOKEN` is set on that path: the npm CLI detects the OIDC
23
+ # environment before it ever looks for a token. `--provenance` attaches a
24
+ # Sigstore-signed attestation binding the tarball to this commit. One-time
25
+ # npmjs.com setup: package `scientific-computing-system` -> Settings -> Trusted
26
+ # Publisher -> GitHub Actions -> owner `Furox-Art`, repository
27
+ # `scientific-computing-system`, workflow `npm-publish.yml`, environment `npm`.
28
+ #
29
+ # Token mode (explicit opt-in, `use_token_fallback=true`). Uses the repository's
30
+ # NPM_TOKEN secret through NODE_AUTH_TOKEN. This is the mode in use while the
31
+ # npmjs.com trusted-publisher registration is pending.
32
+ #
33
+ # The token mode deliberately omits `--provenance`. Provenance is an OIDC-only
34
+ # attestation: with a token there is no OIDC identity to attest to, so npm
35
+ # rejects the combination outright. The token mode therefore publishes without
36
+ # provenance and prints a NOTICE saying so, rather than passing a flag that
37
+ # cannot work or pretending an attestation was produced.
38
+ #
39
+ # Both modes are fail-closed. A requested mode with no usable credential exits 1
40
+ # with an actionable message. Token mode never runs automatically, so a broken
41
+ # OIDC configuration cannot silently downgrade to the long-lived credential.
42
+
43
+ on:
44
+ workflow_dispatch:
45
+ inputs:
46
+ use_token_fallback:
47
+ description: >-
48
+ Publish mode. false (default) = OIDC trusted publishing, which mints a
49
+ Sigstore provenance attestation. true = token mode, using the
50
+ repository NPM_TOKEN secret; that mode publishes WITHOUT provenance,
51
+ because a token cannot mint an attestation. Use true while the
52
+ npmjs.com trusted publisher is not yet registered.
53
+ type: boolean
54
+ default: false
55
+ push:
56
+ # `branches` and `tags` in one `push` mapping are OR'd by GitHub.
57
+ #
58
+ # The `v*` tag is the release path: release.yml creates the tag only after
59
+ # the PyPI publish has succeeded, so a single version bump reaches PyPI
60
+ # first and npm second. `paths` narrows *branch* pushes so unrelated merges
61
+ # do not run this job; GitHub does not evaluate `paths` against tag pushes.
62
+ branches: [main]
63
+ tags:
64
+ - "v*"
65
+ paths:
66
+ - "package.json"
67
+ - "index.js"
68
+ - "bin/**"
69
+ - "npm.test.js"
70
+ - ".github/workflows/npm-publish.yml"
71
+
72
+ concurrency:
73
+ group: npm-publish
74
+ cancel-in-progress: false
75
+
76
+ # Default-deny; the publish job below declares exactly what it needs.
77
+ permissions:
78
+ contents: read
79
+
80
+ jobs:
81
+ publish:
82
+ name: Verify and publish to npm with OIDC trusted publishing
83
+ runs-on: ubuntu-latest
84
+ timeout-minutes: 20
85
+ # The `npm` environment is referenced by the trusted-publisher configuration
86
+ # on npmjs.com. Adding a required reviewer here is the other half of that
87
+ # control; it is intentionally left to the maintainer because a required
88
+ # reviewer on a single-maintainer repository would deadlock releases.
89
+ environment: npm
90
+ permissions:
91
+ contents: read
92
+ # Required to mint the OIDC token npm exchanges for a publish credential.
93
+ # This is the entire point of the OIDC path: no long-lived secret.
94
+ id-token: write
95
+ steps:
96
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
97
+ with:
98
+ persist-credentials: false
99
+
100
+ # Node 24 ships npm 11.5.1+, the floor for trusted publishing.
101
+ #
102
+ # `registry-url` is REQUIRED for the token mode and was its missing half.
103
+ # Without it setup-node writes no .npmrc at all, so npm never learns that
104
+ # registry.npmjs.org accepts a token, and NODE_AUTH_TOKEN is exported into
105
+ # the environment but read by nobody. The publish then fails with:
106
+ #
107
+ # npm error code ENEEDAUTH
108
+ # npm error need auth This command requires you to be logged in to
109
+ # https://registry.npmjs.org/
110
+ #
111
+ # ENEEDAUTH means npm did not attempt authentication at all -- as opposed to
112
+ # E401, which means it did and the credential was rejected. Seeing ENEEDAUTH
113
+ # with a populated secret is the signature of "no registry auth entry
114
+ # configured", not "bad token".
115
+ #
116
+ # With registry-url set, setup-node writes a userconfig containing
117
+ # //registry.npmjs.org/:_authToken=${NODE_AUTH_TOKEN}
118
+ # which is what makes the env var meaningful. Verified locally: with only
119
+ # NODE_AUTH_TOKEN exported and no such entry, npm goes straight to
120
+ # ENEEDAUTH; with the entry present it reaches the registry and fails
121
+ # E401 on a deliberately fake token instead.
122
+ - name: Set up Node
123
+ uses: actions/setup-node@a0853c24544627f65ddf259abe73b1d18a591444 # v5.0.0
124
+ with:
125
+ node-version: "24"
126
+ registry-url: "https://registry.npmjs.org"
127
+ # Never cache in a publish job: a warm cache is a way to publish bytes
128
+ # this checkout did not produce.
129
+ package-manager-cache: false
130
+
131
+ # Toolchain floor for trusted publishing: npm 11.5.1 and Node 22.14.0.
132
+ #
133
+ # The comparison is an integer semver compare, not a regex. The previous
134
+ # regex here was wrong and rejected the npm that setup-node actually
135
+ # installs:
136
+ #
137
+ # npm --version | grep -Eq '^11\.(5[1-9]|[6-9][0-9])\.|^1[2-9]\.'
138
+ #
139
+ # `[6-9][0-9]` covers 60-99, so `11.19.0` (what Node 24 ships) never
140
+ # matched and the gate failed on a compliant toolchain. Regex cannot
141
+ # express "greater than or equal to" for a dotted version without
142
+ # enumerating every minor, which is exactly the class of bug that shipped
143
+ # here. Numeric major/minor/patch comparison is total and obvious.
144
+ #
145
+ # The Node check that preceded it had the matching defect: it compared
146
+ # only major and minor, so `22.14.0` and `22.9.0` were both accepted even
147
+ # though only the former meets the documented floor.
148
+ - name: Assert the toolchain supports OIDC trusted publishing
149
+ shell: bash
150
+ run: |
151
+ set -euo pipefail
152
+ npm_version="$(npm --version)"
153
+ node_version="$(node --version)"
154
+ echo "npm=$npm_version node=$node_version"
155
+
156
+ # `$npm_version` and `$node_version` are positional arguments, never
157
+ # interpolated into the JS source, so a malformed or hostile value
158
+ # cannot break out into code.
159
+ node -e '
160
+ const REQUIRED_NPM = [11, 5, 1];
161
+ const REQUIRED_NODE = [22, 14, 0];
162
+
163
+ // Strip an optional leading "v" and any pre-release/build suffix,
164
+ // then take the numeric leading components.
165
+ function parse(raw, label) {
166
+ const match = /^[vV]?(\d+)(?:\.(\d+))?(?:\.(\d+))?/.exec(String(raw).trim());
167
+ if (!match) {
168
+ console.error(`::error::could not parse the ${label} version: ${JSON.stringify(raw)}`);
169
+ process.exit(1);
170
+ }
171
+ return [Number(match[1]), Number(match[2] || 0), Number(match[3] || 0)];
172
+ }
173
+
174
+ // Returns negative if a < b, 0 if equal, positive if a > b.
175
+ function compare(a, b) {
176
+ for (let i = 0; i < 3; i += 1) {
177
+ if (a[i] !== b[i]) return a[i] - b[i];
178
+ }
179
+ return 0;
180
+ }
181
+
182
+ const npmVersion = parse(process.argv[1], "npm");
183
+ const nodeVersion = parse(process.argv[2], "node");
184
+
185
+ if (compare(npmVersion, REQUIRED_NPM) < 0) {
186
+ console.error(
187
+ `::error::npm ${REQUIRED_NPM.join(".")}+ is required for OIDC trusted publishing, got ${npmVersion.join(".")}`,
188
+ );
189
+ process.exit(1);
190
+ }
191
+ if (compare(nodeVersion, REQUIRED_NODE) < 0) {
192
+ console.error(
193
+ `::error::Node ${REQUIRED_NODE.join(".")}+ is required for trusted publishing, got ${nodeVersion.join(".")}`,
194
+ );
195
+ process.exit(1);
196
+ }
197
+ console.log(
198
+ `PASS: npm ${npmVersion.join(".")} >= ${REQUIRED_NPM.join(".")}, ` +
199
+ `node ${nodeVersion.join(".")} >= ${REQUIRED_NODE.join(".")}`,
200
+ );
201
+ ' "$npm_version" "$node_version"
202
+
203
+ # The launcher previously shipped unparseable and pointing at a
204
+ # nonexistent module, and nothing in CI ever invoked Node.
205
+ - name: Syntax-check the launcher and the bin shim
206
+ run: |
207
+ node --check index.js
208
+ node --check bin/scs.js
209
+
210
+ - name: Run the npm entry-point contract suite
211
+ run: npm test
212
+
213
+ # GATE: the published tarball must contain the allowlist and nothing else.
214
+ # Without this, a future edit to package.json could ship the repository
215
+ # (tests, workflows, 10k+ statements of Python) to the public registry.
216
+ - name: Assert the publish tarball contains only the allowlist
217
+ shell: bash
218
+ run: |
219
+ set -euo pipefail
220
+ npm pack --dry-run 2>&1 | tee pack-dry-run.txt
221
+ for forbidden in "src/" "tests/" "docs/" ".github/" "benchmarks/" "assets/"; do
222
+ if grep -q "$forbidden" pack-dry-run.txt; then
223
+ echo "::error::npm tarball would publish $forbidden"
224
+ exit 1
225
+ fi
226
+ done
227
+
228
+ # GATE: package.json must not be private, or `npm publish` refuses to run.
229
+ - name: Assert package.json is publishable
230
+ run: |
231
+ set -euo pipefail
232
+ node -e '
233
+ const pkg = require("./package.json");
234
+ if (pkg.private === true) {
235
+ console.error("::error::package.json sets private:true; npm publish is blocked");
236
+ process.exit(1);
237
+ }
238
+ console.log(`PASS: ${pkg.name}@${pkg.version} is publishable`);
239
+ '
240
+
241
+ # GATE: the repo's own version-lockstep check, which covers package.json.
242
+ # Catches publishing a launcher whose version disagrees with the Python
243
+ # distribution it shells out to.
244
+ - name: Assert npm version tracks the Python distribution
245
+ run: |
246
+ set -euo pipefail
247
+ python3 -m pip install --upgrade pip
248
+ python3 -m pip install .
249
+ node -e '
250
+ const fs = require("node:fs");
251
+ const pkg = JSON.parse(fs.readFileSync("package.json", "utf8"));
252
+ const text = fs.readFileSync("pyproject.toml", "utf8");
253
+ const match = /^version\s*=\s*"([^"]+)"/m.exec(text);
254
+ if (!match) { console.error("::error::pyproject.toml has no static version"); process.exit(1); }
255
+ if (pkg.version !== match[1]) {
256
+ console.error(`::error::npm ${pkg.version} != Python ${match[1]}`);
257
+ process.exit(1);
258
+ }
259
+ console.log(`PASS: npm ${pkg.version} matches Python ${match[1]}`);
260
+ '
261
+
262
+ # GATE: refuse to republish. A version can only be published once, so an
263
+ # already-present version means either a duplicate trigger or a
264
+ # half-finished recovery. Both should stop here rather than fail confusingly
265
+ # inside `npm publish`.
266
+ - name: Assert the version is not already published
267
+ run: |
268
+ set -euo pipefail
269
+ version="$(node -p 'require("./package.json").version')"
270
+ if npm view "scientific-computing-system@${version}" version >/dev/null 2>&1; then
271
+ echo "::error::scientific-computing-system@${version} is already on npm"
272
+ echo "::error::nothing to do; bump package.json (and the locked version surfaces) to publish again"
273
+ exit 1
274
+ fi
275
+ echo "PASS: scientific-computing-system@${version} is unpublished"
276
+
277
+ # Two supported modes, selected by the `use_token_fallback` dispatch input.
278
+ #
279
+ # OIDC (preferred, default): no NODE_AUTH_TOKEN is set. The npm CLI
280
+ # detects the OIDC environment (id-token: write above) and exchanges the
281
+ # runner's identity token for a short-lived publish credential scoped to
282
+ # this repository, workflow and environment. `--provenance` attaches a
283
+ # Sigstore-signed attestation to the tarball binding it to this commit.
284
+ #
285
+ # Token (explicit opt-in): uses the repository's existing NPM_TOKEN secret
286
+ # via NODE_AUTH_TOKEN. This is the mode the maintainer selected while the
287
+ # npmjs.com trusted-publisher registration is still pending.
288
+ #
289
+ # The token mode does NOT pass --provenance, and must not. Provenance is an
290
+ # OIDC-only attestation: without a trusted-publisher configuration npm has
291
+ # no OIDC identity to attest to, so `--provenance` would fail the publish
292
+ # outright. Passing it and catching the error would be worse -- it would
293
+ # print a failure and then publish anyway. The token mode therefore
294
+ # publishes without provenance, and says so, rather than pretending an
295
+ # attestation exists.
296
+ #
297
+ # Both modes are fail-closed: a requested mode with no usable credential
298
+ # exits 1 with an actionable message instead of silently falling through.
299
+ # There is no `continue-on-error` and no `|| true` anywhere in this job.
300
+ #
301
+ # The credential preflight is a SEPARATE STEP, not an inline `if` inside
302
+ # the publish step. Inline, a credential check that prints an error but
303
+ # forgets to exit continues straight into `npm publish` -- which is
304
+ # precisely what the failed run did: the fail-closed branch's own source
305
+ # text appeared in the log and npm was invoked anyway. As its own step, a
306
+ # non-zero exit ends the job before any publish step can run.
307
+ - name: Assert the requested publish mode has a usable credential
308
+ env:
309
+ NPM_TOKEN: ${{ secrets.NPM_TOKEN }}
310
+ run: |
311
+ set -euo pipefail
312
+ if [ "${{ inputs.use_token_fallback }}" = "true" ]; then
313
+ if [ -z "${NPM_TOKEN:-}" ]; then
314
+ echo "::error::token mode was requested (use_token_fallback=true) but the NPM_TOKEN secret is empty or unset"
315
+ echo "::error::add an npm automation token as the NPM_TOKEN secret, or re-run without use_token_fallback once the npmjs.com trusted publisher is registered"
316
+ exit 1
317
+ fi
318
+ echo "mode=token via NPM_TOKEN (no provenance: a long-lived token cannot mint a Sigstore attestation)"
319
+ echo "::warning::Publishing with NPM_TOKEN instead of OIDC. Register the npmjs.com trusted publisher and delete NPM_TOKEN once this release is out."
320
+ else
321
+ if [ -z "${ACTIONS_ID_TOKEN_REQUEST_URL:-}" ] || [ -z "${ACTIONS_ID_TOKEN_REQUEST_TOKEN:-}" ]; then
322
+ echo "::error::OIDC mode was requested but this job cannot mint an OIDC token"
323
+ echo "::error::ACTIONS_ID_TOKEN_REQUEST_URL is unset, so the runner did not grant id-token: write"
324
+ echo "::error::either fix the id-token: write permission, or re-run with use_token_fallback=true to publish with NPM_TOKEN instead"
325
+ exit 1
326
+ fi
327
+ echo "mode=oidc (provenance attestation enabled)"
328
+ fi
329
+
330
+ # GATE: the registry auth entry must actually exist. setup-node's
331
+ # `registry-url` is what writes it; this asserts the outcome rather than
332
+ # trusting the configuration, so a future edit that drops registry-url
333
+ # fails here with a clear cause instead of at `npm publish` with ENEEDAUTH.
334
+ - name: Assert the npm registry auth entry is configured
335
+ shell: bash
336
+ run: |
337
+ set -euo pipefail
338
+ userconfig="$(npm config get userconfig)"
339
+ echo "npm userconfig=$userconfig"
340
+ if [ ! -f "$userconfig" ]; then
341
+ echo "::error::no npm userconfig at $userconfig"
342
+ echo "::error::setup-node writes this file from its registry-url input; without it npm has no registry auth entry"
343
+ exit 1
344
+ fi
345
+ if ! grep -q '_authToken' "$userconfig"; then
346
+ echo "::error::$userconfig has no _authToken entry"
347
+ echo "::error::npm would fail with ENEEDAUTH: NODE_AUTH_TOKEN alone is inert without a registry auth entry"
348
+ exit 1
349
+ fi
350
+ if ! grep -q 'registry.npmjs.org' "$userconfig"; then
351
+ echo "::error::$userconfig does not reference registry.npmjs.org"
352
+ exit 1
353
+ fi
354
+ # The token value itself must never be echoed.
355
+ echo "PASS: npm registry auth entry present (value not shown)"
356
+ echo "PASS: the entry references NODE_AUTH_TOKEN by name, not a literal secret"
357
+
358
+ - name: Publish to npm (OIDC trusted publishing, with provenance)
359
+ if: ${{ !inputs.use_token_fallback }}
360
+ run: npm publish --provenance --access public
361
+
362
+ - name: Publish to npm (token mode, no provenance)
363
+ if: ${{ inputs.use_token_fallback }}
364
+ env:
365
+ NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
366
+ run: |
367
+ set -euo pipefail
368
+ # Deliberately no --provenance: a token-authenticated publish cannot
369
+ # produce a Sigstore attestation. npm will reject the combination.
370
+ echo "NOTICE: publishing with NPM_TOKEN; this release carries no provenance attestation"
371
+ npm publish --access public
372
+
373
+ # Post-publish confirmation that the version is actually readable.
374
+ #
375
+ # This was a single immediate `npm view`, and it produced a false failure
376
+ # on run 37136131220: the upload succeeded and the registry recorded 2.2.0
377
+ # ninety seconds later, but the probe ran within a second of `npm publish`
378
+ # returning and got E404, turning a successful release into a red job.
379
+ # Three sibling repositories hit the same thing.
380
+ #
381
+ # The probe now polls the registry's JSON API with backoff, over a budget
382
+ # of several minutes -- deliberately generous, because npm's propagation
383
+ # gap is not bounded and shortening it to make a test fast would recreate
384
+ # the original false failure. It succeeds on the first match and fails
385
+ # closed if the version never appears, emitting a `::warning::` first so a
386
+ # slow-but-successful publish is never read as a hard failure.
387
+ #
388
+ # `npm view` was dropped as the probe: it reports "absent" and "denied"
389
+ # with the same E404, and it resolves against the userconfig this job
390
+ # created for writing, so a read-only confirmation had no reason to touch
391
+ # publish credentials at all.
392
+ - name: Verify the published version (polling for registry propagation)
393
+ run: |
394
+ set -euo pipefail
395
+ version="$(node -p 'require("./package.json").version')"
396
+ python3 scripts/verify_npm_publication.py \
397
+ --package scientific-computing-system \
398
+ --version "$version" \
399
+ --registry https://registry.npmjs.org \
400
+ --attempts 12 \
401
+ --initial-delay 5 \
402
+ --growth 1.5 \
403
+ --max-delay 30
@@ -179,6 +179,20 @@ jobs:
179
179
  - name: Build sdist + wheel without dependency isolation
180
180
  run: python -m build --no-isolation
181
181
 
182
+ # Validate the core metadata *rendered* from the artifacts, before anything
183
+ # is uploaded. `check_version_lockstep.py` proves the version and name are
184
+ # right; it does not prove the artifact is renderable at all. This is the
185
+ # step that catches an unusable artifact while it is still local.
186
+ #
187
+ # The pin matters and is not cosmetic. twine <= 6.2.0 replaces
188
+ # `packaging.metadata._VALID_METADATA_VERSIONS` at import time with a list
189
+ # ending at 2.4, so it rejects a valid artifact with
190
+ # `InvalidDistribution: '2.5' is not a valid metadata version` -- a release
191
+ # failure with nothing wrong with the package. twine 7.0.0 (pinned in
192
+ # requirements-build.lock) removed the override.
193
+ - name: Validate artifact metadata renders
194
+ run: python -m twine check --strict dist/*
195
+
182
196
  # Assert the *contents* of both artifacts before anything is published.
183
197
  # The version/name verification below proves the metadata says 2.1.0; this
184
198
  # proves the wheel actually ships `cds` with its `py.typed` marker and the
@@ -307,6 +307,53 @@ jobs:
307
307
  run: python scripts/check_version_discipline.py --base-ref "${{ steps.base.outputs.ref }}"
308
308
  - name: Reject version metadata lockstep drift
309
309
  run: python scripts/check_version_lockstep.py
310
+ # The release toolchain must stay pinned, and the twine pin must stay able
311
+ # to validate the Metadata-Version the build backend actually emits --
312
+ # twine<=6.2.0 overrides packaging's list at import time and rejects valid
313
+ # artifacts with `'2.5' is not a valid metadata version`.
314
+ #
315
+ # GITHUB_TOKEN is passed so the advisory upstream checks authenticate.
316
+ # Unauthenticated GitHub API calls are capped at 60/hour, which is easy to
317
+ # exceed and fails in a way that looks like success: a sibling guard
318
+ # "verified" pins under rate limiting and silently verified nothing.
319
+ # Fast, offline, workflow-shape gate: pins and `twine check --strict` usage.
320
+ # The authoritative run, including the twine/Metadata-Version compatibility
321
+ # check, is in the `packaging` job below -- the only job that has built
322
+ # artifacts to read the emitted Metadata-Version from.
323
+ - name: Reject unpinned release toolchain
324
+ run: python scripts/check_release_toolchain.py --skip-network
325
+ # The provenance prose asserts, per registry, whether the published
326
+ # release carries a build attestation. That claim was originally written
327
+ # from memory and nothing checked it, so it could have kept being
328
+ # asserted after a release changed the answer. This runs the committed
329
+ # guard (`docs/checks/verify_provenance_claims.py`) against the live
330
+ # registries and fails if the prose contradicts them.
331
+ #
332
+ # Placed here rather than in a new job on purpose: this job already owns
333
+ # release-metadata verification and already sits in the required `CI`
334
+ # aggregate, so this strengthens an existing gate instead of adding a
335
+ # required check that would need a ruleset change. `permissions:
336
+ # contents: read` above is sufficient -- the guard only reads PyPI and npm,
337
+ # never the GitHub API, so no token is needed.
338
+ #
339
+ # `--strict-network` is deliberately NOT set: a registry outage is
340
+ # reported as UNKNOWN and the run passes with a NOTICE, because a required
341
+ # gate that fails on a DNS blip teaches people to re-run it rather than
342
+ # read it. A false claim still fails. The unit test
343
+ # (`tests/test_provenance_claims.py`) is the deterministic gate and needs
344
+ # no network at all.
345
+ #
346
+ # The version is read from `pyproject.toml` rather than hardcoded: a
347
+ # literal here would go stale at the next release, which is the same class
348
+ # of stale-constant bug this step exists to catch. A version that has not
349
+ # shipped yet is reported as unverifiable rather than "unattested", so a
350
+ # bump PR is not blocked by asking about a release that does not exist.
351
+ - name: Reject provenance claims that contradict the live registries
352
+ run: >-
353
+ python docs/checks/verify_provenance_claims.py
354
+ --version "$(python -c 'import tomllib, pathlib;
355
+ print(tomllib.loads(pathlib.Path("pyproject.toml").read_text(encoding="utf-8"))
356
+ ["project"]["version"])')"
310
357
 
311
358
  packaging:
312
359
  name: built wheel and sdist contents on Linux with Python 3.12
@@ -332,6 +379,19 @@ jobs:
332
379
  run: python scripts/check_version_lockstep.py --dist-dir dist
333
380
  - name: Assert wheel and sdist contents
334
381
  run: python scripts/check_distribution_contents.py dist
382
+ # Read the Metadata-Version out of the artifacts just built and prove the
383
+ # pinned twine can validate it. twine<=6.2.0 overrides packaging's
384
+ # metadata-version list at import time and rejects a valid artifact with
385
+ # `'2.5' is not a valid metadata version`; a sibling release failed that
386
+ # way with nothing wrong with the package.
387
+ #
388
+ # GITHUB_TOKEN is passed so the advisory upstream checks authenticate.
389
+ # Unauthenticated GitHub API calls are capped at 60/hour, and under rate
390
+ # limiting a pin check can silently verify nothing while reporting success.
391
+ - name: Assert the pinned twine can validate the built metadata
392
+ env:
393
+ GITHUB_TOKEN: ${{ github.token }}
394
+ run: python scripts/check_release_toolchain.py --dist-dir dist
335
395
  # A source distribution whose own test suite cannot pass is not a source
336
396
  # distribution. 13 release-contract tests used to fail here because
337
397
  # `.github/workflows` was missing from the sdist; this step is what keeps