pen-stack 6.9.1__tar.gz → 6.10.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.9.1 → pen_stack-6.10.0}/CHANGELOG.md +73 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/CITATION.cff +1 -1
- {pen_stack-6.9.1 → pen_stack-6.10.0}/PKG-INFO +34 -5
- {pen_stack-6.9.1 → pen_stack-6.10.0}/README.md +33 -4
- pen_stack-6.10.0/benchmarks/offtarget/SHA256SUMS +4 -0
- pen_stack-6.10.0/configs/mhc_epitope_oracle.yaml +296 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/configs/oracles/scope_cards.yaml +17 -0
- pen_stack-6.10.0/docs/cards/offtarget_data.md +52 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/docs/immune_profiler.md +25 -16
- pen_stack-6.10.0/docs/offtarget.md +45 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/pen_stack/__init__.py +1 -1
- {pen_stack-6.9.1 → pen_stack-6.10.0}/pen_stack/agent/cite.py +13 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/pen_stack/agent/mcp_server.py +12 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/pen_stack/api/manifest.py +6 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/pen_stack/atlas/guide_design.py +37 -11
- pen_stack-6.10.0/pen_stack/planner/ada_risk.py +64 -0
- pen_stack-6.10.0/pen_stack/planner/capsid_epitope_oracle.py +136 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/pen_stack/planner/delivery_immunology.py +3 -2
- {pen_stack-6.9.1 → pen_stack-6.10.0}/pen_stack/planner/immune_mhc2.py +20 -16
- {pen_stack-6.9.1 → pen_stack-6.10.0}/pen_stack/planner/immune_profile.py +5 -2
- {pen_stack-6.9.1 → pen_stack-6.10.0}/pen_stack/server/api.py +20 -0
- pen_stack-6.10.0/pen_stack/wgenome/offtarget_assay.py +55 -0
- pen_stack-6.10.0/pen_stack/wgenome/offtarget_data.py +100 -0
- pen_stack-6.10.0/pen_stack/wgenome/offtarget_predict.py +177 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/pen_stack.egg-info/PKG-INFO +34 -5
- {pen_stack-6.9.1 → pen_stack-6.10.0}/pen_stack.egg-info/SOURCES.txt +8 -0
- pen_stack-6.10.0/prereg/SHA256_LOCK_ws_offtarget.json +8 -0
- pen_stack-6.10.0/prereg/ws_offtarget.yaml +42 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/pyproject.toml +1 -1
- pen_stack-6.9.1/configs/mhc_epitope_oracle.yaml +0 -239
- pen_stack-6.9.1/pen_stack/planner/ada_risk.py +0 -87
- pen_stack-6.9.1/pen_stack/planner/capsid_epitope_oracle.py +0 -97
- {pen_stack-6.9.1 → pen_stack-6.10.0}/LICENSE +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/MANIFEST.in +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/bench/run.py +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/benchmarks/genome_writing_bench/LEADERBOARD.md +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/benchmarks/genome_writing_bench/README.md +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/benchmarks/genome_writing_bench/SHA256SUMS +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/benchmarks/genome_writing_bench/SUBMISSIONS.md +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/benchmarks/genome_writing_bench/tasks.yaml +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/benchmarks/genome_writing_challenge/README.md +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/benchmarks/genome_writing_challenge/SUBMISSIONS.md +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/benchmarks/position_effect/README.md +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/benchmarks/position_effect/SHA256SUMS +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/benchmarks/writer_efficiency/README.md +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/benchmarks/writer_efficiency/SHA256SUMS +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/configs/antipeg.yaml +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/configs/atlas_families.yaml +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/configs/bridge_offtarget_profile.yaml +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/configs/calibration/preexisting_nab_independent.yaml +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/configs/capsid_epitope_oracle.yaml +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/configs/capsid_sequences.fasta +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/configs/cargo_polish.yaml +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/configs/cell_types.yaml +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/configs/datasets.yaml +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/configs/delivery_constraints.yaml +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/configs/delivery_rules.yaml +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/configs/delivery_vehicles.yaml +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/configs/expression/modifiers.yaml +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/configs/expression/promoters.yaml +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/configs/gates_v3.yaml +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/configs/genotoxicity_oracle.yaml +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/configs/gsh_validated_heldout.yaml +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/configs/intent_weights.yaml +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/configs/known_unknowns.yaml +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/configs/llm.yaml +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/configs/metric_guide.yaml +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/configs/monitor_queries.yaml +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/configs/oracles/execution.yaml +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/configs/rules/delivery.yaml +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/configs/rules/fold.yaml +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/configs/rules/multiplex.yaml +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/configs/rules/payload.yaml +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/configs/rules/reachability.yaml +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/configs/safety/hazard_registry.yaml +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/configs/safety/policy.yaml +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/configs/safety/probes.yaml +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/configs/score_axes.yaml +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/configs/seroprevalence.yaml +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/configs/target_sites.yaml +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/configs/universe_crosswalk.yaml +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/configs/write_types.yaml +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/configs/writer_sequences.fasta +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/configs/wtkb_curated.yaml +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/data/curated/bridge_offtarget_energetics.json +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/data/curated/bridge_offtarget_profile_measured.parquet +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/data/curated/gene_coords.parquet +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/data/curated/unified_editor_universe.parquet +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/docs/BACKLOG.md +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/docs/DEPLOY.md +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/docs/INFRA.md +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/docs/MCP.md +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/docs/RELEASING.md +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/docs/REPRO.md +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/docs/STABILITY.md +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/docs/agent.md +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/docs/alphagenome_feasibility.md +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/docs/autonomy.md +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/docs/benchmark_circularity.md +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/docs/biosecurity.md +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/docs/build_interface.md +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/docs/cards/atlas.md +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/docs/cards/durability.md +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/docs/cards/position_effect_data.md +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/docs/cards/safety.md +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/docs/cards/writer_efficiency_data.md +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/docs/challenge.md +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/docs/closed_loop.md +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/docs/co_scientist.md +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/docs/co_scientist_loop.md +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/docs/delivery.md +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/docs/delivery_immunology.md +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/docs/digital_twin.md +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/docs/dissemination.md +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/docs/environment.md +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/docs/experiment_design.md +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/docs/generative_design.md +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/docs/index.md +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/docs/integrations.md +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/docs/live_oracles.md +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/docs/mechanistic_constraints.md +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/docs/oracles.md +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/docs/position_effect.md +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/docs/positioning.md +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/docs/private_data_formats.md +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/docs/quickstart.md +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/docs/responsible_use.md +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/docs/rules.md +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/docs/scope.md +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/docs/scorecard.md +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/docs/tpe_bench.md +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/docs/tutorials/compare-families.md +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/docs/tutorials/score-deliverability.md +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/docs/tutorials/where-can-i-write.md +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/docs/tutorials/which-writer-reaches-locus.md +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/docs/uncertainty.md +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/docs/verify.md +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/docs/world_model.md +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/docs/writer_efficiency.md +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/docs/writer_verification.md +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/docs/wtkb.md +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/pen_stack/_resources.py +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/pen_stack/active/__init__.py +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/pen_stack/active/acquire.py +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/pen_stack/active/design.py +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/pen_stack/active/validate.py +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/pen_stack/adapt/__init__.py +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/pen_stack/adapt/finetune.py +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/pen_stack/adapt/ingest.py +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/pen_stack/adapt/pipeline.py +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/pen_stack/adapt/recalibrate.py +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/pen_stack/adapt/report.py +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/pen_stack/agent/__init__.py +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/pen_stack/agent/co_scientist.py +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/pen_stack/agent/epistemic.py +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/pen_stack/agent/guardrails.py +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/pen_stack/agent/orchestrator.py +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/pen_stack/agent/orchestrator_live.py +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/pen_stack/agent/pen_agent.py +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/pen_stack/agent/scope.py +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/pen_stack/agent/tools.py +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/pen_stack/api/__init__.py +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/pen_stack/atlas/__init__.py +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/pen_stack/atlas/build_wtkb.py +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/pen_stack/atlas/crosslink.py +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/pen_stack/atlas/expand.py +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/pen_stack/atlas/schema.py +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/pen_stack/atlas/scorecard.py +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/pen_stack/atlas/universe.py +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/pen_stack/atlas/variant_propose.py +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/pen_stack/atlas/writer_efficiency.py +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/pen_stack/atlas/writer_predict.py +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/pen_stack/atlas/writer_recommend.py +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/pen_stack/atlas/writer_verify.py +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/pen_stack/bridge/__init__.py +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/pen_stack/bridge/activity.py +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/pen_stack/bridge/cli.py +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/pen_stack/bridge/fold_qc.py +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/pen_stack/bridge/guide_qc.py +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/pen_stack/bridge/ingest.py +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/pen_stack/bridge/offtarget.py +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/pen_stack/bridge/offtarget_energetics.py +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/pen_stack/bridge/ortholog_screen.py +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/pen_stack/bridge/pipeline.py +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/pen_stack/build/__init__.py +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/pen_stack/build/ingest.py +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/pen_stack/build/protocol.py +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/pen_stack/build/simlab.py +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/pen_stack/cli.py +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/pen_stack/data/__init__.py +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/pen_stack/data/encode.py +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/pen_stack/data/genome.py +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/pen_stack/data/ingest_chromatin.py +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/pen_stack/data/ingest_integration.py +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/pen_stack/data/ingest_safety_annot.py +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/pen_stack/data/ingest_trip.py +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/pen_stack/design/__init__.py +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/pen_stack/design/generate.py +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/pen_stack/design/pareto.py +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/pen_stack/design/space.py +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/pen_stack/design/writer_variants.py +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/pen_stack/env/__init__.py +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/pen_stack/env/genome_writing_env.py +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/pen_stack/env/policies.py +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/pen_stack/graph/__init__.py +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/pen_stack/graph/build.py +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/pen_stack/graph/cell_types.py +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/pen_stack/graph/ingest.py +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/pen_stack/graph/query.py +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/pen_stack/graph/schema.py +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/pen_stack/loop/__init__.py +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/pen_stack/loop/continual.py +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/pen_stack/loop/cycle.py +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/pen_stack/loop/drift.py +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/pen_stack/mech/__init__.py +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/pen_stack/mech/classify_atlas.py +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/pen_stack/mech/whitelist.py +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/pen_stack/monitor/__init__.py +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/pen_stack/monitor/europepmc.py +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/pen_stack/monitor/run.py +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/pen_stack/monitor/triage.py +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/pen_stack/oracles/__init__.py +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/pen_stack/oracles/cache.py +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/pen_stack/oracles/energetics.py +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/pen_stack/oracles/genome.py +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/pen_stack/oracles/protein_design.py +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/pen_stack/oracles/rna.py +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/pen_stack/oracles/schema.py +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/pen_stack/oracles/status.py +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/pen_stack/oracles/structure.py +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/pen_stack/oracles/vcell.py +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/pen_stack/planner/__init__.py +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/pen_stack/planner/antipeg_oracle.py +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/pen_stack/planner/cargo.py +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/pen_stack/planner/cargo_polish.py +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/pen_stack/planner/delivery.py +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/pen_stack/planner/delivery_constraints.py +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/pen_stack/planner/delivery_vehicles.py +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/pen_stack/planner/genotoxicity_oracle.py +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/pen_stack/planner/innate_sensing.py +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/pen_stack/planner/multiplex.py +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/pen_stack/planner/optimize.py +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/pen_stack/planner/pipeline.py +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/pen_stack/planner/report.py +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/pen_stack/planner/router.py +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/pen_stack/planner/seroprevalence_oracle.py +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/pen_stack/planner/target_site.py +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/pen_stack/rag/__init__.py +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/pen_stack/rag/index.py +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/pen_stack/rag/llm.py +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/pen_stack/rag/qa.py +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/pen_stack/rules/__init__.py +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/pen_stack/rules/evaluators.py +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/pen_stack/rules/loader.py +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/pen_stack/rules/schema.py +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/pen_stack/rules/solver.py +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/pen_stack/safety/__init__.py +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/pen_stack/safety/audit.py +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/pen_stack/safety/gate.py +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/pen_stack/safety/policy.py +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/pen_stack/safety/redteam.py +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/pen_stack/safety/registry.py +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/pen_stack/safety/screen.py +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/pen_stack/score/__init__.py +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/pen_stack/score/recalibrate.py +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/pen_stack/score/therapeutic.py +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/pen_stack/server/__init__.py +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/pen_stack/twin/__init__.py +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/pen_stack/twin/calibrate.py +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/pen_stack/twin/data/__init__.py +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/pen_stack/twin/data/position_effect.py +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/pen_stack/twin/mechanistic.py +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/pen_stack/twin/outcome.py +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/pen_stack/twin/position_effect.py +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/pen_stack/ui/__init__.py +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/pen_stack/ui/app.py +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/pen_stack/validate/__init__.py +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/pen_stack/validate/adapt_demo.py +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/pen_stack/validate/agent_eval.py +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/pen_stack/validate/bench_adversarial_tasks.py +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/pen_stack/validate/bench_coscientist_tasks.py +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/pen_stack/validate/bench_graph_tasks.py +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/pen_stack/validate/bench_rule_tasks.py +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/pen_stack/validate/bench_trust_tasks.py +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/pen_stack/validate/bench_writetype_tasks.py +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/pen_stack/validate/blind_gsh_discovery.py +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/pen_stack/validate/cargo_directionality.py +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/pen_stack/validate/closed_loop.py +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/pen_stack/validate/durability_baselines.py +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/pen_stack/validate/experiment_design.py +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/pen_stack/validate/expr_controls.py +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/pen_stack/validate/forward_hypotheses.py +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/pen_stack/validate/generative_design.py +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/pen_stack/validate/guide_qc_demo.py +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/pen_stack/validate/heldout_celltype_expr.py +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/pen_stack/validate/immune_calibration.py +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/pen_stack/validate/intent_specification.py +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/pen_stack/validate/known_biology_expr.py +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/pen_stack/validate/offtarget_energetics_eval.py +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/pen_stack/validate/out_of_scope_refusal.py +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/pen_stack/validate/outcome_calibration.py +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/pen_stack/validate/outcome_prediction.py +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/pen_stack/validate/paper3_benchmark.py +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/pen_stack/validate/paper4_real_validation.py +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/pen_stack/validate/paper4_validation.py +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/pen_stack/validate/protocol_safety.py +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/pen_stack/validate/safety_screening.py +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/pen_stack/validate/selective_prediction.py +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/pen_stack/validate/seq_vs_measured.py +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/pen_stack/validate/target_site_controls.py +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/pen_stack/validate/uncertainty_eval.py +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/pen_stack/validate/ungrounded_baseline.py +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/pen_stack/validate/within_locus_ranking.py +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/pen_stack/validate/writer_recovery.py +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/pen_stack/verify/__init__.py +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/pen_stack/verify/schema.py +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/pen_stack/verify/service.py +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/pen_stack/web/__init__.py +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/pen_stack/web/guide.py +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/pen_stack/web/llm.py +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/pen_stack/web/router.py +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/pen_stack/web/server.py +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/pen_stack/web/tools.py +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/pen_stack/wgenome/__init__.py +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/pen_stack/wgenome/chromatin_seq.py +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/pen_stack/wgenome/durability.py +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/pen_stack/wgenome/export_tracks.py +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/pen_stack/wgenome/features.py +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/pen_stack/wgenome/gsh_baseline.py +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/pen_stack/wgenome/mesh_features.py +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/pen_stack/wgenome/ood.py +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/pen_stack/wgenome/providers.py +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/pen_stack/wgenome/safety.py +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/pen_stack/wgenome/structure3d.py +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/pen_stack/wgenome/uncertainty.py +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/pen_stack/wgenome/writability.py +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/pen_stack.egg-info/dependency_links.txt +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/pen_stack.egg-info/entry_points.txt +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/pen_stack.egg-info/requires.txt +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/pen_stack.egg-info/top_level.txt +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/prereg/SHA256_LOCK_phase0.json +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/prereg/SHA256_LOCK_phase1_5.json +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/prereg/SHA256_LOCK_phase2.json +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/prereg/SHA256_LOCK_phase3.json +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/prereg/SHA256_LOCK_ws_a.json +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/prereg/SHA256_LOCK_ws_acq.json +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/prereg/SHA256_LOCK_ws_aldesign.json +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/prereg/SHA256_LOCK_ws_alvalidate.json +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/prereg/SHA256_LOCK_ws_atlas.json +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/prereg/SHA256_LOCK_ws_b.json +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/prereg/SHA256_LOCK_ws_ba.json +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/prereg/SHA256_LOCK_ws_ba_v33.json +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/prereg/SHA256_LOCK_ws_ba_v45.json +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/prereg/SHA256_LOCK_ws_bench.json +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/prereg/SHA256_LOCK_ws_c.json +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/prereg/SHA256_LOCK_ws_cal.json +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/prereg/SHA256_LOCK_ws_calib.json +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/prereg/SHA256_LOCK_ws_challenge.json +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/prereg/SHA256_LOCK_ws_chat.json +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/prereg/SHA256_LOCK_ws_cite.json +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/prereg/SHA256_LOCK_ws_continual.json +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/prereg/SHA256_LOCK_ws_cosci2.json +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/prereg/SHA256_LOCK_ws_crit.json +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/prereg/SHA256_LOCK_ws_ct.json +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/prereg/SHA256_LOCK_ws_d.json +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/prereg/SHA256_LOCK_ws_drift.json +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/prereg/SHA256_LOCK_ws_e.json +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/prereg/SHA256_LOCK_ws_env.json +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/prereg/SHA256_LOCK_ws_ep.json +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/prereg/SHA256_LOCK_ws_epitope.json +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/prereg/SHA256_LOCK_ws_expr2.json +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/prereg/SHA256_LOCK_ws_f.json +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/prereg/SHA256_LOCK_ws_frontend.json +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/prereg/SHA256_LOCK_ws_g.json +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/prereg/SHA256_LOCK_ws_gen.json +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/prereg/SHA256_LOCK_ws_genotox.json +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/prereg/SHA256_LOCK_ws_graph.json +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/prereg/SHA256_LOCK_ws_h.json +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/prereg/SHA256_LOCK_ws_hybrid.json +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/prereg/SHA256_LOCK_ws_immune.json +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/prereg/SHA256_LOCK_ws_immune2.json +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/prereg/SHA256_LOCK_ws_ingest.json +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/prereg/SHA256_LOCK_ws_innate.json +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/prereg/SHA256_LOCK_ws_loop.json +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/prereg/SHA256_LOCK_ws_manifest.json +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/prereg/SHA256_LOCK_ws_mc.json +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/prereg/SHA256_LOCK_ws_mcp.json +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/prereg/SHA256_LOCK_ws_mech.json +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/prereg/SHA256_LOCK_ws_mon.json +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/prereg/SHA256_LOCK_ws_o.json +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/prereg/SHA256_LOCK_ws_openapi.json +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/prereg/SHA256_LOCK_ws_orch.json +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/prereg/SHA256_LOCK_ws_outcome.json +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/prereg/SHA256_LOCK_ws_pareto.json +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/prereg/SHA256_LOCK_ws_peg.json +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/prereg/SHA256_LOCK_ws_plan.json +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/prereg/SHA256_LOCK_ws_policy.json +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/prereg/SHA256_LOCK_ws_profile.json +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/prereg/SHA256_LOCK_ws_proto.json +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/prereg/SHA256_LOCK_ws_r.json +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/prereg/SHA256_LOCK_ws_redteam.json +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/prereg/SHA256_LOCK_ws_route.json +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/prereg/SHA256_LOCK_ws_screen.json +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/prereg/SHA256_LOCK_ws_seroprev.json +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/prereg/SHA256_LOCK_ws_simlab.json +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/prereg/SHA256_LOCK_ws_twincal.json +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/prereg/SHA256_LOCK_ws_uq.json +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/prereg/SHA256_LOCK_ws_v.json +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/prereg/SHA256_LOCK_ws_vcell.json +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/prereg/SHA256_LOCK_ws_writer.json +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/prereg/SHA256_LOCK_ws_wv.json +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/prereg/paper1.yaml +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/prereg/paper2.yaml +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/prereg/paper3.yaml +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/prereg/paper4.yaml +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/prereg/phase0.yaml +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/prereg/ws_a.yaml +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/prereg/ws_acq.yaml +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/prereg/ws_aldesign.yaml +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/prereg/ws_alvalidate.yaml +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/prereg/ws_atlas.yaml +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/prereg/ws_b.yaml +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/prereg/ws_ba.yaml +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/prereg/ws_ba_v33.yaml +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/prereg/ws_ba_v45.yaml +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/prereg/ws_bench.yaml +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/prereg/ws_c.yaml +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/prereg/ws_cal.yaml +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/prereg/ws_calib.yaml +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/prereg/ws_challenge.yaml +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/prereg/ws_chat.yaml +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/prereg/ws_cite.yaml +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/prereg/ws_continual.yaml +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/prereg/ws_cosci2.yaml +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/prereg/ws_crit.yaml +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/prereg/ws_ct.yaml +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/prereg/ws_d.yaml +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/prereg/ws_drift.yaml +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/prereg/ws_e.yaml +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/prereg/ws_env.yaml +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/prereg/ws_ep.yaml +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/prereg/ws_epitope.yaml +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/prereg/ws_expr2.yaml +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/prereg/ws_f.yaml +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/prereg/ws_frontend.yaml +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/prereg/ws_g.yaml +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/prereg/ws_gen.yaml +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/prereg/ws_genotox.yaml +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/prereg/ws_graph.yaml +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/prereg/ws_h.yaml +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/prereg/ws_hybrid.yaml +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/prereg/ws_immune.yaml +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/prereg/ws_immune2.yaml +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/prereg/ws_ingest.yaml +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/prereg/ws_innate.yaml +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/prereg/ws_loop.yaml +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/prereg/ws_manifest.yaml +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/prereg/ws_mc.yaml +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/prereg/ws_mcp.yaml +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/prereg/ws_mech.yaml +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/prereg/ws_mon.yaml +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/prereg/ws_o.yaml +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/prereg/ws_openapi.yaml +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/prereg/ws_orch.yaml +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/prereg/ws_outcome.yaml +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/prereg/ws_pareto.yaml +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/prereg/ws_peg.yaml +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/prereg/ws_plan.yaml +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/prereg/ws_policy.yaml +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/prereg/ws_profile.yaml +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/prereg/ws_proto.yaml +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/prereg/ws_r.yaml +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/prereg/ws_redteam.yaml +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/prereg/ws_route.yaml +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/prereg/ws_screen.yaml +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/prereg/ws_seroprev.yaml +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/prereg/ws_simlab.yaml +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/prereg/ws_twincal.yaml +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/prereg/ws_uq.yaml +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/prereg/ws_v.yaml +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/prereg/ws_vcell.yaml +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/prereg/ws_writer.yaml +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/prereg/ws_wv.yaml +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/scripts/calibrate_immune_axes.py +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/scripts/fetch_licensed_sources.py +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/scripts/p1_build_atlas.py +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/scripts/p1_build_durability.py +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/scripts/p1_build_position_effect.py +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/scripts/p1_build_writer_eff.py +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/scripts/p1_export_tracks.py +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/scripts/p1_safety_concordance.py +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/scripts/p1_train_safety.py +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/scripts/p1_validation_report.py +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/scripts/p2_build_atlas.py +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/scripts/p3_benchmark_report.py +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/scripts/p4_genome_scan.py +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/scripts/p52_build_genotox_oracle.py +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/scripts/p53_build_epitope_oracle.py +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/scripts/ws_b_report.py +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/scripts/ws_c_report.py +0 -0
- {pen_stack-6.9.1 → pen_stack-6.10.0}/setup.cfg +0 -0
|
@@ -3,6 +3,79 @@
|
|
|
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.10.0] - 2026-06-20 - WS-OFFTARGET (PEN-OFFTGT: cross-writer-family off-target nomination)
|
|
7
|
+
|
|
8
|
+
**Series III, Stage E.** Off-target moves from a single-family bridge pseudosite scan to a **cross-writer-family,
|
|
9
|
+
chromatin-aware NOMINATION engine** grounded in unbiased genome-wide assays — completing the safety triad
|
|
10
|
+
(site B + writer C + off-target E). Nomination is scrupulously framed as **not a clearance**: every candidate
|
|
11
|
+
ships with the empirical assay that would confirm it.
|
|
12
|
+
|
|
13
|
+
### Added
|
|
14
|
+
- **Off-Target-Bench** (`benchmarks/offtarget/`) — a real, leakage-controlled nomination benchmark over canonical
|
|
15
|
+
Cas9 guides (EMX1/VEGFA1-3/FANCF/HEK293) with **experimentally validated off-targets** from GUIDE-seq
|
|
16
|
+
(Tsai 2015, `10.1038/nbt.3117`) and CIRCLE-seq (Tsai 2017, `10.1038/nmeth.4278`). Held-out-guide split, per-assay
|
|
17
|
+
provenance, SHA256SUMS. **Gate E-G2 PASSES on real data + real tool:** the licensed **CRISOT-Score** predictor
|
|
18
|
+
(Chen et al., Nat Commun 2023, `10.1038/s41467-023-42695-4`; XGBoost RNA-DNA fingerprint) BEATS the sequence-
|
|
19
|
+
homology baseline — GUIDE-seq AUPRC **0.646 vs 0.467** (gap +0.179, CI [0.015, 0.340]); CIRCLE-seq **0.520 vs
|
|
20
|
+
0.266** (gap +0.253, CI [0.140, 0.361]); per-guide bootstrap CI excludes 0 on both assays.
|
|
21
|
+
- `pen_stack/wgenome/offtarget_data.py` — validated assay/predictor provenance, a GROUNDED mismatch→active-fraction
|
|
22
|
+
risk calibration (real-data: GUIDE-seq 0-1mm→100% active, 2mm→76%, 3mm→23%, 4mm→3.3%), the bench fixture loader.
|
|
23
|
+
- `pen_stack/wgenome/offtarget_predict.py` — `nominate_offtargets(writer_family, ...)`: **nuclease** (mismatch-
|
|
24
|
+
calibrated risk band + the real cached CRISOT score + a documented chromatin modifier, Lazzarotto 2020);
|
|
25
|
+
**serine integrase** (cryptic **pseudo-attB** scan on the real documented Bxb1 attB core GCGGTCTC/GT);
|
|
26
|
+
**bridge** (delegates to the existing Perry-DMS pseudosite engine). Abstains without inputs; never fabricates sites.
|
|
27
|
+
- `pen_stack/wgenome/offtarget_assay.py` — validation-assay recommender (GUIDE/CHANGE/CIRCLE-seq for nucleases;
|
|
28
|
+
Cryptic-seq/HIDE-seq for integrases; **honest gap** for bridge recombinases — NO published genome-wide unbiased
|
|
29
|
+
off-target assay or predictor exists, verified).
|
|
30
|
+
- **Surfaces:** REST `POST /offtarget` + `GET /offtarget/assay`, MCP `offtarget_scan`, manifest `nominate_offtargets`
|
|
31
|
+
(fabricates=False), an `offtarget_nomination` scope card, and a web **Off-Target** page.
|
|
32
|
+
|
|
33
|
+
### Honest limits
|
|
34
|
+
- Nomination is NOT a clearance; genome-wide candidate ENUMERATION needs the on-VM Cas-OFFinder/genome scan (this
|
|
35
|
+
engine SCORES + RANKS + risk-bands supplied candidates). The CRISOT predictor is CC-BY-NC — it runs only on the
|
|
36
|
+
VM and its weights are NEVER redistributed; only derived scores are cached (CI-safe). Bridge/integrase off-target
|
|
37
|
+
is data-thin/unmodeled and is flagged extrapolative; IntQuery (Tome Biosciences) is a paper-only reference.
|
|
38
|
+
|
|
39
|
+
## [6.9.2] - 2026-06-19 - WS-IMMUNE2 real-tool rigor pass (no proxies / no heuristics across the immune + writer axes)
|
|
40
|
+
|
|
41
|
+
**PATCH — a top-to-bottom audit replacing every remaining proxy/heuristic in the immune & writer-design stack with
|
|
42
|
+
the real on-VM tool (gold-standard, licensed) or an honest abstention. No silent fallbacks.** Triggered by the
|
|
43
|
+
directive *"use the real on-VM tool. No proxy or heuristics … check previous versions too … re-confirm the MHC-I
|
|
44
|
+
capsid axis against NetMHCpan-4.1."* All licensed binaries stay on the VM — only derived numbers are cached.
|
|
45
|
+
|
|
46
|
+
### Changed
|
|
47
|
+
- **MHC-I capsid axis re-grounded on NetMHCpan-4.1** (`pen_stack/planner/capsid_epitope_oracle.py`). The PRIMARY
|
|
48
|
+
capsid CD8 predictor is now the gold-standard licensed **NetMHCpan-4.1** (%Rank_EL≤0.5, residue coverage, 12-allele
|
|
49
|
+
panel; `configs/mhc_epitope_oracle.yaml` `mhc1`); the v5.3 **MHCflurry** value is kept as an explicit, reported
|
|
50
|
+
**cross-check** (never silently substituted). Both agree AAV is the least CD8-immunogenic capsid
|
|
51
|
+
(AAV `capsid_immune_score` 0.4585 NetMHCpan / 0.2803 MHCflurry — the predictor disagreement is surfaced, not hidden).
|
|
52
|
+
- **ADA-risk re-grounded** (`pen_stack/planner/ada_risk.py`). `ada_risk = real NetMHCIIpan-4.0 density × foreignness`,
|
|
53
|
+
where **foreignness is the protein ORIGIN** (authoritative central-tolerance signal). Unknown origin / uncached
|
|
54
|
+
density now **ABSTAINS** (no k-mer guess, no heuristic) — replacing the v6.9.0 albumin-only self-tolerance
|
|
55
|
+
heuristic. The **real human-proteome 9-mer self-match** (computed on the VM over the full UniProt reference
|
|
56
|
+
proteome, 20 431 proteins / 10.4 M 9-mers) is reported as a cross-check: human albumin **1.0** (self), the
|
|
57
|
+
foreign writers (SpCas9/ISCro4/Bxb1) and capsids **0.0** (non-self) — clean self/non-self separation.
|
|
58
|
+
- **MHC-II axis no longer falls back to a production proxy** (`pen_stack/planner/immune_mhc2.py`). `mhc2_epitope_load`
|
|
59
|
+
uses the real NetMHCIIpan-4.0 cache by antigen name and otherwise **abstains**; the documented promiscuous-binder
|
|
60
|
+
estimate is retained as `mhc2_proxy_estimate` for **offline triage only** (explicitly labelled, not the production axis).
|
|
61
|
+
- **Real Bxb1 attB written** (`pen_stack/atlas/guide_design.py`). The PASTE/PASSIGE pegRNA 3′ extension now writes the
|
|
62
|
+
**real documented Bxb1 minimal attB** verbatim (FlyBase FBto0000359; Ghosh, Kim & Hatfull, Mol Cell 2003;
|
|
63
|
+
8-bp common core GCGGTCTC around the central GT crossover) instead of the schematic poly-G/poly-C arms. Integrases
|
|
64
|
+
without a bundled documented site expose only the central core (never a fabricated full sequence).
|
|
65
|
+
- `pen_stack/planner/immune_profile.py` — the writer-as-antigen card surfaces `foreignness`, the real
|
|
66
|
+
`self_match_human_proteome` cross-check, and the MHC-II/ADA backends (was the removed `self_tolerance` field).
|
|
67
|
+
|
|
68
|
+
### Honest deviations from the v6.9 pre-registration (`prereg/ws_immune2.yaml`)
|
|
69
|
+
- The pre-registered "1 − self_match_fraction from a human-proteome k-mer filter" foreignness *fallback* is
|
|
70
|
+
**dropped**: foreignness is the authoritative origin, and an unknown origin abstains rather than imputing from a
|
|
71
|
+
k-mer match (the real self-match is reported only as a cross-check). This is a strictly more honest rule.
|
|
72
|
+
|
|
73
|
+
### Data / tests
|
|
74
|
+
- `configs/mhc_epitope_oracle.yaml` — corrected `self_match` (the v6.9.x cache had a FASTA-keying bug that collapsed
|
|
75
|
+
the 20 431-protein proteome to 1 protein, zeroing every self-match incl. albumin); recomputed correctly on the VM.
|
|
76
|
+
- `tests/unit/{test_ws_immune2,test_ws_epitope,test_ws_writer,test_ws_rel}.py` updated for the abstain semantics,
|
|
77
|
+
the NetMHCpan-4.1 primary capsid value + MHCflurry cross-check, the real attB, and the 6.9.2 version pins.
|
|
78
|
+
|
|
6
79
|
## [6.9.1] - 2026-06-20 - Real NetMHCIIpan-4.0 / NetMHCpan-4.1 MHC epitope load (replaces the v6.9.0 proxy)
|
|
7
80
|
|
|
8
81
|
**PATCH — rigour upgrade.** v6.9.0's MHC-II axis was a documented *heuristic proxy* (P1-anchor density). The
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: pen-stack
|
|
3
|
-
Version: 6.
|
|
3
|
+
Version: 6.10.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.10 — PEN-OFFTGT (cross-writer-family off-target nomination)
|
|
152
|
+
|
|
153
|
+
Off-target prediction was a single-family bridge pseudosite scan that abstained for nucleases and integrases.
|
|
154
|
+
v6.10 makes it a **cross-writer-family, chromatin-aware NOMINATION engine** — completing the safety triad
|
|
155
|
+
(site + writer + off-target). It is scrupulously honest that **nomination is not a clearance**: every candidate
|
|
156
|
+
ships with the empirical assay that would confirm it.
|
|
157
|
+
|
|
158
|
+
- **A real, validated benchmark** (`benchmarks/offtarget/`) over canonical Cas9 guides with **experimentally
|
|
159
|
+
validated off-targets** from GUIDE-seq (Tsai 2015) and CIRCLE-seq (Tsai 2017). The licensed **CRISOT** predictor
|
|
160
|
+
(Chen et al. *Nat Commun* 2023) **beats the sequence-homology baseline** on held-out guides — GUIDE-seq AUPRC
|
|
161
|
+
**0.65 vs 0.47**, CIRCLE-seq **0.52 vs 0.27**; per-guide bootstrap CI excludes 0 on both. CRISOT is CC-BY-NC and
|
|
162
|
+
runs only on the VM — only derived scores are cached (like the licensed MHC tools).
|
|
163
|
+
- **Grounded, calibrated risk** — the risk band IS the real-data fraction of candidates at *k* mismatches that were
|
|
164
|
+
experimentally validated-active (GUIDE-seq: 0–1 mm → 100%, 2 mm → 76%, 3 mm → 23%, 4 mm → 3.3%), not a guessed curve.
|
|
165
|
+
- **Cross-family** — nucleases (mismatch-calibrated risk + the real CRISOT score), serine integrases (cryptic
|
|
166
|
+
**pseudo-attB** scan on the real documented Bxb1 attB core), bridge recombinases (the existing Perry-DMS engine).
|
|
167
|
+
Bridge/integrase off-target is **honestly flagged data-thin** — there is no published genome-wide unbiased assay
|
|
168
|
+
or predictor for bridge recombinases (verified).
|
|
169
|
+
- **Surfaces** — REST `POST /offtarget`, MCP `offtarget_scan`, manifest `nominate_offtargets`, and an Off-Target
|
|
170
|
+
web page. Abstains without inputs; never fabricates sites.
|
|
171
|
+
|
|
151
172
|
## What is new in v6.9 — PEN-IMMUNE (MHC-II/CD4 + ADA + the writer enzyme as a distinct antigen)
|
|
152
173
|
|
|
153
174
|
The immune profile did **CD8/MHC-I only** (capsid epitope load via MHCflurry) — but the **dominant** immunogenicity
|
|
@@ -161,16 +182,24 @@ are bacterial/phage) — yet Stage G scored only the capsid. v6.9 closes that ga
|
|
|
161
182
|
never distributed), with a documented promiscuous-binder proxy as the offline/CI fallback. Population-level proxy
|
|
162
183
|
(🟡), never a patient-HLA magnitude. *(v6.9.0 used the heuristic proxy; the real tool is more discriminating —
|
|
163
184
|
human-self albumin 0.066 vs foreign writers 0.11–0.15.)*
|
|
164
|
-
- **An ADA-risk axis** (`planner/ada_risk.py`) — **ADA-risk = MHC-II epitope density × foreignness**,
|
|
165
|
-
**
|
|
185
|
+
- **An ADA-risk axis** (`planner/ada_risk.py`) — **ADA-risk = MHC-II epitope density × foreignness**, where
|
|
186
|
+
**foreignness is the protein ORIGIN** (the authoritative central-tolerance signal). It **recovers
|
|
166
187
|
immunogenic-vs-tolerated**: the foreign writers (real UniProt SpCas9 / ISCro4 / Bxb1) score **above** the human
|
|
167
|
-
self control (albumin)
|
|
188
|
+
self control (albumin). The **real full-human-proteome 9-mer self-match** (computed on the VM, 20 431 proteins) is
|
|
189
|
+
reported as a cross-check (albumin 1.0 self, foreign writers 0.0).
|
|
168
190
|
- **The writer as a distinct antigen** — the profile now carries a `writer_as_antigen` card and a
|
|
169
191
|
`writer_dominant_risk` flag: for **non-viral delivery of a bacterial writer there is no capsid antigen, so the
|
|
170
192
|
WRITER is the dominant immunogen** — the insight the capsid-only profile missed.
|
|
171
193
|
- **Immuno-Bench** (`benchmarks/immuno/`) — the immunogenic-vs-tolerated recovery track + an honest `calibrate_axis`
|
|
172
194
|
ADA pass (it stays 🟡 at public-data power — no manufactured ✅, the standing wet-lab bottleneck).
|
|
173
195
|
|
|
196
|
+
**v6.9.2 — real-tool rigor pass (no proxies / no heuristics).** A top-to-bottom audit: the **MHC-I capsid axis is
|
|
197
|
+
re-grounded on the gold-standard NetMHCpan-4.1** (MHCflurry kept as a reported cross-check); **ADA foreignness is the
|
|
198
|
+
authoritative origin** and **abstains** when unknown (no k-mer guess); the MHC-II axis **abstains** rather than
|
|
199
|
+
falling back to a production proxy (the promiscuous-binder estimate is offline-triage only); and the PASTE pegRNA
|
|
200
|
+
writes the **real documented Bxb1 minimal attB** (FlyBase / Ghosh 2003) instead of a schematic. Real tool or honest
|
|
201
|
+
abstention — never a silent fallback.
|
|
202
|
+
|
|
174
203
|
Real UniProt sequences only (no fabricated sequence); the axes are reported as a vector with `collapsed_score: None`;
|
|
175
204
|
the realized CD4 response / ADA titer stay known-unknowns. See [docs/immune_profiler.md](docs/immune_profiler.md).
|
|
176
205
|
|
|
@@ -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.10 — PEN-OFFTGT (cross-writer-family off-target nomination)
|
|
77
|
+
|
|
78
|
+
Off-target prediction was a single-family bridge pseudosite scan that abstained for nucleases and integrases.
|
|
79
|
+
v6.10 makes it a **cross-writer-family, chromatin-aware NOMINATION engine** — completing the safety triad
|
|
80
|
+
(site + writer + off-target). It is scrupulously honest that **nomination is not a clearance**: every candidate
|
|
81
|
+
ships with the empirical assay that would confirm it.
|
|
82
|
+
|
|
83
|
+
- **A real, validated benchmark** (`benchmarks/offtarget/`) over canonical Cas9 guides with **experimentally
|
|
84
|
+
validated off-targets** from GUIDE-seq (Tsai 2015) and CIRCLE-seq (Tsai 2017). The licensed **CRISOT** predictor
|
|
85
|
+
(Chen et al. *Nat Commun* 2023) **beats the sequence-homology baseline** on held-out guides — GUIDE-seq AUPRC
|
|
86
|
+
**0.65 vs 0.47**, CIRCLE-seq **0.52 vs 0.27**; per-guide bootstrap CI excludes 0 on both. CRISOT is CC-BY-NC and
|
|
87
|
+
runs only on the VM — only derived scores are cached (like the licensed MHC tools).
|
|
88
|
+
- **Grounded, calibrated risk** — the risk band IS the real-data fraction of candidates at *k* mismatches that were
|
|
89
|
+
experimentally validated-active (GUIDE-seq: 0–1 mm → 100%, 2 mm → 76%, 3 mm → 23%, 4 mm → 3.3%), not a guessed curve.
|
|
90
|
+
- **Cross-family** — nucleases (mismatch-calibrated risk + the real CRISOT score), serine integrases (cryptic
|
|
91
|
+
**pseudo-attB** scan on the real documented Bxb1 attB core), bridge recombinases (the existing Perry-DMS engine).
|
|
92
|
+
Bridge/integrase off-target is **honestly flagged data-thin** — there is no published genome-wide unbiased assay
|
|
93
|
+
or predictor for bridge recombinases (verified).
|
|
94
|
+
- **Surfaces** — REST `POST /offtarget`, MCP `offtarget_scan`, manifest `nominate_offtargets`, and an Off-Target
|
|
95
|
+
web page. Abstains without inputs; never fabricates sites.
|
|
96
|
+
|
|
76
97
|
## What is new in v6.9 — PEN-IMMUNE (MHC-II/CD4 + ADA + the writer enzyme as a distinct antigen)
|
|
77
98
|
|
|
78
99
|
The immune profile did **CD8/MHC-I only** (capsid epitope load via MHCflurry) — but the **dominant** immunogenicity
|
|
@@ -86,16 +107,24 @@ are bacterial/phage) — yet Stage G scored only the capsid. v6.9 closes that ga
|
|
|
86
107
|
never distributed), with a documented promiscuous-binder proxy as the offline/CI fallback. Population-level proxy
|
|
87
108
|
(🟡), never a patient-HLA magnitude. *(v6.9.0 used the heuristic proxy; the real tool is more discriminating —
|
|
88
109
|
human-self albumin 0.066 vs foreign writers 0.11–0.15.)*
|
|
89
|
-
- **An ADA-risk axis** (`planner/ada_risk.py`) — **ADA-risk = MHC-II epitope density × foreignness**,
|
|
90
|
-
**
|
|
110
|
+
- **An ADA-risk axis** (`planner/ada_risk.py`) — **ADA-risk = MHC-II epitope density × foreignness**, where
|
|
111
|
+
**foreignness is the protein ORIGIN** (the authoritative central-tolerance signal). It **recovers
|
|
91
112
|
immunogenic-vs-tolerated**: the foreign writers (real UniProt SpCas9 / ISCro4 / Bxb1) score **above** the human
|
|
92
|
-
self control (albumin)
|
|
113
|
+
self control (albumin). The **real full-human-proteome 9-mer self-match** (computed on the VM, 20 431 proteins) is
|
|
114
|
+
reported as a cross-check (albumin 1.0 self, foreign writers 0.0).
|
|
93
115
|
- **The writer as a distinct antigen** — the profile now carries a `writer_as_antigen` card and a
|
|
94
116
|
`writer_dominant_risk` flag: for **non-viral delivery of a bacterial writer there is no capsid antigen, so the
|
|
95
117
|
WRITER is the dominant immunogen** — the insight the capsid-only profile missed.
|
|
96
118
|
- **Immuno-Bench** (`benchmarks/immuno/`) — the immunogenic-vs-tolerated recovery track + an honest `calibrate_axis`
|
|
97
119
|
ADA pass (it stays 🟡 at public-data power — no manufactured ✅, the standing wet-lab bottleneck).
|
|
98
120
|
|
|
121
|
+
**v6.9.2 — real-tool rigor pass (no proxies / no heuristics).** A top-to-bottom audit: the **MHC-I capsid axis is
|
|
122
|
+
re-grounded on the gold-standard NetMHCpan-4.1** (MHCflurry kept as a reported cross-check); **ADA foreignness is the
|
|
123
|
+
authoritative origin** and **abstains** when unknown (no k-mer guess); the MHC-II axis **abstains** rather than
|
|
124
|
+
falling back to a production proxy (the promiscuous-binder estimate is offline-triage only); and the PASTE pegRNA
|
|
125
|
+
writes the **real documented Bxb1 minimal attB** (FlyBase / Ghosh 2003) instead of a schematic. Real tool or honest
|
|
126
|
+
abstention — never a silent fallback.
|
|
127
|
+
|
|
99
128
|
Real UniProt sequences only (no fabricated sequence); the axes are reported as a vector with `collapsed_score: None`;
|
|
100
129
|
the realized CD4 response / ADA titer stay known-unknowns. See [docs/immune_profiler.md](docs/immune_profiler.md).
|
|
101
130
|
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
9a02d9fc0fb4fe305fc87510114df892027ac85f24a495bddccaf1c29e8decf7 split.json
|
|
2
|
+
006642247dbb3dfe5ebefd0a9f0144e9e9d26b682e7b9173d13e2c4e1252bec8 offtarget_bench_fixture.csv
|
|
3
|
+
6ec099c0d30f83bd09f7182c4f365ee7b1106e45f4ca80db46f4fdb0df2941ba offtarget_bench_metrics.json
|
|
4
|
+
626d383ab3a494d6899c1620fa7cb2e6626c055410c1fd57e6b7d57d308523f4 offtarget_calibration.json
|
|
@@ -0,0 +1,296 @@
|
|
|
1
|
+
version: 6.9.2
|
|
2
|
+
method:
|
|
3
|
+
mhc2: NetMHCIIpan-4.0 EL %Rank<=2, residue coverage
|
|
4
|
+
hla2_panel:
|
|
5
|
+
- DRB1_0101
|
|
6
|
+
- DRB1_0301
|
|
7
|
+
- DRB1_0401
|
|
8
|
+
- DRB1_0701
|
|
9
|
+
- DRB1_1101
|
|
10
|
+
- DRB1_1301
|
|
11
|
+
- DRB1_1501
|
|
12
|
+
mhc1: NetMHCpan-4.1 %Rank_EL<=0.5, residue coverage
|
|
13
|
+
hla1_panel:
|
|
14
|
+
- HLA-A01:01
|
|
15
|
+
- HLA-A02:01
|
|
16
|
+
- HLA-A03:01
|
|
17
|
+
- HLA-A11:01
|
|
18
|
+
- HLA-A24:02
|
|
19
|
+
- HLA-A26:01
|
|
20
|
+
- HLA-B07:02
|
|
21
|
+
- HLA-B08:01
|
|
22
|
+
- HLA-B15:01
|
|
23
|
+
- HLA-B40:01
|
|
24
|
+
- HLA-B44:03
|
|
25
|
+
- HLA-B58:01
|
|
26
|
+
metric: residue coverage by strong binders, union over panel (matches v5.3 MHCflurry)
|
|
27
|
+
provenance_dois:
|
|
28
|
+
- 10.1093/nar/gkac1029
|
|
29
|
+
- 10.1093/nar/gkaa379
|
|
30
|
+
note: population-level epitope load (frequent-HLA panel; NOT patient-HLA-specific).
|
|
31
|
+
Licensed NetMHC binaries run locally; only derived fractions cached.
|
|
32
|
+
mhc2:
|
|
33
|
+
SpCas9:
|
|
34
|
+
epitope_fraction_strong: 0.636
|
|
35
|
+
immune_score: 0.364
|
|
36
|
+
metric: residue coverage by strong 15-mers (%Rank<=2.0), union over 7 alleles
|
|
37
|
+
length: 1368
|
|
38
|
+
n_covered: 870
|
|
39
|
+
alleles_used:
|
|
40
|
+
- DRB1_0101
|
|
41
|
+
- DRB1_0301
|
|
42
|
+
- DRB1_0401
|
|
43
|
+
- DRB1_0701
|
|
44
|
+
- DRB1_1101
|
|
45
|
+
- DRB1_1301
|
|
46
|
+
- DRB1_1501
|
|
47
|
+
ISCro4:
|
|
48
|
+
epitope_fraction_strong: 0.5644
|
|
49
|
+
immune_score: 0.4356
|
|
50
|
+
metric: residue coverage by strong 15-mers (%Rank<=2.0), union over 7 alleles
|
|
51
|
+
length: 326
|
|
52
|
+
n_covered: 184
|
|
53
|
+
alleles_used:
|
|
54
|
+
- DRB1_0101
|
|
55
|
+
- DRB1_0301
|
|
56
|
+
- DRB1_0401
|
|
57
|
+
- DRB1_0701
|
|
58
|
+
- DRB1_1101
|
|
59
|
+
- DRB1_1301
|
|
60
|
+
- DRB1_1501
|
|
61
|
+
Bxb1:
|
|
62
|
+
epitope_fraction_strong: 0.6467
|
|
63
|
+
immune_score: 0.3533
|
|
64
|
+
metric: residue coverage by strong 15-mers (%Rank<=2.0), union over 7 alleles
|
|
65
|
+
length: 501
|
|
66
|
+
n_covered: 324
|
|
67
|
+
alleles_used:
|
|
68
|
+
- DRB1_0101
|
|
69
|
+
- DRB1_0301
|
|
70
|
+
- DRB1_0401
|
|
71
|
+
- DRB1_0701
|
|
72
|
+
- DRB1_1101
|
|
73
|
+
- DRB1_1301
|
|
74
|
+
- DRB1_1501
|
|
75
|
+
HumanAlbumin:
|
|
76
|
+
epitope_fraction_strong: 0.3186
|
|
77
|
+
immune_score: 0.6814
|
|
78
|
+
metric: residue coverage by strong 15-mers (%Rank<=2.0), union over 7 alleles
|
|
79
|
+
length: 609
|
|
80
|
+
n_covered: 194
|
|
81
|
+
alleles_used:
|
|
82
|
+
- DRB1_0101
|
|
83
|
+
- DRB1_0301
|
|
84
|
+
- DRB1_0401
|
|
85
|
+
- DRB1_0701
|
|
86
|
+
- DRB1_1101
|
|
87
|
+
- DRB1_1301
|
|
88
|
+
- DRB1_1501
|
|
89
|
+
AAV2_VP1:
|
|
90
|
+
epitope_fraction_strong: 0.5592
|
|
91
|
+
immune_score: 0.4408
|
|
92
|
+
metric: residue coverage by strong 15-mers (%Rank<=2.0), union over 7 alleles
|
|
93
|
+
length: 735
|
|
94
|
+
n_covered: 411
|
|
95
|
+
alleles_used:
|
|
96
|
+
- DRB1_0101
|
|
97
|
+
- DRB1_0301
|
|
98
|
+
- DRB1_0401
|
|
99
|
+
- DRB1_0701
|
|
100
|
+
- DRB1_1101
|
|
101
|
+
- DRB1_1301
|
|
102
|
+
- DRB1_1501
|
|
103
|
+
Ad5_hexon:
|
|
104
|
+
epitope_fraction_strong: 0.6229
|
|
105
|
+
immune_score: 0.3771
|
|
106
|
+
metric: residue coverage by strong 15-mers (%Rank<=2.0), union over 7 alleles
|
|
107
|
+
length: 952
|
|
108
|
+
n_covered: 593
|
|
109
|
+
alleles_used:
|
|
110
|
+
- DRB1_0101
|
|
111
|
+
- DRB1_0301
|
|
112
|
+
- DRB1_0401
|
|
113
|
+
- DRB1_0701
|
|
114
|
+
- DRB1_1101
|
|
115
|
+
- DRB1_1301
|
|
116
|
+
- DRB1_1501
|
|
117
|
+
VSVg_Indiana:
|
|
118
|
+
epitope_fraction_strong: 0.3914
|
|
119
|
+
immune_score: 0.6086
|
|
120
|
+
metric: residue coverage by strong 15-mers (%Rank<=2.0), union over 7 alleles
|
|
121
|
+
length: 511
|
|
122
|
+
n_covered: 200
|
|
123
|
+
alleles_used:
|
|
124
|
+
- DRB1_0101
|
|
125
|
+
- DRB1_0301
|
|
126
|
+
- DRB1_0401
|
|
127
|
+
- DRB1_0701
|
|
128
|
+
- DRB1_1101
|
|
129
|
+
- DRB1_1301
|
|
130
|
+
- DRB1_1501
|
|
131
|
+
HSV1_gD:
|
|
132
|
+
epitope_fraction_strong: 0.5355
|
|
133
|
+
immune_score: 0.4645
|
|
134
|
+
metric: residue coverage by strong 15-mers (%Rank<=2.0), union over 7 alleles
|
|
135
|
+
length: 394
|
|
136
|
+
n_covered: 211
|
|
137
|
+
alleles_used:
|
|
138
|
+
- DRB1_0101
|
|
139
|
+
- DRB1_0301
|
|
140
|
+
- DRB1_0401
|
|
141
|
+
- DRB1_0701
|
|
142
|
+
- DRB1_1101
|
|
143
|
+
- DRB1_1301
|
|
144
|
+
- DRB1_1501
|
|
145
|
+
HSV1_gB:
|
|
146
|
+
epitope_fraction_strong: 0.4746
|
|
147
|
+
immune_score: 0.5254
|
|
148
|
+
metric: residue coverage by strong 15-mers (%Rank<=2.0), union over 7 alleles
|
|
149
|
+
length: 904
|
|
150
|
+
n_covered: 429
|
|
151
|
+
alleles_used:
|
|
152
|
+
- DRB1_0101
|
|
153
|
+
- DRB1_0301
|
|
154
|
+
- DRB1_0401
|
|
155
|
+
- DRB1_0701
|
|
156
|
+
- DRB1_1101
|
|
157
|
+
- DRB1_1301
|
|
158
|
+
- DRB1_1501
|
|
159
|
+
mhc1:
|
|
160
|
+
AAV2_VP1:
|
|
161
|
+
epitope_fraction_strong: 0.5415
|
|
162
|
+
immune_score: 0.4585
|
|
163
|
+
metric: residue coverage by strong 9-mers (%Rank<=0.5), union over 12 alleles
|
|
164
|
+
length: 735
|
|
165
|
+
n_covered: 398
|
|
166
|
+
alleles_used:
|
|
167
|
+
- HLA-A01:01
|
|
168
|
+
- HLA-A02:01
|
|
169
|
+
- HLA-A03:01
|
|
170
|
+
- HLA-A11:01
|
|
171
|
+
- HLA-A24:02
|
|
172
|
+
- HLA-A26:01
|
|
173
|
+
- HLA-B07:02
|
|
174
|
+
- HLA-B08:01
|
|
175
|
+
- HLA-B15:01
|
|
176
|
+
- HLA-B40:01
|
|
177
|
+
- HLA-B44:03
|
|
178
|
+
- HLA-B58:01
|
|
179
|
+
Ad5_hexon:
|
|
180
|
+
epitope_fraction_strong: 0.7216
|
|
181
|
+
immune_score: 0.2784
|
|
182
|
+
metric: residue coverage by strong 9-mers (%Rank<=0.5), union over 12 alleles
|
|
183
|
+
length: 952
|
|
184
|
+
n_covered: 687
|
|
185
|
+
alleles_used:
|
|
186
|
+
- HLA-A01:01
|
|
187
|
+
- HLA-A02:01
|
|
188
|
+
- HLA-A03:01
|
|
189
|
+
- HLA-A11:01
|
|
190
|
+
- HLA-A24:02
|
|
191
|
+
- HLA-A26:01
|
|
192
|
+
- HLA-B07:02
|
|
193
|
+
- HLA-B08:01
|
|
194
|
+
- HLA-B15:01
|
|
195
|
+
- HLA-B40:01
|
|
196
|
+
- HLA-B44:03
|
|
197
|
+
- HLA-B58:01
|
|
198
|
+
VSVg_Indiana:
|
|
199
|
+
epitope_fraction_strong: 0.6223
|
|
200
|
+
immune_score: 0.3777
|
|
201
|
+
metric: residue coverage by strong 9-mers (%Rank<=0.5), union over 12 alleles
|
|
202
|
+
length: 511
|
|
203
|
+
n_covered: 318
|
|
204
|
+
alleles_used:
|
|
205
|
+
- HLA-A01:01
|
|
206
|
+
- HLA-A02:01
|
|
207
|
+
- HLA-A03:01
|
|
208
|
+
- HLA-A11:01
|
|
209
|
+
- HLA-A24:02
|
|
210
|
+
- HLA-A26:01
|
|
211
|
+
- HLA-B07:02
|
|
212
|
+
- HLA-B08:01
|
|
213
|
+
- HLA-B15:01
|
|
214
|
+
- HLA-B40:01
|
|
215
|
+
- HLA-B44:03
|
|
216
|
+
- HLA-B58:01
|
|
217
|
+
HSV1_gD:
|
|
218
|
+
epitope_fraction_strong: 0.6853
|
|
219
|
+
immune_score: 0.3147
|
|
220
|
+
metric: residue coverage by strong 9-mers (%Rank<=0.5), union over 12 alleles
|
|
221
|
+
length: 394
|
|
222
|
+
n_covered: 270
|
|
223
|
+
alleles_used:
|
|
224
|
+
- HLA-A01:01
|
|
225
|
+
- HLA-A02:01
|
|
226
|
+
- HLA-A03:01
|
|
227
|
+
- HLA-A11:01
|
|
228
|
+
- HLA-A24:02
|
|
229
|
+
- HLA-A26:01
|
|
230
|
+
- HLA-B07:02
|
|
231
|
+
- HLA-B08:01
|
|
232
|
+
- HLA-B15:01
|
|
233
|
+
- HLA-B40:01
|
|
234
|
+
- HLA-B44:03
|
|
235
|
+
- HLA-B58:01
|
|
236
|
+
HSV1_gB:
|
|
237
|
+
epitope_fraction_strong: 0.5962
|
|
238
|
+
immune_score: 0.4038
|
|
239
|
+
metric: residue coverage by strong 9-mers (%Rank<=0.5), union over 12 alleles
|
|
240
|
+
length: 904
|
|
241
|
+
n_covered: 539
|
|
242
|
+
alleles_used:
|
|
243
|
+
- HLA-A01:01
|
|
244
|
+
- HLA-A02:01
|
|
245
|
+
- HLA-A03:01
|
|
246
|
+
- HLA-A11:01
|
|
247
|
+
- HLA-A24:02
|
|
248
|
+
- HLA-A26:01
|
|
249
|
+
- HLA-B07:02
|
|
250
|
+
- HLA-B08:01
|
|
251
|
+
- HLA-B15:01
|
|
252
|
+
- HLA-B40:01
|
|
253
|
+
- HLA-B44:03
|
|
254
|
+
- HLA-B58:01
|
|
255
|
+
self_match:
|
|
256
|
+
SpCas9:
|
|
257
|
+
fraction: 0.0
|
|
258
|
+
n: 1360
|
|
259
|
+
n_matched: 0
|
|
260
|
+
ISCro4:
|
|
261
|
+
fraction: 0.0
|
|
262
|
+
n: 318
|
|
263
|
+
n_matched: 0
|
|
264
|
+
Bxb1:
|
|
265
|
+
fraction: 0.0
|
|
266
|
+
n: 493
|
|
267
|
+
n_matched: 0
|
|
268
|
+
HumanAlbumin:
|
|
269
|
+
fraction: 1.0
|
|
270
|
+
n: 601
|
|
271
|
+
n_matched: 601
|
|
272
|
+
AAV2_VP1:
|
|
273
|
+
fraction: 0.0
|
|
274
|
+
n: 727
|
|
275
|
+
n_matched: 0
|
|
276
|
+
Ad5_hexon:
|
|
277
|
+
fraction: 0.0
|
|
278
|
+
n: 944
|
|
279
|
+
n_matched: 0
|
|
280
|
+
VSVg_Indiana:
|
|
281
|
+
fraction: 0.0
|
|
282
|
+
n: 503
|
|
283
|
+
n_matched: 0
|
|
284
|
+
HSV1_gD:
|
|
285
|
+
fraction: 0.0
|
|
286
|
+
n: 386
|
|
287
|
+
n_matched: 0
|
|
288
|
+
HSV1_gB:
|
|
289
|
+
fraction: 0.0
|
|
290
|
+
n: 896
|
|
291
|
+
n_matched: 0
|
|
292
|
+
self_match_meta:
|
|
293
|
+
reference: UniProt reviewed human reference proteome UP000005640 (20431 proteins)
|
|
294
|
+
k: 9
|
|
295
|
+
tool: exact 9-mer identity vs full human proteome (JanusMatrix-style self-similarity
|
|
296
|
+
cross-check)
|
|
@@ -139,6 +139,23 @@ 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
|
+
offtarget_nomination: # v6.10 WS-OFFTARGET: cross-family off-target NOMINATION (not clearance)
|
|
143
|
+
family: genome
|
|
144
|
+
version: "crisot+homology-2026"
|
|
145
|
+
output_kind: baseline # ranks/risk-bands CANDIDATE sites, not generative
|
|
146
|
+
valid_for: "RELATIVE off-target NOMINATION for a writer: rank candidate sites so validated off-targets
|
|
147
|
+
surface first, with a mismatch-CALIBRATED empirical risk band (real GUIDE-seq/CIRCLE-seq active fractions).
|
|
148
|
+
Nucleases use the real CRISOT-Score (beats a homology baseline on held-out guides, CI excludes 0); serine
|
|
149
|
+
integrases use a documented pseudo-attB cryptic scan; bridge recombinases delegate to the Perry-DMS engine"
|
|
150
|
+
not_valid_for: "a safety CLEARANCE (nomination != validation; every result ships with the empirical assay
|
|
151
|
+
that would confirm it); genome-wide candidate ENUMERATION (needs the on-VM Cas-OFFinder/genome scan; this
|
|
152
|
+
engine SCORES supplied candidates); a per-site cleavage/recombination PROBABILITY; bridge-recombinase
|
|
153
|
+
off-target magnitude (NO published genome-wide unbiased assay/predictor exists -> extrapolative/abstains);
|
|
154
|
+
structural variants/translocations beyond nominated sites"
|
|
155
|
+
generalizes_to_unseen_loci: false
|
|
156
|
+
license: "open (this work; GUIDE-seq 10.1038/nbt.3117, CIRCLE-seq 10.1038/nmeth.4278, CHANGE-seq
|
|
157
|
+
10.1038/s41587-020-0555-7, CRISOT 10.1038/s41467-023-42695-4 CC-BY-NC run on the VM only)"
|
|
158
|
+
|
|
142
159
|
innate_sensing: # v5.4 WS-INNATE: computed nucleic-acid innate-sensing motif load
|
|
143
160
|
family: genome
|
|
144
161
|
version: "cpg-oe+dsrna-2026"
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
# Data card — Off-Target-Bench (v6.10 PEN-OFFTGT)
|
|
2
|
+
|
|
3
|
+
## Summary
|
|
4
|
+
A real, leakage-controlled benchmark for cross-writer-family off-target **nomination**: given a guide and its
|
|
5
|
+
candidate sites, rank the candidates so the experimentally validated off-targets surface first. Labels are the
|
|
6
|
+
wet-lab assay calls (NON-circular — the label is the experiment, not a predictor).
|
|
7
|
+
|
|
8
|
+
## Ground truth (independently verified 2026-06-19)
|
|
9
|
+
| Assay | Setting | Citation | DOI |
|
|
10
|
+
|---|---|---|---|
|
|
11
|
+
| GUIDE-seq | cell-based, unbiased, genome-wide | Tsai et al., *Nat Biotechnol* 2015 | `10.1038/nbt.3117` |
|
|
12
|
+
| CIRCLE-seq | in vitro (cell-free), unbiased | Tsai et al., *Nat Methods* 2017 | `10.1038/nmeth.4278` |
|
|
13
|
+
|
|
14
|
+
Canonical Cas9 guides: **EMX1, VEGFA site 1/2/3, FANCF, HEK293 site 2/3/4**. The harmonized candidate/label tables
|
|
15
|
+
are sourced from the CRISOT data release (Zenodo `10.5281/zenodo.8420032`), which redistributes the public assay
|
|
16
|
+
supplements; PEN-STACK cites the **original assay papers** as the ground-truth provenance.
|
|
17
|
+
|
|
18
|
+
## Learned predictor (real tool, VM-only)
|
|
19
|
+
**CRISOT-Score** — Chen et al., *Nat Commun* 2023, `10.1038/s41467-023-42695-4`; an XGBoost RNA-DNA interaction
|
|
20
|
+
fingerprint. **License: CC-BY-NC** → it runs only on the VM (`crisot:tools` Docker, `xgboost`/`pandas`/`numpy`);
|
|
21
|
+
its weights are NEVER redistributed. Only DERIVED scores are cached/committed (CI-safe), exactly like the licensed
|
|
22
|
+
NetMHC tools.
|
|
23
|
+
|
|
24
|
+
## Baseline (pre-registered)
|
|
25
|
+
Sequence-homology nomination = ascending **mismatch count** (Hamming over the 20-nt protospacer).
|
|
26
|
+
|
|
27
|
+
## Result (E-G2, full real data, on the VM)
|
|
28
|
+
| Assay | CRISOT AUPRC | homology AUPRC | gap | 95% CI (held-out-guide bootstrap) | beats homology |
|
|
29
|
+
|---|---|---|---|---|---|
|
|
30
|
+
| GUIDE-seq | 0.646 | 0.467 | +0.179 | [0.015, 0.340] | ✅ |
|
|
31
|
+
| CIRCLE-seq | 0.520 | 0.266 | +0.253 | [0.140, 0.361] | ✅ |
|
|
32
|
+
|
|
33
|
+
The learned predictor beats the homology baseline on both assays (per-guide bootstrap CI excludes 0).
|
|
34
|
+
|
|
35
|
+
## Risk calibration (grounded)
|
|
36
|
+
The nomination risk band IS the empirical fraction of candidates at *k* mismatches that were validated-active
|
|
37
|
+
(full real data): GUIDE-seq 0–1 mm → 1.00, 2 mm → 0.765, 3 mm → 0.231, 4 mm → 0.033, 5 mm → 0.0028, 6 mm → 0.00014.
|
|
38
|
+
Mismatch counts outside the calibrated range abstain rather than extrapolate.
|
|
39
|
+
|
|
40
|
+
## Files
|
|
41
|
+
- `benchmarks/offtarget/offtarget_bench_fixture.csv` — real validated off-targets + cached CRISOT scores (CI-safe;
|
|
42
|
+
inactives downsampled with a fixed seed for a small committed file).
|
|
43
|
+
- `benchmarks/offtarget/offtarget_bench_metrics.json` — the AUTHORITATIVE full-data metrics.
|
|
44
|
+
- `benchmarks/offtarget/offtarget_calibration.json` — the full-data mismatch / CRISOT-decile calibration.
|
|
45
|
+
- `benchmarks/offtarget/split.json`, `SHA256SUMS` — split definition + checksums.
|
|
46
|
+
|
|
47
|
+
## Honest limits
|
|
48
|
+
Nomination is **not** a clearance — every result ships with the empirical assay that would confirm it. Genome-wide
|
|
49
|
+
candidate ENUMERATION needs the on-VM Cas-OFFinder/genome scan; this benchmark covers SCORING + RANKING of supplied
|
|
50
|
+
candidates. Bridge/integrase off-target is data-thin: there is **no published genome-wide unbiased off-target assay
|
|
51
|
+
or predictor for bridge recombinases** (verified), and the large-serine-integrase assays (Cryptic-seq/HIDE-seq) and
|
|
52
|
+
predictor (IntQuery) are recent single-company preprints with no public weights.
|