pen-stack 6.3.1__tar.gz → 6.4.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (454) hide show
  1. {pen_stack-6.3.1 → pen_stack-6.4.1}/CHANGELOG.md +35 -0
  2. {pen_stack-6.3.1 → pen_stack-6.4.1}/CITATION.cff +1 -1
  3. {pen_stack-6.3.1 → pen_stack-6.4.1}/PKG-INFO +16 -2
  4. {pen_stack-6.3.1 → pen_stack-6.4.1}/README.md +15 -1
  5. pen_stack-6.4.1/configs/oracles/execution.yaml +87 -0
  6. pen_stack-6.4.1/docs/live_oracles.md +56 -0
  7. {pen_stack-6.3.1 → pen_stack-6.4.1}/pen_stack/__init__.py +1 -1
  8. {pen_stack-6.3.1 → pen_stack-6.4.1}/pen_stack/api/manifest.py +9 -2
  9. pen_stack-6.4.1/pen_stack/oracles/genome.py +167 -0
  10. pen_stack-6.4.1/pen_stack/oracles/protein_design.py +136 -0
  11. pen_stack-6.4.1/pen_stack/oracles/status.py +110 -0
  12. {pen_stack-6.3.1 → pen_stack-6.4.1}/pen_stack/oracles/vcell.py +28 -5
  13. {pen_stack-6.3.1 → pen_stack-6.4.1}/pen_stack/server/api.py +9 -0
  14. {pen_stack-6.3.1 → pen_stack-6.4.1}/pen_stack/web/guide.py +7 -0
  15. {pen_stack-6.3.1 → pen_stack-6.4.1}/pen_stack/web/llm.py +45 -0
  16. {pen_stack-6.3.1 → pen_stack-6.4.1}/pen_stack/wgenome/providers.py +33 -0
  17. {pen_stack-6.3.1 → pen_stack-6.4.1}/pen_stack.egg-info/PKG-INFO +16 -2
  18. {pen_stack-6.3.1 → pen_stack-6.4.1}/pen_stack.egg-info/SOURCES.txt +3 -0
  19. {pen_stack-6.3.1 → pen_stack-6.4.1}/pyproject.toml +1 -1
  20. pen_stack-6.3.1/pen_stack/oracles/genome.py +0 -68
  21. pen_stack-6.3.1/pen_stack/oracles/protein_design.py +0 -45
  22. {pen_stack-6.3.1 → pen_stack-6.4.1}/LICENSE +0 -0
  23. {pen_stack-6.3.1 → pen_stack-6.4.1}/MANIFEST.in +0 -0
  24. {pen_stack-6.3.1 → pen_stack-6.4.1}/bench/run.py +0 -0
  25. {pen_stack-6.3.1 → pen_stack-6.4.1}/benchmarks/genome_writing_bench/LEADERBOARD.md +0 -0
  26. {pen_stack-6.3.1 → pen_stack-6.4.1}/benchmarks/genome_writing_bench/README.md +0 -0
  27. {pen_stack-6.3.1 → pen_stack-6.4.1}/benchmarks/genome_writing_bench/SHA256SUMS +0 -0
  28. {pen_stack-6.3.1 → pen_stack-6.4.1}/benchmarks/genome_writing_bench/SUBMISSIONS.md +0 -0
  29. {pen_stack-6.3.1 → pen_stack-6.4.1}/benchmarks/genome_writing_bench/tasks.yaml +0 -0
  30. {pen_stack-6.3.1 → pen_stack-6.4.1}/benchmarks/genome_writing_challenge/README.md +0 -0
  31. {pen_stack-6.3.1 → pen_stack-6.4.1}/benchmarks/genome_writing_challenge/SUBMISSIONS.md +0 -0
  32. {pen_stack-6.3.1 → pen_stack-6.4.1}/configs/antipeg.yaml +0 -0
  33. {pen_stack-6.3.1 → pen_stack-6.4.1}/configs/atlas_families.yaml +0 -0
  34. {pen_stack-6.3.1 → pen_stack-6.4.1}/configs/bridge_offtarget_profile.yaml +0 -0
  35. {pen_stack-6.3.1 → pen_stack-6.4.1}/configs/capsid_epitope_oracle.yaml +0 -0
  36. {pen_stack-6.3.1 → pen_stack-6.4.1}/configs/capsid_sequences.fasta +0 -0
  37. {pen_stack-6.3.1 → pen_stack-6.4.1}/configs/cargo_polish.yaml +0 -0
  38. {pen_stack-6.3.1 → pen_stack-6.4.1}/configs/cell_types.yaml +0 -0
  39. {pen_stack-6.3.1 → pen_stack-6.4.1}/configs/datasets.yaml +0 -0
  40. {pen_stack-6.3.1 → pen_stack-6.4.1}/configs/delivery_constraints.yaml +0 -0
  41. {pen_stack-6.3.1 → pen_stack-6.4.1}/configs/delivery_rules.yaml +0 -0
  42. {pen_stack-6.3.1 → pen_stack-6.4.1}/configs/delivery_vehicles.yaml +0 -0
  43. {pen_stack-6.3.1 → pen_stack-6.4.1}/configs/gates_v3.yaml +0 -0
  44. {pen_stack-6.3.1 → pen_stack-6.4.1}/configs/genotoxicity_oracle.yaml +0 -0
  45. {pen_stack-6.3.1 → pen_stack-6.4.1}/configs/gsh_validated_heldout.yaml +0 -0
  46. {pen_stack-6.3.1 → pen_stack-6.4.1}/configs/intent_weights.yaml +0 -0
  47. {pen_stack-6.3.1 → pen_stack-6.4.1}/configs/known_unknowns.yaml +0 -0
  48. {pen_stack-6.3.1 → pen_stack-6.4.1}/configs/llm.yaml +0 -0
  49. {pen_stack-6.3.1 → pen_stack-6.4.1}/configs/metric_guide.yaml +0 -0
  50. {pen_stack-6.3.1 → pen_stack-6.4.1}/configs/monitor_queries.yaml +0 -0
  51. {pen_stack-6.3.1 → pen_stack-6.4.1}/configs/oracles/scope_cards.yaml +0 -0
  52. {pen_stack-6.3.1 → pen_stack-6.4.1}/configs/rules/delivery.yaml +0 -0
  53. {pen_stack-6.3.1 → pen_stack-6.4.1}/configs/rules/fold.yaml +0 -0
  54. {pen_stack-6.3.1 → pen_stack-6.4.1}/configs/rules/multiplex.yaml +0 -0
  55. {pen_stack-6.3.1 → pen_stack-6.4.1}/configs/rules/payload.yaml +0 -0
  56. {pen_stack-6.3.1 → pen_stack-6.4.1}/configs/rules/reachability.yaml +0 -0
  57. {pen_stack-6.3.1 → pen_stack-6.4.1}/configs/safety/hazard_registry.yaml +0 -0
  58. {pen_stack-6.3.1 → pen_stack-6.4.1}/configs/safety/policy.yaml +0 -0
  59. {pen_stack-6.3.1 → pen_stack-6.4.1}/configs/safety/probes.yaml +0 -0
  60. {pen_stack-6.3.1 → pen_stack-6.4.1}/configs/score_axes.yaml +0 -0
  61. {pen_stack-6.3.1 → pen_stack-6.4.1}/configs/seroprevalence.yaml +0 -0
  62. {pen_stack-6.3.1 → pen_stack-6.4.1}/configs/target_sites.yaml +0 -0
  63. {pen_stack-6.3.1 → pen_stack-6.4.1}/configs/universe_crosswalk.yaml +0 -0
  64. {pen_stack-6.3.1 → pen_stack-6.4.1}/configs/write_types.yaml +0 -0
  65. {pen_stack-6.3.1 → pen_stack-6.4.1}/configs/wtkb_curated.yaml +0 -0
  66. {pen_stack-6.3.1 → pen_stack-6.4.1}/data/curated/bridge_offtarget_energetics.json +0 -0
  67. {pen_stack-6.3.1 → pen_stack-6.4.1}/data/curated/bridge_offtarget_profile_measured.parquet +0 -0
  68. {pen_stack-6.3.1 → pen_stack-6.4.1}/data/curated/gene_coords.parquet +0 -0
  69. {pen_stack-6.3.1 → pen_stack-6.4.1}/data/curated/unified_editor_universe.parquet +0 -0
  70. {pen_stack-6.3.1 → pen_stack-6.4.1}/docs/BACKLOG.md +0 -0
  71. {pen_stack-6.3.1 → pen_stack-6.4.1}/docs/DEPLOY.md +0 -0
  72. {pen_stack-6.3.1 → pen_stack-6.4.1}/docs/INFRA.md +0 -0
  73. {pen_stack-6.3.1 → pen_stack-6.4.1}/docs/MCP.md +0 -0
  74. {pen_stack-6.3.1 → pen_stack-6.4.1}/docs/RELEASING.md +0 -0
  75. {pen_stack-6.3.1 → pen_stack-6.4.1}/docs/REPRO.md +0 -0
  76. {pen_stack-6.3.1 → pen_stack-6.4.1}/docs/STABILITY.md +0 -0
  77. {pen_stack-6.3.1 → pen_stack-6.4.1}/docs/agent.md +0 -0
  78. {pen_stack-6.3.1 → pen_stack-6.4.1}/docs/alphagenome_feasibility.md +0 -0
  79. {pen_stack-6.3.1 → pen_stack-6.4.1}/docs/autonomy.md +0 -0
  80. {pen_stack-6.3.1 → pen_stack-6.4.1}/docs/benchmark_circularity.md +0 -0
  81. {pen_stack-6.3.1 → pen_stack-6.4.1}/docs/biosecurity.md +0 -0
  82. {pen_stack-6.3.1 → pen_stack-6.4.1}/docs/build_interface.md +0 -0
  83. {pen_stack-6.3.1 → pen_stack-6.4.1}/docs/cards/atlas.md +0 -0
  84. {pen_stack-6.3.1 → pen_stack-6.4.1}/docs/cards/durability.md +0 -0
  85. {pen_stack-6.3.1 → pen_stack-6.4.1}/docs/cards/safety.md +0 -0
  86. {pen_stack-6.3.1 → pen_stack-6.4.1}/docs/challenge.md +0 -0
  87. {pen_stack-6.3.1 → pen_stack-6.4.1}/docs/closed_loop.md +0 -0
  88. {pen_stack-6.3.1 → pen_stack-6.4.1}/docs/co_scientist.md +0 -0
  89. {pen_stack-6.3.1 → pen_stack-6.4.1}/docs/co_scientist_loop.md +0 -0
  90. {pen_stack-6.3.1 → pen_stack-6.4.1}/docs/delivery.md +0 -0
  91. {pen_stack-6.3.1 → pen_stack-6.4.1}/docs/delivery_immunology.md +0 -0
  92. {pen_stack-6.3.1 → pen_stack-6.4.1}/docs/digital_twin.md +0 -0
  93. {pen_stack-6.3.1 → pen_stack-6.4.1}/docs/dissemination.md +0 -0
  94. {pen_stack-6.3.1 → pen_stack-6.4.1}/docs/environment.md +0 -0
  95. {pen_stack-6.3.1 → pen_stack-6.4.1}/docs/experiment_design.md +0 -0
  96. {pen_stack-6.3.1 → pen_stack-6.4.1}/docs/generative_design.md +0 -0
  97. {pen_stack-6.3.1 → pen_stack-6.4.1}/docs/index.md +0 -0
  98. {pen_stack-6.3.1 → pen_stack-6.4.1}/docs/integrations.md +0 -0
  99. {pen_stack-6.3.1 → pen_stack-6.4.1}/docs/mechanistic_constraints.md +0 -0
  100. {pen_stack-6.3.1 → pen_stack-6.4.1}/docs/oracles.md +0 -0
  101. {pen_stack-6.3.1 → pen_stack-6.4.1}/docs/positioning.md +0 -0
  102. {pen_stack-6.3.1 → pen_stack-6.4.1}/docs/private_data_formats.md +0 -0
  103. {pen_stack-6.3.1 → pen_stack-6.4.1}/docs/quickstart.md +0 -0
  104. {pen_stack-6.3.1 → pen_stack-6.4.1}/docs/responsible_use.md +0 -0
  105. {pen_stack-6.3.1 → pen_stack-6.4.1}/docs/rules.md +0 -0
  106. {pen_stack-6.3.1 → pen_stack-6.4.1}/docs/scope.md +0 -0
  107. {pen_stack-6.3.1 → pen_stack-6.4.1}/docs/scorecard.md +0 -0
  108. {pen_stack-6.3.1 → pen_stack-6.4.1}/docs/tutorials/compare-families.md +0 -0
  109. {pen_stack-6.3.1 → pen_stack-6.4.1}/docs/tutorials/score-deliverability.md +0 -0
  110. {pen_stack-6.3.1 → pen_stack-6.4.1}/docs/tutorials/where-can-i-write.md +0 -0
  111. {pen_stack-6.3.1 → pen_stack-6.4.1}/docs/tutorials/which-writer-reaches-locus.md +0 -0
  112. {pen_stack-6.3.1 → pen_stack-6.4.1}/docs/uncertainty.md +0 -0
  113. {pen_stack-6.3.1 → pen_stack-6.4.1}/docs/verify.md +0 -0
  114. {pen_stack-6.3.1 → pen_stack-6.4.1}/docs/world_model.md +0 -0
  115. {pen_stack-6.3.1 → pen_stack-6.4.1}/docs/writer_verification.md +0 -0
  116. {pen_stack-6.3.1 → pen_stack-6.4.1}/docs/wtkb.md +0 -0
  117. {pen_stack-6.3.1 → pen_stack-6.4.1}/pen_stack/_resources.py +0 -0
  118. {pen_stack-6.3.1 → pen_stack-6.4.1}/pen_stack/active/__init__.py +0 -0
  119. {pen_stack-6.3.1 → pen_stack-6.4.1}/pen_stack/active/acquire.py +0 -0
  120. {pen_stack-6.3.1 → pen_stack-6.4.1}/pen_stack/active/design.py +0 -0
  121. {pen_stack-6.3.1 → pen_stack-6.4.1}/pen_stack/active/validate.py +0 -0
  122. {pen_stack-6.3.1 → pen_stack-6.4.1}/pen_stack/adapt/__init__.py +0 -0
  123. {pen_stack-6.3.1 → pen_stack-6.4.1}/pen_stack/adapt/finetune.py +0 -0
  124. {pen_stack-6.3.1 → pen_stack-6.4.1}/pen_stack/adapt/ingest.py +0 -0
  125. {pen_stack-6.3.1 → pen_stack-6.4.1}/pen_stack/adapt/pipeline.py +0 -0
  126. {pen_stack-6.3.1 → pen_stack-6.4.1}/pen_stack/adapt/recalibrate.py +0 -0
  127. {pen_stack-6.3.1 → pen_stack-6.4.1}/pen_stack/adapt/report.py +0 -0
  128. {pen_stack-6.3.1 → pen_stack-6.4.1}/pen_stack/agent/__init__.py +0 -0
  129. {pen_stack-6.3.1 → pen_stack-6.4.1}/pen_stack/agent/cite.py +0 -0
  130. {pen_stack-6.3.1 → pen_stack-6.4.1}/pen_stack/agent/co_scientist.py +0 -0
  131. {pen_stack-6.3.1 → pen_stack-6.4.1}/pen_stack/agent/epistemic.py +0 -0
  132. {pen_stack-6.3.1 → pen_stack-6.4.1}/pen_stack/agent/guardrails.py +0 -0
  133. {pen_stack-6.3.1 → pen_stack-6.4.1}/pen_stack/agent/mcp_server.py +0 -0
  134. {pen_stack-6.3.1 → pen_stack-6.4.1}/pen_stack/agent/orchestrator.py +0 -0
  135. {pen_stack-6.3.1 → pen_stack-6.4.1}/pen_stack/agent/orchestrator_live.py +0 -0
  136. {pen_stack-6.3.1 → pen_stack-6.4.1}/pen_stack/agent/pen_agent.py +0 -0
  137. {pen_stack-6.3.1 → pen_stack-6.4.1}/pen_stack/agent/scope.py +0 -0
  138. {pen_stack-6.3.1 → pen_stack-6.4.1}/pen_stack/agent/tools.py +0 -0
  139. {pen_stack-6.3.1 → pen_stack-6.4.1}/pen_stack/api/__init__.py +0 -0
  140. {pen_stack-6.3.1 → pen_stack-6.4.1}/pen_stack/atlas/__init__.py +0 -0
  141. {pen_stack-6.3.1 → pen_stack-6.4.1}/pen_stack/atlas/build_wtkb.py +0 -0
  142. {pen_stack-6.3.1 → pen_stack-6.4.1}/pen_stack/atlas/crosslink.py +0 -0
  143. {pen_stack-6.3.1 → pen_stack-6.4.1}/pen_stack/atlas/expand.py +0 -0
  144. {pen_stack-6.3.1 → pen_stack-6.4.1}/pen_stack/atlas/schema.py +0 -0
  145. {pen_stack-6.3.1 → pen_stack-6.4.1}/pen_stack/atlas/scorecard.py +0 -0
  146. {pen_stack-6.3.1 → pen_stack-6.4.1}/pen_stack/atlas/universe.py +0 -0
  147. {pen_stack-6.3.1 → pen_stack-6.4.1}/pen_stack/atlas/variant_propose.py +0 -0
  148. {pen_stack-6.3.1 → pen_stack-6.4.1}/pen_stack/atlas/writer_verify.py +0 -0
  149. {pen_stack-6.3.1 → pen_stack-6.4.1}/pen_stack/bridge/__init__.py +0 -0
  150. {pen_stack-6.3.1 → pen_stack-6.4.1}/pen_stack/bridge/activity.py +0 -0
  151. {pen_stack-6.3.1 → pen_stack-6.4.1}/pen_stack/bridge/cli.py +0 -0
  152. {pen_stack-6.3.1 → pen_stack-6.4.1}/pen_stack/bridge/fold_qc.py +0 -0
  153. {pen_stack-6.3.1 → pen_stack-6.4.1}/pen_stack/bridge/guide_qc.py +0 -0
  154. {pen_stack-6.3.1 → pen_stack-6.4.1}/pen_stack/bridge/ingest.py +0 -0
  155. {pen_stack-6.3.1 → pen_stack-6.4.1}/pen_stack/bridge/offtarget.py +0 -0
  156. {pen_stack-6.3.1 → pen_stack-6.4.1}/pen_stack/bridge/offtarget_energetics.py +0 -0
  157. {pen_stack-6.3.1 → pen_stack-6.4.1}/pen_stack/bridge/ortholog_screen.py +0 -0
  158. {pen_stack-6.3.1 → pen_stack-6.4.1}/pen_stack/bridge/pipeline.py +0 -0
  159. {pen_stack-6.3.1 → pen_stack-6.4.1}/pen_stack/build/__init__.py +0 -0
  160. {pen_stack-6.3.1 → pen_stack-6.4.1}/pen_stack/build/ingest.py +0 -0
  161. {pen_stack-6.3.1 → pen_stack-6.4.1}/pen_stack/build/protocol.py +0 -0
  162. {pen_stack-6.3.1 → pen_stack-6.4.1}/pen_stack/build/simlab.py +0 -0
  163. {pen_stack-6.3.1 → pen_stack-6.4.1}/pen_stack/cli.py +0 -0
  164. {pen_stack-6.3.1 → pen_stack-6.4.1}/pen_stack/data/__init__.py +0 -0
  165. {pen_stack-6.3.1 → pen_stack-6.4.1}/pen_stack/data/encode.py +0 -0
  166. {pen_stack-6.3.1 → pen_stack-6.4.1}/pen_stack/data/genome.py +0 -0
  167. {pen_stack-6.3.1 → pen_stack-6.4.1}/pen_stack/data/ingest_chromatin.py +0 -0
  168. {pen_stack-6.3.1 → pen_stack-6.4.1}/pen_stack/data/ingest_integration.py +0 -0
  169. {pen_stack-6.3.1 → pen_stack-6.4.1}/pen_stack/data/ingest_safety_annot.py +0 -0
  170. {pen_stack-6.3.1 → pen_stack-6.4.1}/pen_stack/data/ingest_trip.py +0 -0
  171. {pen_stack-6.3.1 → pen_stack-6.4.1}/pen_stack/design/__init__.py +0 -0
  172. {pen_stack-6.3.1 → pen_stack-6.4.1}/pen_stack/design/generate.py +0 -0
  173. {pen_stack-6.3.1 → pen_stack-6.4.1}/pen_stack/design/pareto.py +0 -0
  174. {pen_stack-6.3.1 → pen_stack-6.4.1}/pen_stack/design/space.py +0 -0
  175. {pen_stack-6.3.1 → pen_stack-6.4.1}/pen_stack/env/__init__.py +0 -0
  176. {pen_stack-6.3.1 → pen_stack-6.4.1}/pen_stack/env/genome_writing_env.py +0 -0
  177. {pen_stack-6.3.1 → pen_stack-6.4.1}/pen_stack/env/policies.py +0 -0
  178. {pen_stack-6.3.1 → pen_stack-6.4.1}/pen_stack/graph/__init__.py +0 -0
  179. {pen_stack-6.3.1 → pen_stack-6.4.1}/pen_stack/graph/build.py +0 -0
  180. {pen_stack-6.3.1 → pen_stack-6.4.1}/pen_stack/graph/cell_types.py +0 -0
  181. {pen_stack-6.3.1 → pen_stack-6.4.1}/pen_stack/graph/ingest.py +0 -0
  182. {pen_stack-6.3.1 → pen_stack-6.4.1}/pen_stack/graph/query.py +0 -0
  183. {pen_stack-6.3.1 → pen_stack-6.4.1}/pen_stack/graph/schema.py +0 -0
  184. {pen_stack-6.3.1 → pen_stack-6.4.1}/pen_stack/loop/__init__.py +0 -0
  185. {pen_stack-6.3.1 → pen_stack-6.4.1}/pen_stack/loop/continual.py +0 -0
  186. {pen_stack-6.3.1 → pen_stack-6.4.1}/pen_stack/loop/cycle.py +0 -0
  187. {pen_stack-6.3.1 → pen_stack-6.4.1}/pen_stack/loop/drift.py +0 -0
  188. {pen_stack-6.3.1 → pen_stack-6.4.1}/pen_stack/mech/__init__.py +0 -0
  189. {pen_stack-6.3.1 → pen_stack-6.4.1}/pen_stack/mech/classify_atlas.py +0 -0
  190. {pen_stack-6.3.1 → pen_stack-6.4.1}/pen_stack/mech/whitelist.py +0 -0
  191. {pen_stack-6.3.1 → pen_stack-6.4.1}/pen_stack/monitor/__init__.py +0 -0
  192. {pen_stack-6.3.1 → pen_stack-6.4.1}/pen_stack/monitor/europepmc.py +0 -0
  193. {pen_stack-6.3.1 → pen_stack-6.4.1}/pen_stack/monitor/run.py +0 -0
  194. {pen_stack-6.3.1 → pen_stack-6.4.1}/pen_stack/monitor/triage.py +0 -0
  195. {pen_stack-6.3.1 → pen_stack-6.4.1}/pen_stack/oracles/__init__.py +0 -0
  196. {pen_stack-6.3.1 → pen_stack-6.4.1}/pen_stack/oracles/cache.py +0 -0
  197. {pen_stack-6.3.1 → pen_stack-6.4.1}/pen_stack/oracles/energetics.py +0 -0
  198. {pen_stack-6.3.1 → pen_stack-6.4.1}/pen_stack/oracles/rna.py +0 -0
  199. {pen_stack-6.3.1 → pen_stack-6.4.1}/pen_stack/oracles/schema.py +0 -0
  200. {pen_stack-6.3.1 → pen_stack-6.4.1}/pen_stack/oracles/structure.py +0 -0
  201. {pen_stack-6.3.1 → pen_stack-6.4.1}/pen_stack/planner/__init__.py +0 -0
  202. {pen_stack-6.3.1 → pen_stack-6.4.1}/pen_stack/planner/antipeg_oracle.py +0 -0
  203. {pen_stack-6.3.1 → pen_stack-6.4.1}/pen_stack/planner/capsid_epitope_oracle.py +0 -0
  204. {pen_stack-6.3.1 → pen_stack-6.4.1}/pen_stack/planner/cargo.py +0 -0
  205. {pen_stack-6.3.1 → pen_stack-6.4.1}/pen_stack/planner/cargo_polish.py +0 -0
  206. {pen_stack-6.3.1 → pen_stack-6.4.1}/pen_stack/planner/delivery.py +0 -0
  207. {pen_stack-6.3.1 → pen_stack-6.4.1}/pen_stack/planner/delivery_constraints.py +0 -0
  208. {pen_stack-6.3.1 → pen_stack-6.4.1}/pen_stack/planner/delivery_immunology.py +0 -0
  209. {pen_stack-6.3.1 → pen_stack-6.4.1}/pen_stack/planner/delivery_vehicles.py +0 -0
  210. {pen_stack-6.3.1 → pen_stack-6.4.1}/pen_stack/planner/genotoxicity_oracle.py +0 -0
  211. {pen_stack-6.3.1 → pen_stack-6.4.1}/pen_stack/planner/immune_profile.py +0 -0
  212. {pen_stack-6.3.1 → pen_stack-6.4.1}/pen_stack/planner/innate_sensing.py +0 -0
  213. {pen_stack-6.3.1 → pen_stack-6.4.1}/pen_stack/planner/multiplex.py +0 -0
  214. {pen_stack-6.3.1 → pen_stack-6.4.1}/pen_stack/planner/optimize.py +0 -0
  215. {pen_stack-6.3.1 → pen_stack-6.4.1}/pen_stack/planner/pipeline.py +0 -0
  216. {pen_stack-6.3.1 → pen_stack-6.4.1}/pen_stack/planner/report.py +0 -0
  217. {pen_stack-6.3.1 → pen_stack-6.4.1}/pen_stack/planner/router.py +0 -0
  218. {pen_stack-6.3.1 → pen_stack-6.4.1}/pen_stack/planner/seroprevalence_oracle.py +0 -0
  219. {pen_stack-6.3.1 → pen_stack-6.4.1}/pen_stack/planner/target_site.py +0 -0
  220. {pen_stack-6.3.1 → pen_stack-6.4.1}/pen_stack/rag/__init__.py +0 -0
  221. {pen_stack-6.3.1 → pen_stack-6.4.1}/pen_stack/rag/index.py +0 -0
  222. {pen_stack-6.3.1 → pen_stack-6.4.1}/pen_stack/rag/llm.py +0 -0
  223. {pen_stack-6.3.1 → pen_stack-6.4.1}/pen_stack/rag/qa.py +0 -0
  224. {pen_stack-6.3.1 → pen_stack-6.4.1}/pen_stack/rules/__init__.py +0 -0
  225. {pen_stack-6.3.1 → pen_stack-6.4.1}/pen_stack/rules/evaluators.py +0 -0
  226. {pen_stack-6.3.1 → pen_stack-6.4.1}/pen_stack/rules/loader.py +0 -0
  227. {pen_stack-6.3.1 → pen_stack-6.4.1}/pen_stack/rules/schema.py +0 -0
  228. {pen_stack-6.3.1 → pen_stack-6.4.1}/pen_stack/rules/solver.py +0 -0
  229. {pen_stack-6.3.1 → pen_stack-6.4.1}/pen_stack/safety/__init__.py +0 -0
  230. {pen_stack-6.3.1 → pen_stack-6.4.1}/pen_stack/safety/audit.py +0 -0
  231. {pen_stack-6.3.1 → pen_stack-6.4.1}/pen_stack/safety/gate.py +0 -0
  232. {pen_stack-6.3.1 → pen_stack-6.4.1}/pen_stack/safety/policy.py +0 -0
  233. {pen_stack-6.3.1 → pen_stack-6.4.1}/pen_stack/safety/redteam.py +0 -0
  234. {pen_stack-6.3.1 → pen_stack-6.4.1}/pen_stack/safety/registry.py +0 -0
  235. {pen_stack-6.3.1 → pen_stack-6.4.1}/pen_stack/safety/screen.py +0 -0
  236. {pen_stack-6.3.1 → pen_stack-6.4.1}/pen_stack/score/__init__.py +0 -0
  237. {pen_stack-6.3.1 → pen_stack-6.4.1}/pen_stack/score/recalibrate.py +0 -0
  238. {pen_stack-6.3.1 → pen_stack-6.4.1}/pen_stack/score/therapeutic.py +0 -0
  239. {pen_stack-6.3.1 → pen_stack-6.4.1}/pen_stack/server/__init__.py +0 -0
  240. {pen_stack-6.3.1 → pen_stack-6.4.1}/pen_stack/twin/__init__.py +0 -0
  241. {pen_stack-6.3.1 → pen_stack-6.4.1}/pen_stack/twin/calibrate.py +0 -0
  242. {pen_stack-6.3.1 → pen_stack-6.4.1}/pen_stack/twin/mechanistic.py +0 -0
  243. {pen_stack-6.3.1 → pen_stack-6.4.1}/pen_stack/twin/outcome.py +0 -0
  244. {pen_stack-6.3.1 → pen_stack-6.4.1}/pen_stack/ui/__init__.py +0 -0
  245. {pen_stack-6.3.1 → pen_stack-6.4.1}/pen_stack/ui/app.py +0 -0
  246. {pen_stack-6.3.1 → pen_stack-6.4.1}/pen_stack/validate/__init__.py +0 -0
  247. {pen_stack-6.3.1 → pen_stack-6.4.1}/pen_stack/validate/adapt_demo.py +0 -0
  248. {pen_stack-6.3.1 → pen_stack-6.4.1}/pen_stack/validate/agent_eval.py +0 -0
  249. {pen_stack-6.3.1 → pen_stack-6.4.1}/pen_stack/validate/bench_adversarial_tasks.py +0 -0
  250. {pen_stack-6.3.1 → pen_stack-6.4.1}/pen_stack/validate/bench_coscientist_tasks.py +0 -0
  251. {pen_stack-6.3.1 → pen_stack-6.4.1}/pen_stack/validate/bench_graph_tasks.py +0 -0
  252. {pen_stack-6.3.1 → pen_stack-6.4.1}/pen_stack/validate/bench_rule_tasks.py +0 -0
  253. {pen_stack-6.3.1 → pen_stack-6.4.1}/pen_stack/validate/bench_trust_tasks.py +0 -0
  254. {pen_stack-6.3.1 → pen_stack-6.4.1}/pen_stack/validate/bench_writetype_tasks.py +0 -0
  255. {pen_stack-6.3.1 → pen_stack-6.4.1}/pen_stack/validate/blind_gsh_discovery.py +0 -0
  256. {pen_stack-6.3.1 → pen_stack-6.4.1}/pen_stack/validate/cargo_directionality.py +0 -0
  257. {pen_stack-6.3.1 → pen_stack-6.4.1}/pen_stack/validate/closed_loop.py +0 -0
  258. {pen_stack-6.3.1 → pen_stack-6.4.1}/pen_stack/validate/durability_baselines.py +0 -0
  259. {pen_stack-6.3.1 → pen_stack-6.4.1}/pen_stack/validate/experiment_design.py +0 -0
  260. {pen_stack-6.3.1 → pen_stack-6.4.1}/pen_stack/validate/forward_hypotheses.py +0 -0
  261. {pen_stack-6.3.1 → pen_stack-6.4.1}/pen_stack/validate/generative_design.py +0 -0
  262. {pen_stack-6.3.1 → pen_stack-6.4.1}/pen_stack/validate/guide_qc_demo.py +0 -0
  263. {pen_stack-6.3.1 → pen_stack-6.4.1}/pen_stack/validate/immune_calibration.py +0 -0
  264. {pen_stack-6.3.1 → pen_stack-6.4.1}/pen_stack/validate/intent_specification.py +0 -0
  265. {pen_stack-6.3.1 → pen_stack-6.4.1}/pen_stack/validate/offtarget_energetics_eval.py +0 -0
  266. {pen_stack-6.3.1 → pen_stack-6.4.1}/pen_stack/validate/out_of_scope_refusal.py +0 -0
  267. {pen_stack-6.3.1 → pen_stack-6.4.1}/pen_stack/validate/outcome_calibration.py +0 -0
  268. {pen_stack-6.3.1 → pen_stack-6.4.1}/pen_stack/validate/outcome_prediction.py +0 -0
  269. {pen_stack-6.3.1 → pen_stack-6.4.1}/pen_stack/validate/paper3_benchmark.py +0 -0
  270. {pen_stack-6.3.1 → pen_stack-6.4.1}/pen_stack/validate/paper4_real_validation.py +0 -0
  271. {pen_stack-6.3.1 → pen_stack-6.4.1}/pen_stack/validate/paper4_validation.py +0 -0
  272. {pen_stack-6.3.1 → pen_stack-6.4.1}/pen_stack/validate/protocol_safety.py +0 -0
  273. {pen_stack-6.3.1 → pen_stack-6.4.1}/pen_stack/validate/safety_screening.py +0 -0
  274. {pen_stack-6.3.1 → pen_stack-6.4.1}/pen_stack/validate/selective_prediction.py +0 -0
  275. {pen_stack-6.3.1 → pen_stack-6.4.1}/pen_stack/validate/seq_vs_measured.py +0 -0
  276. {pen_stack-6.3.1 → pen_stack-6.4.1}/pen_stack/validate/target_site_controls.py +0 -0
  277. {pen_stack-6.3.1 → pen_stack-6.4.1}/pen_stack/validate/uncertainty_eval.py +0 -0
  278. {pen_stack-6.3.1 → pen_stack-6.4.1}/pen_stack/validate/ungrounded_baseline.py +0 -0
  279. {pen_stack-6.3.1 → pen_stack-6.4.1}/pen_stack/validate/within_locus_ranking.py +0 -0
  280. {pen_stack-6.3.1 → pen_stack-6.4.1}/pen_stack/validate/writer_recovery.py +0 -0
  281. {pen_stack-6.3.1 → pen_stack-6.4.1}/pen_stack/verify/__init__.py +0 -0
  282. {pen_stack-6.3.1 → pen_stack-6.4.1}/pen_stack/verify/schema.py +0 -0
  283. {pen_stack-6.3.1 → pen_stack-6.4.1}/pen_stack/verify/service.py +0 -0
  284. {pen_stack-6.3.1 → pen_stack-6.4.1}/pen_stack/web/__init__.py +0 -0
  285. {pen_stack-6.3.1 → pen_stack-6.4.1}/pen_stack/web/router.py +0 -0
  286. {pen_stack-6.3.1 → pen_stack-6.4.1}/pen_stack/web/server.py +0 -0
  287. {pen_stack-6.3.1 → pen_stack-6.4.1}/pen_stack/web/tools.py +0 -0
  288. {pen_stack-6.3.1 → pen_stack-6.4.1}/pen_stack/wgenome/__init__.py +0 -0
  289. {pen_stack-6.3.1 → pen_stack-6.4.1}/pen_stack/wgenome/chromatin_seq.py +0 -0
  290. {pen_stack-6.3.1 → pen_stack-6.4.1}/pen_stack/wgenome/durability.py +0 -0
  291. {pen_stack-6.3.1 → pen_stack-6.4.1}/pen_stack/wgenome/export_tracks.py +0 -0
  292. {pen_stack-6.3.1 → pen_stack-6.4.1}/pen_stack/wgenome/features.py +0 -0
  293. {pen_stack-6.3.1 → pen_stack-6.4.1}/pen_stack/wgenome/gsh_baseline.py +0 -0
  294. {pen_stack-6.3.1 → pen_stack-6.4.1}/pen_stack/wgenome/mesh_features.py +0 -0
  295. {pen_stack-6.3.1 → pen_stack-6.4.1}/pen_stack/wgenome/ood.py +0 -0
  296. {pen_stack-6.3.1 → pen_stack-6.4.1}/pen_stack/wgenome/safety.py +0 -0
  297. {pen_stack-6.3.1 → pen_stack-6.4.1}/pen_stack/wgenome/structure3d.py +0 -0
  298. {pen_stack-6.3.1 → pen_stack-6.4.1}/pen_stack/wgenome/uncertainty.py +0 -0
  299. {pen_stack-6.3.1 → pen_stack-6.4.1}/pen_stack/wgenome/writability.py +0 -0
  300. {pen_stack-6.3.1 → pen_stack-6.4.1}/pen_stack.egg-info/dependency_links.txt +0 -0
  301. {pen_stack-6.3.1 → pen_stack-6.4.1}/pen_stack.egg-info/entry_points.txt +0 -0
  302. {pen_stack-6.3.1 → pen_stack-6.4.1}/pen_stack.egg-info/requires.txt +0 -0
  303. {pen_stack-6.3.1 → pen_stack-6.4.1}/pen_stack.egg-info/top_level.txt +0 -0
  304. {pen_stack-6.3.1 → pen_stack-6.4.1}/prereg/SHA256_LOCK_phase0.json +0 -0
  305. {pen_stack-6.3.1 → pen_stack-6.4.1}/prereg/SHA256_LOCK_phase1_5.json +0 -0
  306. {pen_stack-6.3.1 → pen_stack-6.4.1}/prereg/SHA256_LOCK_phase2.json +0 -0
  307. {pen_stack-6.3.1 → pen_stack-6.4.1}/prereg/SHA256_LOCK_phase3.json +0 -0
  308. {pen_stack-6.3.1 → pen_stack-6.4.1}/prereg/SHA256_LOCK_ws_a.json +0 -0
  309. {pen_stack-6.3.1 → pen_stack-6.4.1}/prereg/SHA256_LOCK_ws_acq.json +0 -0
  310. {pen_stack-6.3.1 → pen_stack-6.4.1}/prereg/SHA256_LOCK_ws_aldesign.json +0 -0
  311. {pen_stack-6.3.1 → pen_stack-6.4.1}/prereg/SHA256_LOCK_ws_alvalidate.json +0 -0
  312. {pen_stack-6.3.1 → pen_stack-6.4.1}/prereg/SHA256_LOCK_ws_atlas.json +0 -0
  313. {pen_stack-6.3.1 → pen_stack-6.4.1}/prereg/SHA256_LOCK_ws_b.json +0 -0
  314. {pen_stack-6.3.1 → pen_stack-6.4.1}/prereg/SHA256_LOCK_ws_ba.json +0 -0
  315. {pen_stack-6.3.1 → pen_stack-6.4.1}/prereg/SHA256_LOCK_ws_ba_v33.json +0 -0
  316. {pen_stack-6.3.1 → pen_stack-6.4.1}/prereg/SHA256_LOCK_ws_ba_v45.json +0 -0
  317. {pen_stack-6.3.1 → pen_stack-6.4.1}/prereg/SHA256_LOCK_ws_bench.json +0 -0
  318. {pen_stack-6.3.1 → pen_stack-6.4.1}/prereg/SHA256_LOCK_ws_c.json +0 -0
  319. {pen_stack-6.3.1 → pen_stack-6.4.1}/prereg/SHA256_LOCK_ws_cal.json +0 -0
  320. {pen_stack-6.3.1 → pen_stack-6.4.1}/prereg/SHA256_LOCK_ws_calib.json +0 -0
  321. {pen_stack-6.3.1 → pen_stack-6.4.1}/prereg/SHA256_LOCK_ws_challenge.json +0 -0
  322. {pen_stack-6.3.1 → pen_stack-6.4.1}/prereg/SHA256_LOCK_ws_chat.json +0 -0
  323. {pen_stack-6.3.1 → pen_stack-6.4.1}/prereg/SHA256_LOCK_ws_cite.json +0 -0
  324. {pen_stack-6.3.1 → pen_stack-6.4.1}/prereg/SHA256_LOCK_ws_continual.json +0 -0
  325. {pen_stack-6.3.1 → pen_stack-6.4.1}/prereg/SHA256_LOCK_ws_cosci2.json +0 -0
  326. {pen_stack-6.3.1 → pen_stack-6.4.1}/prereg/SHA256_LOCK_ws_crit.json +0 -0
  327. {pen_stack-6.3.1 → pen_stack-6.4.1}/prereg/SHA256_LOCK_ws_ct.json +0 -0
  328. {pen_stack-6.3.1 → pen_stack-6.4.1}/prereg/SHA256_LOCK_ws_d.json +0 -0
  329. {pen_stack-6.3.1 → pen_stack-6.4.1}/prereg/SHA256_LOCK_ws_drift.json +0 -0
  330. {pen_stack-6.3.1 → pen_stack-6.4.1}/prereg/SHA256_LOCK_ws_e.json +0 -0
  331. {pen_stack-6.3.1 → pen_stack-6.4.1}/prereg/SHA256_LOCK_ws_env.json +0 -0
  332. {pen_stack-6.3.1 → pen_stack-6.4.1}/prereg/SHA256_LOCK_ws_ep.json +0 -0
  333. {pen_stack-6.3.1 → pen_stack-6.4.1}/prereg/SHA256_LOCK_ws_epitope.json +0 -0
  334. {pen_stack-6.3.1 → pen_stack-6.4.1}/prereg/SHA256_LOCK_ws_f.json +0 -0
  335. {pen_stack-6.3.1 → pen_stack-6.4.1}/prereg/SHA256_LOCK_ws_frontend.json +0 -0
  336. {pen_stack-6.3.1 → pen_stack-6.4.1}/prereg/SHA256_LOCK_ws_g.json +0 -0
  337. {pen_stack-6.3.1 → pen_stack-6.4.1}/prereg/SHA256_LOCK_ws_gen.json +0 -0
  338. {pen_stack-6.3.1 → pen_stack-6.4.1}/prereg/SHA256_LOCK_ws_genotox.json +0 -0
  339. {pen_stack-6.3.1 → pen_stack-6.4.1}/prereg/SHA256_LOCK_ws_graph.json +0 -0
  340. {pen_stack-6.3.1 → pen_stack-6.4.1}/prereg/SHA256_LOCK_ws_h.json +0 -0
  341. {pen_stack-6.3.1 → pen_stack-6.4.1}/prereg/SHA256_LOCK_ws_hybrid.json +0 -0
  342. {pen_stack-6.3.1 → pen_stack-6.4.1}/prereg/SHA256_LOCK_ws_immune.json +0 -0
  343. {pen_stack-6.3.1 → pen_stack-6.4.1}/prereg/SHA256_LOCK_ws_ingest.json +0 -0
  344. {pen_stack-6.3.1 → pen_stack-6.4.1}/prereg/SHA256_LOCK_ws_innate.json +0 -0
  345. {pen_stack-6.3.1 → pen_stack-6.4.1}/prereg/SHA256_LOCK_ws_loop.json +0 -0
  346. {pen_stack-6.3.1 → pen_stack-6.4.1}/prereg/SHA256_LOCK_ws_manifest.json +0 -0
  347. {pen_stack-6.3.1 → pen_stack-6.4.1}/prereg/SHA256_LOCK_ws_mc.json +0 -0
  348. {pen_stack-6.3.1 → pen_stack-6.4.1}/prereg/SHA256_LOCK_ws_mcp.json +0 -0
  349. {pen_stack-6.3.1 → pen_stack-6.4.1}/prereg/SHA256_LOCK_ws_mech.json +0 -0
  350. {pen_stack-6.3.1 → pen_stack-6.4.1}/prereg/SHA256_LOCK_ws_mon.json +0 -0
  351. {pen_stack-6.3.1 → pen_stack-6.4.1}/prereg/SHA256_LOCK_ws_o.json +0 -0
  352. {pen_stack-6.3.1 → pen_stack-6.4.1}/prereg/SHA256_LOCK_ws_openapi.json +0 -0
  353. {pen_stack-6.3.1 → pen_stack-6.4.1}/prereg/SHA256_LOCK_ws_orch.json +0 -0
  354. {pen_stack-6.3.1 → pen_stack-6.4.1}/prereg/SHA256_LOCK_ws_outcome.json +0 -0
  355. {pen_stack-6.3.1 → pen_stack-6.4.1}/prereg/SHA256_LOCK_ws_pareto.json +0 -0
  356. {pen_stack-6.3.1 → pen_stack-6.4.1}/prereg/SHA256_LOCK_ws_peg.json +0 -0
  357. {pen_stack-6.3.1 → pen_stack-6.4.1}/prereg/SHA256_LOCK_ws_plan.json +0 -0
  358. {pen_stack-6.3.1 → pen_stack-6.4.1}/prereg/SHA256_LOCK_ws_policy.json +0 -0
  359. {pen_stack-6.3.1 → pen_stack-6.4.1}/prereg/SHA256_LOCK_ws_profile.json +0 -0
  360. {pen_stack-6.3.1 → pen_stack-6.4.1}/prereg/SHA256_LOCK_ws_proto.json +0 -0
  361. {pen_stack-6.3.1 → pen_stack-6.4.1}/prereg/SHA256_LOCK_ws_r.json +0 -0
  362. {pen_stack-6.3.1 → pen_stack-6.4.1}/prereg/SHA256_LOCK_ws_redteam.json +0 -0
  363. {pen_stack-6.3.1 → pen_stack-6.4.1}/prereg/SHA256_LOCK_ws_route.json +0 -0
  364. {pen_stack-6.3.1 → pen_stack-6.4.1}/prereg/SHA256_LOCK_ws_screen.json +0 -0
  365. {pen_stack-6.3.1 → pen_stack-6.4.1}/prereg/SHA256_LOCK_ws_seroprev.json +0 -0
  366. {pen_stack-6.3.1 → pen_stack-6.4.1}/prereg/SHA256_LOCK_ws_simlab.json +0 -0
  367. {pen_stack-6.3.1 → pen_stack-6.4.1}/prereg/SHA256_LOCK_ws_twincal.json +0 -0
  368. {pen_stack-6.3.1 → pen_stack-6.4.1}/prereg/SHA256_LOCK_ws_uq.json +0 -0
  369. {pen_stack-6.3.1 → pen_stack-6.4.1}/prereg/SHA256_LOCK_ws_v.json +0 -0
  370. {pen_stack-6.3.1 → pen_stack-6.4.1}/prereg/SHA256_LOCK_ws_vcell.json +0 -0
  371. {pen_stack-6.3.1 → pen_stack-6.4.1}/prereg/SHA256_LOCK_ws_wv.json +0 -0
  372. {pen_stack-6.3.1 → pen_stack-6.4.1}/prereg/paper1.yaml +0 -0
  373. {pen_stack-6.3.1 → pen_stack-6.4.1}/prereg/paper2.yaml +0 -0
  374. {pen_stack-6.3.1 → pen_stack-6.4.1}/prereg/paper3.yaml +0 -0
  375. {pen_stack-6.3.1 → pen_stack-6.4.1}/prereg/paper4.yaml +0 -0
  376. {pen_stack-6.3.1 → pen_stack-6.4.1}/prereg/phase0.yaml +0 -0
  377. {pen_stack-6.3.1 → pen_stack-6.4.1}/prereg/ws_a.yaml +0 -0
  378. {pen_stack-6.3.1 → pen_stack-6.4.1}/prereg/ws_acq.yaml +0 -0
  379. {pen_stack-6.3.1 → pen_stack-6.4.1}/prereg/ws_aldesign.yaml +0 -0
  380. {pen_stack-6.3.1 → pen_stack-6.4.1}/prereg/ws_alvalidate.yaml +0 -0
  381. {pen_stack-6.3.1 → pen_stack-6.4.1}/prereg/ws_atlas.yaml +0 -0
  382. {pen_stack-6.3.1 → pen_stack-6.4.1}/prereg/ws_b.yaml +0 -0
  383. {pen_stack-6.3.1 → pen_stack-6.4.1}/prereg/ws_ba.yaml +0 -0
  384. {pen_stack-6.3.1 → pen_stack-6.4.1}/prereg/ws_ba_v33.yaml +0 -0
  385. {pen_stack-6.3.1 → pen_stack-6.4.1}/prereg/ws_ba_v45.yaml +0 -0
  386. {pen_stack-6.3.1 → pen_stack-6.4.1}/prereg/ws_bench.yaml +0 -0
  387. {pen_stack-6.3.1 → pen_stack-6.4.1}/prereg/ws_c.yaml +0 -0
  388. {pen_stack-6.3.1 → pen_stack-6.4.1}/prereg/ws_cal.yaml +0 -0
  389. {pen_stack-6.3.1 → pen_stack-6.4.1}/prereg/ws_calib.yaml +0 -0
  390. {pen_stack-6.3.1 → pen_stack-6.4.1}/prereg/ws_challenge.yaml +0 -0
  391. {pen_stack-6.3.1 → pen_stack-6.4.1}/prereg/ws_chat.yaml +0 -0
  392. {pen_stack-6.3.1 → pen_stack-6.4.1}/prereg/ws_cite.yaml +0 -0
  393. {pen_stack-6.3.1 → pen_stack-6.4.1}/prereg/ws_continual.yaml +0 -0
  394. {pen_stack-6.3.1 → pen_stack-6.4.1}/prereg/ws_cosci2.yaml +0 -0
  395. {pen_stack-6.3.1 → pen_stack-6.4.1}/prereg/ws_crit.yaml +0 -0
  396. {pen_stack-6.3.1 → pen_stack-6.4.1}/prereg/ws_ct.yaml +0 -0
  397. {pen_stack-6.3.1 → pen_stack-6.4.1}/prereg/ws_d.yaml +0 -0
  398. {pen_stack-6.3.1 → pen_stack-6.4.1}/prereg/ws_drift.yaml +0 -0
  399. {pen_stack-6.3.1 → pen_stack-6.4.1}/prereg/ws_e.yaml +0 -0
  400. {pen_stack-6.3.1 → pen_stack-6.4.1}/prereg/ws_env.yaml +0 -0
  401. {pen_stack-6.3.1 → pen_stack-6.4.1}/prereg/ws_ep.yaml +0 -0
  402. {pen_stack-6.3.1 → pen_stack-6.4.1}/prereg/ws_epitope.yaml +0 -0
  403. {pen_stack-6.3.1 → pen_stack-6.4.1}/prereg/ws_f.yaml +0 -0
  404. {pen_stack-6.3.1 → pen_stack-6.4.1}/prereg/ws_frontend.yaml +0 -0
  405. {pen_stack-6.3.1 → pen_stack-6.4.1}/prereg/ws_g.yaml +0 -0
  406. {pen_stack-6.3.1 → pen_stack-6.4.1}/prereg/ws_gen.yaml +0 -0
  407. {pen_stack-6.3.1 → pen_stack-6.4.1}/prereg/ws_genotox.yaml +0 -0
  408. {pen_stack-6.3.1 → pen_stack-6.4.1}/prereg/ws_graph.yaml +0 -0
  409. {pen_stack-6.3.1 → pen_stack-6.4.1}/prereg/ws_h.yaml +0 -0
  410. {pen_stack-6.3.1 → pen_stack-6.4.1}/prereg/ws_hybrid.yaml +0 -0
  411. {pen_stack-6.3.1 → pen_stack-6.4.1}/prereg/ws_immune.yaml +0 -0
  412. {pen_stack-6.3.1 → pen_stack-6.4.1}/prereg/ws_ingest.yaml +0 -0
  413. {pen_stack-6.3.1 → pen_stack-6.4.1}/prereg/ws_innate.yaml +0 -0
  414. {pen_stack-6.3.1 → pen_stack-6.4.1}/prereg/ws_loop.yaml +0 -0
  415. {pen_stack-6.3.1 → pen_stack-6.4.1}/prereg/ws_manifest.yaml +0 -0
  416. {pen_stack-6.3.1 → pen_stack-6.4.1}/prereg/ws_mc.yaml +0 -0
  417. {pen_stack-6.3.1 → pen_stack-6.4.1}/prereg/ws_mcp.yaml +0 -0
  418. {pen_stack-6.3.1 → pen_stack-6.4.1}/prereg/ws_mech.yaml +0 -0
  419. {pen_stack-6.3.1 → pen_stack-6.4.1}/prereg/ws_mon.yaml +0 -0
  420. {pen_stack-6.3.1 → pen_stack-6.4.1}/prereg/ws_o.yaml +0 -0
  421. {pen_stack-6.3.1 → pen_stack-6.4.1}/prereg/ws_openapi.yaml +0 -0
  422. {pen_stack-6.3.1 → pen_stack-6.4.1}/prereg/ws_orch.yaml +0 -0
  423. {pen_stack-6.3.1 → pen_stack-6.4.1}/prereg/ws_outcome.yaml +0 -0
  424. {pen_stack-6.3.1 → pen_stack-6.4.1}/prereg/ws_pareto.yaml +0 -0
  425. {pen_stack-6.3.1 → pen_stack-6.4.1}/prereg/ws_peg.yaml +0 -0
  426. {pen_stack-6.3.1 → pen_stack-6.4.1}/prereg/ws_plan.yaml +0 -0
  427. {pen_stack-6.3.1 → pen_stack-6.4.1}/prereg/ws_policy.yaml +0 -0
  428. {pen_stack-6.3.1 → pen_stack-6.4.1}/prereg/ws_profile.yaml +0 -0
  429. {pen_stack-6.3.1 → pen_stack-6.4.1}/prereg/ws_proto.yaml +0 -0
  430. {pen_stack-6.3.1 → pen_stack-6.4.1}/prereg/ws_r.yaml +0 -0
  431. {pen_stack-6.3.1 → pen_stack-6.4.1}/prereg/ws_redteam.yaml +0 -0
  432. {pen_stack-6.3.1 → pen_stack-6.4.1}/prereg/ws_route.yaml +0 -0
  433. {pen_stack-6.3.1 → pen_stack-6.4.1}/prereg/ws_screen.yaml +0 -0
  434. {pen_stack-6.3.1 → pen_stack-6.4.1}/prereg/ws_seroprev.yaml +0 -0
  435. {pen_stack-6.3.1 → pen_stack-6.4.1}/prereg/ws_simlab.yaml +0 -0
  436. {pen_stack-6.3.1 → pen_stack-6.4.1}/prereg/ws_twincal.yaml +0 -0
  437. {pen_stack-6.3.1 → pen_stack-6.4.1}/prereg/ws_uq.yaml +0 -0
  438. {pen_stack-6.3.1 → pen_stack-6.4.1}/prereg/ws_v.yaml +0 -0
  439. {pen_stack-6.3.1 → pen_stack-6.4.1}/prereg/ws_vcell.yaml +0 -0
  440. {pen_stack-6.3.1 → pen_stack-6.4.1}/prereg/ws_wv.yaml +0 -0
  441. {pen_stack-6.3.1 → pen_stack-6.4.1}/scripts/p1_build_atlas.py +0 -0
  442. {pen_stack-6.3.1 → pen_stack-6.4.1}/scripts/p1_build_durability.py +0 -0
  443. {pen_stack-6.3.1 → pen_stack-6.4.1}/scripts/p1_export_tracks.py +0 -0
  444. {pen_stack-6.3.1 → pen_stack-6.4.1}/scripts/p1_safety_concordance.py +0 -0
  445. {pen_stack-6.3.1 → pen_stack-6.4.1}/scripts/p1_train_safety.py +0 -0
  446. {pen_stack-6.3.1 → pen_stack-6.4.1}/scripts/p1_validation_report.py +0 -0
  447. {pen_stack-6.3.1 → pen_stack-6.4.1}/scripts/p2_build_atlas.py +0 -0
  448. {pen_stack-6.3.1 → pen_stack-6.4.1}/scripts/p3_benchmark_report.py +0 -0
  449. {pen_stack-6.3.1 → pen_stack-6.4.1}/scripts/p4_genome_scan.py +0 -0
  450. {pen_stack-6.3.1 → pen_stack-6.4.1}/scripts/p52_build_genotox_oracle.py +0 -0
  451. {pen_stack-6.3.1 → pen_stack-6.4.1}/scripts/p53_build_epitope_oracle.py +0 -0
  452. {pen_stack-6.3.1 → pen_stack-6.4.1}/scripts/ws_b_report.py +0 -0
  453. {pen_stack-6.3.1 → pen_stack-6.4.1}/scripts/ws_c_report.py +0 -0
  454. {pen_stack-6.3.1 → pen_stack-6.4.1}/setup.cfg +0 -0
