pen-stack 6.4.3__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 (458) hide show
  1. {pen_stack-6.4.3 → pen_stack-6.6.0}/CHANGELOG.md +56 -0
  2. {pen_stack-6.4.3 → pen_stack-6.6.0}/CITATION.cff +1 -1
  3. {pen_stack-6.4.3 → pen_stack-6.6.0}/PKG-INFO +2 -2
  4. {pen_stack-6.4.3 → pen_stack-6.6.0}/README.md +1 -1
  5. pen_stack-6.6.0/configs/calibration/preexisting_nab_independent.yaml +25 -0
  6. pen_stack-6.6.0/configs/expression/modifiers.yaml +59 -0
  7. pen_stack-6.6.0/configs/expression/promoters.yaml +52 -0
  8. {pen_stack-6.4.3 → pen_stack-6.6.0}/configs/genotoxicity_oracle.yaml +19 -19
  9. {pen_stack-6.4.3 → pen_stack-6.6.0}/configs/metric_guide.yaml +13 -6
  10. {pen_stack-6.4.3 → pen_stack-6.6.0}/configs/oracles/scope_cards.yaml +4 -4
  11. {pen_stack-6.4.3 → pen_stack-6.6.0}/pen_stack/__init__.py +1 -1
  12. {pen_stack-6.4.3 → pen_stack-6.6.0}/pen_stack/data/ingest_safety_annot.py +48 -11
  13. {pen_stack-6.4.3 → pen_stack-6.6.0}/pen_stack/planner/genotoxicity_oracle.py +6 -6
  14. pen_stack-6.6.0/pen_stack/twin/mechanistic.py +119 -0
  15. {pen_stack-6.4.3 → pen_stack-6.6.0}/pen_stack.egg-info/PKG-INFO +2 -2
  16. {pen_stack-6.4.3 → pen_stack-6.6.0}/pen_stack.egg-info/SOURCES.txt +5 -0
  17. {pen_stack-6.4.3 → pen_stack-6.6.0}/pyproject.toml +1 -1
  18. pen_stack-6.6.0/scripts/calibrate_immune_axes.py +116 -0
  19. pen_stack-6.6.0/scripts/fetch_licensed_sources.py +57 -0
  20. {pen_stack-6.4.3 → pen_stack-6.6.0}/scripts/p52_build_genotox_oracle.py +7 -4
  21. pen_stack-6.4.3/pen_stack/twin/mechanistic.py +0 -37
  22. {pen_stack-6.4.3 → pen_stack-6.6.0}/LICENSE +0 -0
  23. {pen_stack-6.4.3 → pen_stack-6.6.0}/MANIFEST.in +0 -0
  24. {pen_stack-6.4.3 → pen_stack-6.6.0}/bench/run.py +0 -0
  25. {pen_stack-6.4.3 → pen_stack-6.6.0}/benchmarks/genome_writing_bench/LEADERBOARD.md +0 -0
  26. {pen_stack-6.4.3 → pen_stack-6.6.0}/benchmarks/genome_writing_bench/README.md +0 -0
  27. {pen_stack-6.4.3 → pen_stack-6.6.0}/benchmarks/genome_writing_bench/SHA256SUMS +0 -0
  28. {pen_stack-6.4.3 → pen_stack-6.6.0}/benchmarks/genome_writing_bench/SUBMISSIONS.md +0 -0
  29. {pen_stack-6.4.3 → pen_stack-6.6.0}/benchmarks/genome_writing_bench/tasks.yaml +0 -0
  30. {pen_stack-6.4.3 → pen_stack-6.6.0}/benchmarks/genome_writing_challenge/README.md +0 -0
  31. {pen_stack-6.4.3 → pen_stack-6.6.0}/benchmarks/genome_writing_challenge/SUBMISSIONS.md +0 -0
  32. {pen_stack-6.4.3 → pen_stack-6.6.0}/configs/antipeg.yaml +0 -0
  33. {pen_stack-6.4.3 → pen_stack-6.6.0}/configs/atlas_families.yaml +0 -0
  34. {pen_stack-6.4.3 → pen_stack-6.6.0}/configs/bridge_offtarget_profile.yaml +0 -0
  35. {pen_stack-6.4.3 → pen_stack-6.6.0}/configs/capsid_epitope_oracle.yaml +0 -0
  36. {pen_stack-6.4.3 → pen_stack-6.6.0}/configs/capsid_sequences.fasta +0 -0
  37. {pen_stack-6.4.3 → pen_stack-6.6.0}/configs/cargo_polish.yaml +0 -0
  38. {pen_stack-6.4.3 → pen_stack-6.6.0}/configs/cell_types.yaml +0 -0
  39. {pen_stack-6.4.3 → pen_stack-6.6.0}/configs/datasets.yaml +0 -0
  40. {pen_stack-6.4.3 → pen_stack-6.6.0}/configs/delivery_constraints.yaml +0 -0
  41. {pen_stack-6.4.3 → pen_stack-6.6.0}/configs/delivery_rules.yaml +0 -0
  42. {pen_stack-6.4.3 → pen_stack-6.6.0}/configs/delivery_vehicles.yaml +0 -0
  43. {pen_stack-6.4.3 → pen_stack-6.6.0}/configs/gates_v3.yaml +0 -0
  44. {pen_stack-6.4.3 → pen_stack-6.6.0}/configs/gsh_validated_heldout.yaml +0 -0
  45. {pen_stack-6.4.3 → pen_stack-6.6.0}/configs/intent_weights.yaml +0 -0
  46. {pen_stack-6.4.3 → pen_stack-6.6.0}/configs/known_unknowns.yaml +0 -0
  47. {pen_stack-6.4.3 → pen_stack-6.6.0}/configs/llm.yaml +0 -0
  48. {pen_stack-6.4.3 → pen_stack-6.6.0}/configs/monitor_queries.yaml +0 -0
  49. {pen_stack-6.4.3 → pen_stack-6.6.0}/configs/oracles/execution.yaml +0 -0
  50. {pen_stack-6.4.3 → pen_stack-6.6.0}/configs/rules/delivery.yaml +0 -0
  51. {pen_stack-6.4.3 → pen_stack-6.6.0}/configs/rules/fold.yaml +0 -0
  52. {pen_stack-6.4.3 → pen_stack-6.6.0}/configs/rules/multiplex.yaml +0 -0
  53. {pen_stack-6.4.3 → pen_stack-6.6.0}/configs/rules/payload.yaml +0 -0
  54. {pen_stack-6.4.3 → pen_stack-6.6.0}/configs/rules/reachability.yaml +0 -0
  55. {pen_stack-6.4.3 → pen_stack-6.6.0}/configs/safety/hazard_registry.yaml +0 -0
  56. {pen_stack-6.4.3 → pen_stack-6.6.0}/configs/safety/policy.yaml +0 -0
  57. {pen_stack-6.4.3 → pen_stack-6.6.0}/configs/safety/probes.yaml +0 -0
  58. {pen_stack-6.4.3 → pen_stack-6.6.0}/configs/score_axes.yaml +0 -0
  59. {pen_stack-6.4.3 → pen_stack-6.6.0}/configs/seroprevalence.yaml +0 -0
  60. {pen_stack-6.4.3 → pen_stack-6.6.0}/configs/target_sites.yaml +0 -0
  61. {pen_stack-6.4.3 → pen_stack-6.6.0}/configs/universe_crosswalk.yaml +0 -0
  62. {pen_stack-6.4.3 → pen_stack-6.6.0}/configs/write_types.yaml +0 -0
  63. {pen_stack-6.4.3 → pen_stack-6.6.0}/configs/wtkb_curated.yaml +0 -0
  64. {pen_stack-6.4.3 → pen_stack-6.6.0}/data/curated/bridge_offtarget_energetics.json +0 -0
  65. {pen_stack-6.4.3 → pen_stack-6.6.0}/data/curated/bridge_offtarget_profile_measured.parquet +0 -0
  66. {pen_stack-6.4.3 → pen_stack-6.6.0}/data/curated/gene_coords.parquet +0 -0
  67. {pen_stack-6.4.3 → pen_stack-6.6.0}/data/curated/unified_editor_universe.parquet +0 -0
  68. {pen_stack-6.4.3 → pen_stack-6.6.0}/docs/BACKLOG.md +0 -0
  69. {pen_stack-6.4.3 → pen_stack-6.6.0}/docs/DEPLOY.md +0 -0
  70. {pen_stack-6.4.3 → pen_stack-6.6.0}/docs/INFRA.md +0 -0
  71. {pen_stack-6.4.3 → pen_stack-6.6.0}/docs/MCP.md +0 -0
  72. {pen_stack-6.4.3 → pen_stack-6.6.0}/docs/RELEASING.md +0 -0
  73. {pen_stack-6.4.3 → pen_stack-6.6.0}/docs/REPRO.md +0 -0
  74. {pen_stack-6.4.3 → pen_stack-6.6.0}/docs/STABILITY.md +0 -0
  75. {pen_stack-6.4.3 → pen_stack-6.6.0}/docs/agent.md +0 -0
  76. {pen_stack-6.4.3 → pen_stack-6.6.0}/docs/alphagenome_feasibility.md +0 -0
  77. {pen_stack-6.4.3 → pen_stack-6.6.0}/docs/autonomy.md +0 -0
  78. {pen_stack-6.4.3 → pen_stack-6.6.0}/docs/benchmark_circularity.md +0 -0
  79. {pen_stack-6.4.3 → pen_stack-6.6.0}/docs/biosecurity.md +0 -0
  80. {pen_stack-6.4.3 → pen_stack-6.6.0}/docs/build_interface.md +0 -0
  81. {pen_stack-6.4.3 → pen_stack-6.6.0}/docs/cards/atlas.md +0 -0
  82. {pen_stack-6.4.3 → pen_stack-6.6.0}/docs/cards/durability.md +0 -0
  83. {pen_stack-6.4.3 → pen_stack-6.6.0}/docs/cards/safety.md +0 -0
  84. {pen_stack-6.4.3 → pen_stack-6.6.0}/docs/challenge.md +0 -0
  85. {pen_stack-6.4.3 → pen_stack-6.6.0}/docs/closed_loop.md +0 -0
  86. {pen_stack-6.4.3 → pen_stack-6.6.0}/docs/co_scientist.md +0 -0
  87. {pen_stack-6.4.3 → pen_stack-6.6.0}/docs/co_scientist_loop.md +0 -0
  88. {pen_stack-6.4.3 → pen_stack-6.6.0}/docs/delivery.md +0 -0
  89. {pen_stack-6.4.3 → pen_stack-6.6.0}/docs/delivery_immunology.md +0 -0
  90. {pen_stack-6.4.3 → pen_stack-6.6.0}/docs/digital_twin.md +0 -0
  91. {pen_stack-6.4.3 → pen_stack-6.6.0}/docs/dissemination.md +0 -0
  92. {pen_stack-6.4.3 → pen_stack-6.6.0}/docs/environment.md +0 -0
  93. {pen_stack-6.4.3 → pen_stack-6.6.0}/docs/experiment_design.md +0 -0
  94. {pen_stack-6.4.3 → pen_stack-6.6.0}/docs/generative_design.md +0 -0
  95. {pen_stack-6.4.3 → pen_stack-6.6.0}/docs/index.md +0 -0
  96. {pen_stack-6.4.3 → pen_stack-6.6.0}/docs/integrations.md +0 -0
  97. {pen_stack-6.4.3 → pen_stack-6.6.0}/docs/live_oracles.md +0 -0
  98. {pen_stack-6.4.3 → pen_stack-6.6.0}/docs/mechanistic_constraints.md +0 -0
  99. {pen_stack-6.4.3 → pen_stack-6.6.0}/docs/oracles.md +0 -0
  100. {pen_stack-6.4.3 → pen_stack-6.6.0}/docs/positioning.md +0 -0
  101. {pen_stack-6.4.3 → pen_stack-6.6.0}/docs/private_data_formats.md +0 -0
  102. {pen_stack-6.4.3 → pen_stack-6.6.0}/docs/quickstart.md +0 -0
  103. {pen_stack-6.4.3 → pen_stack-6.6.0}/docs/responsible_use.md +0 -0
  104. {pen_stack-6.4.3 → pen_stack-6.6.0}/docs/rules.md +0 -0
  105. {pen_stack-6.4.3 → pen_stack-6.6.0}/docs/scope.md +0 -0
  106. {pen_stack-6.4.3 → pen_stack-6.6.0}/docs/scorecard.md +0 -0
  107. {pen_stack-6.4.3 → pen_stack-6.6.0}/docs/tutorials/compare-families.md +0 -0
  108. {pen_stack-6.4.3 → pen_stack-6.6.0}/docs/tutorials/score-deliverability.md +0 -0
  109. {pen_stack-6.4.3 → pen_stack-6.6.0}/docs/tutorials/where-can-i-write.md +0 -0
  110. {pen_stack-6.4.3 → pen_stack-6.6.0}/docs/tutorials/which-writer-reaches-locus.md +0 -0
  111. {pen_stack-6.4.3 → pen_stack-6.6.0}/docs/uncertainty.md +0 -0
  112. {pen_stack-6.4.3 → pen_stack-6.6.0}/docs/verify.md +0 -0
  113. {pen_stack-6.4.3 → pen_stack-6.6.0}/docs/world_model.md +0 -0
  114. {pen_stack-6.4.3 → pen_stack-6.6.0}/docs/writer_verification.md +0 -0
  115. {pen_stack-6.4.3 → pen_stack-6.6.0}/docs/wtkb.md +0 -0
  116. {pen_stack-6.4.3 → pen_stack-6.6.0}/pen_stack/_resources.py +0 -0
  117. {pen_stack-6.4.3 → pen_stack-6.6.0}/pen_stack/active/__init__.py +0 -0
  118. {pen_stack-6.4.3 → pen_stack-6.6.0}/pen_stack/active/acquire.py +0 -0
  119. {pen_stack-6.4.3 → pen_stack-6.6.0}/pen_stack/active/design.py +0 -0
  120. {pen_stack-6.4.3 → pen_stack-6.6.0}/pen_stack/active/validate.py +0 -0
  121. {pen_stack-6.4.3 → pen_stack-6.6.0}/pen_stack/adapt/__init__.py +0 -0
  122. {pen_stack-6.4.3 → pen_stack-6.6.0}/pen_stack/adapt/finetune.py +0 -0
  123. {pen_stack-6.4.3 → pen_stack-6.6.0}/pen_stack/adapt/ingest.py +0 -0
  124. {pen_stack-6.4.3 → pen_stack-6.6.0}/pen_stack/adapt/pipeline.py +0 -0
  125. {pen_stack-6.4.3 → pen_stack-6.6.0}/pen_stack/adapt/recalibrate.py +0 -0
  126. {pen_stack-6.4.3 → pen_stack-6.6.0}/pen_stack/adapt/report.py +0 -0
  127. {pen_stack-6.4.3 → pen_stack-6.6.0}/pen_stack/agent/__init__.py +0 -0
  128. {pen_stack-6.4.3 → pen_stack-6.6.0}/pen_stack/agent/cite.py +0 -0
  129. {pen_stack-6.4.3 → pen_stack-6.6.0}/pen_stack/agent/co_scientist.py +0 -0
  130. {pen_stack-6.4.3 → pen_stack-6.6.0}/pen_stack/agent/epistemic.py +0 -0
  131. {pen_stack-6.4.3 → pen_stack-6.6.0}/pen_stack/agent/guardrails.py +0 -0
  132. {pen_stack-6.4.3 → pen_stack-6.6.0}/pen_stack/agent/mcp_server.py +0 -0
  133. {pen_stack-6.4.3 → pen_stack-6.6.0}/pen_stack/agent/orchestrator.py +0 -0
  134. {pen_stack-6.4.3 → pen_stack-6.6.0}/pen_stack/agent/orchestrator_live.py +0 -0
  135. {pen_stack-6.4.3 → pen_stack-6.6.0}/pen_stack/agent/pen_agent.py +0 -0
  136. {pen_stack-6.4.3 → pen_stack-6.6.0}/pen_stack/agent/scope.py +0 -0
  137. {pen_stack-6.4.3 → pen_stack-6.6.0}/pen_stack/agent/tools.py +0 -0
  138. {pen_stack-6.4.3 → pen_stack-6.6.0}/pen_stack/api/__init__.py +0 -0
  139. {pen_stack-6.4.3 → pen_stack-6.6.0}/pen_stack/api/manifest.py +0 -0
  140. {pen_stack-6.4.3 → pen_stack-6.6.0}/pen_stack/atlas/__init__.py +0 -0
  141. {pen_stack-6.4.3 → pen_stack-6.6.0}/pen_stack/atlas/build_wtkb.py +0 -0
  142. {pen_stack-6.4.3 → pen_stack-6.6.0}/pen_stack/atlas/crosslink.py +0 -0
  143. {pen_stack-6.4.3 → pen_stack-6.6.0}/pen_stack/atlas/expand.py +0 -0
  144. {pen_stack-6.4.3 → pen_stack-6.6.0}/pen_stack/atlas/schema.py +0 -0
  145. {pen_stack-6.4.3 → pen_stack-6.6.0}/pen_stack/atlas/scorecard.py +0 -0
  146. {pen_stack-6.4.3 → pen_stack-6.6.0}/pen_stack/atlas/universe.py +0 -0
  147. {pen_stack-6.4.3 → pen_stack-6.6.0}/pen_stack/atlas/variant_propose.py +0 -0
  148. {pen_stack-6.4.3 → pen_stack-6.6.0}/pen_stack/atlas/writer_verify.py +0 -0
  149. {pen_stack-6.4.3 → pen_stack-6.6.0}/pen_stack/bridge/__init__.py +0 -0
  150. {pen_stack-6.4.3 → pen_stack-6.6.0}/pen_stack/bridge/activity.py +0 -0
  151. {pen_stack-6.4.3 → pen_stack-6.6.0}/pen_stack/bridge/cli.py +0 -0
  152. {pen_stack-6.4.3 → pen_stack-6.6.0}/pen_stack/bridge/fold_qc.py +0 -0
  153. {pen_stack-6.4.3 → pen_stack-6.6.0}/pen_stack/bridge/guide_qc.py +0 -0
  154. {pen_stack-6.4.3 → pen_stack-6.6.0}/pen_stack/bridge/ingest.py +0 -0
  155. {pen_stack-6.4.3 → pen_stack-6.6.0}/pen_stack/bridge/offtarget.py +0 -0
  156. {pen_stack-6.4.3 → pen_stack-6.6.0}/pen_stack/bridge/offtarget_energetics.py +0 -0
  157. {pen_stack-6.4.3 → pen_stack-6.6.0}/pen_stack/bridge/ortholog_screen.py +0 -0
  158. {pen_stack-6.4.3 → pen_stack-6.6.0}/pen_stack/bridge/pipeline.py +0 -0
  159. {pen_stack-6.4.3 → pen_stack-6.6.0}/pen_stack/build/__init__.py +0 -0
  160. {pen_stack-6.4.3 → pen_stack-6.6.0}/pen_stack/build/ingest.py +0 -0
  161. {pen_stack-6.4.3 → pen_stack-6.6.0}/pen_stack/build/protocol.py +0 -0
  162. {pen_stack-6.4.3 → pen_stack-6.6.0}/pen_stack/build/simlab.py +0 -0
  163. {pen_stack-6.4.3 → pen_stack-6.6.0}/pen_stack/cli.py +0 -0
  164. {pen_stack-6.4.3 → pen_stack-6.6.0}/pen_stack/data/__init__.py +0 -0
  165. {pen_stack-6.4.3 → pen_stack-6.6.0}/pen_stack/data/encode.py +0 -0
  166. {pen_stack-6.4.3 → pen_stack-6.6.0}/pen_stack/data/genome.py +0 -0
  167. {pen_stack-6.4.3 → pen_stack-6.6.0}/pen_stack/data/ingest_chromatin.py +0 -0
  168. {pen_stack-6.4.3 → pen_stack-6.6.0}/pen_stack/data/ingest_integration.py +0 -0
  169. {pen_stack-6.4.3 → pen_stack-6.6.0}/pen_stack/data/ingest_trip.py +0 -0
  170. {pen_stack-6.4.3 → pen_stack-6.6.0}/pen_stack/design/__init__.py +0 -0
  171. {pen_stack-6.4.3 → pen_stack-6.6.0}/pen_stack/design/generate.py +0 -0
  172. {pen_stack-6.4.3 → pen_stack-6.6.0}/pen_stack/design/pareto.py +0 -0
  173. {pen_stack-6.4.3 → pen_stack-6.6.0}/pen_stack/design/space.py +0 -0
  174. {pen_stack-6.4.3 → pen_stack-6.6.0}/pen_stack/env/__init__.py +0 -0
  175. {pen_stack-6.4.3 → pen_stack-6.6.0}/pen_stack/env/genome_writing_env.py +0 -0
  176. {pen_stack-6.4.3 → pen_stack-6.6.0}/pen_stack/env/policies.py +0 -0
  177. {pen_stack-6.4.3 → pen_stack-6.6.0}/pen_stack/graph/__init__.py +0 -0
  178. {pen_stack-6.4.3 → pen_stack-6.6.0}/pen_stack/graph/build.py +0 -0
  179. {pen_stack-6.4.3 → pen_stack-6.6.0}/pen_stack/graph/cell_types.py +0 -0
  180. {pen_stack-6.4.3 → pen_stack-6.6.0}/pen_stack/graph/ingest.py +0 -0
  181. {pen_stack-6.4.3 → pen_stack-6.6.0}/pen_stack/graph/query.py +0 -0
  182. {pen_stack-6.4.3 → pen_stack-6.6.0}/pen_stack/graph/schema.py +0 -0
  183. {pen_stack-6.4.3 → pen_stack-6.6.0}/pen_stack/loop/__init__.py +0 -0
  184. {pen_stack-6.4.3 → pen_stack-6.6.0}/pen_stack/loop/continual.py +0 -0
  185. {pen_stack-6.4.3 → pen_stack-6.6.0}/pen_stack/loop/cycle.py +0 -0
  186. {pen_stack-6.4.3 → pen_stack-6.6.0}/pen_stack/loop/drift.py +0 -0
  187. {pen_stack-6.4.3 → pen_stack-6.6.0}/pen_stack/mech/__init__.py +0 -0
  188. {pen_stack-6.4.3 → pen_stack-6.6.0}/pen_stack/mech/classify_atlas.py +0 -0
  189. {pen_stack-6.4.3 → pen_stack-6.6.0}/pen_stack/mech/whitelist.py +0 -0
  190. {pen_stack-6.4.3 → pen_stack-6.6.0}/pen_stack/monitor/__init__.py +0 -0
  191. {pen_stack-6.4.3 → pen_stack-6.6.0}/pen_stack/monitor/europepmc.py +0 -0
  192. {pen_stack-6.4.3 → pen_stack-6.6.0}/pen_stack/monitor/run.py +0 -0
  193. {pen_stack-6.4.3 → pen_stack-6.6.0}/pen_stack/monitor/triage.py +0 -0
  194. {pen_stack-6.4.3 → pen_stack-6.6.0}/pen_stack/oracles/__init__.py +0 -0
  195. {pen_stack-6.4.3 → pen_stack-6.6.0}/pen_stack/oracles/cache.py +0 -0
  196. {pen_stack-6.4.3 → pen_stack-6.6.0}/pen_stack/oracles/energetics.py +0 -0
  197. {pen_stack-6.4.3 → pen_stack-6.6.0}/pen_stack/oracles/genome.py +0 -0
  198. {pen_stack-6.4.3 → pen_stack-6.6.0}/pen_stack/oracles/protein_design.py +0 -0
  199. {pen_stack-6.4.3 → pen_stack-6.6.0}/pen_stack/oracles/rna.py +0 -0
  200. {pen_stack-6.4.3 → pen_stack-6.6.0}/pen_stack/oracles/schema.py +0 -0
  201. {pen_stack-6.4.3 → pen_stack-6.6.0}/pen_stack/oracles/status.py +0 -0
  202. {pen_stack-6.4.3 → pen_stack-6.6.0}/pen_stack/oracles/structure.py +0 -0
  203. {pen_stack-6.4.3 → pen_stack-6.6.0}/pen_stack/oracles/vcell.py +0 -0
  204. {pen_stack-6.4.3 → pen_stack-6.6.0}/pen_stack/planner/__init__.py +0 -0
  205. {pen_stack-6.4.3 → pen_stack-6.6.0}/pen_stack/planner/antipeg_oracle.py +0 -0
  206. {pen_stack-6.4.3 → pen_stack-6.6.0}/pen_stack/planner/capsid_epitope_oracle.py +0 -0
  207. {pen_stack-6.4.3 → pen_stack-6.6.0}/pen_stack/planner/cargo.py +0 -0
  208. {pen_stack-6.4.3 → pen_stack-6.6.0}/pen_stack/planner/cargo_polish.py +0 -0
  209. {pen_stack-6.4.3 → pen_stack-6.6.0}/pen_stack/planner/delivery.py +0 -0
  210. {pen_stack-6.4.3 → pen_stack-6.6.0}/pen_stack/planner/delivery_constraints.py +0 -0
  211. {pen_stack-6.4.3 → pen_stack-6.6.0}/pen_stack/planner/delivery_immunology.py +0 -0
  212. {pen_stack-6.4.3 → pen_stack-6.6.0}/pen_stack/planner/delivery_vehicles.py +0 -0
  213. {pen_stack-6.4.3 → pen_stack-6.6.0}/pen_stack/planner/immune_profile.py +0 -0
  214. {pen_stack-6.4.3 → pen_stack-6.6.0}/pen_stack/planner/innate_sensing.py +0 -0
  215. {pen_stack-6.4.3 → pen_stack-6.6.0}/pen_stack/planner/multiplex.py +0 -0
  216. {pen_stack-6.4.3 → pen_stack-6.6.0}/pen_stack/planner/optimize.py +0 -0
  217. {pen_stack-6.4.3 → pen_stack-6.6.0}/pen_stack/planner/pipeline.py +0 -0
  218. {pen_stack-6.4.3 → pen_stack-6.6.0}/pen_stack/planner/report.py +0 -0
  219. {pen_stack-6.4.3 → pen_stack-6.6.0}/pen_stack/planner/router.py +0 -0
  220. {pen_stack-6.4.3 → pen_stack-6.6.0}/pen_stack/planner/seroprevalence_oracle.py +0 -0
  221. {pen_stack-6.4.3 → pen_stack-6.6.0}/pen_stack/planner/target_site.py +0 -0
  222. {pen_stack-6.4.3 → pen_stack-6.6.0}/pen_stack/rag/__init__.py +0 -0
  223. {pen_stack-6.4.3 → pen_stack-6.6.0}/pen_stack/rag/index.py +0 -0
  224. {pen_stack-6.4.3 → pen_stack-6.6.0}/pen_stack/rag/llm.py +0 -0
  225. {pen_stack-6.4.3 → pen_stack-6.6.0}/pen_stack/rag/qa.py +0 -0
  226. {pen_stack-6.4.3 → pen_stack-6.6.0}/pen_stack/rules/__init__.py +0 -0
  227. {pen_stack-6.4.3 → pen_stack-6.6.0}/pen_stack/rules/evaluators.py +0 -0
  228. {pen_stack-6.4.3 → pen_stack-6.6.0}/pen_stack/rules/loader.py +0 -0
  229. {pen_stack-6.4.3 → pen_stack-6.6.0}/pen_stack/rules/schema.py +0 -0
  230. {pen_stack-6.4.3 → pen_stack-6.6.0}/pen_stack/rules/solver.py +0 -0
  231. {pen_stack-6.4.3 → pen_stack-6.6.0}/pen_stack/safety/__init__.py +0 -0
  232. {pen_stack-6.4.3 → pen_stack-6.6.0}/pen_stack/safety/audit.py +0 -0
  233. {pen_stack-6.4.3 → pen_stack-6.6.0}/pen_stack/safety/gate.py +0 -0
  234. {pen_stack-6.4.3 → pen_stack-6.6.0}/pen_stack/safety/policy.py +0 -0
  235. {pen_stack-6.4.3 → pen_stack-6.6.0}/pen_stack/safety/redteam.py +0 -0
  236. {pen_stack-6.4.3 → pen_stack-6.6.0}/pen_stack/safety/registry.py +0 -0
  237. {pen_stack-6.4.3 → pen_stack-6.6.0}/pen_stack/safety/screen.py +0 -0
  238. {pen_stack-6.4.3 → pen_stack-6.6.0}/pen_stack/score/__init__.py +0 -0
  239. {pen_stack-6.4.3 → pen_stack-6.6.0}/pen_stack/score/recalibrate.py +0 -0
  240. {pen_stack-6.4.3 → pen_stack-6.6.0}/pen_stack/score/therapeutic.py +0 -0
  241. {pen_stack-6.4.3 → pen_stack-6.6.0}/pen_stack/server/__init__.py +0 -0
  242. {pen_stack-6.4.3 → pen_stack-6.6.0}/pen_stack/server/api.py +0 -0
  243. {pen_stack-6.4.3 → pen_stack-6.6.0}/pen_stack/twin/__init__.py +0 -0
  244. {pen_stack-6.4.3 → pen_stack-6.6.0}/pen_stack/twin/calibrate.py +0 -0
  245. {pen_stack-6.4.3 → pen_stack-6.6.0}/pen_stack/twin/outcome.py +0 -0
  246. {pen_stack-6.4.3 → pen_stack-6.6.0}/pen_stack/ui/__init__.py +0 -0
  247. {pen_stack-6.4.3 → pen_stack-6.6.0}/pen_stack/ui/app.py +0 -0
  248. {pen_stack-6.4.3 → pen_stack-6.6.0}/pen_stack/validate/__init__.py +0 -0
  249. {pen_stack-6.4.3 → pen_stack-6.6.0}/pen_stack/validate/adapt_demo.py +0 -0
  250. {pen_stack-6.4.3 → pen_stack-6.6.0}/pen_stack/validate/agent_eval.py +0 -0
  251. {pen_stack-6.4.3 → pen_stack-6.6.0}/pen_stack/validate/bench_adversarial_tasks.py +0 -0
  252. {pen_stack-6.4.3 → pen_stack-6.6.0}/pen_stack/validate/bench_coscientist_tasks.py +0 -0
  253. {pen_stack-6.4.3 → pen_stack-6.6.0}/pen_stack/validate/bench_graph_tasks.py +0 -0
  254. {pen_stack-6.4.3 → pen_stack-6.6.0}/pen_stack/validate/bench_rule_tasks.py +0 -0
  255. {pen_stack-6.4.3 → pen_stack-6.6.0}/pen_stack/validate/bench_trust_tasks.py +0 -0
  256. {pen_stack-6.4.3 → pen_stack-6.6.0}/pen_stack/validate/bench_writetype_tasks.py +0 -0
  257. {pen_stack-6.4.3 → pen_stack-6.6.0}/pen_stack/validate/blind_gsh_discovery.py +0 -0
  258. {pen_stack-6.4.3 → pen_stack-6.6.0}/pen_stack/validate/cargo_directionality.py +0 -0
  259. {pen_stack-6.4.3 → pen_stack-6.6.0}/pen_stack/validate/closed_loop.py +0 -0
  260. {pen_stack-6.4.3 → pen_stack-6.6.0}/pen_stack/validate/durability_baselines.py +0 -0
  261. {pen_stack-6.4.3 → pen_stack-6.6.0}/pen_stack/validate/experiment_design.py +0 -0
  262. {pen_stack-6.4.3 → pen_stack-6.6.0}/pen_stack/validate/forward_hypotheses.py +0 -0
  263. {pen_stack-6.4.3 → pen_stack-6.6.0}/pen_stack/validate/generative_design.py +0 -0
  264. {pen_stack-6.4.3 → pen_stack-6.6.0}/pen_stack/validate/guide_qc_demo.py +0 -0
  265. {pen_stack-6.4.3 → pen_stack-6.6.0}/pen_stack/validate/immune_calibration.py +0 -0
  266. {pen_stack-6.4.3 → pen_stack-6.6.0}/pen_stack/validate/intent_specification.py +0 -0
  267. {pen_stack-6.4.3 → pen_stack-6.6.0}/pen_stack/validate/offtarget_energetics_eval.py +0 -0
  268. {pen_stack-6.4.3 → pen_stack-6.6.0}/pen_stack/validate/out_of_scope_refusal.py +0 -0
  269. {pen_stack-6.4.3 → pen_stack-6.6.0}/pen_stack/validate/outcome_calibration.py +0 -0
  270. {pen_stack-6.4.3 → pen_stack-6.6.0}/pen_stack/validate/outcome_prediction.py +0 -0
  271. {pen_stack-6.4.3 → pen_stack-6.6.0}/pen_stack/validate/paper3_benchmark.py +0 -0
  272. {pen_stack-6.4.3 → pen_stack-6.6.0}/pen_stack/validate/paper4_real_validation.py +0 -0
  273. {pen_stack-6.4.3 → pen_stack-6.6.0}/pen_stack/validate/paper4_validation.py +0 -0
  274. {pen_stack-6.4.3 → pen_stack-6.6.0}/pen_stack/validate/protocol_safety.py +0 -0
  275. {pen_stack-6.4.3 → pen_stack-6.6.0}/pen_stack/validate/safety_screening.py +0 -0
  276. {pen_stack-6.4.3 → pen_stack-6.6.0}/pen_stack/validate/selective_prediction.py +0 -0
  277. {pen_stack-6.4.3 → pen_stack-6.6.0}/pen_stack/validate/seq_vs_measured.py +0 -0
  278. {pen_stack-6.4.3 → pen_stack-6.6.0}/pen_stack/validate/target_site_controls.py +0 -0
  279. {pen_stack-6.4.3 → pen_stack-6.6.0}/pen_stack/validate/uncertainty_eval.py +0 -0
  280. {pen_stack-6.4.3 → pen_stack-6.6.0}/pen_stack/validate/ungrounded_baseline.py +0 -0
  281. {pen_stack-6.4.3 → pen_stack-6.6.0}/pen_stack/validate/within_locus_ranking.py +0 -0
  282. {pen_stack-6.4.3 → pen_stack-6.6.0}/pen_stack/validate/writer_recovery.py +0 -0
  283. {pen_stack-6.4.3 → pen_stack-6.6.0}/pen_stack/verify/__init__.py +0 -0
  284. {pen_stack-6.4.3 → pen_stack-6.6.0}/pen_stack/verify/schema.py +0 -0
  285. {pen_stack-6.4.3 → pen_stack-6.6.0}/pen_stack/verify/service.py +0 -0
  286. {pen_stack-6.4.3 → pen_stack-6.6.0}/pen_stack/web/__init__.py +0 -0
  287. {pen_stack-6.4.3 → pen_stack-6.6.0}/pen_stack/web/guide.py +0 -0
  288. {pen_stack-6.4.3 → pen_stack-6.6.0}/pen_stack/web/llm.py +0 -0
  289. {pen_stack-6.4.3 → pen_stack-6.6.0}/pen_stack/web/router.py +0 -0
  290. {pen_stack-6.4.3 → pen_stack-6.6.0}/pen_stack/web/server.py +0 -0
  291. {pen_stack-6.4.3 → pen_stack-6.6.0}/pen_stack/web/tools.py +0 -0
  292. {pen_stack-6.4.3 → pen_stack-6.6.0}/pen_stack/wgenome/__init__.py +0 -0
  293. {pen_stack-6.4.3 → pen_stack-6.6.0}/pen_stack/wgenome/chromatin_seq.py +0 -0
  294. {pen_stack-6.4.3 → pen_stack-6.6.0}/pen_stack/wgenome/durability.py +0 -0
  295. {pen_stack-6.4.3 → pen_stack-6.6.0}/pen_stack/wgenome/export_tracks.py +0 -0
  296. {pen_stack-6.4.3 → pen_stack-6.6.0}/pen_stack/wgenome/features.py +0 -0
  297. {pen_stack-6.4.3 → pen_stack-6.6.0}/pen_stack/wgenome/gsh_baseline.py +0 -0
  298. {pen_stack-6.4.3 → pen_stack-6.6.0}/pen_stack/wgenome/mesh_features.py +0 -0
  299. {pen_stack-6.4.3 → pen_stack-6.6.0}/pen_stack/wgenome/ood.py +0 -0
  300. {pen_stack-6.4.3 → pen_stack-6.6.0}/pen_stack/wgenome/providers.py +0 -0
  301. {pen_stack-6.4.3 → pen_stack-6.6.0}/pen_stack/wgenome/safety.py +0 -0
  302. {pen_stack-6.4.3 → pen_stack-6.6.0}/pen_stack/wgenome/structure3d.py +0 -0
  303. {pen_stack-6.4.3 → pen_stack-6.6.0}/pen_stack/wgenome/uncertainty.py +0 -0
  304. {pen_stack-6.4.3 → pen_stack-6.6.0}/pen_stack/wgenome/writability.py +0 -0
  305. {pen_stack-6.4.3 → pen_stack-6.6.0}/pen_stack.egg-info/dependency_links.txt +0 -0
  306. {pen_stack-6.4.3 → pen_stack-6.6.0}/pen_stack.egg-info/entry_points.txt +0 -0
  307. {pen_stack-6.4.3 → pen_stack-6.6.0}/pen_stack.egg-info/requires.txt +0 -0
  308. {pen_stack-6.4.3 → pen_stack-6.6.0}/pen_stack.egg-info/top_level.txt +0 -0
  309. {pen_stack-6.4.3 → pen_stack-6.6.0}/prereg/SHA256_LOCK_phase0.json +0 -0
  310. {pen_stack-6.4.3 → pen_stack-6.6.0}/prereg/SHA256_LOCK_phase1_5.json +0 -0
  311. {pen_stack-6.4.3 → pen_stack-6.6.0}/prereg/SHA256_LOCK_phase2.json +0 -0
  312. {pen_stack-6.4.3 → pen_stack-6.6.0}/prereg/SHA256_LOCK_phase3.json +0 -0
  313. {pen_stack-6.4.3 → pen_stack-6.6.0}/prereg/SHA256_LOCK_ws_a.json +0 -0
  314. {pen_stack-6.4.3 → pen_stack-6.6.0}/prereg/SHA256_LOCK_ws_acq.json +0 -0
  315. {pen_stack-6.4.3 → pen_stack-6.6.0}/prereg/SHA256_LOCK_ws_aldesign.json +0 -0
  316. {pen_stack-6.4.3 → pen_stack-6.6.0}/prereg/SHA256_LOCK_ws_alvalidate.json +0 -0
  317. {pen_stack-6.4.3 → pen_stack-6.6.0}/prereg/SHA256_LOCK_ws_atlas.json +0 -0
  318. {pen_stack-6.4.3 → pen_stack-6.6.0}/prereg/SHA256_LOCK_ws_b.json +0 -0
  319. {pen_stack-6.4.3 → pen_stack-6.6.0}/prereg/SHA256_LOCK_ws_ba.json +0 -0
  320. {pen_stack-6.4.3 → pen_stack-6.6.0}/prereg/SHA256_LOCK_ws_ba_v33.json +0 -0
  321. {pen_stack-6.4.3 → pen_stack-6.6.0}/prereg/SHA256_LOCK_ws_ba_v45.json +0 -0
  322. {pen_stack-6.4.3 → pen_stack-6.6.0}/prereg/SHA256_LOCK_ws_bench.json +0 -0
  323. {pen_stack-6.4.3 → pen_stack-6.6.0}/prereg/SHA256_LOCK_ws_c.json +0 -0
  324. {pen_stack-6.4.3 → pen_stack-6.6.0}/prereg/SHA256_LOCK_ws_cal.json +0 -0
  325. {pen_stack-6.4.3 → pen_stack-6.6.0}/prereg/SHA256_LOCK_ws_calib.json +0 -0
  326. {pen_stack-6.4.3 → pen_stack-6.6.0}/prereg/SHA256_LOCK_ws_challenge.json +0 -0
  327. {pen_stack-6.4.3 → pen_stack-6.6.0}/prereg/SHA256_LOCK_ws_chat.json +0 -0
  328. {pen_stack-6.4.3 → pen_stack-6.6.0}/prereg/SHA256_LOCK_ws_cite.json +0 -0
  329. {pen_stack-6.4.3 → pen_stack-6.6.0}/prereg/SHA256_LOCK_ws_continual.json +0 -0
  330. {pen_stack-6.4.3 → pen_stack-6.6.0}/prereg/SHA256_LOCK_ws_cosci2.json +0 -0
  331. {pen_stack-6.4.3 → pen_stack-6.6.0}/prereg/SHA256_LOCK_ws_crit.json +0 -0
  332. {pen_stack-6.4.3 → pen_stack-6.6.0}/prereg/SHA256_LOCK_ws_ct.json +0 -0
  333. {pen_stack-6.4.3 → pen_stack-6.6.0}/prereg/SHA256_LOCK_ws_d.json +0 -0
  334. {pen_stack-6.4.3 → pen_stack-6.6.0}/prereg/SHA256_LOCK_ws_drift.json +0 -0
  335. {pen_stack-6.4.3 → pen_stack-6.6.0}/prereg/SHA256_LOCK_ws_e.json +0 -0
  336. {pen_stack-6.4.3 → pen_stack-6.6.0}/prereg/SHA256_LOCK_ws_env.json +0 -0
  337. {pen_stack-6.4.3 → pen_stack-6.6.0}/prereg/SHA256_LOCK_ws_ep.json +0 -0
  338. {pen_stack-6.4.3 → pen_stack-6.6.0}/prereg/SHA256_LOCK_ws_epitope.json +0 -0
  339. {pen_stack-6.4.3 → pen_stack-6.6.0}/prereg/SHA256_LOCK_ws_f.json +0 -0
  340. {pen_stack-6.4.3 → pen_stack-6.6.0}/prereg/SHA256_LOCK_ws_frontend.json +0 -0
  341. {pen_stack-6.4.3 → pen_stack-6.6.0}/prereg/SHA256_LOCK_ws_g.json +0 -0
  342. {pen_stack-6.4.3 → pen_stack-6.6.0}/prereg/SHA256_LOCK_ws_gen.json +0 -0
  343. {pen_stack-6.4.3 → pen_stack-6.6.0}/prereg/SHA256_LOCK_ws_genotox.json +0 -0
  344. {pen_stack-6.4.3 → pen_stack-6.6.0}/prereg/SHA256_LOCK_ws_graph.json +0 -0
  345. {pen_stack-6.4.3 → pen_stack-6.6.0}/prereg/SHA256_LOCK_ws_h.json +0 -0
  346. {pen_stack-6.4.3 → pen_stack-6.6.0}/prereg/SHA256_LOCK_ws_hybrid.json +0 -0
  347. {pen_stack-6.4.3 → pen_stack-6.6.0}/prereg/SHA256_LOCK_ws_immune.json +0 -0
  348. {pen_stack-6.4.3 → pen_stack-6.6.0}/prereg/SHA256_LOCK_ws_ingest.json +0 -0
  349. {pen_stack-6.4.3 → pen_stack-6.6.0}/prereg/SHA256_LOCK_ws_innate.json +0 -0
  350. {pen_stack-6.4.3 → pen_stack-6.6.0}/prereg/SHA256_LOCK_ws_loop.json +0 -0
  351. {pen_stack-6.4.3 → pen_stack-6.6.0}/prereg/SHA256_LOCK_ws_manifest.json +0 -0
  352. {pen_stack-6.4.3 → pen_stack-6.6.0}/prereg/SHA256_LOCK_ws_mc.json +0 -0
  353. {pen_stack-6.4.3 → pen_stack-6.6.0}/prereg/SHA256_LOCK_ws_mcp.json +0 -0
  354. {pen_stack-6.4.3 → pen_stack-6.6.0}/prereg/SHA256_LOCK_ws_mech.json +0 -0
  355. {pen_stack-6.4.3 → pen_stack-6.6.0}/prereg/SHA256_LOCK_ws_mon.json +0 -0
  356. {pen_stack-6.4.3 → pen_stack-6.6.0}/prereg/SHA256_LOCK_ws_o.json +0 -0
  357. {pen_stack-6.4.3 → pen_stack-6.6.0}/prereg/SHA256_LOCK_ws_openapi.json +0 -0
  358. {pen_stack-6.4.3 → pen_stack-6.6.0}/prereg/SHA256_LOCK_ws_orch.json +0 -0
  359. {pen_stack-6.4.3 → pen_stack-6.6.0}/prereg/SHA256_LOCK_ws_outcome.json +0 -0
  360. {pen_stack-6.4.3 → pen_stack-6.6.0}/prereg/SHA256_LOCK_ws_pareto.json +0 -0
  361. {pen_stack-6.4.3 → pen_stack-6.6.0}/prereg/SHA256_LOCK_ws_peg.json +0 -0
  362. {pen_stack-6.4.3 → pen_stack-6.6.0}/prereg/SHA256_LOCK_ws_plan.json +0 -0
  363. {pen_stack-6.4.3 → pen_stack-6.6.0}/prereg/SHA256_LOCK_ws_policy.json +0 -0
  364. {pen_stack-6.4.3 → pen_stack-6.6.0}/prereg/SHA256_LOCK_ws_profile.json +0 -0
  365. {pen_stack-6.4.3 → pen_stack-6.6.0}/prereg/SHA256_LOCK_ws_proto.json +0 -0
  366. {pen_stack-6.4.3 → pen_stack-6.6.0}/prereg/SHA256_LOCK_ws_r.json +0 -0
  367. {pen_stack-6.4.3 → pen_stack-6.6.0}/prereg/SHA256_LOCK_ws_redteam.json +0 -0
  368. {pen_stack-6.4.3 → pen_stack-6.6.0}/prereg/SHA256_LOCK_ws_route.json +0 -0
  369. {pen_stack-6.4.3 → pen_stack-6.6.0}/prereg/SHA256_LOCK_ws_screen.json +0 -0
  370. {pen_stack-6.4.3 → pen_stack-6.6.0}/prereg/SHA256_LOCK_ws_seroprev.json +0 -0
  371. {pen_stack-6.4.3 → pen_stack-6.6.0}/prereg/SHA256_LOCK_ws_simlab.json +0 -0
  372. {pen_stack-6.4.3 → pen_stack-6.6.0}/prereg/SHA256_LOCK_ws_twincal.json +0 -0
  373. {pen_stack-6.4.3 → pen_stack-6.6.0}/prereg/SHA256_LOCK_ws_uq.json +0 -0
  374. {pen_stack-6.4.3 → pen_stack-6.6.0}/prereg/SHA256_LOCK_ws_v.json +0 -0
  375. {pen_stack-6.4.3 → pen_stack-6.6.0}/prereg/SHA256_LOCK_ws_vcell.json +0 -0
  376. {pen_stack-6.4.3 → pen_stack-6.6.0}/prereg/SHA256_LOCK_ws_wv.json +0 -0
  377. {pen_stack-6.4.3 → pen_stack-6.6.0}/prereg/paper1.yaml +0 -0
  378. {pen_stack-6.4.3 → pen_stack-6.6.0}/prereg/paper2.yaml +0 -0
  379. {pen_stack-6.4.3 → pen_stack-6.6.0}/prereg/paper3.yaml +0 -0
  380. {pen_stack-6.4.3 → pen_stack-6.6.0}/prereg/paper4.yaml +0 -0
  381. {pen_stack-6.4.3 → pen_stack-6.6.0}/prereg/phase0.yaml +0 -0
  382. {pen_stack-6.4.3 → pen_stack-6.6.0}/prereg/ws_a.yaml +0 -0
  383. {pen_stack-6.4.3 → pen_stack-6.6.0}/prereg/ws_acq.yaml +0 -0
  384. {pen_stack-6.4.3 → pen_stack-6.6.0}/prereg/ws_aldesign.yaml +0 -0
  385. {pen_stack-6.4.3 → pen_stack-6.6.0}/prereg/ws_alvalidate.yaml +0 -0
  386. {pen_stack-6.4.3 → pen_stack-6.6.0}/prereg/ws_atlas.yaml +0 -0
  387. {pen_stack-6.4.3 → pen_stack-6.6.0}/prereg/ws_b.yaml +0 -0
  388. {pen_stack-6.4.3 → pen_stack-6.6.0}/prereg/ws_ba.yaml +0 -0
  389. {pen_stack-6.4.3 → pen_stack-6.6.0}/prereg/ws_ba_v33.yaml +0 -0
  390. {pen_stack-6.4.3 → pen_stack-6.6.0}/prereg/ws_ba_v45.yaml +0 -0
  391. {pen_stack-6.4.3 → pen_stack-6.6.0}/prereg/ws_bench.yaml +0 -0
  392. {pen_stack-6.4.3 → pen_stack-6.6.0}/prereg/ws_c.yaml +0 -0
  393. {pen_stack-6.4.3 → pen_stack-6.6.0}/prereg/ws_cal.yaml +0 -0
  394. {pen_stack-6.4.3 → pen_stack-6.6.0}/prereg/ws_calib.yaml +0 -0
  395. {pen_stack-6.4.3 → pen_stack-6.6.0}/prereg/ws_challenge.yaml +0 -0
  396. {pen_stack-6.4.3 → pen_stack-6.6.0}/prereg/ws_chat.yaml +0 -0
  397. {pen_stack-6.4.3 → pen_stack-6.6.0}/prereg/ws_cite.yaml +0 -0
  398. {pen_stack-6.4.3 → pen_stack-6.6.0}/prereg/ws_continual.yaml +0 -0
  399. {pen_stack-6.4.3 → pen_stack-6.6.0}/prereg/ws_cosci2.yaml +0 -0
  400. {pen_stack-6.4.3 → pen_stack-6.6.0}/prereg/ws_crit.yaml +0 -0
  401. {pen_stack-6.4.3 → pen_stack-6.6.0}/prereg/ws_ct.yaml +0 -0
  402. {pen_stack-6.4.3 → pen_stack-6.6.0}/prereg/ws_d.yaml +0 -0
  403. {pen_stack-6.4.3 → pen_stack-6.6.0}/prereg/ws_drift.yaml +0 -0
  404. {pen_stack-6.4.3 → pen_stack-6.6.0}/prereg/ws_e.yaml +0 -0
  405. {pen_stack-6.4.3 → pen_stack-6.6.0}/prereg/ws_env.yaml +0 -0
  406. {pen_stack-6.4.3 → pen_stack-6.6.0}/prereg/ws_ep.yaml +0 -0
  407. {pen_stack-6.4.3 → pen_stack-6.6.0}/prereg/ws_epitope.yaml +0 -0
  408. {pen_stack-6.4.3 → pen_stack-6.6.0}/prereg/ws_f.yaml +0 -0
  409. {pen_stack-6.4.3 → pen_stack-6.6.0}/prereg/ws_frontend.yaml +0 -0
  410. {pen_stack-6.4.3 → pen_stack-6.6.0}/prereg/ws_g.yaml +0 -0
  411. {pen_stack-6.4.3 → pen_stack-6.6.0}/prereg/ws_gen.yaml +0 -0
  412. {pen_stack-6.4.3 → pen_stack-6.6.0}/prereg/ws_genotox.yaml +0 -0
  413. {pen_stack-6.4.3 → pen_stack-6.6.0}/prereg/ws_graph.yaml +0 -0
  414. {pen_stack-6.4.3 → pen_stack-6.6.0}/prereg/ws_h.yaml +0 -0
  415. {pen_stack-6.4.3 → pen_stack-6.6.0}/prereg/ws_hybrid.yaml +0 -0
  416. {pen_stack-6.4.3 → pen_stack-6.6.0}/prereg/ws_immune.yaml +0 -0
  417. {pen_stack-6.4.3 → pen_stack-6.6.0}/prereg/ws_ingest.yaml +0 -0
  418. {pen_stack-6.4.3 → pen_stack-6.6.0}/prereg/ws_innate.yaml +0 -0
  419. {pen_stack-6.4.3 → pen_stack-6.6.0}/prereg/ws_loop.yaml +0 -0
  420. {pen_stack-6.4.3 → pen_stack-6.6.0}/prereg/ws_manifest.yaml +0 -0
  421. {pen_stack-6.4.3 → pen_stack-6.6.0}/prereg/ws_mc.yaml +0 -0
  422. {pen_stack-6.4.3 → pen_stack-6.6.0}/prereg/ws_mcp.yaml +0 -0
  423. {pen_stack-6.4.3 → pen_stack-6.6.0}/prereg/ws_mech.yaml +0 -0
  424. {pen_stack-6.4.3 → pen_stack-6.6.0}/prereg/ws_mon.yaml +0 -0
  425. {pen_stack-6.4.3 → pen_stack-6.6.0}/prereg/ws_o.yaml +0 -0
  426. {pen_stack-6.4.3 → pen_stack-6.6.0}/prereg/ws_openapi.yaml +0 -0
  427. {pen_stack-6.4.3 → pen_stack-6.6.0}/prereg/ws_orch.yaml +0 -0
  428. {pen_stack-6.4.3 → pen_stack-6.6.0}/prereg/ws_outcome.yaml +0 -0
  429. {pen_stack-6.4.3 → pen_stack-6.6.0}/prereg/ws_pareto.yaml +0 -0
  430. {pen_stack-6.4.3 → pen_stack-6.6.0}/prereg/ws_peg.yaml +0 -0
  431. {pen_stack-6.4.3 → pen_stack-6.6.0}/prereg/ws_plan.yaml +0 -0
  432. {pen_stack-6.4.3 → pen_stack-6.6.0}/prereg/ws_policy.yaml +0 -0
  433. {pen_stack-6.4.3 → pen_stack-6.6.0}/prereg/ws_profile.yaml +0 -0
  434. {pen_stack-6.4.3 → pen_stack-6.6.0}/prereg/ws_proto.yaml +0 -0
  435. {pen_stack-6.4.3 → pen_stack-6.6.0}/prereg/ws_r.yaml +0 -0
  436. {pen_stack-6.4.3 → pen_stack-6.6.0}/prereg/ws_redteam.yaml +0 -0
  437. {pen_stack-6.4.3 → pen_stack-6.6.0}/prereg/ws_route.yaml +0 -0
  438. {pen_stack-6.4.3 → pen_stack-6.6.0}/prereg/ws_screen.yaml +0 -0
  439. {pen_stack-6.4.3 → pen_stack-6.6.0}/prereg/ws_seroprev.yaml +0 -0
  440. {pen_stack-6.4.3 → pen_stack-6.6.0}/prereg/ws_simlab.yaml +0 -0
  441. {pen_stack-6.4.3 → pen_stack-6.6.0}/prereg/ws_twincal.yaml +0 -0
  442. {pen_stack-6.4.3 → pen_stack-6.6.0}/prereg/ws_uq.yaml +0 -0
  443. {pen_stack-6.4.3 → pen_stack-6.6.0}/prereg/ws_v.yaml +0 -0
  444. {pen_stack-6.4.3 → pen_stack-6.6.0}/prereg/ws_vcell.yaml +0 -0
  445. {pen_stack-6.4.3 → pen_stack-6.6.0}/prereg/ws_wv.yaml +0 -0
  446. {pen_stack-6.4.3 → pen_stack-6.6.0}/scripts/p1_build_atlas.py +0 -0
  447. {pen_stack-6.4.3 → pen_stack-6.6.0}/scripts/p1_build_durability.py +0 -0
  448. {pen_stack-6.4.3 → pen_stack-6.6.0}/scripts/p1_export_tracks.py +0 -0
  449. {pen_stack-6.4.3 → pen_stack-6.6.0}/scripts/p1_safety_concordance.py +0 -0
  450. {pen_stack-6.4.3 → pen_stack-6.6.0}/scripts/p1_train_safety.py +0 -0
  451. {pen_stack-6.4.3 → pen_stack-6.6.0}/scripts/p1_validation_report.py +0 -0
  452. {pen_stack-6.4.3 → pen_stack-6.6.0}/scripts/p2_build_atlas.py +0 -0
  453. {pen_stack-6.4.3 → pen_stack-6.6.0}/scripts/p3_benchmark_report.py +0 -0
  454. {pen_stack-6.4.3 → pen_stack-6.6.0}/scripts/p4_genome_scan.py +0 -0
  455. {pen_stack-6.4.3 → pen_stack-6.6.0}/scripts/p53_build_epitope_oracle.py +0 -0
  456. {pen_stack-6.4.3 → pen_stack-6.6.0}/scripts/ws_b_report.py +0 -0
  457. {pen_stack-6.4.3 → pen_stack-6.6.0}/scripts/ws_c_report.py +0 -0
  458. {pen_stack-6.4.3 → pen_stack-6.6.0}/setup.cfg +0 -0
