pen-stack 6.6.0__tar.gz → 6.8.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 (483) hide show
  1. {pen_stack-6.6.0 → pen_stack-6.8.0}/CHANGELOG.md +80 -0
  2. {pen_stack-6.6.0 → pen_stack-6.8.0}/CITATION.cff +2 -2
  3. {pen_stack-6.6.0 → pen_stack-6.8.0}/PKG-INFO +54 -14
  4. {pen_stack-6.6.0 → pen_stack-6.8.0}/README.md +53 -13
  5. pen_stack-6.8.0/benchmarks/position_effect/README.md +60 -0
  6. pen_stack-6.8.0/benchmarks/position_effect/SHA256SUMS +1 -0
  7. pen_stack-6.8.0/benchmarks/writer_efficiency/README.md +54 -0
  8. pen_stack-6.8.0/benchmarks/writer_efficiency/SHA256SUMS +2 -0
  9. pen_stack-6.8.0/docs/cards/position_effect_data.md +36 -0
  10. pen_stack-6.8.0/docs/cards/writer_efficiency_data.md +48 -0
  11. pen_stack-6.8.0/docs/position_effect.md +57 -0
  12. pen_stack-6.8.0/docs/tpe_bench.md +48 -0
  13. pen_stack-6.8.0/docs/writer_efficiency.md +59 -0
  14. {pen_stack-6.6.0 → pen_stack-6.8.0}/pen_stack/__init__.py +1 -1
  15. {pen_stack-6.6.0 → pen_stack-6.8.0}/pen_stack/api/manifest.py +4 -0
  16. pen_stack-6.8.0/pen_stack/atlas/guide_design.py +148 -0
  17. pen_stack-6.8.0/pen_stack/atlas/writer_efficiency.py +184 -0
  18. pen_stack-6.8.0/pen_stack/atlas/writer_predict.py +225 -0
  19. pen_stack-6.8.0/pen_stack/atlas/writer_recommend.py +103 -0
  20. pen_stack-6.8.0/pen_stack/design/writer_variants.py +121 -0
  21. pen_stack-6.8.0/pen_stack/twin/data/__init__.py +12 -0
  22. pen_stack-6.8.0/pen_stack/twin/data/position_effect.py +224 -0
  23. {pen_stack-6.6.0 → pen_stack-6.8.0}/pen_stack/twin/outcome.py +23 -5
  24. pen_stack-6.8.0/pen_stack/twin/position_effect.py +368 -0
  25. pen_stack-6.8.0/pen_stack/validate/expr_controls.py +39 -0
  26. pen_stack-6.8.0/pen_stack/validate/heldout_celltype_expr.py +32 -0
  27. pen_stack-6.8.0/pen_stack/validate/known_biology_expr.py +38 -0
  28. {pen_stack-6.6.0 → pen_stack-6.8.0}/pen_stack.egg-info/PKG-INFO +54 -14
  29. {pen_stack-6.6.0 → pen_stack-6.8.0}/pen_stack.egg-info/SOURCES.txt +26 -0
  30. pen_stack-6.8.0/prereg/SHA256_LOCK_ws_expr2.json +8 -0
  31. pen_stack-6.8.0/prereg/SHA256_LOCK_ws_writer.json +8 -0
  32. pen_stack-6.8.0/prereg/ws_expr2.yaml +39 -0
  33. pen_stack-6.8.0/prereg/ws_writer.yaml +43 -0
  34. {pen_stack-6.6.0 → pen_stack-6.8.0}/pyproject.toml +1 -1
  35. pen_stack-6.8.0/scripts/p1_build_position_effect.py +103 -0
  36. pen_stack-6.8.0/scripts/p1_build_writer_eff.py +66 -0
  37. {pen_stack-6.6.0 → pen_stack-6.8.0}/LICENSE +0 -0
  38. {pen_stack-6.6.0 → pen_stack-6.8.0}/MANIFEST.in +0 -0
  39. {pen_stack-6.6.0 → pen_stack-6.8.0}/bench/run.py +0 -0
  40. {pen_stack-6.6.0 → pen_stack-6.8.0}/benchmarks/genome_writing_bench/LEADERBOARD.md +0 -0
  41. {pen_stack-6.6.0 → pen_stack-6.8.0}/benchmarks/genome_writing_bench/README.md +0 -0
  42. {pen_stack-6.6.0 → pen_stack-6.8.0}/benchmarks/genome_writing_bench/SHA256SUMS +0 -0
  43. {pen_stack-6.6.0 → pen_stack-6.8.0}/benchmarks/genome_writing_bench/SUBMISSIONS.md +0 -0
  44. {pen_stack-6.6.0 → pen_stack-6.8.0}/benchmarks/genome_writing_bench/tasks.yaml +0 -0
  45. {pen_stack-6.6.0 → pen_stack-6.8.0}/benchmarks/genome_writing_challenge/README.md +0 -0
  46. {pen_stack-6.6.0 → pen_stack-6.8.0}/benchmarks/genome_writing_challenge/SUBMISSIONS.md +0 -0
  47. {pen_stack-6.6.0 → pen_stack-6.8.0}/configs/antipeg.yaml +0 -0
  48. {pen_stack-6.6.0 → pen_stack-6.8.0}/configs/atlas_families.yaml +0 -0
  49. {pen_stack-6.6.0 → pen_stack-6.8.0}/configs/bridge_offtarget_profile.yaml +0 -0
  50. {pen_stack-6.6.0 → pen_stack-6.8.0}/configs/calibration/preexisting_nab_independent.yaml +0 -0
  51. {pen_stack-6.6.0 → pen_stack-6.8.0}/configs/capsid_epitope_oracle.yaml +0 -0
  52. {pen_stack-6.6.0 → pen_stack-6.8.0}/configs/capsid_sequences.fasta +0 -0
  53. {pen_stack-6.6.0 → pen_stack-6.8.0}/configs/cargo_polish.yaml +0 -0
  54. {pen_stack-6.6.0 → pen_stack-6.8.0}/configs/cell_types.yaml +0 -0
  55. {pen_stack-6.6.0 → pen_stack-6.8.0}/configs/datasets.yaml +0 -0
  56. {pen_stack-6.6.0 → pen_stack-6.8.0}/configs/delivery_constraints.yaml +0 -0
  57. {pen_stack-6.6.0 → pen_stack-6.8.0}/configs/delivery_rules.yaml +0 -0
  58. {pen_stack-6.6.0 → pen_stack-6.8.0}/configs/delivery_vehicles.yaml +0 -0
  59. {pen_stack-6.6.0 → pen_stack-6.8.0}/configs/expression/modifiers.yaml +0 -0
  60. {pen_stack-6.6.0 → pen_stack-6.8.0}/configs/expression/promoters.yaml +0 -0
  61. {pen_stack-6.6.0 → pen_stack-6.8.0}/configs/gates_v3.yaml +0 -0
  62. {pen_stack-6.6.0 → pen_stack-6.8.0}/configs/genotoxicity_oracle.yaml +0 -0
  63. {pen_stack-6.6.0 → pen_stack-6.8.0}/configs/gsh_validated_heldout.yaml +0 -0
  64. {pen_stack-6.6.0 → pen_stack-6.8.0}/configs/intent_weights.yaml +0 -0
  65. {pen_stack-6.6.0 → pen_stack-6.8.0}/configs/known_unknowns.yaml +0 -0
  66. {pen_stack-6.6.0 → pen_stack-6.8.0}/configs/llm.yaml +0 -0
  67. {pen_stack-6.6.0 → pen_stack-6.8.0}/configs/metric_guide.yaml +0 -0
  68. {pen_stack-6.6.0 → pen_stack-6.8.0}/configs/monitor_queries.yaml +0 -0
  69. {pen_stack-6.6.0 → pen_stack-6.8.0}/configs/oracles/execution.yaml +0 -0
  70. {pen_stack-6.6.0 → pen_stack-6.8.0}/configs/oracles/scope_cards.yaml +0 -0
  71. {pen_stack-6.6.0 → pen_stack-6.8.0}/configs/rules/delivery.yaml +0 -0
  72. {pen_stack-6.6.0 → pen_stack-6.8.0}/configs/rules/fold.yaml +0 -0
  73. {pen_stack-6.6.0 → pen_stack-6.8.0}/configs/rules/multiplex.yaml +0 -0
  74. {pen_stack-6.6.0 → pen_stack-6.8.0}/configs/rules/payload.yaml +0 -0
  75. {pen_stack-6.6.0 → pen_stack-6.8.0}/configs/rules/reachability.yaml +0 -0
  76. {pen_stack-6.6.0 → pen_stack-6.8.0}/configs/safety/hazard_registry.yaml +0 -0
  77. {pen_stack-6.6.0 → pen_stack-6.8.0}/configs/safety/policy.yaml +0 -0
  78. {pen_stack-6.6.0 → pen_stack-6.8.0}/configs/safety/probes.yaml +0 -0
  79. {pen_stack-6.6.0 → pen_stack-6.8.0}/configs/score_axes.yaml +0 -0
  80. {pen_stack-6.6.0 → pen_stack-6.8.0}/configs/seroprevalence.yaml +0 -0
  81. {pen_stack-6.6.0 → pen_stack-6.8.0}/configs/target_sites.yaml +0 -0
  82. {pen_stack-6.6.0 → pen_stack-6.8.0}/configs/universe_crosswalk.yaml +0 -0
  83. {pen_stack-6.6.0 → pen_stack-6.8.0}/configs/write_types.yaml +0 -0
  84. {pen_stack-6.6.0 → pen_stack-6.8.0}/configs/wtkb_curated.yaml +0 -0
  85. {pen_stack-6.6.0 → pen_stack-6.8.0}/data/curated/bridge_offtarget_energetics.json +0 -0
  86. {pen_stack-6.6.0 → pen_stack-6.8.0}/data/curated/bridge_offtarget_profile_measured.parquet +0 -0
  87. {pen_stack-6.6.0 → pen_stack-6.8.0}/data/curated/gene_coords.parquet +0 -0
  88. {pen_stack-6.6.0 → pen_stack-6.8.0}/data/curated/unified_editor_universe.parquet +0 -0
  89. {pen_stack-6.6.0 → pen_stack-6.8.0}/docs/BACKLOG.md +0 -0
  90. {pen_stack-6.6.0 → pen_stack-6.8.0}/docs/DEPLOY.md +0 -0
  91. {pen_stack-6.6.0 → pen_stack-6.8.0}/docs/INFRA.md +0 -0
  92. {pen_stack-6.6.0 → pen_stack-6.8.0}/docs/MCP.md +0 -0
  93. {pen_stack-6.6.0 → pen_stack-6.8.0}/docs/RELEASING.md +0 -0
  94. {pen_stack-6.6.0 → pen_stack-6.8.0}/docs/REPRO.md +0 -0
  95. {pen_stack-6.6.0 → pen_stack-6.8.0}/docs/STABILITY.md +0 -0
  96. {pen_stack-6.6.0 → pen_stack-6.8.0}/docs/agent.md +0 -0
  97. {pen_stack-6.6.0 → pen_stack-6.8.0}/docs/alphagenome_feasibility.md +0 -0
  98. {pen_stack-6.6.0 → pen_stack-6.8.0}/docs/autonomy.md +0 -0
  99. {pen_stack-6.6.0 → pen_stack-6.8.0}/docs/benchmark_circularity.md +0 -0
  100. {pen_stack-6.6.0 → pen_stack-6.8.0}/docs/biosecurity.md +0 -0
  101. {pen_stack-6.6.0 → pen_stack-6.8.0}/docs/build_interface.md +0 -0
  102. {pen_stack-6.6.0 → pen_stack-6.8.0}/docs/cards/atlas.md +0 -0
  103. {pen_stack-6.6.0 → pen_stack-6.8.0}/docs/cards/durability.md +0 -0
  104. {pen_stack-6.6.0 → pen_stack-6.8.0}/docs/cards/safety.md +0 -0
  105. {pen_stack-6.6.0 → pen_stack-6.8.0}/docs/challenge.md +0 -0
  106. {pen_stack-6.6.0 → pen_stack-6.8.0}/docs/closed_loop.md +0 -0
  107. {pen_stack-6.6.0 → pen_stack-6.8.0}/docs/co_scientist.md +0 -0
  108. {pen_stack-6.6.0 → pen_stack-6.8.0}/docs/co_scientist_loop.md +0 -0
  109. {pen_stack-6.6.0 → pen_stack-6.8.0}/docs/delivery.md +0 -0
  110. {pen_stack-6.6.0 → pen_stack-6.8.0}/docs/delivery_immunology.md +0 -0
  111. {pen_stack-6.6.0 → pen_stack-6.8.0}/docs/digital_twin.md +0 -0
  112. {pen_stack-6.6.0 → pen_stack-6.8.0}/docs/dissemination.md +0 -0
  113. {pen_stack-6.6.0 → pen_stack-6.8.0}/docs/environment.md +0 -0
  114. {pen_stack-6.6.0 → pen_stack-6.8.0}/docs/experiment_design.md +0 -0
  115. {pen_stack-6.6.0 → pen_stack-6.8.0}/docs/generative_design.md +0 -0
  116. {pen_stack-6.6.0 → pen_stack-6.8.0}/docs/index.md +0 -0
  117. {pen_stack-6.6.0 → pen_stack-6.8.0}/docs/integrations.md +0 -0
  118. {pen_stack-6.6.0 → pen_stack-6.8.0}/docs/live_oracles.md +0 -0
  119. {pen_stack-6.6.0 → pen_stack-6.8.0}/docs/mechanistic_constraints.md +0 -0
  120. {pen_stack-6.6.0 → pen_stack-6.8.0}/docs/oracles.md +0 -0
  121. {pen_stack-6.6.0 → pen_stack-6.8.0}/docs/positioning.md +0 -0
  122. {pen_stack-6.6.0 → pen_stack-6.8.0}/docs/private_data_formats.md +0 -0
  123. {pen_stack-6.6.0 → pen_stack-6.8.0}/docs/quickstart.md +0 -0
  124. {pen_stack-6.6.0 → pen_stack-6.8.0}/docs/responsible_use.md +0 -0
  125. {pen_stack-6.6.0 → pen_stack-6.8.0}/docs/rules.md +0 -0
  126. {pen_stack-6.6.0 → pen_stack-6.8.0}/docs/scope.md +0 -0
  127. {pen_stack-6.6.0 → pen_stack-6.8.0}/docs/scorecard.md +0 -0
  128. {pen_stack-6.6.0 → pen_stack-6.8.0}/docs/tutorials/compare-families.md +0 -0
  129. {pen_stack-6.6.0 → pen_stack-6.8.0}/docs/tutorials/score-deliverability.md +0 -0
  130. {pen_stack-6.6.0 → pen_stack-6.8.0}/docs/tutorials/where-can-i-write.md +0 -0
  131. {pen_stack-6.6.0 → pen_stack-6.8.0}/docs/tutorials/which-writer-reaches-locus.md +0 -0
  132. {pen_stack-6.6.0 → pen_stack-6.8.0}/docs/uncertainty.md +0 -0
  133. {pen_stack-6.6.0 → pen_stack-6.8.0}/docs/verify.md +0 -0
  134. {pen_stack-6.6.0 → pen_stack-6.8.0}/docs/world_model.md +0 -0
  135. {pen_stack-6.6.0 → pen_stack-6.8.0}/docs/writer_verification.md +0 -0
  136. {pen_stack-6.6.0 → pen_stack-6.8.0}/docs/wtkb.md +0 -0
  137. {pen_stack-6.6.0 → pen_stack-6.8.0}/pen_stack/_resources.py +0 -0
  138. {pen_stack-6.6.0 → pen_stack-6.8.0}/pen_stack/active/__init__.py +0 -0
  139. {pen_stack-6.6.0 → pen_stack-6.8.0}/pen_stack/active/acquire.py +0 -0
  140. {pen_stack-6.6.0 → pen_stack-6.8.0}/pen_stack/active/design.py +0 -0
  141. {pen_stack-6.6.0 → pen_stack-6.8.0}/pen_stack/active/validate.py +0 -0
  142. {pen_stack-6.6.0 → pen_stack-6.8.0}/pen_stack/adapt/__init__.py +0 -0
  143. {pen_stack-6.6.0 → pen_stack-6.8.0}/pen_stack/adapt/finetune.py +0 -0
  144. {pen_stack-6.6.0 → pen_stack-6.8.0}/pen_stack/adapt/ingest.py +0 -0
  145. {pen_stack-6.6.0 → pen_stack-6.8.0}/pen_stack/adapt/pipeline.py +0 -0
  146. {pen_stack-6.6.0 → pen_stack-6.8.0}/pen_stack/adapt/recalibrate.py +0 -0
  147. {pen_stack-6.6.0 → pen_stack-6.8.0}/pen_stack/adapt/report.py +0 -0
  148. {pen_stack-6.6.0 → pen_stack-6.8.0}/pen_stack/agent/__init__.py +0 -0
  149. {pen_stack-6.6.0 → pen_stack-6.8.0}/pen_stack/agent/cite.py +0 -0
  150. {pen_stack-6.6.0 → pen_stack-6.8.0}/pen_stack/agent/co_scientist.py +0 -0
  151. {pen_stack-6.6.0 → pen_stack-6.8.0}/pen_stack/agent/epistemic.py +0 -0
  152. {pen_stack-6.6.0 → pen_stack-6.8.0}/pen_stack/agent/guardrails.py +0 -0
  153. {pen_stack-6.6.0 → pen_stack-6.8.0}/pen_stack/agent/mcp_server.py +0 -0
  154. {pen_stack-6.6.0 → pen_stack-6.8.0}/pen_stack/agent/orchestrator.py +0 -0
  155. {pen_stack-6.6.0 → pen_stack-6.8.0}/pen_stack/agent/orchestrator_live.py +0 -0
  156. {pen_stack-6.6.0 → pen_stack-6.8.0}/pen_stack/agent/pen_agent.py +0 -0
  157. {pen_stack-6.6.0 → pen_stack-6.8.0}/pen_stack/agent/scope.py +0 -0
  158. {pen_stack-6.6.0 → pen_stack-6.8.0}/pen_stack/agent/tools.py +0 -0
  159. {pen_stack-6.6.0 → pen_stack-6.8.0}/pen_stack/api/__init__.py +0 -0
  160. {pen_stack-6.6.0 → pen_stack-6.8.0}/pen_stack/atlas/__init__.py +0 -0
  161. {pen_stack-6.6.0 → pen_stack-6.8.0}/pen_stack/atlas/build_wtkb.py +0 -0
  162. {pen_stack-6.6.0 → pen_stack-6.8.0}/pen_stack/atlas/crosslink.py +0 -0
  163. {pen_stack-6.6.0 → pen_stack-6.8.0}/pen_stack/atlas/expand.py +0 -0
  164. {pen_stack-6.6.0 → pen_stack-6.8.0}/pen_stack/atlas/schema.py +0 -0
  165. {pen_stack-6.6.0 → pen_stack-6.8.0}/pen_stack/atlas/scorecard.py +0 -0
  166. {pen_stack-6.6.0 → pen_stack-6.8.0}/pen_stack/atlas/universe.py +0 -0
  167. {pen_stack-6.6.0 → pen_stack-6.8.0}/pen_stack/atlas/variant_propose.py +0 -0
  168. {pen_stack-6.6.0 → pen_stack-6.8.0}/pen_stack/atlas/writer_verify.py +0 -0
  169. {pen_stack-6.6.0 → pen_stack-6.8.0}/pen_stack/bridge/__init__.py +0 -0
  170. {pen_stack-6.6.0 → pen_stack-6.8.0}/pen_stack/bridge/activity.py +0 -0
  171. {pen_stack-6.6.0 → pen_stack-6.8.0}/pen_stack/bridge/cli.py +0 -0
  172. {pen_stack-6.6.0 → pen_stack-6.8.0}/pen_stack/bridge/fold_qc.py +0 -0
  173. {pen_stack-6.6.0 → pen_stack-6.8.0}/pen_stack/bridge/guide_qc.py +0 -0
  174. {pen_stack-6.6.0 → pen_stack-6.8.0}/pen_stack/bridge/ingest.py +0 -0
  175. {pen_stack-6.6.0 → pen_stack-6.8.0}/pen_stack/bridge/offtarget.py +0 -0
  176. {pen_stack-6.6.0 → pen_stack-6.8.0}/pen_stack/bridge/offtarget_energetics.py +0 -0
  177. {pen_stack-6.6.0 → pen_stack-6.8.0}/pen_stack/bridge/ortholog_screen.py +0 -0
  178. {pen_stack-6.6.0 → pen_stack-6.8.0}/pen_stack/bridge/pipeline.py +0 -0
  179. {pen_stack-6.6.0 → pen_stack-6.8.0}/pen_stack/build/__init__.py +0 -0
  180. {pen_stack-6.6.0 → pen_stack-6.8.0}/pen_stack/build/ingest.py +0 -0
  181. {pen_stack-6.6.0 → pen_stack-6.8.0}/pen_stack/build/protocol.py +0 -0
  182. {pen_stack-6.6.0 → pen_stack-6.8.0}/pen_stack/build/simlab.py +0 -0
  183. {pen_stack-6.6.0 → pen_stack-6.8.0}/pen_stack/cli.py +0 -0
  184. {pen_stack-6.6.0 → pen_stack-6.8.0}/pen_stack/data/__init__.py +0 -0
  185. {pen_stack-6.6.0 → pen_stack-6.8.0}/pen_stack/data/encode.py +0 -0
  186. {pen_stack-6.6.0 → pen_stack-6.8.0}/pen_stack/data/genome.py +0 -0
  187. {pen_stack-6.6.0 → pen_stack-6.8.0}/pen_stack/data/ingest_chromatin.py +0 -0
  188. {pen_stack-6.6.0 → pen_stack-6.8.0}/pen_stack/data/ingest_integration.py +0 -0
  189. {pen_stack-6.6.0 → pen_stack-6.8.0}/pen_stack/data/ingest_safety_annot.py +0 -0
  190. {pen_stack-6.6.0 → pen_stack-6.8.0}/pen_stack/data/ingest_trip.py +0 -0
  191. {pen_stack-6.6.0 → pen_stack-6.8.0}/pen_stack/design/__init__.py +0 -0
  192. {pen_stack-6.6.0 → pen_stack-6.8.0}/pen_stack/design/generate.py +0 -0
  193. {pen_stack-6.6.0 → pen_stack-6.8.0}/pen_stack/design/pareto.py +0 -0
  194. {pen_stack-6.6.0 → pen_stack-6.8.0}/pen_stack/design/space.py +0 -0
  195. {pen_stack-6.6.0 → pen_stack-6.8.0}/pen_stack/env/__init__.py +0 -0
  196. {pen_stack-6.6.0 → pen_stack-6.8.0}/pen_stack/env/genome_writing_env.py +0 -0
  197. {pen_stack-6.6.0 → pen_stack-6.8.0}/pen_stack/env/policies.py +0 -0
  198. {pen_stack-6.6.0 → pen_stack-6.8.0}/pen_stack/graph/__init__.py +0 -0
  199. {pen_stack-6.6.0 → pen_stack-6.8.0}/pen_stack/graph/build.py +0 -0
  200. {pen_stack-6.6.0 → pen_stack-6.8.0}/pen_stack/graph/cell_types.py +0 -0
  201. {pen_stack-6.6.0 → pen_stack-6.8.0}/pen_stack/graph/ingest.py +0 -0
  202. {pen_stack-6.6.0 → pen_stack-6.8.0}/pen_stack/graph/query.py +0 -0
  203. {pen_stack-6.6.0 → pen_stack-6.8.0}/pen_stack/graph/schema.py +0 -0
  204. {pen_stack-6.6.0 → pen_stack-6.8.0}/pen_stack/loop/__init__.py +0 -0
  205. {pen_stack-6.6.0 → pen_stack-6.8.0}/pen_stack/loop/continual.py +0 -0
  206. {pen_stack-6.6.0 → pen_stack-6.8.0}/pen_stack/loop/cycle.py +0 -0
  207. {pen_stack-6.6.0 → pen_stack-6.8.0}/pen_stack/loop/drift.py +0 -0
  208. {pen_stack-6.6.0 → pen_stack-6.8.0}/pen_stack/mech/__init__.py +0 -0
  209. {pen_stack-6.6.0 → pen_stack-6.8.0}/pen_stack/mech/classify_atlas.py +0 -0
  210. {pen_stack-6.6.0 → pen_stack-6.8.0}/pen_stack/mech/whitelist.py +0 -0
  211. {pen_stack-6.6.0 → pen_stack-6.8.0}/pen_stack/monitor/__init__.py +0 -0
  212. {pen_stack-6.6.0 → pen_stack-6.8.0}/pen_stack/monitor/europepmc.py +0 -0
  213. {pen_stack-6.6.0 → pen_stack-6.8.0}/pen_stack/monitor/run.py +0 -0
  214. {pen_stack-6.6.0 → pen_stack-6.8.0}/pen_stack/monitor/triage.py +0 -0
  215. {pen_stack-6.6.0 → pen_stack-6.8.0}/pen_stack/oracles/__init__.py +0 -0
  216. {pen_stack-6.6.0 → pen_stack-6.8.0}/pen_stack/oracles/cache.py +0 -0
  217. {pen_stack-6.6.0 → pen_stack-6.8.0}/pen_stack/oracles/energetics.py +0 -0
  218. {pen_stack-6.6.0 → pen_stack-6.8.0}/pen_stack/oracles/genome.py +0 -0
  219. {pen_stack-6.6.0 → pen_stack-6.8.0}/pen_stack/oracles/protein_design.py +0 -0
  220. {pen_stack-6.6.0 → pen_stack-6.8.0}/pen_stack/oracles/rna.py +0 -0
  221. {pen_stack-6.6.0 → pen_stack-6.8.0}/pen_stack/oracles/schema.py +0 -0
  222. {pen_stack-6.6.0 → pen_stack-6.8.0}/pen_stack/oracles/status.py +0 -0
  223. {pen_stack-6.6.0 → pen_stack-6.8.0}/pen_stack/oracles/structure.py +0 -0
  224. {pen_stack-6.6.0 → pen_stack-6.8.0}/pen_stack/oracles/vcell.py +0 -0
  225. {pen_stack-6.6.0 → pen_stack-6.8.0}/pen_stack/planner/__init__.py +0 -0
  226. {pen_stack-6.6.0 → pen_stack-6.8.0}/pen_stack/planner/antipeg_oracle.py +0 -0
  227. {pen_stack-6.6.0 → pen_stack-6.8.0}/pen_stack/planner/capsid_epitope_oracle.py +0 -0
  228. {pen_stack-6.6.0 → pen_stack-6.8.0}/pen_stack/planner/cargo.py +0 -0
  229. {pen_stack-6.6.0 → pen_stack-6.8.0}/pen_stack/planner/cargo_polish.py +0 -0
  230. {pen_stack-6.6.0 → pen_stack-6.8.0}/pen_stack/planner/delivery.py +0 -0
  231. {pen_stack-6.6.0 → pen_stack-6.8.0}/pen_stack/planner/delivery_constraints.py +0 -0
  232. {pen_stack-6.6.0 → pen_stack-6.8.0}/pen_stack/planner/delivery_immunology.py +0 -0
  233. {pen_stack-6.6.0 → pen_stack-6.8.0}/pen_stack/planner/delivery_vehicles.py +0 -0
  234. {pen_stack-6.6.0 → pen_stack-6.8.0}/pen_stack/planner/genotoxicity_oracle.py +0 -0
  235. {pen_stack-6.6.0 → pen_stack-6.8.0}/pen_stack/planner/immune_profile.py +0 -0
  236. {pen_stack-6.6.0 → pen_stack-6.8.0}/pen_stack/planner/innate_sensing.py +0 -0
  237. {pen_stack-6.6.0 → pen_stack-6.8.0}/pen_stack/planner/multiplex.py +0 -0
  238. {pen_stack-6.6.0 → pen_stack-6.8.0}/pen_stack/planner/optimize.py +0 -0
  239. {pen_stack-6.6.0 → pen_stack-6.8.0}/pen_stack/planner/pipeline.py +0 -0
  240. {pen_stack-6.6.0 → pen_stack-6.8.0}/pen_stack/planner/report.py +0 -0
  241. {pen_stack-6.6.0 → pen_stack-6.8.0}/pen_stack/planner/router.py +0 -0
  242. {pen_stack-6.6.0 → pen_stack-6.8.0}/pen_stack/planner/seroprevalence_oracle.py +0 -0
  243. {pen_stack-6.6.0 → pen_stack-6.8.0}/pen_stack/planner/target_site.py +0 -0
  244. {pen_stack-6.6.0 → pen_stack-6.8.0}/pen_stack/rag/__init__.py +0 -0
  245. {pen_stack-6.6.0 → pen_stack-6.8.0}/pen_stack/rag/index.py +0 -0
  246. {pen_stack-6.6.0 → pen_stack-6.8.0}/pen_stack/rag/llm.py +0 -0
  247. {pen_stack-6.6.0 → pen_stack-6.8.0}/pen_stack/rag/qa.py +0 -0
  248. {pen_stack-6.6.0 → pen_stack-6.8.0}/pen_stack/rules/__init__.py +0 -0
  249. {pen_stack-6.6.0 → pen_stack-6.8.0}/pen_stack/rules/evaluators.py +0 -0
  250. {pen_stack-6.6.0 → pen_stack-6.8.0}/pen_stack/rules/loader.py +0 -0
  251. {pen_stack-6.6.0 → pen_stack-6.8.0}/pen_stack/rules/schema.py +0 -0
  252. {pen_stack-6.6.0 → pen_stack-6.8.0}/pen_stack/rules/solver.py +0 -0
  253. {pen_stack-6.6.0 → pen_stack-6.8.0}/pen_stack/safety/__init__.py +0 -0
  254. {pen_stack-6.6.0 → pen_stack-6.8.0}/pen_stack/safety/audit.py +0 -0
  255. {pen_stack-6.6.0 → pen_stack-6.8.0}/pen_stack/safety/gate.py +0 -0
  256. {pen_stack-6.6.0 → pen_stack-6.8.0}/pen_stack/safety/policy.py +0 -0
  257. {pen_stack-6.6.0 → pen_stack-6.8.0}/pen_stack/safety/redteam.py +0 -0
  258. {pen_stack-6.6.0 → pen_stack-6.8.0}/pen_stack/safety/registry.py +0 -0
  259. {pen_stack-6.6.0 → pen_stack-6.8.0}/pen_stack/safety/screen.py +0 -0
  260. {pen_stack-6.6.0 → pen_stack-6.8.0}/pen_stack/score/__init__.py +0 -0
  261. {pen_stack-6.6.0 → pen_stack-6.8.0}/pen_stack/score/recalibrate.py +0 -0
  262. {pen_stack-6.6.0 → pen_stack-6.8.0}/pen_stack/score/therapeutic.py +0 -0
  263. {pen_stack-6.6.0 → pen_stack-6.8.0}/pen_stack/server/__init__.py +0 -0
  264. {pen_stack-6.6.0 → pen_stack-6.8.0}/pen_stack/server/api.py +0 -0
  265. {pen_stack-6.6.0 → pen_stack-6.8.0}/pen_stack/twin/__init__.py +0 -0
  266. {pen_stack-6.6.0 → pen_stack-6.8.0}/pen_stack/twin/calibrate.py +0 -0
  267. {pen_stack-6.6.0 → pen_stack-6.8.0}/pen_stack/twin/mechanistic.py +0 -0
  268. {pen_stack-6.6.0 → pen_stack-6.8.0}/pen_stack/ui/__init__.py +0 -0
  269. {pen_stack-6.6.0 → pen_stack-6.8.0}/pen_stack/ui/app.py +0 -0
  270. {pen_stack-6.6.0 → pen_stack-6.8.0}/pen_stack/validate/__init__.py +0 -0
  271. {pen_stack-6.6.0 → pen_stack-6.8.0}/pen_stack/validate/adapt_demo.py +0 -0
  272. {pen_stack-6.6.0 → pen_stack-6.8.0}/pen_stack/validate/agent_eval.py +0 -0
  273. {pen_stack-6.6.0 → pen_stack-6.8.0}/pen_stack/validate/bench_adversarial_tasks.py +0 -0
  274. {pen_stack-6.6.0 → pen_stack-6.8.0}/pen_stack/validate/bench_coscientist_tasks.py +0 -0
  275. {pen_stack-6.6.0 → pen_stack-6.8.0}/pen_stack/validate/bench_graph_tasks.py +0 -0
  276. {pen_stack-6.6.0 → pen_stack-6.8.0}/pen_stack/validate/bench_rule_tasks.py +0 -0
  277. {pen_stack-6.6.0 → pen_stack-6.8.0}/pen_stack/validate/bench_trust_tasks.py +0 -0
  278. {pen_stack-6.6.0 → pen_stack-6.8.0}/pen_stack/validate/bench_writetype_tasks.py +0 -0
  279. {pen_stack-6.6.0 → pen_stack-6.8.0}/pen_stack/validate/blind_gsh_discovery.py +0 -0
  280. {pen_stack-6.6.0 → pen_stack-6.8.0}/pen_stack/validate/cargo_directionality.py +0 -0
  281. {pen_stack-6.6.0 → pen_stack-6.8.0}/pen_stack/validate/closed_loop.py +0 -0
  282. {pen_stack-6.6.0 → pen_stack-6.8.0}/pen_stack/validate/durability_baselines.py +0 -0
  283. {pen_stack-6.6.0 → pen_stack-6.8.0}/pen_stack/validate/experiment_design.py +0 -0
  284. {pen_stack-6.6.0 → pen_stack-6.8.0}/pen_stack/validate/forward_hypotheses.py +0 -0
  285. {pen_stack-6.6.0 → pen_stack-6.8.0}/pen_stack/validate/generative_design.py +0 -0
  286. {pen_stack-6.6.0 → pen_stack-6.8.0}/pen_stack/validate/guide_qc_demo.py +0 -0
  287. {pen_stack-6.6.0 → pen_stack-6.8.0}/pen_stack/validate/immune_calibration.py +0 -0
  288. {pen_stack-6.6.0 → pen_stack-6.8.0}/pen_stack/validate/intent_specification.py +0 -0
  289. {pen_stack-6.6.0 → pen_stack-6.8.0}/pen_stack/validate/offtarget_energetics_eval.py +0 -0
  290. {pen_stack-6.6.0 → pen_stack-6.8.0}/pen_stack/validate/out_of_scope_refusal.py +0 -0
  291. {pen_stack-6.6.0 → pen_stack-6.8.0}/pen_stack/validate/outcome_calibration.py +0 -0
  292. {pen_stack-6.6.0 → pen_stack-6.8.0}/pen_stack/validate/outcome_prediction.py +0 -0
  293. {pen_stack-6.6.0 → pen_stack-6.8.0}/pen_stack/validate/paper3_benchmark.py +0 -0
  294. {pen_stack-6.6.0 → pen_stack-6.8.0}/pen_stack/validate/paper4_real_validation.py +0 -0
  295. {pen_stack-6.6.0 → pen_stack-6.8.0}/pen_stack/validate/paper4_validation.py +0 -0
  296. {pen_stack-6.6.0 → pen_stack-6.8.0}/pen_stack/validate/protocol_safety.py +0 -0
  297. {pen_stack-6.6.0 → pen_stack-6.8.0}/pen_stack/validate/safety_screening.py +0 -0
  298. {pen_stack-6.6.0 → pen_stack-6.8.0}/pen_stack/validate/selective_prediction.py +0 -0
  299. {pen_stack-6.6.0 → pen_stack-6.8.0}/pen_stack/validate/seq_vs_measured.py +0 -0
  300. {pen_stack-6.6.0 → pen_stack-6.8.0}/pen_stack/validate/target_site_controls.py +0 -0
  301. {pen_stack-6.6.0 → pen_stack-6.8.0}/pen_stack/validate/uncertainty_eval.py +0 -0
  302. {pen_stack-6.6.0 → pen_stack-6.8.0}/pen_stack/validate/ungrounded_baseline.py +0 -0
  303. {pen_stack-6.6.0 → pen_stack-6.8.0}/pen_stack/validate/within_locus_ranking.py +0 -0
  304. {pen_stack-6.6.0 → pen_stack-6.8.0}/pen_stack/validate/writer_recovery.py +0 -0
  305. {pen_stack-6.6.0 → pen_stack-6.8.0}/pen_stack/verify/__init__.py +0 -0
  306. {pen_stack-6.6.0 → pen_stack-6.8.0}/pen_stack/verify/schema.py +0 -0
  307. {pen_stack-6.6.0 → pen_stack-6.8.0}/pen_stack/verify/service.py +0 -0
  308. {pen_stack-6.6.0 → pen_stack-6.8.0}/pen_stack/web/__init__.py +0 -0
  309. {pen_stack-6.6.0 → pen_stack-6.8.0}/pen_stack/web/guide.py +0 -0
  310. {pen_stack-6.6.0 → pen_stack-6.8.0}/pen_stack/web/llm.py +0 -0
  311. {pen_stack-6.6.0 → pen_stack-6.8.0}/pen_stack/web/router.py +0 -0
  312. {pen_stack-6.6.0 → pen_stack-6.8.0}/pen_stack/web/server.py +0 -0
  313. {pen_stack-6.6.0 → pen_stack-6.8.0}/pen_stack/web/tools.py +0 -0
  314. {pen_stack-6.6.0 → pen_stack-6.8.0}/pen_stack/wgenome/__init__.py +0 -0
  315. {pen_stack-6.6.0 → pen_stack-6.8.0}/pen_stack/wgenome/chromatin_seq.py +0 -0
  316. {pen_stack-6.6.0 → pen_stack-6.8.0}/pen_stack/wgenome/durability.py +0 -0
  317. {pen_stack-6.6.0 → pen_stack-6.8.0}/pen_stack/wgenome/export_tracks.py +0 -0
  318. {pen_stack-6.6.0 → pen_stack-6.8.0}/pen_stack/wgenome/features.py +0 -0
  319. {pen_stack-6.6.0 → pen_stack-6.8.0}/pen_stack/wgenome/gsh_baseline.py +0 -0
  320. {pen_stack-6.6.0 → pen_stack-6.8.0}/pen_stack/wgenome/mesh_features.py +0 -0
  321. {pen_stack-6.6.0 → pen_stack-6.8.0}/pen_stack/wgenome/ood.py +0 -0
  322. {pen_stack-6.6.0 → pen_stack-6.8.0}/pen_stack/wgenome/providers.py +0 -0
  323. {pen_stack-6.6.0 → pen_stack-6.8.0}/pen_stack/wgenome/safety.py +0 -0
  324. {pen_stack-6.6.0 → pen_stack-6.8.0}/pen_stack/wgenome/structure3d.py +0 -0
  325. {pen_stack-6.6.0 → pen_stack-6.8.0}/pen_stack/wgenome/uncertainty.py +0 -0
  326. {pen_stack-6.6.0 → pen_stack-6.8.0}/pen_stack/wgenome/writability.py +0 -0
  327. {pen_stack-6.6.0 → pen_stack-6.8.0}/pen_stack.egg-info/dependency_links.txt +0 -0
  328. {pen_stack-6.6.0 → pen_stack-6.8.0}/pen_stack.egg-info/entry_points.txt +0 -0
  329. {pen_stack-6.6.0 → pen_stack-6.8.0}/pen_stack.egg-info/requires.txt +0 -0
  330. {pen_stack-6.6.0 → pen_stack-6.8.0}/pen_stack.egg-info/top_level.txt +0 -0
  331. {pen_stack-6.6.0 → pen_stack-6.8.0}/prereg/SHA256_LOCK_phase0.json +0 -0
  332. {pen_stack-6.6.0 → pen_stack-6.8.0}/prereg/SHA256_LOCK_phase1_5.json +0 -0
  333. {pen_stack-6.6.0 → pen_stack-6.8.0}/prereg/SHA256_LOCK_phase2.json +0 -0
  334. {pen_stack-6.6.0 → pen_stack-6.8.0}/prereg/SHA256_LOCK_phase3.json +0 -0
  335. {pen_stack-6.6.0 → pen_stack-6.8.0}/prereg/SHA256_LOCK_ws_a.json +0 -0
  336. {pen_stack-6.6.0 → pen_stack-6.8.0}/prereg/SHA256_LOCK_ws_acq.json +0 -0
  337. {pen_stack-6.6.0 → pen_stack-6.8.0}/prereg/SHA256_LOCK_ws_aldesign.json +0 -0
  338. {pen_stack-6.6.0 → pen_stack-6.8.0}/prereg/SHA256_LOCK_ws_alvalidate.json +0 -0
  339. {pen_stack-6.6.0 → pen_stack-6.8.0}/prereg/SHA256_LOCK_ws_atlas.json +0 -0
  340. {pen_stack-6.6.0 → pen_stack-6.8.0}/prereg/SHA256_LOCK_ws_b.json +0 -0
  341. {pen_stack-6.6.0 → pen_stack-6.8.0}/prereg/SHA256_LOCK_ws_ba.json +0 -0
  342. {pen_stack-6.6.0 → pen_stack-6.8.0}/prereg/SHA256_LOCK_ws_ba_v33.json +0 -0
  343. {pen_stack-6.6.0 → pen_stack-6.8.0}/prereg/SHA256_LOCK_ws_ba_v45.json +0 -0
  344. {pen_stack-6.6.0 → pen_stack-6.8.0}/prereg/SHA256_LOCK_ws_bench.json +0 -0
  345. {pen_stack-6.6.0 → pen_stack-6.8.0}/prereg/SHA256_LOCK_ws_c.json +0 -0
  346. {pen_stack-6.6.0 → pen_stack-6.8.0}/prereg/SHA256_LOCK_ws_cal.json +0 -0
  347. {pen_stack-6.6.0 → pen_stack-6.8.0}/prereg/SHA256_LOCK_ws_calib.json +0 -0
  348. {pen_stack-6.6.0 → pen_stack-6.8.0}/prereg/SHA256_LOCK_ws_challenge.json +0 -0
  349. {pen_stack-6.6.0 → pen_stack-6.8.0}/prereg/SHA256_LOCK_ws_chat.json +0 -0
  350. {pen_stack-6.6.0 → pen_stack-6.8.0}/prereg/SHA256_LOCK_ws_cite.json +0 -0
  351. {pen_stack-6.6.0 → pen_stack-6.8.0}/prereg/SHA256_LOCK_ws_continual.json +0 -0
  352. {pen_stack-6.6.0 → pen_stack-6.8.0}/prereg/SHA256_LOCK_ws_cosci2.json +0 -0
  353. {pen_stack-6.6.0 → pen_stack-6.8.0}/prereg/SHA256_LOCK_ws_crit.json +0 -0
  354. {pen_stack-6.6.0 → pen_stack-6.8.0}/prereg/SHA256_LOCK_ws_ct.json +0 -0
  355. {pen_stack-6.6.0 → pen_stack-6.8.0}/prereg/SHA256_LOCK_ws_d.json +0 -0
  356. {pen_stack-6.6.0 → pen_stack-6.8.0}/prereg/SHA256_LOCK_ws_drift.json +0 -0
  357. {pen_stack-6.6.0 → pen_stack-6.8.0}/prereg/SHA256_LOCK_ws_e.json +0 -0
  358. {pen_stack-6.6.0 → pen_stack-6.8.0}/prereg/SHA256_LOCK_ws_env.json +0 -0
  359. {pen_stack-6.6.0 → pen_stack-6.8.0}/prereg/SHA256_LOCK_ws_ep.json +0 -0
  360. {pen_stack-6.6.0 → pen_stack-6.8.0}/prereg/SHA256_LOCK_ws_epitope.json +0 -0
  361. {pen_stack-6.6.0 → pen_stack-6.8.0}/prereg/SHA256_LOCK_ws_f.json +0 -0
  362. {pen_stack-6.6.0 → pen_stack-6.8.0}/prereg/SHA256_LOCK_ws_frontend.json +0 -0
  363. {pen_stack-6.6.0 → pen_stack-6.8.0}/prereg/SHA256_LOCK_ws_g.json +0 -0
  364. {pen_stack-6.6.0 → pen_stack-6.8.0}/prereg/SHA256_LOCK_ws_gen.json +0 -0
  365. {pen_stack-6.6.0 → pen_stack-6.8.0}/prereg/SHA256_LOCK_ws_genotox.json +0 -0
  366. {pen_stack-6.6.0 → pen_stack-6.8.0}/prereg/SHA256_LOCK_ws_graph.json +0 -0
  367. {pen_stack-6.6.0 → pen_stack-6.8.0}/prereg/SHA256_LOCK_ws_h.json +0 -0
  368. {pen_stack-6.6.0 → pen_stack-6.8.0}/prereg/SHA256_LOCK_ws_hybrid.json +0 -0
  369. {pen_stack-6.6.0 → pen_stack-6.8.0}/prereg/SHA256_LOCK_ws_immune.json +0 -0
  370. {pen_stack-6.6.0 → pen_stack-6.8.0}/prereg/SHA256_LOCK_ws_ingest.json +0 -0
  371. {pen_stack-6.6.0 → pen_stack-6.8.0}/prereg/SHA256_LOCK_ws_innate.json +0 -0
  372. {pen_stack-6.6.0 → pen_stack-6.8.0}/prereg/SHA256_LOCK_ws_loop.json +0 -0
  373. {pen_stack-6.6.0 → pen_stack-6.8.0}/prereg/SHA256_LOCK_ws_manifest.json +0 -0
  374. {pen_stack-6.6.0 → pen_stack-6.8.0}/prereg/SHA256_LOCK_ws_mc.json +0 -0
  375. {pen_stack-6.6.0 → pen_stack-6.8.0}/prereg/SHA256_LOCK_ws_mcp.json +0 -0
  376. {pen_stack-6.6.0 → pen_stack-6.8.0}/prereg/SHA256_LOCK_ws_mech.json +0 -0
  377. {pen_stack-6.6.0 → pen_stack-6.8.0}/prereg/SHA256_LOCK_ws_mon.json +0 -0
  378. {pen_stack-6.6.0 → pen_stack-6.8.0}/prereg/SHA256_LOCK_ws_o.json +0 -0
  379. {pen_stack-6.6.0 → pen_stack-6.8.0}/prereg/SHA256_LOCK_ws_openapi.json +0 -0
  380. {pen_stack-6.6.0 → pen_stack-6.8.0}/prereg/SHA256_LOCK_ws_orch.json +0 -0
  381. {pen_stack-6.6.0 → pen_stack-6.8.0}/prereg/SHA256_LOCK_ws_outcome.json +0 -0
  382. {pen_stack-6.6.0 → pen_stack-6.8.0}/prereg/SHA256_LOCK_ws_pareto.json +0 -0
  383. {pen_stack-6.6.0 → pen_stack-6.8.0}/prereg/SHA256_LOCK_ws_peg.json +0 -0
  384. {pen_stack-6.6.0 → pen_stack-6.8.0}/prereg/SHA256_LOCK_ws_plan.json +0 -0
  385. {pen_stack-6.6.0 → pen_stack-6.8.0}/prereg/SHA256_LOCK_ws_policy.json +0 -0
  386. {pen_stack-6.6.0 → pen_stack-6.8.0}/prereg/SHA256_LOCK_ws_profile.json +0 -0
  387. {pen_stack-6.6.0 → pen_stack-6.8.0}/prereg/SHA256_LOCK_ws_proto.json +0 -0
  388. {pen_stack-6.6.0 → pen_stack-6.8.0}/prereg/SHA256_LOCK_ws_r.json +0 -0
  389. {pen_stack-6.6.0 → pen_stack-6.8.0}/prereg/SHA256_LOCK_ws_redteam.json +0 -0
  390. {pen_stack-6.6.0 → pen_stack-6.8.0}/prereg/SHA256_LOCK_ws_route.json +0 -0
  391. {pen_stack-6.6.0 → pen_stack-6.8.0}/prereg/SHA256_LOCK_ws_screen.json +0 -0
  392. {pen_stack-6.6.0 → pen_stack-6.8.0}/prereg/SHA256_LOCK_ws_seroprev.json +0 -0
  393. {pen_stack-6.6.0 → pen_stack-6.8.0}/prereg/SHA256_LOCK_ws_simlab.json +0 -0
  394. {pen_stack-6.6.0 → pen_stack-6.8.0}/prereg/SHA256_LOCK_ws_twincal.json +0 -0
  395. {pen_stack-6.6.0 → pen_stack-6.8.0}/prereg/SHA256_LOCK_ws_uq.json +0 -0
  396. {pen_stack-6.6.0 → pen_stack-6.8.0}/prereg/SHA256_LOCK_ws_v.json +0 -0
  397. {pen_stack-6.6.0 → pen_stack-6.8.0}/prereg/SHA256_LOCK_ws_vcell.json +0 -0
  398. {pen_stack-6.6.0 → pen_stack-6.8.0}/prereg/SHA256_LOCK_ws_wv.json +0 -0
  399. {pen_stack-6.6.0 → pen_stack-6.8.0}/prereg/paper1.yaml +0 -0
  400. {pen_stack-6.6.0 → pen_stack-6.8.0}/prereg/paper2.yaml +0 -0
  401. {pen_stack-6.6.0 → pen_stack-6.8.0}/prereg/paper3.yaml +0 -0
  402. {pen_stack-6.6.0 → pen_stack-6.8.0}/prereg/paper4.yaml +0 -0
  403. {pen_stack-6.6.0 → pen_stack-6.8.0}/prereg/phase0.yaml +0 -0
  404. {pen_stack-6.6.0 → pen_stack-6.8.0}/prereg/ws_a.yaml +0 -0
  405. {pen_stack-6.6.0 → pen_stack-6.8.0}/prereg/ws_acq.yaml +0 -0
  406. {pen_stack-6.6.0 → pen_stack-6.8.0}/prereg/ws_aldesign.yaml +0 -0
  407. {pen_stack-6.6.0 → pen_stack-6.8.0}/prereg/ws_alvalidate.yaml +0 -0
  408. {pen_stack-6.6.0 → pen_stack-6.8.0}/prereg/ws_atlas.yaml +0 -0
  409. {pen_stack-6.6.0 → pen_stack-6.8.0}/prereg/ws_b.yaml +0 -0
  410. {pen_stack-6.6.0 → pen_stack-6.8.0}/prereg/ws_ba.yaml +0 -0
  411. {pen_stack-6.6.0 → pen_stack-6.8.0}/prereg/ws_ba_v33.yaml +0 -0
  412. {pen_stack-6.6.0 → pen_stack-6.8.0}/prereg/ws_ba_v45.yaml +0 -0
  413. {pen_stack-6.6.0 → pen_stack-6.8.0}/prereg/ws_bench.yaml +0 -0
  414. {pen_stack-6.6.0 → pen_stack-6.8.0}/prereg/ws_c.yaml +0 -0
  415. {pen_stack-6.6.0 → pen_stack-6.8.0}/prereg/ws_cal.yaml +0 -0
  416. {pen_stack-6.6.0 → pen_stack-6.8.0}/prereg/ws_calib.yaml +0 -0
  417. {pen_stack-6.6.0 → pen_stack-6.8.0}/prereg/ws_challenge.yaml +0 -0
  418. {pen_stack-6.6.0 → pen_stack-6.8.0}/prereg/ws_chat.yaml +0 -0
  419. {pen_stack-6.6.0 → pen_stack-6.8.0}/prereg/ws_cite.yaml +0 -0
  420. {pen_stack-6.6.0 → pen_stack-6.8.0}/prereg/ws_continual.yaml +0 -0
  421. {pen_stack-6.6.0 → pen_stack-6.8.0}/prereg/ws_cosci2.yaml +0 -0
  422. {pen_stack-6.6.0 → pen_stack-6.8.0}/prereg/ws_crit.yaml +0 -0
  423. {pen_stack-6.6.0 → pen_stack-6.8.0}/prereg/ws_ct.yaml +0 -0
  424. {pen_stack-6.6.0 → pen_stack-6.8.0}/prereg/ws_d.yaml +0 -0
  425. {pen_stack-6.6.0 → pen_stack-6.8.0}/prereg/ws_drift.yaml +0 -0
  426. {pen_stack-6.6.0 → pen_stack-6.8.0}/prereg/ws_e.yaml +0 -0
  427. {pen_stack-6.6.0 → pen_stack-6.8.0}/prereg/ws_env.yaml +0 -0
  428. {pen_stack-6.6.0 → pen_stack-6.8.0}/prereg/ws_ep.yaml +0 -0
  429. {pen_stack-6.6.0 → pen_stack-6.8.0}/prereg/ws_epitope.yaml +0 -0
  430. {pen_stack-6.6.0 → pen_stack-6.8.0}/prereg/ws_f.yaml +0 -0
  431. {pen_stack-6.6.0 → pen_stack-6.8.0}/prereg/ws_frontend.yaml +0 -0
  432. {pen_stack-6.6.0 → pen_stack-6.8.0}/prereg/ws_g.yaml +0 -0
  433. {pen_stack-6.6.0 → pen_stack-6.8.0}/prereg/ws_gen.yaml +0 -0
  434. {pen_stack-6.6.0 → pen_stack-6.8.0}/prereg/ws_genotox.yaml +0 -0
  435. {pen_stack-6.6.0 → pen_stack-6.8.0}/prereg/ws_graph.yaml +0 -0
  436. {pen_stack-6.6.0 → pen_stack-6.8.0}/prereg/ws_h.yaml +0 -0
  437. {pen_stack-6.6.0 → pen_stack-6.8.0}/prereg/ws_hybrid.yaml +0 -0
  438. {pen_stack-6.6.0 → pen_stack-6.8.0}/prereg/ws_immune.yaml +0 -0
  439. {pen_stack-6.6.0 → pen_stack-6.8.0}/prereg/ws_ingest.yaml +0 -0
  440. {pen_stack-6.6.0 → pen_stack-6.8.0}/prereg/ws_innate.yaml +0 -0
  441. {pen_stack-6.6.0 → pen_stack-6.8.0}/prereg/ws_loop.yaml +0 -0
  442. {pen_stack-6.6.0 → pen_stack-6.8.0}/prereg/ws_manifest.yaml +0 -0
  443. {pen_stack-6.6.0 → pen_stack-6.8.0}/prereg/ws_mc.yaml +0 -0
  444. {pen_stack-6.6.0 → pen_stack-6.8.0}/prereg/ws_mcp.yaml +0 -0
  445. {pen_stack-6.6.0 → pen_stack-6.8.0}/prereg/ws_mech.yaml +0 -0
  446. {pen_stack-6.6.0 → pen_stack-6.8.0}/prereg/ws_mon.yaml +0 -0
  447. {pen_stack-6.6.0 → pen_stack-6.8.0}/prereg/ws_o.yaml +0 -0
  448. {pen_stack-6.6.0 → pen_stack-6.8.0}/prereg/ws_openapi.yaml +0 -0
  449. {pen_stack-6.6.0 → pen_stack-6.8.0}/prereg/ws_orch.yaml +0 -0
  450. {pen_stack-6.6.0 → pen_stack-6.8.0}/prereg/ws_outcome.yaml +0 -0
  451. {pen_stack-6.6.0 → pen_stack-6.8.0}/prereg/ws_pareto.yaml +0 -0
  452. {pen_stack-6.6.0 → pen_stack-6.8.0}/prereg/ws_peg.yaml +0 -0
  453. {pen_stack-6.6.0 → pen_stack-6.8.0}/prereg/ws_plan.yaml +0 -0
  454. {pen_stack-6.6.0 → pen_stack-6.8.0}/prereg/ws_policy.yaml +0 -0
  455. {pen_stack-6.6.0 → pen_stack-6.8.0}/prereg/ws_profile.yaml +0 -0
  456. {pen_stack-6.6.0 → pen_stack-6.8.0}/prereg/ws_proto.yaml +0 -0
  457. {pen_stack-6.6.0 → pen_stack-6.8.0}/prereg/ws_r.yaml +0 -0
  458. {pen_stack-6.6.0 → pen_stack-6.8.0}/prereg/ws_redteam.yaml +0 -0
  459. {pen_stack-6.6.0 → pen_stack-6.8.0}/prereg/ws_route.yaml +0 -0
  460. {pen_stack-6.6.0 → pen_stack-6.8.0}/prereg/ws_screen.yaml +0 -0
  461. {pen_stack-6.6.0 → pen_stack-6.8.0}/prereg/ws_seroprev.yaml +0 -0
  462. {pen_stack-6.6.0 → pen_stack-6.8.0}/prereg/ws_simlab.yaml +0 -0
  463. {pen_stack-6.6.0 → pen_stack-6.8.0}/prereg/ws_twincal.yaml +0 -0
  464. {pen_stack-6.6.0 → pen_stack-6.8.0}/prereg/ws_uq.yaml +0 -0
  465. {pen_stack-6.6.0 → pen_stack-6.8.0}/prereg/ws_v.yaml +0 -0
  466. {pen_stack-6.6.0 → pen_stack-6.8.0}/prereg/ws_vcell.yaml +0 -0
  467. {pen_stack-6.6.0 → pen_stack-6.8.0}/prereg/ws_wv.yaml +0 -0
  468. {pen_stack-6.6.0 → pen_stack-6.8.0}/scripts/calibrate_immune_axes.py +0 -0
  469. {pen_stack-6.6.0 → pen_stack-6.8.0}/scripts/fetch_licensed_sources.py +0 -0
  470. {pen_stack-6.6.0 → pen_stack-6.8.0}/scripts/p1_build_atlas.py +0 -0
  471. {pen_stack-6.6.0 → pen_stack-6.8.0}/scripts/p1_build_durability.py +0 -0
  472. {pen_stack-6.6.0 → pen_stack-6.8.0}/scripts/p1_export_tracks.py +0 -0
  473. {pen_stack-6.6.0 → pen_stack-6.8.0}/scripts/p1_safety_concordance.py +0 -0
  474. {pen_stack-6.6.0 → pen_stack-6.8.0}/scripts/p1_train_safety.py +0 -0
  475. {pen_stack-6.6.0 → pen_stack-6.8.0}/scripts/p1_validation_report.py +0 -0
  476. {pen_stack-6.6.0 → pen_stack-6.8.0}/scripts/p2_build_atlas.py +0 -0
  477. {pen_stack-6.6.0 → pen_stack-6.8.0}/scripts/p3_benchmark_report.py +0 -0
  478. {pen_stack-6.6.0 → pen_stack-6.8.0}/scripts/p4_genome_scan.py +0 -0
  479. {pen_stack-6.6.0 → pen_stack-6.8.0}/scripts/p52_build_genotox_oracle.py +0 -0
  480. {pen_stack-6.6.0 → pen_stack-6.8.0}/scripts/p53_build_epitope_oracle.py +0 -0
  481. {pen_stack-6.6.0 → pen_stack-6.8.0}/scripts/ws_b_report.py +0 -0
  482. {pen_stack-6.6.0 → pen_stack-6.8.0}/scripts/ws_c_report.py +0 -0
  483. {pen_stack-6.6.0 → pen_stack-6.8.0}/setup.cfg +0 -0
