pen-stack 7.2.0__tar.gz → 7.2.1__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 (584) hide show
  1. {pen_stack-7.2.0 → pen_stack-7.2.1}/CHANGELOG.md +30 -0
  2. {pen_stack-7.2.0 → pen_stack-7.2.1}/CITATION.cff +2 -2
  3. {pen_stack-7.2.0 → pen_stack-7.2.1}/PKG-INFO +1 -1
  4. pen_stack-7.2.1/benchmarks/offtarget/integrase/README.md +23 -0
  5. pen_stack-7.2.1/benchmarks/offtarget/integrase/SHA256SUMS +4 -0
  6. pen_stack-7.2.1/data/curated/integrase_att.yaml +66 -0
  7. {pen_stack-7.2.0 → pen_stack-7.2.1}/docs/cards/offtarget_data.md +1 -2
  8. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/__init__.py +1 -1
  9. pen_stack-7.2.1/pen_stack/wgenome/offtarget_integrase.py +111 -0
  10. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/wgenome/offtarget_paste.py +1 -1
  11. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack.egg-info/PKG-INFO +1 -1
  12. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack.egg-info/SOURCES.txt +2 -0
  13. pen_stack-7.2.1/prereg/SHA256_LOCK_ws_offtarget2.json +9 -0
  14. {pen_stack-7.2.0 → pen_stack-7.2.1}/prereg/ws_offtarget2.yaml +8 -1
  15. {pen_stack-7.2.0 → pen_stack-7.2.1}/pyproject.toml +1 -1
  16. pen_stack-7.2.0/data/curated/integrase_att.yaml +0 -43
  17. pen_stack-7.2.0/pen_stack/wgenome/offtarget_integrase.py +0 -88
  18. pen_stack-7.2.0/prereg/SHA256_LOCK_ws_offtarget2.json +0 -8
  19. {pen_stack-7.2.0 → pen_stack-7.2.1}/LICENSE +0 -0
  20. {pen_stack-7.2.0 → pen_stack-7.2.1}/MANIFEST.in +0 -0
  21. {pen_stack-7.2.0 → pen_stack-7.2.1}/README.md +0 -0
  22. {pen_stack-7.2.0 → pen_stack-7.2.1}/bench/run.py +0 -0
  23. {pen_stack-7.2.0 → pen_stack-7.2.1}/benchmarks/chat_grounding/README.md +0 -0
  24. {pen_stack-7.2.0 → pen_stack-7.2.1}/benchmarks/chat_grounding/SHA256SUMS +0 -0
  25. {pen_stack-7.2.0 → pen_stack-7.2.1}/benchmarks/chat_headtohead/README.md +0 -0
  26. {pen_stack-7.2.0 → pen_stack-7.2.1}/benchmarks/chat_routing/README.md +0 -0
  27. {pen_stack-7.2.0 → pen_stack-7.2.1}/benchmarks/chat_routing/SHA256SUMS +0 -0
  28. {pen_stack-7.2.0 → pen_stack-7.2.1}/benchmarks/chat_safety/README.md +0 -0
  29. {pen_stack-7.2.0 → pen_stack-7.2.1}/benchmarks/chat_safety/SHA256SUMS +0 -0
  30. {pen_stack-7.2.0 → pen_stack-7.2.1}/benchmarks/delivery/SHA256SUMS +0 -0
  31. {pen_stack-7.2.0 → pen_stack-7.2.1}/benchmarks/genome_writing_bench/LEADERBOARD.md +0 -0
  32. {pen_stack-7.2.0 → pen_stack-7.2.1}/benchmarks/genome_writing_bench/README.md +0 -0
  33. {pen_stack-7.2.0 → pen_stack-7.2.1}/benchmarks/genome_writing_bench/SHA256SUMS +0 -0
  34. {pen_stack-7.2.0 → pen_stack-7.2.1}/benchmarks/genome_writing_bench/SUBMISSIONS.md +0 -0
  35. {pen_stack-7.2.0 → pen_stack-7.2.1}/benchmarks/genome_writing_bench/tasks.yaml +0 -0
  36. {pen_stack-7.2.0 → pen_stack-7.2.1}/benchmarks/genome_writing_challenge/README.md +0 -0
  37. {pen_stack-7.2.0 → pen_stack-7.2.1}/benchmarks/genome_writing_challenge/SUBMISSIONS.md +0 -0
  38. {pen_stack-7.2.0 → pen_stack-7.2.1}/benchmarks/loop/SHA256SUMS +0 -0
  39. {pen_stack-7.2.0 → pen_stack-7.2.1}/benchmarks/offtarget/SHA256SUMS +0 -0
  40. {pen_stack-7.2.0 → pen_stack-7.2.1}/benchmarks/oracle/SHA256SUMS +0 -0
  41. {pen_stack-7.2.0 → pen_stack-7.2.1}/benchmarks/position_effect/README.md +0 -0
  42. {pen_stack-7.2.0 → pen_stack-7.2.1}/benchmarks/position_effect/SHA256SUMS +0 -0
  43. {pen_stack-7.2.0 → pen_stack-7.2.1}/benchmarks/verify/SHA256SUMS +0 -0
  44. {pen_stack-7.2.0 → pen_stack-7.2.1}/benchmarks/writer_efficiency/README.md +0 -0
  45. {pen_stack-7.2.0 → pen_stack-7.2.1}/benchmarks/writer_efficiency/SHA256SUMS +0 -0
  46. {pen_stack-7.2.0 → pen_stack-7.2.1}/benchmarks/writespec/SHA256SUMS +0 -0
  47. {pen_stack-7.2.0 → pen_stack-7.2.1}/configs/aav_serotype_tropism.yaml +0 -0
  48. {pen_stack-7.2.0 → pen_stack-7.2.1}/configs/antipeg.yaml +0 -0
  49. {pen_stack-7.2.0 → pen_stack-7.2.1}/configs/atlas_families.yaml +0 -0
  50. {pen_stack-7.2.0 → pen_stack-7.2.1}/configs/bridge_offtarget_profile.yaml +0 -0
  51. {pen_stack-7.2.0 → pen_stack-7.2.1}/configs/calibration/preexisting_nab_independent.yaml +0 -0
  52. {pen_stack-7.2.0 → pen_stack-7.2.1}/configs/capsid_epitope_oracle.yaml +0 -0
  53. {pen_stack-7.2.0 → pen_stack-7.2.1}/configs/capsid_sequences.fasta +0 -0
  54. {pen_stack-7.2.0 → pen_stack-7.2.1}/configs/cargo_polish.yaml +0 -0
  55. {pen_stack-7.2.0 → pen_stack-7.2.1}/configs/cell_types.yaml +0 -0
  56. {pen_stack-7.2.0 → pen_stack-7.2.1}/configs/datasets.yaml +0 -0
  57. {pen_stack-7.2.0 → pen_stack-7.2.1}/configs/delivery_constraints.yaml +0 -0
  58. {pen_stack-7.2.0 → pen_stack-7.2.1}/configs/delivery_rules.yaml +0 -0
  59. {pen_stack-7.2.0 → pen_stack-7.2.1}/configs/delivery_vehicles.yaml +0 -0
  60. {pen_stack-7.2.0 → pen_stack-7.2.1}/configs/expression/modifiers.yaml +0 -0
  61. {pen_stack-7.2.0 → pen_stack-7.2.1}/configs/expression/promoters.yaml +0 -0
  62. {pen_stack-7.2.0 → pen_stack-7.2.1}/configs/gates_v3.yaml +0 -0
  63. {pen_stack-7.2.0 → pen_stack-7.2.1}/configs/genotoxicity_oracle.yaml +0 -0
  64. {pen_stack-7.2.0 → pen_stack-7.2.1}/configs/gsh_validated_heldout.yaml +0 -0
  65. {pen_stack-7.2.0 → pen_stack-7.2.1}/configs/intent_weights.yaml +0 -0
  66. {pen_stack-7.2.0 → pen_stack-7.2.1}/configs/known_unknowns.yaml +0 -0
  67. {pen_stack-7.2.0 → pen_stack-7.2.1}/configs/llm.yaml +0 -0
  68. {pen_stack-7.2.0 → pen_stack-7.2.1}/configs/metric_guide.yaml +0 -0
  69. {pen_stack-7.2.0 → pen_stack-7.2.1}/configs/mhc_epitope_oracle.yaml +0 -0
  70. {pen_stack-7.2.0 → pen_stack-7.2.1}/configs/monitor_queries.yaml +0 -0
  71. {pen_stack-7.2.0 → pen_stack-7.2.1}/configs/oracles/execution.yaml +0 -0
  72. {pen_stack-7.2.0 → pen_stack-7.2.1}/configs/oracles/reliability.yaml +0 -0
  73. {pen_stack-7.2.0 → pen_stack-7.2.1}/configs/oracles/scope_cards.yaml +0 -0
  74. {pen_stack-7.2.0 → pen_stack-7.2.1}/configs/rules/compliance.yaml +0 -0
  75. {pen_stack-7.2.0 → pen_stack-7.2.1}/configs/rules/delivery.yaml +0 -0
  76. {pen_stack-7.2.0 → pen_stack-7.2.1}/configs/rules/fold.yaml +0 -0
  77. {pen_stack-7.2.0 → pen_stack-7.2.1}/configs/rules/multiplex.yaml +0 -0
  78. {pen_stack-7.2.0 → pen_stack-7.2.1}/configs/rules/payload.yaml +0 -0
  79. {pen_stack-7.2.0 → pen_stack-7.2.1}/configs/rules/reachability.yaml +0 -0
  80. {pen_stack-7.2.0 → pen_stack-7.2.1}/configs/safety/hazard_registry.yaml +0 -0
  81. {pen_stack-7.2.0 → pen_stack-7.2.1}/configs/safety/policy.yaml +0 -0
  82. {pen_stack-7.2.0 → pen_stack-7.2.1}/configs/safety/probes.yaml +0 -0
  83. {pen_stack-7.2.0 → pen_stack-7.2.1}/configs/score_axes.yaml +0 -0
  84. {pen_stack-7.2.0 → pen_stack-7.2.1}/configs/seroprevalence.yaml +0 -0
  85. {pen_stack-7.2.0 → pen_stack-7.2.1}/configs/target_sites.yaml +0 -0
  86. {pen_stack-7.2.0 → pen_stack-7.2.1}/configs/universe_crosswalk.yaml +0 -0
  87. {pen_stack-7.2.0 → pen_stack-7.2.1}/configs/write_types.yaml +0 -0
  88. {pen_stack-7.2.0 → pen_stack-7.2.1}/configs/writer_sequences.fasta +0 -0
  89. {pen_stack-7.2.0 → pen_stack-7.2.1}/configs/wtkb_curated.yaml +0 -0
  90. {pen_stack-7.2.0 → pen_stack-7.2.1}/data/curated/bridge_offtarget_energetics.json +0 -0
  91. {pen_stack-7.2.0 → pen_stack-7.2.1}/data/curated/bridge_offtarget_profile_measured.parquet +0 -0
  92. {pen_stack-7.2.0 → pen_stack-7.2.1}/data/curated/cast_systems.yaml +0 -0
  93. {pen_stack-7.2.0 → pen_stack-7.2.1}/data/curated/gene_coords.parquet +0 -0
  94. {pen_stack-7.2.0 → pen_stack-7.2.1}/data/curated/unified_editor_universe.parquet +0 -0
  95. {pen_stack-7.2.0 → pen_stack-7.2.1}/data/offtarget/enumerated_cache.parquet +0 -0
  96. {pen_stack-7.2.0 → pen_stack-7.2.1}/data/offtarget/motif_cache.parquet +0 -0
  97. {pen_stack-7.2.0 → pen_stack-7.2.1}/docs/BACKLOG.md +0 -0
  98. {pen_stack-7.2.0 → pen_stack-7.2.1}/docs/DEPLOY.md +0 -0
  99. {pen_stack-7.2.0 → pen_stack-7.2.1}/docs/INFRA.md +0 -0
  100. {pen_stack-7.2.0 → pen_stack-7.2.1}/docs/MCP.md +0 -0
  101. {pen_stack-7.2.0 → pen_stack-7.2.1}/docs/RELEASING.md +0 -0
  102. {pen_stack-7.2.0 → pen_stack-7.2.1}/docs/REPRO.md +0 -0
  103. {pen_stack-7.2.0 → pen_stack-7.2.1}/docs/STABILITY.md +0 -0
  104. {pen_stack-7.2.0 → pen_stack-7.2.1}/docs/agent.md +0 -0
  105. {pen_stack-7.2.0 → pen_stack-7.2.1}/docs/alphagenome_feasibility.md +0 -0
  106. {pen_stack-7.2.0 → pen_stack-7.2.1}/docs/autonomy.md +0 -0
  107. {pen_stack-7.2.0 → pen_stack-7.2.1}/docs/benchmark_circularity.md +0 -0
  108. {pen_stack-7.2.0 → pen_stack-7.2.1}/docs/biosecurity.md +0 -0
  109. {pen_stack-7.2.0 → pen_stack-7.2.1}/docs/build_interface.md +0 -0
  110. {pen_stack-7.2.0 → pen_stack-7.2.1}/docs/cards/atlas.md +0 -0
  111. {pen_stack-7.2.0 → pen_stack-7.2.1}/docs/cards/durability.md +0 -0
  112. {pen_stack-7.2.0 → pen_stack-7.2.1}/docs/cards/position_effect_data.md +0 -0
  113. {pen_stack-7.2.0 → pen_stack-7.2.1}/docs/cards/safety.md +0 -0
  114. {pen_stack-7.2.0 → pen_stack-7.2.1}/docs/cards/writer_efficiency_data.md +0 -0
  115. {pen_stack-7.2.0 → pen_stack-7.2.1}/docs/challenge.md +0 -0
  116. {pen_stack-7.2.0 → pen_stack-7.2.1}/docs/closed_loop.md +0 -0
  117. {pen_stack-7.2.0 → pen_stack-7.2.1}/docs/co_scientist.md +0 -0
  118. {pen_stack-7.2.0 → pen_stack-7.2.1}/docs/co_scientist_loop.md +0 -0
  119. {pen_stack-7.2.0 → pen_stack-7.2.1}/docs/delivery.md +0 -0
  120. {pen_stack-7.2.0 → pen_stack-7.2.1}/docs/delivery_immunology.md +0 -0
  121. {pen_stack-7.2.0 → pen_stack-7.2.1}/docs/delivery_recommender.md +0 -0
  122. {pen_stack-7.2.0 → pen_stack-7.2.1}/docs/digital_twin.md +0 -0
  123. {pen_stack-7.2.0 → pen_stack-7.2.1}/docs/dissemination.md +0 -0
  124. {pen_stack-7.2.0 → pen_stack-7.2.1}/docs/environment.md +0 -0
  125. {pen_stack-7.2.0 → pen_stack-7.2.1}/docs/experiment_design.md +0 -0
  126. {pen_stack-7.2.0 → pen_stack-7.2.1}/docs/generative_design.md +0 -0
  127. {pen_stack-7.2.0 → pen_stack-7.2.1}/docs/immune_profiler.md +0 -0
  128. {pen_stack-7.2.0 → pen_stack-7.2.1}/docs/index.md +0 -0
  129. {pen_stack-7.2.0 → pen_stack-7.2.1}/docs/integrations.md +0 -0
  130. {pen_stack-7.2.0 → pen_stack-7.2.1}/docs/live_oracles.md +0 -0
  131. {pen_stack-7.2.0 → pen_stack-7.2.1}/docs/mechanistic_constraints.md +0 -0
  132. {pen_stack-7.2.0 → pen_stack-7.2.1}/docs/offtarget.md +0 -0
  133. {pen_stack-7.2.0 → pen_stack-7.2.1}/docs/oracle_mesh.md +0 -0
  134. {pen_stack-7.2.0 → pen_stack-7.2.1}/docs/oracles.md +0 -0
  135. {pen_stack-7.2.0 → pen_stack-7.2.1}/docs/position_effect.md +0 -0
  136. {pen_stack-7.2.0 → pen_stack-7.2.1}/docs/positioning.md +0 -0
  137. {pen_stack-7.2.0 → pen_stack-7.2.1}/docs/private_data_formats.md +0 -0
  138. {pen_stack-7.2.0 → pen_stack-7.2.1}/docs/quickstart.md +0 -0
  139. {pen_stack-7.2.0 → pen_stack-7.2.1}/docs/responsible_use.md +0 -0
  140. {pen_stack-7.2.0 → pen_stack-7.2.1}/docs/rule_spec.md +0 -0
  141. {pen_stack-7.2.0 → pen_stack-7.2.1}/docs/rules.md +0 -0
  142. {pen_stack-7.2.0 → pen_stack-7.2.1}/docs/scope.md +0 -0
  143. {pen_stack-7.2.0 → pen_stack-7.2.1}/docs/scorecard.md +0 -0
  144. {pen_stack-7.2.0 → pen_stack-7.2.1}/docs/tpe_bench.md +0 -0
  145. {pen_stack-7.2.0 → pen_stack-7.2.1}/docs/tutorials/compare-families.md +0 -0
  146. {pen_stack-7.2.0 → pen_stack-7.2.1}/docs/tutorials/score-deliverability.md +0 -0
  147. {pen_stack-7.2.0 → pen_stack-7.2.1}/docs/tutorials/where-can-i-write.md +0 -0
  148. {pen_stack-7.2.0 → pen_stack-7.2.1}/docs/tutorials/which-writer-reaches-locus.md +0 -0
  149. {pen_stack-7.2.0 → pen_stack-7.2.1}/docs/uncertainty.md +0 -0
  150. {pen_stack-7.2.0 → pen_stack-7.2.1}/docs/verify.md +0 -0
  151. {pen_stack-7.2.0 → pen_stack-7.2.1}/docs/verify_service.md +0 -0
  152. {pen_stack-7.2.0 → pen_stack-7.2.1}/docs/world_model.md +0 -0
  153. {pen_stack-7.2.0 → pen_stack-7.2.1}/docs/writer_efficiency.md +0 -0
  154. {pen_stack-7.2.0 → pen_stack-7.2.1}/docs/writer_verification.md +0 -0
  155. {pen_stack-7.2.0 → pen_stack-7.2.1}/docs/writespec_bench.md +0 -0
  156. {pen_stack-7.2.0 → pen_stack-7.2.1}/docs/writespec_profile.md +0 -0
  157. {pen_stack-7.2.0 → pen_stack-7.2.1}/docs/wtkb.md +0 -0
  158. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/_resources.py +0 -0
  159. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/active/__init__.py +0 -0
  160. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/active/acquire.py +0 -0
  161. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/active/brains.py +0 -0
  162. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/active/campaign.py +0 -0
  163. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/active/design.py +0 -0
  164. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/active/validate.py +0 -0
  165. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/adapt/__init__.py +0 -0
  166. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/adapt/finetune.py +0 -0
  167. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/adapt/ingest.py +0 -0
  168. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/adapt/pipeline.py +0 -0
  169. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/adapt/recalibrate.py +0 -0
  170. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/adapt/report.py +0 -0
  171. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/agent/__init__.py +0 -0
  172. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/agent/cite.py +0 -0
  173. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/agent/co_scientist.py +0 -0
  174. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/agent/epistemic.py +0 -0
  175. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/agent/guardrails.py +0 -0
  176. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/agent/mcp_server.py +0 -0
  177. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/agent/orchestrator.py +0 -0
  178. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/agent/orchestrator_live.py +0 -0
  179. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/agent/pen_agent.py +0 -0
  180. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/agent/scope.py +0 -0
  181. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/agent/tools.py +0 -0
  182. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/api/__init__.py +0 -0
  183. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/api/manifest.py +0 -0
  184. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/atlas/__init__.py +0 -0
  185. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/atlas/build_wtkb.py +0 -0
  186. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/atlas/crosslink.py +0 -0
  187. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/atlas/expand.py +0 -0
  188. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/atlas/guide_design.py +0 -0
  189. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/atlas/schema.py +0 -0
  190. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/atlas/scorecard.py +0 -0
  191. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/atlas/universe.py +0 -0
  192. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/atlas/variant_propose.py +0 -0
  193. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/atlas/writer_efficiency.py +0 -0
  194. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/atlas/writer_predict.py +0 -0
  195. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/atlas/writer_recommend.py +0 -0
  196. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/atlas/writer_verify.py +0 -0
  197. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/bridge/__init__.py +0 -0
  198. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/bridge/activity.py +0 -0
  199. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/bridge/cli.py +0 -0
  200. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/bridge/fold_qc.py +0 -0
  201. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/bridge/guide_qc.py +0 -0
  202. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/bridge/ingest.py +0 -0
  203. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/bridge/offtarget.py +0 -0
  204. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/bridge/offtarget_energetics.py +0 -0
  205. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/bridge/ortholog_screen.py +0 -0
  206. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/bridge/pipeline.py +0 -0
  207. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/build/__init__.py +0 -0
  208. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/build/cloudlab.py +0 -0
  209. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/build/ingest.py +0 -0
  210. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/build/protocol.py +0 -0
  211. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/build/simlab.py +0 -0
  212. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/cli.py +0 -0
  213. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/data/__init__.py +0 -0
  214. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/data/encode.py +0 -0
  215. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/data/genome.py +0 -0
  216. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/data/ingest_chromatin.py +0 -0
  217. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/data/ingest_integration.py +0 -0
  218. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/data/ingest_safety_annot.py +0 -0
  219. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/data/ingest_trip.py +0 -0
  220. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/design/__init__.py +0 -0
  221. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/design/capsid_generate.py +0 -0
  222. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/design/generate.py +0 -0
  223. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/design/pareto.py +0 -0
  224. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/design/space.py +0 -0
  225. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/design/writer_variants.py +0 -0
  226. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/env/__init__.py +0 -0
  227. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/env/genome_writing_env.py +0 -0
  228. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/env/policies.py +0 -0
  229. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/graph/__init__.py +0 -0
  230. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/graph/build.py +0 -0
  231. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/graph/cell_types.py +0 -0
  232. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/graph/ingest.py +0 -0
  233. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/graph/query.py +0 -0
  234. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/graph/schema.py +0 -0
  235. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/loop/__init__.py +0 -0
  236. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/loop/continual.py +0 -0
  237. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/loop/cycle.py +0 -0
  238. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/loop/drift.py +0 -0
  239. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/mech/__init__.py +0 -0
  240. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/mech/classify_atlas.py +0 -0
  241. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/mech/whitelist.py +0 -0
  242. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/monitor/__init__.py +0 -0
  243. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/monitor/europepmc.py +0 -0
  244. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/monitor/run.py +0 -0
  245. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/monitor/triage.py +0 -0
  246. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/oracles/__init__.py +0 -0
  247. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/oracles/affinity.py +0 -0
  248. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/oracles/cache.py +0 -0
  249. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/oracles/energetics.py +0 -0
  250. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/oracles/genome.py +0 -0
  251. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/oracles/protein_design.py +0 -0
  252. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/oracles/reliability.py +0 -0
  253. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/oracles/rna.py +0 -0
  254. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/oracles/schema.py +0 -0
  255. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/oracles/status.py +0 -0
  256. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/oracles/structure.py +0 -0
  257. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/oracles/structure_run.py +0 -0
  258. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/oracles/vcell.py +0 -0
  259. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/planner/__init__.py +0 -0
  260. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/planner/ada_risk.py +0 -0
  261. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/planner/antipeg_oracle.py +0 -0
  262. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/planner/capsid_epitope_oracle.py +0 -0
  263. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/planner/cargo.py +0 -0
  264. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/planner/cargo_polish.py +0 -0
  265. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/planner/chromosome.py +0 -0
  266. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/planner/delivery.py +0 -0
  267. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/planner/delivery_constraints.py +0 -0
  268. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/planner/delivery_immune.py +0 -0
  269. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/planner/delivery_immunology.py +0 -0
  270. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/planner/delivery_predict.py +0 -0
  271. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/planner/delivery_vehicles.py +0 -0
  272. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/planner/genotoxicity_oracle.py +0 -0
  273. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/planner/immune_mhc2.py +0 -0
  274. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/planner/immune_profile.py +0 -0
  275. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/planner/innate_sensing.py +0 -0
  276. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/planner/multiplex.py +0 -0
  277. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/planner/optimize.py +0 -0
  278. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/planner/pipeline.py +0 -0
  279. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/planner/report.py +0 -0
  280. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/planner/router.py +0 -0
  281. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/planner/seroprevalence_oracle.py +0 -0
  282. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/planner/target_site.py +0 -0
  283. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/rag/__init__.py +0 -0
  284. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/rag/corpus.py +0 -0
  285. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/rag/embed.py +0 -0
  286. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/rag/ground.py +0 -0
  287. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/rag/index.py +0 -0
  288. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/rag/llm.py +0 -0
  289. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/rag/qa.py +0 -0
  290. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/rag/retrieve.py +0 -0
  291. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/rules/__init__.py +0 -0
  292. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/rules/evaluators.py +0 -0
  293. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/rules/loader.py +0 -0
  294. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/rules/schema.py +0 -0
  295. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/rules/solver.py +0 -0
  296. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/rules/spec.py +0 -0
  297. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/safety/__init__.py +0 -0
  298. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/safety/audit.py +0 -0
  299. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/safety/gate.py +0 -0
  300. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/safety/policy.py +0 -0
  301. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/safety/redteam.py +0 -0
  302. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/safety/registry.py +0 -0
  303. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/safety/screen.py +0 -0
  304. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/safety/standards.py +0 -0
  305. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/score/__init__.py +0 -0
  306. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/score/recalibrate.py +0 -0
  307. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/score/therapeutic.py +0 -0
  308. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/server/__init__.py +0 -0
  309. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/server/api.py +0 -0
  310. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/spec/__init__.py +0 -0
  311. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/spec/clarify.py +0 -0
  312. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/spec/extract.py +0 -0
  313. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/spec/resolvers/__init__.py +0 -0
  314. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/spec/resolvers/cell.py +0 -0
  315. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/spec/resolvers/chem.py +0 -0
  316. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/spec/resolvers/feature.py +0 -0
  317. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/spec/resolvers/gene.py +0 -0
  318. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/spec/resolvers/locus.py +0 -0
  319. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/spec/resolvers/phenotype.py +0 -0
  320. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/spec/satisfy.py +0 -0
  321. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/spec/service.py +0 -0
  322. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/spec/writespec.py +0 -0
  323. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/twin/__init__.py +0 -0
  324. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/twin/calibrate.py +0 -0
  325. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/twin/data/__init__.py +0 -0
  326. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/twin/data/position_effect.py +0 -0
  327. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/twin/mechanistic.py +0 -0
  328. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/twin/outcome.py +0 -0
  329. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/twin/position_effect.py +0 -0
  330. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/ui/__init__.py +0 -0
  331. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/ui/app.py +0 -0
  332. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/validate/__init__.py +0 -0
  333. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/validate/adapt_demo.py +0 -0
  334. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/validate/agent_eval.py +0 -0
  335. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/validate/bench_adversarial_tasks.py +0 -0
  336. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/validate/bench_coscientist_tasks.py +0 -0
  337. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/validate/bench_graph_tasks.py +0 -0
  338. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/validate/bench_rule_tasks.py +0 -0
  339. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/validate/bench_trust_tasks.py +0 -0
  340. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/validate/bench_writetype_tasks.py +0 -0
  341. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/validate/blind_gsh_discovery.py +0 -0
  342. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/validate/cargo_directionality.py +0 -0
  343. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/validate/closed_loop.py +0 -0
  344. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/validate/durability_baselines.py +0 -0
  345. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/validate/experiment_design.py +0 -0
  346. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/validate/expr_controls.py +0 -0
  347. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/validate/forward_hypotheses.py +0 -0
  348. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/validate/generative_design.py +0 -0
  349. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/validate/guide_qc_demo.py +0 -0
  350. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/validate/heldout_celltype_expr.py +0 -0
  351. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/validate/immune_calibration.py +0 -0
  352. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/validate/intent_specification.py +0 -0
  353. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/validate/known_biology_expr.py +0 -0
  354. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/validate/offtarget_energetics_eval.py +0 -0
  355. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/validate/out_of_scope_refusal.py +0 -0
  356. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/validate/outcome_calibration.py +0 -0
  357. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/validate/outcome_prediction.py +0 -0
  358. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/validate/paper3_benchmark.py +0 -0
  359. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/validate/paper4_real_validation.py +0 -0
  360. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/validate/paper4_validation.py +0 -0
  361. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/validate/protocol_safety.py +0 -0
  362. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/validate/safety_screening.py +0 -0
  363. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/validate/selective_prediction.py +0 -0
  364. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/validate/seq_vs_measured.py +0 -0
  365. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/validate/target_site_controls.py +0 -0
  366. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/validate/uncertainty_eval.py +0 -0
  367. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/validate/ungrounded_baseline.py +0 -0
  368. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/validate/within_locus_ranking.py +0 -0
  369. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/validate/writer_recovery.py +0 -0
  370. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/verify/__init__.py +0 -0
  371. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/verify/proof.py +0 -0
  372. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/verify/schema.py +0 -0
  373. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/verify/service.py +0 -0
  374. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/web/__init__.py +0 -0
  375. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/web/guide.py +0 -0
  376. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/web/llm.py +0 -0
  377. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/web/llm_provider.py +0 -0
  378. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/web/router.py +0 -0
  379. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/web/server.py +0 -0
  380. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/web/tools.py +0 -0
  381. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/wgenome/__init__.py +0 -0
  382. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/wgenome/chromatin_seq.py +0 -0
  383. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/wgenome/durability.py +0 -0
  384. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/wgenome/export_tracks.py +0 -0
  385. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/wgenome/features.py +0 -0
  386. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/wgenome/gsh_baseline.py +0 -0
  387. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/wgenome/mesh_features.py +0 -0
  388. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/wgenome/offtarget_assay.py +0 -0
  389. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/wgenome/offtarget_bridge.py +0 -0
  390. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/wgenome/offtarget_cast.py +0 -0
  391. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/wgenome/offtarget_data.py +0 -0
  392. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/wgenome/offtarget_enumerate.py +0 -0
  393. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/wgenome/offtarget_nuclease.py +0 -0
  394. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/wgenome/offtarget_predict.py +0 -0
  395. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/wgenome/ood.py +0 -0
  396. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/wgenome/providers.py +0 -0
  397. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/wgenome/safety.py +0 -0
  398. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/wgenome/structure3d.py +0 -0
  399. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/wgenome/uncertainty.py +0 -0
  400. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack/wgenome/writability.py +0 -0
  401. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack.egg-info/dependency_links.txt +0 -0
  402. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack.egg-info/entry_points.txt +0 -0
  403. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack.egg-info/requires.txt +0 -0
  404. {pen_stack-7.2.0 → pen_stack-7.2.1}/pen_stack.egg-info/top_level.txt +0 -0
  405. {pen_stack-7.2.0 → pen_stack-7.2.1}/prereg/SHA256_LOCK_phase0.json +0 -0
  406. {pen_stack-7.2.0 → pen_stack-7.2.1}/prereg/SHA256_LOCK_phase1_5.json +0 -0
  407. {pen_stack-7.2.0 → pen_stack-7.2.1}/prereg/SHA256_LOCK_phase2.json +0 -0
  408. {pen_stack-7.2.0 → pen_stack-7.2.1}/prereg/SHA256_LOCK_phase3.json +0 -0
  409. {pen_stack-7.2.0 → pen_stack-7.2.1}/prereg/SHA256_LOCK_ws_a.json +0 -0
  410. {pen_stack-7.2.0 → pen_stack-7.2.1}/prereg/SHA256_LOCK_ws_acq.json +0 -0
  411. {pen_stack-7.2.0 → pen_stack-7.2.1}/prereg/SHA256_LOCK_ws_aldesign.json +0 -0
  412. {pen_stack-7.2.0 → pen_stack-7.2.1}/prereg/SHA256_LOCK_ws_alvalidate.json +0 -0
  413. {pen_stack-7.2.0 → pen_stack-7.2.1}/prereg/SHA256_LOCK_ws_atlas.json +0 -0
  414. {pen_stack-7.2.0 → pen_stack-7.2.1}/prereg/SHA256_LOCK_ws_b.json +0 -0
  415. {pen_stack-7.2.0 → pen_stack-7.2.1}/prereg/SHA256_LOCK_ws_ba.json +0 -0
  416. {pen_stack-7.2.0 → pen_stack-7.2.1}/prereg/SHA256_LOCK_ws_ba_v33.json +0 -0
  417. {pen_stack-7.2.0 → pen_stack-7.2.1}/prereg/SHA256_LOCK_ws_ba_v45.json +0 -0
  418. {pen_stack-7.2.0 → pen_stack-7.2.1}/prereg/SHA256_LOCK_ws_bench.json +0 -0
  419. {pen_stack-7.2.0 → pen_stack-7.2.1}/prereg/SHA256_LOCK_ws_c.json +0 -0
  420. {pen_stack-7.2.0 → pen_stack-7.2.1}/prereg/SHA256_LOCK_ws_cal.json +0 -0
  421. {pen_stack-7.2.0 → pen_stack-7.2.1}/prereg/SHA256_LOCK_ws_calib.json +0 -0
  422. {pen_stack-7.2.0 → pen_stack-7.2.1}/prereg/SHA256_LOCK_ws_challenge.json +0 -0
  423. {pen_stack-7.2.0 → pen_stack-7.2.1}/prereg/SHA256_LOCK_ws_chat.json +0 -0
  424. {pen_stack-7.2.0 → pen_stack-7.2.1}/prereg/SHA256_LOCK_ws_cite.json +0 -0
  425. {pen_stack-7.2.0 → pen_stack-7.2.1}/prereg/SHA256_LOCK_ws_closedloop.json +0 -0
  426. {pen_stack-7.2.0 → pen_stack-7.2.1}/prereg/SHA256_LOCK_ws_continual.json +0 -0
  427. {pen_stack-7.2.0 → pen_stack-7.2.1}/prereg/SHA256_LOCK_ws_cosci2.json +0 -0
  428. {pen_stack-7.2.0 → pen_stack-7.2.1}/prereg/SHA256_LOCK_ws_crit.json +0 -0
  429. {pen_stack-7.2.0 → pen_stack-7.2.1}/prereg/SHA256_LOCK_ws_ct.json +0 -0
  430. {pen_stack-7.2.0 → pen_stack-7.2.1}/prereg/SHA256_LOCK_ws_d.json +0 -0
  431. {pen_stack-7.2.0 → pen_stack-7.2.1}/prereg/SHA256_LOCK_ws_delivery.json +0 -0
  432. {pen_stack-7.2.0 → pen_stack-7.2.1}/prereg/SHA256_LOCK_ws_drift.json +0 -0
  433. {pen_stack-7.2.0 → pen_stack-7.2.1}/prereg/SHA256_LOCK_ws_e.json +0 -0
  434. {pen_stack-7.2.0 → pen_stack-7.2.1}/prereg/SHA256_LOCK_ws_env.json +0 -0
  435. {pen_stack-7.2.0 → pen_stack-7.2.1}/prereg/SHA256_LOCK_ws_ep.json +0 -0
  436. {pen_stack-7.2.0 → pen_stack-7.2.1}/prereg/SHA256_LOCK_ws_epitope.json +0 -0
  437. {pen_stack-7.2.0 → pen_stack-7.2.1}/prereg/SHA256_LOCK_ws_expr2.json +0 -0
  438. {pen_stack-7.2.0 → pen_stack-7.2.1}/prereg/SHA256_LOCK_ws_f.json +0 -0
  439. {pen_stack-7.2.0 → pen_stack-7.2.1}/prereg/SHA256_LOCK_ws_frontend.json +0 -0
  440. {pen_stack-7.2.0 → pen_stack-7.2.1}/prereg/SHA256_LOCK_ws_g.json +0 -0
  441. {pen_stack-7.2.0 → pen_stack-7.2.1}/prereg/SHA256_LOCK_ws_gen.json +0 -0
  442. {pen_stack-7.2.0 → pen_stack-7.2.1}/prereg/SHA256_LOCK_ws_genotox.json +0 -0
  443. {pen_stack-7.2.0 → pen_stack-7.2.1}/prereg/SHA256_LOCK_ws_graph.json +0 -0
  444. {pen_stack-7.2.0 → pen_stack-7.2.1}/prereg/SHA256_LOCK_ws_h.json +0 -0
  445. {pen_stack-7.2.0 → pen_stack-7.2.1}/prereg/SHA256_LOCK_ws_hybrid.json +0 -0
  446. {pen_stack-7.2.0 → pen_stack-7.2.1}/prereg/SHA256_LOCK_ws_immune.json +0 -0
  447. {pen_stack-7.2.0 → pen_stack-7.2.1}/prereg/SHA256_LOCK_ws_immune2.json +0 -0
  448. {pen_stack-7.2.0 → pen_stack-7.2.1}/prereg/SHA256_LOCK_ws_ingest.json +0 -0
  449. {pen_stack-7.2.0 → pen_stack-7.2.1}/prereg/SHA256_LOCK_ws_innate.json +0 -0
  450. {pen_stack-7.2.0 → pen_stack-7.2.1}/prereg/SHA256_LOCK_ws_loop.json +0 -0
  451. {pen_stack-7.2.0 → pen_stack-7.2.1}/prereg/SHA256_LOCK_ws_manifest.json +0 -0
  452. {pen_stack-7.2.0 → pen_stack-7.2.1}/prereg/SHA256_LOCK_ws_mc.json +0 -0
  453. {pen_stack-7.2.0 → pen_stack-7.2.1}/prereg/SHA256_LOCK_ws_mcp.json +0 -0
  454. {pen_stack-7.2.0 → pen_stack-7.2.1}/prereg/SHA256_LOCK_ws_mech.json +0 -0
  455. {pen_stack-7.2.0 → pen_stack-7.2.1}/prereg/SHA256_LOCK_ws_mon.json +0 -0
  456. {pen_stack-7.2.0 → pen_stack-7.2.1}/prereg/SHA256_LOCK_ws_o.json +0 -0
  457. {pen_stack-7.2.0 → pen_stack-7.2.1}/prereg/SHA256_LOCK_ws_offtarget.json +0 -0
  458. {pen_stack-7.2.0 → pen_stack-7.2.1}/prereg/SHA256_LOCK_ws_openapi.json +0 -0
  459. {pen_stack-7.2.0 → pen_stack-7.2.1}/prereg/SHA256_LOCK_ws_oracle.json +0 -0
  460. {pen_stack-7.2.0 → pen_stack-7.2.1}/prereg/SHA256_LOCK_ws_orch.json +0 -0
  461. {pen_stack-7.2.0 → pen_stack-7.2.1}/prereg/SHA256_LOCK_ws_outcome.json +0 -0
  462. {pen_stack-7.2.0 → pen_stack-7.2.1}/prereg/SHA256_LOCK_ws_pareto.json +0 -0
  463. {pen_stack-7.2.0 → pen_stack-7.2.1}/prereg/SHA256_LOCK_ws_peg.json +0 -0
  464. {pen_stack-7.2.0 → pen_stack-7.2.1}/prereg/SHA256_LOCK_ws_penchat.json +0 -0
  465. {pen_stack-7.2.0 → pen_stack-7.2.1}/prereg/SHA256_LOCK_ws_plan.json +0 -0
  466. {pen_stack-7.2.0 → pen_stack-7.2.1}/prereg/SHA256_LOCK_ws_policy.json +0 -0
  467. {pen_stack-7.2.0 → pen_stack-7.2.1}/prereg/SHA256_LOCK_ws_profile.json +0 -0
  468. {pen_stack-7.2.0 → pen_stack-7.2.1}/prereg/SHA256_LOCK_ws_proto.json +0 -0
  469. {pen_stack-7.2.0 → pen_stack-7.2.1}/prereg/SHA256_LOCK_ws_r.json +0 -0
  470. {pen_stack-7.2.0 → pen_stack-7.2.1}/prereg/SHA256_LOCK_ws_redteam.json +0 -0
  471. {pen_stack-7.2.0 → pen_stack-7.2.1}/prereg/SHA256_LOCK_ws_route.json +0 -0
  472. {pen_stack-7.2.0 → pen_stack-7.2.1}/prereg/SHA256_LOCK_ws_screen.json +0 -0
  473. {pen_stack-7.2.0 → pen_stack-7.2.1}/prereg/SHA256_LOCK_ws_seroprev.json +0 -0
  474. {pen_stack-7.2.0 → pen_stack-7.2.1}/prereg/SHA256_LOCK_ws_simlab.json +0 -0
  475. {pen_stack-7.2.0 → pen_stack-7.2.1}/prereg/SHA256_LOCK_ws_twincal.json +0 -0
  476. {pen_stack-7.2.0 → pen_stack-7.2.1}/prereg/SHA256_LOCK_ws_uq.json +0 -0
  477. {pen_stack-7.2.0 → pen_stack-7.2.1}/prereg/SHA256_LOCK_ws_v.json +0 -0
  478. {pen_stack-7.2.0 → pen_stack-7.2.1}/prereg/SHA256_LOCK_ws_vcell.json +0 -0
  479. {pen_stack-7.2.0 → pen_stack-7.2.1}/prereg/SHA256_LOCK_ws_verify.json +0 -0
  480. {pen_stack-7.2.0 → pen_stack-7.2.1}/prereg/SHA256_LOCK_ws_writer.json +0 -0
  481. {pen_stack-7.2.0 → pen_stack-7.2.1}/prereg/SHA256_LOCK_ws_writespec.json +0 -0
  482. {pen_stack-7.2.0 → pen_stack-7.2.1}/prereg/SHA256_LOCK_ws_wv.json +0 -0
  483. {pen_stack-7.2.0 → pen_stack-7.2.1}/prereg/paper1.yaml +0 -0
  484. {pen_stack-7.2.0 → pen_stack-7.2.1}/prereg/paper2.yaml +0 -0
  485. {pen_stack-7.2.0 → pen_stack-7.2.1}/prereg/paper3.yaml +0 -0
  486. {pen_stack-7.2.0 → pen_stack-7.2.1}/prereg/paper4.yaml +0 -0
  487. {pen_stack-7.2.0 → pen_stack-7.2.1}/prereg/phase0.yaml +0 -0
  488. {pen_stack-7.2.0 → pen_stack-7.2.1}/prereg/ws_a.yaml +0 -0
  489. {pen_stack-7.2.0 → pen_stack-7.2.1}/prereg/ws_acq.yaml +0 -0
  490. {pen_stack-7.2.0 → pen_stack-7.2.1}/prereg/ws_aldesign.yaml +0 -0
  491. {pen_stack-7.2.0 → pen_stack-7.2.1}/prereg/ws_alvalidate.yaml +0 -0
  492. {pen_stack-7.2.0 → pen_stack-7.2.1}/prereg/ws_atlas.yaml +0 -0
  493. {pen_stack-7.2.0 → pen_stack-7.2.1}/prereg/ws_b.yaml +0 -0
  494. {pen_stack-7.2.0 → pen_stack-7.2.1}/prereg/ws_ba.yaml +0 -0
  495. {pen_stack-7.2.0 → pen_stack-7.2.1}/prereg/ws_ba_v33.yaml +0 -0
  496. {pen_stack-7.2.0 → pen_stack-7.2.1}/prereg/ws_ba_v45.yaml +0 -0
  497. {pen_stack-7.2.0 → pen_stack-7.2.1}/prereg/ws_bench.yaml +0 -0
  498. {pen_stack-7.2.0 → pen_stack-7.2.1}/prereg/ws_c.yaml +0 -0
  499. {pen_stack-7.2.0 → pen_stack-7.2.1}/prereg/ws_cal.yaml +0 -0
  500. {pen_stack-7.2.0 → pen_stack-7.2.1}/prereg/ws_calib.yaml +0 -0
  501. {pen_stack-7.2.0 → pen_stack-7.2.1}/prereg/ws_challenge.yaml +0 -0
  502. {pen_stack-7.2.0 → pen_stack-7.2.1}/prereg/ws_chat.yaml +0 -0
  503. {pen_stack-7.2.0 → pen_stack-7.2.1}/prereg/ws_cite.yaml +0 -0
  504. {pen_stack-7.2.0 → pen_stack-7.2.1}/prereg/ws_closedloop.yaml +0 -0
  505. {pen_stack-7.2.0 → pen_stack-7.2.1}/prereg/ws_continual.yaml +0 -0
  506. {pen_stack-7.2.0 → pen_stack-7.2.1}/prereg/ws_cosci2.yaml +0 -0
  507. {pen_stack-7.2.0 → pen_stack-7.2.1}/prereg/ws_crit.yaml +0 -0
  508. {pen_stack-7.2.0 → pen_stack-7.2.1}/prereg/ws_ct.yaml +0 -0
  509. {pen_stack-7.2.0 → pen_stack-7.2.1}/prereg/ws_d.yaml +0 -0
  510. {pen_stack-7.2.0 → pen_stack-7.2.1}/prereg/ws_delivery.yaml +0 -0
  511. {pen_stack-7.2.0 → pen_stack-7.2.1}/prereg/ws_drift.yaml +0 -0
  512. {pen_stack-7.2.0 → pen_stack-7.2.1}/prereg/ws_e.yaml +0 -0
  513. {pen_stack-7.2.0 → pen_stack-7.2.1}/prereg/ws_env.yaml +0 -0
  514. {pen_stack-7.2.0 → pen_stack-7.2.1}/prereg/ws_ep.yaml +0 -0
  515. {pen_stack-7.2.0 → pen_stack-7.2.1}/prereg/ws_epitope.yaml +0 -0
  516. {pen_stack-7.2.0 → pen_stack-7.2.1}/prereg/ws_expr2.yaml +0 -0
  517. {pen_stack-7.2.0 → pen_stack-7.2.1}/prereg/ws_f.yaml +0 -0
  518. {pen_stack-7.2.0 → pen_stack-7.2.1}/prereg/ws_frontend.yaml +0 -0
  519. {pen_stack-7.2.0 → pen_stack-7.2.1}/prereg/ws_g.yaml +0 -0
  520. {pen_stack-7.2.0 → pen_stack-7.2.1}/prereg/ws_gen.yaml +0 -0
  521. {pen_stack-7.2.0 → pen_stack-7.2.1}/prereg/ws_genotox.yaml +0 -0
  522. {pen_stack-7.2.0 → pen_stack-7.2.1}/prereg/ws_graph.yaml +0 -0
  523. {pen_stack-7.2.0 → pen_stack-7.2.1}/prereg/ws_h.yaml +0 -0
  524. {pen_stack-7.2.0 → pen_stack-7.2.1}/prereg/ws_hybrid.yaml +0 -0
  525. {pen_stack-7.2.0 → pen_stack-7.2.1}/prereg/ws_immune.yaml +0 -0
  526. {pen_stack-7.2.0 → pen_stack-7.2.1}/prereg/ws_immune2.yaml +0 -0
  527. {pen_stack-7.2.0 → pen_stack-7.2.1}/prereg/ws_ingest.yaml +0 -0
  528. {pen_stack-7.2.0 → pen_stack-7.2.1}/prereg/ws_innate.yaml +0 -0
  529. {pen_stack-7.2.0 → pen_stack-7.2.1}/prereg/ws_loop.yaml +0 -0
  530. {pen_stack-7.2.0 → pen_stack-7.2.1}/prereg/ws_manifest.yaml +0 -0
  531. {pen_stack-7.2.0 → pen_stack-7.2.1}/prereg/ws_mc.yaml +0 -0
  532. {pen_stack-7.2.0 → pen_stack-7.2.1}/prereg/ws_mcp.yaml +0 -0
  533. {pen_stack-7.2.0 → pen_stack-7.2.1}/prereg/ws_mech.yaml +0 -0
  534. {pen_stack-7.2.0 → pen_stack-7.2.1}/prereg/ws_mon.yaml +0 -0
  535. {pen_stack-7.2.0 → pen_stack-7.2.1}/prereg/ws_o.yaml +0 -0
  536. {pen_stack-7.2.0 → pen_stack-7.2.1}/prereg/ws_offtarget.yaml +0 -0
  537. {pen_stack-7.2.0 → pen_stack-7.2.1}/prereg/ws_openapi.yaml +0 -0
  538. {pen_stack-7.2.0 → pen_stack-7.2.1}/prereg/ws_oracle.yaml +0 -0
  539. {pen_stack-7.2.0 → pen_stack-7.2.1}/prereg/ws_orch.yaml +0 -0
  540. {pen_stack-7.2.0 → pen_stack-7.2.1}/prereg/ws_outcome.yaml +0 -0
  541. {pen_stack-7.2.0 → pen_stack-7.2.1}/prereg/ws_pareto.yaml +0 -0
  542. {pen_stack-7.2.0 → pen_stack-7.2.1}/prereg/ws_peg.yaml +0 -0
  543. {pen_stack-7.2.0 → pen_stack-7.2.1}/prereg/ws_penchat.yaml +0 -0
  544. {pen_stack-7.2.0 → pen_stack-7.2.1}/prereg/ws_plan.yaml +0 -0
  545. {pen_stack-7.2.0 → pen_stack-7.2.1}/prereg/ws_policy.yaml +0 -0
  546. {pen_stack-7.2.0 → pen_stack-7.2.1}/prereg/ws_profile.yaml +0 -0
  547. {pen_stack-7.2.0 → pen_stack-7.2.1}/prereg/ws_proto.yaml +0 -0
  548. {pen_stack-7.2.0 → pen_stack-7.2.1}/prereg/ws_r.yaml +0 -0
  549. {pen_stack-7.2.0 → pen_stack-7.2.1}/prereg/ws_redteam.yaml +0 -0
  550. {pen_stack-7.2.0 → pen_stack-7.2.1}/prereg/ws_route.yaml +0 -0
  551. {pen_stack-7.2.0 → pen_stack-7.2.1}/prereg/ws_screen.yaml +0 -0
  552. {pen_stack-7.2.0 → pen_stack-7.2.1}/prereg/ws_seroprev.yaml +0 -0
  553. {pen_stack-7.2.0 → pen_stack-7.2.1}/prereg/ws_simlab.yaml +0 -0
  554. {pen_stack-7.2.0 → pen_stack-7.2.1}/prereg/ws_twincal.yaml +0 -0
  555. {pen_stack-7.2.0 → pen_stack-7.2.1}/prereg/ws_uq.yaml +0 -0
  556. {pen_stack-7.2.0 → pen_stack-7.2.1}/prereg/ws_v.yaml +0 -0
  557. {pen_stack-7.2.0 → pen_stack-7.2.1}/prereg/ws_vcell.yaml +0 -0
  558. {pen_stack-7.2.0 → pen_stack-7.2.1}/prereg/ws_verify.yaml +0 -0
  559. {pen_stack-7.2.0 → pen_stack-7.2.1}/prereg/ws_writer.yaml +0 -0
  560. {pen_stack-7.2.0 → pen_stack-7.2.1}/prereg/ws_writespec.yaml +0 -0
  561. {pen_stack-7.2.0 → pen_stack-7.2.1}/prereg/ws_wv.yaml +0 -0
  562. {pen_stack-7.2.0 → pen_stack-7.2.1}/scripts/build_capsid_fitness.py +0 -0
  563. {pen_stack-7.2.0 → pen_stack-7.2.1}/scripts/build_rag_corpus.py +0 -0
  564. {pen_stack-7.2.0 → pen_stack-7.2.1}/scripts/calibrate_immune_axes.py +0 -0
  565. {pen_stack-7.2.0 → pen_stack-7.2.1}/scripts/fetch_licensed_sources.py +0 -0
  566. {pen_stack-7.2.0 → pen_stack-7.2.1}/scripts/offtarget_chromatin_incremental.py +0 -0
  567. {pen_stack-7.2.0 → pen_stack-7.2.1}/scripts/offtarget_chromatin_matched.py +0 -0
  568. {pen_stack-7.2.0 → pen_stack-7.2.1}/scripts/offtarget_chromatin_validation.py +0 -0
  569. {pen_stack-7.2.0 → pen_stack-7.2.1}/scripts/p1_build_atlas.py +0 -0
  570. {pen_stack-7.2.0 → pen_stack-7.2.1}/scripts/p1_build_durability.py +0 -0
  571. {pen_stack-7.2.0 → pen_stack-7.2.1}/scripts/p1_build_position_effect.py +0 -0
  572. {pen_stack-7.2.0 → pen_stack-7.2.1}/scripts/p1_build_writer_eff.py +0 -0
  573. {pen_stack-7.2.0 → pen_stack-7.2.1}/scripts/p1_export_tracks.py +0 -0
  574. {pen_stack-7.2.0 → pen_stack-7.2.1}/scripts/p1_safety_concordance.py +0 -0
  575. {pen_stack-7.2.0 → pen_stack-7.2.1}/scripts/p1_train_safety.py +0 -0
  576. {pen_stack-7.2.0 → pen_stack-7.2.1}/scripts/p1_validation_report.py +0 -0
  577. {pen_stack-7.2.0 → pen_stack-7.2.1}/scripts/p2_build_atlas.py +0 -0
  578. {pen_stack-7.2.0 → pen_stack-7.2.1}/scripts/p3_benchmark_report.py +0 -0
  579. {pen_stack-7.2.0 → pen_stack-7.2.1}/scripts/p4_genome_scan.py +0 -0
  580. {pen_stack-7.2.0 → pen_stack-7.2.1}/scripts/p52_build_genotox_oracle.py +0 -0
  581. {pen_stack-7.2.0 → pen_stack-7.2.1}/scripts/p53_build_epitope_oracle.py +0 -0
  582. {pen_stack-7.2.0 → pen_stack-7.2.1}/scripts/ws_b_report.py +0 -0
  583. {pen_stack-7.2.0 → pen_stack-7.2.1}/scripts/ws_c_report.py +0 -0
  584. {pen_stack-7.2.0 → pen_stack-7.2.1}/setup.cfg +0 -0
