pen-stack 6.10.4__tar.gz → 6.11.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 (511) hide show
  1. {pen_stack-6.10.4 → pen_stack-6.11.0}/CHANGELOG.md +32 -0
  2. {pen_stack-6.10.4 → pen_stack-6.11.0}/CITATION.cff +1 -1
  3. {pen_stack-6.10.4 → pen_stack-6.11.0}/PKG-INFO +23 -2
  4. {pen_stack-6.10.4 → pen_stack-6.11.0}/README.md +22 -1
  5. pen_stack-6.11.0/benchmarks/delivery/SHA256SUMS +2 -0
  6. pen_stack-6.11.0/configs/aav_serotype_tropism.yaml +81 -0
  7. {pen_stack-6.10.4 → pen_stack-6.11.0}/configs/oracles/scope_cards.yaml +16 -0
  8. {pen_stack-6.10.4 → pen_stack-6.11.0}/docs/DEVIATIONS_AND_DISCLOSURES.md +11 -0
  9. pen_stack-6.11.0/docs/delivery_recommender.md +54 -0
  10. {pen_stack-6.10.4 → pen_stack-6.11.0}/pen_stack/__init__.py +1 -1
  11. {pen_stack-6.10.4 → pen_stack-6.11.0}/pen_stack/agent/cite.py +10 -0
  12. {pen_stack-6.10.4 → pen_stack-6.11.0}/pen_stack/agent/mcp_server.py +10 -0
  13. {pen_stack-6.10.4 → pen_stack-6.11.0}/pen_stack/api/manifest.py +11 -0
  14. pen_stack-6.11.0/pen_stack/design/capsid_generate.py +62 -0
  15. pen_stack-6.11.0/pen_stack/planner/delivery_immune.py +60 -0
  16. pen_stack-6.11.0/pen_stack/planner/delivery_predict.py +136 -0
  17. {pen_stack-6.10.4 → pen_stack-6.11.0}/pen_stack/server/api.py +26 -0
  18. {pen_stack-6.10.4 → pen_stack-6.11.0}/pen_stack.egg-info/PKG-INFO +23 -2
  19. {pen_stack-6.10.4 → pen_stack-6.11.0}/pen_stack.egg-info/SOURCES.txt +9 -0
  20. pen_stack-6.11.0/prereg/SHA256_LOCK_ws_delivery.json +8 -0
  21. pen_stack-6.11.0/prereg/ws_delivery.yaml +39 -0
  22. {pen_stack-6.10.4 → pen_stack-6.11.0}/pyproject.toml +1 -1
  23. pen_stack-6.11.0/scripts/build_capsid_fitness.py +93 -0
  24. {pen_stack-6.10.4 → pen_stack-6.11.0}/LICENSE +0 -0
  25. {pen_stack-6.10.4 → pen_stack-6.11.0}/MANIFEST.in +0 -0
  26. {pen_stack-6.10.4 → pen_stack-6.11.0}/bench/run.py +0 -0
  27. {pen_stack-6.10.4 → pen_stack-6.11.0}/benchmarks/genome_writing_bench/LEADERBOARD.md +0 -0
  28. {pen_stack-6.10.4 → pen_stack-6.11.0}/benchmarks/genome_writing_bench/README.md +0 -0
  29. {pen_stack-6.10.4 → pen_stack-6.11.0}/benchmarks/genome_writing_bench/SHA256SUMS +0 -0
  30. {pen_stack-6.10.4 → pen_stack-6.11.0}/benchmarks/genome_writing_bench/SUBMISSIONS.md +0 -0
  31. {pen_stack-6.10.4 → pen_stack-6.11.0}/benchmarks/genome_writing_bench/tasks.yaml +0 -0
  32. {pen_stack-6.10.4 → pen_stack-6.11.0}/benchmarks/genome_writing_challenge/README.md +0 -0
  33. {pen_stack-6.10.4 → pen_stack-6.11.0}/benchmarks/genome_writing_challenge/SUBMISSIONS.md +0 -0
  34. {pen_stack-6.10.4 → pen_stack-6.11.0}/benchmarks/offtarget/SHA256SUMS +0 -0
  35. {pen_stack-6.10.4 → pen_stack-6.11.0}/benchmarks/position_effect/README.md +0 -0
  36. {pen_stack-6.10.4 → pen_stack-6.11.0}/benchmarks/position_effect/SHA256SUMS +0 -0
  37. {pen_stack-6.10.4 → pen_stack-6.11.0}/benchmarks/writer_efficiency/README.md +0 -0
  38. {pen_stack-6.10.4 → pen_stack-6.11.0}/benchmarks/writer_efficiency/SHA256SUMS +0 -0
  39. {pen_stack-6.10.4 → pen_stack-6.11.0}/configs/antipeg.yaml +0 -0
  40. {pen_stack-6.10.4 → pen_stack-6.11.0}/configs/atlas_families.yaml +0 -0
  41. {pen_stack-6.10.4 → pen_stack-6.11.0}/configs/bridge_offtarget_profile.yaml +0 -0
  42. {pen_stack-6.10.4 → pen_stack-6.11.0}/configs/calibration/preexisting_nab_independent.yaml +0 -0
  43. {pen_stack-6.10.4 → pen_stack-6.11.0}/configs/capsid_epitope_oracle.yaml +0 -0
  44. {pen_stack-6.10.4 → pen_stack-6.11.0}/configs/capsid_sequences.fasta +0 -0
  45. {pen_stack-6.10.4 → pen_stack-6.11.0}/configs/cargo_polish.yaml +0 -0
  46. {pen_stack-6.10.4 → pen_stack-6.11.0}/configs/cell_types.yaml +0 -0
  47. {pen_stack-6.10.4 → pen_stack-6.11.0}/configs/datasets.yaml +0 -0
  48. {pen_stack-6.10.4 → pen_stack-6.11.0}/configs/delivery_constraints.yaml +0 -0
  49. {pen_stack-6.10.4 → pen_stack-6.11.0}/configs/delivery_rules.yaml +0 -0
  50. {pen_stack-6.10.4 → pen_stack-6.11.0}/configs/delivery_vehicles.yaml +0 -0
  51. {pen_stack-6.10.4 → pen_stack-6.11.0}/configs/expression/modifiers.yaml +0 -0
  52. {pen_stack-6.10.4 → pen_stack-6.11.0}/configs/expression/promoters.yaml +0 -0
  53. {pen_stack-6.10.4 → pen_stack-6.11.0}/configs/gates_v3.yaml +0 -0
  54. {pen_stack-6.10.4 → pen_stack-6.11.0}/configs/genotoxicity_oracle.yaml +0 -0
  55. {pen_stack-6.10.4 → pen_stack-6.11.0}/configs/gsh_validated_heldout.yaml +0 -0
  56. {pen_stack-6.10.4 → pen_stack-6.11.0}/configs/intent_weights.yaml +0 -0
  57. {pen_stack-6.10.4 → pen_stack-6.11.0}/configs/known_unknowns.yaml +0 -0
  58. {pen_stack-6.10.4 → pen_stack-6.11.0}/configs/llm.yaml +0 -0
  59. {pen_stack-6.10.4 → pen_stack-6.11.0}/configs/metric_guide.yaml +0 -0
  60. {pen_stack-6.10.4 → pen_stack-6.11.0}/configs/mhc_epitope_oracle.yaml +0 -0
  61. {pen_stack-6.10.4 → pen_stack-6.11.0}/configs/monitor_queries.yaml +0 -0
  62. {pen_stack-6.10.4 → pen_stack-6.11.0}/configs/oracles/execution.yaml +0 -0
  63. {pen_stack-6.10.4 → pen_stack-6.11.0}/configs/rules/delivery.yaml +0 -0
  64. {pen_stack-6.10.4 → pen_stack-6.11.0}/configs/rules/fold.yaml +0 -0
  65. {pen_stack-6.10.4 → pen_stack-6.11.0}/configs/rules/multiplex.yaml +0 -0
  66. {pen_stack-6.10.4 → pen_stack-6.11.0}/configs/rules/payload.yaml +0 -0
  67. {pen_stack-6.10.4 → pen_stack-6.11.0}/configs/rules/reachability.yaml +0 -0
  68. {pen_stack-6.10.4 → pen_stack-6.11.0}/configs/safety/hazard_registry.yaml +0 -0
  69. {pen_stack-6.10.4 → pen_stack-6.11.0}/configs/safety/policy.yaml +0 -0
  70. {pen_stack-6.10.4 → pen_stack-6.11.0}/configs/safety/probes.yaml +0 -0
  71. {pen_stack-6.10.4 → pen_stack-6.11.0}/configs/score_axes.yaml +0 -0
  72. {pen_stack-6.10.4 → pen_stack-6.11.0}/configs/seroprevalence.yaml +0 -0
  73. {pen_stack-6.10.4 → pen_stack-6.11.0}/configs/target_sites.yaml +0 -0
  74. {pen_stack-6.10.4 → pen_stack-6.11.0}/configs/universe_crosswalk.yaml +0 -0
  75. {pen_stack-6.10.4 → pen_stack-6.11.0}/configs/write_types.yaml +0 -0
  76. {pen_stack-6.10.4 → pen_stack-6.11.0}/configs/writer_sequences.fasta +0 -0
  77. {pen_stack-6.10.4 → pen_stack-6.11.0}/configs/wtkb_curated.yaml +0 -0
  78. {pen_stack-6.10.4 → pen_stack-6.11.0}/data/curated/bridge_offtarget_energetics.json +0 -0
  79. {pen_stack-6.10.4 → pen_stack-6.11.0}/data/curated/bridge_offtarget_profile_measured.parquet +0 -0
  80. {pen_stack-6.10.4 → pen_stack-6.11.0}/data/curated/gene_coords.parquet +0 -0
  81. {pen_stack-6.10.4 → pen_stack-6.11.0}/data/curated/unified_editor_universe.parquet +0 -0
  82. {pen_stack-6.10.4 → pen_stack-6.11.0}/docs/BACKLOG.md +0 -0
  83. {pen_stack-6.10.4 → pen_stack-6.11.0}/docs/DEPLOY.md +0 -0
  84. {pen_stack-6.10.4 → pen_stack-6.11.0}/docs/INFRA.md +0 -0
  85. {pen_stack-6.10.4 → pen_stack-6.11.0}/docs/MCP.md +0 -0
  86. {pen_stack-6.10.4 → pen_stack-6.11.0}/docs/RELEASING.md +0 -0
  87. {pen_stack-6.10.4 → pen_stack-6.11.0}/docs/REPRO.md +0 -0
  88. {pen_stack-6.10.4 → pen_stack-6.11.0}/docs/STABILITY.md +0 -0
  89. {pen_stack-6.10.4 → pen_stack-6.11.0}/docs/agent.md +0 -0
  90. {pen_stack-6.10.4 → pen_stack-6.11.0}/docs/alphagenome_feasibility.md +0 -0
  91. {pen_stack-6.10.4 → pen_stack-6.11.0}/docs/autonomy.md +0 -0
  92. {pen_stack-6.10.4 → pen_stack-6.11.0}/docs/benchmark_circularity.md +0 -0
  93. {pen_stack-6.10.4 → pen_stack-6.11.0}/docs/biosecurity.md +0 -0
  94. {pen_stack-6.10.4 → pen_stack-6.11.0}/docs/build_interface.md +0 -0
  95. {pen_stack-6.10.4 → pen_stack-6.11.0}/docs/cards/atlas.md +0 -0
  96. {pen_stack-6.10.4 → pen_stack-6.11.0}/docs/cards/durability.md +0 -0
  97. {pen_stack-6.10.4 → pen_stack-6.11.0}/docs/cards/offtarget_data.md +0 -0
  98. {pen_stack-6.10.4 → pen_stack-6.11.0}/docs/cards/position_effect_data.md +0 -0
  99. {pen_stack-6.10.4 → pen_stack-6.11.0}/docs/cards/safety.md +0 -0
  100. {pen_stack-6.10.4 → pen_stack-6.11.0}/docs/cards/writer_efficiency_data.md +0 -0
  101. {pen_stack-6.10.4 → pen_stack-6.11.0}/docs/challenge.md +0 -0
  102. {pen_stack-6.10.4 → pen_stack-6.11.0}/docs/closed_loop.md +0 -0
  103. {pen_stack-6.10.4 → pen_stack-6.11.0}/docs/co_scientist.md +0 -0
  104. {pen_stack-6.10.4 → pen_stack-6.11.0}/docs/co_scientist_loop.md +0 -0
  105. {pen_stack-6.10.4 → pen_stack-6.11.0}/docs/delivery.md +0 -0
  106. {pen_stack-6.10.4 → pen_stack-6.11.0}/docs/delivery_immunology.md +0 -0
  107. {pen_stack-6.10.4 → pen_stack-6.11.0}/docs/digital_twin.md +0 -0
  108. {pen_stack-6.10.4 → pen_stack-6.11.0}/docs/dissemination.md +0 -0
  109. {pen_stack-6.10.4 → pen_stack-6.11.0}/docs/environment.md +0 -0
  110. {pen_stack-6.10.4 → pen_stack-6.11.0}/docs/experiment_design.md +0 -0
  111. {pen_stack-6.10.4 → pen_stack-6.11.0}/docs/generative_design.md +0 -0
  112. {pen_stack-6.10.4 → pen_stack-6.11.0}/docs/immune_profiler.md +0 -0
  113. {pen_stack-6.10.4 → pen_stack-6.11.0}/docs/index.md +0 -0
  114. {pen_stack-6.10.4 → pen_stack-6.11.0}/docs/integrations.md +0 -0
  115. {pen_stack-6.10.4 → pen_stack-6.11.0}/docs/live_oracles.md +0 -0
  116. {pen_stack-6.10.4 → pen_stack-6.11.0}/docs/mechanistic_constraints.md +0 -0
  117. {pen_stack-6.10.4 → pen_stack-6.11.0}/docs/offtarget.md +0 -0
  118. {pen_stack-6.10.4 → pen_stack-6.11.0}/docs/oracles.md +0 -0
  119. {pen_stack-6.10.4 → pen_stack-6.11.0}/docs/position_effect.md +0 -0
  120. {pen_stack-6.10.4 → pen_stack-6.11.0}/docs/positioning.md +0 -0
  121. {pen_stack-6.10.4 → pen_stack-6.11.0}/docs/private_data_formats.md +0 -0
  122. {pen_stack-6.10.4 → pen_stack-6.11.0}/docs/quickstart.md +0 -0
  123. {pen_stack-6.10.4 → pen_stack-6.11.0}/docs/responsible_use.md +0 -0
  124. {pen_stack-6.10.4 → pen_stack-6.11.0}/docs/rules.md +0 -0
  125. {pen_stack-6.10.4 → pen_stack-6.11.0}/docs/scope.md +0 -0
  126. {pen_stack-6.10.4 → pen_stack-6.11.0}/docs/scorecard.md +0 -0
  127. {pen_stack-6.10.4 → pen_stack-6.11.0}/docs/tpe_bench.md +0 -0
  128. {pen_stack-6.10.4 → pen_stack-6.11.0}/docs/tutorials/compare-families.md +0 -0
  129. {pen_stack-6.10.4 → pen_stack-6.11.0}/docs/tutorials/score-deliverability.md +0 -0
  130. {pen_stack-6.10.4 → pen_stack-6.11.0}/docs/tutorials/where-can-i-write.md +0 -0
  131. {pen_stack-6.10.4 → pen_stack-6.11.0}/docs/tutorials/which-writer-reaches-locus.md +0 -0
  132. {pen_stack-6.10.4 → pen_stack-6.11.0}/docs/uncertainty.md +0 -0
  133. {pen_stack-6.10.4 → pen_stack-6.11.0}/docs/verify.md +0 -0
  134. {pen_stack-6.10.4 → pen_stack-6.11.0}/docs/world_model.md +0 -0
  135. {pen_stack-6.10.4 → pen_stack-6.11.0}/docs/writer_efficiency.md +0 -0
  136. {pen_stack-6.10.4 → pen_stack-6.11.0}/docs/writer_verification.md +0 -0
  137. {pen_stack-6.10.4 → pen_stack-6.11.0}/docs/wtkb.md +0 -0
  138. {pen_stack-6.10.4 → pen_stack-6.11.0}/pen_stack/_resources.py +0 -0
  139. {pen_stack-6.10.4 → pen_stack-6.11.0}/pen_stack/active/__init__.py +0 -0
  140. {pen_stack-6.10.4 → pen_stack-6.11.0}/pen_stack/active/acquire.py +0 -0
  141. {pen_stack-6.10.4 → pen_stack-6.11.0}/pen_stack/active/design.py +0 -0
  142. {pen_stack-6.10.4 → pen_stack-6.11.0}/pen_stack/active/validate.py +0 -0
  143. {pen_stack-6.10.4 → pen_stack-6.11.0}/pen_stack/adapt/__init__.py +0 -0
  144. {pen_stack-6.10.4 → pen_stack-6.11.0}/pen_stack/adapt/finetune.py +0 -0
  145. {pen_stack-6.10.4 → pen_stack-6.11.0}/pen_stack/adapt/ingest.py +0 -0
  146. {pen_stack-6.10.4 → pen_stack-6.11.0}/pen_stack/adapt/pipeline.py +0 -0
  147. {pen_stack-6.10.4 → pen_stack-6.11.0}/pen_stack/adapt/recalibrate.py +0 -0
  148. {pen_stack-6.10.4 → pen_stack-6.11.0}/pen_stack/adapt/report.py +0 -0
  149. {pen_stack-6.10.4 → pen_stack-6.11.0}/pen_stack/agent/__init__.py +0 -0
  150. {pen_stack-6.10.4 → pen_stack-6.11.0}/pen_stack/agent/co_scientist.py +0 -0
  151. {pen_stack-6.10.4 → pen_stack-6.11.0}/pen_stack/agent/epistemic.py +0 -0
  152. {pen_stack-6.10.4 → pen_stack-6.11.0}/pen_stack/agent/guardrails.py +0 -0
  153. {pen_stack-6.10.4 → pen_stack-6.11.0}/pen_stack/agent/orchestrator.py +0 -0
  154. {pen_stack-6.10.4 → pen_stack-6.11.0}/pen_stack/agent/orchestrator_live.py +0 -0
  155. {pen_stack-6.10.4 → pen_stack-6.11.0}/pen_stack/agent/pen_agent.py +0 -0
  156. {pen_stack-6.10.4 → pen_stack-6.11.0}/pen_stack/agent/scope.py +0 -0
  157. {pen_stack-6.10.4 → pen_stack-6.11.0}/pen_stack/agent/tools.py +0 -0
  158. {pen_stack-6.10.4 → pen_stack-6.11.0}/pen_stack/api/__init__.py +0 -0
  159. {pen_stack-6.10.4 → pen_stack-6.11.0}/pen_stack/atlas/__init__.py +0 -0
  160. {pen_stack-6.10.4 → pen_stack-6.11.0}/pen_stack/atlas/build_wtkb.py +0 -0
  161. {pen_stack-6.10.4 → pen_stack-6.11.0}/pen_stack/atlas/crosslink.py +0 -0
  162. {pen_stack-6.10.4 → pen_stack-6.11.0}/pen_stack/atlas/expand.py +0 -0
  163. {pen_stack-6.10.4 → pen_stack-6.11.0}/pen_stack/atlas/guide_design.py +0 -0
  164. {pen_stack-6.10.4 → pen_stack-6.11.0}/pen_stack/atlas/schema.py +0 -0
  165. {pen_stack-6.10.4 → pen_stack-6.11.0}/pen_stack/atlas/scorecard.py +0 -0
  166. {pen_stack-6.10.4 → pen_stack-6.11.0}/pen_stack/atlas/universe.py +0 -0
  167. {pen_stack-6.10.4 → pen_stack-6.11.0}/pen_stack/atlas/variant_propose.py +0 -0
  168. {pen_stack-6.10.4 → pen_stack-6.11.0}/pen_stack/atlas/writer_efficiency.py +0 -0
  169. {pen_stack-6.10.4 → pen_stack-6.11.0}/pen_stack/atlas/writer_predict.py +0 -0
  170. {pen_stack-6.10.4 → pen_stack-6.11.0}/pen_stack/atlas/writer_recommend.py +0 -0
  171. {pen_stack-6.10.4 → pen_stack-6.11.0}/pen_stack/atlas/writer_verify.py +0 -0
  172. {pen_stack-6.10.4 → pen_stack-6.11.0}/pen_stack/bridge/__init__.py +0 -0
  173. {pen_stack-6.10.4 → pen_stack-6.11.0}/pen_stack/bridge/activity.py +0 -0
  174. {pen_stack-6.10.4 → pen_stack-6.11.0}/pen_stack/bridge/cli.py +0 -0
  175. {pen_stack-6.10.4 → pen_stack-6.11.0}/pen_stack/bridge/fold_qc.py +0 -0
  176. {pen_stack-6.10.4 → pen_stack-6.11.0}/pen_stack/bridge/guide_qc.py +0 -0
  177. {pen_stack-6.10.4 → pen_stack-6.11.0}/pen_stack/bridge/ingest.py +0 -0
  178. {pen_stack-6.10.4 → pen_stack-6.11.0}/pen_stack/bridge/offtarget.py +0 -0
  179. {pen_stack-6.10.4 → pen_stack-6.11.0}/pen_stack/bridge/offtarget_energetics.py +0 -0
  180. {pen_stack-6.10.4 → pen_stack-6.11.0}/pen_stack/bridge/ortholog_screen.py +0 -0
  181. {pen_stack-6.10.4 → pen_stack-6.11.0}/pen_stack/bridge/pipeline.py +0 -0
  182. {pen_stack-6.10.4 → pen_stack-6.11.0}/pen_stack/build/__init__.py +0 -0
  183. {pen_stack-6.10.4 → pen_stack-6.11.0}/pen_stack/build/ingest.py +0 -0
  184. {pen_stack-6.10.4 → pen_stack-6.11.0}/pen_stack/build/protocol.py +0 -0
  185. {pen_stack-6.10.4 → pen_stack-6.11.0}/pen_stack/build/simlab.py +0 -0
  186. {pen_stack-6.10.4 → pen_stack-6.11.0}/pen_stack/cli.py +0 -0
  187. {pen_stack-6.10.4 → pen_stack-6.11.0}/pen_stack/data/__init__.py +0 -0
  188. {pen_stack-6.10.4 → pen_stack-6.11.0}/pen_stack/data/encode.py +0 -0
  189. {pen_stack-6.10.4 → pen_stack-6.11.0}/pen_stack/data/genome.py +0 -0
  190. {pen_stack-6.10.4 → pen_stack-6.11.0}/pen_stack/data/ingest_chromatin.py +0 -0
  191. {pen_stack-6.10.4 → pen_stack-6.11.0}/pen_stack/data/ingest_integration.py +0 -0
  192. {pen_stack-6.10.4 → pen_stack-6.11.0}/pen_stack/data/ingest_safety_annot.py +0 -0
  193. {pen_stack-6.10.4 → pen_stack-6.11.0}/pen_stack/data/ingest_trip.py +0 -0
  194. {pen_stack-6.10.4 → pen_stack-6.11.0}/pen_stack/design/__init__.py +0 -0
  195. {pen_stack-6.10.4 → pen_stack-6.11.0}/pen_stack/design/generate.py +0 -0
  196. {pen_stack-6.10.4 → pen_stack-6.11.0}/pen_stack/design/pareto.py +0 -0
  197. {pen_stack-6.10.4 → pen_stack-6.11.0}/pen_stack/design/space.py +0 -0
  198. {pen_stack-6.10.4 → pen_stack-6.11.0}/pen_stack/design/writer_variants.py +0 -0
  199. {pen_stack-6.10.4 → pen_stack-6.11.0}/pen_stack/env/__init__.py +0 -0
  200. {pen_stack-6.10.4 → pen_stack-6.11.0}/pen_stack/env/genome_writing_env.py +0 -0
  201. {pen_stack-6.10.4 → pen_stack-6.11.0}/pen_stack/env/policies.py +0 -0
  202. {pen_stack-6.10.4 → pen_stack-6.11.0}/pen_stack/graph/__init__.py +0 -0
  203. {pen_stack-6.10.4 → pen_stack-6.11.0}/pen_stack/graph/build.py +0 -0
  204. {pen_stack-6.10.4 → pen_stack-6.11.0}/pen_stack/graph/cell_types.py +0 -0
  205. {pen_stack-6.10.4 → pen_stack-6.11.0}/pen_stack/graph/ingest.py +0 -0
  206. {pen_stack-6.10.4 → pen_stack-6.11.0}/pen_stack/graph/query.py +0 -0
  207. {pen_stack-6.10.4 → pen_stack-6.11.0}/pen_stack/graph/schema.py +0 -0
  208. {pen_stack-6.10.4 → pen_stack-6.11.0}/pen_stack/loop/__init__.py +0 -0
  209. {pen_stack-6.10.4 → pen_stack-6.11.0}/pen_stack/loop/continual.py +0 -0
  210. {pen_stack-6.10.4 → pen_stack-6.11.0}/pen_stack/loop/cycle.py +0 -0
  211. {pen_stack-6.10.4 → pen_stack-6.11.0}/pen_stack/loop/drift.py +0 -0
  212. {pen_stack-6.10.4 → pen_stack-6.11.0}/pen_stack/mech/__init__.py +0 -0
  213. {pen_stack-6.10.4 → pen_stack-6.11.0}/pen_stack/mech/classify_atlas.py +0 -0
  214. {pen_stack-6.10.4 → pen_stack-6.11.0}/pen_stack/mech/whitelist.py +0 -0
  215. {pen_stack-6.10.4 → pen_stack-6.11.0}/pen_stack/monitor/__init__.py +0 -0
  216. {pen_stack-6.10.4 → pen_stack-6.11.0}/pen_stack/monitor/europepmc.py +0 -0
  217. {pen_stack-6.10.4 → pen_stack-6.11.0}/pen_stack/monitor/run.py +0 -0
  218. {pen_stack-6.10.4 → pen_stack-6.11.0}/pen_stack/monitor/triage.py +0 -0
  219. {pen_stack-6.10.4 → pen_stack-6.11.0}/pen_stack/oracles/__init__.py +0 -0
  220. {pen_stack-6.10.4 → pen_stack-6.11.0}/pen_stack/oracles/cache.py +0 -0
  221. {pen_stack-6.10.4 → pen_stack-6.11.0}/pen_stack/oracles/energetics.py +0 -0
  222. {pen_stack-6.10.4 → pen_stack-6.11.0}/pen_stack/oracles/genome.py +0 -0
  223. {pen_stack-6.10.4 → pen_stack-6.11.0}/pen_stack/oracles/protein_design.py +0 -0
  224. {pen_stack-6.10.4 → pen_stack-6.11.0}/pen_stack/oracles/rna.py +0 -0
  225. {pen_stack-6.10.4 → pen_stack-6.11.0}/pen_stack/oracles/schema.py +0 -0
  226. {pen_stack-6.10.4 → pen_stack-6.11.0}/pen_stack/oracles/status.py +0 -0
  227. {pen_stack-6.10.4 → pen_stack-6.11.0}/pen_stack/oracles/structure.py +0 -0
  228. {pen_stack-6.10.4 → pen_stack-6.11.0}/pen_stack/oracles/vcell.py +0 -0
  229. {pen_stack-6.10.4 → pen_stack-6.11.0}/pen_stack/planner/__init__.py +0 -0
  230. {pen_stack-6.10.4 → pen_stack-6.11.0}/pen_stack/planner/ada_risk.py +0 -0
  231. {pen_stack-6.10.4 → pen_stack-6.11.0}/pen_stack/planner/antipeg_oracle.py +0 -0
  232. {pen_stack-6.10.4 → pen_stack-6.11.0}/pen_stack/planner/capsid_epitope_oracle.py +0 -0
  233. {pen_stack-6.10.4 → pen_stack-6.11.0}/pen_stack/planner/cargo.py +0 -0
  234. {pen_stack-6.10.4 → pen_stack-6.11.0}/pen_stack/planner/cargo_polish.py +0 -0
  235. {pen_stack-6.10.4 → pen_stack-6.11.0}/pen_stack/planner/delivery.py +0 -0
  236. {pen_stack-6.10.4 → pen_stack-6.11.0}/pen_stack/planner/delivery_constraints.py +0 -0
  237. {pen_stack-6.10.4 → pen_stack-6.11.0}/pen_stack/planner/delivery_immunology.py +0 -0
  238. {pen_stack-6.10.4 → pen_stack-6.11.0}/pen_stack/planner/delivery_vehicles.py +0 -0
  239. {pen_stack-6.10.4 → pen_stack-6.11.0}/pen_stack/planner/genotoxicity_oracle.py +0 -0
  240. {pen_stack-6.10.4 → pen_stack-6.11.0}/pen_stack/planner/immune_mhc2.py +0 -0
  241. {pen_stack-6.10.4 → pen_stack-6.11.0}/pen_stack/planner/immune_profile.py +0 -0
  242. {pen_stack-6.10.4 → pen_stack-6.11.0}/pen_stack/planner/innate_sensing.py +0 -0
  243. {pen_stack-6.10.4 → pen_stack-6.11.0}/pen_stack/planner/multiplex.py +0 -0
  244. {pen_stack-6.10.4 → pen_stack-6.11.0}/pen_stack/planner/optimize.py +0 -0
  245. {pen_stack-6.10.4 → pen_stack-6.11.0}/pen_stack/planner/pipeline.py +0 -0
  246. {pen_stack-6.10.4 → pen_stack-6.11.0}/pen_stack/planner/report.py +0 -0
  247. {pen_stack-6.10.4 → pen_stack-6.11.0}/pen_stack/planner/router.py +0 -0
  248. {pen_stack-6.10.4 → pen_stack-6.11.0}/pen_stack/planner/seroprevalence_oracle.py +0 -0
  249. {pen_stack-6.10.4 → pen_stack-6.11.0}/pen_stack/planner/target_site.py +0 -0
  250. {pen_stack-6.10.4 → pen_stack-6.11.0}/pen_stack/rag/__init__.py +0 -0
  251. {pen_stack-6.10.4 → pen_stack-6.11.0}/pen_stack/rag/index.py +0 -0
  252. {pen_stack-6.10.4 → pen_stack-6.11.0}/pen_stack/rag/llm.py +0 -0
  253. {pen_stack-6.10.4 → pen_stack-6.11.0}/pen_stack/rag/qa.py +0 -0
  254. {pen_stack-6.10.4 → pen_stack-6.11.0}/pen_stack/rules/__init__.py +0 -0
  255. {pen_stack-6.10.4 → pen_stack-6.11.0}/pen_stack/rules/evaluators.py +0 -0
  256. {pen_stack-6.10.4 → pen_stack-6.11.0}/pen_stack/rules/loader.py +0 -0
  257. {pen_stack-6.10.4 → pen_stack-6.11.0}/pen_stack/rules/schema.py +0 -0
  258. {pen_stack-6.10.4 → pen_stack-6.11.0}/pen_stack/rules/solver.py +0 -0
  259. {pen_stack-6.10.4 → pen_stack-6.11.0}/pen_stack/safety/__init__.py +0 -0
  260. {pen_stack-6.10.4 → pen_stack-6.11.0}/pen_stack/safety/audit.py +0 -0
  261. {pen_stack-6.10.4 → pen_stack-6.11.0}/pen_stack/safety/gate.py +0 -0
  262. {pen_stack-6.10.4 → pen_stack-6.11.0}/pen_stack/safety/policy.py +0 -0
  263. {pen_stack-6.10.4 → pen_stack-6.11.0}/pen_stack/safety/redteam.py +0 -0
  264. {pen_stack-6.10.4 → pen_stack-6.11.0}/pen_stack/safety/registry.py +0 -0
  265. {pen_stack-6.10.4 → pen_stack-6.11.0}/pen_stack/safety/screen.py +0 -0
  266. {pen_stack-6.10.4 → pen_stack-6.11.0}/pen_stack/score/__init__.py +0 -0
  267. {pen_stack-6.10.4 → pen_stack-6.11.0}/pen_stack/score/recalibrate.py +0 -0
  268. {pen_stack-6.10.4 → pen_stack-6.11.0}/pen_stack/score/therapeutic.py +0 -0
  269. {pen_stack-6.10.4 → pen_stack-6.11.0}/pen_stack/server/__init__.py +0 -0
  270. {pen_stack-6.10.4 → pen_stack-6.11.0}/pen_stack/twin/__init__.py +0 -0
  271. {pen_stack-6.10.4 → pen_stack-6.11.0}/pen_stack/twin/calibrate.py +0 -0
  272. {pen_stack-6.10.4 → pen_stack-6.11.0}/pen_stack/twin/data/__init__.py +0 -0
  273. {pen_stack-6.10.4 → pen_stack-6.11.0}/pen_stack/twin/data/position_effect.py +0 -0
  274. {pen_stack-6.10.4 → pen_stack-6.11.0}/pen_stack/twin/mechanistic.py +0 -0
  275. {pen_stack-6.10.4 → pen_stack-6.11.0}/pen_stack/twin/outcome.py +0 -0
  276. {pen_stack-6.10.4 → pen_stack-6.11.0}/pen_stack/twin/position_effect.py +0 -0
  277. {pen_stack-6.10.4 → pen_stack-6.11.0}/pen_stack/ui/__init__.py +0 -0
  278. {pen_stack-6.10.4 → pen_stack-6.11.0}/pen_stack/ui/app.py +0 -0
  279. {pen_stack-6.10.4 → pen_stack-6.11.0}/pen_stack/validate/__init__.py +0 -0
  280. {pen_stack-6.10.4 → pen_stack-6.11.0}/pen_stack/validate/adapt_demo.py +0 -0
  281. {pen_stack-6.10.4 → pen_stack-6.11.0}/pen_stack/validate/agent_eval.py +0 -0
  282. {pen_stack-6.10.4 → pen_stack-6.11.0}/pen_stack/validate/bench_adversarial_tasks.py +0 -0
  283. {pen_stack-6.10.4 → pen_stack-6.11.0}/pen_stack/validate/bench_coscientist_tasks.py +0 -0
  284. {pen_stack-6.10.4 → pen_stack-6.11.0}/pen_stack/validate/bench_graph_tasks.py +0 -0
  285. {pen_stack-6.10.4 → pen_stack-6.11.0}/pen_stack/validate/bench_rule_tasks.py +0 -0
  286. {pen_stack-6.10.4 → pen_stack-6.11.0}/pen_stack/validate/bench_trust_tasks.py +0 -0
  287. {pen_stack-6.10.4 → pen_stack-6.11.0}/pen_stack/validate/bench_writetype_tasks.py +0 -0
  288. {pen_stack-6.10.4 → pen_stack-6.11.0}/pen_stack/validate/blind_gsh_discovery.py +0 -0
  289. {pen_stack-6.10.4 → pen_stack-6.11.0}/pen_stack/validate/cargo_directionality.py +0 -0
  290. {pen_stack-6.10.4 → pen_stack-6.11.0}/pen_stack/validate/closed_loop.py +0 -0
  291. {pen_stack-6.10.4 → pen_stack-6.11.0}/pen_stack/validate/durability_baselines.py +0 -0
  292. {pen_stack-6.10.4 → pen_stack-6.11.0}/pen_stack/validate/experiment_design.py +0 -0
  293. {pen_stack-6.10.4 → pen_stack-6.11.0}/pen_stack/validate/expr_controls.py +0 -0
  294. {pen_stack-6.10.4 → pen_stack-6.11.0}/pen_stack/validate/forward_hypotheses.py +0 -0
  295. {pen_stack-6.10.4 → pen_stack-6.11.0}/pen_stack/validate/generative_design.py +0 -0
  296. {pen_stack-6.10.4 → pen_stack-6.11.0}/pen_stack/validate/guide_qc_demo.py +0 -0
  297. {pen_stack-6.10.4 → pen_stack-6.11.0}/pen_stack/validate/heldout_celltype_expr.py +0 -0
  298. {pen_stack-6.10.4 → pen_stack-6.11.0}/pen_stack/validate/immune_calibration.py +0 -0
  299. {pen_stack-6.10.4 → pen_stack-6.11.0}/pen_stack/validate/intent_specification.py +0 -0
  300. {pen_stack-6.10.4 → pen_stack-6.11.0}/pen_stack/validate/known_biology_expr.py +0 -0
  301. {pen_stack-6.10.4 → pen_stack-6.11.0}/pen_stack/validate/offtarget_energetics_eval.py +0 -0
  302. {pen_stack-6.10.4 → pen_stack-6.11.0}/pen_stack/validate/out_of_scope_refusal.py +0 -0
  303. {pen_stack-6.10.4 → pen_stack-6.11.0}/pen_stack/validate/outcome_calibration.py +0 -0
  304. {pen_stack-6.10.4 → pen_stack-6.11.0}/pen_stack/validate/outcome_prediction.py +0 -0
  305. {pen_stack-6.10.4 → pen_stack-6.11.0}/pen_stack/validate/paper3_benchmark.py +0 -0
  306. {pen_stack-6.10.4 → pen_stack-6.11.0}/pen_stack/validate/paper4_real_validation.py +0 -0
  307. {pen_stack-6.10.4 → pen_stack-6.11.0}/pen_stack/validate/paper4_validation.py +0 -0
  308. {pen_stack-6.10.4 → pen_stack-6.11.0}/pen_stack/validate/protocol_safety.py +0 -0
  309. {pen_stack-6.10.4 → pen_stack-6.11.0}/pen_stack/validate/safety_screening.py +0 -0
  310. {pen_stack-6.10.4 → pen_stack-6.11.0}/pen_stack/validate/selective_prediction.py +0 -0
  311. {pen_stack-6.10.4 → pen_stack-6.11.0}/pen_stack/validate/seq_vs_measured.py +0 -0
  312. {pen_stack-6.10.4 → pen_stack-6.11.0}/pen_stack/validate/target_site_controls.py +0 -0
  313. {pen_stack-6.10.4 → pen_stack-6.11.0}/pen_stack/validate/uncertainty_eval.py +0 -0
  314. {pen_stack-6.10.4 → pen_stack-6.11.0}/pen_stack/validate/ungrounded_baseline.py +0 -0
  315. {pen_stack-6.10.4 → pen_stack-6.11.0}/pen_stack/validate/within_locus_ranking.py +0 -0
  316. {pen_stack-6.10.4 → pen_stack-6.11.0}/pen_stack/validate/writer_recovery.py +0 -0
  317. {pen_stack-6.10.4 → pen_stack-6.11.0}/pen_stack/verify/__init__.py +0 -0
  318. {pen_stack-6.10.4 → pen_stack-6.11.0}/pen_stack/verify/schema.py +0 -0
  319. {pen_stack-6.10.4 → pen_stack-6.11.0}/pen_stack/verify/service.py +0 -0
  320. {pen_stack-6.10.4 → pen_stack-6.11.0}/pen_stack/web/__init__.py +0 -0
  321. {pen_stack-6.10.4 → pen_stack-6.11.0}/pen_stack/web/guide.py +0 -0
  322. {pen_stack-6.10.4 → pen_stack-6.11.0}/pen_stack/web/llm.py +0 -0
  323. {pen_stack-6.10.4 → pen_stack-6.11.0}/pen_stack/web/router.py +0 -0
  324. {pen_stack-6.10.4 → pen_stack-6.11.0}/pen_stack/web/server.py +0 -0
  325. {pen_stack-6.10.4 → pen_stack-6.11.0}/pen_stack/web/tools.py +0 -0
  326. {pen_stack-6.10.4 → pen_stack-6.11.0}/pen_stack/wgenome/__init__.py +0 -0
  327. {pen_stack-6.10.4 → pen_stack-6.11.0}/pen_stack/wgenome/chromatin_seq.py +0 -0
  328. {pen_stack-6.10.4 → pen_stack-6.11.0}/pen_stack/wgenome/durability.py +0 -0
  329. {pen_stack-6.10.4 → pen_stack-6.11.0}/pen_stack/wgenome/export_tracks.py +0 -0
  330. {pen_stack-6.10.4 → pen_stack-6.11.0}/pen_stack/wgenome/features.py +0 -0
  331. {pen_stack-6.10.4 → pen_stack-6.11.0}/pen_stack/wgenome/gsh_baseline.py +0 -0
  332. {pen_stack-6.10.4 → pen_stack-6.11.0}/pen_stack/wgenome/mesh_features.py +0 -0
  333. {pen_stack-6.10.4 → pen_stack-6.11.0}/pen_stack/wgenome/offtarget_assay.py +0 -0
  334. {pen_stack-6.10.4 → pen_stack-6.11.0}/pen_stack/wgenome/offtarget_data.py +0 -0
  335. {pen_stack-6.10.4 → pen_stack-6.11.0}/pen_stack/wgenome/offtarget_predict.py +0 -0
  336. {pen_stack-6.10.4 → pen_stack-6.11.0}/pen_stack/wgenome/ood.py +0 -0
  337. {pen_stack-6.10.4 → pen_stack-6.11.0}/pen_stack/wgenome/providers.py +0 -0
  338. {pen_stack-6.10.4 → pen_stack-6.11.0}/pen_stack/wgenome/safety.py +0 -0
  339. {pen_stack-6.10.4 → pen_stack-6.11.0}/pen_stack/wgenome/structure3d.py +0 -0
  340. {pen_stack-6.10.4 → pen_stack-6.11.0}/pen_stack/wgenome/uncertainty.py +0 -0
  341. {pen_stack-6.10.4 → pen_stack-6.11.0}/pen_stack/wgenome/writability.py +0 -0
  342. {pen_stack-6.10.4 → pen_stack-6.11.0}/pen_stack.egg-info/dependency_links.txt +0 -0
  343. {pen_stack-6.10.4 → pen_stack-6.11.0}/pen_stack.egg-info/entry_points.txt +0 -0
  344. {pen_stack-6.10.4 → pen_stack-6.11.0}/pen_stack.egg-info/requires.txt +0 -0
  345. {pen_stack-6.10.4 → pen_stack-6.11.0}/pen_stack.egg-info/top_level.txt +0 -0
  346. {pen_stack-6.10.4 → pen_stack-6.11.0}/prereg/SHA256_LOCK_phase0.json +0 -0
  347. {pen_stack-6.10.4 → pen_stack-6.11.0}/prereg/SHA256_LOCK_phase1_5.json +0 -0
  348. {pen_stack-6.10.4 → pen_stack-6.11.0}/prereg/SHA256_LOCK_phase2.json +0 -0
  349. {pen_stack-6.10.4 → pen_stack-6.11.0}/prereg/SHA256_LOCK_phase3.json +0 -0
  350. {pen_stack-6.10.4 → pen_stack-6.11.0}/prereg/SHA256_LOCK_ws_a.json +0 -0
  351. {pen_stack-6.10.4 → pen_stack-6.11.0}/prereg/SHA256_LOCK_ws_acq.json +0 -0
  352. {pen_stack-6.10.4 → pen_stack-6.11.0}/prereg/SHA256_LOCK_ws_aldesign.json +0 -0
  353. {pen_stack-6.10.4 → pen_stack-6.11.0}/prereg/SHA256_LOCK_ws_alvalidate.json +0 -0
  354. {pen_stack-6.10.4 → pen_stack-6.11.0}/prereg/SHA256_LOCK_ws_atlas.json +0 -0
  355. {pen_stack-6.10.4 → pen_stack-6.11.0}/prereg/SHA256_LOCK_ws_b.json +0 -0
  356. {pen_stack-6.10.4 → pen_stack-6.11.0}/prereg/SHA256_LOCK_ws_ba.json +0 -0
  357. {pen_stack-6.10.4 → pen_stack-6.11.0}/prereg/SHA256_LOCK_ws_ba_v33.json +0 -0
  358. {pen_stack-6.10.4 → pen_stack-6.11.0}/prereg/SHA256_LOCK_ws_ba_v45.json +0 -0
  359. {pen_stack-6.10.4 → pen_stack-6.11.0}/prereg/SHA256_LOCK_ws_bench.json +0 -0
  360. {pen_stack-6.10.4 → pen_stack-6.11.0}/prereg/SHA256_LOCK_ws_c.json +0 -0
  361. {pen_stack-6.10.4 → pen_stack-6.11.0}/prereg/SHA256_LOCK_ws_cal.json +0 -0
  362. {pen_stack-6.10.4 → pen_stack-6.11.0}/prereg/SHA256_LOCK_ws_calib.json +0 -0
  363. {pen_stack-6.10.4 → pen_stack-6.11.0}/prereg/SHA256_LOCK_ws_challenge.json +0 -0
  364. {pen_stack-6.10.4 → pen_stack-6.11.0}/prereg/SHA256_LOCK_ws_chat.json +0 -0
  365. {pen_stack-6.10.4 → pen_stack-6.11.0}/prereg/SHA256_LOCK_ws_cite.json +0 -0
  366. {pen_stack-6.10.4 → pen_stack-6.11.0}/prereg/SHA256_LOCK_ws_continual.json +0 -0
  367. {pen_stack-6.10.4 → pen_stack-6.11.0}/prereg/SHA256_LOCK_ws_cosci2.json +0 -0
  368. {pen_stack-6.10.4 → pen_stack-6.11.0}/prereg/SHA256_LOCK_ws_crit.json +0 -0
  369. {pen_stack-6.10.4 → pen_stack-6.11.0}/prereg/SHA256_LOCK_ws_ct.json +0 -0
  370. {pen_stack-6.10.4 → pen_stack-6.11.0}/prereg/SHA256_LOCK_ws_d.json +0 -0
  371. {pen_stack-6.10.4 → pen_stack-6.11.0}/prereg/SHA256_LOCK_ws_drift.json +0 -0
  372. {pen_stack-6.10.4 → pen_stack-6.11.0}/prereg/SHA256_LOCK_ws_e.json +0 -0
  373. {pen_stack-6.10.4 → pen_stack-6.11.0}/prereg/SHA256_LOCK_ws_env.json +0 -0
  374. {pen_stack-6.10.4 → pen_stack-6.11.0}/prereg/SHA256_LOCK_ws_ep.json +0 -0
  375. {pen_stack-6.10.4 → pen_stack-6.11.0}/prereg/SHA256_LOCK_ws_epitope.json +0 -0
  376. {pen_stack-6.10.4 → pen_stack-6.11.0}/prereg/SHA256_LOCK_ws_expr2.json +0 -0
  377. {pen_stack-6.10.4 → pen_stack-6.11.0}/prereg/SHA256_LOCK_ws_f.json +0 -0
  378. {pen_stack-6.10.4 → pen_stack-6.11.0}/prereg/SHA256_LOCK_ws_frontend.json +0 -0
  379. {pen_stack-6.10.4 → pen_stack-6.11.0}/prereg/SHA256_LOCK_ws_g.json +0 -0
  380. {pen_stack-6.10.4 → pen_stack-6.11.0}/prereg/SHA256_LOCK_ws_gen.json +0 -0
  381. {pen_stack-6.10.4 → pen_stack-6.11.0}/prereg/SHA256_LOCK_ws_genotox.json +0 -0
  382. {pen_stack-6.10.4 → pen_stack-6.11.0}/prereg/SHA256_LOCK_ws_graph.json +0 -0
  383. {pen_stack-6.10.4 → pen_stack-6.11.0}/prereg/SHA256_LOCK_ws_h.json +0 -0
  384. {pen_stack-6.10.4 → pen_stack-6.11.0}/prereg/SHA256_LOCK_ws_hybrid.json +0 -0
  385. {pen_stack-6.10.4 → pen_stack-6.11.0}/prereg/SHA256_LOCK_ws_immune.json +0 -0
  386. {pen_stack-6.10.4 → pen_stack-6.11.0}/prereg/SHA256_LOCK_ws_immune2.json +0 -0
  387. {pen_stack-6.10.4 → pen_stack-6.11.0}/prereg/SHA256_LOCK_ws_ingest.json +0 -0
  388. {pen_stack-6.10.4 → pen_stack-6.11.0}/prereg/SHA256_LOCK_ws_innate.json +0 -0
  389. {pen_stack-6.10.4 → pen_stack-6.11.0}/prereg/SHA256_LOCK_ws_loop.json +0 -0
  390. {pen_stack-6.10.4 → pen_stack-6.11.0}/prereg/SHA256_LOCK_ws_manifest.json +0 -0
  391. {pen_stack-6.10.4 → pen_stack-6.11.0}/prereg/SHA256_LOCK_ws_mc.json +0 -0
  392. {pen_stack-6.10.4 → pen_stack-6.11.0}/prereg/SHA256_LOCK_ws_mcp.json +0 -0
  393. {pen_stack-6.10.4 → pen_stack-6.11.0}/prereg/SHA256_LOCK_ws_mech.json +0 -0
  394. {pen_stack-6.10.4 → pen_stack-6.11.0}/prereg/SHA256_LOCK_ws_mon.json +0 -0
  395. {pen_stack-6.10.4 → pen_stack-6.11.0}/prereg/SHA256_LOCK_ws_o.json +0 -0
  396. {pen_stack-6.10.4 → pen_stack-6.11.0}/prereg/SHA256_LOCK_ws_offtarget.json +0 -0
  397. {pen_stack-6.10.4 → pen_stack-6.11.0}/prereg/SHA256_LOCK_ws_openapi.json +0 -0
  398. {pen_stack-6.10.4 → pen_stack-6.11.0}/prereg/SHA256_LOCK_ws_orch.json +0 -0
  399. {pen_stack-6.10.4 → pen_stack-6.11.0}/prereg/SHA256_LOCK_ws_outcome.json +0 -0
  400. {pen_stack-6.10.4 → pen_stack-6.11.0}/prereg/SHA256_LOCK_ws_pareto.json +0 -0
  401. {pen_stack-6.10.4 → pen_stack-6.11.0}/prereg/SHA256_LOCK_ws_peg.json +0 -0
  402. {pen_stack-6.10.4 → pen_stack-6.11.0}/prereg/SHA256_LOCK_ws_plan.json +0 -0
  403. {pen_stack-6.10.4 → pen_stack-6.11.0}/prereg/SHA256_LOCK_ws_policy.json +0 -0
  404. {pen_stack-6.10.4 → pen_stack-6.11.0}/prereg/SHA256_LOCK_ws_profile.json +0 -0
  405. {pen_stack-6.10.4 → pen_stack-6.11.0}/prereg/SHA256_LOCK_ws_proto.json +0 -0
  406. {pen_stack-6.10.4 → pen_stack-6.11.0}/prereg/SHA256_LOCK_ws_r.json +0 -0
  407. {pen_stack-6.10.4 → pen_stack-6.11.0}/prereg/SHA256_LOCK_ws_redteam.json +0 -0
  408. {pen_stack-6.10.4 → pen_stack-6.11.0}/prereg/SHA256_LOCK_ws_route.json +0 -0
  409. {pen_stack-6.10.4 → pen_stack-6.11.0}/prereg/SHA256_LOCK_ws_screen.json +0 -0
  410. {pen_stack-6.10.4 → pen_stack-6.11.0}/prereg/SHA256_LOCK_ws_seroprev.json +0 -0
  411. {pen_stack-6.10.4 → pen_stack-6.11.0}/prereg/SHA256_LOCK_ws_simlab.json +0 -0
  412. {pen_stack-6.10.4 → pen_stack-6.11.0}/prereg/SHA256_LOCK_ws_twincal.json +0 -0
  413. {pen_stack-6.10.4 → pen_stack-6.11.0}/prereg/SHA256_LOCK_ws_uq.json +0 -0
  414. {pen_stack-6.10.4 → pen_stack-6.11.0}/prereg/SHA256_LOCK_ws_v.json +0 -0
  415. {pen_stack-6.10.4 → pen_stack-6.11.0}/prereg/SHA256_LOCK_ws_vcell.json +0 -0
  416. {pen_stack-6.10.4 → pen_stack-6.11.0}/prereg/SHA256_LOCK_ws_writer.json +0 -0
  417. {pen_stack-6.10.4 → pen_stack-6.11.0}/prereg/SHA256_LOCK_ws_wv.json +0 -0
  418. {pen_stack-6.10.4 → pen_stack-6.11.0}/prereg/paper1.yaml +0 -0
  419. {pen_stack-6.10.4 → pen_stack-6.11.0}/prereg/paper2.yaml +0 -0
  420. {pen_stack-6.10.4 → pen_stack-6.11.0}/prereg/paper3.yaml +0 -0
  421. {pen_stack-6.10.4 → pen_stack-6.11.0}/prereg/paper4.yaml +0 -0
  422. {pen_stack-6.10.4 → pen_stack-6.11.0}/prereg/phase0.yaml +0 -0
  423. {pen_stack-6.10.4 → pen_stack-6.11.0}/prereg/ws_a.yaml +0 -0
  424. {pen_stack-6.10.4 → pen_stack-6.11.0}/prereg/ws_acq.yaml +0 -0
  425. {pen_stack-6.10.4 → pen_stack-6.11.0}/prereg/ws_aldesign.yaml +0 -0
  426. {pen_stack-6.10.4 → pen_stack-6.11.0}/prereg/ws_alvalidate.yaml +0 -0
  427. {pen_stack-6.10.4 → pen_stack-6.11.0}/prereg/ws_atlas.yaml +0 -0
  428. {pen_stack-6.10.4 → pen_stack-6.11.0}/prereg/ws_b.yaml +0 -0
  429. {pen_stack-6.10.4 → pen_stack-6.11.0}/prereg/ws_ba.yaml +0 -0
  430. {pen_stack-6.10.4 → pen_stack-6.11.0}/prereg/ws_ba_v33.yaml +0 -0
  431. {pen_stack-6.10.4 → pen_stack-6.11.0}/prereg/ws_ba_v45.yaml +0 -0
  432. {pen_stack-6.10.4 → pen_stack-6.11.0}/prereg/ws_bench.yaml +0 -0
  433. {pen_stack-6.10.4 → pen_stack-6.11.0}/prereg/ws_c.yaml +0 -0
  434. {pen_stack-6.10.4 → pen_stack-6.11.0}/prereg/ws_cal.yaml +0 -0
  435. {pen_stack-6.10.4 → pen_stack-6.11.0}/prereg/ws_calib.yaml +0 -0
  436. {pen_stack-6.10.4 → pen_stack-6.11.0}/prereg/ws_challenge.yaml +0 -0
  437. {pen_stack-6.10.4 → pen_stack-6.11.0}/prereg/ws_chat.yaml +0 -0
  438. {pen_stack-6.10.4 → pen_stack-6.11.0}/prereg/ws_cite.yaml +0 -0
  439. {pen_stack-6.10.4 → pen_stack-6.11.0}/prereg/ws_continual.yaml +0 -0
  440. {pen_stack-6.10.4 → pen_stack-6.11.0}/prereg/ws_cosci2.yaml +0 -0
  441. {pen_stack-6.10.4 → pen_stack-6.11.0}/prereg/ws_crit.yaml +0 -0
  442. {pen_stack-6.10.4 → pen_stack-6.11.0}/prereg/ws_ct.yaml +0 -0
  443. {pen_stack-6.10.4 → pen_stack-6.11.0}/prereg/ws_d.yaml +0 -0
  444. {pen_stack-6.10.4 → pen_stack-6.11.0}/prereg/ws_drift.yaml +0 -0
  445. {pen_stack-6.10.4 → pen_stack-6.11.0}/prereg/ws_e.yaml +0 -0
  446. {pen_stack-6.10.4 → pen_stack-6.11.0}/prereg/ws_env.yaml +0 -0
  447. {pen_stack-6.10.4 → pen_stack-6.11.0}/prereg/ws_ep.yaml +0 -0
  448. {pen_stack-6.10.4 → pen_stack-6.11.0}/prereg/ws_epitope.yaml +0 -0
  449. {pen_stack-6.10.4 → pen_stack-6.11.0}/prereg/ws_expr2.yaml +0 -0
  450. {pen_stack-6.10.4 → pen_stack-6.11.0}/prereg/ws_f.yaml +0 -0
  451. {pen_stack-6.10.4 → pen_stack-6.11.0}/prereg/ws_frontend.yaml +0 -0
  452. {pen_stack-6.10.4 → pen_stack-6.11.0}/prereg/ws_g.yaml +0 -0
  453. {pen_stack-6.10.4 → pen_stack-6.11.0}/prereg/ws_gen.yaml +0 -0
  454. {pen_stack-6.10.4 → pen_stack-6.11.0}/prereg/ws_genotox.yaml +0 -0
  455. {pen_stack-6.10.4 → pen_stack-6.11.0}/prereg/ws_graph.yaml +0 -0
  456. {pen_stack-6.10.4 → pen_stack-6.11.0}/prereg/ws_h.yaml +0 -0
  457. {pen_stack-6.10.4 → pen_stack-6.11.0}/prereg/ws_hybrid.yaml +0 -0
  458. {pen_stack-6.10.4 → pen_stack-6.11.0}/prereg/ws_immune.yaml +0 -0
  459. {pen_stack-6.10.4 → pen_stack-6.11.0}/prereg/ws_immune2.yaml +0 -0
  460. {pen_stack-6.10.4 → pen_stack-6.11.0}/prereg/ws_ingest.yaml +0 -0
  461. {pen_stack-6.10.4 → pen_stack-6.11.0}/prereg/ws_innate.yaml +0 -0
  462. {pen_stack-6.10.4 → pen_stack-6.11.0}/prereg/ws_loop.yaml +0 -0
  463. {pen_stack-6.10.4 → pen_stack-6.11.0}/prereg/ws_manifest.yaml +0 -0
  464. {pen_stack-6.10.4 → pen_stack-6.11.0}/prereg/ws_mc.yaml +0 -0
  465. {pen_stack-6.10.4 → pen_stack-6.11.0}/prereg/ws_mcp.yaml +0 -0
  466. {pen_stack-6.10.4 → pen_stack-6.11.0}/prereg/ws_mech.yaml +0 -0
  467. {pen_stack-6.10.4 → pen_stack-6.11.0}/prereg/ws_mon.yaml +0 -0
  468. {pen_stack-6.10.4 → pen_stack-6.11.0}/prereg/ws_o.yaml +0 -0
  469. {pen_stack-6.10.4 → pen_stack-6.11.0}/prereg/ws_offtarget.yaml +0 -0
  470. {pen_stack-6.10.4 → pen_stack-6.11.0}/prereg/ws_openapi.yaml +0 -0
  471. {pen_stack-6.10.4 → pen_stack-6.11.0}/prereg/ws_orch.yaml +0 -0
  472. {pen_stack-6.10.4 → pen_stack-6.11.0}/prereg/ws_outcome.yaml +0 -0
  473. {pen_stack-6.10.4 → pen_stack-6.11.0}/prereg/ws_pareto.yaml +0 -0
  474. {pen_stack-6.10.4 → pen_stack-6.11.0}/prereg/ws_peg.yaml +0 -0
  475. {pen_stack-6.10.4 → pen_stack-6.11.0}/prereg/ws_plan.yaml +0 -0
  476. {pen_stack-6.10.4 → pen_stack-6.11.0}/prereg/ws_policy.yaml +0 -0
  477. {pen_stack-6.10.4 → pen_stack-6.11.0}/prereg/ws_profile.yaml +0 -0
  478. {pen_stack-6.10.4 → pen_stack-6.11.0}/prereg/ws_proto.yaml +0 -0
  479. {pen_stack-6.10.4 → pen_stack-6.11.0}/prereg/ws_r.yaml +0 -0
  480. {pen_stack-6.10.4 → pen_stack-6.11.0}/prereg/ws_redteam.yaml +0 -0
  481. {pen_stack-6.10.4 → pen_stack-6.11.0}/prereg/ws_route.yaml +0 -0
  482. {pen_stack-6.10.4 → pen_stack-6.11.0}/prereg/ws_screen.yaml +0 -0
  483. {pen_stack-6.10.4 → pen_stack-6.11.0}/prereg/ws_seroprev.yaml +0 -0
  484. {pen_stack-6.10.4 → pen_stack-6.11.0}/prereg/ws_simlab.yaml +0 -0
  485. {pen_stack-6.10.4 → pen_stack-6.11.0}/prereg/ws_twincal.yaml +0 -0
  486. {pen_stack-6.10.4 → pen_stack-6.11.0}/prereg/ws_uq.yaml +0 -0
  487. {pen_stack-6.10.4 → pen_stack-6.11.0}/prereg/ws_v.yaml +0 -0
  488. {pen_stack-6.10.4 → pen_stack-6.11.0}/prereg/ws_vcell.yaml +0 -0
  489. {pen_stack-6.10.4 → pen_stack-6.11.0}/prereg/ws_writer.yaml +0 -0
  490. {pen_stack-6.10.4 → pen_stack-6.11.0}/prereg/ws_wv.yaml +0 -0
  491. {pen_stack-6.10.4 → pen_stack-6.11.0}/scripts/calibrate_immune_axes.py +0 -0
  492. {pen_stack-6.10.4 → pen_stack-6.11.0}/scripts/fetch_licensed_sources.py +0 -0
  493. {pen_stack-6.10.4 → pen_stack-6.11.0}/scripts/offtarget_chromatin_incremental.py +0 -0
  494. {pen_stack-6.10.4 → pen_stack-6.11.0}/scripts/offtarget_chromatin_matched.py +0 -0
  495. {pen_stack-6.10.4 → pen_stack-6.11.0}/scripts/offtarget_chromatin_validation.py +0 -0
  496. {pen_stack-6.10.4 → pen_stack-6.11.0}/scripts/p1_build_atlas.py +0 -0
  497. {pen_stack-6.10.4 → pen_stack-6.11.0}/scripts/p1_build_durability.py +0 -0
  498. {pen_stack-6.10.4 → pen_stack-6.11.0}/scripts/p1_build_position_effect.py +0 -0
  499. {pen_stack-6.10.4 → pen_stack-6.11.0}/scripts/p1_build_writer_eff.py +0 -0
  500. {pen_stack-6.10.4 → pen_stack-6.11.0}/scripts/p1_export_tracks.py +0 -0
  501. {pen_stack-6.10.4 → pen_stack-6.11.0}/scripts/p1_safety_concordance.py +0 -0
  502. {pen_stack-6.10.4 → pen_stack-6.11.0}/scripts/p1_train_safety.py +0 -0
  503. {pen_stack-6.10.4 → pen_stack-6.11.0}/scripts/p1_validation_report.py +0 -0
  504. {pen_stack-6.10.4 → pen_stack-6.11.0}/scripts/p2_build_atlas.py +0 -0
  505. {pen_stack-6.10.4 → pen_stack-6.11.0}/scripts/p3_benchmark_report.py +0 -0
  506. {pen_stack-6.10.4 → pen_stack-6.11.0}/scripts/p4_genome_scan.py +0 -0
  507. {pen_stack-6.10.4 → pen_stack-6.11.0}/scripts/p52_build_genotox_oracle.py +0 -0
  508. {pen_stack-6.10.4 → pen_stack-6.11.0}/scripts/p53_build_epitope_oracle.py +0 -0
  509. {pen_stack-6.10.4 → pen_stack-6.11.0}/scripts/ws_b_report.py +0 -0
  510. {pen_stack-6.10.4 → pen_stack-6.11.0}/scripts/ws_c_report.py +0 -0
  511. {pen_stack-6.10.4 → pen_stack-6.11.0}/setup.cfg +0 -0
@@ -3,6 +3,38 @@
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.11.0] - 2026-06-20 - WS-DELIVERY (PEN-DELIVER: cross-modality deliverability + learned capsid-fitness)
7
+
8
+ **Series III, Stage D.** Delivery moves from an 8-vehicle rule palette to a cross-modality recommender with a
9
+ **learned, benchmarked AAV capsid-fitness model**, a **grounded serotype→tissue tropism prior** from approved
10
+ therapies, and an **immune-coupled dose tradeoff** — without fabricating tropism. All datasets independently verified.
11
+
12
+ ### Added
13
+ - **Learned AAV capsid-fitness on FLIP-AAV** (`pen_stack/planner/delivery_predict.py`, `scripts/build_capsid_fitness.py`,
14
+ `benchmarks/delivery/`). Trained on the FLIP-AAV benchmark (Dallago 2021; Bryant 2021 packaging fitness,
15
+ `10.1038/s41587-020-00793-4`; Ogden 2019 `10.1126/science.aaw2900`). **Gate D-G1 PASSES** — beats a mutation-burden
16
+ baseline on **both** held-out splits: `sampled` Spearman **0.920 vs 0.522** (CI [0.387, 0.411]); `mut_des`
17
+ (mutant→designed) **0.814 vs 0.752** (CI [0.061, 0.064]). The 217 MB/split FLIP data stays on the VM; the derived
18
+ metrics + reproducible build script are committed. The ~3 MB model itself is gitignored — regenerated via
19
+ `scripts/build_capsid_fitness.py` and mounted into the deployed app (like `position_effect.pkl`); the axis abstains
20
+ gracefully when absent. Predicted fitness is a CANDIDATE for the measured packaging axis, NOT in-vivo tropism.
21
+ - **Serotype→tissue tropism priors** (`configs/aav_serotype_tropism.yaml`) from APPROVED AAV therapies (AAV9→CNS,
22
+ **AAVrh74→skeletal muscle** vs **AAVRh74var→liver** — different capsids, kept separate; AAV5→liver; AAV2→retina/
23
+ putamen via local injection). A grounded prior for an approved serotype; a known-unknown (abstain) for a novel
24
+ capsid. Casgevy/Lyfgenia carry no serotype prior (not-AAV controls).
25
+ - **Immune-coupled dose tradeoff** (`pen_stack/planner/delivery_immune.py`) — fuses deliverability with the Stage G
26
+ immune profile, surfaces dose↔immunogenicity per vehicle as a vector (`collapsed_score=None`, never fused).
27
+ - **Verify-gated generative capsids** (`pen_stack/design/capsid_generate.py`) — fitness-filtered VP1 variants, 🔵
28
+ candidates only; abstains without the model.
29
+ - **Surfaces:** REST `POST /delivery` + `POST /capsid_fitness` + `GET /delivery/tropism`, MCP `delivery_recommend`,
30
+ manifest `recommend_delivery` + `capsid_fitness`, a `capsid_fitness` scope card, a `delivery` Challenge task
31
+ (serotype→tissue), prereg `ws_delivery.yaml`.
32
+
33
+ ### Honest limits / deviations (see docs/DEVIATIONS_AND_DISCLOSURES.md)
34
+ - The capsid-fitness model is a one-hot gradient-boosting model, not a protein-LM (disclosed; passes the gate anyway;
35
+ protein-LM is the upgrade path). Capsid-fitness covers AAV only (VLP/LNP data is thinner). In-vivo human tropism is
36
+ a known-unknown except the approved-therapy priors; novel capsids abstain on tropism. alpha-retro-VLP is exploratory.
37
+
6
38
  ## [6.10.4] - 2026-06-20 - Chromatin incremental-value test (annotation, not a re-ranker) — chromatin work complete
7
39
 
8
40
  **PATCH — the final chromatin question, answered.** v6.10.3 validated accessibility as a moderate standalone
@@ -1,7 +1,7 @@
1
1
  cff-version: 1.2.0
2
2
  message: "If you use PEN-STACK, please cite it as below."
3
3
  title: "PEN-STACK: open infrastructure for genome writing"
4
- version: 6.10.4
4
+ version: 6.11.0
5
5
  date-released: 2026-06-20
6
6
  authors:
7
7
  - family-names: "Mahaboob Ali"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pen-stack
3
- Version: 6.10.4
3
+ Version: 6.11.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.10.4-blue.svg)](CHANGELOG.md)
93
+ [![Version](https://img.shields.io/badge/version-6.11.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,27 @@ 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.11 — PEN-DELIVER (cross-modality deliverability + learned capsid-fitness)
152
+
153
+ Delivery was an 8-vehicle rule palette that couldn't predict capsid fitness or tropism. v6.11 makes it a
154
+ cross-modality recommender with a **learned, benchmarked AAV capsid-fitness model** and a **grounded serotype→tissue
155
+ tropism prior** — without ever fabricating tropism.
156
+
157
+ - **Learned capsid-fitness on FLIP-AAV** (Dallago 2021; Bryant 2021). The model **beats a mutation-burden baseline on
158
+ both held-out splits** — `sampled` Spearman **0.92 vs 0.52**, and the hard mutant→designed `mut_des` split
159
+ **0.81 vs 0.75** (per-split bootstrap CI excludes 0). The 217 MB FLIP data stays on the VM; the derived metrics +
160
+ reproducible build script are committed and the ~3 MB model is gitignored (regenerated via
161
+ `scripts/build_capsid_fitness.py` and mounted into the deployed app, like `position_effect.pkl`; the axis abstains
162
+ when absent). Predicted fitness is a **candidate** for the *measured packaging axis* — not an in-vivo tropism claim.
163
+ - **Grounded serotype→tissue priors** from approved AAV therapies (AAV9→CNS, AAVrh74→skeletal muscle, AAV5→liver,
164
+ AAV2→retina/putamen via local injection) — and an honest **known-unknown (abstain)** for a novel capsid. The
165
+ AAVrh74 (muscle) vs AAVRh74var (liver) distinction is kept; ex-vivo therapies carry no serotype prior.
166
+ - **Immune-coupled dose tradeoff** — fuses deliverability with the Stage G immune profile and surfaces the
167
+ dose↔immunogenicity tension per vehicle as a vector, **never collapsed**.
168
+ - **Verify-gated generative capsids** (🔵 candidates), and surfaces: REST, MCP `delivery_recommend`, a `delivery`
169
+ Challenge task. *(Plan deviations — e.g. one-hot model vs a protein-LM — are disclosed in
170
+ [docs/DEVIATIONS_AND_DISCLOSURES.md](docs/DEVIATIONS_AND_DISCLOSURES.md).)*
171
+
151
172
  ## What is new in v6.10 — PEN-OFFTGT (cross-writer-family off-target nomination)
152
173
 
153
174
  Off-target prediction was a single-family bridge pseudosite scan that abstained for nucleases and integrases.
@@ -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.10.4-blue.svg)](CHANGELOG.md)
18
+ [![Version](https://img.shields.io/badge/version-6.11.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,27 @@ 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.11 — PEN-DELIVER (cross-modality deliverability + learned capsid-fitness)
77
+
78
+ Delivery was an 8-vehicle rule palette that couldn't predict capsid fitness or tropism. v6.11 makes it a
79
+ cross-modality recommender with a **learned, benchmarked AAV capsid-fitness model** and a **grounded serotype→tissue
80
+ tropism prior** — without ever fabricating tropism.
81
+
82
+ - **Learned capsid-fitness on FLIP-AAV** (Dallago 2021; Bryant 2021). The model **beats a mutation-burden baseline on
83
+ both held-out splits** — `sampled` Spearman **0.92 vs 0.52**, and the hard mutant→designed `mut_des` split
84
+ **0.81 vs 0.75** (per-split bootstrap CI excludes 0). The 217 MB FLIP data stays on the VM; the derived metrics +
85
+ reproducible build script are committed and the ~3 MB model is gitignored (regenerated via
86
+ `scripts/build_capsid_fitness.py` and mounted into the deployed app, like `position_effect.pkl`; the axis abstains
87
+ when absent). Predicted fitness is a **candidate** for the *measured packaging axis* — not an in-vivo tropism claim.
88
+ - **Grounded serotype→tissue priors** from approved AAV therapies (AAV9→CNS, AAVrh74→skeletal muscle, AAV5→liver,
89
+ AAV2→retina/putamen via local injection) — and an honest **known-unknown (abstain)** for a novel capsid. The
90
+ AAVrh74 (muscle) vs AAVRh74var (liver) distinction is kept; ex-vivo therapies carry no serotype prior.
91
+ - **Immune-coupled dose tradeoff** — fuses deliverability with the Stage G immune profile and surfaces the
92
+ dose↔immunogenicity tension per vehicle as a vector, **never collapsed**.
93
+ - **Verify-gated generative capsids** (🔵 candidates), and surfaces: REST, MCP `delivery_recommend`, a `delivery`
94
+ Challenge task. *(Plan deviations — e.g. one-hot model vs a protein-LM — are disclosed in
95
+ [docs/DEVIATIONS_AND_DISCLOSURES.md](docs/DEVIATIONS_AND_DISCLOSURES.md).)*
96
+
76
97
  ## What is new in v6.10 — PEN-OFFTGT (cross-writer-family off-target nomination)
77
98
 
78
99
  Off-target prediction was a single-family bridge pseudosite scan that abstained for nucleases and integrases.
@@ -0,0 +1,2 @@
1
+ 0384951e5158a1382f76a2264a486c5fb401729d5f6d87a8ac44776839e0fc50 split.json
2
+ 91041bd15e899d194e43070849d501a1b0efb4f9dff568587b03505ca0e96d3c capsid_fitness_metrics.json
@@ -0,0 +1,81 @@
1
+ # PEN-STACK v6.11 — AAV serotype -> tissue tropism PRIORS, grounded in APPROVED gene therapies (D-WS1).
2
+ # Each prior is a DOCUMENTED, real serotype->tissue mapping evidenced by an FDA/EMA-approved product (the
3
+ # authoritative source for "this capsid delivers to this tissue in humans"). Independently verified 2026-06-20.
4
+ #
5
+ # HONEST SCOPE: these are population-level PRIORS for the listed serotypes, strongest for the approved route.
6
+ # - AAV2 tropism is ROUTE-DEPENDENT (retina via subretinal; CNS-putamen via intraputaminal) — local injection, not
7
+ # intrinsic systemic tropism. `route` is a covariate, not ignorable.
8
+ # - AAVrh74 (Elevidys, skeletal muscle) and AAVRh74var (Beqvez, liver) are DIFFERENT capsids with DIFFERENT tropism —
9
+ # never collapsed into one "Rh74" prior.
10
+ # - Ex-vivo cell therapies (Casgevy = non-viral CRISPR RNP; Lyfgenia = lentiviral) are NOT AAV and carry NO
11
+ # serotype->tissue prior (listed only as not-AAV controls).
12
+ # - For a NOVEL / engineered capsid with no approved precedent, in-vivo human tropism is a known-unknown (⛔) — the
13
+ # recommender abstains on the tropism prior and never fabricates a tissue.
14
+
15
+ version: "1.0"
16
+
17
+ serotypes:
18
+ AAV9:
19
+ tissue: ["CNS", "motor_neuron"]
20
+ route: "systemic IV (blood-brain-barrier-crossing)"
21
+ example_product: "Zolgensma (onasemnogene abeparvovec)"
22
+ indication: "spinal muscular atrophy"
23
+ approval: "FDA 2019"
24
+ source: "FDA/Novartis PI; DailyMed setid 68cd4f06-70e1-40d8-bedb-609ec0afa471"
25
+ doi: "10.1056/NEJMoa1706198" # Mendell et al. NEJM 2017 (AVXS-101 phase 1)
26
+ confidence: grounded
27
+ AAVrh74:
28
+ tissue: ["skeletal_muscle", "cardiac_muscle"]
29
+ route: "systemic IV"
30
+ note: "capsid serotype rh74; AAV2-derived ITRs"
31
+ example_product: "Elevidys (delandistrogene moxeparvovec)"
32
+ indication: "Duchenne muscular dystrophy"
33
+ approval: "FDA 2023"
34
+ source: "FDA PI; DailyMed setid 3525abcd-fbd2-46c5-9706-cffdf2e8a361"
35
+ confidence: grounded
36
+ AAV5:
37
+ tissue: ["liver"]
38
+ route: "systemic IV"
39
+ example_product: "Hemgenix (etranacogene dezaparvovec); Roctavian (valoctocogene roxaparvovec)"
40
+ indication: "hemophilia B; hemophilia A"
41
+ approval: "FDA 2022 / 2023"
42
+ source: "FDA Hemgenix + Roctavian product pages"
43
+ doi: "10.1056/NEJMoa2211644" # Pipe et al. NEJM 2023 (HOPE-B, etranacogene)
44
+ confidence: grounded
45
+ AAVRh74var:
46
+ tissue: ["liver"]
47
+ route: "systemic IV"
48
+ note: "an ENGINEERED Rh74 VARIANT capsid — distinct from wild-type AAVrh74 (which is muscle-tropic)"
49
+ example_product: "Beqvez (fidanacogene elaparvovec)"
50
+ indication: "hemophilia B"
51
+ approval: "FDA 2024"
52
+ source: "FDA Beqvez PI"
53
+ confidence: grounded
54
+ AAV2:
55
+ tissue: ["retina", "CNS_putamen"]
56
+ route: "LOCAL injection only (subretinal for retina; intraputaminal for CNS) — route-dependent, NOT systemic"
57
+ example_product: "Luxturna (voretigene neparvovec, retina); Upstaza/Kebilidi (eladocagene exuparvovec, putamen)"
58
+ indication: "RPE65 inherited retinal dystrophy; AADC deficiency"
59
+ approval: "FDA 2017 (Luxturna); EMA 2022 / FDA 2024 (Upstaza/Kebilidi)"
60
+ source: "FDA Luxturna; EMA Upstaza EPAR"
61
+ doi: "10.1016/S0140-6736(17)31868-8" # Russell et al. Lancet 2017 (voretigene phase 3)
62
+ confidence: grounded
63
+
64
+ # NOT AAV — no serotype->tissue prior (ex-vivo cell therapies; tissue targeting comes from HSC selection +
65
+ # autologous transplant + conditioning, NOT capsid tropism). Listed only as not-AAV controls.
66
+ not_aav_controls:
67
+ Casgevy:
68
+ modality: "ex-vivo CRISPR/Cas9 RNP, non-viral electroporation of CD34+ HSCs"
69
+ serotype_prior: none
70
+ approval: "FDA 2023"
71
+ Lyfgenia:
72
+ modality: "ex-vivo lentiviral (BB305 LVV) modified CD34+ HSCs"
73
+ serotype_prior: none
74
+ approval: "FDA 2023"
75
+
76
+ modeling_notes:
77
+ - "route is a covariate: AAV2's retina/putamen tropism is via LOCAL injection, not systemic IV"
78
+ - "AAVrh74 (muscle) vs AAVRh74var (liver) are separate capsids — never merge"
79
+ - "AAV5 -> liver is the strongest systemic-IV prior (two independent approved products)"
80
+ - "novel/engineered capsid with no approved precedent -> in-vivo human tropism is a known-unknown (abstain)"
81
+ provenance_dois: ["10.1056/NEJMoa1706198", "10.1056/NEJMoa2211644", "10.1016/S0140-6736(17)31868-8"]
@@ -139,6 +139,22 @@ oracles:
139
139
  generalizes_to_unseen_loci: false
140
140
  license: "open (this work; MHCflurry 10.1016/j.cels.2020.06.010, HLA-I supertypes 10.1186/1471-2172-9-1)"
141
141
 
142
+ capsid_fitness: # v6.11 WS-DELIVERY: learned AAV capsid packaging-fitness + serotype tropism priors
143
+ family: protein_design
144
+ version: "flip-aav-gbr-2026"
145
+ output_kind: baseline # scores/ranks capsid variants + tissue priors, not generative
146
+ valid_for: "RELATIVE AAV capsid PACKAGING-FITNESS prediction for VP1 variants (learned on FLIP-AAV / Bryant
147
+ 2021; beats a mutation-burden baseline on held-out splits incl. mutant->designed); and GROUNDED serotype->
148
+ tissue tropism PRIORS from approved AAV gene therapies (AAV9->CNS, AAVrh74->skeletal muscle, AAV5->liver,
149
+ AAV2->retina/putamen via local injection)"
150
+ not_valid_for: "IN-VIVO HUMAN TROPISM of a capsid (the measured axis is packaging viability/assembly, not in-vivo
151
+ tissue targeting — a known-unknown except the approved-therapy priors); a NOVEL/engineered capsid's tissue
152
+ (abstains, never fabricated); manufacturing/CMC; immunogenicity magnitude (Stage G; a known-unknown);
153
+ VLP/LNP capsid-fitness (no equivalent learned model — thinner data)"
154
+ generalizes_to_unseen_loci: false
155
+ license: "open (this work; FLIP-AAV 10.1101/2021.11.09.467890, Bryant 2021 10.1038/s41587-020-00793-4,
156
+ Ogden 2019 10.1126/science.aaw2900; serotype priors from approved-therapy FDA approvals)"
157
+
142
158
  offtarget_nomination: # v6.10 WS-OFFTARGET: cross-family off-target NOMINATION (not clearance)