@@ -3,6 +3,86 @@
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.8.0] - 2026-06-20 - PEN-WRITER: cross-family writer-efficiency engine + Writer-Efficiency Bench
7
+
8
+ **MINOR feature release.** Upgrades Stage C (pick the writer) from a curated-KB **ranking** to a prediction +
9
+ design layer: the first curated writer-efficiency benchmark + a learned cross-family efficiency predictor +
10
+ integrated guide/att design + serine-integrase variant critique. Wraps the Writer Atlas + v4.0 writer-verification.
11
+ No fabrication: every efficiency is a real published number with a DOI + verbatim quote.
12
+
13
+ ### Added — the curated dataset + benchmark (WS-WRITER: C-WS1)
14
+ - `pen_stack/atlas/writer_efficiency.py` + `data/writer_efficiency.parquet` (SHA-locked) — ~45 records / 9 DOIs /
15
+ 4 families, **each row DOI + verbatim quote + source-access grade** (39 pmc_verbatim, 1 abstract, 5 secondary).
16
+ Sources: PASTE (Yarnall *Nat Biotechnol* 2023), (ee)PASSIGE (Pandey/Liu *Nat Biomed Eng* 2025), hyperactive
17
+ integrases (Hew *Nucleic Acids Res* 2024 e64), evoCAST (*Science* 2025), ShCAST (*Science* 2019), enIS621
18
+ (*Nat Commun* 2026), ISCro4 (*Science*).
19
+ - `benchmarks/writer_efficiency/` — the Writer-Efficiency Bench: **sealed, SHA-locked** held-out-family +
20
+ held-out-locus tracks + baseline leaderboard + submission harness. `docs/cards/writer_efficiency_data.md`.
21
+
22
+ ### Added — the learned predictor + the honest gate (C-WS2)
23
+ - `pen_stack/atlas/writer_predict.py` — interpretable-feature HistGradientBoosting + family-blocked split-conformal
24
+ interval, candidate-flagged. **Gate C-G2 (pre-registered):** beats the KB family-mean baseline on held-out
25
+ **locus** (MAE 11.7 vs 15.2, paired-bootstrap CI excludes 0; ρ +0.38 vs −0.26) and ranks families better on
26
+ held-out family (ρ +0.52 vs −0.20), but the held-out-**family** MAE gain is not significant at N=42/4-families →
27
+ **the KB ranking is retained as primary**, the predictor ships candidate-flagged, and the dataset + bench are the
28
+ contribution. The negative is reported, not hidden.
29
+
30
+ ### Added — guide design + variant critique (C-WS3, C-WS4)
31
+ - `pen_stack/atlas/guide_design.py` — bridge-RNA TBL/DBL loops (Durrant 2024), pegRNA+attB (Yarnall 2023; Bxb1
32
+ core GT), orthogonal att-pair selection (Roelle 2023 GA/GT), with round-trip + invariant recovery tests.
33
+ - `pen_stack/design/writer_variants.py` — extends v4.0 writer-verification to serine-integrase hyperactive mutants
34
+ (Hew 2024 / Keravala 2009); recovers Bxb1 `c22` + PhiC31 P2/P3 retrospectively; honestly **defers** the
35
+ LM-vs-conservation blind claim (LM naturalness ≠ engineered hyperactivity).
36
+
37
+ ### Added — the recommender surface (C-WS5)
38
+ - `pen_stack/atlas/writer_recommend.py` + manifest tool `recommend_writers` — ranks families (KB-grounded primary)
39
+ + candidate predicted efficiency w/ conformal interval + auto-designed guide. Efficiency is **never** extrapolated
40
+ to a family absent from the dataset (KB-only there).
41
+
42
+ ### Honesty
43
+ - Predicted efficiencies are 🔵 candidates with intervals, never asserted activity. 4 families is the binding
44
+ statistical limit, reported not hidden. Range efficiencies stored as midpoints (raw string retained);
45
+ secondary-source rows flagged + droppable (strict subset).
46
+
47
+ ## [6.7.0] - 2026-06-19 - PEN-EXPRESS: learned, trained-conformal Stage H + TPE-Bench
48
+
49
+ **MINOR feature release.** Upgrades the digital twin's Stage H expression/outcome layer from a validation-failing
50
+ closed-form **heuristic** to a **learned, trained-conformal, decomposable** position-effect model — and ships the
51
+ held-out benchmark the expression capability never had. Wrap, don't rebuild: extends `twin` + `wgenome.uncertainty`
52
+ + `wgenome.ood` + `benchmarks`. No fabrication: every metric is from a real CV run on real TRIP supervision, and
53
+ the cross-cell-type transfer claim is **data-gated**, never faked.
54
+
55
+ ### Added — the learned model + trained conformal (WS-EXPRESS2: WS-D/M/U)
56
+ - `pen_stack/twin/data/position_effect.py` — unified position-effect schema + dataset registry with **verified
57
+ accessions/DOIs** (TRIP live; PatchMPRA/MPIRE/lentiMPRA/Leemans registered + honestly `available=False` until
58
+ fetched), z-normalization within (dataset × cassette), domain-blocked + held-out-cell-type splits + leakage check.
59
+ - `pen_stack/twin/position_effect.py` — `PositionEffectModel` (factored `f_cassette` + `g_context`, LightGBM),
60
+ `evaluate()` (chromosome-blocked CV vs the v3.x durability head + cassette-only, paired-bootstrap CIs,
61
+ separability), split-conformal calibration (`ConformalRegressor`, chromosome-Mondrian, OOD-widened),
62
+ `predict_stage_h()` serving seam. **Result (real TRIP):** expression ρ **0.428 → 0.469** (CI excludes 0);
63
+ held-out conformal coverage **0.885** vs 0.90 nominal.
64
+ - `configs/twin/position_effect_conformal.json` — the shipped calibration (qhat + N + held-out coverage).
65
+ - `scripts/p1_build_position_effect.py` — regenerates the model + conformal artifacts (real CV report).
66
+
67
+ ### Changed — Stage H integration (WS-I)
68
+ - `pen_stack/twin/outcome.py` — when a chromatin context is supplied and the artifact is present, `predict_outcome`
69
+ serves the **learned trained-conformal** interval + `p_silenced` + OOD tier (`position_effect` block,
70
+ `stage_h_mode`); with no context/artifact it falls back to the heuristic band — **backward compatible** (the
71
+ v5.9 relative-scale contract is intact).
72
+
73
+ ### Added — TPE-Bench + controls (WS-B / WS-V)
74
+ - `benchmarks/position_effect/` — TPE-Bench: a **sealed, SHA-locked** held-out-chromosome track + baseline
75
+ leaderboard (cassette-only / durability head / PEN-EXPRESS factored), submission harness. Leave-one-cell-type-out
76
+ transfer track scaffolded + **data-gated** (no fabricated transfer number).
77
+ - `pen_stack/validate/{expr_controls,known_biology_expr,heldout_celltype_expr}.py` — label-shuffle→chance control,
78
+ H3K9me3-heterochromatin→silencing recovery, the data-gated transfer harness.
79
+ - `tests/unit/test_ws_pe.py` — CI-safe (synthetic planted signal); the real-TRIP claim runs on a checkout, skips in CI.
80
+
81
+ ### Honesty
82
+ - Public data **cannot** flip expression to ✅ (the v6.5 wall) — v6.7 ships the learned+calibrated upgrade + the
83
+ benchmark + the honest data-gating, not a manufactured checkmark. Cross-cell-type transfer needs the additional
84
+ human datasets (a data-acquisition step), reported as such. Wet-lab validation omitted by scope.
85
+
6
86
  ## [6.6.0] - 2026-06-16 - License-clean provenance (COSMIC → CancerMine)