@@ -3,6 +3,36 @@
3
3
  All notable changes to PEN-STACK are documented here. This file follows
4
4
  [Keep a Changelog](https://keepachangelog.com/).
5
5
 
6
+ ## [7.2.1] - 2026-07-02 - PhiC31 integrase: close the O-WS3/O-G2 data gap with verified data + a sealed recall benchmark (honest NEGATIVE)
7
+
8
+ Closes the one genuine open item from v7.2.0 — the PhiC31 integrase data gap — with independently-verified,
9
+ open, citable sequences (no fabrication) and a **sealed recall benchmark whose result is reported verbatim**.
10
+
11
+ ### Added
12
+ - **PhiC31 is now encoded** (`data/curated/integrase_att.yaml`), replacing the v7.2.0 abstain-with-disclosure. All
13
+ data was **independently validated against NCBI/RCSB** (which caught two errors in the completion pack's
14
+ citations, since corrected): att from **PDB 9U2T/9U2S** ("PhiC31 integrase-attB-attP synaptic complex"; the
15
+ canonical Groth-2000 34 bp attB is present in attB53); the documented human pseudo-attP **ψA/ψC/ψD** from
16
+ **GenBank AF333429/AF333430/AF333431** (Thyagarajan 2001, *Mol Cell Biol* 21(12), PMID 11359900,
17
+ DOI `10.1128/MCB.21.12.3926-3934.2001`; chr8/16/15). Corrected DOIs: Groth 2000 `10.1073/pnas.090527097`,
18
+ Chalberg 2006 `10.1016/j.jmb.2005.11.098` (was `...11.108`).
19
+ - **Sealed PhiC31 pseudo-attP recall benchmark** (`benchmarks/offtarget/integrase/`, O-G2): does attP-sequence-
20
+ similarity recover the documented pseudo-attP above length-matched GRCh38 background? **Result — NEGATIVE,
21
+ reported verbatim:** all three sites score 14 mm / 30 bp (53.3% identity), exactly the background **median**
22
+ (60.6% / 77.0% / 82.4% of random windows are as-or-more attP-similar). Sequence identity to attP is **not** a
23
+ validated PhiC31 pseudo-attP predictor — φC31 recognition depends on palindromic architecture (Chalberg 2006) /
24
+ a learned model (IntQuery), not raw identity.
25
+
26
+ ### Changed
27
+ - **Integrase status corrected: `semi_validated` → `mechanism_based_unvalidated` (with a sealed-NEGATIVE benchmark).**
28
+ The v7.2.0 "semi-validated (documented pseudosites as partial ground truth)" implied the sites validated the
29
+ method; the sealed benchmark shows they do not. This is a *stronger, more honest* outcome — a tested negative
30
+ rather than an untested claim. The verified att + documented pseudosites remain grounded facts and are surfaced
31
+ as verified known off-target loci. `nominate_integrase` PhiC31 returns the documented pseudo-attP + the sealed
32
+ benchmark; Bxb1 returns genome-wide similarity candidates carrying the same `similarity_ranking_validated: false`
33
+ caveat. Prereg O-G2 amended + re-SHA-locked; data card + deviations ledger updated; Off-Target page shows the
34
+ documented sites + the benchmark verdict.
35
+
6
36
  ## [7.2.0] - 2026-07-01 - PEN-OFFTGT v2: Stage E becomes a genome-wide, per-mechanism off-target FINDER (all 5 writer classes)
7
37
 
8
38
  Stage E was a candidate *scorer* — it ranked off-target sites you supplied. A real off-target tool (CRISPOR /
@@ -1,8 +1,8 @@
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: 7.2.0
5
- date-released: 2026-07-01
4
+ version: 7.2.1
5
+ date-released: 2026-07-02
6
6
  authors:
7
7
  - family-names: "Mahaboob Ali"
8
8
  given-names: "Anees Ahmed"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pen-stack
3
- Version: 7.2.0
3
+ Version: 7.2.1
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
@@ -0,0 +1,23 @@
1
+ # PhiC31 pseudo-attP recall benchmark (O-G2) — SEALED
2
+
3
+ **Question:** does attP-sequence-similarity recover the documented human pseudo-attP above random genomic background?
4
+
5
+ **Data (all independently verified against NCBI/RCSB):**
6
+ - **Positives** — `phic31_pseudo.fasta`: human pseudo-attP ψA/ψC/ψD, GenBank **AF333429/AF333430/AF333431**
7
+ (Thyagarajan 2001, *Mol Cell Biol* 21(12), PMID 11359900, DOI `10.1128/MCB.21.12.3926-3934.2001`; chr8/16/15).
8
+ - **Query** — the phage φC31 attP central 30 bp from **PDB 9U2T (attP60)**, the "PhiC31 integrase-attB-attP synaptic
9
+ complex" structure; the canonical Groth-2000 34 bp attB is present in **PDB 9U2S (attB53)** (Groth 2000, PNAS,
10
+ DOI `10.1073/pnas.090527097`).
11
+ - **Background** — 1000 GC/N-filtered, length-matched random GRCh38 windows per positive.
12
+
13
+ **Result (`phic31_recall_metrics.json`) — NEGATIVE, reported verbatim:** every documented pseudosite scores 14 mm /
14
+ 30 bp (53.3% identity), which is exactly the **background median** (14 mm); 60.6% / 77.0% / 82.4% of random windows
15
+ are as-or-more attP-similar. Sequence identity to attP does **not** recover the documented pseudo-attP above
16
+ background — consistent with the field (φC31 pseudosite recognition depends on palindromic architecture, Chalberg
17
+ 2006 DOI `10.1016/j.jmb.2005.11.098`, / a learned model, IntQuery). The integrase genome-wide pseudo-attP
18
+ **similarity ranking is therefore unvalidated**; the verified att and documented pseudosites remain grounded facts.
19
+
20
+ **Honest limits:** N=3 (the open GenBank subset; the full Chalberg 19-site set is paywalled); tests
21
+ sequence-identity only (no palindrome/learned model); deterministic (seed 20260701), pysam over GRCh38.
22
+
23
+ Run: `docker run --rm --entrypoint bash -v <genomes>:/genome -v $PWD:/work -w /work penstack:phase1.5 -lc 'python harness.py'`
@@ -0,0 +1,4 @@
1
+ 701efce23441ba6ec3865060aa3a749d7165d013628f3ed8010737861b306557 README.md
2
+ 888dd4ba69bbe1eccd323797adc89b242b1c8ec6208a5f9f41df839d641d10e6 harness.py
3
+ fe23827ff34204bc2cd1f903fcd3e32b120c4521787342e6590824249573a4d4 phic31_pseudo.fasta
4
+ 2a0f22d700f0db0bafd1c98b8b8893f14e86ae9574ff789042bd3ad1c7f6a3c0 phic31_recall_metrics.json
@@ -0,0 +1,66 @@
1
+ # Serine-integrase attachment sites for the genome-wide pseudo-att off-target scan (PEN-OFFTGT v2, O-WS3).
2
+ #
3
+ # A serine integrase recombines a donor attB with a genomic pseudo-attP resembling the phage attP. The off-target
4
+ # scan enumerates genomic sites similar to the attP core region (a fixed-sequence Cas-OFFinder scan over GRCh38,
5
+ # tolerating mismatches), then scores each by att-arm similarity. Confirming assay: Cryptic-seq / HIDE-seq.
6
+ #
7
+ # HONEST STATUS (v7.2.1): the att sequences and the documented human pseudo-attP are VERIFIED grounded facts, but a
8
+ # SEALED recall benchmark on the best-documented pseudosites (PhiC31 psiA/psiC/psiD) is NEGATIVE — att-sequence-
9
+ # similarity does NOT recover them above random background (see PhiC31.recall_benchmark below). So the genome-wide
10
+ # pseudo-attP SIMILARITY RANKING is a mechanism-based scan that is NOT validated as a predictor; it is honestly
11
+ # labelled as such, not "semi-validated." The documented pseudosites are surfaced as verified known-off-target loci.
12
+ #
13
+ # DEVIATION (disclosed): the prereg named `att_pwm.json`. A position-weight MATRIX requires many aligned pseudosite
14
+ # sequences to estimate per-position tolerance; that alignment does not exist at genome scale for these integrases.
15
+ # So the scan uses att-arm SIMILARITY (mismatch count to the documented att, core-anchored) rather than a fitted
16
+ # PWM — a mechanism-based similarity model, honestly labelled, not a fabricated per-position matrix.
17
+
18
+ version: "1.0"
19
+
20
+ integrases:
21
+ Bxb1:
22
+ origin: "phage Bxb1 (Mycobacterium)"
23
+ attB: "TCGGCCGGCTTGTCGACGACGGCGGTCTCCGTCGTCAGGATCATCCGGGC"
24
+ attP: "GTCGTGGTTTGTCTGGTCAACCACCGCGGTCTCAGTGGTGTACGGTACAAACCCCGAC"
25
+ core: "GCGGTCTC"
26
+ central_dinucleotide: "GT"
27
+ # 34-nt attP window centred on the core — the fixed sequence scanned genome-wide for pseudo-attP
28
+ scan_window: "CTGGTCAACCACCGCGGTCTCAGTGGTGTACGGT"
29
+ scan_max_mismatch: 8
30
+ specificity_note: "Bxb1 is highly specific — very few genomic pseudo-attP in human cells (a reason it is the
31
+ integrase of choice for PASTE/PASSIGE). The scan therefore returns few high-similarity candidates."
32
+ source: "FlyBase FBto0000359/358; Ghosh, Kim & Hatfull, Mol Cell 2003"
33
+ doi: "10.1016/S1097-2765(03)00444-1"
34
+
35
+ # PhiC31 — now ENCODED with independently-verified sequences (v7.2.1, closes the O-WS3 data gap). att from the
36
+ # phiC31 integrase-attB-attP synaptic-complex structure (PDB 9U2T attP60 / 9U2S attB53; the canonical Groth-2000
37
+ # 34 bp attB is present in attB53); documented human pseudo-attP from Thyagarajan 2001 (GenBank AF333429/30/31).
38
+ PhiC31:
39
+ origin: "phage phiC31 (Streptomyces)"
40
+ attB: "GTGCCAGGGCGTGCCCTTGGGCTCCCCGGGCGCG" # canonical 34 bp minimal attB (verified inside PDB 9U2S attB53)
41
+ attP: "CGGGAGTAGTGCCCCAACTGGGGTAACCTTTGAGTTCTCTCAGTTGGGGGCGTAGGGTCG" # PDB 9U2T attP60 (60 bp)
42
+ core: "TTG"
43
+ central_dinucleotide: "TT"
44
+ scan_window: "AACTGGGGTAACCTTTGAGTTCTCTCAGTT" # attP central 30 bp (localises to the psiA recombination core)
45
+ scan_max_mismatch: 8
46
+ source: "Groth et al., PNAS 2000; PDB 9U2T/9U2S (phiC31 integrase-attB-attP synaptic complex)"
47
+ doi: "10.1073/pnas.090527097"
48
+ pdb: ["9U2T", "9U2S"]
49
+ # documented human pseudo-attP positive set (verified GenBank; the integration loci)
50
+ pseudo_attP_positive_set:
51
+ - {name: psiA, genbank: AF333429, chrom: chr8}
52
+ - {name: psiC, genbank: AF333430, chrom: chr16}
53
+ - {name: psiD, genbank: AF333431, chrom: chr15}
54
+ positive_set_source: "Thyagarajan et al., Mol Cell Biol 21(12), 2001"
55
+ positive_set_doi: "10.1128/MCB.21.12.3926-3934.2001"
56
+ # SEALED recall benchmark (O-G2) — result reported VERBATIM: benchmarks/offtarget/integrase/phic31_recall_metrics.json
57
+ recall_benchmark:
58
+ recovered_above_background: false
59
+ verdict: "NEGATIVE — attP-sequence-similarity does NOT recover the documented pseudo-attP above random
60
+ background (all 3 sites at 14 mm / 30 bp = the background median; 60.6/77.0/82.4% of background as-or-more
61
+ similar). Sequence identity alone is not a validated PhiC31 pseudo-attP predictor; recognition depends on
62
+ palindromic architecture (Chalberg 2006, 10.1016/j.jmb.2005.11.098) / a learned model (IntQuery)."
63
+ metrics: "benchmarks/offtarget/integrase/phic31_recall_metrics.json"
64
+ specificity_note: "PhiC31 is a PROMISCUOUS serine integrase with documented human pseudo-attP (unlike Bxb1).
65
+ The sealed recall benchmark (above) is NEGATIVE: the att-similarity scan does not distinguish the documented
66
+ pseudosites from background, so the genome-wide similarity RANKING is unvalidated (honest negative)."
@@ -103,8 +103,7 @@ disclosure** where it does not. No mechanism is ever presented as validated wher
103
103
  | Writer class | Mechanism | Enumeration | Status | Ground truth / benchmark |
