pen-stack 6.10.3__tar.gz → 6.11.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.10.3 → pen_stack-6.11.0}/CHANGELOG.md +56 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/CITATION.cff +1 -1
- {pen_stack-6.10.3 → pen_stack-6.11.0}/PKG-INFO +23 -2
- {pen_stack-6.10.3 → pen_stack-6.11.0}/README.md +22 -1
- pen_stack-6.11.0/benchmarks/delivery/SHA256SUMS +2 -0
- pen_stack-6.11.0/configs/aav_serotype_tropism.yaml +81 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/configs/oracles/scope_cards.yaml +16 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/docs/DEVIATIONS_AND_DISCLOSURES.md +12 -1
- {pen_stack-6.10.3 → pen_stack-6.11.0}/docs/cards/offtarget_data.md +10 -4
- pen_stack-6.11.0/docs/delivery_recommender.md +54 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/pen_stack/__init__.py +1 -1
- {pen_stack-6.10.3 → pen_stack-6.11.0}/pen_stack/agent/cite.py +10 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/pen_stack/agent/mcp_server.py +10 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/pen_stack/api/manifest.py +11 -0
- pen_stack-6.11.0/pen_stack/design/capsid_generate.py +62 -0
- pen_stack-6.11.0/pen_stack/planner/delivery_immune.py +60 -0
- pen_stack-6.11.0/pen_stack/planner/delivery_predict.py +136 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/pen_stack/server/api.py +26 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/pen_stack/wgenome/offtarget_data.py +15 -3
- {pen_stack-6.10.3 → pen_stack-6.11.0}/pen_stack/wgenome/offtarget_predict.py +5 -4
- {pen_stack-6.10.3 → pen_stack-6.11.0}/pen_stack.egg-info/PKG-INFO +23 -2
- {pen_stack-6.10.3 → pen_stack-6.11.0}/pen_stack.egg-info/SOURCES.txt +10 -0
- pen_stack-6.11.0/prereg/SHA256_LOCK_ws_delivery.json +8 -0
- pen_stack-6.11.0/prereg/ws_delivery.yaml +39 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/pyproject.toml +1 -1
- pen_stack-6.11.0/scripts/build_capsid_fitness.py +93 -0
- pen_stack-6.11.0/scripts/offtarget_chromatin_incremental.py +148 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/LICENSE +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/MANIFEST.in +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/bench/run.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/benchmarks/genome_writing_bench/LEADERBOARD.md +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/benchmarks/genome_writing_bench/README.md +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/benchmarks/genome_writing_bench/SHA256SUMS +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/benchmarks/genome_writing_bench/SUBMISSIONS.md +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/benchmarks/genome_writing_bench/tasks.yaml +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/benchmarks/genome_writing_challenge/README.md +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/benchmarks/genome_writing_challenge/SUBMISSIONS.md +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/benchmarks/offtarget/SHA256SUMS +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/benchmarks/position_effect/README.md +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/benchmarks/position_effect/SHA256SUMS +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/benchmarks/writer_efficiency/README.md +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/benchmarks/writer_efficiency/SHA256SUMS +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/configs/antipeg.yaml +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/configs/atlas_families.yaml +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/configs/bridge_offtarget_profile.yaml +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/configs/calibration/preexisting_nab_independent.yaml +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/configs/capsid_epitope_oracle.yaml +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/configs/capsid_sequences.fasta +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/configs/cargo_polish.yaml +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/configs/cell_types.yaml +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/configs/datasets.yaml +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/configs/delivery_constraints.yaml +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/configs/delivery_rules.yaml +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/configs/delivery_vehicles.yaml +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/configs/expression/modifiers.yaml +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/configs/expression/promoters.yaml +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/configs/gates_v3.yaml +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/configs/genotoxicity_oracle.yaml +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/configs/gsh_validated_heldout.yaml +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/configs/intent_weights.yaml +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/configs/known_unknowns.yaml +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/configs/llm.yaml +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/configs/metric_guide.yaml +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/configs/mhc_epitope_oracle.yaml +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/configs/monitor_queries.yaml +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/configs/oracles/execution.yaml +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/configs/rules/delivery.yaml +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/configs/rules/fold.yaml +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/configs/rules/multiplex.yaml +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/configs/rules/payload.yaml +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/configs/rules/reachability.yaml +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/configs/safety/hazard_registry.yaml +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/configs/safety/policy.yaml +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/configs/safety/probes.yaml +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/configs/score_axes.yaml +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/configs/seroprevalence.yaml +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/configs/target_sites.yaml +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/configs/universe_crosswalk.yaml +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/configs/write_types.yaml +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/configs/writer_sequences.fasta +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/configs/wtkb_curated.yaml +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/data/curated/bridge_offtarget_energetics.json +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/data/curated/bridge_offtarget_profile_measured.parquet +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/data/curated/gene_coords.parquet +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/data/curated/unified_editor_universe.parquet +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/docs/BACKLOG.md +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/docs/DEPLOY.md +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/docs/INFRA.md +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/docs/MCP.md +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/docs/RELEASING.md +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/docs/REPRO.md +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/docs/STABILITY.md +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/docs/agent.md +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/docs/alphagenome_feasibility.md +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/docs/autonomy.md +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/docs/benchmark_circularity.md +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/docs/biosecurity.md +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/docs/build_interface.md +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/docs/cards/atlas.md +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/docs/cards/durability.md +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/docs/cards/position_effect_data.md +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/docs/cards/safety.md +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/docs/cards/writer_efficiency_data.md +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/docs/challenge.md +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/docs/closed_loop.md +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/docs/co_scientist.md +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/docs/co_scientist_loop.md +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/docs/delivery.md +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/docs/delivery_immunology.md +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/docs/digital_twin.md +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/docs/dissemination.md +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/docs/environment.md +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/docs/experiment_design.md +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/docs/generative_design.md +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/docs/immune_profiler.md +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/docs/index.md +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/docs/integrations.md +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/docs/live_oracles.md +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/docs/mechanistic_constraints.md +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/docs/offtarget.md +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/docs/oracles.md +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/docs/position_effect.md +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/docs/positioning.md +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/docs/private_data_formats.md +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/docs/quickstart.md +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/docs/responsible_use.md +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/docs/rules.md +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/docs/scope.md +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/docs/scorecard.md +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/docs/tpe_bench.md +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/docs/tutorials/compare-families.md +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/docs/tutorials/score-deliverability.md +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/docs/tutorials/where-can-i-write.md +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/docs/tutorials/which-writer-reaches-locus.md +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/docs/uncertainty.md +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/docs/verify.md +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/docs/world_model.md +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/docs/writer_efficiency.md +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/docs/writer_verification.md +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/docs/wtkb.md +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/pen_stack/_resources.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/pen_stack/active/__init__.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/pen_stack/active/acquire.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/pen_stack/active/design.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/pen_stack/active/validate.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/pen_stack/adapt/__init__.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/pen_stack/adapt/finetune.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/pen_stack/adapt/ingest.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/pen_stack/adapt/pipeline.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/pen_stack/adapt/recalibrate.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/pen_stack/adapt/report.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/pen_stack/agent/__init__.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/pen_stack/agent/co_scientist.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/pen_stack/agent/epistemic.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/pen_stack/agent/guardrails.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/pen_stack/agent/orchestrator.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/pen_stack/agent/orchestrator_live.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/pen_stack/agent/pen_agent.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/pen_stack/agent/scope.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/pen_stack/agent/tools.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/pen_stack/api/__init__.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/pen_stack/atlas/__init__.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/pen_stack/atlas/build_wtkb.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/pen_stack/atlas/crosslink.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/pen_stack/atlas/expand.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/pen_stack/atlas/guide_design.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/pen_stack/atlas/schema.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/pen_stack/atlas/scorecard.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/pen_stack/atlas/universe.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/pen_stack/atlas/variant_propose.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/pen_stack/atlas/writer_efficiency.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/pen_stack/atlas/writer_predict.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/pen_stack/atlas/writer_recommend.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/pen_stack/atlas/writer_verify.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/pen_stack/bridge/__init__.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/pen_stack/bridge/activity.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/pen_stack/bridge/cli.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/pen_stack/bridge/fold_qc.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/pen_stack/bridge/guide_qc.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/pen_stack/bridge/ingest.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/pen_stack/bridge/offtarget.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/pen_stack/bridge/offtarget_energetics.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/pen_stack/bridge/ortholog_screen.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/pen_stack/bridge/pipeline.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/pen_stack/build/__init__.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/pen_stack/build/ingest.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/pen_stack/build/protocol.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/pen_stack/build/simlab.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/pen_stack/cli.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/pen_stack/data/__init__.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/pen_stack/data/encode.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/pen_stack/data/genome.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/pen_stack/data/ingest_chromatin.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/pen_stack/data/ingest_integration.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/pen_stack/data/ingest_safety_annot.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/pen_stack/data/ingest_trip.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/pen_stack/design/__init__.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/pen_stack/design/generate.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/pen_stack/design/pareto.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/pen_stack/design/space.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/pen_stack/design/writer_variants.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/pen_stack/env/__init__.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/pen_stack/env/genome_writing_env.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/pen_stack/env/policies.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/pen_stack/graph/__init__.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/pen_stack/graph/build.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/pen_stack/graph/cell_types.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/pen_stack/graph/ingest.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/pen_stack/graph/query.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/pen_stack/graph/schema.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/pen_stack/loop/__init__.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/pen_stack/loop/continual.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/pen_stack/loop/cycle.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/pen_stack/loop/drift.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/pen_stack/mech/__init__.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/pen_stack/mech/classify_atlas.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/pen_stack/mech/whitelist.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/pen_stack/monitor/__init__.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/pen_stack/monitor/europepmc.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/pen_stack/monitor/run.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/pen_stack/monitor/triage.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/pen_stack/oracles/__init__.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/pen_stack/oracles/cache.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/pen_stack/oracles/energetics.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/pen_stack/oracles/genome.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/pen_stack/oracles/protein_design.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/pen_stack/oracles/rna.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/pen_stack/oracles/schema.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/pen_stack/oracles/status.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/pen_stack/oracles/structure.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/pen_stack/oracles/vcell.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/pen_stack/planner/__init__.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/pen_stack/planner/ada_risk.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/pen_stack/planner/antipeg_oracle.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/pen_stack/planner/capsid_epitope_oracle.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/pen_stack/planner/cargo.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/pen_stack/planner/cargo_polish.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/pen_stack/planner/delivery.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/pen_stack/planner/delivery_constraints.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/pen_stack/planner/delivery_immunology.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/pen_stack/planner/delivery_vehicles.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/pen_stack/planner/genotoxicity_oracle.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/pen_stack/planner/immune_mhc2.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/pen_stack/planner/immune_profile.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/pen_stack/planner/innate_sensing.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/pen_stack/planner/multiplex.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/pen_stack/planner/optimize.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/pen_stack/planner/pipeline.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/pen_stack/planner/report.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/pen_stack/planner/router.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/pen_stack/planner/seroprevalence_oracle.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/pen_stack/planner/target_site.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/pen_stack/rag/__init__.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/pen_stack/rag/index.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/pen_stack/rag/llm.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/pen_stack/rag/qa.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/pen_stack/rules/__init__.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/pen_stack/rules/evaluators.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/pen_stack/rules/loader.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/pen_stack/rules/schema.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/pen_stack/rules/solver.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/pen_stack/safety/__init__.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/pen_stack/safety/audit.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/pen_stack/safety/gate.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/pen_stack/safety/policy.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/pen_stack/safety/redteam.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/pen_stack/safety/registry.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/pen_stack/safety/screen.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/pen_stack/score/__init__.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/pen_stack/score/recalibrate.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/pen_stack/score/therapeutic.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/pen_stack/server/__init__.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/pen_stack/twin/__init__.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/pen_stack/twin/calibrate.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/pen_stack/twin/data/__init__.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/pen_stack/twin/data/position_effect.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/pen_stack/twin/mechanistic.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/pen_stack/twin/outcome.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/pen_stack/twin/position_effect.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/pen_stack/ui/__init__.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/pen_stack/ui/app.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/pen_stack/validate/__init__.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/pen_stack/validate/adapt_demo.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/pen_stack/validate/agent_eval.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/pen_stack/validate/bench_adversarial_tasks.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/pen_stack/validate/bench_coscientist_tasks.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/pen_stack/validate/bench_graph_tasks.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/pen_stack/validate/bench_rule_tasks.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/pen_stack/validate/bench_trust_tasks.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/pen_stack/validate/bench_writetype_tasks.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/pen_stack/validate/blind_gsh_discovery.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/pen_stack/validate/cargo_directionality.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/pen_stack/validate/closed_loop.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/pen_stack/validate/durability_baselines.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/pen_stack/validate/experiment_design.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/pen_stack/validate/expr_controls.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/pen_stack/validate/forward_hypotheses.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/pen_stack/validate/generative_design.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/pen_stack/validate/guide_qc_demo.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/pen_stack/validate/heldout_celltype_expr.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/pen_stack/validate/immune_calibration.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/pen_stack/validate/intent_specification.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/pen_stack/validate/known_biology_expr.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/pen_stack/validate/offtarget_energetics_eval.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/pen_stack/validate/out_of_scope_refusal.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/pen_stack/validate/outcome_calibration.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/pen_stack/validate/outcome_prediction.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/pen_stack/validate/paper3_benchmark.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/pen_stack/validate/paper4_real_validation.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/pen_stack/validate/paper4_validation.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/pen_stack/validate/protocol_safety.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/pen_stack/validate/safety_screening.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/pen_stack/validate/selective_prediction.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/pen_stack/validate/seq_vs_measured.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/pen_stack/validate/target_site_controls.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/pen_stack/validate/uncertainty_eval.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/pen_stack/validate/ungrounded_baseline.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/pen_stack/validate/within_locus_ranking.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/pen_stack/validate/writer_recovery.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/pen_stack/verify/__init__.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/pen_stack/verify/schema.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/pen_stack/verify/service.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/pen_stack/web/__init__.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/pen_stack/web/guide.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/pen_stack/web/llm.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/pen_stack/web/router.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/pen_stack/web/server.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/pen_stack/web/tools.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/pen_stack/wgenome/__init__.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/pen_stack/wgenome/chromatin_seq.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/pen_stack/wgenome/durability.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/pen_stack/wgenome/export_tracks.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/pen_stack/wgenome/features.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/pen_stack/wgenome/gsh_baseline.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/pen_stack/wgenome/mesh_features.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/pen_stack/wgenome/offtarget_assay.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/pen_stack/wgenome/ood.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/pen_stack/wgenome/providers.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/pen_stack/wgenome/safety.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/pen_stack/wgenome/structure3d.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/pen_stack/wgenome/uncertainty.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/pen_stack/wgenome/writability.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/pen_stack.egg-info/dependency_links.txt +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/pen_stack.egg-info/entry_points.txt +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/pen_stack.egg-info/requires.txt +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/pen_stack.egg-info/top_level.txt +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/prereg/SHA256_LOCK_phase0.json +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/prereg/SHA256_LOCK_phase1_5.json +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/prereg/SHA256_LOCK_phase2.json +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/prereg/SHA256_LOCK_phase3.json +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/prereg/SHA256_LOCK_ws_a.json +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/prereg/SHA256_LOCK_ws_acq.json +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/prereg/SHA256_LOCK_ws_aldesign.json +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/prereg/SHA256_LOCK_ws_alvalidate.json +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/prereg/SHA256_LOCK_ws_atlas.json +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/prereg/SHA256_LOCK_ws_b.json +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/prereg/SHA256_LOCK_ws_ba.json +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/prereg/SHA256_LOCK_ws_ba_v33.json +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/prereg/SHA256_LOCK_ws_ba_v45.json +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/prereg/SHA256_LOCK_ws_bench.json +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/prereg/SHA256_LOCK_ws_c.json +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/prereg/SHA256_LOCK_ws_cal.json +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/prereg/SHA256_LOCK_ws_calib.json +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/prereg/SHA256_LOCK_ws_challenge.json +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/prereg/SHA256_LOCK_ws_chat.json +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/prereg/SHA256_LOCK_ws_cite.json +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/prereg/SHA256_LOCK_ws_continual.json +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/prereg/SHA256_LOCK_ws_cosci2.json +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/prereg/SHA256_LOCK_ws_crit.json +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/prereg/SHA256_LOCK_ws_ct.json +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/prereg/SHA256_LOCK_ws_d.json +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/prereg/SHA256_LOCK_ws_drift.json +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/prereg/SHA256_LOCK_ws_e.json +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/prereg/SHA256_LOCK_ws_env.json +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/prereg/SHA256_LOCK_ws_ep.json +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/prereg/SHA256_LOCK_ws_epitope.json +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/prereg/SHA256_LOCK_ws_expr2.json +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/prereg/SHA256_LOCK_ws_f.json +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/prereg/SHA256_LOCK_ws_frontend.json +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/prereg/SHA256_LOCK_ws_g.json +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/prereg/SHA256_LOCK_ws_gen.json +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/prereg/SHA256_LOCK_ws_genotox.json +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/prereg/SHA256_LOCK_ws_graph.json +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/prereg/SHA256_LOCK_ws_h.json +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/prereg/SHA256_LOCK_ws_hybrid.json +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/prereg/SHA256_LOCK_ws_immune.json +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/prereg/SHA256_LOCK_ws_immune2.json +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/prereg/SHA256_LOCK_ws_ingest.json +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/prereg/SHA256_LOCK_ws_innate.json +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/prereg/SHA256_LOCK_ws_loop.json +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/prereg/SHA256_LOCK_ws_manifest.json +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/prereg/SHA256_LOCK_ws_mc.json +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/prereg/SHA256_LOCK_ws_mcp.json +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/prereg/SHA256_LOCK_ws_mech.json +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/prereg/SHA256_LOCK_ws_mon.json +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/prereg/SHA256_LOCK_ws_o.json +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/prereg/SHA256_LOCK_ws_offtarget.json +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/prereg/SHA256_LOCK_ws_openapi.json +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/prereg/SHA256_LOCK_ws_orch.json +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/prereg/SHA256_LOCK_ws_outcome.json +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/prereg/SHA256_LOCK_ws_pareto.json +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/prereg/SHA256_LOCK_ws_peg.json +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/prereg/SHA256_LOCK_ws_plan.json +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/prereg/SHA256_LOCK_ws_policy.json +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/prereg/SHA256_LOCK_ws_profile.json +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/prereg/SHA256_LOCK_ws_proto.json +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/prereg/SHA256_LOCK_ws_r.json +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/prereg/SHA256_LOCK_ws_redteam.json +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/prereg/SHA256_LOCK_ws_route.json +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/prereg/SHA256_LOCK_ws_screen.json +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/prereg/SHA256_LOCK_ws_seroprev.json +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/prereg/SHA256_LOCK_ws_simlab.json +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/prereg/SHA256_LOCK_ws_twincal.json +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/prereg/SHA256_LOCK_ws_uq.json +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/prereg/SHA256_LOCK_ws_v.json +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/prereg/SHA256_LOCK_ws_vcell.json +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/prereg/SHA256_LOCK_ws_writer.json +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/prereg/SHA256_LOCK_ws_wv.json +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/prereg/paper1.yaml +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/prereg/paper2.yaml +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/prereg/paper3.yaml +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/prereg/paper4.yaml +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/prereg/phase0.yaml +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/prereg/ws_a.yaml +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/prereg/ws_acq.yaml +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/prereg/ws_aldesign.yaml +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/prereg/ws_alvalidate.yaml +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/prereg/ws_atlas.yaml +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/prereg/ws_b.yaml +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/prereg/ws_ba.yaml +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/prereg/ws_ba_v33.yaml +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/prereg/ws_ba_v45.yaml +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/prereg/ws_bench.yaml +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/prereg/ws_c.yaml +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/prereg/ws_cal.yaml +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/prereg/ws_calib.yaml +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/prereg/ws_challenge.yaml +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/prereg/ws_chat.yaml +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/prereg/ws_cite.yaml +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/prereg/ws_continual.yaml +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/prereg/ws_cosci2.yaml +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/prereg/ws_crit.yaml +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/prereg/ws_ct.yaml +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/prereg/ws_d.yaml +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/prereg/ws_drift.yaml +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/prereg/ws_e.yaml +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/prereg/ws_env.yaml +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/prereg/ws_ep.yaml +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/prereg/ws_epitope.yaml +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/prereg/ws_expr2.yaml +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/prereg/ws_f.yaml +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/prereg/ws_frontend.yaml +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/prereg/ws_g.yaml +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/prereg/ws_gen.yaml +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/prereg/ws_genotox.yaml +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/prereg/ws_graph.yaml +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/prereg/ws_h.yaml +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/prereg/ws_hybrid.yaml +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/prereg/ws_immune.yaml +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/prereg/ws_immune2.yaml +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/prereg/ws_ingest.yaml +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/prereg/ws_innate.yaml +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/prereg/ws_loop.yaml +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/prereg/ws_manifest.yaml +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/prereg/ws_mc.yaml +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/prereg/ws_mcp.yaml +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/prereg/ws_mech.yaml +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/prereg/ws_mon.yaml +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/prereg/ws_o.yaml +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/prereg/ws_offtarget.yaml +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/prereg/ws_openapi.yaml +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/prereg/ws_orch.yaml +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/prereg/ws_outcome.yaml +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/prereg/ws_pareto.yaml +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/prereg/ws_peg.yaml +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/prereg/ws_plan.yaml +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/prereg/ws_policy.yaml +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/prereg/ws_profile.yaml +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/prereg/ws_proto.yaml +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/prereg/ws_r.yaml +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/prereg/ws_redteam.yaml +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/prereg/ws_route.yaml +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/prereg/ws_screen.yaml +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/prereg/ws_seroprev.yaml +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/prereg/ws_simlab.yaml +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/prereg/ws_twincal.yaml +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/prereg/ws_uq.yaml +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/prereg/ws_v.yaml +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/prereg/ws_vcell.yaml +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/prereg/ws_writer.yaml +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/prereg/ws_wv.yaml +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/scripts/calibrate_immune_axes.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/scripts/fetch_licensed_sources.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/scripts/offtarget_chromatin_matched.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/scripts/offtarget_chromatin_validation.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/scripts/p1_build_atlas.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/scripts/p1_build_durability.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/scripts/p1_build_position_effect.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/scripts/p1_build_writer_eff.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/scripts/p1_export_tracks.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/scripts/p1_safety_concordance.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/scripts/p1_train_safety.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/scripts/p1_validation_report.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/scripts/p2_build_atlas.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/scripts/p3_benchmark_report.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/scripts/p4_genome_scan.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/scripts/p52_build_genotox_oracle.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/scripts/p53_build_epitope_oracle.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/scripts/ws_b_report.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/scripts/ws_c_report.py +0 -0
- {pen_stack-6.10.3 → pen_stack-6.11.0}/setup.cfg +0 -0
|
@@ -3,6 +3,62 @@
|
|
|
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.11.0] - 2026-06-20 - WS-DELIVERY (PEN-DELIVER: cross-modality deliverability + learned capsid-fitness)
|
|
7
|
+
|
|
8
|
+
**Series III, Stage D.** Delivery moves from an 8-vehicle rule palette to a cross-modality recommender with a
|
|
9
|
+
**learned, benchmarked AAV capsid-fitness model**, a **grounded serotype→tissue tropism prior** from approved
|
|
10
|
+
therapies, and an **immune-coupled dose tradeoff** — without fabricating tropism. All datasets independently verified.
|
|
11
|
+
|
|
12
|
+
### Added
|
|
13
|
+
- **Learned AAV capsid-fitness on FLIP-AAV** (`pen_stack/planner/delivery_predict.py`, `scripts/build_capsid_fitness.py`,
|
|
14
|
+
`benchmarks/delivery/`). Trained on the FLIP-AAV benchmark (Dallago 2021; Bryant 2021 packaging fitness,
|
|
15
|
+
`10.1038/s41587-020-00793-4`; Ogden 2019 `10.1126/science.aaw2900`). **Gate D-G1 PASSES** — beats a mutation-burden
|
|
16
|
+
baseline on **both** held-out splits: `sampled` Spearman **0.920 vs 0.522** (CI [0.387, 0.411]); `mut_des`
|
|
17
|
+
(mutant→designed) **0.814 vs 0.752** (CI [0.061, 0.064]). The 217 MB/split FLIP data stays on the VM; the derived
|
|
18
|
+
metrics + reproducible build script are committed. The ~3 MB model itself is gitignored — regenerated via
|
|
19
|
+
`scripts/build_capsid_fitness.py` and mounted into the deployed app (like `position_effect.pkl`); the axis abstains
|
|
20
|
+
gracefully when absent. Predicted fitness is a CANDIDATE for the measured packaging axis, NOT in-vivo tropism.
|
|
21
|
+
- **Serotype→tissue tropism priors** (`configs/aav_serotype_tropism.yaml`) from APPROVED AAV therapies (AAV9→CNS,
|
|
22
|
+
**AAVrh74→skeletal muscle** vs **AAVRh74var→liver** — different capsids, kept separate; AAV5→liver; AAV2→retina/
|
|
23
|
+
putamen via local injection). A grounded prior for an approved serotype; a known-unknown (abstain) for a novel
|
|
24
|
+
capsid. Casgevy/Lyfgenia carry no serotype prior (not-AAV controls).
|
|
25
|
+
- **Immune-coupled dose tradeoff** (`pen_stack/planner/delivery_immune.py`) — fuses deliverability with the Stage G
|
|
26
|
+
immune profile, surfaces dose↔immunogenicity per vehicle as a vector (`collapsed_score=None`, never fused).
|
|
27
|
+
- **Verify-gated generative capsids** (`pen_stack/design/capsid_generate.py`) — fitness-filtered VP1 variants, 🔵
|
|
28
|
+
candidates only; abstains without the model.
|
|
29
|
+
- **Surfaces:** REST `POST /delivery` + `POST /capsid_fitness` + `GET /delivery/tropism`, MCP `delivery_recommend`,
|
|
30
|
+
manifest `recommend_delivery` + `capsid_fitness`, a `capsid_fitness` scope card, a `delivery` Challenge task
|
|
31
|
+
(serotype→tissue), prereg `ws_delivery.yaml`.
|
|
32
|
+
|
|
33
|
+
### Honest limits / deviations (see docs/DEVIATIONS_AND_DISCLOSURES.md)
|
|
34
|
+
- The capsid-fitness model is a one-hot gradient-boosting model, not a protein-LM (disclosed; passes the gate anyway;
|
|
35
|
+
protein-LM is the upgrade path). Capsid-fitness covers AAV only (VLP/LNP data is thinner). In-vivo human tropism is
|
|
36
|
+
a known-unknown except the approved-therapy priors; novel capsids abstain on tropism. alpha-retro-VLP is exploratory.
|
|
37
|
+
|
|
38
|
+
## [6.10.4] - 2026-06-20 - Chromatin incremental-value test (annotation, not a re-ranker) — chromatin work complete
|
|
39
|
+
|
|
40
|
+
**PATCH — the final chromatin question, answered.** v6.10.3 validated accessibility as a moderate standalone
|
|
41
|
+
predictor; v6.10.4 tests whether it adds **incremental** value *on top of* the CRISOT sequence score — i.e. whether
|
|
42
|
+
it should re-rank.
|
|
43
|
+
|
|
44
|
+
### Added
|
|
45
|
+
- **Incremental-value analysis** (`scripts/offtarget_chromatin_incremental.py`; result in
|
|
46
|
+
`benchmarks/offtarget/chromatin_incremental.json`). On GUIDE-seq (HEK293T-matched), per off-target CRISOT +
|
|
47
|
+
accessibility: (A) a conditional logistic regression `active ~ z(CRISOT) + z(accessibility)` and (B) a
|
|
48
|
+
leave-one-guide-out held-out AUPRC of CRISOT-only vs a CRISOT+accessibility combiner — tested at two candidate
|
|
49
|
+
imbalances (1:16 and a realistic 1:123). **Result:** accessibility carries a **small, real conditional signal**
|
|
50
|
+
(coef ≈ 0.35, bootstrap CI excludes 0 at both imbalances) but adds **NO held-out ranking improvement** over CRISOT
|
|
51
|
+
(AUPRC gap CI includes 0 at both: −0.0025 [−0.011, +0.005] and +0.0027 [−0.014, +0.021]).
|
|
52
|
+
|
|
53
|
+
### Decision
|
|
54
|
+
- **Chromatin is a validated ANNOTATION, NOT a re-ranker.** The CRISOT sequence score already captures the
|
|
55
|
+
practically-relevant nomination ranking; a CRISOT+accessibility combiner does not improve held-out AUPRC, so it is
|
|
56
|
+
**not** wired into the numeric risk score (`CHROMATIN_VALIDATION.changes_numeric_risk_score = False`). The fitted
|
|
57
|
+
combiner coefficients are recorded for transparency but intentionally not applied. Ledger + docs updated.
|
|
58
|
+
- **This completes the chromatin context work** (v6.10.1 wired → v6.10.2 cross-cell weak → v6.10.3 cell-type-matched
|
|
59
|
+
VALIDATED moderate → v6.10.4 incremental tested, annotation-only). Nothing about chromatin is now open or
|
|
60
|
+
undisclosed.
|
|
61
|
+
|
|
6
62
|
## [6.10.3] - 2026-06-20 - Chromatin context: cell-type-matched validation (VALIDATED, moderate)
|
|
7
63
|
|
|
8
64
|
**PATCH — the definitive chromatin test.** v6.10.2's controlled experiment was ambiguous (GUIDE-seq positive, TTISS
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: pen-stack
|
|
3
|
-
Version: 6.
|
|
3
|
+
Version: 6.11.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,7 +90,7 @@ every design against rule-grounded mechanism, reports calibrated confidence, cit
|
|
|
90
90
|
[](https://codecov.io/gh/ahmedanees-m/pen-stack)
|
|
91
91
|
[](LICENSE)
|
|
92
92
|
[](https://www.python.org/)
|
|
93
|
-
[](CHANGELOG.md)
|
|
94
94
|
[](docs/STABILITY.md)
|
|
95
95
|
[](tests/)
|
|
96
96
|
[](https://github.com/astral-sh/ruff)
|
|
@@ -148,6 +148,27 @@ demonstrated (v5.12) and the benchmark went public (v5.13).
|
|
|
148
148
|
> unknown funnel remains — made legible (scope flags, known-unknowns, honest baselines, no fabrication), not
|
|
149
149
|
> hidden.
|
|
150
150
|
|
|
151
|
+
## What is new in v6.11 — PEN-DELIVER (cross-modality deliverability + learned capsid-fitness)
|
|
152
|
+
|
|
153
|
+
Delivery was an 8-vehicle rule palette that couldn't predict capsid fitness or tropism. v6.11 makes it a
|
|
154
|
+
cross-modality recommender with a **learned, benchmarked AAV capsid-fitness model** and a **grounded serotype→tissue
|
|
155
|
+
tropism prior** — without ever fabricating tropism.
|
|
156
|
+
|
|
157
|
+
- **Learned capsid-fitness on FLIP-AAV** (Dallago 2021; Bryant 2021). The model **beats a mutation-burden baseline on
|
|
158
|
+
both held-out splits** — `sampled` Spearman **0.92 vs 0.52**, and the hard mutant→designed `mut_des` split
|
|
159
|
+
**0.81 vs 0.75** (per-split bootstrap CI excludes 0). The 217 MB FLIP data stays on the VM; the derived metrics +
|
|
160
|
+
reproducible build script are committed and the ~3 MB model is gitignored (regenerated via
|
|
161
|
+
`scripts/build_capsid_fitness.py` and mounted into the deployed app, like `position_effect.pkl`; the axis abstains
|
|
162
|
+
when absent). Predicted fitness is a **candidate** for the *measured packaging axis* — not an in-vivo tropism claim.
|
|
163
|
+
- **Grounded serotype→tissue priors** from approved AAV therapies (AAV9→CNS, AAVrh74→skeletal muscle, AAV5→liver,
|
|
164
|
+
AAV2→retina/putamen via local injection) — and an honest **known-unknown (abstain)** for a novel capsid. The
|
|
165
|
+
AAVrh74 (muscle) vs AAVRh74var (liver) distinction is kept; ex-vivo therapies carry no serotype prior.
|
|
166
|
+
- **Immune-coupled dose tradeoff** — fuses deliverability with the Stage G immune profile and surfaces the
|
|
167
|
+
dose↔immunogenicity tension per vehicle as a vector, **never collapsed**.
|
|
168
|
+
- **Verify-gated generative capsids** (🔵 candidates), and surfaces: REST, MCP `delivery_recommend`, a `delivery`
|
|
169
|
+
Challenge task. *(Plan deviations — e.g. one-hot model vs a protein-LM — are disclosed in
|
|
170
|
+
[docs/DEVIATIONS_AND_DISCLOSURES.md](docs/DEVIATIONS_AND_DISCLOSURES.md).)*
|
|
171
|
+
|
|
151
172
|
## What is new in v6.10 — PEN-OFFTGT (cross-writer-family off-target nomination)
|
|
152
173
|
|
|
153
174
|
Off-target prediction was a single-family bridge pseudosite scan that abstained for nucleases and integrases.
|
|
@@ -15,7 +15,7 @@ every design against rule-grounded mechanism, reports calibrated confidence, cit
|
|
|
15
15
|
[](https://codecov.io/gh/ahmedanees-m/pen-stack)
|
|
16
16
|
[](LICENSE)
|
|
17
17
|
[](https://www.python.org/)
|
|
18
|
-
[](CHANGELOG.md)
|
|
19
19
|
[](docs/STABILITY.md)
|
|
20
20
|
[](tests/)
|
|
21
21
|
[](https://github.com/astral-sh/ruff)
|
|
@@ -73,6 +73,27 @@ demonstrated (v5.12) and the benchmark went public (v5.13).
|
|
|
73
73
|
> unknown funnel remains — made legible (scope flags, known-unknowns, honest baselines, no fabrication), not
|
|
74
74
|
> hidden.
|
|
75
75
|
|
|
76
|
+
## What is new in v6.11 — PEN-DELIVER (cross-modality deliverability + learned capsid-fitness)
|
|
77
|
+
|
|
78
|
+
Delivery was an 8-vehicle rule palette that couldn't predict capsid fitness or tropism. v6.11 makes it a
|
|
79
|
+
cross-modality recommender with a **learned, benchmarked AAV capsid-fitness model** and a **grounded serotype→tissue
|
|
80
|
+
tropism prior** — without ever fabricating tropism.
|
|
81
|
+
|
|
82
|
+
- **Learned capsid-fitness on FLIP-AAV** (Dallago 2021; Bryant 2021). The model **beats a mutation-burden baseline on
|
|
83
|
+
both held-out splits** — `sampled` Spearman **0.92 vs 0.52**, and the hard mutant→designed `mut_des` split
|
|
84
|
+
**0.81 vs 0.75** (per-split bootstrap CI excludes 0). The 217 MB FLIP data stays on the VM; the derived metrics +
|
|
85
|
+
reproducible build script are committed and the ~3 MB model is gitignored (regenerated via
|
|
86
|
+
`scripts/build_capsid_fitness.py` and mounted into the deployed app, like `position_effect.pkl`; the axis abstains
|
|
87
|
+
when absent). Predicted fitness is a **candidate** for the *measured packaging axis* — not an in-vivo tropism claim.
|
|
88
|
+
- **Grounded serotype→tissue priors** from approved AAV therapies (AAV9→CNS, AAVrh74→skeletal muscle, AAV5→liver,
|
|
89
|
+
AAV2→retina/putamen via local injection) — and an honest **known-unknown (abstain)** for a novel capsid. The
|
|
90
|
+
AAVrh74 (muscle) vs AAVRh74var (liver) distinction is kept; ex-vivo therapies carry no serotype prior.
|
|
91
|
+
- **Immune-coupled dose tradeoff** — fuses deliverability with the Stage G immune profile and surfaces the
|
|
92
|
+
dose↔immunogenicity tension per vehicle as a vector, **never collapsed**.
|
|
93
|
+
- **Verify-gated generative capsids** (🔵 candidates), and surfaces: REST, MCP `delivery_recommend`, a `delivery`
|
|
94
|
+
Challenge task. *(Plan deviations — e.g. one-hot model vs a protein-LM — are disclosed in
|
|
95
|
+
[docs/DEVIATIONS_AND_DISCLOSURES.md](docs/DEVIATIONS_AND_DISCLOSURES.md).)*
|
|
96
|
+
|
|
76
97
|
## What is new in v6.10 — PEN-OFFTGT (cross-writer-family off-target nomination)
|
|
77
98
|
|
|
78
99
|
Off-target prediction was a single-family bridge pseudosite scan that abstained for nucleases and integrases.
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
# PEN-STACK v6.11 — AAV serotype -> tissue tropism PRIORS, grounded in APPROVED gene therapies (D-WS1).
|
|
2
|
+
# Each prior is a DOCUMENTED, real serotype->tissue mapping evidenced by an FDA/EMA-approved product (the
|
|
3
|
+
# authoritative source for "this capsid delivers to this tissue in humans"). Independently verified 2026-06-20.
|
|
4
|
+
#
|
|
5
|
+
# HONEST SCOPE: these are population-level PRIORS for the listed serotypes, strongest for the approved route.
|
|
6
|
+
# - AAV2 tropism is ROUTE-DEPENDENT (retina via subretinal; CNS-putamen via intraputaminal) — local injection, not
|
|
7
|
+
# intrinsic systemic tropism. `route` is a covariate, not ignorable.
|
|
8
|
+
# - AAVrh74 (Elevidys, skeletal muscle) and AAVRh74var (Beqvez, liver) are DIFFERENT capsids with DIFFERENT tropism —
|
|
9
|
+
# never collapsed into one "Rh74" prior.
|
|
10
|
+
# - Ex-vivo cell therapies (Casgevy = non-viral CRISPR RNP; Lyfgenia = lentiviral) are NOT AAV and carry NO
|
|
11
|
+
# serotype->tissue prior (listed only as not-AAV controls).
|
|
12
|
+
# - For a NOVEL / engineered capsid with no approved precedent, in-vivo human tropism is a known-unknown (⛔) — the
|
|
13
|
+
# recommender abstains on the tropism prior and never fabricates a tissue.
|
|
14
|
+
|
|
15
|
+
version: "1.0"
|
|
16
|
+
|
|
17
|
+
serotypes:
|
|
18
|
+
AAV9:
|
|
19
|
+
tissue: ["CNS", "motor_neuron"]
|
|
20
|
+
route: "systemic IV (blood-brain-barrier-crossing)"
|
|
21
|
+
example_product: "Zolgensma (onasemnogene abeparvovec)"
|
|
22
|
+
indication: "spinal muscular atrophy"
|
|
23
|
+
approval: "FDA 2019"
|
|
24
|
+
source: "FDA/Novartis PI; DailyMed setid 68cd4f06-70e1-40d8-bedb-609ec0afa471"
|
|
25
|
+
doi: "10.1056/NEJMoa1706198" # Mendell et al. NEJM 2017 (AVXS-101 phase 1)
|
|
26
|
+
confidence: grounded
|
|
27
|
+
AAVrh74:
|
|
28
|
+
tissue: ["skeletal_muscle", "cardiac_muscle"]
|
|
29
|
+
route: "systemic IV"
|
|
30
|
+
note: "capsid serotype rh74; AAV2-derived ITRs"
|
|
31
|
+
example_product: "Elevidys (delandistrogene moxeparvovec)"
|
|
32
|
+
indication: "Duchenne muscular dystrophy"
|
|
33
|
+
approval: "FDA 2023"
|
|
34
|
+
source: "FDA PI; DailyMed setid 3525abcd-fbd2-46c5-9706-cffdf2e8a361"
|
|
35
|
+
confidence: grounded
|
|
36
|
+
AAV5:
|
|
37
|
+
tissue: ["liver"]
|
|
38
|
+
route: "systemic IV"
|
|
39
|
+
example_product: "Hemgenix (etranacogene dezaparvovec); Roctavian (valoctocogene roxaparvovec)"
|
|
40
|
+
indication: "hemophilia B; hemophilia A"
|
|
41
|
+
approval: "FDA 2022 / 2023"
|
|
42
|
+
source: "FDA Hemgenix + Roctavian product pages"
|
|
43
|
+
doi: "10.1056/NEJMoa2211644" # Pipe et al. NEJM 2023 (HOPE-B, etranacogene)
|
|
44
|
+
confidence: grounded
|
|
45
|
+
AAVRh74var:
|
|
46
|
+
tissue: ["liver"]
|
|
47
|
+
route: "systemic IV"
|
|
48
|
+
note: "an ENGINEERED Rh74 VARIANT capsid — distinct from wild-type AAVrh74 (which is muscle-tropic)"
|
|
49
|
+
example_product: "Beqvez (fidanacogene elaparvovec)"
|
|
50
|
+
indication: "hemophilia B"
|
|
51
|
+
approval: "FDA 2024"
|
|
52
|
+
source: "FDA Beqvez PI"
|
|
53
|
+
confidence: grounded
|
|
54
|
+
AAV2:
|
|
55
|
+
tissue: ["retina", "CNS_putamen"]
|
|
56
|
+
route: "LOCAL injection only (subretinal for retina; intraputaminal for CNS) — route-dependent, NOT systemic"
|
|
57
|
+
example_product: "Luxturna (voretigene neparvovec, retina); Upstaza/Kebilidi (eladocagene exuparvovec, putamen)"
|
|
58
|
+
indication: "RPE65 inherited retinal dystrophy; AADC deficiency"
|
|
59
|
+
approval: "FDA 2017 (Luxturna); EMA 2022 / FDA 2024 (Upstaza/Kebilidi)"
|
|
60
|
+
source: "FDA Luxturna; EMA Upstaza EPAR"
|
|
61
|
+
doi: "10.1016/S0140-6736(17)31868-8" # Russell et al. Lancet 2017 (voretigene phase 3)
|
|
62
|
+
confidence: grounded
|
|
63
|
+
|
|
64
|
+
# NOT AAV — no serotype->tissue prior (ex-vivo cell therapies; tissue targeting comes from HSC selection +
|
|
65
|
+
# autologous transplant + conditioning, NOT capsid tropism). Listed only as not-AAV controls.
|
|
66
|
+
not_aav_controls:
|
|
67
|
+
Casgevy:
|
|
68
|
+
modality: "ex-vivo CRISPR/Cas9 RNP, non-viral electroporation of CD34+ HSCs"
|
|
69
|
+
serotype_prior: none
|
|
70
|
+
approval: "FDA 2023"
|
|
71
|
+
Lyfgenia:
|
|
72
|
+
modality: "ex-vivo lentiviral (BB305 LVV) modified CD34+ HSCs"
|
|
73
|
+
serotype_prior: none
|
|
74
|
+
approval: "FDA 2023"
|
|
75
|
+
|
|
76
|
+
modeling_notes:
|
|
77
|
+
- "route is a covariate: AAV2's retina/putamen tropism is via LOCAL injection, not systemic IV"
|
|
78
|
+
- "AAVrh74 (muscle) vs AAVRh74var (liver) are separate capsids — never merge"
|
|
79
|
+
- "AAV5 -> liver is the strongest systemic-IV prior (two independent approved products)"
|
|
80
|
+
- "novel/engineered capsid with no approved precedent -> in-vivo human tropism is a known-unknown (abstain)"
|
|
81
|
+
provenance_dois: ["10.1056/NEJMoa1706198", "10.1056/NEJMoa2211644", "10.1016/S0140-6736(17)31868-8"]
|
|
@@ -139,6 +139,22 @@ oracles:
|
|
|
139
139
|
generalizes_to_unseen_loci: false
|
|
140
140
|
license: "open (this work; MHCflurry 10.1016/j.cels.2020.06.010, HLA-I supertypes 10.1186/1471-2172-9-1)"
|
|
141
141
|
|
|
142
|
+
capsid_fitness: # v6.11 WS-DELIVERY: learned AAV capsid packaging-fitness + serotype tropism priors
|
|
143
|
+
family: protein_design
|
|
144
|
+
version: "flip-aav-gbr-2026"
|
|
145
|
+
output_kind: baseline # scores/ranks capsid variants + tissue priors, not generative
|
|
146
|
+
valid_for: "RELATIVE AAV capsid PACKAGING-FITNESS prediction for VP1 variants (learned on FLIP-AAV / Bryant
|
|
147
|
+
2021; beats a mutation-burden baseline on held-out splits incl. mutant->designed); and GROUNDED serotype->
|
|
148
|
+
tissue tropism PRIORS from approved AAV gene therapies (AAV9->CNS, AAVrh74->skeletal muscle, AAV5->liver,
|
|
149
|
+
AAV2->retina/putamen via local injection)"
|
|
150
|
+
not_valid_for: "IN-VIVO HUMAN TROPISM of a capsid (the measured axis is packaging viability/assembly, not in-vivo
|
|
151
|
+
tissue targeting — a known-unknown except the approved-therapy priors); a NOVEL/engineered capsid's tissue
|
|
152
|
+
(abstains, never fabricated); manufacturing/CMC; immunogenicity magnitude (Stage G; a known-unknown);
|
|
153
|
+
VLP/LNP capsid-fitness (no equivalent learned model — thinner data)"
|
|
154
|
+
generalizes_to_unseen_loci: false
|
|
155
|
+
license: "open (this work; FLIP-AAV 10.1101/2021.11.09.467890, Bryant 2021 10.1038/s41587-020-00793-4,
|
|
156
|
+
Ogden 2019 10.1126/science.aaw2900; serotype priors from approved-therapy FDA approvals)"
|
|
157
|
+
|
|
142
158
|
offtarget_nomination: # v6.10 WS-OFFTARGET: cross-family off-target NOMINATION (not clearance)
|
|
143
159
|
family: genome
|
|
144
160
|
version: "crisot+homology-2026"
|
|
@@ -16,13 +16,24 @@ applicable (e.g. single contributor).
|
|
|
16
16
|
|---|---|---|
|
|
17
17
|
| Nuclease predictor named in plan (CCLMoff / CRISMER) vs shipped (CRISOT) | **DISCLOSED** | We use **CRISOT-Score** (Chen 2023, CC-BY-NC, CPU), not the plan's CCLMoff/CRISMER. Justified: **CRISMER ships no license** (cannot be redistributed/wrapped); **CCLMoff** is a GPU RNA-language-model stack AND was trained on these very assays (evaluating it on them would be **leakage**), whereas **CRISOT-Score is MD-physics, assay-agnostic → a leakage-clean held-out evaluation**. CRISOT is the more rigorous and license-appropriate choice. A genuine substitution, disclosed. |
|
|
18
18
|
| Assay coverage (plan listed GUIDE/CIRCLE/CHANGE/SITE/SURRO/TTISS/Digenome-seq) | **FIXED (v6.10.1)** | v6.10.0 used GUIDE-seq + CIRCLE-seq only. v6.10.1 adds **CHANGE-seq + SITE-seq** (independent broad guide panels) — CRISOT beats homology on **all four** (per-guide bootstrap CI excludes 0). SURRO-seq is targeted/biased (kept as an orthogonal reference, not genome-wide truth); TTISS/Digenome-seq remain **DISCLOSED** as not-yet-folded-in. |
|
|
19
|
-
| "Chromatin-aware via the Stage B feature store" | **VALIDATED (moderate, cell-type-matched; v6.10.3)** | v6.10.0 overclaimed "chromatin-aware" with only a caller hook → v6.10.1 added a real `locus_accessibility()` (verified on the VM) → v6.10.2 ran a controlled test with the cross-cell K562 proxy and got a *weak/inconsistent* result (GUIDE-seq 0.58, TTISS 0.346, in-vitro null) → **v6.10.3 settled it with a CELL-TYPE-MATCHED track** (ENCODE HEK293T DNase, ENCFF529BOG; matches GUIDE-seq/TTISS). **Cell-type matching lifts the canonical WT-Cas9 cell-based assay GUIDE-seq from AUROC 0.58 → 0.671 (CI [0.642, 0.701])**, the in-vitro control stays null (0.494). **VERDICT: VALIDATED (moderate, cell-type-matched) for WT-Cas9 cell-based off-target activity** — the cross-cell K562 proxy was dampening a real effect. Honest caveats: the effect is **moderate** (the sequence/CRISOT score
|
|
19
|
+
| "Chromatin-aware via the Stage B feature store" | **VALIDATED (moderate, cell-type-matched; v6.10.3)** | v6.10.0 overclaimed "chromatin-aware" with only a caller hook → v6.10.1 added a real `locus_accessibility()` (verified on the VM) → v6.10.2 ran a controlled test with the cross-cell K562 proxy and got a *weak/inconsistent* result (GUIDE-seq 0.58, TTISS 0.346, in-vitro null) → **v6.10.3 settled it with a CELL-TYPE-MATCHED track** (ENCODE HEK293T DNase, ENCFF529BOG; matches GUIDE-seq/TTISS). **Cell-type matching lifts the canonical WT-Cas9 cell-based assay GUIDE-seq from AUROC 0.58 → 0.671 (CI [0.642, 0.701])**, the in-vitro control stays null (0.494). **VERDICT: VALIDATED (moderate, cell-type-matched) for WT-Cas9 cell-based off-target activity** — the cross-cell K562 proxy was dampening a real effect. Honest caveats: the effect is **moderate** (the sequence/CRISOT score dominates); it does **not** transfer to TTISS (0.383, an expected outlier — a Cas9-*variant* specificity assay). **v6.10.4 closed the last piece** — does accessibility add *incremental* value over CRISOT? On GUIDE-seq (HEK293T-matched), accessibility carries a **small real conditional signal** (logreg coef ~0.35, CI excludes 0 at two imbalances) but adds **NO held-out ranking improvement** over CRISOT (AUPRC gap CI includes 0 at both). **Decision: chromatin is a validated ANNOTATION, NOT a re-ranker** — it does **not** change the numeric risk score (CRISOT captures the ranking); the fitted combiner is recorded but intentionally not applied. Full results: `benchmarks/offtarget/chromatin_{validation,incremental}.json`; reproducible scripts `scripts/offtarget_chromatin_{validation,matched,incremental}.py`. **This is the final, complete state — nothing about chromatin is now open or undisclosed.** |
|
|
20
20
|
| Held-out **guide** AND **locus** splits | **DISCLOSED** | Held-out-**guide** is implemented; a genomic-coordinate **locus** split is **not possible** — the harmonized assay data ships sequences, not coordinates. Instead we add **cross-assay generalization** (the assay-agnostic CRISOT-Score evaluated on GUIDE/CIRCLE canonical guides + CHANGE/SITE independent panels). This is the leakage-clean substitute and is stated in `benchmarks/offtarget/split.json`. |
|
|
21
21
|
| Learned **integrase** off-target scorer (plan: "learned on HIDE/Cryptic-seq") | **DISCLOSED** | Shipped as a documented **pseudo-attB cryptic scan** on the real Bxb1 attB core, not a learned model — Cryptic-seq/HIDE-seq are recent preprints and IntQuery has **no public weights**, so a real learned integrase predictor is not groundable. Flagged extrapolative; IntQuery cited as paper-only. |
|
|
22
22
|
| Bench "joins the Challenge" | **FIXED (v6.10.1)** | An `offtarget` nomination task is added to the Genome-Writing Challenge (`benchmarks/genome_writing_challenge/harness.py`) — non-circular (label = wet-lab Active call), data-gated on the fixture. |
|
|
23
23
|
| "≥1 external use" (success criterion) | **DISCLOSED** | Forward-looking; not yet met (no external submission). The surfaces (REST/MCP/manifest/web) exist to enable it. |
|
|
24
24
|
| HIDE-seq / Cryptic-seq integrase **data** | **DISCLOSED** | Validated + cited, **not used as data** (single-company Bxb1-centric preprint; bridge off-target is unmodeled). Used only to ground the assay recommender. |
|
|
25
25
|
|
|
26
|
+
## v6.11 — PEN-DELIVER (Stage D, delivery)
|
|
27
|
+
|
|
28
|
+
| Item | Status | Detail |
|
|
29
|
+
|---|---|---|
|
|
30
|
+
| Capsid-fitness model: plan named a "protein-LM" | **DISCLOSED** | Shipped a **windowed one-hot gradient-boosting** model (CPU, reproducible, ~3 MB), not a protein language model. It still **passes D-G1** (beats the mutation-burden baseline on both FLIP-AAV splits, CI excludes 0). A protein-LM (Wu et al. 2025, `10.1089/hum.2024.227`, reported r≈0.82) is the upgrade path — deferred. |
|
|
31
|
+
| Capsid-fitness covers **AAV only** | **DISCLOSED** | No learned fitness model for VLP/LNP capsids — the public data is far thinner than AAV (per the dataset validation). VLP/LNP are ranked by the documented rule palette only; the recommender does not over-rank low-N modalities. |
|
|
32
|
+
| FLIP-AAV: used `sampled` + `mut_des`; multi-trait (Eid 2024) not used | **DISCLOSED** | The bench uses the two most informative FLIP-AAV splits (in-distribution + the hard mutant→designed generalization). The other FLIP splits and the multi-trait Eid 2024 / Fit4Function data (tropism/manufacturability) are a documented extension, not used. |
|
|
33
|
+
| alpha-retro-VLP | **DISCLOSED** | Not added as a grounded palette entry — its strongest in-vivo evidence is a **2025 conference abstract** (grey literature), the peer-reviewed anchor (Baron 2022) is ex-vivo. Flagged exploratory, not fabricated. |
|
|
34
|
+
| In-vivo human tropism | **HONEST KNOWN-UNKNOWN** | Predicted capsid-fitness is for the **measured packaging axis**; in-vivo human tissue tropism is a known-unknown except the approved-therapy serotype priors. The recommender abstains on tropism for novel capsids — never fabricates a tissue. |
|
|
35
|
+
| Model artifact (`models/capsid_fitness.pkl`, ~3 MB) **not committed to git** | **DISCLOSED** | The trained `.pkl` is **gitignored** (the `position_effect.pkl` pattern) — the **derived Delivery-Bench metrics + the reproducible build script** (`scripts/build_capsid_fitness.py`) are committed instead, and the model is **regenerated from FLIP-AAV on the VM and mounted into the deployed app**. CI stays lean and license-clean; the capsid-fitness axis **abstains gracefully** when the model file is absent (no fabricated scores). |
|
|
36
|
+
|
|
26
37
|
## v6.9 — PEN-IMMUNE (Stage G) — *audited retroactively, corrected in v6.10.1*
|
|
27
38
|
|
|
28
39
|
| Item | Status | Detail |
|
|
@@ -61,10 +61,16 @@ AUROC of accessibility for active-vs-inactive off-targets per assay, with in-vit
|
|
|
61
61
|
DNase track (`ENCFF529BOG`, matching GUIDE-seq's HEK293 and TTISS's HEK293T): **cell-type matching lifts the
|
|
62
62
|
canonical WT-Cas9 cell-based assay from 0.58 → 0.671** (the cross-cell proxy was dampening a real effect), with the
|
|
63
63
|
in-vitro control still null. **Verdict: VALIDATED (moderate, cell-type-matched)** for WT-Cas9 cell-based off-target
|
|
64
|
-
activity. Honest caveats: the effect is **moderate** (the sequence/CRISOT score
|
|
65
|
-
**not** transfer to TTISS (a Cas9-variant specificity assay, the expected outlier)
|
|
66
|
-
|
|
67
|
-
|
|
64
|
+
activity. Honest caveats: the effect is **moderate** (the sequence/CRISOT score dominates nomination); it does
|
|
65
|
+
**not** transfer to TTISS (a Cas9-variant specificity assay, the expected outlier).
|
|
66
|
+
|
|
67
|
+
**Incremental value over CRISOT (v6.10.4, `chromatin_incremental.json`):** on GUIDE-seq (HEK293T-matched),
|
|
68
|
+
accessibility carries a **small real conditional signal** (logistic-regression coefficient ~0.35, bootstrap CI
|
|
69
|
+
excludes 0 at both 1:16 and 1:123 candidate imbalance) but adds **NO held-out ranking improvement** over CRISOT
|
|
70
|
+
(leave-one-guide-out AUPRC gap CI includes 0 at both). **Decision: chromatin is a validated ANNOTATION, NOT a
|
|
71
|
+
re-ranker** — it does **not** change the numeric risk score (CRISOT already captures the practically-relevant ranking
|
|
72
|
+
signal); the fitted CRISOT+accessibility combiner is recorded but intentionally not applied. Reproducible:
|
|
73
|
+
`scripts/offtarget_chromatin_{validation,matched,incremental}.py`.
|
|
68
74
|
|
|
69
75
|
## Risk calibration (grounded)
|
|
70
76
|
The nomination risk band IS the empirical fraction of candidates at *k* mismatches that were validated-active
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
# Stage D — the deliverability engine (v6.11 PEN-DELIVER)
|
|
2
|
+
|
|
3
|
+
Stage D upgrades delivery from an 8-vehicle **rule palette** to a cross-modality recommender with a **learned,
|
|
4
|
+
benchmarked AAV capsid-fitness model**, a **grounded serotype→tissue tropism prior** from approved therapies, and an
|
|
5
|
+
**immune-coupled dose tradeoff** — without ever fabricating tropism.
|
|
6
|
+
|
|
7
|
+
## Learned capsid-fitness (`planner/delivery_predict.capsid_fitness`)
|
|
8
|
+
|
|
9
|
+
A model trained on the **FLIP-AAV** benchmark (Dallago et al. 2021; built on **Bryant et al. 2021** packaging
|
|
10
|
+
fitness, `10.1038/s41587-020-00793-4`; **Ogden et al. 2019** is the foundational landscape, `10.1126/science.aaw2900`).
|
|
11
|
+
A windowed one-hot gradient-boosting model over the mutagenized VP1 561–588 region. **Gate D-G1 PASSES** — it beats a
|
|
12
|
+
mutation-burden baseline on held-out FLIP-AAV on **both** splits (`benchmarks/delivery/`):
|
|
13
|
+
|
|
14
|
+
| Split | learned Spearman | baseline | gap 95% CI |
|
|
15
|
+
|---|---|---|---|
|
|
16
|
+
| `sampled` (random 80/20, in-distribution) | **0.920** | 0.522 | [0.387, 0.411] |
|
|
17
|
+
| `mut_des` (mutant→designed, hard generalization) | **0.814** | 0.752 | [0.061, 0.064] |
|
|
18
|
+
|
|
19
|
+
The licensed FLIP-AAV data (217 MB/split) stays on the VM; the **derived metrics + reproducible build script**
|
|
20
|
+
(`scripts/build_capsid_fitness.py`) are committed. The trained model (`models/capsid_fitness.pkl`, ~3 MB) is
|
|
21
|
+
**gitignored** — regenerated from the build script and **mounted into the deployed app** (the `position_effect.pkl`
|
|
22
|
+
pattern), so CI stays lean and the axis **abstains gracefully** when the model is absent. **Honest scope:** predicted
|
|
23
|
+
fitness is a **candidate** for the *measured* packaging axis — it is **not** an in-vivo human-tropism claim (a
|
|
24
|
+
known-unknown).
|
|
25
|
+
|
|
26
|
+
## Serotype → tissue tropism priors (`configs/aav_serotype_tropism.yaml`)
|
|
27
|
+
|
|
28
|
+
Real serotype↔tissue mappings evidenced by **approved AAV gene therapies** (independently verified): AAV9→CNS
|
|
29
|
+
(Zolgensma), **AAVrh74→skeletal muscle** (Elevidys), AAV5→liver (Hemgenix/Roctavian), **AAVRh74var→liver** (Beqvez —
|
|
30
|
+
a *different* capsid from AAVrh74), AAV2→retina/putamen via **local injection** (Luxturna/Upstaza). A grounded prior
|
|
31
|
+
for an approved serotype; a **known-unknown (abstain)** for a novel/engineered capsid — never a fabricated tissue.
|
|
32
|
+
Ex-vivo cell therapies (Casgevy = non-viral CRISPR; Lyfgenia = lentiviral) carry **no** serotype prior.
|
|
33
|
+
|
|
34
|
+
## Immune-coupled tradeoff (`planner/delivery_immune.delivery_immune_tradeoff`)
|
|
35
|
+
|
|
36
|
+
Fuses deliverability with the **Stage G** per-axis immune profile and surfaces the **dose↔immunogenicity tradeoff**
|
|
37
|
+
per vehicle as a vector — `collapsed_score` is always `None`. The realized in-vivo magnitude / patient titer are
|
|
38
|
+
declared known-unknowns; this is decision-support, not a clinical dosing directive.
|
|
39
|
+
|
|
40
|
+
## Generative candidates (`design/capsid_generate.generate_capsid_candidates`)
|
|
41
|
+
|
|
42
|
+
Verifier-as-discriminator (v5.8): propose VP1-region variants, score with the learned capsid-fitness, keep survivors
|
|
43
|
+
above the WT fitness. Every survivor is a **🔵 candidate** — packaging fitness only; assembly, in-vivo tropism, and
|
|
44
|
+
immunogenicity are not claimed. Abstains when the model is absent (no fabricated capsids).
|
|
45
|
+
|
|
46
|
+
## Surfaces
|
|
47
|
+
REST `POST /delivery` + `POST /capsid_fitness` + `GET /delivery/tropism`, MCP `delivery_recommend`, manifest
|
|
48
|
+
`recommend_delivery` + `capsid_fitness`, the `capsid_fitness` scope card, and a `delivery` task in the
|
|
49
|
+
Genome-Writing Challenge (serotype→tissue, label = approved-therapy registry).
|
|
50
|
+
|
|
51
|
+
## Honest limits
|
|
52
|
+
Predicted capsid-fitness is strongest for the **measured** packaging axis and extrapolative for in-vivo human tissue
|
|
53
|
+
(⛔). VLP/LNP coverage is thinner than AAV (alpha-retro-VLP is exploratory — its strongest in-vivo evidence is a
|
|
54
|
+
conference abstract). Manufacturing/CMC is out of scope. See `docs/DEVIATIONS_AND_DISCLOSURES.md` for plan deviations.
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
"""PEN-STACK v3.0 - open infrastructure for genome writing."""
|
|
2
|
-
__version__ = "6.
|
|
2
|
+
__version__ = "6.11.0"
|
|
@@ -52,6 +52,16 @@ def curated_dois() -> frozenset[str]:
|
|
|
52
52
|
dois.add(_rec["doi"])
|
|
53
53
|
except Exception: # noqa: BLE001
|
|
54
54
|
pass
|
|
55
|
+
# v6.11 delivery provenance (FLIP-AAV capsid-fitness + approved-therapy serotype->tissue priors)
|
|
56
|
+
try:
|
|
57
|
+
trop = yaml.safe_load(resource("configs/aav_serotype_tropism.yaml").read_text(encoding="utf-8")) or {}
|
|
58
|
+
dois.update(trop.get("provenance_dois", []) or [])
|
|
59
|
+
for _rec in (trop.get("serotypes") or {}).values():
|
|
60
|
+
if _rec.get("doi"):
|
|
61
|
+
dois.add(_rec["doi"])
|
|
62
|
+
dois.update(["10.1101/2021.11.09.467890", "10.1038/s41587-020-00793-4", "10.1126/science.aaw2900"])
|
|
63
|
+
except Exception: # noqa: BLE001
|
|
64
|
+
pass
|
|
55
65
|
# v5.5 anti-vector seroprevalence provenance (serosurveys)
|
|
56
66
|
try:
|
|
57
67
|
sp = yaml.safe_load(resource("configs/seroprevalence.yaml").read_text(encoding="utf-8"))
|
|
@@ -103,6 +103,16 @@ def offtarget_scan(writer_family: str, guide: str | None = None, candidate_sites
|
|
|
103
103
|
sequence=sequence, assay=assay)
|
|
104
104
|
|
|
105
105
|
|
|
106
|
+
@mcp.tool()
|
|
107
|
+
def delivery_recommend(cargo_form: str, cargo_bp: int | None = None, target_tissue: str | None = None,
|
|
108
|
+
safety_weight: float = 0.5, in_vivo: bool | None = None) -> dict:
|
|
109
|
+
"""v6.11 PEN-DELIVER cross-modality delivery recommender: rank vehicles by cargo-form + safety<->efficacy + a
|
|
110
|
+
GROUNDED serotype->tissue tropism prior (from approved AAV therapies; a known-unknown for novel capsids), plus
|
|
111
|
+
the learned FLIP-AAV capsid-fitness capability. Never fabricates tropism; abstains without inputs."""
|
|
112
|
+
from pen_stack.planner.delivery_predict import recommend_delivery_plus
|
|
113
|
+
return recommend_delivery_plus(cargo_form, cargo_bp, target_tissue, safety_weight=safety_weight, in_vivo=in_vivo)
|
|
114
|
+
|
|
115
|
+
|
|
106
116
|
@mcp.tool()
|
|
107
117
|
def generate_designs(goal: dict | None = None, candidates: list | None = None, keep: int = 25) -> dict:
|
|
108
118
|
"""v5.8 generative designer (verifier-as-discriminator): hazardous/illegal candidates are DISCARDED;
|
|
@@ -52,6 +52,17 @@ _TOOLS = [
|
|
|
52
52
|
"input": "writer family + guide/candidate sites (nuclease) or locus sequence (integrase)",
|
|
53
53
|
"output": "ranked off-target candidates + calibrated risk + recommended validation assay",
|
|
54
54
|
"entrypoint": "pen_stack.wgenome.offtarget_predict.nominate_offtargets", "fabricates": False},
|
|
55
|
+
{"name": "recommend_delivery", "summary": "cross-modality delivery recommender: rank vehicles by cargo-form + "
|
|
56
|
+
"safety<->efficacy + a grounded serotype->tissue tropism prior (approved therapies) + the learned FLIP-AAV "
|
|
57
|
+
"capsid-fitness capability; tropism is a known-unknown for novel capsids (v6.11 PEN-DELIVER)",
|
|
58
|
+
"input": "cargo form/size + target tissue (+ safety weight, in/ex-vivo)",
|
|
59
|
+
"output": "ranked vehicles + serotype tropism prior + capsid-fitness bench; never fabricates tropism",
|
|
60
|
+
"entrypoint": "pen_stack.planner.delivery_predict.recommend_delivery_plus", "fabricates": False},
|
|
61
|
+
{"name": "capsid_fitness", "summary": "learned AAV capsid packaging-fitness for a VP1 sequence (FLIP-AAV-"
|
|
62
|
+
"trained; beats a mutation-burden baseline on held-out splits); a CANDIDATE for the measured packaging axis, "
|
|
63
|
+
"NOT an in-vivo tropism claim (v6.11 PEN-DELIVER)",
|
|
64
|
+
"input": "AAV VP1 capsid amino-acid sequence", "output": "predicted packaging-fitness (candidate) or abstain",
|
|
65
|
+
"entrypoint": "pen_stack.planner.delivery_predict.capsid_fitness", "fabricates": False},
|
|
55
66
|
]
|
|
56
67
|
|
|
57
68
|
_POLICY = ("outputs outside scope are returned as `out_of_scope` (known-unknown) or `extrapolating` (OOD) and are "
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
"""Verify-gated generative AAV capsid candidates (v6.11 PEN-DELIVER, D-WS3).
|
|
2
|
+
|
|
3
|
+
Proposes engineered AAV capsid variants in the mutagenized VP1 region, scores them with the learned FLIP-AAV
|
|
4
|
+
capsid-fitness model, and keeps only candidates above a fitness threshold — the verifier-as-discriminator pattern
|
|
5
|
+
(v5.8): GENERATE proposes, the fitness model + biosecurity context DISPOSE. Every survivor is a CANDIDATE (🔵),
|
|
6
|
+
never asserted to assemble or to have any in-vivo tropism. Abstains when the fitness model is not present (no
|
|
7
|
+
fabricated capsids).
|
|
8
|
+
|
|
9
|
+
Honest: a generated capsid's predicted fitness is for the MEASURED packaging axis only; assembly, in-vivo tropism,
|
|
10
|
+
and immunogenicity are not claimed (the latter routes through Stage G). This is a design proposer, not a validation.
|
|
11
|
+
"""
|
|
12
|
+
from __future__ import annotations
|
|
13
|
+
|
|
14
|
+
_AAS = "ACDEFGHIKLMNPQRSTVWY"
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
def _mutate(seq: str, region: tuple[int, int], n_mut: int, rng) -> str:
|
|
18
|
+
s = list(seq)
|
|
19
|
+
lo, hi = region
|
|
20
|
+
positions = rng.sample(range(lo, min(hi, len(s))), min(n_mut, max(0, min(hi, len(s)) - lo)))
|
|
21
|
+
for p in positions:
|
|
22
|
+
s[p] = _AAS[rng.randrange(len(_AAS))]
|
|
23
|
+
return "".join(s)
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
def generate_capsid_candidates(wt_vp1: str, n: int = 200, max_mut: int = 4, fitness_threshold: float | None = None,
|
|
27
|
+
seed: int = 7, top: int = 20) -> dict:
|
|
28
|
+
"""Propose AAV capsid variants (random substitutions in the VP1 555-595 mutagenized window), score with the
|
|
29
|
+
learned capsid-fitness model, and return the top survivors above ``fitness_threshold`` (defaults to the WT's
|
|
30
|
+
predicted fitness). Candidates are flagged 🔵; abstains when the fitness model is absent — never fabricates."""
|
|
31
|
+
import random
|
|
32
|
+
from pen_stack.planner.delivery_predict import capsid_fitness
|
|
33
|
+
wt = capsid_fitness(wt_vp1)
|
|
34
|
+
if not wt.get("available"):
|
|
35
|
+
return {"available": False, "abstain": True, "candidates": [], "output_kind": "candidate",
|
|
36
|
+
"note": "capsid-fitness model not present -> cannot score generated capsids; no fabrication.",
|
|
37
|
+
"bench": wt.get("bench")}
|
|
38
|
+
rng = random.Random(seed)
|
|
39
|
+
thr = fitness_threshold if fitness_threshold is not None else wt["predicted_fitness"]
|
|
40
|
+
region = (555, 595)
|
|
41
|
+
seen = set()
|
|
42
|
+
scored = []
|
|
43
|
+
for _ in range(max(1, n)):
|
|
44
|
+
nm = rng.randint(1, max_mut)
|
|
45
|
+
cand = _mutate(wt_vp1, region, nm, rng)
|
|
46
|
+
if cand == wt_vp1 or cand in seen:
|
|
47
|
+
continue
|
|
48
|
+
seen.add(cand)
|
|
49
|
+
f = capsid_fitness(cand)["predicted_fitness"]
|
|
50
|
+
scored.append({"vp1_window": cand[region[0]:region[1]], "predicted_fitness": f,
|
|
51
|
+
"n_mut_in_region": sum(1 for a, b in zip(cand[region[0]:region[1]],
|
|
52
|
+
wt_vp1[region[0]:region[1]]) if a != b),
|
|
53
|
+
"passes_threshold": bool(f >= thr), "output_kind": "candidate"})
|
|
54
|
+
survivors = sorted([c for c in scored if c["passes_threshold"]],
|
|
55
|
+
key=lambda c: c["predicted_fitness"], reverse=True)[:top]
|
|
56
|
+
return {"available": True, "abstain": False, "wt_predicted_fitness": wt["predicted_fitness"],
|
|
57
|
+
"fitness_threshold": round(float(thr), 4), "n_proposed": len(scored), "n_survivors": len(survivors),
|
|
58
|
+
"candidates": survivors, "output_kind": "candidate",
|
|
59
|
+
"verifier": "learned FLIP-AAV capsid-fitness (verifier-as-discriminator, v5.8); fitness >= WT kept",
|
|
60
|
+
"honesty": "🔵 CANDIDATES — predicted packaging fitness only; assembly, in-vivo tropism, and "
|
|
61
|
+
"immunogenicity are NOT claimed (immunogenicity routes through Stage G). A design proposer, "
|
|
62
|
+
"not a validation. Run a biosecurity/verify() gate before any synthesis."}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
"""Immune-coupled delivery selection (v6.11 PEN-DELIVER, D-WS4).
|
|
2
|
+
|
|
3
|
+
Fuses the cross-modality deliverability recommendation (Stage D) with the per-axis immune-risk profile (Stage G) and
|
|
4
|
+
surfaces the **dose <-> immunogenicity tradeoff** as a VECTOR — never collapsed into one number. The point: a vehicle
|
|
5
|
+
that is most deliverable may carry the highest immune liability (e.g. AAV: efficient in vivo, but pre-existing NAbs +
|
|
6
|
+
capsid CD8 + dose-dependent innate sensing), and that tension must be visible, not hidden.
|
|
7
|
+
|
|
8
|
+
Honest: the immune axes are population-level proxies (Stage G); the realized in-vivo magnitude / patient titer is a
|
|
9
|
+
declared known-unknown. The dose<->immune tradeoff is informative, NOT a clinical dosing directive.
|
|
10
|
+
"""
|
|
11
|
+
from __future__ import annotations
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
def _highest_risk_axis(design: dict) -> dict | None:
|
|
15
|
+
"""The in-scope immune axis with the LOWEST score (= highest risk) from the Stage G profile, with its value."""
|
|
16
|
+
from pen_stack.planner.immune_profile import immune_profile
|
|
17
|
+
axes = immune_profile(dict(design)).get("axes", {})
|
|
18
|
+
in_scope = {k: a for k, a in axes.items() if a.get("in_scope") and a.get("value") is not None}
|
|
19
|
+
if not in_scope:
|
|
20
|
+
return None
|
|
21
|
+
k = min(in_scope, key=lambda x: in_scope[x]["value"])
|
|
22
|
+
return {"axis": k, "score": in_scope[k]["value"], "note": in_scope[k].get("note")}
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
def delivery_immune_tradeoff(cargo_form: str, cargo_bp: int | None = None, target_tissue: str | None = None,
|
|
26
|
+
*, writer_family: str | None = None, serotype: str | None = None,
|
|
27
|
+
safety_weight: float = 0.5, in_vivo: bool | None = None) -> dict:
|
|
28
|
+
"""Rank deliverability AND attach each vehicle's Stage G immune profile, surfacing the dose<->immune tradeoff per
|
|
29
|
+
vehicle as a vector. Never collapses deliverability and immunogenicity into one score."""
|
|
30
|
+
from pen_stack.planner.delivery_predict import recommend_delivery_plus
|
|
31
|
+
rec = recommend_delivery_plus(cargo_form, cargo_bp, target_tissue, safety_weight=safety_weight, in_vivo=in_vivo)
|
|
32
|
+
coupled = []
|
|
33
|
+
for prof in rec.get("ranked", []) or rec.get("eligible", []) or []:
|
|
34
|
+
veh = prof.get("vehicle") or prof.get("name")
|
|
35
|
+
if not veh:
|
|
36
|
+
continue
|
|
37
|
+
design = {"delivery_vehicle": veh, "serotype": serotype, "writer_family": writer_family}
|
|
38
|
+
risk = _highest_risk_axis(design)
|
|
39
|
+
coupled.append({
|
|
40
|
+
"vehicle": veh,
|
|
41
|
+
"deliverability_balance": prof.get("balance"),
|
|
42
|
+
"efficacy_score": prof.get("efficacy_score"),
|
|
43
|
+
"immune_highest_risk_axis": risk, # the dominant immune liability (Stage G)
|
|
44
|
+
"tradeoff": (f"deliverability {prof.get('balance')} vs dominant immune liability "
|
|
45
|
+
f"'{risk['axis']}' (score {risk['score']})" if risk else
|
|
46
|
+
"deliverability ranked; immune axes abstain for this vehicle"),
|
|
47
|
+
})
|
|
48
|
+
return {
|
|
49
|
+
"cargo_form": cargo_form, "cargo_bp": cargo_bp, "target_tissue": target_tissue,
|
|
50
|
+
"serotype_tropism_prior": rec.get("serotype_tropism_prior"),
|
|
51
|
+
"coupled": coupled,
|
|
52
|
+
"collapsed_score": None, # deliberately None — dose<->immune is a vector, NEVER fused
|
|
53
|
+
"dose_immune_note": ("AAV/viral vehicles are efficient in vivo but carry the highest immune liability "
|
|
54
|
+
"(pre-existing NAbs, capsid CD8, dose-dependent innate sensing); higher dose raises both "
|
|
55
|
+
"transduction AND immunogenicity. The tradeoff is surfaced per vehicle, never collapsed."),
|
|
56
|
+
"known_unknowns": ["in_vivo_immunogenicity_magnitude", "patient_specific_titer", "realized_dose_response"],
|
|
57
|
+
"honesty": "immune axes are population-level proxies (Stage G); realized magnitude/titer is a known-unknown; "
|
|
58
|
+
"this is decision-support, NOT a clinical dosing directive. No collapsed score.",
|
|
59
|
+
"no_fabrication": True,
|
|
60
|
+
}
|