pen-stack 7.1.6__tar.gz → 7.1.8__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 (567) hide show
  1. {pen_stack-7.1.6 → pen_stack-7.1.8}/CHANGELOG.md +48 -0
  2. {pen_stack-7.1.6 → pen_stack-7.1.8}/CITATION.cff +1 -1
  3. {pen_stack-7.1.6 → pen_stack-7.1.8}/PKG-INFO +1 -1
  4. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/__init__.py +1 -1
  5. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/planner/immune_profile.py +83 -0
  6. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/server/api.py +16 -0
  7. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack.egg-info/PKG-INFO +1 -1
  8. {pen_stack-7.1.6 → pen_stack-7.1.8}/pyproject.toml +1 -1
  9. {pen_stack-7.1.6 → pen_stack-7.1.8}/LICENSE +0 -0
  10. {pen_stack-7.1.6 → pen_stack-7.1.8}/MANIFEST.in +0 -0
  11. {pen_stack-7.1.6 → pen_stack-7.1.8}/README.md +0 -0
  12. {pen_stack-7.1.6 → pen_stack-7.1.8}/bench/run.py +0 -0
  13. {pen_stack-7.1.6 → pen_stack-7.1.8}/benchmarks/chat_grounding/README.md +0 -0
  14. {pen_stack-7.1.6 → pen_stack-7.1.8}/benchmarks/chat_grounding/SHA256SUMS +0 -0
  15. {pen_stack-7.1.6 → pen_stack-7.1.8}/benchmarks/chat_headtohead/README.md +0 -0
  16. {pen_stack-7.1.6 → pen_stack-7.1.8}/benchmarks/chat_routing/README.md +0 -0
  17. {pen_stack-7.1.6 → pen_stack-7.1.8}/benchmarks/chat_routing/SHA256SUMS +0 -0
  18. {pen_stack-7.1.6 → pen_stack-7.1.8}/benchmarks/chat_safety/README.md +0 -0
  19. {pen_stack-7.1.6 → pen_stack-7.1.8}/benchmarks/chat_safety/SHA256SUMS +0 -0
  20. {pen_stack-7.1.6 → pen_stack-7.1.8}/benchmarks/delivery/SHA256SUMS +0 -0
  21. {pen_stack-7.1.6 → pen_stack-7.1.8}/benchmarks/genome_writing_bench/LEADERBOARD.md +0 -0
  22. {pen_stack-7.1.6 → pen_stack-7.1.8}/benchmarks/genome_writing_bench/README.md +0 -0
  23. {pen_stack-7.1.6 → pen_stack-7.1.8}/benchmarks/genome_writing_bench/SHA256SUMS +0 -0
  24. {pen_stack-7.1.6 → pen_stack-7.1.8}/benchmarks/genome_writing_bench/SUBMISSIONS.md +0 -0
  25. {pen_stack-7.1.6 → pen_stack-7.1.8}/benchmarks/genome_writing_bench/tasks.yaml +0 -0
  26. {pen_stack-7.1.6 → pen_stack-7.1.8}/benchmarks/genome_writing_challenge/README.md +0 -0
  27. {pen_stack-7.1.6 → pen_stack-7.1.8}/benchmarks/genome_writing_challenge/SUBMISSIONS.md +0 -0
  28. {pen_stack-7.1.6 → pen_stack-7.1.8}/benchmarks/loop/SHA256SUMS +0 -0
  29. {pen_stack-7.1.6 → pen_stack-7.1.8}/benchmarks/offtarget/SHA256SUMS +0 -0
  30. {pen_stack-7.1.6 → pen_stack-7.1.8}/benchmarks/oracle/SHA256SUMS +0 -0
  31. {pen_stack-7.1.6 → pen_stack-7.1.8}/benchmarks/position_effect/README.md +0 -0
  32. {pen_stack-7.1.6 → pen_stack-7.1.8}/benchmarks/position_effect/SHA256SUMS +0 -0
  33. {pen_stack-7.1.6 → pen_stack-7.1.8}/benchmarks/verify/SHA256SUMS +0 -0
  34. {pen_stack-7.1.6 → pen_stack-7.1.8}/benchmarks/writer_efficiency/README.md +0 -0
  35. {pen_stack-7.1.6 → pen_stack-7.1.8}/benchmarks/writer_efficiency/SHA256SUMS +0 -0
  36. {pen_stack-7.1.6 → pen_stack-7.1.8}/benchmarks/writespec/SHA256SUMS +0 -0
  37. {pen_stack-7.1.6 → pen_stack-7.1.8}/configs/aav_serotype_tropism.yaml +0 -0
  38. {pen_stack-7.1.6 → pen_stack-7.1.8}/configs/antipeg.yaml +0 -0
  39. {pen_stack-7.1.6 → pen_stack-7.1.8}/configs/atlas_families.yaml +0 -0
  40. {pen_stack-7.1.6 → pen_stack-7.1.8}/configs/bridge_offtarget_profile.yaml +0 -0
  41. {pen_stack-7.1.6 → pen_stack-7.1.8}/configs/calibration/preexisting_nab_independent.yaml +0 -0
  42. {pen_stack-7.1.6 → pen_stack-7.1.8}/configs/capsid_epitope_oracle.yaml +0 -0
  43. {pen_stack-7.1.6 → pen_stack-7.1.8}/configs/capsid_sequences.fasta +0 -0
  44. {pen_stack-7.1.6 → pen_stack-7.1.8}/configs/cargo_polish.yaml +0 -0
  45. {pen_stack-7.1.6 → pen_stack-7.1.8}/configs/cell_types.yaml +0 -0
  46. {pen_stack-7.1.6 → pen_stack-7.1.8}/configs/datasets.yaml +0 -0
  47. {pen_stack-7.1.6 → pen_stack-7.1.8}/configs/delivery_constraints.yaml +0 -0
  48. {pen_stack-7.1.6 → pen_stack-7.1.8}/configs/delivery_rules.yaml +0 -0
  49. {pen_stack-7.1.6 → pen_stack-7.1.8}/configs/delivery_vehicles.yaml +0 -0
  50. {pen_stack-7.1.6 → pen_stack-7.1.8}/configs/expression/modifiers.yaml +0 -0
  51. {pen_stack-7.1.6 → pen_stack-7.1.8}/configs/expression/promoters.yaml +0 -0
  52. {pen_stack-7.1.6 → pen_stack-7.1.8}/configs/gates_v3.yaml +0 -0
  53. {pen_stack-7.1.6 → pen_stack-7.1.8}/configs/genotoxicity_oracle.yaml +0 -0
  54. {pen_stack-7.1.6 → pen_stack-7.1.8}/configs/gsh_validated_heldout.yaml +0 -0
  55. {pen_stack-7.1.6 → pen_stack-7.1.8}/configs/intent_weights.yaml +0 -0
  56. {pen_stack-7.1.6 → pen_stack-7.1.8}/configs/known_unknowns.yaml +0 -0
  57. {pen_stack-7.1.6 → pen_stack-7.1.8}/configs/llm.yaml +0 -0
  58. {pen_stack-7.1.6 → pen_stack-7.1.8}/configs/metric_guide.yaml +0 -0
  59. {pen_stack-7.1.6 → pen_stack-7.1.8}/configs/mhc_epitope_oracle.yaml +0 -0
  60. {pen_stack-7.1.6 → pen_stack-7.1.8}/configs/monitor_queries.yaml +0 -0
  61. {pen_stack-7.1.6 → pen_stack-7.1.8}/configs/oracles/execution.yaml +0 -0
  62. {pen_stack-7.1.6 → pen_stack-7.1.8}/configs/oracles/reliability.yaml +0 -0
  63. {pen_stack-7.1.6 → pen_stack-7.1.8}/configs/oracles/scope_cards.yaml +0 -0
  64. {pen_stack-7.1.6 → pen_stack-7.1.8}/configs/rules/compliance.yaml +0 -0
  65. {pen_stack-7.1.6 → pen_stack-7.1.8}/configs/rules/delivery.yaml +0 -0
  66. {pen_stack-7.1.6 → pen_stack-7.1.8}/configs/rules/fold.yaml +0 -0
  67. {pen_stack-7.1.6 → pen_stack-7.1.8}/configs/rules/multiplex.yaml +0 -0
  68. {pen_stack-7.1.6 → pen_stack-7.1.8}/configs/rules/payload.yaml +0 -0
  69. {pen_stack-7.1.6 → pen_stack-7.1.8}/configs/rules/reachability.yaml +0 -0
  70. {pen_stack-7.1.6 → pen_stack-7.1.8}/configs/safety/hazard_registry.yaml +0 -0
  71. {pen_stack-7.1.6 → pen_stack-7.1.8}/configs/safety/policy.yaml +0 -0
  72. {pen_stack-7.1.6 → pen_stack-7.1.8}/configs/safety/probes.yaml +0 -0
  73. {pen_stack-7.1.6 → pen_stack-7.1.8}/configs/score_axes.yaml +0 -0
  74. {pen_stack-7.1.6 → pen_stack-7.1.8}/configs/seroprevalence.yaml +0 -0
  75. {pen_stack-7.1.6 → pen_stack-7.1.8}/configs/target_sites.yaml +0 -0
  76. {pen_stack-7.1.6 → pen_stack-7.1.8}/configs/universe_crosswalk.yaml +0 -0
  77. {pen_stack-7.1.6 → pen_stack-7.1.8}/configs/write_types.yaml +0 -0
  78. {pen_stack-7.1.6 → pen_stack-7.1.8}/configs/writer_sequences.fasta +0 -0
  79. {pen_stack-7.1.6 → pen_stack-7.1.8}/configs/wtkb_curated.yaml +0 -0
  80. {pen_stack-7.1.6 → pen_stack-7.1.8}/data/curated/bridge_offtarget_energetics.json +0 -0
  81. {pen_stack-7.1.6 → pen_stack-7.1.8}/data/curated/bridge_offtarget_profile_measured.parquet +0 -0
  82. {pen_stack-7.1.6 → pen_stack-7.1.8}/data/curated/gene_coords.parquet +0 -0
  83. {pen_stack-7.1.6 → pen_stack-7.1.8}/data/curated/unified_editor_universe.parquet +0 -0
  84. {pen_stack-7.1.6 → pen_stack-7.1.8}/docs/BACKLOG.md +0 -0
  85. {pen_stack-7.1.6 → pen_stack-7.1.8}/docs/DEPLOY.md +0 -0
  86. {pen_stack-7.1.6 → pen_stack-7.1.8}/docs/INFRA.md +0 -0
  87. {pen_stack-7.1.6 → pen_stack-7.1.8}/docs/MCP.md +0 -0
  88. {pen_stack-7.1.6 → pen_stack-7.1.8}/docs/RELEASING.md +0 -0
  89. {pen_stack-7.1.6 → pen_stack-7.1.8}/docs/REPRO.md +0 -0
  90. {pen_stack-7.1.6 → pen_stack-7.1.8}/docs/STABILITY.md +0 -0
  91. {pen_stack-7.1.6 → pen_stack-7.1.8}/docs/agent.md +0 -0
  92. {pen_stack-7.1.6 → pen_stack-7.1.8}/docs/alphagenome_feasibility.md +0 -0
  93. {pen_stack-7.1.6 → pen_stack-7.1.8}/docs/autonomy.md +0 -0
  94. {pen_stack-7.1.6 → pen_stack-7.1.8}/docs/benchmark_circularity.md +0 -0
  95. {pen_stack-7.1.6 → pen_stack-7.1.8}/docs/biosecurity.md +0 -0
  96. {pen_stack-7.1.6 → pen_stack-7.1.8}/docs/build_interface.md +0 -0
  97. {pen_stack-7.1.6 → pen_stack-7.1.8}/docs/cards/atlas.md +0 -0
  98. {pen_stack-7.1.6 → pen_stack-7.1.8}/docs/cards/durability.md +0 -0
  99. {pen_stack-7.1.6 → pen_stack-7.1.8}/docs/cards/offtarget_data.md +0 -0
  100. {pen_stack-7.1.6 → pen_stack-7.1.8}/docs/cards/position_effect_data.md +0 -0
  101. {pen_stack-7.1.6 → pen_stack-7.1.8}/docs/cards/safety.md +0 -0
  102. {pen_stack-7.1.6 → pen_stack-7.1.8}/docs/cards/writer_efficiency_data.md +0 -0
  103. {pen_stack-7.1.6 → pen_stack-7.1.8}/docs/challenge.md +0 -0
  104. {pen_stack-7.1.6 → pen_stack-7.1.8}/docs/closed_loop.md +0 -0
  105. {pen_stack-7.1.6 → pen_stack-7.1.8}/docs/co_scientist.md +0 -0
  106. {pen_stack-7.1.6 → pen_stack-7.1.8}/docs/co_scientist_loop.md +0 -0
  107. {pen_stack-7.1.6 → pen_stack-7.1.8}/docs/delivery.md +0 -0
  108. {pen_stack-7.1.6 → pen_stack-7.1.8}/docs/delivery_immunology.md +0 -0
  109. {pen_stack-7.1.6 → pen_stack-7.1.8}/docs/delivery_recommender.md +0 -0
  110. {pen_stack-7.1.6 → pen_stack-7.1.8}/docs/digital_twin.md +0 -0
  111. {pen_stack-7.1.6 → pen_stack-7.1.8}/docs/dissemination.md +0 -0
  112. {pen_stack-7.1.6 → pen_stack-7.1.8}/docs/environment.md +0 -0
  113. {pen_stack-7.1.6 → pen_stack-7.1.8}/docs/experiment_design.md +0 -0
  114. {pen_stack-7.1.6 → pen_stack-7.1.8}/docs/generative_design.md +0 -0
  115. {pen_stack-7.1.6 → pen_stack-7.1.8}/docs/immune_profiler.md +0 -0
  116. {pen_stack-7.1.6 → pen_stack-7.1.8}/docs/index.md +0 -0
  117. {pen_stack-7.1.6 → pen_stack-7.1.8}/docs/integrations.md +0 -0
  118. {pen_stack-7.1.6 → pen_stack-7.1.8}/docs/live_oracles.md +0 -0
  119. {pen_stack-7.1.6 → pen_stack-7.1.8}/docs/mechanistic_constraints.md +0 -0
  120. {pen_stack-7.1.6 → pen_stack-7.1.8}/docs/offtarget.md +0 -0
  121. {pen_stack-7.1.6 → pen_stack-7.1.8}/docs/oracle_mesh.md +0 -0
  122. {pen_stack-7.1.6 → pen_stack-7.1.8}/docs/oracles.md +0 -0
  123. {pen_stack-7.1.6 → pen_stack-7.1.8}/docs/position_effect.md +0 -0
  124. {pen_stack-7.1.6 → pen_stack-7.1.8}/docs/positioning.md +0 -0
  125. {pen_stack-7.1.6 → pen_stack-7.1.8}/docs/private_data_formats.md +0 -0
  126. {pen_stack-7.1.6 → pen_stack-7.1.8}/docs/quickstart.md +0 -0
  127. {pen_stack-7.1.6 → pen_stack-7.1.8}/docs/responsible_use.md +0 -0
  128. {pen_stack-7.1.6 → pen_stack-7.1.8}/docs/rule_spec.md +0 -0
  129. {pen_stack-7.1.6 → pen_stack-7.1.8}/docs/rules.md +0 -0
  130. {pen_stack-7.1.6 → pen_stack-7.1.8}/docs/scope.md +0 -0
  131. {pen_stack-7.1.6 → pen_stack-7.1.8}/docs/scorecard.md +0 -0
  132. {pen_stack-7.1.6 → pen_stack-7.1.8}/docs/tpe_bench.md +0 -0
  133. {pen_stack-7.1.6 → pen_stack-7.1.8}/docs/tutorials/compare-families.md +0 -0
  134. {pen_stack-7.1.6 → pen_stack-7.1.8}/docs/tutorials/score-deliverability.md +0 -0
  135. {pen_stack-7.1.6 → pen_stack-7.1.8}/docs/tutorials/where-can-i-write.md +0 -0
  136. {pen_stack-7.1.6 → pen_stack-7.1.8}/docs/tutorials/which-writer-reaches-locus.md +0 -0
  137. {pen_stack-7.1.6 → pen_stack-7.1.8}/docs/uncertainty.md +0 -0
  138. {pen_stack-7.1.6 → pen_stack-7.1.8}/docs/verify.md +0 -0
  139. {pen_stack-7.1.6 → pen_stack-7.1.8}/docs/verify_service.md +0 -0
  140. {pen_stack-7.1.6 → pen_stack-7.1.8}/docs/world_model.md +0 -0
  141. {pen_stack-7.1.6 → pen_stack-7.1.8}/docs/writer_efficiency.md +0 -0
  142. {pen_stack-7.1.6 → pen_stack-7.1.8}/docs/writer_verification.md +0 -0
  143. {pen_stack-7.1.6 → pen_stack-7.1.8}/docs/writespec_bench.md +0 -0
  144. {pen_stack-7.1.6 → pen_stack-7.1.8}/docs/writespec_profile.md +0 -0
  145. {pen_stack-7.1.6 → pen_stack-7.1.8}/docs/wtkb.md +0 -0
  146. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/_resources.py +0 -0
  147. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/active/__init__.py +0 -0
  148. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/active/acquire.py +0 -0
  149. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/active/brains.py +0 -0
  150. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/active/campaign.py +0 -0
  151. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/active/design.py +0 -0
  152. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/active/validate.py +0 -0
  153. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/adapt/__init__.py +0 -0
  154. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/adapt/finetune.py +0 -0
  155. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/adapt/ingest.py +0 -0
  156. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/adapt/pipeline.py +0 -0
  157. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/adapt/recalibrate.py +0 -0
  158. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/adapt/report.py +0 -0
  159. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/agent/__init__.py +0 -0
  160. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/agent/cite.py +0 -0
  161. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/agent/co_scientist.py +0 -0
  162. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/agent/epistemic.py +0 -0
  163. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/agent/guardrails.py +0 -0
  164. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/agent/mcp_server.py +0 -0
  165. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/agent/orchestrator.py +0 -0
  166. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/agent/orchestrator_live.py +0 -0
  167. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/agent/pen_agent.py +0 -0
  168. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/agent/scope.py +0 -0
  169. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/agent/tools.py +0 -0
  170. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/api/__init__.py +0 -0
  171. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/api/manifest.py +0 -0
  172. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/atlas/__init__.py +0 -0
  173. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/atlas/build_wtkb.py +0 -0
  174. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/atlas/crosslink.py +0 -0
  175. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/atlas/expand.py +0 -0
  176. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/atlas/guide_design.py +0 -0
  177. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/atlas/schema.py +0 -0
  178. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/atlas/scorecard.py +0 -0
  179. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/atlas/universe.py +0 -0
  180. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/atlas/variant_propose.py +0 -0
  181. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/atlas/writer_efficiency.py +0 -0
  182. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/atlas/writer_predict.py +0 -0
  183. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/atlas/writer_recommend.py +0 -0
  184. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/atlas/writer_verify.py +0 -0
  185. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/bridge/__init__.py +0 -0
  186. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/bridge/activity.py +0 -0
  187. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/bridge/cli.py +0 -0
  188. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/bridge/fold_qc.py +0 -0
  189. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/bridge/guide_qc.py +0 -0
  190. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/bridge/ingest.py +0 -0
  191. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/bridge/offtarget.py +0 -0
  192. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/bridge/offtarget_energetics.py +0 -0
  193. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/bridge/ortholog_screen.py +0 -0
  194. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/bridge/pipeline.py +0 -0
  195. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/build/__init__.py +0 -0
  196. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/build/cloudlab.py +0 -0
  197. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/build/ingest.py +0 -0
  198. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/build/protocol.py +0 -0
  199. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/build/simlab.py +0 -0
  200. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/cli.py +0 -0
  201. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/data/__init__.py +0 -0
  202. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/data/encode.py +0 -0
  203. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/data/genome.py +0 -0
  204. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/data/ingest_chromatin.py +0 -0
  205. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/data/ingest_integration.py +0 -0
  206. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/data/ingest_safety_annot.py +0 -0
  207. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/data/ingest_trip.py +0 -0
  208. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/design/__init__.py +0 -0
  209. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/design/capsid_generate.py +0 -0
  210. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/design/generate.py +0 -0
  211. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/design/pareto.py +0 -0
  212. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/design/space.py +0 -0
  213. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/design/writer_variants.py +0 -0
  214. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/env/__init__.py +0 -0
  215. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/env/genome_writing_env.py +0 -0
  216. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/env/policies.py +0 -0
  217. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/graph/__init__.py +0 -0
  218. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/graph/build.py +0 -0
  219. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/graph/cell_types.py +0 -0
  220. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/graph/ingest.py +0 -0
  221. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/graph/query.py +0 -0
  222. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/graph/schema.py +0 -0
  223. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/loop/__init__.py +0 -0
  224. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/loop/continual.py +0 -0
  225. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/loop/cycle.py +0 -0
  226. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/loop/drift.py +0 -0
  227. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/mech/__init__.py +0 -0
  228. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/mech/classify_atlas.py +0 -0
  229. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/mech/whitelist.py +0 -0
  230. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/monitor/__init__.py +0 -0
  231. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/monitor/europepmc.py +0 -0
  232. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/monitor/run.py +0 -0
  233. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/monitor/triage.py +0 -0
  234. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/oracles/__init__.py +0 -0
  235. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/oracles/affinity.py +0 -0
  236. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/oracles/cache.py +0 -0
  237. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/oracles/energetics.py +0 -0
  238. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/oracles/genome.py +0 -0
  239. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/oracles/protein_design.py +0 -0
  240. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/oracles/reliability.py +0 -0
  241. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/oracles/rna.py +0 -0
  242. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/oracles/schema.py +0 -0
  243. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/oracles/status.py +0 -0
  244. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/oracles/structure.py +0 -0
  245. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/oracles/structure_run.py +0 -0
  246. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/oracles/vcell.py +0 -0
  247. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/planner/__init__.py +0 -0
  248. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/planner/ada_risk.py +0 -0
  249. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/planner/antipeg_oracle.py +0 -0
  250. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/planner/capsid_epitope_oracle.py +0 -0
  251. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/planner/cargo.py +0 -0
  252. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/planner/cargo_polish.py +0 -0
  253. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/planner/chromosome.py +0 -0
  254. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/planner/delivery.py +0 -0
  255. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/planner/delivery_constraints.py +0 -0
  256. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/planner/delivery_immune.py +0 -0
  257. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/planner/delivery_immunology.py +0 -0
  258. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/planner/delivery_predict.py +0 -0
  259. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/planner/delivery_vehicles.py +0 -0
  260. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/planner/genotoxicity_oracle.py +0 -0
  261. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/planner/immune_mhc2.py +0 -0
  262. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/planner/innate_sensing.py +0 -0
  263. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/planner/multiplex.py +0 -0
  264. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/planner/optimize.py +0 -0
  265. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/planner/pipeline.py +0 -0
  266. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/planner/report.py +0 -0
  267. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/planner/router.py +0 -0
  268. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/planner/seroprevalence_oracle.py +0 -0
  269. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/planner/target_site.py +0 -0
  270. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/rag/__init__.py +0 -0
  271. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/rag/corpus.py +0 -0
  272. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/rag/embed.py +0 -0
  273. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/rag/ground.py +0 -0
  274. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/rag/index.py +0 -0
  275. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/rag/llm.py +0 -0
  276. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/rag/qa.py +0 -0
  277. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/rag/retrieve.py +0 -0
  278. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/rules/__init__.py +0 -0
  279. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/rules/evaluators.py +0 -0
  280. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/rules/loader.py +0 -0
  281. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/rules/schema.py +0 -0
  282. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/rules/solver.py +0 -0
  283. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/rules/spec.py +0 -0
  284. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/safety/__init__.py +0 -0
  285. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/safety/audit.py +0 -0
  286. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/safety/gate.py +0 -0
  287. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/safety/policy.py +0 -0
  288. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/safety/redteam.py +0 -0
  289. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/safety/registry.py +0 -0
  290. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/safety/screen.py +0 -0
  291. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/safety/standards.py +0 -0
  292. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/score/__init__.py +0 -0
  293. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/score/recalibrate.py +0 -0
  294. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/score/therapeutic.py +0 -0
  295. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/server/__init__.py +0 -0
  296. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/spec/__init__.py +0 -0
  297. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/spec/clarify.py +0 -0
  298. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/spec/extract.py +0 -0
  299. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/spec/resolvers/__init__.py +0 -0
  300. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/spec/resolvers/cell.py +0 -0
  301. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/spec/resolvers/chem.py +0 -0
  302. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/spec/resolvers/feature.py +0 -0
  303. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/spec/resolvers/gene.py +0 -0
  304. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/spec/resolvers/locus.py +0 -0
  305. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/spec/resolvers/phenotype.py +0 -0
  306. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/spec/satisfy.py +0 -0
  307. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/spec/service.py +0 -0
  308. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/spec/writespec.py +0 -0
  309. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/twin/__init__.py +0 -0
  310. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/twin/calibrate.py +0 -0
  311. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/twin/data/__init__.py +0 -0
  312. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/twin/data/position_effect.py +0 -0
  313. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/twin/mechanistic.py +0 -0
  314. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/twin/outcome.py +0 -0
  315. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/twin/position_effect.py +0 -0
  316. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/ui/__init__.py +0 -0
  317. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/ui/app.py +0 -0
  318. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/validate/__init__.py +0 -0
  319. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/validate/adapt_demo.py +0 -0
  320. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/validate/agent_eval.py +0 -0
  321. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/validate/bench_adversarial_tasks.py +0 -0
  322. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/validate/bench_coscientist_tasks.py +0 -0
  323. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/validate/bench_graph_tasks.py +0 -0
  324. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/validate/bench_rule_tasks.py +0 -0
  325. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/validate/bench_trust_tasks.py +0 -0
  326. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/validate/bench_writetype_tasks.py +0 -0
  327. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/validate/blind_gsh_discovery.py +0 -0
  328. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/validate/cargo_directionality.py +0 -0
  329. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/validate/closed_loop.py +0 -0
  330. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/validate/durability_baselines.py +0 -0
  331. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/validate/experiment_design.py +0 -0
  332. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/validate/expr_controls.py +0 -0
  333. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/validate/forward_hypotheses.py +0 -0
  334. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/validate/generative_design.py +0 -0
  335. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/validate/guide_qc_demo.py +0 -0
  336. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/validate/heldout_celltype_expr.py +0 -0
  337. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/validate/immune_calibration.py +0 -0
  338. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/validate/intent_specification.py +0 -0
  339. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/validate/known_biology_expr.py +0 -0
  340. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/validate/offtarget_energetics_eval.py +0 -0
  341. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/validate/out_of_scope_refusal.py +0 -0
  342. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/validate/outcome_calibration.py +0 -0
  343. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/validate/outcome_prediction.py +0 -0
  344. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/validate/paper3_benchmark.py +0 -0
  345. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/validate/paper4_real_validation.py +0 -0
  346. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/validate/paper4_validation.py +0 -0
  347. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/validate/protocol_safety.py +0 -0
  348. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/validate/safety_screening.py +0 -0
  349. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/validate/selective_prediction.py +0 -0
  350. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/validate/seq_vs_measured.py +0 -0
  351. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/validate/target_site_controls.py +0 -0
  352. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/validate/uncertainty_eval.py +0 -0
  353. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/validate/ungrounded_baseline.py +0 -0
  354. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/validate/within_locus_ranking.py +0 -0
  355. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/validate/writer_recovery.py +0 -0
  356. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/verify/__init__.py +0 -0
  357. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/verify/proof.py +0 -0
  358. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/verify/schema.py +0 -0
  359. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/verify/service.py +0 -0
  360. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/web/__init__.py +0 -0
  361. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/web/guide.py +0 -0
  362. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/web/llm.py +0 -0
  363. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/web/llm_provider.py +0 -0
  364. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/web/router.py +0 -0
  365. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/web/server.py +0 -0
  366. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/web/tools.py +0 -0
  367. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/wgenome/__init__.py +0 -0
  368. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/wgenome/chromatin_seq.py +0 -0
  369. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/wgenome/durability.py +0 -0
  370. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/wgenome/export_tracks.py +0 -0
  371. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/wgenome/features.py +0 -0
  372. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/wgenome/gsh_baseline.py +0 -0
  373. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/wgenome/mesh_features.py +0 -0
  374. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/wgenome/offtarget_assay.py +0 -0
  375. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/wgenome/offtarget_data.py +0 -0
  376. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/wgenome/offtarget_predict.py +0 -0
  377. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/wgenome/ood.py +0 -0
  378. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/wgenome/providers.py +0 -0
  379. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/wgenome/safety.py +0 -0
  380. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/wgenome/structure3d.py +0 -0
  381. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/wgenome/uncertainty.py +0 -0
  382. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack/wgenome/writability.py +0 -0
  383. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack.egg-info/SOURCES.txt +0 -0
  384. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack.egg-info/dependency_links.txt +0 -0
  385. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack.egg-info/entry_points.txt +0 -0
  386. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack.egg-info/requires.txt +0 -0
  387. {pen_stack-7.1.6 → pen_stack-7.1.8}/pen_stack.egg-info/top_level.txt +0 -0
  388. {pen_stack-7.1.6 → pen_stack-7.1.8}/prereg/SHA256_LOCK_phase0.json +0 -0
  389. {pen_stack-7.1.6 → pen_stack-7.1.8}/prereg/SHA256_LOCK_phase1_5.json +0 -0
  390. {pen_stack-7.1.6 → pen_stack-7.1.8}/prereg/SHA256_LOCK_phase2.json +0 -0
  391. {pen_stack-7.1.6 → pen_stack-7.1.8}/prereg/SHA256_LOCK_phase3.json +0 -0
  392. {pen_stack-7.1.6 → pen_stack-7.1.8}/prereg/SHA256_LOCK_ws_a.json +0 -0
  393. {pen_stack-7.1.6 → pen_stack-7.1.8}/prereg/SHA256_LOCK_ws_acq.json +0 -0
  394. {pen_stack-7.1.6 → pen_stack-7.1.8}/prereg/SHA256_LOCK_ws_aldesign.json +0 -0
  395. {pen_stack-7.1.6 → pen_stack-7.1.8}/prereg/SHA256_LOCK_ws_alvalidate.json +0 -0
  396. {pen_stack-7.1.6 → pen_stack-7.1.8}/prereg/SHA256_LOCK_ws_atlas.json +0 -0
  397. {pen_stack-7.1.6 → pen_stack-7.1.8}/prereg/SHA256_LOCK_ws_b.json +0 -0
  398. {pen_stack-7.1.6 → pen_stack-7.1.8}/prereg/SHA256_LOCK_ws_ba.json +0 -0
  399. {pen_stack-7.1.6 → pen_stack-7.1.8}/prereg/SHA256_LOCK_ws_ba_v33.json +0 -0
  400. {pen_stack-7.1.6 → pen_stack-7.1.8}/prereg/SHA256_LOCK_ws_ba_v45.json +0 -0
  401. {pen_stack-7.1.6 → pen_stack-7.1.8}/prereg/SHA256_LOCK_ws_bench.json +0 -0
  402. {pen_stack-7.1.6 → pen_stack-7.1.8}/prereg/SHA256_LOCK_ws_c.json +0 -0
  403. {pen_stack-7.1.6 → pen_stack-7.1.8}/prereg/SHA256_LOCK_ws_cal.json +0 -0
  404. {pen_stack-7.1.6 → pen_stack-7.1.8}/prereg/SHA256_LOCK_ws_calib.json +0 -0
  405. {pen_stack-7.1.6 → pen_stack-7.1.8}/prereg/SHA256_LOCK_ws_challenge.json +0 -0
  406. {pen_stack-7.1.6 → pen_stack-7.1.8}/prereg/SHA256_LOCK_ws_chat.json +0 -0
  407. {pen_stack-7.1.6 → pen_stack-7.1.8}/prereg/SHA256_LOCK_ws_cite.json +0 -0
  408. {pen_stack-7.1.6 → pen_stack-7.1.8}/prereg/SHA256_LOCK_ws_closedloop.json +0 -0
  409. {pen_stack-7.1.6 → pen_stack-7.1.8}/prereg/SHA256_LOCK_ws_continual.json +0 -0
  410. {pen_stack-7.1.6 → pen_stack-7.1.8}/prereg/SHA256_LOCK_ws_cosci2.json +0 -0
  411. {pen_stack-7.1.6 → pen_stack-7.1.8}/prereg/SHA256_LOCK_ws_crit.json +0 -0
  412. {pen_stack-7.1.6 → pen_stack-7.1.8}/prereg/SHA256_LOCK_ws_ct.json +0 -0
  413. {pen_stack-7.1.6 → pen_stack-7.1.8}/prereg/SHA256_LOCK_ws_d.json +0 -0
  414. {pen_stack-7.1.6 → pen_stack-7.1.8}/prereg/SHA256_LOCK_ws_delivery.json +0 -0
  415. {pen_stack-7.1.6 → pen_stack-7.1.8}/prereg/SHA256_LOCK_ws_drift.json +0 -0
  416. {pen_stack-7.1.6 → pen_stack-7.1.8}/prereg/SHA256_LOCK_ws_e.json +0 -0
  417. {pen_stack-7.1.6 → pen_stack-7.1.8}/prereg/SHA256_LOCK_ws_env.json +0 -0
  418. {pen_stack-7.1.6 → pen_stack-7.1.8}/prereg/SHA256_LOCK_ws_ep.json +0 -0
  419. {pen_stack-7.1.6 → pen_stack-7.1.8}/prereg/SHA256_LOCK_ws_epitope.json +0 -0
  420. {pen_stack-7.1.6 → pen_stack-7.1.8}/prereg/SHA256_LOCK_ws_expr2.json +0 -0
  421. {pen_stack-7.1.6 → pen_stack-7.1.8}/prereg/SHA256_LOCK_ws_f.json +0 -0
  422. {pen_stack-7.1.6 → pen_stack-7.1.8}/prereg/SHA256_LOCK_ws_frontend.json +0 -0
  423. {pen_stack-7.1.6 → pen_stack-7.1.8}/prereg/SHA256_LOCK_ws_g.json +0 -0
  424. {pen_stack-7.1.6 → pen_stack-7.1.8}/prereg/SHA256_LOCK_ws_gen.json +0 -0
  425. {pen_stack-7.1.6 → pen_stack-7.1.8}/prereg/SHA256_LOCK_ws_genotox.json +0 -0
  426. {pen_stack-7.1.6 → pen_stack-7.1.8}/prereg/SHA256_LOCK_ws_graph.json +0 -0
  427. {pen_stack-7.1.6 → pen_stack-7.1.8}/prereg/SHA256_LOCK_ws_h.json +0 -0
  428. {pen_stack-7.1.6 → pen_stack-7.1.8}/prereg/SHA256_LOCK_ws_hybrid.json +0 -0
  429. {pen_stack-7.1.6 → pen_stack-7.1.8}/prereg/SHA256_LOCK_ws_immune.json +0 -0
  430. {pen_stack-7.1.6 → pen_stack-7.1.8}/prereg/SHA256_LOCK_ws_immune2.json +0 -0
  431. {pen_stack-7.1.6 → pen_stack-7.1.8}/prereg/SHA256_LOCK_ws_ingest.json +0 -0
  432. {pen_stack-7.1.6 → pen_stack-7.1.8}/prereg/SHA256_LOCK_ws_innate.json +0 -0
  433. {pen_stack-7.1.6 → pen_stack-7.1.8}/prereg/SHA256_LOCK_ws_loop.json +0 -0
  434. {pen_stack-7.1.6 → pen_stack-7.1.8}/prereg/SHA256_LOCK_ws_manifest.json +0 -0
  435. {pen_stack-7.1.6 → pen_stack-7.1.8}/prereg/SHA256_LOCK_ws_mc.json +0 -0
  436. {pen_stack-7.1.6 → pen_stack-7.1.8}/prereg/SHA256_LOCK_ws_mcp.json +0 -0
  437. {pen_stack-7.1.6 → pen_stack-7.1.8}/prereg/SHA256_LOCK_ws_mech.json +0 -0
  438. {pen_stack-7.1.6 → pen_stack-7.1.8}/prereg/SHA256_LOCK_ws_mon.json +0 -0
  439. {pen_stack-7.1.6 → pen_stack-7.1.8}/prereg/SHA256_LOCK_ws_o.json +0 -0
  440. {pen_stack-7.1.6 → pen_stack-7.1.8}/prereg/SHA256_LOCK_ws_offtarget.json +0 -0
  441. {pen_stack-7.1.6 → pen_stack-7.1.8}/prereg/SHA256_LOCK_ws_openapi.json +0 -0
  442. {pen_stack-7.1.6 → pen_stack-7.1.8}/prereg/SHA256_LOCK_ws_oracle.json +0 -0
  443. {pen_stack-7.1.6 → pen_stack-7.1.8}/prereg/SHA256_LOCK_ws_orch.json +0 -0
  444. {pen_stack-7.1.6 → pen_stack-7.1.8}/prereg/SHA256_LOCK_ws_outcome.json +0 -0
  445. {pen_stack-7.1.6 → pen_stack-7.1.8}/prereg/SHA256_LOCK_ws_pareto.json +0 -0
  446. {pen_stack-7.1.6 → pen_stack-7.1.8}/prereg/SHA256_LOCK_ws_peg.json +0 -0
  447. {pen_stack-7.1.6 → pen_stack-7.1.8}/prereg/SHA256_LOCK_ws_penchat.json +0 -0
  448. {pen_stack-7.1.6 → pen_stack-7.1.8}/prereg/SHA256_LOCK_ws_plan.json +0 -0
  449. {pen_stack-7.1.6 → pen_stack-7.1.8}/prereg/SHA256_LOCK_ws_policy.json +0 -0
  450. {pen_stack-7.1.6 → pen_stack-7.1.8}/prereg/SHA256_LOCK_ws_profile.json +0 -0
  451. {pen_stack-7.1.6 → pen_stack-7.1.8}/prereg/SHA256_LOCK_ws_proto.json +0 -0
  452. {pen_stack-7.1.6 → pen_stack-7.1.8}/prereg/SHA256_LOCK_ws_r.json +0 -0
  453. {pen_stack-7.1.6 → pen_stack-7.1.8}/prereg/SHA256_LOCK_ws_redteam.json +0 -0
  454. {pen_stack-7.1.6 → pen_stack-7.1.8}/prereg/SHA256_LOCK_ws_route.json +0 -0
  455. {pen_stack-7.1.6 → pen_stack-7.1.8}/prereg/SHA256_LOCK_ws_screen.json +0 -0
  456. {pen_stack-7.1.6 → pen_stack-7.1.8}/prereg/SHA256_LOCK_ws_seroprev.json +0 -0
  457. {pen_stack-7.1.6 → pen_stack-7.1.8}/prereg/SHA256_LOCK_ws_simlab.json +0 -0
  458. {pen_stack-7.1.6 → pen_stack-7.1.8}/prereg/SHA256_LOCK_ws_twincal.json +0 -0
  459. {pen_stack-7.1.6 → pen_stack-7.1.8}/prereg/SHA256_LOCK_ws_uq.json +0 -0
  460. {pen_stack-7.1.6 → pen_stack-7.1.8}/prereg/SHA256_LOCK_ws_v.json +0 -0
  461. {pen_stack-7.1.6 → pen_stack-7.1.8}/prereg/SHA256_LOCK_ws_vcell.json +0 -0
  462. {pen_stack-7.1.6 → pen_stack-7.1.8}/prereg/SHA256_LOCK_ws_verify.json +0 -0
  463. {pen_stack-7.1.6 → pen_stack-7.1.8}/prereg/SHA256_LOCK_ws_writer.json +0 -0
  464. {pen_stack-7.1.6 → pen_stack-7.1.8}/prereg/SHA256_LOCK_ws_writespec.json +0 -0
  465. {pen_stack-7.1.6 → pen_stack-7.1.8}/prereg/SHA256_LOCK_ws_wv.json +0 -0
  466. {pen_stack-7.1.6 → pen_stack-7.1.8}/prereg/paper1.yaml +0 -0
  467. {pen_stack-7.1.6 → pen_stack-7.1.8}/prereg/paper2.yaml +0 -0
  468. {pen_stack-7.1.6 → pen_stack-7.1.8}/prereg/paper3.yaml +0 -0
  469. {pen_stack-7.1.6 → pen_stack-7.1.8}/prereg/paper4.yaml +0 -0
  470. {pen_stack-7.1.6 → pen_stack-7.1.8}/prereg/phase0.yaml +0 -0
  471. {pen_stack-7.1.6 → pen_stack-7.1.8}/prereg/ws_a.yaml +0 -0
  472. {pen_stack-7.1.6 → pen_stack-7.1.8}/prereg/ws_acq.yaml +0 -0
  473. {pen_stack-7.1.6 → pen_stack-7.1.8}/prereg/ws_aldesign.yaml +0 -0
  474. {pen_stack-7.1.6 → pen_stack-7.1.8}/prereg/ws_alvalidate.yaml +0 -0
  475. {pen_stack-7.1.6 → pen_stack-7.1.8}/prereg/ws_atlas.yaml +0 -0
  476. {pen_stack-7.1.6 → pen_stack-7.1.8}/prereg/ws_b.yaml +0 -0
  477. {pen_stack-7.1.6 → pen_stack-7.1.8}/prereg/ws_ba.yaml +0 -0
  478. {pen_stack-7.1.6 → pen_stack-7.1.8}/prereg/ws_ba_v33.yaml +0 -0
  479. {pen_stack-7.1.6 → pen_stack-7.1.8}/prereg/ws_ba_v45.yaml +0 -0
  480. {pen_stack-7.1.6 → pen_stack-7.1.8}/prereg/ws_bench.yaml +0 -0
  481. {pen_stack-7.1.6 → pen_stack-7.1.8}/prereg/ws_c.yaml +0 -0
  482. {pen_stack-7.1.6 → pen_stack-7.1.8}/prereg/ws_cal.yaml +0 -0
  483. {pen_stack-7.1.6 → pen_stack-7.1.8}/prereg/ws_calib.yaml +0 -0
  484. {pen_stack-7.1.6 → pen_stack-7.1.8}/prereg/ws_challenge.yaml +0 -0
  485. {pen_stack-7.1.6 → pen_stack-7.1.8}/prereg/ws_chat.yaml +0 -0
  486. {pen_stack-7.1.6 → pen_stack-7.1.8}/prereg/ws_cite.yaml +0 -0
  487. {pen_stack-7.1.6 → pen_stack-7.1.8}/prereg/ws_closedloop.yaml +0 -0
  488. {pen_stack-7.1.6 → pen_stack-7.1.8}/prereg/ws_continual.yaml +0 -0
  489. {pen_stack-7.1.6 → pen_stack-7.1.8}/prereg/ws_cosci2.yaml +0 -0
  490. {pen_stack-7.1.6 → pen_stack-7.1.8}/prereg/ws_crit.yaml +0 -0
  491. {pen_stack-7.1.6 → pen_stack-7.1.8}/prereg/ws_ct.yaml +0 -0
  492. {pen_stack-7.1.6 → pen_stack-7.1.8}/prereg/ws_d.yaml +0 -0
  493. {pen_stack-7.1.6 → pen_stack-7.1.8}/prereg/ws_delivery.yaml +0 -0
  494. {pen_stack-7.1.6 → pen_stack-7.1.8}/prereg/ws_drift.yaml +0 -0
  495. {pen_stack-7.1.6 → pen_stack-7.1.8}/prereg/ws_e.yaml +0 -0
  496. {pen_stack-7.1.6 → pen_stack-7.1.8}/prereg/ws_env.yaml +0 -0
  497. {pen_stack-7.1.6 → pen_stack-7.1.8}/prereg/ws_ep.yaml +0 -0
  498. {pen_stack-7.1.6 → pen_stack-7.1.8}/prereg/ws_epitope.yaml +0 -0
  499. {pen_stack-7.1.6 → pen_stack-7.1.8}/prereg/ws_expr2.yaml +0 -0
  500. {pen_stack-7.1.6 → pen_stack-7.1.8}/prereg/ws_f.yaml +0 -0
  501. {pen_stack-7.1.6 → pen_stack-7.1.8}/prereg/ws_frontend.yaml +0 -0
  502. {pen_stack-7.1.6 → pen_stack-7.1.8}/prereg/ws_g.yaml +0 -0
  503. {pen_stack-7.1.6 → pen_stack-7.1.8}/prereg/ws_gen.yaml +0 -0
  504. {pen_stack-7.1.6 → pen_stack-7.1.8}/prereg/ws_genotox.yaml +0 -0
  505. {pen_stack-7.1.6 → pen_stack-7.1.8}/prereg/ws_graph.yaml +0 -0
  506. {pen_stack-7.1.6 → pen_stack-7.1.8}/prereg/ws_h.yaml +0 -0
  507. {pen_stack-7.1.6 → pen_stack-7.1.8}/prereg/ws_hybrid.yaml +0 -0
  508. {pen_stack-7.1.6 → pen_stack-7.1.8}/prereg/ws_immune.yaml +0 -0
  509. {pen_stack-7.1.6 → pen_stack-7.1.8}/prereg/ws_immune2.yaml +0 -0
  510. {pen_stack-7.1.6 → pen_stack-7.1.8}/prereg/ws_ingest.yaml +0 -0
  511. {pen_stack-7.1.6 → pen_stack-7.1.8}/prereg/ws_innate.yaml +0 -0
  512. {pen_stack-7.1.6 → pen_stack-7.1.8}/prereg/ws_loop.yaml +0 -0
  513. {pen_stack-7.1.6 → pen_stack-7.1.8}/prereg/ws_manifest.yaml +0 -0
  514. {pen_stack-7.1.6 → pen_stack-7.1.8}/prereg/ws_mc.yaml +0 -0
  515. {pen_stack-7.1.6 → pen_stack-7.1.8}/prereg/ws_mcp.yaml +0 -0
  516. {pen_stack-7.1.6 → pen_stack-7.1.8}/prereg/ws_mech.yaml +0 -0
  517. {pen_stack-7.1.6 → pen_stack-7.1.8}/prereg/ws_mon.yaml +0 -0
  518. {pen_stack-7.1.6 → pen_stack-7.1.8}/prereg/ws_o.yaml +0 -0
  519. {pen_stack-7.1.6 → pen_stack-7.1.8}/prereg/ws_offtarget.yaml +0 -0
  520. {pen_stack-7.1.6 → pen_stack-7.1.8}/prereg/ws_openapi.yaml +0 -0
  521. {pen_stack-7.1.6 → pen_stack-7.1.8}/prereg/ws_oracle.yaml +0 -0
  522. {pen_stack-7.1.6 → pen_stack-7.1.8}/prereg/ws_orch.yaml +0 -0
  523. {pen_stack-7.1.6 → pen_stack-7.1.8}/prereg/ws_outcome.yaml +0 -0
  524. {pen_stack-7.1.6 → pen_stack-7.1.8}/prereg/ws_pareto.yaml +0 -0
  525. {pen_stack-7.1.6 → pen_stack-7.1.8}/prereg/ws_peg.yaml +0 -0
  526. {pen_stack-7.1.6 → pen_stack-7.1.8}/prereg/ws_penchat.yaml +0 -0
  527. {pen_stack-7.1.6 → pen_stack-7.1.8}/prereg/ws_plan.yaml +0 -0
  528. {pen_stack-7.1.6 → pen_stack-7.1.8}/prereg/ws_policy.yaml +0 -0
  529. {pen_stack-7.1.6 → pen_stack-7.1.8}/prereg/ws_profile.yaml +0 -0
  530. {pen_stack-7.1.6 → pen_stack-7.1.8}/prereg/ws_proto.yaml +0 -0
  531. {pen_stack-7.1.6 → pen_stack-7.1.8}/prereg/ws_r.yaml +0 -0
  532. {pen_stack-7.1.6 → pen_stack-7.1.8}/prereg/ws_redteam.yaml +0 -0
  533. {pen_stack-7.1.6 → pen_stack-7.1.8}/prereg/ws_route.yaml +0 -0
  534. {pen_stack-7.1.6 → pen_stack-7.1.8}/prereg/ws_screen.yaml +0 -0
  535. {pen_stack-7.1.6 → pen_stack-7.1.8}/prereg/ws_seroprev.yaml +0 -0
  536. {pen_stack-7.1.6 → pen_stack-7.1.8}/prereg/ws_simlab.yaml +0 -0
  537. {pen_stack-7.1.6 → pen_stack-7.1.8}/prereg/ws_twincal.yaml +0 -0
  538. {pen_stack-7.1.6 → pen_stack-7.1.8}/prereg/ws_uq.yaml +0 -0
  539. {pen_stack-7.1.6 → pen_stack-7.1.8}/prereg/ws_v.yaml +0 -0
  540. {pen_stack-7.1.6 → pen_stack-7.1.8}/prereg/ws_vcell.yaml +0 -0
  541. {pen_stack-7.1.6 → pen_stack-7.1.8}/prereg/ws_verify.yaml +0 -0
  542. {pen_stack-7.1.6 → pen_stack-7.1.8}/prereg/ws_writer.yaml +0 -0
  543. {pen_stack-7.1.6 → pen_stack-7.1.8}/prereg/ws_writespec.yaml +0 -0
  544. {pen_stack-7.1.6 → pen_stack-7.1.8}/prereg/ws_wv.yaml +0 -0
  545. {pen_stack-7.1.6 → pen_stack-7.1.8}/scripts/build_capsid_fitness.py +0 -0
  546. {pen_stack-7.1.6 → pen_stack-7.1.8}/scripts/build_rag_corpus.py +0 -0
  547. {pen_stack-7.1.6 → pen_stack-7.1.8}/scripts/calibrate_immune_axes.py +0 -0
  548. {pen_stack-7.1.6 → pen_stack-7.1.8}/scripts/fetch_licensed_sources.py +0 -0
  549. {pen_stack-7.1.6 → pen_stack-7.1.8}/scripts/offtarget_chromatin_incremental.py +0 -0
  550. {pen_stack-7.1.6 → pen_stack-7.1.8}/scripts/offtarget_chromatin_matched.py +0 -0
  551. {pen_stack-7.1.6 → pen_stack-7.1.8}/scripts/offtarget_chromatin_validation.py +0 -0
  552. {pen_stack-7.1.6 → pen_stack-7.1.8}/scripts/p1_build_atlas.py +0 -0
  553. {pen_stack-7.1.6 → pen_stack-7.1.8}/scripts/p1_build_durability.py +0 -0
  554. {pen_stack-7.1.6 → pen_stack-7.1.8}/scripts/p1_build_position_effect.py +0 -0
  555. {pen_stack-7.1.6 → pen_stack-7.1.8}/scripts/p1_build_writer_eff.py +0 -0
  556. {pen_stack-7.1.6 → pen_stack-7.1.8}/scripts/p1_export_tracks.py +0 -0
  557. {pen_stack-7.1.6 → pen_stack-7.1.8}/scripts/p1_safety_concordance.py +0 -0
  558. {pen_stack-7.1.6 → pen_stack-7.1.8}/scripts/p1_train_safety.py +0 -0
  559. {pen_stack-7.1.6 → pen_stack-7.1.8}/scripts/p1_validation_report.py +0 -0
  560. {pen_stack-7.1.6 → pen_stack-7.1.8}/scripts/p2_build_atlas.py +0 -0
  561. {pen_stack-7.1.6 → pen_stack-7.1.8}/scripts/p3_benchmark_report.py +0 -0
  562. {pen_stack-7.1.6 → pen_stack-7.1.8}/scripts/p4_genome_scan.py +0 -0
  563. {pen_stack-7.1.6 → pen_stack-7.1.8}/scripts/p52_build_genotox_oracle.py +0 -0
  564. {pen_stack-7.1.6 → pen_stack-7.1.8}/scripts/p53_build_epitope_oracle.py +0 -0
  565. {pen_stack-7.1.6 → pen_stack-7.1.8}/scripts/ws_b_report.py +0 -0
  566. {pen_stack-7.1.6 → pen_stack-7.1.8}/scripts/ws_c_report.py +0 -0
  567. {pen_stack-7.1.6 → pen_stack-7.1.8}/setup.cfg +0 -0