@@ -3,6 +3,41 @@
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.4.0] - 2026-06-12 - v6.4.0: Live Oracles (the foundation models actually execute)
7
+
8
+ **The oracle mesh goes live.** The foundation-model adapters that were deferred contracts now run real backends —
9
+ without touching the no-fabrication invariant (generated outputs stay candidates, OOD inputs are flagged, a down
10
+ backend defers). Live execution is opt-in via `PEN_STACK_ORACLE_NET=1`; with the flag unset (CI/offline) every
11
+ oracle behaves exactly as before. MINOR feature release on the stable 6.x API. Workstream WS-LIVE.
12
+
13
+ ### Added — live oracles
14
+ - **Evo2-40B (hosted)** — `oracles/genome.py::generate_dna` calls NVIDIA's hosted Evo2-40B (real generated DNA +
15
+ per-token probability). ~1–3 s.
16
+ - **AlphaGenome (hosted)** — `oracles/genome.py::variant_effect` **connected to the existing v3.1
17
+ `wgenome.AlphaGenomeProvider`** (added `score_variant`; no duplicate client) — a real regulatory variant-effect
18
+ magnitude. ~2–10 s. (AlphaGenome already ran live in v3.1 for expression/tracks/contact — 416 cached predictions.)
19
+ - **ProteinMPNN / ESM3-open / RFdiffusion (local GPU)** — `model_servers/{proteinmpnn,esm3,rfdiffusion}` small
20
+ FastAPI servers on the VM GPU (reuse `penstack:phase1.5` / `rfdiffusion:base`); `oracles/protein_design.py`
21
+ HTTP-calls them. ProteinMPNN ~1–9 s, ESM3 ~1–2 s warm, RFdiffusion ~1–2 min. `docker-compose.models.yml` starts
22
+ them on demand.
23
+ - **Execution + latency surface** — `configs/oracles/execution.yaml` + `oracles/status.py` (`oracle_status`,
24
+ `summary`) + `GET /oracles` + the chat meta facts: per-oracle execution, **latency class**
25
+ (instant/seconds/slow/long_job), and live status, so the assistant states the cost before running anything.
26
+
27
+ ### Held / honestly deferred
28
+ - **AlphaFold3 · Boltz-2 · Chai-1 · Protenix** — HELD: need a rented A100/H100 (24–80 GB; AF3 also ~1 TB
29
+ databases). Run **separately** on cloud, never on the 16 GB VM and never in the request path.
30
+ - **Arc STATE / scGPT** — package verified installable (`pip install arc-state`; SE-600M embeds cells), but a
31
+ trustworthy perturbation **outcome** needs the State-Transition model + a reference scRNA pipeline, and even
32
+ SOTA doesn't beat naive baselines (Arc VCC) — so the magnitude stays a known-unknown, honestly deferred
33
+ (uniform gated hook added via `PEN_STACK_VCELL_URL` for when an ST server is stood up).
34
+
35
+ ### Verified on the VM (RTX A4000)
36
+ Evo2-40B generation ~1.2 s; AlphaGenome variant score `chr22:36201698 A>C` max|effect| 3.15 over 14,652 tracks
37
+ in 3.6 s; ProteinMPNN designed real ubiquitin-fold sequences (global_score ~0.80) in ~9 s; ESM3-open completed the
38
+ ubiquitin sequence from a partial prompt in 1.4 s warm; RFdiffusion diffused a real 60-residue backbone in ~105 s.
39
+ All generated outputs remain candidates (`as_claim()` raises).
40
+
6
41
  ## [6.3.1] - 2026-06-12 - v6.3.1: router fix — general "how does it work" no longer misrouted to the meta lane
