pen-stack 6.2.0__tar.gz → 6.2.2__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 (444) hide show
  1. {pen_stack-6.2.0 → pen_stack-6.2.2}/CHANGELOG.md +25 -0
  2. {pen_stack-6.2.0 → pen_stack-6.2.2}/CITATION.cff +1 -1
  3. {pen_stack-6.2.0 → pen_stack-6.2.2}/PKG-INFO +3 -3
  4. {pen_stack-6.2.0 → pen_stack-6.2.2}/README.md +2 -2
  5. {pen_stack-6.2.0 → pen_stack-6.2.2}/pen_stack/__init__.py +1 -1
  6. {pen_stack-6.2.0 → pen_stack-6.2.2}/pen_stack/atlas/crosslink.py +3 -6
  7. {pen_stack-6.2.0 → pen_stack-6.2.2}/pen_stack/planner/optimize.py +13 -2
  8. {pen_stack-6.2.0 → pen_stack-6.2.2}/pen_stack/server/api.py +10 -3
  9. {pen_stack-6.2.0 → pen_stack-6.2.2}/pen_stack/web/server.py +10 -3
  10. {pen_stack-6.2.0 → pen_stack-6.2.2}/pen_stack/web/tools.py +4 -1
  11. {pen_stack-6.2.0 → pen_stack-6.2.2}/pen_stack.egg-info/PKG-INFO +3 -3
  12. {pen_stack-6.2.0 → pen_stack-6.2.2}/pyproject.toml +1 -1
  13. {pen_stack-6.2.0 → pen_stack-6.2.2}/LICENSE +0 -0
  14. {pen_stack-6.2.0 → pen_stack-6.2.2}/MANIFEST.in +0 -0
  15. {pen_stack-6.2.0 → pen_stack-6.2.2}/bench/run.py +0 -0
  16. {pen_stack-6.2.0 → pen_stack-6.2.2}/benchmarks/genome_writing_bench/LEADERBOARD.md +0 -0
  17. {pen_stack-6.2.0 → pen_stack-6.2.2}/benchmarks/genome_writing_bench/README.md +0 -0
  18. {pen_stack-6.2.0 → pen_stack-6.2.2}/benchmarks/genome_writing_bench/SHA256SUMS +0 -0
  19. {pen_stack-6.2.0 → pen_stack-6.2.2}/benchmarks/genome_writing_bench/SUBMISSIONS.md +0 -0
  20. {pen_stack-6.2.0 → pen_stack-6.2.2}/benchmarks/genome_writing_bench/tasks.yaml +0 -0
  21. {pen_stack-6.2.0 → pen_stack-6.2.2}/benchmarks/genome_writing_challenge/README.md +0 -0
  22. {pen_stack-6.2.0 → pen_stack-6.2.2}/benchmarks/genome_writing_challenge/SUBMISSIONS.md +0 -0
  23. {pen_stack-6.2.0 → pen_stack-6.2.2}/configs/antipeg.yaml +0 -0
  24. {pen_stack-6.2.0 → pen_stack-6.2.2}/configs/atlas_families.yaml +0 -0
  25. {pen_stack-6.2.0 → pen_stack-6.2.2}/configs/bridge_offtarget_profile.yaml +0 -0
  26. {pen_stack-6.2.0 → pen_stack-6.2.2}/configs/capsid_epitope_oracle.yaml +0 -0
  27. {pen_stack-6.2.0 → pen_stack-6.2.2}/configs/capsid_sequences.fasta +0 -0
  28. {pen_stack-6.2.0 → pen_stack-6.2.2}/configs/cargo_polish.yaml +0 -0
  29. {pen_stack-6.2.0 → pen_stack-6.2.2}/configs/cell_types.yaml +0 -0
  30. {pen_stack-6.2.0 → pen_stack-6.2.2}/configs/datasets.yaml +0 -0
  31. {pen_stack-6.2.0 → pen_stack-6.2.2}/configs/delivery_constraints.yaml +0 -0
  32. {pen_stack-6.2.0 → pen_stack-6.2.2}/configs/delivery_rules.yaml +0 -0
  33. {pen_stack-6.2.0 → pen_stack-6.2.2}/configs/delivery_vehicles.yaml +0 -0
  34. {pen_stack-6.2.0 → pen_stack-6.2.2}/configs/gates_v3.yaml +0 -0
  35. {pen_stack-6.2.0 → pen_stack-6.2.2}/configs/genotoxicity_oracle.yaml +0 -0
  36. {pen_stack-6.2.0 → pen_stack-6.2.2}/configs/gsh_validated_heldout.yaml +0 -0
  37. {pen_stack-6.2.0 → pen_stack-6.2.2}/configs/intent_weights.yaml +0 -0
  38. {pen_stack-6.2.0 → pen_stack-6.2.2}/configs/known_unknowns.yaml +0 -0
  39. {pen_stack-6.2.0 → pen_stack-6.2.2}/configs/llm.yaml +0 -0
  40. {pen_stack-6.2.0 → pen_stack-6.2.2}/configs/monitor_queries.yaml +0 -0
  41. {pen_stack-6.2.0 → pen_stack-6.2.2}/configs/oracles/scope_cards.yaml +0 -0
  42. {pen_stack-6.2.0 → pen_stack-6.2.2}/configs/rules/delivery.yaml +0 -0
  43. {pen_stack-6.2.0 → pen_stack-6.2.2}/configs/rules/fold.yaml +0 -0
  44. {pen_stack-6.2.0 → pen_stack-6.2.2}/configs/rules/multiplex.yaml +0 -0
  45. {pen_stack-6.2.0 → pen_stack-6.2.2}/configs/rules/payload.yaml +0 -0
  46. {pen_stack-6.2.0 → pen_stack-6.2.2}/configs/rules/reachability.yaml +0 -0
  47. {pen_stack-6.2.0 → pen_stack-6.2.2}/configs/safety/hazard_registry.yaml +0 -0
  48. {pen_stack-6.2.0 → pen_stack-6.2.2}/configs/safety/policy.yaml +0 -0
  49. {pen_stack-6.2.0 → pen_stack-6.2.2}/configs/safety/probes.yaml +0 -0
  50. {pen_stack-6.2.0 → pen_stack-6.2.2}/configs/score_axes.yaml +0 -0
  51. {pen_stack-6.2.0 → pen_stack-6.2.2}/configs/seroprevalence.yaml +0 -0
  52. {pen_stack-6.2.0 → pen_stack-6.2.2}/configs/target_sites.yaml +0 -0
  53. {pen_stack-6.2.0 → pen_stack-6.2.2}/configs/universe_crosswalk.yaml +0 -0
  54. {pen_stack-6.2.0 → pen_stack-6.2.2}/configs/write_types.yaml +0 -0
  55. {pen_stack-6.2.0 → pen_stack-6.2.2}/configs/wtkb_curated.yaml +0 -0
  56. {pen_stack-6.2.0 → pen_stack-6.2.2}/data/curated/bridge_offtarget_energetics.json +0 -0
  57. {pen_stack-6.2.0 → pen_stack-6.2.2}/data/curated/bridge_offtarget_profile_measured.parquet +0 -0
  58. {pen_stack-6.2.0 → pen_stack-6.2.2}/data/curated/gene_coords.parquet +0 -0
  59. {pen_stack-6.2.0 → pen_stack-6.2.2}/data/curated/unified_editor_universe.parquet +0 -0
  60. {pen_stack-6.2.0 → pen_stack-6.2.2}/docs/BACKLOG.md +0 -0
  61. {pen_stack-6.2.0 → pen_stack-6.2.2}/docs/DEPLOY.md +0 -0
  62. {pen_stack-6.2.0 → pen_stack-6.2.2}/docs/INFRA.md +0 -0
  63. {pen_stack-6.2.0 → pen_stack-6.2.2}/docs/MCP.md +0 -0
  64. {pen_stack-6.2.0 → pen_stack-6.2.2}/docs/RELEASING.md +0 -0
  65. {pen_stack-6.2.0 → pen_stack-6.2.2}/docs/REPRO.md +0 -0
  66. {pen_stack-6.2.0 → pen_stack-6.2.2}/docs/STABILITY.md +0 -0
  67. {pen_stack-6.2.0 → pen_stack-6.2.2}/docs/agent.md +0 -0
  68. {pen_stack-6.2.0 → pen_stack-6.2.2}/docs/alphagenome_feasibility.md +0 -0
  69. {pen_stack-6.2.0 → pen_stack-6.2.2}/docs/autonomy.md +0 -0
  70. {pen_stack-6.2.0 → pen_stack-6.2.2}/docs/benchmark_circularity.md +0 -0
  71. {pen_stack-6.2.0 → pen_stack-6.2.2}/docs/biosecurity.md +0 -0
  72. {pen_stack-6.2.0 → pen_stack-6.2.2}/docs/build_interface.md +0 -0
  73. {pen_stack-6.2.0 → pen_stack-6.2.2}/docs/cards/atlas.md +0 -0
  74. {pen_stack-6.2.0 → pen_stack-6.2.2}/docs/cards/durability.md +0 -0
  75. {pen_stack-6.2.0 → pen_stack-6.2.2}/docs/cards/safety.md +0 -0
  76. {pen_stack-6.2.0 → pen_stack-6.2.2}/docs/challenge.md +0 -0
  77. {pen_stack-6.2.0 → pen_stack-6.2.2}/docs/closed_loop.md +0 -0
  78. {pen_stack-6.2.0 → pen_stack-6.2.2}/docs/co_scientist.md +0 -0
  79. {pen_stack-6.2.0 → pen_stack-6.2.2}/docs/co_scientist_loop.md +0 -0
  80. {pen_stack-6.2.0 → pen_stack-6.2.2}/docs/delivery.md +0 -0
  81. {pen_stack-6.2.0 → pen_stack-6.2.2}/docs/delivery_immunology.md +0 -0
  82. {pen_stack-6.2.0 → pen_stack-6.2.2}/docs/digital_twin.md +0 -0
  83. {pen_stack-6.2.0 → pen_stack-6.2.2}/docs/dissemination.md +0 -0
  84. {pen_stack-6.2.0 → pen_stack-6.2.2}/docs/environment.md +0 -0
  85. {pen_stack-6.2.0 → pen_stack-6.2.2}/docs/experiment_design.md +0 -0
  86. {pen_stack-6.2.0 → pen_stack-6.2.2}/docs/generative_design.md +0 -0
  87. {pen_stack-6.2.0 → pen_stack-6.2.2}/docs/index.md +0 -0
  88. {pen_stack-6.2.0 → pen_stack-6.2.2}/docs/integrations.md +0 -0
  89. {pen_stack-6.2.0 → pen_stack-6.2.2}/docs/mechanistic_constraints.md +0 -0
  90. {pen_stack-6.2.0 → pen_stack-6.2.2}/docs/oracles.md +0 -0
  91. {pen_stack-6.2.0 → pen_stack-6.2.2}/docs/positioning.md +0 -0
  92. {pen_stack-6.2.0 → pen_stack-6.2.2}/docs/private_data_formats.md +0 -0
  93. {pen_stack-6.2.0 → pen_stack-6.2.2}/docs/quickstart.md +0 -0
  94. {pen_stack-6.2.0 → pen_stack-6.2.2}/docs/responsible_use.md +0 -0
  95. {pen_stack-6.2.0 → pen_stack-6.2.2}/docs/rules.md +0 -0
  96. {pen_stack-6.2.0 → pen_stack-6.2.2}/docs/scope.md +0 -0
  97. {pen_stack-6.2.0 → pen_stack-6.2.2}/docs/scorecard.md +0 -0
  98. {pen_stack-6.2.0 → pen_stack-6.2.2}/docs/tutorials/compare-families.md +0 -0
  99. {pen_stack-6.2.0 → pen_stack-6.2.2}/docs/tutorials/score-deliverability.md +0 -0
  100. {pen_stack-6.2.0 → pen_stack-6.2.2}/docs/tutorials/where-can-i-write.md +0 -0
  101. {pen_stack-6.2.0 → pen_stack-6.2.2}/docs/tutorials/which-writer-reaches-locus.md +0 -0
  102. {pen_stack-6.2.0 → pen_stack-6.2.2}/docs/uncertainty.md +0 -0
  103. {pen_stack-6.2.0 → pen_stack-6.2.2}/docs/verify.md +0 -0
  104. {pen_stack-6.2.0 → pen_stack-6.2.2}/docs/world_model.md +0 -0
  105. {pen_stack-6.2.0 → pen_stack-6.2.2}/docs/writer_verification.md +0 -0
  106. {pen_stack-6.2.0 → pen_stack-6.2.2}/docs/wtkb.md +0 -0
  107. {pen_stack-6.2.0 → pen_stack-6.2.2}/pen_stack/_resources.py +0 -0
  108. {pen_stack-6.2.0 → pen_stack-6.2.2}/pen_stack/active/__init__.py +0 -0
  109. {pen_stack-6.2.0 → pen_stack-6.2.2}/pen_stack/active/acquire.py +0 -0
  110. {pen_stack-6.2.0 → pen_stack-6.2.2}/pen_stack/active/design.py +0 -0
  111. {pen_stack-6.2.0 → pen_stack-6.2.2}/pen_stack/active/validate.py +0 -0
  112. {pen_stack-6.2.0 → pen_stack-6.2.2}/pen_stack/adapt/__init__.py +0 -0
  113. {pen_stack-6.2.0 → pen_stack-6.2.2}/pen_stack/adapt/finetune.py +0 -0
  114. {pen_stack-6.2.0 → pen_stack-6.2.2}/pen_stack/adapt/ingest.py +0 -0
  115. {pen_stack-6.2.0 → pen_stack-6.2.2}/pen_stack/adapt/pipeline.py +0 -0
  116. {pen_stack-6.2.0 → pen_stack-6.2.2}/pen_stack/adapt/recalibrate.py +0 -0
  117. {pen_stack-6.2.0 → pen_stack-6.2.2}/pen_stack/adapt/report.py +0 -0
  118. {pen_stack-6.2.0 → pen_stack-6.2.2}/pen_stack/agent/__init__.py +0 -0
  119. {pen_stack-6.2.0 → pen_stack-6.2.2}/pen_stack/agent/cite.py +0 -0
  120. {pen_stack-6.2.0 → pen_stack-6.2.2}/pen_stack/agent/co_scientist.py +0 -0
  121. {pen_stack-6.2.0 → pen_stack-6.2.2}/pen_stack/agent/epistemic.py +0 -0
  122. {pen_stack-6.2.0 → pen_stack-6.2.2}/pen_stack/agent/guardrails.py +0 -0
  123. {pen_stack-6.2.0 → pen_stack-6.2.2}/pen_stack/agent/mcp_server.py +0 -0
  124. {pen_stack-6.2.0 → pen_stack-6.2.2}/pen_stack/agent/orchestrator.py +0 -0
  125. {pen_stack-6.2.0 → pen_stack-6.2.2}/pen_stack/agent/orchestrator_live.py +0 -0
  126. {pen_stack-6.2.0 → pen_stack-6.2.2}/pen_stack/agent/pen_agent.py +0 -0
  127. {pen_stack-6.2.0 → pen_stack-6.2.2}/pen_stack/agent/scope.py +0 -0
  128. {pen_stack-6.2.0 → pen_stack-6.2.2}/pen_stack/agent/tools.py +0 -0
  129. {pen_stack-6.2.0 → pen_stack-6.2.2}/pen_stack/api/__init__.py +0 -0
  130. {pen_stack-6.2.0 → pen_stack-6.2.2}/pen_stack/api/manifest.py +0 -0
  131. {pen_stack-6.2.0 → pen_stack-6.2.2}/pen_stack/atlas/__init__.py +0 -0
  132. {pen_stack-6.2.0 → pen_stack-6.2.2}/pen_stack/atlas/build_wtkb.py +0 -0
  133. {pen_stack-6.2.0 → pen_stack-6.2.2}/pen_stack/atlas/expand.py +0 -0
  134. {pen_stack-6.2.0 → pen_stack-6.2.2}/pen_stack/atlas/schema.py +0 -0
  135. {pen_stack-6.2.0 → pen_stack-6.2.2}/pen_stack/atlas/scorecard.py +0 -0
  136. {pen_stack-6.2.0 → pen_stack-6.2.2}/pen_stack/atlas/universe.py +0 -0
  137. {pen_stack-6.2.0 → pen_stack-6.2.2}/pen_stack/atlas/variant_propose.py +0 -0
  138. {pen_stack-6.2.0 → pen_stack-6.2.2}/pen_stack/atlas/writer_verify.py +0 -0
  139. {pen_stack-6.2.0 → pen_stack-6.2.2}/pen_stack/bridge/__init__.py +0 -0
  140. {pen_stack-6.2.0 → pen_stack-6.2.2}/pen_stack/bridge/activity.py +0 -0
  141. {pen_stack-6.2.0 → pen_stack-6.2.2}/pen_stack/bridge/cli.py +0 -0
  142. {pen_stack-6.2.0 → pen_stack-6.2.2}/pen_stack/bridge/fold_qc.py +0 -0
  143. {pen_stack-6.2.0 → pen_stack-6.2.2}/pen_stack/bridge/guide_qc.py +0 -0
  144. {pen_stack-6.2.0 → pen_stack-6.2.2}/pen_stack/bridge/ingest.py +0 -0
  145. {pen_stack-6.2.0 → pen_stack-6.2.2}/pen_stack/bridge/offtarget.py +0 -0
  146. {pen_stack-6.2.0 → pen_stack-6.2.2}/pen_stack/bridge/offtarget_energetics.py +0 -0
  147. {pen_stack-6.2.0 → pen_stack-6.2.2}/pen_stack/bridge/ortholog_screen.py +0 -0
  148. {pen_stack-6.2.0 → pen_stack-6.2.2}/pen_stack/bridge/pipeline.py +0 -0
  149. {pen_stack-6.2.0 → pen_stack-6.2.2}/pen_stack/build/__init__.py +0 -0
  150. {pen_stack-6.2.0 → pen_stack-6.2.2}/pen_stack/build/ingest.py +0 -0
  151. {pen_stack-6.2.0 → pen_stack-6.2.2}/pen_stack/build/protocol.py +0 -0
  152. {pen_stack-6.2.0 → pen_stack-6.2.2}/pen_stack/build/simlab.py +0 -0
  153. {pen_stack-6.2.0 → pen_stack-6.2.2}/pen_stack/cli.py +0 -0
  154. {pen_stack-6.2.0 → pen_stack-6.2.2}/pen_stack/data/__init__.py +0 -0
  155. {pen_stack-6.2.0 → pen_stack-6.2.2}/pen_stack/data/encode.py +0 -0
  156. {pen_stack-6.2.0 → pen_stack-6.2.2}/pen_stack/data/genome.py +0 -0
  157. {pen_stack-6.2.0 → pen_stack-6.2.2}/pen_stack/data/ingest_chromatin.py +0 -0
  158. {pen_stack-6.2.0 → pen_stack-6.2.2}/pen_stack/data/ingest_integration.py +0 -0
  159. {pen_stack-6.2.0 → pen_stack-6.2.2}/pen_stack/data/ingest_safety_annot.py +0 -0
  160. {pen_stack-6.2.0 → pen_stack-6.2.2}/pen_stack/data/ingest_trip.py +0 -0
  161. {pen_stack-6.2.0 → pen_stack-6.2.2}/pen_stack/design/__init__.py +0 -0
  162. {pen_stack-6.2.0 → pen_stack-6.2.2}/pen_stack/design/generate.py +0 -0
  163. {pen_stack-6.2.0 → pen_stack-6.2.2}/pen_stack/design/pareto.py +0 -0
  164. {pen_stack-6.2.0 → pen_stack-6.2.2}/pen_stack/design/space.py +0 -0
  165. {pen_stack-6.2.0 → pen_stack-6.2.2}/pen_stack/env/__init__.py +0 -0
  166. {pen_stack-6.2.0 → pen_stack-6.2.2}/pen_stack/env/genome_writing_env.py +0 -0
  167. {pen_stack-6.2.0 → pen_stack-6.2.2}/pen_stack/env/policies.py +0 -0
  168. {pen_stack-6.2.0 → pen_stack-6.2.2}/pen_stack/graph/__init__.py +0 -0
  169. {pen_stack-6.2.0 → pen_stack-6.2.2}/pen_stack/graph/build.py +0 -0
  170. {pen_stack-6.2.0 → pen_stack-6.2.2}/pen_stack/graph/cell_types.py +0 -0
  171. {pen_stack-6.2.0 → pen_stack-6.2.2}/pen_stack/graph/ingest.py +0 -0
  172. {pen_stack-6.2.0 → pen_stack-6.2.2}/pen_stack/graph/query.py +0 -0
  173. {pen_stack-6.2.0 → pen_stack-6.2.2}/pen_stack/graph/schema.py +0 -0
  174. {pen_stack-6.2.0 → pen_stack-6.2.2}/pen_stack/loop/__init__.py +0 -0
  175. {pen_stack-6.2.0 → pen_stack-6.2.2}/pen_stack/loop/continual.py +0 -0
  176. {pen_stack-6.2.0 → pen_stack-6.2.2}/pen_stack/loop/cycle.py +0 -0
  177. {pen_stack-6.2.0 → pen_stack-6.2.2}/pen_stack/loop/drift.py +0 -0
  178. {pen_stack-6.2.0 → pen_stack-6.2.2}/pen_stack/mech/__init__.py +0 -0
  179. {pen_stack-6.2.0 → pen_stack-6.2.2}/pen_stack/mech/classify_atlas.py +0 -0
  180. {pen_stack-6.2.0 → pen_stack-6.2.2}/pen_stack/mech/whitelist.py +0 -0
  181. {pen_stack-6.2.0 → pen_stack-6.2.2}/pen_stack/monitor/__init__.py +0 -0
  182. {pen_stack-6.2.0 → pen_stack-6.2.2}/pen_stack/monitor/europepmc.py +0 -0
  183. {pen_stack-6.2.0 → pen_stack-6.2.2}/pen_stack/monitor/run.py +0 -0
  184. {pen_stack-6.2.0 → pen_stack-6.2.2}/pen_stack/monitor/triage.py +0 -0
  185. {pen_stack-6.2.0 → pen_stack-6.2.2}/pen_stack/oracles/__init__.py +0 -0
  186. {pen_stack-6.2.0 → pen_stack-6.2.2}/pen_stack/oracles/cache.py +0 -0
  187. {pen_stack-6.2.0 → pen_stack-6.2.2}/pen_stack/oracles/energetics.py +0 -0
  188. {pen_stack-6.2.0 → pen_stack-6.2.2}/pen_stack/oracles/genome.py +0 -0
  189. {pen_stack-6.2.0 → pen_stack-6.2.2}/pen_stack/oracles/protein_design.py +0 -0
  190. {pen_stack-6.2.0 → pen_stack-6.2.2}/pen_stack/oracles/rna.py +0 -0
  191. {pen_stack-6.2.0 → pen_stack-6.2.2}/pen_stack/oracles/schema.py +0 -0
  192. {pen_stack-6.2.0 → pen_stack-6.2.2}/pen_stack/oracles/structure.py +0 -0
  193. {pen_stack-6.2.0 → pen_stack-6.2.2}/pen_stack/oracles/vcell.py +0 -0
  194. {pen_stack-6.2.0 → pen_stack-6.2.2}/pen_stack/planner/__init__.py +0 -0
  195. {pen_stack-6.2.0 → pen_stack-6.2.2}/pen_stack/planner/antipeg_oracle.py +0 -0
  196. {pen_stack-6.2.0 → pen_stack-6.2.2}/pen_stack/planner/capsid_epitope_oracle.py +0 -0
  197. {pen_stack-6.2.0 → pen_stack-6.2.2}/pen_stack/planner/cargo.py +0 -0
  198. {pen_stack-6.2.0 → pen_stack-6.2.2}/pen_stack/planner/cargo_polish.py +0 -0
  199. {pen_stack-6.2.0 → pen_stack-6.2.2}/pen_stack/planner/delivery.py +0 -0
  200. {pen_stack-6.2.0 → pen_stack-6.2.2}/pen_stack/planner/delivery_constraints.py +0 -0
  201. {pen_stack-6.2.0 → pen_stack-6.2.2}/pen_stack/planner/delivery_immunology.py +0 -0
  202. {pen_stack-6.2.0 → pen_stack-6.2.2}/pen_stack/planner/delivery_vehicles.py +0 -0
  203. {pen_stack-6.2.0 → pen_stack-6.2.2}/pen_stack/planner/genotoxicity_oracle.py +0 -0
  204. {pen_stack-6.2.0 → pen_stack-6.2.2}/pen_stack/planner/immune_profile.py +0 -0
  205. {pen_stack-6.2.0 → pen_stack-6.2.2}/pen_stack/planner/innate_sensing.py +0 -0
  206. {pen_stack-6.2.0 → pen_stack-6.2.2}/pen_stack/planner/multiplex.py +0 -0
  207. {pen_stack-6.2.0 → pen_stack-6.2.2}/pen_stack/planner/pipeline.py +0 -0
  208. {pen_stack-6.2.0 → pen_stack-6.2.2}/pen_stack/planner/report.py +0 -0
  209. {pen_stack-6.2.0 → pen_stack-6.2.2}/pen_stack/planner/router.py +0 -0
  210. {pen_stack-6.2.0 → pen_stack-6.2.2}/pen_stack/planner/seroprevalence_oracle.py +0 -0
  211. {pen_stack-6.2.0 → pen_stack-6.2.2}/pen_stack/planner/target_site.py +0 -0
  212. {pen_stack-6.2.0 → pen_stack-6.2.2}/pen_stack/rag/__init__.py +0 -0
  213. {pen_stack-6.2.0 → pen_stack-6.2.2}/pen_stack/rag/index.py +0 -0
  214. {pen_stack-6.2.0 → pen_stack-6.2.2}/pen_stack/rag/llm.py +0 -0
  215. {pen_stack-6.2.0 → pen_stack-6.2.2}/pen_stack/rag/qa.py +0 -0
  216. {pen_stack-6.2.0 → pen_stack-6.2.2}/pen_stack/rules/__init__.py +0 -0
  217. {pen_stack-6.2.0 → pen_stack-6.2.2}/pen_stack/rules/evaluators.py +0 -0
  218. {pen_stack-6.2.0 → pen_stack-6.2.2}/pen_stack/rules/loader.py +0 -0
  219. {pen_stack-6.2.0 → pen_stack-6.2.2}/pen_stack/rules/schema.py +0 -0
  220. {pen_stack-6.2.0 → pen_stack-6.2.2}/pen_stack/rules/solver.py +0 -0
  221. {pen_stack-6.2.0 → pen_stack-6.2.2}/pen_stack/safety/__init__.py +0 -0
  222. {pen_stack-6.2.0 → pen_stack-6.2.2}/pen_stack/safety/audit.py +0 -0
  223. {pen_stack-6.2.0 → pen_stack-6.2.2}/pen_stack/safety/gate.py +0 -0
  224. {pen_stack-6.2.0 → pen_stack-6.2.2}/pen_stack/safety/policy.py +0 -0
  225. {pen_stack-6.2.0 → pen_stack-6.2.2}/pen_stack/safety/redteam.py +0 -0
  226. {pen_stack-6.2.0 → pen_stack-6.2.2}/pen_stack/safety/registry.py +0 -0
  227. {pen_stack-6.2.0 → pen_stack-6.2.2}/pen_stack/safety/screen.py +0 -0
  228. {pen_stack-6.2.0 → pen_stack-6.2.2}/pen_stack/score/__init__.py +0 -0
  229. {pen_stack-6.2.0 → pen_stack-6.2.2}/pen_stack/score/recalibrate.py +0 -0
  230. {pen_stack-6.2.0 → pen_stack-6.2.2}/pen_stack/score/therapeutic.py +0 -0
  231. {pen_stack-6.2.0 → pen_stack-6.2.2}/pen_stack/server/__init__.py +0 -0
  232. {pen_stack-6.2.0 → pen_stack-6.2.2}/pen_stack/twin/__init__.py +0 -0
  233. {pen_stack-6.2.0 → pen_stack-6.2.2}/pen_stack/twin/calibrate.py +0 -0
  234. {pen_stack-6.2.0 → pen_stack-6.2.2}/pen_stack/twin/mechanistic.py +0 -0
  235. {pen_stack-6.2.0 → pen_stack-6.2.2}/pen_stack/twin/outcome.py +0 -0
  236. {pen_stack-6.2.0 → pen_stack-6.2.2}/pen_stack/ui/__init__.py +0 -0
  237. {pen_stack-6.2.0 → pen_stack-6.2.2}/pen_stack/ui/app.py +0 -0
  238. {pen_stack-6.2.0 → pen_stack-6.2.2}/pen_stack/validate/__init__.py +0 -0
  239. {pen_stack-6.2.0 → pen_stack-6.2.2}/pen_stack/validate/adapt_demo.py +0 -0
  240. {pen_stack-6.2.0 → pen_stack-6.2.2}/pen_stack/validate/agent_eval.py +0 -0
  241. {pen_stack-6.2.0 → pen_stack-6.2.2}/pen_stack/validate/bench_adversarial_tasks.py +0 -0
  242. {pen_stack-6.2.0 → pen_stack-6.2.2}/pen_stack/validate/bench_coscientist_tasks.py +0 -0
  243. {pen_stack-6.2.0 → pen_stack-6.2.2}/pen_stack/validate/bench_graph_tasks.py +0 -0
  244. {pen_stack-6.2.0 → pen_stack-6.2.2}/pen_stack/validate/bench_rule_tasks.py +0 -0
  245. {pen_stack-6.2.0 → pen_stack-6.2.2}/pen_stack/validate/bench_trust_tasks.py +0 -0
  246. {pen_stack-6.2.0 → pen_stack-6.2.2}/pen_stack/validate/bench_writetype_tasks.py +0 -0
  247. {pen_stack-6.2.0 → pen_stack-6.2.2}/pen_stack/validate/blind_gsh_discovery.py +0 -0
  248. {pen_stack-6.2.0 → pen_stack-6.2.2}/pen_stack/validate/cargo_directionality.py +0 -0
  249. {pen_stack-6.2.0 → pen_stack-6.2.2}/pen_stack/validate/closed_loop.py +0 -0
  250. {pen_stack-6.2.0 → pen_stack-6.2.2}/pen_stack/validate/durability_baselines.py +0 -0
  251. {pen_stack-6.2.0 → pen_stack-6.2.2}/pen_stack/validate/experiment_design.py +0 -0
  252. {pen_stack-6.2.0 → pen_stack-6.2.2}/pen_stack/validate/forward_hypotheses.py +0 -0
  253. {pen_stack-6.2.0 → pen_stack-6.2.2}/pen_stack/validate/generative_design.py +0 -0
  254. {pen_stack-6.2.0 → pen_stack-6.2.2}/pen_stack/validate/guide_qc_demo.py +0 -0
  255. {pen_stack-6.2.0 → pen_stack-6.2.2}/pen_stack/validate/immune_calibration.py +0 -0
  256. {pen_stack-6.2.0 → pen_stack-6.2.2}/pen_stack/validate/intent_specification.py +0 -0
  257. {pen_stack-6.2.0 → pen_stack-6.2.2}/pen_stack/validate/offtarget_energetics_eval.py +0 -0
  258. {pen_stack-6.2.0 → pen_stack-6.2.2}/pen_stack/validate/out_of_scope_refusal.py +0 -0
  259. {pen_stack-6.2.0 → pen_stack-6.2.2}/pen_stack/validate/outcome_calibration.py +0 -0
  260. {pen_stack-6.2.0 → pen_stack-6.2.2}/pen_stack/validate/outcome_prediction.py +0 -0
  261. {pen_stack-6.2.0 → pen_stack-6.2.2}/pen_stack/validate/paper3_benchmark.py +0 -0
  262. {pen_stack-6.2.0 → pen_stack-6.2.2}/pen_stack/validate/paper4_real_validation.py +0 -0
  263. {pen_stack-6.2.0 → pen_stack-6.2.2}/pen_stack/validate/paper4_validation.py +0 -0
  264. {pen_stack-6.2.0 → pen_stack-6.2.2}/pen_stack/validate/protocol_safety.py +0 -0
  265. {pen_stack-6.2.0 → pen_stack-6.2.2}/pen_stack/validate/safety_screening.py +0 -0
  266. {pen_stack-6.2.0 → pen_stack-6.2.2}/pen_stack/validate/selective_prediction.py +0 -0
  267. {pen_stack-6.2.0 → pen_stack-6.2.2}/pen_stack/validate/seq_vs_measured.py +0 -0
  268. {pen_stack-6.2.0 → pen_stack-6.2.2}/pen_stack/validate/target_site_controls.py +0 -0
  269. {pen_stack-6.2.0 → pen_stack-6.2.2}/pen_stack/validate/uncertainty_eval.py +0 -0
  270. {pen_stack-6.2.0 → pen_stack-6.2.2}/pen_stack/validate/ungrounded_baseline.py +0 -0
  271. {pen_stack-6.2.0 → pen_stack-6.2.2}/pen_stack/validate/within_locus_ranking.py +0 -0
  272. {pen_stack-6.2.0 → pen_stack-6.2.2}/pen_stack/validate/writer_recovery.py +0 -0
  273. {pen_stack-6.2.0 → pen_stack-6.2.2}/pen_stack/verify/__init__.py +0 -0
  274. {pen_stack-6.2.0 → pen_stack-6.2.2}/pen_stack/verify/schema.py +0 -0
  275. {pen_stack-6.2.0 → pen_stack-6.2.2}/pen_stack/verify/service.py +0 -0
  276. {pen_stack-6.2.0 → pen_stack-6.2.2}/pen_stack/web/__init__.py +0 -0
  277. {pen_stack-6.2.0 → pen_stack-6.2.2}/pen_stack/web/llm.py +0 -0
  278. {pen_stack-6.2.0 → pen_stack-6.2.2}/pen_stack/wgenome/__init__.py +0 -0
  279. {pen_stack-6.2.0 → pen_stack-6.2.2}/pen_stack/wgenome/chromatin_seq.py +0 -0
  280. {pen_stack-6.2.0 → pen_stack-6.2.2}/pen_stack/wgenome/durability.py +0 -0
  281. {pen_stack-6.2.0 → pen_stack-6.2.2}/pen_stack/wgenome/export_tracks.py +0 -0
  282. {pen_stack-6.2.0 → pen_stack-6.2.2}/pen_stack/wgenome/features.py +0 -0
  283. {pen_stack-6.2.0 → pen_stack-6.2.2}/pen_stack/wgenome/gsh_baseline.py +0 -0
  284. {pen_stack-6.2.0 → pen_stack-6.2.2}/pen_stack/wgenome/mesh_features.py +0 -0
  285. {pen_stack-6.2.0 → pen_stack-6.2.2}/pen_stack/wgenome/ood.py +0 -0
  286. {pen_stack-6.2.0 → pen_stack-6.2.2}/pen_stack/wgenome/providers.py +0 -0
  287. {pen_stack-6.2.0 → pen_stack-6.2.2}/pen_stack/wgenome/safety.py +0 -0
  288. {pen_stack-6.2.0 → pen_stack-6.2.2}/pen_stack/wgenome/structure3d.py +0 -0
  289. {pen_stack-6.2.0 → pen_stack-6.2.2}/pen_stack/wgenome/uncertainty.py +0 -0
  290. {pen_stack-6.2.0 → pen_stack-6.2.2}/pen_stack/wgenome/writability.py +0 -0
  291. {pen_stack-6.2.0 → pen_stack-6.2.2}/pen_stack.egg-info/SOURCES.txt +0 -0
  292. {pen_stack-6.2.0 → pen_stack-6.2.2}/pen_stack.egg-info/dependency_links.txt +0 -0
  293. {pen_stack-6.2.0 → pen_stack-6.2.2}/pen_stack.egg-info/entry_points.txt +0 -0
  294. {pen_stack-6.2.0 → pen_stack-6.2.2}/pen_stack.egg-info/requires.txt +0 -0
  295. {pen_stack-6.2.0 → pen_stack-6.2.2}/pen_stack.egg-info/top_level.txt +0 -0
  296. {pen_stack-6.2.0 → pen_stack-6.2.2}/prereg/SHA256_LOCK_phase0.json +0 -0
  297. {pen_stack-6.2.0 → pen_stack-6.2.2}/prereg/SHA256_LOCK_phase1_5.json +0 -0
  298. {pen_stack-6.2.0 → pen_stack-6.2.2}/prereg/SHA256_LOCK_phase2.json +0 -0
  299. {pen_stack-6.2.0 → pen_stack-6.2.2}/prereg/SHA256_LOCK_phase3.json +0 -0
  300. {pen_stack-6.2.0 → pen_stack-6.2.2}/prereg/SHA256_LOCK_ws_a.json +0 -0
  301. {pen_stack-6.2.0 → pen_stack-6.2.2}/prereg/SHA256_LOCK_ws_acq.json +0 -0
  302. {pen_stack-6.2.0 → pen_stack-6.2.2}/prereg/SHA256_LOCK_ws_aldesign.json +0 -0
  303. {pen_stack-6.2.0 → pen_stack-6.2.2}/prereg/SHA256_LOCK_ws_alvalidate.json +0 -0
  304. {pen_stack-6.2.0 → pen_stack-6.2.2}/prereg/SHA256_LOCK_ws_atlas.json +0 -0
  305. {pen_stack-6.2.0 → pen_stack-6.2.2}/prereg/SHA256_LOCK_ws_b.json +0 -0
  306. {pen_stack-6.2.0 → pen_stack-6.2.2}/prereg/SHA256_LOCK_ws_ba.json +0 -0
  307. {pen_stack-6.2.0 → pen_stack-6.2.2}/prereg/SHA256_LOCK_ws_ba_v33.json +0 -0
  308. {pen_stack-6.2.0 → pen_stack-6.2.2}/prereg/SHA256_LOCK_ws_ba_v45.json +0 -0
  309. {pen_stack-6.2.0 → pen_stack-6.2.2}/prereg/SHA256_LOCK_ws_bench.json +0 -0
  310. {pen_stack-6.2.0 → pen_stack-6.2.2}/prereg/SHA256_LOCK_ws_c.json +0 -0
  311. {pen_stack-6.2.0 → pen_stack-6.2.2}/prereg/SHA256_LOCK_ws_cal.json +0 -0
  312. {pen_stack-6.2.0 → pen_stack-6.2.2}/prereg/SHA256_LOCK_ws_calib.json +0 -0
  313. {pen_stack-6.2.0 → pen_stack-6.2.2}/prereg/SHA256_LOCK_ws_challenge.json +0 -0
  314. {pen_stack-6.2.0 → pen_stack-6.2.2}/prereg/SHA256_LOCK_ws_chat.json +0 -0
  315. {pen_stack-6.2.0 → pen_stack-6.2.2}/prereg/SHA256_LOCK_ws_cite.json +0 -0
  316. {pen_stack-6.2.0 → pen_stack-6.2.2}/prereg/SHA256_LOCK_ws_continual.json +0 -0
  317. {pen_stack-6.2.0 → pen_stack-6.2.2}/prereg/SHA256_LOCK_ws_cosci2.json +0 -0
  318. {pen_stack-6.2.0 → pen_stack-6.2.2}/prereg/SHA256_LOCK_ws_crit.json +0 -0
  319. {pen_stack-6.2.0 → pen_stack-6.2.2}/prereg/SHA256_LOCK_ws_ct.json +0 -0
  320. {pen_stack-6.2.0 → pen_stack-6.2.2}/prereg/SHA256_LOCK_ws_d.json +0 -0
  321. {pen_stack-6.2.0 → pen_stack-6.2.2}/prereg/SHA256_LOCK_ws_drift.json +0 -0
  322. {pen_stack-6.2.0 → pen_stack-6.2.2}/prereg/SHA256_LOCK_ws_e.json +0 -0
  323. {pen_stack-6.2.0 → pen_stack-6.2.2}/prereg/SHA256_LOCK_ws_env.json +0 -0
  324. {pen_stack-6.2.0 → pen_stack-6.2.2}/prereg/SHA256_LOCK_ws_ep.json +0 -0
  325. {pen_stack-6.2.0 → pen_stack-6.2.2}/prereg/SHA256_LOCK_ws_epitope.json +0 -0
  326. {pen_stack-6.2.0 → pen_stack-6.2.2}/prereg/SHA256_LOCK_ws_f.json +0 -0
  327. {pen_stack-6.2.0 → pen_stack-6.2.2}/prereg/SHA256_LOCK_ws_frontend.json +0 -0
  328. {pen_stack-6.2.0 → pen_stack-6.2.2}/prereg/SHA256_LOCK_ws_g.json +0 -0
  329. {pen_stack-6.2.0 → pen_stack-6.2.2}/prereg/SHA256_LOCK_ws_gen.json +0 -0
  330. {pen_stack-6.2.0 → pen_stack-6.2.2}/prereg/SHA256_LOCK_ws_genotox.json +0 -0
  331. {pen_stack-6.2.0 → pen_stack-6.2.2}/prereg/SHA256_LOCK_ws_graph.json +0 -0
  332. {pen_stack-6.2.0 → pen_stack-6.2.2}/prereg/SHA256_LOCK_ws_h.json +0 -0
  333. {pen_stack-6.2.0 → pen_stack-6.2.2}/prereg/SHA256_LOCK_ws_immune.json +0 -0
  334. {pen_stack-6.2.0 → pen_stack-6.2.2}/prereg/SHA256_LOCK_ws_ingest.json +0 -0
  335. {pen_stack-6.2.0 → pen_stack-6.2.2}/prereg/SHA256_LOCK_ws_innate.json +0 -0
  336. {pen_stack-6.2.0 → pen_stack-6.2.2}/prereg/SHA256_LOCK_ws_loop.json +0 -0
  337. {pen_stack-6.2.0 → pen_stack-6.2.2}/prereg/SHA256_LOCK_ws_manifest.json +0 -0
  338. {pen_stack-6.2.0 → pen_stack-6.2.2}/prereg/SHA256_LOCK_ws_mc.json +0 -0
  339. {pen_stack-6.2.0 → pen_stack-6.2.2}/prereg/SHA256_LOCK_ws_mcp.json +0 -0
  340. {pen_stack-6.2.0 → pen_stack-6.2.2}/prereg/SHA256_LOCK_ws_mech.json +0 -0
  341. {pen_stack-6.2.0 → pen_stack-6.2.2}/prereg/SHA256_LOCK_ws_mon.json +0 -0
  342. {pen_stack-6.2.0 → pen_stack-6.2.2}/prereg/SHA256_LOCK_ws_o.json +0 -0
  343. {pen_stack-6.2.0 → pen_stack-6.2.2}/prereg/SHA256_LOCK_ws_openapi.json +0 -0
  344. {pen_stack-6.2.0 → pen_stack-6.2.2}/prereg/SHA256_LOCK_ws_orch.json +0 -0
  345. {pen_stack-6.2.0 → pen_stack-6.2.2}/prereg/SHA256_LOCK_ws_outcome.json +0 -0
  346. {pen_stack-6.2.0 → pen_stack-6.2.2}/prereg/SHA256_LOCK_ws_pareto.json +0 -0
  347. {pen_stack-6.2.0 → pen_stack-6.2.2}/prereg/SHA256_LOCK_ws_peg.json +0 -0
  348. {pen_stack-6.2.0 → pen_stack-6.2.2}/prereg/SHA256_LOCK_ws_plan.json +0 -0
  349. {pen_stack-6.2.0 → pen_stack-6.2.2}/prereg/SHA256_LOCK_ws_policy.json +0 -0
  350. {pen_stack-6.2.0 → pen_stack-6.2.2}/prereg/SHA256_LOCK_ws_profile.json +0 -0
  351. {pen_stack-6.2.0 → pen_stack-6.2.2}/prereg/SHA256_LOCK_ws_proto.json +0 -0
  352. {pen_stack-6.2.0 → pen_stack-6.2.2}/prereg/SHA256_LOCK_ws_r.json +0 -0
  353. {pen_stack-6.2.0 → pen_stack-6.2.2}/prereg/SHA256_LOCK_ws_redteam.json +0 -0
  354. {pen_stack-6.2.0 → pen_stack-6.2.2}/prereg/SHA256_LOCK_ws_route.json +0 -0
  355. {pen_stack-6.2.0 → pen_stack-6.2.2}/prereg/SHA256_LOCK_ws_screen.json +0 -0
  356. {pen_stack-6.2.0 → pen_stack-6.2.2}/prereg/SHA256_LOCK_ws_seroprev.json +0 -0
  357. {pen_stack-6.2.0 → pen_stack-6.2.2}/prereg/SHA256_LOCK_ws_simlab.json +0 -0
  358. {pen_stack-6.2.0 → pen_stack-6.2.2}/prereg/SHA256_LOCK_ws_twincal.json +0 -0
  359. {pen_stack-6.2.0 → pen_stack-6.2.2}/prereg/SHA256_LOCK_ws_uq.json +0 -0
  360. {pen_stack-6.2.0 → pen_stack-6.2.2}/prereg/SHA256_LOCK_ws_v.json +0 -0
  361. {pen_stack-6.2.0 → pen_stack-6.2.2}/prereg/SHA256_LOCK_ws_vcell.json +0 -0
  362. {pen_stack-6.2.0 → pen_stack-6.2.2}/prereg/SHA256_LOCK_ws_wv.json +0 -0
  363. {pen_stack-6.2.0 → pen_stack-6.2.2}/prereg/paper1.yaml +0 -0
  364. {pen_stack-6.2.0 → pen_stack-6.2.2}/prereg/paper2.yaml +0 -0
  365. {pen_stack-6.2.0 → pen_stack-6.2.2}/prereg/paper3.yaml +0 -0
  366. {pen_stack-6.2.0 → pen_stack-6.2.2}/prereg/paper4.yaml +0 -0
  367. {pen_stack-6.2.0 → pen_stack-6.2.2}/prereg/phase0.yaml +0 -0
  368. {pen_stack-6.2.0 → pen_stack-6.2.2}/prereg/ws_a.yaml +0 -0
  369. {pen_stack-6.2.0 → pen_stack-6.2.2}/prereg/ws_acq.yaml +0 -0
  370. {pen_stack-6.2.0 → pen_stack-6.2.2}/prereg/ws_aldesign.yaml +0 -0
  371. {pen_stack-6.2.0 → pen_stack-6.2.2}/prereg/ws_alvalidate.yaml +0 -0
  372. {pen_stack-6.2.0 → pen_stack-6.2.2}/prereg/ws_atlas.yaml +0 -0
  373. {pen_stack-6.2.0 → pen_stack-6.2.2}/prereg/ws_b.yaml +0 -0
  374. {pen_stack-6.2.0 → pen_stack-6.2.2}/prereg/ws_ba.yaml +0 -0
  375. {pen_stack-6.2.0 → pen_stack-6.2.2}/prereg/ws_ba_v33.yaml +0 -0
  376. {pen_stack-6.2.0 → pen_stack-6.2.2}/prereg/ws_ba_v45.yaml +0 -0
  377. {pen_stack-6.2.0 → pen_stack-6.2.2}/prereg/ws_bench.yaml +0 -0
  378. {pen_stack-6.2.0 → pen_stack-6.2.2}/prereg/ws_c.yaml +0 -0
  379. {pen_stack-6.2.0 → pen_stack-6.2.2}/prereg/ws_cal.yaml +0 -0
  380. {pen_stack-6.2.0 → pen_stack-6.2.2}/prereg/ws_calib.yaml +0 -0
  381. {pen_stack-6.2.0 → pen_stack-6.2.2}/prereg/ws_challenge.yaml +0 -0
  382. {pen_stack-6.2.0 → pen_stack-6.2.2}/prereg/ws_chat.yaml +0 -0
  383. {pen_stack-6.2.0 → pen_stack-6.2.2}/prereg/ws_cite.yaml +0 -0
  384. {pen_stack-6.2.0 → pen_stack-6.2.2}/prereg/ws_continual.yaml +0 -0
  385. {pen_stack-6.2.0 → pen_stack-6.2.2}/prereg/ws_cosci2.yaml +0 -0
  386. {pen_stack-6.2.0 → pen_stack-6.2.2}/prereg/ws_crit.yaml +0 -0
  387. {pen_stack-6.2.0 → pen_stack-6.2.2}/prereg/ws_ct.yaml +0 -0
  388. {pen_stack-6.2.0 → pen_stack-6.2.2}/prereg/ws_d.yaml +0 -0
  389. {pen_stack-6.2.0 → pen_stack-6.2.2}/prereg/ws_drift.yaml +0 -0
  390. {pen_stack-6.2.0 → pen_stack-6.2.2}/prereg/ws_e.yaml +0 -0
  391. {pen_stack-6.2.0 → pen_stack-6.2.2}/prereg/ws_env.yaml +0 -0
  392. {pen_stack-6.2.0 → pen_stack-6.2.2}/prereg/ws_ep.yaml +0 -0
  393. {pen_stack-6.2.0 → pen_stack-6.2.2}/prereg/ws_epitope.yaml +0 -0
  394. {pen_stack-6.2.0 → pen_stack-6.2.2}/prereg/ws_f.yaml +0 -0
  395. {pen_stack-6.2.0 → pen_stack-6.2.2}/prereg/ws_frontend.yaml +0 -0
  396. {pen_stack-6.2.0 → pen_stack-6.2.2}/prereg/ws_g.yaml +0 -0
  397. {pen_stack-6.2.0 → pen_stack-6.2.2}/prereg/ws_gen.yaml +0 -0
  398. {pen_stack-6.2.0 → pen_stack-6.2.2}/prereg/ws_genotox.yaml +0 -0
  399. {pen_stack-6.2.0 → pen_stack-6.2.2}/prereg/ws_graph.yaml +0 -0
  400. {pen_stack-6.2.0 → pen_stack-6.2.2}/prereg/ws_h.yaml +0 -0
  401. {pen_stack-6.2.0 → pen_stack-6.2.2}/prereg/ws_immune.yaml +0 -0
  402. {pen_stack-6.2.0 → pen_stack-6.2.2}/prereg/ws_ingest.yaml +0 -0
  403. {pen_stack-6.2.0 → pen_stack-6.2.2}/prereg/ws_innate.yaml +0 -0
  404. {pen_stack-6.2.0 → pen_stack-6.2.2}/prereg/ws_loop.yaml +0 -0
  405. {pen_stack-6.2.0 → pen_stack-6.2.2}/prereg/ws_manifest.yaml +0 -0
  406. {pen_stack-6.2.0 → pen_stack-6.2.2}/prereg/ws_mc.yaml +0 -0
  407. {pen_stack-6.2.0 → pen_stack-6.2.2}/prereg/ws_mcp.yaml +0 -0
  408. {pen_stack-6.2.0 → pen_stack-6.2.2}/prereg/ws_mech.yaml +0 -0
  409. {pen_stack-6.2.0 → pen_stack-6.2.2}/prereg/ws_mon.yaml +0 -0
  410. {pen_stack-6.2.0 → pen_stack-6.2.2}/prereg/ws_o.yaml +0 -0
  411. {pen_stack-6.2.0 → pen_stack-6.2.2}/prereg/ws_openapi.yaml +0 -0
  412. {pen_stack-6.2.0 → pen_stack-6.2.2}/prereg/ws_orch.yaml +0 -0
  413. {pen_stack-6.2.0 → pen_stack-6.2.2}/prereg/ws_outcome.yaml +0 -0
  414. {pen_stack-6.2.0 → pen_stack-6.2.2}/prereg/ws_pareto.yaml +0 -0
  415. {pen_stack-6.2.0 → pen_stack-6.2.2}/prereg/ws_peg.yaml +0 -0
  416. {pen_stack-6.2.0 → pen_stack-6.2.2}/prereg/ws_plan.yaml +0 -0
  417. {pen_stack-6.2.0 → pen_stack-6.2.2}/prereg/ws_policy.yaml +0 -0
  418. {pen_stack-6.2.0 → pen_stack-6.2.2}/prereg/ws_profile.yaml +0 -0
  419. {pen_stack-6.2.0 → pen_stack-6.2.2}/prereg/ws_proto.yaml +0 -0
  420. {pen_stack-6.2.0 → pen_stack-6.2.2}/prereg/ws_r.yaml +0 -0
  421. {pen_stack-6.2.0 → pen_stack-6.2.2}/prereg/ws_redteam.yaml +0 -0
  422. {pen_stack-6.2.0 → pen_stack-6.2.2}/prereg/ws_route.yaml +0 -0
  423. {pen_stack-6.2.0 → pen_stack-6.2.2}/prereg/ws_screen.yaml +0 -0
  424. {pen_stack-6.2.0 → pen_stack-6.2.2}/prereg/ws_seroprev.yaml +0 -0
  425. {pen_stack-6.2.0 → pen_stack-6.2.2}/prereg/ws_simlab.yaml +0 -0
  426. {pen_stack-6.2.0 → pen_stack-6.2.2}/prereg/ws_twincal.yaml +0 -0
  427. {pen_stack-6.2.0 → pen_stack-6.2.2}/prereg/ws_uq.yaml +0 -0
  428. {pen_stack-6.2.0 → pen_stack-6.2.2}/prereg/ws_v.yaml +0 -0
  429. {pen_stack-6.2.0 → pen_stack-6.2.2}/prereg/ws_vcell.yaml +0 -0
  430. {pen_stack-6.2.0 → pen_stack-6.2.2}/prereg/ws_wv.yaml +0 -0
  431. {pen_stack-6.2.0 → pen_stack-6.2.2}/scripts/p1_build_atlas.py +0 -0
  432. {pen_stack-6.2.0 → pen_stack-6.2.2}/scripts/p1_build_durability.py +0 -0
  433. {pen_stack-6.2.0 → pen_stack-6.2.2}/scripts/p1_export_tracks.py +0 -0
  434. {pen_stack-6.2.0 → pen_stack-6.2.2}/scripts/p1_safety_concordance.py +0 -0
  435. {pen_stack-6.2.0 → pen_stack-6.2.2}/scripts/p1_train_safety.py +0 -0
  436. {pen_stack-6.2.0 → pen_stack-6.2.2}/scripts/p1_validation_report.py +0 -0
  437. {pen_stack-6.2.0 → pen_stack-6.2.2}/scripts/p2_build_atlas.py +0 -0
  438. {pen_stack-6.2.0 → pen_stack-6.2.2}/scripts/p3_benchmark_report.py +0 -0
  439. {pen_stack-6.2.0 → pen_stack-6.2.2}/scripts/p4_genome_scan.py +0 -0
  440. {pen_stack-6.2.0 → pen_stack-6.2.2}/scripts/p52_build_genotox_oracle.py +0 -0
  441. {pen_stack-6.2.0 → pen_stack-6.2.2}/scripts/p53_build_epitope_oracle.py +0 -0
  442. {pen_stack-6.2.0 → pen_stack-6.2.2}/scripts/ws_b_report.py +0 -0
  443. {pen_stack-6.2.0 → pen_stack-6.2.2}/scripts/ws_c_report.py +0 -0
  444. {pen_stack-6.2.0 → pen_stack-6.2.2}/setup.cfg +0 -0
@@ -3,6 +3,31 @@
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.2.2] - 2026-06-12 - v6.2.2: safe-harbour locus-nickname resolution (patch)
7
+
8
+ **Usability fix.** Site Finder / `/plan` / `/writable` returned 0 plans for `AAVS1` because it is a genomic
9
+ safe-harbour *locus nickname*, not an HGNC gene symbol, so the gene→coordinate lookup (`gene_coords`, 60,888
10
+ symbols) could not resolve it — honest empty, but unhelpful for the most-typed safe harbour. (The cell-type
11
+ atlases are complete; real symbols like `PCSK9`/`HBB`/`CCR5`/`CLYBL` resolved fine.)
12
+
13
+ ### Fixed
14
+ - `pen_stack/planner/optimize.py`: `resolve_gene()` maps well-documented safe-harbour nicknames to their host
15
+ gene (`AAVS1`→`PPP1R12C` 19q13.42; `H11`/`Hipp11`→`EIF4ENIF1` 22q12) at every gene→coordinate lookup
16
+ (`gene_region`, `plan`, `crosslink.loci_for_gene`); real symbols pass through unchanged. Regression test
17
+ `tests/unit/test_ws_api.py::test_safe_harbour_nickname_resolves_to_host_gene`.
18
+
19
+ ## [6.2.1] - 2026-06-12 - v6.2.1: JSON-safe atlas/crosslink endpoints (patch)
20
+
21
+ **Bug fix.** The `/atlas`, `/writable`, and `/crosslink/loci` endpoints returned raw DataFrame records, which
22
+ leak non-finite floats (`NaN`/`inf`) present in `atlas.parquet`; the JSON encoder rejects these
23
+ (`ValueError: Out of range float values are not JSON compliant` → HTTP 500). Surfaced on the v6.2 Web Platform's
24
+ Writer Atlas and Site Finder pages.
25
+
26
+ ### Fixed
27
+ - `pen_stack/server/api.py`: a `_records()` helper serializes DataFrame rows JSON-safely (via pandas `to_json`,
28
+ so `NaN`/`inf` → `null` and numpy scalars → native), applied to `/atlas`, `/writable`, `/crosslink/loci`.
29
+ Regression test `tests/unit/test_ws_api.py::test_records_helper_is_json_safe_with_non_finite_floats`.
30
+
6
31
  ## [6.2.0] - 2026-06-11 - v6.2: The Web Platform (the human surface)
7
32
 
8
33
  **Post-1.0 adoption surface for bench scientists.** A complete, friendly web application — a grounded co-scientist
@@ -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.0
4
+ version: 6.2.2
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.0
3
+ Version: 6.2.2
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.0-blue.svg)](CHANGELOG.md)
93
+ [![Version](https://img.shields.io/badge/version-6.2.2-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-368%20passing-success.svg)](tests/)
95
+ [![Tests](https://img.shields.io/badge/tests-370%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/)
@@ -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.0-blue.svg)](CHANGELOG.md)
18
+ [![Version](https://img.shields.io/badge/version-6.2.2-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-368%20passing-success.svg)](tests/)
20
+ [![Tests](https://img.shields.io/badge/tests-370%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/)
@@ -1,2 +1,2 @@
1
1
  """PEN-STACK v3.0 - open infrastructure for genome writing."""
2
- __version__ = "6.2.0"
2
+ __version__ = "6.2.2"
@@ -99,13 +99,10 @@ def writers_for_locus(chrom: str, bin_idx: int, ct: str = "k562") -> pd.DataFram
99
99
 
100
100
  def loci_for_gene(gene: str, ct: str = "k562", gene_coords: str | Path | None = None) -> pd.DataFrame:
101
101
  """Writable bins overlapping a gene body (forward query helper)."""
102
- if gene_coords:
103
- gc_path = Path(gene_coords)
104
- else:
105
- from pen_stack.planner.optimize import gene_coords_path
106
- gc_path = gene_coords_path()
102
+ from pen_stack.planner.optimize import gene_coords_path, resolve_gene
103
+ gc_path = Path(gene_coords) if gene_coords else gene_coords_path()
107
104
  gc = pd.read_parquet(gc_path)
108
- g = gc[gc["gene"] == gene]
105
+ g = gc[gc["gene"] == resolve_gene(gene)] # resolve safe-harbour nicknames (AAVS1 -> PPP1R12C)
109
106
  if g.empty:
110
107
  return pd.DataFrame()
111
108
  r = g.iloc[0]
@@ -209,9 +209,20 @@ def _gene_coords(path: str | None = None) -> pd.DataFrame:
209
209
  return pd.read_parquet(Path(path) if path else gene_coords_path())
210
210
 
211
211
 
212
+ # Genomic safe-harbour *locus nicknames* are not HGNC gene symbols, so they are absent from gene_coords; map the
213
+ # well-documented ones to their host gene so a user who types the common name still gets a plan. AAVS1 = intron 1
214
+ # of PPP1R12C (19q13.42); H11/Hipp11 = an intron of EIF4ENIF1 (22q12). (CCR5, CLYBL, HPRT1 are real symbols.)
215
+ _GSH_ALIASES = {"AAVS1": "PPP1R12C", "H11": "EIF4ENIF1", "HIPP11": "EIF4ENIF1"}
216
+
217
+
218
+ def resolve_gene(gene: str) -> str:
219
+ """Map a safe-harbour locus nickname (e.g. AAVS1) to its HGNC host gene; pass real symbols through unchanged."""
220
+ return _GSH_ALIASES.get(str(gene).strip().upper(), gene)
221
+
222
+
212
223
  def gene_region(gene: str, flank_kb: int = 50) -> tuple[str, int, int] | None:
213
224
  gc = _gene_coords()
214
- g = gc[gc["gene"] == gene]
225
+ g = gc[gc["gene"] == resolve_gene(gene)]
215
226
  if g.empty:
216
227
  return None
217
228
  r = g.iloc[0]
@@ -232,7 +243,7 @@ def plan(gene: str, intent: EditIntent | str, cargo_bp: int, writable_df: pd.Dat
232
243
  return pd.DataFrame()
233
244
  # on_target = bin overlaps the gene body (not just the flank)
234
245
  g = _gene_coords()
235
- gr = g[g["gene"] == gene].iloc[0]
246
+ gr = g[g["gene"] == resolve_gene(gene)].iloc[0]
236
247
  sub["on_target"] = sub["bin"].between(int(gr["start"]) // BIN_BP, int(gr["end"]) // BIN_BP)
237
248
  scored = score_candidates(sub, intent, cargo_bp)
238
249
  cols = ["chrom", "bin", "writer", "safety", "p_durable", "writer_activity",
@@ -8,6 +8,7 @@ Run: ``uvicorn pen_stack.server.api:app --host 0.0.0.0 --port 8000`` (needs the
8
8
  """
9
9
  from __future__ import annotations
10
10
 
11
+ import json
11
12
  from pathlib import Path
12
13
 
13
14
  import pandas as pd
@@ -34,6 +35,12 @@ def _atlas_df() -> pd.DataFrame:
34
35
  return pd.read_parquet(_ATLAS)
35
36
 
36
37
 
38
+ def _records(df: pd.DataFrame) -> list[dict]:
39
+ """JSON-safe records from a DataFrame: NaN/inf -> null and numpy scalars -> native (pandas `to_json`
40
+ handles both). Raw `to_dict('records')` leaks non-finite floats, which the JSON encoder rejects (500)."""
41
+ return json.loads(df.to_json(orient="records"))
42
+
43
+
37
44
  @app.get("/health")
38
45
  def health():
39
46
  return {"status": "ok", "version": __version__, "atlas_present": _ATLAS.exists()}
@@ -60,7 +67,7 @@ def atlas(family: str | None = None, limit: int = Query(50, le=500)):
60
67
  cols = [c for c in ["representative_system", "family", "confidence", "mechanism_bucket",
61
68
  "deliv_class", "readiness", "cargo_capacity_bp", "reachability_tier",
62
69
  "human_cell_activity"] if c in df.columns]
63
- return {"n": int(len(df)), "rows": df[cols].head(limit).to_dict("records"), "disclaimer": _DISCLAIMER}
70
+ return {"n": int(len(df)), "rows": _records(df[cols].head(limit)), "disclaimer": _DISCLAIMER}
64
71
 
65
72
 
66
73
  @app.get("/crosslink/writers")
@@ -86,7 +93,7 @@ def crosslink_loci(family: str, ct: str = "k562", top: int = Query(20, le=200)):
86
93
  loci = cl.loci_for_writer(family, ct, top=top)
87
94
  except FileNotFoundError as e:
88
95
  raise HTTPException(503, str(e)) from e
89
- return {"family": family, "ct": ct, "loci": loci.to_dict("records"), "disclaimer": _DISCLAIMER}
96
+ return {"family": family, "ct": ct, "loci": _records(loci), "disclaimer": _DISCLAIMER}
90
97
 
91
98
 
92
99
  @app.get("/writable")
@@ -99,7 +106,7 @@ def writable(gene: str, ct: str = "k562", top: int = Query(20, le=200)):
99
106
  if g.empty:
100
107
  return {"gene": gene, "ct": ct, "loci": [], "disclaimer": _DISCLAIMER}
101
108
  cols = ["chrom", "bin", "safety", "p_durable", "writability"]
102
- return {"gene": gene, "ct": ct, "loci": g[cols].head(top).to_dict("records"), "disclaimer": _DISCLAIMER}
109
+ return {"gene": gene, "ct": ct, "loci": _records(g[cols].head(top)), "disclaimer": _DISCLAIMER}
103
110
 
104
111
 
105
112
  @app.get("/bridge/design")
@@ -14,7 +14,7 @@ import json
14
14
  from pathlib import Path
15
15
 
16
16
  try:
17
- from fastapi import FastAPI
17
+ from fastapi import FastAPI, HTTPException
18
18
  from fastapi.middleware.cors import CORSMiddleware
19
19
  from fastapi.responses import StreamingResponse
20
20
  except ImportError as e: # pragma: no cover - server extra optional
@@ -23,6 +23,13 @@ except ImportError as e: # pragma: no cover - server extra optional
23
23
  from pen_stack import __version__
24
24
  from pen_stack.server.api import app as _engine_app # the v6.1 typed engine surface (reused verbatim)
25
25
 
26
+
27
+ def _require_message(req: dict) -> str:
28
+ msg = (req or {}).get("message")
29
+ if not isinstance(msg, str) or not msg.strip():
30
+ raise HTTPException(422, "field 'message' is required and must be a non-empty string")
31
+ return msg
32
+
26
33
  app = FastAPI(
27
34
  title="PEN-STACK — Web Platform",
28
35
  version=__version__,
@@ -55,7 +62,7 @@ def chat_route(req: dict) -> dict:
55
62
  {reply, tool_results, grounded, backend}."""
56
63
  from pen_stack.web.llm import grounded_reply
57
64
 
58
- return grounded_reply(req["message"], history=req.get("history", []),
65
+ return grounded_reply(_require_message(req), history=req.get("history", []),
59
66
  allow_llm=bool(req.get("allow_llm", True)))
60
67
 
61
68
 
@@ -65,7 +72,7 @@ def chat_stream_route(req: dict) -> StreamingResponse:
65
72
  applied), then emitted word-by-word so the UI can render progressively; a final event carries the dossier."""
66
73
  from pen_stack.web.llm import grounded_reply
67
74
 
68
- result = grounded_reply(req["message"], history=req.get("history", []),
75
+ result = grounded_reply(_require_message(req), history=req.get("history", []),
69
76
  allow_llm=bool(req.get("allow_llm", True)))
70
77
 
71
78
  def _events():
@@ -48,7 +48,10 @@ def parse_goal(message: str) -> dict:
48
48
  return {"write_type": "insertion", "gene": gene, "chrom": "chr19",
49
49
  "edit_intent": _first(message, _INTENTS, "safe_harbour_insertion"),
50
50
  "delivery_vehicle": _first(message, _VEHICLES, "AAV_single"), "cargo_bp": cargo,
51
- "cell_type": _first(message, _CELLS, "k562")}
51
+ "cell_type": _first(message, _CELLS, "k562"),
52
+ # the user's plain-language goal IS the cargo-function description the Guardian must screen — so a
53
+ # message like "express a ricin toxin" is biosecurity-screened, not silently passed as benign.
54
+ "cargo_function": message.strip()}
52
55
 
53
56
 
54
57
  def run_tools(message: str, history: list | None = None) -> dict[str, Any]:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pen-stack
3
- Version: 6.2.0
3
+ Version: 6.2.2
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.0-blue.svg)](CHANGELOG.md)
93
+ [![Version](https://img.shields.io/badge/version-6.2.2-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-368%20passing-success.svg)](tests/)
95
+ [![Tests](https://img.shields.io/badge/tests-370%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/)
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "pen-stack"
7
- version = "6.2.0"
7
+ version = "6.2.2"
8
8
  description = "Open infrastructure for genome writing: the Writable Genome atlas, the Writer Atlas, and the Write Planner."
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.11"
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes