bindsight 0.3.5__tar.gz → 0.3.7__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.
- bindsight-0.3.7/.gitattributes +25 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/.github/ISSUE_TEMPLATE/bug_report.yml +2 -1
- {bindsight-0.3.5 → bindsight-0.3.7}/.github/workflows/ci.yml +109 -10
- {bindsight-0.3.5 → bindsight-0.3.7}/.github/workflows/docker.yml +2 -0
- bindsight-0.3.7/.github/workflows/docs.yml +102 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/.github/workflows/draft-pdf.yml +1 -1
- bindsight-0.3.7/.github/workflows/manuscript-pdf.yml +162 -0
- bindsight-0.3.7/.github/workflows/release-artifacts.yml +111 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/.gitignore +10 -2
- {bindsight-0.3.5 → bindsight-0.3.7}/ARCHITECTURE.md +1 -1
- {bindsight-0.3.5 → bindsight-0.3.7}/CHANGELOG.md +256 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/CITATION.cff +2 -2
- {bindsight-0.3.5 → bindsight-0.3.7}/CONTRIBUTING.md +2 -2
- {bindsight-0.3.5 → bindsight-0.3.7}/Dockerfile +3 -3
- {bindsight-0.3.5 → bindsight-0.3.7}/LICENSING.md +12 -2
- {bindsight-0.3.5 → bindsight-0.3.7}/PKG-INFO +111 -62
- {bindsight-0.3.5 → bindsight-0.3.7}/README.md +99 -55
- {bindsight-0.3.5 → bindsight-0.3.7}/SECURITY.md +28 -0
- bindsight-0.3.7/Start bindsight.cmd +16 -0
- bindsight-0.3.7/Start bindsight.command +3 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/benchmarks/RUN_ON_KAGGLE.md +2 -2
- {bindsight-0.3.5 → bindsight-0.3.7}/benchmarks/calibration/CALIBRATION.md +35 -7
- {bindsight-0.3.5 → bindsight-0.3.7}/benchmarks/calibration/README.md +43 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/benchmarks/calibration/RESULTS.json +67 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/benchmarks/calibration/analyse.py +258 -34
- {bindsight-0.3.5 → bindsight-0.3.7}/benchmarks/designer_benchmark/DESIGNER_BENCHMARK.md +2 -2
- {bindsight-0.3.5 → bindsight-0.3.7}/benchmarks/designer_benchmark/RESULTS.md +2 -2
- bindsight-0.3.7/benchmarks/numerical_validation/README.md +412 -0
- bindsight-0.3.7/benchmarks/numerical_validation/cohort_3/counts.tsv.gz +0 -0
- bindsight-0.3.7/benchmarks/numerical_validation/cohort_3/design.tsv +7 -0
- bindsight-0.3.7/benchmarks/numerical_validation/cohort_3/provenance.json +85 -0
- bindsight-0.3.7/benchmarks/numerical_validation/cohort_8/counts.tsv.gz +0 -0
- bindsight-0.3.7/benchmarks/numerical_validation/cohort_8/design.tsv +17 -0
- bindsight-0.3.7/benchmarks/numerical_validation/cohort_8/provenance.json +175 -0
- bindsight-0.3.7/benchmarks/numerical_validation/config.yaml +11 -0
- bindsight-0.3.7/benchmarks/numerical_validation/diagnostics/artifact-manifest.json +31 -0
- bindsight-0.3.7/benchmarks/numerical_validation/diagnostics/dds_arrays.npz +0 -0
- bindsight-0.3.7/benchmarks/numerical_validation/diagnostics/dds_var.parquet +0 -0
- bindsight-0.3.7/benchmarks/numerical_validation/diagnostics/fit.json +75 -0
- bindsight-0.3.7/benchmarks/numerical_validation/diagnostics/objective-proof.json +244 -0
- bindsight-0.3.7/benchmarks/numerical_validation/diagnostics/reproduce_objective.py +147 -0
- bindsight-0.3.7/benchmarks/numerical_validation/diagnostics/results.parquet +0 -0
- bindsight-0.3.7/benchmarks/numerical_validation/local_workflow.json +211 -0
- bindsight-0.3.7/benchmarks/numerical_validation/local_workflow_canonical.json +212 -0
- bindsight-0.3.7/benchmarks/numerical_validation/local_workflow_mean_floor.json +212 -0
- bindsight-0.3.7/benchmarks/numerical_validation/reference/README.md +60 -0
- bindsight-0.3.7/benchmarks/numerical_validation/reference/cohort_3/artifact-manifest.json +137 -0
- bindsight-0.3.7/benchmarks/numerical_validation/reference/cohort_3/canonical/artifact-manifest.json +41 -0
- bindsight-0.3.7/benchmarks/numerical_validation/reference/cohort_3/canonical/comparison.json +830 -0
- bindsight-0.3.7/benchmarks/numerical_validation/reference/cohort_3/canonical/largest-lfc-differences.tsv.gz +0 -0
- bindsight-0.3.7/benchmarks/numerical_validation/reference/cohort_3/canonical/significance-disagreements.tsv.gz +0 -0
- bindsight-0.3.7/benchmarks/numerical_validation/reference/cohort_3/comparison.json +770 -0
- bindsight-0.3.7/benchmarks/numerical_validation/reference/cohort_3/design_matrix.tsv.gz +0 -0
- bindsight-0.3.7/benchmarks/numerical_validation/reference/cohort_3/execution.log +20 -0
- bindsight-0.3.7/benchmarks/numerical_validation/reference/cohort_3/gene_diagnostics.tsv.gz +0 -0
- bindsight-0.3.7/benchmarks/numerical_validation/reference/cohort_3/largest_lfc_differences.tsv.gz +0 -0
- bindsight-0.3.7/benchmarks/numerical_validation/reference/cohort_3/mean_floor/artifact-manifest.json +41 -0
- bindsight-0.3.7/benchmarks/numerical_validation/reference/cohort_3/mean_floor/comparison.json +830 -0
- bindsight-0.3.7/benchmarks/numerical_validation/reference/cohort_3/mean_floor/largest-lfc-differences.tsv.gz +0 -0
- bindsight-0.3.7/benchmarks/numerical_validation/reference/cohort_3/mean_floor/significance-disagreements.tsv.gz +0 -0
- bindsight-0.3.7/benchmarks/numerical_validation/reference/cohort_3/metadata.json +441 -0
- bindsight-0.3.7/benchmarks/numerical_validation/reference/cohort_3/results.tsv.gz +0 -0
- bindsight-0.3.7/benchmarks/numerical_validation/reference/cohort_3/session-info.txt +36 -0
- bindsight-0.3.7/benchmarks/numerical_validation/reference/cohort_3/significance_disagreements.tsv.gz +0 -0
- bindsight-0.3.7/benchmarks/numerical_validation/reference/cohort_3/size_factors.tsv.gz +0 -0
- bindsight-0.3.7/benchmarks/numerical_validation/reference/cohort_8/artifact-manifest.json +137 -0
- bindsight-0.3.7/benchmarks/numerical_validation/reference/cohort_8/canonical/artifact-manifest.json +41 -0
- bindsight-0.3.7/benchmarks/numerical_validation/reference/cohort_8/canonical/comparison.json +845 -0
- bindsight-0.3.7/benchmarks/numerical_validation/reference/cohort_8/canonical/largest-lfc-differences.tsv.gz +0 -0
- bindsight-0.3.7/benchmarks/numerical_validation/reference/cohort_8/canonical/significance-disagreements.tsv.gz +0 -0
- bindsight-0.3.7/benchmarks/numerical_validation/reference/cohort_8/comparison.json +785 -0
- bindsight-0.3.7/benchmarks/numerical_validation/reference/cohort_8/design_matrix.tsv.gz +0 -0
- bindsight-0.3.7/benchmarks/numerical_validation/reference/cohort_8/execution.log +20 -0
- bindsight-0.3.7/benchmarks/numerical_validation/reference/cohort_8/gene_diagnostics.tsv.gz +0 -0
- bindsight-0.3.7/benchmarks/numerical_validation/reference/cohort_8/largest_lfc_differences.tsv.gz +0 -0
- bindsight-0.3.7/benchmarks/numerical_validation/reference/cohort_8/mean_floor/artifact-manifest.json +41 -0
- bindsight-0.3.7/benchmarks/numerical_validation/reference/cohort_8/mean_floor/comparison.json +845 -0
- bindsight-0.3.7/benchmarks/numerical_validation/reference/cohort_8/mean_floor/largest-lfc-differences.tsv.gz +0 -0
- bindsight-0.3.7/benchmarks/numerical_validation/reference/cohort_8/mean_floor/significance-disagreements.tsv.gz +0 -0
- bindsight-0.3.7/benchmarks/numerical_validation/reference/cohort_8/metadata.json +456 -0
- bindsight-0.3.7/benchmarks/numerical_validation/reference/cohort_8/results.tsv.gz +0 -0
- bindsight-0.3.7/benchmarks/numerical_validation/reference/cohort_8/session-info.txt +36 -0
- bindsight-0.3.7/benchmarks/numerical_validation/reference/cohort_8/significance_disagreements.tsv.gz +0 -0
- bindsight-0.3.7/benchmarks/numerical_validation/reference/cohort_8/size_factors.tsv.gz +0 -0
- bindsight-0.3.7/benchmarks/numerical_validation/reference/diagnostics/README.md +107 -0
- bindsight-0.3.7/benchmarks/numerical_validation/reference/diagnostics/artifact-manifest.json +115 -0
- bindsight-0.3.7/benchmarks/numerical_validation/reference/diagnostics/eight-R-dispersion-means.tsv.gz +0 -0
- bindsight-0.3.7/benchmarks/numerical_validation/reference/diagnostics/eight-mean-floor-proof.json +92 -0
- bindsight-0.3.7/benchmarks/numerical_validation/reference/diagnostics/eight-outlier-diagnostics.tsv.gz +0 -0
- bindsight-0.3.7/benchmarks/numerical_validation/reference/diagnostics/eight-wald-floor-proof.json +35 -0
- bindsight-0.3.7/benchmarks/numerical_validation/reference/diagnostics/python-eight-fit-metadata.json +28 -0
- bindsight-0.3.7/benchmarks/numerical_validation/reference/diagnostics/sparse-fixture.json +870 -0
- bindsight-0.3.7/benchmarks/numerical_validation/reference/installed-packages.csv +159 -0
- bindsight-0.3.7/benchmarks/numerical_validation/reference/provenance-transformations.json +33 -0
- bindsight-0.3.7/benchmarks/numerical_validation/reference/setup-provenance.json +392 -0
- bindsight-0.3.7/benchmarks/numerical_validation/reference/setup-session-info.txt +37 -0
- bindsight-0.3.7/benchmarks/numerical_validation/reference/setup_reference.ps1 +55 -0
- bindsight-0.3.7/benchmarks/numerical_validation/results/canonical_eight/forward.parquet +0 -0
- bindsight-0.3.7/benchmarks/numerical_validation/results/canonical_eight/relabel_samples.parquet +0 -0
- bindsight-0.3.7/benchmarks/numerical_validation/results/canonical_eight/repeat.parquet +0 -0
- bindsight-0.3.7/benchmarks/numerical_validation/results/canonical_eight/reverse_contrast.parquet +0 -0
- bindsight-0.3.7/benchmarks/numerical_validation/results/canonical_eight/reverse_sample_order.parquet +0 -0
- bindsight-0.3.7/benchmarks/numerical_validation/results/canonical_eight/source_snapshot.json +18 -0
- bindsight-0.3.7/benchmarks/numerical_validation/results/canonical_eight/validation.json +772 -0
- bindsight-0.3.7/benchmarks/numerical_validation/results/canonical_three/forward.parquet +0 -0
- bindsight-0.3.7/benchmarks/numerical_validation/results/canonical_three/relabel_samples.parquet +0 -0
- bindsight-0.3.7/benchmarks/numerical_validation/results/canonical_three/repeat.parquet +0 -0
- bindsight-0.3.7/benchmarks/numerical_validation/results/canonical_three/reverse_contrast.parquet +0 -0
- bindsight-0.3.7/benchmarks/numerical_validation/results/canonical_three/reverse_sample_order.parquet +0 -0
- bindsight-0.3.7/benchmarks/numerical_validation/results/canonical_three/source_snapshot.json +18 -0
- bindsight-0.3.7/benchmarks/numerical_validation/results/canonical_three/validation.json +772 -0
- bindsight-0.3.7/benchmarks/numerical_validation/results/mean_floor_eight/forward.parquet +0 -0
- bindsight-0.3.7/benchmarks/numerical_validation/results/mean_floor_eight/relabel_samples.parquet +0 -0
- bindsight-0.3.7/benchmarks/numerical_validation/results/mean_floor_eight/repeat.parquet +0 -0
- bindsight-0.3.7/benchmarks/numerical_validation/results/mean_floor_eight/reverse_contrast.parquet +0 -0
- bindsight-0.3.7/benchmarks/numerical_validation/results/mean_floor_eight/reverse_sample_order.parquet +0 -0
- bindsight-0.3.7/benchmarks/numerical_validation/results/mean_floor_eight/source_snapshot.json +18 -0
- bindsight-0.3.7/benchmarks/numerical_validation/results/mean_floor_eight/validation.json +712 -0
- bindsight-0.3.7/benchmarks/numerical_validation/results/mean_floor_three/forward.parquet +0 -0
- bindsight-0.3.7/benchmarks/numerical_validation/results/mean_floor_three/relabel_samples.parquet +0 -0
- bindsight-0.3.7/benchmarks/numerical_validation/results/mean_floor_three/repeat.parquet +0 -0
- bindsight-0.3.7/benchmarks/numerical_validation/results/mean_floor_three/reverse_contrast.parquet +0 -0
- bindsight-0.3.7/benchmarks/numerical_validation/results/mean_floor_three/reverse_sample_order.parquet +0 -0
- bindsight-0.3.7/benchmarks/numerical_validation/results/mean_floor_three/source_snapshot.json +18 -0
- bindsight-0.3.7/benchmarks/numerical_validation/results/mean_floor_three/validation.json +712 -0
- bindsight-0.3.7/benchmarks/numerical_validation/results/original_three/forward.parquet +0 -0
- bindsight-0.3.7/benchmarks/numerical_validation/results/original_three/repeat.parquet +0 -0
- bindsight-0.3.7/benchmarks/numerical_validation/results/original_three/reverse_contrast.parquet +0 -0
- bindsight-0.3.7/benchmarks/numerical_validation/results/original_three/reverse_sample_order.parquet +0 -0
- bindsight-0.3.7/benchmarks/numerical_validation/results/original_three/validation.json +342 -0
- bindsight-0.3.7/benchmarks/numerical_validation/results/repaired_eight/forward.parquet +0 -0
- bindsight-0.3.7/benchmarks/numerical_validation/results/repaired_eight/relabel_samples.parquet +0 -0
- bindsight-0.3.7/benchmarks/numerical_validation/results/repaired_eight/repeat.parquet +0 -0
- bindsight-0.3.7/benchmarks/numerical_validation/results/repaired_eight/reverse_contrast.parquet +0 -0
- bindsight-0.3.7/benchmarks/numerical_validation/results/repaired_eight/reverse_sample_order.parquet +0 -0
- bindsight-0.3.7/benchmarks/numerical_validation/results/repaired_eight/sample_identifier_sensitivity.json +52 -0
- bindsight-0.3.7/benchmarks/numerical_validation/results/repaired_eight/validation.json +599 -0
- bindsight-0.3.7/benchmarks/numerical_validation/results/repaired_three/forward.parquet +0 -0
- bindsight-0.3.7/benchmarks/numerical_validation/results/repaired_three/relabel_samples.parquet +0 -0
- bindsight-0.3.7/benchmarks/numerical_validation/results/repaired_three/repeat.parquet +0 -0
- bindsight-0.3.7/benchmarks/numerical_validation/results/repaired_three/reverse_contrast.parquet +0 -0
- bindsight-0.3.7/benchmarks/numerical_validation/results/repaired_three/reverse_sample_order.parquet +0 -0
- bindsight-0.3.7/benchmarks/numerical_validation/results/repaired_three/sample_identifier_sensitivity.json +67 -0
- bindsight-0.3.7/benchmarks/numerical_validation/results/repaired_three/validation.json +599 -0
- bindsight-0.3.7/benchmarks/numerical_validation/source_snapshots/regularization_only.json +21 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/bindsight/benchmark/designer_bench.py +10 -7
- {bindsight-0.3.5 → bindsight-0.3.7}/bindsight/cli.py +13 -6
- {bindsight-0.3.5 → bindsight-0.3.7}/bindsight/config.py +9 -0
- bindsight-0.3.7/bindsight/deg/cache.py +94 -0
- bindsight-0.3.7/bindsight/deg/diagnostics.py +52 -0
- bindsight-0.3.7/bindsight/deg/inference.py +152 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/bindsight/deg/pydeseq2_runner.py +147 -11
- {bindsight-0.3.5 → bindsight-0.3.7}/bindsight/design/embeddings.py +8 -6
- {bindsight-0.3.5 → bindsight-0.3.7}/bindsight/pipelines/discover.py +65 -25
- {bindsight-0.3.5 → bindsight-0.3.7}/bindsight/pipelines/full_run.py +3 -1
- {bindsight-0.3.5 → bindsight-0.3.7}/bindsight/plugins.py +12 -6
- {bindsight-0.3.5 → bindsight-0.3.7}/bindsight/rank/scoring.py +33 -15
- bindsight-0.3.7/bindsight/report/coverage.py +26 -0
- bindsight-0.3.7/bindsight/report/fit_diagnostics.py +95 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/bindsight/report/html.py +76 -3
- {bindsight-0.3.5 → bindsight-0.3.7}/bindsight/report/showcase.py +1 -1
- {bindsight-0.3.5 → bindsight-0.3.7}/bindsight/report/templates/report.html.j2 +25 -8
- {bindsight-0.3.5 → bindsight-0.3.7}/bindsight/report/theme.py +6 -6
- {bindsight-0.3.5 → bindsight-0.3.7}/bindsight/report/web/app.py +24 -8
- bindsight-0.3.7/bindsight/report/web/evidence-snapshot.json +55 -0
- bindsight-0.3.7/bindsight/report/web/evidence.py +170 -0
- bindsight-0.3.7/bindsight/report/web/gpu.py +444 -0
- bindsight-0.3.7/bindsight/report/web/gpu_setup.py +433 -0
- bindsight-0.3.7/bindsight/report/web/gpu_worker.py +335 -0
- bindsight-0.3.7/bindsight/report/web/resources.py +303 -0
- bindsight-0.3.7/bindsight/report/web/static/fonts/dm-sans-OFL.txt +93 -0
- bindsight-0.3.7/bindsight/report/web/static/fonts/dm-sans-latin-variable.woff2 +0 -0
- bindsight-0.3.7/bindsight/report/web/static/fonts/instrument-serif-OFL.txt +93 -0
- bindsight-0.3.7/bindsight/report/web/static/fonts/instrument-serif-latin-italic.woff2 +0 -0
- bindsight-0.3.7/bindsight/report/web/static/fonts/instrument-serif-latin-regular.woff2 +0 -0
- bindsight-0.3.7/bindsight/report/web/static/fonts/instrument-serif-sources.json +33 -0
- bindsight-0.3.7/bindsight/report/web/static/fonts/manrope-OFL.txt +93 -0
- bindsight-0.3.7/bindsight/report/web/static/fonts/manrope-latin-variable.woff2 +0 -0
- bindsight-0.3.7/bindsight/report/web/static/fonts/sources.json +44 -0
- bindsight-0.3.7/bindsight/report/web/static/workbench-gpu.js +107 -0
- bindsight-0.3.7/bindsight/report/web/static/workbench-pages.js +221 -0
- bindsight-0.3.7/bindsight/report/web/static/workbench.css +33 -0
- bindsight-0.3.7/bindsight/report/web/static/workbench.js +100 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/bindsight/report/web/templates/base.html.j2 +1 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/bindsight/report/web/templates/overview.html.j2 +3 -2
- {bindsight-0.3.5 → bindsight-0.3.7}/bindsight/report/web/templates/try.html.j2 +1 -1
- bindsight-0.3.7/bindsight/report/web/templates/workbench.html.j2 +65 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/bindsight/report/web/templates/your_data.html.j2 +1 -1
- bindsight-0.3.7/bindsight/report/web/workbench_routes.py +386 -0
- bindsight-0.3.7/bindsight/report/web/worker.py +111 -0
- bindsight-0.3.7/bindsight/report/web/workspace.py +694 -0
- bindsight-0.3.7/bindsight/runners/boltz_compat.py +66 -0
- bindsight-0.3.7/bindsight/runners/installer_security.py +99 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/bindsight/runners/job_exec.py +14 -7
- {bindsight-0.3.5 → bindsight-0.3.7}/bindsight/runners/kaggle.py +5 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/bindsight/runners/kaggle_kernel.py +58 -32
- {bindsight-0.3.5 → bindsight-0.3.7}/bindsight/runners/local_docker.py +29 -5
- {bindsight-0.3.5 → bindsight-0.3.7}/bindsight/runners/modal_runner.py +22 -16
- {bindsight-0.3.5 → bindsight-0.3.7}/bindsight/runners/notebook_content.py +3 -2
- {bindsight-0.3.5 → bindsight-0.3.7}/bindsight/runners/tools.py +12 -6
- {bindsight-0.3.5 → bindsight-0.3.7}/codemeta.json +3 -3
- bindsight-0.3.7/companion/.gitignore +3 -0
- bindsight-0.3.7/companion/README.md +139 -0
- bindsight-0.3.7/companion/__init__.py +2 -0
- bindsight-0.3.7/companion/app.py +467 -0
- bindsight-0.3.7/companion/build.py +184 -0
- bindsight-0.3.7/companion/companion.spec +22 -0
- bindsight-0.3.7/companion/core.py +716 -0
- bindsight-0.3.7/companion/desktop.py +160 -0
- bindsight-0.3.7/companion/pins.json +13 -0
- bindsight-0.3.7/companion/protocol.py +37 -0
- bindsight-0.3.7/companion/requirements-build.txt +1 -0
- bindsight-0.3.7/companion/smoke_install.py +91 -0
- bindsight-0.3.7/companion/validation-evidence.json +93 -0
- bindsight-0.3.7/companion/validation.py +66 -0
- bindsight-0.3.7/companion/wsl.py +503 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/docs/README.md +2 -0
- bindsight-0.3.7/docs/audits/dependency-audit-2026-09-29.json +1 -0
- bindsight-0.3.7/docs/audits/local-software-checks-2026-09-29.json +35 -0
- bindsight-0.3.7/docs/audits/local-workflow-companion-2026-09-29.json +341 -0
- bindsight-0.3.7/docs/audits/security-bootstrap-2026-11-01.json +60 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/docs/glossary.md +1 -1
- {bindsight-0.3.5 → bindsight-0.3.7}/docs/how-to-use.md +8 -2
- {bindsight-0.3.5 → bindsight-0.3.7}/docs/index.md +29 -26
- bindsight-0.3.7/docs/local-workspace.md +66 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/docs/positioning.md +7 -5
- bindsight-0.3.7/docs/validation-status.md +245 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/docs/what-is-bindsight.md +1 -1
- {bindsight-0.3.5 → bindsight-0.3.7}/envs/constraints.txt +2 -2
- {bindsight-0.3.5 → bindsight-0.3.7}/envs/discover.yaml +3 -2
- bindsight-0.3.7/hosting/README.md +59 -0
- bindsight-0.3.7/hosting/site-proxy.mjs +73 -0
- bindsight-0.3.7/hosting/site-proxy.test.mjs +108 -0
- bindsight-0.3.7/hosting/site-proxy.workerd-test.mjs +56 -0
- bindsight-0.3.7/launch.py +118 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/mkdocs.yml +2 -0
- bindsight-0.3.7/paper/README.md +463 -0
- bindsight-0.3.7/paper/SUBMISSIONS.md +75 -0
- {bindsight-0.3.5/paper/biorxiv → bindsight-0.3.7/paper/methods}/manuscript.tex +5 -4
- {bindsight-0.3.5 → bindsight-0.3.7}/paper/paper.bib +2 -2
- {bindsight-0.3.5 → bindsight-0.3.7}/paper/paper.md +6 -6
- {bindsight-0.3.5 → bindsight-0.3.7}/paper/validation/manuscript.md +13 -5
- {bindsight-0.3.5 → bindsight-0.3.7}/pyproject.toml +10 -5
- {bindsight-0.3.5 → bindsight-0.3.7}/requirements.txt +4 -2
- {bindsight-0.3.5 → bindsight-0.3.7}/scripts/README.md +9 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/scripts/build_docs_results.py +26 -7
- bindsight-0.3.7/scripts/build_website.py +132 -0
- bindsight-0.3.7/scripts/check_release_install.py +88 -0
- bindsight-0.3.7/scripts/compare_deseq2_reference.py +225 -0
- bindsight-0.3.7/scripts/publish_companions.py +78 -0
- bindsight-0.3.7/scripts/pypi_readme.py +116 -0
- bindsight-0.3.7/scripts/reference_deseq2.R +122 -0
- bindsight-0.3.7/scripts/validate_real_counts.py +293 -0
- bindsight-0.3.7/scripts/verify_local_workflow.py +346 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/tests/test_author_metadata_agrees.py +31 -7
- {bindsight-0.3.5 → bindsight-0.3.7}/tests/test_calibration_analysis.py +90 -2
- bindsight-0.3.7/tests/test_companion_build.py +94 -0
- bindsight-0.3.7/tests/test_companion_core.py +319 -0
- bindsight-0.3.7/tests/test_companion_protocol.py +60 -0
- bindsight-0.3.7/tests/test_companion_publication.py +70 -0
- bindsight-0.3.7/tests/test_companion_wsl.py +290 -0
- bindsight-0.3.7/tests/test_deg_cache_integrity.py +127 -0
- bindsight-0.3.7/tests/test_deg_identifiers.py +88 -0
- bindsight-0.3.7/tests/test_deg_inference.py +221 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/tests/test_deg_input_validation.py +5 -1
- bindsight-0.3.7/tests/test_deg_ordering.py +122 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/tests/test_designer_bench.py +36 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/tests/test_docs_claims.py +26 -30
- bindsight-0.3.7/tests/test_fit_diagnostics.py +135 -0
- bindsight-0.3.7/tests/test_gpu_integration.py +241 -0
- bindsight-0.3.7/tests/test_gpu_workbench.py +513 -0
- bindsight-0.3.7/tests/test_installer_security.py +128 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/tests/test_job_exec.py +4 -2
- {bindsight-0.3.5 → bindsight-0.3.7}/tests/test_join_end_to_end.py +24 -5
- bindsight-0.3.7/tests/test_local_workbench.py +352 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/tests/test_manuscript_pdf_workflow.py +209 -13
- {bindsight-0.3.5 → bindsight-0.3.7}/tests/test_manuscript_typesets.py +3 -3
- {bindsight-0.3.5 → bindsight-0.3.7}/tests/test_no_hosted_space.py +13 -12
- {bindsight-0.3.5 → bindsight-0.3.7}/tests/test_no_zenodo.py +8 -2
- {bindsight-0.3.5 → bindsight-0.3.7}/tests/test_non_cancer_cohort.py +27 -1
- bindsight-0.3.7/tests/test_numerical_validation.py +93 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/tests/test_packaging_pins.py +76 -10
- {bindsight-0.3.5 → bindsight-0.3.7}/tests/test_pipelines_discover.py +38 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/tests/test_pipelines_full_run.py +25 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/tests/test_published_numbers_match_artifacts.py +3 -3
- bindsight-0.3.7/tests/test_pypi_readme.py +109 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/tests/test_rank.py +57 -0
- bindsight-0.3.7/tests/test_reference_comparison.py +154 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/tests/test_report_failed_run.py +19 -3
- {bindsight-0.3.5 → bindsight-0.3.7}/tests/test_report_html.py +81 -1
- {bindsight-0.3.5 → bindsight-0.3.7}/tests/test_requirements_mirror.py +5 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/tests/test_run_self_contained.py +13 -3
- {bindsight-0.3.5 → bindsight-0.3.7}/tests/test_runners_modal_local.py +1 -1
- {bindsight-0.3.5 → bindsight-0.3.7}/tests/test_runners_tools.py +2 -2
- bindsight-0.3.7/tests/test_submission_record.py +425 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/tests/test_untested_ready_rows.py +9 -6
- {bindsight-0.3.5 → bindsight-0.3.7}/tests/test_web_ui.py +88 -2
- bindsight-0.3.7/tests/test_website_archive.py +298 -0
- bindsight-0.3.7/tests/test_workspace_resources.py +183 -0
- bindsight-0.3.5/.gitattributes +0 -17
- bindsight-0.3.5/.github/workflows/docs.yml +0 -55
- bindsight-0.3.5/.github/workflows/manuscript-pdf.yml +0 -80
- bindsight-0.3.5/.github/workflows/release-artifacts.yml +0 -88
- bindsight-0.3.5/paper/README.md +0 -356
- {bindsight-0.3.5 → bindsight-0.3.7}/.dockerignore +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/.editorconfig +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/.github/CODEOWNERS +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/.github/ISSUE_TEMPLATE/reproducibility.yml +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/.github/dependabot.yml +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/CODE_OF_CONDUCT.md +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/COPYRIGHT +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/LICENSE +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/SUPPORT.md +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/Snakefile +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/benchmarks/PROVENANCE.md +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/benchmarks/README.md +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/benchmarks/binders.fasta +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/benchmarks/binders.tsv +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/benchmarks/build_eval_set.py +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/benchmarks/calibration/PRECISION.md +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/benchmarks/calibration/prepare_decoy_target.py +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/benchmarks/calibration/stage_scrambles.py +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/benchmarks/calibration/submit_calibration.py +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/benchmarks/calibration/target/Q96NY8_ig_v.pdb +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/benchmarks/designer_benchmark/README.md +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/benchmarks/designer_benchmark/RUN_FREE_GPU.md +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/benchmarks/designer_benchmark/binders/P04626_binder_0_seq0.fasta +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/benchmarks/designer_benchmark/binders/P04626_binder_0_seq0_complex.cif +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/benchmarks/designer_benchmark/binders/P04626_binder_0_seq1.fasta +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/benchmarks/designer_benchmark/binders/P04626_binder_0_seq1_complex.cif +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/benchmarks/designer_benchmark/binders/P04626_binder_1_seq0.fasta +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/benchmarks/designer_benchmark/binders/P04626_binder_1_seq0_complex.cif +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/benchmarks/designer_benchmark/binders/P04626_binder_1_seq1.fasta +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/benchmarks/designer_benchmark/binders/P04626_binder_1_seq1_complex.cif +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/benchmarks/designer_benchmark/binders/P04626_binder_2_seq0.fasta +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/benchmarks/designer_benchmark/binders/P04626_binder_2_seq0_complex.cif +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/benchmarks/designer_benchmark/binders/P04626_binder_2_seq1.fasta +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/benchmarks/designer_benchmark/binders/P04626_binder_2_seq1_complex.cif +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/benchmarks/designer_benchmark/binders/P04626_binder_3_seq0.fasta +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/benchmarks/designer_benchmark/binders/P04626_binder_3_seq0_complex.cif +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/benchmarks/designer_benchmark/binders/P04626_binder_3_seq1.fasta +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/benchmarks/designer_benchmark/binders/P04626_binder_3_seq1_complex.cif +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/benchmarks/designer_benchmark/binders/P04626_binder_4_seq0.fasta +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/benchmarks/designer_benchmark/binders/P04626_binder_4_seq0_complex.cif +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/benchmarks/designer_benchmark/binders/P04626_binder_4_seq1.fasta +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/benchmarks/designer_benchmark/binders/P04626_binder_4_seq1_complex.cif +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/benchmarks/designer_benchmark/binders/P04626_binder_5_seq0.fasta +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/benchmarks/designer_benchmark/binders/P04626_binder_5_seq0_complex.cif +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/benchmarks/designer_benchmark/binders/P04626_binder_5_seq1.fasta +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/benchmarks/designer_benchmark/binders/P04626_binder_5_seq1_complex.cif +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/benchmarks/designer_benchmark/binders/P04626_binder_6_seq0.fasta +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/benchmarks/designer_benchmark/binders/P04626_binder_6_seq0_complex.cif +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/benchmarks/designer_benchmark/binders/P04626_binder_6_seq1.fasta +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/benchmarks/designer_benchmark/binders/P04626_binder_6_seq1_complex.cif +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/benchmarks/designer_benchmark/binders/P04626_binder_7_seq0.fasta +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/benchmarks/designer_benchmark/binders/P04626_binder_7_seq0_complex.cif +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/benchmarks/designer_benchmark/binders/P04626_binder_7_seq1.fasta +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/benchmarks/designer_benchmark/binders/P04626_binder_7_seq1_complex.cif +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/benchmarks/designer_benchmark/binders/P04626_binder_8_seq0.fasta +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/benchmarks/designer_benchmark/binders/P04626_binder_8_seq0_complex.cif +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/benchmarks/designer_benchmark/binders/P04626_binder_8_seq1.fasta +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/benchmarks/designer_benchmark/binders/P04626_binder_8_seq1_complex.cif +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/benchmarks/designer_benchmark/binders/P04626_binder_9_seq0.fasta +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/benchmarks/designer_benchmark/binders/P04626_binder_9_seq0_complex.cif +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/benchmarks/designer_benchmark/binders/P04626_binder_9_seq1.fasta +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/benchmarks/designer_benchmark/binders/P04626_binder_9_seq1_complex.cif +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/benchmarks/designer_benchmark/binders/developability.tsv +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/benchmarks/designer_benchmark/binders/embedding_coords.tsv +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/benchmarks/designer_benchmark/binders/embedding_space.png +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/benchmarks/designer_benchmark/binders/metrics.jsonl +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/benchmarks/designer_benchmark/embed_binders.py +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/benchmarks/designer_benchmark/prepare_erbb2_target.py +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/benchmarks/designer_benchmark/results.json +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/benchmarks/designer_benchmark/score_developability.py +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/benchmarks/designer_benchmark/score_run.py +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/benchmarks/designer_benchmark/target/P04626_domain_IV.pdb +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/benchmarks/gpu_capacity/README.md +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/benchmarks/gpu_capacity/t4-ca9-377aa.log +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/benchmarks/known.tsv +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/benchmarks/provenance_join/README.md +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/benchmarks/provenance_join/SHA256SUMS +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/benchmarks/provenance_join/ro-crate-metadata.json +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/benchmarks/provenance_join/run_manifest.jsonld +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/benchmarks/run_designer_benchmark.py +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/benchmarks/run_study.py +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/benchmarks/sources.json +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/benchmarks/study/README.md +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/benchmarks/study/RESULTS.md +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/benchmarks/study/figures/outcome_classes.png +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/benchmarks/study/figures/surfaced_ranks.png +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/benchmarks/study/results.json +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/benchmarks/study/run_log.json +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/bindsight/README.md +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/bindsight/__init__.py +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/bindsight/benchmark/__init__.py +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/bindsight/benchmark/core.py +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/bindsight/benchmark/defaults.py +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/bindsight/benchmark/outcomes.py +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/bindsight/benchmark/panel.py +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/bindsight/benchmark/rediscovery.py +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/bindsight/benchmark/statistics.py +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/bindsight/benchmark/study.py +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/bindsight/benchmark/study_figures.py +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/bindsight/benchmark/study_report.py +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/bindsight/cost.py +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/bindsight/deg/__init__.py +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/bindsight/design/__init__.py +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/bindsight/design/_common.py +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/bindsight/design/bindcraft.py +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/bindsight/design/boltzgen.py +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/bindsight/design/developability.py +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/bindsight/design/prescreen.py +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/bindsight/design/protocol.py +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/bindsight/design/rfdiff_mpnn.py +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/bindsight/epitopes/__init__.py +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/bindsight/epitopes/surface_bind.py +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/bindsight/export/__init__.py +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/bindsight/export/ro_crate.py +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/bindsight/io/__init__.py +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/bindsight/io/cbioportal.py +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/bindsight/io/gdc.py +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/bindsight/io/paths.py +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/bindsight/pipelines/__init__.py +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/bindsight/pipelines/caveats.py +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/bindsight/provenance/__init__.py +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/bindsight/provenance/append.py +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/bindsight/provenance/fragments.py +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/bindsight/provenance/manifest.py +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/bindsight/rank/__init__.py +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/bindsight/report/__init__.py +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/bindsight/report/format.py +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/bindsight/report/templates/report.css +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/bindsight/report/web/__init__.py +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/bindsight/report/web/static/binder_viewer.js +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/bindsight/report/web/static/bindsight.css +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/bindsight/report/web/static/charts.js +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/bindsight/report/web/static/vendor/3Dmol-min.js +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/bindsight/report/web/static/vendor/3Dmol.LICENSE +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/bindsight/report/web/static/your_data_check.js +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/bindsight/report/web/templates/evidence.html.j2 +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/bindsight/report/web/templates/runs.html.j2 +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/bindsight/runners/__init__.py +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/bindsight/runners/colab.py +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/bindsight/runners/mock.py +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/bindsight/runners/notebook.py +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/bindsight/runners/protocol.py +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/bindsight/runners/source_wheel.py +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/bindsight/structures/__init__.py +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/bindsight/structures/alphafolddb.py +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/bindsight/structures/plddt.py +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/bindsight/structures/topology.py +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/bindsight/surfaceome/__init__.py +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/bindsight/surfaceome/data/surfaceome_extended.tsv +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/bindsight/surfaceome/data/surfy_offline.txt +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/bindsight/surfaceome/data/surfy_v1.ensembl.tsv +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/bindsight/surfaceome/data/surfy_v1.uniprot.txt +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/bindsight/surfaceome/surfy.py +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/bindsight/targets/__init__.py +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/bindsight/targets/ensembl_uniprot.py +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/bindsight/targets/gtex.py +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/bindsight/targets/open_targets.py +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/bindsight/validate/__init__.py +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/bindsight/validate/af2_ig.py +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/bindsight/validate/boltz2.py +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/bindsight/validate/chai1r.py +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/bindsight/validate/protocol.py +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/data/surface_bind/README.md +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/docs/assets/favicon.svg +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/docs/assets/figures/outcome_classes.png +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/docs/assets/figures/surfaced_ranks.png +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/docs/assets/js/binder_viewer.js +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/docs/assets/js/your_data_check.js +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/docs/assets/logo.svg +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/docs/assets/og-image.png +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/docs/assets/structures/P04626_binder_0_seq0_complex.cif +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/docs/assets/structures/P04626_binder_0_seq1_complex.cif +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/docs/assets/structures/P04626_binder_1_seq0_complex.cif +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/docs/assets/structures/P04626_binder_1_seq1_complex.cif +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/docs/assets/structures/P04626_binder_2_seq0_complex.cif +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/docs/assets/structures/P04626_binder_2_seq1_complex.cif +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/docs/assets/structures/P04626_binder_3_seq0_complex.cif +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/docs/assets/structures/P04626_binder_3_seq1_complex.cif +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/docs/assets/structures/P04626_binder_4_seq0_complex.cif +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/docs/assets/structures/P04626_binder_4_seq1_complex.cif +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/docs/assets/structures/P04626_binder_5_seq0_complex.cif +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/docs/assets/structures/P04626_binder_5_seq1_complex.cif +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/docs/assets/structures/P04626_binder_6_seq0_complex.cif +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/docs/assets/structures/P04626_binder_6_seq1_complex.cif +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/docs/assets/structures/P04626_binder_7_seq0_complex.cif +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/docs/assets/structures/P04626_binder_7_seq1_complex.cif +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/docs/assets/structures/P04626_binder_8_seq0_complex.cif +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/docs/assets/structures/P04626_binder_8_seq1_complex.cif +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/docs/assets/structures/P04626_binder_9_seq0_complex.cif +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/docs/assets/structures/P04626_binder_9_seq1_complex.cif +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/docs/assets/vendor/3Dmol-min.js +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/docs/assets/vendor/3Dmol.LICENSE +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/docs/colab-design-howto.md +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/docs/results.md +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/docs/robots.txt +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/docs/stylesheets/extra.css +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/docs/try-your-data.md +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/docs/use-cases.md +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/envs/README.md +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/examples/README.md +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/examples/benchmark_held_out.yaml +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/examples/demo/config.yaml +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/examples/provenance_join.yaml +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/examples/tcga_luad.yaml +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/overrides/main.html +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/paper/LICENSE +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/scripts/assemble_manifest.py +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/scripts/build_surfaceome_extension.py +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/scripts/build_surfy_gene_map.py +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/scripts/build_surfy_list.py +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/scripts/check_pinned_environment.py +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/scripts/make_og_image.py +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/scripts/run_deg.py +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/scripts/run_design.py +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/scripts/run_discover.py +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/scripts/run_rank.py +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/scripts/run_report.py +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/scripts/run_validate.py +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/tests/README.md +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/tests/__init__.py +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/tests/conftest.py +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/tests/fixtures/embeddings/binders_esm2_t6.npy +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/tests/fixtures/gtex/gtex_median_subset.gct +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/tests/fixtures/plddt/AF-TEST1-F1-model_v6.cif +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/tests/fixtures/surface_bind/.commit_sha +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/tests/fixtures/surface_bind/sites/P04626/sites.json +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/tests/fixtures/tiny_counts.tsv +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/tests/fixtures/tiny_design.tsv +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/tests/fixtures/topology/P04626.topology.json +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/tests/test_alphafolddb_client.py +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/tests/test_assemble_manifest.py +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/tests/test_backend_capability.py +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/tests/test_bare_install.py +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/tests/test_benchmark.py +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/tests/test_benchmark_indication.py +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/tests/test_benchmark_outcomes.py +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/tests/test_benchmark_panel.py +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/tests/test_benchmark_statistics.py +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/tests/test_benchmark_study.py +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/tests/test_cache_key_scope.py +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/tests/test_calibration_staging.py +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/tests/test_caveats.py +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/tests/test_cbioportal.py +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/tests/test_cheap_profile.py +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/tests/test_check_pinned_environment.py +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/tests/test_cli.py +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/tests/test_cli_demo_and_report.py +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/tests/test_cli_doctor.py +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/tests/test_config.py +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/tests/test_contrast.py +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/tests/test_correctness_regressions.py +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/tests/test_cost.py +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/tests/test_counted_self_claims.py +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/tests/test_css_cascade.py +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/tests/test_deg_runner.py +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/tests/test_demo_e2e.py +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/tests/test_design_target_chain.py +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/tests/test_designers_validators.py +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/tests/test_developability.py +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/tests/test_docs_binder_viewer.py +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/tests/test_docs_results.py +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/tests/test_docs_results_generator.py +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/tests/test_documented_commands.py +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/tests/test_embeddings.py +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/tests/test_empty_is_not_absent.py +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/tests/test_ensembl_uniprot.py +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/tests/test_enumerations_match_their_source.py +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/tests/test_eval_set.py +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/tests/test_export_ro_crate.py +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/tests/test_failure_taxonomy.py +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/tests/test_gdc.py +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/tests/test_gpu_capacity_claim.py +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/tests/test_gtex.py +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/tests/test_job_exec_retention.py +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/tests/test_joss_paper_sections.py +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/tests/test_kaggle_kernel.py +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/tests/test_licensing_review.py +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/tests/test_manifest.py +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/tests/test_no_streamlit.py +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/tests/test_notebook_helpers.py +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/tests/test_open_targets_client.py +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/tests/test_package_imports.py +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/tests/test_plddt.py +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/tests/test_provenance_join_artifact.py +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/tests/test_rediscovery.py +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/tests/test_remote_job_durability.py +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/tests/test_report_lazy_import.py +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/tests/test_runners_colab.py +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/tests/test_runners_mock.py +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/tests/test_showcase.py +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/tests/test_silent_success.py +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/tests/test_snakemake_dag.py +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/tests/test_study_nulls.py +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/tests/test_surface_bind.py +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/tests/test_surfy_offline.py +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/tests/test_surfy_vendored.py +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/tests/test_target_chain_artifact.py +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/tests/test_third_party_plugins.py +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/tests/test_topology.py +0 -0
- {bindsight-0.3.5 → bindsight-0.3.7}/tests/test_topology_gpi.py +0 -0
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
* text=auto eol=lf
|
|
2
|
+
|
|
3
|
+
*.py text diff=python
|
|
4
|
+
*.md text
|
|
5
|
+
*.yaml text
|
|
6
|
+
*.yml text
|
|
7
|
+
*.toml text
|
|
8
|
+
*.cff text
|
|
9
|
+
Snakefile text
|
|
10
|
+
|
|
11
|
+
# Binary-y data
|
|
12
|
+
*.parquet binary
|
|
13
|
+
*.tar.gz binary
|
|
14
|
+
*.gz binary
|
|
15
|
+
*.zip binary
|
|
16
|
+
*.cif binary
|
|
17
|
+
*.pdb binary
|
|
18
|
+
|
|
19
|
+
# Recorded evidence is checksum-addressed: retain its exact archived bytes.
|
|
20
|
+
benchmarks/numerical_validation/** -text whitespace=cr-at-eol
|
|
21
|
+
docs/audits/** -text whitespace=cr-at-eol
|
|
22
|
+
# R's captured session/log output intentionally pads its printed columns.
|
|
23
|
+
benchmarks/numerical_validation/reference/**/session-info.txt whitespace=-blank-at-eol
|
|
24
|
+
benchmarks/numerical_validation/reference/setup-session-info.txt whitespace=-blank-at-eol
|
|
25
|
+
benchmarks/numerical_validation/reference/**/execution.log whitespace=-blank-at-eol
|
|
@@ -41,7 +41,7 @@ body:
|
|
|
41
41
|
attributes:
|
|
42
42
|
label: Version
|
|
43
43
|
description: "Output of `bindsight --version`."
|
|
44
|
-
placeholder: "0.3.
|
|
44
|
+
placeholder: "0.3.7"
|
|
45
45
|
validations:
|
|
46
46
|
required: true
|
|
47
47
|
|
|
@@ -59,6 +59,7 @@ body:
|
|
|
59
59
|
attributes:
|
|
60
60
|
label: How you installed it
|
|
61
61
|
options:
|
|
62
|
+
- "pip install bindsight (PyPI)"
|
|
62
63
|
- "git clone + pip install -e"
|
|
63
64
|
- "conda/mamba from envs/discover.yaml"
|
|
64
65
|
- "Docker"
|
|
@@ -19,23 +19,30 @@ jobs:
|
|
|
19
19
|
- uses: actions/checkout@v7
|
|
20
20
|
- uses: actions/setup-python@v7
|
|
21
21
|
with:
|
|
22
|
-
python-version: "3.11"
|
|
22
|
+
python-version: "3.11.18"
|
|
23
|
+
check-latest: true
|
|
23
24
|
cache: "pip"
|
|
24
25
|
- name: Install
|
|
25
26
|
run: |
|
|
26
|
-
python -m pip install --upgrade pip
|
|
27
|
+
python -m pip install --upgrade "pip>=26.2.2"
|
|
27
28
|
pip install -e ".[dev,discover,report]"
|
|
28
29
|
- name: Ruff check
|
|
29
|
-
run: ruff check bindsight tests scripts benchmarks
|
|
30
|
+
run: ruff check bindsight tests scripts benchmarks companion
|
|
31
|
+
- name: Test the read-only website relay
|
|
32
|
+
run: node --test hosting/site-proxy.test.mjs
|
|
33
|
+
- name: Test the production Worker request implementation
|
|
34
|
+
run: |
|
|
35
|
+
npm install --prefix "$RUNNER_TEMP/relay-runtime" --no-audit --no-fund miniflare@5.20260926.1-alpha
|
|
36
|
+
BINDSIGHT_MINIFLARE_DIR="$RUNNER_TEMP/relay-runtime" node --test hosting/site-proxy.workerd-test.mjs
|
|
30
37
|
- name: Ruff format
|
|
31
|
-
run: ruff format --check bindsight tests scripts benchmarks
|
|
38
|
+
run: ruff format --check bindsight tests scripts benchmarks companion
|
|
32
39
|
# Blocking. pyproject sets strict = true and CI swallowed the result with
|
|
33
40
|
# `|| true`, so 53 errors accumulated unnoticed -- including the arity bug
|
|
34
41
|
# that left the Snakemake front-end dead for five weeks. That front-end is
|
|
35
42
|
# scripts/, which this step did not check: the justification named a
|
|
36
43
|
# directory outside its own scope.
|
|
37
44
|
- name: mypy
|
|
38
|
-
run: mypy bindsight scripts benchmarks
|
|
45
|
+
run: mypy bindsight scripts benchmarks companion
|
|
39
46
|
|
|
40
47
|
test:
|
|
41
48
|
name: Test (Python ${{ matrix.python-version }} on ${{ matrix.os }})
|
|
@@ -52,10 +59,11 @@ jobs:
|
|
|
52
59
|
- uses: actions/setup-python@v7
|
|
53
60
|
with:
|
|
54
61
|
python-version: ${{ matrix.python-version }}
|
|
62
|
+
check-latest: true
|
|
55
63
|
cache: "pip"
|
|
56
64
|
- name: Install
|
|
57
65
|
run: |
|
|
58
|
-
python -m pip install --upgrade pip
|
|
66
|
+
python -m pip install --upgrade "pip>=26.2.2"
|
|
59
67
|
pip install -e ".[dev,discover,report]"
|
|
60
68
|
# The Snakemake front-end is now exercised in CI. It runs offline via
|
|
61
69
|
# BINDSIGHT_CACHE_DIR and adds ~15 s. Linux only: Snakemake's Windows
|
|
@@ -90,11 +98,12 @@ jobs:
|
|
|
90
98
|
- uses: actions/checkout@v7
|
|
91
99
|
- uses: actions/setup-python@v7
|
|
92
100
|
with:
|
|
93
|
-
python-version: "3.11"
|
|
101
|
+
python-version: "3.11.18"
|
|
102
|
+
check-latest: true
|
|
94
103
|
cache: "pip"
|
|
95
104
|
- name: Install exactly what the release records
|
|
96
105
|
run: |
|
|
97
|
-
python -m pip install --upgrade pip
|
|
106
|
+
python -m pip install --upgrade "pip>=26.2.2"
|
|
98
107
|
pip install -c envs/constraints.txt -e ".[dev,discover,report]"
|
|
99
108
|
- name: The installed versions are the recorded ones
|
|
100
109
|
run: python scripts/check_pinned_environment.py
|
|
@@ -125,19 +134,109 @@ jobs:
|
|
|
125
134
|
- uses: actions/checkout@v7
|
|
126
135
|
- uses: actions/setup-python@v7
|
|
127
136
|
with:
|
|
128
|
-
python-version: "3.11"
|
|
137
|
+
python-version: "3.11.18"
|
|
138
|
+
check-latest: true
|
|
129
139
|
- name: Install build deps
|
|
130
140
|
run: pip install build twine
|
|
131
141
|
- name: Build
|
|
132
142
|
run: python -m build
|
|
133
143
|
- name: Twine check
|
|
134
144
|
run: twine check dist/*
|
|
145
|
+
- name: Exercise the installed wheel outside the source checkout
|
|
146
|
+
run: |
|
|
147
|
+
python -m venv "$RUNNER_TEMP/release-wheel"
|
|
148
|
+
PYTHON="$RUNNER_TEMP/release-wheel/bin/python"
|
|
149
|
+
"$PYTHON" -m pip install --upgrade "pip>=26.2.2"
|
|
150
|
+
WHEEL=$(find dist -name '*.whl' -print -quit)
|
|
151
|
+
"$PYTHON" -m pip install -c envs/constraints.txt "${WHEEL}[discover,report]" "httpx2>=2,<3" packaging
|
|
152
|
+
VERSION=$(python -c 'import tomllib; print(tomllib.load(open("pyproject.toml", "rb"))["project"]["version"])')
|
|
153
|
+
"$PYTHON" -I scripts/check_release_install.py --expected-version "$VERSION"
|
|
135
154
|
- name: Upload artifacts
|
|
136
155
|
uses: actions/upload-artifact@v7
|
|
137
156
|
with:
|
|
138
157
|
name: dist
|
|
139
158
|
path: dist/
|
|
140
159
|
|
|
160
|
+
gpu-recipe:
|
|
161
|
+
name: GPU recipe installation and imports (CPU runner)
|
|
162
|
+
runs-on: ubuntu-22.04
|
|
163
|
+
timeout-minutes: 45
|
|
164
|
+
steps:
|
|
165
|
+
- uses: actions/checkout@v7
|
|
166
|
+
- uses: actions/setup-python@v7
|
|
167
|
+
with:
|
|
168
|
+
python-version: "3.11.18"
|
|
169
|
+
check-latest: true
|
|
170
|
+
- name: Install the setup driver
|
|
171
|
+
run: python -m pip install -e . "psutil>=5.9,<8"
|
|
172
|
+
- name: Resolve and import both actual scientific environments
|
|
173
|
+
run: python -m bindsight.report.web.gpu_setup --check-recipe --root "$RUNNER_TEMP/bindsight-gpu-recipe"
|
|
174
|
+
- name: Retain the dependency check record
|
|
175
|
+
uses: actions/upload-artifact@v7
|
|
176
|
+
with:
|
|
177
|
+
name: gpu-recipe-import-check
|
|
178
|
+
path: ${{ runner.temp }}/bindsight-gpu-recipe/recipe_check.json
|
|
179
|
+
if-no-files-found: error
|
|
180
|
+
# This installs actual GPU packages, but deliberately downloads no model
|
|
181
|
+
# weights, runs no GPU computation and never creates a ready.json receipt.
|
|
182
|
+
|
|
183
|
+
companion:
|
|
184
|
+
name: Companion (${{ matrix.platform }})
|
|
185
|
+
runs-on: ${{ matrix.os }}
|
|
186
|
+
env:
|
|
187
|
+
UV_PYTHON_PREFERENCE: only-managed
|
|
188
|
+
strategy:
|
|
189
|
+
fail-fast: false
|
|
190
|
+
matrix:
|
|
191
|
+
include:
|
|
192
|
+
- {os: windows-latest, platform: windows-x64}
|
|
193
|
+
- {os: macos-latest, platform: macos-arm64}
|
|
194
|
+
- {os: macos-15-intel, platform: macos-x64}
|
|
195
|
+
- {os: ubuntu-22.04, platform: linux-x64}
|
|
196
|
+
steps:
|
|
197
|
+
- uses: actions/checkout@v7
|
|
198
|
+
- name: Read the audited runtime pins for this platform
|
|
199
|
+
id: runtime-pins
|
|
200
|
+
shell: bash
|
|
201
|
+
env:
|
|
202
|
+
PLATFORM: ${{ matrix.platform }}
|
|
203
|
+
run: |
|
|
204
|
+
node <<'JS'
|
|
205
|
+
const fs = require('node:fs');
|
|
206
|
+
const pins = JSON.parse(fs.readFileSync('companion/pins.json', 'utf8'));
|
|
207
|
+
fs.appendFileSync(process.env.GITHUB_OUTPUT, [
|
|
208
|
+
`uv=${pins.uv_version}`,
|
|
209
|
+
`python=${pins.python_version}`,
|
|
210
|
+
`checksum=${pins.artifacts[process.env.PLATFORM].sha256}`,
|
|
211
|
+
'',
|
|
212
|
+
].join('\n'));
|
|
213
|
+
JS
|
|
214
|
+
# setup-python does not distribute security-only Python 3.12 releases
|
|
215
|
+
# on every OS. Build with the same patched runtime the companion installs.
|
|
216
|
+
- name: Install the verified installer and patched build Python
|
|
217
|
+
id: build-runtime
|
|
218
|
+
uses: astral-sh/setup-uv@c771a70e6277c0a99b617c7a806ffedaca235ff9 # v9.0.0
|
|
219
|
+
with:
|
|
220
|
+
version: ${{ steps.runtime-pins.outputs.uv }}
|
|
221
|
+
checksum: ${{ steps.runtime-pins.outputs.checksum }}
|
|
222
|
+
python-version: ${{ steps.runtime-pins.outputs.python }}
|
|
223
|
+
activate-environment: true
|
|
224
|
+
venv-path: ${{ runner.temp }}/companion-build
|
|
225
|
+
no-project: true
|
|
226
|
+
enable-cache: false
|
|
227
|
+
- name: Verify the actual build interpreter
|
|
228
|
+
run: python -c "import json, platform; expected = json.load(open('companion/pins.json'))['python_version']; actual = platform.python_version(); print('Build Python:', actual); assert actual == expected, (actual, expected)"
|
|
229
|
+
- name: Install the pinned packaging tool
|
|
230
|
+
run: uv pip install --python "${{ steps.build-runtime.outputs.venv }}" -r companion/requirements-build.txt
|
|
231
|
+
- name: Package the companion for this tested source
|
|
232
|
+
run: python companion/build.py --revision ${{ github.sha }} --output companion-dist
|
|
233
|
+
- name: Upload the companion and its build record
|
|
234
|
+
uses: actions/upload-artifact@v7
|
|
235
|
+
with:
|
|
236
|
+
name: companion-${{ matrix.platform }}
|
|
237
|
+
path: companion-dist/
|
|
238
|
+
if-no-files-found: error
|
|
239
|
+
|
|
141
240
|
gate:
|
|
142
241
|
# One check for the branch ruleset on `main` to require.
|
|
143
242
|
#
|
|
@@ -151,7 +250,7 @@ jobs:
|
|
|
151
250
|
# this file by tests/test_packaging_pins.py rather than by memory.
|
|
152
251
|
name: All CI jobs passed
|
|
153
252
|
runs-on: ubuntu-latest
|
|
154
|
-
needs: [lint, test, pinned, build]
|
|
253
|
+
needs: [lint, test, pinned, build, companion, gpu-recipe]
|
|
155
254
|
# Without this the gate is skipped when anything it needs fails, and a
|
|
156
255
|
# skipped required check never reports -- the merge would block on silence
|
|
157
256
|
# rather than on the failure, which reads like an outage.
|
|
@@ -33,6 +33,8 @@ jobs:
|
|
|
33
33
|
uses: docker/build-push-action@v7
|
|
34
34
|
with:
|
|
35
35
|
context: .
|
|
36
|
+
# Refresh system certificate packages instead of reusing old layers.
|
|
37
|
+
no-cache: true
|
|
36
38
|
# Publishing is opt-in. It needs two account-level settings that
|
|
37
39
|
# `permissions:` cannot grant: the ghcr.io package must list this
|
|
38
40
|
# repository under Manage Actions access with role Write (the
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
name: Docs
|
|
2
|
+
|
|
3
|
+
# Build the mkdocs-material site and publish it to GitHub Pages. Pages is
|
|
4
|
+
# served from GitHub Actions (Settings → Pages → Source: "GitHub Actions"),
|
|
5
|
+
# which is what lets this deploy without a gh-pages branch.
|
|
6
|
+
|
|
7
|
+
on:
|
|
8
|
+
workflow_run:
|
|
9
|
+
workflows: [CI]
|
|
10
|
+
types: [completed]
|
|
11
|
+
branches: [main]
|
|
12
|
+
workflow_dispatch:
|
|
13
|
+
|
|
14
|
+
permissions:
|
|
15
|
+
actions: read
|
|
16
|
+
contents: read
|
|
17
|
+
pages: write
|
|
18
|
+
id-token: write
|
|
19
|
+
|
|
20
|
+
concurrency:
|
|
21
|
+
group: pages
|
|
22
|
+
cancel-in-progress: false
|
|
23
|
+
|
|
24
|
+
jobs:
|
|
25
|
+
build-deploy:
|
|
26
|
+
# A public update follows the successful tested main commit, never PR code.
|
|
27
|
+
if: >-
|
|
28
|
+
(github.event_name == 'workflow_run' &&
|
|
29
|
+
github.event.workflow_run.conclusion == 'success' &&
|
|
30
|
+
github.event.workflow_run.head_repository.full_name == github.repository) ||
|
|
31
|
+
(github.event_name == 'workflow_dispatch' && github.ref == 'refs/heads/main')
|
|
32
|
+
runs-on: ubuntu-latest
|
|
33
|
+
environment:
|
|
34
|
+
name: github-pages
|
|
35
|
+
url: ${{ steps.deployment.outputs.page_url }}
|
|
36
|
+
steps:
|
|
37
|
+
- uses: actions/checkout@v7
|
|
38
|
+
with:
|
|
39
|
+
ref: ${{ github.event.workflow_run.head_sha || github.sha }}
|
|
40
|
+
- name: Refuse to republish an older main revision
|
|
41
|
+
env:
|
|
42
|
+
GH_TOKEN: ${{ github.token }}
|
|
43
|
+
run: |
|
|
44
|
+
test "$(git rev-parse HEAD)" = "$(gh api "repos/$GITHUB_REPOSITORY/commits/main" --jq .sha)"
|
|
45
|
+
- name: Require a successful CI run for manual publication
|
|
46
|
+
if: github.event_name == 'workflow_dispatch'
|
|
47
|
+
env:
|
|
48
|
+
GH_TOKEN: ${{ github.token }}
|
|
49
|
+
run: |
|
|
50
|
+
test "$(gh run list --workflow ci.yml --branch main --commit "$GITHUB_SHA" --json conclusion --jq 'any(.[]; .conclusion == "success")')" = true
|
|
51
|
+
- uses: actions/setup-python@v7
|
|
52
|
+
with:
|
|
53
|
+
python-version: "3.11.18"
|
|
54
|
+
check-latest: true
|
|
55
|
+
cache: "pip"
|
|
56
|
+
# The core install is enough: bindsight.report resolves render_run lazily,
|
|
57
|
+
# so the results generator reaches report/showcase.py without pulling in
|
|
58
|
+
# pandas or jinja2. tests/test_report_lazy_import.py guards that.
|
|
59
|
+
- name: Install docs deps
|
|
60
|
+
run: pip install -e ".[docs]" # the extra exists for exactly this; one place holds the bound
|
|
61
|
+
- name: Regenerate the results page from benchmarks/
|
|
62
|
+
run: python scripts/build_docs_results.py
|
|
63
|
+
# --strict fails the build on broken internal links. It caught nine
|
|
64
|
+
# already-live 404s the first time it was switched on.
|
|
65
|
+
- name: Build site
|
|
66
|
+
run: mkdocs build --strict --site-dir site
|
|
67
|
+
- name: Build the research workspace from this tested commit
|
|
68
|
+
run: python scripts/build_website.py --out site/workspace
|
|
69
|
+
- name: Resolve the successful matching CI run
|
|
70
|
+
id: tested
|
|
71
|
+
env:
|
|
72
|
+
GH_TOKEN: ${{ github.token }}
|
|
73
|
+
TRIGGER_RUN: ${{ github.event.workflow_run.id }}
|
|
74
|
+
run: |
|
|
75
|
+
if [ -n "$TRIGGER_RUN" ]; then
|
|
76
|
+
echo "id=$TRIGGER_RUN" >> "$GITHUB_OUTPUT"
|
|
77
|
+
else
|
|
78
|
+
RUN=$(gh run list --workflow ci.yml --branch main --commit "$GITHUB_SHA" --json databaseId,conclusion --jq '[.[] | select(.conclusion == "success")][0].databaseId')
|
|
79
|
+
test -n "$RUN" && test "$RUN" != null
|
|
80
|
+
echo "id=$RUN" >> "$GITHUB_OUTPUT"
|
|
81
|
+
fi
|
|
82
|
+
- name: Fetch companion builds from the same successful CI run
|
|
83
|
+
uses: actions/download-artifact@v8
|
|
84
|
+
with:
|
|
85
|
+
pattern: companion-*
|
|
86
|
+
path: companion-builds
|
|
87
|
+
run-id: ${{ steps.tested.outputs.id }}
|
|
88
|
+
github-token: ${{ github.token }}
|
|
89
|
+
- name: Verify and publish the matching companions
|
|
90
|
+
run: python scripts/publish_companions.py --artifacts companion-builds --workspace site/workspace
|
|
91
|
+
- name: Upload Pages artifact
|
|
92
|
+
uses: actions/upload-pages-artifact@v5
|
|
93
|
+
with:
|
|
94
|
+
path: site
|
|
95
|
+
- name: Confirm main has not moved during the build
|
|
96
|
+
env:
|
|
97
|
+
GH_TOKEN: ${{ github.token }}
|
|
98
|
+
run: |
|
|
99
|
+
test "$(git rev-parse HEAD)" = "$(gh api "repos/$GITHUB_REPOSITORY/commits/main" --jq .sha)"
|
|
100
|
+
- name: Deploy to GitHub Pages
|
|
101
|
+
id: deployment
|
|
102
|
+
uses: actions/deploy-pages@v5
|
|
@@ -53,7 +53,7 @@ jobs:
|
|
|
53
53
|
GH_TOKEN: ${{ github.token }}
|
|
54
54
|
TAG: ${{ github.event.release.tag_name }}
|
|
55
55
|
# Renamed so the asset says which document it is next to the wheel,
|
|
56
|
-
# the sdist and the
|
|
56
|
+
# the sdist and the methods manuscript's PDF.
|
|
57
57
|
run: |
|
|
58
58
|
cp paper/paper.pdf "bindsight-${TAG}-joss-paper.pdf"
|
|
59
59
|
gh release upload "$TAG" "bindsight-${TAG}-joss-paper.pdf" --clobber --repo "${{ github.repository }}"
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
name: Manuscript PDF
|
|
2
|
+
|
|
3
|
+
# The methods manuscript is LaTeX and the machine it is written on has no TeX
|
|
4
|
+
# distribution, so CI typesets it. Every push that touches the manuscript or
|
|
5
|
+
# the shared bibliography leaves a `methods-manuscript` artifact on the run,
|
|
6
|
+
# and every published release carries the same PDF as an asset named for the
|
|
7
|
+
# tag. `paper/README.md` sends a submitter to one of those two places.
|
|
8
|
+
#
|
|
9
|
+
# Overleaf is not the fallback it looks like. `manuscript.tex` reaches its
|
|
10
|
+
# bibliography with \addbibresource{../paper.bib} -- one directory up, shared
|
|
11
|
+
# with the JOSS paper so a citation is fixed in one place. Zipping
|
|
12
|
+
# `paper/methods/` alone uploads a project with no bibliography, which still
|
|
13
|
+
# compiles and hands back a PDF with a question mark where every citation
|
|
14
|
+
# should be. The action below runs in the full checkout, so the relative path
|
|
15
|
+
# resolves, and latexmk runs biber by itself when it sees the .bcf that
|
|
16
|
+
# biblatex writes. A step after the build fails the run on any citation that
|
|
17
|
+
# stayed undefined, so that failure cannot render.
|
|
18
|
+
|
|
19
|
+
on:
|
|
20
|
+
push:
|
|
21
|
+
paths:
|
|
22
|
+
- 'paper/methods/**'
|
|
23
|
+
- 'paper/validation/**'
|
|
24
|
+
- 'paper/paper.bib'
|
|
25
|
+
- '.github/workflows/manuscript-pdf.yml'
|
|
26
|
+
workflow_dispatch:
|
|
27
|
+
release:
|
|
28
|
+
types: [published]
|
|
29
|
+
|
|
30
|
+
permissions:
|
|
31
|
+
contents: read
|
|
32
|
+
|
|
33
|
+
jobs:
|
|
34
|
+
build:
|
|
35
|
+
name: Typeset the methods manuscript
|
|
36
|
+
runs-on: ubuntu-latest
|
|
37
|
+
steps:
|
|
38
|
+
- uses: actions/checkout@v7
|
|
39
|
+
- name: Compile manuscript.tex with latexmk
|
|
40
|
+
# Pinned to the commit the `v4` tag points at (release 4.1.0), like
|
|
41
|
+
# every other third-party action here; tests/test_packaging_pins.py
|
|
42
|
+
# refuses a branch or a moving ref.
|
|
43
|
+
uses: xu-cheng/latex-action@6549dc21effb2730855a1281407ecfcececc6c1b # v4 (4.1.0)
|
|
44
|
+
with:
|
|
45
|
+
working_directory: paper/methods
|
|
46
|
+
root_file: manuscript.tex
|
|
47
|
+
args: -pdf -file-line-error -halt-on-error -interaction=nonstopmode
|
|
48
|
+
- name: Fail on undefined citations or references
|
|
49
|
+
# A missing bibliography does not stop latexmk; it leaves "[?]" where
|
|
50
|
+
# every citation should be and a warning in the log. Stop here instead.
|
|
51
|
+
run: |
|
|
52
|
+
if grep -E "Citation .* undefined|Reference .* undefined|There were undefined" paper/methods/manuscript.log; then
|
|
53
|
+
echo "::error::the typeset manuscript has undefined citations or references"
|
|
54
|
+
exit 1
|
|
55
|
+
fi
|
|
56
|
+
- uses: actions/upload-artifact@v7
|
|
57
|
+
with:
|
|
58
|
+
name: methods-manuscript
|
|
59
|
+
path: paper/methods/manuscript.pdf
|
|
60
|
+
if-no-files-found: error
|
|
61
|
+
|
|
62
|
+
study:
|
|
63
|
+
name: Typeset the validation study
|
|
64
|
+
runs-on: ubuntu-latest
|
|
65
|
+
steps:
|
|
66
|
+
- uses: actions/checkout@v7
|
|
67
|
+
- name: Install pandoc and a PDF engine
|
|
68
|
+
# apt rather than a third-party action: no new pinning question, and
|
|
69
|
+
# tests/test_packaging_pins.py allows actions/* at a version tag only.
|
|
70
|
+
#
|
|
71
|
+
# lmodern is named explicitly because pandoc's default LaTeX template
|
|
72
|
+
# loads it and none of the texlive-* metapackages pull it in: the first
|
|
73
|
+
# run of this job died on a missing lmodern.sty. The study also needs
|
|
74
|
+
# xelatex rather than pdflatex -- it contains a superscript minus
|
|
75
|
+
# (U+207B), which inputenc cannot represent.
|
|
76
|
+
run: |
|
|
77
|
+
sudo apt-get update
|
|
78
|
+
sudo apt-get install -y --no-install-recommends \
|
|
79
|
+
pandoc texlive-xetex texlive-fonts-recommended texlive-latex-recommended \
|
|
80
|
+
lmodern fonts-dejavu-core
|
|
81
|
+
- name: Render manuscript.md
|
|
82
|
+
# The study is Markdown with a hand-numbered reference list and no
|
|
83
|
+
# embedded images, so there is nothing to resolve outside the file.
|
|
84
|
+
#
|
|
85
|
+
# mainfont is not cosmetic. Latin Modern has no glyph for U+2265 or
|
|
86
|
+
# U+207B, and xelatex prints nothing where a glyph is missing, so the
|
|
87
|
+
# first green build of this job dropped both: the Methods sentence
|
|
88
|
+
# "|log2fc| >= 1" lost its operator, and the adjusted p-value
|
|
89
|
+
# "5.6 x 10^-11" lost the minus from its exponent, in both places it
|
|
90
|
+
# appears. DejaVu Serif has both glyphs. The check below is the part
|
|
91
|
+
# that matters -- a font can change again, silence cannot be allowed to.
|
|
92
|
+
run: |
|
|
93
|
+
# pipefail because the pipe into tee below would otherwise report
|
|
94
|
+
# tee's exit code and hide a failed render completely.
|
|
95
|
+
set -o pipefail
|
|
96
|
+
cd paper/validation
|
|
97
|
+
pandoc manuscript.md \
|
|
98
|
+
--from=gfm \
|
|
99
|
+
--output=manuscript.pdf \
|
|
100
|
+
--pdf-engine=xelatex \
|
|
101
|
+
--variable=mainfont:'DejaVu Serif' \
|
|
102
|
+
--variable=monofont:'DejaVu Sans Mono' \
|
|
103
|
+
--variable=geometry:margin=1in \
|
|
104
|
+
--variable=fontsize:11pt \
|
|
105
|
+
--standalone 2>&1 | tee pandoc.log
|
|
106
|
+
- name: Fail on any character the font could not print
|
|
107
|
+
# pandoc warns and exits 0. A size floor cannot see this and neither
|
|
108
|
+
# can a reader: the number just reads differently. Same reasoning as
|
|
109
|
+
# the undefined-citation check in the job above.
|
|
110
|
+
run: |
|
|
111
|
+
if grep -F 'Missing character' paper/validation/pandoc.log; then
|
|
112
|
+
echo "::error::the study PDF is missing glyphs; characters above were dropped silently"
|
|
113
|
+
exit 1
|
|
114
|
+
fi
|
|
115
|
+
- name: Fail if the PDF came back empty
|
|
116
|
+
# pandoc exits 0 on a document it rendered as one blank page. The study
|
|
117
|
+
# is ~2,800 words, so anything under 40 kB is a build that silently
|
|
118
|
+
# produced nothing -- the failure mode this whole file is arranged
|
|
119
|
+
# against.
|
|
120
|
+
run: |
|
|
121
|
+
size=$(stat -c%s paper/validation/manuscript.pdf)
|
|
122
|
+
echo "manuscript.pdf is ${size} bytes"
|
|
123
|
+
if [ "$size" -lt 40000 ]; then
|
|
124
|
+
echo "::error::the study PDF is ${size} bytes; it did not render"
|
|
125
|
+
exit 1
|
|
126
|
+
fi
|
|
127
|
+
- uses: actions/upload-artifact@v7
|
|
128
|
+
with:
|
|
129
|
+
name: study-manuscript
|
|
130
|
+
path: paper/validation/manuscript.pdf
|
|
131
|
+
if-no-files-found: error
|
|
132
|
+
|
|
133
|
+
attach:
|
|
134
|
+
name: Attach to the release
|
|
135
|
+
needs: [build, study]
|
|
136
|
+
if: github.event_name == 'release'
|
|
137
|
+
runs-on: ubuntu-latest
|
|
138
|
+
permissions:
|
|
139
|
+
contents: write
|
|
140
|
+
steps:
|
|
141
|
+
- uses: actions/download-artifact@v8
|
|
142
|
+
with:
|
|
143
|
+
name: methods-manuscript
|
|
144
|
+
path: paper/methods
|
|
145
|
+
- uses: actions/download-artifact@v8
|
|
146
|
+
with:
|
|
147
|
+
name: study-manuscript
|
|
148
|
+
path: paper/validation
|
|
149
|
+
- env:
|
|
150
|
+
GH_TOKEN: ${{ github.token }}
|
|
151
|
+
TAG: ${{ github.event.release.tag_name }}
|
|
152
|
+
# Renamed so each asset says which document it is next to the wheel,
|
|
153
|
+
# the sdist and the JOSS paper's PDF. Three PDFs now travel with a
|
|
154
|
+
# release and they are all `manuscript.pdf` or `paper.pdf` in the tree,
|
|
155
|
+
# so the release-page name is the only thing telling them apart.
|
|
156
|
+
run: |
|
|
157
|
+
cp paper/methods/manuscript.pdf "bindsight-${TAG}-methods-manuscript.pdf"
|
|
158
|
+
cp paper/validation/manuscript.pdf "bindsight-${TAG}-validation-study.pdf"
|
|
159
|
+
gh release upload "$TAG" \
|
|
160
|
+
"bindsight-${TAG}-methods-manuscript.pdf" \
|
|
161
|
+
"bindsight-${TAG}-validation-study.pdf" \
|
|
162
|
+
--clobber --repo "${{ github.repository }}"
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
name: Release artifacts
|
|
2
|
+
|
|
3
|
+
# Attach a wheel, an sdist and their SHA-256 checksums to every published
|
|
4
|
+
# release, and upload the same two files to PyPI.
|
|
5
|
+
#
|
|
6
|
+
# The attach job always runs, so a release is installable without PyPI:
|
|
7
|
+
# pip install https://github.com/mikhaeelatefrizk/bindsight/releases/download/<tag>/bindsight-<version>-py3-none-any.whl
|
|
8
|
+
#
|
|
9
|
+
# The PyPI job runs when the `PYPI_TRUSTED_PUBLISHING` repository variable is
|
|
10
|
+
# `true` and the `pypi` environment exists -- both since 0.3.5, the first
|
|
11
|
+
# release published there. The project is registered on PyPI as a trusted
|
|
12
|
+
# publisher of this repository, workflow `release-artifacts.yml`, environment
|
|
13
|
+
# `pypi`, so the upload is authorised by OIDC and no API token is ever stored
|
|
14
|
+
# in this repository. Without the variable the job is skipped, not failed.
|
|
15
|
+
|
|
16
|
+
on:
|
|
17
|
+
release:
|
|
18
|
+
types: [published]
|
|
19
|
+
workflow_dispatch:
|
|
20
|
+
|
|
21
|
+
permissions:
|
|
22
|
+
contents: read
|
|
23
|
+
actions: read
|
|
24
|
+
|
|
25
|
+
jobs:
|
|
26
|
+
build:
|
|
27
|
+
name: Build wheel + sdist
|
|
28
|
+
runs-on: ubuntu-latest
|
|
29
|
+
steps:
|
|
30
|
+
- uses: actions/checkout@v7
|
|
31
|
+
- name: Require successful main CI for this exact release commit
|
|
32
|
+
if: github.event_name == 'release'
|
|
33
|
+
env:
|
|
34
|
+
GH_TOKEN: ${{ github.token }}
|
|
35
|
+
run: |
|
|
36
|
+
test "$(gh run list --workflow ci.yml --branch main --commit "$GITHUB_SHA" --json conclusion --jq 'any(.[]; .conclusion == "success")')" = true
|
|
37
|
+
- uses: actions/setup-python@v7
|
|
38
|
+
with:
|
|
39
|
+
python-version: "3.12.16"
|
|
40
|
+
check-latest: true
|
|
41
|
+
- run: python -m pip install --quiet build twine
|
|
42
|
+
- name: Point the README's relative links at this tag for PyPI
|
|
43
|
+
# PyPI renders the long description with no base URL, so every
|
|
44
|
+
# relative link in README.md is dead there. The checkout is rewritten
|
|
45
|
+
# (never committed) so the sdist and wheel carry absolute links.
|
|
46
|
+
run: python scripts/pypi_readme.py --write --ref "${{ github.event.release.tag_name || github.ref_name }}"
|
|
47
|
+
- run: python -m build
|
|
48
|
+
- name: Check metadata
|
|
49
|
+
run: python -m twine check dist/*
|
|
50
|
+
- name: Exercise the exact wheel that will be published
|
|
51
|
+
env:
|
|
52
|
+
RELEASE_TAG: ${{ github.event.release.tag_name }}
|
|
53
|
+
run: |
|
|
54
|
+
VERSION=$(python -c 'import tomllib; print(tomllib.load(open("pyproject.toml", "rb"))["project"]["version"])')
|
|
55
|
+
if [ "$GITHUB_EVENT_NAME" = release ]; then test "$RELEASE_TAG" = "v$VERSION"; fi
|
|
56
|
+
python -m venv "$RUNNER_TEMP/release-wheel"
|
|
57
|
+
PYTHON="$RUNNER_TEMP/release-wheel/bin/python"
|
|
58
|
+
"$PYTHON" -m pip install --upgrade "pip>=26.2.2"
|
|
59
|
+
WHEEL=$(find dist -name '*.whl' -print -quit)
|
|
60
|
+
"$PYTHON" -m pip install -c envs/constraints.txt "${WHEEL}[discover,report]" "httpx2>=2,<3" packaging
|
|
61
|
+
"$PYTHON" -I scripts/check_release_install.py --expected-version "$VERSION"
|
|
62
|
+
- name: Checksum
|
|
63
|
+
working-directory: dist
|
|
64
|
+
run: sha256sum bindsight-*.whl bindsight-*.tar.gz > SHA256SUMS
|
|
65
|
+
- uses: actions/upload-artifact@v7
|
|
66
|
+
with:
|
|
67
|
+
name: dist
|
|
68
|
+
path: dist/
|
|
69
|
+
|
|
70
|
+
attach:
|
|
71
|
+
name: Attach to the release
|
|
72
|
+
needs: build
|
|
73
|
+
if: github.event_name == 'release'
|
|
74
|
+
runs-on: ubuntu-latest
|
|
75
|
+
permissions:
|
|
76
|
+
contents: write
|
|
77
|
+
steps:
|
|
78
|
+
- uses: actions/download-artifact@v8
|
|
79
|
+
with:
|
|
80
|
+
name: dist
|
|
81
|
+
path: dist
|
|
82
|
+
- env:
|
|
83
|
+
GH_TOKEN: ${{ github.token }}
|
|
84
|
+
run: gh release upload "${{ github.event.release.tag_name }}" dist/* --clobber --repo "${{ github.repository }}"
|
|
85
|
+
|
|
86
|
+
pypi:
|
|
87
|
+
name: Publish to PyPI
|
|
88
|
+
needs: build
|
|
89
|
+
if: github.event_name == 'release' && vars.PYPI_TRUSTED_PUBLISHING == 'true'
|
|
90
|
+
runs-on: ubuntu-latest
|
|
91
|
+
environment: pypi
|
|
92
|
+
permissions:
|
|
93
|
+
id-token: write
|
|
94
|
+
steps:
|
|
95
|
+
- uses: actions/download-artifact@v8
|
|
96
|
+
with:
|
|
97
|
+
name: dist
|
|
98
|
+
path: dist
|
|
99
|
+
- name: Drop the checksum file
|
|
100
|
+
# SHA256SUMS is a release asset, not a distribution; twine rejects it.
|
|
101
|
+
run: rm -f dist/SHA256SUMS
|
|
102
|
+
# Pinned by commit, like the JOSS action in draft-pdf.yml, whose comment
|
|
103
|
+
# argues a floating ref is unacceptable for something that builds a
|
|
104
|
+
# submission. The argument is stronger here: `release/v1` is a *branch*,
|
|
105
|
+
# so this step -- the one holding the credential that publishes to PyPI
|
|
106
|
+
# -- ran whatever had most recently been pushed to it. A tag is at least
|
|
107
|
+
# a statement of intent; a branch is not.
|
|
108
|
+
#
|
|
109
|
+
# v1.14.3 removes the affected emSign certificate trust chain;
|
|
110
|
+
# GHSA-5xjx-3w67-w9x9. The signed upstream tag resolves to this commit.
|
|
111
|
+
- uses: pypa/gh-action-pypi-publish@7245906fb61fa33a13554f9d5fb856fe61758086 # v1.14.3
|
|
@@ -8,6 +8,11 @@ results/
|
|
|
8
8
|
*.zip
|
|
9
9
|
!tests/fixtures/**/*.parquet
|
|
10
10
|
!tests/fixtures/**/*.tar.gz
|
|
11
|
+
!benchmarks/numerical_validation/results/
|
|
12
|
+
!benchmarks/numerical_validation/results/**/
|
|
13
|
+
!benchmarks/numerical_validation/results/**/*.parquet
|
|
14
|
+
!benchmarks/numerical_validation/diagnostics/dds_var.parquet
|
|
15
|
+
!benchmarks/numerical_validation/diagnostics/results.parquet
|
|
11
16
|
|
|
12
17
|
# Vendored data dependencies and local caches (not committed)
|
|
13
18
|
data/surface_bind/
|
|
@@ -103,7 +108,7 @@ desktop.ini
|
|
|
103
108
|
site/
|
|
104
109
|
|
|
105
110
|
# LaTeX build intermediates. No compiled PDF is committed either: CI typesets
|
|
106
|
-
# paper/
|
|
111
|
+
# paper/methods/manuscript.tex and attaches the PDF to every release.
|
|
107
112
|
paper/**/*.aux
|
|
108
113
|
paper/**/*.bbl
|
|
109
114
|
paper/**/*.bcf
|
|
@@ -121,7 +126,9 @@ benchmarks/designer_benchmark/run/
|
|
|
121
126
|
_bindsight_spec_*/
|
|
122
127
|
|
|
123
128
|
# Compiled manuscripts are built at submission time, never committed
|
|
124
|
-
paper/
|
|
129
|
+
paper/methods/*.pdf
|
|
130
|
+
paper/validation/*.pdf
|
|
131
|
+
paper/validation/pandoc.log
|
|
125
132
|
|
|
126
133
|
# Designer-benchmark staging. A run writes here first so a failure cannot
|
|
127
134
|
# overwrite the committed result; only the promoted artifacts are tracked.
|
|
@@ -131,3 +138,4 @@ benchmarks/designer_benchmark/run_t4/
|
|
|
131
138
|
|
|
132
139
|
# Editor and agent tooling, not part of the project.
|
|
133
140
|
.claude/
|
|
141
|
+
.venv-bindsight/
|
|
@@ -421,7 +421,7 @@ See [LICENSING.md](LICENSING.md) for the full inventory and commercial-use guida
|
|
|
421
421
|
5. **SURFACE-Bind coverage gaps** — roughly 2,800 proteins against a shipped surfaceome of 4,801 (SURFY's 2,886 unioned with a UniProt cell-membrane extension). Extending the surfaceome widened this gap rather than closing it: more proteins are now reachable by expression than have a known targetable site. Mitigation: graceful drop tagged `no_surfacebind_entry`, which is recorded rather than silent. The fpocket fallback that would close it is not implemented.
|
|
422
422
|
6. **Designer choice will age.** Mitigation: a plugin interface, with RFdiff+MPNN as the shipped default and BindCraft and BoltzGen wired behind flags. Only the first is executable: no shipped backend builds an environment the other two can run in, so the three-way benchmark is deferred, not delivered.
|
|
423
423
|
7. **Disease specificity is hard, and the signal is weaker than this section used to claim.** "Up in cancer, low in vital tissue" does *not* predictably find known antigens. Measured against a pre-registered panel over fifteen unstratified TCGA projects, recall at rank 20 is 1 of 17 on approved-agent antigens (95% CI 0.01 to 0.27) and 0 of 8 over independent antigens. Twelve of seventeen are not over-expressed in a bulk tumour-versus-normal contrast: eleven fail the significance rule and a twelfth is measured as down-regulated. (This said "thirteen", which is the count across all twenty-two pairs, not across the seventeen approved-tier ones.) Their agents are licensed, so the antigens are real; the limit is in the signal, not the ranking. The earlier claim survived because the headline cohort was stratified by a PAM50 subtype call, and ERBB2 is one of the fifty genes that classifier is built from. Layering scRNA-seq, co-expression and immunopeptidomics is the plausible route to a stronger signal, and none of it is implemented.
|
|
424
|
-
8. **Competing with VC-funded teams** (Tamarind, Chai, Generate). Mitigation: compete on transparency + reproducibility + provenance + academic integration. JOSS +
|
|
424
|
+
8. **Competing with VC-funded teams** (Tamarind, Chai, Generate). Mitigation: compete on transparency + reproducibility + provenance + academic integration. JOSS + a citable preprint + GitHub stars is a real moat for academic users.
|
|
425
425
|
9. **PyDESeq2 ≠ DESeq2 numerically.** Documented in `bindsight/deg/pydeseq2_runner.py`. There is no R bridge: users who need exact DESeq2/edgeR numbers must run those tools themselves and feed the resulting DEG table in.
|
|
426
426
|
10. **R-strong dev learning Python+Snakemake.** The DEG step is pure Python (pydeseq2); Snakemake's R rule support is unused.
|
|
427
427
|
|