pen-stack 6.2.4__tar.gz → 6.3.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (450) hide show
  1. {pen_stack-6.2.4 → pen_stack-6.3.0}/CHANGELOG.md +33 -0
  2. {pen_stack-6.2.4 → pen_stack-6.3.0}/CITATION.cff +1 -1
  3. {pen_stack-6.2.4 → pen_stack-6.3.0}/PKG-INFO +26 -5
  4. {pen_stack-6.2.4 → pen_stack-6.3.0}/README.md +25 -4
  5. pen_stack-6.3.0/configs/metric_guide.yaml +102 -0
  6. {pen_stack-6.2.4 → pen_stack-6.3.0}/pen_stack/__init__.py +1 -1
  7. pen_stack-6.3.0/pen_stack/web/guide.py +103 -0
  8. pen_stack-6.3.0/pen_stack/web/llm.py +321 -0
  9. pen_stack-6.3.0/pen_stack/web/router.py +96 -0
  10. {pen_stack-6.2.4 → pen_stack-6.3.0}/pen_stack/web/server.py +4 -2
  11. {pen_stack-6.2.4 → pen_stack-6.3.0}/pen_stack.egg-info/PKG-INFO +26 -5
  12. {pen_stack-6.2.4 → pen_stack-6.3.0}/pen_stack.egg-info/SOURCES.txt +5 -0
  13. pen_stack-6.3.0/prereg/SHA256_LOCK_ws_hybrid.json +8 -0
  14. pen_stack-6.3.0/prereg/ws_hybrid.yaml +30 -0
  15. {pen_stack-6.2.4 → pen_stack-6.3.0}/pyproject.toml +1 -1
  16. pen_stack-6.2.4/pen_stack/web/llm.py +0 -226
  17. {pen_stack-6.2.4 → pen_stack-6.3.0}/LICENSE +0 -0
  18. {pen_stack-6.2.4 → pen_stack-6.3.0}/MANIFEST.in +0 -0
  19. {pen_stack-6.2.4 → pen_stack-6.3.0}/bench/run.py +0 -0
  20. {pen_stack-6.2.4 → pen_stack-6.3.0}/benchmarks/genome_writing_bench/LEADERBOARD.md +0 -0
  21. {pen_stack-6.2.4 → pen_stack-6.3.0}/benchmarks/genome_writing_bench/README.md +0 -0
  22. {pen_stack-6.2.4 → pen_stack-6.3.0}/benchmarks/genome_writing_bench/SHA256SUMS +0 -0
  23. {pen_stack-6.2.4 → pen_stack-6.3.0}/benchmarks/genome_writing_bench/SUBMISSIONS.md +0 -0
  24. {pen_stack-6.2.4 → pen_stack-6.3.0}/benchmarks/genome_writing_bench/tasks.yaml +0 -0
  25. {pen_stack-6.2.4 → pen_stack-6.3.0}/benchmarks/genome_writing_challenge/README.md +0 -0
  26. {pen_stack-6.2.4 → pen_stack-6.3.0}/benchmarks/genome_writing_challenge/SUBMISSIONS.md +0 -0
  27. {pen_stack-6.2.4 → pen_stack-6.3.0}/configs/antipeg.yaml +0 -0
  28. {pen_stack-6.2.4 → pen_stack-6.3.0}/configs/atlas_families.yaml +0 -0
  29. {pen_stack-6.2.4 → pen_stack-6.3.0}/configs/bridge_offtarget_profile.yaml +0 -0
  30. {pen_stack-6.2.4 → pen_stack-6.3.0}/configs/capsid_epitope_oracle.yaml +0 -0
  31. {pen_stack-6.2.4 → pen_stack-6.3.0}/configs/capsid_sequences.fasta +0 -0
  32. {pen_stack-6.2.4 → pen_stack-6.3.0}/configs/cargo_polish.yaml +0 -0
  33. {pen_stack-6.2.4 → pen_stack-6.3.0}/configs/cell_types.yaml +0 -0
  34. {pen_stack-6.2.4 → pen_stack-6.3.0}/configs/datasets.yaml +0 -0
  35. {pen_stack-6.2.4 → pen_stack-6.3.0}/configs/delivery_constraints.yaml +0 -0
  36. {pen_stack-6.2.4 → pen_stack-6.3.0}/configs/delivery_rules.yaml +0 -0
  37. {pen_stack-6.2.4 → pen_stack-6.3.0}/configs/delivery_vehicles.yaml +0 -0
  38. {pen_stack-6.2.4 → pen_stack-6.3.0}/configs/gates_v3.yaml +0 -0
  39. {pen_stack-6.2.4 → pen_stack-6.3.0}/configs/genotoxicity_oracle.yaml +0 -0
  40. {pen_stack-6.2.4 → pen_stack-6.3.0}/configs/gsh_validated_heldout.yaml +0 -0
  41. {pen_stack-6.2.4 → pen_stack-6.3.0}/configs/intent_weights.yaml +0 -0
  42. {pen_stack-6.2.4 → pen_stack-6.3.0}/configs/known_unknowns.yaml +0 -0
  43. {pen_stack-6.2.4 → pen_stack-6.3.0}/configs/llm.yaml +0 -0
  44. {pen_stack-6.2.4 → pen_stack-6.3.0}/configs/monitor_queries.yaml +0 -0
  45. {pen_stack-6.2.4 → pen_stack-6.3.0}/configs/oracles/scope_cards.yaml +0 -0
  46. {pen_stack-6.2.4 → pen_stack-6.3.0}/configs/rules/delivery.yaml +0 -0
  47. {pen_stack-6.2.4 → pen_stack-6.3.0}/configs/rules/fold.yaml +0 -0
  48. {pen_stack-6.2.4 → pen_stack-6.3.0}/configs/rules/multiplex.yaml +0 -0
  49. {pen_stack-6.2.4 → pen_stack-6.3.0}/configs/rules/payload.yaml +0 -0
  50. {pen_stack-6.2.4 → pen_stack-6.3.0}/configs/rules/reachability.yaml +0 -0
  51. {pen_stack-6.2.4 → pen_stack-6.3.0}/configs/safety/hazard_registry.yaml +0 -0
  52. {pen_stack-6.2.4 → pen_stack-6.3.0}/configs/safety/policy.yaml +0 -0
  53. {pen_stack-6.2.4 → pen_stack-6.3.0}/configs/safety/probes.yaml +0 -0
  54. {pen_stack-6.2.4 → pen_stack-6.3.0}/configs/score_axes.yaml +0 -0
  55. {pen_stack-6.2.4 → pen_stack-6.3.0}/configs/seroprevalence.yaml +0 -0
  56. {pen_stack-6.2.4 → pen_stack-6.3.0}/configs/target_sites.yaml +0 -0
  57. {pen_stack-6.2.4 → pen_stack-6.3.0}/configs/universe_crosswalk.yaml +0 -0
  58. {pen_stack-6.2.4 → pen_stack-6.3.0}/configs/write_types.yaml +0 -0
  59. {pen_stack-6.2.4 → pen_stack-6.3.0}/configs/wtkb_curated.yaml +0 -0
  60. {pen_stack-6.2.4 → pen_stack-6.3.0}/data/curated/bridge_offtarget_energetics.json +0 -0
  61. {pen_stack-6.2.4 → pen_stack-6.3.0}/data/curated/bridge_offtarget_profile_measured.parquet +0 -0
  62. {pen_stack-6.2.4 → pen_stack-6.3.0}/data/curated/gene_coords.parquet +0 -0
  63. {pen_stack-6.2.4 → pen_stack-6.3.0}/data/curated/unified_editor_universe.parquet +0 -0
  64. {pen_stack-6.2.4 → pen_stack-6.3.0}/docs/BACKLOG.md +0 -0
  65. {pen_stack-6.2.4 → pen_stack-6.3.0}/docs/DEPLOY.md +0 -0
  66. {pen_stack-6.2.4 → pen_stack-6.3.0}/docs/INFRA.md +0 -0
  67. {pen_stack-6.2.4 → pen_stack-6.3.0}/docs/MCP.md +0 -0
  68. {pen_stack-6.2.4 → pen_stack-6.3.0}/docs/RELEASING.md +0 -0
  69. {pen_stack-6.2.4 → pen_stack-6.3.0}/docs/REPRO.md +0 -0
  70. {pen_stack-6.2.4 → pen_stack-6.3.0}/docs/STABILITY.md +0 -0
  71. {pen_stack-6.2.4 → pen_stack-6.3.0}/docs/agent.md +0 -0
  72. {pen_stack-6.2.4 → pen_stack-6.3.0}/docs/alphagenome_feasibility.md +0 -0
  73. {pen_stack-6.2.4 → pen_stack-6.3.0}/docs/autonomy.md +0 -0
  74. {pen_stack-6.2.4 → pen_stack-6.3.0}/docs/benchmark_circularity.md +0 -0
  75. {pen_stack-6.2.4 → pen_stack-6.3.0}/docs/biosecurity.md +0 -0
  76. {pen_stack-6.2.4 → pen_stack-6.3.0}/docs/build_interface.md +0 -0
  77. {pen_stack-6.2.4 → pen_stack-6.3.0}/docs/cards/atlas.md +0 -0
  78. {pen_stack-6.2.4 → pen_stack-6.3.0}/docs/cards/durability.md +0 -0
  79. {pen_stack-6.2.4 → pen_stack-6.3.0}/docs/cards/safety.md +0 -0
  80. {pen_stack-6.2.4 → pen_stack-6.3.0}/docs/challenge.md +0 -0
  81. {pen_stack-6.2.4 → pen_stack-6.3.0}/docs/closed_loop.md +0 -0
  82. {pen_stack-6.2.4 → pen_stack-6.3.0}/docs/co_scientist.md +0 -0
  83. {pen_stack-6.2.4 → pen_stack-6.3.0}/docs/co_scientist_loop.md +0 -0
  84. {pen_stack-6.2.4 → pen_stack-6.3.0}/docs/delivery.md +0 -0
  85. {pen_stack-6.2.4 → pen_stack-6.3.0}/docs/delivery_immunology.md +0 -0
  86. {pen_stack-6.2.4 → pen_stack-6.3.0}/docs/digital_twin.md +0 -0
  87. {pen_stack-6.2.4 → pen_stack-6.3.0}/docs/dissemination.md +0 -0
  88. {pen_stack-6.2.4 → pen_stack-6.3.0}/docs/environment.md +0 -0
  89. {pen_stack-6.2.4 → pen_stack-6.3.0}/docs/experiment_design.md +0 -0
  90. {pen_stack-6.2.4 → pen_stack-6.3.0}/docs/generative_design.md +0 -0
  91. {pen_stack-6.2.4 → pen_stack-6.3.0}/docs/index.md +0 -0
  92. {pen_stack-6.2.4 → pen_stack-6.3.0}/docs/integrations.md +0 -0
  93. {pen_stack-6.2.4 → pen_stack-6.3.0}/docs/mechanistic_constraints.md +0 -0
  94. {pen_stack-6.2.4 → pen_stack-6.3.0}/docs/oracles.md +0 -0
  95. {pen_stack-6.2.4 → pen_stack-6.3.0}/docs/positioning.md +0 -0
  96. {pen_stack-6.2.4 → pen_stack-6.3.0}/docs/private_data_formats.md +0 -0
  97. {pen_stack-6.2.4 → pen_stack-6.3.0}/docs/quickstart.md +0 -0
  98. {pen_stack-6.2.4 → pen_stack-6.3.0}/docs/responsible_use.md +0 -0
  99. {pen_stack-6.2.4 → pen_stack-6.3.0}/docs/rules.md +0 -0
  100. {pen_stack-6.2.4 → pen_stack-6.3.0}/docs/scope.md +0 -0
  101. {pen_stack-6.2.4 → pen_stack-6.3.0}/docs/scorecard.md +0 -0
  102. {pen_stack-6.2.4 → pen_stack-6.3.0}/docs/tutorials/compare-families.md +0 -0
  103. {pen_stack-6.2.4 → pen_stack-6.3.0}/docs/tutorials/score-deliverability.md +0 -0
  104. {pen_stack-6.2.4 → pen_stack-6.3.0}/docs/tutorials/where-can-i-write.md +0 -0
  105. {pen_stack-6.2.4 → pen_stack-6.3.0}/docs/tutorials/which-writer-reaches-locus.md +0 -0
  106. {pen_stack-6.2.4 → pen_stack-6.3.0}/docs/uncertainty.md +0 -0
  107. {pen_stack-6.2.4 → pen_stack-6.3.0}/docs/verify.md +0 -0
  108. {pen_stack-6.2.4 → pen_stack-6.3.0}/docs/world_model.md +0 -0
  109. {pen_stack-6.2.4 → pen_stack-6.3.0}/docs/writer_verification.md +0 -0
  110. {pen_stack-6.2.4 → pen_stack-6.3.0}/docs/wtkb.md +0 -0
  111. {pen_stack-6.2.4 → pen_stack-6.3.0}/pen_stack/_resources.py +0 -0
  112. {pen_stack-6.2.4 → pen_stack-6.3.0}/pen_stack/active/__init__.py +0 -0
  113. {pen_stack-6.2.4 → pen_stack-6.3.0}/pen_stack/active/acquire.py +0 -0
  114. {pen_stack-6.2.4 → pen_stack-6.3.0}/pen_stack/active/design.py +0 -0
  115. {pen_stack-6.2.4 → pen_stack-6.3.0}/pen_stack/active/validate.py +0 -0
  116. {pen_stack-6.2.4 → pen_stack-6.3.0}/pen_stack/adapt/__init__.py +0 -0
  117. {pen_stack-6.2.4 → pen_stack-6.3.0}/pen_stack/adapt/finetune.py +0 -0
  118. {pen_stack-6.2.4 → pen_stack-6.3.0}/pen_stack/adapt/ingest.py +0 -0
  119. {pen_stack-6.2.4 → pen_stack-6.3.0}/pen_stack/adapt/pipeline.py +0 -0
  120. {pen_stack-6.2.4 → pen_stack-6.3.0}/pen_stack/adapt/recalibrate.py +0 -0
  121. {pen_stack-6.2.4 → pen_stack-6.3.0}/pen_stack/adapt/report.py +0 -0
  122. {pen_stack-6.2.4 → pen_stack-6.3.0}/pen_stack/agent/__init__.py +0 -0
  123. {pen_stack-6.2.4 → pen_stack-6.3.0}/pen_stack/agent/cite.py +0 -0
  124. {pen_stack-6.2.4 → pen_stack-6.3.0}/pen_stack/agent/co_scientist.py +0 -0
  125. {pen_stack-6.2.4 → pen_stack-6.3.0}/pen_stack/agent/epistemic.py +0 -0
  126. {pen_stack-6.2.4 → pen_stack-6.3.0}/pen_stack/agent/guardrails.py +0 -0
  127. {pen_stack-6.2.4 → pen_stack-6.3.0}/pen_stack/agent/mcp_server.py +0 -0
  128. {pen_stack-6.2.4 → pen_stack-6.3.0}/pen_stack/agent/orchestrator.py +0 -0
  129. {pen_stack-6.2.4 → pen_stack-6.3.0}/pen_stack/agent/orchestrator_live.py +0 -0
  130. {pen_stack-6.2.4 → pen_stack-6.3.0}/pen_stack/agent/pen_agent.py +0 -0
  131. {pen_stack-6.2.4 → pen_stack-6.3.0}/pen_stack/agent/scope.py +0 -0
  132. {pen_stack-6.2.4 → pen_stack-6.3.0}/pen_stack/agent/tools.py +0 -0
  133. {pen_stack-6.2.4 → pen_stack-6.3.0}/pen_stack/api/__init__.py +0 -0
  134. {pen_stack-6.2.4 → pen_stack-6.3.0}/pen_stack/api/manifest.py +0 -0
  135. {pen_stack-6.2.4 → pen_stack-6.3.0}/pen_stack/atlas/__init__.py +0 -0
  136. {pen_stack-6.2.4 → pen_stack-6.3.0}/pen_stack/atlas/build_wtkb.py +0 -0
  137. {pen_stack-6.2.4 → pen_stack-6.3.0}/pen_stack/atlas/crosslink.py +0 -0
  138. {pen_stack-6.2.4 → pen_stack-6.3.0}/pen_stack/atlas/expand.py +0 -0
  139. {pen_stack-6.2.4 → pen_stack-6.3.0}/pen_stack/atlas/schema.py +0 -0
  140. {pen_stack-6.2.4 → pen_stack-6.3.0}/pen_stack/atlas/scorecard.py +0 -0
  141. {pen_stack-6.2.4 → pen_stack-6.3.0}/pen_stack/atlas/universe.py +0 -0
  142. {pen_stack-6.2.4 → pen_stack-6.3.0}/pen_stack/atlas/variant_propose.py +0 -0
  143. {pen_stack-6.2.4 → pen_stack-6.3.0}/pen_stack/atlas/writer_verify.py +0 -0
  144. {pen_stack-6.2.4 → pen_stack-6.3.0}/pen_stack/bridge/__init__.py +0 -0
  145. {pen_stack-6.2.4 → pen_stack-6.3.0}/pen_stack/bridge/activity.py +0 -0
  146. {pen_stack-6.2.4 → pen_stack-6.3.0}/pen_stack/bridge/cli.py +0 -0
  147. {pen_stack-6.2.4 → pen_stack-6.3.0}/pen_stack/bridge/fold_qc.py +0 -0
  148. {pen_stack-6.2.4 → pen_stack-6.3.0}/pen_stack/bridge/guide_qc.py +0 -0
  149. {pen_stack-6.2.4 → pen_stack-6.3.0}/pen_stack/bridge/ingest.py +0 -0
  150. {pen_stack-6.2.4 → pen_stack-6.3.0}/pen_stack/bridge/offtarget.py +0 -0
  151. {pen_stack-6.2.4 → pen_stack-6.3.0}/pen_stack/bridge/offtarget_energetics.py +0 -0
  152. {pen_stack-6.2.4 → pen_stack-6.3.0}/pen_stack/bridge/ortholog_screen.py +0 -0
  153. {pen_stack-6.2.4 → pen_stack-6.3.0}/pen_stack/bridge/pipeline.py +0 -0
  154. {pen_stack-6.2.4 → pen_stack-6.3.0}/pen_stack/build/__init__.py +0 -0
  155. {pen_stack-6.2.4 → pen_stack-6.3.0}/pen_stack/build/ingest.py +0 -0
  156. {pen_stack-6.2.4 → pen_stack-6.3.0}/pen_stack/build/protocol.py +0 -0
  157. {pen_stack-6.2.4 → pen_stack-6.3.0}/pen_stack/build/simlab.py +0 -0
  158. {pen_stack-6.2.4 → pen_stack-6.3.0}/pen_stack/cli.py +0 -0
  159. {pen_stack-6.2.4 → pen_stack-6.3.0}/pen_stack/data/__init__.py +0 -0
  160. {pen_stack-6.2.4 → pen_stack-6.3.0}/pen_stack/data/encode.py +0 -0
  161. {pen_stack-6.2.4 → pen_stack-6.3.0}/pen_stack/data/genome.py +0 -0
  162. {pen_stack-6.2.4 → pen_stack-6.3.0}/pen_stack/data/ingest_chromatin.py +0 -0
  163. {pen_stack-6.2.4 → pen_stack-6.3.0}/pen_stack/data/ingest_integration.py +0 -0
  164. {pen_stack-6.2.4 → pen_stack-6.3.0}/pen_stack/data/ingest_safety_annot.py +0 -0
  165. {pen_stack-6.2.4 → pen_stack-6.3.0}/pen_stack/data/ingest_trip.py +0 -0
  166. {pen_stack-6.2.4 → pen_stack-6.3.0}/pen_stack/design/__init__.py +0 -0
  167. {pen_stack-6.2.4 → pen_stack-6.3.0}/pen_stack/design/generate.py +0 -0
  168. {pen_stack-6.2.4 → pen_stack-6.3.0}/pen_stack/design/pareto.py +0 -0
  169. {pen_stack-6.2.4 → pen_stack-6.3.0}/pen_stack/design/space.py +0 -0
  170. {pen_stack-6.2.4 → pen_stack-6.3.0}/pen_stack/env/__init__.py +0 -0
  171. {pen_stack-6.2.4 → pen_stack-6.3.0}/pen_stack/env/genome_writing_env.py +0 -0
  172. {pen_stack-6.2.4 → pen_stack-6.3.0}/pen_stack/env/policies.py +0 -0
  173. {pen_stack-6.2.4 → pen_stack-6.3.0}/pen_stack/graph/__init__.py +0 -0
  174. {pen_stack-6.2.4 → pen_stack-6.3.0}/pen_stack/graph/build.py +0 -0
  175. {pen_stack-6.2.4 → pen_stack-6.3.0}/pen_stack/graph/cell_types.py +0 -0
  176. {pen_stack-6.2.4 → pen_stack-6.3.0}/pen_stack/graph/ingest.py +0 -0
  177. {pen_stack-6.2.4 → pen_stack-6.3.0}/pen_stack/graph/query.py +0 -0
  178. {pen_stack-6.2.4 → pen_stack-6.3.0}/pen_stack/graph/schema.py +0 -0
  179. {pen_stack-6.2.4 → pen_stack-6.3.0}/pen_stack/loop/__init__.py +0 -0
  180. {pen_stack-6.2.4 → pen_stack-6.3.0}/pen_stack/loop/continual.py +0 -0
  181. {pen_stack-6.2.4 → pen_stack-6.3.0}/pen_stack/loop/cycle.py +0 -0
  182. {pen_stack-6.2.4 → pen_stack-6.3.0}/pen_stack/loop/drift.py +0 -0
  183. {pen_stack-6.2.4 → pen_stack-6.3.0}/pen_stack/mech/__init__.py +0 -0
  184. {pen_stack-6.2.4 → pen_stack-6.3.0}/pen_stack/mech/classify_atlas.py +0 -0
  185. {pen_stack-6.2.4 → pen_stack-6.3.0}/pen_stack/mech/whitelist.py +0 -0
  186. {pen_stack-6.2.4 → pen_stack-6.3.0}/pen_stack/monitor/__init__.py +0 -0
  187. {pen_stack-6.2.4 → pen_stack-6.3.0}/pen_stack/monitor/europepmc.py +0 -0
  188. {pen_stack-6.2.4 → pen_stack-6.3.0}/pen_stack/monitor/run.py +0 -0
  189. {pen_stack-6.2.4 → pen_stack-6.3.0}/pen_stack/monitor/triage.py +0 -0
  190. {pen_stack-6.2.4 → pen_stack-6.3.0}/pen_stack/oracles/__init__.py +0 -0
  191. {pen_stack-6.2.4 → pen_stack-6.3.0}/pen_stack/oracles/cache.py +0 -0
  192. {pen_stack-6.2.4 → pen_stack-6.3.0}/pen_stack/oracles/energetics.py +0 -0
  193. {pen_stack-6.2.4 → pen_stack-6.3.0}/pen_stack/oracles/genome.py +0 -0
  194. {pen_stack-6.2.4 → pen_stack-6.3.0}/pen_stack/oracles/protein_design.py +0 -0
  195. {pen_stack-6.2.4 → pen_stack-6.3.0}/pen_stack/oracles/rna.py +0 -0
  196. {pen_stack-6.2.4 → pen_stack-6.3.0}/pen_stack/oracles/schema.py +0 -0
  197. {pen_stack-6.2.4 → pen_stack-6.3.0}/pen_stack/oracles/structure.py +0 -0
  198. {pen_stack-6.2.4 → pen_stack-6.3.0}/pen_stack/oracles/vcell.py +0 -0
  199. {pen_stack-6.2.4 → pen_stack-6.3.0}/pen_stack/planner/__init__.py +0 -0
  200. {pen_stack-6.2.4 → pen_stack-6.3.0}/pen_stack/planner/antipeg_oracle.py +0 -0
  201. {pen_stack-6.2.4 → pen_stack-6.3.0}/pen_stack/planner/capsid_epitope_oracle.py +0 -0
  202. {pen_stack-6.2.4 → pen_stack-6.3.0}/pen_stack/planner/cargo.py +0 -0
  203. {pen_stack-6.2.4 → pen_stack-6.3.0}/pen_stack/planner/cargo_polish.py +0 -0
  204. {pen_stack-6.2.4 → pen_stack-6.3.0}/pen_stack/planner/delivery.py +0 -0
  205. {pen_stack-6.2.4 → pen_stack-6.3.0}/pen_stack/planner/delivery_constraints.py +0 -0
  206. {pen_stack-6.2.4 → pen_stack-6.3.0}/pen_stack/planner/delivery_immunology.py +0 -0
  207. {pen_stack-6.2.4 → pen_stack-6.3.0}/pen_stack/planner/delivery_vehicles.py +0 -0
  208. {pen_stack-6.2.4 → pen_stack-6.3.0}/pen_stack/planner/genotoxicity_oracle.py +0 -0
  209. {pen_stack-6.2.4 → pen_stack-6.3.0}/pen_stack/planner/immune_profile.py +0 -0
  210. {pen_stack-6.2.4 → pen_stack-6.3.0}/pen_stack/planner/innate_sensing.py +0 -0
  211. {pen_stack-6.2.4 → pen_stack-6.3.0}/pen_stack/planner/multiplex.py +0 -0
  212. {pen_stack-6.2.4 → pen_stack-6.3.0}/pen_stack/planner/optimize.py +0 -0
  213. {pen_stack-6.2.4 → pen_stack-6.3.0}/pen_stack/planner/pipeline.py +0 -0
  214. {pen_stack-6.2.4 → pen_stack-6.3.0}/pen_stack/planner/report.py +0 -0
  215. {pen_stack-6.2.4 → pen_stack-6.3.0}/pen_stack/planner/router.py +0 -0
  216. {pen_stack-6.2.4 → pen_stack-6.3.0}/pen_stack/planner/seroprevalence_oracle.py +0 -0
  217. {pen_stack-6.2.4 → pen_stack-6.3.0}/pen_stack/planner/target_site.py +0 -0
  218. {pen_stack-6.2.4 → pen_stack-6.3.0}/pen_stack/rag/__init__.py +0 -0
  219. {pen_stack-6.2.4 → pen_stack-6.3.0}/pen_stack/rag/index.py +0 -0
  220. {pen_stack-6.2.4 → pen_stack-6.3.0}/pen_stack/rag/llm.py +0 -0
  221. {pen_stack-6.2.4 → pen_stack-6.3.0}/pen_stack/rag/qa.py +0 -0
  222. {pen_stack-6.2.4 → pen_stack-6.3.0}/pen_stack/rules/__init__.py +0 -0
  223. {pen_stack-6.2.4 → pen_stack-6.3.0}/pen_stack/rules/evaluators.py +0 -0
  224. {pen_stack-6.2.4 → pen_stack-6.3.0}/pen_stack/rules/loader.py +0 -0
  225. {pen_stack-6.2.4 → pen_stack-6.3.0}/pen_stack/rules/schema.py +0 -0
  226. {pen_stack-6.2.4 → pen_stack-6.3.0}/pen_stack/rules/solver.py +0 -0
  227. {pen_stack-6.2.4 → pen_stack-6.3.0}/pen_stack/safety/__init__.py +0 -0
  228. {pen_stack-6.2.4 → pen_stack-6.3.0}/pen_stack/safety/audit.py +0 -0
  229. {pen_stack-6.2.4 → pen_stack-6.3.0}/pen_stack/safety/gate.py +0 -0
  230. {pen_stack-6.2.4 → pen_stack-6.3.0}/pen_stack/safety/policy.py +0 -0
  231. {pen_stack-6.2.4 → pen_stack-6.3.0}/pen_stack/safety/redteam.py +0 -0
  232. {pen_stack-6.2.4 → pen_stack-6.3.0}/pen_stack/safety/registry.py +0 -0
  233. {pen_stack-6.2.4 → pen_stack-6.3.0}/pen_stack/safety/screen.py +0 -0
  234. {pen_stack-6.2.4 → pen_stack-6.3.0}/pen_stack/score/__init__.py +0 -0
  235. {pen_stack-6.2.4 → pen_stack-6.3.0}/pen_stack/score/recalibrate.py +0 -0
  236. {pen_stack-6.2.4 → pen_stack-6.3.0}/pen_stack/score/therapeutic.py +0 -0
  237. {pen_stack-6.2.4 → pen_stack-6.3.0}/pen_stack/server/__init__.py +0 -0
  238. {pen_stack-6.2.4 → pen_stack-6.3.0}/pen_stack/server/api.py +0 -0
  239. {pen_stack-6.2.4 → pen_stack-6.3.0}/pen_stack/twin/__init__.py +0 -0
  240. {pen_stack-6.2.4 → pen_stack-6.3.0}/pen_stack/twin/calibrate.py +0 -0
  241. {pen_stack-6.2.4 → pen_stack-6.3.0}/pen_stack/twin/mechanistic.py +0 -0
  242. {pen_stack-6.2.4 → pen_stack-6.3.0}/pen_stack/twin/outcome.py +0 -0
  243. {pen_stack-6.2.4 → pen_stack-6.3.0}/pen_stack/ui/__init__.py +0 -0
  244. {pen_stack-6.2.4 → pen_stack-6.3.0}/pen_stack/ui/app.py +0 -0
  245. {pen_stack-6.2.4 → pen_stack-6.3.0}/pen_stack/validate/__init__.py +0 -0
  246. {pen_stack-6.2.4 → pen_stack-6.3.0}/pen_stack/validate/adapt_demo.py +0 -0
  247. {pen_stack-6.2.4 → pen_stack-6.3.0}/pen_stack/validate/agent_eval.py +0 -0
  248. {pen_stack-6.2.4 → pen_stack-6.3.0}/pen_stack/validate/bench_adversarial_tasks.py +0 -0
  249. {pen_stack-6.2.4 → pen_stack-6.3.0}/pen_stack/validate/bench_coscientist_tasks.py +0 -0
  250. {pen_stack-6.2.4 → pen_stack-6.3.0}/pen_stack/validate/bench_graph_tasks.py +0 -0
  251. {pen_stack-6.2.4 → pen_stack-6.3.0}/pen_stack/validate/bench_rule_tasks.py +0 -0
  252. {pen_stack-6.2.4 → pen_stack-6.3.0}/pen_stack/validate/bench_trust_tasks.py +0 -0
  253. {pen_stack-6.2.4 → pen_stack-6.3.0}/pen_stack/validate/bench_writetype_tasks.py +0 -0
  254. {pen_stack-6.2.4 → pen_stack-6.3.0}/pen_stack/validate/blind_gsh_discovery.py +0 -0
  255. {pen_stack-6.2.4 → pen_stack-6.3.0}/pen_stack/validate/cargo_directionality.py +0 -0
  256. {pen_stack-6.2.4 → pen_stack-6.3.0}/pen_stack/validate/closed_loop.py +0 -0
  257. {pen_stack-6.2.4 → pen_stack-6.3.0}/pen_stack/validate/durability_baselines.py +0 -0
  258. {pen_stack-6.2.4 → pen_stack-6.3.0}/pen_stack/validate/experiment_design.py +0 -0
  259. {pen_stack-6.2.4 → pen_stack-6.3.0}/pen_stack/validate/forward_hypotheses.py +0 -0
  260. {pen_stack-6.2.4 → pen_stack-6.3.0}/pen_stack/validate/generative_design.py +0 -0
  261. {pen_stack-6.2.4 → pen_stack-6.3.0}/pen_stack/validate/guide_qc_demo.py +0 -0
  262. {pen_stack-6.2.4 → pen_stack-6.3.0}/pen_stack/validate/immune_calibration.py +0 -0
  263. {pen_stack-6.2.4 → pen_stack-6.3.0}/pen_stack/validate/intent_specification.py +0 -0
  264. {pen_stack-6.2.4 → pen_stack-6.3.0}/pen_stack/validate/offtarget_energetics_eval.py +0 -0
  265. {pen_stack-6.2.4 → pen_stack-6.3.0}/pen_stack/validate/out_of_scope_refusal.py +0 -0
  266. {pen_stack-6.2.4 → pen_stack-6.3.0}/pen_stack/validate/outcome_calibration.py +0 -0
  267. {pen_stack-6.2.4 → pen_stack-6.3.0}/pen_stack/validate/outcome_prediction.py +0 -0
  268. {pen_stack-6.2.4 → pen_stack-6.3.0}/pen_stack/validate/paper3_benchmark.py +0 -0
  269. {pen_stack-6.2.4 → pen_stack-6.3.0}/pen_stack/validate/paper4_real_validation.py +0 -0
  270. {pen_stack-6.2.4 → pen_stack-6.3.0}/pen_stack/validate/paper4_validation.py +0 -0
  271. {pen_stack-6.2.4 → pen_stack-6.3.0}/pen_stack/validate/protocol_safety.py +0 -0
  272. {pen_stack-6.2.4 → pen_stack-6.3.0}/pen_stack/validate/safety_screening.py +0 -0
  273. {pen_stack-6.2.4 → pen_stack-6.3.0}/pen_stack/validate/selective_prediction.py +0 -0
  274. {pen_stack-6.2.4 → pen_stack-6.3.0}/pen_stack/validate/seq_vs_measured.py +0 -0
  275. {pen_stack-6.2.4 → pen_stack-6.3.0}/pen_stack/validate/target_site_controls.py +0 -0
  276. {pen_stack-6.2.4 → pen_stack-6.3.0}/pen_stack/validate/uncertainty_eval.py +0 -0
  277. {pen_stack-6.2.4 → pen_stack-6.3.0}/pen_stack/validate/ungrounded_baseline.py +0 -0
  278. {pen_stack-6.2.4 → pen_stack-6.3.0}/pen_stack/validate/within_locus_ranking.py +0 -0
  279. {pen_stack-6.2.4 → pen_stack-6.3.0}/pen_stack/validate/writer_recovery.py +0 -0
  280. {pen_stack-6.2.4 → pen_stack-6.3.0}/pen_stack/verify/__init__.py +0 -0
  281. {pen_stack-6.2.4 → pen_stack-6.3.0}/pen_stack/verify/schema.py +0 -0
  282. {pen_stack-6.2.4 → pen_stack-6.3.0}/pen_stack/verify/service.py +0 -0
  283. {pen_stack-6.2.4 → pen_stack-6.3.0}/pen_stack/web/__init__.py +0 -0
  284. {pen_stack-6.2.4 → pen_stack-6.3.0}/pen_stack/web/tools.py +0 -0
  285. {pen_stack-6.2.4 → pen_stack-6.3.0}/pen_stack/wgenome/__init__.py +0 -0
  286. {pen_stack-6.2.4 → pen_stack-6.3.0}/pen_stack/wgenome/chromatin_seq.py +0 -0
  287. {pen_stack-6.2.4 → pen_stack-6.3.0}/pen_stack/wgenome/durability.py +0 -0
  288. {pen_stack-6.2.4 → pen_stack-6.3.0}/pen_stack/wgenome/export_tracks.py +0 -0
  289. {pen_stack-6.2.4 → pen_stack-6.3.0}/pen_stack/wgenome/features.py +0 -0
  290. {pen_stack-6.2.4 → pen_stack-6.3.0}/pen_stack/wgenome/gsh_baseline.py +0 -0
  291. {pen_stack-6.2.4 → pen_stack-6.3.0}/pen_stack/wgenome/mesh_features.py +0 -0
  292. {pen_stack-6.2.4 → pen_stack-6.3.0}/pen_stack/wgenome/ood.py +0 -0
  293. {pen_stack-6.2.4 → pen_stack-6.3.0}/pen_stack/wgenome/providers.py +0 -0
  294. {pen_stack-6.2.4 → pen_stack-6.3.0}/pen_stack/wgenome/safety.py +0 -0
  295. {pen_stack-6.2.4 → pen_stack-6.3.0}/pen_stack/wgenome/structure3d.py +0 -0
  296. {pen_stack-6.2.4 → pen_stack-6.3.0}/pen_stack/wgenome/uncertainty.py +0 -0
  297. {pen_stack-6.2.4 → pen_stack-6.3.0}/pen_stack/wgenome/writability.py +0 -0
  298. {pen_stack-6.2.4 → pen_stack-6.3.0}/pen_stack.egg-info/dependency_links.txt +0 -0
  299. {pen_stack-6.2.4 → pen_stack-6.3.0}/pen_stack.egg-info/entry_points.txt +0 -0
  300. {pen_stack-6.2.4 → pen_stack-6.3.0}/pen_stack.egg-info/requires.txt +0 -0
  301. {pen_stack-6.2.4 → pen_stack-6.3.0}/pen_stack.egg-info/top_level.txt +0 -0
  302. {pen_stack-6.2.4 → pen_stack-6.3.0}/prereg/SHA256_LOCK_phase0.json +0 -0
  303. {pen_stack-6.2.4 → pen_stack-6.3.0}/prereg/SHA256_LOCK_phase1_5.json +0 -0
  304. {pen_stack-6.2.4 → pen_stack-6.3.0}/prereg/SHA256_LOCK_phase2.json +0 -0
  305. {pen_stack-6.2.4 → pen_stack-6.3.0}/prereg/SHA256_LOCK_phase3.json +0 -0
  306. {pen_stack-6.2.4 → pen_stack-6.3.0}/prereg/SHA256_LOCK_ws_a.json +0 -0
  307. {pen_stack-6.2.4 → pen_stack-6.3.0}/prereg/SHA256_LOCK_ws_acq.json +0 -0
  308. {pen_stack-6.2.4 → pen_stack-6.3.0}/prereg/SHA256_LOCK_ws_aldesign.json +0 -0
  309. {pen_stack-6.2.4 → pen_stack-6.3.0}/prereg/SHA256_LOCK_ws_alvalidate.json +0 -0
  310. {pen_stack-6.2.4 → pen_stack-6.3.0}/prereg/SHA256_LOCK_ws_atlas.json +0 -0
  311. {pen_stack-6.2.4 → pen_stack-6.3.0}/prereg/SHA256_LOCK_ws_b.json +0 -0
  312. {pen_stack-6.2.4 → pen_stack-6.3.0}/prereg/SHA256_LOCK_ws_ba.json +0 -0
  313. {pen_stack-6.2.4 → pen_stack-6.3.0}/prereg/SHA256_LOCK_ws_ba_v33.json +0 -0
  314. {pen_stack-6.2.4 → pen_stack-6.3.0}/prereg/SHA256_LOCK_ws_ba_v45.json +0 -0
  315. {pen_stack-6.2.4 → pen_stack-6.3.0}/prereg/SHA256_LOCK_ws_bench.json +0 -0
  316. {pen_stack-6.2.4 → pen_stack-6.3.0}/prereg/SHA256_LOCK_ws_c.json +0 -0
  317. {pen_stack-6.2.4 → pen_stack-6.3.0}/prereg/SHA256_LOCK_ws_cal.json +0 -0
  318. {pen_stack-6.2.4 → pen_stack-6.3.0}/prereg/SHA256_LOCK_ws_calib.json +0 -0
  319. {pen_stack-6.2.4 → pen_stack-6.3.0}/prereg/SHA256_LOCK_ws_challenge.json +0 -0
  320. {pen_stack-6.2.4 → pen_stack-6.3.0}/prereg/SHA256_LOCK_ws_chat.json +0 -0
  321. {pen_stack-6.2.4 → pen_stack-6.3.0}/prereg/SHA256_LOCK_ws_cite.json +0 -0
  322. {pen_stack-6.2.4 → pen_stack-6.3.0}/prereg/SHA256_LOCK_ws_continual.json +0 -0
  323. {pen_stack-6.2.4 → pen_stack-6.3.0}/prereg/SHA256_LOCK_ws_cosci2.json +0 -0
  324. {pen_stack-6.2.4 → pen_stack-6.3.0}/prereg/SHA256_LOCK_ws_crit.json +0 -0
  325. {pen_stack-6.2.4 → pen_stack-6.3.0}/prereg/SHA256_LOCK_ws_ct.json +0 -0
  326. {pen_stack-6.2.4 → pen_stack-6.3.0}/prereg/SHA256_LOCK_ws_d.json +0 -0
  327. {pen_stack-6.2.4 → pen_stack-6.3.0}/prereg/SHA256_LOCK_ws_drift.json +0 -0
  328. {pen_stack-6.2.4 → pen_stack-6.3.0}/prereg/SHA256_LOCK_ws_e.json +0 -0
  329. {pen_stack-6.2.4 → pen_stack-6.3.0}/prereg/SHA256_LOCK_ws_env.json +0 -0
  330. {pen_stack-6.2.4 → pen_stack-6.3.0}/prereg/SHA256_LOCK_ws_ep.json +0 -0
  331. {pen_stack-6.2.4 → pen_stack-6.3.0}/prereg/SHA256_LOCK_ws_epitope.json +0 -0
  332. {pen_stack-6.2.4 → pen_stack-6.3.0}/prereg/SHA256_LOCK_ws_f.json +0 -0
  333. {pen_stack-6.2.4 → pen_stack-6.3.0}/prereg/SHA256_LOCK_ws_frontend.json +0 -0
  334. {pen_stack-6.2.4 → pen_stack-6.3.0}/prereg/SHA256_LOCK_ws_g.json +0 -0
  335. {pen_stack-6.2.4 → pen_stack-6.3.0}/prereg/SHA256_LOCK_ws_gen.json +0 -0
  336. {pen_stack-6.2.4 → pen_stack-6.3.0}/prereg/SHA256_LOCK_ws_genotox.json +0 -0
  337. {pen_stack-6.2.4 → pen_stack-6.3.0}/prereg/SHA256_LOCK_ws_graph.json +0 -0
  338. {pen_stack-6.2.4 → pen_stack-6.3.0}/prereg/SHA256_LOCK_ws_h.json +0 -0
  339. {pen_stack-6.2.4 → pen_stack-6.3.0}/prereg/SHA256_LOCK_ws_immune.json +0 -0
  340. {pen_stack-6.2.4 → pen_stack-6.3.0}/prereg/SHA256_LOCK_ws_ingest.json +0 -0
  341. {pen_stack-6.2.4 → pen_stack-6.3.0}/prereg/SHA256_LOCK_ws_innate.json +0 -0
  342. {pen_stack-6.2.4 → pen_stack-6.3.0}/prereg/SHA256_LOCK_ws_loop.json +0 -0
  343. {pen_stack-6.2.4 → pen_stack-6.3.0}/prereg/SHA256_LOCK_ws_manifest.json +0 -0
  344. {pen_stack-6.2.4 → pen_stack-6.3.0}/prereg/SHA256_LOCK_ws_mc.json +0 -0
  345. {pen_stack-6.2.4 → pen_stack-6.3.0}/prereg/SHA256_LOCK_ws_mcp.json +0 -0
  346. {pen_stack-6.2.4 → pen_stack-6.3.0}/prereg/SHA256_LOCK_ws_mech.json +0 -0
  347. {pen_stack-6.2.4 → pen_stack-6.3.0}/prereg/SHA256_LOCK_ws_mon.json +0 -0
  348. {pen_stack-6.2.4 → pen_stack-6.3.0}/prereg/SHA256_LOCK_ws_o.json +0 -0
  349. {pen_stack-6.2.4 → pen_stack-6.3.0}/prereg/SHA256_LOCK_ws_openapi.json +0 -0
  350. {pen_stack-6.2.4 → pen_stack-6.3.0}/prereg/SHA256_LOCK_ws_orch.json +0 -0
  351. {pen_stack-6.2.4 → pen_stack-6.3.0}/prereg/SHA256_LOCK_ws_outcome.json +0 -0
  352. {pen_stack-6.2.4 → pen_stack-6.3.0}/prereg/SHA256_LOCK_ws_pareto.json +0 -0
  353. {pen_stack-6.2.4 → pen_stack-6.3.0}/prereg/SHA256_LOCK_ws_peg.json +0 -0
  354. {pen_stack-6.2.4 → pen_stack-6.3.0}/prereg/SHA256_LOCK_ws_plan.json +0 -0
  355. {pen_stack-6.2.4 → pen_stack-6.3.0}/prereg/SHA256_LOCK_ws_policy.json +0 -0
  356. {pen_stack-6.2.4 → pen_stack-6.3.0}/prereg/SHA256_LOCK_ws_profile.json +0 -0
  357. {pen_stack-6.2.4 → pen_stack-6.3.0}/prereg/SHA256_LOCK_ws_proto.json +0 -0
  358. {pen_stack-6.2.4 → pen_stack-6.3.0}/prereg/SHA256_LOCK_ws_r.json +0 -0
  359. {pen_stack-6.2.4 → pen_stack-6.3.0}/prereg/SHA256_LOCK_ws_redteam.json +0 -0
  360. {pen_stack-6.2.4 → pen_stack-6.3.0}/prereg/SHA256_LOCK_ws_route.json +0 -0
  361. {pen_stack-6.2.4 → pen_stack-6.3.0}/prereg/SHA256_LOCK_ws_screen.json +0 -0
  362. {pen_stack-6.2.4 → pen_stack-6.3.0}/prereg/SHA256_LOCK_ws_seroprev.json +0 -0
  363. {pen_stack-6.2.4 → pen_stack-6.3.0}/prereg/SHA256_LOCK_ws_simlab.json +0 -0
  364. {pen_stack-6.2.4 → pen_stack-6.3.0}/prereg/SHA256_LOCK_ws_twincal.json +0 -0
  365. {pen_stack-6.2.4 → pen_stack-6.3.0}/prereg/SHA256_LOCK_ws_uq.json +0 -0
  366. {pen_stack-6.2.4 → pen_stack-6.3.0}/prereg/SHA256_LOCK_ws_v.json +0 -0
  367. {pen_stack-6.2.4 → pen_stack-6.3.0}/prereg/SHA256_LOCK_ws_vcell.json +0 -0
  368. {pen_stack-6.2.4 → pen_stack-6.3.0}/prereg/SHA256_LOCK_ws_wv.json +0 -0
  369. {pen_stack-6.2.4 → pen_stack-6.3.0}/prereg/paper1.yaml +0 -0
  370. {pen_stack-6.2.4 → pen_stack-6.3.0}/prereg/paper2.yaml +0 -0
  371. {pen_stack-6.2.4 → pen_stack-6.3.0}/prereg/paper3.yaml +0 -0
  372. {pen_stack-6.2.4 → pen_stack-6.3.0}/prereg/paper4.yaml +0 -0
  373. {pen_stack-6.2.4 → pen_stack-6.3.0}/prereg/phase0.yaml +0 -0
  374. {pen_stack-6.2.4 → pen_stack-6.3.0}/prereg/ws_a.yaml +0 -0
  375. {pen_stack-6.2.4 → pen_stack-6.3.0}/prereg/ws_acq.yaml +0 -0
  376. {pen_stack-6.2.4 → pen_stack-6.3.0}/prereg/ws_aldesign.yaml +0 -0
  377. {pen_stack-6.2.4 → pen_stack-6.3.0}/prereg/ws_alvalidate.yaml +0 -0
  378. {pen_stack-6.2.4 → pen_stack-6.3.0}/prereg/ws_atlas.yaml +0 -0
  379. {pen_stack-6.2.4 → pen_stack-6.3.0}/prereg/ws_b.yaml +0 -0
  380. {pen_stack-6.2.4 → pen_stack-6.3.0}/prereg/ws_ba.yaml +0 -0
  381. {pen_stack-6.2.4 → pen_stack-6.3.0}/prereg/ws_ba_v33.yaml +0 -0
  382. {pen_stack-6.2.4 → pen_stack-6.3.0}/prereg/ws_ba_v45.yaml +0 -0
  383. {pen_stack-6.2.4 → pen_stack-6.3.0}/prereg/ws_bench.yaml +0 -0
  384. {pen_stack-6.2.4 → pen_stack-6.3.0}/prereg/ws_c.yaml +0 -0
  385. {pen_stack-6.2.4 → pen_stack-6.3.0}/prereg/ws_cal.yaml +0 -0
  386. {pen_stack-6.2.4 → pen_stack-6.3.0}/prereg/ws_calib.yaml +0 -0
  387. {pen_stack-6.2.4 → pen_stack-6.3.0}/prereg/ws_challenge.yaml +0 -0
  388. {pen_stack-6.2.4 → pen_stack-6.3.0}/prereg/ws_chat.yaml +0 -0
  389. {pen_stack-6.2.4 → pen_stack-6.3.0}/prereg/ws_cite.yaml +0 -0
  390. {pen_stack-6.2.4 → pen_stack-6.3.0}/prereg/ws_continual.yaml +0 -0
  391. {pen_stack-6.2.4 → pen_stack-6.3.0}/prereg/ws_cosci2.yaml +0 -0
  392. {pen_stack-6.2.4 → pen_stack-6.3.0}/prereg/ws_crit.yaml +0 -0
  393. {pen_stack-6.2.4 → pen_stack-6.3.0}/prereg/ws_ct.yaml +0 -0
  394. {pen_stack-6.2.4 → pen_stack-6.3.0}/prereg/ws_d.yaml +0 -0
  395. {pen_stack-6.2.4 → pen_stack-6.3.0}/prereg/ws_drift.yaml +0 -0
  396. {pen_stack-6.2.4 → pen_stack-6.3.0}/prereg/ws_e.yaml +0 -0
  397. {pen_stack-6.2.4 → pen_stack-6.3.0}/prereg/ws_env.yaml +0 -0
  398. {pen_stack-6.2.4 → pen_stack-6.3.0}/prereg/ws_ep.yaml +0 -0
  399. {pen_stack-6.2.4 → pen_stack-6.3.0}/prereg/ws_epitope.yaml +0 -0
  400. {pen_stack-6.2.4 → pen_stack-6.3.0}/prereg/ws_f.yaml +0 -0
  401. {pen_stack-6.2.4 → pen_stack-6.3.0}/prereg/ws_frontend.yaml +0 -0
  402. {pen_stack-6.2.4 → pen_stack-6.3.0}/prereg/ws_g.yaml +0 -0
  403. {pen_stack-6.2.4 → pen_stack-6.3.0}/prereg/ws_gen.yaml +0 -0
  404. {pen_stack-6.2.4 → pen_stack-6.3.0}/prereg/ws_genotox.yaml +0 -0
  405. {pen_stack-6.2.4 → pen_stack-6.3.0}/prereg/ws_graph.yaml +0 -0
  406. {pen_stack-6.2.4 → pen_stack-6.3.0}/prereg/ws_h.yaml +0 -0
  407. {pen_stack-6.2.4 → pen_stack-6.3.0}/prereg/ws_immune.yaml +0 -0
  408. {pen_stack-6.2.4 → pen_stack-6.3.0}/prereg/ws_ingest.yaml +0 -0
  409. {pen_stack-6.2.4 → pen_stack-6.3.0}/prereg/ws_innate.yaml +0 -0
  410. {pen_stack-6.2.4 → pen_stack-6.3.0}/prereg/ws_loop.yaml +0 -0
  411. {pen_stack-6.2.4 → pen_stack-6.3.0}/prereg/ws_manifest.yaml +0 -0
  412. {pen_stack-6.2.4 → pen_stack-6.3.0}/prereg/ws_mc.yaml +0 -0
  413. {pen_stack-6.2.4 → pen_stack-6.3.0}/prereg/ws_mcp.yaml +0 -0
  414. {pen_stack-6.2.4 → pen_stack-6.3.0}/prereg/ws_mech.yaml +0 -0
  415. {pen_stack-6.2.4 → pen_stack-6.3.0}/prereg/ws_mon.yaml +0 -0
  416. {pen_stack-6.2.4 → pen_stack-6.3.0}/prereg/ws_o.yaml +0 -0
  417. {pen_stack-6.2.4 → pen_stack-6.3.0}/prereg/ws_openapi.yaml +0 -0
  418. {pen_stack-6.2.4 → pen_stack-6.3.0}/prereg/ws_orch.yaml +0 -0
  419. {pen_stack-6.2.4 → pen_stack-6.3.0}/prereg/ws_outcome.yaml +0 -0
  420. {pen_stack-6.2.4 → pen_stack-6.3.0}/prereg/ws_pareto.yaml +0 -0
  421. {pen_stack-6.2.4 → pen_stack-6.3.0}/prereg/ws_peg.yaml +0 -0
  422. {pen_stack-6.2.4 → pen_stack-6.3.0}/prereg/ws_plan.yaml +0 -0
  423. {pen_stack-6.2.4 → pen_stack-6.3.0}/prereg/ws_policy.yaml +0 -0
  424. {pen_stack-6.2.4 → pen_stack-6.3.0}/prereg/ws_profile.yaml +0 -0
  425. {pen_stack-6.2.4 → pen_stack-6.3.0}/prereg/ws_proto.yaml +0 -0
  426. {pen_stack-6.2.4 → pen_stack-6.3.0}/prereg/ws_r.yaml +0 -0
  427. {pen_stack-6.2.4 → pen_stack-6.3.0}/prereg/ws_redteam.yaml +0 -0
  428. {pen_stack-6.2.4 → pen_stack-6.3.0}/prereg/ws_route.yaml +0 -0
  429. {pen_stack-6.2.4 → pen_stack-6.3.0}/prereg/ws_screen.yaml +0 -0
  430. {pen_stack-6.2.4 → pen_stack-6.3.0}/prereg/ws_seroprev.yaml +0 -0
  431. {pen_stack-6.2.4 → pen_stack-6.3.0}/prereg/ws_simlab.yaml +0 -0
  432. {pen_stack-6.2.4 → pen_stack-6.3.0}/prereg/ws_twincal.yaml +0 -0
  433. {pen_stack-6.2.4 → pen_stack-6.3.0}/prereg/ws_uq.yaml +0 -0
  434. {pen_stack-6.2.4 → pen_stack-6.3.0}/prereg/ws_v.yaml +0 -0
  435. {pen_stack-6.2.4 → pen_stack-6.3.0}/prereg/ws_vcell.yaml +0 -0
  436. {pen_stack-6.2.4 → pen_stack-6.3.0}/prereg/ws_wv.yaml +0 -0
  437. {pen_stack-6.2.4 → pen_stack-6.3.0}/scripts/p1_build_atlas.py +0 -0
  438. {pen_stack-6.2.4 → pen_stack-6.3.0}/scripts/p1_build_durability.py +0 -0
  439. {pen_stack-6.2.4 → pen_stack-6.3.0}/scripts/p1_export_tracks.py +0 -0
  440. {pen_stack-6.2.4 → pen_stack-6.3.0}/scripts/p1_safety_concordance.py +0 -0
  441. {pen_stack-6.2.4 → pen_stack-6.3.0}/scripts/p1_train_safety.py +0 -0
  442. {pen_stack-6.2.4 → pen_stack-6.3.0}/scripts/p1_validation_report.py +0 -0
  443. {pen_stack-6.2.4 → pen_stack-6.3.0}/scripts/p2_build_atlas.py +0 -0
  444. {pen_stack-6.2.4 → pen_stack-6.3.0}/scripts/p3_benchmark_report.py +0 -0
  445. {pen_stack-6.2.4 → pen_stack-6.3.0}/scripts/p4_genome_scan.py +0 -0
  446. {pen_stack-6.2.4 → pen_stack-6.3.0}/scripts/p52_build_genotox_oracle.py +0 -0
  447. {pen_stack-6.2.4 → pen_stack-6.3.0}/scripts/p53_build_epitope_oracle.py +0 -0
  448. {pen_stack-6.2.4 → pen_stack-6.3.0}/scripts/ws_b_report.py +0 -0
  449. {pen_stack-6.2.4 → pen_stack-6.3.0}/scripts/ws_c_report.py +0 -0
  450. {pen_stack-6.2.4 → pen_stack-6.3.0}/setup.cfg +0 -0
@@ -3,6 +3,39 @@
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.3.0] - 2026-06-12 - v6.3.0: The Hybrid Co-Scientist (grounded engine + general intelligence)
7
+
8
+ **The chat gains general + biological intelligence WITHOUT loosening the no-fabrication core.** A 4-lane router
9
+ keeps grounded engine output and general trained-knowledge in separate, explicitly-labelled lanes, so a
10
+ general-knowledge fact can never be mistaken for a PEN-STACK result. Numbers now come with their meaning,
11
+ reference range, and how they were computed; the conversation has memory. MINOR feature release on the stable
12
+ 6.x API. Workstream WS-HYBRID, SHA-locked.
13
+
14
+ ### Added
15
+ - **WS-HYBRID** — `pen_stack/web/router.py` (deterministic 4-lane classifier: `design` / `explain` / `meta` /
16
+ `general`, biased to the engine whenever a design signal is present) + `pen_stack/web/guide.py`
17
+ (`metric_guide()` interpretation cards + `pen_stack_facts()` assembled from LIVE engine data) + a rewritten
18
+ `pen_stack/web/llm.py::grounded_reply` that dispatches per lane and returns `{mode, provenance, grounded, …}`.
19
+ - **`configs/metric_guide.yaml`** — grounded interpretation for every engine number (genotoxicity, CD8 epitope,
20
+ innate, pre-existing NAb, anti-PEG, confidence, relative expression + the safety decisions): what it means, the
21
+ scale + direction, reference bands, how it is computed, and its validation status. The chat now EXPLAINS a value
22
+ (scale / what's good-or-bad / reference range / method), not just prints it.
23
+ - **Lanes & provenance:** `design`/`explain`/`meta` are engine-grounded (the grounding guard runs over the tool
24
+ results, the metric guide, or the live facts); `general` answers from the LLM's trained knowledge, is **labelled
25
+ "General knowledge — not PEN-STACK-verified"**, attributes no number to PEN-STACK, and **points to the engine**
26
+ wherever PEN-STACK could compute a concrete answer (`pen_stack_angles`).
27
+ - **Conversation memory** — the last turns are passed to every lane so follow-ups ("what does that 0.55 mean?")
28
+ resolve against the prior dossier; the frontend keeps history in-session until refresh and renders a per-message
29
+ provenance badge (🔬 grounded vs 🧠 general) + the "PEN-STACK can compute this →" pointers.
30
+ - Tests: `tests/unit/test_ws_chat.py` — the 4-lane router, the general lane labelled+unattributed+pointered, the
31
+ meta lane grounded in live facts, the explain lane interpreting prior values without a fresh design, the metric
32
+ guide complete. prereg `ws_hybrid` + SHA lock; deposit `phase_6.3/`.
33
+
34
+ ### Notes
35
+ - **The core is untouched.** The guard still runs on every PEN-STACK-attributed number; we ADDED a general lane,
36
+ we did not loosen the grounded lane. The honest cost is that general-lane answers carry the LLM's fallibility —
37
+ made safe by the explicit label and by redirecting to the engine for anything computable.
38
+
6
39
  ## [6.2.4] - 2026-06-12 - v6.2.4: faster grounded narration (LLM backends) (patch)
7
40
 
8
41
  **Performance + a real fix, from benchmarking the narration backends on the deployment GPU (RTX A4000).** The
@@ -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.2.4
4
+ version: 6.3.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.2.4
3
+ Version: 6.3.0
4
4
  Summary: Open infrastructure for genome writing: the Writable Genome atlas, the Writer Atlas, and the Write Planner.
5
5
  Author-email: Anees Ahmed Mahaboob Ali <ahmedaneesm@gmail.com>
6
6
  License: MIT
@@ -90,9 +90,9 @@ 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.2.4-blue.svg)](CHANGELOG.md)
93
+ [![Version](https://img.shields.io/badge/version-6.3.0-blue.svg)](CHANGELOG.md)
94
94
  [![Status](https://img.shields.io/badge/status-1.0%20First%20Stable-success.svg)](docs/STABILITY.md)
95
- [![Tests](https://img.shields.io/badge/tests-371%20passing-success.svg)](tests/)
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)
97
97
  [![Runtime: Docker](https://img.shields.io/badge/runtime-docker-2496ED.svg)](docker/)
98
98
  [![Validation: pre-registered](https://img.shields.io/badge/validation-pre--registered-critical.svg)](prereg/)
@@ -148,6 +148,27 @@ demonstrated (v5.12) and the benchmark went public (v5.13).
148
148
  > unknown funnel remains — made legible (scope flags, known-unknowns, honest baselines, no fabrication), not
149
149
  > hidden.
150
150
 
151
+ ## What is new in v6.3 — The Hybrid Co-Scientist (grounded engine + general intelligence)
152
+
153
+ The chat now does three things at once without ever blurring them: it **runs the engine** for genome-writing
154
+ requests, **explains what the numbers mean**, and answers **general biology** questions — each in its own lane with
155
+ its own provenance, so a general-knowledge fact can never be mistaken for a PEN-STACK result.
156
+
157
+ | Lane | Trigger | Source | Provenance |
158
+ |---|---|---|---|
159
+ | 🔬 **Design** | "insert FIX at AAVS1 with AAV in hepatocytes" | the engine (verify/safety/immune/twin) — guard ON | "PEN-STACK · grounded" |
160
+ | 📖 **Explain** | "what does that 0.55 mean?" | the **metric guide** (scale, direction, reference range, how computed) + the prior dossier | "PEN-STACK · metric guide" |
161
+ | ⚙️ **Meta** | "how many enzymes? how is immunogenicity computed? how accurate?" | the **live capability facts** (33,370 systems / 8 families / 5 immune axes …) — guard ON | "PEN-STACK · about the engine" |
162
+ | 🧠 **General** | "hi", "what is AAV", "how does AAV work" | the LLM's trained knowledge | **"General knowledge — not PEN-STACK-verified"**, + a pointer to what PEN-STACK can compute |
163
+
164
+ - **The one rule that keeps the core intact:** a number presented as a PEN-STACK result is engine-grounded (the
165
+ guard runs on the first three lanes); a number from general knowledge is **visibly labelled** and, wherever
166
+ PEN-STACK could compute it, **redirected to the engine**. We added a lane; we did not loosen the grounded one.
167
+ - **Numbers now come with meaning** — every value is explained with its scale, what's good/bad, its reference
168
+ range, and how it was computed (`configs/metric_guide.yaml`).
169
+ - **Conversation memory** — follow-ups resolve against the prior answer (in-session until you refresh).
170
+ - Workstream **WS-HYBRID** (`pen_stack/web/{router,guide}.py` + the rewritten `llm.py`); `prereg/ws_hybrid.yaml`.
171
+
151
172
  ## What is new in v6.2 — The Web Platform (the human surface)
152
173
 
153
174
  Post-1.0, the adoption surface for **bench scientists**: a complete, friendly **web application** — a grounded
@@ -800,7 +821,7 @@ pen-stack/
800
821
  │ │ v5.12 closed_loop (loop-integrity hard-gate: gated end-to-end run · Level-3 human-in-control · drift detection · versioned/reversible continual learning)
801
822
  │ ├── data/ ingestion (genome, chromatin, integration, TRIP, safety annotations)
802
823
  │ ├── api/ v6.1 AI integration surface: manifest (capability_manifest + scope_manifest = machine-readable known-unknowns + oracle scope cards)
803
- │ ├── web/ v6.2 Web Platform backend: tools (deterministic engine dossier) / llm (grounded co-scientist: Ollama→Nemotron→deterministic + grounding-guard hard gate) / server (FastAPI gateway mounting the v6.1 surface + /chat + SSE + static frontend)
824
+ │ ├── web/ v6.2 Web Platform backend: tools (deterministic engine dossier) / llm (grounded co-scientist + grounding-guard) / server (FastAPI gateway + /chat + SSE) + v6.3 hybrid: router (4-lane design/explain/meta/general classifier) / guide (metric-interpretation cards + live capability facts)
804
825
  │ ├── server/api.py FastAPI REST (atlas, crosslink, writable, plan, bridge, ask; v3.3 verify; v6.1 /capabilities /scope /safety /immune /generate /predict /suggest /session + openapi.json 3.1; v5.13 /challenge/{tasks,leaderboard})
805
826
  │ ├── ui/app.py Streamlit web app (16 pages; v3.2 PEN-Agent shows confidence + epistemic status)
806
827
  │ └── cli.py unified CLI
@@ -821,7 +842,7 @@ pen-stack/
821
842
  │ genotox,epitope,innate,seroprev,peg,calib,profile,screen,policy,redteam,
822
843
  │ gen,pareto,orch,vcell,mech,outcome,twincal,acq,aldesign,alvalidate,
823
844
  │ proto,ingest,simlab,loop,continual,drift,challenge,cosci2,
824
- │ manifest,openapi,mcp,chat,frontend} + SHA256 locks)
845
+ │ manifest,openapi,mcp,chat,frontend,hybrid} + SHA256 locks)
825
846
  ├── data/curated/ small committed tables (universe, gene coords, measured bridge profile,
826
847
  │ v3.2 bridge_offtarget_energetics.json)
827
848
  ├── data/llm_bench_cache/ 28 cached ungrounded-LLM transcripts (T7, offline/CI replay)
@@ -15,9 +15,9 @@ 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.2.4-blue.svg)](CHANGELOG.md)
18
+ [![Version](https://img.shields.io/badge/version-6.3.0-blue.svg)](CHANGELOG.md)
19
19
  [![Status](https://img.shields.io/badge/status-1.0%20First%20Stable-success.svg)](docs/STABILITY.md)
20
- [![Tests](https://img.shields.io/badge/tests-371%20passing-success.svg)](tests/)
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)
22
22
  [![Runtime: Docker](https://img.shields.io/badge/runtime-docker-2496ED.svg)](docker/)
23
23
  [![Validation: pre-registered](https://img.shields.io/badge/validation-pre--registered-critical.svg)](prereg/)
@@ -73,6 +73,27 @@ demonstrated (v5.12) and the benchmark went public (v5.13).
73
73
  > unknown funnel remains — made legible (scope flags, known-unknowns, honest baselines, no fabrication), not
74
74
  > hidden.
75
75
 
76
+ ## What is new in v6.3 — The Hybrid Co-Scientist (grounded engine + general intelligence)
77
+
78
+ The chat now does three things at once without ever blurring them: it **runs the engine** for genome-writing
79
+ requests, **explains what the numbers mean**, and answers **general biology** questions — each in its own lane with
80
+ its own provenance, so a general-knowledge fact can never be mistaken for a PEN-STACK result.
81
+
82
+ | Lane | Trigger | Source | Provenance |
83
+ |---|---|---|---|
84
+ | 🔬 **Design** | "insert FIX at AAVS1 with AAV in hepatocytes" | the engine (verify/safety/immune/twin) — guard ON | "PEN-STACK · grounded" |
85
+ | 📖 **Explain** | "what does that 0.55 mean?" | the **metric guide** (scale, direction, reference range, how computed) + the prior dossier | "PEN-STACK · metric guide" |
86
+ | ⚙️ **Meta** | "how many enzymes? how is immunogenicity computed? how accurate?" | the **live capability facts** (33,370 systems / 8 families / 5 immune axes …) — guard ON | "PEN-STACK · about the engine" |
87
+ | 🧠 **General** | "hi", "what is AAV", "how does AAV work" | the LLM's trained knowledge | **"General knowledge — not PEN-STACK-verified"**, + a pointer to what PEN-STACK can compute |
88
+
89
+ - **The one rule that keeps the core intact:** a number presented as a PEN-STACK result is engine-grounded (the
90
+ guard runs on the first three lanes); a number from general knowledge is **visibly labelled** and, wherever
91
+ PEN-STACK could compute it, **redirected to the engine**. We added a lane; we did not loosen the grounded one.
92
+ - **Numbers now come with meaning** — every value is explained with its scale, what's good/bad, its reference
93
+ range, and how it was computed (`configs/metric_guide.yaml`).
94
+ - **Conversation memory** — follow-ups resolve against the prior answer (in-session until you refresh).
95
+ - Workstream **WS-HYBRID** (`pen_stack/web/{router,guide}.py` + the rewritten `llm.py`); `prereg/ws_hybrid.yaml`.
96
+
76
97
  ## What is new in v6.2 — The Web Platform (the human surface)
77
98
 
78
99
  Post-1.0, the adoption surface for **bench scientists**: a complete, friendly **web application** — a grounded
@@ -725,7 +746,7 @@ pen-stack/
725
746
  │ │ v5.12 closed_loop (loop-integrity hard-gate: gated end-to-end run · Level-3 human-in-control · drift detection · versioned/reversible continual learning)
726
747
  │ ├── data/ ingestion (genome, chromatin, integration, TRIP, safety annotations)
727
748
  │ ├── api/ v6.1 AI integration surface: manifest (capability_manifest + scope_manifest = machine-readable known-unknowns + oracle scope cards)
728
- │ ├── web/ v6.2 Web Platform backend: tools (deterministic engine dossier) / llm (grounded co-scientist: Ollama→Nemotron→deterministic + grounding-guard hard gate) / server (FastAPI gateway mounting the v6.1 surface + /chat + SSE + static frontend)
749
+ │ ├── web/ v6.2 Web Platform backend: tools (deterministic engine dossier) / llm (grounded co-scientist + grounding-guard) / server (FastAPI gateway + /chat + SSE) + v6.3 hybrid: router (4-lane design/explain/meta/general classifier) / guide (metric-interpretation cards + live capability facts)
729
750
  │ ├── server/api.py FastAPI REST (atlas, crosslink, writable, plan, bridge, ask; v3.3 verify; v6.1 /capabilities /scope /safety /immune /generate /predict /suggest /session + openapi.json 3.1; v5.13 /challenge/{tasks,leaderboard})
730
751
  │ ├── ui/app.py Streamlit web app (16 pages; v3.2 PEN-Agent shows confidence + epistemic status)
731
752
  │ └── cli.py unified CLI
@@ -746,7 +767,7 @@ pen-stack/
746
767
  │ genotox,epitope,innate,seroprev,peg,calib,profile,screen,policy,redteam,
747
768
  │ gen,pareto,orch,vcell,mech,outcome,twincal,acq,aldesign,alvalidate,
748
769
  │ proto,ingest,simlab,loop,continual,drift,challenge,cosci2,
749
- │ manifest,openapi,mcp,chat,frontend} + SHA256 locks)
770
+ │ manifest,openapi,mcp,chat,frontend,hybrid} + SHA256 locks)
750
771
  ├── data/curated/ small committed tables (universe, gene coords, measured bridge profile,
751
772
  │ v3.2 bridge_offtarget_energetics.json)
752
773
  ├── data/llm_bench_cache/ 28 cached ungrounded-LLM transcripts (T7, offline/CI replay)
@@ -0,0 +1,102 @@
1
+ # PEN-STACK v6.3 — Metric Interpretation Guide (the "what does this number mean" layer).
2
+ # For every quantity the engine returns, a GROUNDED interpretation card: what it is, the scale + direction,
3
+ # reference bands, how it is computed (the oracle + data source), its validation status, and the caveat. These
4
+ # are curated facts ABOUT the metrics (not predictions), so the chat can explain a number without fabricating —
5
+ # the value is still the engine's; this only adds the textbook reading of it. Bands are interpretive aids, not
6
+ # thresholds for a decision.
7
+
8
+ metrics:
9
+ genotoxicity:
10
+ label: "Genotoxicity safety score"
11
+ scale: "0–1 (dimensionless)"
12
+ direction: "higher = safer (1.0 = no insertional-mutagenesis mechanism)"
13
+ bands: { favorable: ">=0.7", moderate: "0.4–0.7", concern: "<0.4" }
14
+ means: "relative insertional-oncogenesis safety of the delivery/integration strategy. 1.0 = episomal/
15
+ non-integrating (no integration → no insertional mutagenesis); lower = an integrating vector whose insertion
16
+ sites fall nearer known proto-oncogenes."
17
+ computed: "for integrating vectors, from VISDB integration-site maps × COSMIC Cancer-Gene-Census oncogene
18
+ proximity (per-vector enrichment of integrations within 50 kb of an oncogene vs background)."
19
+ validation: "mechanistic proxy — NOT outcome-validated (the actual clonal-transformation rate is measured, not predicted)."
20
+ reference: "e.g. lentiviral ~0.48 (2.08× oncogene-proximity enrichment) vs episomal AAV 1.0."
21
+
22
+ cd8_epitope:
23
+ label: "CD8 T-cell capsid epitope-load score"
24
+ scale: "0–1 (dimensionless)"
25
+ direction: "higher = fewer strong CD8 epitopes presented (1.0 = none / non-viral)"
26
+ bands: { favorable: ">=0.6", moderate: "0.3–0.6", concern: "<0.3" }
27
+ means: "sequence-derived load of strong MHC-I (CD8) epitopes on the viral capsid/envelope across a common
28
+ HLA-I panel. Lower = more of the capsid is presentable to cytotoxic T cells."
29
+ computed: "MHCflurry binding prediction over the capsid/envelope sequence × a 12-allele HLA-I panel →
30
+ fraction of strong binders; score = 1 − strong-epitope-fraction."
31
+ validation: "mechanistic proxy — NOT outcome-validated; covers CD8/MHC-I only (CD4/MHC-II help is a known-unknown)."
32
+ reference: "e.g. AAV2 capsid ~0.28 (≈72% of windows are strong binders across the panel)."
33
+
34
+ innate:
35
+ label: "Innate-sensing safety score"
36
+ scale: "0–1 (dimensionless)"
37
+ direction: "higher = less innate-immune sensing of the cargo"
38
+ bands: { favorable: ">=0.7", moderate: "0.4–0.7", concern: "<0.4" }
39
+ means: "how strongly the cargo nucleic acid triggers innate pattern-recognition (DNA: CpG/TLR9; mRNA:
40
+ dsRNA/RIG-I). Higher = fewer immunostimulatory motifs."
41
+ computed: "CpG observed/expected for DNA cargo (TLR9), and U-content + ViennaRNA dsRNA structure for mRNA
42
+ (RIG-I/MDA5); RNP minimal. mRNA is partial (nucleoside modification is not sequence-derivable)."
43
+ validation: "mechanistic proxy (partial for mRNA) — the realized in-vivo magnitude is a known-unknown."
44
+ reference: "often 'n/a' when no cargo sequence is supplied (the engine abstains rather than guess)."
45
+
46
+ preexisting_nab:
47
+ label: "Pre-existing neutralizing-antibody eligibility score"
48
+ scale: "0–1 (dimensionless)"
49
+ direction: "higher = fewer patients excluded by pre-existing antibodies"
50
+ bands: { favorable: ">=0.7", moderate: "0.4–0.7", concern: "<0.4" }
51
+ means: "the fraction of the population NOT excluded by pre-existing neutralizing antibodies to the vector.
52
+ It predicts ELIGIBILITY (who can be dosed), NOT the response magnitude in an eligible patient."
53
+ computed: "1 − midpoint of published anti-vector NAb seroprevalence ranges (serosurveys, per serotype)."
54
+ validation: "population proxy — predicts eligibility, not response magnitude. The individual patient's titer is a known-unknown (a clinical test)."
55
+ reference: "e.g. AAV ~0.55 (≈30–60% seroprevalence), Ad5 ~0.35 (40–90%), VSV ~0.975 (0–5%)."
56
+
57
+ anti_peg:
58
+ label: "Anti-PEG (re-dosing) eligibility score"
59
+ scale: "0–1 (dimensionless)"
60
+ direction: "higher = lower pre-existing anti-PEG barrier to re-dosing"
61
+ bands: { favorable: ">=0.7", moderate: "0.4–0.7", concern: "<0.4" }
62
+ means: "pre-existing anti-PEG immunity that gates RE-DOSING of a PEGylated delivery (e.g. LNP). Activates
63
+ only for PEGylated vehicles; abstains for non-PEG vehicles."
64
+ computed: "1 − midpoint of published anti-PEG seroprevalence ranges (population serosurveys)."
65
+ validation: "population proxy — gates re-dosing eligibility, not calibrated to a re-dosing-failure rate. Patient-specific and post-dose-1 induced anti-PEG are known-unknowns."
66
+ reference: "e.g. PEGylated LNP ~0.515 (≈25–72% population anti-PEG prevalence); 'n/a' for non-PEG vehicles."
67
+
68
+ confidence:
69
+ label: "Calibrated confidence (soft components)"
70
+ scale: "0–1, with an interval [low–high]"
71
+ direction: "higher = more confident on the SOFT (scored) components — a SEPARATE axis from legality"
72
+ bands: { high: ">=0.7", moderate: "0.4–0.7", low: "<0.4" }
73
+ means: "calibrated confidence on the design's soft/scored components (durability, writer activity, etc.),
74
+ reported with an uncertainty interval. It is NOT legality (a legal design can still be low-confidence), and
75
+ it is NOT a success probability. 'None' = the engine ABSTAINED (no calibrated score for this design)."
76
+ computed: "L4 trust layer over the planner scores, calibrated with held-out conformal intervals."
77
+ validation: "calibrated where data supports it; abstains (None) rather than emit an uncalibrated number."
78
+ reference: "interval widens / status flips to 'extrapolating' for out-of-distribution contexts."
79
+
80
+ relative_expression:
81
+ label: "Relative expression estimate (digital twin)"
82
+ scale: "0–1 (relative, dimensionless), with an interval"
83
+ direction: "higher = stronger relative cassette expression — NOT an absolute titer"
84
+ bands: { strong: ">=0.6", moderate: "0.3–0.6", weak: "<0.3" }
85
+ means: "a RELATIVE, dimensionless expression estimate (promoter × copy number × accessibility). It is NOT a
86
+ phenotype, NOT a functional titer, and NOT a percent-of-normal — those are measured clinical endpoints."
87
+ computed: "closed-form mechanistic twin (steady-state; no silencing modeled; linear copy scaling), fused with
88
+ the immune context; interval is a heuristic band that WIDENS ~1.6× under out-of-distribution context."
89
+ validation: "honest heuristic band — NOT a trained conformal interval (no public perturbation-outcome calibration set)."
90
+ reference: "absolute titer / % of normal is explicitly out of scope (known-unknown in_vivo_expression_magnitude)."
91
+
92
+ # how to read the safety decision (categorical, not a number)
93
+ safety_decision:
94
+ clear: "no dual-use hazard signal — the design proceeds to scoring."
95
+ flag: "a low/medium dual-use signal — surfaced for human review."
96
+ escalate: "an ambiguous dual-use (e.g. gain-of-function) case — routed to oversight (P3CO/DURC)."
97
+ refuse: "a high-severity controlled-hazard match — the design is REFUSED and not scored further (reframing cannot flip it)."
98
+
99
+ # the global caveat that rides every quantitative answer
100
+ disclaimer: "Decision-support, not a clinical directive. Every number is a tool-computed proxy with a stated
101
+ scope; proxies are not outcome-validated, and patient-specific magnitudes (titer, response, durability) are
102
+ explicit known-unknowns — measured, never predicted."
@@ -1,2 +1,2 @@
1
1
  """PEN-STACK v3.0 - open infrastructure for genome writing."""
2
- __version__ = "6.2.4"
2
+ __version__ = "6.3.0"
@@ -0,0 +1,103 @@
1
+ """Metric interpretation + PEN-STACK capability facts (v6.3, the explain/meta lanes).
2
+
3
+ Two grounded sources the hybrid co-scientist narrates over WITHOUT fabricating:
4
+ * `metric_guide()` — curated interpretation cards (configs/metric_guide.yaml): what each engine number means,
5
+ its scale/direction, reference bands, how it is computed, validation status. Used to EXPLAIN a value.
6
+ * `pen_stack_facts()` — capability facts assembled from LIVE engine data (writer atlas coverage, the delivery
7
+ palette, the immune axes, the known-unknowns) — so "how many enzymes / vectors / axes, how accurate" is
8
+ answered from the system itself, not invented.
9
+ """
10
+ from __future__ import annotations
11
+
12
+ from functools import lru_cache
13
+
14
+ import yaml
15
+
16
+ from pen_stack._resources import resource
17
+
18
+
19
+ @lru_cache(maxsize=1)
20
+ def metric_guide() -> dict:
21
+ return yaml.safe_load(resource("configs/metric_guide.yaml").read_text(encoding="utf-8"))
22
+
23
+
24
+ def guide_for(metric: str) -> dict | None:
25
+ """The interpretation card for a metric name (immune axis / verdict field)."""
26
+ return (metric_guide().get("metrics") or {}).get(metric)
27
+
28
+
29
+ def enrich_axes(axes: dict) -> dict:
30
+ """Attach the interpretation card (meaning/scale/bands/computed/validation/reference) to each immune axis."""
31
+ out = {}
32
+ for name, a in (axes or {}).items():
33
+ g = guide_for(name)
34
+ out[name] = {**a, "guide": g} if g else a
35
+ return out
36
+
37
+
38
+ @lru_cache(maxsize=1)
39
+ def pen_stack_facts() -> dict:
40
+ """GROUNDED facts about what PEN-STACK covers + how it computes — assembled from live engine data, never
41
+ hand-typed counts. Answers the 'meta' lane ('how many enzymes/vectors/axes, how is X computed, how accurate')."""
42
+ facts: dict = {"disclaimer": (metric_guide() or {}).get("disclaimer")}
43
+
44
+ # writer atlas coverage (enzymes / families) — from the committed atlas
45
+ try:
46
+ import pandas as pd
47
+
48
+ from pen_stack import __file__ as _pkg
49
+ from pathlib import Path
50
+ atlas = pd.read_parquet(Path(_pkg).resolve().parents[0] / "atlas" / "atlas.parquet")
51
+ facts["writers"] = {
52
+ "systems": int(len(atlas)),
53
+ "families": sorted(atlas["family"].astype(str).unique().tolist()),
54
+ "n_families": int(atlas["family"].nunique()),
55
+ "measured": int((atlas["confidence"] == "measured").sum()) if "confidence" in atlas.columns else None,
56
+ "note": "writer = genome-writing enzyme system (integrases, recombinases, nucleases, transposases) on "
57
+ "common measured axes (cargo capacity, programmability, DSB-freeness, human-cell activity, "
58
+ "deliverability).",
59
+ }
60
+ except Exception:
61
+ facts["writers"] = {"note": "writer atlas requires the committed atlas.parquet"}
62
+
63
+ # delivery palette (vectors)
64
+ try:
65
+ from pen_stack.planner.delivery_vehicles import names as _vnames
66
+ from pen_stack.planner.delivery_vehicles import vehicle as _veh
67
+ vs = _vnames()
68
+ viral = [v for v in vs if (_veh(v) or {}).get("class", "").lower().startswith("vir")
69
+ or any(k in v.lower() for k in ("aav", "lenti", "adeno", "hsv", "virus"))]
70
+ facts["delivery"] = {
71
+ "n_vehicles": len(vs), "vehicles": list(vs),
72
+ "viral_like": viral, "nonviral_like": [v for v in vs if v not in viral],
73
+ "note": "each vehicle carries documented cargo capacity, integration status, cargo-form compatibility "
74
+ "(DNA/mRNA/RNP) and an ordinal immune/safety prior; the planner picks compatible vehicles.",
75
+ }
76
+ except Exception:
77
+ facts["delivery"] = {"note": "delivery palette in configs/delivery_vehicles.yaml"}
78
+
79
+ # immune-risk axes (how immunogenicity is computed) + their guides
80
+ axes = ["genotoxicity", "cd8_epitope", "innate", "preexisting_nab", "anti_peg"]
81
+ facts["immunogenicity"] = {
82
+ "n_axes": len(axes), "axes": axes,
83
+ "never_collapsed": "the per-axis profile is never fused into one score (collapsed_score is None) — the "
84
+ "axes measure different mechanisms on different evidence.",
85
+ "how": {a: (guide_for(a) or {}).get("computed") for a in axes},
86
+ "validation": {a: (guide_for(a) or {}).get("validation") for a in axes},
87
+ }
88
+
89
+ # accuracy / honesty posture + the known-unknowns
90
+ try:
91
+ from pen_stack.agent.scope import load_registry
92
+ kus = [{"id": e["id"], "title": e["title"]} for e in load_registry()]
93
+ except Exception:
94
+ kus = []
95
+ facts["accuracy"] = {
96
+ "posture": "every number is a tool-computed proxy with a stated scope; proxies are labelled "
97
+ "'mechanistic/population proxy — NOT outcome-validated'; the engine ABSTAINS or flags "
98
+ "out-of-scope rather than guess; nothing is fabricated.",
99
+ "known_unknowns": kus,
100
+ "what_is_NOT_predicted": "functional titer / % of normal, in-vivo response magnitude, long-term clinical "
101
+ "durability, phenotype — these are measured clinical endpoints, never predicted.",
102
+ }
103
+ return facts