143
159
  family: genome
144
160
  version: "crisot+homology-2026"
@@ -23,6 +23,17 @@ applicable (e.g. single contributor).
23
23
  | "≥1 external use" (success criterion) | **DISCLOSED** | Forward-looking; not yet met (no external submission). The surfaces (REST/MCP/manifest/web) exist to enable it. |
24
24
  | HIDE-seq / Cryptic-seq integrase **data** | **DISCLOSED** | Validated + cited, **not used as data** (single-company Bxb1-centric preprint; bridge off-target is unmodeled). Used only to ground the assay recommender. |
25
25
 
26
+ ## v6.11 — PEN-DELIVER (Stage D, delivery)
27
+
28
+ | Item | Status | Detail |
29
+ |---|---|---|
30
+ | Capsid-fitness model: plan named a "protein-LM" | **DISCLOSED** | Shipped a **windowed one-hot gradient-boosting** model (CPU, reproducible, ~3 MB), not a protein language model. It still **passes D-G1** (beats the mutation-burden baseline on both FLIP-AAV splits, CI excludes 0). A protein-LM (Wu et al. 2025, `10.1089/hum.2024.227`, reported r≈0.82) is the upgrade path — deferred. |
31
+ | Capsid-fitness covers **AAV only** | **DISCLOSED** | No learned fitness model for VLP/LNP capsids — the public data is far thinner than AAV (per the dataset validation). VLP/LNP are ranked by the documented rule palette only; the recommender does not over-rank low-N modalities. |
32
+ | FLIP-AAV: used `sampled` + `mut_des`; multi-trait (Eid 2024) not used | **DISCLOSED** | The bench uses the two most informative FLIP-AAV splits (in-distribution + the hard mutant→designed generalization). The other FLIP splits and the multi-trait Eid 2024 / Fit4Function data (tropism/manufacturability) are a documented extension, not used. |
33
+ | alpha-retro-VLP | **DISCLOSED** | Not added as a grounded palette entry — its strongest in-vivo evidence is a **2025 conference abstract** (grey literature), the peer-reviewed anchor (Baron 2022) is ex-vivo. Flagged exploratory, not fabricated. |
34
+ | In-vivo human tropism | **HONEST KNOWN-UNKNOWN** | Predicted capsid-fitness is for the **measured packaging axis**; in-vivo human tissue tropism is a known-unknown except the approved-therapy serotype priors. The recommender abstains on tropism for novel capsids — never fabricates a tissue. |
35
+ | Model artifact (`models/capsid_fitness.pkl`, ~3 MB) **not committed to git** | **DISCLOSED** | The trained `.pkl` is **gitignored** (the `position_effect.pkl` pattern) — the **derived Delivery-Bench metrics + the reproducible build script** (`scripts/build_capsid_fitness.py`) are committed instead, and the model is **regenerated from FLIP-AAV on the VM and mounted into the deployed app**. CI stays lean and license-clean; the capsid-fitness axis **abstains gracefully** when the model file is absent (no fabricated scores). |
36
+
26
37
  ## v6.9 — PEN-IMMUNE (Stage G) — *audited retroactively, corrected in v6.10.1*
27
38
 
28
39
  | Item | Status | Detail |
@@ -0,0 +1,54 @@
1
+ # Stage D — the deliverability engine (v6.11 PEN-DELIVER)
2
+
3
+ Stage D upgrades delivery from an 8-vehicle **rule palette** to a cross-modality recommender with a **learned,
4
+ benchmarked AAV capsid-fitness model**, a **grounded serotype→tissue tropism prior** from approved therapies, and an
5
+ **immune-coupled dose tradeoff** — without ever fabricating tropism.
6
+
7
+ ## Learned capsid-fitness (`planner/delivery_predict.capsid_fitness`)
8
+
9
+ A model trained on the **FLIP-AAV** benchmark (Dallago et al. 2021; built on **Bryant et al. 2021** packaging
10
+ fitness, `10.1038/s41587-020-00793-4`; **Ogden et al. 2019** is the foundational landscape, `10.1126/science.aaw2900`).
11
+ A windowed one-hot gradient-boosting model over the mutagenized VP1 561–588 region. **Gate D-G1 PASSES** — it beats a
12
+ mutation-burden baseline on held-out FLIP-AAV on **both** splits (`benchmarks/delivery/`):
13
+
14
+ | Split | learned Spearman | baseline | gap 95% CI |
15
+ |---|---|---|---|
16
+ | `sampled` (random 80/20, in-distribution) | **0.920** | 0.522 | [0.387, 0.411] |
17
+ | `mut_des` (mutant→designed, hard generalization) | **0.814** | 0.752 | [0.061, 0.064] |
18
+
19
+ The licensed FLIP-AAV data (217 MB/split) stays on the VM; the **derived metrics + reproducible build script**
20
+ (`scripts/build_capsid_fitness.py`) are committed. The trained model (`models/capsid_fitness.pkl`, ~3 MB) is
21
+ **gitignored** — regenerated from the build script and **mounted into the deployed app** (the `position_effect.pkl`
22
+ pattern), so CI stays lean and the axis **abstains gracefully** when the model is absent. **Honest scope:** predicted
23
+ fitness is a **candidate** for the *measured* packaging axis — it is **not** an in-vivo human-tropism claim (a
24
+ known-unknown).
25
+
26
+ ## Serotype → tissue tropism priors (`configs/aav_serotype_tropism.yaml`)
27
+
28
+ Real serotype↔tissue mappings evidenced by **approved AAV gene therapies** (independently verified): AAV9→CNS
29
+ (Zolgensma), **AAVrh74→skeletal muscle** (Elevidys), AAV5→liver (Hemgenix/Roctavian), **AAVRh74var→liver** (Beqvez —
30
+ a *different* capsid from AAVrh74), AAV2→retina/putamen via **local injection** (Luxturna/Upstaza). A grounded prior
31
+ for an approved serotype; a **known-unknown (abstain)** for a novel/engineered capsid — never a fabricated tissue.
32
+ Ex-vivo cell therapies (Casgevy = non-viral CRISPR; Lyfgenia = lentiviral) carry **no** serotype prior.
33
+
34
+ ## Immune-coupled tradeoff (`planner/delivery_immune.delivery_immune_tradeoff`)
35
+
36
+ Fuses deliverability with the **Stage G** per-axis immune profile and surfaces the **dose↔immunogenicity tradeoff**
37
+ per vehicle as a vector — `collapsed_score` is always `None`. The realized in-vivo magnitude / patient titer are
38
+ declared known-unknowns; this is decision-support, not a clinical dosing directive.
39
+
40
+ ## Generative candidates (`design/capsid_generate.generate_capsid_candidates`)
41
+
42
+ Verifier-as-discriminator (v5.8): propose VP1-region variants, score with the learned capsid-fitness, keep survivors
43
+ above the WT fitness. Every survivor is a **🔵 candidate** — packaging fitness only; assembly, in-vivo tropism, and
44
+ immunogenicity are not claimed. Abstains when the model is absent (no fabricated capsids).
45
+
46
+ ## Surfaces
47
+ REST `POST /delivery` + `POST /capsid_fitness` + `GET /delivery/tropism`, MCP `delivery_recommend`, manifest
48
+ `recommend_delivery` + `capsid_fitness`, the `capsid_fitness` scope card, and a `delivery` task in the
49
+ Genome-Writing Challenge (serotype→tissue, label = approved-therapy registry).
50
+
51
+ ## Honest limits
52
+ Predicted capsid-fitness is strongest for the **measured** packaging axis and extrapolative for in-vivo human tissue
53
+ (⛔). VLP/LNP coverage is thinner than AAV (alpha-retro-VLP is exploratory — its strongest in-vivo evidence is a
54
+ conference abstract). Manufacturing/CMC is out of scope. See `docs/DEVIATIONS_AND_DISCLOSURES.md` for plan deviations.
@@ -1,2 +1,2 @@
1
1
  """PEN-STACK v3.0 - open infrastructure for genome writing."""
2
- __version__ = "6.10.4"
2
+ __version__ = "6.11.0"
@@ -52,6 +52,16 @@ def curated_dois() -> frozenset[str]:
52
52
  dois.add(_rec["doi"])
53
53
  except Exception: # noqa: BLE001
54
54
  pass
55
+ # v6.11 delivery provenance (FLIP-AAV capsid-fitness + approved-therapy serotype->tissue priors)
56
+ try:
57
+ trop = yaml.safe_load(resource("configs/aav_serotype_tropism.yaml").read_text(encoding="utf-8")) or {}
58
+ dois.update(trop.get("provenance_dois", []) or [])
59
+ for _rec in (trop.get("serotypes") or {}).values():
60
+ if _rec.get("doi"):
61
+ dois.add(_rec["doi"])
62
+ dois.update(["10.1101/2021.11.09.467890", "10.1038/s41587-020-00793-4", "10.1126/science.aaw2900"])
63
+ except Exception: # noqa: BLE001
64
+ pass
55
65
  # v5.5 anti-vector seroprevalence provenance (serosurveys)
56
66
  try:
57
67
  sp = yaml.safe_load(resource("configs/seroprevalence.yaml").read_text(encoding="utf-8"))
@@ -103,6 +103,16 @@ def offtarget_scan(writer_family: str, guide: str | None = None, candidate_sites
103
103
  sequence=sequence, assay=assay)
