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.
Files changed (606) hide show
  1. bindsight-0.3.7/.gitattributes +25 -0
  2. {bindsight-0.3.5 → bindsight-0.3.7}/.github/ISSUE_TEMPLATE/bug_report.yml +2 -1
  3. {bindsight-0.3.5 → bindsight-0.3.7}/.github/workflows/ci.yml +109 -10
  4. {bindsight-0.3.5 → bindsight-0.3.7}/.github/workflows/docker.yml +2 -0
  5. bindsight-0.3.7/.github/workflows/docs.yml +102 -0
  6. {bindsight-0.3.5 → bindsight-0.3.7}/.github/workflows/draft-pdf.yml +1 -1
  7. bindsight-0.3.7/.github/workflows/manuscript-pdf.yml +162 -0
  8. bindsight-0.3.7/.github/workflows/release-artifacts.yml +111 -0
  9. {bindsight-0.3.5 → bindsight-0.3.7}/.gitignore +10 -2
  10. {bindsight-0.3.5 → bindsight-0.3.7}/ARCHITECTURE.md +1 -1
  11. {bindsight-0.3.5 → bindsight-0.3.7}/CHANGELOG.md +256 -0
  12. {bindsight-0.3.5 → bindsight-0.3.7}/CITATION.cff +2 -2
  13. {bindsight-0.3.5 → bindsight-0.3.7}/CONTRIBUTING.md +2 -2
  14. {bindsight-0.3.5 → bindsight-0.3.7}/Dockerfile +3 -3
  15. {bindsight-0.3.5 → bindsight-0.3.7}/LICENSING.md +12 -2
  16. {bindsight-0.3.5 → bindsight-0.3.7}/PKG-INFO +111 -62
  17. {bindsight-0.3.5 → bindsight-0.3.7}/README.md +99 -55
  18. {bindsight-0.3.5 → bindsight-0.3.7}/SECURITY.md +28 -0
  19. bindsight-0.3.7/Start bindsight.cmd +16 -0
  20. bindsight-0.3.7/Start bindsight.command +3 -0
  21. {bindsight-0.3.5 → bindsight-0.3.7}/benchmarks/RUN_ON_KAGGLE.md +2 -2
  22. {bindsight-0.3.5 → bindsight-0.3.7}/benchmarks/calibration/CALIBRATION.md +35 -7
  23. {bindsight-0.3.5 → bindsight-0.3.7}/benchmarks/calibration/README.md +43 -0
  24. {bindsight-0.3.5 → bindsight-0.3.7}/benchmarks/calibration/RESULTS.json +67 -0
  25. {bindsight-0.3.5 → bindsight-0.3.7}/benchmarks/calibration/analyse.py +258 -34
  26. {bindsight-0.3.5 → bindsight-0.3.7}/benchmarks/designer_benchmark/DESIGNER_BENCHMARK.md +2 -2
  27. {bindsight-0.3.5 → bindsight-0.3.7}/benchmarks/designer_benchmark/RESULTS.md +2 -2
  28. bindsight-0.3.7/benchmarks/numerical_validation/README.md +412 -0
  29. bindsight-0.3.7/benchmarks/numerical_validation/cohort_3/counts.tsv.gz +0 -0
  30. bindsight-0.3.7/benchmarks/numerical_validation/cohort_3/design.tsv +7 -0
  31. bindsight-0.3.7/benchmarks/numerical_validation/cohort_3/provenance.json +85 -0
  32. bindsight-0.3.7/benchmarks/numerical_validation/cohort_8/counts.tsv.gz +0 -0
  33. bindsight-0.3.7/benchmarks/numerical_validation/cohort_8/design.tsv +17 -0
  34. bindsight-0.3.7/benchmarks/numerical_validation/cohort_8/provenance.json +175 -0
  35. bindsight-0.3.7/benchmarks/numerical_validation/config.yaml +11 -0
  36. bindsight-0.3.7/benchmarks/numerical_validation/diagnostics/artifact-manifest.json +31 -0
  37. bindsight-0.3.7/benchmarks/numerical_validation/diagnostics/dds_arrays.npz +0 -0
  38. bindsight-0.3.7/benchmarks/numerical_validation/diagnostics/dds_var.parquet +0 -0
  39. bindsight-0.3.7/benchmarks/numerical_validation/diagnostics/fit.json +75 -0
  40. bindsight-0.3.7/benchmarks/numerical_validation/diagnostics/objective-proof.json +244 -0
  41. bindsight-0.3.7/benchmarks/numerical_validation/diagnostics/reproduce_objective.py +147 -0
  42. bindsight-0.3.7/benchmarks/numerical_validation/diagnostics/results.parquet +0 -0
  43. bindsight-0.3.7/benchmarks/numerical_validation/local_workflow.json +211 -0
  44. bindsight-0.3.7/benchmarks/numerical_validation/local_workflow_canonical.json +212 -0
  45. bindsight-0.3.7/benchmarks/numerical_validation/local_workflow_mean_floor.json +212 -0
  46. bindsight-0.3.7/benchmarks/numerical_validation/reference/README.md +60 -0
  47. bindsight-0.3.7/benchmarks/numerical_validation/reference/cohort_3/artifact-manifest.json +137 -0
  48. bindsight-0.3.7/benchmarks/numerical_validation/reference/cohort_3/canonical/artifact-manifest.json +41 -0
  49. bindsight-0.3.7/benchmarks/numerical_validation/reference/cohort_3/canonical/comparison.json +830 -0
  50. bindsight-0.3.7/benchmarks/numerical_validation/reference/cohort_3/canonical/largest-lfc-differences.tsv.gz +0 -0
  51. bindsight-0.3.7/benchmarks/numerical_validation/reference/cohort_3/canonical/significance-disagreements.tsv.gz +0 -0
  52. bindsight-0.3.7/benchmarks/numerical_validation/reference/cohort_3/comparison.json +770 -0
  53. bindsight-0.3.7/benchmarks/numerical_validation/reference/cohort_3/design_matrix.tsv.gz +0 -0
  54. bindsight-0.3.7/benchmarks/numerical_validation/reference/cohort_3/execution.log +20 -0
  55. bindsight-0.3.7/benchmarks/numerical_validation/reference/cohort_3/gene_diagnostics.tsv.gz +0 -0
  56. bindsight-0.3.7/benchmarks/numerical_validation/reference/cohort_3/largest_lfc_differences.tsv.gz +0 -0
  57. bindsight-0.3.7/benchmarks/numerical_validation/reference/cohort_3/mean_floor/artifact-manifest.json +41 -0
  58. bindsight-0.3.7/benchmarks/numerical_validation/reference/cohort_3/mean_floor/comparison.json +830 -0
  59. bindsight-0.3.7/benchmarks/numerical_validation/reference/cohort_3/mean_floor/largest-lfc-differences.tsv.gz +0 -0
  60. bindsight-0.3.7/benchmarks/numerical_validation/reference/cohort_3/mean_floor/significance-disagreements.tsv.gz +0 -0
  61. bindsight-0.3.7/benchmarks/numerical_validation/reference/cohort_3/metadata.json +441 -0
  62. bindsight-0.3.7/benchmarks/numerical_validation/reference/cohort_3/results.tsv.gz +0 -0
  63. bindsight-0.3.7/benchmarks/numerical_validation/reference/cohort_3/session-info.txt +36 -0
  64. bindsight-0.3.7/benchmarks/numerical_validation/reference/cohort_3/significance_disagreements.tsv.gz +0 -0
  65. bindsight-0.3.7/benchmarks/numerical_validation/reference/cohort_3/size_factors.tsv.gz +0 -0
  66. bindsight-0.3.7/benchmarks/numerical_validation/reference/cohort_8/artifact-manifest.json +137 -0
  67. bindsight-0.3.7/benchmarks/numerical_validation/reference/cohort_8/canonical/artifact-manifest.json +41 -0
  68. bindsight-0.3.7/benchmarks/numerical_validation/reference/cohort_8/canonical/comparison.json +845 -0
  69. bindsight-0.3.7/benchmarks/numerical_validation/reference/cohort_8/canonical/largest-lfc-differences.tsv.gz +0 -0
  70. bindsight-0.3.7/benchmarks/numerical_validation/reference/cohort_8/canonical/significance-disagreements.tsv.gz +0 -0
  71. bindsight-0.3.7/benchmarks/numerical_validation/reference/cohort_8/comparison.json +785 -0
  72. bindsight-0.3.7/benchmarks/numerical_validation/reference/cohort_8/design_matrix.tsv.gz +0 -0
  73. bindsight-0.3.7/benchmarks/numerical_validation/reference/cohort_8/execution.log +20 -0
  74. bindsight-0.3.7/benchmarks/numerical_validation/reference/cohort_8/gene_diagnostics.tsv.gz +0 -0
  75. bindsight-0.3.7/benchmarks/numerical_validation/reference/cohort_8/largest_lfc_differences.tsv.gz +0 -0
  76. bindsight-0.3.7/benchmarks/numerical_validation/reference/cohort_8/mean_floor/artifact-manifest.json +41 -0
  77. bindsight-0.3.7/benchmarks/numerical_validation/reference/cohort_8/mean_floor/comparison.json +845 -0
  78. bindsight-0.3.7/benchmarks/numerical_validation/reference/cohort_8/mean_floor/largest-lfc-differences.tsv.gz +0 -0
  79. bindsight-0.3.7/benchmarks/numerical_validation/reference/cohort_8/mean_floor/significance-disagreements.tsv.gz +0 -0
  80. bindsight-0.3.7/benchmarks/numerical_validation/reference/cohort_8/metadata.json +456 -0
  81. bindsight-0.3.7/benchmarks/numerical_validation/reference/cohort_8/results.tsv.gz +0 -0
  82. bindsight-0.3.7/benchmarks/numerical_validation/reference/cohort_8/session-info.txt +36 -0
  83. bindsight-0.3.7/benchmarks/numerical_validation/reference/cohort_8/significance_disagreements.tsv.gz +0 -0
  84. bindsight-0.3.7/benchmarks/numerical_validation/reference/cohort_8/size_factors.tsv.gz +0 -0
  85. bindsight-0.3.7/benchmarks/numerical_validation/reference/diagnostics/README.md +107 -0
  86. bindsight-0.3.7/benchmarks/numerical_validation/reference/diagnostics/artifact-manifest.json +115 -0
  87. bindsight-0.3.7/benchmarks/numerical_validation/reference/diagnostics/eight-R-dispersion-means.tsv.gz +0 -0
  88. bindsight-0.3.7/benchmarks/numerical_validation/reference/diagnostics/eight-mean-floor-proof.json +92 -0
  89. bindsight-0.3.7/benchmarks/numerical_validation/reference/diagnostics/eight-outlier-diagnostics.tsv.gz +0 -0
  90. bindsight-0.3.7/benchmarks/numerical_validation/reference/diagnostics/eight-wald-floor-proof.json +35 -0
  91. bindsight-0.3.7/benchmarks/numerical_validation/reference/diagnostics/python-eight-fit-metadata.json +28 -0
  92. bindsight-0.3.7/benchmarks/numerical_validation/reference/diagnostics/sparse-fixture.json +870 -0
  93. bindsight-0.3.7/benchmarks/numerical_validation/reference/installed-packages.csv +159 -0
  94. bindsight-0.3.7/benchmarks/numerical_validation/reference/provenance-transformations.json +33 -0
  95. bindsight-0.3.7/benchmarks/numerical_validation/reference/setup-provenance.json +392 -0
  96. bindsight-0.3.7/benchmarks/numerical_validation/reference/setup-session-info.txt +37 -0
  97. bindsight-0.3.7/benchmarks/numerical_validation/reference/setup_reference.ps1 +55 -0
  98. bindsight-0.3.7/benchmarks/numerical_validation/results/canonical_eight/forward.parquet +0 -0
  99. bindsight-0.3.7/benchmarks/numerical_validation/results/canonical_eight/relabel_samples.parquet +0 -0
  100. bindsight-0.3.7/benchmarks/numerical_validation/results/canonical_eight/repeat.parquet +0 -0
  101. bindsight-0.3.7/benchmarks/numerical_validation/results/canonical_eight/reverse_contrast.parquet +0 -0
  102. bindsight-0.3.7/benchmarks/numerical_validation/results/canonical_eight/reverse_sample_order.parquet +0 -0
  103. bindsight-0.3.7/benchmarks/numerical_validation/results/canonical_eight/source_snapshot.json +18 -0
  104. bindsight-0.3.7/benchmarks/numerical_validation/results/canonical_eight/validation.json +772 -0
  105. bindsight-0.3.7/benchmarks/numerical_validation/results/canonical_three/forward.parquet +0 -0
  106. bindsight-0.3.7/benchmarks/numerical_validation/results/canonical_three/relabel_samples.parquet +0 -0
  107. bindsight-0.3.7/benchmarks/numerical_validation/results/canonical_three/repeat.parquet +0 -0
  108. bindsight-0.3.7/benchmarks/numerical_validation/results/canonical_three/reverse_contrast.parquet +0 -0
  109. bindsight-0.3.7/benchmarks/numerical_validation/results/canonical_three/reverse_sample_order.parquet +0 -0
  110. bindsight-0.3.7/benchmarks/numerical_validation/results/canonical_three/source_snapshot.json +18 -0
  111. bindsight-0.3.7/benchmarks/numerical_validation/results/canonical_three/validation.json +772 -0
  112. bindsight-0.3.7/benchmarks/numerical_validation/results/mean_floor_eight/forward.parquet +0 -0
  113. bindsight-0.3.7/benchmarks/numerical_validation/results/mean_floor_eight/relabel_samples.parquet +0 -0
  114. bindsight-0.3.7/benchmarks/numerical_validation/results/mean_floor_eight/repeat.parquet +0 -0
  115. bindsight-0.3.7/benchmarks/numerical_validation/results/mean_floor_eight/reverse_contrast.parquet +0 -0
  116. bindsight-0.3.7/benchmarks/numerical_validation/results/mean_floor_eight/reverse_sample_order.parquet +0 -0
  117. bindsight-0.3.7/benchmarks/numerical_validation/results/mean_floor_eight/source_snapshot.json +18 -0
  118. bindsight-0.3.7/benchmarks/numerical_validation/results/mean_floor_eight/validation.json +712 -0
  119. bindsight-0.3.7/benchmarks/numerical_validation/results/mean_floor_three/forward.parquet +0 -0
  120. bindsight-0.3.7/benchmarks/numerical_validation/results/mean_floor_three/relabel_samples.parquet +0 -0
  121. bindsight-0.3.7/benchmarks/numerical_validation/results/mean_floor_three/repeat.parquet +0 -0
  122. bindsight-0.3.7/benchmarks/numerical_validation/results/mean_floor_three/reverse_contrast.parquet +0 -0
  123. bindsight-0.3.7/benchmarks/numerical_validation/results/mean_floor_three/reverse_sample_order.parquet +0 -0
  124. bindsight-0.3.7/benchmarks/numerical_validation/results/mean_floor_three/source_snapshot.json +18 -0
  125. bindsight-0.3.7/benchmarks/numerical_validation/results/mean_floor_three/validation.json +712 -0
  126. bindsight-0.3.7/benchmarks/numerical_validation/results/original_three/forward.parquet +0 -0
  127. bindsight-0.3.7/benchmarks/numerical_validation/results/original_three/repeat.parquet +0 -0
  128. bindsight-0.3.7/benchmarks/numerical_validation/results/original_three/reverse_contrast.parquet +0 -0
  129. bindsight-0.3.7/benchmarks/numerical_validation/results/original_three/reverse_sample_order.parquet +0 -0
  130. bindsight-0.3.7/benchmarks/numerical_validation/results/original_three/validation.json +342 -0
  131. bindsight-0.3.7/benchmarks/numerical_validation/results/repaired_eight/forward.parquet +0 -0
  132. bindsight-0.3.7/benchmarks/numerical_validation/results/repaired_eight/relabel_samples.parquet +0 -0
  133. bindsight-0.3.7/benchmarks/numerical_validation/results/repaired_eight/repeat.parquet +0 -0
  134. bindsight-0.3.7/benchmarks/numerical_validation/results/repaired_eight/reverse_contrast.parquet +0 -0
  135. bindsight-0.3.7/benchmarks/numerical_validation/results/repaired_eight/reverse_sample_order.parquet +0 -0
  136. bindsight-0.3.7/benchmarks/numerical_validation/results/repaired_eight/sample_identifier_sensitivity.json +52 -0
  137. bindsight-0.3.7/benchmarks/numerical_validation/results/repaired_eight/validation.json +599 -0
  138. bindsight-0.3.7/benchmarks/numerical_validation/results/repaired_three/forward.parquet +0 -0
  139. bindsight-0.3.7/benchmarks/numerical_validation/results/repaired_three/relabel_samples.parquet +0 -0
  140. bindsight-0.3.7/benchmarks/numerical_validation/results/repaired_three/repeat.parquet +0 -0
  141. bindsight-0.3.7/benchmarks/numerical_validation/results/repaired_three/reverse_contrast.parquet +0 -0
  142. bindsight-0.3.7/benchmarks/numerical_validation/results/repaired_three/reverse_sample_order.parquet +0 -0
  143. bindsight-0.3.7/benchmarks/numerical_validation/results/repaired_three/sample_identifier_sensitivity.json +67 -0
  144. bindsight-0.3.7/benchmarks/numerical_validation/results/repaired_three/validation.json +599 -0
  145. bindsight-0.3.7/benchmarks/numerical_validation/source_snapshots/regularization_only.json +21 -0
  146. {bindsight-0.3.5 → bindsight-0.3.7}/bindsight/benchmark/designer_bench.py +10 -7
  147. {bindsight-0.3.5 → bindsight-0.3.7}/bindsight/cli.py +13 -6
  148. {bindsight-0.3.5 → bindsight-0.3.7}/bindsight/config.py +9 -0
  149. bindsight-0.3.7/bindsight/deg/cache.py +94 -0
  150. bindsight-0.3.7/bindsight/deg/diagnostics.py +52 -0
  151. bindsight-0.3.7/bindsight/deg/inference.py +152 -0
  152. {bindsight-0.3.5 → bindsight-0.3.7}/bindsight/deg/pydeseq2_runner.py +147 -11
  153. {bindsight-0.3.5 → bindsight-0.3.7}/bindsight/design/embeddings.py +8 -6
  154. {bindsight-0.3.5 → bindsight-0.3.7}/bindsight/pipelines/discover.py +65 -25
  155. {bindsight-0.3.5 → bindsight-0.3.7}/bindsight/pipelines/full_run.py +3 -1
  156. {bindsight-0.3.5 → bindsight-0.3.7}/bindsight/plugins.py +12 -6
  157. {bindsight-0.3.5 → bindsight-0.3.7}/bindsight/rank/scoring.py +33 -15
  158. bindsight-0.3.7/bindsight/report/coverage.py +26 -0
  159. bindsight-0.3.7/bindsight/report/fit_diagnostics.py +95 -0
  160. {bindsight-0.3.5 → bindsight-0.3.7}/bindsight/report/html.py +76 -3
  161. {bindsight-0.3.5 → bindsight-0.3.7}/bindsight/report/showcase.py +1 -1
  162. {bindsight-0.3.5 → bindsight-0.3.7}/bindsight/report/templates/report.html.j2 +25 -8
  163. {bindsight-0.3.5 → bindsight-0.3.7}/bindsight/report/theme.py +6 -6
  164. {bindsight-0.3.5 → bindsight-0.3.7}/bindsight/report/web/app.py +24 -8
  165. bindsight-0.3.7/bindsight/report/web/evidence-snapshot.json +55 -0
  166. bindsight-0.3.7/bindsight/report/web/evidence.py +170 -0
  167. bindsight-0.3.7/bindsight/report/web/gpu.py +444 -0
  168. bindsight-0.3.7/bindsight/report/web/gpu_setup.py +433 -0
  169. bindsight-0.3.7/bindsight/report/web/gpu_worker.py +335 -0
  170. bindsight-0.3.7/bindsight/report/web/resources.py +303 -0
  171. bindsight-0.3.7/bindsight/report/web/static/fonts/dm-sans-OFL.txt +93 -0
  172. bindsight-0.3.7/bindsight/report/web/static/fonts/dm-sans-latin-variable.woff2 +0 -0
  173. bindsight-0.3.7/bindsight/report/web/static/fonts/instrument-serif-OFL.txt +93 -0
  174. bindsight-0.3.7/bindsight/report/web/static/fonts/instrument-serif-latin-italic.woff2 +0 -0
  175. bindsight-0.3.7/bindsight/report/web/static/fonts/instrument-serif-latin-regular.woff2 +0 -0
  176. bindsight-0.3.7/bindsight/report/web/static/fonts/instrument-serif-sources.json +33 -0
  177. bindsight-0.3.7/bindsight/report/web/static/fonts/manrope-OFL.txt +93 -0
  178. bindsight-0.3.7/bindsight/report/web/static/fonts/manrope-latin-variable.woff2 +0 -0
  179. bindsight-0.3.7/bindsight/report/web/static/fonts/sources.json +44 -0
  180. bindsight-0.3.7/bindsight/report/web/static/workbench-gpu.js +107 -0
  181. bindsight-0.3.7/bindsight/report/web/static/workbench-pages.js +221 -0
  182. bindsight-0.3.7/bindsight/report/web/static/workbench.css +33 -0
  183. bindsight-0.3.7/bindsight/report/web/static/workbench.js +100 -0
  184. {bindsight-0.3.5 → bindsight-0.3.7}/bindsight/report/web/templates/base.html.j2 +1 -0
  185. {bindsight-0.3.5 → bindsight-0.3.7}/bindsight/report/web/templates/overview.html.j2 +3 -2
  186. {bindsight-0.3.5 → bindsight-0.3.7}/bindsight/report/web/templates/try.html.j2 +1 -1
  187. bindsight-0.3.7/bindsight/report/web/templates/workbench.html.j2 +65 -0
  188. {bindsight-0.3.5 → bindsight-0.3.7}/bindsight/report/web/templates/your_data.html.j2 +1 -1
  189. bindsight-0.3.7/bindsight/report/web/workbench_routes.py +386 -0
  190. bindsight-0.3.7/bindsight/report/web/worker.py +111 -0
  191. bindsight-0.3.7/bindsight/report/web/workspace.py +694 -0
  192. bindsight-0.3.7/bindsight/runners/boltz_compat.py +66 -0
  193. bindsight-0.3.7/bindsight/runners/installer_security.py +99 -0
  194. {bindsight-0.3.5 → bindsight-0.3.7}/bindsight/runners/job_exec.py +14 -7
  195. {bindsight-0.3.5 → bindsight-0.3.7}/bindsight/runners/kaggle.py +5 -0
  196. {bindsight-0.3.5 → bindsight-0.3.7}/bindsight/runners/kaggle_kernel.py +58 -32
  197. {bindsight-0.3.5 → bindsight-0.3.7}/bindsight/runners/local_docker.py +29 -5
  198. {bindsight-0.3.5 → bindsight-0.3.7}/bindsight/runners/modal_runner.py +22 -16
  199. {bindsight-0.3.5 → bindsight-0.3.7}/bindsight/runners/notebook_content.py +3 -2
  200. {bindsight-0.3.5 → bindsight-0.3.7}/bindsight/runners/tools.py +12 -6
  201. {bindsight-0.3.5 → bindsight-0.3.7}/codemeta.json +3 -3
  202. bindsight-0.3.7/companion/.gitignore +3 -0
  203. bindsight-0.3.7/companion/README.md +139 -0
  204. bindsight-0.3.7/companion/__init__.py +2 -0
  205. bindsight-0.3.7/companion/app.py +467 -0
  206. bindsight-0.3.7/companion/build.py +184 -0
  207. bindsight-0.3.7/companion/companion.spec +22 -0
  208. bindsight-0.3.7/companion/core.py +716 -0
  209. bindsight-0.3.7/companion/desktop.py +160 -0
  210. bindsight-0.3.7/companion/pins.json +13 -0
  211. bindsight-0.3.7/companion/protocol.py +37 -0
  212. bindsight-0.3.7/companion/requirements-build.txt +1 -0
  213. bindsight-0.3.7/companion/smoke_install.py +91 -0
  214. bindsight-0.3.7/companion/validation-evidence.json +93 -0
  215. bindsight-0.3.7/companion/validation.py +66 -0
  216. bindsight-0.3.7/companion/wsl.py +503 -0
  217. {bindsight-0.3.5 → bindsight-0.3.7}/docs/README.md +2 -0
  218. bindsight-0.3.7/docs/audits/dependency-audit-2026-09-29.json +1 -0
  219. bindsight-0.3.7/docs/audits/local-software-checks-2026-09-29.json +35 -0
  220. bindsight-0.3.7/docs/audits/local-workflow-companion-2026-09-29.json +341 -0
  221. bindsight-0.3.7/docs/audits/security-bootstrap-2026-11-01.json +60 -0
  222. {bindsight-0.3.5 → bindsight-0.3.7}/docs/glossary.md +1 -1
  223. {bindsight-0.3.5 → bindsight-0.3.7}/docs/how-to-use.md +8 -2
  224. {bindsight-0.3.5 → bindsight-0.3.7}/docs/index.md +29 -26
  225. bindsight-0.3.7/docs/local-workspace.md +66 -0
  226. {bindsight-0.3.5 → bindsight-0.3.7}/docs/positioning.md +7 -5
  227. bindsight-0.3.7/docs/validation-status.md +245 -0
  228. {bindsight-0.3.5 → bindsight-0.3.7}/docs/what-is-bindsight.md +1 -1
  229. {bindsight-0.3.5 → bindsight-0.3.7}/envs/constraints.txt +2 -2
  230. {bindsight-0.3.5 → bindsight-0.3.7}/envs/discover.yaml +3 -2
  231. bindsight-0.3.7/hosting/README.md +59 -0
  232. bindsight-0.3.7/hosting/site-proxy.mjs +73 -0
  233. bindsight-0.3.7/hosting/site-proxy.test.mjs +108 -0
  234. bindsight-0.3.7/hosting/site-proxy.workerd-test.mjs +56 -0
  235. bindsight-0.3.7/launch.py +118 -0
  236. {bindsight-0.3.5 → bindsight-0.3.7}/mkdocs.yml +2 -0
  237. bindsight-0.3.7/paper/README.md +463 -0
  238. bindsight-0.3.7/paper/SUBMISSIONS.md +75 -0
  239. {bindsight-0.3.5/paper/biorxiv → bindsight-0.3.7/paper/methods}/manuscript.tex +5 -4
  240. {bindsight-0.3.5 → bindsight-0.3.7}/paper/paper.bib +2 -2
  241. {bindsight-0.3.5 → bindsight-0.3.7}/paper/paper.md +6 -6
  242. {bindsight-0.3.5 → bindsight-0.3.7}/paper/validation/manuscript.md +13 -5
  243. {bindsight-0.3.5 → bindsight-0.3.7}/pyproject.toml +10 -5
  244. {bindsight-0.3.5 → bindsight-0.3.7}/requirements.txt +4 -2
  245. {bindsight-0.3.5 → bindsight-0.3.7}/scripts/README.md +9 -0
  246. {bindsight-0.3.5 → bindsight-0.3.7}/scripts/build_docs_results.py +26 -7
  247. bindsight-0.3.7/scripts/build_website.py +132 -0
  248. bindsight-0.3.7/scripts/check_release_install.py +88 -0
  249. bindsight-0.3.7/scripts/compare_deseq2_reference.py +225 -0
  250. bindsight-0.3.7/scripts/publish_companions.py +78 -0
  251. bindsight-0.3.7/scripts/pypi_readme.py +116 -0
  252. bindsight-0.3.7/scripts/reference_deseq2.R +122 -0
  253. bindsight-0.3.7/scripts/validate_real_counts.py +293 -0
  254. bindsight-0.3.7/scripts/verify_local_workflow.py +346 -0
  255. {bindsight-0.3.5 → bindsight-0.3.7}/tests/test_author_metadata_agrees.py +31 -7
  256. {bindsight-0.3.5 → bindsight-0.3.7}/tests/test_calibration_analysis.py +90 -2
  257. bindsight-0.3.7/tests/test_companion_build.py +94 -0
  258. bindsight-0.3.7/tests/test_companion_core.py +319 -0
  259. bindsight-0.3.7/tests/test_companion_protocol.py +60 -0
  260. bindsight-0.3.7/tests/test_companion_publication.py +70 -0
  261. bindsight-0.3.7/tests/test_companion_wsl.py +290 -0
  262. bindsight-0.3.7/tests/test_deg_cache_integrity.py +127 -0
  263. bindsight-0.3.7/tests/test_deg_identifiers.py +88 -0
  264. bindsight-0.3.7/tests/test_deg_inference.py +221 -0
  265. {bindsight-0.3.5 → bindsight-0.3.7}/tests/test_deg_input_validation.py +5 -1
  266. bindsight-0.3.7/tests/test_deg_ordering.py +122 -0
  267. {bindsight-0.3.5 → bindsight-0.3.7}/tests/test_designer_bench.py +36 -0
  268. {bindsight-0.3.5 → bindsight-0.3.7}/tests/test_docs_claims.py +26 -30
  269. bindsight-0.3.7/tests/test_fit_diagnostics.py +135 -0
  270. bindsight-0.3.7/tests/test_gpu_integration.py +241 -0
  271. bindsight-0.3.7/tests/test_gpu_workbench.py +513 -0
  272. bindsight-0.3.7/tests/test_installer_security.py +128 -0
  273. {bindsight-0.3.5 → bindsight-0.3.7}/tests/test_job_exec.py +4 -2
  274. {bindsight-0.3.5 → bindsight-0.3.7}/tests/test_join_end_to_end.py +24 -5
  275. bindsight-0.3.7/tests/test_local_workbench.py +352 -0
  276. {bindsight-0.3.5 → bindsight-0.3.7}/tests/test_manuscript_pdf_workflow.py +209 -13
  277. {bindsight-0.3.5 → bindsight-0.3.7}/tests/test_manuscript_typesets.py +3 -3
  278. {bindsight-0.3.5 → bindsight-0.3.7}/tests/test_no_hosted_space.py +13 -12
  279. {bindsight-0.3.5 → bindsight-0.3.7}/tests/test_no_zenodo.py +8 -2
  280. {bindsight-0.3.5 → bindsight-0.3.7}/tests/test_non_cancer_cohort.py +27 -1
  281. bindsight-0.3.7/tests/test_numerical_validation.py +93 -0
  282. {bindsight-0.3.5 → bindsight-0.3.7}/tests/test_packaging_pins.py +76 -10
  283. {bindsight-0.3.5 → bindsight-0.3.7}/tests/test_pipelines_discover.py +38 -0
  284. {bindsight-0.3.5 → bindsight-0.3.7}/tests/test_pipelines_full_run.py +25 -0
  285. {bindsight-0.3.5 → bindsight-0.3.7}/tests/test_published_numbers_match_artifacts.py +3 -3
  286. bindsight-0.3.7/tests/test_pypi_readme.py +109 -0
  287. {bindsight-0.3.5 → bindsight-0.3.7}/tests/test_rank.py +57 -0
  288. bindsight-0.3.7/tests/test_reference_comparison.py +154 -0
  289. {bindsight-0.3.5 → bindsight-0.3.7}/tests/test_report_failed_run.py +19 -3
  290. {bindsight-0.3.5 → bindsight-0.3.7}/tests/test_report_html.py +81 -1
  291. {bindsight-0.3.5 → bindsight-0.3.7}/tests/test_requirements_mirror.py +5 -0
  292. {bindsight-0.3.5 → bindsight-0.3.7}/tests/test_run_self_contained.py +13 -3
  293. {bindsight-0.3.5 → bindsight-0.3.7}/tests/test_runners_modal_local.py +1 -1
  294. {bindsight-0.3.5 → bindsight-0.3.7}/tests/test_runners_tools.py +2 -2
  295. bindsight-0.3.7/tests/test_submission_record.py +425 -0
  296. {bindsight-0.3.5 → bindsight-0.3.7}/tests/test_untested_ready_rows.py +9 -6
  297. {bindsight-0.3.5 → bindsight-0.3.7}/tests/test_web_ui.py +88 -2
  298. bindsight-0.3.7/tests/test_website_archive.py +298 -0
  299. bindsight-0.3.7/tests/test_workspace_resources.py +183 -0
  300. bindsight-0.3.5/.gitattributes +0 -17
  301. bindsight-0.3.5/.github/workflows/docs.yml +0 -55
  302. bindsight-0.3.5/.github/workflows/manuscript-pdf.yml +0 -80
  303. bindsight-0.3.5/.github/workflows/release-artifacts.yml +0 -88
  304. bindsight-0.3.5/paper/README.md +0 -356
  305. {bindsight-0.3.5 → bindsight-0.3.7}/.dockerignore +0 -0
  306. {bindsight-0.3.5 → bindsight-0.3.7}/.editorconfig +0 -0
  307. {bindsight-0.3.5 → bindsight-0.3.7}/.github/CODEOWNERS +0 -0
  308. {bindsight-0.3.5 → bindsight-0.3.7}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  309. {bindsight-0.3.5 → bindsight-0.3.7}/.github/ISSUE_TEMPLATE/reproducibility.yml +0 -0
  310. {bindsight-0.3.5 → bindsight-0.3.7}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  311. {bindsight-0.3.5 → bindsight-0.3.7}/.github/dependabot.yml +0 -0
  312. {bindsight-0.3.5 → bindsight-0.3.7}/CODE_OF_CONDUCT.md +0 -0
  313. {bindsight-0.3.5 → bindsight-0.3.7}/COPYRIGHT +0 -0
  314. {bindsight-0.3.5 → bindsight-0.3.7}/LICENSE +0 -0
  315. {bindsight-0.3.5 → bindsight-0.3.7}/SUPPORT.md +0 -0
  316. {bindsight-0.3.5 → bindsight-0.3.7}/Snakefile +0 -0
  317. {bindsight-0.3.5 → bindsight-0.3.7}/benchmarks/PROVENANCE.md +0 -0
  318. {bindsight-0.3.5 → bindsight-0.3.7}/benchmarks/README.md +0 -0
  319. {bindsight-0.3.5 → bindsight-0.3.7}/benchmarks/binders.fasta +0 -0
  320. {bindsight-0.3.5 → bindsight-0.3.7}/benchmarks/binders.tsv +0 -0
  321. {bindsight-0.3.5 → bindsight-0.3.7}/benchmarks/build_eval_set.py +0 -0
  322. {bindsight-0.3.5 → bindsight-0.3.7}/benchmarks/calibration/PRECISION.md +0 -0
  323. {bindsight-0.3.5 → bindsight-0.3.7}/benchmarks/calibration/prepare_decoy_target.py +0 -0
  324. {bindsight-0.3.5 → bindsight-0.3.7}/benchmarks/calibration/stage_scrambles.py +0 -0
  325. {bindsight-0.3.5 → bindsight-0.3.7}/benchmarks/calibration/submit_calibration.py +0 -0
  326. {bindsight-0.3.5 → bindsight-0.3.7}/benchmarks/calibration/target/Q96NY8_ig_v.pdb +0 -0
  327. {bindsight-0.3.5 → bindsight-0.3.7}/benchmarks/designer_benchmark/README.md +0 -0
  328. {bindsight-0.3.5 → bindsight-0.3.7}/benchmarks/designer_benchmark/RUN_FREE_GPU.md +0 -0
  329. {bindsight-0.3.5 → bindsight-0.3.7}/benchmarks/designer_benchmark/binders/P04626_binder_0_seq0.fasta +0 -0
  330. {bindsight-0.3.5 → bindsight-0.3.7}/benchmarks/designer_benchmark/binders/P04626_binder_0_seq0_complex.cif +0 -0
  331. {bindsight-0.3.5 → bindsight-0.3.7}/benchmarks/designer_benchmark/binders/P04626_binder_0_seq1.fasta +0 -0
  332. {bindsight-0.3.5 → bindsight-0.3.7}/benchmarks/designer_benchmark/binders/P04626_binder_0_seq1_complex.cif +0 -0
  333. {bindsight-0.3.5 → bindsight-0.3.7}/benchmarks/designer_benchmark/binders/P04626_binder_1_seq0.fasta +0 -0
  334. {bindsight-0.3.5 → bindsight-0.3.7}/benchmarks/designer_benchmark/binders/P04626_binder_1_seq0_complex.cif +0 -0
  335. {bindsight-0.3.5 → bindsight-0.3.7}/benchmarks/designer_benchmark/binders/P04626_binder_1_seq1.fasta +0 -0
  336. {bindsight-0.3.5 → bindsight-0.3.7}/benchmarks/designer_benchmark/binders/P04626_binder_1_seq1_complex.cif +0 -0
  337. {bindsight-0.3.5 → bindsight-0.3.7}/benchmarks/designer_benchmark/binders/P04626_binder_2_seq0.fasta +0 -0
  338. {bindsight-0.3.5 → bindsight-0.3.7}/benchmarks/designer_benchmark/binders/P04626_binder_2_seq0_complex.cif +0 -0
  339. {bindsight-0.3.5 → bindsight-0.3.7}/benchmarks/designer_benchmark/binders/P04626_binder_2_seq1.fasta +0 -0
  340. {bindsight-0.3.5 → bindsight-0.3.7}/benchmarks/designer_benchmark/binders/P04626_binder_2_seq1_complex.cif +0 -0
  341. {bindsight-0.3.5 → bindsight-0.3.7}/benchmarks/designer_benchmark/binders/P04626_binder_3_seq0.fasta +0 -0
  342. {bindsight-0.3.5 → bindsight-0.3.7}/benchmarks/designer_benchmark/binders/P04626_binder_3_seq0_complex.cif +0 -0
  343. {bindsight-0.3.5 → bindsight-0.3.7}/benchmarks/designer_benchmark/binders/P04626_binder_3_seq1.fasta +0 -0
  344. {bindsight-0.3.5 → bindsight-0.3.7}/benchmarks/designer_benchmark/binders/P04626_binder_3_seq1_complex.cif +0 -0
  345. {bindsight-0.3.5 → bindsight-0.3.7}/benchmarks/designer_benchmark/binders/P04626_binder_4_seq0.fasta +0 -0
  346. {bindsight-0.3.5 → bindsight-0.3.7}/benchmarks/designer_benchmark/binders/P04626_binder_4_seq0_complex.cif +0 -0
  347. {bindsight-0.3.5 → bindsight-0.3.7}/benchmarks/designer_benchmark/binders/P04626_binder_4_seq1.fasta +0 -0
  348. {bindsight-0.3.5 → bindsight-0.3.7}/benchmarks/designer_benchmark/binders/P04626_binder_4_seq1_complex.cif +0 -0
  349. {bindsight-0.3.5 → bindsight-0.3.7}/benchmarks/designer_benchmark/binders/P04626_binder_5_seq0.fasta +0 -0
  350. {bindsight-0.3.5 → bindsight-0.3.7}/benchmarks/designer_benchmark/binders/P04626_binder_5_seq0_complex.cif +0 -0
  351. {bindsight-0.3.5 → bindsight-0.3.7}/benchmarks/designer_benchmark/binders/P04626_binder_5_seq1.fasta +0 -0
  352. {bindsight-0.3.5 → bindsight-0.3.7}/benchmarks/designer_benchmark/binders/P04626_binder_5_seq1_complex.cif +0 -0
  353. {bindsight-0.3.5 → bindsight-0.3.7}/benchmarks/designer_benchmark/binders/P04626_binder_6_seq0.fasta +0 -0
  354. {bindsight-0.3.5 → bindsight-0.3.7}/benchmarks/designer_benchmark/binders/P04626_binder_6_seq0_complex.cif +0 -0
  355. {bindsight-0.3.5 → bindsight-0.3.7}/benchmarks/designer_benchmark/binders/P04626_binder_6_seq1.fasta +0 -0
  356. {bindsight-0.3.5 → bindsight-0.3.7}/benchmarks/designer_benchmark/binders/P04626_binder_6_seq1_complex.cif +0 -0
  357. {bindsight-0.3.5 → bindsight-0.3.7}/benchmarks/designer_benchmark/binders/P04626_binder_7_seq0.fasta +0 -0
  358. {bindsight-0.3.5 → bindsight-0.3.7}/benchmarks/designer_benchmark/binders/P04626_binder_7_seq0_complex.cif +0 -0
  359. {bindsight-0.3.5 → bindsight-0.3.7}/benchmarks/designer_benchmark/binders/P04626_binder_7_seq1.fasta +0 -0
  360. {bindsight-0.3.5 → bindsight-0.3.7}/benchmarks/designer_benchmark/binders/P04626_binder_7_seq1_complex.cif +0 -0
  361. {bindsight-0.3.5 → bindsight-0.3.7}/benchmarks/designer_benchmark/binders/P04626_binder_8_seq0.fasta +0 -0
  362. {bindsight-0.3.5 → bindsight-0.3.7}/benchmarks/designer_benchmark/binders/P04626_binder_8_seq0_complex.cif +0 -0
  363. {bindsight-0.3.5 → bindsight-0.3.7}/benchmarks/designer_benchmark/binders/P04626_binder_8_seq1.fasta +0 -0
  364. {bindsight-0.3.5 → bindsight-0.3.7}/benchmarks/designer_benchmark/binders/P04626_binder_8_seq1_complex.cif +0 -0
  365. {bindsight-0.3.5 → bindsight-0.3.7}/benchmarks/designer_benchmark/binders/P04626_binder_9_seq0.fasta +0 -0
  366. {bindsight-0.3.5 → bindsight-0.3.7}/benchmarks/designer_benchmark/binders/P04626_binder_9_seq0_complex.cif +0 -0
  367. {bindsight-0.3.5 → bindsight-0.3.7}/benchmarks/designer_benchmark/binders/P04626_binder_9_seq1.fasta +0 -0
  368. {bindsight-0.3.5 → bindsight-0.3.7}/benchmarks/designer_benchmark/binders/P04626_binder_9_seq1_complex.cif +0 -0
  369. {bindsight-0.3.5 → bindsight-0.3.7}/benchmarks/designer_benchmark/binders/developability.tsv +0 -0
  370. {bindsight-0.3.5 → bindsight-0.3.7}/benchmarks/designer_benchmark/binders/embedding_coords.tsv +0 -0
  371. {bindsight-0.3.5 → bindsight-0.3.7}/benchmarks/designer_benchmark/binders/embedding_space.png +0 -0
  372. {bindsight-0.3.5 → bindsight-0.3.7}/benchmarks/designer_benchmark/binders/metrics.jsonl +0 -0
  373. {bindsight-0.3.5 → bindsight-0.3.7}/benchmarks/designer_benchmark/embed_binders.py +0 -0
  374. {bindsight-0.3.5 → bindsight-0.3.7}/benchmarks/designer_benchmark/prepare_erbb2_target.py +0 -0
  375. {bindsight-0.3.5 → bindsight-0.3.7}/benchmarks/designer_benchmark/results.json +0 -0
  376. {bindsight-0.3.5 → bindsight-0.3.7}/benchmarks/designer_benchmark/score_developability.py +0 -0
  377. {bindsight-0.3.5 → bindsight-0.3.7}/benchmarks/designer_benchmark/score_run.py +0 -0
  378. {bindsight-0.3.5 → bindsight-0.3.7}/benchmarks/designer_benchmark/target/P04626_domain_IV.pdb +0 -0
  379. {bindsight-0.3.5 → bindsight-0.3.7}/benchmarks/gpu_capacity/README.md +0 -0
  380. {bindsight-0.3.5 → bindsight-0.3.7}/benchmarks/gpu_capacity/t4-ca9-377aa.log +0 -0
  381. {bindsight-0.3.5 → bindsight-0.3.7}/benchmarks/known.tsv +0 -0
  382. {bindsight-0.3.5 → bindsight-0.3.7}/benchmarks/provenance_join/README.md +0 -0
  383. {bindsight-0.3.5 → bindsight-0.3.7}/benchmarks/provenance_join/SHA256SUMS +0 -0
  384. {bindsight-0.3.5 → bindsight-0.3.7}/benchmarks/provenance_join/ro-crate-metadata.json +0 -0
  385. {bindsight-0.3.5 → bindsight-0.3.7}/benchmarks/provenance_join/run_manifest.jsonld +0 -0
  386. {bindsight-0.3.5 → bindsight-0.3.7}/benchmarks/run_designer_benchmark.py +0 -0
  387. {bindsight-0.3.5 → bindsight-0.3.7}/benchmarks/run_study.py +0 -0
  388. {bindsight-0.3.5 → bindsight-0.3.7}/benchmarks/sources.json +0 -0
  389. {bindsight-0.3.5 → bindsight-0.3.7}/benchmarks/study/README.md +0 -0
  390. {bindsight-0.3.5 → bindsight-0.3.7}/benchmarks/study/RESULTS.md +0 -0
  391. {bindsight-0.3.5 → bindsight-0.3.7}/benchmarks/study/figures/outcome_classes.png +0 -0
  392. {bindsight-0.3.5 → bindsight-0.3.7}/benchmarks/study/figures/surfaced_ranks.png +0 -0
  393. {bindsight-0.3.5 → bindsight-0.3.7}/benchmarks/study/results.json +0 -0
  394. {bindsight-0.3.5 → bindsight-0.3.7}/benchmarks/study/run_log.json +0 -0
  395. {bindsight-0.3.5 → bindsight-0.3.7}/bindsight/README.md +0 -0
  396. {bindsight-0.3.5 → bindsight-0.3.7}/bindsight/__init__.py +0 -0
  397. {bindsight-0.3.5 → bindsight-0.3.7}/bindsight/benchmark/__init__.py +0 -0
  398. {bindsight-0.3.5 → bindsight-0.3.7}/bindsight/benchmark/core.py +0 -0
  399. {bindsight-0.3.5 → bindsight-0.3.7}/bindsight/benchmark/defaults.py +0 -0
  400. {bindsight-0.3.5 → bindsight-0.3.7}/bindsight/benchmark/outcomes.py +0 -0
  401. {bindsight-0.3.5 → bindsight-0.3.7}/bindsight/benchmark/panel.py +0 -0
  402. {bindsight-0.3.5 → bindsight-0.3.7}/bindsight/benchmark/rediscovery.py +0 -0
  403. {bindsight-0.3.5 → bindsight-0.3.7}/bindsight/benchmark/statistics.py +0 -0
  404. {bindsight-0.3.5 → bindsight-0.3.7}/bindsight/benchmark/study.py +0 -0
  405. {bindsight-0.3.5 → bindsight-0.3.7}/bindsight/benchmark/study_figures.py +0 -0
  406. {bindsight-0.3.5 → bindsight-0.3.7}/bindsight/benchmark/study_report.py +0 -0
  407. {bindsight-0.3.5 → bindsight-0.3.7}/bindsight/cost.py +0 -0
  408. {bindsight-0.3.5 → bindsight-0.3.7}/bindsight/deg/__init__.py +0 -0
  409. {bindsight-0.3.5 → bindsight-0.3.7}/bindsight/design/__init__.py +0 -0
  410. {bindsight-0.3.5 → bindsight-0.3.7}/bindsight/design/_common.py +0 -0
  411. {bindsight-0.3.5 → bindsight-0.3.7}/bindsight/design/bindcraft.py +0 -0
  412. {bindsight-0.3.5 → bindsight-0.3.7}/bindsight/design/boltzgen.py +0 -0
  413. {bindsight-0.3.5 → bindsight-0.3.7}/bindsight/design/developability.py +0 -0
  414. {bindsight-0.3.5 → bindsight-0.3.7}/bindsight/design/prescreen.py +0 -0
  415. {bindsight-0.3.5 → bindsight-0.3.7}/bindsight/design/protocol.py +0 -0
  416. {bindsight-0.3.5 → bindsight-0.3.7}/bindsight/design/rfdiff_mpnn.py +0 -0
  417. {bindsight-0.3.5 → bindsight-0.3.7}/bindsight/epitopes/__init__.py +0 -0
  418. {bindsight-0.3.5 → bindsight-0.3.7}/bindsight/epitopes/surface_bind.py +0 -0
  419. {bindsight-0.3.5 → bindsight-0.3.7}/bindsight/export/__init__.py +0 -0
  420. {bindsight-0.3.5 → bindsight-0.3.7}/bindsight/export/ro_crate.py +0 -0
  421. {bindsight-0.3.5 → bindsight-0.3.7}/bindsight/io/__init__.py +0 -0
  422. {bindsight-0.3.5 → bindsight-0.3.7}/bindsight/io/cbioportal.py +0 -0
  423. {bindsight-0.3.5 → bindsight-0.3.7}/bindsight/io/gdc.py +0 -0
  424. {bindsight-0.3.5 → bindsight-0.3.7}/bindsight/io/paths.py +0 -0
  425. {bindsight-0.3.5 → bindsight-0.3.7}/bindsight/pipelines/__init__.py +0 -0
  426. {bindsight-0.3.5 → bindsight-0.3.7}/bindsight/pipelines/caveats.py +0 -0
  427. {bindsight-0.3.5 → bindsight-0.3.7}/bindsight/provenance/__init__.py +0 -0
  428. {bindsight-0.3.5 → bindsight-0.3.7}/bindsight/provenance/append.py +0 -0
  429. {bindsight-0.3.5 → bindsight-0.3.7}/bindsight/provenance/fragments.py +0 -0
  430. {bindsight-0.3.5 → bindsight-0.3.7}/bindsight/provenance/manifest.py +0 -0
  431. {bindsight-0.3.5 → bindsight-0.3.7}/bindsight/rank/__init__.py +0 -0
  432. {bindsight-0.3.5 → bindsight-0.3.7}/bindsight/report/__init__.py +0 -0
  433. {bindsight-0.3.5 → bindsight-0.3.7}/bindsight/report/format.py +0 -0
  434. {bindsight-0.3.5 → bindsight-0.3.7}/bindsight/report/templates/report.css +0 -0
  435. {bindsight-0.3.5 → bindsight-0.3.7}/bindsight/report/web/__init__.py +0 -0
  436. {bindsight-0.3.5 → bindsight-0.3.7}/bindsight/report/web/static/binder_viewer.js +0 -0
  437. {bindsight-0.3.5 → bindsight-0.3.7}/bindsight/report/web/static/bindsight.css +0 -0
  438. {bindsight-0.3.5 → bindsight-0.3.7}/bindsight/report/web/static/charts.js +0 -0
  439. {bindsight-0.3.5 → bindsight-0.3.7}/bindsight/report/web/static/vendor/3Dmol-min.js +0 -0
  440. {bindsight-0.3.5 → bindsight-0.3.7}/bindsight/report/web/static/vendor/3Dmol.LICENSE +0 -0
  441. {bindsight-0.3.5 → bindsight-0.3.7}/bindsight/report/web/static/your_data_check.js +0 -0
  442. {bindsight-0.3.5 → bindsight-0.3.7}/bindsight/report/web/templates/evidence.html.j2 +0 -0
  443. {bindsight-0.3.5 → bindsight-0.3.7}/bindsight/report/web/templates/runs.html.j2 +0 -0
  444. {bindsight-0.3.5 → bindsight-0.3.7}/bindsight/runners/__init__.py +0 -0
  445. {bindsight-0.3.5 → bindsight-0.3.7}/bindsight/runners/colab.py +0 -0
  446. {bindsight-0.3.5 → bindsight-0.3.7}/bindsight/runners/mock.py +0 -0
  447. {bindsight-0.3.5 → bindsight-0.3.7}/bindsight/runners/notebook.py +0 -0
  448. {bindsight-0.3.5 → bindsight-0.3.7}/bindsight/runners/protocol.py +0 -0
  449. {bindsight-0.3.5 → bindsight-0.3.7}/bindsight/runners/source_wheel.py +0 -0
  450. {bindsight-0.3.5 → bindsight-0.3.7}/bindsight/structures/__init__.py +0 -0
  451. {bindsight-0.3.5 → bindsight-0.3.7}/bindsight/structures/alphafolddb.py +0 -0
  452. {bindsight-0.3.5 → bindsight-0.3.7}/bindsight/structures/plddt.py +0 -0
  453. {bindsight-0.3.5 → bindsight-0.3.7}/bindsight/structures/topology.py +0 -0
  454. {bindsight-0.3.5 → bindsight-0.3.7}/bindsight/surfaceome/__init__.py +0 -0
  455. {bindsight-0.3.5 → bindsight-0.3.7}/bindsight/surfaceome/data/surfaceome_extended.tsv +0 -0
  456. {bindsight-0.3.5 → bindsight-0.3.7}/bindsight/surfaceome/data/surfy_offline.txt +0 -0
  457. {bindsight-0.3.5 → bindsight-0.3.7}/bindsight/surfaceome/data/surfy_v1.ensembl.tsv +0 -0
  458. {bindsight-0.3.5 → bindsight-0.3.7}/bindsight/surfaceome/data/surfy_v1.uniprot.txt +0 -0
  459. {bindsight-0.3.5 → bindsight-0.3.7}/bindsight/surfaceome/surfy.py +0 -0
  460. {bindsight-0.3.5 → bindsight-0.3.7}/bindsight/targets/__init__.py +0 -0
  461. {bindsight-0.3.5 → bindsight-0.3.7}/bindsight/targets/ensembl_uniprot.py +0 -0
  462. {bindsight-0.3.5 → bindsight-0.3.7}/bindsight/targets/gtex.py +0 -0
  463. {bindsight-0.3.5 → bindsight-0.3.7}/bindsight/targets/open_targets.py +0 -0
  464. {bindsight-0.3.5 → bindsight-0.3.7}/bindsight/validate/__init__.py +0 -0
  465. {bindsight-0.3.5 → bindsight-0.3.7}/bindsight/validate/af2_ig.py +0 -0
  466. {bindsight-0.3.5 → bindsight-0.3.7}/bindsight/validate/boltz2.py +0 -0
  467. {bindsight-0.3.5 → bindsight-0.3.7}/bindsight/validate/chai1r.py +0 -0
  468. {bindsight-0.3.5 → bindsight-0.3.7}/bindsight/validate/protocol.py +0 -0
  469. {bindsight-0.3.5 → bindsight-0.3.7}/data/surface_bind/README.md +0 -0
  470. {bindsight-0.3.5 → bindsight-0.3.7}/docs/assets/favicon.svg +0 -0
  471. {bindsight-0.3.5 → bindsight-0.3.7}/docs/assets/figures/outcome_classes.png +0 -0
  472. {bindsight-0.3.5 → bindsight-0.3.7}/docs/assets/figures/surfaced_ranks.png +0 -0
  473. {bindsight-0.3.5 → bindsight-0.3.7}/docs/assets/js/binder_viewer.js +0 -0
  474. {bindsight-0.3.5 → bindsight-0.3.7}/docs/assets/js/your_data_check.js +0 -0
  475. {bindsight-0.3.5 → bindsight-0.3.7}/docs/assets/logo.svg +0 -0
  476. {bindsight-0.3.5 → bindsight-0.3.7}/docs/assets/og-image.png +0 -0
  477. {bindsight-0.3.5 → bindsight-0.3.7}/docs/assets/structures/P04626_binder_0_seq0_complex.cif +0 -0
  478. {bindsight-0.3.5 → bindsight-0.3.7}/docs/assets/structures/P04626_binder_0_seq1_complex.cif +0 -0
  479. {bindsight-0.3.5 → bindsight-0.3.7}/docs/assets/structures/P04626_binder_1_seq0_complex.cif +0 -0
  480. {bindsight-0.3.5 → bindsight-0.3.7}/docs/assets/structures/P04626_binder_1_seq1_complex.cif +0 -0
  481. {bindsight-0.3.5 → bindsight-0.3.7}/docs/assets/structures/P04626_binder_2_seq0_complex.cif +0 -0
  482. {bindsight-0.3.5 → bindsight-0.3.7}/docs/assets/structures/P04626_binder_2_seq1_complex.cif +0 -0
  483. {bindsight-0.3.5 → bindsight-0.3.7}/docs/assets/structures/P04626_binder_3_seq0_complex.cif +0 -0
  484. {bindsight-0.3.5 → bindsight-0.3.7}/docs/assets/structures/P04626_binder_3_seq1_complex.cif +0 -0
  485. {bindsight-0.3.5 → bindsight-0.3.7}/docs/assets/structures/P04626_binder_4_seq0_complex.cif +0 -0
  486. {bindsight-0.3.5 → bindsight-0.3.7}/docs/assets/structures/P04626_binder_4_seq1_complex.cif +0 -0
  487. {bindsight-0.3.5 → bindsight-0.3.7}/docs/assets/structures/P04626_binder_5_seq0_complex.cif +0 -0
  488. {bindsight-0.3.5 → bindsight-0.3.7}/docs/assets/structures/P04626_binder_5_seq1_complex.cif +0 -0
  489. {bindsight-0.3.5 → bindsight-0.3.7}/docs/assets/structures/P04626_binder_6_seq0_complex.cif +0 -0
  490. {bindsight-0.3.5 → bindsight-0.3.7}/docs/assets/structures/P04626_binder_6_seq1_complex.cif +0 -0
  491. {bindsight-0.3.5 → bindsight-0.3.7}/docs/assets/structures/P04626_binder_7_seq0_complex.cif +0 -0
  492. {bindsight-0.3.5 → bindsight-0.3.7}/docs/assets/structures/P04626_binder_7_seq1_complex.cif +0 -0
  493. {bindsight-0.3.5 → bindsight-0.3.7}/docs/assets/structures/P04626_binder_8_seq0_complex.cif +0 -0
  494. {bindsight-0.3.5 → bindsight-0.3.7}/docs/assets/structures/P04626_binder_8_seq1_complex.cif +0 -0
  495. {bindsight-0.3.5 → bindsight-0.3.7}/docs/assets/structures/P04626_binder_9_seq0_complex.cif +0 -0
  496. {bindsight-0.3.5 → bindsight-0.3.7}/docs/assets/structures/P04626_binder_9_seq1_complex.cif +0 -0
  497. {bindsight-0.3.5 → bindsight-0.3.7}/docs/assets/vendor/3Dmol-min.js +0 -0
  498. {bindsight-0.3.5 → bindsight-0.3.7}/docs/assets/vendor/3Dmol.LICENSE +0 -0
  499. {bindsight-0.3.5 → bindsight-0.3.7}/docs/colab-design-howto.md +0 -0
  500. {bindsight-0.3.5 → bindsight-0.3.7}/docs/results.md +0 -0
  501. {bindsight-0.3.5 → bindsight-0.3.7}/docs/robots.txt +0 -0
  502. {bindsight-0.3.5 → bindsight-0.3.7}/docs/stylesheets/extra.css +0 -0
  503. {bindsight-0.3.5 → bindsight-0.3.7}/docs/try-your-data.md +0 -0
  504. {bindsight-0.3.5 → bindsight-0.3.7}/docs/use-cases.md +0 -0
  505. {bindsight-0.3.5 → bindsight-0.3.7}/envs/README.md +0 -0
  506. {bindsight-0.3.5 → bindsight-0.3.7}/examples/README.md +0 -0
  507. {bindsight-0.3.5 → bindsight-0.3.7}/examples/benchmark_held_out.yaml +0 -0
  508. {bindsight-0.3.5 → bindsight-0.3.7}/examples/demo/config.yaml +0 -0
  509. {bindsight-0.3.5 → bindsight-0.3.7}/examples/provenance_join.yaml +0 -0
  510. {bindsight-0.3.5 → bindsight-0.3.7}/examples/tcga_luad.yaml +0 -0
  511. {bindsight-0.3.5 → bindsight-0.3.7}/overrides/main.html +0 -0
  512. {bindsight-0.3.5 → bindsight-0.3.7}/paper/LICENSE +0 -0
  513. {bindsight-0.3.5 → bindsight-0.3.7}/scripts/assemble_manifest.py +0 -0
  514. {bindsight-0.3.5 → bindsight-0.3.7}/scripts/build_surfaceome_extension.py +0 -0
  515. {bindsight-0.3.5 → bindsight-0.3.7}/scripts/build_surfy_gene_map.py +0 -0
  516. {bindsight-0.3.5 → bindsight-0.3.7}/scripts/build_surfy_list.py +0 -0
  517. {bindsight-0.3.5 → bindsight-0.3.7}/scripts/check_pinned_environment.py +0 -0
  518. {bindsight-0.3.5 → bindsight-0.3.7}/scripts/make_og_image.py +0 -0
  519. {bindsight-0.3.5 → bindsight-0.3.7}/scripts/run_deg.py +0 -0
  520. {bindsight-0.3.5 → bindsight-0.3.7}/scripts/run_design.py +0 -0
  521. {bindsight-0.3.5 → bindsight-0.3.7}/scripts/run_discover.py +0 -0
  522. {bindsight-0.3.5 → bindsight-0.3.7}/scripts/run_rank.py +0 -0
  523. {bindsight-0.3.5 → bindsight-0.3.7}/scripts/run_report.py +0 -0
  524. {bindsight-0.3.5 → bindsight-0.3.7}/scripts/run_validate.py +0 -0
  525. {bindsight-0.3.5 → bindsight-0.3.7}/tests/README.md +0 -0
  526. {bindsight-0.3.5 → bindsight-0.3.7}/tests/__init__.py +0 -0
  527. {bindsight-0.3.5 → bindsight-0.3.7}/tests/conftest.py +0 -0
  528. {bindsight-0.3.5 → bindsight-0.3.7}/tests/fixtures/embeddings/binders_esm2_t6.npy +0 -0
  529. {bindsight-0.3.5 → bindsight-0.3.7}/tests/fixtures/gtex/gtex_median_subset.gct +0 -0
  530. {bindsight-0.3.5 → bindsight-0.3.7}/tests/fixtures/plddt/AF-TEST1-F1-model_v6.cif +0 -0
  531. {bindsight-0.3.5 → bindsight-0.3.7}/tests/fixtures/surface_bind/.commit_sha +0 -0
  532. {bindsight-0.3.5 → bindsight-0.3.7}/tests/fixtures/surface_bind/sites/P04626/sites.json +0 -0
  533. {bindsight-0.3.5 → bindsight-0.3.7}/tests/fixtures/tiny_counts.tsv +0 -0
  534. {bindsight-0.3.5 → bindsight-0.3.7}/tests/fixtures/tiny_design.tsv +0 -0
  535. {bindsight-0.3.5 → bindsight-0.3.7}/tests/fixtures/topology/P04626.topology.json +0 -0
  536. {bindsight-0.3.5 → bindsight-0.3.7}/tests/test_alphafolddb_client.py +0 -0
  537. {bindsight-0.3.5 → bindsight-0.3.7}/tests/test_assemble_manifest.py +0 -0
  538. {bindsight-0.3.5 → bindsight-0.3.7}/tests/test_backend_capability.py +0 -0
  539. {bindsight-0.3.5 → bindsight-0.3.7}/tests/test_bare_install.py +0 -0
  540. {bindsight-0.3.5 → bindsight-0.3.7}/tests/test_benchmark.py +0 -0
  541. {bindsight-0.3.5 → bindsight-0.3.7}/tests/test_benchmark_indication.py +0 -0
  542. {bindsight-0.3.5 → bindsight-0.3.7}/tests/test_benchmark_outcomes.py +0 -0
  543. {bindsight-0.3.5 → bindsight-0.3.7}/tests/test_benchmark_panel.py +0 -0
  544. {bindsight-0.3.5 → bindsight-0.3.7}/tests/test_benchmark_statistics.py +0 -0
  545. {bindsight-0.3.5 → bindsight-0.3.7}/tests/test_benchmark_study.py +0 -0
  546. {bindsight-0.3.5 → bindsight-0.3.7}/tests/test_cache_key_scope.py +0 -0
  547. {bindsight-0.3.5 → bindsight-0.3.7}/tests/test_calibration_staging.py +0 -0
  548. {bindsight-0.3.5 → bindsight-0.3.7}/tests/test_caveats.py +0 -0
  549. {bindsight-0.3.5 → bindsight-0.3.7}/tests/test_cbioportal.py +0 -0
  550. {bindsight-0.3.5 → bindsight-0.3.7}/tests/test_cheap_profile.py +0 -0
  551. {bindsight-0.3.5 → bindsight-0.3.7}/tests/test_check_pinned_environment.py +0 -0
  552. {bindsight-0.3.5 → bindsight-0.3.7}/tests/test_cli.py +0 -0
  553. {bindsight-0.3.5 → bindsight-0.3.7}/tests/test_cli_demo_and_report.py +0 -0
  554. {bindsight-0.3.5 → bindsight-0.3.7}/tests/test_cli_doctor.py +0 -0
  555. {bindsight-0.3.5 → bindsight-0.3.7}/tests/test_config.py +0 -0
  556. {bindsight-0.3.5 → bindsight-0.3.7}/tests/test_contrast.py +0 -0
  557. {bindsight-0.3.5 → bindsight-0.3.7}/tests/test_correctness_regressions.py +0 -0
  558. {bindsight-0.3.5 → bindsight-0.3.7}/tests/test_cost.py +0 -0
  559. {bindsight-0.3.5 → bindsight-0.3.7}/tests/test_counted_self_claims.py +0 -0
  560. {bindsight-0.3.5 → bindsight-0.3.7}/tests/test_css_cascade.py +0 -0
  561. {bindsight-0.3.5 → bindsight-0.3.7}/tests/test_deg_runner.py +0 -0
  562. {bindsight-0.3.5 → bindsight-0.3.7}/tests/test_demo_e2e.py +0 -0
  563. {bindsight-0.3.5 → bindsight-0.3.7}/tests/test_design_target_chain.py +0 -0
  564. {bindsight-0.3.5 → bindsight-0.3.7}/tests/test_designers_validators.py +0 -0
  565. {bindsight-0.3.5 → bindsight-0.3.7}/tests/test_developability.py +0 -0
  566. {bindsight-0.3.5 → bindsight-0.3.7}/tests/test_docs_binder_viewer.py +0 -0
  567. {bindsight-0.3.5 → bindsight-0.3.7}/tests/test_docs_results.py +0 -0
  568. {bindsight-0.3.5 → bindsight-0.3.7}/tests/test_docs_results_generator.py +0 -0
  569. {bindsight-0.3.5 → bindsight-0.3.7}/tests/test_documented_commands.py +0 -0
  570. {bindsight-0.3.5 → bindsight-0.3.7}/tests/test_embeddings.py +0 -0
  571. {bindsight-0.3.5 → bindsight-0.3.7}/tests/test_empty_is_not_absent.py +0 -0
  572. {bindsight-0.3.5 → bindsight-0.3.7}/tests/test_ensembl_uniprot.py +0 -0
  573. {bindsight-0.3.5 → bindsight-0.3.7}/tests/test_enumerations_match_their_source.py +0 -0
  574. {bindsight-0.3.5 → bindsight-0.3.7}/tests/test_eval_set.py +0 -0
  575. {bindsight-0.3.5 → bindsight-0.3.7}/tests/test_export_ro_crate.py +0 -0
  576. {bindsight-0.3.5 → bindsight-0.3.7}/tests/test_failure_taxonomy.py +0 -0
  577. {bindsight-0.3.5 → bindsight-0.3.7}/tests/test_gdc.py +0 -0
  578. {bindsight-0.3.5 → bindsight-0.3.7}/tests/test_gpu_capacity_claim.py +0 -0
  579. {bindsight-0.3.5 → bindsight-0.3.7}/tests/test_gtex.py +0 -0
  580. {bindsight-0.3.5 → bindsight-0.3.7}/tests/test_job_exec_retention.py +0 -0
  581. {bindsight-0.3.5 → bindsight-0.3.7}/tests/test_joss_paper_sections.py +0 -0
  582. {bindsight-0.3.5 → bindsight-0.3.7}/tests/test_kaggle_kernel.py +0 -0
  583. {bindsight-0.3.5 → bindsight-0.3.7}/tests/test_licensing_review.py +0 -0
  584. {bindsight-0.3.5 → bindsight-0.3.7}/tests/test_manifest.py +0 -0
  585. {bindsight-0.3.5 → bindsight-0.3.7}/tests/test_no_streamlit.py +0 -0
  586. {bindsight-0.3.5 → bindsight-0.3.7}/tests/test_notebook_helpers.py +0 -0
  587. {bindsight-0.3.5 → bindsight-0.3.7}/tests/test_open_targets_client.py +0 -0
  588. {bindsight-0.3.5 → bindsight-0.3.7}/tests/test_package_imports.py +0 -0
  589. {bindsight-0.3.5 → bindsight-0.3.7}/tests/test_plddt.py +0 -0
  590. {bindsight-0.3.5 → bindsight-0.3.7}/tests/test_provenance_join_artifact.py +0 -0
  591. {bindsight-0.3.5 → bindsight-0.3.7}/tests/test_rediscovery.py +0 -0
  592. {bindsight-0.3.5 → bindsight-0.3.7}/tests/test_remote_job_durability.py +0 -0
  593. {bindsight-0.3.5 → bindsight-0.3.7}/tests/test_report_lazy_import.py +0 -0
  594. {bindsight-0.3.5 → bindsight-0.3.7}/tests/test_runners_colab.py +0 -0
  595. {bindsight-0.3.5 → bindsight-0.3.7}/tests/test_runners_mock.py +0 -0
  596. {bindsight-0.3.5 → bindsight-0.3.7}/tests/test_showcase.py +0 -0
  597. {bindsight-0.3.5 → bindsight-0.3.7}/tests/test_silent_success.py +0 -0
  598. {bindsight-0.3.5 → bindsight-0.3.7}/tests/test_snakemake_dag.py +0 -0
  599. {bindsight-0.3.5 → bindsight-0.3.7}/tests/test_study_nulls.py +0 -0
  600. {bindsight-0.3.5 → bindsight-0.3.7}/tests/test_surface_bind.py +0 -0
  601. {bindsight-0.3.5 → bindsight-0.3.7}/tests/test_surfy_offline.py +0 -0
  602. {bindsight-0.3.5 → bindsight-0.3.7}/tests/test_surfy_vendored.py +0 -0
  603. {bindsight-0.3.5 → bindsight-0.3.7}/tests/test_target_chain_artifact.py +0 -0
  604. {bindsight-0.3.5 → bindsight-0.3.7}/tests/test_third_party_plugins.py +0 -0
  605. {bindsight-0.3.5 → bindsight-0.3.7}/tests/test_topology.py +0 -0
  606. {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.5"
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 bioRxiv manuscript's PDF.
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/biorxiv/manuscript.tex and attaches the PDF to every release.
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/biorxiv/*.pdf
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 + bioRxiv + GitHub stars is a real moat for academic users.
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