@@ -3,6 +3,62 @@
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
+
32
+ ## [6.5.0] - 2026-06-15 - Comprehensive expression model + honest proxy-validation pass
33
+
34
+ **MINOR feature release.** Two threads, one principle (no fabrication):
35
+
36
+ ### Added — comprehensive, literature-cited expression model (WS-EXPRESS)
37
+ - `configs/expression/promoters.yaml` — the twin's promoter palette expands **5 → 31 promoters** (constitutive +
38
+ tissue-specific: liver TBG/LP1/hAAT, neuron hSyn/CaMKIIα, muscle MHCK7/MCK/CK8, astrocyte GfaABC1D, SFFV/MND/
39
+ MSCV/RSV, …). Each entry carries `strength` + **context** + assay + **citation** + confidence — because promoter
40
+ strength has **no universal scalar** (it depends on cell type × vector × readout), so a single number is encoded
41
+ *with* its context, never as a universal truth.
42
+ - `configs/expression/modifiers.yaml` — a modifier layer (WPRE, intron, polyA, Kozak, codon-optimization/CAI,
43
+ CpG-silencing) as **literature priors/ranges**, applied as a bounded uplift RANGE (never a point multiplier —
44
+ the chimeric intron is ~20× for one transgene, ~3× for another). `twin/mechanistic.py` consumes both.
45
+
46
+ ### Added — proxy → outcome validation harness (WS-CALIB run)
47
+ - `scripts/calibrate_immune_axes.py` + `configs/calibration/preexisting_nab_independent.yaml` — runs the existing
48
+ `calibrate_axis` gate (N≥6 AND bootstrap Spearman CI excludes 0) against **independent** measured data.
49
+
50
+ ### Honest result (the deliverable)
51
+ - **No immune or expression axis flips to ✅.** Pre-existing NAb tested vs an independent cohort
52
+ (Navarro-Oliveros 2024, Basque): ρ=0.12, CI includes 0 — geography-dependent. Relative-expression tested vs an
53
+ independent promoter study (Damdindorj 2014): ρ=0.12, CI includes 0 — promoter strength is context-dependent
54
+ (Damdindorj found CMV strongest; Qin found the opposite). Genotoxicity (3 vectors), CD8 (5 capsids), anti-PEG
55
+ (1), innate (0 fixed) are structurally below the N≥6 gate. The labels stay 🟡 **with empirical backing** —
56
+ flipping them would require measured-outcome data at a statistical power the public literature does not provide.
57
+
58
+ ### Tests
59
+ - `tests/unit/test_ws_express.py` — palette is comprehensive + cited; context is encoded; modifier profile is a
60
+ bounded range; the proxy does NOT falsely claim cross-study validation (the no-fabrication gate holds).
61
+
6
62
  ## [6.4.3] - 2026-06-12 - Chat vehicle-parse fix (AAVS1 no longer hijacks the vehicle)