7
42
 
8
43
  **Patch (routing correctness).** Found by a rigorous full-stack test pass (every oracle + every endpoint + the 4
@@ -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.3.1
4
+ version: 6.4.0
5
5
  date-released: 2026-06-11
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.3.1
3
+ Version: 6.4.1
4
4
  Summary: Open infrastructure for genome writing: the Writable Genome atlas, the Writer Atlas, and the Write Planner.
5
5
  Author-email: Anees Ahmed Mahaboob Ali <ahmedaneesm@gmail.com>
6
6
  License: MIT
@@ -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.3.1-blue.svg)](CHANGELOG.md)
93
+ [![Version](https://img.shields.io/badge/version-6.4.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,20 @@ 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.4 — Live Oracles (the foundation models actually execute)
152
+
153
+ The foundation-model oracles now **run for real**, not just defer: **ViennaRNA** (in-process), **AlphaGenome**
154
+ (free DeepMind API — variant effect + regulatory tracks), **Evo2-40B** (NVIDIA hosted — DNA generation),
155
+ **ProteinMPNN** / **ESM3-open** / **RFdiffusion** (local GPU model servers). Each is opt-in via
156
+ `PEN_STACK_ORACLE_NET=1`; with the flag off, every oracle behaves exactly as before — and the no-fabrication
157
+ invariant is untouched (generated outputs stay **candidates**, OOD inputs are flagged, a down backend **defers**).
158
+
159
+ A new **execution + latency surface** (`GET /oracles`, `configs/oracles/execution.yaml`) tells you the cost up
160
+ front: *instant* / *seconds* / *slow* (~1–2 min, warn) / *long_job*. The cloud-A100 structure models
161
+ (AlphaFold3 · Boltz-2 · Chai-1 · Protenix) are **held on purpose** — they run **separately** on a rented A100,
162
+ never on the 16 GB VM and never in the request path. Arc STATE's perturbation **outcome** stays honestly
163
+ deferred (it needs the State-Transition model + a reference scRNA pipeline). See [docs/live_oracles.md](docs/live_oracles.md).
164
+
151
165
  ## What is new in v6.3 — The Hybrid Co-Scientist (grounded engine + general intelligence)
152
166
 
153
167
  The chat now does three things at once without ever blurring them: it **runs the engine** for genome-writing
@@ -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.3.1-blue.svg)](CHANGELOG.md)
18
+ [![Version](https://img.shields.io/badge/version-6.4.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,20 @@ 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.4 — Live Oracles (the foundation models actually execute)
77
+
78
+ The foundation-model oracles now **run for real**, not just defer: **ViennaRNA** (in-process), **AlphaGenome**
79
+ (free DeepMind API — variant effect + regulatory tracks), **Evo2-40B** (NVIDIA hosted — DNA generation),
80
+ **ProteinMPNN** / **ESM3-open** / **RFdiffusion** (local GPU model servers). Each is opt-in via
81
+ `PEN_STACK_ORACLE_NET=1`; with the flag off, every oracle behaves exactly as before — and the no-fabrication
82
+ invariant is untouched (generated outputs stay **candidates**, OOD inputs are flagged, a down backend **defers**).
83
+
84
+ A new **execution + latency surface** (`GET /oracles`, `configs/oracles/execution.yaml`) tells you the cost up
85
+ front: *instant* / *seconds* / *slow* (~1–2 min, warn) / *long_job*. The cloud-A100 structure models
86
+ (AlphaFold3 · Boltz-2 · Chai-1 · Protenix) are **held on purpose** — they run **separately** on a rented A100,
87
+ never on the 16 GB VM and never in the request path. Arc STATE's perturbation **outcome** stays honestly
88
+ deferred (it needs the State-Transition model + a reference scRNA pipeline). See [docs/live_oracles.md](docs/live_oracles.md).
89
+
76
90
  ## What is new in v6.3 — The Hybrid Co-Scientist (grounded engine + general intelligence)
77
91
 
78
92
  The chat now does three things at once without ever blurring them: it **runs the engine** for genome-writing
@@ -0,0 +1,87 @@
1
+ # How each oracle EXECUTES + its per-query latency class (PEN-STACK v6.4 "Live Oracles").
2
+ #
3
+ # This is the "tell the user the cost up front" table: before an oracle runs, the assistant can state how it
4
+ # executes and how long it will take, so latency is never a surprise.
5
+ #
6
+ # latency_class:
7
+ # instant — < 1 s (answer inline)
8
+ # seconds — ~1–10 s (answer inline)
9
+ # slow — ~10 s – 2 min (WARN: "running <model> on the GPU, ~N…", then answer)
10
+ # long_job — minutes–hours (WARN + run SEPARATELY on cloud; never block the chat)
11
+ #
12
+ # execution:
13
+ # in_process — runs in the engine process (no extra service)
14
+ # hosted_api — a free cloud API (no local GPU); needs a key
15
+ # local_gpu — a local model server on the VM GPU (start on demand); needs PEN_STACK_ORACLE_NET=1
16
+ # cloud_a100 — HELD: needs a rented A100/H100 (run separately, not active now)
17
+ # deferred — honestly deferred (would require a deeper pipeline; never fabricated)
18
+ oracles:
19
+ viennarna:
20
+ execution: in_process
21
+ latency_class: instant
22
+ live: always
23
+ note: "ViennaRNA MFE fold — runs in-process."
24
+
25
+ alphagenome:
26
+ execution: hosted_api
27
+ latency_class: seconds
28
+ live_when: "configs/alphagenome_api_key.txt (or ALPHAGENOME_API_KEY) present + PEN_STACK_ORACLE_NET=1"
29
+ note: "Free DeepMind AlphaGenome API (variant effect + expression/tracks/contact). ~2–10 s."
30
+
31
+ evo2:
32
+ execution: hosted_api
33
+ latency_class: seconds
34
+ live_when: "NVIDIA key present + PEN_STACK_ORACLE_NET=1"
35
+ note: "NVIDIA hosted Evo2-40B (DNA generation). ~1–3 s for short generations."
36
+
37
+ proteinmpnn:
38
+ execution: local_gpu
39
+ latency_class: seconds
40
+ server: "penmodel:proteinmpnn — http://localhost:9011"
41
+ note: "Sequence design for a backbone PDB. ~1–9 s."
42
+
43
+ esm3:
44
+ execution: local_gpu
45
+ latency_class: seconds
46
+ server: "penmodel:esm3 — http://localhost:9012"
47
+ note: "ESM3-open 1.4B protein generation/completion. ~1–2 s warm (~60 s cold weight download)."
48
+
49
+ rfdiffusion:
50
+ execution: local_gpu
51
+ latency_class: slow
52
+ server: "penmodel:rfdiffusion — http://localhost:9013"
53
+ note: "Backbone diffusion. ~1–2 min per backbone — WARN the user before running."
54
+
55
+ state:
56
+ execution: deferred
57
+ latency_class: long_job
58
+ live: false
59
+ note: "Arc STATE: `pip install arc-state` (SE-600M embeds cells). A trustworthy perturbation OUTCOME needs the
60
+ State-Transition model + a reference scRNA population; even SOTA doesn't beat naive baselines (Arc VCC), so
61
+ the magnitude stays a known-unknown — honestly deferred, never fabricated."
62
+ scgpt:
63
+ execution: deferred
64
+ latency_class: long_job
65
+ live: false
66
+ note: "scGPT virtual-cell — honestly deferred (same rationale as Arc STATE)."
67
+
68
+ alphafold3:
69
+ execution: cloud_a100
70
+ latency_class: long_job
71
+ live: false
72
+ note: "HELD — run SEPARATELY on a cloud A100/H100 80 GB (+ ~1 TB databases). ~10 min–hours. Not active now."
73
+ boltz-2:
74
+ execution: cloud_a100
75
+ latency_class: long_job
76
+ live: false
77
+ note: "HELD — run SEPARATELY on a cloud A100 (24–48 GB). ~1–10 min. Not active now."
78
+ chai-1:
79
+ execution: cloud_a100
80
+ latency_class: long_job
81
+ live: false
82
+ note: "HELD — run SEPARATELY on a cloud A100 (24 GB+). ~1–10 min. Not active now."
83
+ protenix:
84
+ execution: cloud_a100
85
+ latency_class: long_job
86
+ live: false
87
+ note: "HELD — run SEPARATELY on a cloud A100. ~1–10 min. Not active now."
@@ -0,0 +1,56 @@
1
+ # Live Oracles (v6.4)
2
+
3
+ PEN-STACK's foundation-model oracles can **actually execute** — not just defer. v6.4 wires the live paths and
4
+ adds an honest **execution + latency** surface so the assistant tells you the cost *before* it runs anything.
5
+
6
+ ## The no-fabrication invariant is unchanged
7
+
8
+ Live or deferred, the rule holds: a generative output is a **candidate** (`as_claim()` raises), an OOD input is
9
+ flagged `extrapolating`, and when a backend is down the adapter **defers** — it never fabricates a number.
10
+ Turning a model "on" is opt-in via **`PEN_STACK_ORACLE_NET=1`**; with the flag unset (CI / offline) every oracle
11
+ behaves exactly as before.
12
+
13
+ ## What runs where, and how long
14
+
15
+ | Oracle | Execution | Latency | How to enable |
16
+ |---|---|---|---|
17
+ | **ViennaRNA** | in-process | **instant** (<1 s) | always on |
18
+ | **AlphaGenome** | hosted API (free) | **seconds** (~2–10 s) | `configs/alphagenome_api_key.txt` + `PEN_STACK_ORACLE_NET=1` |
19
+ | **Evo2-40B** | hosted API (NVIDIA) | **seconds** (~1–3 s) | `configs/nvidia_api_key.txt` + `PEN_STACK_ORACLE_NET=1` |
20
+ | **ProteinMPNN** | local GPU server :9011 | **seconds** (~1–9 s) | start the model server + `PEN_STACK_ORACLE_NET=1` |
21
+ | **ESM3-open 1.4B** | local GPU server :9012 | **seconds** (~1–2 s warm) | start the model server + flag |
22
+ | **RFdiffusion** | local GPU server :9013 | **slow** (~1–2 min) | start the model server + flag *(warn the user)* |
23
+ | Arc STATE / scGPT | deferred | long_job | perturbation **outcome** needs the State-Transition model + a reference scRNA pipeline; honestly deferred |
24
+ | AlphaFold3 · Boltz-2 · Chai-1 · Protenix | **HELD** (cloud A100) | long_job | run **separately** on a rented A100/H100; not active now |
25
+
26
+ Query the live status any time: `GET /oracles` (add `?probe=true` to ping the local servers), or
27
+ `pen_stack.oracles.status.summary()`.
28
+
29
+ ## Starting the local GPU model servers (on demand)
30
+
31
+ The local models run as small FastAPI services on the VM GPU — start only what you need:
32
+
33
+ ```bash
34
+ # build bases once (penstack:phase1.5 already on the VM; rfdiffusion:base from the RFdiffusion repo)
35
+ docker compose -f docker-compose.models.yml up -d proteinmpnn esm3 # the fast ones
36
+ docker compose -f docker-compose.models.yml up -d rfdiffusion # the slow one (~1–2 min/run)
37
+ ```
38
+
39
+ Then run the engine with the live flag + keys:
40
+
41
+ ```bash
42
+ PEN_STACK_ORACLE_NET=1 \
43
+ NVIDIA_API_KEY=$(cat configs/nvidia_api_key.txt) \
44
+ ALPHAGENOME_API_KEY=$(cat configs/alphagenome_api_key.txt) \
45
+ uvicorn pen_stack.web.server:app --port 8000
46
+ ```
47
+
48
+ ## Latency policy ("tell the user up front")
49
+
50
+ - **instant / seconds** → answered inline.
51
+ - **slow** (RFdiffusion) → *"Running RFdiffusion on the GPU, ~1–2 min…"* then the result.
52
+ - **long_job** (AF3 / Boltz / Chai / Protenix) → *"This needs a cloud A100 and takes minutes — run it separately"*;
53
+ never silently blocks the chat.
54
+
55
+ The cloud-A100 structure models are **held on purpose** (see the v6.4 changelog): they can be run via these same
56
+ oracle adapters by pointing them at a cloud GPU, just not on the 16 GB VM and not in the request path.
@@ -1,2 +1,2 @@
1
1
  """PEN-STACK v3.0 - open infrastructure for genome writing."""
2
- __version__ = "6.3.1"
2
+ __version__ = "6.4.1"
@@ -57,12 +57,19 @@ def capability_manifest() -> dict[str, Any]:
57
57
  "guarantees": ["rule-grounded legality", "calibrated confidence", "explicit scope / known-unknowns",
58
58
  "biosecurity safety gate", "no fabrication"],
59
59
  "tools": _TOOLS,
60
- "surfaces": {"rest": "/capabilities, /scope, /verify, /generate, /predict, /immune, /safety, /suggest, "
61
- "/session, /openapi.json", "mcp": "pen_stack.agent.mcp_server",
60
+ "oracles": _oracle_summary(),
61
+ "surfaces": {"rest": "/capabilities, /scope, /oracles, /verify, /generate, /predict, /immune, /safety, "
62
+ "/suggest, /session, /openapi.json", "mcp": "pen_stack.agent.mcp_server",
62
63
  "challenge": "benchmarks/genome_writing_challenge"},
63
64
  }
64
65
 
65
66
 
67
+ def _oracle_summary() -> dict:
68
+ """Live-oracle roll-up (v6.4): which foundation models execute live, their latency class, what is held/deferred."""
69
+ from pen_stack.oracles.status import summary
70
+ return summary()
71
+
72
+
66
73
  def _known_unknowns() -> list[dict]:
67
74
  """The known-unknowns as PUBLIC data (id/title/requires/why) — internal matcher fields are not exposed."""
68
75
  from pen_stack.agent.scope import load_registry
@@ -0,0 +1,167 @@
1
+ """Genome oracles (v4.0, WS-O1) — AlphaGenome / Evo2 / accessibility baselines, under one contract.
2
+
3
+ AlphaGenome (regulatory tracks + variant effect) is **OOD-gated**: scoring a locus outside the model's
4
+ training distribution sets `extrapolating=True` / `in_scope=False` (the model does not generalize to unseen
5
+ loci — labelled, not hidden). Evo2 supplies a likelihood/zero-shot *claim*-scope scalar and, separately,
6
+ *generated DNA candidates* (output_kind=candidate → cannot enter a claim path). ChromBPNet/Borzoi are kept as
7
+ honest baselines. Heavy backends run on-demand and are cached; when absent the adapter defers (or replays a
8
+ committed cache entry) rather than fabricating a value.
9
+ """
10
+ from __future__ import annotations
11
+
12
+ import os
13
+ import re
14
+
15
+ from pen_stack.oracles import build_result, cache_get, cache_put
16
+ from pen_stack.oracles.schema import OracleResult
17
+
18
+ # ---- hosted Evo2-40B (NVIDIA) — live path, opt-in via PEN_STACK_ORACLE_NET=1 (CI stays offline by default) ----
19
+ _EVO2_URL = "https://health.api.nvidia.com/v1/biology/arc/evo2-40b/generate"
20
+
21
+
22
+ def _oracle_net_enabled() -> bool:
23
+ """Live oracle network calls are opt-in (the deployed VM sets it; CI/offline leave it unset → deferred)."""
24
+ return os.getenv("PEN_STACK_ORACLE_NET") == "1"
25
+
26
+
27
+ def _nvidia_key() -> str | None:
28
+ key = os.getenv("NVIDIA_API_KEY")
29
+ if key:
30
+ return key.strip()
31
+ from pen_stack._resources import project_root
32
+ f = project_root() / "configs" / "nvidia_api_key.txt"
33
+ return f.read_text(encoding="utf-8").strip() if f.exists() else None
34
+
35
+
36
+ def _sanitize_dna(s: str) -> str:
37
+ return "".join(c for c in (s or "").upper() if c in "ACGTN")
38
+
39
+
40
+ def _call_evo2_generate(seed: str, n: int) -> dict:
41
+ import requests
42
+ key = _nvidia_key()
43
+ if not key:
44
+ raise RuntimeError("no NVIDIA_API_KEY for hosted Evo2")
45
+ body = {"sequence": seed, "num_tokens": int(n), "top_k": 4, "enable_sampled_probs": True}
46
+ r = requests.post(_EVO2_URL, headers={"Authorization": f"Bearer {key}", "Content-Type": "application/json"},
47
+ json=body, timeout=float(os.getenv("PEN_STACK_ORACLE_TIMEOUT", "120")))
48
+ r.raise_for_status()
49
+ return r.json()
50
+
51
+
52
+ def _deferred_or_cached(oracle: str, model: str, inputs: dict, *, extrapolating: bool = False,
53
+ in_scope: bool = True, output_kind: str | None = None,
54
+ backend_note: str = "backend not installed") -> OracleResult:
55
+ r = build_result(oracle, model, inputs=inputs, available=False, extrapolating=extrapolating,
56
+ in_scope=in_scope, output_kind=output_kind, note=backend_note)
57
+ hit = cache_get(r.provenance.cache_key)
58
+ if hit is not None:
59
+ return build_result(oracle, model, inputs=inputs, value=hit.get("value"),
60
+ native_uncertainty=hit.get("native_uncertainty"), available=True, cached=True,
61
+ source="cache", extrapolating=extrapolating, in_scope=in_scope,
62
+ output_kind=output_kind, note="replayed from committed oracle cache")
63
+ return r
64
+
65
+
66
+ _VAR_RE = re.compile(r"(?:(chr[\w]+)[:\s]*)?(\d+)?\s*([ACGT]+)\s*>\s*([ACGT]+)", re.I)
67
+ _LOCUS_RE = re.compile(r"(chr[\w]+)[:\s]*(\d+)?", re.I)
68
+
69
+
70
+ def _parse_variant(variant: str, locus: str):
71
+ """Parse a variant ('chr1:1000 A>T' / 'chr1:1A>T' / 'A>G' + locus 'chr19:1010000') -> (chrom,pos,ref,alt)."""
72
+ m = _VAR_RE.search(variant or "")
73
+ if not m:
74
+ return None
75
+ chrom, pos, ref, alt = m.group(1), m.group(2), m.group(3), m.group(4)
76
+ if not chrom or not pos:
77
+ lm = _LOCUS_RE.search(locus or "")
78
+ if lm:
79
+ chrom = chrom or lm.group(1)
80
+ pos = pos or lm.group(2)
81
+ if not (chrom and pos and ref and alt):
82
+ return None
83
+ return chrom, int(pos), ref.upper(), alt.upper()
84
+
85
+
86
+ def variant_effect(variant: str, locus: str, in_distribution: bool = True) -> OracleResult:
87
+ """AlphaGenome variant-effect prediction, OOD-gated by `in_distribution`.
88
+
89
+ LIVE via the existing `wgenome.AlphaGenomeProvider` (real `score_variant`, REF vs ALT) when
90
+ `PEN_STACK_ORACLE_NET=1` and the alphagenome package + key are present; otherwise deferred / cache-replay
91
+ (value None, OOD gate intact, never fabricated). Reuses the v3.1 provider — no duplicate client."""
92
+ inputs = {"variant": variant, "locus": locus}
93
+ parsed = _parse_variant(variant, locus)
94
+ if _oracle_net_enabled() and parsed:
95
+ from pen_stack.wgenome.providers import AlphaGenomeProvider
96
+ prov = AlphaGenomeProvider()
97
+ if prov.available():
98
+ chrom, pos, ref, alt = parsed
99
+ try:
100
+ rec = prov.score_variant(chrom, pos, ref, alt)
101
+ except Exception as e: # noqa: BLE001 - hosted/network; defer honestly, never fabricate
102
+ return _deferred_or_cached("genome", "alphagenome", inputs, extrapolating=not in_distribution,
103
+ in_scope=in_distribution,
104
+ backend_note=f"AlphaGenome score_variant failed ({type(e).__name__}); deferred")
105
+ if rec.get("available"):
106
+ return build_result(
107
+ "genome", "alphagenome", inputs=inputs,
108
+ value={"effect_max_abs": rec["effect_max_abs"], "effect_mean_abs": rec["effect_mean_abs"],
109
+ "output": rec["output"], "n_scores": rec["n_scores"],
110
+ "chrom": chrom, "position": pos, "ref": ref, "alt": alt},
111
+ available=True, source="hosted_api", extrapolating=not in_distribution, in_scope=in_distribution,
112
+ note=("AlphaGenome score_variant (REF vs ALT, recommended RNA_SEQ scorer): max|effect| over the "
113
+ "predicted regulatory tracks. A regulatory-effect magnitude, not a claim the edit works."))
114
+ # deferred / cache-replay — package/key/flag absent or variant unparseable (OOD gate preserved, no fabrication)
115
+ return _deferred_or_cached("genome", "alphagenome", inputs, extrapolating=not in_distribution,
116
+ in_scope=in_distribution,
117
+ backend_note="AlphaGenome deferred (set PEN_STACK_ORACLE_NET=1 + package/key to score live)")
118
+
119
+
120
+ def sequence_likelihood(seq: str) -> OracleResult:
121
+ """Evo2 zero-shot sequence likelihood — a claim-scope scalar (NOT a generated sequence)."""
122
+ inputs = {"seq_len": len(seq), "seq": seq.upper()}
123
+ try:
124
+ import evo2 # noqa: F401
125
+ except Exception: # noqa: BLE001
126
+ return _deferred_or_cached("genome", "evo2", inputs, output_kind="claim",
127
+ backend_note="Evo2 backend not installed (large; on-demand)")
128
+ return build_result("genome", "evo2", inputs=inputs, output_kind="claim", available=False,
129
+ note="Evo2 present; wire likelihood scoring for the live value")
130
+
131
+
132
+ def generate_dna(prompt: str, n: int = 20) -> OracleResult:
133
+ """Evo2 generative DNA — a CANDIDATE (output_kind=candidate); cannot enter a claim path unverified.
134
+
135
+ LIVE via NVIDIA's hosted Evo2-40B when `PEN_STACK_ORACLE_NET=1` and an NVIDIA key is present: Evo2 conditions
136
+ on a DNA context (the seed) and extends it; the per-token model probability is surfaced as native uncertainty.
137
+ Otherwise deferred / cache-replay (value None, never fabricated). The result is still a CANDIDATE — a generated
138
+ sequence is a proposal, not a claim (`as_claim()` raises)."""
139
+ seed = _sanitize_dna(prompt)
140
+ inputs = {"prompt": prompt, "seed": seed, "n": int(n)}
141
+ if _oracle_net_enabled() and _nvidia_key() and seed:
142
+ key_obj = build_result("genome", "evo2", inputs=inputs, output_kind="candidate")
143
+ try:
144
+ resp = _call_evo2_generate(seed, n)
145
+ except Exception as e: # noqa: BLE001 - hosted/network; fall back to deferred honestly (no fabrication)
146
+ return _deferred_or_cached("genome", "evo2", inputs, output_kind="candidate",
147
+ backend_note=f"hosted Evo2 call failed ({type(e).__name__}); deferred")
148
+ continuation = _sanitize_dna(resp.get("sequence", "")) # hosted endpoint returns the continuation only
149
+ probs = resp.get("sampled_probs") or []
150
+ mean_p = (sum(probs) / len(probs)) if probs else None
151
+ unc = round(1.0 - mean_p, 4) if mean_p is not None else None
152
+ val = {"generated": continuation, "full": seed + continuation, "seed": seed,
153
+ "per_token_prob": probs, "n_tokens": len(continuation), "elapsed_ms": resp.get("elapsed_ms")}
154
+ cache_put(key_obj.provenance.cache_key, {"value": val, "native_uncertainty": unc})
155
+ return build_result("genome", "evo2", inputs=inputs, value=val, native_uncertainty=unc,
156
+ available=True, source="hosted_api", output_kind="candidate",
157
+ note=("Evo2-40B (NVIDIA hosted) extended the DNA seed; per-token model probability "
158
+ "surfaced as uncertainty. CANDIDATE — verify (writer-verification) before any claim."))
159
+ return _deferred_or_cached("genome", "evo2", inputs, output_kind="candidate",
160
+ backend_note="Evo2 generation is a CANDIDATE; verify before any claim")
161
+
162
+
163
+ def accessibility_baseline(locus: str) -> OracleResult:
164
+ """ChromBPNet/Borzoi accessibility/expression — an honest BASELINE comparator to AlphaGenome."""
165
+ inputs = {"locus": locus}
166
+ return _deferred_or_cached("genome", "chrombpnet_borzoi", inputs, output_kind="baseline",
167
+ backend_note="ChromBPNet/Borzoi baseline; on-demand")
@@ -0,0 +1,136 @@
1
+ """Protein-design oracles (v4.0, WS-O3) — RFdiffusion / ProteinMPNN / ESM3, all CANDIDATES.
2
+
3
+ Every output here is a generative **candidate** (output_kind=candidate): a backbone, a designed sequence, or
4
+ an ESM3 design. By the contract (`OracleResult.as_claim()` raises) and a guard test, none of these can enter a
5
+ claim path without passing writer-verification (WS-WV) scoring against measured data — the encoded
6
+ pen-assemble lesson (0 validatable de-novo writers; we score/critique, never assert function). Heavy backends
7
+ run on-demand; absent → deferred candidate.
8
+ """
9
+ from __future__ import annotations
10
+
11
+ import os
12
+
13
+ from pen_stack.oracles import build_result, cache_get, cache_put
14
+ from pen_stack.oracles.schema import OracleResult
15
+
16
+
17
+ def _oracle_net_enabled() -> bool:
18
+ """Live oracle calls are opt-in (the VM sets it; CI/offline leave it unset → deferred)."""
19
+ return os.getenv("PEN_STACK_ORACLE_NET") == "1"
20
+
21
+
22
+ def _model_server(env_var: str, default: str) -> str:
23
+ return os.getenv(env_var, default).rstrip("/")
24
+
25
+
26
+ def _post(url: str, payload: dict, timeout_env: str = "PEN_STACK_MODEL_TIMEOUT", default_timeout: str = "600"):
27
+ import requests
28
+ r = requests.post(url, json=payload, timeout=float(os.getenv(timeout_env, default_timeout)))
29
+ r.raise_for_status()
30
+ return r.json()
31
+
32
+
33
+ def _candidate(model: str, inputs: dict, backend: str, note: str) -> OracleResult:
34
+ r = build_result("protein_design", model, inputs=inputs, available=False, output_kind="candidate", note=note)
35
+ hit = cache_get(r.provenance.cache_key)
36
+ if hit is not None:
37
+ return build_result("protein_design", model, inputs=inputs, value=hit.get("value"), available=True,
38
+ cached=True, source="cache", output_kind="candidate",
39
+ note="replayed from committed oracle cache (still a CANDIDATE)")
40
+ try:
41
+ __import__(backend)
42
+ except Exception: # noqa: BLE001
43
+ return r
44
+ return build_result("protein_design", model, inputs=inputs, available=False, output_kind="candidate",
45
+ note=f"{model} present; wire the generator (output stays a CANDIDATE)")
46
+
47
+
48
+ def generate_backbone(spec: dict, model: str = "rfdiffusion") -> OracleResult:
49
+ """RFdiffusion / RFdiffusion-AA backbone generation — a CANDIDATE.
50
+
51
+ LIVE via the local RFdiffusion model server (`PEN_STACK_RFDIFFUSION_URL`, default localhost:9013) when
52
+ `PEN_STACK_ORACLE_NET=1`, the spec gives a `length` or `contigs`, and the service is up: RFdiffusion
53
+ diffuses a real backbone PDB (still a CANDIDATE — verify before any claim). Otherwise deferred."""
54
+ inputs = {"spec": spec}
55
+ length = (spec or {}).get("length") if isinstance(spec, dict) else None
56
+ contigs = (spec or {}).get("contigs") if isinstance(spec, dict) else None
57
+ if _oracle_net_enabled() and (length or contigs):
58
+ key_obj = build_result("protein_design", model, inputs=inputs, output_kind="candidate")
59
+ url = _model_server("PEN_STACK_RFDIFFUSION_URL", "http://localhost:9013")
60
+ payload = {k: v for k, v in {"length": length, "contigs": contigs,
61
+ "num_designs": spec.get("num_designs", 1)}.items() if v is not None}
62
+ try:
63
+ resp = _post(f"{url}/generate", payload, default_timeout="1200")
64
+ except Exception: # noqa: BLE001 - service down → defer honestly
65
+ return _candidate(model, inputs, "rfdiffusion",
66
+ "RFdiffusion server unreachable; deferred CANDIDATE (start the model server)")
67
+ designs = resp.get("designs") or []
68
+ val = {"designs": designs, "n": len(designs), "contigs": resp.get("contigs"),
69
+ "n_residues": (designs[0].get("n_residues") if designs else None)}
70
+ cache_put(key_obj.provenance.cache_key, {"value": val})
71
+ return build_result("protein_design", model, inputs=inputs, value=val, available=True,
72
+ source="local_gpu", output_kind="candidate",
73
+ note=("RFdiffusion diffused a backbone (local GPU). CANDIDATE — design a sequence "
74
+ "(ProteinMPNN) + verify fold/activity before any claim."))
75
+ return _candidate(model, inputs, "rfdiffusion",
76
+ "RFdiffusion backbone is a CANDIDATE; verify before any claim")
77
+
78
+
79
+ def design_sequence(backbone: dict, model: str = "proteinmpnn") -> OracleResult:
80
+ """ProteinMPNN / LigandMPNN sequence design for a fixed backbone — a CANDIDATE.
81
+
82
+ LIVE via the local ProteinMPNN model server (`PEN_STACK_PROTEINMPNN_URL`, default localhost:9011) when
83
+ `PEN_STACK_ORACLE_NET=1`, the backbone carries a `pdb`, and the service is up; the designed sequences are a
84
+ real ProteinMPNN output (still a CANDIDATE — `as_claim()` raises). Otherwise deferred / cache-replay."""
85
+ inputs = {"backbone": backbone}
86
+ pdb = (backbone or {}).get("pdb") if isinstance(backbone, dict) else None
87
+ if _oracle_net_enabled() and isinstance(pdb, str) and "ATOM" in pdb:
88
+ key_obj = build_result("protein_design", model, inputs=inputs, output_kind="candidate")
89
+ url = _model_server("PEN_STACK_PROTEINMPNN_URL", "http://localhost:9011")
90
+ try:
91
+ resp = _post(f"{url}/design", {"pdb": pdb, "chains": backbone.get("chains"),
92
+ "num_seqs": int(backbone.get("num_seqs", 4))})
93
+ except Exception: # noqa: BLE001 - service down/unreachable → defer honestly (no fabrication)
94
+ return _candidate(model, inputs, "proteinmpnn",
95
+ "ProteinMPNN server unreachable; deferred CANDIDATE (start the model server to design)")
96
+ designs = resp.get("designs") or []
97
+ best = min((d.get("global_score") for d in designs if d.get("global_score") is not None), default=None)
98
+ val = {"designs": designs, "n": len(designs), "best_global_score": best}
99
+ cache_put(key_obj.provenance.cache_key, {"value": val})
100
+ return build_result("protein_design", model, inputs=inputs, value=val, available=True,
101
+ source="local_gpu", output_kind="candidate",
102
+ note=("ProteinMPNN designed sequences for the backbone (local GPU). CANDIDATE — score "
103
+ "against measured data (writer-verification) before any claim."))
104
+ return _candidate(model, inputs, "proteinmpnn",
105
+ "ProteinMPNN sequence is a CANDIDATE; score against measured data before any claim")
106
+
107
+
108
+ def esm3_design(prompt: dict, model: str = "esm3") -> OracleResult:
109
+ """ESM3 generative protein design / representation — a CANDIDATE.
110
+
111
+ LIVE via the local ESM3-open model server (`PEN_STACK_ESM3_URL`, default localhost:9012) when
112
+ `PEN_STACK_ORACLE_NET=1`, the prompt gives a masked `sequence` or a `length`, and the service is up: ESM3
113
+ generates a real protein (still a CANDIDATE — verify fold/activity before any claim). Otherwise deferred."""
114
+ inputs = {"prompt": prompt}
115
+ seq = (prompt or {}).get("sequence") if isinstance(prompt, dict) else None
116
+ length = (prompt or {}).get("length") if isinstance(prompt, dict) else None
117
+ if _oracle_net_enabled() and (seq or length):
118
+ key_obj = build_result("protein_design", model, inputs=inputs, output_kind="candidate")
119
+ url = _model_server("PEN_STACK_ESM3_URL", "http://localhost:9012")
120
+ payload = {k: v for k, v in {"sequence": seq, "length": length,
121
+ "num_steps": prompt.get("num_steps"),
122
+ "temperature": prompt.get("temperature")}.items() if v is not None}
123
+ try:
124
+ resp = _post(f"{url}/generate", payload)
125
+ except Exception: # noqa: BLE001 - service down → defer honestly
126
+ return _candidate(model, inputs, "esm",
127
+ "ESM3 server unreachable; deferred CANDIDATE (start the model server to design)")
128
+ val = {"sequence": resp.get("sequence"), "length": resp.get("length"),
129
+ "num_steps": resp.get("num_steps"), "model": resp.get("backend")}
130
+ cache_put(key_obj.provenance.cache_key, {"value": val})
131
+ return build_result("protein_design", model, inputs=inputs, value=val, available=True,
132
+ source="local_gpu", output_kind="candidate",
133
+ note=("ESM3-open generated a protein sequence (local GPU). CANDIDATE — verify "
134
+ "fold/activity (writer-verification) before any claim."))
135
+ return _candidate(model, inputs, "esm",
136
+ "ESM3 design is a CANDIDATE; verify fold/activity before any claim")