scientific-computing-system 2.2.1__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.
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/.github/workflows/cli-package-smoke.yml +8 -3
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/.github/workflows/release.yml +14 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/.github/workflows/tests.yml +60 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/CHANGELOG.md +132 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/CITATION.cff +3 -3
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/PKG-INFO +16 -6
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/README.md +15 -5
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/SECURITY.md +94 -20
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/codemeta.json +2 -2
- scientific_computing_system-2.2.2/docs/checks/verify_provenance_claims.py +468 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/package.json +1 -1
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/pyproject.toml +5 -1
- scientific_computing_system-2.2.2/requirements-build.lock +491 -0
- scientific_computing_system-2.2.2/scripts/check_release_toolchain.py +551 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/scripts/verify_release_integrity.py +29 -1
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/src/cds/_version.py +1 -1
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/src/cds/cli/__init__.py +11 -1
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/src/cds/cli/_parser.py +0 -4
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/src/cds/ml/model_selection.py +12 -4
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/src/cds/ml/voting.py +8 -2
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/src/cds/tools/adapters.py +18 -6
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/src/cds/tools/registry.py +3 -4
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/tests/test_bootstrap.py +2 -2
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/tests/test_cli.py +28 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/tests/test_fitting_bootstrap.py +10 -11
- scientific_computing_system-2.2.2/tests/test_protocol_placeholders.py +204 -0
- scientific_computing_system-2.2.2/tests/test_provenance_claims.py +384 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/tests/test_release_contract.py +17 -1
- scientific_computing_system-2.2.2/tests/test_release_toolchain.py +713 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/tests/test_tool_adapters.py +2 -4
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/tests/test_tools_registry.py +5 -3
- scientific_computing_system-2.2.2/tests/test_verify_release_integrity.py +222 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/tests/test_workflow_tooling.py +6 -1
- scientific_computing_system-2.2.1/requirements-build.lock +0 -17
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/.github/workflows/benchmarks.yml +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/.github/workflows/bot-reviewer.yml +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/.github/workflows/changelog.yml +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/.github/workflows/codeql.yml +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/.github/workflows/npm-publish.yml +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/.github/workflows/pr-automation.yml +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/.github/workflows/pypi-registry-smoke.yml +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/.gitignore +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/CONTRIBUTING.md +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/LICENSE +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/benchmarks/results.json +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/benchmarks/robust_runner.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/benchmarks/run_benchmarks.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/bin/scs.js +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/dashboard/app.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/docs/ARCHITECTURE.md +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/docs/CASE_STUDY_HUBBLE.md +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/docs/CASE_STUDY_QUANTUM_ML.md +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/docs/api.md +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/docs/assets/icon.svg +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/docs/assets/logo.svg +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/docs/benchmarks.md +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/docs/cookbook.md +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/docs/getting-started.md +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/docs/index.md +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/docs/maintenance.md +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/docs/ml_reference.md +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/docs/related.md +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/docs/research-workflows.md +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/docs/stylesheets/extra.css +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/docs/tour_of_numerical_methods.md +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/docs/tutorials/core_demo.md +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/docs/tutorials/data_analysis_demo.md +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/docs/tutorials/diffeq_demo.md +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/docs/tutorials/fft2_demo.md +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/docs/tutorials/graph_demo.md +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/docs/tutorials/hypothesis_demo.md +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/docs/tutorials/hypothesis_tests_demo.md +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/docs/tutorials/hypothesis_with_stats_demo.md +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/docs/tutorials/knowledge_demo.md +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/docs/tutorials/linalg_demo.md +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/docs/tutorials/math_utils_demo.md +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/docs/tutorials/ml_advanced_demo.md +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/docs/tutorials/ml_and_viz_demo.md +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/docs/tutorials/ml_demo.md +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/docs/tutorials/modeling_demo.md +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/docs/tutorials/montecarlo_demo.md +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/docs/tutorials/nlp_attention_demo.md +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/docs/tutorials/nlp_bpe_demo.md +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/docs/tutorials/nlp_mini_gpt_demo.md +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/docs/tutorials/nlp_viz.md +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/docs/tutorials/numerical_integration_demo.md +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/docs/tutorials/optimization_demo.md +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/docs/tutorials/pandas_io_demo.md +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/docs/tutorials/pca_demo.md +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/docs/tutorials/probability_demo.md +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/docs/tutorials/quantum_demo.md +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/docs/tutorials/quick_start.md +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/docs/tutorials/scientific_demo.md +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/docs/tutorials/signals_demo.md +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/docs/tutorials/stats_demo.md +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/docs/tutorials/stiff_ode_demo.md +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/docs/tutorials/time_series_demo.md +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/docs/why-pure-python.md +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/examples/core_demo.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/examples/data_analysis_demo.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/examples/diffeq_demo.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/examples/discovery_pipeline_demo.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/examples/ensemble_showcase.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/examples/fft2_demo.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/examples/graph_demo.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/examples/hypothesis_custom_generator.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/examples/hypothesis_demo.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/examples/hypothesis_tests_demo.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/examples/hypothesis_with_stats_demo.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/examples/interpolate_demo.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/examples/knowledge_demo.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/examples/linalg_demo.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/examples/math_utils_demo.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/examples/ml_and_viz_demo.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/examples/modeling_demo.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/examples/montecarlo_demo.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/examples/nlp_attention_demo.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/examples/nlp_bpe_demo.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/examples/nlp_mini_gpt_demo.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/examples/nlp_viz_demo.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/examples/numerical_integration_demo.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/examples/optimization_demo.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/examples/pca_demo.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/examples/pde_demo.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/examples/plot_demo.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/examples/plotting_notebook.ipynb +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/examples/probability_demo.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/examples/quantum_demo.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/examples/scientific_demo.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/examples/signals_demo.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/examples/stats_demo.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/examples/tour_of_numerical_methods.ipynb +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/index.js +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/mkdocs.yml +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/npm.test.js +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/paper.bib +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/paper.md +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/requirements-dev.lock +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/requirements.lock +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/scripts/check_version_discipline.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/scripts/check_version_lockstep.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/scripts/publish.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/scripts/verify_cli_install.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/scripts/verify_cookbook.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/scripts/verify_ml_reference.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/scripts/verify_pypi_release.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/src/cds/__init__.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/src/cds/__main__.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/src/cds/_paths.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/src/cds/bayes/__init__.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/src/cds/bayes/conjugate.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/src/cds/causal.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/src/cds/cli/__main__.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/src/cds/cli/_handlers.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/src/cds/cli/_style.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/src/cds/cli/_system_info.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/src/cds/core/__init__.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/src/cds/core/_numeric.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/src/cds/core/models.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/src/cds/data_analysis/__init__.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/src/cds/data_analysis/dataset.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/src/cds/data_analysis/loader.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/src/cds/data_analysis/pandas_io.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/src/cds/data_analysis/transform.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/src/cds/data_analysis/viz.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/src/cds/data_io/__init__.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/src/cds/data_io/scientific.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/src/cds/data_io/streaming.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/src/cds/diffeq/__init__.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/src/cds/diffeq/_implicit.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/src/cds/diffeq/solvers.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/src/cds/diffeq/symplectic.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/src/cds/fractals/__init__.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/src/cds/fractals/sets.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/src/cds/genetics/__init__.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/src/cds/genetics/sequence.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/src/cds/graph/__init__.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/src/cds/graph/algorithms.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/src/cds/hypothesis/__init__.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/src/cds/hypothesis/evaluator.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/src/cds/hypothesis/generator.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/src/cds/hypothesis/mining.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/src/cds/infotheory/__init__.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/src/cds/infotheory/measures.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/src/cds/interpolate/__init__.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/src/cds/knowledge/__init__.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/src/cds/knowledge/graph.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/src/cds/knowledge/notes.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/src/cds/knowledge/retrieval.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/src/cds/math_utils/__init__.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/src/cds/math_utils/calculus.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/src/cds/math_utils/linalg.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/src/cds/math_utils/special.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/src/cds/math_utils/svd.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/src/cds/ml/__init__.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/src/cds/ml/boosting.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/src/cds/ml/clustering.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/src/cds/ml/decomposition.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/src/cds/ml/ensemble.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/src/cds/ml/linear_models.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/src/cds/ml/metrics.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/src/cds/ml/naive_bayes.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/src/cds/ml/neighbors.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/src/cds/ml/neural.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/src/cds/ml/preprocessing.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/src/cds/ml/tree.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/src/cds/modeling/__init__.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/src/cds/modeling/_base.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/src/cds/modeling/_nodes.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/src/cds/modeling/expression.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/src/cds/modeling/fitting.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/src/cds/modeling/model.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/src/cds/modeling/solver.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/src/cds/montecarlo/__init__.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/src/cds/montecarlo/markov.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/src/cds/montecarlo/methods.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/src/cds/nlp/__init__.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/src/cds/nlp/attention.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/src/cds/nlp/autograd/__init__.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/src/cds/nlp/autograd/_grad.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/src/cds/nlp/autograd/ops.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/src/cds/nlp/autograd/tensor.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/src/cds/nlp/bpe.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/src/cds/nlp/data.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/src/cds/nlp/embed.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/src/cds/nlp/layers.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/src/cds/nlp/model.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/src/cds/nlp/optim.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/src/cds/nlp/training.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/src/cds/nlp/viz.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/src/cds/numerical_integration/__init__.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/src/cds/numerical_integration/quadrature.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/src/cds/optimization/__init__.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/src/cds/optimization/_metaheuristics.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/src/cds/optimization/constrained.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/src/cds/optimization/minimize.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/src/cds/pde/__init__.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/src/cds/plot/__init__.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/src/cds/plot/_backend.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/src/cds/plot/charts.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/src/cds/probability/__init__.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/src/cds/probability/_advanced.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/src/cds/probability/distributions.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/src/cds/probability/extra_distributions.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/src/cds/provenance/__init__.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/src/cds/provenance/manifest.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/src/cds/py.typed +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/src/cds/quantum/__init__.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/src/cds/quantum/circuit.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/src/cds/quantum/multi_qubit.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/src/cds/quantum/simulator.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/src/cds/scientific/__init__.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/src/cds/scientific/constants.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/src/cds/scientific/formulas.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/src/cds/sensitivity.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/src/cds/signals/__init__.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/src/cds/signals/filters.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/src/cds/signals/processing.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/src/cds/signals/stft.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/src/cds/signals/wavelet.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/src/cds/stats/__init__.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/src/cds/stats/_distributions.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/src/cds/stats/bootstrap.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/src/cds/stats/descriptive.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/src/cds/stats/hypothesis_tests.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/src/cds/stats/multiple_testing.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/src/cds/stats/nonparametric.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/src/cds/stats/power.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/src/cds/stats/regression.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/src/cds/stats/time_series.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/src/cds/tools/__init__.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/src/cds/uncertainty/__init__.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/src/cds/uncertainty/propagation.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/src/cds/units/__init__.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/src/cds/units/core.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/src/cds/validation/__init__.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/src/cds/validation/adequacy.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/src/cds/validation/checks.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/src/cds/validation/drift.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/src/cds/validation/report.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/src/cds/wavelets/__init__.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/src/cds/wavelets/haar.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/src/cds/workflow/__init__.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/src/cds/workflow/engine.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/src/cds/workflow/gates.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/src/cds/workflow/orchestrator.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/src/cds/workflow/selection.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/src/cds/workflow/tooling.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/src/cds/workflow/types.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/tests/__init__.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/tests/conftest.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/tests/test_advanced_fitting.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/tests/test_audit_completion_coverage.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/tests/test_audit_guard_coverage.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/tests/test_audit_hardening.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/tests/test_audit_hardening_coverage.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/tests/test_bayes_v2.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/tests/test_benchmarks.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/tests/test_causal.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/tests/test_cli_color.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/tests/test_cli_extended.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/tests/test_cli_system_info.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/tests/test_codemeta_version_lockstep.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/tests/test_constrained_opt.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/tests/test_core.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/tests/test_data_analysis.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/tests/test_data_analysis_lazy_bridge.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/tests/test_data_analysis_pandas_io.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/tests/test_data_io.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/tests/test_data_io_optional_backends.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/tests/test_data_io_scientific.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/tests/test_dataset.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/tests/test_dev_numpy_pin_contract.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/tests/test_diffeq.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/tests/test_diffeq_implicit.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/tests/test_domain_validation.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/tests/test_edge_misc_numerical.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/tests/test_edge_ml_quantum_linalg.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/tests/test_edge_nlp.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/tests/test_edge_quantum_evaluator_cli.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/tests/test_edge_stats_optimization_signals.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/tests/test_extra_distributions.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/tests/test_fft2.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/tests/test_fractals.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/tests/test_genetics.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/tests/test_graph.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/tests/test_hardening_privacy_provenance.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/tests/test_hypothesis.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/tests/test_hypothesis_engine.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/tests/test_hypothesis_mining.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/tests/test_hypothesis_tests.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/tests/test_infotheory.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/tests/test_interpolate.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/tests/test_knowledge.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/tests/test_layering.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/tests/test_linalg_extended.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/tests/test_linalg_qr_cholesky.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/tests/test_markov.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/tests/test_math_utils.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/tests/test_ml_boosting.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/tests/test_ml_clustering.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/tests/test_ml_ensemble.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/tests/test_ml_knn.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/tests/test_ml_linreg.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/tests/test_ml_logreg.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/tests/test_ml_metrics.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/tests/test_ml_model_selection.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/tests/test_ml_naive_bayes.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/tests/test_ml_pca.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/tests/test_ml_preprocessing.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/tests/test_ml_tree.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/tests/test_ml_viz.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/tests/test_ml_voting.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/tests/test_modeling.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/tests/test_modeling_fit_validation.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/tests/test_montecarlo.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/tests/test_multi_qubit.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/tests/test_nlp_attention.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/tests/test_nlp_autograd.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/tests/test_nlp_bpe.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/tests/test_nlp_embed.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/tests/test_nlp_layers.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/tests/test_nlp_model.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/tests/test_nlp_training.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/tests/test_nlp_viz.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/tests/test_numerical_integration.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/tests/test_numerical_invariants.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/tests/test_numerical_oracles.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/tests/test_optimization.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/tests/test_optimization_metaheuristics.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/tests/test_path_confinement.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/tests/test_pde.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/tests/test_plot_charts.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/tests/test_plot_lazy.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/tests/test_power.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/tests/test_probability.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/tests/test_probability_advanced.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/tests/test_property_invariants.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/tests/test_provenance.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/tests/test_provenance_audit_hardening.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/tests/test_public_api.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/tests/test_quantum.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/tests/test_readme_badges.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/tests/test_readme_surface.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/tests/test_retrieval.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/tests/test_runtime_dependency_graph.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/tests/test_scientific.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/tests/test_selection_audit_hardening.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/tests/test_sensitivity.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/tests/test_sensitivity_global.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/tests/test_signals.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/tests/test_signals_filters.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/tests/test_special_invariants.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/tests/test_special_numerics.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/tests/test_statistical_audit.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/tests/test_stats.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/tests/test_stats_audit_coverage.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/tests/test_stats_multiple_testing.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/tests/test_stats_nonparametric.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/tests/test_stats_time_series.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/tests/test_stft.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/tests/test_streaming_analytics.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/tests/test_svd.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/tests/test_symplectic.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/tests/test_uncertainty.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/tests/test_units.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/tests/test_validation.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/tests/test_validation_adequacy.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/tests/test_validation_advanced.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/tests/test_validation_drift.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/tests/test_wavelet.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/tests/test_wavelets_v2.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/tests/test_workflow.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/tests/test_workflow_gates.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/tests/test_workflow_orchestrator.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/tests/test_workflow_orchestrator_blocked_review.py +0 -0
- {scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/tests/test_workflow_selection.py +0 -0
- {scientific_computing_system-2.2.1 → 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
|
-
|
|
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: |
|
|
@@ -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
|
{scientific_computing_system-2.2.1 → scientific_computing_system-2.2.2}/.github/workflows/tests.yml
RENAMED
|
@@ -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
|
|
@@ -7,6 +7,138 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [v2.2.2] - 2026-10-05
|
|
11
|
+
|
|
12
|
+
Clears the last 17 open CodeQL alerts in this repository. None of them was a
|
|
13
|
+
security vulnerability, and **none was a logic defect** — no discarded result, no
|
|
14
|
+
missing `return`. Nothing is suppressed: there is no `# nosec`, no path exclusion
|
|
15
|
+
and no `codeql.config` entry.
|
|
16
|
+
|
|
17
|
+
### Behaviour change
|
|
18
|
+
|
|
19
|
+
**One, and it is a removal:** the private path `cds.cli._parser._build_parser` no
|
|
20
|
+
longer resolves.
|
|
21
|
+
|
|
22
|
+
`_build_parser` was an alias for `build_parser`, kept for backwards
|
|
23
|
+
compatibility. It was defined in `cds.cli._parser` but imported and re-exported by
|
|
24
|
+
`cds.cli.__init__`, so within its own module it was genuinely unreferenced —
|
|
25
|
+
which is exactly what `py/unused-global-variable` reported. The assignment has
|
|
26
|
+
moved to `cds.cli.__init__`, beside its only consumer and inside the `__all__`
|
|
27
|
+
that already exports it.
|
|
28
|
+
|
|
29
|
+
- `cds.cli._build_parser` is unchanged: still present, still in `__all__`, still
|
|
30
|
+
the same object as `cds.cli.build_parser`. This is the documented
|
|
31
|
+
backwards-compatibility surface and it keeps working.
|
|
32
|
+
- `cds.cli._parser._build_parser` is gone. Nothing in this repository referenced
|
|
33
|
+
it and the name is underscore-private, but a downstream script that reached
|
|
34
|
+
into the private submodule would break.
|
|
35
|
+
|
|
36
|
+
There is now a test pinning the alias, because the original defect was that
|
|
37
|
+
nothing asserted it existed.
|
|
38
|
+
|
|
39
|
+
### Fixed
|
|
40
|
+
|
|
41
|
+
- **Protocol placeholders are docstrings, not bare `...`.** Nine
|
|
42
|
+
`py/ineffectual-statement` alerts across `src/cds/ml/model_selection.py`,
|
|
43
|
+
`src/cds/ml/voting.py` and `src/cds/tools/adapters.py` were the conventional
|
|
44
|
+
`...` terminating a `typing.Protocol` method. These are false positives in the
|
|
45
|
+
strict sense: `...` is the documented placeholder for a structurally-typed
|
|
46
|
+
method whose implementation lives in the real backend module, and no code path
|
|
47
|
+
executes it. `SoftVotingModel` is the only `@runtime_checkable` one, and
|
|
48
|
+
`isinstance` against a runtime protocol inspects attribute *presence* without
|
|
49
|
+
calling the body.
|
|
50
|
+
|
|
51
|
+
They became docstrings rather than `pass` because coverage.py excludes an
|
|
52
|
+
ellipsis-only body but counts `pass`; measured, swapping it in drops those
|
|
53
|
+
lines from 100% to 75% and breaks the coverage gate. `raise NotImplementedError`
|
|
54
|
+
has the same coverage problem and would additionally change behaviour if the
|
|
55
|
+
body were ever reached. `src/cds` already contained nine docstring-only bodies
|
|
56
|
+
with no alert on any of them.
|
|
57
|
+
|
|
58
|
+
- **`src/cds/tools/registry.py` imports `importlib` one way.** Three spellings
|
|
59
|
+
were mixed: `import importlib`, `import importlib.util` and
|
|
60
|
+
`from importlib import metadata`. The first was fully subsumed by the second.
|
|
61
|
+
Now `import importlib.metadata` and `import importlib.util`, with call sites
|
|
62
|
+
fully qualified. Four monkeypatch targets in `tests/` were retargeted to match.
|
|
63
|
+
|
|
64
|
+
- **Four `py/unnecessary-lambda` alerts in the test suite.** `lambda x: max(x)`
|
|
65
|
+
and `lambda values: sum(values)` are plain wrappers around a callable; the
|
|
66
|
+
callables are now passed directly.
|
|
67
|
+
|
|
68
|
+
- **`tests/test_fitting_bootstrap.py` imports `cds.modeling.fitting` one way.**
|
|
69
|
+
A module-level `from ... import` coexisted with function-local
|
|
70
|
+
`import ... as fitting`. The single `import ... as fitting` form is used now and
|
|
71
|
+
the module-level names are qualified through it.
|
|
72
|
+
|
|
73
|
+
### Added
|
|
74
|
+
|
|
75
|
+
- **`tests/test_protocol_placeholders.py`** pins the protocol bodies on the AST,
|
|
76
|
+
because a docstring-only body and a docstring followed by `pass` compile to
|
|
77
|
+
almost identical instructions and only the syntax tree tells them apart. It also
|
|
78
|
+
asserts the placeholder semantics (`None` when called unbound), that
|
|
79
|
+
`SoftVotingModel` is still a working structural contract, and that every
|
|
80
|
+
declared signature and annotation still resolves. Negative-controlled against
|
|
81
|
+
four mutations, all caught: docstring-plus-`pass`, `...` reinstated, body
|
|
82
|
+
replaced by a real statement, and a statement appended after the docstring.
|
|
83
|
+
|
|
84
|
+
### Changed
|
|
85
|
+
|
|
86
|
+
- README's pasted `cds --version` transcript now reads `System version 2.2.2`.
|
|
87
|
+
Every provenance and attestation statement in `README.md` and `SECURITY.md`
|
|
88
|
+
still refers to **2.2.1** deliberately: those describe the published release,
|
|
89
|
+
including its digests, and remain true until a newer one ships.
|
|
90
|
+
|
|
91
|
+
|
|
92
|
+
### Fixed
|
|
93
|
+
|
|
94
|
+
- **Provenance claims are now scoped, measured, and guarded.** A follow-up report
|
|
95
|
+
asserted that PyPI had no PEP 740 attestation either. Re-measured directly, that
|
|
96
|
+
is **not** the case, so the previous text was left standing and made precise
|
|
97
|
+
rather than weakened:
|
|
98
|
+
|
|
99
|
+
- PyPI **2.2.1** serves a PEP 740 provenance bundle for **both** the wheel and
|
|
100
|
+
the sdist (HTTP 200 on the per-file `/integrity/.../provenance` endpoint),
|
|
101
|
+
and each bundle's `subject` digest equals the `sha256` PyPI publishes for
|
|
102
|
+
that file. The 404 in the report came from requesting
|
|
103
|
+
`https://pypi.org/integrity/scientific-computing-system/2.2.1/`, which is a
|
|
104
|
+
directory, not the per-file endpoint.
|
|
105
|
+
- npm **2.2.1** has **no** attestation: the attestations endpoint returns 404.
|
|
106
|
+
This part of the report was correct.
|
|
107
|
+
|
|
108
|
+
The security posture is therefore unchanged and more precisely stated. What
|
|
109
|
+
changed: `SECURITY.md` now separates the three things that were being conflated
|
|
110
|
+
— a **PEP 740 attestation** (Sigstore-signed, attests *who built this*),
|
|
111
|
+
**npm `dist.signatures`** (registry transport signing, attests nothing about
|
|
112
|
+
the build), and a **content digest** (`sha256` on PyPI, `dist.integrity` on
|
|
113
|
+
npm; pins *which bytes*, not *where they came from*). It lists the published
|
|
114
|
+
digests to pin, gives the commands that verify them, and states the exact
|
|
115
|
+
trusted-publisher coordinates still to be registered for npm.
|
|
116
|
+
|
|
117
|
+
- **Reproducible-build claim scoped to what was actually measured.** Two
|
|
118
|
+
consecutive builds of the same commit with the same pinned backend produced
|
|
119
|
+
byte-identical wheel and sdist. Those digests do **not** match the published
|
|
120
|
+
ones (the release runs a hash-locked Linux toolchain; the check ran elsewhere),
|
|
121
|
+
so the documentation now claims determinism for a fixed toolchain and
|
|
122
|
+
explicitly declines to claim the published artifacts are bit-for-bit
|
|
123
|
+
reproducible from source.
|
|
124
|
+
|
|
125
|
+
- **npm launcher prerequisite re-verified.** With `cds` absent from `PATH`, the
|
|
126
|
+
shim proceeds straight to interpreter resolution (`python`/`python3`/`py`) and
|
|
127
|
+
runs `python -m cds`; it never looks for a `cds` console script. README,
|
|
128
|
+
`SECURITY.md` and the docs already agreed on this wording, and it is now
|
|
129
|
+
backed by an explicit check rather than by reading the source.
|
|
130
|
+
|
|
131
|
+
### Added
|
|
132
|
+
|
|
133
|
+
- `docs/checks/verify_provenance_claims.py` — a guard that parses the attestation
|
|
134
|
+
claims out of `README.md` and `SECURITY.md` and compares them against the live
|
|
135
|
+
registries, failing if the prose asserts something the registries contradict.
|
|
136
|
+
It also rejects prose that overstates `dist.integrity` as provenance or allows
|
|
137
|
+
the attested subject to differ from the published digest. Negative-controlled:
|
|
138
|
+
three false claims (PyPI not attested, npm attested, digest mismatch acceptable)
|
|
139
|
+
each turn it red. Wiring it into CI is left to the workflow owner; this change
|
|
140
|
+
is docs-only by scope.
|
|
141
|
+
|
|
10
142
|
## [v2.2.1] - 2026-10-04
|
|
11
143
|
|
|
12
144
|
Documentation and release-surface corrections. **No library behaviour change**:
|
|
@@ -5,7 +5,7 @@ title: "scientific-computing-system"
|
|
|
5
5
|
# Keep `version` in lockstep with pyproject.toml [project].version and
|
|
6
6
|
# src/cds/_version.py. scripts/check_version_discipline.py and
|
|
7
7
|
# scripts/check_version_lockstep.py enforce this.
|
|
8
|
-
version: 2.2.
|
|
8
|
+
version: 2.2.2
|
|
9
9
|
authors:
|
|
10
10
|
- name: "Furox-Art"
|
|
11
11
|
email: "furkanarkn1451@gmail.com"
|
|
@@ -21,7 +21,7 @@ abstract: >-
|
|
|
21
21
|
license: MIT
|
|
22
22
|
repository-code: "https://github.com/Furox-Art/scientific-computing-system"
|
|
23
23
|
url: "https://github.com/Furox-Art/scientific-computing-system"
|
|
24
|
-
date-released: "2026-10-
|
|
24
|
+
date-released: "2026-10-05"
|
|
25
25
|
keywords:
|
|
26
26
|
- "pure python"
|
|
27
27
|
- "scientific computing"
|
|
@@ -50,5 +50,5 @@ preferred-citation:
|
|
|
50
50
|
authors:
|
|
51
51
|
- name: "Furox-Art"
|
|
52
52
|
year: 2026
|
|
53
|
-
version: 2.2.
|
|
53
|
+
version: 2.2.2
|
|
54
54
|
url: "https://github.com/Furox-Art/scientific-computing-system"
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: scientific-computing-system
|
|
3
|
-
Version: 2.2.
|
|
3
|
+
Version: 2.2.2
|
|
4
4
|
Summary: A pure-Python computational science platform for numerical methods, modeling, validation, uncertainty, scientific workflows, dimensional analysis, and optional research-data backends. Zero runtime dependencies.
|
|
5
5
|
Project-URL: Homepage, https://github.com/Furox-Art/scientific-computing-system
|
|
6
6
|
Project-URL: Repository, https://github.com/Furox-Art/scientific-computing-system
|
|
@@ -146,10 +146,20 @@ The import name is **`cds`** (the distribution is `scientific-computing-system`)
|
|
|
146
146
|
| **npm** (a launcher shim) | `npm i -g scientific-computing-system` | A thin Node wrapper that runs `python -m cds`. It ships no Python and needs the Python distribution installed so that `python -m cds` resolves. |
|
|
147
147
|
|
|
148
148
|
Both channels are published at the same version. They are **not** equally
|
|
149
|
-
verifiable:
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
149
|
+
verifiable:
|
|
150
|
+
|
|
151
|
+
- **PyPI** — carries a **PEP 740 provenance attestation** (Sigstore-signed,
|
|
152
|
+
binding the file digest to the publishing workflow). Verified on 2.2.1.
|
|
153
|
+
- **npm** — carries **no** attestation; the npmjs.com trusted publisher is not
|
|
154
|
+
registered yet, so its publish path cannot mint one. npm does expose
|
|
155
|
+
`dist.integrity` (sha512), which is a content pin, not proof of origin, and
|
|
156
|
+
`dist.signatures`, which is npm's registry transport signature, not build
|
|
157
|
+
provenance.
|
|
158
|
+
|
|
159
|
+
Prefer PyPI for anything security-sensitive.
|
|
160
|
+
[SECURITY.md](SECURITY.md#distribution-channels-and-provenance) has the
|
|
161
|
+
per-channel table, the published digests to pin, the commands to verify them,
|
|
162
|
+
and what to register to close the npm gap.
|
|
153
163
|
|
|
154
164
|
## What's inside
|
|
155
165
|
|
|
@@ -259,7 +269,7 @@ The package installs a `cds` command with 13 subcommands:
|
|
|
259
269
|
|
|
260
270
|
```console
|
|
261
271
|
$ cds --version
|
|
262
|
-
System version 2.2.
|
|
272
|
+
System version 2.2.2
|
|
263
273
|
$ cds constants # physical constants table
|
|
264
274
|
```
|
|
265
275
|
|
|
@@ -50,10 +50,20 @@ The import name is **`cds`** (the distribution is `scientific-computing-system`)
|
|
|
50
50
|
| **npm** (a launcher shim) | `npm i -g scientific-computing-system` | A thin Node wrapper that runs `python -m cds`. It ships no Python and needs the Python distribution installed so that `python -m cds` resolves. |
|
|
51
51
|
|
|
52
52
|
Both channels are published at the same version. They are **not** equally
|
|
53
|
-
verifiable:
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
53
|
+
verifiable:
|
|
54
|
+
|
|
55
|
+
- **PyPI** — carries a **PEP 740 provenance attestation** (Sigstore-signed,
|
|
56
|
+
binding the file digest to the publishing workflow). Verified on 2.2.1.
|
|
57
|
+
- **npm** — carries **no** attestation; the npmjs.com trusted publisher is not
|
|
58
|
+
registered yet, so its publish path cannot mint one. npm does expose
|
|
59
|
+
`dist.integrity` (sha512), which is a content pin, not proof of origin, and
|
|
60
|
+
`dist.signatures`, which is npm's registry transport signature, not build
|
|
61
|
+
provenance.
|
|
62
|
+
|
|
63
|
+
Prefer PyPI for anything security-sensitive.
|
|
64
|
+
[SECURITY.md](SECURITY.md#distribution-channels-and-provenance) has the
|
|
65
|
+
per-channel table, the published digests to pin, the commands to verify them,
|
|
66
|
+
and what to register to close the npm gap.
|
|
57
67
|
|
|
58
68
|
## What's inside
|
|
59
69
|
|
|
@@ -163,7 +173,7 @@ The package installs a `cds` command with 13 subcommands:
|
|
|
163
173
|
|
|
164
174
|
```console
|
|
165
175
|
$ cds --version
|
|
166
|
-
System version 2.2.
|
|
176
|
+
System version 2.2.2
|
|
167
177
|
$ cds constants # physical constants table
|
|
168
178
|
```
|
|
169
179
|
|
|
@@ -29,8 +29,8 @@ It is also published to npm as `scientific-computing-system`, but that package i
|
|
|
29
29
|
|
|
30
30
|
| Threat | Mitigation |
|
|
31
31
|
|---|---|
|
|
32
|
-
| **Supply chain: malicious or substituted PyPI artifact** | The release workflow is the sole PyPI publish authority. It builds wheel + sdist on a GitHub-hosted runner, verifies package metadata/version, installs the built wheel, smoke-tests the installed CLI,
|
|
33
|
-
| **Supply chain: malicious or substituted npm artifact** | The npm workflow is the sole npm publish authority and gates on the registry version-existence check, a `npm pack --dry-run` tarball allowlist, and npm/Python version lockstep. **
|
|
32
|
+
| **Supply chain: malicious or substituted PyPI artifact** | The release workflow is the sole PyPI publish authority. It builds wheel + sdist on a GitHub-hosted runner from a hash-pinned toolchain, verifies package metadata/version, installs the built wheel, smoke-tests the installed CLI, and publishes through PyPI Trusted Publishing (OIDC). PyPI serves a PEP 740 provenance bundle for 2.2.1 whose subject digest matches the published `sha256`. |
|
|
33
|
+
| **Supply chain: malicious or substituted npm artifact** | The npm workflow is the sole npm publish authority and gates on the registry version-existence check, a `npm pack --dry-run` tarball allowlist, and npm/Python version lockstep. **No attestation is possible yet:** the npmjs.com trusted publisher is not registered, so the token fallback is the working mode and npm's `--provenance` cannot be honoured. Consumers can only pin `dist.integrity` until that is registered. See below. |
|
|
34
34
|
| **Registry drift** | Public PyPI is treated as the distribution registry for the library. The release integrity check requires exactly one wheel and one sdist on PyPI and requires the matching GitHub Release to contain no wheel/sdist assets. A registry-policy workflow rechecks the public PyPI package and removes accidental distribution assets from GitHub Releases. |
|
|
35
35
|
| **Dependency vulnerabilities** | The core has no required runtime dependencies. Development/test/docs lock files are audited in CI with `pip-audit`; optional backends are isolated behind extras and lazy loading. |
|
|
36
36
|
| **Code execution from package install** | The build backend is `hatchling`; there is no `setup.py` execution and package versioning is static in `pyproject.toml` plus `src/cds/_version.py`. |
|
|
@@ -40,26 +40,100 @@ It is also published to npm as `scientific-computing-system`, but that package i
|
|
|
40
40
|
|
|
41
41
|
### Distribution channels and provenance
|
|
42
42
|
|
|
43
|
+
The two channels carry **different** artifacts and **different** verification
|
|
44
|
+
properties. This section states exactly what is verifiable today. It is
|
|
45
|
+
version-specific; re-check it rather than trusting it indefinitely.
|
|
46
|
+
|
|
43
47
|
| | PyPI `scientific-computing-system` | npm `scientific-computing-system` |
|
|
44
48
|
|---|---|---|
|
|
45
49
|
| Contents | the library (wheel + sdist) | `index.js`, `bin/scs.js`, `LICENSE`, `README.md`, `CHANGELOG.md`, `SECURITY.md` — **no Python** |
|
|
46
|
-
| Requires the other channel | no | yes; `scs`
|
|
47
|
-
| Publish authentication | Trusted Publishing (OIDC) | OIDC trusted publishing
|
|
48
|
-
|
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
provenance
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
50
|
+
| Requires the other channel | no | yes; `scs` runs `python -m cds`, so the Python distribution must be installed. It resolves `python`/`python3`/`py` and does **not** look for a `cds` console script on `PATH` |
|
|
51
|
+
| Publish authentication | Trusted Publishing (OIDC) | OIDC trusted publishing implemented and default; token fallback exists |
|
|
52
|
+
| **PEP 740 provenance attestation** | **yes on 2.2.1** (verified; see below) | **none** — attestations endpoint returns 404 |
|
|
53
|
+
| **npm `dist.signatures`** | n/a | present — registry transport signature, **not** build provenance |
|
|
54
|
+
| **Content digest a consumer can pin** | `sha256` per file on the PyPI file page | `dist.integrity` (sha512) and `dist.shasum` (sha1) |
|
|
55
|
+
|
|
56
|
+
#### Three things that are easy to confuse
|
|
57
|
+
|
|
58
|
+
1. **A PEP 740 provenance attestation** is a Sigstore-signed statement binding a
|
|
59
|
+
file digest to the identity and workflow that published it. PyPI serves it
|
|
60
|
+
from `/integrity/<project>/<version>/<filename>/provenance`. It is the only
|
|
61
|
+
one of the three that attests *who built this*.
|
|
62
|
+
2. **npm's `dist.signatures`** is npm signing its own registry metadata for
|
|
63
|
+
transport integrity. It proves the metadata came from npm's key. It says
|
|
64
|
+
nothing about who built the tarball, and it is not a provenance attestation.
|
|
65
|
+
3. **A content digest** (`sha256` on PyPI, `dist.integrity`/`dist.shasum` on npm)
|
|
66
|
+
pins *which bytes* you get. Useful for integrity and for detecting a
|
|
67
|
+
substituted file; on its own it proves nothing about origin, because anyone
|
|
68
|
+
who substitutes a file also substitutes its digest.
|
|
69
|
+
|
|
70
|
+
#### What is published today, and how to check it
|
|
71
|
+
|
|
72
|
+
Verified against the live registries for **PyPI 2.2.1**:
|
|
73
|
+
|
|
74
|
+
```bash
|
|
75
|
+
# PEP 740 attestation exists (HTTP 200). Note the per-FILE path; a bare
|
|
76
|
+
# /integrity/<project>/<version>/ directory is not an endpoint and 404s.
|
|
77
|
+
curl -sS -H "Accept: application/vnd.pypi.integrity.v1+json" \
|
|
78
|
+
https://pypi.org/integrity/scientific-computing-system/2.2.1/scientific_computing_system-2.2.1-py3-none-any.whl/provenance
|
|
79
|
+
|
|
80
|
+
# The digest PyPI publishes for that file, to compare against the attestation
|
|
81
|
+
# subject (predicateType https://docs.pypi.org/attestations/publish/v1):
|
|
82
|
+
curl -sS https://pypi.org/pypi/scientific-computing-system/2.2.1/json | python -c \
|
|
83
|
+
"import json,sys; [print(f['filename'], f['digests']['sha256']) for f in json.load(sys.stdin)['urls']]"
|
|
84
|
+
|
|
85
|
+
# npm: no attestation; there IS a transport signature and an integrity digest.
|
|
86
|
+
curl -sS -o /dev/null -w '%{http_code}\n' \
|
|
87
|
+
https://registry.npmjs.org/-/npm/v1/attestations/scientific-computing-system@2.2.1 # -> 404
|
|
88
|
+
npm view scientific-computing-system@2.2.1 dist.integrity dist.shasum
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
The published PyPI 2.2.1 digests, useful for pinning:
|
|
92
|
+
|
|
93
|
+
| File | sha256 |
|
|
94
|
+
|---|---|
|
|
95
|
+
| `scientific_computing_system-2.2.1-py3-none-any.whl` | `b14b89478fdc8b11482ffd556bb6eb59c6b21887f2a09418edec7029d4569bb9` |
|
|
96
|
+
| `scientific_computing_system-2.2.1.tar.gz` | `6ba4ad4c2ebb6bef86356bcbcd251e12978737945e58d9e75b9c68860efa77f6` |
|
|
97
|
+
|
|
98
|
+
Both were confirmed to equal the `subject` digest inside their attestation
|
|
99
|
+
bundles, so the attested bytes and the published bytes are the same bytes.
|
|
100
|
+
|
|
101
|
+
#### Reproducible builds: what is and is not claimed
|
|
102
|
+
|
|
103
|
+
The build toolchain is hash-pinned (`requirements-build.lock`, installed with
|
|
104
|
+
`--require-hashes --only-binary=:all:`) and the release workflow runs
|
|
105
|
+
`python -m build --no-isolation` on that lock.
|
|
106
|
+
|
|
107
|
+
Two consecutive builds of the same commit with the same pinned backend produced
|
|
108
|
+
**byte-identical** wheel and sdist (sha256 `c7734fb5…` and `daa7dca2…`).
|
|
109
|
+
|
|
110
|
+
Those digests **do not** match the published ones, because that check ran on a
|
|
111
|
+
different platform with a locally installed backend rather than the release's
|
|
112
|
+
hash-locked Linux toolchain. So the honest statement is: *the build is
|
|
113
|
+
deterministic for a fixed toolchain, and this repository does not currently
|
|
114
|
+
claim that the published artifacts are bit-for-bit reproducible from source.*
|
|
115
|
+
Treat the published digests above as the pin to use, not a rebuild target.
|
|
116
|
+
|
|
117
|
+
#### When provenance will appear
|
|
118
|
+
|
|
119
|
+
The OIDC plumbing is implemented on both sides; the registries-side trusted
|
|
120
|
+
publisher records are **not yet in place**, so an npm release cannot carry an
|
|
121
|
+
attestation yet:
|
|
122
|
+
|
|
123
|
+
- **PyPI** — Trusted Publisher: owner `Furox-Art`, repository
|
|
124
|
+
`scientific-computing-system`, workflow `release.yml`, environment `pypi`.
|
|
125
|
+
Already exercised: 2.2.1 was published through it and is attested.
|
|
126
|
+
- **npm** — Trusted Publisher: owner `Furox-Art`, repository
|
|
127
|
+
`scientific-computing-system`, workflow `npm-publish.yml`, environment `npm`.
|
|
128
|
+
**Pending registration.** Until it exists, the default OIDC path cannot
|
|
129
|
+
complete a publish, and the token fallback — which cannot mint a Sigstore
|
|
130
|
+
identity — is the only working mode. That is why the published npm artifacts
|
|
131
|
+
have no attestation.
|
|
132
|
+
|
|
133
|
+
**Practical consequence:** for anything security-sensitive, install from PyPI and
|
|
134
|
+
check the PEP 740 bundle against the digests PyPI publishes. Do not rely on the
|
|
135
|
+
npm channel for supply-chain assurance today; treat its `dist.integrity` as an
|
|
136
|
+
integrity pin only.
|
|
63
137
|
|
|
64
138
|
### Optional Backend Boundary
|
|
65
139
|
|
|
@@ -87,7 +161,7 @@ In particular, `sympy_verify_identity()` passes caller-provided symbolic strings
|
|
|
87
161
|
|
|
88
162
|
1. **Pin the package version** in reproducible environments, for example `pip install "scientific-computing-system==X.Y.Z"` with the exact release you have evaluated, rather than an unconstrained range. Deliberately no concrete version is written here: a pinned example goes stale at the next release and readers copy it regardless, so take the number from the [release notes](https://github.com/Furox-Art/scientific-computing-system/releases) for the release you are deploying, and record it in your own lockfile or constraints file.
|
|
89
163
|
2. **Install only the optional extras you need.** Fewer third-party packages reduce supply-chain and compatibility surface.
|
|
90
|
-
3. **Verify provenance for high-assurance use.**
|
|
164
|
+
3. **Verify provenance for high-assurance use.** For PyPI, fetch the PEP 740 bundle from `/integrity/<project>/<version>/<filename>/provenance` and confirm its `subject` digest equals the `sha256` PyPI publishes for that file. There is currently **no** attestation for the npm package; its `dist.integrity` is an integrity pin, not provenance. See [Distribution channels and provenance](#distribution-channels-and-provenance).
|
|
91
165
|
4. **Treat optional backend inputs as backend inputs.** Do not pass hostile symbolic expressions or untrusted scientific files without the validation/sandboxing appropriate to SymPy, HDF5, NetCDF, or the relevant backend.
|
|
92
166
|
5. **Keep the environment current.** Review dependency updates and run vulnerability auditing against the exact environment deployed.
|
|
93
167
|
6. **Do not use the library as the sole validation layer for safety-critical conclusions.** Independent domain validation remains necessary.
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"@context": "https://doi.org/10.5063/schema/codemeta-2.0",
|
|
3
3
|
"@type": "SoftwareSourceCode",
|
|
4
4
|
"name": "scientific-computing-system",
|
|
5
|
-
"version": "2.2.
|
|
5
|
+
"version": "2.2.2",
|
|
6
6
|
"description": "Pure-Python computational science platform for numerical methods, modeling, validation, uncertainty, and scientific workflows. Zero runtime dependencies. This is the front door; scientific-computing-system-2.0 is the NumPy build of the same work.",
|
|
7
7
|
"license": "https://spdx.org/licenses/MIT",
|
|
8
8
|
"codeRepository": "https://github.com/Furox-Art/scientific-computing-system",
|
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
"name": "Furox-Art"
|
|
18
18
|
}
|
|
19
19
|
],
|
|
20
|
-
"datePublished": "2026-10-
|
|
20
|
+
"datePublished": "2026-10-05",
|
|
21
21
|
"keywords": [
|
|
22
22
|
"scientific computing",
|
|
23
23
|
"numerical methods",
|