7
63
 
8
64
  **PATCH.** `web/tools.py::parse_goal` matched the delivery vehicle by substring, so the safe-harbour nickname
@@ -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.4.3
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.4.3
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.4.3-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.4.3-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)
@@ -0,0 +1,25 @@
1
+ # PEN-STACK — INDEPENDENT calibration data for the pre-existing-NAb axis (proxy → outcome validation).
2
+ #
3
+ # The preexisting_nab PROXY (configs/seroprevalence.yaml) is curated from Calcedo 2009 (10.1086/595830) and
4
+ # Boutin 2010 (10.1089/hum.2009.182). To test it WITHOUT circularity, the "observed" column below is from an
5
+ # INDEPENDENT serosurvey that did not feed the proxy:
6
+ #
7
+ # Navarro-Oliveros M, et al. "Seroprevalence of adeno-associated virus types 1, 2, 3, 4, 5, 6, 8, and 9 in a
8
+ # Basque cohort of healthy donors." Scientific Reports 2024;14:15941. doi:10.1038/s41598-024-66546-4 (N=100)
9
+ #
10
+ # Per-serotype NEUTRALIZING-antibody seroprevalence (%) as reported. eligibility = 1 − prevalence/100, to match
11
+ # the proxy's direction (higher score = fewer patients excluded). Fed to validate.immune_calibration.calibrate_axis.
12
+ source:
13
+ citation: "Navarro-Oliveros et al., Sci Rep 2024;14:15941"
14
+ doi: "10.1038/s41598-024-66546-4"
15
+ cohort: "100 healthy Basque-Country donors"
16
+ measure: "neutralizing-antibody seroprevalence (%)"
17
+ independence: "does NOT feed the proxy (proxy = Calcedo 2009 + Boutin 2010); a genuine out-of-sample test"
18
+ observed_nab_prevalence_pct:
19
+ AAV1: 42
20
+ AAV2: 54
21
+ AAV5: 42
22
+ AAV6: 39
23
+ AAV8: 52
24
+ AAV9: 17
25
+ # (AAV3 64%, AAV4 21% also reported but not scored by PEN-STACK → excluded from the paired test.)
@@ -0,0 +1,59 @@
1
+ # PEN-STACK — expression-MODIFIER priors (v6.5, WS-EXPRESS). Multiplicative cis-elements that shift relative
2
+ # cassette expression. CRITICAL HONESTY: every fold-effect below is STRONGLY transgene-, cell-, and construct-
3
+ # dependent (the canonical warning: the chimeric intron is ~20× for CAT but ~3× for luciferase in the SAME assay).
4
+ # These are PRIORS/RANGES with citations — NOT deterministic multipliers. The model applies them with WIDE
5
+ # uncertainty and NEVER asserts an absolute fold; the in-vivo expression MAGNITUDE stays a known-unknown.
6
+ version: "1.0"
7
+
8
+ modifiers:
9
+ wpre:
10
+ present_fold: [2.0, 5.0] # AAV8 in vivo: ~5× mRNA liver, ~4× brain, ~2× muscle; lenti ~2–5×
11
+ default: 2.5
12
+ direction: increase
13
+ confidence: high
14
+ note: "woodchuck post-transcriptional regulatory element; most effective 3' of transgene, proximal to polyA"
15
+ citation: ["10.7150/ijms.14152", "Zufferey 1999 J Virol 73:2886"]
16
+ intron:
17
+ present_fold: [1.5, 5.0] # SV40 intron ~4.39× eGFP (CHO); chimeric 3–20× (transgene-dependent)
18
+ default: 2.0
19
+ direction: increase
20
+ confidence: medium
21
+ note: "chimeric/SV40/MVM intron; STRONGLY transgene-dependent (20× CAT vs 3× luciferase); some transgenes none"
22
+ citation: ["10.1111/jcmm.13504", "Promega pCI bulletin"]
23
+ polya_strength: # relative, bGH as the strong reference (≈3× SV40 early polyA)
24
+ bgh: 1.0
25
+ synthetic_spa: 0.85
26
+ sv40: 0.6
27
+ default: 0.8
28
+ confidence: high
29
+ note: "bGH ≈ 3× SV40 early polyA; synthetic/SV40 give lower variance + better nuclease resistance"
30
+ citation: ["10.1089/dna.1986.5.115", "PMC8819543"]
31
+ kozak_strength: # translation-initiation context (GCCRCCaugG optimal)
32
+ optimal: 1.0
33
+ moderate: 0.7
34
+ weak: 0.4
35
+ default: 0.85
36
+ confidence: medium
37
+ note: "-3 purine + +4G dominant; weak context can cut expression up to ~95%; restoring optimal ~3× (RUNX3)"
38
+ citation: ["10.1038/s41598-018-22330-9"]
39
+ codon_optimization: # CAI-driven; NON-MONOTONIC — higher CAI usually but not always higher
40
+ optimized_fold: [1.0, 10.0] # typical 2–10×; documented 6–9× and ~10×; can also fail/backfire
41
+ default: 2.0
42
+ direction: increase_usually
43
+ confidence: medium
44
+ note: "CAI correlates with expression IMPERFECTLY (GC%, mRNA structure, hidden motifs also matter); not guaranteed"
45
+ citation: ["10.3389/fbioe.2024.1371596", "Sharp & Li 1987 NAR 15:1281"]
46
+ cpg_silencing: # high CpG density in the transcribed region -> repression/silencing
47
+ direction: decrease
48
+ magnitude: "context/locus-dependent — NO single sourced fold"
49
+ confidence: high_direction_low_magnitude
50
+ note: "high CpG promotes transcriptional repression + de-novo methylation + immunogenicity; CpG-depletion can escape silencing"
51
+ citation: ["10.1186/gb-2003-4-9-r53"]
52
+
53
+ # composition policy (honesty): modifiers are applied as a BOUNDED relative shift with WIDE uncertainty, NOT a
54
+ # naive product of independent folds (no source supports multiplicativity). The output stays a relative,
55
+ # dimensionless estimate; absolute titer / % of normal remains a known-unknown.
56
+ composition:
57
+ policy: "bounded_relative_shift"
58
+ max_total_uplift: 4.0 # cap the combined modifier uplift (avoid runaway products)
59
+ uncertainty: "wide — modifier effects are transgene/context-dependent priors, not measured for this construct"
@@ -0,0 +1,52 @@
1
+ # PEN-STACK — comprehensive relative-promoter-strength palette (v6.5, WS-EXPRESS).
2
+ #
3
+ # A RELATIVE, ordinal, dimensionless strength per named promoter (0–1, EF1a/CAG ≈ 1.0 as the reference top tier).
4
+ # CRITICAL HONESTY: promoter strength has NO universal scalar — it depends on cell type, vector backbone, and
5
+ # readout (peak intensity vs long-term durability give DIFFERENT orderings; Qin 2010 vs Norrman 2010). So each
6
+ # entry carries its `context`, `assay`, a `citation`, and a `confidence`. The `strength` is an ordinal PRIOR
7
+ # anchored to the cited head-to-head studies — it is a proxy, not a measured absolute. Values marked
8
+ # `confidence: low` had no directly-sourced number (qualitative tier only). NEVER treat these as exact.
9
+ #
10
+ # Anchors: Qin 2010 PLoS ONE 5(5):e10611 (SV40/CMV/UBC/EF1A/PGK/CAGG × 8 cell types, peak GFP);
11
+ # Norrman 2010 PLoS ONE 5(8):e12413 (durability in hESC); Damdindorj 2014 PLoS ONE 9(8):e106472 (AAV context);
12
+ # plus the per-tissue citations below.
13
+ version: "1.0"
14
+ reference: "EF1a (full) / CAG ≈ 1.0 (top constitutive tier, Qin 2010)"
15
+
16
+ constitutive:
17
+ ef1a: { strength: 1.00, context: ubiquitous, assay: "peak GFP, 8 cell types", confidence: high, note: "full ~1.2 kb with intron 1; top tier (Qin 2010); durable", citation: "10.1371/journal.pone.0010611" }
18
+ cag: { strength: 1.00, context: ubiquitous, assay: "peak GFP, 8 cell types", confidence: high, note: "CMVe+chicken β-actin+rabbit β-globin; co-strongest (Qin 2010)", citation: "10.1371/journal.pone.0010611" }
19
+ cba: { strength: 0.95, context: ubiquitous, assay: "AAV/brain", confidence: medium, note: "CAG-class, ~1.6 kb (large for AAV)", citation: "10.1089/hum.2010.245" }
20
+ cbh: { strength: 0.90, context: ubiquitous, assay: "neurons/AAV", confidence: medium, note: "~0.8 kb hybrid; ≈CBA at half size; serotype-dependent", citation: "10.1089/hum.2010.245" }
21
+ cmv: { strength: 0.90, context: "variable!", assay: "peak GFP", confidence: high, note: "very strong transiently (293T) but SILENCES over time + in stem cells (6.7% eGFP+ d50 hESC)", citation: "10.1371/journal.pone.0012413" }
22
+ rsv: { strength: 0.85, context: ubiquitous, assay: "muscle/various", confidence: medium, note: "≈CMV-class historically", citation: "10.1038/sj.mt.6300027" }
23
+ sffv: { strength: 0.95, context: hematopoietic,assay: "human HSPC/blood", confidence: medium, note: "much stronger than CAG/EF1/PGK in blood lineage; silences in stem cells", citation: "10.1089/10430340252898984" }
24
+ mnd: { strength: 0.90, context: "t_cell/lenti",assay: "lentiviral CAR-T", confidence: medium, note: "≈EF1a in T cells (MND U3 / MoMuLV)", citation: "10.1016/j.omtm.2022.05.005" }
25
+ mscv: { strength: 0.80, context: "hsc/retro", assay: "gammaretro backbone", confidence: medium, note: "strong in gammaretro; underperforms in lentiviral backbone", citation: "PMC7380635" }
26
+ sv40: { strength: 0.70, context: ubiquitous, assay: "peak GFP", confidence: high, note: "mid tier; generally weaker than EF1a/CAG (Qin 2010)", citation: "10.1371/journal.pone.0010611" }
27
+ efs: { strength: 0.70, context: ubiquitous, assay: "lenti/size-limited", confidence: low, note: "EF1a core (intronless ~0.2 kb); weaker than full EF1a — fold not directly sourced", citation: null }
28
+ jet: { strength: 0.55, context: ubiquitous, assay: synthetic, confidence: low, note: "compact synthetic minimal; relative number not sourced", citation: "10.1016/S0378-1119(02)00878-8" }
29
+ casi: { strength: 0.90, context: hematopoietic,assay: synthetic, confidence: low, note: "CAG-derived synthetic (CMVe+β-actin+UBC enh); head-to-head fold not sourced", citation: null }
30
+ actb: { strength: 0.80, context: ubiquitous, assay: "durability hESC", confidence: high, note: "human β-actin promoter; top long-term durability (74% eGFP+ d50 hESC, Norrman 2010)", citation: "10.1371/journal.pone.0012413" }
31
+ hsv_tk: { strength: 0.30, context: ubiquitous, assay: "AAV", confidence: medium, note: "HSV thymidine-kinase promoter; weak constitutive reference (Damdindorj 2014)", citation: "10.1371/journal.pone.0106472" }
32
+ pgk: { strength: 0.50, context: ubiquitous, assay: "peak GFP", confidence: high, note: "weak peak but DURABLE/low-silencing (74% eGFP+ d50 hESC)", citation: "10.1371/journal.pone.0010611" }
33
+ ubc: { strength: 0.40, context: ubiquitous, assay: "peak GFP", confidence: high, note: "weakest of the common constitutive set (Qin 2010)", citation: "10.1371/journal.pone.0010611" }
34
+
35
+ tissue_specific:
36
+ tbg: { strength: 1.00, context: liver, confidence: medium, note: "top liver promoter (> LP1 > HLP); clean liver restriction; compact", citation: "10.1016/j.gene.2012.07.009" }
37
+ apoe_haat: { strength: 0.85, context: liver, confidence: medium, note: "ApoE-HCR enhancer + hAAT; first hemophilia-B FIX trials", citation: "10.1182/blood-2005-10-4035" }
38
+ lp1: { strength: 0.85, context: liver, confidence: medium, note: "HCR1 enhancer + hAAT core; clinical FIX from single AAV (2nd after TBG)", citation: "10.1182/blood-2005-10-4035" }
39
+ haat: { strength: 0.80, context: liver, confidence: medium, note: "human α1-antitrypsin; base of ApoE-hAAT/LP1 hybrids", citation: "10.1182/blood-2005-10-4035" }
40
+ hlp: { strength: 0.70, context: liver, confidence: medium, note: "HCR+hAAT+ApoE ~800 bp; below TBG/LP1; therapeutic at compact size", citation: "10.1016/j.gene.2012.07.009" }
41
+ camkiia: { strength: 0.90, context: neuron, confidence: medium, note: "excitatory neurons; greater overall expression than hSyn1", citation: "10.1016/j.neulet.2021.135889" }
42
+ hsyn: { strength: 0.70, context: neuron, confidence: medium, note: "pan-neuronal ~460 bp; robust but slower kinetics (CAG-level only by ~3 mo)", citation: "10.1016/j.neulet.2021.135889" }
43
+ mecp2: { strength: 0.50, context: neuron, confidence: low, note: "neuron-restricted compact; weaker — relative fold not sourced", citation: null }
44
+ gfaabc1d: { strength: 0.80, context: astrocyte,confidence: high, note: "~681 bp; ~2× stronger than full gfa2; astrocyte-restricted", citation: "10.1002/glia.20622" }
45
+ gfap: { strength: 0.60, context: astrocyte,confidence: medium,note: "gfa2 ~2.2 kb astrocyte-selective", citation: "10.1002/glia.20622" }
46
+ mhck7: { strength: 1.00, context: muscle, confidence: medium, note: "MCK enh + α-MHC ~770 bp; highest of muscle panel; DMD clinical", citation: "10.1038/sj.mt.6300027" }
47
+ mck: { strength: 0.90, context: muscle, confidence: medium, note: "truncated MCK; more active than CMV in muscle", citation: "10.1038/gt.2008.104" }
48
+ ck8: { strength: 0.85, context: muscle, confidence: low, note: "compact muscle promoter; DMD clinical vectors", citation: "10.32607/actanaturae.11063" }
49
+ desmin: { strength: 0.70, context: muscle, confidence: medium, note: "mid muscle tier; ≈CMV in myotubes", citation: "10.1038/sj.mt.6300027" }
50
+
51
+ # default for an unrecognised / unspecified promoter (the prior mean; honest abstention to mid-strength).
52
+ default_strength: 0.5
@@ -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."
@@ -82,11 +82,18 @@ metrics:
82
82
  scale: "0–1 (relative, dimensionless), with an interval"