@@ -3,6 +3,54 @@
3
3
  All notable changes to PEN-STACK are documented here. This file follows
4
4
  [Keep a Changelog](https://keepachangelog.com/).
5
5
 
6
+ ## [7.1.8] - 2026-06-30 - Writer immunogenicity moves to the Writer Atlas; SpCas9 removed from the writer options
7
+
8
+ ### Changed
9
+ - **The writer enzyme is no longer chosen in the Design Studio; its immunogenicity moves to the Writer Atlas, where
10
+ writers belong.** The Design Studio's writer dropdown existed only to feed the two writer-as-antigen immune axes
11
+ (MHC-II + ADA); that duplicated the dedicated Writer Atlas page. Now:
12
+ - The **Writer enzyme dropdown is removed** from `DesignForm` (and `DEFAULT_DESIGN`). The Design Studio's "Profile
13
+ immune & delivery" action correctly scopes to the **delivery/vehicle** axes (genotoxicity, CD8 capsid, innate,
14
+ pre-existing NAb, anti-PEG). `ImmuneProfileCard` hides the writer axes by default (`hideWriterAxes`).
15
+ - A new **Writer immunogenicity** card on the **Writer Atlas** surfaces each genome writer's MHC-II/CD4 epitope
16
+ load + ADA risk + human self-match, read from the **committed NetMHCIIpan-4.0 cache — not recomputed**
17
+ (`GET /api/writer/immune`, `immune_profile.writer_immunogenicity_table()`).
18
+ - **SpCas9 is removed** from the writer set: it is a nuclease/editor, not a large-cargo genome writer. The Writer
19
+ Atlas immunogenicity covers the actual writers — **Bxb1** (serine integrase) and **ISCro4** (bridge recombinase);
20
+ the Cas9 nuclease and the human self control are excluded. (The engine retains SpCas9 in its cache for other
21
+ uses; only the user-facing writer list drops it.)
22
+ - The engine still returns the `mhc2_writer` / `ada_writer` axes from `immune_profile()` for API/MCP callers that
23
+ pass a `writer_family` — only the web UI moved the writer profiling to the Writer Atlas. No data was recomputed.
24
+
25
+ ### Added
26
+ - `test_ws_profile.py`: `test_writer_immunogenicity_table_for_the_writer_atlas` (covers Bxb1 + ISCro4 from the
27
+ cache; SpCas9 and the self control excluded; grounded MHC-II + ADA values).
28
+
29
+ ## [7.1.7] - 2026-06-30 - Administration context (in-vivo / ex-vivo) now drives the immune profile
30
+
31
+ ### Fixed
32
+ - **The in-vivo / ex-vivo "Context" toggle had no effect on the immune profile.** It already drove the Generate
33
+ vehicle sweep (route-compatible vehicles) and the Verify germline-prohibition legality rule, but `immune_profile()`
34
+ ignored it, so the per-axis immune profile was identical for in-vivo and ex-vivo. It now applies a documented,
35
+ grounded administration modifier (`immune_profile._administration_modifier` / `_apply_administration`):
36
+ - **Pre-existing NAb is muted to "no barrier" (1.0) ex vivo.** Ex-vivo delivery (cells transduced in a dish and
37
+ washed before transplant) never exposes the vector to the patient's circulating antibodies, so pre-existing
38
+ anti-vector NAb does not gate eligibility — the eligibility fraction is 1.0 regardless of titer. The original
39
+ seroprevalence value is preserved (`pre_admin_value`) and the muting is explained in the axis note. This is the
40
+ same in-vivo/ex-vivo distinction the v5.1 `delivery_immunology` profile already encodes (`computed_ex_vivo_muted`).
41
+ - **CD8 capsid is flagged muted ex vivo** (systemic anti-capsid response minimal), but its intrinsic presentability
42
+ value is kept — transduced cells can still present capsid epitopes, a real residual concern, so no number is
43
+ fabricated.
44
+ - **Genotoxicity, innate, anti-PEG and the writer axes are unchanged** by administration context (insertional risk
45
+ and cargo/writer immunogenicity are intrinsic, not a function of circulating-antibody exposure).
46
+ - A `administration_modifier` block (parallel to the existing `route_modifier`) is added to the profile; the
47
+ `ImmuneProfileCard` shows an in-vivo/ex-vivo chip, a per-axis "ex-vivo muted" badge with the reason, and the
48
+ administration effect line. In-vivo and unspecified contexts leave every axis untouched (backward compatible).
49
+
50
+ ### Added
51
+ - `test_ws_profile.py`: `test_administration_context_mutes_vector_facing_axes_ex_vivo` (ex-vivo mutes pre-existing
52
+ NAb to 1.0 and flags CD8; in-vivo/unspecified are unchanged; genotoxicity is never muted by administration).
53
+
6
54
  ## [7.1.6] - 2026-06-30 - Immune axes wired end-to-end + Delivery folded into Design Studio