7
87
 
8
88
  **MINOR — provenance refactor, no new science, no capability lost.** The shipped artifact now sources the
@@ -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: 6.6.0
5
- date-released: 2026-06-12
4
+ version: 6.8.0
5
+ date-released: 2026-06-20
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: 6.6.0
3
+ Version: 6.8.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.6.0-blue.svg)](CHANGELOG.md)
93
+ [![Version](https://img.shields.io/badge/version-6.8.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)
@@ -148,6 +148,58 @@ demonstrated (v5.12) and the benchmark went public (v5.13).
148
148
  > unknown funnel remains — made legible (scope flags, known-unknowns, honest baselines, no fabrication), not
149
149
  > hidden.
150
150
 
151
+ ## What is new in v6.8 — PEN-WRITER (a cross-family writer-efficiency engine + the first writer-efficiency benchmark)
152
+
153
+ Stage C (pick the writer) was **retrieval** — the curated Writer Atlas ranks 8 families but predicts no
154
+ **efficiency**, carries no uncertainty, and designs no guide. v6.8 adds the prediction + design layer, grounded in
155
+ the new quantitative human-cell writer data — **wrapping** the Atlas + v4.0 writer-verification, not rebuilding:
156
+
157
+ - **The first curated writer-efficiency dataset** (`data/writer_efficiency.parquet`, ~45 records / 9 DOIs / 4
158
+ families) — **every row carries a DOI + a verbatim source quote + a source-access grade** (39 PMC-verbatim).
159
+ Harmonised from PASTE (Yarnall 2023), (ee)PASSIGE (Pandey/Liu 2025), the Hew 2024 hyperactive-integrase tables,
160
+ evoCAST (2025), ShCAST (2019), enIS621 (2026), ISCro4. No number is invented.
161
+ - **A learned cross-family efficiency predictor** (`atlas/writer_predict.py`) with a conformal interval,
162
+ candidate-flagged. **Honest, pre-registered result:** it beats the KB family-mean baseline on held-out **locus**
163
+ (MAE 11.7 vs 15.2, CI excludes 0) and *ranks* families far better (ρ +0.52 vs −0.20), but at N=42 across only
164
+ **4 families** the held-out-**family** improvement is not significant — so the **KB ranking stays primary**, the
165
+ predictor ships as a **candidate advisory**, and the **dataset + benchmark are the contribution**.
166
+ - **The Writer-Efficiency Bench** (`benchmarks/writer_efficiency/`) — sealed, SHA-locked held-out-family +
167
+ held-out-locus tracks with a baseline leaderboard.
168
+ - **Guide/att design** (`atlas/guide_design.py`) — bridge-RNA TBL/DBL loops, pegRNA+attB (Bxb1 core GT), and
169
+ orthogonal att-pair selection (GA/GT), from the documented reprogramming rules, with round-trip recovery tests.
170
+ - **Writer-variant critique** (`design/writer_variants.py`) — extends v4.0 to the serine-integrase hyperactive
171
+ mutants (Bxb1 `c22`, PhiC31 P2/P3 evolved); recovers them retrospectively, and honestly **defers** the
172
+ LM-vs-conservation blind claim (protein-LM naturalness ≠ engineered gain-of-function hyperactivity).
173
+
174
+ Efficiencies are 🔵 candidates with intervals, never asserted activity; none is extrapolated to a family absent
175
+ from the dataset. See [docs/writer_efficiency.md](docs/writer_efficiency.md).
176
+
177
+ ## What is new in v6.7 — PEN-EXPRESS (a learned, trained-conformal Stage H + TPE-Bench)
178
+
179
+ Stage H's expression/outcome layer was the stack's weakest link: a closed-form **heuristic** that *failed*
180
+ independent validation (ρ=0.12 vs Damdindorj 2014), with an interval the code itself labelled "**NOT a trained
181
+ conformal interval**." v6.7 replaces it — **wrapping, not rebuilding** the digital twin:
182
+
183
+ - **A learned cassette × context position-effect model** (`pen_stack/twin/position_effect.py`) — factored and
184
+ decomposable (`f_cassette` + `g_context`), trained on the **real TRIP supervision** (Akhtar 2013; GEO
185
+ GSE49806/49807). On chromosome-blocked CV it **beats the v3.x durability head** on expression (ρ **0.428 →
186
+ 0.469**, paired-bootstrap CI excludes 0) and matches it on silencing — reported honestly, with the separability
187
+ result (additive `f_cassette + g_context` suffices at this N).
188
+ - **Stage H is now trained-conformal.** The model ships a split-conformal calibration (`ConformalRegressor`,
189
+ chromosome-Mondrian, OOD-widened): **held-out coverage 0.885 vs 0.90 nominal** — the named gap, closed. When a
190
+ chromatin context is supplied, `predict_outcome` serves the calibrated interval + `p_silenced` + OOD tier; with
191
+ no context (or no artifact) it falls back to the heuristic — **backward compatible**.
192
+ - **TPE-Bench** (`benchmarks/position_effect/`) — the held-out benchmark the expression capability never had: a
193
+ **sealed, SHA-locked** held-out-chromosome split + a baseline leaderboard (cassette-only / durability head /
194
+ PEN-EXPRESS). A leave-one-**cell-type**-out transfer track is scaffolded and **honestly data-gated** until the
195
+ additional human datasets (PatchMPRA / MPIRE / lentiMPRA / Leemans) are fetched — **no transfer number is
196
+ fabricated**. Controls: label-shuffle → chance; known-biology recovery (H3K9me3 ↑ → silencing ↑).
197
+
198
+ The honest limit (the v6.5 wall, restated): public data alone cannot flip expression to ✅ — that needs measured
199
+ outcome data at a power the literature does not provide. v6.7 ships the learned+calibrated upgrade + the
200
+ benchmark; the green checkmark stays earned, not manufactured. See [docs/position_effect.md](docs/position_effect.md)
201
+ and [docs/tpe_bench.md](docs/tpe_bench.md).
202
+
151
203
  ## What is new in v6.4 — Live Oracles (the foundation models actually execute)
152
204
 
153
205
  The foundation-model oracles now **run for real**, not just defer: **ViennaRNA** (in-process), **AlphaGenome**
@@ -976,18 +1028,6 @@ independently verified.
976
1028
  - **Grounded services** - every quantitative answer comes from a validated tool call (never a language
977
1029
  model); the living database never auto-edits the atlas; clinical directives are refused.
978
1030
 
979
- ## Papers and phases
980
-
981
- | # | Title | Phase | Status |
982
- |---|---|---|---|
983
- | 1 (flagship) | The Writable Genome: a predictive, writer-aware atlas of safe & durable insertion sites | 1 | complete |
984
- | 2 (platform) | PEN-STACK: unified open infrastructure for non-destructive genome writing | 2 | complete |
985
- | 3 (capstone) | The Write Planner: end-to-end inverse design of genomic writes | 3 | complete |
986
- | 4 (beachhead) | Genome-wide off-target prediction for RNA-guided bridge recombinases | 1.5 | complete |
987
- | M1 (v3.1) | Writable Genome hardened: strong baselines, AlphaGenome sequence + 3D structural-risk axis | v3.1 B,C,D,F | complete |
988
- | M2 (v3.1) | The Genome-Writing Bench + PEN-Agent: the writing-side benchmark and a grounded agent | v3.1 E | complete |
989
- | M3 (v3.1) | Multiplex translocation-risk + bridge-RNA guide QC | v3.1 G | complete |
990
-
991
1031
  The v3.1 cycle (workstreams A-H) is recorded in `CHANGELOG.md`, `docs/positioning.md`, and the SHA-locked
992
1032
  `prereg/ws_*.yaml`; preprint drafts are in `manuscripts/`.
993
1033
 
@@ -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.6.0-blue.svg)](CHANGELOG.md)
18
+ [![Version](https://img.shields.io/badge/version-6.8.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)
@@ -73,6 +73,58 @@ demonstrated (v5.12) and the benchmark went public (v5.13).
73
73
  > unknown funnel remains — made legible (scope flags, known-unknowns, honest baselines, no fabrication), not
74
74
  > hidden.
75
75
 
76
+ ## What is new in v6.8 — PEN-WRITER (a cross-family writer-efficiency engine + the first writer-efficiency benchmark)
77
+
78
+ Stage C (pick the writer) was **retrieval** — the curated Writer Atlas ranks 8 families but predicts no
79
+ **efficiency**, carries no uncertainty, and designs no guide. v6.8 adds the prediction + design layer, grounded in
80
+ the new quantitative human-cell writer data — **wrapping** the Atlas + v4.0 writer-verification, not rebuilding:
81
+
82
+ - **The first curated writer-efficiency dataset** (`data/writer_efficiency.parquet`, ~45 records / 9 DOIs / 4
83
+ families) — **every row carries a DOI + a verbatim source quote + a source-access grade** (39 PMC-verbatim).
84
+ Harmonised from PASTE (Yarnall 2023), (ee)PASSIGE (Pandey/Liu 2025), the Hew 2024 hyperactive-integrase tables,
85
+ evoCAST (2025), ShCAST (2019), enIS621 (2026), ISCro4. No number is invented.
86
+ - **A learned cross-family efficiency predictor** (`atlas/writer_predict.py`) with a conformal interval,
87
+ candidate-flagged. **Honest, pre-registered result:** it beats the KB family-mean baseline on held-out **locus**
88
+ (MAE 11.7 vs 15.2, CI excludes 0) and *ranks* families far better (ρ +0.52 vs −0.20), but at N=42 across only
89
+ **4 families** the held-out-**family** improvement is not significant — so the **KB ranking stays primary**, the
90
+ predictor ships as a **candidate advisory**, and the **dataset + benchmark are the contribution**.
91
+ - **The Writer-Efficiency Bench** (`benchmarks/writer_efficiency/`) — sealed, SHA-locked held-out-family +
92
+ held-out-locus tracks with a baseline leaderboard.
93
+ - **Guide/att design** (`atlas/guide_design.py`) — bridge-RNA TBL/DBL loops, pegRNA+attB (Bxb1 core GT), and
94
+ orthogonal att-pair selection (GA/GT), from the documented reprogramming rules, with round-trip recovery tests.
95
+ - **Writer-variant critique** (`design/writer_variants.py`) — extends v4.0 to the serine-integrase hyperactive
96
+ mutants (Bxb1 `c22`, PhiC31 P2/P3 evolved); recovers them retrospectively, and honestly **defers** the
97
+ LM-vs-conservation blind claim (protein-LM naturalness ≠ engineered gain-of-function hyperactivity).
98
+
99
+ Efficiencies are 🔵 candidates with intervals, never asserted activity; none is extrapolated to a family absent
100
+ from the dataset. See [docs/writer_efficiency.md](docs/writer_efficiency.md).
101
+
102
+ ## What is new in v6.7 — PEN-EXPRESS (a learned, trained-conformal Stage H + TPE-Bench)
103
+
104
+ Stage H's expression/outcome layer was the stack's weakest link: a closed-form **heuristic** that *failed*
105
+ independent validation (ρ=0.12 vs Damdindorj 2014), with an interval the code itself labelled "**NOT a trained
106
+ conformal interval**." v6.7 replaces it — **wrapping, not rebuilding** the digital twin:
107
+
108
+ - **A learned cassette × context position-effect model** (`pen_stack/twin/position_effect.py`) — factored and
109
+ decomposable (`f_cassette` + `g_context`), trained on the **real TRIP supervision** (Akhtar 2013; GEO
110
+ GSE49806/49807). On chromosome-blocked CV it **beats the v3.x durability head** on expression (ρ **0.428 →
111
+ 0.469**, paired-bootstrap CI excludes 0) and matches it on silencing — reported honestly, with the separability
112
+ result (additive `f_cassette + g_context` suffices at this N).
113
+ - **Stage H is now trained-conformal.** The model ships a split-conformal calibration (`ConformalRegressor`,
114
+ chromosome-Mondrian, OOD-widened): **held-out coverage 0.885 vs 0.90 nominal** — the named gap, closed. When a
115
+ chromatin context is supplied, `predict_outcome` serves the calibrated interval + `p_silenced` + OOD tier; with
116
+ no context (or no artifact) it falls back to the heuristic — **backward compatible**.
117
+ - **TPE-Bench** (`benchmarks/position_effect/`) — the held-out benchmark the expression capability never had: a
118
+ **sealed, SHA-locked** held-out-chromosome split + a baseline leaderboard (cassette-only / durability head /
119
+ PEN-EXPRESS). A leave-one-**cell-type**-out transfer track is scaffolded and **honestly data-gated** until the
120
+ additional human datasets (PatchMPRA / MPIRE / lentiMPRA / Leemans) are fetched — **no transfer number is
121
+ fabricated**. Controls: label-shuffle → chance; known-biology recovery (H3K9me3 ↑ → silencing ↑).
122
+
123
+ The honest limit (the v6.5 wall, restated): public data alone cannot flip expression to ✅ — that needs measured
124
+ outcome data at a power the literature does not provide. v6.7 ships the learned+calibrated upgrade + the
125
+ benchmark; the green checkmark stays earned, not manufactured. See [docs/position_effect.md](docs/position_effect.md)
126
+ and [docs/tpe_bench.md](docs/tpe_bench.md).
127
+
76
128
  ## What is new in v6.4 — Live Oracles (the foundation models actually execute)
77
129
 
78
130
  The foundation-model oracles now **run for real**, not just defer: **ViennaRNA** (in-process), **AlphaGenome**
@@ -901,18 +953,6 @@ independently verified.
901
953
  - **Grounded services** - every quantitative answer comes from a validated tool call (never a language
902
954
  model); the living database never auto-edits the atlas; clinical directives are refused.
903
955
 
904
- ## Papers and phases
905
-
906
- | # | Title | Phase | Status |
907
- |---|---|---|---|
908
- | 1 (flagship) | The Writable Genome: a predictive, writer-aware atlas of safe & durable insertion sites | 1 | complete |
909
- | 2 (platform) | PEN-STACK: unified open infrastructure for non-destructive genome writing | 2 | complete |
910
- | 3 (capstone) | The Write Planner: end-to-end inverse design of genomic writes | 3 | complete |
911
- | 4 (beachhead) | Genome-wide off-target prediction for RNA-guided bridge recombinases | 1.5 | complete |
912
- | M1 (v3.1) | Writable Genome hardened: strong baselines, AlphaGenome sequence + 3D structural-risk axis | v3.1 B,C,D,F | complete |
913
- | M2 (v3.1) | The Genome-Writing Bench + PEN-Agent: the writing-side benchmark and a grounded agent | v3.1 E | complete |
914
- | M3 (v3.1) | Multiplex translocation-risk + bridge-RNA guide QC | v3.1 G | complete |
915
-
916
956
  The v3.1 cycle (workstreams A-H) is recorded in `CHANGELOG.md`, `docs/positioning.md`, and the SHA-locked
917
957
  `prereg/ws_*.yaml`; preprint drafts are in `manuscripts/`.
918
958
 
@@ -0,0 +1,60 @@
1
+ # TPE-Bench — the Position-Effect / Expression track
2
+
3
+ The **expression** capability of PEN-STACK never had a held-out benchmark. TPE-Bench is the position-effect
4
+ track for the [Genome-Writing Challenge](../genome_writing_challenge/) (v6.7 PEN-EXPRESS): given a genomic
5
+ **chromatin context** + **cassette**, predict the **integrated-reporter expression** (and silencing) — scored on
6
+ a **sealed held-out split** whose labels the submitter never sees.
7
+
8
+ ## Why
9
+
10
+ Position-effect (where an integrated cassette lands → how strongly/durably it expresses) is the writing-relevant
11
+ quantity no safe-harbour resource predicts. TRIP (Akhtar 2013) supervises it directly. TPE-Bench seals a held-out
12
+ split and anchors a baseline leaderboard, so others can build *to* a calibrated expression predictor.
13
+
14
+ ## Tracks
15
+
16
+ | Track | Status | What is held out | Metric |
17
+ |---|---|---|---|
18
+ | `chrom_holdout` | **LIVE** | whole chromosomes (`chr2, chr5, chr14, chrX`), frozen + SHA-locked in `split.json` | Spearman ρ (expression) + AUROC (silenced) |
19
+ | `celltype_holdout` | **DATA-GATED** | leave-one-cell-type-out (the headline transfer track) | — |
20
+
21
+ `celltype_holdout` is the headline cross-cell-type transfer test. With a single available position-effect cell
22
+ type (mESC) it reports `data_gated` **honestly** and activates once PatchMPRA / MPIRE / lentiMPRA / Leemans are
23
+ fetched — **no transfer number is fabricated** until then.
24
+
25
+ ## Baseline leaderboard (sealed `chrom_holdout`, n_test = 2257)
26
+
27
+ | Predictor | Expression ρ | Silenced AUROC |
28
+ |---|---|---|
29
+ | cassette-only (f_cassette) | 0.178 | — |
30
+ | context-only (v3.x durability head) | 0.431 | 0.660 |
31
+ | **PEN-EXPRESS factored (f_cassette + g_context)** | **0.475** | 0.660 |
32
+
33
+ The factored model's gain is on **expression** (the cassette term lifts ρ 0.431 → 0.475 on the sealed test); the
34
+ silenced classifier matches the durability head (the silencing question is chromatin-driven — reported honestly,
35
+ not inflated). See `../../out/position_effect_report.json` for the full CV report + bootstrap CIs.
36
+
37
+ ## How to submit
38
+
39
+ ```python
40
+ from benchmarks.position_effect.harness import Submission, evaluate
41
+
42
+ def my_predict(public_input: dict):
43
+ # public_input = {task_id, family, cassette, chromatin_features:{H3K27ac,...}, instructions}; label hidden
44
+ return {"expression": 0.0, "p_silenced": 0.5} # return your prediction (abstain-safe)
45
+
46
+ print(evaluate(Submission(name="my-model", predict_fn=my_predict)))
47
+ ```
48
+
49
+ Reference baselines: `python -c "from benchmarks.position_effect.harness import baseline_leaderboard as b; print(b())"`.
50
+
51
+ ## Rules
52
+
53
+ - **Sealed + SHA-locked.** `split.json` (held-out chromosomes) is frozen and checksummed (`SHA256SUMS`) before
54
+ model selection — verify with `sha256sum -c SHA256SUMS`.
55
+ - **No circular labels.** The label is the **measured** TRIP expression, never a submitter claim.
56
+ - **Leakage-controlled.** Held out by whole chromosome (nearby integrations share chromatin).
57
+ - **Honest data-gating.** The transfer track abstains until ≥2 cell types exist; no fabricated number.
58
+ - **Deterministic.** PEN-EXPRESS anchors the leaderboard.
59
+
60
+ Data: TRIP (Akhtar et al., *Cell* 2013; GEO GSE49806/GSE49807; trip.nki.nl). License: see `DATA_LICENSES.md`.
@@ -0,0 +1 @@
1
+ 2fc12cbf28531e68f6e25586da1d84003eeb6a098c9015998ce03f518546bc8a split.json
@@ -0,0 +1,54 @@
1
+ # Writer-Efficiency Bench
2
+
3
+ The **first curated, leakage-controlled benchmark for genome-writer integration efficiency** — the track of the
4
+ [Genome-Writing Challenge](../genome_writing_challenge/) for *how well a writer writes* (v6.8 PEN-WRITER). Given
5
+ `(family, write-type, cargo, locus, cell-type, variant)`, predict the **integration efficiency (%)**, scored on
6
+ **held-out family** and **held-out locus** folds.
7
+
8
+ ## Why
9
+
10
+ Quantitative human-cell writer efficiencies exist but are **scattered** across a dozen papers with no unified
11
+ resource. This bench curates them (`data/writer_efficiency.parquet`, ~45 records, **every row carries a DOI + a
12
+ verbatim source quote + a source-access grade**) so others can build a calibrated efficiency predictor *to* it.
13
+
14
+ ## Tracks (both leakage-controlled, leave-one-group-out)
15
+
16
+ | Axis | Held out | Why |
17
+ |---|---|---|
18
+ | `held_out_family` | one of {PE_integrase, serine_integrase, bridge_IS110, CAST_VK} | cross-family transfer — the hard axis |
19
+ | `held_out_locus` | one specific locus (excludes aggregate/genome-wide pseudo-loci) | locus-context generalisation |
20
+
21
+ ## Baseline leaderboard (real, on the curated dataset)
22
+
23
+ | Axis (n) | KB family-mean (MAE / ρ) | **PEN-WRITER learned** (MAE / ρ) | MAE-reduction CI | learned wins? |
24
+ |---|---|---|---|---|
25
+ | held-out family (42) | 12.72 / −0.20 | **11.37 / +0.52** | [−1.09, 3.75] | no (CI includes 0) |
26
+ | held-out locus (35) | 15.23 / −0.26 | **11.71 / +0.38** | [0.42, 6.29] | **yes** (CI excludes 0) |
27
+
28
+ **Honest, pre-registered outcome (gate C-G2):** the learned predictor beats the KB family-mean baseline on
29
+ held-out **locus** (CI excludes 0) and **ranks** families far better (ρ +0.52 vs −0.20), but at N=42 across only
30
+ **4 families** the held-out-**family** MAE improvement is not statistically distinguishable from zero. So the **KB
31
+ ranking is retained as primary**, the learned predictor ships **candidate-flagged**, and the **curated dataset +
32
+ this benchmark are the standalone contribution** — not a manufactured win. Reproduce:
33
+ `python -c "from benchmarks.writer_efficiency.harness import baseline_leaderboard as b; print(b())"`.
34
+
35
+ ## Submit
36
+
37
+ ```python
38
+ from benchmarks.writer_efficiency.harness import Submission, evaluate
39
+ def predict(pi): # pi = {family, write_type, variant, cargo_bp, locus, cell_type, delivery}; label hidden
40
+ return {"efficiency_pct": 15.0}
41
+ print(evaluate(Submission("my-model", predict)))
42
+ ```
43
+
44
+ ## Discipline
45
+
46
+ - **Sealed + SHA-locked** — `split.json` + `data/writer_efficiency.parquet` are checksummed in `SHA256SUMS`.
47
+ - **Non-circular** — the label is the **measured published efficiency**, never a submitter claim.
48
+ - **Provenance per row** — DOI + verbatim quote + `source_access` ∈ {pmc_verbatim, abstract, secondary}; the
49
+ strict subset drops secondary-source rows.
50
+ - **Honest data-thinness** — 4 families is the binding limit; reported, not hidden.
51
+
52
+ Sources: PASTE (Yarnall *Nat Biotechnol* 2023), (ee)PASSIGE (Pandey/Liu *Nat Biomed Eng* 2025), hyperactive
53
+ integrases (Hew *Nucleic Acids Res* 2024), evoCAST (*Science* 2025), ShCAST (Strecker *Science* 2019), enIS621
54
+ (*Nat Commun* 2026), ISCro4 (*Science*). Full provenance: [data card](../../docs/cards/writer_efficiency_data.md).
@@ -0,0 +1,2 @@
1
+ 02dc66030884b0c17cb17722517488cd686ddd78ed2ed1142cc9b7266f3e4bfd split.json
2
+ f124dbddc00a69b3697ab1299e079d61184c61c5f4caa8352d72a07f56883f47 data/writer_efficiency.parquet
@@ -0,0 +1,36 @@
1
+ # Data card — position-effect supervision (v6.7 PEN-EXPRESS)
2
+
3
+ The unified table behind Stage H (`pen_stack/twin/data/position_effect.py`). One row = one integrated reporter /
4
+ element measurement. Schema: `dataset, organism, cell_type, chrom, pos, cassette, expression_raw, expression_z,
5
+ silenced, <chromatin features>`. `expression_z` is z-scored within (dataset × cassette).
6
+
7
+ ## Dataset registry (verified accessions — 2026-06-19 verification pass)
8
+
9
+ | Dataset | Citation | DOI | Accession | Cell types | Status in v6.7 |
10
+ |---|---|---|---|---|---|
11
+ | **TRIP** | Akhtar et al., *Cell* 2013 | 10.1016/j.cell.2013.07.018 | GEO **GSE49806** (tetO) + **GSE49807** (mPGK); trip.nki.nl | mESC | **LIVE** (n=11,433) |
12
+ | PatchMPRA | Maricque, Chaudhari & Cohen, *Nat Biotechnol* 2019 | 10.1038/nbt.4285 | GEO (per paper) | mESC | registered, data-gated |
13
+ | MPIRE | Hong et al., *Nat Commun* 2024 | 10.1038/s41467-024-52599-6 | GEO **GSE223403**; github.com/claricehong/MPIRE_insulators | K562 | registered, data-gated |
14
+ | lentiMPRA | Agarwal et al., *Nature* **639**:411–420 (2025) | 10.1038/s41586-024-08430-9 | ENCODE + GEO; bioRxiv 2023.03.05.531189 | HepG2, K562, WTC11 | registered, data-gated |
15
+ | Leemans | Leemans et al., *Cell* 2019 | 10.1016/j.cell.2019.03.009 | GEO (per paper); van Steensel lab | K562 | registered, data-gated |
16
+
17
+ > The bioRxiv id `2023.03.05.531189` is **lentiMPRA's** (Agarwal → *Nature* 2025), not e2MPRA/ccMPRA — corrected
18
+ > in the 2026-06-19 citation verification pass.
19
+
20
+ ## TRIP (the LIVE supervision)
21
+
22
+ - **What:** thousands of identical reporters integrated in parallel across the mESC genome; each row is a genomic
23
+ position with normalized expression → the position effect on an integrated cassette (the writing-relevant quantity).
24
+ - **Columns used:** `chrom, pos, promoter` (cassette: tetO 10,903 / mPGK 530), `expression` (log2, −13…+9),
25
+ `silenced` (low-expression tail, 25%), + 5 chromatin marks (H3K27ac, H3K4me1, H3K4me3, H3K9me3, H3K27me3).
26
+ - **Provenance:** same `trip_with_chromatin.parquet` the v3.x durability head trains on (regenerated by
27
+ `pen_stack/data/ingest_trip.py` + chromatin extraction).
28
+ - **License:** TRIP data is from a public GEO deposit (Akhtar 2013); see `DATA_LICENSES.md`. Raw data is gitignored
29
+ (`data/external/`), pulled from the VM for local runs; the shipped wheel carries the loaders + accessions, not the data.
30
+
31
+ ## Honest limits
32
+
33
+ - **Mouse, single cell type.** TRIP is mESC. The model learns `chromatin → expression` (never a coordinate), so it
34
+ *applies* to a human epigenome — but the cross-cell-type **transfer** is unproven until ≥2 cell types are unified.
35
+ Until then the transfer track is **data-gated** (no fabricated number).
36
+ - **Reporter-based** (GFP-class), relative not absolute. Titer / % of normal stay known-unknowns.
@@ -0,0 +1,48 @@
1
+ # Data card — Writer-Efficiency dataset (v6.8 PEN-WRITER)
2
+
3
+ The curated, literature-sourced integration-efficiency table behind Stage C (`pen_stack/atlas/writer_efficiency.py`
4
+ → `data/writer_efficiency.parquet`). One row = one **measured** integration-efficiency condition. **No fabrication:
5
+ every row carries a DOI, a verbatim source quote, and a source-access grade.**
6
+
7
+ ## Schema
8
+ `system, family, write_type, variant, cargo_bp, locus, cell_type, organism, delivery, efficiency_pct,
9
+ efficiency_raw, specificity_pct, source_access, doi, quote`. `efficiency_pct` is % integration in the stated cell
10
+ type; ranges (e.g. "~10-20%", "4-22%") are stored as their **midpoint** with the raw string in `efficiency_raw`.
11
+
12
+ ## Source-access grades (provenance quality, per row)
13
+ | Grade | Meaning | n |
14
+ |---|---|---|
15
+ | `pmc_verbatim` | quoted from the open-access PMC full text (highest confidence) | 39 |
16
+ | `abstract` | quoted from the published abstract | 1 |
17
+ | `secondary` | reliable secondary source where the primary is paywalled (flagged; droppable via `strict=True`) | 5 |
18
+
19
+ ## Coverage (~45 records, 42 human-cell, 9 DOIs, 4 families)
20
+ | Family | n | Representative systems |
21
+ |---|---|---|
22
+ | PE_integrase | 23 | PASTE, PASSIGE / evoPASSIGE / eePASSIGE |
23
+ | serine_integrase | 11 | Bxb1 (WT + evolved combination), PhiC31 (P2/P3 evolved), eeBxb1 V105I |
24
+ | bridge_IS110 | 6 | ISCro4, IS621 / enIS621 |
25
+ | CAST_VK | 5 | ShCAST (E. coli), PseCAST / evoCAST |
26
+
27
+ Loci: AAVS1, CCR5, ROSA26, ACTB, LMNB1, ALB, TRAC, GBA1, FANCA, B2M, COL7A1, Xq22.1, … · Cell types: HEK293T/FT,
28
+ K562, Jurkat, HepG2, N2a, iPSC, primary T / hepatocyte / fibroblast, E. coli.
29
+
30
+ ## Primary sources (all citation-verified 2026-06-19)
31
+ | Source | DOI | Access |
32
+ |---|---|---|
33
+ | Yarnall et al., *Nat Biotechnol* 2023 (PASTE) | 10.1038/s41587-022-01527-4 | PMC10257351 (verbatim) |
34
+ | Pandey/Gao/Krasnow/Liu et al., *Nat Biomed Eng* 2025 ((ee)PASSIGE) | 10.1038/s41551-024-01227-1 | PMC11754103 (verbatim) |
35
+ | Hew et al., *Nucleic Acids Res* 2024 e64 (hyperactive integrases) | 10.1093/nar/gkae534 | PMC (verbatim) |
36
+ | evoCAST, *Science* 2025 | 10.1126/science.adt5199 | PMC12326709 (verbatim) |
37
+ | Strecker et al., *Science* 2019 (ShCAST) | 10.1126/science.aax9181 | PMC6659118 (verbatim) |
38
+ | enIS621, *Nat Commun* 2026 | 10.1038/s41467-026-74164-z | abstract (27.75%) + secondary (per-cell-type) |
39
+ | ISCro4, *Science* (Pelea adz1884 / Perry adz0276) | 10.1126/science.adz1884, 10.1126/science.adz0276 | secondary (paywalled) |
40
+ | Durrant et al., *Nature* 2024 (bridge RNA, IS621 in E. coli) | 10.1038/s41586-024-07552-4 | secondary |
41
+
42
+ ## Honest limits
43
+ - **Small & literature-sourced.** ~42 human-cell records / 4 families — the binding statistical limit for the
44
+ cross-family transfer claim (reported, not hidden). The dataset + bench are the contribution.
45
+ - **Range-midpoint handling** for efficiencies reported as ranges (raw string retained).
46
+ - **Heterogeneous assays/conditions** across papers (delivery, cargo, pre-installed vs PE-installed att) — encoded
47
+ as features (`variant`, `delivery`, `cargo_bp`) + a covariate, but cross-paper variance is real.
48
+ - **secondary-source rows** (bridge ISCro4/IS621) are flagged and excluded under `strict=True`.
@@ -0,0 +1,57 @@
1
+ # Stage H — the learned, trained-conformal position-effect model (v6.7 PEN-EXPRESS)
2
+
3
+ Stage H predicts how strongly an integrated cassette expresses in its **chromatin context** (the position effect).
4
+ Through v6.6 this was a closed-form **heuristic** with a heuristic ±0.20 band that the code itself labelled *"NOT
5
+ a trained conformal interval"*, and which **failed** independent validation (ρ=0.12 vs Damdindorj 2014). v6.7
6
+ replaces the model behind Stage H with a **learned, decomposable, trained-conformal** one — wrapping the digital
7
+ twin, not rebuilding it.
8
+
9
+ ## The model
10
+
11
+ `pen_stack/twin/position_effect.py::PositionEffectModel` is **factored and decomposable**:
12
+
13
+ ```
14
+ E_raw ≈ f_cassette(cassette) # the cassette's intrinsic strength (per-cassette mean)
15
+ + g_context(chromatin features) # the position effect — a LightGBM on local chromatin
16
+ (+ h_interaction, reported) # does the context function differ by cassette? (separability)
17
+ ```
18
+
19
+ `g_context` is supervised on the residual `E_raw − f_cassette`, so it learns the *position* effect on a scale
20
+ comparable across cassettes. A `silenced` classifier shares the chromatin features. The model is wrapped with the
21
+ **existing** `wgenome.uncertainty.ConformalRegressor` (chromosome-Mondrian split-conformal) and `wgenome.ood.OODDetector`
22
+ — so a prediction is a **calibrated interval that widens out of distribution**.
23
+
24
+ ## Results (real, on TRIP supervision — Akhtar 2013, GEO GSE49806/49807, mESC, n=11,433)
25
+
26
+ Chromosome-blocked GroupKFold; paired bootstrap 95% CIs. *Every number is from a real CV run — no fabrication.*
27
+
28
+ | Metric | cassette-only | context-only (v3.x durability head) | **PEN-EXPRESS factored** | Δ vs head (CI) |
29
+ |---|---|---|---|---|
30
+ | Expression Spearman ρ | 0.032 | 0.427 | **0.469** | +0.041 [0.036, 0.046] ✅ excludes 0 |
31
+ | Silenced AUROC | — | 0.647 | 0.651 | +0.004 [0.001, 0.007] ✅ excludes 0 |
32
+
33
+ - **Gate G-M passed:** the factored model beats the durability head (CI excludes 0) → it serves behind Stage H.
34
+ - **Separability:** interaction adds **−0.002** R² → *additive `f_cassette + g_context` suffices at this N*
35
+ (reported honestly; the cassette term lifts expression, the silencing question is chromatin-driven).
36
+ - **Trained-conformal (the named gap, closed):** split-conformal (α=0.10) → **held-out coverage 0.885 vs 0.90
37
+ nominal** (within tolerance), qhat=5.50 on the log2 scale. Coverage is measured on a **half-chromosome held-out**
38
+ split, not on the calibration set.
39
+
40
+ ## Stage H integration (`twin/outcome.py`)
41
+
42
+ `predict_outcome(design, cell_state)` now:
43
+ - **With a chromatin context** (`design["chromatin_features"]`) **and the model artifact present** → serves the
44
+ learned **trained-conformal** interval + `p_silenced` + OOD tier in a `position_effect` block; `stage_h_mode =
45
+ "learned_trained_conformal"`.
46
+ - **Without a context (or artifact)** → the closed-form heuristic band, exactly as before — **backward compatible**
47
+ (the v5.9 relative-scale contract and all prior tests are intact).
48
+
49
+ ## Honest limits
50
+
51
+ - **Single-context supervision.** TRIP is mESC. The cross-cell-type **transfer** claim is **data-gated** — see
52
+ [tpe_bench.md](tpe_bench.md); no transfer number is fabricated until PatchMPRA/MPIRE/lentiMPRA/Leemans are fetched.
53
+ - **Public data cannot earn the ✅** (the v6.5 wall). v6.7 ships the learned+calibrated upgrade + the benchmark, not
54
+ a manufactured validated axis. Titer / absolute expression / phenotype stay **known-unknowns**.
55
+ - The model artifact (`models/position_effect.pkl`) is gitignored; regenerate it with
56
+ `python scripts/p1_build_position_effect.py` (the shipped calibration `configs/twin/position_effect_conformal.json`
57
+ is committed). Without the artifact, Stage H falls back to the heuristic.
@@ -0,0 +1,48 @@
1
+ # TPE-Bench — the position-effect / expression benchmark (v6.7)
2
+
3
+ The **expression** capability never had a held-out benchmark. TPE-Bench fills that gap as a track of the
4
+ [Genome-Writing Challenge](../benchmarks/genome_writing_challenge/): given a genomic **chromatin context** +
5
+ **cassette**, predict the **integrated-reporter expression** (and silencing), scored on a **sealed** split.
6
+
7
+ Location: `benchmarks/position_effect/` (`harness.py`, `split.json`, `SHA256SUMS`, `README.md`).
8
+
9
+ ## Two tracks
10
+
11
+ | Track | Status | Held out | Metric |
12
+ |---|---|---|---|
13
+ | `chrom_holdout` | **LIVE** | whole chromosomes `chr2, chr5, chr14, chrX` (frozen + SHA-locked) | Spearman ρ + AUROC |
14
+ | `celltype_holdout` | **DATA-GATED** | leave-one-cell-type-out (the headline transfer test) | — |
15
+
16
+ `celltype_holdout` is the cross-cell-type transfer test. With one available position-effect cell type (mESC) it
17
+ returns `data_gated` **honestly** and activates once PatchMPRA / MPIRE / lentiMPRA / Leemans are fetched — **no
18
+ transfer number is fabricated**.
19
+
20
+ ## Baseline leaderboard (`chrom_holdout`, sealed, n_test = 2257)
21
+
22
+ | Predictor | Expression ρ | Silenced AUROC |
23
+ |---|---|---|
24
+ | cassette-only | 0.178 | — |
25
+ | context-only (v3.x durability head) | 0.431 | 0.660 |
26
+ | **PEN-EXPRESS factored** | **0.475** | 0.660 |
27
+
28
+ The factored model's gain is on **expression** (ρ 0.431 → 0.475 on the sealed held-out chromosomes); the silencing
29
+ classifier matches the durability head (chromatin-driven) — reported honestly, not inflated.
30
+
31
+ ## Discipline
32
+
33
+ - **Sealed + SHA-locked.** `split.json` is frozen and checksummed (`SHA256SUMS`) **before model selection**;
34
+ verify with `sha256sum -c benchmarks/position_effect/SHA256SUMS`.
35
+ - **Non-circular labels.** The label is the **measured** TRIP expression, never a submitter claim.
36
+ - **Leakage-controlled.** Held out by whole chromosome (nearby integrations share chromatin).
37
+ - **Honest data-gating.** The transfer track abstains until ≥2 cell types exist.
38
+
39
+ ## Submit
40
+
41
+ ```python
42
+ from benchmarks.position_effect.harness import Submission, evaluate
43
+ def predict(pi): # pi = {task_id, cassette, chromatin_features, instructions}; label hidden
44
+ return {"expression": 0.0, "p_silenced": 0.5}
45
+ print(evaluate(Submission("my-model", predict)))
46
+ ```
47
+
48
+ Reproduce the baselines: `python -c "from benchmarks.position_effect.harness import baseline_leaderboard as b; print(b())"`.