scientific-computing-system 2.2.15__tar.gz → 2.2.18__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.15 → scientific_computing_system-2.2.18}/.github/workflows/codeql.yml +3 -3
- scientific_computing_system-2.2.18/.github/workflows/determinism-matrix.yml +151 -0
- scientific_computing_system-2.2.18/.github/workflows/fuzz.yml +38 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/.github/workflows/npm-publish.yml +36 -5
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/.github/workflows/pypi-release-policy.yml +20 -4
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/.github/workflows/release.yml +1 -1
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/.github/workflows/scorecard.yml +1 -1
- scientific_computing_system-2.2.18/.github/workflows/sign-release.yml +170 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/CHANGELOG.md +19 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/CITATION.cff +2 -2
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/PKG-INFO +15 -13
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/README.md +12 -10
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/SECURITY.md +2 -1
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/codemeta.json +1 -1
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/package.json +1 -1
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/pyproject.toml +8 -3
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/requirements-dev.lock +10 -3
- scientific_computing_system-2.2.18/scripts/determinism_matrix.py +543 -0
- scientific_computing_system-2.2.18/scripts/determinism_workload.py +64 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/src/cds/_version.py +2 -2
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/src/cds/ml/neural.py +14 -2
- scientific_computing_system-2.2.18/tests/fuzz/fuzz_bpe_merge.py +27 -0
- scientific_computing_system-2.2.18/tests/test_cross_process_determinism.py +109 -0
- scientific_computing_system-2.2.18/tests/test_determinism_matrix.py +369 -0
- scientific_computing_system-2.2.18/tests/test_layer_seed_determinism_20261025.py +59 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/.github/workflows/benchmarks.yml +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/.github/workflows/bot-reviewer.yml +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/.github/workflows/changelog.yml +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/.github/workflows/cli-package-smoke.yml +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/.github/workflows/dependency-review.yml +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/.github/workflows/pr-automation.yml +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/.github/workflows/tests.yml +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/.gitignore +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/CONTRIBUTING.md +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/LICENSE +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/benchmarks/results.json +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/benchmarks/robust_runner.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/benchmarks/run_benchmarks.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/bin/scs.js +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/dashboard/app.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/docs/ARCHITECTURE.md +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/docs/CASE_STUDY_HUBBLE.md +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/docs/CASE_STUDY_QUANTUM_ML.md +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/docs/api.md +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/docs/assets/icon.svg +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/docs/assets/logo.svg +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/docs/benchmarks.md +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/docs/checks/verify_provenance_claims.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/docs/cookbook.md +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/docs/getting-started.md +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/docs/index.md +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/docs/maintenance.md +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/docs/ml_reference.md +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/docs/related.md +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/docs/research-workflows.md +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/docs/stylesheets/extra.css +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/docs/tour_of_numerical_methods.md +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/docs/tutorials/core_demo.md +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/docs/tutorials/data_analysis_demo.md +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/docs/tutorials/diffeq_demo.md +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/docs/tutorials/fft2_demo.md +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/docs/tutorials/graph_demo.md +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/docs/tutorials/hypothesis_demo.md +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/docs/tutorials/hypothesis_tests_demo.md +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/docs/tutorials/hypothesis_with_stats_demo.md +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/docs/tutorials/knowledge_demo.md +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/docs/tutorials/linalg_demo.md +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/docs/tutorials/math_utils_demo.md +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/docs/tutorials/ml_advanced_demo.md +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/docs/tutorials/ml_and_viz_demo.md +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/docs/tutorials/ml_demo.md +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/docs/tutorials/modeling_demo.md +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/docs/tutorials/montecarlo_demo.md +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/docs/tutorials/nlp_attention_demo.md +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/docs/tutorials/nlp_bpe_demo.md +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/docs/tutorials/nlp_mini_gpt_demo.md +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/docs/tutorials/nlp_viz.md +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/docs/tutorials/numerical_integration_demo.md +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/docs/tutorials/optimization_demo.md +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/docs/tutorials/pandas_io_demo.md +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/docs/tutorials/pca_demo.md +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/docs/tutorials/probability_demo.md +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/docs/tutorials/quantum_demo.md +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/docs/tutorials/quick_start.md +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/docs/tutorials/scientific_demo.md +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/docs/tutorials/signals_demo.md +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/docs/tutorials/stats_demo.md +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/docs/tutorials/stiff_ode_demo.md +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/docs/tutorials/time_series_demo.md +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/docs/why-pure-python.md +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/examples/core_demo.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/examples/data_analysis_demo.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/examples/diffeq_demo.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/examples/discovery_pipeline_demo.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/examples/ensemble_showcase.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/examples/fft2_demo.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/examples/graph_demo.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/examples/hypothesis_custom_generator.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/examples/hypothesis_demo.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/examples/hypothesis_tests_demo.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/examples/hypothesis_with_stats_demo.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/examples/interpolate_demo.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/examples/knowledge_demo.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/examples/linalg_demo.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/examples/math_utils_demo.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/examples/ml_and_viz_demo.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/examples/modeling_demo.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/examples/montecarlo_demo.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/examples/nlp_attention_demo.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/examples/nlp_bpe_demo.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/examples/nlp_mini_gpt_demo.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/examples/nlp_viz_demo.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/examples/numerical_integration_demo.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/examples/optimization_demo.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/examples/pca_demo.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/examples/pde_demo.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/examples/plot_demo.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/examples/plotting_notebook.ipynb +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/examples/probability_demo.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/examples/quantum_demo.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/examples/scientific_demo.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/examples/signals_demo.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/examples/stats_demo.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/examples/tour_of_numerical_methods.ipynb +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/index.js +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/mkdocs.yml +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/npm.test.js +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/paper.bib +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/paper.md +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/requirements-build.lock +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/requirements.lock +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/scripts/check_release_toolchain.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/scripts/check_version_discipline.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/scripts/check_version_lockstep.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/scripts/publish.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/scripts/verify_cli_install.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/scripts/verify_cookbook.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/scripts/verify_ml_reference.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/scripts/verify_release_integrity.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/src/cds/__init__.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/src/cds/__main__.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/src/cds/_paths.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/src/cds/bayes/__init__.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/src/cds/bayes/conjugate.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/src/cds/causal.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/src/cds/cli/__init__.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/src/cds/cli/__main__.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/src/cds/cli/_exit_codes.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/src/cds/cli/_handlers.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/src/cds/cli/_parser.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/src/cds/cli/_style.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/src/cds/cli/_system_info.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/src/cds/core/__init__.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/src/cds/core/_numeric.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/src/cds/core/models.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/src/cds/data_analysis/__init__.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/src/cds/data_analysis/dataset.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/src/cds/data_analysis/loader.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/src/cds/data_analysis/pandas_io.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/src/cds/data_analysis/transform.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/src/cds/data_analysis/viz.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/src/cds/data_io/__init__.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/src/cds/data_io/scientific.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/src/cds/data_io/streaming.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/src/cds/diffeq/__init__.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/src/cds/diffeq/_implicit.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/src/cds/diffeq/solvers.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/src/cds/diffeq/symplectic.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/src/cds/fractals/__init__.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/src/cds/fractals/sets.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/src/cds/genetics/__init__.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/src/cds/genetics/sequence.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/src/cds/graph/__init__.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/src/cds/graph/algorithms.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/src/cds/hypothesis/__init__.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/src/cds/hypothesis/evaluator.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/src/cds/hypothesis/generator.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/src/cds/hypothesis/mining.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/src/cds/infotheory/__init__.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/src/cds/infotheory/measures.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/src/cds/interpolate/__init__.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/src/cds/knowledge/__init__.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/src/cds/knowledge/graph.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/src/cds/knowledge/notes.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/src/cds/knowledge/retrieval.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/src/cds/math_utils/__init__.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/src/cds/math_utils/calculus.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/src/cds/math_utils/linalg.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/src/cds/math_utils/special.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/src/cds/math_utils/svd.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/src/cds/ml/__init__.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/src/cds/ml/boosting.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/src/cds/ml/clustering.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/src/cds/ml/decomposition.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/src/cds/ml/ensemble.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/src/cds/ml/linear_models.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/src/cds/ml/metrics.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/src/cds/ml/model_selection.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/src/cds/ml/naive_bayes.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/src/cds/ml/neighbors.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/src/cds/ml/preprocessing.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/src/cds/ml/tree.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/src/cds/ml/voting.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/src/cds/modeling/__init__.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/src/cds/modeling/_base.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/src/cds/modeling/_nodes.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/src/cds/modeling/expression.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/src/cds/modeling/fitting.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/src/cds/modeling/model.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/src/cds/modeling/solver.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/src/cds/montecarlo/__init__.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/src/cds/montecarlo/markov.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/src/cds/montecarlo/methods.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/src/cds/nlp/__init__.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/src/cds/nlp/attention.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/src/cds/nlp/autograd/__init__.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/src/cds/nlp/autograd/_grad.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/src/cds/nlp/autograd/ops.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/src/cds/nlp/autograd/tensor.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/src/cds/nlp/bpe.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/src/cds/nlp/data.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/src/cds/nlp/embed.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/src/cds/nlp/layers.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/src/cds/nlp/model.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/src/cds/nlp/optim.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/src/cds/nlp/training.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/src/cds/nlp/viz.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/src/cds/numerical_integration/__init__.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/src/cds/numerical_integration/quadrature.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/src/cds/optimization/__init__.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/src/cds/optimization/_metaheuristics.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/src/cds/optimization/constrained.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/src/cds/optimization/minimize.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/src/cds/pde/__init__.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/src/cds/plot/__init__.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/src/cds/plot/_backend.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/src/cds/plot/charts.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/src/cds/probability/__init__.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/src/cds/probability/_advanced.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/src/cds/probability/distributions.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/src/cds/probability/extra_distributions.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/src/cds/provenance/__init__.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/src/cds/provenance/manifest.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/src/cds/py.typed +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/src/cds/quantum/__init__.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/src/cds/quantum/circuit.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/src/cds/quantum/multi_qubit.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/src/cds/quantum/simulator.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/src/cds/scientific/__init__.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/src/cds/scientific/constants.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/src/cds/scientific/formulas.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/src/cds/sensitivity.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/src/cds/signals/__init__.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/src/cds/signals/filters.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/src/cds/signals/processing.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/src/cds/signals/stft.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/src/cds/signals/wavelet.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/src/cds/stats/__init__.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/src/cds/stats/_distributions.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/src/cds/stats/bootstrap.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/src/cds/stats/descriptive.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/src/cds/stats/hypothesis_tests.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/src/cds/stats/multiple_testing.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/src/cds/stats/nonparametric.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/src/cds/stats/power.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/src/cds/stats/regression.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/src/cds/stats/time_series.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/src/cds/tools/__init__.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/src/cds/tools/adapters.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/src/cds/tools/registry.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/src/cds/uncertainty/__init__.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/src/cds/uncertainty/propagation.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/src/cds/units/__init__.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/src/cds/units/core.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/src/cds/validation/__init__.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/src/cds/validation/adequacy.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/src/cds/validation/checks.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/src/cds/validation/drift.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/src/cds/validation/report.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/src/cds/wavelets/__init__.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/src/cds/wavelets/haar.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/src/cds/workflow/__init__.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/src/cds/workflow/engine.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/src/cds/workflow/gates.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/src/cds/workflow/orchestrator.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/src/cds/workflow/selection.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/src/cds/workflow/tooling.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/src/cds/workflow/types.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/tests/__init__.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/tests/conftest.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/tests/test_advanced_fitting.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/tests/test_audit_completion_coverage.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/tests/test_audit_guard_coverage.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/tests/test_audit_hardening.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/tests/test_audit_hardening_c1.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/tests/test_audit_hardening_c2.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/tests/test_audit_hardening_c3.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/tests/test_audit_hardening_c4.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/tests/test_audit_hardening_coverage.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/tests/test_audit_hardening_h1.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/tests/test_bayes_v2.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/tests/test_benchmarks.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/tests/test_bootstrap.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/tests/test_causal.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/tests/test_cli.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/tests/test_cli_color.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/tests/test_cli_exit_codes.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/tests/test_cli_extended.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/tests/test_cli_system_info.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/tests/test_codemeta_version_lockstep.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/tests/test_constrained_opt.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/tests/test_core.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/tests/test_data_analysis.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/tests/test_data_analysis_lazy_bridge.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/tests/test_data_analysis_pandas_io.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/tests/test_data_io.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/tests/test_data_io_optional_backends.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/tests/test_data_io_scientific.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/tests/test_dataset.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/tests/test_dev_numpy_pin_contract.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/tests/test_diffeq.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/tests/test_diffeq_implicit.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/tests/test_domain_validation.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/tests/test_edge_misc_numerical.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/tests/test_edge_ml_quantum_linalg.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/tests/test_edge_nlp.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/tests/test_edge_quantum_evaluator_cli.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/tests/test_edge_stats_optimization_signals.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/tests/test_extra_distributions.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/tests/test_fft2.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/tests/test_fitting_bootstrap.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/tests/test_fractals.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/tests/test_genetics.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/tests/test_graph.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/tests/test_hardening_20261023.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/tests/test_hardening_privacy_provenance.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/tests/test_hypothesis.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/tests/test_hypothesis_engine.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/tests/test_hypothesis_mining.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/tests/test_hypothesis_tests.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/tests/test_infotheory.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/tests/test_interpolate.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/tests/test_knowledge.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/tests/test_layering.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/tests/test_linalg_extended.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/tests/test_linalg_qr_cholesky.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/tests/test_markov.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/tests/test_math_utils.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/tests/test_ml_boosting.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/tests/test_ml_clustering.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/tests/test_ml_ensemble.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/tests/test_ml_knn.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/tests/test_ml_linreg.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/tests/test_ml_logreg.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/tests/test_ml_metrics.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/tests/test_ml_model_selection.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/tests/test_ml_naive_bayes.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/tests/test_ml_pca.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/tests/test_ml_preprocessing.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/tests/test_ml_tree.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/tests/test_ml_viz.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/tests/test_ml_voting.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/tests/test_modeling.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/tests/test_modeling_fit_validation.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/tests/test_montecarlo.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/tests/test_multi_qubit.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/tests/test_nlp_attention.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/tests/test_nlp_autograd.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/tests/test_nlp_bpe.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/tests/test_nlp_embed.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/tests/test_nlp_layers.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/tests/test_nlp_model.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/tests/test_nlp_training.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/tests/test_nlp_viz.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/tests/test_numerical_integration.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/tests/test_numerical_invariants.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/tests/test_numerical_oracles.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/tests/test_optimization.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/tests/test_optimization_metaheuristics.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/tests/test_path_confinement.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/tests/test_pde.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/tests/test_plot_charts.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/tests/test_plot_lazy.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/tests/test_power.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/tests/test_probability.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/tests/test_probability_advanced.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/tests/test_property_invariants.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/tests/test_protocol_placeholders.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/tests/test_provenance.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/tests/test_provenance_audit_hardening.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/tests/test_provenance_claims.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/tests/test_public_api.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/tests/test_quantum.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/tests/test_readme_badges.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/tests/test_readme_surface.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/tests/test_release_contract.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/tests/test_release_toolchain.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/tests/test_retrieval.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/tests/test_runtime_dependency_graph.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/tests/test_scientific.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/tests/test_seed_hygiene.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/tests/test_selection_audit_hardening.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/tests/test_sensitivity.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/tests/test_sensitivity_global.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/tests/test_signals.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/tests/test_signals_filters.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/tests/test_special_invariants.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/tests/test_special_numerics.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/tests/test_statistical_audit.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/tests/test_stats.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/tests/test_stats_audit_coverage.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/tests/test_stats_multiple_testing.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/tests/test_stats_nonparametric.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/tests/test_stats_time_series.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/tests/test_stft.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/tests/test_streaming_analytics.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/tests/test_svd.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/tests/test_symplectic.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/tests/test_tool_adapters.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/tests/test_tools_registry.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/tests/test_uncertainty.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/tests/test_units.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/tests/test_validation.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/tests/test_validation_adequacy.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/tests/test_validation_advanced.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/tests/test_validation_bounds_nonfinite_regression.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/tests/test_validation_derived_moments_overflow.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/tests/test_validation_derived_tolerance_overflow.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/tests/test_validation_drift.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/tests/test_validation_nonfinite_thresholds_regression.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/tests/test_validation_ood_stable_and_coverage.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/tests/test_verify_release_integrity.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/tests/test_wavelet.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/tests/test_wavelets_v2.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/tests/test_workflow.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/tests/test_workflow_gates.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/tests/test_workflow_orchestrator.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/tests/test_workflow_orchestrator_blocked_review.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/tests/test_workflow_selection.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/tests/test_workflow_selection_coverage.py +0 -0
- {scientific_computing_system-2.2.15 → scientific_computing_system-2.2.18}/tests/test_workflow_tooling.py +0 -0
|
@@ -45,13 +45,13 @@ jobs:
|
|
|
45
45
|
with:
|
|
46
46
|
persist-credentials: false
|
|
47
47
|
- name: Initialize CodeQL
|
|
48
|
-
uses: github/codeql-action/init@
|
|
48
|
+
uses: github/codeql-action/init@6f2ac81f5cd81fe351a197ba0b00d91d03cd2aee # v4
|
|
49
49
|
with:
|
|
50
50
|
languages: ${{ matrix.language }}
|
|
51
51
|
queries: security-and-quality
|
|
52
52
|
- name: Autobuild
|
|
53
|
-
uses: github/codeql-action/autobuild@
|
|
53
|
+
uses: github/codeql-action/autobuild@6f2ac81f5cd81fe351a197ba0b00d91d03cd2aee # v4
|
|
54
54
|
- name: Perform CodeQL Analysis
|
|
55
|
-
uses: github/codeql-action/analyze@
|
|
55
|
+
uses: github/codeql-action/analyze@6f2ac81f5cd81fe351a197ba0b00d91d03cd2aee # v4
|
|
56
56
|
with:
|
|
57
57
|
category: "/language:${{ matrix.language }}"
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
name: Determinism matrix
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: [main]
|
|
6
|
+
pull_request:
|
|
7
|
+
branches: [main]
|
|
8
|
+
workflow_dispatch:
|
|
9
|
+
|
|
10
|
+
permissions:
|
|
11
|
+
contents: read
|
|
12
|
+
|
|
13
|
+
concurrency:
|
|
14
|
+
group: determinism-matrix-${{ github.ref }}
|
|
15
|
+
cancel-in-progress: ${{ github.event_name == 'pull_request' }}
|
|
16
|
+
|
|
17
|
+
jobs:
|
|
18
|
+
matrix:
|
|
19
|
+
name: ${{ matrix.os }} determinism matrix
|
|
20
|
+
runs-on: ${{ matrix.os }}
|
|
21
|
+
timeout-minutes: 20
|
|
22
|
+
permissions:
|
|
23
|
+
contents: read
|
|
24
|
+
strategy:
|
|
25
|
+
fail-fast: false
|
|
26
|
+
matrix:
|
|
27
|
+
os: [ubuntu-latest, macos-latest, windows-latest]
|
|
28
|
+
steps:
|
|
29
|
+
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
30
|
+
with:
|
|
31
|
+
persist-credentials: false
|
|
32
|
+
- name: Set up Python
|
|
33
|
+
uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7
|
|
34
|
+
with:
|
|
35
|
+
python-version: "3.12"
|
|
36
|
+
cache: 'pip'
|
|
37
|
+
cache-dependency-path: |
|
|
38
|
+
pyproject.toml
|
|
39
|
+
requirements.lock
|
|
40
|
+
requirements-dev.lock
|
|
41
|
+
- name: Install package
|
|
42
|
+
run: |
|
|
43
|
+
python -m pip install --upgrade pip
|
|
44
|
+
pip install ".[test]"
|
|
45
|
+
- name: Run determinism matrix
|
|
46
|
+
run: >
|
|
47
|
+
python scripts/determinism_matrix.py run
|
|
48
|
+
--workload scripts/determinism_workload.py
|
|
49
|
+
--out determinism-manifest-${{ matrix.os }}.json
|
|
50
|
+
--seeds 0 12345 random
|
|
51
|
+
--threads 1 4
|
|
52
|
+
--locales inherit C
|
|
53
|
+
--timezones UTC Europe/Istanbul
|
|
54
|
+
--gate within-host
|
|
55
|
+
- name: Upload manifest
|
|
56
|
+
uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2
|
|
57
|
+
with:
|
|
58
|
+
name: determinism-manifest-${{ matrix.os }}
|
|
59
|
+
path: determinism-manifest-${{ matrix.os }}.json
|
|
60
|
+
if-no-files-found: error
|
|
61
|
+
retention-days: 14
|
|
62
|
+
|
|
63
|
+
compare:
|
|
64
|
+
name: Cross-OS digest comparison
|
|
65
|
+
needs: matrix
|
|
66
|
+
runs-on: ubuntu-latest
|
|
67
|
+
timeout-minutes: 10
|
|
68
|
+
permissions:
|
|
69
|
+
contents: read
|
|
70
|
+
steps:
|
|
71
|
+
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
72
|
+
with:
|
|
73
|
+
persist-credentials: false
|
|
74
|
+
- name: Set up Python
|
|
75
|
+
uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7
|
|
76
|
+
with:
|
|
77
|
+
python-version: "3.12"
|
|
78
|
+
- name: Download manifests
|
|
79
|
+
uses: actions/download-artifact@9000827ccba6bdab643e8b6fd33ac0654aef8333 # v8.0.2
|
|
80
|
+
with:
|
|
81
|
+
pattern: determinism-manifest-*
|
|
82
|
+
merge-multiple: true
|
|
83
|
+
path: manifests
|
|
84
|
+
- name: Compare manifests
|
|
85
|
+
shell: bash
|
|
86
|
+
run: |
|
|
87
|
+
set -euo pipefail
|
|
88
|
+
shopt -s nullglob
|
|
89
|
+
files=(manifests/*.json)
|
|
90
|
+
failures=0
|
|
91
|
+
printf 'manifest files: %s\n' "${#files[@]}"
|
|
92
|
+
if [ "${#files[@]}" -lt 2 ]; then
|
|
93
|
+
echo "::error::expected a manifest from every operating system, found ${#files[@]}"
|
|
94
|
+
exit 1
|
|
95
|
+
fi
|
|
96
|
+
for ((i = 0; i < ${#files[@]}; i++)); do
|
|
97
|
+
for ((j = i + 1; j < ${#files[@]}; j++)); do
|
|
98
|
+
left=$(basename "${files[$i]}" .json)
|
|
99
|
+
right=$(basename "${files[$j]}" .json)
|
|
100
|
+
echo "=== ${left} vs ${right} ==="
|
|
101
|
+
if ! python scripts/determinism_matrix.py compare \
|
|
102
|
+
"${files[$i]}" "${files[$j]}" --gate > "compare-${left}-${right}.json"; then
|
|
103
|
+
failures=$((failures + 1))
|
|
104
|
+
echo "::error::cross-OS determinism failed or could not be compared: ${left} vs ${right}"
|
|
105
|
+
fi
|
|
106
|
+
done
|
|
107
|
+
done
|
|
108
|
+
if [ "$failures" -ne 0 ]; then
|
|
109
|
+
echo "::error::${failures} manifest pair(s) mismatched or could not be compared"
|
|
110
|
+
exit 1
|
|
111
|
+
fi
|
|
112
|
+
- name: Write comparison summary
|
|
113
|
+
if: always()
|
|
114
|
+
shell: bash
|
|
115
|
+
run: |
|
|
116
|
+
python - <<'PY'
|
|
117
|
+
import glob
|
|
118
|
+
import json
|
|
119
|
+
import os
|
|
120
|
+
|
|
121
|
+
rows = [
|
|
122
|
+
"| baseline | candidate | shared | identical | mismatches | errors |",
|
|
123
|
+
"| --- | --- | --- | --- | --- | --- |",
|
|
124
|
+
]
|
|
125
|
+
for path in sorted(glob.glob("compare-*.json")):
|
|
126
|
+
try:
|
|
127
|
+
with open(path, encoding="utf-8") as handle:
|
|
128
|
+
data = json.load(handle)
|
|
129
|
+
if not isinstance(data, dict):
|
|
130
|
+
raise ValueError("compare report is not an object")
|
|
131
|
+
except (OSError, ValueError) as error:
|
|
132
|
+
rows.append(f"| {path} | unreadable | - | False | - | {error} |")
|
|
133
|
+
continue
|
|
134
|
+
baseline = (data.get("baseline_host") or {}).get("system", "unknown")
|
|
135
|
+
candidate = (data.get("candidate_host") or {}).get("system", "unknown")
|
|
136
|
+
mismatches = data.get("mismatches") or []
|
|
137
|
+
errors = data.get("errors") or []
|
|
138
|
+
rows.append(
|
|
139
|
+
f"| {baseline} | {candidate} | {data.get('shared_variants', 0)} | "
|
|
140
|
+
f"{data.get('identical', False)} | {len(mismatches)} | {len(errors)} |"
|
|
141
|
+
)
|
|
142
|
+
if len(rows) == 2:
|
|
143
|
+
rows.append("| no comparison reports | - | 0 | False | 0 | 1 |")
|
|
144
|
+
with open(
|
|
145
|
+
os.environ.get("GITHUB_STEP_SUMMARY", os.devnull),
|
|
146
|
+
"a",
|
|
147
|
+
encoding="utf-8",
|
|
148
|
+
) as handle:
|
|
149
|
+
handle.write("## Cross-OS determinism\n\n" + "\n".join(rows) + "\n")
|
|
150
|
+
print("\n".join(rows))
|
|
151
|
+
PY
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
name: Fuzz
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: [main]
|
|
6
|
+
pull_request:
|
|
7
|
+
paths:
|
|
8
|
+
- "src/cds/**"
|
|
9
|
+
- "tests/fuzz/**"
|
|
10
|
+
- "pyproject.toml"
|
|
11
|
+
- ".github/workflows/fuzz.yml"
|
|
12
|
+
workflow_dispatch:
|
|
13
|
+
|
|
14
|
+
permissions:
|
|
15
|
+
contents: read
|
|
16
|
+
|
|
17
|
+
concurrency:
|
|
18
|
+
group: fuzz-scientific-computing-system
|
|
19
|
+
cancel-in-progress: true
|
|
20
|
+
|
|
21
|
+
jobs:
|
|
22
|
+
fuzz:
|
|
23
|
+
name: Atheris
|
|
24
|
+
runs-on: ubuntu-latest
|
|
25
|
+
timeout-minutes: 15
|
|
26
|
+
permissions:
|
|
27
|
+
contents: read
|
|
28
|
+
steps:
|
|
29
|
+
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
|
|
30
|
+
- uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7
|
|
31
|
+
with:
|
|
32
|
+
python-version: "3.12"
|
|
33
|
+
- name: Install Atheris
|
|
34
|
+
run: python -m pip install atheris==3.1.0
|
|
35
|
+
- name: Install scientific-computing-system
|
|
36
|
+
run: python -m pip install -e .
|
|
37
|
+
- name: Fuzz the BPE merge validator
|
|
38
|
+
run: python tests/fuzz/fuzz_bpe_merge.py -max_total_time=60 -rss_limit_mb=2048 -print_final_stats=1
|
|
@@ -109,15 +109,46 @@ jobs:
|
|
|
109
109
|
RUN_ID: ${{ github.event.workflow_run.id }}
|
|
110
110
|
run: |
|
|
111
111
|
set -euo pipefail
|
|
112
|
+
# The trigger is the Release workflow, which normally is itself a
|
|
113
|
+
# workflow_run consumer: its event is `workflow_run`. The Release
|
|
114
|
+
# recovery path is dispatched manually and never publishes to PyPI,
|
|
115
|
+
# so a `workflow_dispatch` run is accepted too; its publish job is
|
|
116
|
+
# declared workflow_run-only, so it cannot set published=true.
|
|
117
|
+
# Release already verified its upstream CI run through the Actions
|
|
118
|
+
# API, so trust the head SHA only after proving the run belongs to
|
|
119
|
+
# this repository's release.yml on the default branch.
|
|
112
120
|
data="$(gh api "repos/${GITHUB_REPOSITORY}/actions/runs/${RUN_ID}" \
|
|
113
|
-
--jq '[.head_sha, .event, .head_branch, .conclusion, .repository.full_name] | @tsv')"
|
|
114
|
-
IFS=$'\t' read -r sha event branch conclusion repo <<<"${data}"
|
|
121
|
+
--jq '[.head_sha, .event, .head_branch, .conclusion, .repository.full_name, .path] | @tsv')"
|
|
122
|
+
IFS=$'\t' read -r sha event branch conclusion repo path <<<"${data}"
|
|
115
123
|
echo "head_sha=${sha}" >> "$GITHUB_OUTPUT"
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
124
|
+
case "${event}" in
|
|
125
|
+
workflow_run|workflow_dispatch) ;;
|
|
126
|
+
*)
|
|
127
|
+
echo "::error::Run ${RUN_ID} has unsupported event ${event}."
|
|
128
|
+
exit 1
|
|
129
|
+
;;
|
|
130
|
+
esac
|
|
131
|
+
if [ "${path}" != ".github/workflows/release.yml" ] || \
|
|
132
|
+
[ "${branch}" != "main" ] || \
|
|
133
|
+
[ "${repo}" != "${GITHUB_REPOSITORY}" ]; then
|
|
134
|
+
echo "::error::Run ${RUN_ID} is not a Release run on ${GITHUB_REPOSITORY} main."
|
|
119
135
|
exit 1
|
|
120
136
|
fi
|
|
137
|
+
# A Release run whose jobs all skip (the version is already released)
|
|
138
|
+
# concludes `skipped`. That is an ordinary push, not a release, so the
|
|
139
|
+
# npm job must skip too. A failed or cancelled release stays loud.
|
|
140
|
+
case "${conclusion}" in
|
|
141
|
+
success|skipped) ;;
|
|
142
|
+
*)
|
|
143
|
+
echo "::error::Release run ${RUN_ID} concluded ${conclusion}."
|
|
144
|
+
exit 1
|
|
145
|
+
;;
|
|
146
|
+
esac
|
|
147
|
+
if [ "${conclusion}" != "success" ]; then
|
|
148
|
+
echo "Release run was ${conclusion}; no release was published."
|
|
149
|
+
echo "published=false" >> "$GITHUB_OUTPUT"
|
|
150
|
+
exit 0
|
|
151
|
+
fi
|
|
121
152
|
publish_conclusion="$(gh api "repos/${GITHUB_REPOSITORY}/actions/runs/${RUN_ID}/jobs?per_page=100" \
|
|
122
153
|
--jq '[.jobs[] | select(.name == "Build + verify + publish to PyPI + metadata-only GitHub Release") | .conclusion] | first // "missing"')"
|
|
123
154
|
echo "Release publish job: ${publish_conclusion}"
|
|
@@ -49,12 +49,28 @@ jobs:
|
|
|
49
49
|
run: |
|
|
50
50
|
set -euo pipefail
|
|
51
51
|
if [ "${EVENT_NAME}" = "workflow_run" ]; then
|
|
52
|
+
# This workflow triggers on the Release workflow, which normally is
|
|
53
|
+
# itself a workflow_run consumer, so the triggering run's event is
|
|
54
|
+
# `workflow_run`. The Release recovery path is dispatched manually
|
|
55
|
+
# and never publishes to PyPI, so a `workflow_dispatch` run is
|
|
56
|
+
# accepted too. The Release gate already verified its own upstream
|
|
57
|
+
# CI run through the Actions API; here we only need to prove the
|
|
58
|
+
# trigger came from this repository's Release workflow on the
|
|
59
|
+
# default branch before trusting its head SHA.
|
|
52
60
|
data="$(gh api "repos/${GITHUB_REPOSITORY}/actions/runs/${RUN_ID}" \
|
|
53
|
-
--jq '[.head_sha, .event, .head_branch, .conclusion, .repository.full_name] | @tsv')"
|
|
54
|
-
IFS=$'\t' read -r sha event branch conclusion repo <<<"${data}"
|
|
55
|
-
|
|
61
|
+
--jq '[.head_sha, .event, .head_branch, .conclusion, .repository.full_name, .path] | @tsv')"
|
|
62
|
+
IFS=$'\t' read -r sha event branch conclusion repo path <<<"${data}"
|
|
63
|
+
case "${event}" in
|
|
64
|
+
workflow_run|workflow_dispatch) ;;
|
|
65
|
+
*)
|
|
66
|
+
echo "::error::Run ${RUN_ID} has unsupported event ${event}."
|
|
67
|
+
exit 1
|
|
68
|
+
;;
|
|
69
|
+
esac
|
|
70
|
+
if [ "${path}" != ".github/workflows/release.yml" ] || \
|
|
71
|
+
[ "${branch}" != "main" ] || \
|
|
56
72
|
[ "${conclusion}" != "success" ] || [ "${repo}" != "${GITHUB_REPOSITORY}" ]; then
|
|
57
|
-
echo "::error::Run ${RUN_ID} is not a successful
|
|
73
|
+
echo "::error::Run ${RUN_ID} is not a successful Release run on ${GITHUB_REPOSITORY} main."
|
|
58
74
|
exit 1
|
|
59
75
|
fi
|
|
60
76
|
else
|
|
@@ -420,7 +420,7 @@ jobs:
|
|
|
420
420
|
|
|
421
421
|
- name: Publish to PyPI (Trusted Publishing)
|
|
422
422
|
if: steps.pypi_state.outputs.already_published != 'true'
|
|
423
|
-
uses: pypa/gh-action-pypi-publish@
|
|
423
|
+
uses: pypa/gh-action-pypi-publish@7245906fb61fa33a13554f9d5fb856fe61758086 # release/v1
|
|
424
424
|
|
|
425
425
|
- name: Create or verify release tag after successful PyPI state
|
|
426
426
|
# The tag is created only after PyPI accepted the upload. An existing tag
|
|
@@ -32,6 +32,6 @@ jobs:
|
|
|
32
32
|
name: scorecard-sarif
|
|
33
33
|
path: results.sarif
|
|
34
34
|
retention-days: 5
|
|
35
|
-
- uses: github/codeql-action/upload-sarif@
|
|
35
|
+
- uses: github/codeql-action/upload-sarif@6f2ac81f5cd81fe351a197ba0b00d91d03cd2aee # v4.39.0
|
|
36
36
|
with:
|
|
37
37
|
sarif_file: results.sarif
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
name: Sign release
|
|
2
|
+
|
|
3
|
+
# Attach a signed source archive plus a cosign keyless signature bundle to the
|
|
4
|
+
# GitHub Release that the publish workflows already created. OpenSSF Scorecard's
|
|
5
|
+
# Signed-Releases check looks for a release asset whose name ends in
|
|
6
|
+
# `.sigstore`, and this workflow is the only producer of one.
|
|
7
|
+
#
|
|
8
|
+
# Security: the workflow_run payload is untrusted input. The run is re-read from
|
|
9
|
+
# the Actions API, validated against this repository, the allowed event types
|
|
10
|
+
# and the exact release workflow paths, and only then is its head_sha checked
|
|
11
|
+
# out. The checkout never consumes a raw event expression.
|
|
12
|
+
on:
|
|
13
|
+
workflow_run:
|
|
14
|
+
workflows: ["Release"]
|
|
15
|
+
types: [completed]
|
|
16
|
+
workflow_dispatch:
|
|
17
|
+
inputs:
|
|
18
|
+
tag:
|
|
19
|
+
description: "Existing release tag to sign (e.g. v1.2.3)"
|
|
20
|
+
required: false
|
|
21
|
+
|
|
22
|
+
permissions:
|
|
23
|
+
contents: read
|
|
24
|
+
|
|
25
|
+
concurrency:
|
|
26
|
+
group: sign-release-${{ github.event.workflow_run.head_sha || github.ref }}
|
|
27
|
+
cancel-in-progress: false
|
|
28
|
+
|
|
29
|
+
jobs:
|
|
30
|
+
sign:
|
|
31
|
+
runs-on: ubuntu-latest
|
|
32
|
+
if: >
|
|
33
|
+
github.event_name == 'workflow_dispatch' ||
|
|
34
|
+
(github.event.workflow_run.conclusion == 'success' &&
|
|
35
|
+
github.event.workflow_run.head_repository.full_name == github.repository)
|
|
36
|
+
permissions:
|
|
37
|
+
contents: write
|
|
38
|
+
id-token: write
|
|
39
|
+
env:
|
|
40
|
+
GH_TOKEN: ${{ github.token }}
|
|
41
|
+
steps:
|
|
42
|
+
- name: Resolve the trusted release commit
|
|
43
|
+
id: resolve
|
|
44
|
+
shell: bash
|
|
45
|
+
env:
|
|
46
|
+
RUN_ID: ${{ github.event.workflow_run.id }}
|
|
47
|
+
run: |
|
|
48
|
+
set -euo pipefail
|
|
49
|
+
if [[ "${{ github.event_name }}" == "workflow_dispatch" ]]; then
|
|
50
|
+
echo "sha=${{ github.sha }}" >> "$GITHUB_OUTPUT"
|
|
51
|
+
exit 0
|
|
52
|
+
fi
|
|
53
|
+
data="$(gh api "repos/${GITHUB_REPOSITORY}/actions/runs/${RUN_ID}" \
|
|
54
|
+
--jq '[.head_sha, .event, .conclusion, .repository.full_name, .path] | @tsv')"
|
|
55
|
+
IFS=$'\t' read -r sha event conclusion repo path <<<"${data}"
|
|
56
|
+
# The Release workflow here is itself a workflow_run consumer that
|
|
57
|
+
# waits for CI, so the run this workflow follows has event
|
|
58
|
+
# `workflow_run`. All of these are accepted; the path, repository and
|
|
59
|
+
# conclusion checks below still have to pass.
|
|
60
|
+
case "${event}" in
|
|
61
|
+
push|release|workflow_run|workflow_dispatch) ;;
|
|
62
|
+
*) echo "::error::Run ${RUN_ID} has unsupported event ${event}."; exit 1 ;;
|
|
63
|
+
esac
|
|
64
|
+
case "${path}" in
|
|
65
|
+
.github/workflows/release.yml) ;;
|
|
66
|
+
*) echo "::error::Run ${RUN_ID} is not a release workflow (${path})."; exit 1 ;;
|
|
67
|
+
esac
|
|
68
|
+
if [[ "${conclusion}" != "success" || "${repo}" != "${GITHUB_REPOSITORY}" ]]; then
|
|
69
|
+
echo "::error::Run ${RUN_ID} is not a successful release run on ${GITHUB_REPOSITORY}."
|
|
70
|
+
exit 1
|
|
71
|
+
fi
|
|
72
|
+
echo "sha=${sha}" >> "$GITHUB_OUTPUT"
|
|
73
|
+
|
|
74
|
+
- name: Check out the released commit
|
|
75
|
+
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
|
|
76
|
+
with:
|
|
77
|
+
fetch-depth: 0
|
|
78
|
+
ref: ${{ steps.resolve.outputs.sha }}
|
|
79
|
+
|
|
80
|
+
- name: Resolve the release tag
|
|
81
|
+
id: tag
|
|
82
|
+
shell: bash
|
|
83
|
+
env:
|
|
84
|
+
EVENT_NAME: ${{ github.event_name }}
|
|
85
|
+
INPUT_TAG: ${{ inputs.tag }}
|
|
86
|
+
HEAD_SHA: ${{ steps.resolve.outputs.sha }}
|
|
87
|
+
run: |
|
|
88
|
+
set -euo pipefail
|
|
89
|
+
if [[ "$EVENT_NAME" == "workflow_dispatch" && -n "$INPUT_TAG" ]]; then
|
|
90
|
+
TAG="$INPUT_TAG"
|
|
91
|
+
else
|
|
92
|
+
git fetch --tags --force origin
|
|
93
|
+
refs="$(git for-each-ref --format='%(refname:short) %(objectname) %(*objectname)' refs/tags)"
|
|
94
|
+
TAG="$(printf '%s\n' "$refs" | awk -v sha="$HEAD_SHA" '$2==sha || $3==sha {print $1; exit}')"
|
|
95
|
+
fi
|
|
96
|
+
if [[ -z "$TAG" ]]; then
|
|
97
|
+
echo "::notice::No tag points at ${HEAD_SHA}; nothing to sign."
|
|
98
|
+
exit 0
|
|
99
|
+
fi
|
|
100
|
+
echo "tag=$TAG" >> "$GITHUB_OUTPUT"
|
|
101
|
+
echo "Resolved tag: $TAG"
|
|
102
|
+
|
|
103
|
+
- name: Check the GitHub Release exists
|
|
104
|
+
id: release
|
|
105
|
+
if: steps.tag.outputs.tag != ''
|
|
106
|
+
shell: bash
|
|
107
|
+
env:
|
|
108
|
+
TAG: ${{ steps.tag.outputs.tag }}
|
|
109
|
+
run: |
|
|
110
|
+
set -euo pipefail
|
|
111
|
+
if gh release view "$TAG" >/dev/null 2>&1; then
|
|
112
|
+
echo "exists=true" >> "$GITHUB_OUTPUT"
|
|
113
|
+
else
|
|
114
|
+
echo "exists=false" >> "$GITHUB_OUTPUT"
|
|
115
|
+
echo "::notice::GitHub Release $TAG does not exist; nothing to sign."
|
|
116
|
+
fi
|
|
117
|
+
|
|
118
|
+
- name: Check the release is not signed yet
|
|
119
|
+
id: signature
|
|
120
|
+
if: steps.release.outputs.exists == 'true'
|
|
121
|
+
shell: bash
|
|
122
|
+
env:
|
|
123
|
+
TAG: ${{ steps.tag.outputs.tag }}
|
|
124
|
+
run: |
|
|
125
|
+
set -euo pipefail
|
|
126
|
+
names="$(gh release view "$TAG" --json assets --jq '.assets[].name')"
|
|
127
|
+
if grep -q '\.sigstore$' <<<"$names"; then
|
|
128
|
+
echo "signed=true" >> "$GITHUB_OUTPUT"
|
|
129
|
+
echo "::notice::Release $TAG already has a .sigstore asset; skipping."
|
|
130
|
+
else
|
|
131
|
+
echo "signed=false" >> "$GITHUB_OUTPUT"
|
|
132
|
+
fi
|
|
133
|
+
|
|
134
|
+
- name: Build the source archive
|
|
135
|
+
id: archive
|
|
136
|
+
if: steps.signature.outputs.signed == 'false'
|
|
137
|
+
shell: bash
|
|
138
|
+
env:
|
|
139
|
+
TAG: ${{ steps.tag.outputs.tag }}
|
|
140
|
+
run: |
|
|
141
|
+
set -euo pipefail
|
|
142
|
+
git fetch --tags --force origin
|
|
143
|
+
repo="${GITHUB_REPOSITORY##*/}"
|
|
144
|
+
asset="${repo}-${TAG}.tar.gz"
|
|
145
|
+
git archive --format=tar.gz --prefix="${repo}-${TAG}/" -o "$asset" "$TAG"
|
|
146
|
+
echo "asset=$asset" >> "$GITHUB_OUTPUT"
|
|
147
|
+
echo "Built $asset from $TAG"
|
|
148
|
+
|
|
149
|
+
- name: Install cosign
|
|
150
|
+
if: steps.signature.outputs.signed == 'false'
|
|
151
|
+
uses: sigstore/cosign-installer@6f9f17788090df1f26f669e9d70d6ae9567deba6 # v4.1.2
|
|
152
|
+
|
|
153
|
+
- name: Sign the archive with a keyless identity
|
|
154
|
+
if: steps.signature.outputs.signed == 'false'
|
|
155
|
+
shell: bash
|
|
156
|
+
env:
|
|
157
|
+
ASSET: ${{ steps.archive.outputs.asset }}
|
|
158
|
+
run: |
|
|
159
|
+
set -euo pipefail
|
|
160
|
+
cosign sign-blob --yes --bundle "${ASSET}.sigstore" "$ASSET"
|
|
161
|
+
|
|
162
|
+
- name: Upload the archive and the signature bundle
|
|
163
|
+
if: steps.signature.outputs.signed == 'false'
|
|
164
|
+
shell: bash
|
|
165
|
+
env:
|
|
166
|
+
TAG: ${{ steps.tag.outputs.tag }}
|
|
167
|
+
ASSET: ${{ steps.archive.outputs.asset }}
|
|
168
|
+
run: |
|
|
169
|
+
set -euo pipefail
|
|
170
|
+
gh release upload "$TAG" "$ASSET" "${ASSET}.sigstore" --clobber
|
|
@@ -19,6 +19,25 @@ a git tag in this repository or on `origin` (checked with `git ls-remote --tags`
|
|
|
19
19
|
Any retroactive `v2.2.6` or `v2.2.7` tag should point at those commits. This note records
|
|
20
20
|
what the history supports; it does not claim that a tag exists.
|
|
21
21
|
|
|
22
|
+
## [v2.2.18] - 2026-10-25
|
|
23
|
+
|
|
24
|
+
### Deterministic ML initialisation
|
|
25
|
+
|
|
26
|
+
- Give `cds.ml.Layer` an optional `seed`, so weight initialisation draws from a private RNG stream that no other caller can perturb. The default (`seed=None`) keeps the historical behaviour, so `random.seed(...)` still makes a whole model reproducible.
|
|
27
|
+
- Add regression coverage for same-seed reproducibility under different global RNG states, independence of the global stream, and end-to-end MLP training reproducibility.
|
|
28
|
+
- Bump synchronized package metadata to 2.2.18 as required by the version-discipline gate for the `src/cds/` change.
|
|
29
|
+
|
|
30
|
+
## [v2.2.17] - 2026-10-24
|
|
31
|
+
|
|
32
|
+
### Dependency hygiene
|
|
33
|
+
|
|
34
|
+
- Update the locked `ruff` development pin from 0.15.17 to 0.17.1 (Dependabot routine update), in both `pyproject.toml` and `requirements-dev.lock`.
|
|
35
|
+
- Refresh `requirements-dev.lock` to `filelock==4.2.4` on Python 3.11+, clearing CVE-2026-112940 reported by the `pip-audit` lock gate. No fixed release supports Python 3.10, so the dev-only 3.10 pin stays at 3.29.4 (marker split).
|
|
36
|
+
- Refresh `requirements-dev.lock` to `virtualenv==21.14.13`, clearing CVE-2026-113713 and CVE-2026-115586 reported by the `pip-audit` lock gate.
|
|
37
|
+
- Bump synchronized package metadata to 2.2.17 as required by the version-discipline gate for the `[project]` dev-extra change.
|
|
38
|
+
|
|
39
|
+
> 2.2.16 was staged on `main` but never published: its CI run failed on advisories disclosed after the bump, so these changes ship in 2.2.17.
|
|
40
|
+
|
|
22
41
|
## [v2.2.15] - 2026-10-23
|
|
23
42
|
|
|
24
43
|
### Dependency security floors
|
|
@@ -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.18
|
|
9
9
|
authors:
|
|
10
10
|
- name: "Furox-Art"
|
|
11
11
|
email: "furkanarkn1451@gmail.com"
|
|
@@ -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.18
|
|
54
54
|
url: "https://github.com/Furox-Art/scientific-computing-system"
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: scientific-computing-system
|
|
3
|
-
Version: 2.2.
|
|
3
|
+
Version: 2.2.18
|
|
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
|
|
@@ -45,7 +45,7 @@ Requires-Dist: pandas>=2.0; extra == 'all'
|
|
|
45
45
|
Requires-Dist: pre-commit; extra == 'all'
|
|
46
46
|
Requires-Dist: pytest-cov; extra == 'all'
|
|
47
47
|
Requires-Dist: pytest>=9.0.3; extra == 'all'
|
|
48
|
-
Requires-Dist: ruff==0.
|
|
48
|
+
Requires-Dist: ruff==0.17.1; extra == 'all'
|
|
49
49
|
Requires-Dist: scikit-learn>=1.4; extra == 'all'
|
|
50
50
|
Requires-Dist: scipy>=1.11; extra == 'all'
|
|
51
51
|
Requires-Dist: statsmodels>=0.14; extra == 'all'
|
|
@@ -63,7 +63,7 @@ Requires-Dist: notebook; extra == 'dev'
|
|
|
63
63
|
Requires-Dist: numpy<2.5,>=2.0; extra == 'dev'
|
|
64
64
|
Requires-Dist: pandas-stubs>=2.0; extra == 'dev'
|
|
65
65
|
Requires-Dist: pre-commit; extra == 'dev'
|
|
66
|
-
Requires-Dist: ruff==0.
|
|
66
|
+
Requires-Dist: ruff==0.17.1; extra == 'dev'
|
|
67
67
|
Provides-Extra: docs
|
|
68
68
|
Requires-Dist: mkdocs-material>=9.7.7; extra == 'docs'
|
|
69
69
|
Requires-Dist: mkdocs>=1.5.0; extra == 'docs'
|
|
@@ -145,23 +145,25 @@ The import name is **`cds`** (the distribution is `scientific-computing-system`)
|
|
|
145
145
|
| **PyPI** (the library) | `pip install scientific-computing-system` | The actual Python package. Zero runtime dependencies. This is what you want. |
|
|
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
|
-
At the time of writing (2026-10-
|
|
148
|
+
At the time of writing (2026-10-25), both registries' latest versions are 2.2.17,
|
|
149
149
|
but they are not published in lockstep and are **not** equally verifiable:
|
|
150
150
|
|
|
151
151
|
- **PyPI** — carries a **PEP 740 provenance attestation** (Sigstore-signed,
|
|
152
152
|
binding the file digest to the publishing workflow). Verified on 2.2.3,
|
|
153
|
-
2.2.4, 2.2.5, 2.2.6, 2.2.8, 2.2.11, 2.2.12
|
|
154
|
-
sdist return 404 from the per-file provenance
|
|
155
|
-
since attestations were enabled" would be false
|
|
153
|
+
2.2.4, 2.2.5, 2.2.6, 2.2.8, 2.2.11, 2.2.12, 2.2.13, 2.2.14, 2.2.15 and
|
|
154
|
+
2.2.17. The 2.2.7 wheel and sdist return 404 from the per-file provenance
|
|
155
|
+
endpoint, so "every release since attestations were enabled" would be false;
|
|
156
|
+
2.2.16 was never published.
|
|
156
157
|
- **npm** — carries a **Sigstore attestation as of 2.2.3**, minted by npm's
|
|
157
158
|
OIDC trusted publisher (the registry serves both an npm publish attestation
|
|
158
159
|
and a SLSA provenance v1 bundle for that tarball). 1.0.0 through 2.2.2
|
|
159
160
|
predate the publisher registration and have none, so pin 2.2.3 or newer. npm
|
|
160
|
-
has no 2.2.7, 2.2.8 or 2.2.
|
|
161
|
-
|
|
162
|
-
histories do not. npm also exposes
|
|
163
|
-
not proof of origin, and
|
|
164
|
-
signature, not build
|
|
161
|
+
has no 2.2.7, 2.2.8, 2.2.11 or 2.2.16 at all: its 2.2.x line is 2.2.0
|
|
162
|
+
through 2.2.6, 2.2.12 through 2.2.15, and 2.2.17, which is how the latest
|
|
163
|
+
versions can match while the histories do not. npm also exposes
|
|
164
|
+
`dist.integrity` (sha512), which is a content pin, not proof of origin, and
|
|
165
|
+
`dist.signatures`, which is npm's registry transport signature, not build
|
|
166
|
+
provenance.
|
|
165
167
|
|
|
166
168
|
Prefer PyPI if you need an attestation for a version older than 2.2.3.
|
|
167
169
|
[SECURITY.md](SECURITY.md#distribution-channels-and-provenance) has the
|
|
@@ -277,7 +279,7 @@ The package installs a `cds` command with 13 subcommands:
|
|
|
277
279
|
|
|
278
280
|
```console
|
|
279
281
|
$ cds --version
|
|
280
|
-
System version 2.2.
|
|
282
|
+
System version 2.2.18
|
|
281
283
|
$ cds constants # physical constants table
|
|
282
284
|
```
|
|
283
285
|
|
|
@@ -49,23 +49,25 @@ The import name is **`cds`** (the distribution is `scientific-computing-system`)
|
|
|
49
49
|
| **PyPI** (the library) | `pip install scientific-computing-system` | The actual Python package. Zero runtime dependencies. This is what you want. |
|
|
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
|
-
At the time of writing (2026-10-
|
|
52
|
+
At the time of writing (2026-10-25), both registries' latest versions are 2.2.17,
|
|
53
53
|
but they are not published in lockstep and are **not** equally verifiable:
|
|
54
54
|
|
|
55
55
|
- **PyPI** — carries a **PEP 740 provenance attestation** (Sigstore-signed,
|
|
56
56
|
binding the file digest to the publishing workflow). Verified on 2.2.3,
|
|
57
|
-
2.2.4, 2.2.5, 2.2.6, 2.2.8, 2.2.11, 2.2.12
|
|
58
|
-
sdist return 404 from the per-file provenance
|
|
59
|
-
since attestations were enabled" would be false
|
|
57
|
+
2.2.4, 2.2.5, 2.2.6, 2.2.8, 2.2.11, 2.2.12, 2.2.13, 2.2.14, 2.2.15 and
|
|
58
|
+
2.2.17. The 2.2.7 wheel and sdist return 404 from the per-file provenance
|
|
59
|
+
endpoint, so "every release since attestations were enabled" would be false;
|
|
60
|
+
2.2.16 was never published.
|
|
60
61
|
- **npm** — carries a **Sigstore attestation as of 2.2.3**, minted by npm's
|
|
61
62
|
OIDC trusted publisher (the registry serves both an npm publish attestation
|
|
62
63
|
and a SLSA provenance v1 bundle for that tarball). 1.0.0 through 2.2.2
|
|
63
64
|
predate the publisher registration and have none, so pin 2.2.3 or newer. npm
|
|
64
|
-
has no 2.2.7, 2.2.8 or 2.2.
|
|
65
|
-
|
|
66
|
-
histories do not. npm also exposes
|
|
67
|
-
not proof of origin, and
|
|
68
|
-
signature, not build
|
|
65
|
+
has no 2.2.7, 2.2.8, 2.2.11 or 2.2.16 at all: its 2.2.x line is 2.2.0
|
|
66
|
+
through 2.2.6, 2.2.12 through 2.2.15, and 2.2.17, which is how the latest
|
|
67
|
+
versions can match while the histories do not. npm also exposes
|
|
68
|
+
`dist.integrity` (sha512), which is a content pin, not proof of origin, and
|
|
69
|
+
`dist.signatures`, which is npm's registry transport signature, not build
|
|
70
|
+
provenance.
|
|
69
71
|
|
|
70
72
|
Prefer PyPI if you need an attestation for a version older than 2.2.3.
|
|
71
73
|
[SECURITY.md](SECURITY.md#distribution-channels-and-provenance) has the
|
|
@@ -181,7 +183,7 @@ The package installs a `cds` command with 13 subcommands:
|
|
|
181
183
|
|
|
182
184
|
```console
|
|
183
185
|
$ cds --version
|
|
184
|
-
System version 2.2.
|
|
186
|
+
System version 2.2.18
|
|
185
187
|
$ cds constants # physical constants table
|
|
186
188
|
```
|
|
187
189
|
|
|
@@ -129,7 +129,8 @@ repository's publish workflows mints an attestation on each channel:
|
|
|
129
129
|
`scientific-computing-system`, workflow `release.yml`, environment `pypi`.
|
|
130
130
|
Exercised since 2.2.1. The per-file provenance endpoint returned 200 for the
|
|
131
131
|
published files of 2.2.1–2.2.6, 2.2.8, 2.2.11, 2.2.12 and 2.2.13 on 2026-10-22;
|
|
132
|
-
2.2.7 returns 404 for both its wheel and sdist.
|
|
132
|
+
2.2.7 returns 404 for both its wheel and sdist. Re-checked on 2026-10-25:
|
|
133
|
+
2.2.14, 2.2.15 and 2.2.17 also return 200, and 2.2.16 was never published.
|
|
133
134
|
- **npm** — Trusted Publisher: owner `Furox-Art`, repository
|
|
134
135
|
`scientific-computing-system`, workflow `npm-publish.yml`, environment `npm`.
|
|
135
136
|
Registered before 2.2.3, which is the first npm release published through it
|