7
55
 
8
56
  ### Fixed
@@ -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: 7.1.6
4
+ version: 7.1.8
5
5
  date-released: 2026-06-30
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: 7.1.6
3
+ Version: 7.1.8
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
@@ -1,2 +1,2 @@
1
1
  """PEN-STACK v3.0 - open infrastructure for genome writing."""
2
- __version__ = "7.1.6"
2
+ __version__ = "7.1.8"
@@ -48,6 +48,65 @@ def _route_modifier(route: str | None) -> dict | None:
48
48
  "note": "DOCUMENTED qualitative modifier on the realized response, NOT a quantified magnitude "
49
49
  "(the magnitude stays a known-unknown)."}
50
50
 
51
+
52
+ # v7.1.7 WS-ADMIN, administration-context (in-vivo vs ex-vivo) modifier on the VECTOR-FACING immune axes.
53
+ # Ex-vivo delivery (cells transduced in a dish and washed before transplant) does NOT expose the vector to the
54
+ # patient's circulating antibodies, so the pre-existing anti-vector NAb axis - a humoral, bloodstream eligibility
55
+ # barrier - does not gate ex-vivo use (it is muted to "no barrier"). The systemic anti-capsid CD8 response is also
56
+ # muted ex vivo (the host barely sees the capsid), but transduced cells can still present capsid epitopes (a real,
57
+ # residual concern), so that axis is FLAGGED muted without overwriting its intrinsic value. This is the SAME
58
+ # in-vivo/ex-vivo distinction the v5.1 delivery_immunology profile already encodes ("computed_ex_vivo_muted").
59
+ # A DOCUMENTED, mechanistic modifier - never a fabricated magnitude; the realized response stays a known-unknown.
60
+ _EX_VIVO_MUTED_AXES = ("preexisting_nab", "cd8_epitope")
61
+
62
+
63
+ def _is_ex_vivo(in_vivo) -> bool:
64
+ return str(in_vivo).strip().lower() in ("false", "0", "no", "ex_vivo", "ex vivo", "exvivo")
65
+
66
+
67
+ def _administration_modifier(in_vivo) -> dict | None:
68
+ """Documented administration-context modifier (in-vivo / ex-vivo) on the vector-facing axes, or None when the
69
+ design does not state an administration context. Qualitative, never a fabricated magnitude."""
70
+ if in_vivo is None:
71
+ return None
72
+ if _is_ex_vivo(in_vivo):
73
+ return {"context": "ex_vivo", "muted_axes": list(_EX_VIVO_MUTED_AXES),
74
+ "effect": "ex-vivo administration: the vector contacts cells in a dish and is washed before "
75
+ "transplant, so it is not exposed to the patient's circulating antibodies. Pre-existing "
76
+ "anti-vector NAb does not gate eligibility (humoral barrier bypassed); the systemic "
77
+ "anti-capsid CD8 response is muted, though transduced cells may still present capsid "
78
+ "epitopes (a residual, separate consideration).",
79
+ "note": "DOCUMENTED qualitative administration modifier (the same in-vivo/ex-vivo distinction as the "
80
+ "v5.1 delivery profile); the realized immune MAGNITUDE remains a known-unknown."}
81
+ return {"context": "in_vivo", "muted_axes": [],
82
+ "effect": "in-vivo (systemic / local) administration: the vector is exposed to the patient's "
83
+ "circulating antibodies and immune system, so the pre-existing NAb and anti-capsid CD8 "
84
+ "axes apply as reported.",
85
+ "note": "DOCUMENTED qualitative administration modifier; the realized magnitude is a known-unknown."}
86
+
87
+
88
+ def _apply_administration(axes: dict, admin: dict | None) -> None:
89
+ """Mutate the vector-facing axes in place for an ex-vivo administration context. Pre-existing NAb is muted to
90
+ 'no barrier' (eligibility not gated when the vector never meets circulating antibody); CD8 capsid is flagged
91
+ muted but its intrinsic value is kept (transduced cells can still present). No-op for in-vivo / unspecified."""
92
+ if not admin or admin.get("context") != "ex_vivo":
93
+ return
94
+ na = axes.get("preexisting_nab")
95
+ if na and na.get("available") and na.get("value") is not None:
96
+ na["pre_admin_value"] = na["value"]
97
+ na["value"] = 1.0
98
+ na["uncertainty"] = 0.0
99
+ na["administration_muted"] = True
100
+ na["note"] = (f"ex-vivo administration: pre-existing circulating anti-vector antibodies do not reach the "
101
+ f"vector (transduction in a dish), so pre-existing NAb does not gate eligibility "
102
+ f"(muted from {na['pre_admin_value']} to 1.0 = no barrier). " + (na.get("note") or ""))
103
+ cd = axes.get("cd8_epitope")
104
+ if cd and cd.get("available") and cd.get("value") is not None:
105
+ cd["administration_muted"] = True
106
+ cd["note"] = ("ex-vivo administration: the systemic anti-capsid CD8 response is muted (minimal host capsid "
107
+ "exposure); transduced cells may still present capsid epitopes, so the intrinsic value is "
108
+ "kept. " + (cd.get("note") or ""))
109
+
51
110
  # headline score key inside each oracle's value dict, per axis.
52
111
  _SCORE_KEY = {"genotoxicity": "genotox_score", "cd8_epitope": "capsid_immune_score",
53
112
  "innate": "innate_score", "preexisting_nab": "preexisting_score",
@@ -127,6 +186,24 @@ def _writer_antigen_card(design: dict) -> dict | None:
127
186
  "Population-level proxy; realized CD4 response / ADA titer is a known-unknown."}
128
187
 
129
188
 
189
+ # Genome-WRITER families surfaced in the Writer Atlas immunogenicity view: the bundled writers that are actual
190
+ # genome writers (integrase / recombinase), each with a committed real NetMHCIIpan-4.0 MHC-II load + ADA-risk cache.
191
+ # The Cas9 nuclease (an editor, not a large-cargo writer) and the human self control are intentionally excluded.
192
+ _WRITER_IMMUNE_FAMILIES = ("serine_integrase", "bridge_IS110")
193
+
194
+
195
+ def writer_immunogenicity_table() -> list[dict]:
196
+ """Per-writer immunogenicity (MHC-II/CD4 epitope load + ADA risk) for the bundled genome-writer families, read
197
+ from the committed NetMHCIIpan-4.0 cache (no recomputation). Surfaced in the Writer Atlas as the writer's
198
+ antigen profile. Reuses the v6.9 writer-as-antigen card; excludes the Cas9 nuclease and the self control."""
199
+ out = []
200
+ for fam in _WRITER_IMMUNE_FAMILIES:
201
+ card = _writer_antigen_card({"writer_family": fam})
202
+ if card:
203
+ out.append({"writer_family": fam, **card})
204
+ return out
205
+
206
+
130
207
  def immune_profile(design: dict) -> dict:
131
208
  """Per-design immune-risk profile across all axes. ``design`` keys: ``delivery_vehicle`` (or ``vehicle``),
132
209
  ``serotype``, ``cargo_seq``, ``writer_output_form`` (or ``cargo_form``), ``pegylated``.
@@ -162,6 +239,11 @@ def immune_profile(design: dict) -> dict:
162
239
  "no bundled writer sequence -> abstains", "ada_writer"),
163
240
  }
164
241
 
242
+ # v7.1.7 administration context: ex-vivo delivery bypasses the patient's circulating antibodies, so the
243
+ # vector-facing axes (pre-existing NAb, capsid CD8) are muted - documented, not a fabricated magnitude.
244
+ admin = _administration_modifier(design.get("in_vivo"))
245
+ _apply_administration(axes, admin)
246
+
165
247
  # writer-as-antigen comparison: for non-viral delivery (no foreign capsid) or a foreign writer outscoring the
166
248
  # capsid, the WRITER is the dominant antigen, the v6.9 insight, never collapsed into the other axes.
167
249
  dominant = None
@@ -180,6 +262,7 @@ def immune_profile(design: dict) -> dict:
180
262
  "writer_as_antigen": ({**writer_card, "dominant_antigen": dominant,
181
263
  "writer_dominant_risk": writer_dominant_risk} if writer_card else None),
182
264
  "route_modifier": _route_modifier(design.get("route")), # v5.6 WS-EXT documented route modifier (or None)
265
+ "administration_modifier": admin, # v7.1.7 in-vivo / ex-vivo documented modifier on the vector-facing axes
183
266
  "known_unknowns": KNOWN_UNKNOWNS,
184
267
  "no_fabrication": True,
185
268
  "note": ("relative immune-risk SCREEN across axes (now incl. CD4/MHC-II + ADA over the writer enzyme); each "
@@ -244,6 +244,22 @@ def writer_variants_endpoint(integrase: str | None = None, system: str | None =
244
244
  "(reported as a known limitation, never a manufactured positive)."}
245
245
 
246
246
 
247
+ @app.get("/writer/immune", tags=["writer atlas"])
248
+ def writer_immune_endpoint():
249
+ """The writer enzyme's immunogenicity as an antigen (v6.9 writer-as-antigen, surfaced in the Writer Atlas from
250
+ v7.1.8): per genome-writer family, the real NetMHCIIpan-4.0 MHC-II/CD4 epitope load + the ADA-risk axis
251
+ (MHC-II density x foreignness, self-tolerance filtered against the human proteome). Read from the committed
252
+ cache - NOT recomputed. Population-level proxy, never a patient-specific magnitude (a known-unknown). The Cas9
253
+ nuclease (an editor, not a large-cargo writer) and the human self control are excluded."""
254
+ from pen_stack.planner.immune_profile import writer_immunogenicity_table
255
+ return {"writers": writer_immunogenicity_table(),
256
+ "method": "NetMHCIIpan-4.0 MHC-II epitope load + ADA risk (MHC-II density x foreignness, self-tolerance "
257
+ "filtered against the human proteome). Population-level proxy from the committed cache; the "
258
+ "realized CD4 response / ADA titer is a known-unknown.",
259
+ "scale": "0-1, higher = lower risk (1 = least presentable / least ADA-driving)",
260
+ "no_fabrication": True}
261
+
262
+
247
263
  @app.get("/bridge/design")
248
264
  def bridge_design(target: str, donor: str, scaffold: str = "ISCro4_enhanced",
249
265
  ct: str | None = None, scan: bool = False):
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pen-stack
3
- Version: 7.1.6
3
+ Version: 7.1.8
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
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "pen-stack"
7
- version = "7.1.6"
7
+ version = "7.1.8"
8
8
  description = "Open infrastructure for genome writing: the Writable Genome atlas, the Writer Atlas, and the Write Planner."
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.11"
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes