pen-stack 6.0.0__tar.gz → 6.2.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 (445) hide show
  1. {pen_stack-6.0.0 → pen_stack-6.2.0}/CHANGELOG.md +66 -0
  2. {pen_stack-6.0.0 → pen_stack-6.2.0}/CITATION.cff +1 -1
  3. {pen_stack-6.0.0 → pen_stack-6.2.0}/PKG-INFO +124 -42
  4. {pen_stack-6.0.0 → pen_stack-6.2.0}/README.md +123 -41
  5. pen_stack-6.2.0/docs/integrations.md +87 -0
  6. {pen_stack-6.0.0 → pen_stack-6.2.0}/pen_stack/__init__.py +1 -1
  7. {pen_stack-6.0.0 → pen_stack-6.2.0}/pen_stack/agent/mcp_server.py +65 -0
  8. pen_stack-6.2.0/pen_stack/api/__init__.py +12 -0
  9. pen_stack-6.2.0/pen_stack/api/manifest.py +93 -0
  10. {pen_stack-6.0.0 → pen_stack-6.2.0}/pen_stack/server/api.py +92 -0
  11. pen_stack-6.2.0/pen_stack/web/__init__.py +18 -0
  12. pen_stack-6.2.0/pen_stack/web/llm.py +219 -0
  13. pen_stack-6.2.0/pen_stack/web/server.py +86 -0
  14. pen_stack-6.2.0/pen_stack/web/tools.py +102 -0
  15. {pen_stack-6.0.0 → pen_stack-6.2.0}/pen_stack.egg-info/PKG-INFO +124 -42
  16. {pen_stack-6.0.0 → pen_stack-6.2.0}/pen_stack.egg-info/SOURCES.txt +16 -0
  17. pen_stack-6.2.0/prereg/SHA256_LOCK_ws_chat.json +8 -0
  18. pen_stack-6.2.0/prereg/SHA256_LOCK_ws_frontend.json +8 -0
  19. pen_stack-6.2.0/prereg/SHA256_LOCK_ws_manifest.json +8 -0
  20. pen_stack-6.2.0/prereg/SHA256_LOCK_ws_mcp.json +8 -0
  21. pen_stack-6.2.0/prereg/SHA256_LOCK_ws_openapi.json +8 -0
  22. pen_stack-6.2.0/prereg/ws_chat.yaml +20 -0
  23. pen_stack-6.2.0/prereg/ws_frontend.yaml +21 -0
  24. pen_stack-6.2.0/prereg/ws_manifest.yaml +20 -0
  25. pen_stack-6.2.0/prereg/ws_mcp.yaml +14 -0
  26. pen_stack-6.2.0/prereg/ws_openapi.yaml +13 -0
  27. {pen_stack-6.0.0 → pen_stack-6.2.0}/pyproject.toml +1 -1
  28. pen_stack-6.0.0/docs/integrations.md +0 -56
  29. {pen_stack-6.0.0 → pen_stack-6.2.0}/LICENSE +0 -0
  30. {pen_stack-6.0.0 → pen_stack-6.2.0}/MANIFEST.in +0 -0
  31. {pen_stack-6.0.0 → pen_stack-6.2.0}/bench/run.py +0 -0
  32. {pen_stack-6.0.0 → pen_stack-6.2.0}/benchmarks/genome_writing_bench/LEADERBOARD.md +0 -0
  33. {pen_stack-6.0.0 → pen_stack-6.2.0}/benchmarks/genome_writing_bench/README.md +0 -0
  34. {pen_stack-6.0.0 → pen_stack-6.2.0}/benchmarks/genome_writing_bench/SHA256SUMS +0 -0
  35. {pen_stack-6.0.0 → pen_stack-6.2.0}/benchmarks/genome_writing_bench/SUBMISSIONS.md +0 -0
  36. {pen_stack-6.0.0 → pen_stack-6.2.0}/benchmarks/genome_writing_bench/tasks.yaml +0 -0
  37. {pen_stack-6.0.0 → pen_stack-6.2.0}/benchmarks/genome_writing_challenge/README.md +0 -0
  38. {pen_stack-6.0.0 → pen_stack-6.2.0}/benchmarks/genome_writing_challenge/SUBMISSIONS.md +0 -0
  39. {pen_stack-6.0.0 → pen_stack-6.2.0}/configs/antipeg.yaml +0 -0
  40. {pen_stack-6.0.0 → pen_stack-6.2.0}/configs/atlas_families.yaml +0 -0
  41. {pen_stack-6.0.0 → pen_stack-6.2.0}/configs/bridge_offtarget_profile.yaml +0 -0
  42. {pen_stack-6.0.0 → pen_stack-6.2.0}/configs/capsid_epitope_oracle.yaml +0 -0
  43. {pen_stack-6.0.0 → pen_stack-6.2.0}/configs/capsid_sequences.fasta +0 -0
  44. {pen_stack-6.0.0 → pen_stack-6.2.0}/configs/cargo_polish.yaml +0 -0
  45. {pen_stack-6.0.0 → pen_stack-6.2.0}/configs/cell_types.yaml +0 -0
  46. {pen_stack-6.0.0 → pen_stack-6.2.0}/configs/datasets.yaml +0 -0
  47. {pen_stack-6.0.0 → pen_stack-6.2.0}/configs/delivery_constraints.yaml +0 -0
  48. {pen_stack-6.0.0 → pen_stack-6.2.0}/configs/delivery_rules.yaml +0 -0
  49. {pen_stack-6.0.0 → pen_stack-6.2.0}/configs/delivery_vehicles.yaml +0 -0
  50. {pen_stack-6.0.0 → pen_stack-6.2.0}/configs/gates_v3.yaml +0 -0
  51. {pen_stack-6.0.0 → pen_stack-6.2.0}/configs/genotoxicity_oracle.yaml +0 -0
  52. {pen_stack-6.0.0 → pen_stack-6.2.0}/configs/gsh_validated_heldout.yaml +0 -0
  53. {pen_stack-6.0.0 → pen_stack-6.2.0}/configs/intent_weights.yaml +0 -0
  54. {pen_stack-6.0.0 → pen_stack-6.2.0}/configs/known_unknowns.yaml +0 -0
  55. {pen_stack-6.0.0 → pen_stack-6.2.0}/configs/llm.yaml +0 -0
  56. {pen_stack-6.0.0 → pen_stack-6.2.0}/configs/monitor_queries.yaml +0 -0
  57. {pen_stack-6.0.0 → pen_stack-6.2.0}/configs/oracles/scope_cards.yaml +0 -0
  58. {pen_stack-6.0.0 → pen_stack-6.2.0}/configs/rules/delivery.yaml +0 -0
  59. {pen_stack-6.0.0 → pen_stack-6.2.0}/configs/rules/fold.yaml +0 -0
  60. {pen_stack-6.0.0 → pen_stack-6.2.0}/configs/rules/multiplex.yaml +0 -0
  61. {pen_stack-6.0.0 → pen_stack-6.2.0}/configs/rules/payload.yaml +0 -0
  62. {pen_stack-6.0.0 → pen_stack-6.2.0}/configs/rules/reachability.yaml +0 -0
  63. {pen_stack-6.0.0 → pen_stack-6.2.0}/configs/safety/hazard_registry.yaml +0 -0
  64. {pen_stack-6.0.0 → pen_stack-6.2.0}/configs/safety/policy.yaml +0 -0
  65. {pen_stack-6.0.0 → pen_stack-6.2.0}/configs/safety/probes.yaml +0 -0
  66. {pen_stack-6.0.0 → pen_stack-6.2.0}/configs/score_axes.yaml +0 -0
  67. {pen_stack-6.0.0 → pen_stack-6.2.0}/configs/seroprevalence.yaml +0 -0
  68. {pen_stack-6.0.0 → pen_stack-6.2.0}/configs/target_sites.yaml +0 -0
  69. {pen_stack-6.0.0 → pen_stack-6.2.0}/configs/universe_crosswalk.yaml +0 -0
  70. {pen_stack-6.0.0 → pen_stack-6.2.0}/configs/write_types.yaml +0 -0
  71. {pen_stack-6.0.0 → pen_stack-6.2.0}/configs/wtkb_curated.yaml +0 -0
  72. {pen_stack-6.0.0 → pen_stack-6.2.0}/data/curated/bridge_offtarget_energetics.json +0 -0
  73. {pen_stack-6.0.0 → pen_stack-6.2.0}/data/curated/bridge_offtarget_profile_measured.parquet +0 -0
  74. {pen_stack-6.0.0 → pen_stack-6.2.0}/data/curated/gene_coords.parquet +0 -0
  75. {pen_stack-6.0.0 → pen_stack-6.2.0}/data/curated/unified_editor_universe.parquet +0 -0
  76. {pen_stack-6.0.0 → pen_stack-6.2.0}/docs/BACKLOG.md +0 -0
  77. {pen_stack-6.0.0 → pen_stack-6.2.0}/docs/DEPLOY.md +0 -0
  78. {pen_stack-6.0.0 → pen_stack-6.2.0}/docs/INFRA.md +0 -0
  79. {pen_stack-6.0.0 → pen_stack-6.2.0}/docs/MCP.md +0 -0
  80. {pen_stack-6.0.0 → pen_stack-6.2.0}/docs/RELEASING.md +0 -0
  81. {pen_stack-6.0.0 → pen_stack-6.2.0}/docs/REPRO.md +0 -0
  82. {pen_stack-6.0.0 → pen_stack-6.2.0}/docs/STABILITY.md +0 -0
  83. {pen_stack-6.0.0 → pen_stack-6.2.0}/docs/agent.md +0 -0
  84. {pen_stack-6.0.0 → pen_stack-6.2.0}/docs/alphagenome_feasibility.md +0 -0
  85. {pen_stack-6.0.0 → pen_stack-6.2.0}/docs/autonomy.md +0 -0
  86. {pen_stack-6.0.0 → pen_stack-6.2.0}/docs/benchmark_circularity.md +0 -0
  87. {pen_stack-6.0.0 → pen_stack-6.2.0}/docs/biosecurity.md +0 -0
  88. {pen_stack-6.0.0 → pen_stack-6.2.0}/docs/build_interface.md +0 -0
  89. {pen_stack-6.0.0 → pen_stack-6.2.0}/docs/cards/atlas.md +0 -0
  90. {pen_stack-6.0.0 → pen_stack-6.2.0}/docs/cards/durability.md +0 -0
  91. {pen_stack-6.0.0 → pen_stack-6.2.0}/docs/cards/safety.md +0 -0
  92. {pen_stack-6.0.0 → pen_stack-6.2.0}/docs/challenge.md +0 -0
  93. {pen_stack-6.0.0 → pen_stack-6.2.0}/docs/closed_loop.md +0 -0
  94. {pen_stack-6.0.0 → pen_stack-6.2.0}/docs/co_scientist.md +0 -0
  95. {pen_stack-6.0.0 → pen_stack-6.2.0}/docs/co_scientist_loop.md +0 -0
  96. {pen_stack-6.0.0 → pen_stack-6.2.0}/docs/delivery.md +0 -0
  97. {pen_stack-6.0.0 → pen_stack-6.2.0}/docs/delivery_immunology.md +0 -0
  98. {pen_stack-6.0.0 → pen_stack-6.2.0}/docs/digital_twin.md +0 -0
  99. {pen_stack-6.0.0 → pen_stack-6.2.0}/docs/dissemination.md +0 -0
  100. {pen_stack-6.0.0 → pen_stack-6.2.0}/docs/environment.md +0 -0
  101. {pen_stack-6.0.0 → pen_stack-6.2.0}/docs/experiment_design.md +0 -0
  102. {pen_stack-6.0.0 → pen_stack-6.2.0}/docs/generative_design.md +0 -0
  103. {pen_stack-6.0.0 → pen_stack-6.2.0}/docs/index.md +0 -0
  104. {pen_stack-6.0.0 → pen_stack-6.2.0}/docs/mechanistic_constraints.md +0 -0
  105. {pen_stack-6.0.0 → pen_stack-6.2.0}/docs/oracles.md +0 -0
  106. {pen_stack-6.0.0 → pen_stack-6.2.0}/docs/positioning.md +0 -0
  107. {pen_stack-6.0.0 → pen_stack-6.2.0}/docs/private_data_formats.md +0 -0
  108. {pen_stack-6.0.0 → pen_stack-6.2.0}/docs/quickstart.md +0 -0
  109. {pen_stack-6.0.0 → pen_stack-6.2.0}/docs/responsible_use.md +0 -0
  110. {pen_stack-6.0.0 → pen_stack-6.2.0}/docs/rules.md +0 -0
  111. {pen_stack-6.0.0 → pen_stack-6.2.0}/docs/scope.md +0 -0
  112. {pen_stack-6.0.0 → pen_stack-6.2.0}/docs/scorecard.md +0 -0
  113. {pen_stack-6.0.0 → pen_stack-6.2.0}/docs/tutorials/compare-families.md +0 -0
  114. {pen_stack-6.0.0 → pen_stack-6.2.0}/docs/tutorials/score-deliverability.md +0 -0
  115. {pen_stack-6.0.0 → pen_stack-6.2.0}/docs/tutorials/where-can-i-write.md +0 -0
  116. {pen_stack-6.0.0 → pen_stack-6.2.0}/docs/tutorials/which-writer-reaches-locus.md +0 -0
  117. {pen_stack-6.0.0 → pen_stack-6.2.0}/docs/uncertainty.md +0 -0
  118. {pen_stack-6.0.0 → pen_stack-6.2.0}/docs/verify.md +0 -0
  119. {pen_stack-6.0.0 → pen_stack-6.2.0}/docs/world_model.md +0 -0
  120. {pen_stack-6.0.0 → pen_stack-6.2.0}/docs/writer_verification.md +0 -0
  121. {pen_stack-6.0.0 → pen_stack-6.2.0}/docs/wtkb.md +0 -0
  122. {pen_stack-6.0.0 → pen_stack-6.2.0}/pen_stack/_resources.py +0 -0
  123. {pen_stack-6.0.0 → pen_stack-6.2.0}/pen_stack/active/__init__.py +0 -0
  124. {pen_stack-6.0.0 → pen_stack-6.2.0}/pen_stack/active/acquire.py +0 -0
  125. {pen_stack-6.0.0 → pen_stack-6.2.0}/pen_stack/active/design.py +0 -0
  126. {pen_stack-6.0.0 → pen_stack-6.2.0}/pen_stack/active/validate.py +0 -0
  127. {pen_stack-6.0.0 → pen_stack-6.2.0}/pen_stack/adapt/__init__.py +0 -0
  128. {pen_stack-6.0.0 → pen_stack-6.2.0}/pen_stack/adapt/finetune.py +0 -0
  129. {pen_stack-6.0.0 → pen_stack-6.2.0}/pen_stack/adapt/ingest.py +0 -0
  130. {pen_stack-6.0.0 → pen_stack-6.2.0}/pen_stack/adapt/pipeline.py +0 -0
  131. {pen_stack-6.0.0 → pen_stack-6.2.0}/pen_stack/adapt/recalibrate.py +0 -0
  132. {pen_stack-6.0.0 → pen_stack-6.2.0}/pen_stack/adapt/report.py +0 -0
  133. {pen_stack-6.0.0 → pen_stack-6.2.0}/pen_stack/agent/__init__.py +0 -0
  134. {pen_stack-6.0.0 → pen_stack-6.2.0}/pen_stack/agent/cite.py +0 -0
  135. {pen_stack-6.0.0 → pen_stack-6.2.0}/pen_stack/agent/co_scientist.py +0 -0
  136. {pen_stack-6.0.0 → pen_stack-6.2.0}/pen_stack/agent/epistemic.py +0 -0
  137. {pen_stack-6.0.0 → pen_stack-6.2.0}/pen_stack/agent/guardrails.py +0 -0
  138. {pen_stack-6.0.0 → pen_stack-6.2.0}/pen_stack/agent/orchestrator.py +0 -0
  139. {pen_stack-6.0.0 → pen_stack-6.2.0}/pen_stack/agent/orchestrator_live.py +0 -0
  140. {pen_stack-6.0.0 → pen_stack-6.2.0}/pen_stack/agent/pen_agent.py +0 -0
  141. {pen_stack-6.0.0 → pen_stack-6.2.0}/pen_stack/agent/scope.py +0 -0
  142. {pen_stack-6.0.0 → pen_stack-6.2.0}/pen_stack/agent/tools.py +0 -0
  143. {pen_stack-6.0.0 → pen_stack-6.2.0}/pen_stack/atlas/__init__.py +0 -0
  144. {pen_stack-6.0.0 → pen_stack-6.2.0}/pen_stack/atlas/build_wtkb.py +0 -0
  145. {pen_stack-6.0.0 → pen_stack-6.2.0}/pen_stack/atlas/crosslink.py +0 -0
  146. {pen_stack-6.0.0 → pen_stack-6.2.0}/pen_stack/atlas/expand.py +0 -0
  147. {pen_stack-6.0.0 → pen_stack-6.2.0}/pen_stack/atlas/schema.py +0 -0
  148. {pen_stack-6.0.0 → pen_stack-6.2.0}/pen_stack/atlas/scorecard.py +0 -0
  149. {pen_stack-6.0.0 → pen_stack-6.2.0}/pen_stack/atlas/universe.py +0 -0
  150. {pen_stack-6.0.0 → pen_stack-6.2.0}/pen_stack/atlas/variant_propose.py +0 -0
  151. {pen_stack-6.0.0 → pen_stack-6.2.0}/pen_stack/atlas/writer_verify.py +0 -0
  152. {pen_stack-6.0.0 → pen_stack-6.2.0}/pen_stack/bridge/__init__.py +0 -0
  153. {pen_stack-6.0.0 → pen_stack-6.2.0}/pen_stack/bridge/activity.py +0 -0
  154. {pen_stack-6.0.0 → pen_stack-6.2.0}/pen_stack/bridge/cli.py +0 -0
  155. {pen_stack-6.0.0 → pen_stack-6.2.0}/pen_stack/bridge/fold_qc.py +0 -0
  156. {pen_stack-6.0.0 → pen_stack-6.2.0}/pen_stack/bridge/guide_qc.py +0 -0
  157. {pen_stack-6.0.0 → pen_stack-6.2.0}/pen_stack/bridge/ingest.py +0 -0
  158. {pen_stack-6.0.0 → pen_stack-6.2.0}/pen_stack/bridge/offtarget.py +0 -0
  159. {pen_stack-6.0.0 → pen_stack-6.2.0}/pen_stack/bridge/offtarget_energetics.py +0 -0
  160. {pen_stack-6.0.0 → pen_stack-6.2.0}/pen_stack/bridge/ortholog_screen.py +0 -0
  161. {pen_stack-6.0.0 → pen_stack-6.2.0}/pen_stack/bridge/pipeline.py +0 -0
  162. {pen_stack-6.0.0 → pen_stack-6.2.0}/pen_stack/build/__init__.py +0 -0
  163. {pen_stack-6.0.0 → pen_stack-6.2.0}/pen_stack/build/ingest.py +0 -0
  164. {pen_stack-6.0.0 → pen_stack-6.2.0}/pen_stack/build/protocol.py +0 -0
  165. {pen_stack-6.0.0 → pen_stack-6.2.0}/pen_stack/build/simlab.py +0 -0
  166. {pen_stack-6.0.0 → pen_stack-6.2.0}/pen_stack/cli.py +0 -0
  167. {pen_stack-6.0.0 → pen_stack-6.2.0}/pen_stack/data/__init__.py +0 -0
  168. {pen_stack-6.0.0 → pen_stack-6.2.0}/pen_stack/data/encode.py +0 -0
  169. {pen_stack-6.0.0 → pen_stack-6.2.0}/pen_stack/data/genome.py +0 -0
  170. {pen_stack-6.0.0 → pen_stack-6.2.0}/pen_stack/data/ingest_chromatin.py +0 -0
  171. {pen_stack-6.0.0 → pen_stack-6.2.0}/pen_stack/data/ingest_integration.py +0 -0
  172. {pen_stack-6.0.0 → pen_stack-6.2.0}/pen_stack/data/ingest_safety_annot.py +0 -0
  173. {pen_stack-6.0.0 → pen_stack-6.2.0}/pen_stack/data/ingest_trip.py +0 -0
  174. {pen_stack-6.0.0 → pen_stack-6.2.0}/pen_stack/design/__init__.py +0 -0
  175. {pen_stack-6.0.0 → pen_stack-6.2.0}/pen_stack/design/generate.py +0 -0
  176. {pen_stack-6.0.0 → pen_stack-6.2.0}/pen_stack/design/pareto.py +0 -0
  177. {pen_stack-6.0.0 → pen_stack-6.2.0}/pen_stack/design/space.py +0 -0
  178. {pen_stack-6.0.0 → pen_stack-6.2.0}/pen_stack/env/__init__.py +0 -0
  179. {pen_stack-6.0.0 → pen_stack-6.2.0}/pen_stack/env/genome_writing_env.py +0 -0
  180. {pen_stack-6.0.0 → pen_stack-6.2.0}/pen_stack/env/policies.py +0 -0
  181. {pen_stack-6.0.0 → pen_stack-6.2.0}/pen_stack/graph/__init__.py +0 -0
  182. {pen_stack-6.0.0 → pen_stack-6.2.0}/pen_stack/graph/build.py +0 -0
  183. {pen_stack-6.0.0 → pen_stack-6.2.0}/pen_stack/graph/cell_types.py +0 -0
  184. {pen_stack-6.0.0 → pen_stack-6.2.0}/pen_stack/graph/ingest.py +0 -0
  185. {pen_stack-6.0.0 → pen_stack-6.2.0}/pen_stack/graph/query.py +0 -0
  186. {pen_stack-6.0.0 → pen_stack-6.2.0}/pen_stack/graph/schema.py +0 -0
  187. {pen_stack-6.0.0 → pen_stack-6.2.0}/pen_stack/loop/__init__.py +0 -0
  188. {pen_stack-6.0.0 → pen_stack-6.2.0}/pen_stack/loop/continual.py +0 -0
  189. {pen_stack-6.0.0 → pen_stack-6.2.0}/pen_stack/loop/cycle.py +0 -0
  190. {pen_stack-6.0.0 → pen_stack-6.2.0}/pen_stack/loop/drift.py +0 -0
  191. {pen_stack-6.0.0 → pen_stack-6.2.0}/pen_stack/mech/__init__.py +0 -0
  192. {pen_stack-6.0.0 → pen_stack-6.2.0}/pen_stack/mech/classify_atlas.py +0 -0
  193. {pen_stack-6.0.0 → pen_stack-6.2.0}/pen_stack/mech/whitelist.py +0 -0
  194. {pen_stack-6.0.0 → pen_stack-6.2.0}/pen_stack/monitor/__init__.py +0 -0
  195. {pen_stack-6.0.0 → pen_stack-6.2.0}/pen_stack/monitor/europepmc.py +0 -0
  196. {pen_stack-6.0.0 → pen_stack-6.2.0}/pen_stack/monitor/run.py +0 -0
  197. {pen_stack-6.0.0 → pen_stack-6.2.0}/pen_stack/monitor/triage.py +0 -0
  198. {pen_stack-6.0.0 → pen_stack-6.2.0}/pen_stack/oracles/__init__.py +0 -0
  199. {pen_stack-6.0.0 → pen_stack-6.2.0}/pen_stack/oracles/cache.py +0 -0
  200. {pen_stack-6.0.0 → pen_stack-6.2.0}/pen_stack/oracles/energetics.py +0 -0
  201. {pen_stack-6.0.0 → pen_stack-6.2.0}/pen_stack/oracles/genome.py +0 -0
  202. {pen_stack-6.0.0 → pen_stack-6.2.0}/pen_stack/oracles/protein_design.py +0 -0
  203. {pen_stack-6.0.0 → pen_stack-6.2.0}/pen_stack/oracles/rna.py +0 -0
  204. {pen_stack-6.0.0 → pen_stack-6.2.0}/pen_stack/oracles/schema.py +0 -0
  205. {pen_stack-6.0.0 → pen_stack-6.2.0}/pen_stack/oracles/structure.py +0 -0
  206. {pen_stack-6.0.0 → pen_stack-6.2.0}/pen_stack/oracles/vcell.py +0 -0
  207. {pen_stack-6.0.0 → pen_stack-6.2.0}/pen_stack/planner/__init__.py +0 -0
  208. {pen_stack-6.0.0 → pen_stack-6.2.0}/pen_stack/planner/antipeg_oracle.py +0 -0
  209. {pen_stack-6.0.0 → pen_stack-6.2.0}/pen_stack/planner/capsid_epitope_oracle.py +0 -0
  210. {pen_stack-6.0.0 → pen_stack-6.2.0}/pen_stack/planner/cargo.py +0 -0
  211. {pen_stack-6.0.0 → pen_stack-6.2.0}/pen_stack/planner/cargo_polish.py +0 -0
  212. {pen_stack-6.0.0 → pen_stack-6.2.0}/pen_stack/planner/delivery.py +0 -0
  213. {pen_stack-6.0.0 → pen_stack-6.2.0}/pen_stack/planner/delivery_constraints.py +0 -0
  214. {pen_stack-6.0.0 → pen_stack-6.2.0}/pen_stack/planner/delivery_immunology.py +0 -0
  215. {pen_stack-6.0.0 → pen_stack-6.2.0}/pen_stack/planner/delivery_vehicles.py +0 -0
  216. {pen_stack-6.0.0 → pen_stack-6.2.0}/pen_stack/planner/genotoxicity_oracle.py +0 -0
  217. {pen_stack-6.0.0 → pen_stack-6.2.0}/pen_stack/planner/immune_profile.py +0 -0
  218. {pen_stack-6.0.0 → pen_stack-6.2.0}/pen_stack/planner/innate_sensing.py +0 -0
  219. {pen_stack-6.0.0 → pen_stack-6.2.0}/pen_stack/planner/multiplex.py +0 -0
  220. {pen_stack-6.0.0 → pen_stack-6.2.0}/pen_stack/planner/optimize.py +0 -0
  221. {pen_stack-6.0.0 → pen_stack-6.2.0}/pen_stack/planner/pipeline.py +0 -0
  222. {pen_stack-6.0.0 → pen_stack-6.2.0}/pen_stack/planner/report.py +0 -0
  223. {pen_stack-6.0.0 → pen_stack-6.2.0}/pen_stack/planner/router.py +0 -0
  224. {pen_stack-6.0.0 → pen_stack-6.2.0}/pen_stack/planner/seroprevalence_oracle.py +0 -0
  225. {pen_stack-6.0.0 → pen_stack-6.2.0}/pen_stack/planner/target_site.py +0 -0
  226. {pen_stack-6.0.0 → pen_stack-6.2.0}/pen_stack/rag/__init__.py +0 -0
  227. {pen_stack-6.0.0 → pen_stack-6.2.0}/pen_stack/rag/index.py +0 -0
  228. {pen_stack-6.0.0 → pen_stack-6.2.0}/pen_stack/rag/llm.py +0 -0
  229. {pen_stack-6.0.0 → pen_stack-6.2.0}/pen_stack/rag/qa.py +0 -0
  230. {pen_stack-6.0.0 → pen_stack-6.2.0}/pen_stack/rules/__init__.py +0 -0
  231. {pen_stack-6.0.0 → pen_stack-6.2.0}/pen_stack/rules/evaluators.py +0 -0
  232. {pen_stack-6.0.0 → pen_stack-6.2.0}/pen_stack/rules/loader.py +0 -0
  233. {pen_stack-6.0.0 → pen_stack-6.2.0}/pen_stack/rules/schema.py +0 -0
  234. {pen_stack-6.0.0 → pen_stack-6.2.0}/pen_stack/rules/solver.py +0 -0
  235. {pen_stack-6.0.0 → pen_stack-6.2.0}/pen_stack/safety/__init__.py +0 -0
  236. {pen_stack-6.0.0 → pen_stack-6.2.0}/pen_stack/safety/audit.py +0 -0
  237. {pen_stack-6.0.0 → pen_stack-6.2.0}/pen_stack/safety/gate.py +0 -0
  238. {pen_stack-6.0.0 → pen_stack-6.2.0}/pen_stack/safety/policy.py +0 -0
  239. {pen_stack-6.0.0 → pen_stack-6.2.0}/pen_stack/safety/redteam.py +0 -0
  240. {pen_stack-6.0.0 → pen_stack-6.2.0}/pen_stack/safety/registry.py +0 -0
  241. {pen_stack-6.0.0 → pen_stack-6.2.0}/pen_stack/safety/screen.py +0 -0
  242. {pen_stack-6.0.0 → pen_stack-6.2.0}/pen_stack/score/__init__.py +0 -0
  243. {pen_stack-6.0.0 → pen_stack-6.2.0}/pen_stack/score/recalibrate.py +0 -0
  244. {pen_stack-6.0.0 → pen_stack-6.2.0}/pen_stack/score/therapeutic.py +0 -0
  245. {pen_stack-6.0.0 → pen_stack-6.2.0}/pen_stack/server/__init__.py +0 -0
  246. {pen_stack-6.0.0 → pen_stack-6.2.0}/pen_stack/twin/__init__.py +0 -0
  247. {pen_stack-6.0.0 → pen_stack-6.2.0}/pen_stack/twin/calibrate.py +0 -0
  248. {pen_stack-6.0.0 → pen_stack-6.2.0}/pen_stack/twin/mechanistic.py +0 -0
  249. {pen_stack-6.0.0 → pen_stack-6.2.0}/pen_stack/twin/outcome.py +0 -0
  250. {pen_stack-6.0.0 → pen_stack-6.2.0}/pen_stack/ui/__init__.py +0 -0
  251. {pen_stack-6.0.0 → pen_stack-6.2.0}/pen_stack/ui/app.py +0 -0
  252. {pen_stack-6.0.0 → pen_stack-6.2.0}/pen_stack/validate/__init__.py +0 -0
  253. {pen_stack-6.0.0 → pen_stack-6.2.0}/pen_stack/validate/adapt_demo.py +0 -0
  254. {pen_stack-6.0.0 → pen_stack-6.2.0}/pen_stack/validate/agent_eval.py +0 -0
  255. {pen_stack-6.0.0 → pen_stack-6.2.0}/pen_stack/validate/bench_adversarial_tasks.py +0 -0
  256. {pen_stack-6.0.0 → pen_stack-6.2.0}/pen_stack/validate/bench_coscientist_tasks.py +0 -0
  257. {pen_stack-6.0.0 → pen_stack-6.2.0}/pen_stack/validate/bench_graph_tasks.py +0 -0
  258. {pen_stack-6.0.0 → pen_stack-6.2.0}/pen_stack/validate/bench_rule_tasks.py +0 -0
  259. {pen_stack-6.0.0 → pen_stack-6.2.0}/pen_stack/validate/bench_trust_tasks.py +0 -0
  260. {pen_stack-6.0.0 → pen_stack-6.2.0}/pen_stack/validate/bench_writetype_tasks.py +0 -0
  261. {pen_stack-6.0.0 → pen_stack-6.2.0}/pen_stack/validate/blind_gsh_discovery.py +0 -0
  262. {pen_stack-6.0.0 → pen_stack-6.2.0}/pen_stack/validate/cargo_directionality.py +0 -0
  263. {pen_stack-6.0.0 → pen_stack-6.2.0}/pen_stack/validate/closed_loop.py +0 -0
  264. {pen_stack-6.0.0 → pen_stack-6.2.0}/pen_stack/validate/durability_baselines.py +0 -0
  265. {pen_stack-6.0.0 → pen_stack-6.2.0}/pen_stack/validate/experiment_design.py +0 -0
  266. {pen_stack-6.0.0 → pen_stack-6.2.0}/pen_stack/validate/forward_hypotheses.py +0 -0
  267. {pen_stack-6.0.0 → pen_stack-6.2.0}/pen_stack/validate/generative_design.py +0 -0
  268. {pen_stack-6.0.0 → pen_stack-6.2.0}/pen_stack/validate/guide_qc_demo.py +0 -0
  269. {pen_stack-6.0.0 → pen_stack-6.2.0}/pen_stack/validate/immune_calibration.py +0 -0
  270. {pen_stack-6.0.0 → pen_stack-6.2.0}/pen_stack/validate/intent_specification.py +0 -0
  271. {pen_stack-6.0.0 → pen_stack-6.2.0}/pen_stack/validate/offtarget_energetics_eval.py +0 -0
  272. {pen_stack-6.0.0 → pen_stack-6.2.0}/pen_stack/validate/out_of_scope_refusal.py +0 -0
  273. {pen_stack-6.0.0 → pen_stack-6.2.0}/pen_stack/validate/outcome_calibration.py +0 -0
  274. {pen_stack-6.0.0 → pen_stack-6.2.0}/pen_stack/validate/outcome_prediction.py +0 -0
  275. {pen_stack-6.0.0 → pen_stack-6.2.0}/pen_stack/validate/paper3_benchmark.py +0 -0
  276. {pen_stack-6.0.0 → pen_stack-6.2.0}/pen_stack/validate/paper4_real_validation.py +0 -0
  277. {pen_stack-6.0.0 → pen_stack-6.2.0}/pen_stack/validate/paper4_validation.py +0 -0
  278. {pen_stack-6.0.0 → pen_stack-6.2.0}/pen_stack/validate/protocol_safety.py +0 -0
  279. {pen_stack-6.0.0 → pen_stack-6.2.0}/pen_stack/validate/safety_screening.py +0 -0
  280. {pen_stack-6.0.0 → pen_stack-6.2.0}/pen_stack/validate/selective_prediction.py +0 -0
  281. {pen_stack-6.0.0 → pen_stack-6.2.0}/pen_stack/validate/seq_vs_measured.py +0 -0
  282. {pen_stack-6.0.0 → pen_stack-6.2.0}/pen_stack/validate/target_site_controls.py +0 -0
  283. {pen_stack-6.0.0 → pen_stack-6.2.0}/pen_stack/validate/uncertainty_eval.py +0 -0
  284. {pen_stack-6.0.0 → pen_stack-6.2.0}/pen_stack/validate/ungrounded_baseline.py +0 -0
  285. {pen_stack-6.0.0 → pen_stack-6.2.0}/pen_stack/validate/within_locus_ranking.py +0 -0
  286. {pen_stack-6.0.0 → pen_stack-6.2.0}/pen_stack/validate/writer_recovery.py +0 -0
  287. {pen_stack-6.0.0 → pen_stack-6.2.0}/pen_stack/verify/__init__.py +0 -0
  288. {pen_stack-6.0.0 → pen_stack-6.2.0}/pen_stack/verify/schema.py +0 -0
  289. {pen_stack-6.0.0 → pen_stack-6.2.0}/pen_stack/verify/service.py +0 -0
  290. {pen_stack-6.0.0 → pen_stack-6.2.0}/pen_stack/wgenome/__init__.py +0 -0
  291. {pen_stack-6.0.0 → pen_stack-6.2.0}/pen_stack/wgenome/chromatin_seq.py +0 -0
  292. {pen_stack-6.0.0 → pen_stack-6.2.0}/pen_stack/wgenome/durability.py +0 -0
  293. {pen_stack-6.0.0 → pen_stack-6.2.0}/pen_stack/wgenome/export_tracks.py +0 -0
  294. {pen_stack-6.0.0 → pen_stack-6.2.0}/pen_stack/wgenome/features.py +0 -0
  295. {pen_stack-6.0.0 → pen_stack-6.2.0}/pen_stack/wgenome/gsh_baseline.py +0 -0
  296. {pen_stack-6.0.0 → pen_stack-6.2.0}/pen_stack/wgenome/mesh_features.py +0 -0
  297. {pen_stack-6.0.0 → pen_stack-6.2.0}/pen_stack/wgenome/ood.py +0 -0
  298. {pen_stack-6.0.0 → pen_stack-6.2.0}/pen_stack/wgenome/providers.py +0 -0
  299. {pen_stack-6.0.0 → pen_stack-6.2.0}/pen_stack/wgenome/safety.py +0 -0
  300. {pen_stack-6.0.0 → pen_stack-6.2.0}/pen_stack/wgenome/structure3d.py +0 -0
  301. {pen_stack-6.0.0 → pen_stack-6.2.0}/pen_stack/wgenome/uncertainty.py +0 -0
  302. {pen_stack-6.0.0 → pen_stack-6.2.0}/pen_stack/wgenome/writability.py +0 -0
  303. {pen_stack-6.0.0 → pen_stack-6.2.0}/pen_stack.egg-info/dependency_links.txt +0 -0
  304. {pen_stack-6.0.0 → pen_stack-6.2.0}/pen_stack.egg-info/entry_points.txt +0 -0
  305. {pen_stack-6.0.0 → pen_stack-6.2.0}/pen_stack.egg-info/requires.txt +0 -0
  306. {pen_stack-6.0.0 → pen_stack-6.2.0}/pen_stack.egg-info/top_level.txt +0 -0
  307. {pen_stack-6.0.0 → pen_stack-6.2.0}/prereg/SHA256_LOCK_phase0.json +0 -0
  308. {pen_stack-6.0.0 → pen_stack-6.2.0}/prereg/SHA256_LOCK_phase1_5.json +0 -0
  309. {pen_stack-6.0.0 → pen_stack-6.2.0}/prereg/SHA256_LOCK_phase2.json +0 -0
  310. {pen_stack-6.0.0 → pen_stack-6.2.0}/prereg/SHA256_LOCK_phase3.json +0 -0
  311. {pen_stack-6.0.0 → pen_stack-6.2.0}/prereg/SHA256_LOCK_ws_a.json +0 -0
  312. {pen_stack-6.0.0 → pen_stack-6.2.0}/prereg/SHA256_LOCK_ws_acq.json +0 -0
  313. {pen_stack-6.0.0 → pen_stack-6.2.0}/prereg/SHA256_LOCK_ws_aldesign.json +0 -0
  314. {pen_stack-6.0.0 → pen_stack-6.2.0}/prereg/SHA256_LOCK_ws_alvalidate.json +0 -0
  315. {pen_stack-6.0.0 → pen_stack-6.2.0}/prereg/SHA256_LOCK_ws_atlas.json +0 -0
  316. {pen_stack-6.0.0 → pen_stack-6.2.0}/prereg/SHA256_LOCK_ws_b.json +0 -0
  317. {pen_stack-6.0.0 → pen_stack-6.2.0}/prereg/SHA256_LOCK_ws_ba.json +0 -0
  318. {pen_stack-6.0.0 → pen_stack-6.2.0}/prereg/SHA256_LOCK_ws_ba_v33.json +0 -0
  319. {pen_stack-6.0.0 → pen_stack-6.2.0}/prereg/SHA256_LOCK_ws_ba_v45.json +0 -0
  320. {pen_stack-6.0.0 → pen_stack-6.2.0}/prereg/SHA256_LOCK_ws_bench.json +0 -0
  321. {pen_stack-6.0.0 → pen_stack-6.2.0}/prereg/SHA256_LOCK_ws_c.json +0 -0
  322. {pen_stack-6.0.0 → pen_stack-6.2.0}/prereg/SHA256_LOCK_ws_cal.json +0 -0
  323. {pen_stack-6.0.0 → pen_stack-6.2.0}/prereg/SHA256_LOCK_ws_calib.json +0 -0
  324. {pen_stack-6.0.0 → pen_stack-6.2.0}/prereg/SHA256_LOCK_ws_challenge.json +0 -0
  325. {pen_stack-6.0.0 → pen_stack-6.2.0}/prereg/SHA256_LOCK_ws_cite.json +0 -0
  326. {pen_stack-6.0.0 → pen_stack-6.2.0}/prereg/SHA256_LOCK_ws_continual.json +0 -0
  327. {pen_stack-6.0.0 → pen_stack-6.2.0}/prereg/SHA256_LOCK_ws_cosci2.json +0 -0
  328. {pen_stack-6.0.0 → pen_stack-6.2.0}/prereg/SHA256_LOCK_ws_crit.json +0 -0
  329. {pen_stack-6.0.0 → pen_stack-6.2.0}/prereg/SHA256_LOCK_ws_ct.json +0 -0
  330. {pen_stack-6.0.0 → pen_stack-6.2.0}/prereg/SHA256_LOCK_ws_d.json +0 -0
  331. {pen_stack-6.0.0 → pen_stack-6.2.0}/prereg/SHA256_LOCK_ws_drift.json +0 -0
  332. {pen_stack-6.0.0 → pen_stack-6.2.0}/prereg/SHA256_LOCK_ws_e.json +0 -0
  333. {pen_stack-6.0.0 → pen_stack-6.2.0}/prereg/SHA256_LOCK_ws_env.json +0 -0
  334. {pen_stack-6.0.0 → pen_stack-6.2.0}/prereg/SHA256_LOCK_ws_ep.json +0 -0
  335. {pen_stack-6.0.0 → pen_stack-6.2.0}/prereg/SHA256_LOCK_ws_epitope.json +0 -0
  336. {pen_stack-6.0.0 → pen_stack-6.2.0}/prereg/SHA256_LOCK_ws_f.json +0 -0
  337. {pen_stack-6.0.0 → pen_stack-6.2.0}/prereg/SHA256_LOCK_ws_g.json +0 -0
  338. {pen_stack-6.0.0 → pen_stack-6.2.0}/prereg/SHA256_LOCK_ws_gen.json +0 -0
  339. {pen_stack-6.0.0 → pen_stack-6.2.0}/prereg/SHA256_LOCK_ws_genotox.json +0 -0
  340. {pen_stack-6.0.0 → pen_stack-6.2.0}/prereg/SHA256_LOCK_ws_graph.json +0 -0
  341. {pen_stack-6.0.0 → pen_stack-6.2.0}/prereg/SHA256_LOCK_ws_h.json +0 -0
  342. {pen_stack-6.0.0 → pen_stack-6.2.0}/prereg/SHA256_LOCK_ws_immune.json +0 -0
  343. {pen_stack-6.0.0 → pen_stack-6.2.0}/prereg/SHA256_LOCK_ws_ingest.json +0 -0
  344. {pen_stack-6.0.0 → pen_stack-6.2.0}/prereg/SHA256_LOCK_ws_innate.json +0 -0
  345. {pen_stack-6.0.0 → pen_stack-6.2.0}/prereg/SHA256_LOCK_ws_loop.json +0 -0
  346. {pen_stack-6.0.0 → pen_stack-6.2.0}/prereg/SHA256_LOCK_ws_mc.json +0 -0
  347. {pen_stack-6.0.0 → pen_stack-6.2.0}/prereg/SHA256_LOCK_ws_mech.json +0 -0
  348. {pen_stack-6.0.0 → pen_stack-6.2.0}/prereg/SHA256_LOCK_ws_mon.json +0 -0
  349. {pen_stack-6.0.0 → pen_stack-6.2.0}/prereg/SHA256_LOCK_ws_o.json +0 -0
  350. {pen_stack-6.0.0 → pen_stack-6.2.0}/prereg/SHA256_LOCK_ws_orch.json +0 -0
  351. {pen_stack-6.0.0 → pen_stack-6.2.0}/prereg/SHA256_LOCK_ws_outcome.json +0 -0
  352. {pen_stack-6.0.0 → pen_stack-6.2.0}/prereg/SHA256_LOCK_ws_pareto.json +0 -0
  353. {pen_stack-6.0.0 → pen_stack-6.2.0}/prereg/SHA256_LOCK_ws_peg.json +0 -0
  354. {pen_stack-6.0.0 → pen_stack-6.2.0}/prereg/SHA256_LOCK_ws_plan.json +0 -0
  355. {pen_stack-6.0.0 → pen_stack-6.2.0}/prereg/SHA256_LOCK_ws_policy.json +0 -0
  356. {pen_stack-6.0.0 → pen_stack-6.2.0}/prereg/SHA256_LOCK_ws_profile.json +0 -0
  357. {pen_stack-6.0.0 → pen_stack-6.2.0}/prereg/SHA256_LOCK_ws_proto.json +0 -0
  358. {pen_stack-6.0.0 → pen_stack-6.2.0}/prereg/SHA256_LOCK_ws_r.json +0 -0
  359. {pen_stack-6.0.0 → pen_stack-6.2.0}/prereg/SHA256_LOCK_ws_redteam.json +0 -0
  360. {pen_stack-6.0.0 → pen_stack-6.2.0}/prereg/SHA256_LOCK_ws_route.json +0 -0
  361. {pen_stack-6.0.0 → pen_stack-6.2.0}/prereg/SHA256_LOCK_ws_screen.json +0 -0
  362. {pen_stack-6.0.0 → pen_stack-6.2.0}/prereg/SHA256_LOCK_ws_seroprev.json +0 -0
  363. {pen_stack-6.0.0 → pen_stack-6.2.0}/prereg/SHA256_LOCK_ws_simlab.json +0 -0
  364. {pen_stack-6.0.0 → pen_stack-6.2.0}/prereg/SHA256_LOCK_ws_twincal.json +0 -0
  365. {pen_stack-6.0.0 → pen_stack-6.2.0}/prereg/SHA256_LOCK_ws_uq.json +0 -0
  366. {pen_stack-6.0.0 → pen_stack-6.2.0}/prereg/SHA256_LOCK_ws_v.json +0 -0
  367. {pen_stack-6.0.0 → pen_stack-6.2.0}/prereg/SHA256_LOCK_ws_vcell.json +0 -0
  368. {pen_stack-6.0.0 → pen_stack-6.2.0}/prereg/SHA256_LOCK_ws_wv.json +0 -0
  369. {pen_stack-6.0.0 → pen_stack-6.2.0}/prereg/paper1.yaml +0 -0
  370. {pen_stack-6.0.0 → pen_stack-6.2.0}/prereg/paper2.yaml +0 -0
  371. {pen_stack-6.0.0 → pen_stack-6.2.0}/prereg/paper3.yaml +0 -0
  372. {pen_stack-6.0.0 → pen_stack-6.2.0}/prereg/paper4.yaml +0 -0
  373. {pen_stack-6.0.0 → pen_stack-6.2.0}/prereg/phase0.yaml +0 -0
  374. {pen_stack-6.0.0 → pen_stack-6.2.0}/prereg/ws_a.yaml +0 -0
  375. {pen_stack-6.0.0 → pen_stack-6.2.0}/prereg/ws_acq.yaml +0 -0
  376. {pen_stack-6.0.0 → pen_stack-6.2.0}/prereg/ws_aldesign.yaml +0 -0
  377. {pen_stack-6.0.0 → pen_stack-6.2.0}/prereg/ws_alvalidate.yaml +0 -0
  378. {pen_stack-6.0.0 → pen_stack-6.2.0}/prereg/ws_atlas.yaml +0 -0
  379. {pen_stack-6.0.0 → pen_stack-6.2.0}/prereg/ws_b.yaml +0 -0
  380. {pen_stack-6.0.0 → pen_stack-6.2.0}/prereg/ws_ba.yaml +0 -0
  381. {pen_stack-6.0.0 → pen_stack-6.2.0}/prereg/ws_ba_v33.yaml +0 -0
  382. {pen_stack-6.0.0 → pen_stack-6.2.0}/prereg/ws_ba_v45.yaml +0 -0
  383. {pen_stack-6.0.0 → pen_stack-6.2.0}/prereg/ws_bench.yaml +0 -0
  384. {pen_stack-6.0.0 → pen_stack-6.2.0}/prereg/ws_c.yaml +0 -0
  385. {pen_stack-6.0.0 → pen_stack-6.2.0}/prereg/ws_cal.yaml +0 -0
  386. {pen_stack-6.0.0 → pen_stack-6.2.0}/prereg/ws_calib.yaml +0 -0
  387. {pen_stack-6.0.0 → pen_stack-6.2.0}/prereg/ws_challenge.yaml +0 -0
  388. {pen_stack-6.0.0 → pen_stack-6.2.0}/prereg/ws_cite.yaml +0 -0
  389. {pen_stack-6.0.0 → pen_stack-6.2.0}/prereg/ws_continual.yaml +0 -0
  390. {pen_stack-6.0.0 → pen_stack-6.2.0}/prereg/ws_cosci2.yaml +0 -0
  391. {pen_stack-6.0.0 → pen_stack-6.2.0}/prereg/ws_crit.yaml +0 -0
  392. {pen_stack-6.0.0 → pen_stack-6.2.0}/prereg/ws_ct.yaml +0 -0
  393. {pen_stack-6.0.0 → pen_stack-6.2.0}/prereg/ws_d.yaml +0 -0
  394. {pen_stack-6.0.0 → pen_stack-6.2.0}/prereg/ws_drift.yaml +0 -0
  395. {pen_stack-6.0.0 → pen_stack-6.2.0}/prereg/ws_e.yaml +0 -0
  396. {pen_stack-6.0.0 → pen_stack-6.2.0}/prereg/ws_env.yaml +0 -0
  397. {pen_stack-6.0.0 → pen_stack-6.2.0}/prereg/ws_ep.yaml +0 -0
  398. {pen_stack-6.0.0 → pen_stack-6.2.0}/prereg/ws_epitope.yaml +0 -0
  399. {pen_stack-6.0.0 → pen_stack-6.2.0}/prereg/ws_f.yaml +0 -0
  400. {pen_stack-6.0.0 → pen_stack-6.2.0}/prereg/ws_g.yaml +0 -0
  401. {pen_stack-6.0.0 → pen_stack-6.2.0}/prereg/ws_gen.yaml +0 -0
  402. {pen_stack-6.0.0 → pen_stack-6.2.0}/prereg/ws_genotox.yaml +0 -0
  403. {pen_stack-6.0.0 → pen_stack-6.2.0}/prereg/ws_graph.yaml +0 -0
  404. {pen_stack-6.0.0 → pen_stack-6.2.0}/prereg/ws_h.yaml +0 -0
  405. {pen_stack-6.0.0 → pen_stack-6.2.0}/prereg/ws_immune.yaml +0 -0
  406. {pen_stack-6.0.0 → pen_stack-6.2.0}/prereg/ws_ingest.yaml +0 -0
  407. {pen_stack-6.0.0 → pen_stack-6.2.0}/prereg/ws_innate.yaml +0 -0
  408. {pen_stack-6.0.0 → pen_stack-6.2.0}/prereg/ws_loop.yaml +0 -0
  409. {pen_stack-6.0.0 → pen_stack-6.2.0}/prereg/ws_mc.yaml +0 -0
  410. {pen_stack-6.0.0 → pen_stack-6.2.0}/prereg/ws_mech.yaml +0 -0
  411. {pen_stack-6.0.0 → pen_stack-6.2.0}/prereg/ws_mon.yaml +0 -0
  412. {pen_stack-6.0.0 → pen_stack-6.2.0}/prereg/ws_o.yaml +0 -0
  413. {pen_stack-6.0.0 → pen_stack-6.2.0}/prereg/ws_orch.yaml +0 -0
  414. {pen_stack-6.0.0 → pen_stack-6.2.0}/prereg/ws_outcome.yaml +0 -0
  415. {pen_stack-6.0.0 → pen_stack-6.2.0}/prereg/ws_pareto.yaml +0 -0
  416. {pen_stack-6.0.0 → pen_stack-6.2.0}/prereg/ws_peg.yaml +0 -0
  417. {pen_stack-6.0.0 → pen_stack-6.2.0}/prereg/ws_plan.yaml +0 -0
  418. {pen_stack-6.0.0 → pen_stack-6.2.0}/prereg/ws_policy.yaml +0 -0
  419. {pen_stack-6.0.0 → pen_stack-6.2.0}/prereg/ws_profile.yaml +0 -0
  420. {pen_stack-6.0.0 → pen_stack-6.2.0}/prereg/ws_proto.yaml +0 -0
  421. {pen_stack-6.0.0 → pen_stack-6.2.0}/prereg/ws_r.yaml +0 -0
  422. {pen_stack-6.0.0 → pen_stack-6.2.0}/prereg/ws_redteam.yaml +0 -0
  423. {pen_stack-6.0.0 → pen_stack-6.2.0}/prereg/ws_route.yaml +0 -0
  424. {pen_stack-6.0.0 → pen_stack-6.2.0}/prereg/ws_screen.yaml +0 -0
  425. {pen_stack-6.0.0 → pen_stack-6.2.0}/prereg/ws_seroprev.yaml +0 -0
  426. {pen_stack-6.0.0 → pen_stack-6.2.0}/prereg/ws_simlab.yaml +0 -0
  427. {pen_stack-6.0.0 → pen_stack-6.2.0}/prereg/ws_twincal.yaml +0 -0
  428. {pen_stack-6.0.0 → pen_stack-6.2.0}/prereg/ws_uq.yaml +0 -0
  429. {pen_stack-6.0.0 → pen_stack-6.2.0}/prereg/ws_v.yaml +0 -0
  430. {pen_stack-6.0.0 → pen_stack-6.2.0}/prereg/ws_vcell.yaml +0 -0
  431. {pen_stack-6.0.0 → pen_stack-6.2.0}/prereg/ws_wv.yaml +0 -0
  432. {pen_stack-6.0.0 → pen_stack-6.2.0}/scripts/p1_build_atlas.py +0 -0
  433. {pen_stack-6.0.0 → pen_stack-6.2.0}/scripts/p1_build_durability.py +0 -0
  434. {pen_stack-6.0.0 → pen_stack-6.2.0}/scripts/p1_export_tracks.py +0 -0
  435. {pen_stack-6.0.0 → pen_stack-6.2.0}/scripts/p1_safety_concordance.py +0 -0
  436. {pen_stack-6.0.0 → pen_stack-6.2.0}/scripts/p1_train_safety.py +0 -0
  437. {pen_stack-6.0.0 → pen_stack-6.2.0}/scripts/p1_validation_report.py +0 -0
  438. {pen_stack-6.0.0 → pen_stack-6.2.0}/scripts/p2_build_atlas.py +0 -0
  439. {pen_stack-6.0.0 → pen_stack-6.2.0}/scripts/p3_benchmark_report.py +0 -0
  440. {pen_stack-6.0.0 → pen_stack-6.2.0}/scripts/p4_genome_scan.py +0 -0
  441. {pen_stack-6.0.0 → pen_stack-6.2.0}/scripts/p52_build_genotox_oracle.py +0 -0
  442. {pen_stack-6.0.0 → pen_stack-6.2.0}/scripts/p53_build_epitope_oracle.py +0 -0
  443. {pen_stack-6.0.0 → pen_stack-6.2.0}/scripts/ws_b_report.py +0 -0
  444. {pen_stack-6.0.0 → pen_stack-6.2.0}/scripts/ws_c_report.py +0 -0
  445. {pen_stack-6.0.0 → pen_stack-6.2.0}/setup.cfg +0 -0
@@ -3,6 +3,72 @@
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.0] - 2026-06-11 - v6.2: The Web Platform (the human surface)
7
+
8
+ **Post-1.0 adoption surface for bench scientists.** A complete, friendly web application — a grounded co-scientist
9
+ chat plus structured feature pages — over the same typed v6.1 API the AI surface uses. The LLM **narrates and
10
+ routes but never sources a number**; every quantitative answer renders with its confidence band, provenance, and
11
+ an explicit ledger of what PEN-STACK can't tell you. MINOR release on the stable 6.0 API. Workstreams
12
+ WS-{BACKEND,CHAT,FRONTEND,PAGES,DEPLOY}, SHA-locked.
13
+
14
+ ### Added
15
+ - **WS-BACKEND** — `pen_stack/web/server.py`: one FastAPI gateway that **mounts the v6.1 engine surface** under
16
+ `/api` (so the frontend has one base URL / one OpenAPI) and adds the grounded `/chat` (+ SSE `/chat/stream`),
17
+ CORS, and static serving of the built frontend (`web/dist`). A `/health` for the live grounded indicator.
18
+ - **WS-CHAT** *(the hard gate)* — `pen_stack/web/tools.py` (the deterministic engine tool-runner: parse a goal →
19
+ run `verify`/`safety`/`immune_profile`/scope → a grounded dossier; `extract_grounded_numbers` = the allow-list)
20
+ and `pen_stack/web/llm.py` (the grounded co-scientist: **Ollama → Nemotron → deterministic narrator**, with
21
+ `_enforce_grounding` striking any numeric token the model can't trace to a tool result). A reply's numbers are
22
+ always engine-sourced; `tests/unit/test_ws_chat.py` asserts **no number in a reply is absent from the tool
23
+ results**, and that the deterministic narrator works with both LLMs offline.
24
+ - **WS-FRONTEND** — `web/` (React/Vite + Tailwind): the **honest-UX component library** — `ConfidenceBand`,
25
+ `ProvenanceChip`, `ScopeLedger`, `SafetyBadge`, `ImmuneProfileCard` — so a number is never shown without its
26
+ uncertainty + provenance, and the scope ledger appears on every answer.
27
+ - **WS-PAGES** — 11 feature pages over the typed API: Co-Scientist · Site Finder · Writer Atlas · Designer ·
28
+ Verify · Delivery & Immunity · Digital Twin · Guardian · Experiments · Challenge · Scope & About. Each renders
29
+ through the honest-UX library and degrades gracefully when the LLM is offline.
30
+ - **WS-DEPLOY** — `docker/web.Dockerfile` (multi-stage: a **node:20** stage builds the frontend, a slim Python
31
+ serves UI + API from one origin) + a `web` service in `docker-compose.yml`: **one-command self-host**
32
+ (`docker compose up web ollama`, open `http://localhost:8000`). `web/.env.example`, `web/README.md` quickstart.
33
+ - Read-only Challenge surface for the web page: `GET /api/challenge/{tasks,leaderboard}` (public tasks + the
34
+ PEN-STACK reference leaderboard; submissions are still scored offline, never accepted over HTTP).
35
+ - prereg `ws_{chat,frontend}` + SHA locks; deposit `phase_6.2/`.
36
+
37
+ ### Notes
38
+ - **The LLM never sources a number.** It explains, compares, and routes over the engine's tool outputs; the
39
+ grounding guard strips any value it can't trace, and the app runs in a deterministic, no-LLM mode (the science
40
+ lives in the engine, not the model). This cycle improves **usability/adoption**, not validation — a real-data
41
+ result and a first lab user remain the standing bottleneck. No new science; contracts under the 1.0 commitment.
42
+
43
+ ## [6.1.0] - 2026-06-11 - v6.1: The AI Integration Surface
44
+
45
+ **Post-1.0 adoption surface for AI builders.** Not new capability — the *introspectable, documented, dependable*
46
+ contract that lets an external agent discover what PEN-STACK offers **and what it refuses to answer**. MINOR
47
+ release on the stable 6.0 API. Workstreams WS-{MANIFEST,OPENAPI,MCP} + examples, SHA-locked.
48
+
49
+ ### Added
50
+ - **WS-MANIFEST** *(the differentiator)* — `pen_stack/api/manifest.py`: `capability_manifest()` (machine-readable:
51
+ the stable tools, inputs/outputs, all `fabricates=False`, guarantees, stability) and **`scope_manifest()`**
52
+ (machine-readable: the **known-unknowns** registry + every **oracle scope card** — what PEN-STACK *refuses* to
53
+ answer). Generated from the live registry/scope cards (never hand-written); internal matcher fields not leaked.
54
+ - **WS-OPENAPI** — `pen_stack/server/api.py`: `GET /capabilities` + `GET /scope` + `POST /verify /safety /immune
55
+ /generate /predict /suggest /session`; FastAPI auto-generates the **OpenAPI 3.1** spec at `/openapi.json`.
56
+ - **WS-MCP** — `pen_stack/agent/mcp_server.py`: the self-describing **resources** `pen-stack://capabilities` +
57
+ `pen-stack://scope`, plus the engine tools (`safety_screen`, `immune_profile`, `generate_designs`,
58
+ `predict_outcome`, `suggest_experiment`, `co_scientist_session`). A hazardous design returns a **structured
59
+ refusal** an agent branches on.
60
+ - **WS-EXAMPLE** — runnable golden path: `examples/external_agent.py` (REST: discover scope → submit → branch on
61
+ safety/legality), `examples/mcp_client.py` (MCP), `examples/agent_tools.py` (framework-agnostic tool specs built
62
+ **from the live manifest** + an in-process dispatcher to the validated engine).
63
+ - Docs: `docs/integrations.md` rewritten as "Integrate PEN-STACK in your AI" (the four guarantees + the scope
64
+ contract + REST/MCP/framework quickstarts); prereg `ws_{manifest,openapi,mcp}` + SHA locks; deposit `phase_6.1/`.
65
+
66
+ ### Notes
67
+ - **Scope is data, not a disclaimer.** The scope manifest makes the honesty machinery itself an API — the thing
68
+ that makes trustworthy autonomy something another system can build on. This cycle lowers the barrier to
69
+ adoption; it does not, by itself, create it — outreach + a real result remain the standing bottleneck. No new
70
+ science or validation; contracts versioned + deprecation-policed under the 1.0 commitment.
71
+
6
72
  ## [6.0.0] - 2026-06-11 - 1.0 — First Stable (the graduation)
7
73
 
8
74
  **The Closed-Loop arc is complete (7/7), and PEN-STACK graduates to "1.0 — First Stable."** The public API
@@ -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.0.0
4
+ version: 6.2.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.0.0
3
+ Version: 6.2.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.0.0-blue.svg)](CHANGELOG.md)
93
+ [![Version](https://img.shields.io/badge/version-6.2.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-354%20passing-success.svg)](tests/)
95
+ [![Tests](https://img.shields.io/badge/tests-368%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,44 @@ 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.2 — The Web Platform (the human surface)
152
+
153
+ Post-1.0, the adoption surface for **bench scientists**: a complete, friendly **web application** — a grounded
154
+ co-scientist chat plus structured feature pages — over the same typed v6.1 API the AI surface uses. The LLM
155
+ **narrates and routes but never sources a number**; every quantitative answer renders with its confidence band,
156
+ its provenance, and an explicit ledger of what PEN-STACK *can't* tell you.
157
+
158
+ | Workstream | What it adds | Result |
159
+ |---|---|---|
160
+ | **BACKEND** | `pen_stack/web/server.py` | one FastAPI gateway that mounts the v6.1 engine surface (under `/api`) + adds the grounded `/chat` (+ SSE `/chat/stream`) + CORS + serves the built frontend |
161
+ | **CHAT** *(the hard gate)* | `pen_stack/web/{tools,llm}.py` | the grounded co-scientist: the **engine** computes every number (`run_tools`), the LLM narrates over the tool results (**Ollama → Nemotron → deterministic**), and a **grounding guard strikes any number the model can't trace to a tool result** (asserted in `tests/unit/test_ws_chat.py`) |
162
+ | **FRONTEND** | `web/` (React/Vite + Tailwind) | the **honest-UX library** — `ConfidenceBand · ProvenanceChip · ScopeLedger · SafetyBadge · ImmuneProfileCard` — so a number is never shown without its uncertainty + provenance |
163
+ | **PAGES** | 11 feature pages | Co-Scientist · Site Finder · Writer Atlas · Designer · Verify · Delivery & Immunity · Digital Twin · Guardian · Experiments · Challenge · Scope & About |
164
+ | **DEPLOY** | `docker/web.Dockerfile` + compose | **one-command self-host**: a `node:20` stage builds the frontend, a slim Python serves UI + API from one origin — `docker compose up web ollama`, open `http://localhost:8000` |
165
+
166
+ **The LLM never sources a number** — it explains, compares, and routes over the engine's tool outputs, and the
167
+ science runs (deterministic mode) with no LLM at all. See [`web/README.md`](web/README.md) and
168
+ `prereg/ws_{chat,frontend}.yaml`. (Lowers the usability barrier; a real-data validation + a first lab user remain
169
+ the standing bottleneck — no new science.)
170
+
171
+ ## What is new in v6.1 — The AI Integration Surface
172
+
173
+ Post-1.0, the adoption surface for **AI builders**: PEN-STACK is now **self-describing** — an external agent can
174
+ ask, programmatically, *"what can you do, and what do you refuse to answer?"* and get a typed, honest answer it can
175
+ route on.
176
+
177
+ | Workstream | What it adds | Result |
178
+ |---|---|---|
179
+ | **MANIFEST** *(the differentiator)* | `pen_stack/api/manifest.py` | `capability_manifest()` (tools, all `fabricates=False`) + **`scope_manifest()`** — the known-unknowns + oracle scope cards as **machine-readable data** (what PEN-STACK *refuses* to answer) |
180
+ | **OPENAPI** | `server/api.py` | `GET /capabilities` + `GET /scope` + tool routes (`/verify /safety /immune /generate /predict /suggest /session`); auto **OpenAPI 3.1** at `/openapi.json` |
181
+ | **MCP** | `agent/mcp_server.py` | resources `pen-stack://capabilities` + `pen-stack://scope`; engine tools; a hazardous design returns a **structured refusal** |
182
+ | **EXAMPLE** | `examples/` | golden-path `external_agent.py` (REST), `mcp_client.py` (MCP), `agent_tools.py` (framework specs built from the live manifest + dispatcher) |
183
+
184
+ **Scope is data, not a disclaimer** — the honesty machinery becomes an API, the thing that makes trustworthy
185
+ autonomy something another system can build on. See [Integrate PEN-STACK in your AI](docs/integrations.md) and
186
+ `prereg/ws_{manifest,openapi,mcp}.yaml`. (Lowers the adoption barrier; outreach + a real result remain the
187
+ standing bottleneck — no new science.)
188
+
151
189
  ## What is new in v5.13 — The Standard (Genome-Writing Challenge + Co-Scientist II)
152
190
 
153
191
  v5.13 (**Closed-Loop arc, Cycle 7 of 7**) makes PEN-STACK the field's reference and its most useful face: the
@@ -520,45 +558,68 @@ benchmark with deterministic scorers and no circular labels. See
520
558
 
521
559
  ## Architecture
522
560
 
561
+ At **1.0**, PEN-STACK is a **closed design→build→test→learn loop** standing on two reference layers, the oracle
562
+ mesh, and the data foundation — with **the verifier at the centre as the discriminator**: nothing is generated,
563
+ built, or learned unless it passes *safe + legal + calibrated*, and no number is fabricated. The loop stops
564
+ deliberately at **autonomy Level 3** (a human in control at every gate).
565
+
523
566
  ```
524
- +-------------------------------------------+
525
- | WRITE PLANNER (engine) |
526
- | inverse design: destination x writer |
527
- | x cargo/guide x delivery -> ranked plan |
528
- +----------------^-------------^-------------+
529
- | |
530
- +-------------------------+--+ +---+------------------------+
531
- | WRITABLE GENOME (B) | | WRITER ATLAS (A) |
532
- | flagship reference |<---->| companion reference |
533
- | | reach| |
534
- | - Safety layer (learned) | ability - Family targeting KB |
535
- | - Durability layer (learned)| | - Measured scoring axes |
536
- | - Reachability layer -----+------+ - Mechanism classifier |
537
- | -> writability profile | | - DMS variant model |
538
- +-------------------------^--+ +---+------------------------+
539
- | |
540
- +----------------------------------+-------------+-------------------------+
541
- | DATA FOUNDATION (bulk-downloadable) |
542
- | hg38 . ENCODE/Roadmap chromatin . Hi-C/LADs . TRIP position effects . |
543
- | RID/VISDB/MLV integration sites . clinical genotoxic CIS . COSMIC . |
544
- | DepMap . gnomAD . GTEx . UniProt . Pfam/InterPro . bridge-recombinase |
545
- | off-target + DMS (Perry 2025) |
546
- +-------------------------------------------------------------------------+
547
-
548
- Delivery immunology (v5.1-5.6, feeds the planner): a safety<->efficacy balance over the 8-vehicle palette,
549
- with the immune/safety axes computed/grounded from data + sequence (genotoxicity = VISDB x COSMIC;
550
- adaptive/CD8 = MHCflurry over the capsid; innate = CpG/dsRNA of the cargo; pre-existing/NAb = serosurveys;
551
- anti-PEG = serosurveys, gates LNP re-dosing) -> a unified per-axis immune-risk PROFILE (Verdict.immune_profile),
552
- each axis labelled validated-or-proxy (WS-CALIB), never collapsed into one number; in-vivo magnitude + patient
553
- titer stay declared known-unknowns.
554
-
555
- Platform services (on top of the validated core): PEN-MONITOR (Europe PMC living database),
556
- grounded RAG/Q&A, a tool-using agent + MCP server, and a Streamlit web app.
567
+ +-----------------------------------------------------------------------+
568
+ | THE FACES (v5.13 / 1.0) |
569
+ | Co-Scientist (drives the loop) . Genome-Writing Challenge (held-out) |
570
+ | . MCP server . REST API . Streamlit web app |
571
+ +-----------------------------------^-----------------------------------+
572
+ |
573
+ +----------------------------------------------------+---------------------------------------------------+
574
+ | THE CLOSED LOOP (v5.12 - autonomy Level 3; a human in control at safety / build / belief-admission) |
575
+ | |
576
+ | GENERATE ----> PREDICT ----> DECIDE ----> [ SAFETY ] ----> BUILD ----> INGEST ----> LEARN |
577
+ | v5.8 v5.9 v5.10 v5.7 v5.11 v4.5 gate v5.12 |
578
+ | generative digital experiment GUARDIAN protocol (no auto- continual |
579
+ | designer twin designer gate export edit) + drift |
580
+ | (Pareto) (OOD-gated) (EIG+immVOI) (refuse=stop) (DRAFT) (versioned) |
581
+ | |
582
+ | Every candidate is DISCARDED unless it passes THE VERIFIER below. No number is fabricated. |
583
+ +----------------------------------------------------+---------------------------------------------------+
584
+ |
585
+ +-----------------------------------v-----------------------------------+
586
+ | THE VERIFIER verify(design) -> Verdict (the discriminator) |
587
+ | legality (v3.3 rules) . SAFETY gate (v5.7, runs first) . |
588
+ | calibrated confidence (v3.2) . per-axis immune-risk profile (v5.6) |
589
+ +-----------------------------------^-----------------------------------+
590
+ |
591
+ +--------------------------------+-------------------+----------------+--------------------------------+
592
+ | WRITABLE GENOME (Paper 1) | WRITER ATLAS (Paper 2) | ORACLE MESH (v4.0) |
593
+ | learned safety x durability | 33,370 systems on measured axes | AF3 . Boltz-2 . Chai-1 . ESM3 |
594
+ | x reachability | + Writer-Targeting KB (8 families)| . Evo2 . AlphaGenome . RFdiff. |
595
+ | -> writability profile | <----- reachability -----> | ProteinMPNN . v5.9 STATE/scGPT |
596
+ | + WRITE PLANNER (Paper 3) | + BRIDGE OFF-TARGET ENGINE (P4) | one OracleResult contract, |
597
+ | inverse design (edit_intent)| | OOD-gated, generative=candidate|
598
+ | + DELIVERY IMMUNOLOGY (v5.1-6) per-axis immune-risk profile (each axis validated-or-proxy, never collapsed) |
599
+ | + WORLD-MODEL GRAPH (v4.5) typed provenanced edges, gated living loop (propose-only) |
600
+ +--------------------------------+------------------------------------+--------------------------------+
601
+ +----------------------------------------------------------------------------------------------------+
602
+ | DATA FOUNDATION (bulk-downloadable, public) |
603
+ | hg38 . ENCODE/Roadmap chromatin . Hi-C/LADs . TRIP position effects . RID/VISDB/MLV integration . |
604
+ | clinical genotoxic CIS . COSMIC . DepMap . gnomAD . GTEx . UniProt . Pfam/InterPro . |
605
+ | bridge off-target + DMS (Perry 2025) . anti-vector + anti-PEG serosurveys (immunology) |
606
+ +----------------------------------------------------------------------------------------------------+
557
607
  ```
558
608
 
609
+ **Reading the loop.** A *goal* enters at the top. The **generative designer** (v5.8) proposes candidate
610
+ writing systems; the **twin** (v5.9) predicts their calibrated outcomes; the **experiment designer** (v5.10)
611
+ chooses the most informative ones to test; the **Guardian** (v5.7) refuses anything hazardous; the **build
612
+ interface** (v5.11) exports a safety-gated protocol DRAFT and ingests results through the v4.5 gate; and
613
+ **continual learning** (v5.12) recalibrates, drift-aware, versioned and reversible. Each stage is gated by the
614
+ **verifier** — the single discriminator that keeps the whole loop honest. Two **faces** sit on top: a
615
+ **co-scientist** that drives the loop for a working scientist, and the **Genome-Writing Challenge**, an open
616
+ held-out benchmark others build to.
617
+
559
618
  ## How it works
560
619
 
561
- PEN-STACK is organised as **two reference layers + one engine + a services layer**.
620
+ PEN-STACK is organised as **the data + reference layers, the oracle mesh, the verifier (the discriminator), the
621
+ closed loop, and the faces** — each layer below feeding the one above, with the verifier keeping the whole loop
622
+ honest.
562
623
 
563
624
  | Component | Module | Role | Status |
564
625
  |---|---|---|---|
@@ -569,6 +630,16 @@ PEN-STACK is organised as **two reference layers + one engine + a services layer
569
630
  | **Delivery immunology** (v5.1-5.6) | `pen_stack.planner.delivery_immunology` + `{genotoxicity,capsid_epitope,seroprevalence,antipeg}_oracle`, `innate_sensing`, `immune_profile`; `validate.immune_calibration` | safety↔efficacy balance over the 8-vehicle palette; immune axes **computed/grounded from data+sequence** + anti-PEG (gates LNP re-dosing) → a unified per-axis `Verdict.immune_profile` (each axis validated-or-proxy, never collapsed); magnitude + patient titer stay known-unknowns ([docs](docs/delivery_immunology.md)) | M2 |
570
631
  | **Agentic platform** | `pen_stack.agent` | goal to cited, auditable plan; MCP server; one-command deploy | Paper 3 |
571
632
  | **Bridge off-target engine** | `pen_stack.bridge` | "CRISPOR for bridge recombinases" + guide QC (v3.1) | Paper 4 |
633
+ | **Oracle Mesh** (v4.0) | `pen_stack.oracles` | one `OracleResult` contract over AF3/Boltz-2/Chai-1/ESM3/Evo2/AlphaGenome/STATE/scGPT; OOD-gated; generative=candidate | v4.0 |
634
+ | **World-Model Graph** (v4.5) | `pen_stack.graph` | living knowledge graph; typed provenanced edges; gated propose-only loop | v4.5 |
635
+ | **The Verifier** (v3.3+) | `pen_stack.verify` | `verify(design) -> Verdict`: legality + **safety** + calibrated confidence + immune profile — the discriminator | v3.3 |
636
+ | **The Guardian** (v5.7) | `pen_stack.safety` | biosecurity / dual-use gate; runs first in `verify()`; refuse short-circuits; tamper-evident audit | v5.7 |
637
+ | **Generative Designer** (v5.8) | `pen_stack.design` | generate → verifier-as-discriminator (hazardous/illegal discarded); Pareto with grounded immune axis | v5.8 |
638
+ | **Digital Twin** (v5.9) | `pen_stack.twin` | calibrated, OOD-gated outcome prediction; immune-outcome from v5.6; phenotype-bounded | v5.9 |
639
+ | **Experiment Designer** (v5.10) | `pen_stack.active` | active learning (EIG + immune-VOI); retrospective active-vs-random (reps+CI) | v5.10 |
640
+ | **Build Interface** (v5.11) | `pen_stack.build` | safety-gated protocol export (DRAFT + immune metadata); gated ingestion; sim-lab | v5.11 |
641
+ | **The Closed Loop** (v5.12) | `pen_stack.loop` | one gated DBTL command; autonomy **Level 3**; drift-aware; versioned/reversible continual learning | v5.12 |
642
+ | **Co-Scientist + Challenge** (v5.13) | `pen_stack.agent.co_scientist`, `benchmarks/genome_writing_challenge` | the co-scientist drives the loop; the public held-out benchmark others build to | v5.13 |
572
643
  | **Genome-Writing Bench** (v3.1) | `benchmarks/`, `bench/run.py` | first writing-side benchmark; deterministic scorers, leaderboard | M2 |
573
644
  | **PEN-Agent** (v3.1) | `pen_stack.agent.pen_agent` | grounded write-planning state machine; zero fabrication | M2 |
574
645
  | **3D structural risk** (v3.1) | `pen_stack.wgenome.structure3d` | AlphaGenome contact-map deltas as a safety axis | M1 |
@@ -728,12 +799,16 @@ pen-stack/
728
799
  │ │ v5.11 protocol_safety (build-interface hard-gate: cleared exports w/ immune metadata · hazard+illegal blocked · sim loop completes) /
729
800
  │ │ v5.12 closed_loop (loop-integrity hard-gate: gated end-to-end run · Level-3 human-in-control · drift detection · versioned/reversible continual learning)
730
801
  │ ├── data/ ingestion (genome, chromatin, integration, TRIP, safety annotations)
731
- │ ├── server/api.py FastAPI REST (atlas, crosslink, writable, plan, bridge, ask)
802
+ │ ├── 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)
804
+ │ ├── 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})
732
805
  │ ├── ui/app.py Streamlit web app (16 pages; v3.2 PEN-Agent shows confidence + epistemic status)
733
806
  │ └── cli.py unified CLI
734
807
  ├── benchmarks/genome_writing_bench/ Genome-Writing Bench v0.3.8 (T1-T16 + co_scientist + safety_screening + generative_design + outcome_prediction + experiment_design + protocol_safety + closed_loop; tasks / harness / solvers / LEADERBOARD / SHAs)
735
808
  ├── benchmarks/genome_writing_challenge/ v5.13 the public Genome-Writing Challenge (held-out rounds + immune-risk task + submission API; harness / run / README / SUBMISSIONS)
736
809
  ├── bench/run.py one-command bench entrypoint (--agent, --verify)
810
+ ├── examples/ v6.1 runnable golden path: external_agent.py (REST) / mcp_client.py (MCP) / agent_tools.py (framework-agnostic tool specs from the live manifest + dispatcher)
811
+ ├── web/ v6.2 the Web Platform frontend (React/Vite + Tailwind): honest-UX library (ConfidenceBand/ProvenanceChip/ScopeLedger/SafetyBadge/ImmuneProfileCard) + 11 feature pages + the grounded co-scientist chat; built by docker/web.Dockerfile (node:20 stage)
737
812
  ├── scripts/ reproducible pipeline drivers (p1_*, p2_*, p4_*, p52/p53 delivery-immunology oracle builds, ws_*_report)
738
813
  ├── configs/ pinned datasets + thresholds + curation (YAML); v3.2 known_unknowns /
739
814
  │ target_sites / delivery_constraints; v5.1-5.6 delivery_vehicles immune_safety /
@@ -741,19 +816,26 @@ pen-stack/
741
816
  │ seroprevalence / antipeg + oracles/scope_cards (+ v5.6 known_unknowns:
742
817
  │ cd4_mhcii_help / preexisting_capsid_tcell / complement_carpa);
743
818
  │ v5.7 safety/{hazard_registry,policy,probes} (Guardian; function/family/taxon-level only)
744
- ├── prereg/ SHA-locked success criteria (paper1..4 + ws_a..ws_h + v3.2-v5.9 ws_{uq,ep,mc,ba,
819
+ ├── prereg/ SHA-locked success criteria (paper1..4 + ws_a..ws_h + v3.2-v6.0 ws_{uq,ep,mc,ba,
745
820
  │ r,v,route,env,bench,cal,o,wv,atlas,graph,mon,ct,plan,crit,cite,immune,
746
821
  │ genotox,epitope,innate,seroprev,peg,calib,profile,screen,policy,redteam,
747
822
  │ gen,pareto,orch,vcell,mech,outcome,twincal,acq,aldesign,alvalidate,
748
- │ proto,ingest,simlab,loop,continual,drift,challenge,cosci2} + SHA256 locks)
823
+ │ proto,ingest,simlab,loop,continual,drift,challenge,cosci2,
824
+ │ manifest,openapi,mcp,chat,frontend} + SHA256 locks)
749
825
  ├── data/curated/ small committed tables (universe, gene coords, measured bridge profile,
750
826
  │ v3.2 bridge_offtarget_energetics.json)
751
827
  ├── data/llm_bench_cache/ 28 cached ungrounded-LLM transcripts (T7, offline/CI replay)
752
828
  ├── data/alphagenome_cache/ cached AlphaGenome predictions (tracks + contact maps; offline reproducibility)
753
829
  ├── tests/unit/ unit + regression + blind-validation suite
754
830
  ├── docs/ mkdocs site (cards, tutorials, INFRA, DEPLOY, MCP);
755
- │ v3.2: uncertainty.md / scope.md / mechanistic_constraints.md / BACKLOG.md
756
- ├── docker/ CUDA image + UI image + pinned requirements
831
+ │ v3.2: uncertainty.md / scope.md / mechanistic_constraints.md / BACKLOG.md;
832
+ │ v4.0-4.5: oracles.md / writer_verification.md / world_model.md;
833
+ │ v5.0-5.6: co_scientist.md / delivery_immunology.md;
834
+ │ v5.7-v6.0 (the closed loop): responsible_use.md / biosecurity.md /
835
+ │ generative_design.md / digital_twin.md / experiment_design.md /
836
+ │ build_interface.md / closed_loop.md / autonomy.md / challenge.md /
837
+ │ co_scientist_loop.md / integrations.md / STABILITY.md (1.0 API freeze)
838
+ ├── docker/ CUDA image + UI image + v6.2 web.Dockerfile (multi-stage: node:20 frontend build → slim Python gateway) + pinned requirements
757
839
  ├── tools/penctl.py laptop<->VM orchestrator (paramiko SSH/SFTP, Docker-only)
758
840
  ├── docker-compose.yml one-command self-hostable platform
759
841
  └── pyproject.toml CITATION.cff CHANGELOG.md LICENSE
@@ -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.0.0-blue.svg)](CHANGELOG.md)
18
+ [![Version](https://img.shields.io/badge/version-6.2.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-354%20passing-success.svg)](tests/)
20
+ [![Tests](https://img.shields.io/badge/tests-368%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,44 @@ 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.2 — The Web Platform (the human surface)
77
+
78
+ Post-1.0, the adoption surface for **bench scientists**: a complete, friendly **web application** — a grounded
79
+ co-scientist chat plus structured feature pages — over the same typed v6.1 API the AI surface uses. The LLM
80
+ **narrates and routes but never sources a number**; every quantitative answer renders with its confidence band,
81
+ its provenance, and an explicit ledger of what PEN-STACK *can't* tell you.
82
+
83
+ | Workstream | What it adds | Result |
84
+ |---|---|---|
85
+ | **BACKEND** | `pen_stack/web/server.py` | one FastAPI gateway that mounts the v6.1 engine surface (under `/api`) + adds the grounded `/chat` (+ SSE `/chat/stream`) + CORS + serves the built frontend |
86
+ | **CHAT** *(the hard gate)* | `pen_stack/web/{tools,llm}.py` | the grounded co-scientist: the **engine** computes every number (`run_tools`), the LLM narrates over the tool results (**Ollama → Nemotron → deterministic**), and a **grounding guard strikes any number the model can't trace to a tool result** (asserted in `tests/unit/test_ws_chat.py`) |
87
+ | **FRONTEND** | `web/` (React/Vite + Tailwind) | the **honest-UX library** — `ConfidenceBand · ProvenanceChip · ScopeLedger · SafetyBadge · ImmuneProfileCard` — so a number is never shown without its uncertainty + provenance |
88
+ | **PAGES** | 11 feature pages | Co-Scientist · Site Finder · Writer Atlas · Designer · Verify · Delivery & Immunity · Digital Twin · Guardian · Experiments · Challenge · Scope & About |
89
+ | **DEPLOY** | `docker/web.Dockerfile` + compose | **one-command self-host**: a `node:20` stage builds the frontend, a slim Python serves UI + API from one origin — `docker compose up web ollama`, open `http://localhost:8000` |
90
+
91
+ **The LLM never sources a number** — it explains, compares, and routes over the engine's tool outputs, and the
92
+ science runs (deterministic mode) with no LLM at all. See [`web/README.md`](web/README.md) and
93
+ `prereg/ws_{chat,frontend}.yaml`. (Lowers the usability barrier; a real-data validation + a first lab user remain
94
+ the standing bottleneck — no new science.)
95
+
96
+ ## What is new in v6.1 — The AI Integration Surface
97
+
98
+ Post-1.0, the adoption surface for **AI builders**: PEN-STACK is now **self-describing** — an external agent can
99
+ ask, programmatically, *"what can you do, and what do you refuse to answer?"* and get a typed, honest answer it can
100
+ route on.
101
+
102
+ | Workstream | What it adds | Result |
103
+ |---|---|---|
104
+ | **MANIFEST** *(the differentiator)* | `pen_stack/api/manifest.py` | `capability_manifest()` (tools, all `fabricates=False`) + **`scope_manifest()`** — the known-unknowns + oracle scope cards as **machine-readable data** (what PEN-STACK *refuses* to answer) |
105
+ | **OPENAPI** | `server/api.py` | `GET /capabilities` + `GET /scope` + tool routes (`/verify /safety /immune /generate /predict /suggest /session`); auto **OpenAPI 3.1** at `/openapi.json` |
106
+ | **MCP** | `agent/mcp_server.py` | resources `pen-stack://capabilities` + `pen-stack://scope`; engine tools; a hazardous design returns a **structured refusal** |
107
+ | **EXAMPLE** | `examples/` | golden-path `external_agent.py` (REST), `mcp_client.py` (MCP), `agent_tools.py` (framework specs built from the live manifest + dispatcher) |
108
+
109
+ **Scope is data, not a disclaimer** — the honesty machinery becomes an API, the thing that makes trustworthy
110
+ autonomy something another system can build on. See [Integrate PEN-STACK in your AI](docs/integrations.md) and
111
+ `prereg/ws_{manifest,openapi,mcp}.yaml`. (Lowers the adoption barrier; outreach + a real result remain the
112
+ standing bottleneck — no new science.)
113
+
76
114
  ## What is new in v5.13 — The Standard (Genome-Writing Challenge + Co-Scientist II)
77
115
 
78
116
  v5.13 (**Closed-Loop arc, Cycle 7 of 7**) makes PEN-STACK the field's reference and its most useful face: the
@@ -445,45 +483,68 @@ benchmark with deterministic scorers and no circular labels. See
445
483
 
446
484
  ## Architecture
447
485
 
486
+ At **1.0**, PEN-STACK is a **closed design→build→test→learn loop** standing on two reference layers, the oracle
487
+ mesh, and the data foundation — with **the verifier at the centre as the discriminator**: nothing is generated,
488
+ built, or learned unless it passes *safe + legal + calibrated*, and no number is fabricated. The loop stops
489
+ deliberately at **autonomy Level 3** (a human in control at every gate).
490
+
448
491
  ```
449
- +-------------------------------------------+
450
- | WRITE PLANNER (engine) |
451
- | inverse design: destination x writer |
452
- | x cargo/guide x delivery -> ranked plan |
453
- +----------------^-------------^-------------+
454
- | |
455
- +-------------------------+--+ +---+------------------------+
456
- | WRITABLE GENOME (B) | | WRITER ATLAS (A) |
457
- | flagship reference |<---->| companion reference |
458
- | | reach| |
459
- | - Safety layer (learned) | ability - Family targeting KB |
460
- | - Durability layer (learned)| | - Measured scoring axes |
461
- | - Reachability layer -----+------+ - Mechanism classifier |
462
- | -> writability profile | | - DMS variant model |
463
- +-------------------------^--+ +---+------------------------+
464
- | |
465
- +----------------------------------+-------------+-------------------------+
466
- | DATA FOUNDATION (bulk-downloadable) |
467
- | hg38 . ENCODE/Roadmap chromatin . Hi-C/LADs . TRIP position effects . |
468
- | RID/VISDB/MLV integration sites . clinical genotoxic CIS . COSMIC . |
469
- | DepMap . gnomAD . GTEx . UniProt . Pfam/InterPro . bridge-recombinase |
470
- | off-target + DMS (Perry 2025) |
471
- +-------------------------------------------------------------------------+
472
-
473
- Delivery immunology (v5.1-5.6, feeds the planner): a safety<->efficacy balance over the 8-vehicle palette,
474
- with the immune/safety axes computed/grounded from data + sequence (genotoxicity = VISDB x COSMIC;
475
- adaptive/CD8 = MHCflurry over the capsid; innate = CpG/dsRNA of the cargo; pre-existing/NAb = serosurveys;
476
- anti-PEG = serosurveys, gates LNP re-dosing) -> a unified per-axis immune-risk PROFILE (Verdict.immune_profile),
477
- each axis labelled validated-or-proxy (WS-CALIB), never collapsed into one number; in-vivo magnitude + patient
478
- titer stay declared known-unknowns.
479
-
480
- Platform services (on top of the validated core): PEN-MONITOR (Europe PMC living database),
481
- grounded RAG/Q&A, a tool-using agent + MCP server, and a Streamlit web app.
492
+ +-----------------------------------------------------------------------+
493
+ | THE FACES (v5.13 / 1.0) |
494
+ | Co-Scientist (drives the loop) . Genome-Writing Challenge (held-out) |
495
+ | . MCP server . REST API . Streamlit web app |
496
+ +-----------------------------------^-----------------------------------+
497
+ |
498
+ +----------------------------------------------------+---------------------------------------------------+
499
+ | THE CLOSED LOOP (v5.12 - autonomy Level 3; a human in control at safety / build / belief-admission) |
500
+ | |
501
+ | GENERATE ----> PREDICT ----> DECIDE ----> [ SAFETY ] ----> BUILD ----> INGEST ----> LEARN |
502
+ | v5.8 v5.9 v5.10 v5.7 v5.11 v4.5 gate v5.12 |
503
+ | generative digital experiment GUARDIAN protocol (no auto- continual |
504
+ | designer twin designer gate export edit) + drift |
505
+ | (Pareto) (OOD-gated) (EIG+immVOI) (refuse=stop) (DRAFT) (versioned) |
506
+ | |
507
+ | Every candidate is DISCARDED unless it passes THE VERIFIER below. No number is fabricated. |
508
+ +----------------------------------------------------+---------------------------------------------------+
509
+ |
510
+ +-----------------------------------v-----------------------------------+
511
+ | THE VERIFIER verify(design) -> Verdict (the discriminator) |
512
+ | legality (v3.3 rules) . SAFETY gate (v5.7, runs first) . |
513
+ | calibrated confidence (v3.2) . per-axis immune-risk profile (v5.6) |
514
+ +-----------------------------------^-----------------------------------+
515
+ |
516
+ +--------------------------------+-------------------+----------------+--------------------------------+
517
+ | WRITABLE GENOME (Paper 1) | WRITER ATLAS (Paper 2) | ORACLE MESH (v4.0) |
518
+ | learned safety x durability | 33,370 systems on measured axes | AF3 . Boltz-2 . Chai-1 . ESM3 |
519
+ | x reachability | + Writer-Targeting KB (8 families)| . Evo2 . AlphaGenome . RFdiff. |
520
+ | -> writability profile | <----- reachability -----> | ProteinMPNN . v5.9 STATE/scGPT |
521
+ | + WRITE PLANNER (Paper 3) | + BRIDGE OFF-TARGET ENGINE (P4) | one OracleResult contract, |
522
+ | inverse design (edit_intent)| | OOD-gated, generative=candidate|
523
+ | + DELIVERY IMMUNOLOGY (v5.1-6) per-axis immune-risk profile (each axis validated-or-proxy, never collapsed) |
524
+ | + WORLD-MODEL GRAPH (v4.5) typed provenanced edges, gated living loop (propose-only) |
525
+ +--------------------------------+------------------------------------+--------------------------------+
526
+ +----------------------------------------------------------------------------------------------------+
527
+ | DATA FOUNDATION (bulk-downloadable, public) |
528
+ | hg38 . ENCODE/Roadmap chromatin . Hi-C/LADs . TRIP position effects . RID/VISDB/MLV integration . |
529
+ | clinical genotoxic CIS . COSMIC . DepMap . gnomAD . GTEx . UniProt . Pfam/InterPro . |
530
+ | bridge off-target + DMS (Perry 2025) . anti-vector + anti-PEG serosurveys (immunology) |
531
+ +----------------------------------------------------------------------------------------------------+
482
532
  ```
483
533
 
534
+ **Reading the loop.** A *goal* enters at the top. The **generative designer** (v5.8) proposes candidate
535
+ writing systems; the **twin** (v5.9) predicts their calibrated outcomes; the **experiment designer** (v5.10)
536
+ chooses the most informative ones to test; the **Guardian** (v5.7) refuses anything hazardous; the **build
537
+ interface** (v5.11) exports a safety-gated protocol DRAFT and ingests results through the v4.5 gate; and
538
+ **continual learning** (v5.12) recalibrates, drift-aware, versioned and reversible. Each stage is gated by the
539
+ **verifier** — the single discriminator that keeps the whole loop honest. Two **faces** sit on top: a
540
+ **co-scientist** that drives the loop for a working scientist, and the **Genome-Writing Challenge**, an open
541
+ held-out benchmark others build to.
542
+
484
543
  ## How it works
485
544
 
486
- PEN-STACK is organised as **two reference layers + one engine + a services layer**.
545
+ PEN-STACK is organised as **the data + reference layers, the oracle mesh, the verifier (the discriminator), the
546
+ closed loop, and the faces** — each layer below feeding the one above, with the verifier keeping the whole loop
547
+ honest.
487
548
 
488
549
  | Component | Module | Role | Status |
489
550
  |---|---|---|---|
@@ -494,6 +555,16 @@ PEN-STACK is organised as **two reference layers + one engine + a services layer
494
555
  | **Delivery immunology** (v5.1-5.6) | `pen_stack.planner.delivery_immunology` + `{genotoxicity,capsid_epitope,seroprevalence,antipeg}_oracle`, `innate_sensing`, `immune_profile`; `validate.immune_calibration` | safety↔efficacy balance over the 8-vehicle palette; immune axes **computed/grounded from data+sequence** + anti-PEG (gates LNP re-dosing) → a unified per-axis `Verdict.immune_profile` (each axis validated-or-proxy, never collapsed); magnitude + patient titer stay known-unknowns ([docs](docs/delivery_immunology.md)) | M2 |
495
556
  | **Agentic platform** | `pen_stack.agent` | goal to cited, auditable plan; MCP server; one-command deploy | Paper 3 |
496
557
  | **Bridge off-target engine** | `pen_stack.bridge` | "CRISPOR for bridge recombinases" + guide QC (v3.1) | Paper 4 |
558
+ | **Oracle Mesh** (v4.0) | `pen_stack.oracles` | one `OracleResult` contract over AF3/Boltz-2/Chai-1/ESM3/Evo2/AlphaGenome/STATE/scGPT; OOD-gated; generative=candidate | v4.0 |
559
+ | **World-Model Graph** (v4.5) | `pen_stack.graph` | living knowledge graph; typed provenanced edges; gated propose-only loop | v4.5 |
560
+ | **The Verifier** (v3.3+) | `pen_stack.verify` | `verify(design) -> Verdict`: legality + **safety** + calibrated confidence + immune profile — the discriminator | v3.3 |
561
+ | **The Guardian** (v5.7) | `pen_stack.safety` | biosecurity / dual-use gate; runs first in `verify()`; refuse short-circuits; tamper-evident audit | v5.7 |
562
+ | **Generative Designer** (v5.8) | `pen_stack.design` | generate → verifier-as-discriminator (hazardous/illegal discarded); Pareto with grounded immune axis | v5.8 |
563
+ | **Digital Twin** (v5.9) | `pen_stack.twin` | calibrated, OOD-gated outcome prediction; immune-outcome from v5.6; phenotype-bounded | v5.9 |
564
+ | **Experiment Designer** (v5.10) | `pen_stack.active` | active learning (EIG + immune-VOI); retrospective active-vs-random (reps+CI) | v5.10 |
565
+ | **Build Interface** (v5.11) | `pen_stack.build` | safety-gated protocol export (DRAFT + immune metadata); gated ingestion; sim-lab | v5.11 |
566
+ | **The Closed Loop** (v5.12) | `pen_stack.loop` | one gated DBTL command; autonomy **Level 3**; drift-aware; versioned/reversible continual learning | v5.12 |
567
+ | **Co-Scientist + Challenge** (v5.13) | `pen_stack.agent.co_scientist`, `benchmarks/genome_writing_challenge` | the co-scientist drives the loop; the public held-out benchmark others build to | v5.13 |
497
568
  | **Genome-Writing Bench** (v3.1) | `benchmarks/`, `bench/run.py` | first writing-side benchmark; deterministic scorers, leaderboard | M2 |
498
569
  | **PEN-Agent** (v3.1) | `pen_stack.agent.pen_agent` | grounded write-planning state machine; zero fabrication | M2 |
499
570
  | **3D structural risk** (v3.1) | `pen_stack.wgenome.structure3d` | AlphaGenome contact-map deltas as a safety axis | M1 |
@@ -653,12 +724,16 @@ pen-stack/
653
724
  │ │ v5.11 protocol_safety (build-interface hard-gate: cleared exports w/ immune metadata · hazard+illegal blocked · sim loop completes) /
654
725
  │ │ v5.12 closed_loop (loop-integrity hard-gate: gated end-to-end run · Level-3 human-in-control · drift detection · versioned/reversible continual learning)
655
726
  │ ├── data/ ingestion (genome, chromatin, integration, TRIP, safety annotations)
656
- │ ├── server/api.py FastAPI REST (atlas, crosslink, writable, plan, bridge, ask)
727
+ │ ├── 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)
729
+ │ ├── 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})
657
730
  │ ├── ui/app.py Streamlit web app (16 pages; v3.2 PEN-Agent shows confidence + epistemic status)
658
731
  │ └── cli.py unified CLI
659
732
  ├── benchmarks/genome_writing_bench/ Genome-Writing Bench v0.3.8 (T1-T16 + co_scientist + safety_screening + generative_design + outcome_prediction + experiment_design + protocol_safety + closed_loop; tasks / harness / solvers / LEADERBOARD / SHAs)
660
733
  ├── benchmarks/genome_writing_challenge/ v5.13 the public Genome-Writing Challenge (held-out rounds + immune-risk task + submission API; harness / run / README / SUBMISSIONS)
661
734
  ├── bench/run.py one-command bench entrypoint (--agent, --verify)
735
+ ├── examples/ v6.1 runnable golden path: external_agent.py (REST) / mcp_client.py (MCP) / agent_tools.py (framework-agnostic tool specs from the live manifest + dispatcher)
736
+ ├── web/ v6.2 the Web Platform frontend (React/Vite + Tailwind): honest-UX library (ConfidenceBand/ProvenanceChip/ScopeLedger/SafetyBadge/ImmuneProfileCard) + 11 feature pages + the grounded co-scientist chat; built by docker/web.Dockerfile (node:20 stage)
662
737
  ├── scripts/ reproducible pipeline drivers (p1_*, p2_*, p4_*, p52/p53 delivery-immunology oracle builds, ws_*_report)
663
738
  ├── configs/ pinned datasets + thresholds + curation (YAML); v3.2 known_unknowns /
664
739
  │ target_sites / delivery_constraints; v5.1-5.6 delivery_vehicles immune_safety /
@@ -666,19 +741,26 @@ pen-stack/
666
741
  │ seroprevalence / antipeg + oracles/scope_cards (+ v5.6 known_unknowns:
667
742
  │ cd4_mhcii_help / preexisting_capsid_tcell / complement_carpa);
668
743
  │ v5.7 safety/{hazard_registry,policy,probes} (Guardian; function/family/taxon-level only)
669
- ├── prereg/ SHA-locked success criteria (paper1..4 + ws_a..ws_h + v3.2-v5.9 ws_{uq,ep,mc,ba,
744
+ ├── prereg/ SHA-locked success criteria (paper1..4 + ws_a..ws_h + v3.2-v6.0 ws_{uq,ep,mc,ba,
670
745
  │ r,v,route,env,bench,cal,o,wv,atlas,graph,mon,ct,plan,crit,cite,immune,
671
746
  │ genotox,epitope,innate,seroprev,peg,calib,profile,screen,policy,redteam,
672
747
  │ gen,pareto,orch,vcell,mech,outcome,twincal,acq,aldesign,alvalidate,
673
- │ proto,ingest,simlab,loop,continual,drift,challenge,cosci2} + SHA256 locks)
748
+ │ proto,ingest,simlab,loop,continual,drift,challenge,cosci2,
749
+ │ manifest,openapi,mcp,chat,frontend} + SHA256 locks)
674
750
  ├── data/curated/ small committed tables (universe, gene coords, measured bridge profile,
675
751
  │ v3.2 bridge_offtarget_energetics.json)
676
752
  ├── data/llm_bench_cache/ 28 cached ungrounded-LLM transcripts (T7, offline/CI replay)
677
753
  ├── data/alphagenome_cache/ cached AlphaGenome predictions (tracks + contact maps; offline reproducibility)
678
754
  ├── tests/unit/ unit + regression + blind-validation suite
679
755
  ├── docs/ mkdocs site (cards, tutorials, INFRA, DEPLOY, MCP);
680
- │ v3.2: uncertainty.md / scope.md / mechanistic_constraints.md / BACKLOG.md
681
- ├── docker/ CUDA image + UI image + pinned requirements
756
+ │ v3.2: uncertainty.md / scope.md / mechanistic_constraints.md / BACKLOG.md;
757
+ │ v4.0-4.5: oracles.md / writer_verification.md / world_model.md;
758
+ │ v5.0-5.6: co_scientist.md / delivery_immunology.md;
759
+ │ v5.7-v6.0 (the closed loop): responsible_use.md / biosecurity.md /
760
+ │ generative_design.md / digital_twin.md / experiment_design.md /
761
+ │ build_interface.md / closed_loop.md / autonomy.md / challenge.md /
762
+ │ co_scientist_loop.md / integrations.md / STABILITY.md (1.0 API freeze)
763
+ ├── docker/ CUDA image + UI image + v6.2 web.Dockerfile (multi-stage: node:20 frontend build → slim Python gateway) + pinned requirements
682
764
  ├── tools/penctl.py laptop<->VM orchestrator (paramiko SSH/SFTP, Docker-only)
683
765
  ├── docker-compose.yml one-command self-hostable platform
684
766
  └── pyproject.toml CITATION.cff CHANGELOG.md LICENSE