104
104
  |---|---|---|---|---|
105
105
  | **Nuclease** (SpCas9/SaCas9/Cas12a) | mismatch-tolerant cleavage at protospacer+PAM | Cas-OFFinder genome scan | ✅ **validated** | 4-assay Off-Target-Bench (above) + **O-G1**: enumeration recovers 100% of EMX1's documented GUIDE-seq off-targets ≤5 mm |
106
- | **Serine integrase** (Bxb1) | recombination at genomic pseudo-attP | fixed-sequence att-window scan | 🟡 **semi-validated** | documented pseudosites are partial ground truth; Bxb1 att verified (FlyBase FBto0000359 / Ghosh 2003, `10.1016/S1097-2765(03)00444-1`); Bxb1 is highly specific (few genomic pseudo-attP) |
107
- | **Serine integrase** (PhiC31) | — | — | 🟡 semi-validated | **DISCLOSED DATA GAP**: PhiC31 has ~19 documented human pseudo-attP (Chalberg 2006, `10.1016/j.jmb.2005.11.108`) — the strongest integrase benchmark — but its exact att arm / pseudosite sequences were not verifiable from an open source in this build, so PhiC31 is **not encoded and abstains** rather than fabricate. Encoding it is the follow-up that upgrades O-G2 to a sealed recall benchmark. |
106
+ | **Serine integrase** (Bxb1, PhiC31) | recombination at genomic pseudo-attP | fixed-sequence att-window scan | 🔵 **mechanism-based, sealed-NEGATIVE benchmark** (v7.2.1) | att verified (Bxb1: FlyBase FBto0000359 / Ghosh 2003 `10.1016/S1097-2765(03)00444-1`; PhiC31: **PDB 9U2T/9U2S** + Groth 2000 `10.1073/pnas.090527097`); the PhiC31 human pseudo-attP set is verified (Thyagarajan 2001, **GenBank AF333429/30/31**, `10.1128/MCB.21.12.3926-3934.2001`; chr8/16/15). The v7.2.1 **SEALED recall benchmark** (`benchmarks/offtarget/integrase/`) is **NEGATIVE**: att-sequence-similarity does NOT recover the documented pseudo-attP above random background (all three at 14 mm / 30 bp = the background median). The genome-wide similarity RANKING is therefore **unvalidated** — φC31 recognition needs palindromic architecture (Chalberg 2006, `10.1016/j.jmb.2005.11.098`) / a learned model (IntQuery), not raw identity. Documented pseudosites surfaced as verified known loci; the negative is reported verbatim (a stronger, more honest O-G2 than an untested "semi-validated"). |
108
107
  | **Bridge** (IS110/IS621) | recombination at bridge-RNA target-loop matches | core-seeded genome scan (pysam) | 🔵 **mechanism-based, unvalidated** | **NO genome-wide unbiased CELLULAR off-target assay exists** (technology ~2024). The mismatch-tolerance RANKER is validated on the measured Perry-2025 in-vitro DMS specificity (held-out ranking AUROC 0.88), but genomic recovery is unvalidated. |