83
83
  direction: "higher = stronger relative cassette expression — NOT an absolute titer"
84
84
  bands: { strong: ">=0.6", moderate: "0.3–0.6", weak: "<0.3" }
85
- means: "a RELATIVE, dimensionless expression estimate (promoter × copy number × accessibility). It is NOT a
86
- phenotype, NOT a functional titer, and NOT a percent-of-normal — those are measured clinical endpoints."
87
- computed: "closed-form mechanistic twin (steady-state; no silencing modeled; linear copy scaling), fused with
88
- the immune context; interval is a heuristic band that WIDENS ~1. under out-of-distribution context."
89
- validation: "honest heuristic band NOT a trained conformal interval (no public perturbation-outcome calibration set)."
85
+ means: "a RELATIVE, dimensionless expression estimate (promoter × copy number × accessibility, + a bounded
86
+ modifier uplift range). It is NOT a phenotype, NOT a functional titer, and NOT a percent-of-normal — those
87
+ are measured clinical endpoints."
88
+ computed: "closed-form mechanistic twin over a COMPREHENSIVE literature-cited palette (v6.5: 31 promoters,
89
+ constitutive + tissue-specific, each with its context/assay/citation configs/expression/promoters.yaml)
90
+ plus modifier PRIORS (WPRE, intron, polyA, Kozak, codon-opt, CpG-silencing — configs/expression/modifiers.yaml,
91
+ reported as a bounded uplift RANGE, never a point multiplier). Interval widens ~1.6× under OOD context."
92
+ validation: "richly literature-anchored PROXY, NOT outcome-validated: an INDEPENDENT promoter study
93
+ (Damdindorj 2014) disagrees with the anchor (Qin 2010) on CMV/CAG/EF1a ordering — promoter strength is
94
+ genuinely CONTEXT-dependent (cell × vector × readout), so a single context-free ordinal does not validate
95
+ cross-study (Spearman ~0.12 vs Damdindorj, CI includes 0). The palette now ENCODES that context rather than
96
+ asserting a universal number. Modifier folds are transgene-dependent priors."
90
97
  reference: "absolute titer / % of normal is explicitly out of scope (known-unknown in_vivo_expression_magnitude)."
91
98
 
92
99
  # how to read the safety decision (categorical, not a number)
@@ -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.4.3"
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).")