pen-stack 6.12.0__tar.gz → 6.14.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.
- {pen_stack-6.12.0 → pen_stack-6.14.0}/CHANGELOG.md +70 -1
- {pen_stack-6.12.0 → pen_stack-6.14.0}/CITATION.cff +1 -1
- {pen_stack-6.12.0 → pen_stack-6.14.0}/PKG-INFO +3 -1
- pen_stack-6.14.0/benchmarks/oracle/SHA256SUMS +5 -0
- pen_stack-6.14.0/benchmarks/writespec/SHA256SUMS +4 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/configs/oracles/execution.yaml +8 -0
- pen_stack-6.14.0/configs/oracles/reliability.yaml +92 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/configs/oracles/scope_cards.yaml +13 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/docs/offtarget.md +4 -2
- pen_stack-6.14.0/docs/oracle_mesh.md +64 -0
- pen_stack-6.14.0/docs/writespec_bench.md +44 -0
- pen_stack-6.14.0/docs/writespec_profile.md +58 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack/__init__.py +1 -1
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack/agent/mcp_server.py +32 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack/api/manifest.py +13 -0
- pen_stack-6.14.0/pen_stack/oracles/affinity.py +116 -0
- pen_stack-6.14.0/pen_stack/oracles/reliability.py +64 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack/oracles/status.py +20 -7
- pen_stack-6.14.0/pen_stack/oracles/structure_run.py +76 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack/server/api.py +24 -0
- pen_stack-6.14.0/pen_stack/spec/__init__.py +18 -0
- pen_stack-6.14.0/pen_stack/spec/clarify.py +42 -0
- pen_stack-6.14.0/pen_stack/spec/extract.py +232 -0
- pen_stack-6.14.0/pen_stack/spec/resolvers/__init__.py +17 -0
- pen_stack-6.14.0/pen_stack/spec/resolvers/cell.py +51 -0
- pen_stack-6.14.0/pen_stack/spec/resolvers/chem.py +32 -0
- pen_stack-6.14.0/pen_stack/spec/resolvers/feature.py +36 -0
- pen_stack-6.14.0/pen_stack/spec/resolvers/gene.py +43 -0
- pen_stack-6.14.0/pen_stack/spec/resolvers/locus.py +29 -0
- pen_stack-6.14.0/pen_stack/spec/resolvers/phenotype.py +37 -0
- pen_stack-6.14.0/pen_stack/spec/satisfy.py +114 -0
- pen_stack-6.14.0/pen_stack/spec/service.py +33 -0
- pen_stack-6.14.0/pen_stack/spec/writespec.py +244 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack/wgenome/offtarget_predict.py +4 -2
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack.egg-info/PKG-INFO +3 -1
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack.egg-info/SOURCES.txt +26 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack.egg-info/requires.txt +3 -0
- pen_stack-6.14.0/prereg/SHA256_LOCK_ws_oracle.json +8 -0
- pen_stack-6.14.0/prereg/SHA256_LOCK_ws_writespec.json +8 -0
- pen_stack-6.14.0/prereg/ws_oracle.yaml +45 -0
- pen_stack-6.14.0/prereg/ws_writespec.yaml +50 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pyproject.toml +2 -1
- {pen_stack-6.12.0 → pen_stack-6.14.0}/LICENSE +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/MANIFEST.in +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/README.md +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/bench/run.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/benchmarks/delivery/SHA256SUMS +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/benchmarks/genome_writing_bench/LEADERBOARD.md +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/benchmarks/genome_writing_bench/README.md +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/benchmarks/genome_writing_bench/SHA256SUMS +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/benchmarks/genome_writing_bench/SUBMISSIONS.md +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/benchmarks/genome_writing_bench/tasks.yaml +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/benchmarks/genome_writing_challenge/README.md +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/benchmarks/genome_writing_challenge/SUBMISSIONS.md +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/benchmarks/offtarget/SHA256SUMS +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/benchmarks/position_effect/README.md +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/benchmarks/position_effect/SHA256SUMS +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/benchmarks/verify/SHA256SUMS +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/benchmarks/writer_efficiency/README.md +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/benchmarks/writer_efficiency/SHA256SUMS +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/configs/aav_serotype_tropism.yaml +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/configs/antipeg.yaml +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/configs/atlas_families.yaml +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/configs/bridge_offtarget_profile.yaml +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/configs/calibration/preexisting_nab_independent.yaml +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/configs/capsid_epitope_oracle.yaml +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/configs/capsid_sequences.fasta +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/configs/cargo_polish.yaml +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/configs/cell_types.yaml +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/configs/datasets.yaml +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/configs/delivery_constraints.yaml +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/configs/delivery_rules.yaml +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/configs/delivery_vehicles.yaml +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/configs/expression/modifiers.yaml +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/configs/expression/promoters.yaml +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/configs/gates_v3.yaml +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/configs/genotoxicity_oracle.yaml +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/configs/gsh_validated_heldout.yaml +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/configs/intent_weights.yaml +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/configs/known_unknowns.yaml +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/configs/llm.yaml +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/configs/metric_guide.yaml +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/configs/mhc_epitope_oracle.yaml +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/configs/monitor_queries.yaml +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/configs/rules/delivery.yaml +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/configs/rules/fold.yaml +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/configs/rules/multiplex.yaml +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/configs/rules/payload.yaml +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/configs/rules/reachability.yaml +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/configs/safety/hazard_registry.yaml +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/configs/safety/policy.yaml +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/configs/safety/probes.yaml +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/configs/score_axes.yaml +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/configs/seroprevalence.yaml +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/configs/target_sites.yaml +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/configs/universe_crosswalk.yaml +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/configs/write_types.yaml +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/configs/writer_sequences.fasta +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/configs/wtkb_curated.yaml +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/data/curated/bridge_offtarget_energetics.json +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/data/curated/bridge_offtarget_profile_measured.parquet +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/data/curated/gene_coords.parquet +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/data/curated/unified_editor_universe.parquet +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/docs/BACKLOG.md +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/docs/DEPLOY.md +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/docs/INFRA.md +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/docs/MCP.md +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/docs/RELEASING.md +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/docs/REPRO.md +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/docs/STABILITY.md +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/docs/agent.md +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/docs/alphagenome_feasibility.md +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/docs/autonomy.md +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/docs/benchmark_circularity.md +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/docs/biosecurity.md +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/docs/build_interface.md +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/docs/cards/atlas.md +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/docs/cards/durability.md +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/docs/cards/offtarget_data.md +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/docs/cards/position_effect_data.md +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/docs/cards/safety.md +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/docs/cards/writer_efficiency_data.md +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/docs/challenge.md +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/docs/closed_loop.md +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/docs/co_scientist.md +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/docs/co_scientist_loop.md +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/docs/delivery.md +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/docs/delivery_immunology.md +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/docs/delivery_recommender.md +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/docs/digital_twin.md +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/docs/dissemination.md +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/docs/environment.md +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/docs/experiment_design.md +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/docs/generative_design.md +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/docs/immune_profiler.md +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/docs/index.md +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/docs/integrations.md +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/docs/live_oracles.md +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/docs/mechanistic_constraints.md +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/docs/oracles.md +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/docs/position_effect.md +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/docs/positioning.md +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/docs/private_data_formats.md +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/docs/quickstart.md +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/docs/responsible_use.md +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/docs/rule_spec.md +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/docs/rules.md +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/docs/scope.md +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/docs/scorecard.md +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/docs/tpe_bench.md +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/docs/tutorials/compare-families.md +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/docs/tutorials/score-deliverability.md +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/docs/tutorials/where-can-i-write.md +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/docs/tutorials/which-writer-reaches-locus.md +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/docs/uncertainty.md +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/docs/verify.md +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/docs/verify_service.md +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/docs/world_model.md +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/docs/writer_efficiency.md +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/docs/writer_verification.md +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/docs/wtkb.md +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack/_resources.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack/active/__init__.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack/active/acquire.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack/active/design.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack/active/validate.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack/adapt/__init__.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack/adapt/finetune.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack/adapt/ingest.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack/adapt/pipeline.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack/adapt/recalibrate.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack/adapt/report.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack/agent/__init__.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack/agent/cite.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack/agent/co_scientist.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack/agent/epistemic.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack/agent/guardrails.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack/agent/orchestrator.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack/agent/orchestrator_live.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack/agent/pen_agent.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack/agent/scope.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack/agent/tools.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack/api/__init__.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack/atlas/__init__.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack/atlas/build_wtkb.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack/atlas/crosslink.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack/atlas/expand.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack/atlas/guide_design.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack/atlas/schema.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack/atlas/scorecard.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack/atlas/universe.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack/atlas/variant_propose.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack/atlas/writer_efficiency.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack/atlas/writer_predict.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack/atlas/writer_recommend.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack/atlas/writer_verify.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack/bridge/__init__.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack/bridge/activity.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack/bridge/cli.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack/bridge/fold_qc.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack/bridge/guide_qc.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack/bridge/ingest.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack/bridge/offtarget.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack/bridge/offtarget_energetics.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack/bridge/ortholog_screen.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack/bridge/pipeline.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack/build/__init__.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack/build/ingest.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack/build/protocol.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack/build/simlab.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack/cli.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack/data/__init__.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack/data/encode.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack/data/genome.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack/data/ingest_chromatin.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack/data/ingest_integration.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack/data/ingest_safety_annot.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack/data/ingest_trip.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack/design/__init__.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack/design/capsid_generate.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack/design/generate.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack/design/pareto.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack/design/space.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack/design/writer_variants.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack/env/__init__.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack/env/genome_writing_env.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack/env/policies.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack/graph/__init__.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack/graph/build.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack/graph/cell_types.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack/graph/ingest.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack/graph/query.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack/graph/schema.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack/loop/__init__.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack/loop/continual.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack/loop/cycle.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack/loop/drift.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack/mech/__init__.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack/mech/classify_atlas.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack/mech/whitelist.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack/monitor/__init__.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack/monitor/europepmc.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack/monitor/run.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack/monitor/triage.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack/oracles/__init__.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack/oracles/cache.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack/oracles/energetics.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack/oracles/genome.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack/oracles/protein_design.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack/oracles/rna.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack/oracles/schema.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack/oracles/structure.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack/oracles/vcell.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack/planner/__init__.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack/planner/ada_risk.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack/planner/antipeg_oracle.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack/planner/capsid_epitope_oracle.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack/planner/cargo.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack/planner/cargo_polish.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack/planner/delivery.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack/planner/delivery_constraints.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack/planner/delivery_immune.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack/planner/delivery_immunology.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack/planner/delivery_predict.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack/planner/delivery_vehicles.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack/planner/genotoxicity_oracle.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack/planner/immune_mhc2.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack/planner/immune_profile.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack/planner/innate_sensing.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack/planner/multiplex.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack/planner/optimize.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack/planner/pipeline.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack/planner/report.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack/planner/router.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack/planner/seroprevalence_oracle.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack/planner/target_site.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack/rag/__init__.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack/rag/index.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack/rag/llm.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack/rag/qa.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack/rules/__init__.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack/rules/evaluators.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack/rules/loader.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack/rules/schema.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack/rules/solver.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack/rules/spec.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack/safety/__init__.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack/safety/audit.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack/safety/gate.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack/safety/policy.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack/safety/redteam.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack/safety/registry.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack/safety/screen.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack/safety/standards.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack/score/__init__.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack/score/recalibrate.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack/score/therapeutic.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack/server/__init__.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack/twin/__init__.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack/twin/calibrate.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack/twin/data/__init__.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack/twin/data/position_effect.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack/twin/mechanistic.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack/twin/outcome.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack/twin/position_effect.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack/ui/__init__.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack/ui/app.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack/validate/__init__.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack/validate/adapt_demo.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack/validate/agent_eval.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack/validate/bench_adversarial_tasks.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack/validate/bench_coscientist_tasks.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack/validate/bench_graph_tasks.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack/validate/bench_rule_tasks.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack/validate/bench_trust_tasks.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack/validate/bench_writetype_tasks.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack/validate/blind_gsh_discovery.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack/validate/cargo_directionality.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack/validate/closed_loop.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack/validate/durability_baselines.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack/validate/experiment_design.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack/validate/expr_controls.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack/validate/forward_hypotheses.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack/validate/generative_design.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack/validate/guide_qc_demo.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack/validate/heldout_celltype_expr.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack/validate/immune_calibration.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack/validate/intent_specification.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack/validate/known_biology_expr.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack/validate/offtarget_energetics_eval.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack/validate/out_of_scope_refusal.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack/validate/outcome_calibration.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack/validate/outcome_prediction.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack/validate/paper3_benchmark.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack/validate/paper4_real_validation.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack/validate/paper4_validation.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack/validate/protocol_safety.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack/validate/safety_screening.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack/validate/selective_prediction.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack/validate/seq_vs_measured.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack/validate/target_site_controls.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack/validate/uncertainty_eval.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack/validate/ungrounded_baseline.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack/validate/within_locus_ranking.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack/validate/writer_recovery.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack/verify/__init__.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack/verify/proof.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack/verify/schema.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack/verify/service.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack/web/__init__.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack/web/guide.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack/web/llm.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack/web/router.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack/web/server.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack/web/tools.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack/wgenome/__init__.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack/wgenome/chromatin_seq.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack/wgenome/durability.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack/wgenome/export_tracks.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack/wgenome/features.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack/wgenome/gsh_baseline.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack/wgenome/mesh_features.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack/wgenome/offtarget_assay.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack/wgenome/offtarget_data.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack/wgenome/ood.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack/wgenome/providers.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack/wgenome/safety.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack/wgenome/structure3d.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack/wgenome/uncertainty.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack/wgenome/writability.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack.egg-info/dependency_links.txt +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack.egg-info/entry_points.txt +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/pen_stack.egg-info/top_level.txt +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/prereg/SHA256_LOCK_phase0.json +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/prereg/SHA256_LOCK_phase1_5.json +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/prereg/SHA256_LOCK_phase2.json +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/prereg/SHA256_LOCK_phase3.json +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/prereg/SHA256_LOCK_ws_a.json +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/prereg/SHA256_LOCK_ws_acq.json +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/prereg/SHA256_LOCK_ws_aldesign.json +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/prereg/SHA256_LOCK_ws_alvalidate.json +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/prereg/SHA256_LOCK_ws_atlas.json +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/prereg/SHA256_LOCK_ws_b.json +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/prereg/SHA256_LOCK_ws_ba.json +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/prereg/SHA256_LOCK_ws_ba_v33.json +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/prereg/SHA256_LOCK_ws_ba_v45.json +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/prereg/SHA256_LOCK_ws_bench.json +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/prereg/SHA256_LOCK_ws_c.json +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/prereg/SHA256_LOCK_ws_cal.json +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/prereg/SHA256_LOCK_ws_calib.json +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/prereg/SHA256_LOCK_ws_challenge.json +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/prereg/SHA256_LOCK_ws_chat.json +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/prereg/SHA256_LOCK_ws_cite.json +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/prereg/SHA256_LOCK_ws_continual.json +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/prereg/SHA256_LOCK_ws_cosci2.json +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/prereg/SHA256_LOCK_ws_crit.json +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/prereg/SHA256_LOCK_ws_ct.json +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/prereg/SHA256_LOCK_ws_d.json +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/prereg/SHA256_LOCK_ws_delivery.json +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/prereg/SHA256_LOCK_ws_drift.json +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/prereg/SHA256_LOCK_ws_e.json +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/prereg/SHA256_LOCK_ws_env.json +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/prereg/SHA256_LOCK_ws_ep.json +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/prereg/SHA256_LOCK_ws_epitope.json +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/prereg/SHA256_LOCK_ws_expr2.json +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/prereg/SHA256_LOCK_ws_f.json +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/prereg/SHA256_LOCK_ws_frontend.json +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/prereg/SHA256_LOCK_ws_g.json +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/prereg/SHA256_LOCK_ws_gen.json +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/prereg/SHA256_LOCK_ws_genotox.json +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/prereg/SHA256_LOCK_ws_graph.json +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/prereg/SHA256_LOCK_ws_h.json +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/prereg/SHA256_LOCK_ws_hybrid.json +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/prereg/SHA256_LOCK_ws_immune.json +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/prereg/SHA256_LOCK_ws_immune2.json +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/prereg/SHA256_LOCK_ws_ingest.json +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/prereg/SHA256_LOCK_ws_innate.json +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/prereg/SHA256_LOCK_ws_loop.json +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/prereg/SHA256_LOCK_ws_manifest.json +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/prereg/SHA256_LOCK_ws_mc.json +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/prereg/SHA256_LOCK_ws_mcp.json +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/prereg/SHA256_LOCK_ws_mech.json +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/prereg/SHA256_LOCK_ws_mon.json +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/prereg/SHA256_LOCK_ws_o.json +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/prereg/SHA256_LOCK_ws_offtarget.json +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/prereg/SHA256_LOCK_ws_openapi.json +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/prereg/SHA256_LOCK_ws_orch.json +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/prereg/SHA256_LOCK_ws_outcome.json +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/prereg/SHA256_LOCK_ws_pareto.json +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/prereg/SHA256_LOCK_ws_peg.json +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/prereg/SHA256_LOCK_ws_plan.json +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/prereg/SHA256_LOCK_ws_policy.json +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/prereg/SHA256_LOCK_ws_profile.json +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/prereg/SHA256_LOCK_ws_proto.json +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/prereg/SHA256_LOCK_ws_r.json +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/prereg/SHA256_LOCK_ws_redteam.json +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/prereg/SHA256_LOCK_ws_route.json +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/prereg/SHA256_LOCK_ws_screen.json +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/prereg/SHA256_LOCK_ws_seroprev.json +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/prereg/SHA256_LOCK_ws_simlab.json +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/prereg/SHA256_LOCK_ws_twincal.json +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/prereg/SHA256_LOCK_ws_uq.json +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/prereg/SHA256_LOCK_ws_v.json +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/prereg/SHA256_LOCK_ws_vcell.json +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/prereg/SHA256_LOCK_ws_verify.json +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/prereg/SHA256_LOCK_ws_writer.json +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/prereg/SHA256_LOCK_ws_wv.json +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/prereg/paper1.yaml +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/prereg/paper2.yaml +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/prereg/paper3.yaml +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/prereg/paper4.yaml +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/prereg/phase0.yaml +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/prereg/ws_a.yaml +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/prereg/ws_acq.yaml +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/prereg/ws_aldesign.yaml +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/prereg/ws_alvalidate.yaml +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/prereg/ws_atlas.yaml +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/prereg/ws_b.yaml +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/prereg/ws_ba.yaml +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/prereg/ws_ba_v33.yaml +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/prereg/ws_ba_v45.yaml +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/prereg/ws_bench.yaml +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/prereg/ws_c.yaml +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/prereg/ws_cal.yaml +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/prereg/ws_calib.yaml +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/prereg/ws_challenge.yaml +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/prereg/ws_chat.yaml +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/prereg/ws_cite.yaml +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/prereg/ws_continual.yaml +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/prereg/ws_cosci2.yaml +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/prereg/ws_crit.yaml +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/prereg/ws_ct.yaml +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/prereg/ws_d.yaml +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/prereg/ws_delivery.yaml +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/prereg/ws_drift.yaml +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/prereg/ws_e.yaml +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/prereg/ws_env.yaml +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/prereg/ws_ep.yaml +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/prereg/ws_epitope.yaml +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/prereg/ws_expr2.yaml +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/prereg/ws_f.yaml +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/prereg/ws_frontend.yaml +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/prereg/ws_g.yaml +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/prereg/ws_gen.yaml +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/prereg/ws_genotox.yaml +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/prereg/ws_graph.yaml +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/prereg/ws_h.yaml +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/prereg/ws_hybrid.yaml +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/prereg/ws_immune.yaml +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/prereg/ws_immune2.yaml +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/prereg/ws_ingest.yaml +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/prereg/ws_innate.yaml +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/prereg/ws_loop.yaml +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/prereg/ws_manifest.yaml +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/prereg/ws_mc.yaml +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/prereg/ws_mcp.yaml +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/prereg/ws_mech.yaml +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/prereg/ws_mon.yaml +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/prereg/ws_o.yaml +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/prereg/ws_offtarget.yaml +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/prereg/ws_openapi.yaml +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/prereg/ws_orch.yaml +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/prereg/ws_outcome.yaml +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/prereg/ws_pareto.yaml +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/prereg/ws_peg.yaml +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/prereg/ws_plan.yaml +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/prereg/ws_policy.yaml +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/prereg/ws_profile.yaml +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/prereg/ws_proto.yaml +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/prereg/ws_r.yaml +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/prereg/ws_redteam.yaml +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/prereg/ws_route.yaml +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/prereg/ws_screen.yaml +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/prereg/ws_seroprev.yaml +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/prereg/ws_simlab.yaml +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/prereg/ws_twincal.yaml +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/prereg/ws_uq.yaml +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/prereg/ws_v.yaml +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/prereg/ws_vcell.yaml +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/prereg/ws_verify.yaml +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/prereg/ws_writer.yaml +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/prereg/ws_wv.yaml +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/scripts/build_capsid_fitness.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/scripts/calibrate_immune_axes.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/scripts/fetch_licensed_sources.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/scripts/offtarget_chromatin_incremental.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/scripts/offtarget_chromatin_matched.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/scripts/offtarget_chromatin_validation.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/scripts/p1_build_atlas.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/scripts/p1_build_durability.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/scripts/p1_build_position_effect.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/scripts/p1_build_writer_eff.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/scripts/p1_export_tracks.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/scripts/p1_safety_concordance.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/scripts/p1_train_safety.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/scripts/p1_validation_report.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/scripts/p2_build_atlas.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/scripts/p3_benchmark_report.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/scripts/p4_genome_scan.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/scripts/p52_build_genotox_oracle.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/scripts/p53_build_epitope_oracle.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/scripts/ws_b_report.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/scripts/ws_c_report.py +0 -0
- {pen_stack-6.12.0 → pen_stack-6.14.0}/setup.cfg +0 -0
|
@@ -3,6 +3,74 @@
|
|
|
3
3
|
All notable changes to PEN-STACK are documented here. This file follows
|
|
4
4
|
[Keep a Changelog](https://keepachangelog.com/).
|
|
5
5
|
|
|
6
|
+
## [6.14.0] - 2026-06-22 - WriteSpec: a typed, ontology-backed intent layer with a grounded extractor and a feasibility check
|
|
7
|
+
|
|
8
|
+
Replaces the keyword parser with a typed, machine-checkable genome-writing request (an SBOL3 profile), a grounded
|
|
9
|
+
prose-to-spec extractor that labels every inference and never fabricates intent, and a feasibility check. This is
|
|
10
|
+
the agentic front-end: one contract the whole stack consumes. A WriteSpec is a request, not a claim.
|
|
11
|
+
|
|
12
|
+
### Added
|
|
13
|
+
- **The WriteRequest type** (`pen_stack/spec/writespec.py`, `schemas/writespec.json`). A typed model carrying the
|
|
14
|
+
write semantics (write-type, cargo with Sequence-Ontology roles, target gene/locus/att-site/phenotype, cell
|
|
15
|
+
type, constraints) plus a per-field provenance map (explicit / inferred / user / unresolved). Lossless JSON
|
|
16
|
+
round-trip; SBOL3 round-trip via the real `sbol3` library (the `[spec]` extra; native Components + SO roles for
|
|
17
|
+
interoperability); GenBank export for a cargo with a sequence; and `to_legacy_design`, the adapter that lets
|
|
18
|
+
every existing stage consume a WriteRequest without a rewrite.
|
|
19
|
+
- **Vocabulary resolvers** (`pen_stack/spec/resolvers/`). Free text to canonical id: HGNC genes (atlas-grounded),
|
|
20
|
+
Cellosaurus / Cell Ontology cell types, Sequence Ontology feature roles, MONDO phenotypes, ChEBI molecules,
|
|
21
|
+
GRCh38 coordinates. Every curated id was verified against the live ontology services before commit; an
|
|
22
|
+
unresolved term stays null, never invented.
|
|
23
|
+
- **Grounded extractor + clarifying-question planner** (`pen_stack/spec/extract.py`, `clarify.py`). A
|
|
24
|
+
deterministic backbone (so the benchmark is reproducible) that labels every inferred field, asks a clarifying
|
|
25
|
+
question for anything underspecified or ambiguous, and keeps unresolved terms null.
|
|
26
|
+
- **Feasibility check** (`pen_stack/spec/satisfy.py`). Wraps reachability (the atlas), deliverability (the
|
|
27
|
+
delivery recommender), and legality (the verification proof object) into feasible / infeasible plus named
|
|
28
|
+
blocking constraints and repair hints; feasibility is necessary, not sufficient (not efficacy).
|
|
29
|
+
- **WriteSpec-Bench** (`benchmarks/writespec/`). The first prose-to-write-spec corpus, grounded in real
|
|
30
|
+
experiments, with an ambiguity subset and a sealed held-out. Reported verbatim: sealed-test structural fidelity
|
|
31
|
+
1.0 and value accuracy 0.96 versus a 0.46 keyword-dict baseline; inferred-field labelling recall 1.0.
|
|
32
|
+
- **Surfaces**: REST `POST /api/writespec`, MCP `writespec_parse`, the manifest tool, the web "Describe a Write"
|
|
33
|
+
builder page, and `docs/writespec_profile.md` + `docs/writespec_bench.md`.
|
|
34
|
+
|
|
35
|
+
### Notes
|
|
36
|
+
- Feasibility rules out unreachable / undeliverable / illegal, not whether the write will work.
|
|
37
|
+
- The extractor backbone is deterministic; an LLM pass is optional and adds no ground truth (it may only propose
|
|
38
|
+
values that still pass the resolvers).
|
|
39
|
+
|
|
40
|
+
## [6.13.0] - 2026-06-22 - Oracle mesh: binding-affinity dimension, per-oracle reliability, disagreement-to-uncertainty
|
|
41
|
+
|
|
42
|
+
Hardens the foundation-model oracle mesh under one result contract. Adds a binding-affinity dimension
|
|
43
|
+
(Boltz-2), surfaces each oracle's published reliability reported verbatim from public benchmarks, and makes
|
|
44
|
+
cross-oracle disagreement widen the reported interval. Every oracle output stays a candidate, never ground
|
|
45
|
+
truth.
|
|
46
|
+
|
|
47
|
+
### Added
|
|
48
|
+
- **Binding-affinity oracle** (`pen_stack/oracles/affinity.py`). Wraps the Boltz-2 protein-ligand affinity head
|
|
49
|
+
(MIT, `10.1101/2025.06.14.659707`): a binder probability and a predicted affinity value with native
|
|
50
|
+
uncertainty taken from the model's own outputs. The head is protein-small-molecule only, so protein-protein
|
|
51
|
+
and protein-DNA pairs are returned as out-of-scope (extrapolating). The backend runs off the request path and
|
|
52
|
+
is cached; an uncached request defers (cache-or-abstain) rather than blocking or fabricating. A grounded,
|
|
53
|
+
in-domain example is committed: 4-hydroxytamoxifen binding the ERT2 ligand-binding domain (the inducible-writer
|
|
54
|
+
switch), predicted as a high-confidence binder (binder probability 0.99, complex pLDDT 0.94).
|
|
55
|
+
- **Per-oracle reliability registry** (`pen_stack/oracles/reliability.py`, `configs/oracles/reliability.yaml`).
|
|
56
|
+
Each oracle's published benchmark accuracy, reported verbatim with citation: the Boltz-2 affinity head's
|
|
57
|
+
FEP+ Pearson r of about 0.62 (paper-reported) is the verified anchor. These are the wrapped models' published
|
|
58
|
+
numbers, not a claim about this stack's accuracy and not re-computed; where a verbatim score was not verified
|
|
59
|
+
the value is left null with the cited benchmark as the pointer.
|
|
60
|
+
- **Disagreement to uncertainty.** Cross-oracle disagreement widens the reported interval (native uncertainty
|
|
61
|
+
plus half the cross-oracle spread); a check confirms the widening is monotonic in the spread.
|
|
62
|
+
- **Held-oracle runner** (`pen_stack/oracles/structure_run.py`) for the structure oracles over writer-substrate
|
|
63
|
+
and att-site complexes: off the request path, cache-or-abstain.
|
|
64
|
+
- **Oracle-Bench** (`benchmarks/oracle/`) reporting the three gates, and surfaces: `GET /api/oracles` extended
|
|
65
|
+
with reliability and the disagreement check, `POST /api/oracle/affinity`, MCP `oracle_query`, the manifest
|
|
66
|
+
`oracle_query` tool, the web Oracle Mesh page, and `docs/oracle_mesh.md`.
|
|
67
|
+
|
|
68
|
+
### Notes
|
|
69
|
+
- Affinity predictions are candidates with native uncertainty, not measured binding constants; reliability is
|
|
70
|
+
surfaced so a confident-looking value is not over-trusted.
|
|
71
|
+
- The structure oracles over full complexes (AlphaFold3 / Boltz-2 / Chai-1 / Protenix) remain held: run
|
|
72
|
+
separately on GPU or cloud and cached, never inline on the request path.
|
|
73
|
+
|
|
6
74
|
## [6.12.0] - 2026-06-21 - Verification service: published rule spec, proof object, standards-aligned biosecurity
|
|
7
75
|
|
|
8
76
|
Hardens `verify(design)` into a formal verification service. The rule base becomes a published, citable spec;
|
|
@@ -24,7 +92,8 @@ biosecurity gate is mapped to the community synthesis-screening standards.
|
|
|
24
92
|
SecureDNA's pass/deny outcome, with a concordance report (8/8 concordant on the labelled probe set).
|
|
25
93
|
References: Common Mechanism (Wheeler et al. 2024, `10.1089/apb.2023.0034`); SecureDNA (`arXiv:2403.14023`).
|
|
26
94
|
- **Verify-Bench** (`benchmarks/verify/`) reporting the three gates, and surfaces: REST `POST /api/verify/proof`,
|
|
27
|
-
MCP `verify_proof`, manifest tool `verify_proof`,
|
|
95
|
+
MCP `verify_proof`, manifest tool `verify_proof`, the web Verify page (per-axis green/amber/red with the
|
|
96
|
+
violated rule, its citation, and the suggested fix), and `docs/verify_service.md`.
|
|
28
97
|
|
|
29
98
|
### Notes
|
|
30
99
|
- The verdict covers legality, feasibility and biosecurity, not efficacy (efficacy stays a downstream
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: pen-stack
|
|
3
|
-
Version: 6.
|
|
3
|
+
Version: 6.14.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
|
|
@@ -67,6 +67,8 @@ Requires-Dist: mkdocs>=1.6; extra == "docs"
|
|
|
67
67
|
Requires-Dist: mkdocs-material>=9.5; extra == "docs"
|
|
68
68
|
Provides-Extra: env
|
|
69
69
|
Requires-Dist: gymnasium>=0.29; extra == "env"
|
|
70
|
+
Provides-Extra: spec
|
|
71
|
+
Requires-Dist: sbol3>=1.1; extra == "spec"
|
|
70
72
|
Provides-Extra: dev
|
|
71
73
|
Requires-Dist: pytest>=8; extra == "dev"
|
|
72
74
|
Requires-Dist: ruff>=0.5; extra == "dev"
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
7b39e54eae68dbab180d3461c859cc1f1e481c8d0b694405e49b0f850029930b benchmarks/oracle/harness.py
|
|
2
|
+
573d0e5029d222dfb93d8a1db71199ff294837a44f7e7fa793b5be3f2a0a6461 benchmarks/oracle/oracle_bench_metrics.json
|
|
3
|
+
d5aafb9351d5f0a93f4a3e5282fc062940a4f9ffe6b8391a4d86bdbc9e70fa29 configs/oracles/reliability.yaml
|
|
4
|
+
49155d662d63ffa37e821f933a1f1b86d10f0eda0a1b038cf7dcbf5c08b54877 oracle_cache/12ce1ef95d7b45985abbc25c.json
|
|
5
|
+
cfbd1588311956bfaa13cc8d8bfb88debf2d4fa7c6c11586ff14c055e5cfd864 oracle_cache/9b57c9a6a632d80ac9292ee2.json
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
5bbfd8b7d73c0828a72d84d68b12155f7047e45d0d227e8c9654cc15687991f5 benchmarks/writespec/corpus.json
|
|
2
|
+
d3133084f098a6eeed46ab49555731057c9b106c787f090331df6b019cd249f2 benchmarks/writespec/harness.py
|
|
3
|
+
bc6126634628e92baedf68404636889f07c77c53d59ca057b18b7f54511a11fe benchmarks/writespec/writespec_bench_metrics.json
|
|
4
|
+
051ddbaccca5faab72d66f2737e634b5b7170aa919323aab73f98e53fd042b36 benchmarks/writespec/splits.json
|
|
@@ -85,3 +85,11 @@ oracles:
|
|
|
85
85
|
latency_class: long_job
|
|
86
86
|
live: false
|
|
87
87
|
note: "HELD, run SEPARATELY on a cloud A100. ~1-10 min. Not active now."
|
|
88
|
+
|
|
89
|
+
boltz-2-affinity: # v6.13 WS-ORACLE: the Boltz-2 affinity head (protein-ligand binding affinity)
|
|
90
|
+
execution: local_gpu
|
|
91
|
+
latency_class: long_job
|
|
92
|
+
live: false
|
|
93
|
+
note: "Boltz-2 affinity head (MIT weights). Run OFF-REQUEST as a batch on the GPU (~10-30 min incl. MSA) and
|
|
94
|
+
cached; the request path is cache-or-abstain and never blocks the chat. Predicts a binder probability +
|
|
95
|
+
affinity value for a protein + small-molecule ligand."
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
# PEN-STACK v6.13, WS-ORACLE: per-oracle reliability registry.
|
|
2
|
+
#
|
|
3
|
+
# These are the WRAPPED models' PUBLISHED reliability on PUBLIC benchmarks, reported VERBATIM with citation.
|
|
4
|
+
# They are NOT a claim about this stack's own accuracy, are NOT re-computed here, and do NOT make an oracle
|
|
5
|
+
# output a ground-truth measurement. Every oracle output remains a candidate / hypothesis carrying its own
|
|
6
|
+
# native uncertainty; reliability is surfaced so a confident-looking value is not over-trusted.
|
|
7
|
+
#
|
|
8
|
+
# Where a verbatim numeric score was not independently verified, `value` is null and the cited benchmark is the
|
|
9
|
+
# pointer. The registry never invents a number.
|
|
10
|
+
version: "1.0"
|
|
11
|
+
disclaimer: >
|
|
12
|
+
Published reliability of the wrapped foundation models on public benchmarks, reported verbatim with citation.
|
|
13
|
+
Not a claim about this stack's own accuracy, not re-computed here. Each oracle output is a candidate carrying
|
|
14
|
+
its native uncertainty. Numbers tagged "paper" are author-reported; "self-report" means not independently
|
|
15
|
+
verified against the official benchmark results. Where a verbatim score is not pinned, value is null and the
|
|
16
|
+
benchmark plus citation are given as the pointer.
|
|
17
|
+
|
|
18
|
+
oracles:
|
|
19
|
+
boltz-2-affinity:
|
|
20
|
+
- benchmark: "FEP+ (OpenFE) free-energy perturbation benchmark, held-out targets"
|
|
21
|
+
task: "protein-ligand binding affinity"
|
|
22
|
+
metric: "Pearson r vs experimental affinity"
|
|
23
|
+
value: 0.62
|
|
24
|
+
qualifier: "approximate; paper-reported"
|
|
25
|
+
note: "approaches physics-based FEP accuracy at ~1000x lower cost/time (a speed/cost claim, not accuracy)"
|
|
26
|
+
reported_by: "paper"
|
|
27
|
+
citation: ["10.1101/2025.06.14.659707"]
|
|
28
|
+
- benchmark: "CASP16 binding-affinity challenge (140 complexes)"
|
|
29
|
+
task: "protein-ligand binding affinity"
|
|
30
|
+
metric: "ranking among submitted methods"
|
|
31
|
+
value: null
|
|
32
|
+
qualifier: "self-reported first among submitted methods; not independently verified vs official CASP16 results"
|
|
33
|
+
reported_by: "self-report"
|
|
34
|
+
citation: ["10.1101/2025.06.14.659707"]
|
|
35
|
+
- related_public_benchmarks:
|
|
36
|
+
- "MF-PCBA multi-fidelity PubChem BioAssay (10.1021/acs.jcim.2c01569)"
|
|
37
|
+
- "Polaris / ASAP-OpenADMET antiviral challenge 2025 (10.26434/chemrxiv-2025-zd9mr)"
|
|
38
|
+
- "OpenFF protein-ligand-benchmark (github.com/openforcefield/protein-ligand-benchmark)"
|
|
39
|
+
|
|
40
|
+
alphafold3:
|
|
41
|
+
- benchmark: "CASP / CAMEO blind structure assessment; PDB held-out set"
|
|
42
|
+
task: "protein / protein-NA complex structure prediction"
|
|
43
|
+
metric: "LDDT / TM-score / DockQ by target class (see source)"
|
|
44
|
+
value: null
|
|
45
|
+
qualifier: "benchmark named; a single verbatim score is not pinned (varies strongly by target class)"
|
|
46
|
+
reported_by: "community/paper"
|
|
47
|
+
citation: ["predictioncenter.org (CASP)", "cameo3d.org (CAMEO; Haas et al. 2018, PubMed 29178137)"]
|
|
48
|
+
|
|
49
|
+
boltz-2:
|
|
50
|
+
- benchmark: "CASP / CAMEO; PDB held-out set (open-weights AF3-class predictor)"
|
|
51
|
+
task: "protein / complex structure prediction"
|
|
52
|
+
metric: "LDDT / TM-score (see source)"
|
|
53
|
+
value: null
|
|
54
|
+
qualifier: "benchmark named; verbatim score not pinned here"
|
|
55
|
+
reported_by: "paper"
|
|
56
|
+
citation: ["10.1101/2025.06.14.659707", "Boltz-1 10.1101/2024.11.19.624167"]
|
|
57
|
+
|
|
58
|
+
chai-1:
|
|
59
|
+
- benchmark: "CASP / CAMEO; PDB held-out set"
|
|
60
|
+
task: "protein / complex structure prediction"
|
|
61
|
+
metric: "LDDT / DockQ (see source)"
|
|
62
|
+
value: null
|
|
63
|
+
qualifier: "benchmark named; verbatim score not pinned here"
|
|
64
|
+
reported_by: "developer"
|
|
65
|
+
citation: ["github.com/chaidiscovery/chai-lab"]
|
|
66
|
+
|
|
67
|
+
evo2:
|
|
68
|
+
- benchmark: "ProteinGym (variant effect); zero-shot genomic likelihood"
|
|
69
|
+
task: "variant-effect / sequence likelihood"
|
|
70
|
+
metric: "Spearman / AUROC (see source)"
|
|
71
|
+
value: null
|
|
72
|
+
qualifier: "benchmark named; verbatim score not pinned here"
|
|
73
|
+
reported_by: "community"
|
|
74
|
+
citation: ["ProteinGym 10.1101/2023.12.07.570727"]
|
|
75
|
+
|
|
76
|
+
esm3:
|
|
77
|
+
- benchmark: "ProteinGym (variant effect); FLIP (fitness landscapes)"
|
|
78
|
+
task: "variant-effect / protein fitness"
|
|
79
|
+
metric: "Spearman (see source)"
|
|
80
|
+
value: null
|
|
81
|
+
qualifier: "benchmark named; verbatim score not pinned here"
|
|
82
|
+
reported_by: "community"
|
|
83
|
+
citation: ["ProteinGym 10.1101/2023.12.07.570727", "FLIP 10.1101/2021.11.09.467890"]
|
|
84
|
+
|
|
85
|
+
alphagenome:
|
|
86
|
+
- benchmark: "regulatory-track + variant-effect evaluation (in-distribution tracks/tissues)"
|
|
87
|
+
task: "regulatory genomics"
|
|
88
|
+
metric: "see source (per-track correlation)"
|
|
89
|
+
value: null
|
|
90
|
+
qualifier: "benchmark named; verbatim score not pinned here; valid only on trained tracks/tissues"
|
|
91
|
+
reported_by: "developer"
|
|
92
|
+
citation: ["Google DeepMind AlphaGenome"]
|
|
@@ -235,3 +235,16 @@ oracles:
|
|
|
235
235
|
absolute expression"
|
|
236
236
|
generalizes_to_unseen_loci: false
|
|
237
237
|
license: "MIT (github.com/bowang-lab/scGPT; Nature Methods 10.1038/s41592-024-02201-0)"
|
|
238
|
+
|
|
239
|
+
boltz-2-affinity: # v6.13 WS-ORACLE: the Boltz-2 protein-ligand binding-affinity head
|
|
240
|
+
family: affinity
|
|
241
|
+
version: "2.2.1"
|
|
242
|
+
output_kind: claim # a checkable prediction (predicted, not a measured Kd); carries native uncertainty
|
|
243
|
+
valid_for: "protein + SMALL-MOLECULE ligand binding-affinity prediction (Boltz-2 affinity head): a binder
|
|
244
|
+
probability and a predicted affinity value, for ligands near the trained chemical space (e.g. a
|
|
245
|
+
small-molecule inducer that switches a writer, a capsid-binding small molecule, an effector drug)"
|
|
246
|
+
not_valid_for: "protein-protein or protein-DNA affinity (the head is protein-LIGAND only; those are
|
|
247
|
+
out-of-scope and flagged extrapolating); an absolute measured Kd/IC50; ligands far outside the trained
|
|
248
|
+
chemical space; asserting a binder WORKS in cells (every output is a hypothesis, not a measurement)"
|
|
249
|
+
generalizes_to_unseen_loci: true
|
|
250
|
+
license: "MIT (Boltz-2, 10.1101/2025.06.14.659707)"
|
|
@@ -20,8 +20,10 @@ A nominated off-target is a candidate, and every result ships with the empirical
|
|
|
20
20
|
controls) found that with a **cell-type-matched** track (ENCODE HEK293T DNase, v6.10.3) accessibility predicts
|
|
21
21
|
WT-Cas9 cell-based off-target activity: **GUIDE-seq AUROC 0.58 (cross-cell K562) → 0.671 (matched), CI
|
|
22
22
|
[0.642, 0.701]**, in-vitro control null. **VALIDATED (moderate, cell-type-matched)**; it is surfaced as an
|
|
23
|
-
annotation and
|
|
24
|
-
|
|
23
|
+
annotation and is **intentionally not folded into the numeric risk score** (the v6.10.4 incremental analysis
|
|
24
|
+
found no held-out ranking improvement over CRISOT, so the score stays sequence/CRISOT-driven; TTISS, a
|
|
25
|
+
Cas9-variant assay, is the expected outlier). Full results:
|
|
26
|
+
`benchmarks/offtarget/chromatin_{validation,incremental}.json`.
|
|
25
27
|
- **Serine integrase (Bxb1):** a cryptic **pseudo-attB** scan that seeds on the *real documented* Bxb1 attB core
|
|
26
28
|
(`GCGGTCTC`, central GT; FlyBase FBto0000359, Ghosh 2003) and reports candidate cryptic sites by arm mismatches.
|
|
27
29
|
- **Bridge recombinase:** delegates to the existing Perry-DMS pseudosite engine (`pen_stack.bridge.offtarget`).
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
# The oracle mesh
|
|
2
|
+
|
|
3
|
+
PEN-STACK wraps the biomolecular foundation models (AlphaGenome, Evo2, AlphaFold3, Boltz-2, Chai-1, Protenix,
|
|
4
|
+
ESM3, RFdiffusion, ProteinMPNN, ViennaRNA, and the bridge energetics model) behind one result contract. Every
|
|
5
|
+
oracle, however different internally, answers through the same `OracleResult`: a value, its provenance
|
|
6
|
+
(model + version), the model's own native uncertainty, and a scope card. Three invariants are encoded in the
|
|
7
|
+
type itself:
|
|
8
|
+
|
|
9
|
+
1. A generative output is a candidate, never a claim. A generated sequence, structure or backbone is a proposal
|
|
10
|
+
that must pass writer-verification before it can enter a claim path (`as_claim()` raises on a candidate).
|
|
11
|
+
2. One contract for every oracle. Provenance and the oracle's native uncertainty are always carried; every call
|
|
12
|
+
is cache-keyed on inputs, model and version.
|
|
13
|
+
3. Scope is explicit. Each result names its scope card and carries an `extrapolating` flag, so the evidence that
|
|
14
|
+
these models do not generalize outside their training envelope is labelled, not hidden.
|
|
15
|
+
|
|
16
|
+
## Binding affinity (Boltz-2)
|
|
17
|
+
|
|
18
|
+
The affinity oracle (`pen_stack.oracles.affinity`) wraps the Boltz-2 protein-ligand affinity head (Boltz-2, MIT,
|
|
19
|
+
DOI 10.1101/2025.06.14.659707). For a protein and a small-molecule ligand it returns a binder probability and a
|
|
20
|
+
predicted affinity value (a log(IC50), micromolar-scale number, lower = stronger), with native uncertainty taken
|
|
21
|
+
from the model's own outputs. The head is protein-small-molecule only: protein-protein and protein-DNA pairs are
|
|
22
|
+
returned as out-of-scope (extrapolating). Pair types in scope include the small-molecule inducer that switches a
|
|
23
|
+
genome writer (for example 4-hydroxytamoxifen and the ERT2 ligand-binding domain), a capsid-binding ligand, and
|
|
24
|
+
an effector drug.
|
|
25
|
+
|
|
26
|
+
The affinity backend is a long GPU batch (around ten to thirty minutes including the MSA), so it runs off the
|
|
27
|
+
request path and the result is cached. The request path is cache-or-abstain: a request with no cached run defers
|
|
28
|
+
(`available=False`) rather than blocking the chat or fabricating a value.
|
|
29
|
+
|
|
30
|
+
## Per-oracle reliability
|
|
31
|
+
|
|
32
|
+
`configs/oracles/reliability.yaml` records each oracle's published reliability on public benchmarks, reported
|
|
33
|
+
verbatim with citation (`pen_stack.oracles.reliability`). These numbers are the wrapped model's accuracy as
|
|
34
|
+
reported by its authors or the community, not a claim about this stack's own accuracy and not re-computed here.
|
|
35
|
+
The verified anchor is the Boltz-2 affinity head's FEP+ (OpenFE) Pearson r of about 0.62 (paper-reported); its
|
|
36
|
+
CASP16 affinity-challenge ranking is recorded as a self-report, not independently verified. For the structure and
|
|
37
|
+
sequence oracles the registry names the benchmark each is evaluated on (CASP and CAMEO for structure, ProteinGym
|
|
38
|
+
and FLIP for variant effect) with citations, and leaves the numeric value null where a verbatim score was not
|
|
39
|
+
independently verified rather than inventing one.
|
|
40
|
+
|
|
41
|
+
Reliability is surfaced in `GET /api/oracles`, in the MCP `oracle_query` tool, and in the web Oracle Mesh page,
|
|
42
|
+
so a confident-looking value is read alongside how reliable the model that produced it actually is.
|
|
43
|
+
|
|
44
|
+
## Disagreement to uncertainty
|
|
45
|
+
|
|
46
|
+
Where redundant numeric oracles are available (for example the structure predictors), agreement is a confidence
|
|
47
|
+
signal and disagreement widens the reported interval. The consensus combines the available oracles and sets the
|
|
48
|
+
reported native uncertainty to the largest member uncertainty plus half the cross-oracle spread. This widening is
|
|
49
|
+
monotonic in the spread, checked by `disagreement_widens_monotonically` and reported by Oracle-Bench.
|
|
50
|
+
|
|
51
|
+
## Held oracles
|
|
52
|
+
|
|
53
|
+
The structure oracles (AlphaFold3 / Boltz-2 / Chai-1 / Protenix) over full writer-substrate and att-site
|
|
54
|
+
complexes are held: a full complex prediction is a long GPU or cloud batch run off-request and cached
|
|
55
|
+
(`pen_stack.oracles.structure_run`). The request path replays the cache or abstains; it never runs the long job
|
|
56
|
+
inline.
|
|
57
|
+
|
|
58
|
+
## Surfaces
|
|
59
|
+
|
|
60
|
+
- `GET /api/oracles` (optional `?probe=true`): per-oracle execution, latency class, live status and published
|
|
61
|
+
reliability, plus the disagreement-to-interval check.
|
|
62
|
+
- `POST /api/oracle/affinity`: a protein-ligand binding-affinity query (cache-or-abstain).
|
|
63
|
+
- MCP `oracle_query`: the same, for an agent.
|
|
64
|
+
- Web: the Oracle Mesh page.
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
# WriteSpec-Bench (Stage A)
|
|
2
|
+
|
|
3
|
+
WriteSpec-Bench is the first prose-to-write-spec benchmark for genome writing: paired
|
|
4
|
+
`(plain-language request -> gold WriteSpec)`, grounded in real, well-documented genome-writing experiments
|
|
5
|
+
(cited per row). It is `benchmarks/writespec/` (corpus, splits, harness, metrics).
|
|
6
|
+
|
|
7
|
+
## Construction
|
|
8
|
+
|
|
9
|
+
- Each gold WriteSpec is the structured value a careful curator extracts: write-type, target kind, the gene
|
|
10
|
+
(HGNC) or phenotype (MONDO) id, the cell (Cellosaurus / Cell Ontology) id, the cargo Sequence-Ontology role
|
|
11
|
+
set, and the key constraints. Every ontology id was verified against the live services before commit.
|
|
12
|
+
- The **standard** subset is fully specified. The **ambiguity** subset is deliberately underspecified or
|
|
13
|
+
ambiguous, to test that the extractor surfaces assumptions and asks clarifying questions rather than guessing.
|
|
14
|
+
- **Leakage control**: the test split is sealed and disjoint from train (`splits.json`); paraphrases do not
|
|
15
|
+
co-occur across splits.
|
|
16
|
+
|
|
17
|
+
## Scoring (SO-Bench-style)
|
|
18
|
+
|
|
19
|
+
- **schema adherence**: the output validates as a typed `WriteRequest`.
|
|
20
|
+
- **structural fidelity**: write_type and target_kind match the gold.
|
|
21
|
+
- **value accuracy**: canonical-id match for gene / phenotype / cell, the cargo role set, and the listed
|
|
22
|
+
constraints.
|
|
23
|
+
- **grounding**: on the ambiguity subset, clarifying questions fire and the inferred write_type is labelled;
|
|
24
|
+
inferred-field labelling recall must be 100% (no field is set without provenance).
|
|
25
|
+
|
|
26
|
+
The baseline is the legacy keyword dictionary (`web.tools.parse_goal`), which emits raw tokens, not canonical
|
|
27
|
+
ids.
|
|
28
|
+
|
|
29
|
+
## Results (reported verbatim, deterministic extractor, not tuned to the sealed test)
|
|
30
|
+
|
|
31
|
+
- Sealed test: schema adherence 1.0, structural fidelity 1.0, value accuracy 0.964; baseline value accuracy
|
|
32
|
+
0.464.
|
|
33
|
+
- Train: structural fidelity 1.0, value accuracy 0.988; baseline 0.407.
|
|
34
|
+
- Ambiguity subset: clarifying questions fire, inferred write_type labelled.
|
|
35
|
+
- Inferred-field labelling recall: 1.0.
|
|
36
|
+
|
|
37
|
+
The extractor beats the keyword-dict baseline because it resolves terms to verified ontology ids; the baseline
|
|
38
|
+
keeps raw tokens. The corpus is small and curated, grounded in real experiments; its value is bounded by curation
|
|
39
|
+
quality, reported verbatim. Two structural mismatches found during development were genuine extractor bugs (a
|
|
40
|
+
cell-line token mis-read as a gene; a disease prioritized over a named gene target), fixed in the extractor, not
|
|
41
|
+
papered over in the gold.
|
|
42
|
+
|
|
43
|
+
The full per-run metrics are in `benchmarks/writespec/writespec_bench_metrics.json`; re-run with
|
|
44
|
+
`python -m benchmarks.writespec.harness`.
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
# The WriteSpec profile (Stage A)
|
|
2
|
+
|
|
3
|
+
WriteSpec is a typed, ontology-backed, machine-checkable representation of a genome-writing request. It replaces
|
|
4
|
+
the keyword parser with one contract every downstream stage consumes, and it is an SBOL3 profile, so it is
|
|
5
|
+
interoperable with the genetic-design-automation ecosystem and GenBank from day one. A WriteSpec is a request,
|
|
6
|
+
not a claim.
|
|
7
|
+
|
|
8
|
+
## The type
|
|
9
|
+
|
|
10
|
+
`WriteRequest` (`pen_stack/spec/writespec.py`) carries:
|
|
11
|
+
|
|
12
|
+
- **write_type**: one of insertion, excision, inversion, replacement, regulatory_rewrite, landing_pad_install,
|
|
13
|
+
multiplex.
|
|
14
|
+
- **cargo**: a list of components, each with a Sequence-Ontology role (promoter `SO:0000167`, CDS `SO:0000316`,
|
|
15
|
+
polyA signal `SO:0000551`, insulator `SO:0000627`, ...) and an optional sequence and length.
|
|
16
|
+
- **target**: the edit site, as a gene (HGNC), a locus (GRCh38 coordinate), an att/landing site, or, when only a
|
|
17
|
+
disease goal is given, a phenotype (MONDO). A named gene or att site is the target; a disease is attached as the
|
|
18
|
+
goal.
|
|
19
|
+
- **cell_type**: a Cellosaurus cell line (HEK293T `CVCL_0063`) or a Cell-Ontology cell type (T cell `CL:0000084`),
|
|
20
|
+
carrying the irreducible subline / karyotype-drift caveat.
|
|
21
|
+
- **constraints**: efficiency floor, scarless, safety-switch-required, copy number, germline guardrail, max cargo
|
|
22
|
+
bp, delivery limit / vehicle, and a ChEBI small-molecule inducer.
|
|
23
|
+
|
|
24
|
+
## The grounding discipline
|
|
25
|
+
|
|
26
|
+
Every field records its provenance in the `provenance` map: `explicit` (stated in the prose), `inferred`
|
|
27
|
+
(defaulted, with the rationale in `assumptions`), `user` (supplied through a structured override), or
|
|
28
|
+
`unresolved`. A required field that is unspecified or ambiguous yields a `clarifications` question rather than a
|
|
29
|
+
guess. A term that cannot be resolved is listed in `unresolved` and its field stays null. Nothing is invented.
|
|
30
|
+
|
|
31
|
+
All curated ontology ids were verified against the live services (Cellosaurus, EBI OLS for SO / MONDO / CL /
|
|
32
|
+
ChEBI) before they were committed; a resolver degrades to `unresolved`, never a fabricated id.
|
|
33
|
+
|
|
34
|
+
## Round-trips and the downstream adapter
|
|
35
|
+
|
|
36
|
+
- **JSON**: always available (`to_json` / `from_json`), lossless.
|
|
37
|
+
- **SBOL3**: `to_sbol3` / `from_sbol3` via the real `sbol3` library (the `[spec]` extra). The export emits native
|
|
38
|
+
Components with Sequence-Ontology roles for interoperability and carries the full typed spec losslessly in a
|
|
39
|
+
PROV-O-namespaced annotation.
|
|
40
|
+
- **GenBank**: `to_genbank` exports the cargo as a GenBank record when it carries a DNA sequence (intent-only
|
|
41
|
+
specs return None).
|
|
42
|
+
- **`to_legacy_design`**: the adapter that emits the dict the existing stages (verify / plan / safety / delivery)
|
|
43
|
+
already consume, so the whole stack reads one contract without a per-stage rewrite.
|
|
44
|
+
|
|
45
|
+
## Feasibility
|
|
46
|
+
|
|
47
|
+
`pen_stack/spec/satisfy.py` tests the necessary conditions a write must meet by wrapping the existing stages:
|
|
48
|
+
reachability (the writable-genome atlas), deliverability (the Stage D recommender), and legality (the Stage F
|
|
49
|
+
rule set, via the repair-oriented proof object). It returns feasible or infeasible plus the named blocking
|
|
50
|
+
constraint(s) and repair hints, so an agent can repair the spec and re-check. Feasibility is necessary, not
|
|
51
|
+
sufficient: it rules out unreachable / undeliverable / illegal, not whether the write will work (that is the
|
|
52
|
+
downstream stages' calibrated prediction).
|
|
53
|
+
|
|
54
|
+
## Surfaces
|
|
55
|
+
|
|
56
|
+
- REST `POST /api/writespec` (body `{prose, overrides?, check_feasibility?}`).
|
|
57
|
+
- MCP `writespec_parse`.
|
|
58
|
+
- The web "Describe a Write" builder page.
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
"""PEN-STACK v3.0 - open infrastructure for genome writing."""
|
|
2
|
-
__version__ = "6.
|
|
2
|
+
__version__ = "6.14.0"
|
|
@@ -60,6 +60,38 @@ def verify_proof(design: dict) -> dict:
|
|
|
60
60
|
return _vp(design).model_dump()
|
|
61
61
|
|
|
62
62
|
|
|
63
|
+
@mcp.tool()
|
|
64
|
+
def writespec_parse(prose: str, check_feasibility: bool = True) -> dict:
|
|
65
|
+
"""v6.14 Stage A: parse a plain-language genome-writing request into a typed, ontology-backed WriteSpec (an
|
|
66
|
+
SBOL3 profile). Returns the typed spec with per-field provenance (explicit / inferred / user / unresolved),
|
|
67
|
+
the assumptions behind every inferred field, clarifying questions for anything underspecified or ambiguous,
|
|
68
|
+
the unresolved terms (kept null, never invented), the downstream design adapter, and a feasibility verdict
|
|
69
|
+
(reachability + deliverability + legality, with named blocking constraints + repair hints). A WriteSpec is a
|
|
70
|
+
REQUEST, not a claim; the extractor never fabricates intent."""
|
|
71
|
+
from pen_stack.spec.service import parse_request
|
|
72
|
+
return parse_request(prose, check_feasibility=check_feasibility)
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
@mcp.tool()
|
|
76
|
+
def oracle_query(oracle: str | None = None, protein_seq: str | None = None, ligand_smiles: str | None = None,
|
|
77
|
+
pair_type: str = "ligand", ligand_name: str | None = None) -> dict:
|
|
78
|
+
"""v6.13 PEN-ORACLE: query the oracle mesh under one contract. With no arguments, returns every oracle's
|
|
79
|
+
execution + latency + live status + PUBLISHED reliability (reported verbatim from public benchmarks, with
|
|
80
|
+
citation; not a claim about this stack's accuracy) and the disagreement-to-interval check. With `oracle` set,
|
|
81
|
+
returns that oracle's status + reliability. With `protein_seq` + `ligand_smiles`, returns a CANDIDATE
|
|
82
|
+
binding-affinity prediction (Boltz-2 head): a binder probability + a predicted value with native uncertainty,
|
|
83
|
+
cache-or-abstain; protein-protein/protein-DNA pair types are flagged extrapolating (the head is
|
|
84
|
+
protein-ligand only). The long GPU job never runs on the request path."""
|
|
85
|
+
from pen_stack.oracles.status import oracle_status, summary
|
|
86
|
+
if protein_seq and ligand_smiles:
|
|
87
|
+
from pen_stack.oracles.affinity import predict_affinity
|
|
88
|
+
return predict_affinity(protein_seq, ligand_smiles, pair_type=pair_type, ligand_name=ligand_name).model_dump()
|
|
89
|
+
st = oracle_status()
|
|
90
|
+
if oracle:
|
|
91
|
+
return {"oracle": oracle, "status": st.get(oracle), "found": oracle in st}
|
|
92
|
+
return {"summary": summary(), "oracles": st}
|
|
93
|
+
|
|
94
|
+
|
|
63
95
|
@mcp.tool()
|
|
64
96
|
def graph_query(locus: str, cargo_form: str | None = None) -> dict:
|
|
65
97
|
"""v4.5 world-model graph (WS-G): a multi-hop query. Returns the writer families that REACH `locus` AND
|
|
@@ -67,6 +67,19 @@ _TOOLS = [
|
|
|
67
67
|
"NOT an in-vivo tropism claim (v6.11 PEN-DELIVER)",
|
|
68
68
|
"input": "AAV VP1 capsid amino-acid sequence", "output": "predicted packaging-fitness (candidate) or abstain",
|
|
69
69
|
"entrypoint": "pen_stack.planner.delivery_predict.capsid_fitness", "fabricates": False},
|
|
70
|
+
{"name": "writespec_parse", "summary": "parse a plain-language genome-writing request into a typed, "
|
|
71
|
+
"ontology-backed WriteSpec (an SBOL3 profile): per-field provenance (explicit/inferred/user/unresolved), "
|
|
72
|
+
"assumptions, clarifying questions on underspecification, and a feasibility verdict (reachability + "
|
|
73
|
+
"deliverability + legality); a REQUEST not a claim, never fabricates intent (v6.14 Stage A WriteSpec)",
|
|
74
|
+
"input": "prose request (+ optional structured overrides)", "output": "typed WriteSpec + clarifications + "
|
|
75
|
+
"feasibility; unresolved stays null", "entrypoint": "pen_stack.spec.service.parse_request", "fabricates": False},
|
|
76
|
+
{"name": "oracle_query", "summary": "query the oracle mesh under one contract: per-oracle execution + latency "
|
|
77
|
+
"+ live status + PUBLISHED reliability (verbatim from public benchmarks, cited) + disagreement-to-interval; "
|
|
78
|
+
"or a CANDIDATE protein-ligand binding affinity (Boltz-2 head) with native uncertainty, cache-or-abstain "
|
|
79
|
+
"(v6.13 PEN-ORACLE)",
|
|
80
|
+
"input": "oracle name, or {protein_seq, ligand_smiles, pair_type}", "output": "oracle status + reliability, "
|
|
81
|
+
"or a candidate affinity (binder probability + value) or abstain; protein-protein/protein-DNA flagged OOD",
|
|
82
|
+
"entrypoint": "pen_stack.oracles.affinity.predict_affinity", "fabricates": False},
|
|
70
83
|
]
|
|
71
84
|
|
|
72
85
|
_POLICY = ("outputs outside scope are returned as `out_of_scope` (known-unknown) or `extrapolating` (OOD) and are "
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
"""Binding-affinity oracle (v6.13, WS-ORACLE), the Boltz-2 protein-ligand affinity head under the contract.
|
|
2
|
+
|
|
3
|
+
Boltz-2 (MIT; Passaro et al. 2025, DOI 10.1101/2025.06.14.659707) jointly predicts a complex structure and a
|
|
4
|
+
binding affinity for a protein with a small-molecule ligand: a binder probability (``affinity_probability_binary``)
|
|
5
|
+
and a predicted affinity value (``affinity_pred_value``, a log(IC50) micromolar-scale number, lower = stronger).
|
|
6
|
+
This oracle wraps that head under the L1 ``OracleResult`` contract:
|
|
7
|
+
|
|
8
|
+
* the prediction is a CANDIDATE / hypothesis, never a measured Kd;
|
|
9
|
+
* the model's own outputs supply the native uncertainty (the spread between Boltz-2's two affinity heads, or a
|
|
10
|
+
binder-call entropy proxy);
|
|
11
|
+
* the affinity head is protein-SMALL-MOLECULE only, so protein-protein and protein-DNA requests are flagged
|
|
12
|
+
out-of-scope (``extrapolating``);
|
|
13
|
+
* the backend runs OFF the request path (a GPU batch, ~10-30 min including MSA) and is cached; when no cached run
|
|
14
|
+
is present the request path is cache-or-abstain and never blocks.
|
|
15
|
+
"""
|
|
16
|
+
from __future__ import annotations
|
|
17
|
+
|
|
18
|
+
import json
|
|
19
|
+
from pathlib import Path
|
|
20
|
+
|
|
21
|
+
from pen_stack.oracles import build_result, cache_get, cache_put
|
|
22
|
+
from pen_stack.oracles.schema import OracleResult
|
|
23
|
+
|
|
24
|
+
_MODEL = "boltz-2-affinity"
|
|
25
|
+
|
|
26
|
+
# Pair types the affinity head COVERS (protein + small-molecule ligand), with a genome-writing-relevant gloss.
|
|
27
|
+
_LIGAND_PAIRS = {
|
|
28
|
+
"inducer_switch": "a small-molecule inducer that switches a genome writer on/off (e.g. 4-OHT / ERT2)",
|
|
29
|
+
"capsid_ligand": "a small molecule binding a delivery capsid (stabiliser or targeting ligand)",
|
|
30
|
+
"effector_drug": "a drug binding a delivered effector protein",
|
|
31
|
+
"ligand": "a generic protein + small-molecule ligand pair",
|
|
32
|
+
}
|
|
33
|
+
# Pair types OUTSIDE the affinity head's domain (it is protein-ligand only): returned extrapolating.
|
|
34
|
+
_OOD_PAIRS = {
|
|
35
|
+
"protein_protein": "protein-protein affinity is not the Boltz-2 affinity head's domain (protein-ligand only)",
|
|
36
|
+
"protein_dna": "protein-DNA affinity is not the Boltz-2 affinity head's domain (protein-ligand only)",
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
_UNITS = ("Boltz-2 affinity_pred_value: log(IC50) on a micromolar scale, lower = stronger binder "
|
|
40
|
+
"(a prediction, not a measured Kd/IC50)")
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
def _inputs(protein_seq: str, ligand_smiles: str, pair_type: str) -> dict:
|
|
44
|
+
return {"protein_len": len(protein_seq), "protein": protein_seq.upper(),
|
|
45
|
+
"ligand_smiles": ligand_smiles, "pair_type": pair_type}
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
def predict_affinity(protein_seq: str, ligand_smiles: str, pair_type: str = "ligand",
|
|
49
|
+
ligand_name: str | None = None) -> OracleResult:
|
|
50
|
+
"""Predict protein-ligand binding affinity with the Boltz-2 head; cache-replayed if present, else deferred.
|
|
51
|
+
|
|
52
|
+
``pair_type`` in {inducer_switch, capsid_ligand, effector_drug, ligand} is in-scope; ``protein_protein`` /
|
|
53
|
+
``protein_dna`` are OUT of the affinity head's domain and returned extrapolating (the head is protein-ligand).
|
|
54
|
+
The long GPU job is never run on the request path: an absent cached run yields a deferred result.
|
|
55
|
+
"""
|
|
56
|
+
in_scope = pair_type in _LIGAND_PAIRS
|
|
57
|
+
extrapolating = pair_type in _OOD_PAIRS
|
|
58
|
+
if not in_scope and not extrapolating:
|
|
59
|
+
raise ValueError(f"unknown pair_type {pair_type!r}; choose from "
|
|
60
|
+
f"{sorted(_LIGAND_PAIRS) + sorted(_OOD_PAIRS)}")
|
|
61
|
+
inputs = _inputs(protein_seq, ligand_smiles, pair_type)
|
|
62
|
+
note0 = (_OOD_PAIRS[pair_type] if extrapolating
|
|
63
|
+
else "Boltz-2 affinity head; backend runs off-request on the GPU and is cached")
|
|
64
|
+
r = build_result("affinity", _MODEL, inputs=inputs, available=False,
|
|
65
|
+
in_scope=in_scope, extrapolating=extrapolating, note=note0 + "; cache-or-abstain")
|
|
66
|
+
hit = cache_get(r.provenance.cache_key)
|
|
67
|
+
if hit is not None:
|
|
68
|
+
note = "replayed from committed oracle cache"
|
|
69
|
+
if extrapolating:
|
|
70
|
+
note += "; OUT-OF-SCOPE pair_type for a protein-ligand head: treat as extrapolative"
|
|
71
|
+
if ligand_name:
|
|
72
|
+
note += f"; ligand={ligand_name}"
|
|
73
|
+
return build_result("affinity", _MODEL, inputs=inputs, value=hit.get("value"),
|
|
74
|
+
native_uncertainty=hit.get("native_uncertainty"),
|
|
75
|
+
available=True, cached=True, source="cache",
|
|
76
|
+
in_scope=in_scope, extrapolating=extrapolating, note=note)
|
|
77
|
+
return r # deferred: no cached run, and the long job never runs on the request path
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
def value_from_boltz_output(out_dir: str | Path) -> dict:
|
|
81
|
+
"""Parse a Boltz-2 affinity prediction directory into the cached {value, native_uncertainty} payload.
|
|
82
|
+
|
|
83
|
+
Native uncertainty is taken from the model's own outputs: half the spread between Boltz-2's two affinity
|
|
84
|
+
heads when both are present, else a binder-call entropy proxy (``1 - |2p - 1|``, 0 at p in {0,1}, 1 at 0.5).
|
|
85
|
+
"""
|
|
86
|
+
out = Path(out_dir)
|
|
87
|
+
js = sorted(p for p in out.rglob("affinity*.json"))
|
|
88
|
+
if not js:
|
|
89
|
+
raise FileNotFoundError(f"no affinity*.json under {out}")
|
|
90
|
+
d = json.loads(js[0].read_text(encoding="utf-8"))
|
|
91
|
+
val = d.get("affinity_pred_value")
|
|
92
|
+
prob = d.get("affinity_probability_binary")
|
|
93
|
+
v1, v2 = d.get("affinity_pred_value1"), d.get("affinity_pred_value2")
|
|
94
|
+
if v1 is not None and v2 is not None:
|
|
95
|
+
unc = round(abs(float(v1) - float(v2)) / 2.0, 4)
|
|
96
|
+
unc_src = "half the spread between the two Boltz-2 affinity heads"
|
|
97
|
+
elif prob is not None:
|
|
98
|
+
unc = round(1.0 - abs(2.0 * float(prob) - 1.0), 4)
|
|
99
|
+
unc_src = "binder-call entropy proxy (1 - |2p - 1|)"
|
|
100
|
+
else:
|
|
101
|
+
unc, unc_src = None, "unavailable"
|
|
102
|
+
value = {"affinity_pred_value": val, "binder_probability": prob, "units": _UNITS,
|
|
103
|
+
"heads": {"affinity_pred_value1": v1, "affinity_pred_value2": v2},
|
|
104
|
+
"native_uncertainty_source": unc_src, "source_file": js[0].name}
|
|
105
|
+
return {"value": value, "native_uncertainty": unc}
|
|
106
|
+
|
|
107
|
+
|
|
108
|
+
def cache_affinity_run(protein_seq: str, ligand_smiles: str, pair_type: str, out_dir: str | Path) -> str:
|
|
109
|
+
"""Ingest an OFF-REQUEST Boltz-2 affinity run into the oracle cache, so the request path can replay it.
|
|
110
|
+
|
|
111
|
+
Returns the cache key. Called after a separate GPU batch completes; never on the request path.
|
|
112
|
+
"""
|
|
113
|
+
payload = value_from_boltz_output(out_dir)
|
|
114
|
+
r = build_result("affinity", _MODEL, inputs=_inputs(protein_seq, ligand_smiles, pair_type), available=False)
|
|
115
|
+
cache_put(r.provenance.cache_key, payload)
|
|
116
|
+
return r.provenance.cache_key
|