109
108
  | **CAST** (ShCAST V-K / VchCAST I-F) | guide-directed integration + guide-independent untargeted transposition | spacer scan + per-system untargeted background | 🔵 **mechanism-based, unvalidated** | untargeted-transposition rates documented per system (`data/curated/cast_systems.yaml`): ShCAST high/AT-biased (Strecker 2019 `10.1126/science.aax9181`; Science 2024 `10.1126/science.adj8543`), VchCAST >95–99% on-target (Klompe 2019 `10.1038/s41586-019-1323-z`; Vo 2021 `10.1038/s41587-020-00745-y`). No genome-wide cellular assay for human-cell CAST. |
110
109
  | **PASTE / (ee)PASSIGE** | Cas9-nickase off-target + integrase pseudo-attP | compose(nuclease, integrase) | composite (✅ nickase + 🟡 integrase) | inherits the nuclease benchmark for the nickase and the integrase status for the installed att; recommends BOTH a nuclease assay AND an integrase assay |
@@ -1,2 +1,2 @@
1
1
  """PEN-STACK v3.0 - open infrastructure for genome writing."""
2
- __version__ = "7.2.0"
2
+ __version__ = "7.2.1"
@@ -0,0 +1,111 @@
1
+ """Serine-integrase pseudo-att genome scan (PEN-OFFTGT v2, O-WS3; sealed-benchmarked in v7.2.1).
2
+
3
+ A serine integrase recombines a donor attB with genomic **pseudo-attP** sites resembling the phage attP. This
4
+ enumerates pseudo-attP genome-wide: a fixed-sequence Cas-OFFinder scan of the attP core window over GRCh38 (heavy;
5
+ runs on the VM, replayed from cache here), scored by att-arm similarity.
6
+
7
+ **Honest status (v7.2.1): mechanism-based, with a SEALED NEGATIVE recall benchmark.** Bxb1 and PhiC31 att are
8
+ independently verified (Bxb1: FlyBase FBto0000359 / Ghosh 2003; PhiC31: PDB 9U2T/9U2S + Groth 2000), and the
9
+ PhiC31 human pseudo-attP set is verified (Thyagarajan 2001, GenBank AF333429/30/31). But a sealed recall benchmark
10
+ on those documented pseudosites is **NEGATIVE** — att-sequence-similarity does not recover them above random
11
+ background (all three at the background median). So the genome-wide pseudo-attP SIMILARITY RANKING is a
12
+ mechanism-based scan that is **not validated** as a predictor (φC31 recognition needs palindrome architecture /
13
+ a learned model, not raw identity). The documented pseudosites are surfaced as verified known-off-target loci.
14
+ Confirming assay: Cryptic-seq / HIDE-seq. Never fabricates sites or a validated status.
15
+ """
16
+ from __future__ import annotations
17
+
18
+ from functools import lru_cache
19
+
20
+ from pen_stack.wgenome.offtarget_enumerate import enumerate_motif
21
+
22
+ _STATUS = "mechanism_based_unvalidated" # the similarity ranking; sealed PhiC31 recall benchmark is NEGATIVE
23
+ _ALIAS = {"bxb1": "Bxb1", "serine_integrase": "Bxb1", "pe_integrase": "Bxb1",
24
+ "phic31": "PhiC31", "phic31_integrase": "PhiC31"}
25
+ _CONFIRM = "Cryptic-seq / HIDE-seq (Tome Biosciences, 2024 preprint)"
26
+
27
+
28
+ @lru_cache(maxsize=1)
29
+ def integrase_att() -> dict:
30
+ try:
31
+ import yaml
32
+
33
+ from pen_stack._resources import resource
34
+ return yaml.safe_load(resource("data/curated/integrase_att.yaml").read_text(encoding="utf-8")) or {}
35
+ except Exception: # noqa: BLE001
36
+ return {}
37
+
38
+
39
+ def resolve_integrase(name: str) -> str | None:
40
+ n = (name or "").strip()
41
+ if n in (integrase_att().get("integrases") or {}):
42
+ return n
43
+ return _ALIAS.get(n.lower())
44
+
45
+
46
+ def _sealed_benchmark() -> dict | None:
47
+ return ((integrase_att().get("integrases") or {}).get("PhiC31") or {}).get("recall_benchmark")
48
+
49
+
50
+ def nominate_integrase(integrase: str = "Bxb1", top: int = 20) -> dict:
51
+ """Genome-wide pseudo-attP nomination for a serine integrase. PhiC31 returns its verified documented human
52
+ pseudo-attP (ψA/ψC/ψD) plus the sealed recall benchmark (NEGATIVE, verbatim). Bxb1 (and any integrase with a
53
+ committed genome-scan cache) returns genome-wide similarity candidates carrying the same unvalidated-ranking
54
+ caveat. Never fabricates sites or a validated status."""
55
+ att = integrase_att()
56
+ key = resolve_integrase(integrase)
57
+ bench = _sealed_benchmark()
58
+ if key is None or key not in (att.get("integrases") or {}):
59
+ return {"family": "serine_integrase", "integrase": integrase, "available": False, "abstain": True,
60
+ "status": _STATUS, "note": f"no encoded att for integrase {integrase!r}; encoded: "
61
+ f"{sorted((att.get('integrases') or {}))}", "confirm_assay": _CONFIRM,
62
+ "nomination_is_not_clearance": True}
63
+ rec = att["integrases"][key]
64
+
65
+ if key == "PhiC31":
66
+ # promiscuous integrase: surface the VERIFIED documented pseudo-attP + the sealed NEGATIVE recall benchmark
67
+ return {"family": "serine_integrase", "integrase": "PhiC31", "available": True, "abstain": False,
68
+ "status": _STATUS, "att_core": rec["core"], "central_dinucleotide": rec["central_dinucleotide"],
69
+ "att_doi": rec["doi"], "pdb": rec.get("pdb"),
70
+ "documented_pseudo_attP": rec.get("pseudo_attP_positive_set"),
71
+ "documented_source": rec.get("positive_set_source"), "documented_doi": rec.get("positive_set_doi"),
72
+ "sealed_recall_benchmark": bench, "similarity_ranking_validated": False,
73
+ "specificity_note": rec.get("specificity_note"),
74
+ "method": ("PhiC31 documented human pseudo-attP (verified GenBank AF333429/30/31, Thyagarajan 2001) "
75
+ "are surfaced as known off-target loci; the att-similarity genome scan is mechanism-"
76
+ "based and its SEALED recall benchmark is NEGATIVE (does not recover them above "
77
+ "background) -> the genome-wide ranking is unvalidated (reported verbatim)."),
78
+ "confirm_assay": _CONFIRM,
79
+ "honesty": "verified documented pseudosites + an honest NEGATIVE recall benchmark; NOT a validated "
80
+ "predictor and NOT a clearance.",
81
+ "nomination_is_not_clearance": True}
82
+
83
+ # Bxb1 (and any integrase with a committed genome-scan cache): genome-wide similarity candidates
84
+ window = rec["scan_window"]
85
+ enum = enumerate_motif(f"{key}_pseudo_attP")
86
+ if enum.get("abstain"):
87
+ return {"family": "serine_integrase", "integrase": key, "available": False, "abstain": True,
88
+ "status": _STATUS, "att_core": rec["core"], "note": enum["note"],
89
+ "cached_motifs": enum.get("cached_motifs", []), "sealed_recall_benchmark": bench,
90
+ "confirm_assay": _CONFIRM, "nomination_is_not_clearance": True}
91
+ wlen = len(window)
92
+ noms = []
93
+ for s in enum["sites"]:
94
+ nmm = int(s["n_mismatch"])
95
+ noms.append({"chrom": s["chrom"], "position": s["position"], "strand": s["strand"], "site": s["sequence"],
96
+ "n_mismatch": nmm, "arm_similarity": round(1.0 - nmm / wlen, 3), "output_kind": "candidate"})
97
+ noms.sort(key=lambda n: n["n_mismatch"])
98
+ return {"family": "serine_integrase", "integrase": key, "available": True, "abstain": False, "mode": "finder",
99
+ "status": _STATUS, "att_core": rec["core"], "central_dinucleotide": rec["central_dinucleotide"],
100
+ "scan_window": window, "source": enum["source"], "att_doi": rec["doi"],
101
+ "n_sites_genome_wide": len(noms), "nominations": noms[:top],
102
+ "specificity_note": rec.get("specificity_note"),
103
+ "sealed_recall_benchmark": bench, "similarity_ranking_validated": False,
104
+ "method": ("fixed-sequence Cas-OFFinder scan of the attP core window over GRCh38, scored by att-arm "
105
+ "similarity. The similarity RANKING is mechanism-based and UNVALIDATED: the sealed PhiC31 "
106
+ "recall benchmark is NEGATIVE (att-similarity does not recover documented pseudo-attP "
107
+ "above background)."),
108
+ "confirm_assay": _CONFIRM,
109
+ "honesty": "genome-wide pseudo-attP candidates by att similarity; the ranking is unvalidated "
110
+ "(sealed-negative benchmark) and NOT a clearance.",
111
+ "nomination_is_not_clearance": True}
@@ -26,7 +26,7 @@ def nominate_paste(guide: str | None = None, integrase: str = "Bxb1", max_mismat
26
26
  "note": "provide the pegRNA spacer (guide) for the Cas9-nickase off-target scan"})