104
104
 
105
105
 
106
+ @mcp.tool()
107
+ def delivery_recommend(cargo_form: str, cargo_bp: int | None = None, target_tissue: str | None = None,
108
+ safety_weight: float = 0.5, in_vivo: bool | None = None) -> dict:
109
+ """v6.11 PEN-DELIVER cross-modality delivery recommender: rank vehicles by cargo-form + safety<->efficacy + a
110
+ GROUNDED serotype->tissue tropism prior (from approved AAV therapies; a known-unknown for novel capsids), plus
111
+ the learned FLIP-AAV capsid-fitness capability. Never fabricates tropism; abstains without inputs."""
112
+ from pen_stack.planner.delivery_predict import recommend_delivery_plus
113
+ return recommend_delivery_plus(cargo_form, cargo_bp, target_tissue, safety_weight=safety_weight, in_vivo=in_vivo)
114
+
115
+
106
116
  @mcp.tool()
107
117
  def generate_designs(goal: dict | None = None, candidates: list | None = None, keep: int = 25) -> dict:
108
118
  """v5.8 generative designer (verifier-as-discriminator): hazardous/illegal candidates are DISCARDED;
@@ -52,6 +52,17 @@ _TOOLS = [
52
52
  "input": "writer family + guide/candidate sites (nuclease) or locus sequence (integrase)",
53
53
  "output": "ranked off-target candidates + calibrated risk + recommended validation assay",
54
54
  "entrypoint": "pen_stack.wgenome.offtarget_predict.nominate_offtargets", "fabricates": False},
55
+ {"name": "recommend_delivery", "summary": "cross-modality delivery recommender: rank vehicles by cargo-form + "
56
+ "safety<->efficacy + a grounded serotype->tissue tropism prior (approved therapies) + the learned FLIP-AAV "
57
+ "capsid-fitness capability; tropism is a known-unknown for novel capsids (v6.11 PEN-DELIVER)",
58
+ "input": "cargo form/size + target tissue (+ safety weight, in/ex-vivo)",
59
+ "output": "ranked vehicles + serotype tropism prior + capsid-fitness bench; never fabricates tropism",
60
+ "entrypoint": "pen_stack.planner.delivery_predict.recommend_delivery_plus", "fabricates": False},
61
+ {"name": "capsid_fitness", "summary": "learned AAV capsid packaging-fitness for a VP1 sequence (FLIP-AAV-"
62
+ "trained; beats a mutation-burden baseline on held-out splits); a CANDIDATE for the measured packaging axis, "
63
+ "NOT an in-vivo tropism claim (v6.11 PEN-DELIVER)",
64
+ "input": "AAV VP1 capsid amino-acid sequence", "output": "predicted packaging-fitness (candidate) or abstain",
65
+ "entrypoint": "pen_stack.planner.delivery_predict.capsid_fitness", "fabricates": False},
55
66
  ]
56
67
 
57
68
  _POLICY = ("outputs outside scope are returned as `out_of_scope` (known-unknown) or `extrapolating` (OOD) and are "
@@ -0,0 +1,62 @@
1
+ """Verify-gated generative AAV capsid candidates (v6.11 PEN-DELIVER, D-WS3).
2
+
3
+ Proposes engineered AAV capsid variants in the mutagenized VP1 region, scores them with the learned FLIP-AAV
4
+ capsid-fitness model, and keeps only candidates above a fitness threshold — the verifier-as-discriminator pattern
5
+ (v5.8): GENERATE proposes, the fitness model + biosecurity context DISPOSE. Every survivor is a CANDIDATE (🔵),
6
+ never asserted to assemble or to have any in-vivo tropism. Abstains when the fitness model is not present (no
7
+ fabricated capsids).
8
+
9
+ Honest: a generated capsid's predicted fitness is for the MEASURED packaging axis only; assembly, in-vivo tropism,
10
+ and immunogenicity are not claimed (the latter routes through Stage G). This is a design proposer, not a validation.
11
+ """
12
+ from __future__ import annotations
13
+
14
+ _AAS = "ACDEFGHIKLMNPQRSTVWY"
15
+
16
+
17
+ def _mutate(seq: str, region: tuple[int, int], n_mut: int, rng) -> str:
18
+ s = list(seq)
19
+ lo, hi = region
20
+ positions = rng.sample(range(lo, min(hi, len(s))), min(n_mut, max(0, min(hi, len(s)) - lo)))
21
+ for p in positions:
22
+ s[p] = _AAS[rng.randrange(len(_AAS))]
23
+ return "".join(s)
24
+
25
+
26
+ def generate_capsid_candidates(wt_vp1: str, n: int = 200, max_mut: int = 4, fitness_threshold: float | None = None,
27
+ seed: int = 7, top: int = 20) -> dict:
28
+ """Propose AAV capsid variants (random substitutions in the VP1 555-595 mutagenized window), score with the
29
+ learned capsid-fitness model, and return the top survivors above ``fitness_threshold`` (defaults to the WT's
30
+ predicted fitness). Candidates are flagged 🔵; abstains when the fitness model is absent — never fabricates."""
31
+ import random
32
+ from pen_stack.planner.delivery_predict import capsid_fitness
33
+ wt = capsid_fitness(wt_vp1)
34
+ if not wt.get("available"):
35
+ return {"available": False, "abstain": True, "candidates": [], "output_kind": "candidate",
36
+ "note": "capsid-fitness model not present -> cannot score generated capsids; no fabrication.",
37
+ "bench": wt.get("bench")}
38
+ rng = random.Random(seed)
39
+ thr = fitness_threshold if fitness_threshold is not None else wt["predicted_fitness"]
40
+ region = (555, 595)
41
+ seen = set()
42
+ scored = []
43
+ for _ in range(max(1, n)):
44
+ nm = rng.randint(1, max_mut)
45
+ cand = _mutate(wt_vp1, region, nm, rng)
46
+ if cand == wt_vp1 or cand in seen:
47
+ continue
48
+ seen.add(cand)
49
+ f = capsid_fitness(cand)["predicted_fitness"]
50
+ scored.append({"vp1_window": cand[region[0]:region[1]], "predicted_fitness": f,
51
+ "n_mut_in_region": sum(1 for a, b in zip(cand[region[0]:region[1]],
52
+ wt_vp1[region[0]:region[1]]) if a != b),
53
+ "passes_threshold": bool(f >= thr), "output_kind": "candidate"})
54
+ survivors = sorted([c for c in scored if c["passes_threshold"]],
55
+ key=lambda c: c["predicted_fitness"], reverse=True)[:top]
56
+ return {"available": True, "abstain": False, "wt_predicted_fitness": wt["predicted_fitness"],
57
+ "fitness_threshold": round(float(thr), 4), "n_proposed": len(scored), "n_survivors": len(survivors),
58
+ "candidates": survivors, "output_kind": "candidate",
59
+ "verifier": "learned FLIP-AAV capsid-fitness (verifier-as-discriminator, v5.8); fitness >= WT kept",
60
+ "honesty": "🔵 CANDIDATES — predicted packaging fitness only; assembly, in-vivo tropism, and "
61
+ "immunogenicity are NOT claimed (immunogenicity routes through Stage G). A design proposer, "
62
+ "not a validation. Run a biosecurity/verify() gate before any synthesis."}
@@ -0,0 +1,60 @@
1
+ """Immune-coupled delivery selection (v6.11 PEN-DELIVER, D-WS4).
2
+
3
+ Fuses the cross-modality deliverability recommendation (Stage D) with the per-axis immune-risk profile (Stage G) and
4
+ surfaces the **dose <-> immunogenicity tradeoff** as a VECTOR — never collapsed into one number. The point: a vehicle
5
+ that is most deliverable may carry the highest immune liability (e.g. AAV: efficient in vivo, but pre-existing NAbs +
6
+ capsid CD8 + dose-dependent innate sensing), and that tension must be visible, not hidden.
7
+
8
+ Honest: the immune axes are population-level proxies (Stage G); the realized in-vivo magnitude / patient titer is a
9
+ declared known-unknown. The dose<->immune tradeoff is informative, NOT a clinical dosing directive.
10
+ """
11
+ from __future__ import annotations
12
+
13
+
14
+ def _highest_risk_axis(design: dict) -> dict | None:
15
+ """The in-scope immune axis with the LOWEST score (= highest risk) from the Stage G profile, with its value."""
16
+ from pen_stack.planner.immune_profile import immune_profile
17
+ axes = immune_profile(dict(design)).get("axes", {})
18
+ in_scope = {k: a for k, a in axes.items() if a.get("in_scope") and a.get("value") is not None}
19
+ if not in_scope:
20
+ return None
21
+ k = min(in_scope, key=lambda x: in_scope[x]["value"])
22
+ return {"axis": k, "score": in_scope[k]["value"], "note": in_scope[k].get("note")}
23
+
24
+
25
+ def delivery_immune_tradeoff(cargo_form: str, cargo_bp: int | None = None, target_tissue: str | None = None,
26
+ *, writer_family: str | None = None, serotype: str | None = None,
27
+ safety_weight: float = 0.5, in_vivo: bool | None = None) -> dict:
28
+ """Rank deliverability AND attach each vehicle's Stage G immune profile, surfacing the dose<->immune tradeoff per
29
+ vehicle as a vector. Never collapses deliverability and immunogenicity into one score."""
30
+ from pen_stack.planner.delivery_predict import recommend_delivery_plus
31
+ rec = recommend_delivery_plus(cargo_form, cargo_bp, target_tissue, safety_weight=safety_weight, in_vivo=in_vivo)
32
+ coupled = []
33
+ for prof in rec.get("ranked", []) or rec.get("eligible", []) or []:
34
+ veh = prof.get("vehicle") or prof.get("name")
35
+ if not veh:
36
+ continue
37
+ design = {"delivery_vehicle": veh, "serotype": serotype, "writer_family": writer_family}
38
+ risk = _highest_risk_axis(design)
39
+ coupled.append({
40
+ "vehicle": veh,
41
+ "deliverability_balance": prof.get("balance"),
42
+ "efficacy_score": prof.get("efficacy_score"),
43
+ "immune_highest_risk_axis": risk, # the dominant immune liability (Stage G)
44
+ "tradeoff": (f"deliverability {prof.get('balance')} vs dominant immune liability "
45
+ f"'{risk['axis']}' (score {risk['score']})" if risk else
46
+ "deliverability ranked; immune axes abstain for this vehicle"),
47
+ })
48
+ return {
49
+ "cargo_form": cargo_form, "cargo_bp": cargo_bp, "target_tissue": target_tissue,
50
+ "serotype_tropism_prior": rec.get("serotype_tropism_prior"),
51
+ "coupled": coupled,
52
+ "collapsed_score": None, # deliberately None — dose<->immune is a vector, NEVER fused
53
+ "dose_immune_note": ("AAV/viral vehicles are efficient in vivo but carry the highest immune liability "
54
+ "(pre-existing NAbs, capsid CD8, dose-dependent innate sensing); higher dose raises both "
55
+ "transduction AND immunogenicity. The tradeoff is surfaced per vehicle, never collapsed."),
56
+ "known_unknowns": ["in_vivo_immunogenicity_magnitude", "patient_specific_titer", "realized_dose_response"],
57
+ "honesty": "immune axes are population-level proxies (Stage G); realized magnitude/titer is a known-unknown; "
58
+ "this is decision-support, NOT a clinical dosing directive. No collapsed score.",
59
+ "no_fabrication": True,
60
+ }