scientific-computing-system 2.2.12__tar.gz → 2.2.14__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.12 → scientific_computing_system-2.2.14}/.github/workflows/changelog.yml +26 -4
- scientific_computing_system-2.2.14/.github/workflows/dependency-review.yml +19 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/.github/workflows/npm-publish.yml +165 -19
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/.github/workflows/pr-automation.yml +17 -1
- scientific_computing_system-2.2.12/.github/workflows/pypi-registry-smoke.yml → scientific_computing_system-2.2.14/.github/workflows/pypi-release-policy.yml +38 -38
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/.github/workflows/release.yml +246 -23
- scientific_computing_system-2.2.14/.github/workflows/scorecard.yml +37 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/.github/workflows/tests.yml +24 -13
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/CHANGELOG.md +36 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/CITATION.cff +3 -3
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/CONTRIBUTING.md +1 -1
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/PKG-INFO +19 -11
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/README.md +18 -10
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/SECURITY.md +4 -2
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/codemeta.json +2 -2
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/docs/getting-started.md +1 -1
- scientific_computing_system-2.2.14/docs/maintenance.md +122 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/npm.test.js +78 -19
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/package.json +1 -1
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/pyproject.toml +2 -3
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/requirements-dev.lock +3 -3
- scientific_computing_system-2.2.14/scripts/publish.py +149 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/src/cds/_version.py +2 -2
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/src/cds/cli/_handlers.py +3 -1
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/src/cds/diffeq/solvers.py +15 -4
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/src/cds/math_utils/linalg.py +3 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/src/cds/nlp/__init__.py +2 -3
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/src/cds/nlp/attention.py +2 -2
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/src/cds/nlp/autograd/__init__.py +2 -3
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/src/cds/nlp/autograd/ops.py +2 -3
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/src/cds/nlp/training.py +1 -2
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/src/cds/optimization/minimize.py +8 -1
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/tests/test_cli_exit_codes.py +3 -0
- scientific_computing_system-2.2.14/tests/test_hardening_20261023.py +40 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/tests/test_path_confinement.py +72 -9
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/tests/test_release_contract.py +94 -7
- scientific_computing_system-2.2.12/docs/maintenance.md +0 -61
- scientific_computing_system-2.2.12/scripts/publish.py +0 -203
- scientific_computing_system-2.2.12/scripts/verify_pypi_release.py +0 -97
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/.github/workflows/benchmarks.yml +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/.github/workflows/bot-reviewer.yml +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/.github/workflows/cli-package-smoke.yml +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/.github/workflows/codeql.yml +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/.gitignore +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/LICENSE +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/benchmarks/results.json +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/benchmarks/robust_runner.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/benchmarks/run_benchmarks.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/bin/scs.js +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/dashboard/app.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/docs/ARCHITECTURE.md +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/docs/CASE_STUDY_HUBBLE.md +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/docs/CASE_STUDY_QUANTUM_ML.md +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/docs/api.md +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/docs/assets/icon.svg +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/docs/assets/logo.svg +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/docs/benchmarks.md +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/docs/checks/verify_provenance_claims.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/docs/cookbook.md +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/docs/index.md +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/docs/ml_reference.md +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/docs/related.md +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/docs/research-workflows.md +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/docs/stylesheets/extra.css +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/docs/tour_of_numerical_methods.md +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/docs/tutorials/core_demo.md +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/docs/tutorials/data_analysis_demo.md +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/docs/tutorials/diffeq_demo.md +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/docs/tutorials/fft2_demo.md +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/docs/tutorials/graph_demo.md +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/docs/tutorials/hypothesis_demo.md +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/docs/tutorials/hypothesis_tests_demo.md +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/docs/tutorials/hypothesis_with_stats_demo.md +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/docs/tutorials/knowledge_demo.md +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/docs/tutorials/linalg_demo.md +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/docs/tutorials/math_utils_demo.md +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/docs/tutorials/ml_advanced_demo.md +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/docs/tutorials/ml_and_viz_demo.md +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/docs/tutorials/ml_demo.md +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/docs/tutorials/modeling_demo.md +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/docs/tutorials/montecarlo_demo.md +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/docs/tutorials/nlp_attention_demo.md +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/docs/tutorials/nlp_bpe_demo.md +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/docs/tutorials/nlp_mini_gpt_demo.md +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/docs/tutorials/nlp_viz.md +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/docs/tutorials/numerical_integration_demo.md +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/docs/tutorials/optimization_demo.md +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/docs/tutorials/pandas_io_demo.md +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/docs/tutorials/pca_demo.md +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/docs/tutorials/probability_demo.md +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/docs/tutorials/quantum_demo.md +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/docs/tutorials/quick_start.md +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/docs/tutorials/scientific_demo.md +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/docs/tutorials/signals_demo.md +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/docs/tutorials/stats_demo.md +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/docs/tutorials/stiff_ode_demo.md +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/docs/tutorials/time_series_demo.md +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/docs/why-pure-python.md +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/examples/core_demo.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/examples/data_analysis_demo.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/examples/diffeq_demo.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/examples/discovery_pipeline_demo.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/examples/ensemble_showcase.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/examples/fft2_demo.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/examples/graph_demo.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/examples/hypothesis_custom_generator.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/examples/hypothesis_demo.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/examples/hypothesis_tests_demo.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/examples/hypothesis_with_stats_demo.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/examples/interpolate_demo.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/examples/knowledge_demo.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/examples/linalg_demo.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/examples/math_utils_demo.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/examples/ml_and_viz_demo.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/examples/modeling_demo.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/examples/montecarlo_demo.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/examples/nlp_attention_demo.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/examples/nlp_bpe_demo.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/examples/nlp_mini_gpt_demo.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/examples/nlp_viz_demo.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/examples/numerical_integration_demo.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/examples/optimization_demo.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/examples/pca_demo.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/examples/pde_demo.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/examples/plot_demo.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/examples/plotting_notebook.ipynb +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/examples/probability_demo.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/examples/quantum_demo.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/examples/scientific_demo.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/examples/signals_demo.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/examples/stats_demo.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/examples/tour_of_numerical_methods.ipynb +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/index.js +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/mkdocs.yml +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/paper.bib +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/paper.md +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/requirements-build.lock +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/requirements.lock +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/scripts/check_release_toolchain.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/scripts/check_version_discipline.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/scripts/check_version_lockstep.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/scripts/verify_cli_install.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/scripts/verify_cookbook.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/scripts/verify_ml_reference.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/scripts/verify_release_integrity.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/src/cds/__init__.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/src/cds/__main__.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/src/cds/_paths.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/src/cds/bayes/__init__.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/src/cds/bayes/conjugate.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/src/cds/causal.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/src/cds/cli/__init__.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/src/cds/cli/__main__.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/src/cds/cli/_exit_codes.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/src/cds/cli/_parser.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/src/cds/cli/_style.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/src/cds/cli/_system_info.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/src/cds/core/__init__.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/src/cds/core/_numeric.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/src/cds/core/models.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/src/cds/data_analysis/__init__.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/src/cds/data_analysis/dataset.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/src/cds/data_analysis/loader.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/src/cds/data_analysis/pandas_io.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/src/cds/data_analysis/transform.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/src/cds/data_analysis/viz.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/src/cds/data_io/__init__.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/src/cds/data_io/scientific.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/src/cds/data_io/streaming.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/src/cds/diffeq/__init__.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/src/cds/diffeq/_implicit.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/src/cds/diffeq/symplectic.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/src/cds/fractals/__init__.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/src/cds/fractals/sets.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/src/cds/genetics/__init__.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/src/cds/genetics/sequence.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/src/cds/graph/__init__.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/src/cds/graph/algorithms.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/src/cds/hypothesis/__init__.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/src/cds/hypothesis/evaluator.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/src/cds/hypothesis/generator.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/src/cds/hypothesis/mining.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/src/cds/infotheory/__init__.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/src/cds/infotheory/measures.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/src/cds/interpolate/__init__.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/src/cds/knowledge/__init__.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/src/cds/knowledge/graph.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/src/cds/knowledge/notes.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/src/cds/knowledge/retrieval.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/src/cds/math_utils/__init__.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/src/cds/math_utils/calculus.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/src/cds/math_utils/special.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/src/cds/math_utils/svd.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/src/cds/ml/__init__.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/src/cds/ml/boosting.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/src/cds/ml/clustering.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/src/cds/ml/decomposition.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/src/cds/ml/ensemble.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/src/cds/ml/linear_models.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/src/cds/ml/metrics.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/src/cds/ml/model_selection.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/src/cds/ml/naive_bayes.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/src/cds/ml/neighbors.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/src/cds/ml/neural.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/src/cds/ml/preprocessing.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/src/cds/ml/tree.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/src/cds/ml/voting.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/src/cds/modeling/__init__.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/src/cds/modeling/_base.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/src/cds/modeling/_nodes.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/src/cds/modeling/expression.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/src/cds/modeling/fitting.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/src/cds/modeling/model.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/src/cds/modeling/solver.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/src/cds/montecarlo/__init__.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/src/cds/montecarlo/markov.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/src/cds/montecarlo/methods.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/src/cds/nlp/autograd/_grad.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/src/cds/nlp/autograd/tensor.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/src/cds/nlp/bpe.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/src/cds/nlp/data.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/src/cds/nlp/embed.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/src/cds/nlp/layers.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/src/cds/nlp/model.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/src/cds/nlp/optim.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/src/cds/nlp/viz.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/src/cds/numerical_integration/__init__.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/src/cds/numerical_integration/quadrature.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/src/cds/optimization/__init__.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/src/cds/optimization/_metaheuristics.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/src/cds/optimization/constrained.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/src/cds/pde/__init__.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/src/cds/plot/__init__.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/src/cds/plot/_backend.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/src/cds/plot/charts.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/src/cds/probability/__init__.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/src/cds/probability/_advanced.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/src/cds/probability/distributions.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/src/cds/probability/extra_distributions.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/src/cds/provenance/__init__.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/src/cds/provenance/manifest.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/src/cds/py.typed +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/src/cds/quantum/__init__.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/src/cds/quantum/circuit.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/src/cds/quantum/multi_qubit.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/src/cds/quantum/simulator.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/src/cds/scientific/__init__.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/src/cds/scientific/constants.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/src/cds/scientific/formulas.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/src/cds/sensitivity.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/src/cds/signals/__init__.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/src/cds/signals/filters.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/src/cds/signals/processing.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/src/cds/signals/stft.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/src/cds/signals/wavelet.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/src/cds/stats/__init__.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/src/cds/stats/_distributions.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/src/cds/stats/bootstrap.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/src/cds/stats/descriptive.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/src/cds/stats/hypothesis_tests.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/src/cds/stats/multiple_testing.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/src/cds/stats/nonparametric.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/src/cds/stats/power.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/src/cds/stats/regression.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/src/cds/stats/time_series.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/src/cds/tools/__init__.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/src/cds/tools/adapters.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/src/cds/tools/registry.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/src/cds/uncertainty/__init__.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/src/cds/uncertainty/propagation.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/src/cds/units/__init__.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/src/cds/units/core.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/src/cds/validation/__init__.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/src/cds/validation/adequacy.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/src/cds/validation/checks.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/src/cds/validation/drift.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/src/cds/validation/report.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/src/cds/wavelets/__init__.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/src/cds/wavelets/haar.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/src/cds/workflow/__init__.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/src/cds/workflow/engine.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/src/cds/workflow/gates.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/src/cds/workflow/orchestrator.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/src/cds/workflow/selection.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/src/cds/workflow/tooling.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/src/cds/workflow/types.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/tests/__init__.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/tests/conftest.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/tests/test_advanced_fitting.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/tests/test_audit_completion_coverage.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/tests/test_audit_guard_coverage.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/tests/test_audit_hardening.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/tests/test_audit_hardening_c1.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/tests/test_audit_hardening_c2.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/tests/test_audit_hardening_c3.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/tests/test_audit_hardening_c4.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/tests/test_audit_hardening_coverage.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/tests/test_audit_hardening_h1.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/tests/test_bayes_v2.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/tests/test_benchmarks.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/tests/test_bootstrap.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/tests/test_causal.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/tests/test_cli.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/tests/test_cli_color.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/tests/test_cli_extended.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/tests/test_cli_system_info.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/tests/test_codemeta_version_lockstep.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/tests/test_constrained_opt.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/tests/test_core.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/tests/test_data_analysis.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/tests/test_data_analysis_lazy_bridge.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/tests/test_data_analysis_pandas_io.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/tests/test_data_io.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/tests/test_data_io_optional_backends.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/tests/test_data_io_scientific.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/tests/test_dataset.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/tests/test_dev_numpy_pin_contract.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/tests/test_diffeq.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/tests/test_diffeq_implicit.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/tests/test_domain_validation.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/tests/test_edge_misc_numerical.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/tests/test_edge_ml_quantum_linalg.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/tests/test_edge_nlp.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/tests/test_edge_quantum_evaluator_cli.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/tests/test_edge_stats_optimization_signals.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/tests/test_extra_distributions.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/tests/test_fft2.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/tests/test_fitting_bootstrap.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/tests/test_fractals.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/tests/test_genetics.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/tests/test_graph.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/tests/test_hardening_privacy_provenance.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/tests/test_hypothesis.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/tests/test_hypothesis_engine.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/tests/test_hypothesis_mining.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/tests/test_hypothesis_tests.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/tests/test_infotheory.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/tests/test_interpolate.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/tests/test_knowledge.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/tests/test_layering.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/tests/test_linalg_extended.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/tests/test_linalg_qr_cholesky.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/tests/test_markov.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/tests/test_math_utils.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/tests/test_ml_boosting.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/tests/test_ml_clustering.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/tests/test_ml_ensemble.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/tests/test_ml_knn.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/tests/test_ml_linreg.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/tests/test_ml_logreg.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/tests/test_ml_metrics.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/tests/test_ml_model_selection.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/tests/test_ml_naive_bayes.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/tests/test_ml_pca.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/tests/test_ml_preprocessing.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/tests/test_ml_tree.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/tests/test_ml_viz.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/tests/test_ml_voting.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/tests/test_modeling.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/tests/test_modeling_fit_validation.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/tests/test_montecarlo.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/tests/test_multi_qubit.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/tests/test_nlp_attention.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/tests/test_nlp_autograd.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/tests/test_nlp_bpe.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/tests/test_nlp_embed.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/tests/test_nlp_layers.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/tests/test_nlp_model.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/tests/test_nlp_training.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/tests/test_nlp_viz.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/tests/test_numerical_integration.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/tests/test_numerical_invariants.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/tests/test_numerical_oracles.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/tests/test_optimization.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/tests/test_optimization_metaheuristics.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/tests/test_pde.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/tests/test_plot_charts.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/tests/test_plot_lazy.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/tests/test_power.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/tests/test_probability.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/tests/test_probability_advanced.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/tests/test_property_invariants.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/tests/test_protocol_placeholders.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/tests/test_provenance.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/tests/test_provenance_audit_hardening.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/tests/test_provenance_claims.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/tests/test_public_api.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/tests/test_quantum.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/tests/test_readme_badges.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/tests/test_readme_surface.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/tests/test_release_toolchain.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/tests/test_retrieval.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/tests/test_runtime_dependency_graph.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/tests/test_scientific.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/tests/test_seed_hygiene.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/tests/test_selection_audit_hardening.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/tests/test_sensitivity.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/tests/test_sensitivity_global.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/tests/test_signals.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/tests/test_signals_filters.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/tests/test_special_invariants.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/tests/test_special_numerics.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/tests/test_statistical_audit.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/tests/test_stats.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/tests/test_stats_audit_coverage.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/tests/test_stats_multiple_testing.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/tests/test_stats_nonparametric.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/tests/test_stats_time_series.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/tests/test_stft.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/tests/test_streaming_analytics.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/tests/test_svd.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/tests/test_symplectic.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/tests/test_tool_adapters.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/tests/test_tools_registry.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/tests/test_uncertainty.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/tests/test_units.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/tests/test_validation.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/tests/test_validation_adequacy.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/tests/test_validation_advanced.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/tests/test_validation_bounds_nonfinite_regression.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/tests/test_validation_derived_moments_overflow.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/tests/test_validation_derived_tolerance_overflow.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/tests/test_validation_drift.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/tests/test_validation_nonfinite_thresholds_regression.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/tests/test_validation_ood_stable_and_coverage.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/tests/test_verify_release_integrity.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/tests/test_wavelet.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/tests/test_wavelets_v2.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/tests/test_workflow.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/tests/test_workflow_gates.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/tests/test_workflow_orchestrator.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/tests/test_workflow_orchestrator_blocked_review.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/tests/test_workflow_selection.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/tests/test_workflow_selection_coverage.py +0 -0
- {scientific_computing_system-2.2.12 → scientific_computing_system-2.2.14}/tests/test_workflow_tooling.py +0 -0
|
@@ -52,11 +52,33 @@ jobs:
|
|
|
52
52
|
ref: main
|
|
53
53
|
fetch-depth: 0
|
|
54
54
|
|
|
55
|
+
# The tag is passed to git-cliff through `args`, which the pinned action
|
|
56
|
+
# interpolates into a shell command in a contents:write job. Treat the
|
|
57
|
+
# dispatch input as hostile: accept only a strict vX.Y.Z string that names
|
|
58
|
+
# an existing tag, then hand the validated output to every consumer.
|
|
59
|
+
- name: Validate the tag input
|
|
60
|
+
id: tag
|
|
61
|
+
env:
|
|
62
|
+
REQUESTED_TAG: ${{ inputs.tag }}
|
|
63
|
+
run: |
|
|
64
|
+
set -euo pipefail
|
|
65
|
+
tag="$REQUESTED_TAG"
|
|
66
|
+
tag_re='^v(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)$'
|
|
67
|
+
if [[ ! "$tag" =~ $tag_re ]]; then
|
|
68
|
+
printf '::error::inputs.tag must be a strict vX.Y.Z release tag; got: %q\n' "$tag"
|
|
69
|
+
exit 1
|
|
70
|
+
fi
|
|
71
|
+
if ! git rev-parse -q --verify "refs/tags/${tag}" >/dev/null; then
|
|
72
|
+
printf '::error::inputs.tag does not name an existing tag: %q\n' "$tag"
|
|
73
|
+
exit 1
|
|
74
|
+
fi
|
|
75
|
+
echo "tag=${tag}" >> "$GITHUB_OUTPUT"
|
|
76
|
+
|
|
55
77
|
- name: Install git-cliff
|
|
56
78
|
uses: orhun/git-cliff-action@a9a95522b26fe6403f7bb24031f21fb573d0f5ff # v4
|
|
57
79
|
with:
|
|
58
80
|
config: cliff.toml
|
|
59
|
-
args: --verbose --tag ${{
|
|
81
|
+
args: --verbose --tag ${{ steps.tag.outputs.tag }} --output CHANGELOG.md
|
|
60
82
|
|
|
61
83
|
- name: Check for changes
|
|
62
84
|
id: check
|
|
@@ -110,11 +132,11 @@ jobs:
|
|
|
110
132
|
uses: peter-evans/create-pull-request@5f6978faf089d4d20b00c7766989d076bb2fc7f1 # v8.1.1
|
|
111
133
|
with:
|
|
112
134
|
token: ${{ steps.app-token.outputs.token }}
|
|
113
|
-
commit-message: "docs(changelog): regenerate for ${{
|
|
114
|
-
title: "docs(changelog): regenerate for ${{
|
|
135
|
+
commit-message: "docs(changelog): regenerate for ${{ steps.tag.outputs.tag }}"
|
|
136
|
+
title: "docs(changelog): regenerate for ${{ steps.tag.outputs.tag }} (MANUAL — review carefully)"
|
|
115
137
|
body: |
|
|
116
138
|
Auto-generated CHANGELOG update from git history.
|
|
117
|
-
Triggered by MANUAL workflow_dispatch for tag `${{
|
|
139
|
+
Triggered by MANUAL workflow_dispatch for tag `${{ steps.tag.outputs.tag }}`.
|
|
118
140
|
|
|
119
141
|
REVIEW THE DIFF CAREFULLY before merging. git-cliff rewrites the
|
|
120
142
|
entire CHANGELOG.md from commit history; hand-curated narrative
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
name: Dependency review
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
pull_request:
|
|
5
|
+
branches: [main]
|
|
6
|
+
|
|
7
|
+
permissions:
|
|
8
|
+
contents: read
|
|
9
|
+
pull-requests: write
|
|
10
|
+
|
|
11
|
+
jobs:
|
|
12
|
+
dependency-review:
|
|
13
|
+
runs-on: ubuntu-latest
|
|
14
|
+
steps:
|
|
15
|
+
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
16
|
+
- uses: actions/dependency-review-action@a1d282b36b6f3519aa1f3fc636f609c47dddb294 # v5.0.0
|
|
17
|
+
with:
|
|
18
|
+
fail-on-severity: high
|
|
19
|
+
comment-summary-in-pr: on-failure
|
|
@@ -27,8 +27,8 @@ name: npm Publish
|
|
|
27
27
|
# `scientific-computing-system`, workflow `npm-publish.yml`, environment `npm`.
|
|
28
28
|
#
|
|
29
29
|
# Token mode (explicit opt-in, `use_token_fallback=true`). Uses the repository's
|
|
30
|
-
# NPM_TOKEN secret through NODE_AUTH_TOKEN.
|
|
31
|
-
#
|
|
30
|
+
# NPM_TOKEN secret through NODE_AUTH_TOKEN. Kept only as a break-glass path for
|
|
31
|
+
# when the trusted publisher is unavailable; it is never selected automatically.
|
|
32
32
|
#
|
|
33
33
|
# The token mode deliberately omits `--provenance`. Provenance is an OIDC-only
|
|
34
34
|
# attestation: with a token there is no OIDC identity to attest to, so npm
|
|
@@ -37,10 +37,26 @@ name: npm Publish
|
|
|
37
37
|
# cannot work or pretending an attestation was produced.
|
|
38
38
|
#
|
|
39
39
|
# Both modes are fail-closed. A requested mode with no usable credential exits 1
|
|
40
|
-
# with an actionable message.
|
|
41
|
-
# the
|
|
42
|
-
#
|
|
43
|
-
#
|
|
40
|
+
# with an actionable message. Automatic release runs use OIDC: the attestation
|
|
41
|
+
# attached to the last OIDC publish confirmed the trusted publisher is
|
|
42
|
+
# registered, so the token path is no longer the default.
|
|
43
|
+
#
|
|
44
|
+
# ## Automatic trigger after a release
|
|
45
|
+
#
|
|
46
|
+
# release.yml creates the `v*` tag with GITHUB_TOKEN, and GitHub does not start
|
|
47
|
+
# workflows from events created by GITHUB_TOKEN. The tag trigger below therefore
|
|
48
|
+
# never fires for a real release. This workflow also runs when the `Release`
|
|
49
|
+
# workflow completes; `release_gate` reads that run's jobs and proceeds only when
|
|
50
|
+
# the PyPI publish job actually succeeded, so ordinary completions and
|
|
51
|
+
# non-release runs skip instead of failing on an already-published version.
|
|
52
|
+
#
|
|
53
|
+
# ## Trigger contract
|
|
54
|
+
#
|
|
55
|
+
# A manual dispatch is accepted only from `main`, and a `v*` tag push only when
|
|
56
|
+
# the tag is exactly `v<package.json version>`. Every path additionally requires
|
|
57
|
+
# that exact version to already exist on PyPI: the npm package is a launcher for
|
|
58
|
+
# the Python distribution, so publishing it first would advertise a version that
|
|
59
|
+
# `pip install` cannot yet provide.
|
|
44
60
|
|
|
45
61
|
on:
|
|
46
62
|
workflow_dispatch:
|
|
@@ -50,14 +66,18 @@ on:
|
|
|
50
66
|
Publish mode. false (default) = OIDC trusted publishing, which mints a
|
|
51
67
|
Sigstore provenance attestation. true = token mode, using the
|
|
52
68
|
repository NPM_TOKEN secret; that mode publishes WITHOUT provenance,
|
|
53
|
-
because a token cannot mint an attestation. Use true
|
|
54
|
-
|
|
69
|
+
because a token cannot mint an attestation. Use true only as a
|
|
70
|
+
break-glass fallback when the npm trusted publisher is unavailable.
|
|
55
71
|
type: boolean
|
|
56
72
|
default: false
|
|
73
|
+
workflow_run:
|
|
74
|
+
workflows: ["Release"]
|
|
75
|
+
types: [completed]
|
|
57
76
|
push:
|
|
58
77
|
# release.yml creates the version tag only after the PyPI release succeeds.
|
|
59
78
|
# Publishing npm from that tag gives one version bump exactly one automatic
|
|
60
79
|
# npm run, avoiding the previous branch-push + tag-push duplicate race.
|
|
80
|
+
# Kept for manual tag pushes; GITHUB_TOKEN-created tags do not trigger it.
|
|
61
81
|
tags:
|
|
62
82
|
- "v*"
|
|
63
83
|
|
|
@@ -70,8 +90,38 @@ permissions:
|
|
|
70
90
|
contents: read
|
|
71
91
|
|
|
72
92
|
jobs:
|
|
93
|
+
release_gate:
|
|
94
|
+
name: Require a published release
|
|
95
|
+
if: github.event_name == 'workflow_run'
|
|
96
|
+
runs-on: ubuntu-latest
|
|
97
|
+
timeout-minutes: 5
|
|
98
|
+
permissions:
|
|
99
|
+
actions: read
|
|
100
|
+
outputs:
|
|
101
|
+
published: ${{ steps.check.outputs.published }}
|
|
102
|
+
steps:
|
|
103
|
+
- name: Check the triggering Release run published
|
|
104
|
+
id: check
|
|
105
|
+
env:
|
|
106
|
+
GH_TOKEN: ${{ github.token }}
|
|
107
|
+
RUN_ID: ${{ github.event.workflow_run.id }}
|
|
108
|
+
run: |
|
|
109
|
+
set -euo pipefail
|
|
110
|
+
conclusion="$(gh api "repos/${GITHUB_REPOSITORY}/actions/runs/${RUN_ID}/jobs?per_page=100" \
|
|
111
|
+
--jq '[.jobs[] | select(.name == "Build + verify + publish to PyPI + metadata-only GitHub Release") | .conclusion] | first // "missing"')"
|
|
112
|
+
echo "Release publish job: ${conclusion}"
|
|
113
|
+
if [ "${conclusion}" = "success" ]; then
|
|
114
|
+
echo "published=true" >> "$GITHUB_OUTPUT"
|
|
115
|
+
else
|
|
116
|
+
echo "published=false" >> "$GITHUB_OUTPUT"
|
|
117
|
+
fi
|
|
118
|
+
|
|
73
119
|
publish:
|
|
74
120
|
name: Verify and publish to npm with OIDC trusted publishing
|
|
121
|
+
needs: release_gate
|
|
122
|
+
if: |
|
|
123
|
+
always() &&
|
|
124
|
+
(github.event_name != 'workflow_run' || needs.release_gate.outputs.published == 'true')
|
|
75
125
|
runs-on: ubuntu-latest
|
|
76
126
|
timeout-minutes: 20
|
|
77
127
|
# The `npm` environment is referenced by the trusted-publisher configuration
|
|
@@ -88,6 +138,101 @@ jobs:
|
|
|
88
138
|
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
89
139
|
with:
|
|
90
140
|
persist-credentials: false
|
|
141
|
+
# Release-triggered runs must publish the exact commit that was released,
|
|
142
|
+
# not whatever main points at when the follow-up workflow starts.
|
|
143
|
+
ref: ${{ github.event_name == 'workflow_run' && github.event.workflow_run.head_sha || github.ref }}
|
|
144
|
+
|
|
145
|
+
# GATE: bind each trigger to the version it is allowed to publish.
|
|
146
|
+
#
|
|
147
|
+
# `workflow_dispatch` accepts an arbitrary ref, so without this a dispatch
|
|
148
|
+
# from a feature branch would publish whatever (possibly unreleased)
|
|
149
|
+
# package.json version that branch carries. The tag trigger is equally
|
|
150
|
+
# broad (`v*`), so a stray `v`-prefixed tag could publish a version that
|
|
151
|
+
# the checked-out package.json does not declare. Both cases end here.
|
|
152
|
+
- name: Validate the trigger ref and tag
|
|
153
|
+
shell: bash
|
|
154
|
+
env:
|
|
155
|
+
EVENT_NAME: ${{ github.event_name }}
|
|
156
|
+
REF: ${{ github.ref }}
|
|
157
|
+
run: |
|
|
158
|
+
set -euo pipefail
|
|
159
|
+
version="$(python3 -c 'import json; print(json.load(open("package.json", encoding="utf-8"))["version"])')"
|
|
160
|
+
expected_tag="v${version}"
|
|
161
|
+
case "$EVENT_NAME" in
|
|
162
|
+
workflow_dispatch)
|
|
163
|
+
if [ "$REF" != "refs/heads/main" ]; then
|
|
164
|
+
echo "::error::workflow_dispatch may only publish from main; got ${REF}"
|
|
165
|
+
echo "::error::dispatch from main so package.json is the reviewed release version"
|
|
166
|
+
exit 1
|
|
167
|
+
fi
|
|
168
|
+
echo "PASS: manual dispatch from main (package.json ${version})"
|
|
169
|
+
;;
|
|
170
|
+
push)
|
|
171
|
+
if [ "$REF" != "refs/tags/${expected_tag}" ]; then
|
|
172
|
+
echo "::error::tag ${REF} does not match package.json version ${version}"
|
|
173
|
+
echo "::error::expected refs/tags/${expected_tag}; refusing to publish a mismatched tag"
|
|
174
|
+
exit 1
|
|
175
|
+
fi
|
|
176
|
+
echo "PASS: tag ${expected_tag} matches package.json ${version}"
|
|
177
|
+
;;
|
|
178
|
+
workflow_run)
|
|
179
|
+
echo "PASS: release-triggered run (release_gate checked the PyPI publish job)"
|
|
180
|
+
;;
|
|
181
|
+
*)
|
|
182
|
+
echo "::error::unsupported trigger event: ${EVENT_NAME}"
|
|
183
|
+
exit 1
|
|
184
|
+
;;
|
|
185
|
+
esac
|
|
186
|
+
|
|
187
|
+
# GATE: npm is a launcher for the PyPI distribution, and docs/maintenance.md
|
|
188
|
+
# promises npm only proceeds when the release is already on PyPI. The
|
|
189
|
+
# workflow_run path proves that through `release_gate`; this checks the
|
|
190
|
+
# registry itself so dispatch and tag-push paths get the same guarantee.
|
|
191
|
+
# A 404, an unparsable response, or an outage is a failure, never a pass.
|
|
192
|
+
- name: Assert the exact version is already published on PyPI
|
|
193
|
+
shell: bash
|
|
194
|
+
env:
|
|
195
|
+
DISTRIBUTION: scientific-computing-system
|
|
196
|
+
run: |
|
|
197
|
+
set -euo pipefail
|
|
198
|
+
version="$(python3 -c 'import json; print(json.load(open("package.json", encoding="utf-8"))["version"])')"
|
|
199
|
+
python3 - "$DISTRIBUTION" "$version" <<'PY'
|
|
200
|
+
import json
|
|
201
|
+
import sys
|
|
202
|
+
import urllib.error
|
|
203
|
+
import urllib.request
|
|
204
|
+
|
|
205
|
+
distribution, version = sys.argv[1], sys.argv[2]
|
|
206
|
+
url = f"https://pypi.org/pypi/{distribution}/{version}/json"
|
|
207
|
+
try:
|
|
208
|
+
with urllib.request.urlopen(url, timeout=60) as response:
|
|
209
|
+
payload = json.load(response)
|
|
210
|
+
except urllib.error.HTTPError as exc:
|
|
211
|
+
print(
|
|
212
|
+
f"::error::PyPI has no {distribution} {version} (HTTP {exc.code}): {url}",
|
|
213
|
+
file=sys.stderr,
|
|
214
|
+
)
|
|
215
|
+
sys.exit(1)
|
|
216
|
+
except (urllib.error.URLError, TimeoutError, OSError) as exc:
|
|
217
|
+
print(
|
|
218
|
+
f"::error::could not verify PyPI state for {distribution} {version}: {exc}",
|
|
219
|
+
file=sys.stderr,
|
|
220
|
+
)
|
|
221
|
+
sys.exit(1)
|
|
222
|
+
|
|
223
|
+
info = payload.get("info") or {}
|
|
224
|
+
files = payload.get("urls") or []
|
|
225
|
+
wheels = [f for f in files if str(f.get("filename", "")).endswith(".whl")]
|
|
226
|
+
if info.get("version") != version or not wheels:
|
|
227
|
+
print(
|
|
228
|
+
f"::error::PyPI {distribution} {version} is not fully published "
|
|
229
|
+
f"(reported version {info.get('version')!r}, {len(files)} file(s), "
|
|
230
|
+
f"{len(wheels)} wheel(s))",
|
|
231
|
+
file=sys.stderr,
|
|
232
|
+
)
|
|
233
|
+
sys.exit(1)
|
|
234
|
+
print(f"PASS: PyPI already serves {distribution} {version} ({len(files)} files)")
|
|
235
|
+
PY
|
|
91
236
|
|
|
92
237
|
# Node 24 ships npm 11.5.1+, the floor for trusted publishing.
|
|
93
238
|
#
|
|
@@ -284,15 +429,16 @@ jobs:
|
|
|
284
429
|
|
|
285
430
|
# Two supported modes, selected by the `use_token_fallback` dispatch input.
|
|
286
431
|
#
|
|
287
|
-
# OIDC (
|
|
288
|
-
#
|
|
289
|
-
# runner's identity token for a
|
|
290
|
-
# this repository, workflow and
|
|
291
|
-
# Sigstore-signed attestation to
|
|
432
|
+
# OIDC (default, including every automatic release run): no
|
|
433
|
+
# NODE_AUTH_TOKEN is set. The npm CLI detects the OIDC environment
|
|
434
|
+
# (id-token: write above) and exchanges the runner's identity token for a
|
|
435
|
+
# short-lived publish credential scoped to this repository, workflow and
|
|
436
|
+
# environment. `--provenance` attaches a Sigstore-signed attestation to
|
|
437
|
+
# the tarball binding it to this commit.
|
|
292
438
|
#
|
|
293
439
|
# Token (explicit opt-in): uses the repository's existing NPM_TOKEN secret
|
|
294
|
-
# via NODE_AUTH_TOKEN.
|
|
295
|
-
#
|
|
440
|
+
# via NODE_AUTH_TOKEN. Break-glass only: it is never selected without a
|
|
441
|
+
# workflow_dispatch input that asks for it.
|
|
296
442
|
#
|
|
297
443
|
# The token mode does NOT pass --provenance, and must not. Provenance is an
|
|
298
444
|
# OIDC-only attestation: without a trusted-publisher configuration npm has
|
|
@@ -320,7 +466,7 @@ jobs:
|
|
|
320
466
|
if [ "${{ github.event_name }}" = "workflow_dispatch" ]; then
|
|
321
467
|
requested_token="${{ inputs.use_token_fallback }}"
|
|
322
468
|
else
|
|
323
|
-
requested_token="
|
|
469
|
+
requested_token="false"
|
|
324
470
|
fi
|
|
325
471
|
|
|
326
472
|
if [ "$requested_token" = "true" ]; then
|
|
@@ -330,7 +476,7 @@ jobs:
|
|
|
330
476
|
exit 1
|
|
331
477
|
fi
|
|
332
478
|
echo "mode=token via NPM_TOKEN (no provenance: a long-lived token cannot mint a Sigstore attestation)"
|
|
333
|
-
echo "::warning::
|
|
479
|
+
echo "::warning::Publishing with NPM_TOKEN break-glass mode; this release carries no provenance attestation."
|
|
334
480
|
else
|
|
335
481
|
if [ -z "${ACTIONS_ID_TOKEN_REQUEST_URL:-}" ] || [ -z "${ACTIONS_ID_TOKEN_REQUEST_TOKEN:-}" ]; then
|
|
336
482
|
echo "::error::OIDC mode was requested but this job cannot mint an OIDC token"
|
|
@@ -384,7 +530,7 @@ jobs:
|
|
|
384
530
|
# trusted publisher is the cause, and "bump the version" would not have
|
|
385
531
|
# helped.
|
|
386
532
|
- name: Publish to npm (OIDC trusted publishing, with provenance)
|
|
387
|
-
if: ${{
|
|
533
|
+
if: ${{ !inputs.use_token_fallback }}
|
|
388
534
|
run: |
|
|
389
535
|
# `-e` is on by default in this shell, so it is explicitly suspended
|
|
390
536
|
# around npm to capture the exit code instead of aborting before the
|
|
@@ -430,7 +576,7 @@ jobs:
|
|
|
430
576
|
echo "PASS: npm publish returned 0"
|
|
431
577
|
|
|
432
578
|
- name: Publish to npm (token mode, no provenance)
|
|
433
|
-
if: ${{
|
|
579
|
+
if: ${{ inputs.use_token_fallback }}
|
|
434
580
|
env:
|
|
435
581
|
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
|
|
436
582
|
run: |
|
|
@@ -40,12 +40,28 @@ jobs:
|
|
|
40
40
|
github.event_name == 'workflow_dispatch'
|
|
41
41
|
steps:
|
|
42
42
|
- uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0
|
|
43
|
+
env:
|
|
44
|
+
# Never interpolate a dispatch input into JavaScript source. Passing
|
|
45
|
+
# it through env keeps it a string value, and the strict check below
|
|
46
|
+
# makes malformed input fail the job instead of becoming NaN.
|
|
47
|
+
REQUESTED_PR_NUMBER: ${{ inputs.pr_number }}
|
|
43
48
|
with:
|
|
44
49
|
script: |
|
|
45
50
|
const { owner, repo } = context.repo;
|
|
46
51
|
let prNumber = context.issue ? context.issue.number : null;
|
|
47
52
|
if (context.eventName === 'workflow_dispatch') {
|
|
48
|
-
|
|
53
|
+
const raw = process.env.REQUESTED_PR_NUMBER || '';
|
|
54
|
+
if (!/^[1-9][0-9]{0,9}$/.test(raw)) {
|
|
55
|
+
core.setFailed(
|
|
56
|
+
`pr_number must be a positive integer (got ${JSON.stringify(raw)})`,
|
|
57
|
+
);
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
prNumber = Number(raw);
|
|
61
|
+
if (!Number.isSafeInteger(prNumber)) {
|
|
62
|
+
core.setFailed(`pr_number is outside the safe integer range: ${raw}`);
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
49
65
|
}
|
|
50
66
|
if (!prNumber) {
|
|
51
67
|
console.log('No PR number provided');
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
name: PyPI
|
|
1
|
+
name: PyPI Release Policy
|
|
2
2
|
|
|
3
3
|
on:
|
|
4
4
|
workflow_run:
|
|
@@ -11,52 +11,28 @@ on:
|
|
|
11
11
|
- main
|
|
12
12
|
paths:
|
|
13
13
|
- ".github/workflows/release.yml"
|
|
14
|
-
- ".github/workflows/pypi-
|
|
15
|
-
- "scripts/verify_pypi_release.py"
|
|
14
|
+
- ".github/workflows/pypi-release-policy.yml"
|
|
16
15
|
- "scripts/verify_release_integrity.py"
|
|
16
|
+
workflow_dispatch:
|
|
17
17
|
|
|
18
|
-
# Default-deny;
|
|
18
|
+
# Default-deny; the policy job below declares exactly the scopes it needs.
|
|
19
19
|
permissions:
|
|
20
20
|
contents: read
|
|
21
21
|
|
|
22
22
|
concurrency:
|
|
23
|
-
group: pypi-
|
|
23
|
+
group: pypi-release-policy-${{ github.event.workflow_run.head_sha || github.sha }}
|
|
24
24
|
cancel-in-progress: false
|
|
25
25
|
|
|
26
|
+
# PyPI download statistics count every fetched distribution file, including
|
|
27
|
+
# files fetched by CI. This workflow therefore reads the public PyPI JSON API
|
|
28
|
+
# only and never installs or downloads the released distribution.
|
|
26
29
|
jobs:
|
|
27
|
-
|
|
30
|
+
github-release-policy:
|
|
28
31
|
if: >-
|
|
29
32
|
github.event_name == 'push' ||
|
|
33
|
+
github.event_name == 'workflow_dispatch' ||
|
|
30
34
|
(github.event_name == 'workflow_run' && github.event.workflow_run.conclusion == 'success')
|
|
31
|
-
name: public PyPI CLI on ${{ matrix.os }} / Python 3.12
|
|
32
|
-
runs-on: ${{ matrix.os }}
|
|
33
|
-
timeout-minutes: 25
|
|
34
|
-
permissions:
|
|
35
|
-
contents: read
|
|
36
|
-
strategy:
|
|
37
|
-
fail-fast: false
|
|
38
|
-
matrix:
|
|
39
|
-
os:
|
|
40
|
-
- ubuntu-latest
|
|
41
|
-
- macos-latest
|
|
42
|
-
- windows-latest
|
|
43
|
-
steps:
|
|
44
|
-
- name: Check out released source
|
|
45
|
-
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
46
|
-
with:
|
|
47
|
-
ref: ${{ github.event_name == 'workflow_run' && github.event.workflow_run.head_sha || github.sha }}
|
|
48
|
-
|
|
49
|
-
- name: Set up Python
|
|
50
|
-
uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7
|
|
51
|
-
with:
|
|
52
|
-
python-version: "3.12"
|
|
53
|
-
|
|
54
|
-
- name: Verify exact release from public PyPI
|
|
55
|
-
run: python scripts/verify_pypi_release.py
|
|
56
|
-
|
|
57
|
-
github-release-policy:
|
|
58
35
|
name: enforce metadata-only GitHub Release policy
|
|
59
|
-
needs: registry-cli
|
|
60
36
|
runs-on: ubuntu-latest
|
|
61
37
|
timeout-minutes: 15
|
|
62
38
|
permissions:
|
|
@@ -88,18 +64,41 @@ jobs:
|
|
|
88
64
|
echo "version=$version" >> "$GITHUB_OUTPUT"
|
|
89
65
|
echo "tag=v$version" >> "$GITHUB_OUTPUT"
|
|
90
66
|
|
|
67
|
+
# The policy check also runs on a push that touches the release
|
|
68
|
+
# workflow, which can land before the version has been released (the
|
|
69
|
+
# 2.2.13 merge did exactly that). A missing release is not a policy
|
|
70
|
+
# violation: there is nothing to check yet, and the workflow_run trigger
|
|
71
|
+
# re-runs this job after the Release workflow creates it.
|
|
72
|
+
- name: Resolve matching GitHub Release
|
|
73
|
+
id: release_state
|
|
74
|
+
env:
|
|
75
|
+
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
76
|
+
RELEASE_TAG: ${{ steps.release.outputs.tag }}
|
|
77
|
+
shell: bash
|
|
78
|
+
run: |
|
|
79
|
+
set -euo pipefail
|
|
80
|
+
if release_id="$(gh api "repos/$GITHUB_REPOSITORY/releases/tags/$RELEASE_TAG" --jq '.id' 2>&1)"; then
|
|
81
|
+
echo "exists=true" >> "$GITHUB_OUTPUT"
|
|
82
|
+
echo "release_id=$release_id" >> "$GITHUB_OUTPUT"
|
|
83
|
+
elif grep -q "HTTP 404" <<<"$release_id"; then
|
|
84
|
+
echo "exists=false" >> "$GITHUB_OUTPUT"
|
|
85
|
+
echo "GitHub Release $RELEASE_TAG does not exist yet; nothing to enforce."
|
|
86
|
+
else
|
|
87
|
+
echo "::error::Could not resolve GitHub Release $RELEASE_TAG: $release_id"
|
|
88
|
+
exit 1
|
|
89
|
+
fi
|
|
90
|
+
|
|
91
91
|
- name: Remove forbidden wheel and sdist assets from matching GitHub Release
|
|
92
|
+
if: steps.release_state.outputs.exists == 'true'
|
|
92
93
|
env:
|
|
93
94
|
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
94
95
|
RELEASE_TAG: ${{ steps.release.outputs.tag }}
|
|
96
|
+
RELEASE_ID: ${{ steps.release_state.outputs.release_id }}
|
|
95
97
|
shell: bash
|
|
96
98
|
run: |
|
|
97
99
|
set -euo pipefail
|
|
98
|
-
release_id="$(
|
|
99
|
-
gh api "repos/$GITHUB_REPOSITORY/releases/tags/$RELEASE_TAG" --jq '.id'
|
|
100
|
-
)"
|
|
101
100
|
asset_ids="$(
|
|
102
|
-
gh api --paginate "repos/$GITHUB_REPOSITORY/releases/$
|
|
101
|
+
gh api --paginate "repos/$GITHUB_REPOSITORY/releases/$RELEASE_ID/assets" \
|
|
103
102
|
--jq '.[] | select((.name | endswith(".whl")) or (.name | endswith(".tar.gz"))) | .id'
|
|
104
103
|
)"
|
|
105
104
|
if [ -z "$asset_ids" ]; then
|
|
@@ -112,6 +111,7 @@ jobs:
|
|
|
112
111
|
fi
|
|
113
112
|
|
|
114
113
|
- name: Verify public PyPI and asset-free GitHub Release policy
|
|
114
|
+
if: steps.release_state.outputs.exists == 'true'
|
|
115
115
|
env:
|
|
116
116
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
117
117
|
RELEASE_VERSION: ${{ steps.release.outputs.version }}
|