27
27
  integ = nominate_integrase(integrase, top=top)
28
28
  statuses = {"nuclease_component": nuclease.get("status", "validated"),
29
- "integrase_component": integ.get("status", "semi_validated")}
29
+ "integrase_component": integ.get("status", "mechanism_based_unvalidated")}
30
30
  return {"family": "paste", "available": True, "abstain": False, "status": "composite",
31
31
  "component_statuses": statuses,
32
32
  "nuclease_component": nuclease, # Cas9-nickase off-targets (pegRNA-directed) — validated finder
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pen-stack
3
- Version: 7.2.0
3
+ Version: 7.2.1
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
@@ -22,6 +22,8 @@ benchmarks/genome_writing_challenge/README.md
22
22
  benchmarks/genome_writing_challenge/SUBMISSIONS.md
23
23
  benchmarks/loop/SHA256SUMS
24
24
  benchmarks/offtarget/SHA256SUMS
25
+ benchmarks/offtarget/integrase/README.md
26
+ benchmarks/offtarget/integrase/SHA256SUMS
25
27
  benchmarks/oracle/SHA256SUMS
26
28
  benchmarks/position_effect/README.md
27
29
  benchmarks/position_effect/SHA256SUMS
@@ -0,0 +1,9 @@
1
+ {
2
+ "cycle": "v7.2",
3
+ "workstream": "PEN-OFFTGT-v2",
4
+ "prepared": "2026-07-01",
5
+ "amended": "2026-07-02 (v7.2.1: O-G2 sealed PhiC31 recall benchmark, result NEGATIVE)",
6
+ "sha256": {
7
+ "prereg/ws_offtarget2.yaml": "6cf66e9cd972e638366e585072464287c7bfacca9b9575ac91a6a9317a7e22df"
8
+ }
9
+ }
@@ -84,7 +84,14 @@ acceptance_gates:
84
84
  guide: EMX1 (GAGTCCGAGCAGAAGAAGAA, NGG)
85
85
  O-G2:
86
86
  workstream: O-WS3
87
- claim: integrase path recovers documented pseudosites above background OR ships semi_validated with that stated
87
+ claim: integrase path recovers documented pseudosites above background OR ships with that stated
88
+ sealed_benchmark: benchmarks/offtarget/integrase/phic31_recall_metrics.json
89
+ result: "NEGATIVE (v7.2.1). The PhiC31 recall benchmark (verified GenBank psiA/psiC/psiD, AF333429/30/31, vs
90
+ length-matched GRCh38 background) shows att-sequence-similarity does NOT recover the documented pseudo-attP
91
+ above background: all three at 14 mm / 30 bp = the background median (60.6/77.0/82.4% of background as-or-more
92
+ similar). Reported VERBATIM. The integrase pseudo-attP similarity ranking is therefore mechanism_based_
93
+ unvalidated WITH a sealed-negative benchmark - a stronger, more honest outcome than an untested semi_validated
94
+ claim; the verified att + documented pseudosites remain grounded facts."
88
95
  O-G3:
89
96
  workstream: O-WS8
90
97
  claim: every mechanism has EITHER a sealed benchmark OR an explicit no-ground-truth disclosure — never a fabricated metric
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "pen-stack"
7
- version = "7.2.0"
7
+ version = "7.2.1"
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"
@@ -1,43 +0,0 @@
1
- # Serine-integrase attachment sites for the genome-wide pseudo-att off-target scan (PEN-OFFTGT v2, O-WS3).
2
- #
3
- # A serine integrase recombines a donor attB with a genomic pseudo-attP resembling the phage attP. The off-target
4
- # scan enumerates genomic sites similar to the attP core region (a fixed-sequence Cas-OFFinder scan over GRCh38,
5
- # tolerating mismatches), then scores each by att-arm similarity. Status: SEMI-VALIDATED (documented pseudosites as
6
- # partial ground truth). Confirming assay: Cryptic-seq / HIDE-seq.
7
- #
8
- # DEVIATION (disclosed): the prereg named `att_pwm.json`. A position-weight MATRIX requires many aligned pseudosite
9
- # sequences to estimate per-position tolerance; that alignment does not exist at genome scale for these integrases.
10
- # So the scan uses att-arm SIMILARITY (mismatch count to the documented att, core-anchored) rather than a fitted
11
- # PWM — a mechanism-based similarity model, honestly labelled, not a fabricated per-position matrix.
12
-
13
- version: "1.0"
14
-
15
- integrases:
16
- Bxb1:
17
- origin: "phage Bxb1 (Mycobacterium)"
18
- attB: "TCGGCCGGCTTGTCGACGACGGCGGTCTCCGTCGTCAGGATCATCCGGGC"
19
- attP: "GTCGTGGTTTGTCTGGTCAACCACCGCGGTCTCAGTGGTGTACGGTACAAACCCCGAC"
20
- core: "GCGGTCTC"
21
- central_dinucleotide: "GT"
22
- # 34-nt attP window centred on the core — the fixed sequence scanned genome-wide for pseudo-attP
23
- scan_window: "CTGGTCAACCACCGCGGTCTCAGTGGTGTACGGT"
24
- scan_max_mismatch: 8
25
- specificity_note: "Bxb1 is highly specific — very few genomic pseudo-attP in human cells (a reason it is the
26
- integrase of choice for PASTE/PASSIGE). The scan therefore returns few high-similarity candidates."
27
- source: "FlyBase FBto0000359/358; Ghosh, Kim & Hatfull, Mol Cell 2003"
28
- doi: "10.1016/S1097-2765(03)00444-1"
29
-
30
- # PhiC31 — DISCLOSED DATA GAP (reported, not fabricated): PhiC31 is the integrase with the best-documented human
31
- # pseudo-attP set (~19 sites, Chalberg et al. 2006), which would make the strongest semi-validation benchmark.
32
- # Its exact minimal attB/attP arm sequences and the pseudo-attP genomic coordinates could not be verified from an
33
- # open, citable source in this build (the central crossover is a documented TT dinucleotide; the minimal attB is
34
- # ~34 bp). Rather than fabricate the arm sequence or the pseudosite coordinates, PhiC31 is NOT encoded here; the
35
- # integrase scan abstains for PhiC31 with this disclosure. Encoding the verified PhiC31 att + the Chalberg-2006
36
- # pseudo-attP table is the follow-up that would upgrade O-G2 from "stated" to a sealed recall benchmark.
37
- phic31_disclosure:
38
- status: "not_encoded_data_gated"
39
- documented_fact: "PhiC31 has ~19 characterised human pseudo-attP sites (a promiscuous serine integrase)."
40
- central_dinucleotide: "TT"
41
- minimal_attB_length_bp: 34
42
- reference: "Chalberg et al., J Mol Biol 2006 (PhiC31 human pseudo-attP mapping); Thyagarajan et al., Mol Cell Biol 2001"
43
- doi: "10.1016/j.jmb.2005.11.108"
@@ -1,88 +0,0 @@
1
- """Serine-integrase pseudo-att genome scan (PEN-OFFTGT v2, O-WS3).
2
-
3
- A serine integrase recombines a donor attB with genomic **pseudo-attP** sites resembling the phage attP. This
4
- enumerates pseudo-attP genome-wide: a fixed-sequence Cas-OFFinder scan of the attP core window over GRCh38 (heavy;
5
- runs on the VM, replayed from cache here), scored by att-arm similarity (mismatch to the documented att) and
6
- overlaid with the known-specificity note.
7
-
8
- Status: **semi_validated** — documented pseudosites are partial ground truth, but no CRISPOR-scale validated
9
- predictor exists for integrases. Bxb1 is fully encoded (FlyBase FBto0000359 / Ghosh 2003) and is highly specific;
10
- **PhiC31 is a DISCLOSED data gap** (its human pseudo-attP set is documented — Chalberg 2006 — but its exact att
11
- arm / pseudosite sequences were not verifiable from an open source in this build, so it abstains rather than
12
- fabricate). Confirming assay: Cryptic-seq / HIDE-seq. Never fabricates sites or a validated status.
13
- """
14
- from __future__ import annotations
15
-
16
- from functools import lru_cache
17
-
18
- from pen_stack.wgenome.offtarget_enumerate import enumerate_motif
19
-
20
- _STATUS = "semi_validated"
21
- _ALIAS = {"bxb1": "Bxb1", "serine_integrase": "Bxb1", "pe_integrase": "Bxb1", "paste": "Bxb1",
22
- "passige": "Bxb1", "phic31": "PhiC31", "phic31_integrase": "PhiC31"}
23
-
24
-
25
- @lru_cache(maxsize=1)
26
- def integrase_att() -> dict:
27
- try:
28
- import yaml
29
-
30
- from pen_stack._resources import resource
31
- return yaml.safe_load(resource("data/curated/integrase_att.yaml").read_text(encoding="utf-8")) or {}
32
- except Exception: # noqa: BLE001
33
- return {}
34
-
35
-
36
- def resolve_integrase(name: str) -> str | None:
37
- n = (name or "").strip()
38
- if n in (integrase_att().get("integrases") or {}):
39
- return n
40
- return _ALIAS.get(n.lower())
41
-
42
-
43
- def nominate_integrase(integrase: str = "Bxb1", top: int = 20) -> dict:
44
- """Genome-wide pseudo-attP nomination for a serine integrase. Replays the cached VM scan of the attP core
45
- window, scores by att-arm similarity, and ranks by fewer mismatches (more att-like = higher recombination
46
- risk). Abstains with a disclosure for an integrase without an encoded att (e.g. PhiC31). Never fabricates."""
47
- att = integrase_att()
48
- key = resolve_integrase(integrase)
49
- if key is None or key not in (att.get("integrases") or {}):
50
- disc = att.get("phic31_disclosure", {})
51
- if (integrase or "").lower().startswith("phic31"):
52
- return {"family": "serine_integrase", "integrase": "PhiC31", "available": False, "abstain": True,
53
- "status": _STATUS, "note": "PhiC31 att / pseudo-attP not encoded (disclosed data gap): "
54
- f"{disc.get('documented_fact', '')}", "disclosure": disc,
55
- "confirm_assay": "Cryptic-seq / HIDE-seq", "nomination_is_not_clearance": True}
56
- return {"family": "serine_integrase", "integrase": integrase, "available": False, "abstain": True,
57
- "status": _STATUS, "note": f"no encoded att for integrase {integrase!r}; encoded: "
58
- f"{sorted((att.get('integrases') or {}))}"}
59
-
60
- rec = att["integrases"][key]
61
- window = rec["scan_window"]
62
- enum = enumerate_motif(f"{key}_pseudo_attP")
63
- if enum.get("abstain"):
64
- return {"family": "serine_integrase", "integrase": key, "available": False, "abstain": True,
65
- "status": _STATUS, "att_core": rec["core"], "note": enum["note"],
66
- "cached_motifs": enum.get("cached_motifs", []), "confirm_assay": "Cryptic-seq / HIDE-seq",
67
- "nomination_is_not_clearance": True}
68
-
69
- wlen = len(window)
70
- noms = []
71
- for s in enum["sites"]:
72
- nmm = int(s["n_mismatch"])
73
- noms.append({"chrom": s["chrom"], "position": s["position"], "strand": s["strand"], "site": s["sequence"],
74
- "n_mismatch": nmm, "arm_similarity": round(1.0 - nmm / wlen, 3), "output_kind": "candidate"})
75
- noms.sort(key=lambda n: n["n_mismatch"])
76
- n_exact = sum(1 for n in noms if n["n_mismatch"] == 0)
77
- return {"family": "serine_integrase", "integrase": key, "available": True, "abstain": False, "mode": "finder",
78
- "status": _STATUS, "att_core": rec["core"], "central_dinucleotide": rec["central_dinucleotide"],
79
- "scan_window": window, "source": enum["source"], "att_doi": rec["doi"],
80
- "n_sites_genome_wide": len(noms), "n_exact_att_window": n_exact, "nominations": noms[:top],
81
- "specificity_note": rec.get("specificity_note"),
82
- "method": ("fixed-sequence Cas-OFFinder scan of the attP core window over GRCh38, scored by att-arm "
83
- "similarity (mismatch to the documented att); semi-validated (documented pseudosites are "
84
- "partial ground truth; no CRISPOR-scale validated integrase predictor exists)"),
85
- "confirm_assay": "Cryptic-seq / HIDE-seq (Tome Biosciences, 2024 preprint)",
86
- "honesty": "genome-wide pseudo-attP CANDIDATES by att similarity; NOT a clearance and NOT a validated "
87
- "predictor. Confirm by Cryptic-seq/HIDE-seq.",
88
- "nomination_is_not_clearance": True}
@@ -1,8 +0,0 @@
1
- {
2
- "cycle": "v7.2",
3
- "workstream": "PEN-OFFTGT-v2",
4
- "prepared": "2026-07-01",
5
- "sha256": {
6
- "prereg/ws_offtarget2.yaml": "45fe78018307df9816dca4c3c5c3e9bdfe1022109044f599b09c5dd6b9e6357b"
7
- }
8
- }
File without changes
File without changes
File without changes
File without changes