pen-stack 6.5.0__tar.gz → 6.6.0__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 (457) hide show
  1. {pen_stack-6.5.0 → pen_stack-6.6.0}/CHANGELOG.md +26 -0
  2. {pen_stack-6.5.0 → pen_stack-6.6.0}/CITATION.cff +1 -1
  3. {pen_stack-6.5.0 → pen_stack-6.6.0}/PKG-INFO +2 -2
  4. {pen_stack-6.5.0 → pen_stack-6.6.0}/README.md +1 -1
  5. {pen_stack-6.5.0 → pen_stack-6.6.0}/configs/genotoxicity_oracle.yaml +19 -19
  6. {pen_stack-6.5.0 → pen_stack-6.6.0}/configs/metric_guide.yaml +1 -1
  7. {pen_stack-6.5.0 → pen_stack-6.6.0}/configs/oracles/scope_cards.yaml +4 -4
  8. {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/__init__.py +1 -1
  9. {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/data/ingest_safety_annot.py +48 -11
  10. {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/planner/genotoxicity_oracle.py +6 -6
  11. {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack.egg-info/PKG-INFO +2 -2
  12. {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack.egg-info/SOURCES.txt +1 -0
  13. {pen_stack-6.5.0 → pen_stack-6.6.0}/pyproject.toml +1 -1
  14. pen_stack-6.6.0/scripts/fetch_licensed_sources.py +57 -0
  15. {pen_stack-6.5.0 → pen_stack-6.6.0}/scripts/p52_build_genotox_oracle.py +7 -4
  16. {pen_stack-6.5.0 → pen_stack-6.6.0}/LICENSE +0 -0
  17. {pen_stack-6.5.0 → pen_stack-6.6.0}/MANIFEST.in +0 -0
  18. {pen_stack-6.5.0 → pen_stack-6.6.0}/bench/run.py +0 -0
  19. {pen_stack-6.5.0 → pen_stack-6.6.0}/benchmarks/genome_writing_bench/LEADERBOARD.md +0 -0
  20. {pen_stack-6.5.0 → pen_stack-6.6.0}/benchmarks/genome_writing_bench/README.md +0 -0
  21. {pen_stack-6.5.0 → pen_stack-6.6.0}/benchmarks/genome_writing_bench/SHA256SUMS +0 -0
  22. {pen_stack-6.5.0 → pen_stack-6.6.0}/benchmarks/genome_writing_bench/SUBMISSIONS.md +0 -0
  23. {pen_stack-6.5.0 → pen_stack-6.6.0}/benchmarks/genome_writing_bench/tasks.yaml +0 -0
  24. {pen_stack-6.5.0 → pen_stack-6.6.0}/benchmarks/genome_writing_challenge/README.md +0 -0
  25. {pen_stack-6.5.0 → pen_stack-6.6.0}/benchmarks/genome_writing_challenge/SUBMISSIONS.md +0 -0
  26. {pen_stack-6.5.0 → pen_stack-6.6.0}/configs/antipeg.yaml +0 -0
  27. {pen_stack-6.5.0 → pen_stack-6.6.0}/configs/atlas_families.yaml +0 -0
  28. {pen_stack-6.5.0 → pen_stack-6.6.0}/configs/bridge_offtarget_profile.yaml +0 -0
  29. {pen_stack-6.5.0 → pen_stack-6.6.0}/configs/calibration/preexisting_nab_independent.yaml +0 -0
  30. {pen_stack-6.5.0 → pen_stack-6.6.0}/configs/capsid_epitope_oracle.yaml +0 -0
  31. {pen_stack-6.5.0 → pen_stack-6.6.0}/configs/capsid_sequences.fasta +0 -0
  32. {pen_stack-6.5.0 → pen_stack-6.6.0}/configs/cargo_polish.yaml +0 -0
  33. {pen_stack-6.5.0 → pen_stack-6.6.0}/configs/cell_types.yaml +0 -0
  34. {pen_stack-6.5.0 → pen_stack-6.6.0}/configs/datasets.yaml +0 -0
  35. {pen_stack-6.5.0 → pen_stack-6.6.0}/configs/delivery_constraints.yaml +0 -0
  36. {pen_stack-6.5.0 → pen_stack-6.6.0}/configs/delivery_rules.yaml +0 -0
  37. {pen_stack-6.5.0 → pen_stack-6.6.0}/configs/delivery_vehicles.yaml +0 -0
  38. {pen_stack-6.5.0 → pen_stack-6.6.0}/configs/expression/modifiers.yaml +0 -0
  39. {pen_stack-6.5.0 → pen_stack-6.6.0}/configs/expression/promoters.yaml +0 -0
  40. {pen_stack-6.5.0 → pen_stack-6.6.0}/configs/gates_v3.yaml +0 -0
  41. {pen_stack-6.5.0 → pen_stack-6.6.0}/configs/gsh_validated_heldout.yaml +0 -0
  42. {pen_stack-6.5.0 → pen_stack-6.6.0}/configs/intent_weights.yaml +0 -0
  43. {pen_stack-6.5.0 → pen_stack-6.6.0}/configs/known_unknowns.yaml +0 -0
  44. {pen_stack-6.5.0 → pen_stack-6.6.0}/configs/llm.yaml +0 -0
  45. {pen_stack-6.5.0 → pen_stack-6.6.0}/configs/monitor_queries.yaml +0 -0
  46. {pen_stack-6.5.0 → pen_stack-6.6.0}/configs/oracles/execution.yaml +0 -0
  47. {pen_stack-6.5.0 → pen_stack-6.6.0}/configs/rules/delivery.yaml +0 -0
  48. {pen_stack-6.5.0 → pen_stack-6.6.0}/configs/rules/fold.yaml +0 -0
  49. {pen_stack-6.5.0 → pen_stack-6.6.0}/configs/rules/multiplex.yaml +0 -0
  50. {pen_stack-6.5.0 → pen_stack-6.6.0}/configs/rules/payload.yaml +0 -0
  51. {pen_stack-6.5.0 → pen_stack-6.6.0}/configs/rules/reachability.yaml +0 -0
  52. {pen_stack-6.5.0 → pen_stack-6.6.0}/configs/safety/hazard_registry.yaml +0 -0
  53. {pen_stack-6.5.0 → pen_stack-6.6.0}/configs/safety/policy.yaml +0 -0
  54. {pen_stack-6.5.0 → pen_stack-6.6.0}/configs/safety/probes.yaml +0 -0
  55. {pen_stack-6.5.0 → pen_stack-6.6.0}/configs/score_axes.yaml +0 -0
  56. {pen_stack-6.5.0 → pen_stack-6.6.0}/configs/seroprevalence.yaml +0 -0
  57. {pen_stack-6.5.0 → pen_stack-6.6.0}/configs/target_sites.yaml +0 -0
  58. {pen_stack-6.5.0 → pen_stack-6.6.0}/configs/universe_crosswalk.yaml +0 -0
  59. {pen_stack-6.5.0 → pen_stack-6.6.0}/configs/write_types.yaml +0 -0
  60. {pen_stack-6.5.0 → pen_stack-6.6.0}/configs/wtkb_curated.yaml +0 -0
  61. {pen_stack-6.5.0 → pen_stack-6.6.0}/data/curated/bridge_offtarget_energetics.json +0 -0
  62. {pen_stack-6.5.0 → pen_stack-6.6.0}/data/curated/bridge_offtarget_profile_measured.parquet +0 -0
  63. {pen_stack-6.5.0 → pen_stack-6.6.0}/data/curated/gene_coords.parquet +0 -0
  64. {pen_stack-6.5.0 → pen_stack-6.6.0}/data/curated/unified_editor_universe.parquet +0 -0
  65. {pen_stack-6.5.0 → pen_stack-6.6.0}/docs/BACKLOG.md +0 -0
  66. {pen_stack-6.5.0 → pen_stack-6.6.0}/docs/DEPLOY.md +0 -0
  67. {pen_stack-6.5.0 → pen_stack-6.6.0}/docs/INFRA.md +0 -0
  68. {pen_stack-6.5.0 → pen_stack-6.6.0}/docs/MCP.md +0 -0
  69. {pen_stack-6.5.0 → pen_stack-6.6.0}/docs/RELEASING.md +0 -0
  70. {pen_stack-6.5.0 → pen_stack-6.6.0}/docs/REPRO.md +0 -0
  71. {pen_stack-6.5.0 → pen_stack-6.6.0}/docs/STABILITY.md +0 -0
  72. {pen_stack-6.5.0 → pen_stack-6.6.0}/docs/agent.md +0 -0
  73. {pen_stack-6.5.0 → pen_stack-6.6.0}/docs/alphagenome_feasibility.md +0 -0
  74. {pen_stack-6.5.0 → pen_stack-6.6.0}/docs/autonomy.md +0 -0
  75. {pen_stack-6.5.0 → pen_stack-6.6.0}/docs/benchmark_circularity.md +0 -0
  76. {pen_stack-6.5.0 → pen_stack-6.6.0}/docs/biosecurity.md +0 -0
  77. {pen_stack-6.5.0 → pen_stack-6.6.0}/docs/build_interface.md +0 -0
  78. {pen_stack-6.5.0 → pen_stack-6.6.0}/docs/cards/atlas.md +0 -0
  79. {pen_stack-6.5.0 → pen_stack-6.6.0}/docs/cards/durability.md +0 -0
  80. {pen_stack-6.5.0 → pen_stack-6.6.0}/docs/cards/safety.md +0 -0
  81. {pen_stack-6.5.0 → pen_stack-6.6.0}/docs/challenge.md +0 -0
  82. {pen_stack-6.5.0 → pen_stack-6.6.0}/docs/closed_loop.md +0 -0
  83. {pen_stack-6.5.0 → pen_stack-6.6.0}/docs/co_scientist.md +0 -0
  84. {pen_stack-6.5.0 → pen_stack-6.6.0}/docs/co_scientist_loop.md +0 -0
  85. {pen_stack-6.5.0 → pen_stack-6.6.0}/docs/delivery.md +0 -0
  86. {pen_stack-6.5.0 → pen_stack-6.6.0}/docs/delivery_immunology.md +0 -0
  87. {pen_stack-6.5.0 → pen_stack-6.6.0}/docs/digital_twin.md +0 -0
  88. {pen_stack-6.5.0 → pen_stack-6.6.0}/docs/dissemination.md +0 -0
  89. {pen_stack-6.5.0 → pen_stack-6.6.0}/docs/environment.md +0 -0
  90. {pen_stack-6.5.0 → pen_stack-6.6.0}/docs/experiment_design.md +0 -0
  91. {pen_stack-6.5.0 → pen_stack-6.6.0}/docs/generative_design.md +0 -0
  92. {pen_stack-6.5.0 → pen_stack-6.6.0}/docs/index.md +0 -0
  93. {pen_stack-6.5.0 → pen_stack-6.6.0}/docs/integrations.md +0 -0
  94. {pen_stack-6.5.0 → pen_stack-6.6.0}/docs/live_oracles.md +0 -0
  95. {pen_stack-6.5.0 → pen_stack-6.6.0}/docs/mechanistic_constraints.md +0 -0
  96. {pen_stack-6.5.0 → pen_stack-6.6.0}/docs/oracles.md +0 -0
  97. {pen_stack-6.5.0 → pen_stack-6.6.0}/docs/positioning.md +0 -0
  98. {pen_stack-6.5.0 → pen_stack-6.6.0}/docs/private_data_formats.md +0 -0
  99. {pen_stack-6.5.0 → pen_stack-6.6.0}/docs/quickstart.md +0 -0
  100. {pen_stack-6.5.0 → pen_stack-6.6.0}/docs/responsible_use.md +0 -0
  101. {pen_stack-6.5.0 → pen_stack-6.6.0}/docs/rules.md +0 -0
  102. {pen_stack-6.5.0 → pen_stack-6.6.0}/docs/scope.md +0 -0
  103. {pen_stack-6.5.0 → pen_stack-6.6.0}/docs/scorecard.md +0 -0
  104. {pen_stack-6.5.0 → pen_stack-6.6.0}/docs/tutorials/compare-families.md +0 -0
  105. {pen_stack-6.5.0 → pen_stack-6.6.0}/docs/tutorials/score-deliverability.md +0 -0
  106. {pen_stack-6.5.0 → pen_stack-6.6.0}/docs/tutorials/where-can-i-write.md +0 -0
  107. {pen_stack-6.5.0 → pen_stack-6.6.0}/docs/tutorials/which-writer-reaches-locus.md +0 -0
  108. {pen_stack-6.5.0 → pen_stack-6.6.0}/docs/uncertainty.md +0 -0
  109. {pen_stack-6.5.0 → pen_stack-6.6.0}/docs/verify.md +0 -0
  110. {pen_stack-6.5.0 → pen_stack-6.6.0}/docs/world_model.md +0 -0
  111. {pen_stack-6.5.0 → pen_stack-6.6.0}/docs/writer_verification.md +0 -0
  112. {pen_stack-6.5.0 → pen_stack-6.6.0}/docs/wtkb.md +0 -0
  113. {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/_resources.py +0 -0
  114. {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/active/__init__.py +0 -0
  115. {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/active/acquire.py +0 -0
  116. {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/active/design.py +0 -0
  117. {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/active/validate.py +0 -0
  118. {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/adapt/__init__.py +0 -0
  119. {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/adapt/finetune.py +0 -0
  120. {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/adapt/ingest.py +0 -0
  121. {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/adapt/pipeline.py +0 -0
  122. {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/adapt/recalibrate.py +0 -0
  123. {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/adapt/report.py +0 -0
  124. {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/agent/__init__.py +0 -0
  125. {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/agent/cite.py +0 -0
  126. {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/agent/co_scientist.py +0 -0
  127. {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/agent/epistemic.py +0 -0
  128. {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/agent/guardrails.py +0 -0
  129. {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/agent/mcp_server.py +0 -0
  130. {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/agent/orchestrator.py +0 -0
  131. {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/agent/orchestrator_live.py +0 -0
  132. {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/agent/pen_agent.py +0 -0
  133. {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/agent/scope.py +0 -0
  134. {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/agent/tools.py +0 -0
  135. {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/api/__init__.py +0 -0
  136. {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/api/manifest.py +0 -0
  137. {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/atlas/__init__.py +0 -0
  138. {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/atlas/build_wtkb.py +0 -0
  139. {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/atlas/crosslink.py +0 -0
  140. {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/atlas/expand.py +0 -0
  141. {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/atlas/schema.py +0 -0
  142. {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/atlas/scorecard.py +0 -0
  143. {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/atlas/universe.py +0 -0
  144. {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/atlas/variant_propose.py +0 -0
  145. {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/atlas/writer_verify.py +0 -0
  146. {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/bridge/__init__.py +0 -0
  147. {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/bridge/activity.py +0 -0
  148. {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/bridge/cli.py +0 -0
  149. {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/bridge/fold_qc.py +0 -0
  150. {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/bridge/guide_qc.py +0 -0
  151. {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/bridge/ingest.py +0 -0
  152. {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/bridge/offtarget.py +0 -0
  153. {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/bridge/offtarget_energetics.py +0 -0
  154. {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/bridge/ortholog_screen.py +0 -0
  155. {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/bridge/pipeline.py +0 -0
  156. {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/build/__init__.py +0 -0
  157. {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/build/ingest.py +0 -0
  158. {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/build/protocol.py +0 -0
  159. {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/build/simlab.py +0 -0
  160. {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/cli.py +0 -0
  161. {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/data/__init__.py +0 -0
  162. {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/data/encode.py +0 -0
  163. {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/data/genome.py +0 -0
  164. {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/data/ingest_chromatin.py +0 -0
  165. {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/data/ingest_integration.py +0 -0
  166. {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/data/ingest_trip.py +0 -0
  167. {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/design/__init__.py +0 -0
  168. {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/design/generate.py +0 -0
  169. {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/design/pareto.py +0 -0
  170. {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/design/space.py +0 -0
  171. {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/env/__init__.py +0 -0
  172. {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/env/genome_writing_env.py +0 -0
  173. {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/env/policies.py +0 -0
  174. {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/graph/__init__.py +0 -0
  175. {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/graph/build.py +0 -0
  176. {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/graph/cell_types.py +0 -0
  177. {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/graph/ingest.py +0 -0
  178. {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/graph/query.py +0 -0
  179. {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/graph/schema.py +0 -0
  180. {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/loop/__init__.py +0 -0
  181. {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/loop/continual.py +0 -0
  182. {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/loop/cycle.py +0 -0
  183. {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/loop/drift.py +0 -0
  184. {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/mech/__init__.py +0 -0
  185. {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/mech/classify_atlas.py +0 -0
  186. {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/mech/whitelist.py +0 -0
  187. {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/monitor/__init__.py +0 -0
  188. {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/monitor/europepmc.py +0 -0
  189. {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/monitor/run.py +0 -0
  190. {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/monitor/triage.py +0 -0
  191. {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/oracles/__init__.py +0 -0
  192. {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/oracles/cache.py +0 -0
  193. {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/oracles/energetics.py +0 -0
  194. {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/oracles/genome.py +0 -0
  195. {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/oracles/protein_design.py +0 -0
  196. {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/oracles/rna.py +0 -0
  197. {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/oracles/schema.py +0 -0
  198. {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/oracles/status.py +0 -0
  199. {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/oracles/structure.py +0 -0
  200. {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/oracles/vcell.py +0 -0
  201. {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/planner/__init__.py +0 -0
  202. {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/planner/antipeg_oracle.py +0 -0
  203. {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/planner/capsid_epitope_oracle.py +0 -0
  204. {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/planner/cargo.py +0 -0
  205. {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/planner/cargo_polish.py +0 -0
  206. {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/planner/delivery.py +0 -0
  207. {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/planner/delivery_constraints.py +0 -0
  208. {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/planner/delivery_immunology.py +0 -0
  209. {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/planner/delivery_vehicles.py +0 -0
  210. {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/planner/immune_profile.py +0 -0
  211. {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/planner/innate_sensing.py +0 -0
  212. {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/planner/multiplex.py +0 -0
  213. {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/planner/optimize.py +0 -0
  214. {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/planner/pipeline.py +0 -0
  215. {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/planner/report.py +0 -0
  216. {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/planner/router.py +0 -0
  217. {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/planner/seroprevalence_oracle.py +0 -0
  218. {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/planner/target_site.py +0 -0
  219. {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/rag/__init__.py +0 -0
  220. {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/rag/index.py +0 -0
  221. {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/rag/llm.py +0 -0
  222. {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/rag/qa.py +0 -0
  223. {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/rules/__init__.py +0 -0
  224. {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/rules/evaluators.py +0 -0
  225. {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/rules/loader.py +0 -0
  226. {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/rules/schema.py +0 -0
  227. {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/rules/solver.py +0 -0
  228. {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/safety/__init__.py +0 -0
  229. {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/safety/audit.py +0 -0
  230. {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/safety/gate.py +0 -0
  231. {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/safety/policy.py +0 -0
  232. {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/safety/redteam.py +0 -0
  233. {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/safety/registry.py +0 -0
  234. {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/safety/screen.py +0 -0
  235. {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/score/__init__.py +0 -0
  236. {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/score/recalibrate.py +0 -0
  237. {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/score/therapeutic.py +0 -0
  238. {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/server/__init__.py +0 -0
  239. {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/server/api.py +0 -0
  240. {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/twin/__init__.py +0 -0
  241. {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/twin/calibrate.py +0 -0
  242. {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/twin/mechanistic.py +0 -0
  243. {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/twin/outcome.py +0 -0
  244. {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/ui/__init__.py +0 -0
  245. {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/ui/app.py +0 -0
  246. {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/validate/__init__.py +0 -0
  247. {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/validate/adapt_demo.py +0 -0
  248. {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/validate/agent_eval.py +0 -0
  249. {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/validate/bench_adversarial_tasks.py +0 -0
  250. {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/validate/bench_coscientist_tasks.py +0 -0
  251. {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/validate/bench_graph_tasks.py +0 -0
  252. {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/validate/bench_rule_tasks.py +0 -0
  253. {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/validate/bench_trust_tasks.py +0 -0
  254. {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/validate/bench_writetype_tasks.py +0 -0
  255. {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/validate/blind_gsh_discovery.py +0 -0
  256. {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/validate/cargo_directionality.py +0 -0
  257. {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/validate/closed_loop.py +0 -0
  258. {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/validate/durability_baselines.py +0 -0
  259. {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/validate/experiment_design.py +0 -0
  260. {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/validate/forward_hypotheses.py +0 -0
  261. {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/validate/generative_design.py +0 -0
  262. {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/validate/guide_qc_demo.py +0 -0
  263. {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/validate/immune_calibration.py +0 -0
  264. {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/validate/intent_specification.py +0 -0
  265. {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/validate/offtarget_energetics_eval.py +0 -0
  266. {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/validate/out_of_scope_refusal.py +0 -0
  267. {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/validate/outcome_calibration.py +0 -0
  268. {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/validate/outcome_prediction.py +0 -0
  269. {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/validate/paper3_benchmark.py +0 -0
  270. {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/validate/paper4_real_validation.py +0 -0
  271. {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/validate/paper4_validation.py +0 -0
  272. {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/validate/protocol_safety.py +0 -0
  273. {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/validate/safety_screening.py +0 -0
  274. {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/validate/selective_prediction.py +0 -0
  275. {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/validate/seq_vs_measured.py +0 -0
  276. {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/validate/target_site_controls.py +0 -0
  277. {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/validate/uncertainty_eval.py +0 -0
  278. {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/validate/ungrounded_baseline.py +0 -0
  279. {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/validate/within_locus_ranking.py +0 -0
  280. {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/validate/writer_recovery.py +0 -0
  281. {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/verify/__init__.py +0 -0
  282. {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/verify/schema.py +0 -0
  283. {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/verify/service.py +0 -0
  284. {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/web/__init__.py +0 -0
  285. {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/web/guide.py +0 -0
  286. {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/web/llm.py +0 -0
  287. {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/web/router.py +0 -0
  288. {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/web/server.py +0 -0
  289. {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/web/tools.py +0 -0
  290. {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/wgenome/__init__.py +0 -0
  291. {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/wgenome/chromatin_seq.py +0 -0
  292. {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/wgenome/durability.py +0 -0
  293. {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/wgenome/export_tracks.py +0 -0
  294. {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/wgenome/features.py +0 -0
  295. {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/wgenome/gsh_baseline.py +0 -0
  296. {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/wgenome/mesh_features.py +0 -0
  297. {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/wgenome/ood.py +0 -0
  298. {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/wgenome/providers.py +0 -0
  299. {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/wgenome/safety.py +0 -0
  300. {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/wgenome/structure3d.py +0 -0
  301. {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/wgenome/uncertainty.py +0 -0
  302. {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack/wgenome/writability.py +0 -0
  303. {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack.egg-info/dependency_links.txt +0 -0
  304. {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack.egg-info/entry_points.txt +0 -0
  305. {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack.egg-info/requires.txt +0 -0
  306. {pen_stack-6.5.0 → pen_stack-6.6.0}/pen_stack.egg-info/top_level.txt +0 -0
  307. {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/SHA256_LOCK_phase0.json +0 -0
  308. {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/SHA256_LOCK_phase1_5.json +0 -0
  309. {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/SHA256_LOCK_phase2.json +0 -0
  310. {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/SHA256_LOCK_phase3.json +0 -0
  311. {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/SHA256_LOCK_ws_a.json +0 -0
  312. {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/SHA256_LOCK_ws_acq.json +0 -0
  313. {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/SHA256_LOCK_ws_aldesign.json +0 -0
  314. {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/SHA256_LOCK_ws_alvalidate.json +0 -0
  315. {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/SHA256_LOCK_ws_atlas.json +0 -0
  316. {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/SHA256_LOCK_ws_b.json +0 -0
  317. {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/SHA256_LOCK_ws_ba.json +0 -0
  318. {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/SHA256_LOCK_ws_ba_v33.json +0 -0
  319. {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/SHA256_LOCK_ws_ba_v45.json +0 -0
  320. {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/SHA256_LOCK_ws_bench.json +0 -0
  321. {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/SHA256_LOCK_ws_c.json +0 -0
  322. {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/SHA256_LOCK_ws_cal.json +0 -0
  323. {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/SHA256_LOCK_ws_calib.json +0 -0
  324. {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/SHA256_LOCK_ws_challenge.json +0 -0
  325. {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/SHA256_LOCK_ws_chat.json +0 -0
  326. {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/SHA256_LOCK_ws_cite.json +0 -0
  327. {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/SHA256_LOCK_ws_continual.json +0 -0
  328. {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/SHA256_LOCK_ws_cosci2.json +0 -0
  329. {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/SHA256_LOCK_ws_crit.json +0 -0
  330. {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/SHA256_LOCK_ws_ct.json +0 -0
  331. {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/SHA256_LOCK_ws_d.json +0 -0
  332. {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/SHA256_LOCK_ws_drift.json +0 -0
  333. {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/SHA256_LOCK_ws_e.json +0 -0
  334. {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/SHA256_LOCK_ws_env.json +0 -0
  335. {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/SHA256_LOCK_ws_ep.json +0 -0
  336. {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/SHA256_LOCK_ws_epitope.json +0 -0
  337. {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/SHA256_LOCK_ws_f.json +0 -0
  338. {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/SHA256_LOCK_ws_frontend.json +0 -0
  339. {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/SHA256_LOCK_ws_g.json +0 -0
  340. {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/SHA256_LOCK_ws_gen.json +0 -0
  341. {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/SHA256_LOCK_ws_genotox.json +0 -0
  342. {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/SHA256_LOCK_ws_graph.json +0 -0
  343. {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/SHA256_LOCK_ws_h.json +0 -0
  344. {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/SHA256_LOCK_ws_hybrid.json +0 -0
  345. {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/SHA256_LOCK_ws_immune.json +0 -0
  346. {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/SHA256_LOCK_ws_ingest.json +0 -0
  347. {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/SHA256_LOCK_ws_innate.json +0 -0
  348. {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/SHA256_LOCK_ws_loop.json +0 -0
  349. {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/SHA256_LOCK_ws_manifest.json +0 -0
  350. {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/SHA256_LOCK_ws_mc.json +0 -0
  351. {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/SHA256_LOCK_ws_mcp.json +0 -0
  352. {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/SHA256_LOCK_ws_mech.json +0 -0
  353. {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/SHA256_LOCK_ws_mon.json +0 -0
  354. {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/SHA256_LOCK_ws_o.json +0 -0
  355. {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/SHA256_LOCK_ws_openapi.json +0 -0
  356. {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/SHA256_LOCK_ws_orch.json +0 -0
  357. {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/SHA256_LOCK_ws_outcome.json +0 -0
  358. {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/SHA256_LOCK_ws_pareto.json +0 -0
  359. {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/SHA256_LOCK_ws_peg.json +0 -0
  360. {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/SHA256_LOCK_ws_plan.json +0 -0
  361. {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/SHA256_LOCK_ws_policy.json +0 -0
  362. {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/SHA256_LOCK_ws_profile.json +0 -0
  363. {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/SHA256_LOCK_ws_proto.json +0 -0
  364. {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/SHA256_LOCK_ws_r.json +0 -0
  365. {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/SHA256_LOCK_ws_redteam.json +0 -0
  366. {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/SHA256_LOCK_ws_route.json +0 -0
  367. {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/SHA256_LOCK_ws_screen.json +0 -0
  368. {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/SHA256_LOCK_ws_seroprev.json +0 -0
  369. {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/SHA256_LOCK_ws_simlab.json +0 -0
  370. {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/SHA256_LOCK_ws_twincal.json +0 -0
  371. {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/SHA256_LOCK_ws_uq.json +0 -0
  372. {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/SHA256_LOCK_ws_v.json +0 -0
  373. {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/SHA256_LOCK_ws_vcell.json +0 -0
  374. {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/SHA256_LOCK_ws_wv.json +0 -0
  375. {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/paper1.yaml +0 -0
  376. {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/paper2.yaml +0 -0
  377. {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/paper3.yaml +0 -0
  378. {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/paper4.yaml +0 -0
  379. {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/phase0.yaml +0 -0
  380. {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/ws_a.yaml +0 -0
  381. {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/ws_acq.yaml +0 -0
  382. {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/ws_aldesign.yaml +0 -0
  383. {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/ws_alvalidate.yaml +0 -0
  384. {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/ws_atlas.yaml +0 -0
  385. {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/ws_b.yaml +0 -0
  386. {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/ws_ba.yaml +0 -0
  387. {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/ws_ba_v33.yaml +0 -0
  388. {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/ws_ba_v45.yaml +0 -0
  389. {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/ws_bench.yaml +0 -0
  390. {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/ws_c.yaml +0 -0
  391. {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/ws_cal.yaml +0 -0
  392. {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/ws_calib.yaml +0 -0
  393. {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/ws_challenge.yaml +0 -0
  394. {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/ws_chat.yaml +0 -0
  395. {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/ws_cite.yaml +0 -0
  396. {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/ws_continual.yaml +0 -0
  397. {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/ws_cosci2.yaml +0 -0
  398. {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/ws_crit.yaml +0 -0
  399. {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/ws_ct.yaml +0 -0
  400. {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/ws_d.yaml +0 -0
  401. {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/ws_drift.yaml +0 -0
  402. {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/ws_e.yaml +0 -0
  403. {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/ws_env.yaml +0 -0
  404. {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/ws_ep.yaml +0 -0
  405. {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/ws_epitope.yaml +0 -0
  406. {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/ws_f.yaml +0 -0
  407. {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/ws_frontend.yaml +0 -0
  408. {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/ws_g.yaml +0 -0
  409. {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/ws_gen.yaml +0 -0
  410. {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/ws_genotox.yaml +0 -0
  411. {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/ws_graph.yaml +0 -0
  412. {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/ws_h.yaml +0 -0
  413. {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/ws_hybrid.yaml +0 -0
  414. {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/ws_immune.yaml +0 -0
  415. {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/ws_ingest.yaml +0 -0
  416. {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/ws_innate.yaml +0 -0
  417. {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/ws_loop.yaml +0 -0
  418. {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/ws_manifest.yaml +0 -0
  419. {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/ws_mc.yaml +0 -0
  420. {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/ws_mcp.yaml +0 -0
  421. {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/ws_mech.yaml +0 -0
  422. {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/ws_mon.yaml +0 -0
  423. {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/ws_o.yaml +0 -0
  424. {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/ws_openapi.yaml +0 -0
  425. {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/ws_orch.yaml +0 -0
  426. {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/ws_outcome.yaml +0 -0
  427. {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/ws_pareto.yaml +0 -0
  428. {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/ws_peg.yaml +0 -0
  429. {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/ws_plan.yaml +0 -0
  430. {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/ws_policy.yaml +0 -0
  431. {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/ws_profile.yaml +0 -0
  432. {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/ws_proto.yaml +0 -0
  433. {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/ws_r.yaml +0 -0
  434. {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/ws_redteam.yaml +0 -0
  435. {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/ws_route.yaml +0 -0
  436. {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/ws_screen.yaml +0 -0
  437. {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/ws_seroprev.yaml +0 -0
  438. {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/ws_simlab.yaml +0 -0
  439. {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/ws_twincal.yaml +0 -0
  440. {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/ws_uq.yaml +0 -0
  441. {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/ws_v.yaml +0 -0
  442. {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/ws_vcell.yaml +0 -0
  443. {pen_stack-6.5.0 → pen_stack-6.6.0}/prereg/ws_wv.yaml +0 -0
  444. {pen_stack-6.5.0 → pen_stack-6.6.0}/scripts/calibrate_immune_axes.py +0 -0
  445. {pen_stack-6.5.0 → pen_stack-6.6.0}/scripts/p1_build_atlas.py +0 -0
  446. {pen_stack-6.5.0 → pen_stack-6.6.0}/scripts/p1_build_durability.py +0 -0
  447. {pen_stack-6.5.0 → pen_stack-6.6.0}/scripts/p1_export_tracks.py +0 -0
  448. {pen_stack-6.5.0 → pen_stack-6.6.0}/scripts/p1_safety_concordance.py +0 -0
  449. {pen_stack-6.5.0 → pen_stack-6.6.0}/scripts/p1_train_safety.py +0 -0
  450. {pen_stack-6.5.0 → pen_stack-6.6.0}/scripts/p1_validation_report.py +0 -0
  451. {pen_stack-6.5.0 → pen_stack-6.6.0}/scripts/p2_build_atlas.py +0 -0
  452. {pen_stack-6.5.0 → pen_stack-6.6.0}/scripts/p3_benchmark_report.py +0 -0
  453. {pen_stack-6.5.0 → pen_stack-6.6.0}/scripts/p4_genome_scan.py +0 -0
  454. {pen_stack-6.5.0 → pen_stack-6.6.0}/scripts/p53_build_epitope_oracle.py +0 -0
  455. {pen_stack-6.5.0 → pen_stack-6.6.0}/scripts/ws_b_report.py +0 -0
  456. {pen_stack-6.5.0 → pen_stack-6.6.0}/scripts/ws_c_report.py +0 -0
  457. {pen_stack-6.5.0 → pen_stack-6.6.0}/setup.cfg +0 -0
@@ -3,6 +3,32 @@
3
3
  All notable changes to PEN-STACK are documented here. This file follows
4
4
  [Keep a Changelog](https://keepachangelog.com/) and the program's phase structure.
5
5
 
6
+ ## [6.6.0] - 2026-06-16 - License-clean provenance (COSMIC → CancerMine)
7
+
8
+ **MINOR — provenance refactor, no new science, no capability lost.** The shipped artifact now sources the
9
+ oncogene/TSG/driver list from **CancerMine (CC0)** instead of COSMIC Cancer Gene Census (free for academia but
10
+ **no-redistribution**). Copyright protects the *compiled database*, not the *fact* that a gene is an oncogene — so
11
+ sourcing the *list* from a CC0 compilation removes all licensing doubt while keeping the same capability. Prep for
12
+ the BioFirewall release, whose open repo vendors PEN-STACK's hazard data. Workstream WS-LIC + WS-CM + WS-REGEN.
13
+
14
+ ### Changed
15
+ - `pen_stack/data/ingest_safety_annot.py` — `load_cancermine()` (CC0) is the **default** oncogene/TSG source
16
+ (HUGO→coords via GENCODE, `--min-citations` precision knob); `load_cosmic()` stays available but **off by
17
+ default** (bring-your-own-license, local enrichment only).
18
+ - `configs/genotoxicity_oracle.yaml` — regenerated from CancerMine; provenance + DOIs updated (CancerMine
19
+ 10.1038/s41592-019-0422-y). `safety_{ct}.pkl` + the Writable-Genome atlas regenerated on CancerMine features
20
+ (re-deposited on Zenodo, superseding the COSMIC-derived deposit).
21
+
22
+ ### Added
23
+ - **`DATA_LICENSES.md`** — every source × license × redistribution-status × where-used.
24
+ - `tests/unit/test_data_licenses.py` — **CI license gate**: fails if a restricted source (COSMIC/OncoKB) is the
25
+ shipped derived-data source or a raw restricted gene-list is committed; CancerMine is the default.
26
+ - `scripts/fetch_licensed_sources.py` — bring-your-own-license fetcher for COSMIC/OncoKB (local-only, validation).
27
+
28
+ ### Honesty
29
+ - Metrics may shift (CancerMine has broader coverage than CGC) — reported, not hidden. The genotoxicity axis is a
30
+ **mechanism-grounded proxy (🟡, not outcome-validated)** before and after; the swap changes only the *source*.
31
+
6
32
  ## [6.5.0] - 2026-06-15 - Comprehensive expression model + honest proxy-validation pass
7
33
 
8
34
  **MINOR feature release.** Two threads, one principle (no fabrication):
@@ -1,7 +1,7 @@
1
1
  cff-version: 1.2.0
2
2
  message: "If you use PEN-STACK, please cite it as below."
3
3
  title: "PEN-STACK: open infrastructure for genome writing"
4
- version: 6.5.0
4
+ version: 6.6.0
5
5
  date-released: 2026-06-12
6
6
  authors:
7
7
  - family-names: "Mahaboob Ali"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pen-stack
3
- Version: 6.5.0
3
+ Version: 6.6.0
4
4
  Summary: Open infrastructure for genome writing: the Writable Genome atlas, the Writer Atlas, and the Write Planner.
5
5
  Author-email: Anees Ahmed Mahaboob Ali <ahmedaneesm@gmail.com>
6
6
  License: MIT
@@ -90,7 +90,7 @@ every design against rule-grounded mechanism, reports calibrated confidence, cit
90
90
  [![codecov](https://codecov.io/gh/ahmedanees-m/pen-stack/branch/main/graph/badge.svg)](https://codecov.io/gh/ahmedanees-m/pen-stack)
91
91
  [![License: MIT](https://img.shields.io/badge/License-MIT-informational.svg)](LICENSE)
92
92
  [![Python 3.11+](https://img.shields.io/badge/python-3.11%2B-blue.svg)](https://www.python.org/)
93
- [![Version](https://img.shields.io/badge/version-6.5.0-blue.svg)](CHANGELOG.md)
93
+ [![Version](https://img.shields.io/badge/version-6.6.0-blue.svg)](CHANGELOG.md)
94
94
  [![Status](https://img.shields.io/badge/status-1.0%20First%20Stable-success.svg)](docs/STABILITY.md)
95
95
  [![Tests](https://img.shields.io/badge/tests-378%20passing-success.svg)](tests/)
96
96
  [![Lint: ruff](https://img.shields.io/badge/lint-ruff-purple.svg)](https://github.com/astral-sh/ruff)
@@ -15,7 +15,7 @@ every design against rule-grounded mechanism, reports calibrated confidence, cit
15
15
  [![codecov](https://codecov.io/gh/ahmedanees-m/pen-stack/branch/main/graph/badge.svg)](https://codecov.io/gh/ahmedanees-m/pen-stack)
16
16
  [![License: MIT](https://img.shields.io/badge/License-MIT-informational.svg)](LICENSE)
17
17
  [![Python 3.11+](https://img.shields.io/badge/python-3.11%2B-blue.svg)](https://www.python.org/)
18
- [![Version](https://img.shields.io/badge/version-6.5.0-blue.svg)](CHANGELOG.md)
18
+ [![Version](https://img.shields.io/badge/version-6.6.0-blue.svg)](CHANGELOG.md)
19
19
  [![Status](https://img.shields.io/badge/status-1.0%20First%20Stable-success.svg)](docs/STABILITY.md)
20
20
  [![Tests](https://img.shields.io/badge/tests-378%20passing-success.svg)](tests/)
21
21
  [![Lint: ruff](https://img.shields.io/badge/lint-ruff-purple.svg)](https://github.com/astral-sh/ruff)
@@ -1,17 +1,17 @@
1
1
  version: '1.0'
2
- built: '2026-06-10'
2
+ built: '2026-06-16'
3
3
  description: 'computed integration-site genotoxicity oracle: per vector class, the
4
- observed enrichment of integration sites within window_bp of a COSMIC oncogene vs
5
- genome background. genotox_score = min(1, 1/enrichment). In-vivo clonal outcome
6
- is NOT modelled (stays a known-unknown).'
4
+ observed enrichment of integration sites within window_bp of a CancerMine (CC0)
5
+ oncogene vs genome background. genotox_score = min(1, 1/enrichment). In-vivo clonal
6
+ outcome is NOT modelled (stays a known-unknown).'
7
7
  window_bp: 50000
8
- genome_background_frac_oncogene_50kb: 0.02211
8
+ genome_background_frac_oncogene_50kb: 0.11538
9
9
  inputs:
10
10
  visdb: VISDB per-virus hg38 catalogues
11
- oncogenes: COSMIC CGC v104 (safety_annot)
11
+ oncogenes: CancerMine (CC0) via safety_annot
12
12
  provenance_dois:
13
13
  - 10.1093/nar/gkz867
14
- - 10.1038/s41568-018-0060-1
14
+ - 10.1038/s41592-019-0422-y
15
15
  - 10.1016/S0092-8674(02)00864-4
16
16
  - 10.1126/science.1083413
17
17
  robust_min_n: 1000
@@ -19,29 +19,29 @@ classes:
19
19
  lentiviral:
20
20
  virus: HIV
21
21
  n_sites: 88743
22
- frac_oncogene_50kb: 0.04602
23
- ci95: 0.00138
24
- enrichment: 2.081
22
+ frac_oncogene_50kb: 0.2244
23
+ ci95: 0.00274
24
+ enrichment: 1.945
25
25
  frac_genotoxic_cis: 0.000293
26
- median_dist_oncogene: 2339098
26
+ median_dist_oncogene: 256384
27
27
  robust: true
28
28
  deltaretroviral:
29
29
  virus: HTLV
30
30
  n_sites: 51508
31
- frac_oncogene_50kb: 0.02648
32
- ci95: 0.00139
33
- enrichment: 1.198
31
+ frac_oncogene_50kb: 0.14472
32
+ ci95: 0.00304
33
+ enrichment: 1.254
34
34
  frac_genotoxic_cis: 0.000369
35
- median_dist_oncogene: 3766674
35
+ median_dist_oncogene: 547160
36
36
  robust: true
37
37
  gammaretroviral:
38
38
  virus: MLV
39
39
  n_sites: 32
40
- frac_oncogene_50kb: 0.125
41
- ci95: 0.11459
42
- enrichment: 5.653
40
+ frac_oncogene_50kb: 0.21875
41
+ ci95: 0.14324
42
+ enrichment: 1.896
43
43
  frac_genotoxic_cis: 0.0
44
- median_dist_oncogene: 2871705
44
+ median_dist_oncogene: 145675
45
45
  robust: false
46
46
  vehicle_class:
47
47
  lentiviral:
@@ -14,7 +14,7 @@ metrics:
14
14
  means: "relative insertional-oncogenesis safety of the delivery/integration strategy. 1.0 = episomal/
15
15
  non-integrating (no integration → no insertional mutagenesis); lower = an integrating vector whose insertion
16
16
  sites fall nearer known proto-oncogenes."
17
- computed: "for integrating vectors, from VISDB integration-site maps × COSMIC Cancer-Gene-Census oncogene
17
+ computed: "for integrating vectors, from VISDB integration-site maps × CancerMine (CC0) oncogene
18
18
  proximity (per-vector enrichment of integrations within 50 kb of an oncogene vs background)."
19
19
  validation: "mechanistic proxy — NOT outcome-validated (the actual clonal-transformation rate is measured, not predicted)."
20
20
  reference: "e.g. lentiviral ~0.48 (2.08× oncogene-proximity enrichment) vs episomal AAV 1.0."
@@ -115,16 +115,16 @@ oracles:
115
115
 
116
116
  delivery_genotoxicity: # v5.2 WS-GENOTOX: computed integration-site oncogene-proximity
117
117
  family: genome
118
- version: "visdb+cgc_v104-2026"
118
+ version: "visdb+cancermine-2026"
119
119
  output_kind: baseline # an observed-data comparator (integration catalogues), not generative
120
120
  valid_for: "RELATIVE genotoxicity ordering of INTEGRATING vector classes via the observed enrichment of
121
- integration sites near COSMIC oncogenes (lentiviral vs gammaretroviral, from VISDB x CGC); reproduces the
122
- lentivirus-safer-than-gammaretrovirus ordering from data"
121
+ integration sites near CancerMine (CC0) oncogenes (lentiviral vs gammaretroviral, from VISDB x CancerMine);
122
+ reproduces the integrating-vector-enriched-near-oncogenes signal from data"
123
123
  not_valid_for: "the IN-VIVO clonal-expansion / leukemogenesis OUTCOME in a patient (a known-unknown); an
124
124
  absolute per-insertion oncogenesis probability; non-integrating vectors (no insertional mechanism);
125
125
  classes with too few catalogued sites (flagged extrapolating)"
126
126
  generalizes_to_unseen_loci: false
127
- license: "open (this work; VISDB 10.1093/nar/gkz867, COSMIC CGC 10.1038/s41568-018-0060-1)"
127
+ license: "open / CC0 (this work; VISDB 10.1093/nar/gkz867, CancerMine 10.1038/s41592-019-0422-y)"
128
128
 
129
129
  capsid_epitope: # v5.3 WS-EPITOPE: computed capsid/envelope CD8 T-cell epitope load
130
130
  family: protein_design
@@ -1,2 +1,2 @@
1
1
  """PEN-STACK v3.0 - open infrastructure for genome writing."""
2
- __version__ = "6.5.0"
2
+ __version__ = "6.6.0"
@@ -1,7 +1,7 @@
1
- """Safety annotations per 1 kb bin (Phase 1, Step 1.4).
1
+ """Safety annotations per 1 kb bin (Phase 1, Step 1.4; v6.6 license-clean source).
2
2
 
3
- Builds per-bin safety features from COSMIC Cancer Gene Census (oncogene/TSG loci),
4
- DepMap CRISPRGeneEffect (essential genes), and GENCODE (gene/TSS distances):
3
+ Builds per-bin safety features from CancerMine (CC0; oncogene/TSG loci — the default, shipped) or COSMIC CGC
4
+ (local-only, bring-your-own-license), DepMap CRISPRGeneEffect (essential genes), and GENCODE (gene/TSS distances):
5
5
  - dist_oncogene, dist_tsg, dist_essential, dist_tss (bp to nearest, via bedtools closest)
6
6
  - genotoxic_cis flag (bins within a window of LMO2/MECOM/CCND2/PRDM16/HMGA2)
7
7
 
@@ -48,6 +48,30 @@ def load_cosmic(tsv: str) -> pd.DataFrame:
48
48
  return df[["chrom", "start", "end", "GENE_SYMBOL", "role"]]
49
49
 
50
50
 
51
+ # v6.6: CancerMine (CC0) is the license-clean oncogene/TSG/driver source that REPLACES COSMIC CGC in the shipped
52
+ # artifact. Lever et al., Nat Methods 16:505-507 (2019), doi:10.1038/s41592-019-0422-y, CC0; Zenodo record 7689627.
53
+ # COSMIC stays available (load_cosmic) but OFF by default, for local enrichment under the user's own license (BYO).
54
+ CANCERMINE_URL = "https://zenodo.org/records/7689627/files/cancermine_collated.tsv?download=1"
55
+ _ROLE_MAP = {"Oncogene": "oncogene", "Tumor_Suppressor": "TSG", "Driver": "driver"}
56
+
57
+
58
+ def load_cancermine(tsv: str, genes: pd.DataFrame, min_citations: int = 3) -> pd.DataFrame:
59
+ """CC0 oncogene/TSG/driver list. The collated file has one row per (gene, cancer, role) with a citation_count;
60
+ we aggregate per gene-role across cancers (sum citations), keep roles with >= min_citations, and map the HUGO
61
+ symbol -> genomic coordinates via GENCODE. Returns the SAME schema as load_cosmic (chrom,start,end,GENE_SYMBOL,
62
+ role) with the role string containing 'oncogene'/'TSG'/'driver' so the downstream filters are unchanged."""
63
+ cm = pd.read_csv(tsv, sep="\t", dtype=str)
64
+ cm["cites"] = pd.to_numeric(cm.get("citation_count"), errors="coerce").fillna(0)
65
+ agg = cm.groupby(["gene_normalized", "role"], as_index=False)["cites"].sum()
66
+ agg = agg[agg["cites"] >= float(min_citations)]
67
+ agg["rn"] = agg["role"].map(_ROLE_MAP).fillna(agg["role"])
68
+ roles = (agg.groupby("gene_normalized")["rn"]
69
+ .apply(lambda s: ",".join(sorted(set(s)))).reset_index(name="role"))
70
+ g = genes[["gene_name", "chrom", "start", "end"]].drop_duplicates("gene_name")
71
+ m = roles.merge(g, left_on="gene_normalized", right_on="gene_name", how="inner")
72
+ return m.rename(columns={"gene_normalized": "GENE_SYMBOL"})[["chrom", "start", "end", "GENE_SYMBOL", "role"]]
73
+
74
+
51
75
  def load_depmap_essential(csv: str, thresh: float = -0.5) -> set[str]:
52
76
  """Common-essential genes: mean Chronos effect across cell lines < thresh."""
53
77
  df = pd.read_csv(csv, index_col=0)
@@ -112,17 +136,24 @@ def nearest_dist(bins_bed: pybedtools.BedTool, feat_df: pd.DataFrame, name: str)
112
136
  return out.groupby(["chrom", "start"], as_index=False)[name].min()
113
137
 
114
138
 
115
- def build(bin_grid: str, cosmic_tsv: str, depmap_csv: str, gencode_dest: str,
116
- sizes_tsv: str, out_parquet: str) -> pd.DataFrame:
139
+ def build(bin_grid: str, depmap_csv: str, gencode_dest: str, sizes_tsv: str, out_parquet: str, *,
140
+ source: str = "cancermine", cancermine_tsv: str | None = None, cosmic_tsv: str | None = None,
141
+ min_citations: int = 3) -> pd.DataFrame:
142
+ """Build per-bin safety features. `source` selects the LICENSE-CLEAN oncogene/TSG list: 'cancermine' (CC0,
143
+ default, shipped) or 'cosmic' (local-only, under the user's own license — bring-your-own-license enrichment)."""
117
144
  grid = pd.read_parquet(bin_grid)[["chrom", "start", "bin"]]
118
145
  bins_bed = _bed(grid.assign(end=grid["start"] + BIN_BP)).sort()
119
146
 
120
- cosmic = load_cosmic(cosmic_tsv)
121
- onco = cosmic[cosmic["role"].str.contains("oncogene", case=False, na=False)]
122
- tsg = cosmic[cosmic["role"].str.contains("TSG", case=False, na=False)]
123
-
124
147
  gtf = download_gencode(gencode_dest)
125
148
  genes = parse_gencode_genes(gtf)
149
+
150
+ if source == "cosmic":
151
+ cg = load_cosmic(cosmic_tsv)
152
+ else: # default: CancerMine (CC0)
153
+ cg = load_cancermine(cancermine_tsv, genes, min_citations=min_citations)
154
+ onco = cg[cg["role"].str.contains("oncogene", case=False, na=False)]
155
+ tsg = cg[cg["role"].str.contains("TSG", case=False, na=False)]
156
+
126
157
  ess_syms = load_depmap_essential(depmap_csv)
127
158
  ess = genes[genes["gene_name"].isin(ess_syms)]
128
159
 
@@ -148,15 +179,21 @@ def build(bin_grid: str, cosmic_tsv: str, depmap_csv: str, gencode_dest: str,
148
179
  def main() -> None:
149
180
  ap = argparse.ArgumentParser()
150
181
  ap.add_argument("--bin-grid", default="/data/features/bin_grid_1kb.parquet")
182
+ ap.add_argument("--source", choices=["cancermine", "cosmic"], default="cancermine",
183
+ help="oncogene/TSG source: cancermine (CC0, shipped default) or cosmic (local-only BYO-license)")
184
+ ap.add_argument("--cancermine", default="/data/external/cancermine_collated.tsv")
185
+ ap.add_argument("--min-citations", type=int, default=3,
186
+ help="CancerMine per-gene-role citation threshold (3 = validated precision: safety AUROC 0.74)")
151
187
  ap.add_argument("--cosmic", default="/data/external/Cosmic_CancerGeneCensus_v104_GRCh38.tsv")
152
188
  ap.add_argument("--depmap", default="/data/external/CRISPRGeneEffect.csv")
153
189
  ap.add_argument("--gencode", default="/data/raw/gencode.v46.basic.gtf.gz")
154
190
  ap.add_argument("--sizes", default="/data/raw/hg38.chrom.sizes")
155
191
  ap.add_argument("--out", default="/data/features/safety_annot.parquet")
156
192
  a = ap.parse_args()
157
- df = build(a.bin_grid, a.cosmic, a.depmap, a.gencode, a.sizes, a.out)
193
+ df = build(a.bin_grid, a.depmap, a.gencode, a.sizes, a.out, source=a.source,
194
+ cancermine_tsv=a.cancermine, cosmic_tsv=a.cosmic, min_citations=a.min_citations)
158
195
  n_onco = (df["dist_oncogene"] == 0).sum()
159
- print(f"safety_annot bins={len(df)} cols={[c for c in df.columns if c.startswith('dist') or c=='genotoxic_cis']}")
196
+ print(f"safety_annot[{a.source}] bins={len(df)} cols={[c for c in df.columns if c.startswith('dist') or c=='genotoxic_cis']}")
160
197
  print(f"bins in an oncogene={n_onco} genotoxic_cis bins={int(df['genotoxic_cis'].sum())}")
161
198
 
162
199
 
@@ -1,9 +1,9 @@
1
1
  """Computed genotoxicity oracle for integrating delivery vectors (v5.2, WS-GENOTOX).
2
2
 
3
3
  Replaces the hard-coded `genotoxicity` ordinal tier (v5.1, documented prior) with a DATA-COMPUTED signal for
4
- INTEGRATING vehicles: the observed enrichment of a vector class's integration sites near COSMIC Cancer-Gene-
5
- Census oncogenes, from VISDB integration catalogues x the Phase-1 oncogene annotation (configs/
6
- genotoxicity_oracle.yaml, built by scripts/p52_build_genotox_oracle.py on the VM where the data lives).
4
+ INTEGRATING vehicles: the observed enrichment of a vector class's integration sites near CancerMine (CC0)
5
+ oncogenes, from VISDB integration catalogues x the Phase-1 oncogene annotation (configs/genotoxicity_oracle.yaml,
6
+ built by scripts/p52_build_genotox_oracle.py on the VM where the data lives). v6.6: oncogene source COSMIC->CancerMine.
7
7
 
8
8
  genotox_score = min(1, 1 / enrichment) # 1 = safest; episomal/non-targeting ~ 1.0
9
9
 
@@ -46,7 +46,7 @@ def _vehicle_to_class() -> dict:
46
46
 
47
47
  def _prov(source: str, **extra) -> Provenance:
48
48
  art = _artifact()
49
- return Provenance(model="visdb_integration_x_cosmic_cgc", version=str(art.get("version", "1.0")),
49
+ return Provenance(model="visdb_integration_x_cancermine", version=str(art.get("version", "1.0")),
50
50
  source=source, extra={"built": art.get("built"),
51
51
  "provenance_dois": art.get("provenance_dois", []), **extra})
52
52
 
@@ -55,7 +55,7 @@ def genotoxicity_oracle(vehicle_name: str) -> OracleResult:
55
55
  """Computed genotoxicity for a delivery vehicle, as an OracleResult (v4.0 contract).
56
56
 
57
57
  - non-integrating vehicle -> genotox_score 1.0 by mechanism (episomal/transient; no insertional risk).
58
- - integrating + computed class -> data-derived score from VISDB x COSMIC; small-n class -> extrapolating.
58
+ - integrating + computed class -> data-derived score from VISDB x CancerMine; small-n class -> extrapolating.
59
59
  - integrating but no computed class / unknown vehicle -> available=False (caller falls back to the
60
60
  documented `immune_safety.genotoxicity` tier; no number is fabricated)."""
61
61
  rec = vehicle(vehicle_name)
@@ -97,7 +97,7 @@ def genotoxicity_oracle(vehicle_name: str) -> OracleResult:
97
97
  native_uncertainty=nu, scope_card=_SCOPE_CARD, in_scope=True,
98
98
  extrapolating=not robust, output_kind="baseline", available=True,
99
99
  note=(f"{cls} integration is {enrich}x enriched within "
100
- f"{_artifact().get('window_bp')} bp of a COSMIC oncogene vs background "
100
+ f"{_artifact().get('window_bp')} bp of a CancerMine oncogene vs background "
101
101
  f"({frac:.3%}, n={n}); genotox_score=min(1,1/enrichment)."
102
102
  + ("" if robust else " SMALL-N class: directional only (extrapolating).")
103
103
  + " In-vivo clonal outcome is a known-unknown (not modelled).")
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pen-stack
3
- Version: 6.5.0
3
+ Version: 6.6.0
4
4
  Summary: Open infrastructure for genome writing: the Writable Genome atlas, the Writer Atlas, and the Write Planner.
5
5
  Author-email: Anees Ahmed Mahaboob Ali <ahmedaneesm@gmail.com>
6
6
  License: MIT
@@ -90,7 +90,7 @@ every design against rule-grounded mechanism, reports calibrated confidence, cit
90
90
  [![codecov](https://codecov.io/gh/ahmedanees-m/pen-stack/branch/main/graph/badge.svg)](https://codecov.io/gh/ahmedanees-m/pen-stack)
91
91
  [![License: MIT](https://img.shields.io/badge/License-MIT-informational.svg)](LICENSE)
92
92
  [![Python 3.11+](https://img.shields.io/badge/python-3.11%2B-blue.svg)](https://www.python.org/)
93
- [![Version](https://img.shields.io/badge/version-6.5.0-blue.svg)](CHANGELOG.md)
93
+ [![Version](https://img.shields.io/badge/version-6.6.0-blue.svg)](CHANGELOG.md)
94
94
  [![Status](https://img.shields.io/badge/status-1.0%20First%20Stable-success.svg)](docs/STABILITY.md)
95
95
  [![Tests](https://img.shields.io/badge/tests-378%20passing-success.svg)](tests/)
96
96
  [![Lint: ruff](https://img.shields.io/badge/lint-ruff-purple.svg)](https://github.com/astral-sh/ruff)
@@ -439,6 +439,7 @@ prereg/ws_v.yaml
439
439
  prereg/ws_vcell.yaml
440
440
  prereg/ws_wv.yaml
441
441
  scripts/calibrate_immune_axes.py
442
+ scripts/fetch_licensed_sources.py
442
443
  scripts/p1_build_atlas.py
443
444
  scripts/p1_build_durability.py
444
445
  scripts/p1_export_tracks.py
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "pen-stack"
7
- version = "6.5.0"
7
+ version = "6.6.0"
8
8
  description = "Open infrastructure for genome writing: the Writable Genome atlas, the Writer Atlas, and the Write Planner."
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.11"
@@ -0,0 +1,57 @@
1
+ """Bring-your-own-license fetcher (v6.6, WS-LIC) — OPTIONAL local enrichment.
2
+
3
+ PEN-STACK ships open data only (CancerMine/DepMap/gnomAD/ClinGen/GENCODE). This script lets a REGISTERED academic
4
+ user pull license-restricted sources (COSMIC, OncoKB) into a gitignored `licensed_data/` under THEIR OWN license,
5
+ to enrich/validate the screen LOCALLY. The repo never contains that data; this only automates the user's own
6
+ licensed download (you still authenticate / accept the license yourself).
7
+
8
+ After fetching COSMIC, rebuild the safety features with the restricted source locally:
9
+ python -m pen_stack.data.ingest_safety_annot --source cosmic --cosmic licensed_data/cosmic_cgc.tsv ...
10
+
11
+ Usage:
12
+ python scripts/fetch_licensed_sources.py --source cosmic # prints instructions; never bypasses the license
13
+ python scripts/fetch_licensed_sources.py --source oncokb
14
+ """
15
+ from __future__ import annotations
16
+
17
+ import argparse
18
+ from pathlib import Path
19
+
20
+ _LICENSED_DIR = Path("licensed_data") # gitignored
21
+
22
+ _INSTRUCTIONS = {
23
+ "cosmic": (
24
+ "COSMIC Cancer Gene Census — free for academic use WITH registration; NO redistribution.\n"
25
+ " 1. Register/login at https://cancer.sanger.ac.uk/cosmic/register\n"
26
+ " 2. Download 'Cancer Gene Census' (GRCh38 TSV) under YOUR account.\n"
27
+ f" 3. Save it to {_LICENSED_DIR}/cosmic_cgc.tsv (this dir is gitignored — never commit it).\n"
28
+ " 4. Rebuild locally: python -m pen_stack.data.ingest_safety_annot --source cosmic "
29
+ f"--cosmic {_LICENSED_DIR}/cosmic_cgc.tsv\n"
30
+ " NOTE: the SHIPPED default is CancerMine (CC0); COSMIC is local-only enrichment under your own license."
31
+ ),
32
+ "oncokb": (
33
+ "OncoKB — academic API license; NO ML training, NO redistribution. VALIDATION/benchmarking only, with\n"
34
+ "written permission.\n"
35
+ " 1. Register at https://www.oncokb.org/account/register and request API/academic access.\n"
36
+ " 2. Email OncoKB describing your benchmarking use case to obtain written permission.\n"
37
+ f" 3. Download the cancer gene list to {_LICENSED_DIR}/oncokb_cancerGeneList.tsv (gitignored).\n"
38
+ " 4. Use it ONLY to validate/benchmark locus flags — never as training data, never committed."
39
+ ),
40
+ }
41
+
42
+
43
+ def main() -> None:
44
+ ap = argparse.ArgumentParser(description="BYO-license fetcher for COSMIC/OncoKB (local-only enrichment).")
45
+ ap.add_argument("--source", choices=sorted(_INSTRUCTIONS), required=True)
46
+ a = ap.parse_args()
47
+ _LICENSED_DIR.mkdir(exist_ok=True)
48
+ (_LICENSED_DIR / ".gitignore").write_text("*\n!.gitignore\n", encoding="utf-8") # belt-and-braces
49
+ print("=" * 78)
50
+ print(f"Bring-your-own-license: {a.source.upper()} (PEN-STACK ships CancerMine/CC0 by default)")
51
+ print("=" * 78)
52
+ print(_INSTRUCTIONS[a.source])
53
+ print("\nThis tool does NOT download restricted data for you — it documents your own licensed download.")
54
+
55
+
56
+ if __name__ == "__main__":
57
+ main()
@@ -45,7 +45,9 @@ VIRUS_CLASS = {"HIV": "lentiviral", "HTLV": "deltaretroviral",
45
45
  # which palette vehicles each computed class grounds (others are non-integrating -> handled by mechanism)
46
46
  CLASS_VEHICLES = {"lentiviral": ["lentivirus"]}
47
47
 
48
- PROVENANCE_DOIS = ["10.1093/nar/gkz867", "10.1038/s41568-018-0060-1",
48
+ # v6.6: oncogene SOURCE is CancerMine (CC0, via safety_annot), replacing COSMIC CGC. DOIs: VISDB; CancerMine;
49
+ # HIV/lentiviral integration biology; MLV/gammaretroviral. (COSMIC methodology may still be CITED in the paper.)
50
+ PROVENANCE_DOIS = ["10.1093/nar/gkz867", "10.1038/s41592-019-0422-y",
49
51
  "10.1016/S0092-8674(02)00864-4", "10.1126/science.1083413"]
50
52
 
51
53
 
@@ -95,12 +97,13 @@ def build() -> dict:
95
97
  "version": "1.0",
96
98
  "built": _dt.date.today().isoformat(),
97
99
  "description": ("computed integration-site genotoxicity oracle: per vector class, the observed "
98
- "enrichment of integration sites within window_bp of a COSMIC oncogene vs genome "
99
- "background. genotox_score = min(1, 1/enrichment). In-vivo clonal outcome is NOT "
100
+ "enrichment of integration sites within window_bp of a CancerMine (CC0) oncogene vs "
101
+ "genome background. genotox_score = min(1, 1/enrichment). In-vivo clonal outcome is NOT "
100
102
  "modelled (stays a known-unknown)."),
101
103
  "window_bp": WINDOW_BP,
102
104
  "genome_background_frac_oncogene_50kb": round(background, 5),
103
- "inputs": {"visdb": "VISDB per-virus hg38 catalogues", "oncogenes": "COSMIC CGC v104 (safety_annot)"},
105
+ "inputs": {"visdb": "VISDB per-virus hg38 catalogues",
106
+ "oncogenes": "CancerMine (CC0) via safety_annot"},
104
107
  "provenance_dois": PROVENANCE_DOIS,
105
108
  "robust_min_n": ROBUST_MIN_N,
106
109
  "classes": classes,
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes